diff --git a/CMakeLists.txt b/CMakeLists.txt index c15371c9ac7..1a751eafe66 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,15 +35,27 @@ option(SLIC3R_ASAN "Enable ASan on Clang and GCC" 0) set(SLIC3R_GTK "2" CACHE STRING "GTK version to use with wxWidgets on Linux") +set(IS_CROSS_COMPILE FALSE) + if (APPLE) set(CMAKE_FIND_FRAMEWORK LAST) set(CMAKE_FIND_APPBUNDLE LAST) + list(FIND CMAKE_OSX_ARCHITECTURES ${CMAKE_SYSTEM_PROCESSOR} _arch_idx) + if (CMAKE_OSX_ARCHITECTURES AND _arch_idx LESS 0) + set(IS_CROSS_COMPILE TRUE) + endif () endif () # Proposal for C++ unit tests and sandboxes option(SLIC3R_BUILD_SANDBOXES "Build development sandboxes" OFF) option(SLIC3R_BUILD_TESTS "Build unit tests" ON) +if (IS_CROSS_COMPILE) + message("Detected cross compilation setup. Tests and encoding checks will be forcedly disabled!") + set(SLIC3R_PERL_XS OFF CACHE BOOL "" FORCE) + set(SLIC3R_BUILD_TESTS OFF CACHE BOOL "" FORCE) +endif () + # Print out the SLIC3R_* cache options get_cmake_property(_cache_vars CACHE_VARIABLES) list (SORT _cache_vars) @@ -190,6 +202,13 @@ if (NOT MSVC AND ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMP add_compile_options(-Wno-ignored-attributes) # Tamas: Eigen include dirs are marked as SYSTEM endif() + # Clang reports legacy OpenGL calls as deprecated. Turn off the warning for now + # to reduce the clutter, we know about this one. It should be reenabled after + # we finally get rid of the deprecated code. + if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") + add_compile_options(-Wno-deprecated-declarations) + endif() + #GCC generates loads of -Wunknown-pragmas when compiling igl. The fix is not easy due to a bug in gcc, see # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66943 or # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53431 diff --git a/cmake/modules/OpenVDBUtils.cmake b/cmake/modules/OpenVDBUtils.cmake index f64eda6f2c9..f79862b83ab 100644 --- a/cmake/modules/OpenVDBUtils.cmake +++ b/cmake/modules/OpenVDBUtils.cmake @@ -157,7 +157,9 @@ function(OPENVDB_ABI_VERSION_FROM_PRINT OPENVDB_PRINT) endif() set(_OpenVDB_ABI) - string(REGEX REPLACE ".*abi([0-9]*).*" "\\1" _OpenVDB_ABI ${_VDB_PRINT_VERSION_STRING}) + if (_VDB_PRINT_VERSION_STRING) + string(REGEX REPLACE ".*abi([0-9]*).*" "\\1" _OpenVDB_ABI ${_VDB_PRINT_VERSION_STRING}) + endif () if(${_OpenVDB_ABI} STREQUAL ${_VDB_PRINT_VERSION_STRING}) set(_OpenVDB_ABI "") endif() diff --git a/cmake/modules/bin2h.cmake b/cmake/modules/bin2h.cmake new file mode 100644 index 00000000000..b838650f322 --- /dev/null +++ b/cmake/modules/bin2h.cmake @@ -0,0 +1,89 @@ +# Source: https://gist.github.com/sivachandran/3a0de157dccef822a230#file-bin2h-cmake +# Added modifications to suit prusaslicer +include(CMakeParseArguments) + +# Function to wrap a given string into multiple lines at the given column position. +# Parameters: +# VARIABLE - The name of the CMake variable holding the string. +# AT_COLUMN - The column position at which string will be wrapped. +function(WRAP_STRING) + set(oneValueArgs VARIABLE AT_COLUMN) + cmake_parse_arguments(WRAP_STRING "${options}" "${oneValueArgs}" "" ${ARGN}) + + string(LENGTH ${${WRAP_STRING_VARIABLE}} stringLength) + math(EXPR offset "0") + + while(stringLength GREATER 0) + + if(stringLength GREATER ${WRAP_STRING_AT_COLUMN}) + math(EXPR length "${WRAP_STRING_AT_COLUMN}") + else() + math(EXPR length "${stringLength}") + endif() + + string(SUBSTRING ${${WRAP_STRING_VARIABLE}} ${offset} ${length} line) + set(lines "${lines}\n${line}") + + math(EXPR stringLength "${stringLength} - ${length}") + math(EXPR offset "${offset} + ${length}") + endwhile() + + set(${WRAP_STRING_VARIABLE} "${lines}" PARENT_SCOPE) +endfunction() + +# Function to embed contents of a file as byte array in C/C++ header file(.h). The header file +# will contain a byte array and integer variable holding the size of the array. +# Parameters +# SOURCE_FILE - The path of source file whose contents will be embedded in the header file. +# VARIABLE_NAME - The name of the variable for the byte array. The string "_SIZE" will be append +# to this name and will be used a variable name for size variable. +# HEADER_FILE - The path of header file. +# APPEND - If specified appends to the header file instead of overwriting it +# NULL_TERMINATE - If specified a null byte(zero) will be append to the byte array. This will be +# useful if the source file is a text file and we want to use the file contents +# as string. But the size variable holds size of the byte array without this +# null byte. +# Usage: +# bin2h(SOURCE_FILE "Logo.png" HEADER_FILE "Logo.h" VARIABLE_NAME "LOGO_PNG") +function(BIN2H) + set(options APPEND NULL_TERMINATE ADD_WARNING_TEXT) + set(oneValueArgs SOURCE_FILE VARIABLE_NAME HEADER_FILE) + cmake_parse_arguments(BIN2H "${options}" "${oneValueArgs}" "" ${ARGN}) + + # reads source file contents as hex string + file(READ ${BIN2H_SOURCE_FILE} hexString HEX) + string(LENGTH ${hexString} hexStringLength) + + # appends null byte if asked + if(BIN2H_NULL_TERMINATE) + set(hexString "${hexString}00") + endif() + + # wraps the hex string into multiple lines at column 32(i.e. 16 bytes per line) + wrap_string(VARIABLE hexString AT_COLUMN 32) + math(EXPR arraySize "${hexStringLength} / 2") + + # adds '0x' prefix and comma suffix before and after every byte respectively + string(REGEX REPLACE "([0-9a-f][0-9a-f])" "0x\\1, " arrayValues ${hexString}) + # removes trailing comma + string(REGEX REPLACE ", $" "" arrayValues ${arrayValues}) + + # converts the variable name into proper C identifier + string(MAKE_C_IDENTIFIER "${BIN2H_VARIABLE_NAME}" BIN2H_VARIABLE_NAME) + # string(TOUPPER "${BIN2H_VARIABLE_NAME}" BIN2H_VARIABLE_NAME) + + # declares byte array and the length variables + set(arrayDefinition "const unsigned char ${BIN2H_VARIABLE_NAME}[] = { ${arrayValues} };") + set(arraySizeDefinition "const size_t ${BIN2H_VARIABLE_NAME}_SIZE = ${arraySize};") + set(warnTxt "") + if (BIN2H_ADD_WARNING_TEXT) + set(warnTxt "/* WARN: This file is auto-generated from ${BIN2H_SOURCE_FILE} */\n") + endif () + + set(declarations "${warnTxt}${arrayDefinition}\n\n${arraySizeDefinition}\n\n") + if(BIN2H_APPEND) + file(APPEND ${BIN2H_HEADER_FILE} "${declarations}") + else() + file(WRITE ${BIN2H_HEADER_FILE} "${declarations}") + endif() +endfunction() \ No newline at end of file diff --git a/deps/deps-linux.cmake b/deps/deps-linux.cmake index 420638d2f0b..35522504cab 100644 --- a/deps/deps-linux.cmake +++ b/deps/deps-linux.cmake @@ -13,11 +13,11 @@ include("deps-unix-common.cmake") ExternalProject_Add(dep_boost EXCLUDE_FROM_ALL 1 - URL "https://dl.bintray.com/boostorg/release/1.70.0/source/boost_1_70_0.tar.gz" - URL_HASH SHA256=882b48708d211a5f48e60b0124cf5863c1534cd544ecd0664bb534a4b5d506e9 + URL "https://dl.bintray.com/boostorg/release/1.75.0/source/boost_1_75_0.tar.gz" + URL_HASH SHA256=aeb26f80e80945e82ee93e5939baebdca47b9dee80a07d3144be1e1a6a66dd6a BUILD_IN_SOURCE 1 CONFIGURE_COMMAND ./bootstrap.sh - --with-libraries=system,iostreams,filesystem,thread,log,locale,regex + --with-libraries=system,iostreams,filesystem,thread,log,locale,regex,date_time "--prefix=${DESTDIR}/usr/local" BUILD_COMMAND ./b2 -j ${NPROC} @@ -26,6 +26,7 @@ ExternalProject_Add(dep_boost variant=release threading=multi boost.locale.icu=off + --disable-icu cflags=-fPIC cxxflags=-fPIC install diff --git a/deps/deps-macos.cmake b/deps/deps-macos.cmake index f985cc56104..53ba008c3e5 100644 --- a/deps/deps-macos.cmake +++ b/deps/deps-macos.cmake @@ -18,12 +18,12 @@ include("deps-unix-common.cmake") ExternalProject_Add(dep_boost EXCLUDE_FROM_ALL 1 - URL "https://dl.bintray.com/boostorg/release/1.70.0/source/boost_1_70_0.tar.gz" - URL_HASH SHA256=882b48708d211a5f48e60b0124cf5863c1534cd544ecd0664bb534a4b5d506e9 + URL "https://dl.bintray.com/boostorg/release/1.75.0/source/boost_1_75_0.tar.gz" + URL_HASH SHA256=aeb26f80e80945e82ee93e5939baebdca47b9dee80a07d3144be1e1a6a66dd6a BUILD_IN_SOURCE 1 CONFIGURE_COMMAND ./bootstrap.sh --with-toolset=clang - --with-libraries=system,iostreams,filesystem,thread,log,locale,regex + --with-libraries=system,iostreams,filesystem,thread,log,locale,regex,date_time "--prefix=${DESTDIR}/usr/local" BUILD_COMMAND ./b2 -j ${NPROC} @@ -33,6 +33,7 @@ ExternalProject_Add(dep_boost variant=release threading=multi boost.locale.icu=off + --disable-icu "cflags=-fPIC -mmacosx-version-min=${DEP_OSX_TARGET}" "cxxflags=-fPIC -mmacosx-version-min=${DEP_OSX_TARGET}" "mflags=-fPIC -mmacosx-version-min=${DEP_OSX_TARGET}" diff --git a/deps/deps-mingw.cmake b/deps/deps-mingw.cmake index 89b7e2b4378..c97346bb039 100644 --- a/deps/deps-mingw.cmake +++ b/deps/deps-mingw.cmake @@ -9,8 +9,8 @@ include("deps-unix-common.cmake") ExternalProject_Add(dep_boost EXCLUDE_FROM_ALL 1 - URL "https://dl.bintray.com/boostorg/release/1.70.0/source/boost_1_70_0.tar.gz" - URL_HASH SHA256=882b48708d211a5f48e60b0124cf5863c1534cd544ecd0664bb534a4b5d506e9 + URL "https://dl.bintray.com/boostorg/release/1.75.0/source/boost_1_75_0.tar.gz" + URL_HASH SHA256=aeb26f80e80945e82ee93e5939baebdca47b9dee80a07d3144be1e1a6a66dd6a BUILD_IN_SOURCE 1 CONFIGURE_COMMAND bootstrap.bat BUILD_COMMAND b2.exe @@ -21,6 +21,7 @@ ExternalProject_Add(dep_boost --with-log --with-locale --with-regex + --with-date_time "--prefix=${DESTDIR}/usr/local" "address-model=${DEPS_BITS}" "toolset=${DEP_BOOST_TOOLSET}" diff --git a/deps/deps-windows.cmake b/deps/deps-windows.cmake index ac93b493203..c0d80bb291d 100644 --- a/deps/deps-windows.cmake +++ b/deps/deps-windows.cmake @@ -55,8 +55,8 @@ endmacro() ExternalProject_Add(dep_boost EXCLUDE_FROM_ALL 1 - URL "https://dl.bintray.com/boostorg/release/1.70.0/source/boost_1_70_0.tar.gz" - URL_HASH SHA256=882b48708d211a5f48e60b0124cf5863c1534cd544ecd0664bb534a4b5d506e9 + URL "https://dl.bintray.com/boostorg/release/1.75.0/source/boost_1_75_0.tar.gz" + URL_HASH SHA256=aeb26f80e80945e82ee93e5939baebdca47b9dee80a07d3144be1e1a6a66dd6a BUILD_IN_SOURCE 1 CONFIGURE_COMMAND bootstrap.bat BUILD_COMMAND b2.exe @@ -68,6 +68,7 @@ ExternalProject_Add(dep_boost --with-log --with-locale --with-regex + --with-date_time "--prefix=${DESTDIR}/usr/local" "address-model=${DEPS_BITS}" "toolset=${DEP_BOOST_TOOLSET}" @@ -75,6 +76,7 @@ ExternalProject_Add(dep_boost variant=release threading=multi boost.locale.icu=off + --disable-icu "${DEP_BOOST_DEBUG}" release install INSTALL_COMMAND "" # b2 does that already ) diff --git a/deps/wxWidgets/wxWidgets.cmake b/deps/wxWidgets/wxWidgets.cmake index ee38309a687..bf23698cf4d 100644 --- a/deps/wxWidgets/wxWidgets.cmake +++ b/deps/wxWidgets/wxWidgets.cmake @@ -1,4 +1,4 @@ -if (APPLE AND ${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm") +if (APPLE) # The new OSX 11 (Big Sur) is not compatible with wxWidgets 3.1.3. # Let's use patched wxWidgets 3.1.4, even though it is not quite tested. set(_wx_git_tag v3.1.4-patched) diff --git a/doc/How to build - Windows.md b/doc/How to build - Windows.md index 979ad9b6273..3df17b88f95 100644 --- a/doc/How to build - Windows.md +++ b/doc/How to build - Windows.md @@ -1,5 +1,61 @@ +# Step by Step Visual Studio 2019 Instructions -# This how-to is out of date +### Install the tools + +Install Visual Studio Community 2019 from [visualstudio.microsoft.com/vs/](https://visualstudio.microsoft.com/vs/). Older versions are not supported as PrusaSlicer requires support for C++17. +Select all workload options for C++ + +Install git for Windows from [gitforwindows.org](https://gitforwindows.org/) +Download and run the exe accepting all defaults + +### Download sources + +Clone the respository. To place it in C:\src\PrusaSlicer, run: +``` +c:> mkdir src +c:> cd src +c:\src> git clone https://github.com/prusa3d/PrusaSlicer.git +``` + +### Compile the dependencies. +Dependencies are updated seldomly, thus they are compiled out of the PrusaSlicer source tree. +Go to the Windows Start Menu and Click on "Visual Studio 2019" folder, then select the ->"x64 Native Tools Command Prompt" to open a command window and run the following: +``` +cd c:\src\PrusaSlicer\deps +mkdir build +cd build +cmake .. -G "Visual Studio 16 2019" -DDESTDIR="c:\src\PrusaSlicer-deps" + +msbuild /m ALL_BUILD.vcxproj // This took 13.5 minutes on my machine: core I7-7700K @ 4.2Ghz with 32GB main memory and 20min on a average laptop +``` + +### Generate Visual Studio project file for PrusaSlicer, referencing the precompiled dependencies. +Go to the Windows Start Menu and Click on "Visual Studio 2019" folder, then select the ->"x64 Native Tools Command Prompt" to open a command window and run the following: +``` +cd c:\src\PrusaSlicer\ +mkdir build +cd build +cmake .. -G "Visual Studio 16 2019" -DCMAKE_PREFIX_PATH="c:\src\PrusaSlicer-deps\usr\local" +``` + +### Compile PrusaSlicer. + +Double-click c:\src\PrusaSlicer\build\PrusaSlicer.sln to open in Visual Studio 2019. +OR +Open Visual Studio for C++ development (VS asks this the first time you start it). + +Select PrusaSlicer_app_gui as your startup project (right-click->Set as Startup Project). + +Run Build->Rebuild Solution once to populate all required dependency modules. This is NOT done automatically when you build/run. If you run both Debug and Release variants, you will need to do this once for each. + +Debug->Start Debugging or press F5 + +PrusaSlicer should start. You're up and running! + +note: Thanks to @douggorgen for the original guide, as an answer for a issue + + +# The below information is out of date, but still useful for reference purposes We have switched to MS Visual Studio 2019. @@ -119,38 +175,4 @@ option to CMake, this will only produce a _Release_ build. Refer to the CMake scripts inside the `deps` directory to see which dependencies are built in what versions and how this is done. \*) Specifically, the problem arises when building boost. Boost build tool appends all build options into paths of -intermediate files, which are not handled correctly by either `b2.exe` or possibly `ninja` (?). - - -# Noob guide (step by step) - -- Install Visual Studio Community 2019 from [visualstudio.microsoft.com/vs/](https://visualstudio.microsoft.com/vs/) -- Select all workload options for C++ -- Install git for Windows from [gitforwindows.org](https://gitforwindows.org/) - - download and run the exe accepting all defaults -- Download `PrusaSlicer-master.zip` from github - - This example will use the directory c:\PrusaSlicer and unzipped to `c:\PrusaSlicer\PrusaSlicer-master\` so this will be the prefix for all the steps. Substitute your as required prefix. -- Go to the Windows Start Menu and Click on "Visual Studio 2019" folder, then select the ->"x64 Native Tools Command Prompt" to open a command window - - cd c:\PrusaSlicer\PrusaSlicer-master\deps - mkdir build - cd build - cmake .. -G "Visual Studio 16 2019" -DDESTDIR="c:\PrusaSlicer\PrusaSlicer-master" - msbuild /m ALL_BUILD.vcxproj // This took 13.5 minutes on the following machine: core I7-7700K @ 4.2Ghz with 32GB main memory and 20min on an average laptop - cd c:\PrusaSlicer\PrusaSlicer-master\ - mkdir build - cd build - cmake .. -G "Visual Studio 16 2019" -DCMAKE_PREFIX_PATH="c:\PrusaSlicer\PrusaSlicer-master\usr\local" - -- Open Visual Studio for c++ development (VS asks this the first time you start it) - -`Open->Project/Solution` or `File->Open->Project/Solution` (depending on which dialog comes up first) - -- Click on `c:\PrusaSlicer\PrusaSlicer-master\build\PrusaSlicer.sln` - -`Debug->Start Debugging` or `Debug->Start Without debugging` - -- PrusaSlicer should start. -- You're up and running! - -Note: Thanks to @douggorgen for the original guide, as an answer for a issue +intermediate files, which are not handled correctly by either `b2.exe` or possibly `ninja` (?). \ No newline at end of file diff --git a/doc/Localization_guide.md b/doc/Localization_guide.md index 8e34deef55e..8dfbc54904d 100644 --- a/doc/Localization_guide.md +++ b/doc/Localization_guide.md @@ -16,7 +16,7 @@ Full manual for GNUgettext can be seen here: http://www.gnu.org/software/gettext https://github.com/prusa3d/PrusaSlicer/tree/master/resources/localization 2. Open this file in PoEdit as "Edit a translation" 3. Apply your corrections to the translation -4. Push changed PrusaSlicer.po and PrusaSlicer.mo (will create automatically after saving of PrusaSlicer.po in PoEdit) back to to the enter folder. +4. Push changed PrusaSlicer.po and PrusaSlicer.mo (will create automatically after saving of PrusaSlicer.po in PoEdit) into the original folder. ### Scenario 2. How do I add a new language support 1. Get file PrusaSlicer.pot here : @@ -71,6 +71,33 @@ https://github.com/prusa3d/PrusaSlicer/tree/master/resources/localization/list.t ``` Notice, in this Catalog it will be totally same strings for initial text and translated. -When you have Catalog to translation open POT or PO file in PoEdit and start to translation, -it's very important to keep attention to every gaps and punctuation. Especially with -formatted strings. (using %d, %s, etc.) \ No newline at end of file +When you have Catalog to translation open POT or PO file in PoEdit and start translating. + + +## General guidelines for PrusaSlicer translators + + +- We recommend using *PoEdit* application for translation (as described above). It will help you eliminate most punctuation errors and will show you strings with "random" translations (if the fuzzy parameter was used). + +- To check how the translated text looks on the UI elements, test it :) If you use *PoEdit*, all you need to do is save the file. At this point, a MO file will be created. Rename it PrusaSlicer.mo, and you can run PrusaSlicer (see above). + +- If you see an encoding error (garbage characters instead of Unicode) somewhere in PrusaSlicer, report it. It is likely not a problem of your translation, but a bug in the software. + +- See on which UI elements the translated phrase will be used. Especially if it's a button, it is very important to decide on the translation and not write alternative translations in parentheses, as this will significantly increase the width of the button, which is sometimes highly undesirable: + +![Long text on button](images/long_text_on_button.png) + +- If you decide to use autocorrect or any batch processing tool, the output requires very careful proofreading. It is very easy to make it do changes that break things big time. + +- **Any formatting parts of the phrases must remain unchanged.** For example, you should not change `%1%` to `%1 %`, you should not change `%%` to `%` (for percent sign) and similar. This will lead to application crashes. + +- Please pay attention to spaces, line breaks (\n) and punctuation marks. **Don't add extra line breaks.** This is especially important for parameter names. + +- Description of the parameters should not contain units of measurement. For example, "Enable fan if layer print time is less than ~~n seconds~~" + +- For units of measurement, use the international system of units. Use "s" instead of "sec". + +- If the phrase doesn't have a dot at the end, don't add it. And if it does, then don't forget to :) + +- It is useful to stick to the same terminology in the application (especially with basic terms such as "filament" and similar). Stay consistent. Otherwise it will confuse users. + diff --git a/doc/images/long_text_on_button.png b/doc/images/long_text_on_button.png new file mode 100644 index 00000000000..5f4ca87be24 Binary files /dev/null and b/doc/images/long_text_on_button.png differ diff --git a/resources/icons/compare.svg b/resources/icons/compare.svg new file mode 100644 index 00000000000..fcb458f7c46 --- /dev/null +++ b/resources/icons/compare.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + diff --git a/resources/icons/equal.svg b/resources/icons/equal.svg new file mode 100644 index 00000000000..bce4a24f7c9 --- /dev/null +++ b/resources/icons/equal.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + diff --git a/resources/icons/not_equal.svg b/resources/icons/not_equal.svg new file mode 100644 index 00000000000..bc881443530 --- /dev/null +++ b/resources/icons/not_equal.svg @@ -0,0 +1,16 @@ + + + + + + + + + + diff --git a/resources/icons/white/colorchange_add_m.svg b/resources/icons/white/colorchange_add_m.svg new file mode 100644 index 00000000000..2266560daac --- /dev/null +++ b/resources/icons/white/colorchange_add_m.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + diff --git a/resources/icons/white/edit_gcode.svg b/resources/icons/white/edit_gcode.svg new file mode 100644 index 00000000000..85836c0b499 --- /dev/null +++ b/resources/icons/white/edit_gcode.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/resources/icons/white/error_tick.svg b/resources/icons/white/error_tick.svg new file mode 100644 index 00000000000..f3de981f031 --- /dev/null +++ b/resources/icons/white/error_tick.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/resources/icons/white/pause_print.svg b/resources/icons/white/pause_print.svg new file mode 100644 index 00000000000..73f747fffd6 --- /dev/null +++ b/resources/icons/white/pause_print.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + diff --git a/resources/localization/PrusaSlicer.pot b/resources/localization/PrusaSlicer.pot index 5c328e479c0..58ed3370e60 100644 --- a/resources/localization/PrusaSlicer.pot +++ b/resources/localization/PrusaSlicer.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-12-18 13:59+0100\n" +"POT-Creation-Date: 2021-02-03 21:27+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -39,16 +39,16 @@ msgid "About %s" msgstr "" #: src/slic3r/GUI/AboutDialog.cpp:238 src/slic3r/GUI/AboutDialog.cpp:361 -#: src/slic3r/GUI/GUI_App.cpp:235 src/slic3r/GUI/MainFrame.cpp:151 +#: src/slic3r/GUI/GUI_App.cpp:243 src/slic3r/GUI/MainFrame.cpp:151 msgid "Version" msgstr "" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:265 src/slic3r/GUI/GUI_App.cpp:240 +#: src/slic3r/GUI/AboutDialog.cpp:265 src/slic3r/GUI/GUI_App.cpp:248 msgid "is licensed under the" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:266 src/slic3r/GUI/GUI_App.cpp:240 +#: src/slic3r/GUI/AboutDialog.cpp:266 src/slic3r/GUI/GUI_App.cpp:248 msgid "GNU Affero General Public License, version 3" msgstr "" @@ -141,8 +141,8 @@ msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:93 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:240 src/slic3r/GUI/Plater.cpp:162 -#: src/slic3r/GUI/Tab.cpp:2536 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:221 src/slic3r/GUI/Plater.cpp:162 +#: src/slic3r/GUI/Tab.cpp:2550 msgid "Size" msgstr "" @@ -150,7 +150,7 @@ msgstr "" msgid "Origin" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:95 src/libslic3r/PrintConfig.cpp:771 +#: src/slic3r/GUI/BedShapeDialog.cpp:95 src/libslic3r/PrintConfig.cpp:796 msgid "Diameter" msgstr "" @@ -165,47 +165,49 @@ msgid "" msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:129 src/slic3r/GUI/ConfigWizard.cpp:242 -#: src/slic3r/GUI/ConfigWizard.cpp:1368 src/slic3r/GUI/ConfigWizard.cpp:1382 +#: src/slic3r/GUI/ConfigWizard.cpp:1366 src/slic3r/GUI/ConfigWizard.cpp:1380 #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:88 -#: src/slic3r/GUI/GCodeViewer.cpp:2337 src/slic3r/GUI/GCodeViewer.cpp:2343 -#: src/slic3r/GUI/GCodeViewer.cpp:2351 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:179 +#: src/slic3r/GUI/GCodeViewer.cpp:3647 src/slic3r/GUI/GCodeViewer.cpp:3653 +#: src/slic3r/GUI/GCodeViewer.cpp:3661 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:179 #: src/slic3r/GUI/GUI_ObjectLayers.cpp:145 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:341 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:418 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:487 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:322 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:399 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:467 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:468 #: src/slic3r/GUI/ObjectDataViewModel.cpp:96 #: src/slic3r/GUI/WipeTowerDialog.cpp:85 src/libslic3r/PrintConfig.cpp:77 #: src/libslic3r/PrintConfig.cpp:84 src/libslic3r/PrintConfig.cpp:95 #: src/libslic3r/PrintConfig.cpp:135 src/libslic3r/PrintConfig.cpp:244 -#: src/libslic3r/PrintConfig.cpp:302 src/libslic3r/PrintConfig.cpp:377 -#: src/libslic3r/PrintConfig.cpp:385 src/libslic3r/PrintConfig.cpp:435 -#: src/libslic3r/PrintConfig.cpp:565 src/libslic3r/PrintConfig.cpp:576 -#: src/libslic3r/PrintConfig.cpp:594 src/libslic3r/PrintConfig.cpp:774 -#: src/libslic3r/PrintConfig.cpp:1258 src/libslic3r/PrintConfig.cpp:1439 -#: src/libslic3r/PrintConfig.cpp:1500 src/libslic3r/PrintConfig.cpp:1518 -#: src/libslic3r/PrintConfig.cpp:1536 src/libslic3r/PrintConfig.cpp:1594 -#: src/libslic3r/PrintConfig.cpp:1604 src/libslic3r/PrintConfig.cpp:1729 -#: src/libslic3r/PrintConfig.cpp:1737 src/libslic3r/PrintConfig.cpp:1778 -#: src/libslic3r/PrintConfig.cpp:1786 src/libslic3r/PrintConfig.cpp:1796 -#: src/libslic3r/PrintConfig.cpp:1804 src/libslic3r/PrintConfig.cpp:1812 -#: src/libslic3r/PrintConfig.cpp:1875 src/libslic3r/PrintConfig.cpp:2141 -#: src/libslic3r/PrintConfig.cpp:2212 src/libslic3r/PrintConfig.cpp:2246 -#: src/libslic3r/PrintConfig.cpp:2375 src/libslic3r/PrintConfig.cpp:2454 -#: src/libslic3r/PrintConfig.cpp:2461 src/libslic3r/PrintConfig.cpp:2468 -#: src/libslic3r/PrintConfig.cpp:2498 src/libslic3r/PrintConfig.cpp:2508 -#: src/libslic3r/PrintConfig.cpp:2518 src/libslic3r/PrintConfig.cpp:2678 -#: src/libslic3r/PrintConfig.cpp:2712 src/libslic3r/PrintConfig.cpp:2851 -#: src/libslic3r/PrintConfig.cpp:2860 src/libslic3r/PrintConfig.cpp:2869 -#: src/libslic3r/PrintConfig.cpp:2879 src/libslic3r/PrintConfig.cpp:2944 -#: src/libslic3r/PrintConfig.cpp:2954 src/libslic3r/PrintConfig.cpp:2966 -#: src/libslic3r/PrintConfig.cpp:2986 src/libslic3r/PrintConfig.cpp:2996 -#: src/libslic3r/PrintConfig.cpp:3006 src/libslic3r/PrintConfig.cpp:3024 -#: src/libslic3r/PrintConfig.cpp:3039 src/libslic3r/PrintConfig.cpp:3053 -#: src/libslic3r/PrintConfig.cpp:3064 src/libslic3r/PrintConfig.cpp:3077 -#: src/libslic3r/PrintConfig.cpp:3122 src/libslic3r/PrintConfig.cpp:3132 -#: src/libslic3r/PrintConfig.cpp:3141 src/libslic3r/PrintConfig.cpp:3151 -#: src/libslic3r/PrintConfig.cpp:3167 src/libslic3r/PrintConfig.cpp:3191 +#: src/libslic3r/PrintConfig.cpp:303 src/libslic3r/PrintConfig.cpp:328 +#: src/libslic3r/PrintConfig.cpp:402 src/libslic3r/PrintConfig.cpp:410 +#: src/libslic3r/PrintConfig.cpp:460 src/libslic3r/PrintConfig.cpp:590 +#: src/libslic3r/PrintConfig.cpp:601 src/libslic3r/PrintConfig.cpp:619 +#: src/libslic3r/PrintConfig.cpp:799 src/libslic3r/PrintConfig.cpp:1085 +#: src/libslic3r/PrintConfig.cpp:1094 src/libslic3r/PrintConfig.cpp:1347 +#: src/libslic3r/PrintConfig.cpp:1528 src/libslic3r/PrintConfig.cpp:1589 +#: src/libslic3r/PrintConfig.cpp:1607 src/libslic3r/PrintConfig.cpp:1625 +#: src/libslic3r/PrintConfig.cpp:1683 src/libslic3r/PrintConfig.cpp:1693 +#: src/libslic3r/PrintConfig.cpp:1818 src/libslic3r/PrintConfig.cpp:1826 +#: src/libslic3r/PrintConfig.cpp:1867 src/libslic3r/PrintConfig.cpp:1875 +#: src/libslic3r/PrintConfig.cpp:1885 src/libslic3r/PrintConfig.cpp:1893 +#: src/libslic3r/PrintConfig.cpp:1901 src/libslic3r/PrintConfig.cpp:1964 +#: src/libslic3r/PrintConfig.cpp:2230 src/libslic3r/PrintConfig.cpp:2301 +#: src/libslic3r/PrintConfig.cpp:2335 src/libslic3r/PrintConfig.cpp:2464 +#: src/libslic3r/PrintConfig.cpp:2543 src/libslic3r/PrintConfig.cpp:2550 +#: src/libslic3r/PrintConfig.cpp:2557 src/libslic3r/PrintConfig.cpp:2587 +#: src/libslic3r/PrintConfig.cpp:2597 src/libslic3r/PrintConfig.cpp:2607 +#: src/libslic3r/PrintConfig.cpp:2767 src/libslic3r/PrintConfig.cpp:2801 +#: src/libslic3r/PrintConfig.cpp:2940 src/libslic3r/PrintConfig.cpp:2949 +#: src/libslic3r/PrintConfig.cpp:2958 src/libslic3r/PrintConfig.cpp:2968 +#: src/libslic3r/PrintConfig.cpp:3033 src/libslic3r/PrintConfig.cpp:3043 +#: src/libslic3r/PrintConfig.cpp:3055 src/libslic3r/PrintConfig.cpp:3075 +#: src/libslic3r/PrintConfig.cpp:3085 src/libslic3r/PrintConfig.cpp:3095 +#: src/libslic3r/PrintConfig.cpp:3113 src/libslic3r/PrintConfig.cpp:3128 +#: src/libslic3r/PrintConfig.cpp:3142 src/libslic3r/PrintConfig.cpp:3153 +#: src/libslic3r/PrintConfig.cpp:3166 src/libslic3r/PrintConfig.cpp:3211 +#: src/libslic3r/PrintConfig.cpp:3221 src/libslic3r/PrintConfig.cpp:3230 +#: src/libslic3r/PrintConfig.cpp:3240 src/libslic3r/PrintConfig.cpp:3256 +#: src/libslic3r/PrintConfig.cpp:3280 msgid "mm" msgstr "" @@ -223,7 +225,7 @@ msgstr "" msgid "Circular" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:143 src/slic3r/GUI/GUI_Preview.cpp:243 +#: src/slic3r/GUI/BedShapeDialog.cpp:143 src/slic3r/GUI/GUI_Preview.cpp:240 #: src/libslic3r/ExtrusionEntity.cpp:323 src/libslic3r/ExtrusionEntity.cpp:358 msgid "Custom" msgstr "" @@ -233,7 +235,7 @@ msgid "Invalid" msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:156 src/slic3r/GUI/BedShapeDialog.cpp:222 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2288 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2306 msgid "Shape" msgstr "" @@ -254,7 +256,7 @@ msgid "Load..." msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:333 src/slic3r/GUI/BedShapeDialog.cpp:413 -#: src/slic3r/GUI/Tab.cpp:3484 +#: src/slic3r/GUI/Tab.cpp:3502 msgid "Remove" msgstr "" @@ -296,7 +298,7 @@ msgstr "" msgid "Choose an STL file to import bed model from:" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.hpp:98 src/slic3r/GUI/ConfigWizard.cpp:1327 +#: src/slic3r/GUI/BedShapeDialog.hpp:98 src/slic3r/GUI/ConfigWizard.cpp:1325 msgid "Bed Shape" msgstr "" @@ -320,11 +322,11 @@ msgstr "" msgid "OctoPrint version" msgstr "" -#: src/slic3r/GUI/BonjourDialog.cpp:218 +#: src/slic3r/GUI/BonjourDialog.cpp:224 msgid "Searching for devices" msgstr "" -#: src/slic3r/GUI/BonjourDialog.cpp:225 +#: src/slic3r/GUI/BonjourDialog.cpp:231 msgid "Finished" msgstr "" @@ -332,11 +334,11 @@ msgstr "" msgid "Buttons And Text Colors Description" msgstr "" -#: src/slic3r/GUI/ButtonsDescription.cpp:36 +#: src/slic3r/GUI/ButtonsDescription.cpp:36 src/slic3r/GUI/Preferences.cpp:517 msgid "Value is the same as the system value" msgstr "" -#: src/slic3r/GUI/ButtonsDescription.cpp:53 +#: src/slic3r/GUI/ButtonsDescription.cpp:53 src/slic3r/GUI/Preferences.cpp:528 msgid "" "Value was changed and is not equal to the system value or the last saved " "preset" @@ -362,7 +364,7 @@ msgid "" "The first layer height will be reset to 0.01." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:969 +#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:994 msgid "First layer height" msgstr "" @@ -438,31 +440,31 @@ msgstr "" #: src/slic3r/GUI/ConfigManipulation.cpp:202 #: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:93 -#: src/slic3r/GUI/GUI_ObjectList.cpp:668 src/slic3r/GUI/Plater.cpp:389 -#: src/slic3r/GUI/Tab.cpp:1432 src/slic3r/GUI/Tab.cpp:1434 -#: src/libslic3r/PrintConfig.cpp:259 src/libslic3r/PrintConfig.cpp:472 -#: src/libslic3r/PrintConfig.cpp:496 src/libslic3r/PrintConfig.cpp:848 -#: src/libslic3r/PrintConfig.cpp:862 src/libslic3r/PrintConfig.cpp:899 -#: src/libslic3r/PrintConfig.cpp:1076 src/libslic3r/PrintConfig.cpp:1086 -#: src/libslic3r/PrintConfig.cpp:1153 src/libslic3r/PrintConfig.cpp:1172 -#: src/libslic3r/PrintConfig.cpp:1191 src/libslic3r/PrintConfig.cpp:1928 -#: src/libslic3r/PrintConfig.cpp:1945 +#: src/slic3r/GUI/GUI_ObjectList.cpp:682 src/slic3r/GUI/Plater.cpp:389 +#: src/slic3r/GUI/Tab.cpp:1444 src/slic3r/GUI/Tab.cpp:1446 +#: src/libslic3r/PrintConfig.cpp:259 src/libslic3r/PrintConfig.cpp:497 +#: src/libslic3r/PrintConfig.cpp:521 src/libslic3r/PrintConfig.cpp:873 +#: src/libslic3r/PrintConfig.cpp:887 src/libslic3r/PrintConfig.cpp:924 +#: src/libslic3r/PrintConfig.cpp:1165 src/libslic3r/PrintConfig.cpp:1175 +#: src/libslic3r/PrintConfig.cpp:1242 src/libslic3r/PrintConfig.cpp:1261 +#: src/libslic3r/PrintConfig.cpp:1280 src/libslic3r/PrintConfig.cpp:2017 +#: src/libslic3r/PrintConfig.cpp:2034 msgid "Infill" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:320 +#: src/slic3r/GUI/ConfigManipulation.cpp:322 msgid "Head penetration should not be greater than the head width." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:322 +#: src/slic3r/GUI/ConfigManipulation.cpp:324 msgid "Invalid Head penetration" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:333 +#: src/slic3r/GUI/ConfigManipulation.cpp:335 msgid "Pinhead diameter should be smaller than the pillar diameter." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:335 +#: src/slic3r/GUI/ConfigManipulation.cpp:337 msgid "Invalid pinhead diameter" msgstr "" @@ -483,7 +485,7 @@ msgid "User" msgstr "" #: src/slic3r/GUI/ConfigSnapshotDialog.cpp:28 -#: src/slic3r/GUI/GUI_Preview.cpp:229 src/libslic3r/ExtrusionEntity.cpp:309 +#: src/slic3r/GUI/GUI_Preview.cpp:226 src/libslic3r/ExtrusionEntity.cpp:309 msgid "Unknown" msgstr "" @@ -495,7 +497,7 @@ msgstr "" msgid "PrusaSlicer version" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:55 src/libslic3r/Preset.cpp:1298 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:55 src/libslic3r/Preset.cpp:1303 msgid "print" msgstr "" @@ -503,16 +505,16 @@ msgstr "" msgid "filaments" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:59 src/libslic3r/Preset.cpp:1300 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:59 src/libslic3r/Preset.cpp:1305 msgid "SLA print" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 src/slic3r/GUI/Plater.cpp:696 -#: src/libslic3r/Preset.cpp:1301 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 src/slic3r/GUI/Plater.cpp:693 +#: src/libslic3r/Preset.cpp:1306 msgid "SLA material" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:62 src/libslic3r/Preset.cpp:1302 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:62 src/libslic3r/Preset.cpp:1307 msgid "printer" msgstr "" @@ -570,13 +572,13 @@ msgid "Standard" msgstr "" #: src/slic3r/GUI/ConfigWizard.cpp:311 src/slic3r/GUI/ConfigWizard.cpp:605 -#: src/slic3r/GUI/Tab.cpp:3565 src/slic3r/GUI/UnsavedChangesDialog.cpp:933 +#: src/slic3r/GUI/Tab.cpp:3583 src/slic3r/GUI/UnsavedChangesDialog.cpp:933 msgid "All" msgstr "" #: src/slic3r/GUI/ConfigWizard.cpp:312 src/slic3r/GUI/ConfigWizard.cpp:606 -#: src/slic3r/GUI/DoubleSlider.cpp:1859 src/slic3r/GUI/Plater.cpp:361 -#: src/slic3r/GUI/Plater.cpp:504 +#: src/slic3r/GUI/DoubleSlider.cpp:1879 src/slic3r/GUI/Plater.cpp:361 +#: src/slic3r/GUI/Plater.cpp:504 src/libslic3r/PrintConfig.cpp:1045 msgid "None" msgstr "" @@ -643,35 +645,35 @@ msgid "" "filament:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1107 +#: src/slic3r/GUI/ConfigWizard.cpp:1105 msgid "Custom Printer Setup" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1107 +#: src/slic3r/GUI/ConfigWizard.cpp:1105 msgid "Custom Printer" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1109 +#: src/slic3r/GUI/ConfigWizard.cpp:1107 msgid "Define a custom printer profile" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1111 +#: src/slic3r/GUI/ConfigWizard.cpp:1109 msgid "Custom profile name:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1136 +#: src/slic3r/GUI/ConfigWizard.cpp:1134 msgid "Automatic updates" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1136 +#: src/slic3r/GUI/ConfigWizard.cpp:1134 msgid "Updates" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1144 src/slic3r/GUI/Preferences.cpp:94 +#: src/slic3r/GUI/ConfigWizard.cpp:1142 src/slic3r/GUI/Preferences.cpp:94 msgid "Check for application updates" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1148 +#: src/slic3r/GUI/ConfigWizard.cpp:1146 #, possible-c-format msgid "" "If enabled, %s checks for new application versions online. When a new " @@ -680,11 +682,11 @@ msgid "" "notification mechanisms, no automatic installation is done." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1154 src/slic3r/GUI/Preferences.cpp:129 +#: src/slic3r/GUI/ConfigWizard.cpp:1152 src/slic3r/GUI/Preferences.cpp:129 msgid "Update built-in Presets automatically" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1158 +#: src/slic3r/GUI/ConfigWizard.cpp:1156 #, possible-c-format msgid "" "If enabled, %s downloads updates of built-in system presets in the " @@ -693,30 +695,30 @@ msgid "" "startup." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1161 +#: src/slic3r/GUI/ConfigWizard.cpp:1159 msgid "" "Updates are never applied without user's consent and never overwrite user's " "customized settings." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1166 +#: src/slic3r/GUI/ConfigWizard.cpp:1164 msgid "" "Additionally a backup snapshot of the whole configuration is created before " "an update is applied." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1173 src/slic3r/GUI/GUI_ObjectList.cpp:1825 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4567 src/slic3r/GUI/Plater.cpp:3116 -#: src/slic3r/GUI/Plater.cpp:4001 src/slic3r/GUI/Plater.cpp:4032 +#: src/slic3r/GUI/ConfigWizard.cpp:1171 src/slic3r/GUI/GUI_ObjectList.cpp:1843 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4601 src/slic3r/GUI/Plater.cpp:3130 +#: src/slic3r/GUI/Plater.cpp:4022 src/slic3r/GUI/Plater.cpp:4053 msgid "Reload from disk" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1176 +#: src/slic3r/GUI/ConfigWizard.cpp:1174 msgid "" "Export full pathnames of models and parts sources into 3mf and amf files" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1180 +#: src/slic3r/GUI/ConfigWizard.cpp:1178 msgid "" "If enabled, allows the Reload from disk command to automatically find and " "load the files when invoked.\n" @@ -724,23 +726,23 @@ msgid "" "using an open file dialog." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1190 +#: src/slic3r/GUI/ConfigWizard.cpp:1188 msgid "Files association" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1192 src/slic3r/GUI/Preferences.cpp:112 +#: src/slic3r/GUI/ConfigWizard.cpp:1190 src/slic3r/GUI/Preferences.cpp:112 msgid "Associate .3mf files to PrusaSlicer" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1193 src/slic3r/GUI/Preferences.cpp:119 +#: src/slic3r/GUI/ConfigWizard.cpp:1191 src/slic3r/GUI/Preferences.cpp:119 msgid "Associate .stl files to PrusaSlicer" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1204 +#: src/slic3r/GUI/ConfigWizard.cpp:1202 msgid "View mode" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1206 +#: src/slic3r/GUI/ConfigWizard.cpp:1204 msgid "" "PrusaSlicer's user interfaces comes in three variants:\n" "Simple, Advanced, and Expert.\n" @@ -749,221 +751,221 @@ msgid "" "fine-tuning, they are suitable for advanced and expert users, respectively." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1211 +#: src/slic3r/GUI/ConfigWizard.cpp:1209 msgid "Simple mode" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1212 +#: src/slic3r/GUI/ConfigWizard.cpp:1210 msgid "Advanced mode" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1213 +#: src/slic3r/GUI/ConfigWizard.cpp:1211 msgid "Expert mode" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1219 +#: src/slic3r/GUI/ConfigWizard.cpp:1217 msgid "The size of the object can be specified in inches" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1220 +#: src/slic3r/GUI/ConfigWizard.cpp:1218 msgid "Use inches" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1254 +#: src/slic3r/GUI/ConfigWizard.cpp:1252 msgid "Other Vendors" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1258 +#: src/slic3r/GUI/ConfigWizard.cpp:1256 #, possible-c-format msgid "Pick another vendor supported by %s" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1289 +#: src/slic3r/GUI/ConfigWizard.cpp:1287 msgid "Firmware Type" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1289 src/slic3r/GUI/Tab.cpp:2172 +#: src/slic3r/GUI/ConfigWizard.cpp:1287 src/slic3r/GUI/Tab.cpp:2186 msgid "Firmware" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1293 +#: src/slic3r/GUI/ConfigWizard.cpp:1291 msgid "Choose the type of firmware used by your printer." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1327 +#: src/slic3r/GUI/ConfigWizard.cpp:1325 msgid "Bed Shape and Size" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1330 +#: src/slic3r/GUI/ConfigWizard.cpp:1328 msgid "Set the shape of your printer's bed." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1350 +#: src/slic3r/GUI/ConfigWizard.cpp:1348 msgid "Filament and Nozzle Diameters" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1350 +#: src/slic3r/GUI/ConfigWizard.cpp:1348 msgid "Print Diameters" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1364 +#: src/slic3r/GUI/ConfigWizard.cpp:1362 msgid "Enter the diameter of your printer's hot end nozzle." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1367 +#: src/slic3r/GUI/ConfigWizard.cpp:1365 msgid "Nozzle Diameter:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1377 +#: src/slic3r/GUI/ConfigWizard.cpp:1375 msgid "Enter the diameter of your filament." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1378 +#: src/slic3r/GUI/ConfigWizard.cpp:1376 msgid "" "Good precision is required, so use a caliper and do multiple measurements " "along the filament, then compute the average." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1381 +#: src/slic3r/GUI/ConfigWizard.cpp:1379 msgid "Filament Diameter:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1415 +#: src/slic3r/GUI/ConfigWizard.cpp:1413 msgid "Nozzle and Bed Temperatures" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1415 +#: src/slic3r/GUI/ConfigWizard.cpp:1413 msgid "Temperatures" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1431 +#: src/slic3r/GUI/ConfigWizard.cpp:1429 msgid "Enter the temperature needed for extruding your filament." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1432 +#: src/slic3r/GUI/ConfigWizard.cpp:1430 msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1435 +#: src/slic3r/GUI/ConfigWizard.cpp:1433 msgid "Extrusion Temperature:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1436 src/slic3r/GUI/ConfigWizard.cpp:1450 -#: src/libslic3r/PrintConfig.cpp:202 src/libslic3r/PrintConfig.cpp:950 -#: src/libslic3r/PrintConfig.cpp:994 src/libslic3r/PrintConfig.cpp:2294 +#: src/slic3r/GUI/ConfigWizard.cpp:1434 src/slic3r/GUI/ConfigWizard.cpp:1448 +#: src/libslic3r/PrintConfig.cpp:202 src/libslic3r/PrintConfig.cpp:975 +#: src/libslic3r/PrintConfig.cpp:1019 src/libslic3r/PrintConfig.cpp:2383 msgid "°C" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1445 +#: src/slic3r/GUI/ConfigWizard.cpp:1443 msgid "" "Enter the bed temperature needed for getting your filament to stick to your " "heated bed." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1446 +#: src/slic3r/GUI/ConfigWizard.cpp:1444 msgid "" "A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have " "no heated bed." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1449 +#: src/slic3r/GUI/ConfigWizard.cpp:1447 msgid "Bed Temperature:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1909 src/slic3r/GUI/ConfigWizard.cpp:2582 +#: src/slic3r/GUI/ConfigWizard.cpp:1907 src/slic3r/GUI/ConfigWizard.cpp:2580 msgid "Filaments" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1909 src/slic3r/GUI/ConfigWizard.cpp:2584 +#: src/slic3r/GUI/ConfigWizard.cpp:1907 src/slic3r/GUI/ConfigWizard.cpp:2582 msgid "SLA Materials" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1963 +#: src/slic3r/GUI/ConfigWizard.cpp:1961 msgid "FFF Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1968 +#: src/slic3r/GUI/ConfigWizard.cpp:1966 msgid "SLA Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2274 src/slic3r/GUI/DoubleSlider.cpp:2245 -#: src/slic3r/GUI/DoubleSlider.cpp:2265 src/slic3r/GUI/GUI.cpp:244 +#: src/slic3r/GUI/ConfigWizard.cpp:2272 src/slic3r/GUI/DoubleSlider.cpp:2265 +#: src/slic3r/GUI/DoubleSlider.cpp:2285 src/slic3r/GUI/GUI.cpp:250 msgid "Notice" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2295 +#: src/slic3r/GUI/ConfigWizard.cpp:2293 msgid "The following FFF printer models have no filament selected:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2299 +#: src/slic3r/GUI/ConfigWizard.cpp:2297 msgid "Do you want to select default filaments for these FFF printer models?" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2313 +#: src/slic3r/GUI/ConfigWizard.cpp:2311 msgid "The following SLA printer models have no materials selected:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2317 +#: src/slic3r/GUI/ConfigWizard.cpp:2315 msgid "Do you want to select default SLA materials for these printer models?" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2545 +#: src/slic3r/GUI/ConfigWizard.cpp:2543 msgid "Select all standard printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2548 +#: src/slic3r/GUI/ConfigWizard.cpp:2546 msgid "< &Back" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2549 +#: src/slic3r/GUI/ConfigWizard.cpp:2547 msgid "&Next >" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2550 +#: src/slic3r/GUI/ConfigWizard.cpp:2548 msgid "&Finish" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2551 src/slic3r/GUI/FirmwareDialog.cpp:151 +#: src/slic3r/GUI/ConfigWizard.cpp:2549 src/slic3r/GUI/FirmwareDialog.cpp:151 #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:248 #: src/slic3r/GUI/ProgressStatusBar.cpp:26 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:656 msgid "Cancel" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2564 +#: src/slic3r/GUI/ConfigWizard.cpp:2562 msgid "Prusa FFF Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2567 +#: src/slic3r/GUI/ConfigWizard.cpp:2565 msgid "Prusa MSLA Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2582 +#: src/slic3r/GUI/ConfigWizard.cpp:2580 msgid "Filament Profiles Selection" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2582 src/slic3r/GUI/ConfigWizard.cpp:2584 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4144 +#: src/slic3r/GUI/ConfigWizard.cpp:2580 src/slic3r/GUI/ConfigWizard.cpp:2582 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4178 msgid "Type:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2584 +#: src/slic3r/GUI/ConfigWizard.cpp:2582 msgid "SLA Material Profiles Selection" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2701 +#: src/slic3r/GUI/ConfigWizard.cpp:2699 msgid "Configuration Assistant" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2702 +#: src/slic3r/GUI/ConfigWizard.cpp:2700 msgid "Configuration &Assistant" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2704 +#: src/slic3r/GUI/ConfigWizard.cpp:2702 msgid "Configuration Wizard" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2705 +#: src/slic3r/GUI/ConfigWizard.cpp:2703 msgid "Configuration &Wizard" msgstr "" @@ -971,19 +973,19 @@ msgstr "" msgid "Place bearings in slots and resume printing" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1224 +#: src/slic3r/GUI/DoubleSlider.cpp:1244 msgid "One layer mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1226 +#: src/slic3r/GUI/DoubleSlider.cpp:1246 msgid "Discard all custom changes" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1230 src/slic3r/GUI/DoubleSlider.cpp:1995 +#: src/slic3r/GUI/DoubleSlider.cpp:1250 src/slic3r/GUI/DoubleSlider.cpp:2015 msgid "Jump to move" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1233 +#: src/slic3r/GUI/DoubleSlider.cpp:1253 #, possible-c-format msgid "" "Jump to height %s\n" @@ -991,48 +993,48 @@ msgid "" "or Set extruder sequence for the entire print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1236 +#: src/slic3r/GUI/DoubleSlider.cpp:1256 #, possible-c-format msgid "" "Jump to height %s\n" "or Set ruler mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1241 +#: src/slic3r/GUI/DoubleSlider.cpp:1261 msgid "Edit current color - Right click the colored slider segment" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1251 +#: src/slic3r/GUI/DoubleSlider.cpp:1271 msgid "Print mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1265 +#: src/slic3r/GUI/DoubleSlider.cpp:1285 msgid "Add extruder change - Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1267 +#: src/slic3r/GUI/DoubleSlider.cpp:1287 msgid "" "Add color change - Left click for predefined color or Shift + Left click for " "custom color selection" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1269 +#: src/slic3r/GUI/DoubleSlider.cpp:1289 msgid "Add color change - Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1270 +#: src/slic3r/GUI/DoubleSlider.cpp:1290 msgid "or press \"+\" key" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1272 +#: src/slic3r/GUI/DoubleSlider.cpp:1292 msgid "Add another code - Ctrl + Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1273 +#: src/slic3r/GUI/DoubleSlider.cpp:1293 msgid "Add another code - Right click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1279 +#: src/slic3r/GUI/DoubleSlider.cpp:1299 msgid "" "The sequential print is on.\n" "It's impossible to apply any custom G-code for objects printing " @@ -1040,255 +1042,255 @@ msgid "" "This code won't be processed during G-code generation." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1288 +#: src/slic3r/GUI/DoubleSlider.cpp:1308 msgid "Color change (\"%1%\")" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1289 +#: src/slic3r/GUI/DoubleSlider.cpp:1309 msgid "Color change (\"%1%\") for Extruder %2%" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1291 +#: src/slic3r/GUI/DoubleSlider.cpp:1311 msgid "Pause print (\"%1%\")" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1293 +#: src/slic3r/GUI/DoubleSlider.cpp:1313 msgid "Custom template (\"%1%\")" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1295 +#: src/slic3r/GUI/DoubleSlider.cpp:1315 msgid "Extruder (tool) is changed to Extruder \"%1%\"" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1302 +#: src/slic3r/GUI/DoubleSlider.cpp:1322 msgid "Note" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1304 +#: src/slic3r/GUI/DoubleSlider.cpp:1324 msgid "" "G-code associated to this tick mark is in a conflict with print mode.\n" "Editing it will cause changes of Slider data." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1307 +#: src/slic3r/GUI/DoubleSlider.cpp:1327 msgid "" "There is a color change for extruder that won't be used till the end of " "print job.\n" "This code won't be processed during G-code generation." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1310 +#: src/slic3r/GUI/DoubleSlider.cpp:1330 msgid "" "There is an extruder change set to the same extruder.\n" "This code won't be processed during G-code generation." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1313 +#: src/slic3r/GUI/DoubleSlider.cpp:1333 msgid "" "There is a color change for extruder that has not been used before.\n" "Check your settings to avoid redundant color changes." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1318 +#: src/slic3r/GUI/DoubleSlider.cpp:1338 msgid "Delete tick mark - Left click or press \"-\" key" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1320 +#: src/slic3r/GUI/DoubleSlider.cpp:1340 msgid "Edit tick mark - Ctrl + Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1321 +#: src/slic3r/GUI/DoubleSlider.cpp:1341 msgid "Edit tick mark - Right click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1417 src/slic3r/GUI/DoubleSlider.cpp:1451 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1864 +#: src/slic3r/GUI/DoubleSlider.cpp:1437 src/slic3r/GUI/DoubleSlider.cpp:1471 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1882 #, possible-c-format msgid "Extruder %d" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1418 src/slic3r/GUI/GUI_ObjectList.cpp:1865 +#: src/slic3r/GUI/DoubleSlider.cpp:1438 src/slic3r/GUI/GUI_ObjectList.cpp:1883 msgid "active" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1427 +#: src/slic3r/GUI/DoubleSlider.cpp:1447 msgid "Switch code to Change extruder" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1427 src/slic3r/GUI/GUI_ObjectList.cpp:1832 +#: src/slic3r/GUI/DoubleSlider.cpp:1447 src/slic3r/GUI/GUI_ObjectList.cpp:1850 msgid "Change extruder" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1428 +#: src/slic3r/GUI/DoubleSlider.cpp:1448 msgid "Change extruder (N/A)" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1430 +#: src/slic3r/GUI/DoubleSlider.cpp:1450 msgid "Use another extruder" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1452 +#: src/slic3r/GUI/DoubleSlider.cpp:1472 msgid "used" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1460 +#: src/slic3r/GUI/DoubleSlider.cpp:1480 msgid "Switch code to Color change (%1%) for:" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1461 +#: src/slic3r/GUI/DoubleSlider.cpp:1481 msgid "Add color change (%1%) for:" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1797 +#: src/slic3r/GUI/DoubleSlider.cpp:1817 msgid "Add color change" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1808 +#: src/slic3r/GUI/DoubleSlider.cpp:1828 msgid "Add pause print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1812 +#: src/slic3r/GUI/DoubleSlider.cpp:1832 msgid "Add custom template" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1815 +#: src/slic3r/GUI/DoubleSlider.cpp:1835 msgid "Add custom G-code" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1833 +#: src/slic3r/GUI/DoubleSlider.cpp:1853 msgid "Edit color" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1834 +#: src/slic3r/GUI/DoubleSlider.cpp:1854 msgid "Edit pause print message" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1835 +#: src/slic3r/GUI/DoubleSlider.cpp:1855 msgid "Edit custom G-code" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1841 +#: src/slic3r/GUI/DoubleSlider.cpp:1861 msgid "Delete color change" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1842 +#: src/slic3r/GUI/DoubleSlider.cpp:1862 msgid "Delete tool change" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1843 +#: src/slic3r/GUI/DoubleSlider.cpp:1863 msgid "Delete pause print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1844 +#: src/slic3r/GUI/DoubleSlider.cpp:1864 msgid "Delete custom G-code" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1854 src/slic3r/GUI/DoubleSlider.cpp:1995 +#: src/slic3r/GUI/DoubleSlider.cpp:1874 src/slic3r/GUI/DoubleSlider.cpp:2015 msgid "Jump to height" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1859 +#: src/slic3r/GUI/DoubleSlider.cpp:1879 msgid "Hide ruler" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1863 +#: src/slic3r/GUI/DoubleSlider.cpp:1883 msgid "Show object height" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1863 +#: src/slic3r/GUI/DoubleSlider.cpp:1883 msgid "Show object height on the ruler" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1867 +#: src/slic3r/GUI/DoubleSlider.cpp:1887 msgid "Show estimated print time" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1867 +#: src/slic3r/GUI/DoubleSlider.cpp:1887 msgid "Show estimated print time on the ruler" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1871 +#: src/slic3r/GUI/DoubleSlider.cpp:1891 msgid "Ruler mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1871 +#: src/slic3r/GUI/DoubleSlider.cpp:1891 msgid "Set ruler mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1876 +#: src/slic3r/GUI/DoubleSlider.cpp:1896 msgid "Set extruder sequence for the entire print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1962 +#: src/slic3r/GUI/DoubleSlider.cpp:1982 msgid "Enter custom G-code used on current layer" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1963 +#: src/slic3r/GUI/DoubleSlider.cpp:1983 msgid "Custom G-code on current layer (%1% mm)." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1978 +#: src/slic3r/GUI/DoubleSlider.cpp:1998 msgid "Enter short message shown on Printer display when a print is paused" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1979 +#: src/slic3r/GUI/DoubleSlider.cpp:1999 msgid "Message for pause print on current layer (%1% mm)." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1994 +#: src/slic3r/GUI/DoubleSlider.cpp:2014 msgid "Enter the move you want to jump to" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1994 +#: src/slic3r/GUI/DoubleSlider.cpp:2014 msgid "Enter the height you want to jump to" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2239 +#: src/slic3r/GUI/DoubleSlider.cpp:2259 msgid "The last color change data was saved for a single extruder printing." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2240 src/slic3r/GUI/DoubleSlider.cpp:2255 +#: src/slic3r/GUI/DoubleSlider.cpp:2260 src/slic3r/GUI/DoubleSlider.cpp:2275 msgid "The last color change data was saved for a multi extruder printing." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2242 +#: src/slic3r/GUI/DoubleSlider.cpp:2262 msgid "Your current changes will delete all saved color changes." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2243 src/slic3r/GUI/DoubleSlider.cpp:2263 +#: src/slic3r/GUI/DoubleSlider.cpp:2263 src/slic3r/GUI/DoubleSlider.cpp:2283 msgid "Are you sure you want to continue?" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2256 +#: src/slic3r/GUI/DoubleSlider.cpp:2276 msgid "" "Select YES if you want to delete all saved tool changes, \n" "NO if you want all tool changes switch to color changes, \n" "or CANCEL to leave it unchanged." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2259 +#: src/slic3r/GUI/DoubleSlider.cpp:2279 msgid "Do you want to delete all saved tool changes?" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2261 +#: src/slic3r/GUI/DoubleSlider.cpp:2281 msgid "" "The last color change data was saved for a multi extruder printing with tool " "changes for whole print." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:2262 +#: src/slic3r/GUI/DoubleSlider.cpp:2282 msgid "Your current changes will delete all saved extruder (tool) changes." msgstr "" -#: src/slic3r/GUI/ExtraRenderers.cpp:297 src/slic3r/GUI/GUI_ObjectList.cpp:512 -#: src/slic3r/GUI/GUI_ObjectList.cpp:524 src/slic3r/GUI/GUI_ObjectList.cpp:1033 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4582 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4592 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4627 +#: src/slic3r/GUI/ExtraRenderers.cpp:296 src/slic3r/GUI/GUI_ObjectList.cpp:526 +#: src/slic3r/GUI/GUI_ObjectList.cpp:538 src/slic3r/GUI/GUI_ObjectList.cpp:1047 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4616 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4626 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4661 #: src/slic3r/GUI/ObjectDataViewModel.cpp:209 #: src/slic3r/GUI/ObjectDataViewModel.cpp:266 #: src/slic3r/GUI/ObjectDataViewModel.cpp:291 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:499 src/libslic3r/PrintConfig.cpp:552 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:499 src/libslic3r/PrintConfig.cpp:577 msgid "default" msgstr "" @@ -1301,10 +1303,10 @@ msgid "Set extruder change for every" msgstr "" #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:53 -#: src/libslic3r/PrintConfig.cpp:418 src/libslic3r/PrintConfig.cpp:1089 -#: src/libslic3r/PrintConfig.cpp:1718 src/libslic3r/PrintConfig.cpp:1883 -#: src/libslic3r/PrintConfig.cpp:1950 src/libslic3r/PrintConfig.cpp:2157 -#: src/libslic3r/PrintConfig.cpp:2203 +#: src/libslic3r/PrintConfig.cpp:443 src/libslic3r/PrintConfig.cpp:1178 +#: src/libslic3r/PrintConfig.cpp:1807 src/libslic3r/PrintConfig.cpp:1972 +#: src/libslic3r/PrintConfig.cpp:2039 src/libslic3r/PrintConfig.cpp:2246 +#: src/libslic3r/PrintConfig.cpp:2292 msgid "layers" msgstr "" @@ -1328,7 +1330,7 @@ msgstr "" msgid "parameter name" msgstr "" -#: src/slic3r/GUI/Field.cpp:211 src/slic3r/GUI/OptionsGroup.cpp:781 +#: src/slic3r/GUI/Field.cpp:211 src/slic3r/GUI/OptionsGroup.cpp:780 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:886 msgid "N/A" msgstr "" @@ -1339,7 +1341,7 @@ msgid "%s doesn't support percentage" msgstr "" #: src/slic3r/GUI/Field.cpp:253 src/slic3r/GUI/Field.cpp:307 -#: src/slic3r/GUI/Field.cpp:1520 src/slic3r/GUI/GUI_ObjectLayers.cpp:413 +#: src/slic3r/GUI/Field.cpp:1507 src/slic3r/GUI/GUI_ObjectLayers.cpp:413 msgid "Invalid numeric input." msgstr "" @@ -1355,7 +1357,7 @@ msgid "Parameter validation" msgstr "" #: src/slic3r/GUI/Field.cpp:279 src/slic3r/GUI/Field.cpp:373 -#: src/slic3r/GUI/Field.cpp:1532 +#: src/slic3r/GUI/Field.cpp:1519 msgid "Input value is out of range" msgstr "" @@ -1481,7 +1483,7 @@ msgstr "" #: src/slic3r/GUI/FirmwareDialog.cpp:852 #: src/slic3r/GUI/Mouse3DController.cpp:551 -#: src/slic3r/GUI/PrintHostDialogs.cpp:189 +#: src/slic3r/GUI/PrintHostDialogs.cpp:200 msgid "Close" msgstr "" @@ -1499,222 +1501,222 @@ msgstr "" msgid "Cancelling..." msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:239 +#: src/slic3r/GUI/GCodeViewer.cpp:289 msgid "Tool position" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:1016 +#: src/slic3r/GUI/GCodeViewer.cpp:1418 src/slic3r/GUI/GCodeViewer.cpp:1918 msgid "Generating toolpaths" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:1405 +#: src/slic3r/GUI/GCodeViewer.cpp:1456 src/slic3r/GUI/GCodeViewer.cpp:2302 msgid "Generating vertex buffer" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:1496 +#: src/slic3r/GUI/GCodeViewer.cpp:1719 src/slic3r/GUI/GCodeViewer.cpp:2390 msgid "Generating index buffers" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2225 +#: src/slic3r/GUI/GCodeViewer.cpp:3535 msgid "Click to hide" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2225 +#: src/slic3r/GUI/GCodeViewer.cpp:3535 msgid "Click to show" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2337 +#: src/slic3r/GUI/GCodeViewer.cpp:3647 msgid "up to" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2343 +#: src/slic3r/GUI/GCodeViewer.cpp:3653 msgid "above" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2351 +#: src/slic3r/GUI/GCodeViewer.cpp:3661 msgid "from" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2351 +#: src/slic3r/GUI/GCodeViewer.cpp:3661 msgid "to" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2379 src/slic3r/GUI/GCodeViewer.cpp:2387 -#: src/slic3r/GUI/GUI_Preview.cpp:214 src/slic3r/GUI/GUI_Preview.cpp:533 -#: src/slic3r/GUI/GUI_Preview.cpp:942 +#: src/slic3r/GUI/GCodeViewer.cpp:3689 src/slic3r/GUI/GCodeViewer.cpp:3697 +#: src/slic3r/GUI/GUI_Preview.cpp:211 src/slic3r/GUI/GUI_Preview.cpp:536 +#: src/slic3r/GUI/GUI_Preview.cpp:945 msgid "Feature type" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2379 src/slic3r/GUI/GCodeViewer.cpp:2387 +#: src/slic3r/GUI/GCodeViewer.cpp:3689 src/slic3r/GUI/GCodeViewer.cpp:3697 #: src/slic3r/GUI/RammingChart.cpp:76 msgid "Time" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2387 +#: src/slic3r/GUI/GCodeViewer.cpp:3697 msgid "Percentage" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2390 +#: src/slic3r/GUI/GCodeViewer.cpp:3700 msgid "Height (mm)" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2391 +#: src/slic3r/GUI/GCodeViewer.cpp:3701 msgid "Width (mm)" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2392 +#: src/slic3r/GUI/GCodeViewer.cpp:3702 msgid "Speed (mm/s)" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2393 +#: src/slic3r/GUI/GCodeViewer.cpp:3703 msgid "Fan Speed (%)" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2394 +#: src/slic3r/GUI/GCodeViewer.cpp:3704 msgid "Volumetric flow rate (mm³/s)" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2395 src/slic3r/GUI/GUI_Preview.cpp:220 -#: src/slic3r/GUI/GUI_Preview.cpp:326 src/slic3r/GUI/GUI_Preview.cpp:471 -#: src/slic3r/GUI/GUI_Preview.cpp:532 src/slic3r/GUI/GUI_Preview.cpp:878 -#: src/slic3r/GUI/GUI_Preview.cpp:942 +#: src/slic3r/GUI/GCodeViewer.cpp:3705 src/slic3r/GUI/GUI_Preview.cpp:217 +#: src/slic3r/GUI/GUI_Preview.cpp:323 src/slic3r/GUI/GUI_Preview.cpp:474 +#: src/slic3r/GUI/GUI_Preview.cpp:535 src/slic3r/GUI/GUI_Preview.cpp:881 +#: src/slic3r/GUI/GUI_Preview.cpp:945 msgid "Tool" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2396 src/slic3r/GUI/GUI_Preview.cpp:221 -#: src/slic3r/GUI/GUI_Preview.cpp:530 src/slic3r/GUI/GUI_Preview.cpp:941 +#: src/slic3r/GUI/GCodeViewer.cpp:3706 src/slic3r/GUI/GUI_Preview.cpp:218 +#: src/slic3r/GUI/GUI_Preview.cpp:533 src/slic3r/GUI/GUI_Preview.cpp:944 msgid "Color Print" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2432 src/slic3r/GUI/GCodeViewer.cpp:2467 -#: src/slic3r/GUI/GCodeViewer.cpp:2472 src/slic3r/GUI/GUI_ObjectList.cpp:312 -#: src/slic3r/GUI/wxExtensions.cpp:519 src/libslic3r/PrintConfig.cpp:547 +#: src/slic3r/GUI/GCodeViewer.cpp:3742 src/slic3r/GUI/GCodeViewer.cpp:3777 +#: src/slic3r/GUI/GCodeViewer.cpp:3782 src/slic3r/GUI/GUI_ObjectList.cpp:326 +#: src/slic3r/GUI/wxExtensions.cpp:519 src/libslic3r/PrintConfig.cpp:572 msgid "Extruder" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2443 +#: src/slic3r/GUI/GCodeViewer.cpp:3753 msgid "Default color" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2467 +#: src/slic3r/GUI/GCodeViewer.cpp:3777 msgid "default color" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2562 src/slic3r/GUI/GCodeViewer.cpp:2608 +#: src/slic3r/GUI/GCodeViewer.cpp:3872 src/slic3r/GUI/GCodeViewer.cpp:3918 msgid "Color change" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2581 src/slic3r/GUI/GCodeViewer.cpp:2606 +#: src/slic3r/GUI/GCodeViewer.cpp:3891 src/slic3r/GUI/GCodeViewer.cpp:3916 msgid "Print" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2607 src/slic3r/GUI/GCodeViewer.cpp:2624 +#: src/slic3r/GUI/GCodeViewer.cpp:3917 src/slic3r/GUI/GCodeViewer.cpp:3934 msgid "Pause" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2612 src/slic3r/GUI/GCodeViewer.cpp:2615 +#: src/slic3r/GUI/GCodeViewer.cpp:3922 src/slic3r/GUI/GCodeViewer.cpp:3925 msgid "Event" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2612 src/slic3r/GUI/GCodeViewer.cpp:2615 +#: src/slic3r/GUI/GCodeViewer.cpp:3922 src/slic3r/GUI/GCodeViewer.cpp:3925 msgid "Remaining time" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2615 +#: src/slic3r/GUI/GCodeViewer.cpp:3925 msgid "Duration" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2650 src/slic3r/GUI/GUI_Preview.cpp:1023 -#: src/libslic3r/PrintConfig.cpp:2380 +#: src/slic3r/GUI/GCodeViewer.cpp:3960 src/slic3r/GUI/GUI_Preview.cpp:1026 +#: src/libslic3r/PrintConfig.cpp:2469 msgid "Travel" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2653 +#: src/slic3r/GUI/GCodeViewer.cpp:3963 msgid "Movement" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2654 +#: src/slic3r/GUI/GCodeViewer.cpp:3964 msgid "Extrusion" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2655 src/slic3r/GUI/Tab.cpp:1694 -#: src/slic3r/GUI/Tab.cpp:2582 +#: src/slic3r/GUI/GCodeViewer.cpp:3965 src/slic3r/GUI/Tab.cpp:1708 +#: src/slic3r/GUI/Tab.cpp:2596 msgid "Retraction" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2672 src/slic3r/GUI/GCodeViewer.cpp:2675 -#: src/slic3r/GUI/GUI_Preview.cpp:1024 +#: src/slic3r/GUI/GCodeViewer.cpp:3982 src/slic3r/GUI/GCodeViewer.cpp:3985 +#: src/slic3r/GUI/GUI_Preview.cpp:1027 msgid "Wipe" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2706 src/slic3r/GUI/GUI_Preview.cpp:248 -#: src/slic3r/GUI/GUI_Preview.cpp:262 +#: src/slic3r/GUI/GCodeViewer.cpp:4016 src/slic3r/GUI/GUI_Preview.cpp:245 +#: src/slic3r/GUI/GUI_Preview.cpp:259 msgid "Options" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2709 src/slic3r/GUI/GUI_Preview.cpp:1025 +#: src/slic3r/GUI/GCodeViewer.cpp:4019 src/slic3r/GUI/GUI_Preview.cpp:1028 msgid "Retractions" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2710 src/slic3r/GUI/GUI_Preview.cpp:1026 +#: src/slic3r/GUI/GCodeViewer.cpp:4020 src/slic3r/GUI/GUI_Preview.cpp:1029 msgid "Deretractions" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2711 src/slic3r/GUI/GUI_Preview.cpp:1027 +#: src/slic3r/GUI/GCodeViewer.cpp:4021 src/slic3r/GUI/GUI_Preview.cpp:1030 msgid "Tool changes" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2712 src/slic3r/GUI/GUI_Preview.cpp:1028 +#: src/slic3r/GUI/GCodeViewer.cpp:4022 src/slic3r/GUI/GUI_Preview.cpp:1031 msgid "Color changes" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2713 src/slic3r/GUI/GUI_Preview.cpp:1029 +#: src/slic3r/GUI/GCodeViewer.cpp:4023 src/slic3r/GUI/GUI_Preview.cpp:1032 msgid "Print pauses" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2714 src/slic3r/GUI/GUI_Preview.cpp:1030 +#: src/slic3r/GUI/GCodeViewer.cpp:4024 src/slic3r/GUI/GUI_Preview.cpp:1033 msgid "Custom G-codes" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2725 src/slic3r/GUI/GCodeViewer.cpp:2749 -#: src/slic3r/GUI/Plater.cpp:697 src/libslic3r/PrintConfig.cpp:117 +#: src/slic3r/GUI/GCodeViewer.cpp:4035 src/slic3r/GUI/GCodeViewer.cpp:4059 +#: src/slic3r/GUI/Plater.cpp:694 src/libslic3r/PrintConfig.cpp:117 msgid "Printer" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2727 src/slic3r/GUI/GCodeViewer.cpp:2754 -#: src/slic3r/GUI/Plater.cpp:693 +#: src/slic3r/GUI/GCodeViewer.cpp:4037 src/slic3r/GUI/GCodeViewer.cpp:4064 +#: src/slic3r/GUI/Plater.cpp:690 msgid "Print settings" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2730 src/slic3r/GUI/GCodeViewer.cpp:2760 -#: src/slic3r/GUI/Plater.cpp:694 src/slic3r/GUI/Tab.cpp:1794 -#: src/slic3r/GUI/Tab.cpp:1795 +#: src/slic3r/GUI/GCodeViewer.cpp:4040 src/slic3r/GUI/GCodeViewer.cpp:4070 +#: src/slic3r/GUI/Plater.cpp:691 src/slic3r/GUI/Tab.cpp:1808 +#: src/slic3r/GUI/Tab.cpp:1809 msgid "Filament" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2785 src/slic3r/GUI/GCodeViewer.cpp:2790 -#: src/slic3r/GUI/Plater.cpp:242 src/slic3r/GUI/Plater.cpp:1135 -#: src/slic3r/GUI/Plater.cpp:1220 +#: src/slic3r/GUI/GCodeViewer.cpp:4095 src/slic3r/GUI/GCodeViewer.cpp:4100 +#: src/slic3r/GUI/Plater.cpp:242 src/slic3r/GUI/Plater.cpp:1143 +#: src/slic3r/GUI/Plater.cpp:1228 msgid "Estimated printing time" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2785 +#: src/slic3r/GUI/GCodeViewer.cpp:4095 msgid "Normal mode" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2790 +#: src/slic3r/GUI/GCodeViewer.cpp:4100 msgid "Stealth mode" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2817 +#: src/slic3r/GUI/GCodeViewer.cpp:4128 msgid "Show stealth mode" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:2821 +#: src/slic3r/GUI/GCodeViewer.cpp:4132 msgid "Show normal mode" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:236 src/slic3r/GUI/GLCanvas3D.cpp:4610 +#: src/slic3r/GUI/GLCanvas3D.cpp:236 src/slic3r/GUI/GLCanvas3D.cpp:4619 msgid "Variable layer height" msgstr "" @@ -1774,7 +1776,7 @@ msgstr "" msgid "Smooth" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:285 src/libslic3r/PrintConfig.cpp:571 +#: src/slic3r/GUI/GLCanvas3D.cpp:285 src/libslic3r/PrintConfig.cpp:596 msgid "Radius" msgstr "" @@ -1782,7 +1784,7 @@ msgstr "" msgid "Keep min" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:304 src/slic3r/GUI/GLCanvas3D.cpp:4050 +#: src/slic3r/GUI/GLCanvas3D.cpp:304 src/slic3r/GUI/GLCanvas3D.cpp:4055 msgid "Reset" msgstr "" @@ -1842,171 +1844,171 @@ msgstr "" msgid "Gizmo-Rotate" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3388 +#: src/slic3r/GUI/GLCanvas3D.cpp:3389 msgid "Move Object" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3858 src/slic3r/GUI/GLCanvas3D.cpp:4571 +#: src/slic3r/GUI/GLCanvas3D.cpp:3859 src/slic3r/GUI/GLCanvas3D.cpp:4580 msgid "Switch to Settings" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3859 src/slic3r/GUI/GLCanvas3D.cpp:4571 +#: src/slic3r/GUI/GLCanvas3D.cpp:3860 src/slic3r/GUI/GLCanvas3D.cpp:4580 msgid "Print Settings Tab" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3860 src/slic3r/GUI/GLCanvas3D.cpp:4572 +#: src/slic3r/GUI/GLCanvas3D.cpp:3861 src/slic3r/GUI/GLCanvas3D.cpp:4581 msgid "Filament Settings Tab" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3860 src/slic3r/GUI/GLCanvas3D.cpp:4572 +#: src/slic3r/GUI/GLCanvas3D.cpp:3861 src/slic3r/GUI/GLCanvas3D.cpp:4581 msgid "Material Settings Tab" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3861 src/slic3r/GUI/GLCanvas3D.cpp:4573 +#: src/slic3r/GUI/GLCanvas3D.cpp:3862 src/slic3r/GUI/GLCanvas3D.cpp:4582 msgid "Printer Settings Tab" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3909 +#: src/slic3r/GUI/GLCanvas3D.cpp:3914 msgid "Undo History" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3909 +#: src/slic3r/GUI/GLCanvas3D.cpp:3914 msgid "Redo History" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3930 +#: src/slic3r/GUI/GLCanvas3D.cpp:3935 #, possible-c-format msgid "Undo %1$d Action" msgid_plural "Undo %1$d Actions" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3930 +#: src/slic3r/GUI/GLCanvas3D.cpp:3935 #, possible-c-format msgid "Redo %1$d Action" msgid_plural "Redo %1$d Actions" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3950 src/slic3r/GUI/GLCanvas3D.cpp:4589 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:98 src/slic3r/GUI/Search.cpp:351 +#: src/slic3r/GUI/GLCanvas3D.cpp:3955 src/slic3r/GUI/GLCanvas3D.cpp:4598 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:98 src/slic3r/GUI/Search.cpp:348 msgid "Search" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3964 src/slic3r/GUI/GLCanvas3D.cpp:3972 -#: src/slic3r/GUI/Search.cpp:358 +#: src/slic3r/GUI/GLCanvas3D.cpp:3969 src/slic3r/GUI/GLCanvas3D.cpp:3977 +#: src/slic3r/GUI/Search.cpp:355 msgid "Enter a search term" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4003 +#: src/slic3r/GUI/GLCanvas3D.cpp:4008 msgid "Arrange options" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4033 +#: src/slic3r/GUI/GLCanvas3D.cpp:4038 msgid "Press %1%left mouse button to enter the exact value" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4035 +#: src/slic3r/GUI/GLCanvas3D.cpp:4040 msgid "Spacing" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4042 +#: src/slic3r/GUI/GLCanvas3D.cpp:4047 msgid "Enable rotations (slow)" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4060 src/slic3r/GUI/GLCanvas3D.cpp:4481 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 src/slic3r/GUI/Plater.cpp:1648 +#: src/slic3r/GUI/GLCanvas3D.cpp:4065 src/slic3r/GUI/GLCanvas3D.cpp:4490 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 src/slic3r/GUI/Plater.cpp:1656 msgid "Arrange" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4455 +#: src/slic3r/GUI/GLCanvas3D.cpp:4464 msgid "Add..." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4463 src/slic3r/GUI/GUI_ObjectList.cpp:1878 -#: src/slic3r/GUI/Plater.cpp:3998 src/slic3r/GUI/Plater.cpp:4022 -#: src/slic3r/GUI/Tab.cpp:3484 +#: src/slic3r/GUI/GLCanvas3D.cpp:4472 src/slic3r/GUI/GUI_ObjectList.cpp:1896 +#: src/slic3r/GUI/Plater.cpp:4019 src/slic3r/GUI/Plater.cpp:4043 +#: src/slic3r/GUI/Tab.cpp:3502 msgid "Delete" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4472 src/slic3r/GUI/KBShortcutsDialog.cpp:88 -#: src/slic3r/GUI/Plater.cpp:5107 +#: src/slic3r/GUI/GLCanvas3D.cpp:4481 src/slic3r/GUI/KBShortcutsDialog.cpp:88 +#: src/slic3r/GUI/Plater.cpp:5130 msgid "Delete all" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4481 src/slic3r/GUI/KBShortcutsDialog.cpp:121 +#: src/slic3r/GUI/GLCanvas3D.cpp:4490 src/slic3r/GUI/KBShortcutsDialog.cpp:121 msgid "Arrange selection" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4481 +#: src/slic3r/GUI/GLCanvas3D.cpp:4490 msgid "Click right mouse button to show arrangement options" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4503 +#: src/slic3r/GUI/GLCanvas3D.cpp:4512 msgid "Copy" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4512 +#: src/slic3r/GUI/GLCanvas3D.cpp:4521 msgid "Paste" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4524 src/slic3r/GUI/Plater.cpp:3857 -#: src/slic3r/GUI/Plater.cpp:3869 src/slic3r/GUI/Plater.cpp:4007 +#: src/slic3r/GUI/GLCanvas3D.cpp:4533 src/slic3r/GUI/Plater.cpp:3878 +#: src/slic3r/GUI/Plater.cpp:3890 src/slic3r/GUI/Plater.cpp:4028 msgid "Add instance" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4535 src/slic3r/GUI/Plater.cpp:4009 +#: src/slic3r/GUI/GLCanvas3D.cpp:4544 src/slic3r/GUI/Plater.cpp:4030 msgid "Remove instance" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4548 +#: src/slic3r/GUI/GLCanvas3D.cpp:4557 msgid "Split to objects" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4558 src/slic3r/GUI/GUI_ObjectList.cpp:1650 +#: src/slic3r/GUI/GLCanvas3D.cpp:4567 src/slic3r/GUI/GUI_ObjectList.cpp:1668 msgid "Split to parts" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4660 src/slic3r/GUI/KBShortcutsDialog.cpp:89 +#: src/slic3r/GUI/GLCanvas3D.cpp:4669 src/slic3r/GUI/KBShortcutsDialog.cpp:89 #: src/slic3r/GUI/MainFrame.cpp:1125 msgid "Undo" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4660 src/slic3r/GUI/GLCanvas3D.cpp:4699 +#: src/slic3r/GUI/GLCanvas3D.cpp:4669 src/slic3r/GUI/GLCanvas3D.cpp:4708 msgid "Click right mouse button to open/close History" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4683 +#: src/slic3r/GUI/GLCanvas3D.cpp:4692 msgid "Next Undo action: %1%" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4699 src/slic3r/GUI/KBShortcutsDialog.cpp:90 +#: src/slic3r/GUI/GLCanvas3D.cpp:4708 src/slic3r/GUI/KBShortcutsDialog.cpp:90 #: src/slic3r/GUI/MainFrame.cpp:1128 msgid "Redo" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4721 +#: src/slic3r/GUI/GLCanvas3D.cpp:4730 msgid "Next Redo action: %1%" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6345 +#: src/slic3r/GUI/GLCanvas3D.cpp:6354 msgid "Selection-Add from rectangle" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:6364 +#: src/slic3r/GUI/GLCanvas3D.cpp:6373 msgid "Selection-Remove from rectangle" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:54 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:151 src/libslic3r/PrintConfig.cpp:3690 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:151 src/libslic3r/PrintConfig.cpp:3771 msgid "Cut" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:179 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:341 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:418 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:487 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:322 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:399 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:467 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:468 msgid "in" msgstr "" @@ -2097,7 +2099,7 @@ msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1595 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1613 msgid "Sphere" msgstr "" @@ -2176,7 +2178,7 @@ msgid "Quality" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44 -#: src/libslic3r/PrintConfig.cpp:3183 +#: src/libslic3r/PrintConfig.cpp:3272 msgid "Closing distance" msgstr "" @@ -2229,18 +2231,18 @@ msgid "Move" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:461 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:508 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:527 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:546 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 -#: src/libslic3r/PrintConfig.cpp:3739 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 +#: src/libslic3r/PrintConfig.cpp:3820 msgid "Rotate" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:78 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:238 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:547 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 -#: src/libslic3r/PrintConfig.cpp:3754 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:219 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:528 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:544 +#: src/libslic3r/PrintConfig.cpp:3835 msgid "Scale" msgstr "" @@ -2290,7 +2292,7 @@ msgid "Minimal points distance" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54 -#: src/libslic3r/PrintConfig.cpp:3013 +#: src/libslic3r/PrintConfig.cpp:3102 msgid "Support points density" msgstr "" @@ -2355,9 +2357,9 @@ msgstr "" msgid "Are you sure you want to do it?" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1129 src/slic3r/GUI/GUI.cpp:256 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1129 src/slic3r/GUI/GUI.cpp:262 #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:557 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:581 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:586 #: src/slic3r/GUI/WipeTowerDialog.cpp:45 src/slic3r/GUI/WipeTowerDialog.cpp:366 msgid "Warning" msgstr "" @@ -2466,21 +2468,21 @@ msgstr "" msgid "Add supports" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:239 +#: src/slic3r/GUI/GUI_App.cpp:247 msgid "is based on Slic3r by Alessandro Ranellucci and the RepRap community." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:241 +#: src/slic3r/GUI/GUI_App.cpp:249 msgid "" "Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas " "Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous others." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:242 +#: src/slic3r/GUI/GUI_App.cpp:250 msgid "Artwork model by Nora Al-Badri and Jan Nikolai Nelles" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:382 +#: src/slic3r/GUI/GUI_App.cpp:391 msgid "" "Starting with %1% 2.3, configuration directory on Linux has changed " "(according to XDG Base Directory Specification) to \n" @@ -2499,20 +2501,20 @@ msgid "" "What do you want to do now?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:390 +#: src/slic3r/GUI/GUI_App.cpp:399 #, possible-c-format msgid "%s - BREAKING CHANGE" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:392 +#: src/slic3r/GUI/GUI_App.cpp:401 msgid "Quit, I will move my data now" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:392 +#: src/slic3r/GUI/GUI_App.cpp:401 msgid "Start the application" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:580 +#: src/slic3r/GUI/GUI_App.cpp:589 #, possible-c-format msgid "" "%s has encountered an error. It was likely caused by running out of memory. " @@ -2522,11 +2524,11 @@ msgid "" "The application will now terminate." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:583 +#: src/slic3r/GUI/GUI_App.cpp:592 msgid "Fatal error" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:587 +#: src/slic3r/GUI/GUI_App.cpp:596 msgid "" "PrusaSlicer has encountered a localization error. Please report to " "PrusaSlicer team, what language was active and in which scenario this issue " @@ -2535,256 +2537,258 @@ msgid "" "The application will now terminate." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:590 +#: src/slic3r/GUI/GUI_App.cpp:599 msgid "Critical error" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:711 +#: src/slic3r/GUI/GUI_App.cpp:726 msgid "" "Error parsing PrusaSlicer config file, it is probably corrupted. Try to " "manually delete the file to recover from the error. Your user profiles will " "not be affected." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:717 +#: src/slic3r/GUI/GUI_App.cpp:732 msgid "" "Error parsing PrusaGCodeViewer config file, it is probably corrupted. Try to " "manually delete the file to recover from the error." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:771 +#: src/slic3r/GUI/GUI_App.cpp:787 #, possible-c-format msgid "" "%s\n" "Do you want to continue?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:773 src/slic3r/GUI/UnsavedChangesDialog.cpp:665 +#: src/slic3r/GUI/GUI_App.cpp:789 src/slic3r/GUI/UnsavedChangesDialog.cpp:665 msgid "Remember my choice" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:808 +#: src/slic3r/GUI/GUI_App.cpp:827 msgid "Loading configuration" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:876 +#: src/slic3r/GUI/GUI_App.cpp:892 msgid "Preparing settings tabs" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1115 +#: src/slic3r/GUI/GUI_App.cpp:1149 msgid "" "You have the following presets with saved options for \"Print Host upload\"" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1119 +#: src/slic3r/GUI/GUI_App.cpp:1153 msgid "" "But since this version of PrusaSlicer we don't show this information in " "Printer Settings anymore.\n" "Settings will be available in physical printers settings." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1121 +#: src/slic3r/GUI/GUI_App.cpp:1155 msgid "" "By default new Printer devices will be named as \"Printer N\" during its " "creation.\n" "Note: This name can be changed later from the physical printers settings" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1124 src/slic3r/GUI/PhysicalPrinterDialog.cpp:626 +#: src/slic3r/GUI/GUI_App.cpp:1158 src/slic3r/GUI/PhysicalPrinterDialog.cpp:631 msgid "Information" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1137 src/slic3r/GUI/GUI_App.cpp:1148 +#: src/slic3r/GUI/GUI_App.cpp:1171 src/slic3r/GUI/GUI_App.cpp:1182 msgid "Recreating" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1153 +#: src/slic3r/GUI/GUI_App.cpp:1187 msgid "Loading of current presets" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1158 +#: src/slic3r/GUI/GUI_App.cpp:1192 msgid "Loading of a mode view" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1234 +#: src/slic3r/GUI/GUI_App.cpp:1269 msgid "Choose one file (3MF/AMF):" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1246 +#: src/slic3r/GUI/GUI_App.cpp:1281 msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1258 +#: src/slic3r/GUI/GUI_App.cpp:1293 msgid "Choose one file (GCODE/.GCO/.G/.ngc/NGC):" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1269 +#: src/slic3r/GUI/GUI_App.cpp:1304 msgid "Changing of an application language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1392 +#: src/slic3r/GUI/GUI_App.cpp:1427 msgid "Select the language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1392 +#: src/slic3r/GUI/GUI_App.cpp:1427 msgid "Language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1541 +#: src/slic3r/GUI/GUI_App.cpp:1576 msgid "modified" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1590 +#: src/slic3r/GUI/GUI_App.cpp:1625 #, possible-c-format msgid "Run %s" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1594 +#: src/slic3r/GUI/GUI_App.cpp:1629 msgid "&Configuration Snapshots" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1594 +#: src/slic3r/GUI/GUI_App.cpp:1629 msgid "Inspect / activate configuration snapshots" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1595 +#: src/slic3r/GUI/GUI_App.cpp:1630 msgid "Take Configuration &Snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1595 +#: src/slic3r/GUI/GUI_App.cpp:1630 msgid "Capture a configuration snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1596 +#: src/slic3r/GUI/GUI_App.cpp:1631 msgid "Check for updates" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1596 +#: src/slic3r/GUI/GUI_App.cpp:1631 msgid "Check for configuration updates" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1599 +#: src/slic3r/GUI/GUI_App.cpp:1634 msgid "&Preferences" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1605 +#: src/slic3r/GUI/GUI_App.cpp:1640 msgid "Application preferences" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1610 src/slic3r/GUI/wxExtensions.cpp:685 +#: src/slic3r/GUI/GUI_App.cpp:1645 src/slic3r/GUI/wxExtensions.cpp:685 msgid "Simple" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1610 +#: src/slic3r/GUI/GUI_App.cpp:1645 msgid "Simple View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1612 src/slic3r/GUI/wxExtensions.cpp:687 +#: src/slic3r/GUI/GUI_App.cpp:1647 src/slic3r/GUI/wxExtensions.cpp:687 msgctxt "Mode" msgid "Advanced" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1612 +#: src/slic3r/GUI/GUI_App.cpp:1647 msgid "Advanced View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1613 src/slic3r/GUI/wxExtensions.cpp:688 +#: src/slic3r/GUI/GUI_App.cpp:1648 src/slic3r/GUI/wxExtensions.cpp:688 msgid "Expert" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1613 +#: src/slic3r/GUI/GUI_App.cpp:1648 msgid "Expert View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1618 +#: src/slic3r/GUI/GUI_App.cpp:1653 msgid "Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1618 +#: src/slic3r/GUI/GUI_App.cpp:1653 #, possible-c-format msgid "%s View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1621 +#: src/slic3r/GUI/GUI_App.cpp:1656 msgid "&Language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1624 +#: src/slic3r/GUI/GUI_App.cpp:1659 msgid "Flash printer &firmware" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1624 +#: src/slic3r/GUI/GUI_App.cpp:1659 msgid "Upload a firmware image into an Arduino based printer" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1640 +#: src/slic3r/GUI/GUI_App.cpp:1675 msgid "Taking configuration snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1640 +#: src/slic3r/GUI/GUI_App.cpp:1675 msgid "Snapshot name" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1669 +#: src/slic3r/GUI/GUI_App.cpp:1704 msgid "Failed to activate configuration snapshot." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1719 +#: src/slic3r/GUI/GUI_App.cpp:1754 msgid "Language selection" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1721 +#: src/slic3r/GUI/GUI_App.cpp:1756 msgid "" "Switching the language will trigger application restart.\n" "You will lose content of the plater." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1723 +#: src/slic3r/GUI/GUI_App.cpp:1758 msgid "Do you want to proceed?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1750 +#: src/slic3r/GUI/GUI_App.cpp:1785 msgid "&Configuration" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1781 -msgid "The preset(s) modifications are successfully saved" -msgstr "" +#: src/slic3r/GUI/GUI_App.cpp:1816 +msgid "The preset modifications are successfully saved" +msgid_plural "The presets modifications are successfully saved" +msgstr[0] "" +msgstr[1] "" -#: src/slic3r/GUI/GUI_App.cpp:1802 +#: src/slic3r/GUI/GUI_App.cpp:1838 msgid "The uploads are still ongoing" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1802 +#: src/slic3r/GUI/GUI_App.cpp:1838 msgid "Stop them and continue anyway?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1805 +#: src/slic3r/GUI/GUI_App.cpp:1841 msgid "Ongoing uploads" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2019 src/slic3r/GUI/Tab.cpp:3242 +#: src/slic3r/GUI/GUI_App.cpp:2052 src/slic3r/GUI/Tab.cpp:3256 msgid "It's impossible to print multi-part object(s) with SLA technology." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2020 +#: src/slic3r/GUI/GUI_App.cpp:2053 msgid "Please check and fix your object list." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2021 src/slic3r/GUI/Jobs/SLAImportJob.cpp:210 -#: src/slic3r/GUI/Plater.cpp:2359 src/slic3r/GUI/Tab.cpp:3244 +#: src/slic3r/GUI/GUI_App.cpp:2054 src/slic3r/GUI/Jobs/SLAImportJob.cpp:210 +#: src/slic3r/GUI/Plater.cpp:2367 src/slic3r/GUI/Tab.cpp:3258 msgid "Attention!" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:2038 +#: src/slic3r/GUI/GUI_App.cpp:2071 msgid "Select a gcode file:" msgstr "" -#: src/slic3r/GUI/GUI_Init.cpp:73 src/slic3r/GUI/GUI_Init.cpp:76 +#: src/slic3r/GUI/GUI_Init.cpp:88 src/slic3r/GUI/GUI_Init.cpp:91 msgid "PrusaSlicer GUI initialization failed" msgstr "" -#: src/slic3r/GUI/GUI_Init.cpp:76 +#: src/slic3r/GUI/GUI_Init.cpp:91 msgid "Fatal error, exception catched: %1%" msgstr "" @@ -2805,38 +2809,38 @@ msgid "Add layer range" msgstr "" #: src/slic3r/GUI/GUI_ObjectList.cpp:34 src/slic3r/GUI/GUI_ObjectList.cpp:92 -#: src/slic3r/GUI/GUI_ObjectList.cpp:667 src/libslic3r/PrintConfig.cpp:74 +#: src/slic3r/GUI/GUI_ObjectList.cpp:681 src/libslic3r/PrintConfig.cpp:74 #: src/libslic3r/PrintConfig.cpp:189 src/libslic3r/PrintConfig.cpp:231 -#: src/libslic3r/PrintConfig.cpp:240 src/libslic3r/PrintConfig.cpp:464 -#: src/libslic3r/PrintConfig.cpp:530 src/libslic3r/PrintConfig.cpp:538 -#: src/libslic3r/PrintConfig.cpp:970 src/libslic3r/PrintConfig.cpp:1219 -#: src/libslic3r/PrintConfig.cpp:1584 src/libslic3r/PrintConfig.cpp:1650 -#: src/libslic3r/PrintConfig.cpp:1835 src/libslic3r/PrintConfig.cpp:2302 -#: src/libslic3r/PrintConfig.cpp:2361 src/libslic3r/PrintConfig.cpp:2370 +#: src/libslic3r/PrintConfig.cpp:240 src/libslic3r/PrintConfig.cpp:489 +#: src/libslic3r/PrintConfig.cpp:555 src/libslic3r/PrintConfig.cpp:563 +#: src/libslic3r/PrintConfig.cpp:995 src/libslic3r/PrintConfig.cpp:1308 +#: src/libslic3r/PrintConfig.cpp:1673 src/libslic3r/PrintConfig.cpp:1739 +#: src/libslic3r/PrintConfig.cpp:1924 src/libslic3r/PrintConfig.cpp:2391 +#: src/libslic3r/PrintConfig.cpp:2450 src/libslic3r/PrintConfig.cpp:2459 msgid "Layers and Perimeters" msgstr "" #: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:95 -#: src/slic3r/GUI/GUI_ObjectList.cpp:670 src/slic3r/GUI/GUI_Preview.cpp:240 -#: src/slic3r/GUI/Tab.cpp:1472 src/slic3r/GUI/Tab.cpp:1474 +#: src/slic3r/GUI/GUI_ObjectList.cpp:684 src/slic3r/GUI/GUI_Preview.cpp:237 +#: src/slic3r/GUI/Tab.cpp:1486 src/slic3r/GUI/Tab.cpp:1488 #: src/libslic3r/ExtrusionEntity.cpp:320 src/libslic3r/ExtrusionEntity.cpp:352 -#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:1715 -#: src/libslic3r/PrintConfig.cpp:2093 src/libslic3r/PrintConfig.cpp:2099 -#: src/libslic3r/PrintConfig.cpp:2107 src/libslic3r/PrintConfig.cpp:2119 -#: src/libslic3r/PrintConfig.cpp:2129 src/libslic3r/PrintConfig.cpp:2137 -#: src/libslic3r/PrintConfig.cpp:2152 src/libslic3r/PrintConfig.cpp:2173 -#: src/libslic3r/PrintConfig.cpp:2185 src/libslic3r/PrintConfig.cpp:2201 -#: src/libslic3r/PrintConfig.cpp:2210 src/libslic3r/PrintConfig.cpp:2219 -#: src/libslic3r/PrintConfig.cpp:2230 src/libslic3r/PrintConfig.cpp:2244 -#: src/libslic3r/PrintConfig.cpp:2252 src/libslic3r/PrintConfig.cpp:2253 -#: src/libslic3r/PrintConfig.cpp:2262 src/libslic3r/PrintConfig.cpp:2270 -#: src/libslic3r/PrintConfig.cpp:2284 +#: src/libslic3r/PrintConfig.cpp:451 src/libslic3r/PrintConfig.cpp:1804 +#: src/libslic3r/PrintConfig.cpp:2182 src/libslic3r/PrintConfig.cpp:2188 +#: src/libslic3r/PrintConfig.cpp:2196 src/libslic3r/PrintConfig.cpp:2208 +#: src/libslic3r/PrintConfig.cpp:2218 src/libslic3r/PrintConfig.cpp:2226 +#: src/libslic3r/PrintConfig.cpp:2241 src/libslic3r/PrintConfig.cpp:2262 +#: src/libslic3r/PrintConfig.cpp:2274 src/libslic3r/PrintConfig.cpp:2290 +#: src/libslic3r/PrintConfig.cpp:2299 src/libslic3r/PrintConfig.cpp:2308 +#: src/libslic3r/PrintConfig.cpp:2319 src/libslic3r/PrintConfig.cpp:2333 +#: src/libslic3r/PrintConfig.cpp:2341 src/libslic3r/PrintConfig.cpp:2342 +#: src/libslic3r/PrintConfig.cpp:2351 src/libslic3r/PrintConfig.cpp:2359 +#: src/libslic3r/PrintConfig.cpp:2373 msgid "Support material" msgstr "" #: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:99 -#: src/slic3r/GUI/GUI_ObjectList.cpp:674 src/libslic3r/PrintConfig.cpp:2480 -#: src/libslic3r/PrintConfig.cpp:2488 +#: src/slic3r/GUI/GUI_ObjectList.cpp:688 src/libslic3r/PrintConfig.cpp:2569 +#: src/libslic3r/PrintConfig.cpp:2577 msgid "Wipe options" msgstr "" @@ -2860,432 +2864,458 @@ msgstr "" msgid "Add support blocker" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:94 src/slic3r/GUI/GUI_ObjectList.cpp:669 -#: src/slic3r/GUI/GUI_Preview.cpp:236 src/slic3r/GUI/Tab.cpp:1442 +#: src/slic3r/GUI/GUI_ObjectList.cpp:94 src/slic3r/GUI/GUI_ObjectList.cpp:683 +#: src/slic3r/GUI/GUI_Preview.cpp:233 src/slic3r/GUI/Tab.cpp:1454 #: src/libslic3r/ExtrusionEntity.cpp:316 src/libslic3r/ExtrusionEntity.cpp:344 -#: src/libslic3r/PrintConfig.cpp:1226 src/libslic3r/PrintConfig.cpp:1232 -#: src/libslic3r/PrintConfig.cpp:1246 src/libslic3r/PrintConfig.cpp:1256 -#: src/libslic3r/PrintConfig.cpp:1264 src/libslic3r/PrintConfig.cpp:1266 +#: src/libslic3r/PrintConfig.cpp:1315 src/libslic3r/PrintConfig.cpp:1321 +#: src/libslic3r/PrintConfig.cpp:1335 src/libslic3r/PrintConfig.cpp:1345 +#: src/libslic3r/PrintConfig.cpp:1353 src/libslic3r/PrintConfig.cpp:1355 msgid "Ironing" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:96 src/slic3r/GUI/GUI_ObjectList.cpp:671 -#: src/slic3r/GUI/GUI_Preview.cpp:217 src/slic3r/GUI/Tab.cpp:1498 -#: src/libslic3r/PrintConfig.cpp:291 src/libslic3r/PrintConfig.cpp:518 -#: src/libslic3r/PrintConfig.cpp:1012 src/libslic3r/PrintConfig.cpp:1192 -#: src/libslic3r/PrintConfig.cpp:1265 src/libslic3r/PrintConfig.cpp:1640 -#: src/libslic3r/PrintConfig.cpp:1916 src/libslic3r/PrintConfig.cpp:1968 -#: src/libslic3r/PrintConfig.cpp:2346 +#: src/slic3r/GUI/GUI_ObjectList.cpp:96 src/slic3r/GUI/GUI_ObjectList.cpp:685 +#: src/slic3r/GUI/GUI_Preview.cpp:214 src/slic3r/GUI/Tab.cpp:1512 +#: src/libslic3r/PrintConfig.cpp:291 src/libslic3r/PrintConfig.cpp:543 +#: src/libslic3r/PrintConfig.cpp:1101 src/libslic3r/PrintConfig.cpp:1281 +#: src/libslic3r/PrintConfig.cpp:1354 src/libslic3r/PrintConfig.cpp:1729 +#: src/libslic3r/PrintConfig.cpp:2005 src/libslic3r/PrintConfig.cpp:2057 +#: src/libslic3r/PrintConfig.cpp:2435 msgid "Speed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:97 src/slic3r/GUI/GUI_ObjectList.cpp:672 -#: src/slic3r/GUI/Tab.cpp:1534 src/slic3r/GUI/Tab.cpp:2112 -#: src/libslic3r/PrintConfig.cpp:548 src/libslic3r/PrintConfig.cpp:1146 -#: src/libslic3r/PrintConfig.cpp:1618 src/libslic3r/PrintConfig.cpp:1937 -#: src/libslic3r/PrintConfig.cpp:2165 src/libslic3r/PrintConfig.cpp:2192 +#: src/slic3r/GUI/GUI_ObjectList.cpp:97 src/slic3r/GUI/GUI_ObjectList.cpp:686 +#: src/slic3r/GUI/Tab.cpp:1548 src/slic3r/GUI/Tab.cpp:2126 +#: src/libslic3r/PrintConfig.cpp:573 src/libslic3r/PrintConfig.cpp:1235 +#: src/libslic3r/PrintConfig.cpp:1707 src/libslic3r/PrintConfig.cpp:2026 +#: src/libslic3r/PrintConfig.cpp:2254 src/libslic3r/PrintConfig.cpp:2281 msgid "Extruders" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:673 -#: src/libslic3r/PrintConfig.cpp:507 src/libslic3r/PrintConfig.cpp:616 -#: src/libslic3r/PrintConfig.cpp:957 src/libslic3r/PrintConfig.cpp:1154 -#: src/libslic3r/PrintConfig.cpp:1627 src/libslic3r/PrintConfig.cpp:1957 -#: src/libslic3r/PrintConfig.cpp:2174 src/libslic3r/PrintConfig.cpp:2334 +#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:687 +#: src/libslic3r/PrintConfig.cpp:532 src/libslic3r/PrintConfig.cpp:641 +#: src/libslic3r/PrintConfig.cpp:982 src/libslic3r/PrintConfig.cpp:1243 +#: src/libslic3r/PrintConfig.cpp:1716 src/libslic3r/PrintConfig.cpp:2046 +#: src/libslic3r/PrintConfig.cpp:2263 src/libslic3r/PrintConfig.cpp:2423 msgid "Extrusion Width" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:102 src/slic3r/GUI/GUI_ObjectList.cpp:677 -#: src/slic3r/GUI/Tab.cpp:1428 src/slic3r/GUI/Tab.cpp:1452 -#: src/slic3r/GUI/Tab.cpp:1555 src/slic3r/GUI/Tab.cpp:1558 -#: src/slic3r/GUI/Tab.cpp:1855 src/slic3r/GUI/Tab.cpp:2197 -#: src/slic3r/GUI/Tab.cpp:4114 src/libslic3r/PrintConfig.cpp:92 +#: src/slic3r/GUI/GUI_ObjectList.cpp:100 src/slic3r/GUI/GUI_ObjectList.cpp:689 +#: src/slic3r/GUI/Tab.cpp:1472 src/libslic3r/PrintConfig.cpp:301 +#: src/libslic3r/PrintConfig.cpp:310 src/libslic3r/PrintConfig.cpp:326 +msgid "Skirt and brim" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:102 src/slic3r/GUI/GUI_ObjectList.cpp:691 +#: src/slic3r/GUI/Tab.cpp:1428 src/slic3r/GUI/Tab.cpp:1464 +#: src/slic3r/GUI/Tab.cpp:1569 src/slic3r/GUI/Tab.cpp:1572 +#: src/slic3r/GUI/Tab.cpp:1869 src/slic3r/GUI/Tab.cpp:2211 +#: src/slic3r/GUI/Tab.cpp:4132 src/libslic3r/PrintConfig.cpp:92 #: src/libslic3r/PrintConfig.cpp:132 src/libslic3r/PrintConfig.cpp:279 -#: src/libslic3r/PrintConfig.cpp:1097 src/libslic3r/PrintConfig.cpp:1181 -#: src/libslic3r/PrintConfig.cpp:2504 src/libslic3r/PrintConfig.cpp:2676 +#: src/libslic3r/PrintConfig.cpp:1186 src/libslic3r/PrintConfig.cpp:1270 +#: src/libslic3r/PrintConfig.cpp:2593 src/libslic3r/PrintConfig.cpp:2765 msgid "Advanced" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:104 src/slic3r/GUI/GUI_ObjectList.cpp:679 -#: src/slic3r/GUI/Plater.cpp:357 src/slic3r/GUI/Tab.cpp:4048 -#: src/slic3r/GUI/Tab.cpp:4049 src/libslic3r/PrintConfig.cpp:2842 -#: src/libslic3r/PrintConfig.cpp:2849 src/libslic3r/PrintConfig.cpp:2858 -#: src/libslic3r/PrintConfig.cpp:2867 src/libslic3r/PrintConfig.cpp:2877 -#: src/libslic3r/PrintConfig.cpp:2887 src/libslic3r/PrintConfig.cpp:2924 -#: src/libslic3r/PrintConfig.cpp:2931 src/libslic3r/PrintConfig.cpp:2942 -#: src/libslic3r/PrintConfig.cpp:2952 src/libslic3r/PrintConfig.cpp:2961 -#: src/libslic3r/PrintConfig.cpp:2974 src/libslic3r/PrintConfig.cpp:2984 -#: src/libslic3r/PrintConfig.cpp:2993 src/libslic3r/PrintConfig.cpp:3003 -#: src/libslic3r/PrintConfig.cpp:3014 src/libslic3r/PrintConfig.cpp:3022 +#: src/slic3r/GUI/GUI_ObjectList.cpp:104 src/slic3r/GUI/GUI_ObjectList.cpp:693 +#: src/slic3r/GUI/Plater.cpp:357 src/slic3r/GUI/Tab.cpp:4066 +#: src/slic3r/GUI/Tab.cpp:4067 src/libslic3r/PrintConfig.cpp:2931 +#: src/libslic3r/PrintConfig.cpp:2938 src/libslic3r/PrintConfig.cpp:2947 +#: src/libslic3r/PrintConfig.cpp:2956 src/libslic3r/PrintConfig.cpp:2966 +#: src/libslic3r/PrintConfig.cpp:2976 src/libslic3r/PrintConfig.cpp:3013 +#: src/libslic3r/PrintConfig.cpp:3020 src/libslic3r/PrintConfig.cpp:3031 +#: src/libslic3r/PrintConfig.cpp:3041 src/libslic3r/PrintConfig.cpp:3050 +#: src/libslic3r/PrintConfig.cpp:3063 src/libslic3r/PrintConfig.cpp:3073 +#: src/libslic3r/PrintConfig.cpp:3082 src/libslic3r/PrintConfig.cpp:3092 +#: src/libslic3r/PrintConfig.cpp:3103 src/libslic3r/PrintConfig.cpp:3111 msgid "Supports" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:105 src/slic3r/GUI/GUI_ObjectList.cpp:680 -#: src/slic3r/GUI/Plater.cpp:500 src/slic3r/GUI/Tab.cpp:4089 -#: src/slic3r/GUI/Tab.cpp:4090 src/slic3r/GUI/Tab.cpp:4161 -#: src/libslic3r/PrintConfig.cpp:3030 src/libslic3r/PrintConfig.cpp:3037 -#: src/libslic3r/PrintConfig.cpp:3051 src/libslic3r/PrintConfig.cpp:3062 -#: src/libslic3r/PrintConfig.cpp:3072 src/libslic3r/PrintConfig.cpp:3094 -#: src/libslic3r/PrintConfig.cpp:3105 src/libslic3r/PrintConfig.cpp:3112 -#: src/libslic3r/PrintConfig.cpp:3119 src/libslic3r/PrintConfig.cpp:3130 -#: src/libslic3r/PrintConfig.cpp:3139 src/libslic3r/PrintConfig.cpp:3148 +#: src/slic3r/GUI/GUI_ObjectList.cpp:105 src/slic3r/GUI/GUI_ObjectList.cpp:694 +#: src/slic3r/GUI/Plater.cpp:500 src/slic3r/GUI/Tab.cpp:4107 +#: src/slic3r/GUI/Tab.cpp:4108 src/slic3r/GUI/Tab.cpp:4179 +#: src/libslic3r/PrintConfig.cpp:3119 src/libslic3r/PrintConfig.cpp:3126 +#: src/libslic3r/PrintConfig.cpp:3140 src/libslic3r/PrintConfig.cpp:3151 +#: src/libslic3r/PrintConfig.cpp:3161 src/libslic3r/PrintConfig.cpp:3183 +#: src/libslic3r/PrintConfig.cpp:3194 src/libslic3r/PrintConfig.cpp:3201 +#: src/libslic3r/PrintConfig.cpp:3208 src/libslic3r/PrintConfig.cpp:3219 +#: src/libslic3r/PrintConfig.cpp:3228 src/libslic3r/PrintConfig.cpp:3237 msgid "Pad" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/Tab.cpp:4107 -#: src/slic3r/GUI/Tab.cpp:4108 src/libslic3r/SLA/Hollowing.cpp:45 +#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/Tab.cpp:4125 +#: src/slic3r/GUI/Tab.cpp:4126 src/libslic3r/SLA/Hollowing.cpp:45 #: src/libslic3r/SLA/Hollowing.cpp:57 src/libslic3r/SLA/Hollowing.cpp:66 -#: src/libslic3r/SLA/Hollowing.cpp:75 src/libslic3r/PrintConfig.cpp:3158 -#: src/libslic3r/PrintConfig.cpp:3165 src/libslic3r/PrintConfig.cpp:3175 -#: src/libslic3r/PrintConfig.cpp:3184 +#: src/libslic3r/SLA/Hollowing.cpp:75 src/libslic3r/PrintConfig.cpp:3247 +#: src/libslic3r/PrintConfig.cpp:3254 src/libslic3r/PrintConfig.cpp:3264 +#: src/libslic3r/PrintConfig.cpp:3273 msgid "Hollowing" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:300 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:161 +#: src/slic3r/GUI/GUI_ObjectList.cpp:314 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:142 msgid "Name" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:457 +#: src/slic3r/GUI/GUI_ObjectList.cpp:330 src/slic3r/GUI/GUI_ObjectList.cpp:471 msgid "Editing" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:402 +#: src/slic3r/GUI/GUI_ObjectList.cpp:416 src/slic3r/GUI/Plater.cpp:1074 #, possible-c-format -msgid "Auto-repaired (%d errors):" -msgstr "" +msgid "Auto-repaired %1$d error" +msgid_plural "Auto-repaired %1$d errors" +msgstr[0] "" +msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:409 -msgid "degenerate facets" -msgstr "" +#: src/slic3r/GUI/GUI_ObjectList.cpp:423 src/slic3r/GUI/Plater.cpp:1079 +#, possible-c-format +msgid "%1$d degenerate facet" +msgid_plural "%1$d degenerate facets" +msgstr[0] "" +msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:410 -msgid "edges fixed" -msgstr "" +#: src/slic3r/GUI/GUI_ObjectList.cpp:425 src/slic3r/GUI/Plater.cpp:1081 +#, possible-c-format +msgid "%1$d edge fixed" +msgid_plural "%1$d edges fixed" +msgstr[0] "" +msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:411 -msgid "facets removed" -msgstr "" +#: src/slic3r/GUI/GUI_ObjectList.cpp:427 src/slic3r/GUI/Plater.cpp:1083 +#, possible-c-format +msgid "%1$d facet removed" +msgid_plural "%1$d facets removed" +msgstr[0] "" +msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:412 -msgid "facets added" -msgstr "" +#: src/slic3r/GUI/GUI_ObjectList.cpp:429 src/slic3r/GUI/Plater.cpp:1085 +#, possible-c-format +msgid "%1$d facet added" +msgid_plural "%1$d facets added" +msgstr[0] "" +msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:413 -msgid "facets reversed" -msgstr "" +#: src/slic3r/GUI/GUI_ObjectList.cpp:431 src/slic3r/GUI/Plater.cpp:1087 +#, possible-c-format +msgid "%1$d facet reversed" +msgid_plural "%1$d facets reversed" +msgstr[0] "" +msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:414 -msgid "backwards edges" -msgstr "" +#: src/slic3r/GUI/GUI_ObjectList.cpp:433 src/slic3r/GUI/Plater.cpp:1089 +#, possible-c-format +msgid "%1$d backwards edge" +msgid_plural "%1$d backwards edges" +msgstr[0] "" +msgstr[1] "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:422 +#: src/slic3r/GUI/GUI_ObjectList.cpp:436 msgid "Right button click the icon to fix STL through Netfabb" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:459 +#: src/slic3r/GUI/GUI_ObjectList.cpp:473 msgid "Right button click the icon to change the object settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:461 +#: src/slic3r/GUI/GUI_ObjectList.cpp:475 msgid "Click the icon to change the object settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:465 +#: src/slic3r/GUI/GUI_ObjectList.cpp:479 msgid "Right button click the icon to change the object printable property" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:467 +#: src/slic3r/GUI/GUI_ObjectList.cpp:481 msgid "Click the icon to change the object printable property" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:590 +#: src/slic3r/GUI/GUI_ObjectList.cpp:604 msgid "Change Extruder" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:605 +#: src/slic3r/GUI/GUI_ObjectList.cpp:619 msgid "Rename Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:605 +#: src/slic3r/GUI/GUI_ObjectList.cpp:619 msgid "Rename Sub-object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1247 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4372 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1265 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4406 msgid "Instances to Separated Objects" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1262 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1280 msgid "Volumes in Object reordered" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1262 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1280 msgid "Object reordered" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1338 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1693 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1699 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2081 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1356 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1711 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1717 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2099 #, possible-c-format msgid "Quick Add Settings (%s)" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1428 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1446 msgid "Select showing settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1477 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1495 msgid "Add Settings for Layers" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1478 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1496 msgid "Add Settings for Sub-object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1479 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1497 msgid "Add Settings for Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1549 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1567 msgid "Add Settings Bundle for Height range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1550 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1568 msgid "Add Settings Bundle for Sub-object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1551 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1569 msgid "Add Settings Bundle for Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1590 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1608 msgid "Load" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1595 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1627 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1613 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1645 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1649 msgid "Box" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1595 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1613 msgid "Cylinder" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1595 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1613 msgid "Slab" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1663 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1681 msgid "Height range Modifier" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1672 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1690 msgid "Add settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1750 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1768 msgid "Change type" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1760 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1772 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1778 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1790 msgid "Set as a Separated Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1772 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1790 msgid "Set as a Separated Objects" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1782 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1800 msgid "Printable" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1797 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1815 msgid "Rename" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1808 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1826 msgid "Fix through the Netfabb" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1818 src/slic3r/GUI/Plater.cpp:4035 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1836 src/slic3r/GUI/Plater.cpp:4056 msgid "Export as STL" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1825 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4567 src/slic3r/GUI/Plater.cpp:4001 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1843 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4601 src/slic3r/GUI/Plater.cpp:4022 msgid "Reload the selected volumes from disk" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1832 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1850 msgid "Set extruder for selected items" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1864 src/libslic3r/PrintConfig.cpp:391 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1882 src/libslic3r/PrintConfig.cpp:416 msgid "Default" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1884 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1902 msgid "Scale to print volume" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1884 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1902 msgid "Scale the selected object to fit the print volume" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1913 src/slic3r/GUI/Plater.cpp:5224 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1931 src/slic3r/GUI/Plater.cpp:5247 msgid "Convert from imperial units" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1915 src/slic3r/GUI/Plater.cpp:5224 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1933 src/slic3r/GUI/Plater.cpp:5247 msgid "Revert conversion from imperial units" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1944 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1952 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2630 src/libslic3r/PrintConfig.cpp:3730 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1962 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1970 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2650 src/libslic3r/PrintConfig.cpp:3811 msgid "Merge" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1944 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1962 msgid "Merge objects to the one multipart object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1952 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1970 msgid "Merge objects to the one single object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2026 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2283 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2044 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2301 msgid "Add Shape" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2111 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2129 msgid "Load Part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2150 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2168 msgid "Error!" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2225 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2243 msgid "Add Generic Subobject" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2254 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2272 msgid "Generic" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2380 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2398 msgid "Delete Settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2402 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2422 msgid "Delete All Instances from Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2418 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2438 msgid "Delete Height Range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2450 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2470 msgid "From Object List You can't delete the last solid part from object." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2454 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2474 msgid "Delete Subobject" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2469 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2489 msgid "Last instance of an object cannot be deleted." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2473 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2493 msgid "Delete Instance" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2497 src/slic3r/GUI/Plater.cpp:2865 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2517 src/slic3r/GUI/Plater.cpp:2879 msgid "" "The selected object couldn't be split because it contains only one part." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2501 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2521 msgid "Split to Parts" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2637 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2657 msgid "Merged" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2721 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2741 msgid "Merge all parts to the one single object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2753 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2773 msgid "Add Layers" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2907 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2927 msgid "Group manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2919 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2939 msgid "Object manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2932 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2952 msgid "Object Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2936 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2956 msgid "Part Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2941 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2961 msgid "Layer range Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2947 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2967 msgid "Part manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2953 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2973 msgid "Instance manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2960 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2980 msgid "Height ranges" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2960 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2980 msgid "Settings for height range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3144 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3166 msgid "Delete Selected Item" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3332 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3354 msgid "Delete Selected" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3408 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3436 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3456 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3430 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3458 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3478 msgid "Add Height Range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3502 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3524 msgid "" "Cannot insert a new layer range after the current layer range.\n" "The next layer range is too thin to be split to two\n" "without violating the minimum layer height." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3506 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3528 msgid "" "Cannot insert a new layer range between the current and the next layer " "range.\n" @@ -3293,212 +3323,212 @@ msgid "" "is thinner than the minimum layer height allowed." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3511 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3533 msgid "" "Cannot insert a new layer range after the current layer range.\n" "Current layer range overlaps with the next layer range." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3570 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3592 msgid "Edit Height Range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3865 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3899 msgid "Selection-Remove from list" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3873 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3907 msgid "Selection-Add from list" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4008 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4042 msgid "Object or Instance" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4009 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4142 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4043 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4176 msgid "Part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4009 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4043 msgid "Layer" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4011 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4045 msgid "Unsupported selection" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4012 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4046 #, possible-c-format msgid "You started your selection with %s Item." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4013 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4047 #, possible-c-format msgid "In this mode you can select only other %s Items%s" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4016 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4050 msgid "of a current Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4021 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4096 src/slic3r/GUI/Plater.cpp:143 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4055 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4130 src/slic3r/GUI/Plater.cpp:143 msgid "Info" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4137 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4171 msgid "You can't change a type of the last solid part of the object." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4142 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4176 msgid "Modifier" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4142 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4176 msgid "Support Enforcer" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4142 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4176 msgid "Support Blocker" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4144 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4178 msgid "Select type of part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4149 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4183 msgid "Change Part Type" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4394 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4428 msgid "Enter new name" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4394 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4428 msgid "Renaming" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4410 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4537 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4444 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4571 #: src/slic3r/GUI/SavePresetDialog.cpp:101 #: src/slic3r/GUI/SavePresetDialog.cpp:109 msgid "The supplied name is not valid;" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4411 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4538 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4445 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4572 #: src/slic3r/GUI/SavePresetDialog.cpp:102 msgid "the following characters are not allowed:" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4586 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4620 msgid "Select extruder number:" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4587 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4621 msgid "This extruder will be set for selected items" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4612 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4646 msgid "Change Extruders" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4709 src/slic3r/GUI/Selection.cpp:1485 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4743 src/slic3r/GUI/Selection.cpp:1485 msgid "Set Printable" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4709 src/slic3r/GUI/Selection.cpp:1485 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4743 src/slic3r/GUI/Selection.cpp:1485 msgid "Set Unprintable" msgstr "" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:68 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:111 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:96 msgid "World coordinates" msgstr "" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:69 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:112 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:97 msgid "Local coordinates" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:88 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:73 msgid "Select coordinate space, in which the transformation will be performed." msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:163 src/libslic3r/GCode.cpp:537 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:144 src/libslic3r/GCode.cpp:537 msgid "Object name" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:223 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:505 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:204 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486 msgid "Position" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:224 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:506 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:205 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:487 #: src/slic3r/GUI/Mouse3DController.cpp:486 #: src/slic3r/GUI/Mouse3DController.cpp:507 msgid "Rotation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:271 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:252 #, possible-c-format msgid "Toggle %c axis mirroring" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:305 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:286 msgid "Set Mirror" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:345 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:357 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:326 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:338 msgid "Drop to bed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:372 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:353 msgid "Reset rotation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:394 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:375 msgid "Reset Rotation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:407 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:388 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:390 msgid "Reset scale" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:423 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:404 msgid "Inches" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:507 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:488 msgid "Scale factors" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:561 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:542 msgid "Translate" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:625 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:606 msgid "" "You cannot use non-uniform scaling mode for multiple objects/parts selection" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:797 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:778 msgid "Set Position" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:828 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:809 msgid "Set Orientation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:893 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:874 msgid "Set Scale" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:925 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:906 msgid "" "The currently manipulated object is tilted (rotation angles are not " "multiples of 90°).\n" @@ -3507,7 +3537,7 @@ msgid "" "once the rotation is embedded into the object coordinates." msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:928 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:909 msgid "" "This operation is irreversible.\n" "Do you want to proceed?" @@ -3531,132 +3561,132 @@ msgstr "" msgid "Change Option %s" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:212 +#: src/slic3r/GUI/GUI_Preview.cpp:209 msgid "View" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:215 src/libslic3r/PrintConfig.cpp:560 +#: src/slic3r/GUI/GUI_Preview.cpp:212 src/libslic3r/PrintConfig.cpp:585 msgid "Height" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:216 src/libslic3r/PrintConfig.cpp:2466 +#: src/slic3r/GUI/GUI_Preview.cpp:213 src/libslic3r/PrintConfig.cpp:2555 msgid "Width" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:218 src/slic3r/GUI/Tab.cpp:1840 +#: src/slic3r/GUI/GUI_Preview.cpp:215 src/slic3r/GUI/Tab.cpp:1854 msgid "Fan speed" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:219 +#: src/slic3r/GUI/GUI_Preview.cpp:216 msgid "Volumetric flow rate" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:224 +#: src/slic3r/GUI/GUI_Preview.cpp:221 msgid "Show" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:227 src/slic3r/GUI/GUI_Preview.cpp:245 +#: src/slic3r/GUI/GUI_Preview.cpp:224 src/slic3r/GUI/GUI_Preview.cpp:242 msgid "Feature types" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:230 src/libslic3r/ExtrusionEntity.cpp:310 +#: src/slic3r/GUI/GUI_Preview.cpp:227 src/libslic3r/ExtrusionEntity.cpp:310 #: src/libslic3r/ExtrusionEntity.cpp:332 msgid "Perimeter" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:231 src/libslic3r/ExtrusionEntity.cpp:311 +#: src/slic3r/GUI/GUI_Preview.cpp:228 src/libslic3r/ExtrusionEntity.cpp:311 #: src/libslic3r/ExtrusionEntity.cpp:334 msgid "External perimeter" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:232 src/libslic3r/ExtrusionEntity.cpp:312 +#: src/slic3r/GUI/GUI_Preview.cpp:229 src/libslic3r/ExtrusionEntity.cpp:312 #: src/libslic3r/ExtrusionEntity.cpp:336 msgid "Overhang perimeter" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:233 src/libslic3r/ExtrusionEntity.cpp:313 +#: src/slic3r/GUI/GUI_Preview.cpp:230 src/libslic3r/ExtrusionEntity.cpp:313 #: src/libslic3r/ExtrusionEntity.cpp:338 msgid "Internal infill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:234 src/libslic3r/ExtrusionEntity.cpp:314 -#: src/libslic3r/ExtrusionEntity.cpp:340 src/libslic3r/PrintConfig.cpp:1956 -#: src/libslic3r/PrintConfig.cpp:1967 +#: src/slic3r/GUI/GUI_Preview.cpp:231 src/libslic3r/ExtrusionEntity.cpp:314 +#: src/libslic3r/ExtrusionEntity.cpp:340 src/libslic3r/PrintConfig.cpp:2045 +#: src/libslic3r/PrintConfig.cpp:2056 msgid "Solid infill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:235 src/libslic3r/ExtrusionEntity.cpp:315 -#: src/libslic3r/ExtrusionEntity.cpp:342 src/libslic3r/PrintConfig.cpp:2333 -#: src/libslic3r/PrintConfig.cpp:2345 +#: src/slic3r/GUI/GUI_Preview.cpp:232 src/libslic3r/ExtrusionEntity.cpp:315 +#: src/libslic3r/ExtrusionEntity.cpp:342 src/libslic3r/PrintConfig.cpp:2422 +#: src/libslic3r/PrintConfig.cpp:2434 msgid "Top solid infill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/ExtrusionEntity.cpp:317 +#: src/slic3r/GUI/GUI_Preview.cpp:234 src/libslic3r/ExtrusionEntity.cpp:317 #: src/libslic3r/ExtrusionEntity.cpp:346 msgid "Bridge infill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:318 -#: src/libslic3r/ExtrusionEntity.cpp:348 src/libslic3r/PrintConfig.cpp:1011 +#: src/slic3r/GUI/GUI_Preview.cpp:235 src/libslic3r/ExtrusionEntity.cpp:318 +#: src/libslic3r/ExtrusionEntity.cpp:348 src/libslic3r/PrintConfig.cpp:1100 msgid "Gap fill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:239 src/slic3r/GUI/Tab.cpp:1462 +#: src/slic3r/GUI/GUI_Preview.cpp:236 src/slic3r/GUI/Tab.cpp:1474 #: src/libslic3r/ExtrusionEntity.cpp:319 src/libslic3r/ExtrusionEntity.cpp:350 msgid "Skirt" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:321 -#: src/libslic3r/ExtrusionEntity.cpp:354 src/libslic3r/PrintConfig.cpp:2218 +#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:321 +#: src/libslic3r/ExtrusionEntity.cpp:354 src/libslic3r/PrintConfig.cpp:2307 msgid "Support material interface" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:242 src/slic3r/GUI/Tab.cpp:1545 +#: src/slic3r/GUI/GUI_Preview.cpp:239 src/slic3r/GUI/Tab.cpp:1559 #: src/libslic3r/ExtrusionEntity.cpp:322 src/libslic3r/ExtrusionEntity.cpp:356 msgid "Wipe tower" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:1031 +#: src/slic3r/GUI/GUI_Preview.cpp:1034 msgid "Shells" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:1032 +#: src/slic3r/GUI/GUI_Preview.cpp:1035 msgid "Tool marker" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:1033 +#: src/slic3r/GUI/GUI_Preview.cpp:1036 msgid "Legend/Estimated printing time" msgstr "" -#: src/slic3r/GUI/ImGuiWrapper.cpp:804 src/slic3r/GUI/Search.cpp:389 +#: src/slic3r/GUI/ImGuiWrapper.cpp:804 src/slic3r/GUI/Search.cpp:386 msgid "Use for search" msgstr "" -#: src/slic3r/GUI/ImGuiWrapper.cpp:805 src/slic3r/GUI/Search.cpp:383 +#: src/slic3r/GUI/ImGuiWrapper.cpp:805 src/slic3r/GUI/Search.cpp:380 msgid "Category" msgstr "" -#: src/slic3r/GUI/ImGuiWrapper.cpp:807 src/slic3r/GUI/Search.cpp:385 +#: src/slic3r/GUI/ImGuiWrapper.cpp:807 src/slic3r/GUI/Search.cpp:382 msgid "Search in English" msgstr "" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:145 -msgid "Arranging" +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:153 +msgid "Could not arrange model objects! Some geometries may be invalid." msgstr "" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:175 -msgid "Could not arrange model objects! Some geometries may be invalid." +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:162 +msgid "Arranging" msgstr "" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:181 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:191 msgid "Arranging canceled." msgstr "" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:182 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:192 msgid "Arranging done." msgstr "" -#: src/slic3r/GUI/Jobs/Job.cpp:75 +#: src/slic3r/GUI/Jobs/Job.cpp:89 msgid "ERROR: not enough resources to execute a new job." msgstr "" @@ -3716,12 +3746,12 @@ msgstr "" msgid "Importing done." msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:208 src/slic3r/GUI/Plater.cpp:2357 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:208 src/slic3r/GUI/Plater.cpp:2365 msgid "You cannot load SLA project with a multi-part object on the bed" msgstr "" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:209 src/slic3r/GUI/Plater.cpp:2358 -#: src/slic3r/GUI/Tab.cpp:3243 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:209 src/slic3r/GUI/Plater.cpp:2366 +#: src/slic3r/GUI/Tab.cpp:3257 msgid "Please check your object list before preset changing." msgstr "" @@ -3761,12 +3791,12 @@ msgstr "" msgid "Load Config from ini/amf/3mf/gcode and merge" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:79 src/slic3r/GUI/Plater.cpp:770 -#: src/slic3r/GUI/Plater.cpp:6054 src/libslic3r/PrintConfig.cpp:3635 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:79 src/slic3r/GUI/Plater.cpp:767 +#: src/slic3r/GUI/Plater.cpp:6081 src/libslic3r/PrintConfig.cpp:3716 msgid "Export G-code" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:80 src/slic3r/GUI/Plater.cpp:6055 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:80 src/slic3r/GUI/Plater.cpp:6082 msgid "Send G-code" msgstr "" @@ -3774,7 +3804,7 @@ msgstr "" msgid "Export config" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:82 src/slic3r/GUI/Plater.cpp:758 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:82 src/slic3r/GUI/Plater.cpp:755 msgid "Export to SD card / Flash drive" msgstr "" @@ -3833,7 +3863,7 @@ msgid "Switch to Preview" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:106 -#: src/slic3r/GUI/PrintHostDialogs.cpp:165 +#: src/slic3r/GUI/PrintHostDialogs.cpp:176 msgid "Print host upload queue" msgstr "" @@ -4137,8 +4167,8 @@ msgstr "" msgid "Show/Hide Legend & Estimated printing time" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 src/slic3r/GUI/Plater.cpp:4200 -#: src/slic3r/GUI/Tab.cpp:2602 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 src/slic3r/GUI/Plater.cpp:4221 +#: src/slic3r/GUI/Tab.cpp:2616 msgid "Preview" msgstr "" @@ -4346,8 +4376,8 @@ msgstr "" #. TRN To be shown in the main menu View->Top #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:912 src/libslic3r/PrintConfig.cpp:2360 -#: src/libslic3r/PrintConfig.cpp:2369 +#: src/slic3r/GUI/MainFrame.cpp:912 src/libslic3r/PrintConfig.cpp:2449 +#: src/libslic3r/PrintConfig.cpp:2458 msgid "Top" msgstr "" @@ -4375,7 +4405,7 @@ msgstr "" msgid "Front View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:919 src/libslic3r/PrintConfig.cpp:1845 +#: src/slic3r/GUI/MainFrame.cpp:919 src/libslic3r/PrintConfig.cpp:1934 msgid "Rear" msgstr "" @@ -4426,7 +4456,7 @@ msgid "" msgstr "" #: src/slic3r/GUI/MainFrame.cpp:953 src/slic3r/GUI/MainFrame.cpp:1343 -#: src/slic3r/GUI/PrintHostDialogs.cpp:263 +#: src/slic3r/GUI/PrintHostDialogs.cpp:274 msgid "Error" msgstr "" @@ -4780,7 +4810,7 @@ msgstr "" msgid "&Collapse sidebar" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1204 src/slic3r/GUI/Plater.cpp:2247 +#: src/slic3r/GUI/MainFrame.cpp:1204 src/slic3r/GUI/Plater.cpp:2255 msgid "Collapse sidebar" msgstr "" @@ -4861,9 +4891,9 @@ msgstr "" msgid "Save zip file as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1405 src/slic3r/GUI/Plater.cpp:3009 -#: src/slic3r/GUI/Plater.cpp:5581 src/slic3r/GUI/Tab.cpp:1575 -#: src/slic3r/GUI/Tab.cpp:4115 +#: src/slic3r/GUI/MainFrame.cpp:1405 src/slic3r/GUI/Plater.cpp:3023 +#: src/slic3r/GUI/Plater.cpp:5604 src/slic3r/GUI/Tab.cpp:1589 +#: src/slic3r/GUI/Tab.cpp:4133 msgid "Slicing" msgstr "" @@ -4893,7 +4923,7 @@ msgstr "" msgid "Your file was repaired." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1469 src/libslic3r/PrintConfig.cpp:3735 +#: src/slic3r/GUI/MainFrame.cpp:1469 src/libslic3r/PrintConfig.cpp:3816 msgid "Repair" msgstr "" @@ -4970,56 +5000,56 @@ msgstr "" msgid "See more." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:476 +#: src/slic3r/GUI/NotificationManager.hpp:481 msgid "New version is available." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:476 +#: src/slic3r/GUI/NotificationManager.hpp:481 msgid "See Releases page." msgstr "" -#: src/slic3r/GUI/NotificationManager.hpp:479 +#: src/slic3r/GUI/NotificationManager.hpp:484 msgid "" "You have just added a G-code for color change, but its value is empty.\n" "To export the G-code correctly, check the \"Color Change G-code\" in " "\"Printer Settings > Custom G-code\"" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:490 -#: src/slic3r/GUI/NotificationManager.cpp:500 +#: src/slic3r/GUI/NotificationManager.cpp:493 +#: src/slic3r/GUI/NotificationManager.cpp:503 msgid "More" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:864 -#: src/slic3r/GUI/NotificationManager.cpp:1141 +#: src/slic3r/GUI/NotificationManager.cpp:863 +#: src/slic3r/GUI/NotificationManager.cpp:1134 msgid "Export G-Code." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:908 +#: src/slic3r/GUI/NotificationManager.cpp:904 msgid "Open Folder." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:946 +#: src/slic3r/GUI/NotificationManager.cpp:940 msgid "Eject drive" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1060 -#: src/slic3r/GUI/NotificationManager.cpp:1076 -#: src/slic3r/GUI/NotificationManager.cpp:1087 +#: src/slic3r/GUI/NotificationManager.cpp:1053 +#: src/slic3r/GUI/NotificationManager.cpp:1069 +#: src/slic3r/GUI/NotificationManager.cpp:1080 msgid "ERROR:" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1065 -#: src/slic3r/GUI/NotificationManager.cpp:1080 -#: src/slic3r/GUI/NotificationManager.cpp:1095 +#: src/slic3r/GUI/NotificationManager.cpp:1058 +#: src/slic3r/GUI/NotificationManager.cpp:1073 +#: src/slic3r/GUI/NotificationManager.cpp:1088 msgid "WARNING:" msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1144 +#: src/slic3r/GUI/NotificationManager.cpp:1137 msgid "Slicing finished." msgstr "" -#: src/slic3r/GUI/NotificationManager.cpp:1186 +#: src/slic3r/GUI/NotificationManager.cpp:1184 msgid "Exporting finished." msgstr "" @@ -5033,8 +5063,8 @@ msgstr "" msgid "Instance %d" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 src/slic3r/GUI/Tab.cpp:3962 -#: src/slic3r/GUI/Tab.cpp:4044 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 src/slic3r/GUI/Tab.cpp:3980 +#: src/slic3r/GUI/Tab.cpp:4062 msgid "Layers" msgstr "" @@ -5074,12 +5104,12 @@ msgstr "" msgid "Error loading shaders" msgstr "" -#: src/slic3r/GUI/OptionsGroup.cpp:335 +#: src/slic3r/GUI/OptionsGroup.cpp:334 msgctxt "Layers" msgid "Top" msgstr "" -#: src/slic3r/GUI/OptionsGroup.cpp:335 +#: src/slic3r/GUI/OptionsGroup.cpp:334 msgctxt "Layers" msgid "Bottom" msgstr "" @@ -5108,7 +5138,7 @@ msgstr "" msgid "Add preset for this printer device" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:205 src/slic3r/GUI/Tab.cpp:2064 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:205 src/slic3r/GUI/Tab.cpp:2078 msgid "Print Host upload" msgstr "" @@ -5180,13 +5210,17 @@ msgstr "" msgid "Replace?" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:579 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:582 msgid "" -"Following printer preset(s) is duplicated:%1%The above preset for printer " +"Following printer preset is duplicated:%1%The above preset for printer \"%2%" +"\" will be used just once." +msgid_plural "" +"Following printer presets are duplicated:%1%The above presets for printer " "\"%2%\" will be used just once." -msgstr "" +msgstr[0] "" +msgstr[1] "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:625 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:630 msgid "It's not possible to delete the last related preset for the printer." msgstr "" @@ -5210,15 +5244,15 @@ msgstr "" msgid "Sliced Info" msgstr "" -#: src/slic3r/GUI/Plater.cpp:237 src/slic3r/GUI/Plater.cpp:1151 +#: src/slic3r/GUI/Plater.cpp:237 src/slic3r/GUI/Plater.cpp:1159 msgid "Used Filament (m)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:238 src/slic3r/GUI/Plater.cpp:1163 +#: src/slic3r/GUI/Plater.cpp:238 src/slic3r/GUI/Plater.cpp:1171 msgid "Used Filament (mm³)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:239 src/slic3r/GUI/Plater.cpp:1170 +#: src/slic3r/GUI/Plater.cpp:239 src/slic3r/GUI/Plater.cpp:1178 msgid "Used Filament (g)" msgstr "" @@ -5238,8 +5272,8 @@ msgstr "" msgid "Select what kind of support do you need" msgstr "" -#: src/slic3r/GUI/Plater.cpp:362 src/libslic3r/PrintConfig.cpp:2128 -#: src/libslic3r/PrintConfig.cpp:2923 +#: src/slic3r/GUI/Plater.cpp:362 src/libslic3r/PrintConfig.cpp:2217 +#: src/libslic3r/PrintConfig.cpp:3012 msgid "Support on build plate only" msgstr "" @@ -5251,7 +5285,7 @@ msgstr "" msgid "Everywhere" msgstr "" -#: src/slic3r/GUI/Plater.cpp:396 src/slic3r/GUI/Tab.cpp:1469 +#: src/slic3r/GUI/Plater.cpp:396 src/slic3r/GUI/Tab.cpp:1481 msgid "Brim" msgstr "" @@ -5277,555 +5311,550 @@ msgstr "" msgid "Around object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:695 +#: src/slic3r/GUI/Plater.cpp:692 msgid "SLA print settings" msgstr "" -#: src/slic3r/GUI/Plater.cpp:756 src/slic3r/GUI/Plater.cpp:6055 +#: src/slic3r/GUI/Plater.cpp:753 src/slic3r/GUI/Plater.cpp:6082 msgid "Send to printer" msgstr "" -#: src/slic3r/GUI/Plater.cpp:771 src/slic3r/GUI/Plater.cpp:3009 -#: src/slic3r/GUI/Plater.cpp:5584 +#: src/slic3r/GUI/Plater.cpp:768 src/slic3r/GUI/Plater.cpp:3023 +#: src/slic3r/GUI/Plater.cpp:5607 msgid "Slice now" msgstr "" -#: src/slic3r/GUI/Plater.cpp:926 +#: src/slic3r/GUI/Plater.cpp:923 msgid "Hold Shift to Slice & Export G-code" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1071 -#, possible-c-format -msgid "%d (%d shells)" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:1076 -#, possible-c-format -msgid "Auto-repaired (%d errors)" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:1079 -#, possible-c-format -msgid "" -"%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d " -"facets reversed, %d backwards edges" -msgstr "" +#: src/slic3r/GUI/Plater.cpp:1068 +msgid "%1% (%2$d shell)" +msgid_plural "%1% (%2$d shells)" +msgstr[0] "" +msgstr[1] "" -#: src/slic3r/GUI/Plater.cpp:1089 +#: src/slic3r/GUI/Plater.cpp:1097 msgid "Yes" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1110 +#: src/slic3r/GUI/Plater.cpp:1118 msgid "Used Material (ml)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1113 -msgid "object(s)" -msgstr "" +#: src/slic3r/GUI/Plater.cpp:1121 +msgid "object" +msgid_plural "objects" +msgstr[0] "" +msgstr[1] "" -#: src/slic3r/GUI/Plater.cpp:1113 +#: src/slic3r/GUI/Plater.cpp:1121 msgid "supports and pad" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1151 +#: src/slic3r/GUI/Plater.cpp:1159 msgid "Used Filament (in)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1153 src/slic3r/GUI/Plater.cpp:1206 +#: src/slic3r/GUI/Plater.cpp:1161 src/slic3r/GUI/Plater.cpp:1214 msgid "objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1153 src/slic3r/GUI/Plater.cpp:1206 +#: src/slic3r/GUI/Plater.cpp:1161 src/slic3r/GUI/Plater.cpp:1214 msgid "wipe tower" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1163 +#: src/slic3r/GUI/Plater.cpp:1171 msgid "Used Filament (in³)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1189 +#: src/slic3r/GUI/Plater.cpp:1197 msgid "Filament at extruder %1%" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1195 +#: src/slic3r/GUI/Plater.cpp:1203 msgid "(including spool)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1204 src/libslic3r/PrintConfig.cpp:822 -#: src/libslic3r/PrintConfig.cpp:2738 src/libslic3r/PrintConfig.cpp:2739 +#: src/slic3r/GUI/Plater.cpp:1212 src/libslic3r/PrintConfig.cpp:847 +#: src/libslic3r/PrintConfig.cpp:2827 src/libslic3r/PrintConfig.cpp:2828 msgid "Cost" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1222 +#: src/slic3r/GUI/Plater.cpp:1230 msgid "normal mode" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1232 +#: src/slic3r/GUI/Plater.cpp:1240 msgid "stealth mode" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1403 src/slic3r/GUI/Plater.cpp:4923 +#: src/slic3r/GUI/Plater.cpp:1411 src/slic3r/GUI/Plater.cpp:4942 #, possible-c-format msgid "%s - Drop project file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1410 src/slic3r/GUI/Plater.cpp:4930 +#: src/slic3r/GUI/Plater.cpp:1418 src/slic3r/GUI/Plater.cpp:4949 msgid "Open as project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1411 src/slic3r/GUI/Plater.cpp:4931 +#: src/slic3r/GUI/Plater.cpp:1419 src/slic3r/GUI/Plater.cpp:4950 msgid "Import geometry only" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1412 src/slic3r/GUI/Plater.cpp:4932 +#: src/slic3r/GUI/Plater.cpp:1420 src/slic3r/GUI/Plater.cpp:4951 msgid "Import config only" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1415 src/slic3r/GUI/Plater.cpp:4935 +#: src/slic3r/GUI/Plater.cpp:1423 src/slic3r/GUI/Plater.cpp:4954 msgid "Select an action to apply to the file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1416 src/slic3r/GUI/Plater.cpp:4936 +#: src/slic3r/GUI/Plater.cpp:1424 src/slic3r/GUI/Plater.cpp:4955 msgid "Action" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1424 src/slic3r/GUI/Plater.cpp:4944 +#: src/slic3r/GUI/Plater.cpp:1432 src/slic3r/GUI/Plater.cpp:4963 msgid "Don't show again" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1469 src/slic3r/GUI/Plater.cpp:4981 +#: src/slic3r/GUI/Plater.cpp:1477 src/slic3r/GUI/Plater.cpp:5000 msgid "You can open only one .gcode file at a time." msgstr "" -#: src/slic3r/GUI/Plater.cpp:1470 src/slic3r/GUI/Plater.cpp:4982 +#: src/slic3r/GUI/Plater.cpp:1478 src/slic3r/GUI/Plater.cpp:5001 msgid "Drag and drop G-code file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1524 src/slic3r/GUI/Plater.cpp:4796 -#: src/slic3r/GUI/Plater.cpp:5036 +#: src/slic3r/GUI/Plater.cpp:1532 src/slic3r/GUI/Plater.cpp:4817 +#: src/slic3r/GUI/Plater.cpp:5055 msgid "Import Object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1546 src/slic3r/GUI/Plater.cpp:5058 +#: src/slic3r/GUI/Plater.cpp:1554 src/slic3r/GUI/Plater.cpp:5081 msgid "Load File" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1551 src/slic3r/GUI/Plater.cpp:5063 +#: src/slic3r/GUI/Plater.cpp:1559 src/slic3r/GUI/Plater.cpp:5086 msgid "Load Files" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1654 +#: src/slic3r/GUI/Plater.cpp:1662 msgid "Fill bed" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1660 +#: src/slic3r/GUI/Plater.cpp:1668 msgid "Optimize Rotation" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1666 +#: src/slic3r/GUI/Plater.cpp:1674 msgid "Import SLA archive" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2129 +#: src/slic3r/GUI/Plater.cpp:2137 #, possible-c-format msgid "" "Successfully unmounted. The device %s(%s) can now be safely removed from the " "computer." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2134 +#: src/slic3r/GUI/Plater.cpp:2142 #, possible-c-format msgid "Ejecting of device %s(%s) has failed." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2153 +#: src/slic3r/GUI/Plater.cpp:2161 msgid "New Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2246 +#: src/slic3r/GUI/Plater.cpp:2254 msgid "Expand sidebar" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2319 +#: src/slic3r/GUI/Plater.cpp:2327 msgid "Loading" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2329 +#: src/slic3r/GUI/Plater.cpp:2337 msgid "Loading file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2415 +#: src/slic3r/GUI/Plater.cpp:2427 #, possible-c-format msgid "" -"Some object(s) in file %s looks like saved in inches.\n" +"The object in file %s looks like saved in inches.\n" +"Should I consider it as a saved in inches and convert it?" +msgid_plural "" +"Some objects in file %s look like saved in inches.\n" "Should I consider them as a saved in inches and convert them?" -msgstr "" +msgstr[0] "" +msgstr[1] "" -#: src/slic3r/GUI/Plater.cpp:2417 +#: src/slic3r/GUI/Plater.cpp:2431 msgid "The object appears to be saved in inches" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2425 +#: src/slic3r/GUI/Plater.cpp:2439 msgid "" "This file contains several objects positioned at multiple heights.\n" "Instead of considering them as multiple objects, should I consider\n" "this file as a single object having multiple parts?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2428 src/slic3r/GUI/Plater.cpp:2481 +#: src/slic3r/GUI/Plater.cpp:2442 src/slic3r/GUI/Plater.cpp:2495 msgid "Multi-part object detected" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2435 +#: src/slic3r/GUI/Plater.cpp:2449 msgid "" "This file cannot be loaded in a simple mode. Do you want to switch to an " "advanced mode?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2436 +#: src/slic3r/GUI/Plater.cpp:2450 msgid "Detected advanced data" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2458 +#: src/slic3r/GUI/Plater.cpp:2472 #, possible-c-format msgid "" "You can't to add the object(s) from %s because of one or some of them " "is(are) multi-part" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2478 +#: src/slic3r/GUI/Plater.cpp:2492 msgid "" "Multiple objects were loaded for a multi-material printer.\n" "Instead of considering them as multiple objects, should I consider\n" "these files to represent a single object having multiple parts?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2494 +#: src/slic3r/GUI/Plater.cpp:2508 msgid "Loaded" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2596 +#: src/slic3r/GUI/Plater.cpp:2610 msgid "" "Your object appears to be too large, so it was automatically scaled down to " "fit your print bed." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2597 +#: src/slic3r/GUI/Plater.cpp:2611 msgid "Object too large?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2659 +#: src/slic3r/GUI/Plater.cpp:2673 msgid "Export STL file:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2666 +#: src/slic3r/GUI/Plater.cpp:2680 msgid "Export AMF file:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2672 +#: src/slic3r/GUI/Plater.cpp:2686 msgid "Save file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2678 +#: src/slic3r/GUI/Plater.cpp:2692 msgid "Export OBJ file:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2774 +#: src/slic3r/GUI/Plater.cpp:2788 msgid "Delete Object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2785 +#: src/slic3r/GUI/Plater.cpp:2799 msgid "Reset Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2857 +#: src/slic3r/GUI/Plater.cpp:2871 msgid "" "The selected object can't be split because it contains more than one volume/" "material." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2868 +#: src/slic3r/GUI/Plater.cpp:2882 msgid "Split to Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2993 src/slic3r/GUI/Plater.cpp:3723 +#: src/slic3r/GUI/Plater.cpp:3007 src/slic3r/GUI/Plater.cpp:3744 msgid "Invalid data" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3003 +#: src/slic3r/GUI/Plater.cpp:3017 msgid "Ready to slice" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3041 src/slic3r/GUI/PrintHostDialogs.cpp:264 +#: src/slic3r/GUI/Plater.cpp:3055 src/slic3r/GUI/PrintHostDialogs.cpp:275 msgid "Cancelling" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3060 +#: src/slic3r/GUI/Plater.cpp:3074 msgid "Another export job is currently running." msgstr "" -#: src/slic3r/GUI/Plater.cpp:3177 +#: src/slic3r/GUI/Plater.cpp:3191 msgid "Please select the file to reload" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3212 +#: src/slic3r/GUI/Plater.cpp:3226 msgid "It is not allowed to change the file to reload" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3212 +#: src/slic3r/GUI/Plater.cpp:3226 msgid "Do you want to retry" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3230 +#: src/slic3r/GUI/Plater.cpp:3244 msgid "Reload from:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3323 +#: src/slic3r/GUI/Plater.cpp:3337 msgid "Unable to reload:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3328 +#: src/slic3r/GUI/Plater.cpp:3342 msgid "Error during reload" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3347 +#: src/slic3r/GUI/Plater.cpp:3361 msgid "Reload all from disk" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3374 +#: src/slic3r/GUI/Plater.cpp:3388 msgid "" "ERROR: Please close all manipulators available from the left toolbar before " "fixing the mesh." msgstr "" -#: src/slic3r/GUI/Plater.cpp:3380 +#: src/slic3r/GUI/Plater.cpp:3394 msgid "Fix through NetFabb" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3397 +#: src/slic3r/GUI/Plater.cpp:3411 msgid "Custom supports and seams were removed after repairing the mesh." msgstr "" -#: src/slic3r/GUI/Plater.cpp:3680 +#: src/slic3r/GUI/Plater.cpp:3702 msgid "There are active warnings concerning sliced models:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3691 +#: src/slic3r/GUI/Plater.cpp:3712 msgid "generated warnings" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3731 src/slic3r/GUI/PrintHostDialogs.cpp:265 +#: src/slic3r/GUI/Plater.cpp:3752 src/slic3r/GUI/PrintHostDialogs.cpp:276 msgid "Cancelled" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3998 src/slic3r/GUI/Plater.cpp:4022 +#: src/slic3r/GUI/Plater.cpp:4019 src/slic3r/GUI/Plater.cpp:4043 msgid "Remove the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4007 +#: src/slic3r/GUI/Plater.cpp:4028 msgid "Add one more instance of the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4009 +#: src/slic3r/GUI/Plater.cpp:4030 msgid "Remove one instance of the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4011 +#: src/slic3r/GUI/Plater.cpp:4032 msgid "Set number of instances" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4011 +#: src/slic3r/GUI/Plater.cpp:4032 msgid "Change the number of instances of the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4013 +#: src/slic3r/GUI/Plater.cpp:4034 msgid "Fill bed with instances" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4013 +#: src/slic3r/GUI/Plater.cpp:4034 msgid "Fill the remaining area of bed with instances of the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4032 +#: src/slic3r/GUI/Plater.cpp:4053 msgid "Reload the selected object from disk" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4035 +#: src/slic3r/GUI/Plater.cpp:4056 msgid "Export the selected object as STL file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4065 +#: src/slic3r/GUI/Plater.cpp:4086 msgid "Along X axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4065 +#: src/slic3r/GUI/Plater.cpp:4086 msgid "Mirror the selected object along the X axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4067 +#: src/slic3r/GUI/Plater.cpp:4088 msgid "Along Y axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4067 +#: src/slic3r/GUI/Plater.cpp:4088 msgid "Mirror the selected object along the Y axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4069 +#: src/slic3r/GUI/Plater.cpp:4090 msgid "Along Z axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4069 +#: src/slic3r/GUI/Plater.cpp:4090 msgid "Mirror the selected object along the Z axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4072 +#: src/slic3r/GUI/Plater.cpp:4093 msgid "Mirror" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4072 +#: src/slic3r/GUI/Plater.cpp:4093 msgid "Mirror the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4084 +#: src/slic3r/GUI/Plater.cpp:4105 msgid "To objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4084 src/slic3r/GUI/Plater.cpp:4104 +#: src/slic3r/GUI/Plater.cpp:4105 src/slic3r/GUI/Plater.cpp:4125 msgid "Split the selected object into individual objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4086 +#: src/slic3r/GUI/Plater.cpp:4107 msgid "To parts" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4086 src/slic3r/GUI/Plater.cpp:4122 +#: src/slic3r/GUI/Plater.cpp:4107 src/slic3r/GUI/Plater.cpp:4143 msgid "Split the selected object into individual sub-parts" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4089 src/slic3r/GUI/Plater.cpp:4104 -#: src/slic3r/GUI/Plater.cpp:4122 src/libslic3r/PrintConfig.cpp:3759 +#: src/slic3r/GUI/Plater.cpp:4110 src/slic3r/GUI/Plater.cpp:4125 +#: src/slic3r/GUI/Plater.cpp:4143 src/libslic3r/PrintConfig.cpp:3840 msgid "Split" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4089 +#: src/slic3r/GUI/Plater.cpp:4110 msgid "Split the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4111 +#: src/slic3r/GUI/Plater.cpp:4132 msgid "Optimize orientation" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4112 +#: src/slic3r/GUI/Plater.cpp:4133 msgid "Optimize the rotation of the object for better print results." msgstr "" -#: src/slic3r/GUI/Plater.cpp:4192 +#: src/slic3r/GUI/Plater.cpp:4213 msgid "3D editor view" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4564 +#: src/slic3r/GUI/Plater.cpp:4585 msgid "" "%1% printer was active at the time the target Undo / Redo snapshot was " "taken. Switching to %1% printer requires reloading of %1% presets." msgstr "" -#: src/slic3r/GUI/Plater.cpp:4768 +#: src/slic3r/GUI/Plater.cpp:4789 msgid "Load Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4800 +#: src/slic3r/GUI/Plater.cpp:4821 msgid "Import Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4868 +#: src/slic3r/GUI/Plater.cpp:4887 msgid "The selected file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4868 +#: src/slic3r/GUI/Plater.cpp:4887 msgid "does not contain valid gcode." msgstr "" -#: src/slic3r/GUI/Plater.cpp:4869 +#: src/slic3r/GUI/Plater.cpp:4888 msgid "Error while loading .gcode file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5107 +#: src/slic3r/GUI/Plater.cpp:5130 msgid "All objects will be removed, continue?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5115 +#: src/slic3r/GUI/Plater.cpp:5138 msgid "Delete Selected Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5123 +#: src/slic3r/GUI/Plater.cpp:5146 msgid "Increase Instances" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5157 +#: src/slic3r/GUI/Plater.cpp:5180 msgid "Decrease Instances" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5188 +#: src/slic3r/GUI/Plater.cpp:5211 msgid "Enter the number of copies:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5189 +#: src/slic3r/GUI/Plater.cpp:5212 msgid "Copies of the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5193 +#: src/slic3r/GUI/Plater.cpp:5216 #, possible-c-format msgid "Set numbers of copies to %d" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5259 +#: src/slic3r/GUI/Plater.cpp:5282 msgid "Cut by Plane" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5316 +#: src/slic3r/GUI/Plater.cpp:5339 msgid "Save G-code file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5316 +#: src/slic3r/GUI/Plater.cpp:5339 msgid "Save SL1 file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5463 +#: src/slic3r/GUI/Plater.cpp:5486 #, possible-c-format msgid "STL file exported to %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5480 +#: src/slic3r/GUI/Plater.cpp:5503 #, possible-c-format msgid "AMF file exported to %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5483 +#: src/slic3r/GUI/Plater.cpp:5506 #, possible-c-format msgid "Error exporting AMF file %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5512 +#: src/slic3r/GUI/Plater.cpp:5535 #, possible-c-format msgid "3MF file exported to %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5517 +#: src/slic3r/GUI/Plater.cpp:5540 #, possible-c-format msgid "Error exporting 3MF file %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:6054 +#: src/slic3r/GUI/Plater.cpp:6081 msgid "Export" msgstr "" -#: src/slic3r/GUI/Plater.cpp:6149 +#: src/slic3r/GUI/Plater.cpp:6178 msgid "Paste From Clipboard" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:56 src/slic3r/GUI/Tab.cpp:2098 -#: src/slic3r/GUI/Tab.cpp:2285 src/slic3r/GUI/Tab.cpp:2393 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1080 +#: src/slic3r/GUI/Preferences.cpp:56 src/slic3r/GUI/Tab.cpp:2112 +#: src/slic3r/GUI/Tab.cpp:2299 src/slic3r/GUI/Tab.cpp:2407 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1082 msgid "General" msgstr "" @@ -6067,115 +6096,119 @@ msgstr "" msgid "If enabled, you can change size of toolbar icons manually." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:320 +#: src/slic3r/GUI/Preferences.cpp:321 msgid "Render" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:325 +#: src/slic3r/GUI/Preferences.cpp:326 msgid "Use environment map" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:327 +#: src/slic3r/GUI/Preferences.cpp:328 msgid "If enabled, renders object using the environment map." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:352 +#: src/slic3r/GUI/Preferences.cpp:353 #, possible-c-format msgid "You need to restart %s to make the changes effective." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:427 +#: src/slic3r/GUI/Preferences.cpp:432 msgid "Icon size in a respect to the default size" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:442 +#: src/slic3r/GUI/Preferences.cpp:447 msgid "Select toolbar icon size in respect to the default one." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:473 +#: src/slic3r/GUI/Preferences.cpp:478 msgid "Old regular layout with the tab bar" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:474 +#: src/slic3r/GUI/Preferences.cpp:479 msgid "New layout, access via settings button in the top menu" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:475 +#: src/slic3r/GUI/Preferences.cpp:480 msgid "Settings in non-modal window" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:484 +#: src/slic3r/GUI/Preferences.cpp:489 msgid "Layout Options" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:197 -#: src/slic3r/GUI/PresetComboBoxes.cpp:235 -#: src/slic3r/GUI/PresetComboBoxes.cpp:761 -#: src/slic3r/GUI/PresetComboBoxes.cpp:811 -#: src/slic3r/GUI/PresetComboBoxes.cpp:925 -#: src/slic3r/GUI/PresetComboBoxes.cpp:969 +#: src/slic3r/GUI/Preferences.cpp:510 +msgid "Text color Settings" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:224 +#: src/slic3r/GUI/PresetComboBoxes.cpp:262 +#: src/slic3r/GUI/PresetComboBoxes.cpp:788 +#: src/slic3r/GUI/PresetComboBoxes.cpp:838 +#: src/slic3r/GUI/PresetComboBoxes.cpp:963 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1007 msgid "System presets" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:239 -#: src/slic3r/GUI/PresetComboBoxes.cpp:815 -#: src/slic3r/GUI/PresetComboBoxes.cpp:973 +#: src/slic3r/GUI/PresetComboBoxes.cpp:266 +#: src/slic3r/GUI/PresetComboBoxes.cpp:842 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1011 msgid "User presets" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:250 +#: src/slic3r/GUI/PresetComboBoxes.cpp:277 msgid "Incompatible presets" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:285 +#: src/slic3r/GUI/PresetComboBoxes.cpp:312 msgid "Are you sure you want to delete \"%1%\" printer?" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:287 +#: src/slic3r/GUI/PresetComboBoxes.cpp:314 msgid "Delete Physical Printer" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:624 +#: src/slic3r/GUI/PresetComboBoxes.cpp:651 msgid "Click to edit preset" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:680 -#: src/slic3r/GUI/PresetComboBoxes.cpp:710 +#: src/slic3r/GUI/PresetComboBoxes.cpp:707 +#: src/slic3r/GUI/PresetComboBoxes.cpp:737 msgid "Add/Remove presets" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:685 -#: src/slic3r/GUI/PresetComboBoxes.cpp:715 src/slic3r/GUI/Tab.cpp:2990 +#: src/slic3r/GUI/PresetComboBoxes.cpp:712 +#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3004 msgid "Add physical printer" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:699 +#: src/slic3r/GUI/PresetComboBoxes.cpp:726 msgid "Edit preset" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:703 src/slic3r/GUI/Tab.cpp:2990 +#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3004 msgid "Edit physical printer" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:706 +#: src/slic3r/GUI/PresetComboBoxes.cpp:733 msgid "Delete physical printer" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:826 -#: src/slic3r/GUI/PresetComboBoxes.cpp:987 +#: src/slic3r/GUI/PresetComboBoxes.cpp:853 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1025 msgid "Physical printers" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:850 +#: src/slic3r/GUI/PresetComboBoxes.cpp:877 msgid "Add/Remove filaments" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:852 +#: src/slic3r/GUI/PresetComboBoxes.cpp:879 msgid "Add/Remove materials" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:854 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1011 +#: src/slic3r/GUI/PresetComboBoxes.cpp:881 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1049 msgid "Add/Remove printers" msgstr "" @@ -6352,52 +6385,52 @@ msgstr "" msgid "Group" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:176 +#: src/slic3r/GUI/PrintHostDialogs.cpp:187 msgid "ID" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:177 +#: src/slic3r/GUI/PrintHostDialogs.cpp:188 msgid "Progress" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:178 +#: src/slic3r/GUI/PrintHostDialogs.cpp:189 msgid "Status" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:179 +#: src/slic3r/GUI/PrintHostDialogs.cpp:190 msgid "Host" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:180 +#: src/slic3r/GUI/PrintHostDialogs.cpp:191 msgid "Filename" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:181 +#: src/slic3r/GUI/PrintHostDialogs.cpp:192 msgid "Error Message" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:184 +#: src/slic3r/GUI/PrintHostDialogs.cpp:195 msgid "Cancel selected" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:186 +#: src/slic3r/GUI/PrintHostDialogs.cpp:197 msgid "Show error message" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:228 -#: src/slic3r/GUI/PrintHostDialogs.cpp:261 +#: src/slic3r/GUI/PrintHostDialogs.cpp:239 +#: src/slic3r/GUI/PrintHostDialogs.cpp:272 msgid "Enqueued" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:262 +#: src/slic3r/GUI/PrintHostDialogs.cpp:273 msgid "Uploading" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:266 +#: src/slic3r/GUI/PrintHostDialogs.cpp:277 msgid "Completed" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:304 +#: src/slic3r/GUI/PrintHostDialogs.cpp:315 msgid "Error uploading to print host:" msgstr "" @@ -6406,12 +6439,12 @@ msgid "NO RAMMING AT ALL" msgstr "" #: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/WipeTowerDialog.cpp:83 -#: src/libslic3r/PrintConfig.cpp:706 src/libslic3r/PrintConfig.cpp:750 -#: src/libslic3r/PrintConfig.cpp:765 src/libslic3r/PrintConfig.cpp:2636 -#: src/libslic3r/PrintConfig.cpp:2645 src/libslic3r/PrintConfig.cpp:2755 -#: src/libslic3r/PrintConfig.cpp:2763 src/libslic3r/PrintConfig.cpp:2771 -#: src/libslic3r/PrintConfig.cpp:2778 src/libslic3r/PrintConfig.cpp:2786 -#: src/libslic3r/PrintConfig.cpp:2794 +#: src/libslic3r/PrintConfig.cpp:731 src/libslic3r/PrintConfig.cpp:775 +#: src/libslic3r/PrintConfig.cpp:790 src/libslic3r/PrintConfig.cpp:2725 +#: src/libslic3r/PrintConfig.cpp:2734 src/libslic3r/PrintConfig.cpp:2844 +#: src/libslic3r/PrintConfig.cpp:2852 src/libslic3r/PrintConfig.cpp:2860 +#: src/libslic3r/PrintConfig.cpp:2867 src/libslic3r/PrintConfig.cpp:2875 +#: src/libslic3r/PrintConfig.cpp:2883 msgid "s" msgstr "" @@ -6419,8 +6452,8 @@ msgstr "" msgid "Volumetric speed" msgstr "" -#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:663 -#: src/libslic3r/PrintConfig.cpp:1458 +#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:688 +#: src/libslic3r/PrintConfig.cpp:1547 msgid "mm³/s" msgstr "" @@ -6471,43 +6504,47 @@ msgstr "" msgid "The name cannot end with space character." msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:186 -#: src/slic3r/GUI/SavePresetDialog.cpp:192 +#: src/slic3r/GUI/SavePresetDialog.cpp:157 +msgid "The name cannot be the same as a preset alias name." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:191 +#: src/slic3r/GUI/SavePresetDialog.cpp:197 msgid "Save preset" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:215 +#: src/slic3r/GUI/SavePresetDialog.cpp:220 msgctxt "PresetName" msgid "Copy" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:273 +#: src/slic3r/GUI/SavePresetDialog.cpp:278 msgid "" "You have selected physical printer \"%1%\" \n" "with related printer preset \"%2%\"" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:306 +#: src/slic3r/GUI/SavePresetDialog.cpp:311 msgid "What would you like to do with \"%1%\" preset after saving?" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:309 +#: src/slic3r/GUI/SavePresetDialog.cpp:314 msgid "Change \"%1%\" to \"%2%\" for this physical printer \"%3%\"" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:310 +#: src/slic3r/GUI/SavePresetDialog.cpp:315 msgid "Add \"%1%\" as a next preset for the the physical printer \"%2%\"" msgstr "" -#: src/slic3r/GUI/SavePresetDialog.cpp:311 +#: src/slic3r/GUI/SavePresetDialog.cpp:316 msgid "Just switch to \"%1%\" preset" msgstr "" -#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2421 +#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2435 msgid "Stealth" msgstr "" -#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2415 +#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2429 msgid "Normal" msgstr "" @@ -6555,15 +6592,15 @@ msgstr "" msgid "Set Unprintable Instance" msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:82 +#: src/slic3r/GUI/SysInfoDialog.cpp:83 msgid "System Information" msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:158 +#: src/slic3r/GUI/SysInfoDialog.cpp:164 msgid "Copy to Clipboard" msgstr "" -#: src/slic3r/GUI/Tab.cpp:109 src/libslic3r/PrintConfig.cpp:321 +#: src/slic3r/GUI/Tab.cpp:109 src/libslic3r/PrintConfig.cpp:346 msgid "Compatible printers" msgstr "" @@ -6571,7 +6608,7 @@ msgstr "" msgid "Select the printers this profile is compatible with." msgstr "" -#: src/slic3r/GUI/Tab.cpp:115 src/libslic3r/PrintConfig.cpp:336 +#: src/slic3r/GUI/Tab.cpp:115 src/libslic3r/PrintConfig.cpp:361 msgid "Compatible print profiles" msgstr "" @@ -6689,7 +6726,7 @@ msgstr "" msgid "symbolic profile name" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1385 src/slic3r/GUI/Tab.cpp:4042 +#: src/slic3r/GUI/Tab.cpp:1385 src/slic3r/GUI/Tab.cpp:4060 msgid "Layers and perimeters" msgstr "" @@ -6701,7 +6738,7 @@ msgstr "" msgid "Horizontal shells" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1404 src/libslic3r/PrintConfig.cpp:1980 +#: src/slic3r/GUI/Tab.cpp:1404 src/libslic3r/PrintConfig.cpp:2069 msgid "Solid layers" msgstr "" @@ -6713,179 +6750,179 @@ msgstr "" msgid "Quality (slower slicing)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1448 -msgid "Reducing printing time" +#: src/slic3r/GUI/Tab.cpp:1432 +msgid "Fuzzy skin (experimental)" msgstr "" #: src/slic3r/GUI/Tab.cpp:1460 -msgid "Skirt and brim" +msgid "Reducing printing time" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1480 +#: src/slic3r/GUI/Tab.cpp:1494 msgid "Raft" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1484 +#: src/slic3r/GUI/Tab.cpp:1498 msgid "Options for support material and raft" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1499 +#: src/slic3r/GUI/Tab.cpp:1513 msgid "Speed for print moves" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1512 +#: src/slic3r/GUI/Tab.cpp:1526 msgid "Speed for non-print moves" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1515 +#: src/slic3r/GUI/Tab.cpp:1529 msgid "Modifiers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1518 +#: src/slic3r/GUI/Tab.cpp:1532 msgid "Acceleration control (advanced)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1525 +#: src/slic3r/GUI/Tab.cpp:1539 msgid "Autospeed (advanced)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1533 +#: src/slic3r/GUI/Tab.cpp:1547 msgid "Multiple Extruders" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1541 +#: src/slic3r/GUI/Tab.cpp:1555 msgid "Ooze prevention" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1559 +#: src/slic3r/GUI/Tab.cpp:1573 msgid "Extrusion width" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1569 +#: src/slic3r/GUI/Tab.cpp:1583 msgid "Overlap" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1572 +#: src/slic3r/GUI/Tab.cpp:1586 msgid "Flow" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1581 +#: src/slic3r/GUI/Tab.cpp:1595 msgid "Other" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1584 src/slic3r/GUI/Tab.cpp:4118 +#: src/slic3r/GUI/Tab.cpp:1598 src/slic3r/GUI/Tab.cpp:4136 msgid "Output options" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1585 +#: src/slic3r/GUI/Tab.cpp:1599 msgid "Sequential printing" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1587 +#: src/slic3r/GUI/Tab.cpp:1601 msgid "Extruder clearance" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1592 src/slic3r/GUI/Tab.cpp:4119 +#: src/slic3r/GUI/Tab.cpp:1606 src/slic3r/GUI/Tab.cpp:4137 msgid "Output file" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1599 src/libslic3r/PrintConfig.cpp:1662 +#: src/slic3r/GUI/Tab.cpp:1613 src/libslic3r/PrintConfig.cpp:1751 msgid "Post-processing scripts" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1605 src/slic3r/GUI/Tab.cpp:1606 -#: src/slic3r/GUI/Tab.cpp:1927 src/slic3r/GUI/Tab.cpp:1928 -#: src/slic3r/GUI/Tab.cpp:2266 src/slic3r/GUI/Tab.cpp:2267 -#: src/slic3r/GUI/Tab.cpp:2342 src/slic3r/GUI/Tab.cpp:2343 -#: src/slic3r/GUI/Tab.cpp:3985 src/slic3r/GUI/Tab.cpp:3986 +#: src/slic3r/GUI/Tab.cpp:1619 src/slic3r/GUI/Tab.cpp:1620 +#: src/slic3r/GUI/Tab.cpp:1941 src/slic3r/GUI/Tab.cpp:1942 +#: src/slic3r/GUI/Tab.cpp:2280 src/slic3r/GUI/Tab.cpp:2281 +#: src/slic3r/GUI/Tab.cpp:2356 src/slic3r/GUI/Tab.cpp:2357 +#: src/slic3r/GUI/Tab.cpp:4003 src/slic3r/GUI/Tab.cpp:4004 msgid "Notes" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1612 src/slic3r/GUI/Tab.cpp:1935 -#: src/slic3r/GUI/Tab.cpp:2273 src/slic3r/GUI/Tab.cpp:2349 -#: src/slic3r/GUI/Tab.cpp:3993 src/slic3r/GUI/Tab.cpp:4124 +#: src/slic3r/GUI/Tab.cpp:1626 src/slic3r/GUI/Tab.cpp:1949 +#: src/slic3r/GUI/Tab.cpp:2287 src/slic3r/GUI/Tab.cpp:2363 +#: src/slic3r/GUI/Tab.cpp:4011 src/slic3r/GUI/Tab.cpp:4142 msgid "Dependencies" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1613 src/slic3r/GUI/Tab.cpp:1936 -#: src/slic3r/GUI/Tab.cpp:2274 src/slic3r/GUI/Tab.cpp:2350 -#: src/slic3r/GUI/Tab.cpp:3994 src/slic3r/GUI/Tab.cpp:4125 +#: src/slic3r/GUI/Tab.cpp:1627 src/slic3r/GUI/Tab.cpp:1950 +#: src/slic3r/GUI/Tab.cpp:2288 src/slic3r/GUI/Tab.cpp:2364 +#: src/slic3r/GUI/Tab.cpp:4012 src/slic3r/GUI/Tab.cpp:4143 msgid "Profile dependencies" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1693 +#: src/slic3r/GUI/Tab.cpp:1707 msgid "Filament Overrides" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1815 +#: src/slic3r/GUI/Tab.cpp:1829 msgid "Temperature" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1816 +#: src/slic3r/GUI/Tab.cpp:1830 msgid "Nozzle" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1821 +#: src/slic3r/GUI/Tab.cpp:1835 msgid "Bed" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1826 +#: src/slic3r/GUI/Tab.cpp:1840 msgid "Cooling" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1828 src/libslic3r/PrintConfig.cpp:1565 -#: src/libslic3r/PrintConfig.cpp:2428 +#: src/slic3r/GUI/Tab.cpp:1842 src/libslic3r/PrintConfig.cpp:1654 +#: src/libslic3r/PrintConfig.cpp:2517 msgid "Enable" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1839 +#: src/slic3r/GUI/Tab.cpp:1853 msgid "Fan settings" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1850 +#: src/slic3r/GUI/Tab.cpp:1864 msgid "Cooling thresholds" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1856 +#: src/slic3r/GUI/Tab.cpp:1870 msgid "Filament properties" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1863 +#: src/slic3r/GUI/Tab.cpp:1877 msgid "Print speed override" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1873 +#: src/slic3r/GUI/Tab.cpp:1887 msgid "Wipe tower parameters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1876 +#: src/slic3r/GUI/Tab.cpp:1890 msgid "Toolchange parameters with single extruder MM printers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1889 +#: src/slic3r/GUI/Tab.cpp:1903 msgid "Ramming settings" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1912 src/slic3r/GUI/Tab.cpp:2205 -#: src/libslic3r/PrintConfig.cpp:2063 +#: src/slic3r/GUI/Tab.cpp:1926 src/slic3r/GUI/Tab.cpp:2219 +#: src/libslic3r/PrintConfig.cpp:2152 msgid "Custom G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1913 src/slic3r/GUI/Tab.cpp:2206 -#: src/libslic3r/PrintConfig.cpp:2013 src/libslic3r/PrintConfig.cpp:2028 +#: src/slic3r/GUI/Tab.cpp:1927 src/slic3r/GUI/Tab.cpp:2220 +#: src/libslic3r/PrintConfig.cpp:2102 src/libslic3r/PrintConfig.cpp:2117 msgid "Start G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1920 src/slic3r/GUI/Tab.cpp:2213 -#: src/libslic3r/PrintConfig.cpp:441 src/libslic3r/PrintConfig.cpp:451 +#: src/slic3r/GUI/Tab.cpp:1934 src/slic3r/GUI/Tab.cpp:2227 +#: src/libslic3r/PrintConfig.cpp:466 src/libslic3r/PrintConfig.cpp:476 msgid "End G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1970 +#: src/slic3r/GUI/Tab.cpp:1984 msgid "Volumetric flow hints not available" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2066 +#: src/slic3r/GUI/Tab.cpp:2080 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -6898,19 +6935,19 @@ msgid "" "physical_printer directory." msgstr "" -#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:2286 +#: src/slic3r/GUI/Tab.cpp:2113 src/slic3r/GUI/Tab.cpp:2300 msgid "Size and coordinates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2108 src/slic3r/GUI/UnsavedChangesDialog.cpp:1080 +#: src/slic3r/GUI/Tab.cpp:2122 src/slic3r/GUI/UnsavedChangesDialog.cpp:1082 msgid "Capabilities" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2113 +#: src/slic3r/GUI/Tab.cpp:2127 msgid "Number of extruders of the printer." msgstr "" -#: src/slic3r/GUI/Tab.cpp:2141 +#: src/slic3r/GUI/Tab.cpp:2155 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -6918,231 +6955,243 @@ msgid "" "nozzle diameter value?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2144 src/slic3r/GUI/Tab.cpp:2552 -#: src/libslic3r/PrintConfig.cpp:1534 +#: src/slic3r/GUI/Tab.cpp:2158 src/slic3r/GUI/Tab.cpp:2566 +#: src/libslic3r/PrintConfig.cpp:1623 msgid "Nozzle diameter" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2220 src/libslic3r/PrintConfig.cpp:209 +#: src/slic3r/GUI/Tab.cpp:2234 src/libslic3r/PrintConfig.cpp:209 msgid "Before layer change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2227 src/libslic3r/PrintConfig.cpp:1273 +#: src/slic3r/GUI/Tab.cpp:2241 src/libslic3r/PrintConfig.cpp:1362 msgid "After layer change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2234 src/libslic3r/PrintConfig.cpp:2321 +#: src/slic3r/GUI/Tab.cpp:2248 src/libslic3r/PrintConfig.cpp:2410 msgid "Tool change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2241 +#: src/slic3r/GUI/Tab.cpp:2255 msgid "Between objects G-code (for sequential printing)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2248 +#: src/slic3r/GUI/Tab.cpp:2262 msgid "Color Change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2254 src/libslic3r/PrintConfig.cpp:2054 +#: src/slic3r/GUI/Tab.cpp:2268 src/libslic3r/PrintConfig.cpp:2143 msgid "Pause Print G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2260 +#: src/slic3r/GUI/Tab.cpp:2274 msgid "Template Custom G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2293 +#: src/slic3r/GUI/Tab.cpp:2307 msgid "Display" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2308 +#: src/slic3r/GUI/Tab.cpp:2322 msgid "Tilt" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2309 +#: src/slic3r/GUI/Tab.cpp:2323 msgid "Tilt time" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2315 src/slic3r/GUI/Tab.cpp:3969 +#: src/slic3r/GUI/Tab.cpp:2329 src/slic3r/GUI/Tab.cpp:3987 msgid "Corrections" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2332 src/slic3r/GUI/Tab.cpp:3965 +#: src/slic3r/GUI/Tab.cpp:2346 src/slic3r/GUI/Tab.cpp:3983 msgid "Exposure" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2391 src/slic3r/GUI/Tab.cpp:2485 -#: src/libslic3r/PrintConfig.cpp:1302 src/libslic3r/PrintConfig.cpp:1337 -#: src/libslic3r/PrintConfig.cpp:1354 src/libslic3r/PrintConfig.cpp:1371 -#: src/libslic3r/PrintConfig.cpp:1387 src/libslic3r/PrintConfig.cpp:1397 -#: src/libslic3r/PrintConfig.cpp:1407 src/libslic3r/PrintConfig.cpp:1417 +#: src/slic3r/GUI/Tab.cpp:2405 src/slic3r/GUI/Tab.cpp:2499 +#: src/libslic3r/PrintConfig.cpp:1391 src/libslic3r/PrintConfig.cpp:1426 +#: src/libslic3r/PrintConfig.cpp:1443 src/libslic3r/PrintConfig.cpp:1460 +#: src/libslic3r/PrintConfig.cpp:1476 src/libslic3r/PrintConfig.cpp:1486 +#: src/libslic3r/PrintConfig.cpp:1496 src/libslic3r/PrintConfig.cpp:1506 msgid "Machine limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2414 +#: src/slic3r/GUI/Tab.cpp:2428 msgid "Values in this column are for Normal mode" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2420 +#: src/slic3r/GUI/Tab.cpp:2434 msgid "Values in this column are for Stealth mode" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2429 +#: src/slic3r/GUI/Tab.cpp:2443 msgid "Maximum feedrates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2434 +#: src/slic3r/GUI/Tab.cpp:2448 msgid "Maximum accelerations" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2441 +#: src/slic3r/GUI/Tab.cpp:2455 msgid "Jerk limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2446 +#: src/slic3r/GUI/Tab.cpp:2460 msgid "Minimum feedrates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2510 src/slic3r/GUI/Tab.cpp:2518 +#: src/slic3r/GUI/Tab.cpp:2524 src/slic3r/GUI/Tab.cpp:2532 msgid "Single extruder MM setup" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2519 +#: src/slic3r/GUI/Tab.cpp:2533 msgid "Single extruder multimaterial parameters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2550 +#: src/slic3r/GUI/Tab.cpp:2564 msgid "" "This is a single extruder multimaterial printer, diameters of all extruders " "will be set to the new value. Do you want to proceed?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2574 +#: src/slic3r/GUI/Tab.cpp:2588 msgid "Layer height limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2579 +#: src/slic3r/GUI/Tab.cpp:2593 msgid "Position (for multi-extruder printers)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2585 +#: src/slic3r/GUI/Tab.cpp:2599 msgid "Only lift Z" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2598 +#: src/slic3r/GUI/Tab.cpp:2612 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2605 +#: src/slic3r/GUI/Tab.cpp:2619 msgid "Reset to Filament Color" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2783 +#: src/slic3r/GUI/Tab.cpp:2797 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" "Shall I disable it in order to enable Firmware Retraction?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2785 +#: src/slic3r/GUI/Tab.cpp:2799 msgid "Firmware Retraction" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3376 +#: src/slic3r/GUI/Tab.cpp:3390 msgid "Detached" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3439 +#: src/slic3r/GUI/Tab.cpp:3453 msgid "remove" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3439 +#: src/slic3r/GUI/Tab.cpp:3453 msgid "delete" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3448 +#: src/slic3r/GUI/Tab.cpp:3462 msgid "It's a last preset for this physical printer." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3453 +#: src/slic3r/GUI/Tab.cpp:3467 msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " "\"%2%\"?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3465 +#: src/slic3r/GUI/Tab.cpp:3479 msgid "" -"The physical printer(s) below is based on the preset, you are going to " -"delete." -msgstr "" +"The physical printer below is based on the preset, you are going to delete." +msgid_plural "" +"The physical printers below are based on the preset, you are going to delete." +msgstr[0] "" +msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3469 -msgid "" -"Note, that selected preset will be deleted from this/those printer(s) too." -msgstr "" +#: src/slic3r/GUI/Tab.cpp:3484 +msgid "Note, that selected preset will be deleted from this printer too." +msgid_plural "" +"Note, that selected preset will be deleted from these printers too." +msgstr[0] "" +msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3473 +#: src/slic3r/GUI/Tab.cpp:3489 msgid "" -"The physical printer(s) below is based only on the preset, you are going to " +"The physical printer below is based only on the preset, you are going to " "delete." -msgstr "" +msgid_plural "" +"The physical printers below are based only on the preset, you are going to " +"delete." +msgstr[0] "" +msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3477 +#: src/slic3r/GUI/Tab.cpp:3494 msgid "" -"Note, that this/those printer(s) will be deleted after deleting of the " -"selected preset." -msgstr "" +"Note, that this printer will be deleted after deleting of the selected " +"preset." +msgid_plural "" +"Note, that these printers will be deleted after deleting of the selected " +"preset." +msgstr[0] "" +msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3481 +#: src/slic3r/GUI/Tab.cpp:3499 msgid "Are you sure you want to %1% the selected preset?" msgstr "" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3486 +#: src/slic3r/GUI/Tab.cpp:3504 msgid "%1% Preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3567 src/slic3r/GUI/Tab.cpp:3639 +#: src/slic3r/GUI/Tab.cpp:3585 src/slic3r/GUI/Tab.cpp:3657 msgid "Set" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3703 +#: src/slic3r/GUI/Tab.cpp:3721 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3706 +#: src/slic3r/GUI/Tab.cpp:3724 msgid "" "Machine limits will NOT be emitted to G-code, however they will be used to " "estimate print time, which may therefore not be accurate as the printer may " "apply a different set of machine limits." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3710 +#: src/slic3r/GUI/Tab.cpp:3728 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3732 +#: src/slic3r/GUI/Tab.cpp:3750 msgid "LOCKED LOCK" msgstr "" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3734 +#: src/slic3r/GUI/Tab.cpp:3752 msgid "" "indicates that the settings are the same as the system (or default) values " "for the current option group" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3736 +#: src/slic3r/GUI/Tab.cpp:3754 msgid "UNLOCKED LOCK" msgstr "" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3738 +#: src/slic3r/GUI/Tab.cpp:3756 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -7150,23 +7199,23 @@ msgid "" "to the system (or default) values." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3743 +#: src/slic3r/GUI/Tab.cpp:3761 msgid "WHITE BULLET" msgstr "" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:3745 +#: src/slic3r/GUI/Tab.cpp:3763 msgid "" "for the left button: indicates a non-system (or non-default) preset,\n" "for the right button: indicates that the settings hasn't been modified." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3748 +#: src/slic3r/GUI/Tab.cpp:3766 msgid "BACK ARROW" msgstr "" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3768 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -7174,13 +7223,13 @@ msgid "" "to the last saved preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3760 +#: src/slic3r/GUI/Tab.cpp:3778 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3762 +#: src/slic3r/GUI/Tab.cpp:3780 msgid "" "UNLOCKED LOCK icon indicates that some settings were changed and are not " "equal to the system (or default) values for the current option group.\n" @@ -7188,17 +7237,17 @@ msgid "" "default) values." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3765 +#: src/slic3r/GUI/Tab.cpp:3783 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3768 +#: src/slic3r/GUI/Tab.cpp:3786 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3770 +#: src/slic3r/GUI/Tab.cpp:3788 msgid "" "BACK ARROW icon indicates that the settings were changed and are not equal " "to the last saved preset for the current option group.\n" @@ -7206,63 +7255,63 @@ msgid "" "preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3776 +#: src/slic3r/GUI/Tab.cpp:3794 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3777 +#: src/slic3r/GUI/Tab.cpp:3795 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" "Click to reset current value to the system (or default) value." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3783 +#: src/slic3r/GUI/Tab.cpp:3801 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3784 +#: src/slic3r/GUI/Tab.cpp:3802 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" "Click to reset current value to the last saved preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3928 src/slic3r/GUI/Tab.cpp:3930 +#: src/slic3r/GUI/Tab.cpp:3946 src/slic3r/GUI/Tab.cpp:3948 msgid "Material" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4052 +#: src/slic3r/GUI/Tab.cpp:4070 msgid "Support head" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4057 +#: src/slic3r/GUI/Tab.cpp:4075 msgid "Support pillar" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4080 +#: src/slic3r/GUI/Tab.cpp:4098 msgid "Connection of the support sticks and junctions" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4085 +#: src/slic3r/GUI/Tab.cpp:4103 msgid "Automatic generation" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4159 +#: src/slic3r/GUI/Tab.cpp:4177 msgid "" "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" "To enable \"%1%\", please switch off \"%2%\"" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4161 src/libslic3r/PrintConfig.cpp:3002 +#: src/slic3r/GUI/Tab.cpp:4179 src/libslic3r/PrintConfig.cpp:3091 msgid "Object elevation" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4161 src/libslic3r/PrintConfig.cpp:3104 +#: src/slic3r/GUI/Tab.cpp:4179 src/libslic3r/PrintConfig.cpp:3193 msgid "Pad around object" msgstr "" @@ -7367,35 +7416,35 @@ msgstr "" msgid "Transfer the selected options to the newly selected preset \"%1%\"." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1019 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1021 msgid "The following presets were modified:" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1024 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1026 msgid "Preset \"%1%\" has the following unsaved changes:" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1028 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1030 msgid "" "Preset \"%1%\" is not compatible with the new printer profile and it has the " "following unsaved changes:" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1029 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1031 msgid "" "Preset \"%1%\" is not compatible with the new print profile and it has the " "following unsaved changes:" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1075 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1077 msgid "Extruders count" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1197 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1199 msgid "Old value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1198 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1200 msgid "New value" msgstr "" @@ -7838,7 +7887,7 @@ msgid "" "connections. See logs for additional details." msgstr "" -#: src/slic3r/Utils/Process.cpp:151 +#: src/slic3r/Utils/Process.cpp:157 msgid "Open G-code file:" msgstr "" @@ -7860,7 +7909,7 @@ msgid "" "Try to repair the model or change its orientation on the bed." msgstr "" -#: src/libslic3r/GCode.cpp:1261 +#: src/libslic3r/GCode.cpp:1274 msgid "" "Your print is very close to the priming regions. Make sure there is no " "collision." @@ -7875,7 +7924,7 @@ msgid "" "Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1668 +#: src/libslic3r/Format/3mf.cpp:1641 msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " "compatible." @@ -8011,117 +8060,117 @@ msgstr "" msgid "write calledback failed" msgstr "" -#: src/libslic3r/Preset.cpp:1299 +#: src/libslic3r/Preset.cpp:1304 msgid "filament" msgstr "" -#: src/libslic3r/Print.cpp:1251 +#: src/libslic3r/Print.cpp:1257 msgid "All objects are outside of the print volume." msgstr "" -#: src/libslic3r/Print.cpp:1254 +#: src/libslic3r/Print.cpp:1260 msgid "The supplied settings will cause an empty print." msgstr "" -#: src/libslic3r/Print.cpp:1258 +#: src/libslic3r/Print.cpp:1264 msgid "Some objects are too close; your extruder will collide with them." msgstr "" -#: src/libslic3r/Print.cpp:1260 +#: src/libslic3r/Print.cpp:1266 msgid "" "Some objects are too tall and cannot be printed without extruder collisions." msgstr "" -#: src/libslic3r/Print.cpp:1269 +#: src/libslic3r/Print.cpp:1275 msgid "" "Only a single object may be printed at a time in Spiral Vase mode. Either " "remove all but the last object, or enable sequential mode by " "\"complete_objects\"." msgstr "" -#: src/libslic3r/Print.cpp:1277 +#: src/libslic3r/Print.cpp:1283 msgid "" "The Spiral Vase option can only be used when printing single material " "objects." msgstr "" -#: src/libslic3r/Print.cpp:1290 +#: src/libslic3r/Print.cpp:1296 msgid "" "The wipe tower is only supported if all extruders have the same nozzle " "diameter and use filaments of the same diameter." msgstr "" -#: src/libslic3r/Print.cpp:1296 +#: src/libslic3r/Print.cpp:1302 msgid "" "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter, " "RepRapFirmware and Repetier G-code flavors." msgstr "" -#: src/libslic3r/Print.cpp:1298 +#: src/libslic3r/Print.cpp:1304 msgid "" "The Wipe Tower is currently only supported with the relative extruder " "addressing (use_relative_e_distances=1)." msgstr "" -#: src/libslic3r/Print.cpp:1300 +#: src/libslic3r/Print.cpp:1306 msgid "Ooze prevention is currently not supported with the wipe tower enabled." msgstr "" -#: src/libslic3r/Print.cpp:1302 +#: src/libslic3r/Print.cpp:1308 msgid "" "The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)." msgstr "" -#: src/libslic3r/Print.cpp:1304 +#: src/libslic3r/Print.cpp:1310 msgid "" "The Wipe Tower is currently not supported for multimaterial sequential " "prints." msgstr "" -#: src/libslic3r/Print.cpp:1325 +#: src/libslic3r/Print.cpp:1331 msgid "" "The Wipe Tower is only supported for multiple objects if they have equal " "layer heights" msgstr "" -#: src/libslic3r/Print.cpp:1327 +#: src/libslic3r/Print.cpp:1333 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "over an equal number of raft layers" msgstr "" -#: src/libslic3r/Print.cpp:1329 +#: src/libslic3r/Print.cpp:1335 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "with the same support_material_contact_distance" msgstr "" -#: src/libslic3r/Print.cpp:1331 +#: src/libslic3r/Print.cpp:1337 msgid "" "The Wipe Tower is only supported for multiple objects if they are sliced " "equally." msgstr "" -#: src/libslic3r/Print.cpp:1373 +#: src/libslic3r/Print.cpp:1379 msgid "" "The Wipe tower is only supported if all objects have the same variable layer " "height" msgstr "" -#: src/libslic3r/Print.cpp:1399 +#: src/libslic3r/Print.cpp:1405 msgid "" "One or more object were assigned an extruder that the printer does not have." msgstr "" -#: src/libslic3r/Print.cpp:1408 +#: src/libslic3r/Print.cpp:1418 msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm" msgstr "" -#: src/libslic3r/Print.cpp:1411 +#: src/libslic3r/Print.cpp:1421 msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm" msgstr "" -#: src/libslic3r/Print.cpp:1422 +#: src/libslic3r/Print.cpp:1432 msgid "" "Printing with multiple extruders of differing nozzle diameters. If support " "is to be printed with the current extruder (support_material_extruder == 0 " @@ -8129,13 +8178,13 @@ msgid "" "same diameter." msgstr "" -#: src/libslic3r/Print.cpp:1430 +#: src/libslic3r/Print.cpp:1440 msgid "" "For the Wipe Tower to work with the soluble supports, the support layers " "need to be synchronized with the object layers." msgstr "" -#: src/libslic3r/Print.cpp:1434 +#: src/libslic3r/Print.cpp:1444 msgid "" "The Wipe Tower currently supports the non-soluble supports only if they are " "printed with the current extruder without triggering a tool change. (both " @@ -8143,31 +8192,31 @@ msgid "" "set to 0)." msgstr "" -#: src/libslic3r/Print.cpp:1456 +#: src/libslic3r/Print.cpp:1466 msgid "First layer height can't be greater than nozzle diameter" msgstr "" -#: src/libslic3r/Print.cpp:1461 +#: src/libslic3r/Print.cpp:1471 msgid "Layer height can't be greater than nozzle diameter" msgstr "" -#: src/libslic3r/Print.cpp:1620 +#: src/libslic3r/Print.cpp:1630 msgid "Infilling layers" msgstr "" -#: src/libslic3r/Print.cpp:1646 +#: src/libslic3r/Print.cpp:1656 msgid "Generating skirt" msgstr "" -#: src/libslic3r/Print.cpp:1655 +#: src/libslic3r/Print.cpp:1665 msgid "Generating brim" msgstr "" -#: src/libslic3r/Print.cpp:1678 +#: src/libslic3r/Print.cpp:1691 msgid "Exporting G-code" msgstr "" -#: src/libslic3r/Print.cpp:1682 +#: src/libslic3r/Print.cpp:1695 msgid "Generating G-code" msgstr "" @@ -8272,7 +8321,7 @@ msgid "" "objects printable." msgstr "" -#: src/libslic3r/PrintBase.cpp:72 +#: src/libslic3r/PrintBase.cpp:77 msgid "Failed processing of the output_filename_format template." msgstr "" @@ -8424,7 +8473,7 @@ msgstr "" msgid "mm or % (zero to disable)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:199 src/libslic3r/PrintConfig.cpp:2291 +#: src/libslic3r/PrintConfig.cpp:199 src/libslic3r/PrintConfig.cpp:2380 msgid "Other layers" msgstr "" @@ -8487,10 +8536,10 @@ msgid "" "disable acceleration control for bridges." msgstr "" -#: src/libslic3r/PrintConfig.cpp:252 src/libslic3r/PrintConfig.cpp:395 -#: src/libslic3r/PrintConfig.cpp:940 src/libslic3r/PrintConfig.cpp:1079 -#: src/libslic3r/PrintConfig.cpp:1360 src/libslic3r/PrintConfig.cpp:1409 -#: src/libslic3r/PrintConfig.cpp:1419 src/libslic3r/PrintConfig.cpp:1612 +#: src/libslic3r/PrintConfig.cpp:252 src/libslic3r/PrintConfig.cpp:420 +#: src/libslic3r/PrintConfig.cpp:965 src/libslic3r/PrintConfig.cpp:1168 +#: src/libslic3r/PrintConfig.cpp:1449 src/libslic3r/PrintConfig.cpp:1498 +#: src/libslic3r/PrintConfig.cpp:1508 src/libslic3r/PrintConfig.cpp:1701 msgid "mm/s²" msgstr "" @@ -8505,11 +8554,11 @@ msgid "" "bridges. Use 180° for zero angle." msgstr "" -#: src/libslic3r/PrintConfig.cpp:263 src/libslic3r/PrintConfig.cpp:852 -#: src/libslic3r/PrintConfig.cpp:1853 src/libslic3r/PrintConfig.cpp:1863 -#: src/libslic3r/PrintConfig.cpp:2121 src/libslic3r/PrintConfig.cpp:2276 -#: src/libslic3r/PrintConfig.cpp:2475 src/libslic3r/PrintConfig.cpp:2976 -#: src/libslic3r/PrintConfig.cpp:3097 +#: src/libslic3r/PrintConfig.cpp:263 src/libslic3r/PrintConfig.cpp:877 +#: src/libslic3r/PrintConfig.cpp:1942 src/libslic3r/PrintConfig.cpp:1952 +#: src/libslic3r/PrintConfig.cpp:2210 src/libslic3r/PrintConfig.cpp:2365 +#: src/libslic3r/PrintConfig.cpp:2564 src/libslic3r/PrintConfig.cpp:3065 +#: src/libslic3r/PrintConfig.cpp:3186 msgid "°" msgstr "" @@ -8521,11 +8570,11 @@ msgstr "" msgid "This fan speed is enforced during all bridges and overhangs." msgstr "" -#: src/libslic3r/PrintConfig.cpp:271 src/libslic3r/PrintConfig.cpp:864 -#: src/libslic3r/PrintConfig.cpp:1248 src/libslic3r/PrintConfig.cpp:1427 -#: src/libslic3r/PrintConfig.cpp:1490 src/libslic3r/PrintConfig.cpp:1745 -#: src/libslic3r/PrintConfig.cpp:2653 src/libslic3r/PrintConfig.cpp:2890 -#: src/libslic3r/PrintConfig.cpp:3016 +#: src/libslic3r/PrintConfig.cpp:271 src/libslic3r/PrintConfig.cpp:889 +#: src/libslic3r/PrintConfig.cpp:1337 src/libslic3r/PrintConfig.cpp:1516 +#: src/libslic3r/PrintConfig.cpp:1579 src/libslic3r/PrintConfig.cpp:1834 +#: src/libslic3r/PrintConfig.cpp:2742 src/libslic3r/PrintConfig.cpp:2979 +#: src/libslic3r/PrintConfig.cpp:3105 msgid "%" msgstr "" @@ -8549,17 +8598,17 @@ msgstr "" msgid "Speed for printing bridges." msgstr "" -#: src/libslic3r/PrintConfig.cpp:293 src/libslic3r/PrintConfig.cpp:671 -#: src/libslic3r/PrintConfig.cpp:679 src/libslic3r/PrintConfig.cpp:688 -#: src/libslic3r/PrintConfig.cpp:696 src/libslic3r/PrintConfig.cpp:723 -#: src/libslic3r/PrintConfig.cpp:742 src/libslic3r/PrintConfig.cpp:1015 -#: src/libslic3r/PrintConfig.cpp:1194 src/libslic3r/PrintConfig.cpp:1267 -#: src/libslic3r/PrintConfig.cpp:1343 src/libslic3r/PrintConfig.cpp:1377 -#: src/libslic3r/PrintConfig.cpp:1389 src/libslic3r/PrintConfig.cpp:1399 -#: src/libslic3r/PrintConfig.cpp:1449 src/libslic3r/PrintConfig.cpp:1508 -#: src/libslic3r/PrintConfig.cpp:1642 src/libslic3r/PrintConfig.cpp:1820 -#: src/libslic3r/PrintConfig.cpp:1829 src/libslic3r/PrintConfig.cpp:2255 -#: src/libslic3r/PrintConfig.cpp:2382 +#: src/libslic3r/PrintConfig.cpp:293 src/libslic3r/PrintConfig.cpp:696 +#: src/libslic3r/PrintConfig.cpp:704 src/libslic3r/PrintConfig.cpp:713 +#: src/libslic3r/PrintConfig.cpp:721 src/libslic3r/PrintConfig.cpp:748 +#: src/libslic3r/PrintConfig.cpp:767 src/libslic3r/PrintConfig.cpp:1104 +#: src/libslic3r/PrintConfig.cpp:1283 src/libslic3r/PrintConfig.cpp:1356 +#: src/libslic3r/PrintConfig.cpp:1432 src/libslic3r/PrintConfig.cpp:1466 +#: src/libslic3r/PrintConfig.cpp:1478 src/libslic3r/PrintConfig.cpp:1488 +#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:1597 +#: src/libslic3r/PrintConfig.cpp:1731 src/libslic3r/PrintConfig.cpp:1909 +#: src/libslic3r/PrintConfig.cpp:1918 src/libslic3r/PrintConfig.cpp:2344 +#: src/libslic3r/PrintConfig.cpp:2471 msgid "mm/s" msgstr "" @@ -8567,58 +8616,92 @@ msgstr "" msgid "Brim width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:301 +#: src/libslic3r/PrintConfig.cpp:302 msgid "" "Horizontal width of the brim that will be printed around each object on the " "first layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:308 +#: src/libslic3r/PrintConfig.cpp:309 +msgid "Brim type" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:311 +msgid "" +"The places where the brim will be printed around each object on the first " +"layer." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:317 +msgid "No brim" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:318 +msgid "Outer brim only" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:319 +msgid "Inner brim only" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:320 +msgid "Outer and inner brim" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:325 +msgid "Brim offset" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:327 +msgid "The offset of the brim from the printed object." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:333 msgid "Clip multi-part objects" msgstr "" -#: src/libslic3r/PrintConfig.cpp:309 +#: src/libslic3r/PrintConfig.cpp:334 msgid "" "When printing multi-material objects, this settings will make Slic3r to clip " "the overlapping object parts one by the other (2nd part will be clipped by " "the 1st, 3rd part will be clipped by the 1st and 2nd etc)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:316 +#: src/libslic3r/PrintConfig.cpp:341 msgid "Colorprint height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:317 +#: src/libslic3r/PrintConfig.cpp:342 msgid "Heights at which a filament change is to occur." msgstr "" -#: src/libslic3r/PrintConfig.cpp:327 +#: src/libslic3r/PrintConfig.cpp:352 msgid "Compatible printers condition" msgstr "" -#: src/libslic3r/PrintConfig.cpp:328 +#: src/libslic3r/PrintConfig.cpp:353 msgid "" "A boolean expression using the configuration values of an active printer " "profile. If this expression evaluates to true, this profile is considered " "compatible with the active printer profile." msgstr "" -#: src/libslic3r/PrintConfig.cpp:342 +#: src/libslic3r/PrintConfig.cpp:367 msgid "Compatible print profiles condition" msgstr "" -#: src/libslic3r/PrintConfig.cpp:343 +#: src/libslic3r/PrintConfig.cpp:368 msgid "" "A boolean expression using the configuration values of an active print " "profile. If this expression evaluates to true, this profile is considered " "compatible with the active print profile." msgstr "" -#: src/libslic3r/PrintConfig.cpp:360 +#: src/libslic3r/PrintConfig.cpp:385 msgid "Complete individual objects" msgstr "" -#: src/libslic3r/PrintConfig.cpp:361 +#: src/libslic3r/PrintConfig.cpp:386 msgid "" "When printing multiple objects or copies, this feature will complete each " "object before moving onto next one (and starting it from its bottom layer). " @@ -8626,97 +8709,97 @@ msgid "" "warn and prevent you from extruder collisions, but beware." msgstr "" -#: src/libslic3r/PrintConfig.cpp:369 +#: src/libslic3r/PrintConfig.cpp:394 msgid "Enable auto cooling" msgstr "" -#: src/libslic3r/PrintConfig.cpp:370 +#: src/libslic3r/PrintConfig.cpp:395 msgid "" "This flag enables the automatic cooling logic that adjusts print speed and " "fan speed according to layer printing time." msgstr "" -#: src/libslic3r/PrintConfig.cpp:375 +#: src/libslic3r/PrintConfig.cpp:400 msgid "Cooling tube position" msgstr "" -#: src/libslic3r/PrintConfig.cpp:376 +#: src/libslic3r/PrintConfig.cpp:401 msgid "Distance of the center-point of the cooling tube from the extruder tip." msgstr "" -#: src/libslic3r/PrintConfig.cpp:383 +#: src/libslic3r/PrintConfig.cpp:408 msgid "Cooling tube length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:384 +#: src/libslic3r/PrintConfig.cpp:409 msgid "Length of the cooling tube to limit space for cooling moves inside it." msgstr "" -#: src/libslic3r/PrintConfig.cpp:392 +#: src/libslic3r/PrintConfig.cpp:417 msgid "" "This is the acceleration your printer will be reset to after the role-" "specific acceleration values are used (perimeter/infill). Set zero to " "prevent resetting acceleration at all." msgstr "" -#: src/libslic3r/PrintConfig.cpp:401 +#: src/libslic3r/PrintConfig.cpp:426 msgid "Default filament profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:402 +#: src/libslic3r/PrintConfig.cpp:427 msgid "" "Default filament profile associated with the current printer profile. On " "selection of the current printer profile, this filament profile will be " "activated." msgstr "" -#: src/libslic3r/PrintConfig.cpp:408 +#: src/libslic3r/PrintConfig.cpp:433 msgid "Default print profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:409 src/libslic3r/PrintConfig.cpp:2820 -#: src/libslic3r/PrintConfig.cpp:2831 +#: src/libslic3r/PrintConfig.cpp:434 src/libslic3r/PrintConfig.cpp:2909 +#: src/libslic3r/PrintConfig.cpp:2920 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " "activated." msgstr "" -#: src/libslic3r/PrintConfig.cpp:415 +#: src/libslic3r/PrintConfig.cpp:440 msgid "Disable fan for the first" msgstr "" -#: src/libslic3r/PrintConfig.cpp:416 +#: src/libslic3r/PrintConfig.cpp:441 msgid "" "You can set this to a positive value to disable fan at all during the first " "layers, so that it does not make adhesion worse." msgstr "" -#: src/libslic3r/PrintConfig.cpp:425 +#: src/libslic3r/PrintConfig.cpp:450 msgid "Don't support bridges" msgstr "" -#: src/libslic3r/PrintConfig.cpp:427 +#: src/libslic3r/PrintConfig.cpp:452 msgid "" "Experimental option for preventing support material from being generated " "under bridged areas." msgstr "" -#: src/libslic3r/PrintConfig.cpp:433 +#: src/libslic3r/PrintConfig.cpp:458 msgid "Distance between copies" msgstr "" -#: src/libslic3r/PrintConfig.cpp:434 +#: src/libslic3r/PrintConfig.cpp:459 msgid "Distance used for the auto-arrange feature of the plater." msgstr "" -#: src/libslic3r/PrintConfig.cpp:442 +#: src/libslic3r/PrintConfig.cpp:467 msgid "" "This end procedure is inserted at the end of the output file. Note that you " "can use placeholder variables for all PrusaSlicer settings." msgstr "" -#: src/libslic3r/PrintConfig.cpp:452 +#: src/libslic3r/PrintConfig.cpp:477 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 " @@ -8725,70 +8808,70 @@ msgid "" "in extruder order." msgstr "" -#: src/libslic3r/PrintConfig.cpp:463 +#: src/libslic3r/PrintConfig.cpp:488 msgid "Ensure vertical shell thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:465 +#: src/libslic3r/PrintConfig.cpp:490 msgid "" "Add solid infill near sloping surfaces to guarantee the vertical shell " "thickness (top+bottom solid layers)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:471 +#: src/libslic3r/PrintConfig.cpp:496 msgid "Top fill pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:473 +#: src/libslic3r/PrintConfig.cpp:498 msgid "" "Fill pattern for top infill. This only affects the top visible layer, and " "not its adjacent solid shells." msgstr "" -#: src/libslic3r/PrintConfig.cpp:483 src/libslic3r/PrintConfig.cpp:918 -#: src/libslic3r/PrintConfig.cpp:2236 +#: src/libslic3r/PrintConfig.cpp:508 src/libslic3r/PrintConfig.cpp:943 +#: src/libslic3r/PrintConfig.cpp:2325 msgid "Rectilinear" msgstr "" -#: src/libslic3r/PrintConfig.cpp:484 +#: src/libslic3r/PrintConfig.cpp:509 msgid "Monotonic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:485 src/libslic3r/PrintConfig.cpp:919 +#: src/libslic3r/PrintConfig.cpp:510 src/libslic3r/PrintConfig.cpp:944 msgid "Aligned Rectilinear" msgstr "" -#: src/libslic3r/PrintConfig.cpp:486 src/libslic3r/PrintConfig.cpp:925 +#: src/libslic3r/PrintConfig.cpp:511 src/libslic3r/PrintConfig.cpp:950 msgid "Concentric" msgstr "" -#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:929 +#: src/libslic3r/PrintConfig.cpp:512 src/libslic3r/PrintConfig.cpp:954 msgid "Hilbert Curve" msgstr "" -#: src/libslic3r/PrintConfig.cpp:488 src/libslic3r/PrintConfig.cpp:930 +#: src/libslic3r/PrintConfig.cpp:513 src/libslic3r/PrintConfig.cpp:955 msgid "Archimedean Chords" msgstr "" -#: src/libslic3r/PrintConfig.cpp:489 src/libslic3r/PrintConfig.cpp:931 +#: src/libslic3r/PrintConfig.cpp:514 src/libslic3r/PrintConfig.cpp:956 msgid "Octagram Spiral" msgstr "" -#: src/libslic3r/PrintConfig.cpp:495 +#: src/libslic3r/PrintConfig.cpp:520 msgid "Bottom fill pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:497 +#: src/libslic3r/PrintConfig.cpp:522 msgid "" "Fill pattern for bottom infill. This only affects the bottom external " "visible layer, and not its adjacent solid shells." msgstr "" -#: src/libslic3r/PrintConfig.cpp:506 src/libslic3r/PrintConfig.cpp:517 +#: src/libslic3r/PrintConfig.cpp:531 src/libslic3r/PrintConfig.cpp:542 msgid "External perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:508 +#: src/libslic3r/PrintConfig.cpp:533 msgid "" "Set this to a non-zero value to set a manual extrusion width for external " "perimeters. If left zero, default extrusion width will be used if set, " @@ -8796,43 +8879,43 @@ msgid "" "(for example 200%), it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:511 src/libslic3r/PrintConfig.cpp:621 -#: src/libslic3r/PrintConfig.cpp:962 src/libslic3r/PrintConfig.cpp:975 -#: src/libslic3r/PrintConfig.cpp:1104 src/libslic3r/PrintConfig.cpp:1159 -#: src/libslic3r/PrintConfig.cpp:1185 src/libslic3r/PrintConfig.cpp:1632 -#: src/libslic3r/PrintConfig.cpp:1961 src/libslic3r/PrintConfig.cpp:2110 -#: src/libslic3r/PrintConfig.cpp:2178 src/libslic3r/PrintConfig.cpp:2339 +#: src/libslic3r/PrintConfig.cpp:536 src/libslic3r/PrintConfig.cpp:646 +#: src/libslic3r/PrintConfig.cpp:987 src/libslic3r/PrintConfig.cpp:1000 +#: src/libslic3r/PrintConfig.cpp:1193 src/libslic3r/PrintConfig.cpp:1248 +#: src/libslic3r/PrintConfig.cpp:1274 src/libslic3r/PrintConfig.cpp:1721 +#: src/libslic3r/PrintConfig.cpp:2050 src/libslic3r/PrintConfig.cpp:2199 +#: src/libslic3r/PrintConfig.cpp:2267 src/libslic3r/PrintConfig.cpp:2428 msgid "mm or %" msgstr "" -#: src/libslic3r/PrintConfig.cpp:519 +#: src/libslic3r/PrintConfig.cpp:544 msgid "" "This separate setting will affect the speed of external perimeters (the " "visible ones). If expressed as percentage (for example: 80%) it will be " "calculated on the perimeters speed setting above. Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:522 src/libslic3r/PrintConfig.cpp:984 -#: src/libslic3r/PrintConfig.cpp:1920 src/libslic3r/PrintConfig.cpp:1972 -#: src/libslic3r/PrintConfig.cpp:2222 src/libslic3r/PrintConfig.cpp:2352 +#: src/libslic3r/PrintConfig.cpp:547 src/libslic3r/PrintConfig.cpp:1009 +#: src/libslic3r/PrintConfig.cpp:2009 src/libslic3r/PrintConfig.cpp:2061 +#: src/libslic3r/PrintConfig.cpp:2311 src/libslic3r/PrintConfig.cpp:2441 msgid "mm/s or %" msgstr "" -#: src/libslic3r/PrintConfig.cpp:529 +#: src/libslic3r/PrintConfig.cpp:554 msgid "External perimeters first" msgstr "" -#: src/libslic3r/PrintConfig.cpp:531 +#: src/libslic3r/PrintConfig.cpp:556 msgid "" "Print contour perimeters from the outermost one to the innermost one instead " "of the default inverse order." msgstr "" -#: src/libslic3r/PrintConfig.cpp:537 +#: src/libslic3r/PrintConfig.cpp:562 msgid "Extra perimeters if needed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:539 +#: src/libslic3r/PrintConfig.cpp:564 #, possible-c-format msgid "" "Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r " @@ -8840,14 +8923,14 @@ msgid "" "is supported." msgstr "" -#: src/libslic3r/PrintConfig.cpp:549 +#: src/libslic3r/PrintConfig.cpp:574 msgid "" "The extruder to use (unless more specific extruder settings are specified). " "This value overrides perimeter and infill extruders, but not the support " "extruders." msgstr "" -#: src/libslic3r/PrintConfig.cpp:561 +#: src/libslic3r/PrintConfig.cpp:586 msgid "" "Set this to the vertical distance between your nozzle tip and (usually) the " "X carriage rods. In other words, this is the height of the clearance " @@ -8855,26 +8938,26 @@ msgid "" "extruder can peek before colliding with other printed objects." msgstr "" -#: src/libslic3r/PrintConfig.cpp:572 +#: src/libslic3r/PrintConfig.cpp:597 msgid "" "Set this to the clearance radius around your extruder. If the extruder is " "not centered, choose the largest value for safety. This setting is used to " "check for collisions and to display the graphical preview in the plater." msgstr "" -#: src/libslic3r/PrintConfig.cpp:582 +#: src/libslic3r/PrintConfig.cpp:607 msgid "Extruder Color" msgstr "" -#: src/libslic3r/PrintConfig.cpp:583 src/libslic3r/PrintConfig.cpp:645 +#: src/libslic3r/PrintConfig.cpp:608 src/libslic3r/PrintConfig.cpp:670 msgid "This is only used in the Slic3r interface as a visual help." msgstr "" -#: src/libslic3r/PrintConfig.cpp:589 +#: src/libslic3r/PrintConfig.cpp:614 msgid "Extruder offset" msgstr "" -#: src/libslic3r/PrintConfig.cpp:590 +#: src/libslic3r/PrintConfig.cpp:615 msgid "" "If your firmware doesn't handle the extruder displacement you need the G-" "code to take it into account. This option lets you specify the displacement " @@ -8882,21 +8965,21 @@ msgid "" "coordinates (they will be subtracted from the XY coordinate)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:599 +#: src/libslic3r/PrintConfig.cpp:624 msgid "Extrusion axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:600 +#: src/libslic3r/PrintConfig.cpp:625 msgid "" "Use this option to set the axis letter associated to your printer's extruder " "(usually E but some printers use A)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:605 +#: src/libslic3r/PrintConfig.cpp:630 msgid "Extrusion multiplier" msgstr "" -#: src/libslic3r/PrintConfig.cpp:606 +#: src/libslic3r/PrintConfig.cpp:631 msgid "" "This factor changes the amount of flow proportionally. You may need to tweak " "this setting to get nice surface finish and correct single wall widths. " @@ -8904,11 +8987,11 @@ msgid "" "more, check filament diameter and your firmware E steps." msgstr "" -#: src/libslic3r/PrintConfig.cpp:615 +#: src/libslic3r/PrintConfig.cpp:640 msgid "Default extrusion width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:617 +#: src/libslic3r/PrintConfig.cpp:642 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 " @@ -8917,123 +9000,123 @@ msgid "" "height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:628 +#: src/libslic3r/PrintConfig.cpp:653 msgid "Keep fan always on" msgstr "" -#: src/libslic3r/PrintConfig.cpp:629 +#: src/libslic3r/PrintConfig.cpp:654 msgid "" "If this is enabled, fan will never be disabled and will be kept running at " "least at its minimum speed. Useful for PLA, harmful for ABS." msgstr "" -#: src/libslic3r/PrintConfig.cpp:634 +#: src/libslic3r/PrintConfig.cpp:659 msgid "Enable fan if layer print time is below" msgstr "" -#: src/libslic3r/PrintConfig.cpp:635 +#: src/libslic3r/PrintConfig.cpp:660 msgid "" "If layer print time is estimated below this number of seconds, fan will be " "enabled and its speed will be calculated by interpolating the minimum and " "maximum speeds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:637 src/libslic3r/PrintConfig.cpp:1908 +#: src/libslic3r/PrintConfig.cpp:662 src/libslic3r/PrintConfig.cpp:1997 msgid "approximate seconds" msgstr "" -#: src/libslic3r/PrintConfig.cpp:644 +#: src/libslic3r/PrintConfig.cpp:669 msgid "Color" msgstr "" -#: src/libslic3r/PrintConfig.cpp:650 +#: src/libslic3r/PrintConfig.cpp:675 msgid "Filament notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:651 +#: src/libslic3r/PrintConfig.cpp:676 msgid "You can put your notes regarding the filament here." msgstr "" -#: src/libslic3r/PrintConfig.cpp:659 src/libslic3r/PrintConfig.cpp:1455 +#: src/libslic3r/PrintConfig.cpp:684 src/libslic3r/PrintConfig.cpp:1544 msgid "Max volumetric speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:660 +#: src/libslic3r/PrintConfig.cpp:685 msgid "" "Maximum volumetric speed allowed for this filament. Limits the maximum " "volumetric speed of a print to the minimum of print and filament volumetric " "speed. Set to zero for no limit." msgstr "" -#: src/libslic3r/PrintConfig.cpp:669 +#: src/libslic3r/PrintConfig.cpp:694 msgid "Loading speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:670 +#: src/libslic3r/PrintConfig.cpp:695 msgid "Speed used for loading the filament on the wipe tower." msgstr "" -#: src/libslic3r/PrintConfig.cpp:677 +#: src/libslic3r/PrintConfig.cpp:702 msgid "Loading speed at the start" msgstr "" -#: src/libslic3r/PrintConfig.cpp:678 +#: src/libslic3r/PrintConfig.cpp:703 msgid "Speed used at the very beginning of loading phase." msgstr "" -#: src/libslic3r/PrintConfig.cpp:685 +#: src/libslic3r/PrintConfig.cpp:710 msgid "Unloading speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:686 +#: src/libslic3r/PrintConfig.cpp:711 msgid "" "Speed used for unloading the filament on the wipe tower (does not affect " "initial part of unloading just after ramming)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:694 +#: src/libslic3r/PrintConfig.cpp:719 msgid "Unloading speed at the start" msgstr "" -#: src/libslic3r/PrintConfig.cpp:695 +#: src/libslic3r/PrintConfig.cpp:720 msgid "" "Speed used for unloading the tip of the filament immediately after ramming." msgstr "" -#: src/libslic3r/PrintConfig.cpp:702 +#: src/libslic3r/PrintConfig.cpp:727 msgid "Delay after unloading" msgstr "" -#: src/libslic3r/PrintConfig.cpp:703 +#: src/libslic3r/PrintConfig.cpp:728 msgid "" "Time to wait after the filament is unloaded. May help to get reliable " "toolchanges with flexible materials that may need more time to shrink to " "original dimensions." msgstr "" -#: src/libslic3r/PrintConfig.cpp:712 +#: src/libslic3r/PrintConfig.cpp:737 msgid "Number of cooling moves" msgstr "" -#: src/libslic3r/PrintConfig.cpp:713 +#: src/libslic3r/PrintConfig.cpp:738 msgid "" "Filament is cooled by being moved back and forth in the cooling tubes. " "Specify desired number of these moves." msgstr "" -#: src/libslic3r/PrintConfig.cpp:721 +#: src/libslic3r/PrintConfig.cpp:746 msgid "Speed of the first cooling move" msgstr "" -#: src/libslic3r/PrintConfig.cpp:722 +#: src/libslic3r/PrintConfig.cpp:747 msgid "Cooling moves are gradually accelerating beginning at this speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:729 +#: src/libslic3r/PrintConfig.cpp:754 msgid "Minimal purge on wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:730 +#: src/libslic3r/PrintConfig.cpp:755 msgid "" "After a tool change, the exact position of the newly loaded filament inside " "the nozzle may not be known, and the filament pressure is likely not yet " @@ -9042,63 +9125,63 @@ msgid "" "to produce successive infill or sacrificial object extrusions reliably." msgstr "" -#: src/libslic3r/PrintConfig.cpp:734 +#: src/libslic3r/PrintConfig.cpp:759 msgid "mm³" msgstr "" -#: src/libslic3r/PrintConfig.cpp:740 +#: src/libslic3r/PrintConfig.cpp:765 msgid "Speed of the last cooling move" msgstr "" -#: src/libslic3r/PrintConfig.cpp:741 +#: src/libslic3r/PrintConfig.cpp:766 msgid "Cooling moves are gradually accelerating towards this speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:748 +#: src/libslic3r/PrintConfig.cpp:773 msgid "Filament load time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:749 +#: src/libslic3r/PrintConfig.cpp:774 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to load a new " "filament during a tool change (when executing the T code). This time is " "added to the total print time by the G-code time estimator." msgstr "" -#: src/libslic3r/PrintConfig.cpp:756 +#: src/libslic3r/PrintConfig.cpp:781 msgid "Ramming parameters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:757 +#: src/libslic3r/PrintConfig.cpp:782 msgid "" "This string is edited by RammingDialog and contains ramming specific " "parameters." msgstr "" -#: src/libslic3r/PrintConfig.cpp:763 +#: src/libslic3r/PrintConfig.cpp:788 msgid "Filament unload time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:764 +#: src/libslic3r/PrintConfig.cpp:789 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to unload a " "filament during a tool change (when executing the T code). This time is " "added to the total print time by the G-code time estimator." msgstr "" -#: src/libslic3r/PrintConfig.cpp:772 +#: src/libslic3r/PrintConfig.cpp:797 msgid "" "Enter your filament diameter here. Good precision is required, so use a " "caliper and do multiple measurements along the filament, then compute the " "average." msgstr "" -#: src/libslic3r/PrintConfig.cpp:779 src/libslic3r/PrintConfig.cpp:2731 -#: src/libslic3r/PrintConfig.cpp:2732 +#: src/libslic3r/PrintConfig.cpp:804 src/libslic3r/PrintConfig.cpp:2820 +#: src/libslic3r/PrintConfig.cpp:2821 msgid "Density" msgstr "" -#: src/libslic3r/PrintConfig.cpp:780 +#: src/libslic3r/PrintConfig.cpp:805 msgid "" "Enter your filament density here. This is only for statistical information. " "A decent way is to weigh a known length of filament and compute the ratio of " @@ -9106,41 +9189,41 @@ msgid "" "displacement." msgstr "" -#: src/libslic3r/PrintConfig.cpp:783 +#: src/libslic3r/PrintConfig.cpp:808 msgid "g/cm³" msgstr "" -#: src/libslic3r/PrintConfig.cpp:788 +#: src/libslic3r/PrintConfig.cpp:813 msgid "Filament type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:789 +#: src/libslic3r/PrintConfig.cpp:814 msgid "The filament material type for use in custom G-codes." msgstr "" -#: src/libslic3r/PrintConfig.cpp:816 +#: src/libslic3r/PrintConfig.cpp:841 msgid "Soluble material" msgstr "" -#: src/libslic3r/PrintConfig.cpp:817 +#: src/libslic3r/PrintConfig.cpp:842 msgid "Soluble material is most likely used for a soluble support." msgstr "" -#: src/libslic3r/PrintConfig.cpp:823 +#: src/libslic3r/PrintConfig.cpp:848 msgid "" "Enter your filament cost per kg here. This is only for statistical " "information." msgstr "" -#: src/libslic3r/PrintConfig.cpp:824 +#: src/libslic3r/PrintConfig.cpp:849 msgid "money/kg" msgstr "" -#: src/libslic3r/PrintConfig.cpp:829 +#: src/libslic3r/PrintConfig.cpp:854 msgid "Spool weight" msgstr "" -#: src/libslic3r/PrintConfig.cpp:830 +#: src/libslic3r/PrintConfig.cpp:855 msgid "" "Enter weight of the empty filament spool. One may weigh a partially consumed " "filament spool before printing and one may compare the measured weight with " @@ -9148,103 +9231,103 @@ msgid "" "amount of filament on the spool is sufficient to finish the print." msgstr "" -#: src/libslic3r/PrintConfig.cpp:834 +#: src/libslic3r/PrintConfig.cpp:859 msgid "g" msgstr "" -#: src/libslic3r/PrintConfig.cpp:843 src/libslic3r/PrintConfig.cpp:2815 +#: src/libslic3r/PrintConfig.cpp:868 src/libslic3r/PrintConfig.cpp:2904 msgid "(Unknown)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:847 +#: src/libslic3r/PrintConfig.cpp:872 msgid "Fill angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:849 +#: src/libslic3r/PrintConfig.cpp:874 msgid "" "Default base angle for infill orientation. Cross-hatching will be applied to " "this. Bridges will be infilled using the best direction Slic3r can detect, " "so this setting does not affect them." msgstr "" -#: src/libslic3r/PrintConfig.cpp:861 +#: src/libslic3r/PrintConfig.cpp:886 msgid "Fill density" msgstr "" -#: src/libslic3r/PrintConfig.cpp:863 +#: src/libslic3r/PrintConfig.cpp:888 msgid "Density of internal infill, expressed in the range 0% - 100%." msgstr "" -#: src/libslic3r/PrintConfig.cpp:898 +#: src/libslic3r/PrintConfig.cpp:923 msgid "Fill pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:900 +#: src/libslic3r/PrintConfig.cpp:925 msgid "Fill pattern for general low-density infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:920 +#: src/libslic3r/PrintConfig.cpp:945 msgid "Grid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:921 +#: src/libslic3r/PrintConfig.cpp:946 msgid "Triangles" msgstr "" -#: src/libslic3r/PrintConfig.cpp:922 +#: src/libslic3r/PrintConfig.cpp:947 msgid "Stars" msgstr "" -#: src/libslic3r/PrintConfig.cpp:923 +#: src/libslic3r/PrintConfig.cpp:948 msgid "Cubic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:924 +#: src/libslic3r/PrintConfig.cpp:949 msgid "Line" msgstr "" -#: src/libslic3r/PrintConfig.cpp:926 src/libslic3r/PrintConfig.cpp:2238 +#: src/libslic3r/PrintConfig.cpp:951 src/libslic3r/PrintConfig.cpp:2327 msgid "Honeycomb" msgstr "" -#: src/libslic3r/PrintConfig.cpp:927 +#: src/libslic3r/PrintConfig.cpp:952 msgid "3D Honeycomb" msgstr "" -#: src/libslic3r/PrintConfig.cpp:928 +#: src/libslic3r/PrintConfig.cpp:953 msgid "Gyroid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:932 +#: src/libslic3r/PrintConfig.cpp:957 msgid "Adaptive Cubic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:933 +#: src/libslic3r/PrintConfig.cpp:958 msgid "Support Cubic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:937 src/libslic3r/PrintConfig.cpp:946 -#: src/libslic3r/PrintConfig.cpp:956 src/libslic3r/PrintConfig.cpp:990 +#: src/libslic3r/PrintConfig.cpp:962 src/libslic3r/PrintConfig.cpp:971 +#: src/libslic3r/PrintConfig.cpp:981 src/libslic3r/PrintConfig.cpp:1015 msgid "First layer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:938 +#: src/libslic3r/PrintConfig.cpp:963 msgid "" "This is the acceleration your printer will use for first layer. Set zero to " "disable acceleration control for first layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:947 +#: src/libslic3r/PrintConfig.cpp:972 msgid "First layer bed temperature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:948 +#: src/libslic3r/PrintConfig.cpp:973 msgid "" "Heated build plate temperature for the first layer. Set this to zero to " "disable bed temperature control commands in the output." msgstr "" -#: src/libslic3r/PrintConfig.cpp:958 +#: src/libslic3r/PrintConfig.cpp:983 msgid "" "Set this to a non-zero value to set a manual extrusion width for first " "layer. You can use this to force fatter extrudates for better adhesion. If " @@ -9252,7 +9335,7 @@ msgid "" "layer height. If set to zero, it will use the default extrusion width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:971 +#: src/libslic3r/PrintConfig.cpp:996 msgid "" "When printing with very low layer heights, you might still want to print a " "thicker bottom layer to improve adhesion and tolerance for non perfect build " @@ -9260,33 +9343,33 @@ msgid "" "example: 150%) over the default layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:980 +#: src/libslic3r/PrintConfig.cpp:1005 msgid "First layer speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:981 +#: src/libslic3r/PrintConfig.cpp:1006 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first layer, regardless of their type. If expressed " "as a percentage (for example: 40%) it will scale the default speeds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:991 +#: src/libslic3r/PrintConfig.cpp:1016 msgid "First layer nozzle temperature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:992 +#: src/libslic3r/PrintConfig.cpp:1017 msgid "" "Nozzle temperature for the first layer. If you want to control temperature " "manually during print, set this to zero to disable temperature control " "commands in the output G-code." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1000 +#: src/libslic3r/PrintConfig.cpp:1025 msgid "Full fan speed at layer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1001 +#: src/libslic3r/PrintConfig.cpp:1026 msgid "" "Fan speed will be ramped up linearly from zero at layer " "\"disable_fan_first_layers\" to maximum at layer \"full_fan_speed_layer\". " @@ -9295,29 +9378,62 @@ msgid "" "maximum allowed speed at layer \"disable_fan_first_layers\" + 1." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1013 +#: src/libslic3r/PrintConfig.cpp:1036 +msgid "Fuzzy skin perimeter mode" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1037 src/libslic3r/PrintConfig.cpp:1083 +#: src/libslic3r/PrintConfig.cpp:1092 +msgid "Fuzzy Skin" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1038 +msgid "Fuzzy skin perimeter mode." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1046 +msgid "External" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1047 +msgid "External (skip first layer)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1048 +msgid "All perimeters" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1082 +msgid "Fuzzy skin thickness" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1091 +msgid "Fuzzy skin point distance" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1102 msgid "" "Speed for filling small gaps using short zigzag moves. Keep this reasonably " "low to avoid too much shaking and resonance issues. Set zero to disable gaps " "filling." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1021 +#: src/libslic3r/PrintConfig.cpp:1110 msgid "Verbose G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1022 +#: src/libslic3r/PrintConfig.cpp:1111 msgid "" "Enable this to get a commented G-code file, with each line explained by a " "descriptive text. If you print from SD card, the additional weight of the " "file could make your firmware slow down." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1029 +#: src/libslic3r/PrintConfig.cpp:1118 msgid "G-code flavor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1030 +#: src/libslic3r/PrintConfig.cpp:1119 msgid "" "Some G/M-code commands, including temperature control and others, are not " "universal. Set this option to your printer's firmware to get a compatible " @@ -9325,15 +9441,15 @@ msgid "" "extrusion value at all." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1055 +#: src/libslic3r/PrintConfig.cpp:1144 msgid "No extrusion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1060 +#: src/libslic3r/PrintConfig.cpp:1149 msgid "Label objects" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1061 +#: src/libslic3r/PrintConfig.cpp:1150 msgid "" "Enable this to add comments into the G-Code labeling print moves with what " "object they belong to, which is useful for the Octoprint CancelObject " @@ -9341,42 +9457,42 @@ msgid "" "setup and Wipe into Object / Wipe into Infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1068 +#: src/libslic3r/PrintConfig.cpp:1157 msgid "High extruder current on filament swap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1069 +#: src/libslic3r/PrintConfig.cpp:1158 msgid "" "It may be beneficial to increase the extruder motor current during the " "filament exchange sequence to allow for rapid ramming feed rates and to " "overcome resistance when loading a filament with an ugly shaped tip." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1077 +#: src/libslic3r/PrintConfig.cpp:1166 msgid "" "This is the acceleration your printer will use for infill. Set zero to " "disable acceleration control for infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1085 +#: src/libslic3r/PrintConfig.cpp:1174 msgid "Combine infill every" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1087 +#: src/libslic3r/PrintConfig.cpp:1176 msgid "" "This feature allows to combine infill and speed up your print by extruding " "thicker infill layers while preserving thin perimeters, thus accuracy." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1090 +#: src/libslic3r/PrintConfig.cpp:1179 msgid "Combine infill every n layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1096 +#: src/libslic3r/PrintConfig.cpp:1185 msgid "Length of the infill anchor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1098 +#: src/libslic3r/PrintConfig.cpp:1187 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " "additional perimeter. If expressed as percentage (example: 15%) it is " @@ -9389,19 +9505,19 @@ msgid "" "perimeters connected to a single infill line." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1113 +#: src/libslic3r/PrintConfig.cpp:1202 msgid "0 (no open anchors)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1118 src/libslic3r/PrintConfig.cpp:1140 +#: src/libslic3r/PrintConfig.cpp:1207 src/libslic3r/PrintConfig.cpp:1229 msgid "1000 (unlimited)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1123 +#: src/libslic3r/PrintConfig.cpp:1212 msgid "Maximum length of the infill anchor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1125 +#: src/libslic3r/PrintConfig.cpp:1214 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " "additional perimeter. If expressed as percentage (example: 15%) it is " @@ -9413,19 +9529,19 @@ msgid "" "parameter. Set this parameter to zero to disable anchoring." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1135 +#: src/libslic3r/PrintConfig.cpp:1224 msgid "0 (not anchored)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1145 +#: src/libslic3r/PrintConfig.cpp:1234 msgid "Infill extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1147 +#: src/libslic3r/PrintConfig.cpp:1236 msgid "The extruder to use when printing infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1155 +#: src/libslic3r/PrintConfig.cpp:1244 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill. If " "left zero, default extrusion width will be used if set, otherwise 1.125 x " @@ -9434,32 +9550,32 @@ msgid "" "example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1165 +#: src/libslic3r/PrintConfig.cpp:1254 msgid "Infill before perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1166 +#: src/libslic3r/PrintConfig.cpp:1255 msgid "" "This option will switch the print order of perimeters and infill, making the " "latter first." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1171 +#: src/libslic3r/PrintConfig.cpp:1260 msgid "Only infill where needed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1173 +#: src/libslic3r/PrintConfig.cpp:1262 msgid "" "This option will limit infill to the areas actually needed for supporting " "ceilings (it will act as internal support material). If enabled, slows down " "the G-code generation due to the multiple checks involved." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1180 +#: src/libslic3r/PrintConfig.cpp:1269 msgid "Infill/perimeters overlap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1182 +#: src/libslic3r/PrintConfig.cpp:1271 msgid "" "This setting applies an additional overlap between infill and perimeters for " "better bonding. Theoretically this shouldn't be needed, but backlash might " @@ -9467,71 +9583,71 @@ msgid "" "perimeter extrusion width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1193 +#: src/libslic3r/PrintConfig.cpp:1282 msgid "Speed for printing the internal fill. Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1201 +#: src/libslic3r/PrintConfig.cpp:1290 msgid "Inherits profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1202 +#: src/libslic3r/PrintConfig.cpp:1291 msgid "Name of the profile, from which this profile inherits." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1215 +#: src/libslic3r/PrintConfig.cpp:1304 msgid "Interface shells" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1216 +#: src/libslic3r/PrintConfig.cpp:1305 msgid "" "Force the generation of solid shells between adjacent materials/volumes. " "Useful for multi-extruder prints with translucent materials or manual " "soluble support material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1224 +#: src/libslic3r/PrintConfig.cpp:1313 msgid "Enable ironing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1225 +#: src/libslic3r/PrintConfig.cpp:1314 msgid "" "Enable ironing of the top layers with the hot print head for smooth surface" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1231 src/libslic3r/PrintConfig.cpp:1233 +#: src/libslic3r/PrintConfig.cpp:1320 src/libslic3r/PrintConfig.cpp:1322 msgid "Ironing Type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1238 +#: src/libslic3r/PrintConfig.cpp:1327 msgid "All top surfaces" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1239 +#: src/libslic3r/PrintConfig.cpp:1328 msgid "Topmost surface only" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1240 +#: src/libslic3r/PrintConfig.cpp:1329 msgid "All solid surfaces" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1245 +#: src/libslic3r/PrintConfig.cpp:1334 msgid "Flow rate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1247 +#: src/libslic3r/PrintConfig.cpp:1336 msgid "Percent of a flow rate relative to object's normal layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1255 +#: src/libslic3r/PrintConfig.cpp:1344 msgid "Spacing between ironing passes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1257 +#: src/libslic3r/PrintConfig.cpp:1346 msgid "Distance between ironing lines" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1274 +#: src/libslic3r/PrintConfig.cpp:1363 msgid "" "This custom code is inserted at every layer change, right after the Z move " "and before the extruder moves to the first layer point. Note that you can " @@ -9539,11 +9655,11 @@ msgid "" "[layer_z]." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1285 +#: src/libslic3r/PrintConfig.cpp:1374 msgid "Supports remaining times" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1286 +#: src/libslic3r/PrintConfig.cpp:1375 msgid "" "Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute " "intervals into the G-code to let the firmware show accurate remaining time. " @@ -9551,175 +9667,175 @@ msgid "" "firmware supports M73 Qxx Sxx for the silent mode." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1294 +#: src/libslic3r/PrintConfig.cpp:1383 msgid "Supports stealth mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1295 +#: src/libslic3r/PrintConfig.cpp:1384 msgid "The firmware supports stealth mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1300 +#: src/libslic3r/PrintConfig.cpp:1389 msgid "How to apply limits" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1301 +#: src/libslic3r/PrintConfig.cpp:1390 msgid "Purpose of Machine Limits" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1303 +#: src/libslic3r/PrintConfig.cpp:1392 msgid "How to apply the Machine Limits" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1308 +#: src/libslic3r/PrintConfig.cpp:1397 msgid "Emit to G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1309 +#: src/libslic3r/PrintConfig.cpp:1398 msgid "Use for time estimate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1310 +#: src/libslic3r/PrintConfig.cpp:1399 msgid "Ignore" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1333 +#: src/libslic3r/PrintConfig.cpp:1422 msgid "Maximum feedrate X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1334 +#: src/libslic3r/PrintConfig.cpp:1423 msgid "Maximum feedrate Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1335 +#: src/libslic3r/PrintConfig.cpp:1424 msgid "Maximum feedrate Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1336 +#: src/libslic3r/PrintConfig.cpp:1425 msgid "Maximum feedrate E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1339 +#: src/libslic3r/PrintConfig.cpp:1428 msgid "Maximum feedrate of the X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1340 +#: src/libslic3r/PrintConfig.cpp:1429 msgid "Maximum feedrate of the Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1341 +#: src/libslic3r/PrintConfig.cpp:1430 msgid "Maximum feedrate of the Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1342 +#: src/libslic3r/PrintConfig.cpp:1431 msgid "Maximum feedrate of the E axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1350 +#: src/libslic3r/PrintConfig.cpp:1439 msgid "Maximum acceleration X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1351 +#: src/libslic3r/PrintConfig.cpp:1440 msgid "Maximum acceleration Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1352 +#: src/libslic3r/PrintConfig.cpp:1441 msgid "Maximum acceleration Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1353 +#: src/libslic3r/PrintConfig.cpp:1442 msgid "Maximum acceleration E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1356 +#: src/libslic3r/PrintConfig.cpp:1445 msgid "Maximum acceleration of the X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1357 +#: src/libslic3r/PrintConfig.cpp:1446 msgid "Maximum acceleration of the Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1358 +#: src/libslic3r/PrintConfig.cpp:1447 msgid "Maximum acceleration of the Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1359 +#: src/libslic3r/PrintConfig.cpp:1448 msgid "Maximum acceleration of the E axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1367 +#: src/libslic3r/PrintConfig.cpp:1456 msgid "Maximum jerk X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1368 +#: src/libslic3r/PrintConfig.cpp:1457 msgid "Maximum jerk Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1369 +#: src/libslic3r/PrintConfig.cpp:1458 msgid "Maximum jerk Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1370 +#: src/libslic3r/PrintConfig.cpp:1459 msgid "Maximum jerk E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1373 +#: src/libslic3r/PrintConfig.cpp:1462 msgid "Maximum jerk of the X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1374 +#: src/libslic3r/PrintConfig.cpp:1463 msgid "Maximum jerk of the Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1375 +#: src/libslic3r/PrintConfig.cpp:1464 msgid "Maximum jerk of the Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1376 +#: src/libslic3r/PrintConfig.cpp:1465 msgid "Maximum jerk of the E axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1386 +#: src/libslic3r/PrintConfig.cpp:1475 msgid "Minimum feedrate when extruding" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1388 +#: src/libslic3r/PrintConfig.cpp:1477 msgid "Minimum feedrate when extruding (M205 S)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1396 +#: src/libslic3r/PrintConfig.cpp:1485 msgid "Minimum travel feedrate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1398 +#: src/libslic3r/PrintConfig.cpp:1487 msgid "Minimum travel feedrate (M205 T)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1406 +#: src/libslic3r/PrintConfig.cpp:1495 msgid "Maximum acceleration when extruding" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1408 +#: src/libslic3r/PrintConfig.cpp:1497 msgid "Maximum acceleration when extruding (M204 S)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1416 +#: src/libslic3r/PrintConfig.cpp:1505 msgid "Maximum acceleration when retracting" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1418 +#: src/libslic3r/PrintConfig.cpp:1507 msgid "Maximum acceleration when retracting (M204 T)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1425 src/libslic3r/PrintConfig.cpp:1434 +#: src/libslic3r/PrintConfig.cpp:1514 src/libslic3r/PrintConfig.cpp:1523 msgid "Max" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1426 +#: src/libslic3r/PrintConfig.cpp:1515 msgid "This setting represents the maximum speed of your fan." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1435 +#: src/libslic3r/PrintConfig.cpp:1524 #, possible-c-format msgid "" "This is the highest printable layer height for this extruder, used to cap " @@ -9728,28 +9844,28 @@ msgid "" "adhesion. If set to 0, layer height is limited to 75% of the nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1445 +#: src/libslic3r/PrintConfig.cpp:1534 msgid "Max print speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1446 +#: src/libslic3r/PrintConfig.cpp:1535 msgid "" "When setting other speed settings to 0 Slic3r will autocalculate the optimal " "speed in order to keep constant extruder pressure. This experimental setting " "is used to set the highest print speed you want to allow." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1456 +#: src/libslic3r/PrintConfig.cpp:1545 msgid "" "This experimental setting is used to set the maximum volumetric speed your " "extruder supports." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1465 +#: src/libslic3r/PrintConfig.cpp:1554 msgid "Max volumetric slope positive" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1466 src/libslic3r/PrintConfig.cpp:1477 +#: src/libslic3r/PrintConfig.cpp:1555 src/libslic3r/PrintConfig.cpp:1566 msgid "" "This experimental setting is used to limit the speed of change in extrusion " "rate. A value of 1.8 mm³/s² ensures, that a change from the extrusion rate " @@ -9757,95 +9873,95 @@ msgid "" "s) to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1470 src/libslic3r/PrintConfig.cpp:1481 +#: src/libslic3r/PrintConfig.cpp:1559 src/libslic3r/PrintConfig.cpp:1570 msgid "mm³/s²" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1476 +#: src/libslic3r/PrintConfig.cpp:1565 msgid "Max volumetric slope negative" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1488 src/libslic3r/PrintConfig.cpp:1497 +#: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1586 msgid "Min" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1489 +#: src/libslic3r/PrintConfig.cpp:1578 msgid "This setting represents the minimum PWM your fan needs to work." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1498 +#: src/libslic3r/PrintConfig.cpp:1587 msgid "" "This is the lowest printable layer height for this extruder and limits the " "resolution for variable layer height. Typical values are between 0.05 mm and " "0.1 mm." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1506 +#: src/libslic3r/PrintConfig.cpp:1595 msgid "Min print speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1507 +#: src/libslic3r/PrintConfig.cpp:1596 msgid "Slic3r will not scale speed down below this speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1514 +#: src/libslic3r/PrintConfig.cpp:1603 msgid "Minimal filament extrusion length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1515 +#: src/libslic3r/PrintConfig.cpp:1604 msgid "" "Generate no less than the number of skirt loops required to consume the " "specified amount of filament on the bottom layer. For multi-extruder " "machines, this minimum applies to each extruder." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1524 +#: src/libslic3r/PrintConfig.cpp:1613 msgid "Configuration notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1525 +#: src/libslic3r/PrintConfig.cpp:1614 msgid "" "You can put here your personal notes. This text will be added to the G-code " "header comments." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1535 +#: src/libslic3r/PrintConfig.cpp:1624 msgid "" "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1540 +#: src/libslic3r/PrintConfig.cpp:1629 msgid "Host Type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1541 +#: src/libslic3r/PrintConfig.cpp:1630 msgid "" "Slic3r can upload G-code files to a printer host. This field must contain " "the kind of the host." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1558 +#: src/libslic3r/PrintConfig.cpp:1647 msgid "Only retract when crossing perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1559 +#: src/libslic3r/PrintConfig.cpp:1648 msgid "" "Disables retraction when the travel path does not exceed the upper layer's " "perimeters (and thus any ooze will be probably invisible)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1566 +#: src/libslic3r/PrintConfig.cpp:1655 msgid "" "This option will drop the temperature of the inactive extruders to prevent " "oozing. It will enable a tall skirt automatically and move extruders outside " "such skirt when changing temperatures." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1573 +#: src/libslic3r/PrintConfig.cpp:1662 msgid "Output filename format" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1574 +#: src/libslic3r/PrintConfig.cpp:1663 msgid "" "You can use all configuration options as variables inside this template. For " "example: [layer_height], [fill_density] etc. You can also use [timestamp], " @@ -9853,31 +9969,31 @@ msgid "" "[input_filename], [input_filename_base]." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1583 +#: src/libslic3r/PrintConfig.cpp:1672 msgid "Detect bridging perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1585 +#: src/libslic3r/PrintConfig.cpp:1674 msgid "" "Experimental option to adjust flow for overhangs (bridge flow will be used), " "to apply bridge speed to them and enable fan." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1591 +#: src/libslic3r/PrintConfig.cpp:1680 msgid "Filament parking position" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1592 +#: src/libslic3r/PrintConfig.cpp:1681 msgid "" "Distance of the extruder tip from the position where the filament is parked " "when unloaded. This should match the value in printer firmware." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1600 +#: src/libslic3r/PrintConfig.cpp:1689 msgid "Extra loading distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1601 +#: src/libslic3r/PrintConfig.cpp:1690 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 " @@ -9885,27 +10001,27 @@ msgid "" "than unloading." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1609 src/libslic3r/PrintConfig.cpp:1626 -#: src/libslic3r/PrintConfig.cpp:1639 src/libslic3r/PrintConfig.cpp:1649 +#: src/libslic3r/PrintConfig.cpp:1698 src/libslic3r/PrintConfig.cpp:1715 +#: src/libslic3r/PrintConfig.cpp:1728 src/libslic3r/PrintConfig.cpp:1738 msgid "Perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1610 +#: src/libslic3r/PrintConfig.cpp:1699 msgid "" "This is the acceleration your printer will use for perimeters. Set zero to " "disable acceleration control for perimeters." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1617 +#: src/libslic3r/PrintConfig.cpp:1706 msgid "Perimeter extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1619 +#: src/libslic3r/PrintConfig.cpp:1708 msgid "" "The extruder to use when printing perimeters and brim. First extruder is 1." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1628 +#: src/libslic3r/PrintConfig.cpp:1717 msgid "" "Set this to a non-zero value to set a manual extrusion width for perimeters. " "You may want to use thinner extrudates to get more accurate surfaces. If " @@ -9914,12 +10030,12 @@ msgid "" "it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1641 +#: src/libslic3r/PrintConfig.cpp:1730 msgid "" "Speed for perimeters (contours, aka vertical shells). Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1651 +#: src/libslic3r/PrintConfig.cpp:1740 msgid "" "This option sets the number of perimeters to generate for each layer. Note " "that Slic3r may increase this number automatically when it detects sloping " @@ -9927,11 +10043,11 @@ msgid "" "Perimeters option is enabled." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1655 +#: src/libslic3r/PrintConfig.cpp:1744 msgid "(minimum)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1663 +#: src/libslic3r/PrintConfig.cpp:1752 msgid "" "If you want to process the output G-code through custom scripts, just list " "their absolute paths here. Separate multiple scripts with a semicolon. " @@ -9940,55 +10056,55 @@ msgid "" "environment variables." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1675 +#: src/libslic3r/PrintConfig.cpp:1764 msgid "Printer type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1676 +#: src/libslic3r/PrintConfig.cpp:1765 msgid "Type of the printer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1681 +#: src/libslic3r/PrintConfig.cpp:1770 msgid "Printer notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1682 +#: src/libslic3r/PrintConfig.cpp:1771 msgid "You can put your notes regarding the printer here." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1690 +#: src/libslic3r/PrintConfig.cpp:1779 msgid "Printer vendor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1691 +#: src/libslic3r/PrintConfig.cpp:1780 msgid "Name of the printer vendor." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1696 +#: src/libslic3r/PrintConfig.cpp:1785 msgid "Printer variant" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1697 +#: src/libslic3r/PrintConfig.cpp:1786 msgid "" "Name of the printer variant. For example, the printer variants may be " "differentiated by a nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1714 +#: src/libslic3r/PrintConfig.cpp:1803 msgid "Raft layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1716 +#: src/libslic3r/PrintConfig.cpp:1805 msgid "" "The object will be raised by this number of layers, and support material " "will be generated under it." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1724 +#: src/libslic3r/PrintConfig.cpp:1813 msgid "Resolution" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1725 +#: src/libslic3r/PrintConfig.cpp:1814 msgid "" "Minimum detail resolution, used to simplify the input file for speeding up " "the slicing job and reducing memory usage. High-resolution models often " @@ -9996,277 +10112,277 @@ msgid "" "simplification and use full resolution from input." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1735 +#: src/libslic3r/PrintConfig.cpp:1824 msgid "Minimum travel after retraction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1736 +#: src/libslic3r/PrintConfig.cpp:1825 msgid "" "Retraction is not triggered when travel moves are shorter than this length." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1742 +#: src/libslic3r/PrintConfig.cpp:1831 msgid "Retract amount before wipe" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1743 +#: src/libslic3r/PrintConfig.cpp:1832 msgid "" "With bowden extruders, it may be wise to do some amount of quick retract " "before doing the wipe movement." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1750 +#: src/libslic3r/PrintConfig.cpp:1839 msgid "Retract on layer change" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1751 +#: src/libslic3r/PrintConfig.cpp:1840 msgid "This flag enforces a retraction whenever a Z move is done." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1756 src/libslic3r/PrintConfig.cpp:1764 +#: src/libslic3r/PrintConfig.cpp:1845 src/libslic3r/PrintConfig.cpp:1853 msgid "Length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1757 +#: src/libslic3r/PrintConfig.cpp:1846 msgid "Retraction Length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1758 +#: src/libslic3r/PrintConfig.cpp:1847 msgid "" "When retraction is triggered, filament is pulled back by the specified " "amount (the length is measured on raw filament, before it enters the " "extruder)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1760 src/libslic3r/PrintConfig.cpp:1769 +#: src/libslic3r/PrintConfig.cpp:1849 src/libslic3r/PrintConfig.cpp:1858 msgid "mm (zero to disable)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1765 +#: src/libslic3r/PrintConfig.cpp:1854 msgid "Retraction Length (Toolchange)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1766 +#: src/libslic3r/PrintConfig.cpp:1855 msgid "" "When retraction is triggered before changing tool, filament is pulled back " "by the specified amount (the length is measured on raw filament, before it " "enters the extruder)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1774 +#: src/libslic3r/PrintConfig.cpp:1863 msgid "Lift Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1775 +#: src/libslic3r/PrintConfig.cpp:1864 msgid "" "If you set this to a positive value, Z is quickly raised every time a " "retraction is triggered. When using multiple extruders, only the setting for " "the first extruder will be considered." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1782 +#: src/libslic3r/PrintConfig.cpp:1871 msgid "Above Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1783 +#: src/libslic3r/PrintConfig.cpp:1872 msgid "Only lift Z above" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1784 +#: src/libslic3r/PrintConfig.cpp:1873 msgid "" "If you set this to a positive value, Z lift will only take place above the " "specified absolute Z. You can tune this setting for skipping lift on the " "first layers." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1791 +#: src/libslic3r/PrintConfig.cpp:1880 msgid "Below Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1792 +#: src/libslic3r/PrintConfig.cpp:1881 msgid "Only lift Z below" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1793 +#: src/libslic3r/PrintConfig.cpp:1882 msgid "" "If you set this to a positive value, Z lift will only take place below the " "specified absolute Z. You can tune this setting for limiting lift to the " "first layers." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1801 src/libslic3r/PrintConfig.cpp:1809 +#: src/libslic3r/PrintConfig.cpp:1890 src/libslic3r/PrintConfig.cpp:1898 msgid "Extra length on restart" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1802 +#: src/libslic3r/PrintConfig.cpp:1891 msgid "" "When the retraction is compensated after the travel move, the extruder will " "push this additional amount of filament. This setting is rarely needed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1810 +#: src/libslic3r/PrintConfig.cpp:1899 msgid "" "When the retraction is compensated after changing tool, the extruder will " "push this additional amount of filament." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1817 src/libslic3r/PrintConfig.cpp:1818 +#: src/libslic3r/PrintConfig.cpp:1906 src/libslic3r/PrintConfig.cpp:1907 msgid "Retraction Speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1819 +#: src/libslic3r/PrintConfig.cpp:1908 msgid "The speed for retractions (it only applies to the extruder motor)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1825 src/libslic3r/PrintConfig.cpp:1826 +#: src/libslic3r/PrintConfig.cpp:1914 src/libslic3r/PrintConfig.cpp:1915 msgid "Deretraction Speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1827 +#: src/libslic3r/PrintConfig.cpp:1916 msgid "" "The speed for loading of a filament into extruder after retraction (it only " "applies to the extruder motor). If left to zero, the retraction speed is " "used." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1834 +#: src/libslic3r/PrintConfig.cpp:1923 msgid "Seam position" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1836 +#: src/libslic3r/PrintConfig.cpp:1925 msgid "Position of perimeters starting points." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1842 +#: src/libslic3r/PrintConfig.cpp:1931 msgid "Random" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1843 +#: src/libslic3r/PrintConfig.cpp:1932 msgid "Nearest" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1844 +#: src/libslic3r/PrintConfig.cpp:1933 msgid "Aligned" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1852 +#: src/libslic3r/PrintConfig.cpp:1941 msgid "Direction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1854 +#: src/libslic3r/PrintConfig.cpp:1943 msgid "Preferred direction of the seam" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1855 +#: src/libslic3r/PrintConfig.cpp:1944 msgid "Seam preferred direction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1862 +#: src/libslic3r/PrintConfig.cpp:1951 msgid "Jitter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1864 +#: src/libslic3r/PrintConfig.cpp:1953 msgid "Seam preferred direction jitter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1865 +#: src/libslic3r/PrintConfig.cpp:1954 msgid "Preferred direction of the seam - jitter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1872 +#: src/libslic3r/PrintConfig.cpp:1961 msgid "Distance from object" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1873 +#: src/libslic3r/PrintConfig.cpp:1962 msgid "" "Distance between skirt and object(s). Set this to zero to attach the skirt " "to the object(s) and get a brim for better adhesion." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1880 +#: src/libslic3r/PrintConfig.cpp:1969 msgid "Skirt height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1881 +#: src/libslic3r/PrintConfig.cpp:1970 msgid "" "Height of skirt expressed in layers. Set this to a tall value to use skirt " "as a shield against drafts." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1888 +#: src/libslic3r/PrintConfig.cpp:1977 msgid "Draft shield" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1889 +#: src/libslic3r/PrintConfig.cpp:1978 msgid "" "If enabled, the skirt will be as tall as a highest printed object. This is " "useful to protect an ABS or ASA print from warping and detaching from print " "bed due to wind draft." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1895 +#: src/libslic3r/PrintConfig.cpp:1984 msgid "Loops (minimum)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1896 +#: src/libslic3r/PrintConfig.cpp:1985 msgid "Skirt Loops" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1897 +#: src/libslic3r/PrintConfig.cpp:1986 msgid "" "Number of loops for the skirt. If the Minimum Extrusion Length option is " "set, the number of loops might be greater than the one configured here. Set " "this to zero to disable skirt completely." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1905 +#: src/libslic3r/PrintConfig.cpp:1994 msgid "Slow down if layer print time is below" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1906 +#: src/libslic3r/PrintConfig.cpp:1995 msgid "" "If layer print time is estimated below this number of seconds, print moves " "speed will be scaled down to extend duration to this value." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1915 +#: src/libslic3r/PrintConfig.cpp:2004 msgid "Small perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1917 +#: src/libslic3r/PrintConfig.cpp:2006 msgid "" "This separate setting will affect the speed of perimeters having radius <= " "6.5mm (usually holes). If expressed as percentage (for example: 80%) it will " "be calculated on the perimeters speed setting above. Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1927 +#: src/libslic3r/PrintConfig.cpp:2016 msgid "Solid infill threshold area" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1929 +#: src/libslic3r/PrintConfig.cpp:2018 msgid "" "Force solid infill for regions having a smaller area than the specified " "threshold." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1930 +#: src/libslic3r/PrintConfig.cpp:2019 msgid "mm²" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1936 +#: src/libslic3r/PrintConfig.cpp:2025 msgid "Solid infill extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1938 +#: src/libslic3r/PrintConfig.cpp:2027 msgid "The extruder to use when printing solid infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1944 +#: src/libslic3r/PrintConfig.cpp:2033 msgid "Solid infill every" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1946 +#: src/libslic3r/PrintConfig.cpp:2035 msgid "" "This feature allows to force a solid layer every given number of layers. " "Zero to disable. You can set this to any value (for example 9999); Slic3r " @@ -10274,7 +10390,7 @@ msgid "" "according to nozzle diameter and layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1958 +#: src/libslic3r/PrintConfig.cpp:2047 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "solid surfaces. If left zero, default extrusion width will be used if set, " @@ -10282,26 +10398,26 @@ msgid "" "(for example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1969 +#: src/libslic3r/PrintConfig.cpp:2058 msgid "" "Speed for printing solid regions (top/bottom/internal horizontal shells). " "This can be expressed as a percentage (for example: 80%) over the default " "infill speed above. Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1981 +#: src/libslic3r/PrintConfig.cpp:2070 msgid "Number of solid layers to generate on top and bottom surfaces." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1987 src/libslic3r/PrintConfig.cpp:1988 +#: src/libslic3r/PrintConfig.cpp:2076 src/libslic3r/PrintConfig.cpp:2077 msgid "Minimum thickness of a top / bottom shell" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1994 +#: src/libslic3r/PrintConfig.cpp:2083 msgid "Spiral vase" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1995 +#: src/libslic3r/PrintConfig.cpp:2084 msgid "" "This feature will raise Z gradually while printing a single-walled object in " "order to remove any visible seam. This option requires a single perimeter, " @@ -10310,18 +10426,18 @@ msgid "" "when printing more than one single object." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2003 +#: src/libslic3r/PrintConfig.cpp:2092 msgid "Temperature variation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2004 +#: src/libslic3r/PrintConfig.cpp:2093 msgid "" "Temperature difference to be applied when an extruder is not active. Enables " "a full-height \"sacrificial\" skirt on which the nozzles are periodically " "wiped." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2014 +#: src/libslic3r/PrintConfig.cpp:2103 msgid "" "This start procedure is inserted at the beginning, after bed has reached the " "target temperature and extruder just started heating, and before extruder " @@ -10332,7 +10448,7 @@ msgid "" "put a \"M109 S[first_layer_temperature]\" command wherever you want." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2029 +#: src/libslic3r/PrintConfig.cpp:2118 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 " @@ -10345,45 +10461,45 @@ msgid "" "extruders, the gcode is processed in extruder order." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2045 +#: src/libslic3r/PrintConfig.cpp:2134 msgid "Color change G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2046 +#: src/libslic3r/PrintConfig.cpp:2135 msgid "This G-code will be used as a code for the color change" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2055 +#: src/libslic3r/PrintConfig.cpp:2144 msgid "This G-code will be used as a code for the pause print" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2064 +#: src/libslic3r/PrintConfig.cpp:2153 msgid "This G-code will be used as a custom code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2072 +#: src/libslic3r/PrintConfig.cpp:2161 msgid "Single Extruder Multi Material" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2073 +#: src/libslic3r/PrintConfig.cpp:2162 msgid "The printer multiplexes filaments into a single hot end." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2078 +#: src/libslic3r/PrintConfig.cpp:2167 msgid "Prime all printing extruders" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2079 +#: src/libslic3r/PrintConfig.cpp:2168 msgid "" "If enabled, all printing extruders will be primed at the front edge of the " "print bed at the start of the print." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2084 +#: src/libslic3r/PrintConfig.cpp:2173 msgid "No sparse layers (EXPERIMENTAL)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2085 +#: src/libslic3r/PrintConfig.cpp:2174 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 " @@ -10391,75 +10507,75 @@ msgid "" "with the print." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2092 +#: src/libslic3r/PrintConfig.cpp:2181 msgid "Generate support material" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2094 +#: src/libslic3r/PrintConfig.cpp:2183 msgid "Enable support material generation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2098 +#: src/libslic3r/PrintConfig.cpp:2187 msgid "Auto generated supports" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2100 +#: src/libslic3r/PrintConfig.cpp:2189 msgid "" "If checked, supports will be generated automatically based on the overhang " "threshold value. If unchecked, supports will be generated inside the " "\"Support Enforcer\" volumes only." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2106 +#: src/libslic3r/PrintConfig.cpp:2195 msgid "XY separation between an object and its support" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2108 +#: src/libslic3r/PrintConfig.cpp:2197 msgid "" "XY separation between an object and its support. If expressed as percentage " "(for example 50%), it will be calculated over external perimeter width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2118 +#: src/libslic3r/PrintConfig.cpp:2207 msgid "Pattern angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2120 +#: src/libslic3r/PrintConfig.cpp:2209 msgid "" "Use this setting to rotate the support material pattern on the horizontal " "plane." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2130 src/libslic3r/PrintConfig.cpp:2925 +#: src/libslic3r/PrintConfig.cpp:2219 src/libslic3r/PrintConfig.cpp:3014 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2136 +#: src/libslic3r/PrintConfig.cpp:2225 msgid "Contact Z distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2138 +#: src/libslic3r/PrintConfig.cpp:2227 msgid "" "The vertical distance between object and support material interface. Setting " "this to 0 will also prevent Slic3r from using bridge flow and speed for the " "first object layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2145 +#: src/libslic3r/PrintConfig.cpp:2234 msgid "0 (soluble)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2146 +#: src/libslic3r/PrintConfig.cpp:2235 msgid "0.2 (detachable)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2151 +#: src/libslic3r/PrintConfig.cpp:2240 msgid "Enforce support for the first" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2153 +#: src/libslic3r/PrintConfig.cpp:2242 msgid "" "Generate support material for the specified number of layers counting from " "bottom, regardless of whether normal support material is enabled or not and " @@ -10467,21 +10583,21 @@ msgid "" "of objects having a very thin or poor footprint on the build plate." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2158 +#: src/libslic3r/PrintConfig.cpp:2247 msgid "Enforce support for the first n layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2164 +#: src/libslic3r/PrintConfig.cpp:2253 msgid "Support material/raft/skirt extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2166 +#: src/libslic3r/PrintConfig.cpp:2255 msgid "" "The extruder to use when printing support material, raft and skirt (1+, 0 to " "use the current extruder to minimize tool changes)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2175 +#: src/libslic3r/PrintConfig.cpp:2264 msgid "" "Set this to a non-zero value to set a manual extrusion width for support " "material. If left zero, default extrusion width will be used if set, " @@ -10489,89 +10605,89 @@ msgid "" "example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2184 +#: src/libslic3r/PrintConfig.cpp:2273 msgid "Interface loops" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2186 +#: src/libslic3r/PrintConfig.cpp:2275 msgid "" "Cover the top contact layer of the supports with loops. Disabled by default." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2191 +#: src/libslic3r/PrintConfig.cpp:2280 msgid "Support material/raft interface extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2193 +#: src/libslic3r/PrintConfig.cpp:2282 msgid "" "The extruder to use when printing support material interface (1+, 0 to use " "the current extruder to minimize tool changes). This affects raft too." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2200 +#: src/libslic3r/PrintConfig.cpp:2289 msgid "Interface layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2202 +#: src/libslic3r/PrintConfig.cpp:2291 msgid "" "Number of interface layers to insert between the object(s) and support " "material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2209 +#: src/libslic3r/PrintConfig.cpp:2298 msgid "Interface pattern spacing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2211 +#: src/libslic3r/PrintConfig.cpp:2300 msgid "Spacing between interface lines. Set zero to get a solid interface." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2220 +#: src/libslic3r/PrintConfig.cpp:2309 msgid "" "Speed for printing support material interface layers. If expressed as " "percentage (for example 50%) it will be calculated over support material " "speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2229 +#: src/libslic3r/PrintConfig.cpp:2318 msgid "Pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2231 +#: src/libslic3r/PrintConfig.cpp:2320 msgid "Pattern used to generate support material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2237 +#: src/libslic3r/PrintConfig.cpp:2326 msgid "Rectilinear grid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2243 +#: src/libslic3r/PrintConfig.cpp:2332 msgid "Pattern spacing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2245 +#: src/libslic3r/PrintConfig.cpp:2334 msgid "Spacing between support material lines." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2254 +#: src/libslic3r/PrintConfig.cpp:2343 msgid "Speed for printing support material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2261 +#: src/libslic3r/PrintConfig.cpp:2350 msgid "Synchronize with object layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2263 +#: src/libslic3r/PrintConfig.cpp:2352 msgid "" "Synchronize support layers with the object print layers. This is useful with " "multi-material printers, where the extruder switch is expensive." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2269 +#: src/libslic3r/PrintConfig.cpp:2358 msgid "Overhang threshold" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2271 +#: src/libslic3r/PrintConfig.cpp:2360 msgid "" "Support material will not be generated for overhangs whose slope angle (90° " "= vertical) is above the given threshold. In other words, this value " @@ -10580,47 +10696,47 @@ msgid "" "detection (recommended)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2283 +#: src/libslic3r/PrintConfig.cpp:2372 msgid "With sheath around the support" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2285 +#: src/libslic3r/PrintConfig.cpp:2374 msgid "" "Add a sheath (a single perimeter line) around the base support. This makes " "the support more reliable, but also more difficult to remove." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2292 +#: src/libslic3r/PrintConfig.cpp:2381 msgid "" "Nozzle temperature for layers after the first one. Set this to zero to " "disable temperature control commands in the output G-code." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2295 +#: src/libslic3r/PrintConfig.cpp:2384 msgid "Nozzle temperature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2301 +#: src/libslic3r/PrintConfig.cpp:2390 msgid "Detect thin walls" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2303 +#: src/libslic3r/PrintConfig.cpp:2392 msgid "" "Detect single-width walls (parts where two extrusions don't fit and we need " "to collapse them into a single trace)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2309 +#: src/libslic3r/PrintConfig.cpp:2398 msgid "Threads" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2310 +#: src/libslic3r/PrintConfig.cpp:2399 msgid "" "Threads are used to parallelize long-running tasks. Optimal threads number " "is slightly above the number of available cores/processors." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2322 +#: src/libslic3r/PrintConfig.cpp:2411 msgid "" "This custom code is inserted before every toolchange. Placeholder variables " "for all PrusaSlicer settings as well as {previous_extruder} and " @@ -10630,7 +10746,7 @@ msgid "" "behaviour both before and after the toolchange." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2335 +#: src/libslic3r/PrintConfig.cpp:2424 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "top surfaces. You may want to use thinner extrudates to fill all narrow " @@ -10639,7 +10755,7 @@ msgid "" "percentage (for example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2347 +#: src/libslic3r/PrintConfig.cpp:2436 msgid "" "Speed for printing top solid layers (it only applies to the uppermost " "external layers and not to their internal solid layers). You may want to " @@ -10648,54 +10764,54 @@ msgid "" "for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2362 +#: src/libslic3r/PrintConfig.cpp:2451 msgid "Number of solid layers to generate on top surfaces." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2363 +#: src/libslic3r/PrintConfig.cpp:2452 msgid "Top solid layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2371 +#: src/libslic3r/PrintConfig.cpp:2460 msgid "" "The number of top solid layers is increased above top_solid_layers if " "necessary to satisfy minimum thickness of top shell. This is useful to " "prevent pillowing effect when printing with variable layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2374 +#: src/libslic3r/PrintConfig.cpp:2463 msgid "Minimum top shell thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2381 +#: src/libslic3r/PrintConfig.cpp:2470 msgid "Speed for travel moves (jumps between distant extrusion points)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2389 +#: src/libslic3r/PrintConfig.cpp:2478 msgid "Use firmware retraction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2390 +#: src/libslic3r/PrintConfig.cpp:2479 msgid "" "This experimental setting uses G10 and G11 commands to have the firmware " "handle the retraction. This is only supported in recent Marlin." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2396 +#: src/libslic3r/PrintConfig.cpp:2485 msgid "Use relative E distances" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2397 +#: src/libslic3r/PrintConfig.cpp:2486 msgid "" "If your firmware requires relative E values, check this, otherwise leave it " "unchecked. Most firmwares use absolute values." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2403 +#: src/libslic3r/PrintConfig.cpp:2492 msgid "Use volumetric E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2404 +#: src/libslic3r/PrintConfig.cpp:2493 msgid "" "This experimental setting uses outputs the E values in cubic millimeters " "instead of linear millimeters. If your firmware doesn't already know " @@ -10705,127 +10821,127 @@ msgid "" "only supported in recent Marlin." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2414 +#: src/libslic3r/PrintConfig.cpp:2503 msgid "Enable variable layer height feature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2415 +#: src/libslic3r/PrintConfig.cpp:2504 msgid "" "Some printers or printer setups may have difficulties printing with a " "variable layer height. Enabled by default." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2421 +#: src/libslic3r/PrintConfig.cpp:2510 msgid "Wipe while retracting" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2422 +#: src/libslic3r/PrintConfig.cpp:2511 msgid "" "This flag will move the nozzle while retracting to minimize the possible " "blob on leaky extruders." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2429 +#: src/libslic3r/PrintConfig.cpp:2518 msgid "" "Multi material printers may need to prime or purge extruders on tool " "changes. Extrude the excess material into the wipe tower." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2435 +#: src/libslic3r/PrintConfig.cpp:2524 msgid "Purging volumes - load/unload volumes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2436 +#: src/libslic3r/PrintConfig.cpp:2525 msgid "" "This vector saves required volumes to change from/to each tool used on the " "wipe tower. These values are used to simplify creation of the full purging " "volumes below." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2442 +#: src/libslic3r/PrintConfig.cpp:2531 msgid "Purging volumes - matrix" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2443 +#: src/libslic3r/PrintConfig.cpp:2532 msgid "" "This matrix describes volumes (in cubic milimetres) required to purge the " "new filament on the wipe tower for any given pair of tools." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2452 +#: src/libslic3r/PrintConfig.cpp:2541 msgid "Position X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2453 +#: src/libslic3r/PrintConfig.cpp:2542 msgid "X coordinate of the left front corner of a wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2459 +#: src/libslic3r/PrintConfig.cpp:2548 msgid "Position Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2460 +#: src/libslic3r/PrintConfig.cpp:2549 msgid "Y coordinate of the left front corner of a wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2467 +#: src/libslic3r/PrintConfig.cpp:2556 msgid "Width of a wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2473 +#: src/libslic3r/PrintConfig.cpp:2562 msgid "Wipe tower rotation angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2474 +#: src/libslic3r/PrintConfig.cpp:2563 msgid "Wipe tower rotation angle with respect to x-axis." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2481 +#: src/libslic3r/PrintConfig.cpp:2570 msgid "Wipe into this object's infill" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2482 +#: src/libslic3r/PrintConfig.cpp:2571 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 "" -#: src/libslic3r/PrintConfig.cpp:2489 +#: src/libslic3r/PrintConfig.cpp:2578 msgid "Wipe into this object" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2490 +#: src/libslic3r/PrintConfig.cpp:2579 msgid "" "Object will be used to purge the nozzle after a toolchange to save material " "that would otherwise end up in the wipe tower and decrease print time. " "Colours of the objects will be mixed as a result." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2496 +#: src/libslic3r/PrintConfig.cpp:2585 msgid "Maximal bridging distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2497 +#: src/libslic3r/PrintConfig.cpp:2586 msgid "Maximal distance between supports on sparse infill sections." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2503 +#: src/libslic3r/PrintConfig.cpp:2592 msgid "XY Size Compensation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2505 +#: src/libslic3r/PrintConfig.cpp:2594 msgid "" "The object will be grown/shrunk in the XY plane by the configured value " "(negative = inwards, positive = outwards). This might be useful for fine-" "tuning hole sizes." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2513 +#: src/libslic3r/PrintConfig.cpp:2602 msgid "Z offset" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2514 +#: src/libslic3r/PrintConfig.cpp:2603 msgid "" "This value will be added (or subtracted) from all the Z coordinates in the " "output G-code. It is used to compensate for bad Z endstop position: for " @@ -10833,414 +10949,414 @@ msgid "" "print bed, set this to -0.3 (or fix your endstop)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2581 +#: src/libslic3r/PrintConfig.cpp:2670 msgid "Display width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2582 +#: src/libslic3r/PrintConfig.cpp:2671 msgid "Width of the display" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2587 +#: src/libslic3r/PrintConfig.cpp:2676 msgid "Display height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2588 +#: src/libslic3r/PrintConfig.cpp:2677 msgid "Height of the display" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2593 +#: src/libslic3r/PrintConfig.cpp:2682 msgid "Number of pixels in" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2595 +#: src/libslic3r/PrintConfig.cpp:2684 msgid "Number of pixels in X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2601 +#: src/libslic3r/PrintConfig.cpp:2690 msgid "Number of pixels in Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2606 +#: src/libslic3r/PrintConfig.cpp:2695 msgid "Display horizontal mirroring" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2607 +#: src/libslic3r/PrintConfig.cpp:2696 msgid "Mirror horizontally" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2608 +#: src/libslic3r/PrintConfig.cpp:2697 msgid "Enable horizontal mirroring of output images" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2613 +#: src/libslic3r/PrintConfig.cpp:2702 msgid "Display vertical mirroring" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2614 +#: src/libslic3r/PrintConfig.cpp:2703 msgid "Mirror vertically" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2615 +#: src/libslic3r/PrintConfig.cpp:2704 msgid "Enable vertical mirroring of output images" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2620 +#: src/libslic3r/PrintConfig.cpp:2709 msgid "Display orientation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2621 +#: src/libslic3r/PrintConfig.cpp:2710 msgid "" "Set the actual LCD display orientation inside the SLA printer. Portrait mode " "will flip the meaning of display width and height parameters and the output " "images will be rotated by 90 degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2627 +#: src/libslic3r/PrintConfig.cpp:2716 msgid "Landscape" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2628 +#: src/libslic3r/PrintConfig.cpp:2717 msgid "Portrait" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2633 +#: src/libslic3r/PrintConfig.cpp:2722 msgid "Fast" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2634 +#: src/libslic3r/PrintConfig.cpp:2723 msgid "Fast tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2635 +#: src/libslic3r/PrintConfig.cpp:2724 msgid "Time of the fast tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2642 +#: src/libslic3r/PrintConfig.cpp:2731 msgid "Slow" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2643 +#: src/libslic3r/PrintConfig.cpp:2732 msgid "Slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2644 +#: src/libslic3r/PrintConfig.cpp:2733 msgid "Time of the slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2651 +#: src/libslic3r/PrintConfig.cpp:2740 msgid "Area fill" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2652 +#: src/libslic3r/PrintConfig.cpp:2741 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" "then a slow tilt will be used, otherwise - a fast tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2659 src/libslic3r/PrintConfig.cpp:2660 -#: src/libslic3r/PrintConfig.cpp:2661 +#: src/libslic3r/PrintConfig.cpp:2748 src/libslic3r/PrintConfig.cpp:2749 +#: src/libslic3r/PrintConfig.cpp:2750 msgid "Printer scaling correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2667 src/libslic3r/PrintConfig.cpp:2668 +#: src/libslic3r/PrintConfig.cpp:2756 src/libslic3r/PrintConfig.cpp:2757 msgid "Printer absolute correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2669 +#: src/libslic3r/PrintConfig.cpp:2758 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2675 +#: src/libslic3r/PrintConfig.cpp:2764 msgid "Elephant foot minimum width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2677 +#: src/libslic3r/PrintConfig.cpp:2766 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2684 src/libslic3r/PrintConfig.cpp:2685 +#: src/libslic3r/PrintConfig.cpp:2773 src/libslic3r/PrintConfig.cpp:2774 msgid "Printer gamma correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2686 +#: src/libslic3r/PrintConfig.cpp:2775 msgid "" "This will apply a gamma correction to the rasterized 2D polygons. A gamma " "value of zero means thresholding with the threshold in the middle. This " "behaviour eliminates antialiasing without losing holes in polygons." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2698 src/libslic3r/PrintConfig.cpp:2699 +#: src/libslic3r/PrintConfig.cpp:2787 src/libslic3r/PrintConfig.cpp:2788 msgid "SLA material type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2710 src/libslic3r/PrintConfig.cpp:2711 +#: src/libslic3r/PrintConfig.cpp:2799 src/libslic3r/PrintConfig.cpp:2800 msgid "Initial layer height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2717 src/libslic3r/PrintConfig.cpp:2718 +#: src/libslic3r/PrintConfig.cpp:2806 src/libslic3r/PrintConfig.cpp:2807 msgid "Bottle volume" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2719 +#: src/libslic3r/PrintConfig.cpp:2808 msgid "ml" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2724 src/libslic3r/PrintConfig.cpp:2725 +#: src/libslic3r/PrintConfig.cpp:2813 src/libslic3r/PrintConfig.cpp:2814 msgid "Bottle weight" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2726 +#: src/libslic3r/PrintConfig.cpp:2815 msgid "kg" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2733 +#: src/libslic3r/PrintConfig.cpp:2822 msgid "g/ml" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2740 +#: src/libslic3r/PrintConfig.cpp:2829 msgid "money/bottle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2745 +#: src/libslic3r/PrintConfig.cpp:2834 msgid "Faded layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2746 +#: src/libslic3r/PrintConfig.cpp:2835 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2753 src/libslic3r/PrintConfig.cpp:2754 +#: src/libslic3r/PrintConfig.cpp:2842 src/libslic3r/PrintConfig.cpp:2843 msgid "Minimum exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2761 src/libslic3r/PrintConfig.cpp:2762 +#: src/libslic3r/PrintConfig.cpp:2850 src/libslic3r/PrintConfig.cpp:2851 msgid "Maximum exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2769 src/libslic3r/PrintConfig.cpp:2770 +#: src/libslic3r/PrintConfig.cpp:2858 src/libslic3r/PrintConfig.cpp:2859 msgid "Exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2776 src/libslic3r/PrintConfig.cpp:2777 +#: src/libslic3r/PrintConfig.cpp:2865 src/libslic3r/PrintConfig.cpp:2866 msgid "Minimum initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2784 src/libslic3r/PrintConfig.cpp:2785 +#: src/libslic3r/PrintConfig.cpp:2873 src/libslic3r/PrintConfig.cpp:2874 msgid "Maximum initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2792 src/libslic3r/PrintConfig.cpp:2793 +#: src/libslic3r/PrintConfig.cpp:2881 src/libslic3r/PrintConfig.cpp:2882 msgid "Initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2799 src/libslic3r/PrintConfig.cpp:2800 +#: src/libslic3r/PrintConfig.cpp:2888 src/libslic3r/PrintConfig.cpp:2889 msgid "Correction for expansion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2806 +#: src/libslic3r/PrintConfig.cpp:2895 msgid "SLA print material notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2807 +#: src/libslic3r/PrintConfig.cpp:2896 msgid "You can put your notes regarding the SLA print material here." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2819 src/libslic3r/PrintConfig.cpp:2830 +#: src/libslic3r/PrintConfig.cpp:2908 src/libslic3r/PrintConfig.cpp:2919 msgid "Default SLA material profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2841 +#: src/libslic3r/PrintConfig.cpp:2930 msgid "Generate supports" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2843 +#: src/libslic3r/PrintConfig.cpp:2932 msgid "Generate supports for the models" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2848 +#: src/libslic3r/PrintConfig.cpp:2937 msgid "Pinhead front diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2850 +#: src/libslic3r/PrintConfig.cpp:2939 msgid "Diameter of the pointing side of the head" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2857 +#: src/libslic3r/PrintConfig.cpp:2946 msgid "Head penetration" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2859 +#: src/libslic3r/PrintConfig.cpp:2948 msgid "How much the pinhead has to penetrate the model surface" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2866 +#: src/libslic3r/PrintConfig.cpp:2955 msgid "Pinhead width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2868 +#: src/libslic3r/PrintConfig.cpp:2957 msgid "Width from the back sphere center to the front sphere center" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2876 +#: src/libslic3r/PrintConfig.cpp:2965 msgid "Pillar diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2878 +#: src/libslic3r/PrintConfig.cpp:2967 msgid "Diameter in mm of the support pillars" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2886 +#: src/libslic3r/PrintConfig.cpp:2975 msgid "Small pillar diameter percent" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2888 +#: src/libslic3r/PrintConfig.cpp:2977 msgid "" "The percentage of smaller pillars compared to the normal pillar diameter " "which are used in problematic areas where a normal pilla cannot fit." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2897 +#: src/libslic3r/PrintConfig.cpp:2986 msgid "Max bridges on a pillar" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2899 +#: src/libslic3r/PrintConfig.cpp:2988 msgid "" "Maximum number of bridges that can be placed on a pillar. Bridges hold " "support point pinheads and connect to pillars as small branches." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2907 +#: src/libslic3r/PrintConfig.cpp:2996 msgid "Pillar connection mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2908 +#: src/libslic3r/PrintConfig.cpp:2997 msgid "" "Controls the bridge type between two neighboring pillars. Can be zig-zag, " "cross (double zig-zag) or dynamic which will automatically switch between " "the first two depending on the distance of the two pillars." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2916 +#: src/libslic3r/PrintConfig.cpp:3005 msgid "Zig-Zag" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2917 +#: src/libslic3r/PrintConfig.cpp:3006 msgid "Cross" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2918 +#: src/libslic3r/PrintConfig.cpp:3007 msgid "Dynamic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2930 +#: src/libslic3r/PrintConfig.cpp:3019 msgid "Pillar widening factor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2932 +#: src/libslic3r/PrintConfig.cpp:3021 msgid "" "Merging bridges or pillars into another pillars can increase the radius. " "Zero means no increase, one means full increase." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2941 +#: src/libslic3r/PrintConfig.cpp:3030 msgid "Support base diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2943 +#: src/libslic3r/PrintConfig.cpp:3032 msgid "Diameter in mm of the pillar base" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2951 +#: src/libslic3r/PrintConfig.cpp:3040 msgid "Support base height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2953 +#: src/libslic3r/PrintConfig.cpp:3042 msgid "The height of the pillar base cone" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2960 +#: src/libslic3r/PrintConfig.cpp:3049 msgid "Support base safety distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2963 +#: src/libslic3r/PrintConfig.cpp:3052 msgid "" "The minimum distance of the pillar base from the model in mm. Makes sense in " "zero elevation mode where a gap according to this parameter is inserted " "between the model and the pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2973 +#: src/libslic3r/PrintConfig.cpp:3062 msgid "Critical angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2975 +#: src/libslic3r/PrintConfig.cpp:3064 msgid "The default angle for connecting support sticks and junctions." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2983 +#: src/libslic3r/PrintConfig.cpp:3072 msgid "Max bridge length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2985 +#: src/libslic3r/PrintConfig.cpp:3074 msgid "The max length of a bridge" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2992 +#: src/libslic3r/PrintConfig.cpp:3081 msgid "Max pillar linking distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2994 +#: src/libslic3r/PrintConfig.cpp:3083 msgid "" "The max distance of two pillars to get linked with each other. A zero value " "will prohibit pillar cascading." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3004 +#: src/libslic3r/PrintConfig.cpp:3093 msgid "" "How much the supports should lift up the supported object. If \"Pad around " "object\" is enabled, this value is ignored." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3015 +#: src/libslic3r/PrintConfig.cpp:3104 msgid "This is a relative measure of support points density." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3021 +#: src/libslic3r/PrintConfig.cpp:3110 msgid "Minimal distance of the support points" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3023 +#: src/libslic3r/PrintConfig.cpp:3112 msgid "No support points will be placed closer than this threshold." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3029 +#: src/libslic3r/PrintConfig.cpp:3118 msgid "Use pad" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3031 +#: src/libslic3r/PrintConfig.cpp:3120 msgid "Add a pad underneath the supported model" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3036 +#: src/libslic3r/PrintConfig.cpp:3125 msgid "Pad wall thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3038 +#: src/libslic3r/PrintConfig.cpp:3127 msgid "The thickness of the pad and its optional cavity walls." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3046 +#: src/libslic3r/PrintConfig.cpp:3135 msgid "Pad wall height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3047 +#: src/libslic3r/PrintConfig.cpp:3136 msgid "" "Defines the pad cavity depth. Set to zero to disable the cavity. Be careful " "when enabling this feature, as some resins may produce an extreme suction " @@ -11248,111 +11364,111 @@ msgid "" "difficult." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3060 +#: src/libslic3r/PrintConfig.cpp:3149 msgid "Pad brim size" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3061 +#: src/libslic3r/PrintConfig.cpp:3150 msgid "How far should the pad extend around the contained geometry" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3071 +#: src/libslic3r/PrintConfig.cpp:3160 msgid "Max merge distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3073 +#: src/libslic3r/PrintConfig.cpp:3162 msgid "" "Some objects can get along with a few smaller pads instead of a single big " "one. This parameter defines how far the center of two smaller pads should " "be. If theyare closer, they will get merged into one pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3093 +#: src/libslic3r/PrintConfig.cpp:3182 msgid "Pad wall slope" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3095 +#: src/libslic3r/PrintConfig.cpp:3184 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3195 msgid "Create pad around object and ignore the support elevation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3111 +#: src/libslic3r/PrintConfig.cpp:3200 msgid "Pad around object everywhere" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3113 +#: src/libslic3r/PrintConfig.cpp:3202 msgid "Force pad around object everywhere" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3118 +#: src/libslic3r/PrintConfig.cpp:3207 msgid "Pad object gap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3120 +#: src/libslic3r/PrintConfig.cpp:3209 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3129 +#: src/libslic3r/PrintConfig.cpp:3218 msgid "Pad object connector stride" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3131 +#: src/libslic3r/PrintConfig.cpp:3220 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3138 +#: src/libslic3r/PrintConfig.cpp:3227 msgid "Pad object connector width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3140 +#: src/libslic3r/PrintConfig.cpp:3229 msgid "" "Width of the connector sticks which connect the object and the generated pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3147 +#: src/libslic3r/PrintConfig.cpp:3236 msgid "Pad object connector penetration" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3150 +#: src/libslic3r/PrintConfig.cpp:3239 msgid "How much should the tiny connectors penetrate into the model body." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3157 +#: src/libslic3r/PrintConfig.cpp:3246 msgid "Enable hollowing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3159 +#: src/libslic3r/PrintConfig.cpp:3248 msgid "Hollow out a model to have an empty interior" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3164 +#: src/libslic3r/PrintConfig.cpp:3253 msgid "Wall thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3166 +#: src/libslic3r/PrintConfig.cpp:3255 msgid "Minimum wall thickness of a hollowed model." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3174 +#: src/libslic3r/PrintConfig.cpp:3263 msgid "Accuracy" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3176 +#: src/libslic3r/PrintConfig.cpp:3265 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3186 +#: src/libslic3r/PrintConfig.cpp:3275 msgid "" "Hollowing is done in two steps: first, an imaginary interior is calculated " "deeper (offset plus the closing distance) in the object and then it's " @@ -11361,270 +11477,270 @@ msgid "" "most." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3602 +#: src/libslic3r/PrintConfig.cpp:3683 msgid "Export OBJ" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3603 +#: src/libslic3r/PrintConfig.cpp:3684 msgid "Export the model(s) as OBJ." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3614 +#: src/libslic3r/PrintConfig.cpp:3695 msgid "Export SLA" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3615 +#: src/libslic3r/PrintConfig.cpp:3696 msgid "Slice the model and export SLA printing layers as PNG." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3620 +#: src/libslic3r/PrintConfig.cpp:3701 msgid "Export 3MF" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3621 +#: src/libslic3r/PrintConfig.cpp:3702 msgid "Export the model(s) as 3MF." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3625 +#: src/libslic3r/PrintConfig.cpp:3706 msgid "Export AMF" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3626 +#: src/libslic3r/PrintConfig.cpp:3707 msgid "Export the model(s) as AMF." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3630 +#: src/libslic3r/PrintConfig.cpp:3711 msgid "Export STL" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3631 +#: src/libslic3r/PrintConfig.cpp:3712 msgid "Export the model(s) as STL." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3636 +#: src/libslic3r/PrintConfig.cpp:3717 msgid "Slice the model and export toolpaths as G-code." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3641 +#: src/libslic3r/PrintConfig.cpp:3722 msgid "G-code viewer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:3723 msgid "Visualize an already sliced and saved G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3647 +#: src/libslic3r/PrintConfig.cpp:3728 msgid "Slice" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3648 +#: src/libslic3r/PrintConfig.cpp:3729 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3653 +#: src/libslic3r/PrintConfig.cpp:3734 msgid "Help" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3654 +#: src/libslic3r/PrintConfig.cpp:3735 msgid "Show this help." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3659 +#: src/libslic3r/PrintConfig.cpp:3740 msgid "Help (FFF options)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3660 +#: src/libslic3r/PrintConfig.cpp:3741 msgid "Show the full list of print/G-code configuration options." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3664 +#: src/libslic3r/PrintConfig.cpp:3745 msgid "Help (SLA options)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3665 +#: src/libslic3r/PrintConfig.cpp:3746 msgid "Show the full list of SLA print configuration options." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3669 +#: src/libslic3r/PrintConfig.cpp:3750 msgid "Output Model Info" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3670 +#: src/libslic3r/PrintConfig.cpp:3751 msgid "Write information about the model to the console." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3674 +#: src/libslic3r/PrintConfig.cpp:3755 msgid "Save config file" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3675 +#: src/libslic3r/PrintConfig.cpp:3756 msgid "Save configuration to the specified file." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3685 +#: src/libslic3r/PrintConfig.cpp:3766 msgid "Align XY" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3686 +#: src/libslic3r/PrintConfig.cpp:3767 msgid "Align the model to the given point." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3691 +#: src/libslic3r/PrintConfig.cpp:3772 msgid "Cut model at the given Z." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3712 +#: src/libslic3r/PrintConfig.cpp:3793 msgid "Center" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3713 +#: src/libslic3r/PrintConfig.cpp:3794 msgid "Center the print around the given center." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3717 +#: src/libslic3r/PrintConfig.cpp:3798 msgid "Don't arrange" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3718 +#: src/libslic3r/PrintConfig.cpp:3799 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3721 +#: src/libslic3r/PrintConfig.cpp:3802 msgid "Duplicate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3722 +#: src/libslic3r/PrintConfig.cpp:3803 msgid "Multiply copies by this factor." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3726 +#: src/libslic3r/PrintConfig.cpp:3807 msgid "Duplicate by grid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3727 +#: src/libslic3r/PrintConfig.cpp:3808 msgid "Multiply copies by creating a grid." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3731 +#: src/libslic3r/PrintConfig.cpp:3812 msgid "" "Arrange the supplied models in a plate and merge them in a single model in " "order to perform actions once." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3736 +#: src/libslic3r/PrintConfig.cpp:3817 msgid "" "Try to repair any non-manifold meshes (this option is implicitly added " "whenever we need to slice the model to perform the requested action)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3740 +#: src/libslic3r/PrintConfig.cpp:3821 msgid "Rotation angle around the Z axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3744 +#: src/libslic3r/PrintConfig.cpp:3825 msgid "Rotate around X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3745 +#: src/libslic3r/PrintConfig.cpp:3826 msgid "Rotation angle around the X axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3749 +#: src/libslic3r/PrintConfig.cpp:3830 msgid "Rotate around Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3750 +#: src/libslic3r/PrintConfig.cpp:3831 msgid "Rotation angle around the Y axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3755 +#: src/libslic3r/PrintConfig.cpp:3836 msgid "Scaling factor or percentage." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3760 +#: src/libslic3r/PrintConfig.cpp:3841 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3763 +#: src/libslic3r/PrintConfig.cpp:3844 msgid "Scale to Fit" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3764 +#: src/libslic3r/PrintConfig.cpp:3845 msgid "Scale to fit the given volume." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3773 +#: src/libslic3r/PrintConfig.cpp:3854 msgid "Ignore non-existent config files" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3774 +#: src/libslic3r/PrintConfig.cpp:3855 msgid "Do not fail if a file supplied to --load does not exist." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3777 +#: src/libslic3r/PrintConfig.cpp:3858 msgid "Load config file" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3778 +#: src/libslic3r/PrintConfig.cpp:3859 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3781 +#: src/libslic3r/PrintConfig.cpp:3862 msgid "Output File" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3782 +#: src/libslic3r/PrintConfig.cpp:3863 msgid "" "The file where the output will be written (if not specified, it will be " "based on the input file)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3786 +#: src/libslic3r/PrintConfig.cpp:3867 msgid "Single instance mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3787 +#: src/libslic3r/PrintConfig.cpp:3868 msgid "" "If enabled, the command line arguments are sent to an existing instance of " "GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides " "the \"single_instance\" configuration value from application preferences." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3798 +#: src/libslic3r/PrintConfig.cpp:3879 msgid "Data directory" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3799 +#: src/libslic3r/PrintConfig.cpp:3880 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " "storage." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3802 +#: src/libslic3r/PrintConfig.cpp:3883 msgid "Logging level" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3803 +#: src/libslic3r/PrintConfig.cpp:3884 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" "For example. loglevel=2 logs fatal, error and warning level messages." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3809 +#: src/libslic3r/PrintConfig.cpp:3890 msgid "Render with a software renderer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3810 +#: src/libslic3r/PrintConfig.cpp:3891 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." diff --git a/resources/localization/ru/PrusaSlicer.mo b/resources/localization/ru/PrusaSlicer.mo index c0b9a51e970..967c50ca691 100644 Binary files a/resources/localization/ru/PrusaSlicer.mo and b/resources/localization/ru/PrusaSlicer.mo differ diff --git a/resources/localization/ru/PrusaSlicer_ru.po b/resources/localization/ru/PrusaSlicer_ru.po index 93c9145425b..2a929e55ef5 100644 --- a/resources/localization/ru/PrusaSlicer_ru.po +++ b/resources/localization/ru/PrusaSlicer_ru.po @@ -1,170 +1,170 @@ -# Copyright (C) 2018 -# This file is distributed under the same license as the Slic3r Prusa Edition package. +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. # -# Alexander Golikov , 2018. -# Alexander Khvostuk , 2018. -# Andylg N. , 2018. -# Andrey Tarasik , 2018. -# Yuri Kozlov , 2020. msgid "" msgstr "" -"Project-Id-Version: Slic3r Prusa Edition 1.41.1\n" +"Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-12-01 16:23+0100\n" -"PO-Revision-Date: 2020-12-01 13:18+0100\n" -"Last-Translator: Oleksandra Iushchenko \n" -"Language-Team: Russian \n" -"Language: ru\n" +"POT-Creation-Date: 2021-01-09 15:30+0700\n" +"PO-Revision-Date: 2021-02-03 14:06+0100\n" +"Language-Team: Andylg \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n" +"%100>=20) ? 1 : 2);\n" "X-Generator: Poedit 2.4.2\n" -"X-Poedit-Flags-xgettext: --add-comments\n" +"Last-Translator: Oleksandra Iushchenko \n" +"Language: ru_RU\n" -#: src/slic3r/GUI/AboutDialog.cpp:42 src/slic3r/GUI/AboutDialog.cpp:297 +#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:299 msgid "Portions copyright" -msgstr "Части авторских прав" +msgstr "С использованием разработок" -#: src/slic3r/GUI/AboutDialog.cpp:132 src/slic3r/GUI/AboutDialog.cpp:261 +#: src/slic3r/GUI/AboutDialog.cpp:135 src/slic3r/GUI/AboutDialog.cpp:263 msgid "Copyright" -msgstr "Авторские права" +msgstr "Copyright" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:134 +#: src/slic3r/GUI/AboutDialog.cpp:137 msgid "" -"License agreements of all following programs (libraries) are part of " -"application license agreement" +"License agreements of all following programs (libraries) are part of application " +"license agreement" msgstr "" "Лицензионные соглашения всех следующих программ (библиотек) являются частью " -"лицензионного соглашения приложения" +"лицензионного соглашения" -#: src/slic3r/GUI/AboutDialog.cpp:204 +#: src/slic3r/GUI/AboutDialog.cpp:206 #, c-format msgid "About %s" msgstr "О %s" -#: src/slic3r/GUI/AboutDialog.cpp:236 src/slic3r/GUI/GUI_App.cpp:231 -#: src/slic3r/GUI/MainFrame.cpp:153 +#: src/slic3r/GUI/AboutDialog.cpp:238 src/slic3r/GUI/AboutDialog.cpp:361 +#: src/slic3r/GUI/GUI_App.cpp:235 src/slic3r/GUI/MainFrame.cpp:151 msgid "Version" msgstr "Версия" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:263 src/slic3r/GUI/GUI_App.cpp:236 +#: src/slic3r/GUI/AboutDialog.cpp:265 src/slic3r/GUI/GUI_App.cpp:240 msgid "is licensed under the" -msgstr "лицензирована на условиях" +msgstr "лицензирован в соответствии с" -#: src/slic3r/GUI/AboutDialog.cpp:264 src/slic3r/GUI/GUI_App.cpp:236 +#: src/slic3r/GUI/AboutDialog.cpp:266 src/slic3r/GUI/GUI_App.cpp:240 msgid "GNU Affero General Public License, version 3" -msgstr "GNU Affero General Public License версии 3" +msgstr "GNU Affero General Public License, version 3" -#: src/slic3r/GUI/AboutDialog.cpp:265 +#: src/slic3r/GUI/AboutDialog.cpp:267 msgid "" -"PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " -"community." +"PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap community." msgstr "" -"PrusaSlicer основана на Slic3r, которая написана Alessandro Ranellucci и " -"сообществом RepRap." +"PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap community." -#: src/slic3r/GUI/AboutDialog.cpp:266 +#: src/slic3r/GUI/AboutDialog.cpp:268 msgid "" -"Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " -"Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " -"numerous others." +"Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr " +"Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and numerous others." msgstr "" -"При участии Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr " -"Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik и многих " -"других." +"Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr " +"Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and numerous " +"others. Если вы нашли ошибки в русском переводе пишите на andylg@yandex.ru." + +#: src/slic3r/GUI/AboutDialog.cpp:304 +msgid "Copy Version Info" +msgstr "Скопировать информацию о версии" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:77 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:78 #, c-format msgid "" -"%s has encountered an error. It was likely caused by running out of memory. " -"If you are sure you have enough RAM on your system, this may also be a bug " -"and we would be glad if you reported it." +"%s has encountered an error. It was likely caused by running out of memory. If you " +"are sure you have enough RAM on your system, this may also be a bug and we would be " +"glad if you reported it." msgstr "" -"Возникла ошибка в %s. Вероятно, это вызвано нехваткой памяти. Если в вашей " -"системе много оперативной памяти, то, возможно, вы обнаружили ошибку в " -"программе, пожалуйста, сообщите о этом." +"При работе с %s произошла ошибка. Скорее всего, это было вызвано нехваткой памяти. " +"Если вы уверены, что в вашей системе достаточно оперативной памяти, но тем не менее " +"произошла эта ошибка, сообщите нам об этом." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:156 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:163 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:183 +msgid "Unknown error occured during exporting G-code." +msgstr "При экспорте G-кода произошла неизвестная ошибка." + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:168 msgid "" -"Copying of the temporary G-code to the output G-code failed. Maybe the SD " -"card is write locked?\n" +"Copying of the temporary G-code to the output G-code failed. Maybe the SD card is " +"write locked?\n" "Error message: %1%" msgstr "" +"Не удалось скопировать временный G-код в местонахождение выходного G-код файла. " +"Может ваша SD карта защищена от записи?\n" +"Сообщение об ошибке: %1%" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:159 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:171 msgid "" -"Copying of the temporary G-code to the output G-code failed. There might be " -"problem with target device, please try exporting again or using different " -"device. The corrupted output G-code is at %1%.tmp." +"Copying of the temporary G-code to the output G-code failed. There might be problem " +"with target device, please try exporting again or using different device. The " +"corrupted output G-code is at %1%.tmp." msgstr "" -"Не удалось скопировать временный G-код в конечный G-код. Это может быть из-" -"за проблемы с устройством куда выполняется запись, попробуйте запустить " -"экспорт ещё раз или используйте другое устройство. Повреждённый конечный G-" -"код находится в файле %1%.tmp." +"Не удалось скопировать временный G-код в местонахождение выходного G-код файла. " +"Возможно, проблема с устройством назначения, попробуйте снова выполнить экспорт или " +"использовать другое устройство. Повреждённый выходной G-код файл находится в %1%." +"tmp." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:162 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:174 msgid "" -"Renaming of the G-code after copying to the selected destination folder has " -"failed. Current path is %1%.tmp. Please try exporting again." +"Renaming of the G-code after copying to the selected destination folder has failed. " +"Current path is %1%.tmp. Please try exporting again." msgstr "" -"Не удалось переименовать G-код после копирования в указанный каталог " -"назначения. Текущий путь: %1%.tmp. Попробуйте выполнить экспорт ещё раз." +"Не удалось переименовать G-код после копирования в выбранную папку назначения. " +"Текущий путь %1%.tmp. Пожалуйста, попробуйте экспортировать ещё раз." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:165 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:177 msgid "" -"Copying of the temporary G-code has finished but the original code at %1% " -"couldn't be opened during copy check. The output G-code is at %2%.tmp." +"Copying of the temporary G-code has finished but the original code at %1% couldn't " +"be opened during copy check. The output G-code is at %2%.tmp." msgstr "" -"Копирование временного G-кода выполнено, но не удалось открыть оригинальный " -"код %1% для проверки копирования. Конечный G-код в файле %2%.tmp." +"Копирование временного G-кода завершено, но исходный код в %1% не удалось открыть " +"во время проверки копии. Выходной G-код находится в %2%.tmp." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:168 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:180 msgid "" -"Copying of the temporary G-code has finished but the exported code couldn't " -"be opened during copy check. The output G-code is at %1%.tmp." -msgstr "" -"Копирование временного G-кода выполнено, но экспортированный код не удалось " -"открыть во время проверки копирования. Конечный G-код записан в файл %1%.tmp." - -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:171 -msgid "Unknown error occured during exporting G-code." +"Copying of the temporary G-code has finished but the exported code couldn't be " +"opened during copy check. The output G-code is at %1%.tmp." msgstr "" +"Копирование временного G-кода завершено, но экспортированный код не удалось открыть " +"во время проверки копии. Выходной G-код находится в %1%.tmp." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:176 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:525 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:187 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:536 msgid "Running post-processing scripts" -msgstr "Выполняются сценарии постобработки" +msgstr "Запуск скриптов постобработки" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:178 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:189 msgid "G-code file exported to %1%" msgstr "Файл G-кода экспортирован в %1%" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:183 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:232 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:194 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:243 msgid "Slicing complete" -msgstr "Нарезка выполнена" +msgstr "Нарезка завершена" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:227 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:238 msgid "Masked SLA file exported to %1%" -msgstr "Файл SLA-маски экспортирован в %1%" +msgstr "MSLA файл экспортирован в %1%" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:528 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:539 msgid "Copying of the temporary G-code to the output G-code failed" -msgstr "Не удалось скопировать временный G-код в конечный G-код" +msgstr "" +"Не удалось скопировать временный G-код в местонахождение выходного G-код файла" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:551 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:562 msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" msgstr "" -"Запланирована отправка в «%1%». Смотрите Окна -> Очередь отправки на узел " -"печати" +"Планирование загрузки на `%1%`. Смотрите Окна -> Очередь загрузки на хост печати" -#: src/slic3r/GUI/BedShapeDialog.cpp:93 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:240 src/slic3r/GUI/Plater.cpp:162 -#: src/slic3r/GUI/Tab.cpp:2531 +#: src/slic3r/GUI/BedShapeDialog.cpp:93 src/slic3r/GUI/GUI_ObjectManipulation.cpp:240 +#: src/slic3r/GUI/Plater.cpp:162 src/slic3r/GUI/Tab.cpp:2536 msgid "Size" msgstr "Размер" @@ -172,73 +172,69 @@ msgstr "Размер" msgid "Origin" msgstr "Начало координат" -#: src/slic3r/GUI/BedShapeDialog.cpp:95 src/libslic3r/PrintConfig.cpp:754 +#: src/slic3r/GUI/BedShapeDialog.cpp:95 src/libslic3r/PrintConfig.cpp:771 msgid "Diameter" msgstr "Диаметр" #: src/slic3r/GUI/BedShapeDialog.cpp:110 msgid "Size in X and Y of the rectangular plate." -msgstr "Размеры прямоугольной платформы в XY координатах." +msgstr "Размеры прямоугольного стола в XY координатах." #: src/slic3r/GUI/BedShapeDialog.cpp:121 msgid "" -"Distance of the 0,0 G-code coordinate from the front left corner of the " -"rectangle." +"Distance of the 0,0 G-code coordinate from the front left corner of the rectangle." msgstr "" -"Расстояние от координаты 0,0 G-кода. Отсчёт от левого переднего угла " -"прямоугольной платформы." +"Расстояние до точки начало координат. Отсчёт от левого переднего угла " +"прямоугольного стола." -#: src/slic3r/GUI/BedShapeDialog.cpp:129 src/slic3r/GUI/ConfigWizard.cpp:237 -#: src/slic3r/GUI/ConfigWizard.cpp:1359 src/slic3r/GUI/ConfigWizard.cpp:1373 -#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:88 -#: src/slic3r/GUI/GCodeViewer.cpp:2324 src/slic3r/GUI/GCodeViewer.cpp:2330 -#: src/slic3r/GUI/GCodeViewer.cpp:2338 src/slic3r/GUI/GUI_ObjectLayers.cpp:145 +#: src/slic3r/GUI/BedShapeDialog.cpp:129 src/slic3r/GUI/ConfigWizard.cpp:242 +#: src/slic3r/GUI/ConfigWizard.cpp:1368 src/slic3r/GUI/ConfigWizard.cpp:1382 +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:88 src/slic3r/GUI/GCodeViewer.cpp:2337 +#: src/slic3r/GUI/GCodeViewer.cpp:2343 src/slic3r/GUI/GCodeViewer.cpp:2351 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:179 src/slic3r/GUI/GUI_ObjectLayers.cpp:145 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:341 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:418 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:487 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:96 -#: src/slic3r/GUI/WipeTowerDialog.cpp:85 src/libslic3r/PrintConfig.cpp:75 -#: src/libslic3r/PrintConfig.cpp:82 src/libslic3r/PrintConfig.cpp:93 -#: src/libslic3r/PrintConfig.cpp:131 src/libslic3r/PrintConfig.cpp:229 -#: src/libslic3r/PrintConfig.cpp:287 src/libslic3r/PrintConfig.cpp:362 -#: src/libslic3r/PrintConfig.cpp:370 src/libslic3r/PrintConfig.cpp:420 -#: src/libslic3r/PrintConfig.cpp:550 src/libslic3r/PrintConfig.cpp:561 -#: src/libslic3r/PrintConfig.cpp:579 src/libslic3r/PrintConfig.cpp:757 -#: src/libslic3r/PrintConfig.cpp:1230 src/libslic3r/PrintConfig.cpp:1411 -#: src/libslic3r/PrintConfig.cpp:1472 src/libslic3r/PrintConfig.cpp:1490 -#: src/libslic3r/PrintConfig.cpp:1508 src/libslic3r/PrintConfig.cpp:1566 -#: src/libslic3r/PrintConfig.cpp:1576 src/libslic3r/PrintConfig.cpp:1697 -#: src/libslic3r/PrintConfig.cpp:1705 src/libslic3r/PrintConfig.cpp:1746 -#: src/libslic3r/PrintConfig.cpp:1754 src/libslic3r/PrintConfig.cpp:1764 -#: src/libslic3r/PrintConfig.cpp:1772 src/libslic3r/PrintConfig.cpp:1780 -#: src/libslic3r/PrintConfig.cpp:1843 src/libslic3r/PrintConfig.cpp:2109 -#: src/libslic3r/PrintConfig.cpp:2180 src/libslic3r/PrintConfig.cpp:2214 -#: src/libslic3r/PrintConfig.cpp:2343 src/libslic3r/PrintConfig.cpp:2422 -#: src/libslic3r/PrintConfig.cpp:2429 src/libslic3r/PrintConfig.cpp:2436 -#: src/libslic3r/PrintConfig.cpp:2466 src/libslic3r/PrintConfig.cpp:2476 -#: src/libslic3r/PrintConfig.cpp:2486 src/libslic3r/PrintConfig.cpp:2646 -#: src/libslic3r/PrintConfig.cpp:2680 src/libslic3r/PrintConfig.cpp:2819 -#: src/libslic3r/PrintConfig.cpp:2828 src/libslic3r/PrintConfig.cpp:2837 -#: src/libslic3r/PrintConfig.cpp:2847 src/libslic3r/PrintConfig.cpp:2912 -#: src/libslic3r/PrintConfig.cpp:2922 src/libslic3r/PrintConfig.cpp:2934 -#: src/libslic3r/PrintConfig.cpp:2954 src/libslic3r/PrintConfig.cpp:2964 -#: src/libslic3r/PrintConfig.cpp:2974 src/libslic3r/PrintConfig.cpp:2992 -#: src/libslic3r/PrintConfig.cpp:3007 src/libslic3r/PrintConfig.cpp:3021 -#: src/libslic3r/PrintConfig.cpp:3032 src/libslic3r/PrintConfig.cpp:3045 -#: src/libslic3r/PrintConfig.cpp:3090 src/libslic3r/PrintConfig.cpp:3100 -#: src/libslic3r/PrintConfig.cpp:3109 src/libslic3r/PrintConfig.cpp:3119 -#: src/libslic3r/PrintConfig.cpp:3135 src/libslic3r/PrintConfig.cpp:3159 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:96 src/slic3r/GUI/WipeTowerDialog.cpp:85 +#: src/libslic3r/PrintConfig.cpp:77 src/libslic3r/PrintConfig.cpp:84 +#: src/libslic3r/PrintConfig.cpp:95 src/libslic3r/PrintConfig.cpp:135 +#: src/libslic3r/PrintConfig.cpp:244 src/libslic3r/PrintConfig.cpp:302 +#: src/libslic3r/PrintConfig.cpp:377 src/libslic3r/PrintConfig.cpp:385 +#: src/libslic3r/PrintConfig.cpp:435 src/libslic3r/PrintConfig.cpp:565 +#: src/libslic3r/PrintConfig.cpp:576 src/libslic3r/PrintConfig.cpp:594 +#: src/libslic3r/PrintConfig.cpp:774 src/libslic3r/PrintConfig.cpp:1258 +#: src/libslic3r/PrintConfig.cpp:1439 src/libslic3r/PrintConfig.cpp:1500 +#: src/libslic3r/PrintConfig.cpp:1518 src/libslic3r/PrintConfig.cpp:1536 +#: src/libslic3r/PrintConfig.cpp:1594 src/libslic3r/PrintConfig.cpp:1604 +#: src/libslic3r/PrintConfig.cpp:1729 src/libslic3r/PrintConfig.cpp:1737 +#: src/libslic3r/PrintConfig.cpp:1778 src/libslic3r/PrintConfig.cpp:1786 +#: src/libslic3r/PrintConfig.cpp:1796 src/libslic3r/PrintConfig.cpp:1804 +#: src/libslic3r/PrintConfig.cpp:1812 src/libslic3r/PrintConfig.cpp:1875 +#: src/libslic3r/PrintConfig.cpp:2141 src/libslic3r/PrintConfig.cpp:2212 +#: src/libslic3r/PrintConfig.cpp:2246 src/libslic3r/PrintConfig.cpp:2375 +#: src/libslic3r/PrintConfig.cpp:2454 src/libslic3r/PrintConfig.cpp:2461 +#: src/libslic3r/PrintConfig.cpp:2468 src/libslic3r/PrintConfig.cpp:2498 +#: src/libslic3r/PrintConfig.cpp:2508 src/libslic3r/PrintConfig.cpp:2518 +#: src/libslic3r/PrintConfig.cpp:2678 src/libslic3r/PrintConfig.cpp:2712 +#: src/libslic3r/PrintConfig.cpp:2851 src/libslic3r/PrintConfig.cpp:2860 +#: src/libslic3r/PrintConfig.cpp:2869 src/libslic3r/PrintConfig.cpp:2879 +#: src/libslic3r/PrintConfig.cpp:2944 src/libslic3r/PrintConfig.cpp:2954 +#: src/libslic3r/PrintConfig.cpp:2966 src/libslic3r/PrintConfig.cpp:2986 +#: src/libslic3r/PrintConfig.cpp:2996 src/libslic3r/PrintConfig.cpp:3006 +#: src/libslic3r/PrintConfig.cpp:3024 src/libslic3r/PrintConfig.cpp:3039 +#: src/libslic3r/PrintConfig.cpp:3053 src/libslic3r/PrintConfig.cpp:3064 +#: src/libslic3r/PrintConfig.cpp:3077 src/libslic3r/PrintConfig.cpp:3122 +#: src/libslic3r/PrintConfig.cpp:3132 src/libslic3r/PrintConfig.cpp:3141 +#: src/libslic3r/PrintConfig.cpp:3151 src/libslic3r/PrintConfig.cpp:3167 +#: src/libslic3r/PrintConfig.cpp:3191 msgid "mm" msgstr "мм" #: src/slic3r/GUI/BedShapeDialog.cpp:131 msgid "" -"Diameter of the print bed. It is assumed that origin (0,0) is located in the " -"center." -msgstr "" -"Диаметр платформы печати. Предполагается, что начало координат (0,0) " -"находится в центре." +"Diameter of the print bed. It is assumed that origin (0,0) is located in the center." +msgstr "Диаметр стола. Предполагается, что начало координат (0,0) находится в центре." #: src/slic3r/GUI/BedShapeDialog.cpp:141 msgid "Rectangular" @@ -248,27 +244,27 @@ msgstr "Прямоугольная" msgid "Circular" msgstr "Круглая" -#: src/slic3r/GUI/BedShapeDialog.cpp:143 src/slic3r/GUI/GUI_Preview.cpp:257 +#: src/slic3r/GUI/BedShapeDialog.cpp:143 src/slic3r/GUI/GUI_Preview.cpp:243 #: src/libslic3r/ExtrusionEntity.cpp:323 src/libslic3r/ExtrusionEntity.cpp:358 msgid "Custom" msgstr "Пользовательская" #: src/slic3r/GUI/BedShapeDialog.cpp:145 msgid "Invalid" -msgstr "" +msgstr "Недопустимо" #: src/slic3r/GUI/BedShapeDialog.cpp:156 src/slic3r/GUI/BedShapeDialog.cpp:222 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2215 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2288 msgid "Shape" msgstr "Форма" #: src/slic3r/GUI/BedShapeDialog.cpp:243 msgid "Load shape from STL..." -msgstr "Загрузить форму платформы из STL-файла…" +msgstr "Загрузка формы стола из STL файла..." -#: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/MainFrame.cpp:1816 +#: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/MainFrame.cpp:1826 msgid "Settings" -msgstr "Параметры" +msgstr "Настройки" #: src/slic3r/GUI/BedShapeDialog.cpp:315 msgid "Texture" @@ -276,16 +272,16 @@ msgstr "Текстура" #: src/slic3r/GUI/BedShapeDialog.cpp:325 src/slic3r/GUI/BedShapeDialog.cpp:405 msgid "Load..." -msgstr "Загрузить…" +msgstr "Загрузить..." #: src/slic3r/GUI/BedShapeDialog.cpp:333 src/slic3r/GUI/BedShapeDialog.cpp:413 -#: src/slic3r/GUI/Tab.cpp:3474 +#: src/slic3r/GUI/Tab.cpp:3484 msgid "Remove" -msgstr "Убрать" +msgstr "Удалить" #: src/slic3r/GUI/BedShapeDialog.cpp:366 src/slic3r/GUI/BedShapeDialog.cpp:446 msgid "Not found:" -msgstr "Не найден:" +msgstr "Не найдено:" #: src/slic3r/GUI/BedShapeDialog.cpp:395 msgid "Model" @@ -293,39 +289,38 @@ msgstr "Модель" #: src/slic3r/GUI/BedShapeDialog.cpp:563 msgid "Choose an STL file to import bed shape from:" -msgstr "Выберите файл STL для импорта формы платформы из:" +msgstr "Выберите STL файл для импорта формы стола из:" #: src/slic3r/GUI/BedShapeDialog.cpp:570 src/slic3r/GUI/BedShapeDialog.cpp:619 #: src/slic3r/GUI/BedShapeDialog.cpp:642 msgid "Invalid file format." -msgstr "Неправильный формат файла." +msgstr "Неверный формат файла." #: src/slic3r/GUI/BedShapeDialog.cpp:581 msgid "Error! Invalid model" -msgstr "Ошибка! Некорректная модель" +msgstr "Ошибка! Недопустимая модель" #: src/slic3r/GUI/BedShapeDialog.cpp:589 msgid "The selected file contains no geometry." msgstr "Выбранный файл не содержит геометрии." #: src/slic3r/GUI/BedShapeDialog.cpp:593 -msgid "" -"The selected file contains several disjoint areas. This is not supported." +msgid "The selected file contains several disjoint areas. This is not supported." msgstr "" "Выбранный файл содержит несколько не пересекающихся областей. Такие файлы не " "поддерживаются." #: src/slic3r/GUI/BedShapeDialog.cpp:608 msgid "Choose a file to import bed texture from (PNG/SVG):" -msgstr "Выберите файл для импорта текстуры платформы из (PNG/SVG):" +msgstr "Выберите файл для импорта текстуры стола из PNG/SVG:" #: src/slic3r/GUI/BedShapeDialog.cpp:631 msgid "Choose an STL file to import bed model from:" -msgstr "Выберите файл STL для импорта модели платформы из:" +msgstr "Выберите STL файл для импорта формы стола из:" -#: src/slic3r/GUI/BedShapeDialog.hpp:98 src/slic3r/GUI/ConfigWizard.cpp:1318 +#: src/slic3r/GUI/BedShapeDialog.hpp:98 src/slic3r/GUI/ConfigWizard.cpp:1327 msgid "Bed Shape" -msgstr "Форма платформы" +msgstr "Форма и размеры стола" #: src/slic3r/GUI/BonjourDialog.cpp:55 msgid "Network lookup" @@ -337,7 +332,7 @@ msgstr "Адрес" #: src/slic3r/GUI/BonjourDialog.cpp:73 msgid "Hostname" -msgstr "Имя узла" +msgstr "Имя хоста" #: src/slic3r/GUI/BonjourDialog.cpp:74 msgid "Service name" @@ -365,43 +360,40 @@ msgstr "Значение совпадает с системным значени #: src/slic3r/GUI/ButtonsDescription.cpp:53 msgid "" -"Value was changed and is not equal to the system value or the last saved " -"preset" +"Value was changed and is not equal to the system value or the last saved preset" msgstr "" -"Значение изменено и не равно системному значению или последнему сохранённому " -"профилю" +"Значение изменено и не равно системному значению или последнему сохранённому профилю" -#: src/slic3r/GUI/ConfigManipulation.cpp:47 +#: src/slic3r/GUI/ConfigManipulation.cpp:48 msgid "" "Zero layer height is not valid.\n" "\n" "The layer height will be reset to 0.01." msgstr "" -"Нулевая высота слоя не допускается.\n" +"Нулевая высота слоя недопустима.\n" "\n" -"Высота слоя будет установлена равной 0.01." +"Высота слоя будет сброшена на 0.01." -#: src/slic3r/GUI/ConfigManipulation.cpp:48 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1389 -#: src/libslic3r/PrintConfig.cpp:71 +#: src/slic3r/GUI/ConfigManipulation.cpp:49 src/slic3r/GUI/GUI_ObjectLayers.cpp:29 +#: src/slic3r/GUI/Tab.cpp:1387 src/libslic3r/PrintConfig.cpp:73 msgid "Layer height" msgstr "Высота слоя" -#: src/slic3r/GUI/ConfigManipulation.cpp:59 +#: src/slic3r/GUI/ConfigManipulation.cpp:60 msgid "" "Zero first layer height is not valid.\n" "\n" "The first layer height will be reset to 0.01." msgstr "" -"Нулевая высота первого слоя не допускается.\n" +"Нулевая высота первого слоя недопустима.\n" "\n" -"Высота первого слоя будет установлена равной 0.01." +"Высота первого слоя будет сброшена на 0.01." -#: src/slic3r/GUI/ConfigManipulation.cpp:60 src/libslic3r/PrintConfig.cpp:952 +#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:969 msgid "First layer height" msgstr "Высота первого слоя" -#: src/slic3r/GUI/ConfigManipulation.cpp:80 +#: src/slic3r/GUI/ConfigManipulation.cpp:81 msgid "" "The Spiral Vase mode requires:\n" "- one perimeter\n" @@ -411,57 +403,57 @@ msgid "" "- Ensure vertical shell thickness enabled\n" "- Detect thin walls disabled" msgstr "" -"Для режима «Спиральная ваза» требуются настройки:\n" -"- периметр в одну стенку\n" -"- выключение верхних сплошных слоёв\n" +"Требования для режима \"Спиральная ваза\" - т.е. печати внешнего контура по " +"спирали:\n" +"- одностеночный периметр\n" +"- отсутствие верхних сплошных слоёв\n" "- плотность заполнения 0%\n" -"- выключение материала поддержек\n" -"- включение обеспечения толщины вертикальной оболочки\n" -"- выключение обнаружения тонких стенок" +"- отсутствие поддержки\n" +"- включено \"Обеспечивать вертикальную толщину оболочки\"\n" +"- отключено \"Обнаружение тонких стенок\"" -#: src/slic3r/GUI/ConfigManipulation.cpp:88 +#: src/slic3r/GUI/ConfigManipulation.cpp:89 msgid "Shall I adjust those settings in order to enable Spiral Vase?" -msgstr "Изменить эти настройки, чтобы задействовать режим «Спиральная ваза»?" +msgstr "Изменить эти настройки, чтобы включить режим \"Спиральная ваза\"?" -#: src/slic3r/GUI/ConfigManipulation.cpp:89 +#: src/slic3r/GUI/ConfigManipulation.cpp:90 msgid "Spiral Vase" msgstr "Спиральная ваза" -#: src/slic3r/GUI/ConfigManipulation.cpp:114 +#: src/slic3r/GUI/ConfigManipulation.cpp:115 msgid "" "The Wipe Tower currently supports the non-soluble supports only\n" -"if they are printed with the current extruder without triggering a tool " -"change.\n" -"(both support_material_extruder and support_material_interface_extruder need " -"to be set to 0)." +"if they are printed with the current extruder without triggering a tool change.\n" +"(both support_material_extruder and support_material_interface_extruder need to be " +"set to 0)." msgstr "" -"В настоящее время башня очистки поддерживается для нерастворимых поддержек\n" -"только в том случае, если они печатаются текущим экструдером, без запуска\n" -"смены сопла (значения support_material_extruder и\n" -"support_material_interface_extruder должны быть установлены в 0)." +"В настоящее время режим черновой башни поддерживает нерастворимую поддержку\n" +"только в том случае, если она печатается текущим экструдером, без запуска\n" +"смены инструмента. (Значения \"Экструдер, печатающий поддержки/подложки/юбки\"\n" +"и \"Экструдер, печатающий связующий слой поддержки/подложки\" должны быть\n" +"установлены в 0)." -#: src/slic3r/GUI/ConfigManipulation.cpp:118 +#: src/slic3r/GUI/ConfigManipulation.cpp:119 msgid "Shall I adjust those settings in order to enable the Wipe Tower?" -msgstr "Изменить эти настройки, чтобы включить башню очистки?" +msgstr "Изменить эти настройки, чтобы включить черновую башню?" -#: src/slic3r/GUI/ConfigManipulation.cpp:119 -#: src/slic3r/GUI/ConfigManipulation.cpp:139 +#: src/slic3r/GUI/ConfigManipulation.cpp:120 src/slic3r/GUI/ConfigManipulation.cpp:140 msgid "Wipe Tower" -msgstr "Башня очистки" +msgstr "Черновая башня" -#: src/slic3r/GUI/ConfigManipulation.cpp:135 +#: src/slic3r/GUI/ConfigManipulation.cpp:136 msgid "" "For the Wipe Tower to work with the soluble supports, the support layers\n" "need to be synchronized with the object layers." msgstr "" -"Для того, чтобы башня очистки работала для растворимых поддержек,\n" -"слои поддержек должны быть синхронизированы со слоями объекта." +"Для того, чтобы режим черновой башни работал с растворимой поддержкой, \n" +"слои поддержки должны быть синхронизированы со слоями модели." -#: src/slic3r/GUI/ConfigManipulation.cpp:138 +#: src/slic3r/GUI/ConfigManipulation.cpp:139 msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" -msgstr "Синхронизировать слои поддержек, чтобы включить башню очистки?" +msgstr "Синхронизировать слои поддержки, чтобы включить черновую башню?" -#: src/slic3r/GUI/ConfigManipulation.cpp:158 +#: src/slic3r/GUI/ConfigManipulation.cpp:159 msgid "" "Supports work better, if the following feature is enabled:\n" "- Detect bridging perimeters" @@ -469,52 +461,50 @@ msgstr "" "Поддержки работают лучше, если включена следующая функция:\n" "- Определять нависающие периметры" -#: src/slic3r/GUI/ConfigManipulation.cpp:161 +#: src/slic3r/GUI/ConfigManipulation.cpp:162 msgid "Shall I adjust those settings for supports?" -msgstr "Изменить эти настройки для поддержек?" +msgstr "Включить данный параметр для поддержки?" -#: src/slic3r/GUI/ConfigManipulation.cpp:162 +#: src/slic3r/GUI/ConfigManipulation.cpp:163 msgid "Support Generator" -msgstr "Генератор поддержек" +msgstr "Генератор поддержки" -#: src/slic3r/GUI/ConfigManipulation.cpp:207 +#: src/slic3r/GUI/ConfigManipulation.cpp:198 msgid "The %1% infill pattern is not supposed to work at 100%% density." -msgstr "Шаблон заполнения %1% не предполагает работу со 100%% заполнением." +msgstr "Шаблон заполнения %1% не поддерживает 100%% заполнение." -#: src/slic3r/GUI/ConfigManipulation.cpp:209 +#: src/slic3r/GUI/ConfigManipulation.cpp:201 msgid "Shall I switch to rectilinear fill pattern?" msgstr "Заменить его на прямолинейный (Rectilinear)?" -#: src/slic3r/GUI/ConfigManipulation.cpp:210 -#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:93 -#: src/slic3r/GUI/GUI_ObjectList.cpp:652 src/slic3r/GUI/Plater.cpp:389 -#: src/slic3r/GUI/Tab.cpp:1433 src/slic3r/GUI/Tab.cpp:1435 -#: src/libslic3r/PrintConfig.cpp:244 src/libslic3r/PrintConfig.cpp:457 -#: src/libslic3r/PrintConfig.cpp:481 src/libslic3r/PrintConfig.cpp:831 -#: src/libslic3r/PrintConfig.cpp:845 src/libslic3r/PrintConfig.cpp:882 -#: src/libslic3r/PrintConfig.cpp:1048 src/libslic3r/PrintConfig.cpp:1058 -#: src/libslic3r/PrintConfig.cpp:1125 src/libslic3r/PrintConfig.cpp:1144 -#: src/libslic3r/PrintConfig.cpp:1163 src/libslic3r/PrintConfig.cpp:1896 -#: src/libslic3r/PrintConfig.cpp:1913 +#: src/slic3r/GUI/ConfigManipulation.cpp:202 src/slic3r/GUI/GUI_ObjectList.cpp:35 +#: src/slic3r/GUI/GUI_ObjectList.cpp:93 src/slic3r/GUI/GUI_ObjectList.cpp:668 +#: src/slic3r/GUI/Plater.cpp:389 src/slic3r/GUI/Tab.cpp:1432 +#: src/slic3r/GUI/Tab.cpp:1434 src/libslic3r/PrintConfig.cpp:259 +#: src/libslic3r/PrintConfig.cpp:472 src/libslic3r/PrintConfig.cpp:496 +#: src/libslic3r/PrintConfig.cpp:848 src/libslic3r/PrintConfig.cpp:862 +#: src/libslic3r/PrintConfig.cpp:899 src/libslic3r/PrintConfig.cpp:1076 +#: src/libslic3r/PrintConfig.cpp:1086 src/libslic3r/PrintConfig.cpp:1153 +#: src/libslic3r/PrintConfig.cpp:1172 src/libslic3r/PrintConfig.cpp:1191 +#: src/libslic3r/PrintConfig.cpp:1928 src/libslic3r/PrintConfig.cpp:1945 msgid "Infill" msgstr "Заполнение" -#: src/slic3r/GUI/ConfigManipulation.cpp:325 +#: src/slic3r/GUI/ConfigManipulation.cpp:320 msgid "Head penetration should not be greater than the head width." -msgstr "" -"Погружение головной части не должно быть больше толщины головной части." +msgstr "Глубина проникновения носика поддержки не должна превышать его длину." -#: src/slic3r/GUI/ConfigManipulation.cpp:327 +#: src/slic3r/GUI/ConfigManipulation.cpp:322 msgid "Invalid Head penetration" -msgstr "Некорректное погружение головной части" +msgstr "Недопустимая глубина проникновения носика поддержки" -#: src/slic3r/GUI/ConfigManipulation.cpp:338 +#: src/slic3r/GUI/ConfigManipulation.cpp:333 msgid "Pinhead diameter should be smaller than the pillar diameter." -msgstr "Диаметр точки крепления должен быть меньше диаметра колонны." +msgstr "Диаметр носика поддержки должен быть меньше диаметра тела поддержки." -#: src/slic3r/GUI/ConfigManipulation.cpp:340 +#: src/slic3r/GUI/ConfigManipulation.cpp:335 msgid "Invalid pinhead diameter" -msgstr "Некорректный диаметр точки крепления" +msgstr "Недопустимый диаметр носика поддержки" #: src/slic3r/GUI/ConfigSnapshotDialog.cpp:19 msgid "Upgrade" @@ -528,24 +518,24 @@ msgstr "Понизить версию" msgid "Before roll back" msgstr "Перед откатом к прежнему" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:25 src/libslic3r/PrintConfig.cpp:139 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:25 src/libslic3r/PrintConfig.cpp:143 msgid "User" msgstr "Пользователь" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:28 -#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:309 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:28 src/slic3r/GUI/GUI_Preview.cpp:229 +#: src/libslic3r/ExtrusionEntity.cpp:309 msgid "Unknown" msgstr "Неизвестно" #: src/slic3r/GUI/ConfigSnapshotDialog.cpp:44 msgid "Active" -msgstr "Активировать" +msgstr "Активный" #: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 msgid "PrusaSlicer version" msgstr "Версия PrusaSlicer" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:55 src/libslic3r/Preset.cpp:1257 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:55 src/libslic3r/Preset.cpp:1298 msgid "print" msgstr "печать" @@ -553,20 +543,20 @@ msgstr "печать" msgid "filaments" msgstr "пруток" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:59 src/libslic3r/Preset.cpp:1259 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:59 src/libslic3r/Preset.cpp:1300 msgid "SLA print" -msgstr "Печать SLA" +msgstr "Профиль SLA печати" #: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 src/slic3r/GUI/Plater.cpp:696 -#: src/libslic3r/Preset.cpp:1260 +#: src/libslic3r/Preset.cpp:1301 msgid "SLA material" -msgstr "Материал SLA" +msgstr "Профиль SLA материала" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:62 src/libslic3r/Preset.cpp:1261 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:62 src/libslic3r/Preset.cpp:1302 msgid "printer" msgstr "принтер" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:66 src/slic3r/GUI/Tab.cpp:1306 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:66 src/slic3r/GUI/Tab.cpp:1304 msgid "vendor" msgstr "производитель" @@ -588,7 +578,7 @@ msgstr "модель" #: src/slic3r/GUI/ConfigSnapshotDialog.cpp:72 msgid "variants" -msgstr "модификации" +msgstr "модификация" #: src/slic3r/GUI/ConfigSnapshotDialog.cpp:84 #, c-format @@ -603,157 +593,156 @@ msgstr "Активировать" msgid "Configuration Snapshots" msgstr "Резервные копии конфигурации (снапшот)" -#: src/slic3r/GUI/ConfigWizard.cpp:237 +#: src/slic3r/GUI/ConfigWizard.cpp:242 msgid "nozzle" msgstr "сопло" -#: src/slic3r/GUI/ConfigWizard.cpp:241 +#: src/slic3r/GUI/ConfigWizard.cpp:246 msgid "Alternate nozzles:" -msgstr "Другие сопла:" +msgstr "Альтернативные сопла:" -#: src/slic3r/GUI/ConfigWizard.cpp:305 +#: src/slic3r/GUI/ConfigWizard.cpp:310 msgid "All standard" msgstr "Все стандартные" -#: src/slic3r/GUI/ConfigWizard.cpp:305 +#: src/slic3r/GUI/ConfigWizard.cpp:310 msgid "Standard" msgstr "Стандартные" -#: src/slic3r/GUI/ConfigWizard.cpp:306 src/slic3r/GUI/ConfigWizard.cpp:596 -#: src/slic3r/GUI/Tab.cpp:3555 src/slic3r/GUI/UnsavedChangesDialog.cpp:927 +#: src/slic3r/GUI/ConfigWizard.cpp:311 src/slic3r/GUI/ConfigWizard.cpp:605 +#: src/slic3r/GUI/Tab.cpp:3565 src/slic3r/GUI/UnsavedChangesDialog.cpp:933 msgid "All" msgstr "Все" -#: src/slic3r/GUI/ConfigWizard.cpp:307 src/slic3r/GUI/ConfigWizard.cpp:597 -#: src/slic3r/GUI/DoubleSlider.cpp:1824 src/slic3r/GUI/Plater.cpp:361 +#: src/slic3r/GUI/ConfigWizard.cpp:312 src/slic3r/GUI/ConfigWizard.cpp:606 +#: src/slic3r/GUI/DoubleSlider.cpp:1859 src/slic3r/GUI/Plater.cpp:361 #: src/slic3r/GUI/Plater.cpp:504 msgid "None" msgstr "Нет" -#: src/slic3r/GUI/ConfigWizard.cpp:443 +#: src/slic3r/GUI/ConfigWizard.cpp:452 #, c-format msgid "Welcome to the %s Configuration Assistant" -msgstr "Помощник по настройке %s" +msgstr "Приветствуем вас в мастере настройки %s" -#: src/slic3r/GUI/ConfigWizard.cpp:445 +#: src/slic3r/GUI/ConfigWizard.cpp:454 #, c-format msgid "Welcome to the %s Configuration Wizard" -msgstr "Мастер настройки %s" +msgstr "Приветствуем вас в мастере настройки %s" -#: src/slic3r/GUI/ConfigWizard.cpp:447 +#: src/slic3r/GUI/ConfigWizard.cpp:456 msgid "Welcome" msgstr "Начало" -#: src/slic3r/GUI/ConfigWizard.cpp:449 +#: src/slic3r/GUI/ConfigWizard.cpp:458 #, c-format msgid "" -"Hello, welcome to %s! This %s helps you with the initial configuration; just " -"a few settings and you will be ready to print." +"Hello, welcome to %s! This %s helps you with the initial configuration; just a few " +"settings and you will be ready to print." msgstr "" -"Приветствуем вас в %s! %s поможет вам с начальной настройкой программы; " -"всего несколько вопросов и вы сможете печатать." +"Приветствуем вас в %s! Этот мастер настройки %s поможет вам с начальной настройкой " +"программы." -#: src/slic3r/GUI/ConfigWizard.cpp:454 +#: src/slic3r/GUI/ConfigWizard.cpp:463 msgid "Remove user profiles (a snapshot will be taken beforehand)" -msgstr "Удалить профили пользователей (перед этим будет сделан снапшот)" +msgstr "Удалить профили пользователя (снапшот будет сделан заранее)" -#: src/slic3r/GUI/ConfigWizard.cpp:497 +#: src/slic3r/GUI/ConfigWizard.cpp:506 #, c-format msgid "%s Family" -msgstr "Семейство %s" +msgstr "Семейство принтеров %s" -#: src/slic3r/GUI/ConfigWizard.cpp:585 +#: src/slic3r/GUI/ConfigWizard.cpp:594 msgid "Printer:" -msgstr "" +msgstr "Принтер:" -#: src/slic3r/GUI/ConfigWizard.cpp:587 +#: src/slic3r/GUI/ConfigWizard.cpp:596 msgid "Vendor:" msgstr "Производитель:" -#: src/slic3r/GUI/ConfigWizard.cpp:588 +#: src/slic3r/GUI/ConfigWizard.cpp:597 msgid "Profile:" msgstr "Профиль:" -#: src/slic3r/GUI/ConfigWizard.cpp:660 src/slic3r/GUI/ConfigWizard.cpp:810 -#: src/slic3r/GUI/ConfigWizard.cpp:871 src/slic3r/GUI/ConfigWizard.cpp:1008 +#: src/slic3r/GUI/ConfigWizard.cpp:669 src/slic3r/GUI/ConfigWizard.cpp:819 +#: src/slic3r/GUI/ConfigWizard.cpp:880 src/slic3r/GUI/ConfigWizard.cpp:1017 msgid "(All)" msgstr "(Все)" -#: src/slic3r/GUI/ConfigWizard.cpp:689 +#: src/slic3r/GUI/ConfigWizard.cpp:698 msgid "" "Filaments marked with * are not compatible with some installed " "printers." msgstr "" +"Прутки помеченные знаком *, не несовместимы с некоторыми " +"установленными принтерами." -#: src/slic3r/GUI/ConfigWizard.cpp:692 +#: src/slic3r/GUI/ConfigWizard.cpp:701 msgid "All installed printers are compatible with the selected filament." -msgstr "" +msgstr "Все установленные принтеры совместимы с выбранным прутком." -#: src/slic3r/GUI/ConfigWizard.cpp:712 +#: src/slic3r/GUI/ConfigWizard.cpp:721 msgid "" -"Only the following installed printers are compatible with the selected " -"filament:" +"Only the following installed printers are compatible with the selected filament:" msgstr "" +"Только следующие установленные принтеры совместимы с выбранным прутком:" -#: src/slic3r/GUI/ConfigWizard.cpp:1098 +#: src/slic3r/GUI/ConfigWizard.cpp:1107 msgid "Custom Printer Setup" -msgstr "Установки заказного принтера" +msgstr "Настройка пользовательского принтера" -#: src/slic3r/GUI/ConfigWizard.cpp:1098 +#: src/slic3r/GUI/ConfigWizard.cpp:1107 msgid "Custom Printer" -msgstr "Заказной принтер" +msgstr "Пользовательский принтер" -#: src/slic3r/GUI/ConfigWizard.cpp:1100 +#: src/slic3r/GUI/ConfigWizard.cpp:1109 msgid "Define a custom printer profile" -msgstr "Создать профиль заказного принтера" +msgstr "Задать имя пользовательского профиля" -#: src/slic3r/GUI/ConfigWizard.cpp:1102 +#: src/slic3r/GUI/ConfigWizard.cpp:1111 msgid "Custom profile name:" -msgstr "Имя заказного профиля:" +msgstr "Имя пользовательского профиля:" -#: src/slic3r/GUI/ConfigWizard.cpp:1127 +#: src/slic3r/GUI/ConfigWizard.cpp:1136 msgid "Automatic updates" msgstr "Автоматическое обновление" -#: src/slic3r/GUI/ConfigWizard.cpp:1127 +#: src/slic3r/GUI/ConfigWizard.cpp:1136 msgid "Updates" msgstr "Обновления" -#: src/slic3r/GUI/ConfigWizard.cpp:1135 src/slic3r/GUI/Preferences.cpp:73 +#: src/slic3r/GUI/ConfigWizard.cpp:1144 src/slic3r/GUI/Preferences.cpp:94 msgid "Check for application updates" -msgstr "Проверять обновления" +msgstr "Проверка обновлений" -#: src/slic3r/GUI/ConfigWizard.cpp:1139 +#: src/slic3r/GUI/ConfigWizard.cpp:1148 #, 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." +"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 "" -"Если включено, то %s проверяет наличие новых версий приложения в сети. Если " -"доступна новая версия, то при следующем запуске отображается уведомление (не " -"отображается во время работы программы). Автоматическая установка не " -"производится. Вы увидите только уведомление." +"Если включено, %s проверяет наличие новых версий программы в сети. Если доступна " +"новая версия, при следующем запуске отображается уведомление (не во время работы " +"программы). Автоматическая установка не производится. Вы увидите только уведомление." -#: src/slic3r/GUI/ConfigWizard.cpp:1145 src/slic3r/GUI/Preferences.cpp:108 +#: src/slic3r/GUI/ConfigWizard.cpp:1154 src/slic3r/GUI/Preferences.cpp:129 msgid "Update built-in Presets automatically" msgstr "Обновлять встроенные профили автоматически" -#: src/slic3r/GUI/ConfigWizard.cpp:1149 +#: src/slic3r/GUI/ConfigWizard.cpp:1158 #, 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." +"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 "" -"Если включено, то %s будет скачивать обновления встроенных системных " -"профилей в фоновом режиме. Эти обновления скачиваются в отдельный временный " -"каталог. Когда новые профили становятся доступны, они предлагаются при " -"запуске приложения." +"Если включено, %s будет загружать обновления встроенных системных профилей в " +"фоновом режиме. Эти обновления загружаются в отдельную временную папку. Когда новые " +"профили становятся доступны, они предлагаются при запуске приложения." -#: src/slic3r/GUI/ConfigWizard.cpp:1152 +#: src/slic3r/GUI/ConfigWizard.cpp:1161 msgid "" "Updates are never applied without user's consent and never overwrite user's " "customized settings." @@ -761,685 +750,725 @@ msgstr "" "Обновления никогда не применяются без согласия пользователя и никогда не " "перезаписывают пользовательские настройки." -#: src/slic3r/GUI/ConfigWizard.cpp:1157 +#: src/slic3r/GUI/ConfigWizard.cpp:1166 msgid "" -"Additionally a backup snapshot of the whole configuration is created before " -"an update is applied." +"Additionally a backup snapshot of the whole configuration is created before an " +"update is applied." msgstr "" -"Кроме того, перед обновлением создаётся резервная копия всех настроек " -"(снапшот)." +"Кроме того, перед обновлением создаётся резервная копия всей конфигурации (снапшот)." -#: src/slic3r/GUI/ConfigWizard.cpp:1164 src/slic3r/GUI/GUI_ObjectList.cpp:1793 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4439 src/slic3r/GUI/Plater.cpp:3091 -#: src/slic3r/GUI/Plater.cpp:3924 src/slic3r/GUI/Plater.cpp:3955 +#: src/slic3r/GUI/ConfigWizard.cpp:1173 src/slic3r/GUI/GUI_ObjectList.cpp:1825 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4567 src/slic3r/GUI/Plater.cpp:3116 +#: src/slic3r/GUI/Plater.cpp:4001 src/slic3r/GUI/Plater.cpp:4032 msgid "Reload from disk" msgstr "Перезагрузить с диска" -#: src/slic3r/GUI/ConfigWizard.cpp:1167 -msgid "" -"Export full pathnames of models and parts sources into 3mf and amf files" -msgstr "" -"Экспортировать полные имена источников моделей и частей в файлы 3mf и amf" +#: src/slic3r/GUI/ConfigWizard.cpp:1176 +msgid "Export full pathnames of models and parts sources into 3mf and amf files" +msgstr "При экспорте в 3mf и amf, сохранять полные пути к исходным файлам" -#: src/slic3r/GUI/ConfigWizard.cpp:1171 +#: src/slic3r/GUI/ConfigWizard.cpp:1180 msgid "" -"If enabled, allows the Reload from disk command to automatically find and " -"load the files when invoked.\n" -"If not enabled, the Reload from disk command will ask to select each file " -"using an open file dialog." +"If enabled, allows the Reload from disk command to automatically find and load the " +"files when invoked.\n" +"If not enabled, the Reload from disk command will ask to select each file using an " +"open file dialog." msgstr "" -"Если включено, команда перезагрузки с диска автоматически будет находить и " -"загружать файлы при вызове.\n" -"Если выключено, то команда перезагрузки с диска будет запрашивать каждый " -"файл через окно диалога открытия файлов." +"Если включено, при выполнении команды \"Перезагрузить с диска\" программа будут " +"автоматически находить и загружать файлы проекта. \n" +"В противном случае, будет предложено выбрать каждый файл с помощью диалогового окна " +"открытия файла." -#: src/slic3r/GUI/ConfigWizard.cpp:1181 +#: src/slic3r/GUI/ConfigWizard.cpp:1190 msgid "Files association" -msgstr "" +msgstr "Ассоциация файлов" -#: src/slic3r/GUI/ConfigWizard.cpp:1183 src/slic3r/GUI/Preferences.cpp:91 +#: src/slic3r/GUI/ConfigWizard.cpp:1192 src/slic3r/GUI/Preferences.cpp:112 msgid "Associate .3mf files to PrusaSlicer" -msgstr "" +msgstr "Ассоциировать файлы .3mf с PrusaSlicer" -#: src/slic3r/GUI/ConfigWizard.cpp:1184 src/slic3r/GUI/Preferences.cpp:98 +#: src/slic3r/GUI/ConfigWizard.cpp:1193 src/slic3r/GUI/Preferences.cpp:119 msgid "Associate .stl files to PrusaSlicer" -msgstr "" +msgstr "Ассоциировать файлы .stl с PrusaSlicer" -#: src/slic3r/GUI/ConfigWizard.cpp:1195 +#: src/slic3r/GUI/ConfigWizard.cpp:1204 msgid "View mode" msgstr "Режим просмотра" -#: src/slic3r/GUI/ConfigWizard.cpp:1197 +#: src/slic3r/GUI/ConfigWizard.cpp:1206 msgid "" "PrusaSlicer's user interfaces comes in three variants:\n" "Simple, Advanced, and Expert.\n" -"The Simple mode shows only the most frequently used settings relevant for " -"regular 3D printing. The other two offer progressively more sophisticated " -"fine-tuning, they are suitable for advanced and expert users, respectively." -msgstr "" -"В PrusaSlicer есть три режима пользовательского интерфейса:\n" -"простой, расширенный и экспертный.\n" -"В простом режиме показываются только наиболее часто употребляемые настройки " -"обычной печати 3D. В других двух по нарастающей предлагаются дополнительные " -"технически сложные параметры для точной настройки; эти режимы подходят для " -"понимающих процесс и экспертных пользователей." - -#: src/slic3r/GUI/ConfigWizard.cpp:1202 +"The Simple mode shows only the most frequently used settings relevant for regular " +"3D printing. The other two offer progressively more sophisticated fine-tuning, they " +"are suitable for advanced and expert users, respectively." +msgstr "" +"Пользовательский интерфейс PrusaSlicer представлен тремя вариантами:\n" +"Простой, Расширенный, Продвинутый.\n" +"В простом режиме отображаются только наиболее часто используемые параметры 3D-" +"печати. Два других предлагают более тонкую расширенную настройку. Они подходят для " +"продвинутых и опытных пользователей." + +#: src/slic3r/GUI/ConfigWizard.cpp:1211 msgid "Simple mode" -msgstr "Простой режим" +msgstr "Простой" -#: src/slic3r/GUI/ConfigWizard.cpp:1203 +#: src/slic3r/GUI/ConfigWizard.cpp:1212 msgid "Advanced mode" -msgstr "Расширенный режим" +msgstr "Расширенный" -#: src/slic3r/GUI/ConfigWizard.cpp:1204 +#: src/slic3r/GUI/ConfigWizard.cpp:1213 msgid "Expert mode" -msgstr "Экспертный режим" +msgstr "Продвинутый" -#: src/slic3r/GUI/ConfigWizard.cpp:1210 +#: src/slic3r/GUI/ConfigWizard.cpp:1219 msgid "The size of the object can be specified in inches" -msgstr "" +msgstr "Размер модели может быть указан в дюймах" -#: src/slic3r/GUI/ConfigWizard.cpp:1211 +#: src/slic3r/GUI/ConfigWizard.cpp:1220 msgid "Use inches" -msgstr "" +msgstr "Использовать дюймы" -#: src/slic3r/GUI/ConfigWizard.cpp:1245 +#: src/slic3r/GUI/ConfigWizard.cpp:1254 msgid "Other Vendors" msgstr "Другие производители" -#: src/slic3r/GUI/ConfigWizard.cpp:1249 +#: src/slic3r/GUI/ConfigWizard.cpp:1258 #, c-format msgid "Pick another vendor supported by %s" -msgstr "Выберите другого производителя, поддерживаемого %s" +msgstr "Выберите другого производителя, поддерживающего %s" -#: src/slic3r/GUI/ConfigWizard.cpp:1280 +#: src/slic3r/GUI/ConfigWizard.cpp:1289 msgid "Firmware Type" msgstr "Тип прошивки" -#: src/slic3r/GUI/ConfigWizard.cpp:1280 src/slic3r/GUI/Tab.cpp:2172 +#: src/slic3r/GUI/ConfigWizard.cpp:1289 src/slic3r/GUI/Tab.cpp:2172 msgid "Firmware" msgstr "Прошивка" -#: src/slic3r/GUI/ConfigWizard.cpp:1284 +#: src/slic3r/GUI/ConfigWizard.cpp:1293 msgid "Choose the type of firmware used by your printer." msgstr "Выберите тип прошивки вашего принтера." -#: src/slic3r/GUI/ConfigWizard.cpp:1318 +#: src/slic3r/GUI/ConfigWizard.cpp:1327 msgid "Bed Shape and Size" -msgstr "Форма и размеры" +msgstr "Форма и размеры стола" -#: src/slic3r/GUI/ConfigWizard.cpp:1321 +#: src/slic3r/GUI/ConfigWizard.cpp:1330 msgid "Set the shape of your printer's bed." -msgstr "Задайте форму и размеры платформы принтера." +msgstr "Задайте форму и размеры вашего стола." -#: src/slic3r/GUI/ConfigWizard.cpp:1341 +#: src/slic3r/GUI/ConfigWizard.cpp:1350 msgid "Filament and Nozzle Diameters" msgstr "Диаметр прутка и сопла" -#: src/slic3r/GUI/ConfigWizard.cpp:1341 +#: src/slic3r/GUI/ConfigWizard.cpp:1350 msgid "Print Diameters" msgstr "Диаметры печати" -#: src/slic3r/GUI/ConfigWizard.cpp:1355 +#: src/slic3r/GUI/ConfigWizard.cpp:1364 msgid "Enter the diameter of your printer's hot end nozzle." msgstr "Введите диаметр сопла." -#: src/slic3r/GUI/ConfigWizard.cpp:1358 +#: src/slic3r/GUI/ConfigWizard.cpp:1367 msgid "Nozzle Diameter:" msgstr "Диаметр сопла:" -#: src/slic3r/GUI/ConfigWizard.cpp:1368 +#: src/slic3r/GUI/ConfigWizard.cpp:1377 msgid "Enter the diameter of your filament." msgstr "Введите диаметр прутка." -#: src/slic3r/GUI/ConfigWizard.cpp:1369 +#: src/slic3r/GUI/ConfigWizard.cpp:1378 msgid "" -"Good precision is required, so use a caliper and do multiple measurements " -"along the filament, then compute the average." +"Good precision is required, so use a caliper and do multiple measurements along the " +"filament, then compute the average." msgstr "" "Необходима хорошая точность, поэтому используйте штангенциркуль и выполните " "несколько измерений вдоль прутка, а затем вычислите среднее значение." -#: src/slic3r/GUI/ConfigWizard.cpp:1372 +#: src/slic3r/GUI/ConfigWizard.cpp:1381 msgid "Filament Diameter:" msgstr "Диаметр прутка:" -#: src/slic3r/GUI/ConfigWizard.cpp:1406 +#: src/slic3r/GUI/ConfigWizard.cpp:1415 msgid "Nozzle and Bed Temperatures" -msgstr "" +msgstr "Температуры сопла и стола" -#: src/slic3r/GUI/ConfigWizard.cpp:1406 +#: src/slic3r/GUI/ConfigWizard.cpp:1415 msgid "Temperatures" -msgstr "Температуры" +msgstr "Температура" -#: src/slic3r/GUI/ConfigWizard.cpp:1422 +#: src/slic3r/GUI/ConfigWizard.cpp:1431 msgid "Enter the temperature needed for extruding your filament." -msgstr "Введите температуру, которая требуется для экструзии прутка." +msgstr "Введите температуру, требуемую для экструзии прутка." -#: src/slic3r/GUI/ConfigWizard.cpp:1423 +#: src/slic3r/GUI/ConfigWizard.cpp:1432 msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." msgstr "Как правило для PLA это 160-230 °C, а для ABS 215-250 °C." -#: src/slic3r/GUI/ConfigWizard.cpp:1426 +#: src/slic3r/GUI/ConfigWizard.cpp:1435 msgid "Extrusion Temperature:" msgstr "Температура экструзии:" -#: src/slic3r/GUI/ConfigWizard.cpp:1427 src/slic3r/GUI/ConfigWizard.cpp:1441 -#: src/libslic3r/PrintConfig.cpp:187 src/libslic3r/PrintConfig.cpp:933 -#: src/libslic3r/PrintConfig.cpp:977 src/libslic3r/PrintConfig.cpp:2262 +#: src/slic3r/GUI/ConfigWizard.cpp:1436 src/slic3r/GUI/ConfigWizard.cpp:1450 +#: src/libslic3r/PrintConfig.cpp:202 src/libslic3r/PrintConfig.cpp:950 +#: src/libslic3r/PrintConfig.cpp:994 src/libslic3r/PrintConfig.cpp:2294 msgid "°C" msgstr "°C" -#: src/slic3r/GUI/ConfigWizard.cpp:1436 +#: src/slic3r/GUI/ConfigWizard.cpp:1445 msgid "" -"Enter the bed temperature needed for getting your filament to stick to your " -"heated bed." +"Enter the bed temperature needed for getting your filament to stick to your heated " +"bed." msgstr "" -"Введите температуру платформы, необходимую для того, чтобы пруток прилипал к " -"ней." +"Введите температуру стола, необходимую для того, чтобы пруток прилипал к нему." -#: src/slic3r/GUI/ConfigWizard.cpp:1437 +#: src/slic3r/GUI/ConfigWizard.cpp:1446 msgid "" -"A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have " -"no heated bed." +"A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have no " +"heated bed." msgstr "" -"Как правило для PLA это 60 °C, а для ABS 110 °С. Если у вас платформы без " -"подогрева, оставьте 0." +"Как правило для PLA это 60 °C, а для ABS 110 °С. Если у вас не подогреваемый стол, " +"установите 0." -#: src/slic3r/GUI/ConfigWizard.cpp:1440 +#: src/slic3r/GUI/ConfigWizard.cpp:1449 msgid "Bed Temperature:" -msgstr "Температура платформы:" +msgstr "Температура стола:" -#: src/slic3r/GUI/ConfigWizard.cpp:1900 src/slic3r/GUI/ConfigWizard.cpp:2572 +#: src/slic3r/GUI/ConfigWizard.cpp:1909 src/slic3r/GUI/ConfigWizard.cpp:2582 msgid "Filaments" -msgstr "Прутки" +msgstr "Пластиковые нити (прутки)" -#: src/slic3r/GUI/ConfigWizard.cpp:1900 src/slic3r/GUI/ConfigWizard.cpp:2574 +#: src/slic3r/GUI/ConfigWizard.cpp:1909 src/slic3r/GUI/ConfigWizard.cpp:2584 msgid "SLA Materials" -msgstr "Материалы SLA" +msgstr "SLA материалы (фотополимерная смола)" -#: src/slic3r/GUI/ConfigWizard.cpp:1954 +#: src/slic3r/GUI/ConfigWizard.cpp:1963 msgid "FFF Technology Printers" -msgstr "Принтеры с технологией печати FFF" +msgstr "Принтеры, печатающие по технологии методом наплавления нитей (FFF)" -#: src/slic3r/GUI/ConfigWizard.cpp:1959 +#: src/slic3r/GUI/ConfigWizard.cpp:1968 msgid "SLA Technology Printers" -msgstr "Принтеры с технологией печати SLA" +msgstr "Принтеры, печатающие по технологии масочной ЖК-стереолитографии (SLA)" -#: src/slic3r/GUI/ConfigWizard.cpp:2265 src/slic3r/GUI/DoubleSlider.cpp:2207 -#: src/slic3r/GUI/DoubleSlider.cpp:2227 src/slic3r/GUI/GUI.cpp:244 +#: src/slic3r/GUI/ConfigWizard.cpp:2274 src/slic3r/GUI/DoubleSlider.cpp:2245 +#: src/slic3r/GUI/DoubleSlider.cpp:2265 src/slic3r/GUI/GUI.cpp:244 msgid "Notice" msgstr "Примечание" -#: src/slic3r/GUI/ConfigWizard.cpp:2285 +#: src/slic3r/GUI/ConfigWizard.cpp:2295 msgid "The following FFF printer models have no filament selected:" -msgstr "Для следующих моделей принтеров FFF не указаны прутки:" +msgstr "В следующих моделях FFF принтеров не выбран пруток:" -#: src/slic3r/GUI/ConfigWizard.cpp:2289 +#: src/slic3r/GUI/ConfigWizard.cpp:2299 msgid "Do you want to select default filaments for these FFF printer models?" -msgstr "Хотите выбрать прутки по умолчанию для этих моделей принтеров FFF?" +msgstr "Выбрать пруки по умолчанию для этих моделей FFF принтеров?" -#: src/slic3r/GUI/ConfigWizard.cpp:2303 +#: src/slic3r/GUI/ConfigWizard.cpp:2313 msgid "The following SLA printer models have no materials selected:" -msgstr "Для следующих моделей принтеров SLA не указан материал:" +msgstr "В следующих моделях SLA принтеров не выбрана фотополимерная смола:" -#: src/slic3r/GUI/ConfigWizard.cpp:2307 +#: src/slic3r/GUI/ConfigWizard.cpp:2317 msgid "Do you want to select default SLA materials for these printer models?" -msgstr "Хотите выбрать материалы по умолчанию для этих моделей принтеров SLA?" +msgstr "Выбрать фотополимерный смолы по умолчанию для этих моделей SLA принтеров?" -#: src/slic3r/GUI/ConfigWizard.cpp:2535 +#: src/slic3r/GUI/ConfigWizard.cpp:2545 msgid "Select all standard printers" msgstr "Выбрать все стандартные принтеры" -#: src/slic3r/GUI/ConfigWizard.cpp:2538 +#: src/slic3r/GUI/ConfigWizard.cpp:2548 msgid "< &Back" msgstr "< &Назад" -#: src/slic3r/GUI/ConfigWizard.cpp:2539 +#: src/slic3r/GUI/ConfigWizard.cpp:2549 msgid "&Next >" msgstr "&Далее >" -#: src/slic3r/GUI/ConfigWizard.cpp:2540 +#: src/slic3r/GUI/ConfigWizard.cpp:2550 msgid "&Finish" msgstr "&Завершить" -#: src/slic3r/GUI/ConfigWizard.cpp:2541 src/slic3r/GUI/FirmwareDialog.cpp:151 +#: src/slic3r/GUI/ConfigWizard.cpp:2551 src/slic3r/GUI/FirmwareDialog.cpp:151 #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:248 -#: src/slic3r/GUI/ProgressStatusBar.cpp:26 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:650 +#: src/slic3r/GUI/ProgressStatusBar.cpp:26 src/slic3r/GUI/UnsavedChangesDialog.cpp:656 msgid "Cancel" msgstr "Отмена" -#: src/slic3r/GUI/ConfigWizard.cpp:2554 +#: src/slic3r/GUI/ConfigWizard.cpp:2564 msgid "Prusa FFF Technology Printers" -msgstr "Принтеры Prusa с технологией печати FFF" +msgstr "Принтеры Prusa, печатающие по технологии методом наплавления нитей (FFF)" -#: src/slic3r/GUI/ConfigWizard.cpp:2557 +#: src/slic3r/GUI/ConfigWizard.cpp:2567 msgid "Prusa MSLA Technology Printers" -msgstr "Принтеры Prusa с технологией печати MSLA" +msgstr "Принтеры Prusa, печатающие по технологии масочной ЖК-стереолитографии (MSLA)" -#: src/slic3r/GUI/ConfigWizard.cpp:2572 +#: src/slic3r/GUI/ConfigWizard.cpp:2582 msgid "Filament Profiles Selection" msgstr "Выбор профилей прутка" -#: src/slic3r/GUI/ConfigWizard.cpp:2572 src/slic3r/GUI/ConfigWizard.cpp:2574 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4016 +#: src/slic3r/GUI/ConfigWizard.cpp:2582 src/slic3r/GUI/ConfigWizard.cpp:2584 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4144 msgid "Type:" msgstr "Тип:" -#: src/slic3r/GUI/ConfigWizard.cpp:2574 +#: src/slic3r/GUI/ConfigWizard.cpp:2584 msgid "SLA Material Profiles Selection" -msgstr "Выбор профилей материалов SLA" +msgstr "Выбор профилей фотополимерной смолы (SLA)" -#: src/slic3r/GUI/ConfigWizard.cpp:2677 +#: src/slic3r/GUI/ConfigWizard.cpp:2701 msgid "Configuration Assistant" msgstr "Помощник по настройке" -#: src/slic3r/GUI/ConfigWizard.cpp:2678 +#: src/slic3r/GUI/ConfigWizard.cpp:2702 msgid "Configuration &Assistant" -msgstr "Помощник по настройке" +msgstr "Помощник по &настройке" -#: src/slic3r/GUI/ConfigWizard.cpp:2680 +#: src/slic3r/GUI/ConfigWizard.cpp:2704 msgid "Configuration Wizard" msgstr "Мастер настройки" -#: src/slic3r/GUI/ConfigWizard.cpp:2681 +#: src/slic3r/GUI/ConfigWizard.cpp:2705 msgid "Configuration &Wizard" -msgstr "Мастер настройки" +msgstr "&Мастер настройки" -#: src/slic3r/GUI/DoubleSlider.cpp:96 +#: src/slic3r/GUI/DoubleSlider.cpp:97 msgid "Place bearings in slots and resume printing" -msgstr "" +msgstr "Поместите в посадочное место необходимую деталь и возобновите печать" -#: src/slic3r/GUI/DoubleSlider.cpp:1211 +#: src/slic3r/GUI/DoubleSlider.cpp:1224 msgid "One layer mode" -msgstr "Однослойный режим" +msgstr "Режим одного слоя" -#: src/slic3r/GUI/DoubleSlider.cpp:1213 +#: src/slic3r/GUI/DoubleSlider.cpp:1226 msgid "Discard all custom changes" -msgstr "Отбросить все пользовательские изменения" +msgstr "Отменить все пользовательские изменения" -#: src/slic3r/GUI/DoubleSlider.cpp:1217 src/slic3r/GUI/DoubleSlider.cpp:1960 +#: src/slic3r/GUI/DoubleSlider.cpp:1230 src/slic3r/GUI/DoubleSlider.cpp:1995 msgid "Jump to move" -msgstr "" +msgstr "Перейти к заданному перемещению" -#: src/slic3r/GUI/DoubleSlider.cpp:1220 +#: src/slic3r/GUI/DoubleSlider.cpp:1233 #, c-format msgid "" -"Jump to height %s Set ruler mode\n" -" or Set extruder sequence for the entire print" +"Jump to height %s\n" +"Set ruler mode\n" +"or Set extruder sequence for the entire print" msgstr "" +"Перейти к заданной высоте %s\n" +"Задать режимы линейки\n" +"или задать последовательность экструдеров для всей печати" -#: src/slic3r/GUI/DoubleSlider.cpp:1222 +#: src/slic3r/GUI/DoubleSlider.cpp:1236 #, c-format -msgid "Jump to height %s or Set ruler mode" +msgid "" +"Jump to height %s\n" +"or Set ruler mode" msgstr "" +"Перейти к заданной высоте %s\n" +"или задать режимы линейки" -#: src/slic3r/GUI/DoubleSlider.cpp:1226 +#: src/slic3r/GUI/DoubleSlider.cpp:1241 msgid "Edit current color - Right click the colored slider segment" -msgstr "Изменить текущий цвет — Правым щелчком по раскрашенной части ползунка" +msgstr "Изменить текущий цвет - Правая кнопка мыши по цветному сегменту ползунка" -#: src/slic3r/GUI/DoubleSlider.cpp:1236 +#: src/slic3r/GUI/DoubleSlider.cpp:1251 msgid "Print mode" -msgstr "Режим принтера" +msgstr "Режим печати" -#: src/slic3r/GUI/DoubleSlider.cpp:1250 +#: src/slic3r/GUI/DoubleSlider.cpp:1265 msgid "Add extruder change - Left click" -msgstr "Добавить \"Сменить экструдер\" - левый щелчок мыши" +msgstr "Добавить маркер смены экструдера - Левая кнопка мыши" -#: src/slic3r/GUI/DoubleSlider.cpp:1252 +#: src/slic3r/GUI/DoubleSlider.cpp:1267 msgid "" -"Add color change - Left click for predefined color or Shift + Left click for " -"custom color selection" +"Add color change - Left click for predefined color or Shift + Left click for custom " +"color selection" msgstr "" +"Добавить маркер смены цвета - Левая кнопка мыши для цвета из списка цветов по " +"умолчанию или Shift + Левая кнопка мыши для выбора своего цвета" -#: src/slic3r/GUI/DoubleSlider.cpp:1254 +#: src/slic3r/GUI/DoubleSlider.cpp:1269 msgid "Add color change - Left click" -msgstr "Добавить \"Сменить цвет\" - левый щелчок мыши" +msgstr "Добавить маркер смены цвета - Левая кнопка мыши" -#: src/slic3r/GUI/DoubleSlider.cpp:1255 +#: src/slic3r/GUI/DoubleSlider.cpp:1270 msgid "or press \"+\" key" -msgstr "" +msgstr "или клавиша \"+\"" -#: src/slic3r/GUI/DoubleSlider.cpp:1257 +#: src/slic3r/GUI/DoubleSlider.cpp:1272 msgid "Add another code - Ctrl + Left click" -msgstr "" +msgstr "Для добавления другого кода - Ctrl + левая кнопка мыши" -#: src/slic3r/GUI/DoubleSlider.cpp:1258 +#: src/slic3r/GUI/DoubleSlider.cpp:1273 msgid "Add another code - Right click" -msgstr "" +msgstr "Для добавления другого кода - Правая кнопка мыши" -#: src/slic3r/GUI/DoubleSlider.cpp:1264 +#: src/slic3r/GUI/DoubleSlider.cpp:1279 msgid "" "The sequential print is on.\n" -"It's impossible to apply any custom G-code for objects printing " -"sequentually.\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 "" +"Включена последовательная печать.\n" +"При последовательной печати, невозможно применение какого-либо пользовательского G-" +"кода.\n" +"Этот код не будет обрабатываться во время генерации G-кода." -#: src/slic3r/GUI/DoubleSlider.cpp:1273 +#: src/slic3r/GUI/DoubleSlider.cpp:1288 msgid "Color change (\"%1%\")" -msgstr "Смена цвета («%1%»)" +msgstr "Маркер смены цвета (\"%1%\")" -#: src/slic3r/GUI/DoubleSlider.cpp:1274 +#: src/slic3r/GUI/DoubleSlider.cpp:1289 msgid "Color change (\"%1%\") for Extruder %2%" -msgstr "Смена цвета («%1%») для экструдера %2%" +msgstr "Смена цвета (\"%1%\") для экструдера %2%" -#: src/slic3r/GUI/DoubleSlider.cpp:1276 +#: src/slic3r/GUI/DoubleSlider.cpp:1291 msgid "Pause print (\"%1%\")" -msgstr "Пауза печати («%1%»)" +msgstr "Пауза печати (\"%1%\")" -#: src/slic3r/GUI/DoubleSlider.cpp:1278 +#: src/slic3r/GUI/DoubleSlider.cpp:1293 msgid "Custom template (\"%1%\")" -msgstr "" +msgstr "Пользовательский шаблон \"%1%\")" -#: src/slic3r/GUI/DoubleSlider.cpp:1280 +#: src/slic3r/GUI/DoubleSlider.cpp:1295 msgid "Extruder (tool) is changed to Extruder \"%1%\"" -msgstr "Экструдер (инструмент) сменен на экструдер «%1%»" +msgstr "Экструдер (инструмент) заменён на экструдер \"%1%\"" -#: src/slic3r/GUI/DoubleSlider.cpp:1287 +#: src/slic3r/GUI/DoubleSlider.cpp:1302 msgid "Note" msgstr "Примечание" -#: src/slic3r/GUI/DoubleSlider.cpp:1289 +#: src/slic3r/GUI/DoubleSlider.cpp:1304 msgid "" "G-code associated to this tick mark is in a conflict with print mode.\n" "Editing it will cause changes of Slider data." msgstr "" +"G-код, связанный с этим маркером, конфликтует с режимом печати.\n" +"Его редактирование приведёт к изменениям данных ползунка." -#: src/slic3r/GUI/DoubleSlider.cpp:1292 +#: src/slic3r/GUI/DoubleSlider.cpp:1307 msgid "" -"There is a color change for extruder that won't be used till the end of " -"print job.\n" +"There is a color change for extruder that won't be used till the end of print job.\n" "This code won't be processed during G-code generation." msgstr "" +"Произведена смена цвета для экструдера, который не будет использоваться до конца " +"печати.\n" +"Этот код не будет обрабатываться во время генерации G-кода." -#: src/slic3r/GUI/DoubleSlider.cpp:1295 +#: src/slic3r/GUI/DoubleSlider.cpp:1310 msgid "" "There is an extruder change set to the same extruder.\n" "This code won't be processed during G-code generation." msgstr "" +"Существующий экструдер заменён на тот же экструдер.\n" +"Этот код не будет обрабатываться во время генерации G-кода." -#: src/slic3r/GUI/DoubleSlider.cpp:1298 +#: src/slic3r/GUI/DoubleSlider.cpp:1313 msgid "" "There is a color change for extruder that has not been used before.\n" "Check your settings to avoid redundant color changes." msgstr "" +"Произведена смена цвета для экструдера, который ранее не использовался.\n" +"Проверьте настройки, чтобы избежать лишней смены цвета." -#: src/slic3r/GUI/DoubleSlider.cpp:1303 +#: src/slic3r/GUI/DoubleSlider.cpp:1318 msgid "Delete tick mark - Left click or press \"-\" key" msgstr "" +"Удалить маркер - Левая кнопка мыши \n" +"или клавиша \"-\"" -#: src/slic3r/GUI/DoubleSlider.cpp:1305 +#: src/slic3r/GUI/DoubleSlider.cpp:1320 msgid "Edit tick mark - Ctrl + Left click" -msgstr "" +msgstr "Редактировать маркер - Ctrl + левая кнопка мыши" -#: src/slic3r/GUI/DoubleSlider.cpp:1306 +#: src/slic3r/GUI/DoubleSlider.cpp:1321 msgid "Edit tick mark - Right click" -msgstr "" +msgstr "Редактировать маркер - Правая кнопка мыши" -#: src/slic3r/GUI/DoubleSlider.cpp:1406 src/slic3r/GUI/DoubleSlider.cpp:1440 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1832 src/slic3r/GUI/Tab.cpp:2527 +#: src/slic3r/GUI/DoubleSlider.cpp:1417 src/slic3r/GUI/DoubleSlider.cpp:1451 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1864 #, c-format msgid "Extruder %d" msgstr "Экструдер %d" -#: src/slic3r/GUI/DoubleSlider.cpp:1407 src/slic3r/GUI/GUI_ObjectList.cpp:1833 +#: src/slic3r/GUI/DoubleSlider.cpp:1418 src/slic3r/GUI/GUI_ObjectList.cpp:1865 msgid "active" msgstr "активный" -#: src/slic3r/GUI/DoubleSlider.cpp:1416 +#: src/slic3r/GUI/DoubleSlider.cpp:1427 msgid "Switch code to Change extruder" -msgstr "Изменить код на \"Сменить экструдер\"" +msgstr "Переключить код на смену экструдера" -#: src/slic3r/GUI/DoubleSlider.cpp:1416 src/slic3r/GUI/GUI_ObjectList.cpp:1800 +#: src/slic3r/GUI/DoubleSlider.cpp:1427 src/slic3r/GUI/GUI_ObjectList.cpp:1832 msgid "Change extruder" -msgstr "Сменить экструдер" +msgstr "Маркер смены экструдера" -#: src/slic3r/GUI/DoubleSlider.cpp:1417 +#: src/slic3r/GUI/DoubleSlider.cpp:1428 msgid "Change extruder (N/A)" -msgstr "Сменить экструдер (нед.)" +msgstr "Маркер смены экструдера (Нет данных)" -#: src/slic3r/GUI/DoubleSlider.cpp:1419 +#: src/slic3r/GUI/DoubleSlider.cpp:1430 msgid "Use another extruder" msgstr "Использовать другой экструдер" -#: src/slic3r/GUI/DoubleSlider.cpp:1441 +#: src/slic3r/GUI/DoubleSlider.cpp:1452 msgid "used" msgstr "используется" -#: src/slic3r/GUI/DoubleSlider.cpp:1449 +#: src/slic3r/GUI/DoubleSlider.cpp:1460 msgid "Switch code to Color change (%1%) for:" msgstr "Переключить код на смену цвета (%1%) для:" -#: src/slic3r/GUI/DoubleSlider.cpp:1450 +#: src/slic3r/GUI/DoubleSlider.cpp:1461 msgid "Add color change (%1%) for:" -msgstr "Добавить смену цвета (%1%) для:" +msgstr "Добавить маркер смены цвета (%1%) для:" -#: src/slic3r/GUI/DoubleSlider.cpp:1763 +#: src/slic3r/GUI/DoubleSlider.cpp:1797 msgid "Add color change" -msgstr "Добавить смену цвета" +msgstr "Добавить маркер смены цвета" -#: src/slic3r/GUI/DoubleSlider.cpp:1773 +#: src/slic3r/GUI/DoubleSlider.cpp:1808 msgid "Add pause print" -msgstr "Добавить паузу печати" +msgstr "Добавить маркер паузы печати" -#: src/slic3r/GUI/DoubleSlider.cpp:1777 +#: src/slic3r/GUI/DoubleSlider.cpp:1812 msgid "Add custom template" -msgstr "" +msgstr "Добавить пользовательский шаблон" -#: src/slic3r/GUI/DoubleSlider.cpp:1780 +#: src/slic3r/GUI/DoubleSlider.cpp:1815 msgid "Add custom G-code" -msgstr "Добавить пользовательский G-код" +msgstr "Добавить маркер пользовательского G-кода" -#: src/slic3r/GUI/DoubleSlider.cpp:1798 +#: src/slic3r/GUI/DoubleSlider.cpp:1833 msgid "Edit color" -msgstr "Редактировать цвет" +msgstr "Изменить цвет" -#: src/slic3r/GUI/DoubleSlider.cpp:1799 +#: src/slic3r/GUI/DoubleSlider.cpp:1834 msgid "Edit pause print message" -msgstr "Редактировать сообщение паузы печати" +msgstr "Изменить сообщение при приостановке печати" -#: src/slic3r/GUI/DoubleSlider.cpp:1800 +#: src/slic3r/GUI/DoubleSlider.cpp:1835 msgid "Edit custom G-code" -msgstr "Редактировать пользовательский G-код" +msgstr "Изменить пользовательский G-код" -#: src/slic3r/GUI/DoubleSlider.cpp:1806 +#: src/slic3r/GUI/DoubleSlider.cpp:1841 msgid "Delete color change" -msgstr "Удалить смену цвета" +msgstr "Удалить маркер смены цвета" -#: src/slic3r/GUI/DoubleSlider.cpp:1807 +#: src/slic3r/GUI/DoubleSlider.cpp:1842 msgid "Delete tool change" -msgstr "Удалить смену инструмента" +msgstr "Удалить маркер смены инструмента" -#: src/slic3r/GUI/DoubleSlider.cpp:1808 +#: src/slic3r/GUI/DoubleSlider.cpp:1843 msgid "Delete pause print" msgstr "Удалить паузу печати" -#: src/slic3r/GUI/DoubleSlider.cpp:1809 +#: src/slic3r/GUI/DoubleSlider.cpp:1844 msgid "Delete custom G-code" msgstr "Удалить пользовательский G-код" -#: src/slic3r/GUI/DoubleSlider.cpp:1819 src/slic3r/GUI/DoubleSlider.cpp:1960 +#: src/slic3r/GUI/DoubleSlider.cpp:1854 src/slic3r/GUI/DoubleSlider.cpp:1995 msgid "Jump to height" -msgstr "Переместиться на высоту" +msgstr "Перейти на заданную высоту" -#: src/slic3r/GUI/DoubleSlider.cpp:1824 -msgid "Supprese show the ruler" -msgstr "" +#: src/slic3r/GUI/DoubleSlider.cpp:1859 +msgid "Hide ruler" +msgstr "Скрыть линейку" -#: src/slic3r/GUI/DoubleSlider.cpp:1828 +#: src/slic3r/GUI/DoubleSlider.cpp:1863 msgid "Show object height" -msgstr "" +msgstr "Показывать высоту модели" -#: src/slic3r/GUI/DoubleSlider.cpp:1828 +#: src/slic3r/GUI/DoubleSlider.cpp:1863 msgid "Show object height on the ruler" -msgstr "" +msgstr "Показывать высоту модели на линейке" -#: src/slic3r/GUI/DoubleSlider.cpp:1832 +#: src/slic3r/GUI/DoubleSlider.cpp:1867 msgid "Show estimated print time" -msgstr "" +msgstr "Показывать расчётное время печати" -#: src/slic3r/GUI/DoubleSlider.cpp:1832 +#: src/slic3r/GUI/DoubleSlider.cpp:1867 msgid "Show estimated print time on the ruler" -msgstr "" +msgstr "Показать расчётное время печати на линейке" -#: src/slic3r/GUI/DoubleSlider.cpp:1836 +#: src/slic3r/GUI/DoubleSlider.cpp:1871 msgid "Ruler mode" -msgstr "" +msgstr "Режим линейки" -#: src/slic3r/GUI/DoubleSlider.cpp:1836 +#: src/slic3r/GUI/DoubleSlider.cpp:1871 msgid "Set ruler mode" -msgstr "" +msgstr "Задать режим линейки" -#: src/slic3r/GUI/DoubleSlider.cpp:1841 +#: src/slic3r/GUI/DoubleSlider.cpp:1876 msgid "Set extruder sequence for the entire print" -msgstr "Установить последовательность экструдеров для всей печати" +msgstr "Задать последовательность экструдеров для всей печати" -#: src/slic3r/GUI/DoubleSlider.cpp:1927 +#: src/slic3r/GUI/DoubleSlider.cpp:1962 msgid "Enter custom G-code used on current layer" -msgstr "" +msgstr "Введите пользовательский G-код для текущего слоя" -#: src/slic3r/GUI/DoubleSlider.cpp:1928 +#: src/slic3r/GUI/DoubleSlider.cpp:1963 msgid "Custom G-code on current layer (%1% mm)." -msgstr "" +msgstr "Пользовательский G-код для текущего слоя (%1% мм)." -#: src/slic3r/GUI/DoubleSlider.cpp:1943 +#: src/slic3r/GUI/DoubleSlider.cpp:1978 msgid "Enter short message shown on Printer display when a print is paused" msgstr "" +"Введите короткое сообщение, которое будет отображаться на экране принтера при паузе " +"печати" -#: src/slic3r/GUI/DoubleSlider.cpp:1944 +#: src/slic3r/GUI/DoubleSlider.cpp:1979 msgid "Message for pause print on current layer (%1% mm)." -msgstr "" +msgstr "Сообщение при паузе печати на текущем слое (%1% мм)." -#: src/slic3r/GUI/DoubleSlider.cpp:1959 +#: src/slic3r/GUI/DoubleSlider.cpp:1994 msgid "Enter the move you want to jump to" -msgstr "" +msgstr "Введите нужное перемещение, на который хотите перейти" -#: src/slic3r/GUI/DoubleSlider.cpp:1959 +#: src/slic3r/GUI/DoubleSlider.cpp:1994 msgid "Enter the height you want to jump to" -msgstr "" +msgstr "Введите значение для перехода на нужную высоту" -#: src/slic3r/GUI/DoubleSlider.cpp:2201 +#: src/slic3r/GUI/DoubleSlider.cpp:2239 msgid "The last color change data was saved for a single extruder printing." msgstr "" -"Последние данные для смены цвет были сохранены для одноэкструдерной печати." +"Последние данные об изменении цвета были сохранены для одноэкструдерной печати." -#: src/slic3r/GUI/DoubleSlider.cpp:2202 src/slic3r/GUI/DoubleSlider.cpp:2217 +#: src/slic3r/GUI/DoubleSlider.cpp:2240 src/slic3r/GUI/DoubleSlider.cpp:2255 msgid "The last color change data was saved for a multi extruder printing." msgstr "" +"Последние данные об изменении цвета были сохранены для многоэкструдерной печати." -#: src/slic3r/GUI/DoubleSlider.cpp:2204 +#: src/slic3r/GUI/DoubleSlider.cpp:2242 msgid "Your current changes will delete all saved color changes." -msgstr "" +msgstr "Текущие изменения приведут к удалению всех сохранённых изменений цвета." -#: src/slic3r/GUI/DoubleSlider.cpp:2205 src/slic3r/GUI/DoubleSlider.cpp:2225 +#: src/slic3r/GUI/DoubleSlider.cpp:2243 src/slic3r/GUI/DoubleSlider.cpp:2263 msgid "Are you sure you want to continue?" -msgstr "" +msgstr "Вы действительно хотите продолжить?" -#: src/slic3r/GUI/DoubleSlider.cpp:2218 +#: src/slic3r/GUI/DoubleSlider.cpp:2256 msgid "" "Select YES if you want to delete all saved tool changes, \n" "NO if you want all tool changes switch to color changes, \n" "or CANCEL to leave it unchanged." msgstr "" +"Выберите ДА, если хотите удалить все данные о смене инструмента. \n" +"Если хотите переключить смену инструмента на изменение цвета, нажмите НЕТ \n" +"или ОТМЕНА, чтобы оставить всё без изменений." -#: src/slic3r/GUI/DoubleSlider.cpp:2221 +#: src/slic3r/GUI/DoubleSlider.cpp:2259 msgid "Do you want to delete all saved tool changes?" -msgstr "" +msgstr "Удалить все сохранённые данные о смене инструмента?" -#: src/slic3r/GUI/DoubleSlider.cpp:2223 +#: src/slic3r/GUI/DoubleSlider.cpp:2261 msgid "" "The last color change data was saved for a multi extruder printing with tool " "changes for whole print." msgstr "" +"Последние данные об изменении цвета были сохранены для многоэкструдерной печати со " +"сменой инструмента для всей печати." -#: src/slic3r/GUI/DoubleSlider.cpp:2224 +#: src/slic3r/GUI/DoubleSlider.cpp:2262 msgid "Your current changes will delete all saved extruder (tool) changes." msgstr "" +"Текущие изменения приведут к удалению всех сохранённых изменений экструдера " +"(инструмента)." -#: src/slic3r/GUI/ExtraRenderers.cpp:297 src/slic3r/GUI/GUI_ObjectList.cpp:496 -#: src/slic3r/GUI/GUI_ObjectList.cpp:508 src/slic3r/GUI/GUI_ObjectList.cpp:1015 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4454 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4464 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4499 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:209 +#: src/slic3r/GUI/ExtraRenderers.cpp:297 src/slic3r/GUI/GUI_ObjectList.cpp:512 +#: src/slic3r/GUI/GUI_ObjectList.cpp:524 src/slic3r/GUI/GUI_ObjectList.cpp:1033 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4582 src/slic3r/GUI/GUI_ObjectList.cpp:4592 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4627 src/slic3r/GUI/ObjectDataViewModel.cpp:209 #: src/slic3r/GUI/ObjectDataViewModel.cpp:266 #: src/slic3r/GUI/ObjectDataViewModel.cpp:291 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:499 src/libslic3r/PrintConfig.cpp:537 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:499 src/libslic3r/PrintConfig.cpp:552 msgid "default" msgstr "по умолчанию" #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:24 msgid "Set extruder sequence" -msgstr "Установить последовательность экструдеров" +msgstr "Задать последовательность экструдеров" #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:40 msgid "Set extruder change for every" -msgstr "Установите смену экструдера для каждых" +msgstr "Задать смену экструдера на каждом" -#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:53 -#: src/libslic3r/PrintConfig.cpp:403 src/libslic3r/PrintConfig.cpp:1061 -#: src/libslic3r/PrintConfig.cpp:1686 src/libslic3r/PrintConfig.cpp:1851 -#: src/libslic3r/PrintConfig.cpp:1918 src/libslic3r/PrintConfig.cpp:2125 -#: src/libslic3r/PrintConfig.cpp:2171 +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:53 src/libslic3r/PrintConfig.cpp:418 +#: src/libslic3r/PrintConfig.cpp:1089 src/libslic3r/PrintConfig.cpp:1718 +#: src/libslic3r/PrintConfig.cpp:1883 src/libslic3r/PrintConfig.cpp:1950 +#: src/libslic3r/PrintConfig.cpp:2157 src/libslic3r/PrintConfig.cpp:2203 msgid "layers" -msgstr "слои" +msgstr "слой(-я)" #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:137 msgid "Set extruder(tool) sequence" -msgstr "" +msgstr "Задать последовательность экструдеров (инструментов)" #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:183 msgid "Remove extruder from sequence" -msgstr "" +msgstr "Удалить экструдер из последовательности" #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:193 msgid "Add extruder to sequence" -msgstr "" +msgstr "Добавить экструдер в последовательность" -#: src/slic3r/GUI/Field.cpp:184 +#: src/slic3r/GUI/Field.cpp:197 msgid "default value" msgstr "значение по умолчанию" -#: src/slic3r/GUI/Field.cpp:187 +#: src/slic3r/GUI/Field.cpp:200 msgid "parameter name" msgstr "имя параметра" -#: src/slic3r/GUI/Field.cpp:198 src/slic3r/GUI/OptionsGroup.cpp:779 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:880 +#: src/slic3r/GUI/Field.cpp:211 src/slic3r/GUI/OptionsGroup.cpp:781 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:886 msgid "N/A" msgstr "Н/Д" -#: src/slic3r/GUI/Field.cpp:220 +#: src/slic3r/GUI/Field.cpp:233 #, c-format msgid "%s doesn't support percentage" -msgstr "%s не поддерживает значение в процентах" +msgstr "%s не поддерживает проценты" -#: src/slic3r/GUI/Field.cpp:240 src/slic3r/GUI/Field.cpp:276 -#: src/slic3r/GUI/Field.cpp:1430 src/slic3r/GUI/GUI_ObjectLayers.cpp:413 +#: src/slic3r/GUI/Field.cpp:253 src/slic3r/GUI/Field.cpp:307 +#: src/slic3r/GUI/Field.cpp:1520 src/slic3r/GUI/GUI_ObjectLayers.cpp:413 msgid "Invalid numeric input." msgstr "Неправильное числовое значение." -#: src/slic3r/GUI/Field.cpp:249 src/slic3r/GUI/Field.cpp:1442 +#: src/slic3r/GUI/Field.cpp:264 +#, c-format +msgid "" +"Input value is out of range\n" +"Are you sure that %s is a correct value and that you want to continue?" +msgstr "" +"Введённое значение вне диапазона\n" +"Вы уверены, что %s является правильным значением и что вы хотите продолжить?" + +#: src/slic3r/GUI/Field.cpp:266 src/slic3r/GUI/Field.cpp:326 +msgid "Parameter validation" +msgstr "Проверка правильности параметра" + +#: src/slic3r/GUI/Field.cpp:279 src/slic3r/GUI/Field.cpp:373 +#: src/slic3r/GUI/Field.cpp:1532 msgid "Input value is out of range" msgstr "Введённое значение вне диапазона" -#: src/slic3r/GUI/Field.cpp:292 +#: src/slic3r/GUI/Field.cpp:323 #, c-format msgid "" "Do you mean %s%% instead of %s %s?\n" "Select YES if you want to change this value to %s%%, \n" "or NO if you are sure that %s %s is a correct value." msgstr "" -"Вы имели ввиду %s%% вместо %s %s?\n" -"Выберите ДА, если хотите изменить это значение на %s%%, \n" -"или НЕТ, если %s %s действительно правильные значения." +"Вы имеете в виду %s%% вместо %s %s?\n" +"Выберите Да, если вы хотите изменить это значение на %s%%, \n" +"или Нет, если уверены, что %s %s является правильным значением." -#: src/slic3r/GUI/Field.cpp:295 -msgid "Parameter validation" -msgstr "Проверка корректности параметров" +#: src/slic3r/GUI/Field.cpp:381 +msgid "" +"Invalid input format. Expected vector of dimensions in the following format: \"%1%\"" +msgstr "" +"Неверный входной формат. Ожидаемый вектор размеров в следующем формате: \"%1%\"" #: src/slic3r/GUI/FirmwareDialog.cpp:150 msgid "Flash!" @@ -1447,23 +1476,23 @@ msgstr "Прошить!" #: src/slic3r/GUI/FirmwareDialog.cpp:152 msgid "Flashing in progress. Please do not disconnect the printer!" -msgstr "Выполняется прошивка. Не отключайте принтер!" +msgstr "Идёт прошивка. Пожалуйста, не отключайте принтер!" #: src/slic3r/GUI/FirmwareDialog.cpp:199 msgid "Flashing failed" -msgstr "Ошибка при прошивке" +msgstr "Не удалось выполнить прошивку" #: src/slic3r/GUI/FirmwareDialog.cpp:282 msgid "Flashing succeeded!" -msgstr "Прошивка завершена успешно!" +msgstr "Прошито успешно!" #: src/slic3r/GUI/FirmwareDialog.cpp:283 msgid "Flashing failed. Please see the avrdude log below." -msgstr "При прошивке возникла ошибка. Смотрите журнал avrdude ниже." +msgstr "Не удалось выполнить прошивку. Смотрите журнал avrdude ниже." #: src/slic3r/GUI/FirmwareDialog.cpp:284 msgid "Flashing cancelled." -msgstr "Прошивка отменена." +msgstr "Процесс прошивки отменён." #: src/slic3r/GUI/FirmwareDialog.cpp:332 #, c-format @@ -1475,18 +1504,19 @@ msgid "" "Do you want to continue and flash this hex file anyway?\n" "Please only continue if you are sure this is the right thing to do." msgstr "" -"Данный hex-файл прошивки не соответствует модели принтера.\n" -"Файл hex предназначен для: %s\n" -"Принтер выдаёт: %s\n" +"Данный hex-файл прошивки не соответствует модели принтера. \n" +"Файл предназначен для: %s\n" +"Принтер сообщил: %s\n" "\n" -"Хотите продолжить и всё равно прошить этот hex-файл?\n" -"Подумайте, всё ли правильно вы делаете." +"Вы все равно хотите прошить этот файл?\n" +"Пожалуйста, продолжайте лишь в том случае, если вы уверены в своих действиях." #: src/slic3r/GUI/FirmwareDialog.cpp:419 src/slic3r/GUI/FirmwareDialog.cpp:454 #, c-format -msgid "" -"Multiple %s devices found. Please only connect one at a time for flashing." -msgstr "Обнаружено несколько устройств %s. Для прошивки оставьте только одно." +msgid "Multiple %s devices found. Please only connect one at a time for flashing." +msgstr "" +"Найдено несколько устройств %s. Для прошивки оставьте только одно подключённое " +"устройство." #: src/slic3r/GUI/FirmwareDialog.cpp:436 #, c-format @@ -1496,7 +1526,7 @@ msgid "" "connector ..." msgstr "" "Устройство %s не найдено.\n" -"Если устройство подключено, то нажмите кнопку сброса около разъёма USB …" +"Если устройство подключено, нажмите кнопку Reset рядом с USB-разъёмом..." #: src/slic3r/GUI/FirmwareDialog.cpp:548 #, c-format @@ -1506,7 +1536,7 @@ msgstr "Не удалось найти устройство %s" #: src/slic3r/GUI/FirmwareDialog.cpp:645 #, c-format msgid "Error accessing port at %s: %s" -msgstr "Ошибка доступа по порту в %s: %s" +msgstr "Ошибка доступа к порту в %s: %s" #: src/slic3r/GUI/FirmwareDialog.cpp:647 #, c-format @@ -1519,10 +1549,9 @@ msgstr "Прошивальшик" #: src/slic3r/GUI/FirmwareDialog.cpp:802 msgid "Firmware image:" -msgstr "Файл прошивки:" +msgstr "Файл прошивки (*.hex):" -#: src/slic3r/GUI/FirmwareDialog.cpp:805 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:289 +#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/PhysicalPrinterDialog.cpp:289 #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:364 msgid "Browse" msgstr "Обзор" @@ -1553,11 +1582,10 @@ msgstr "Готово" #: src/slic3r/GUI/FirmwareDialog.cpp:841 msgid "Advanced: Output log" -msgstr "Дополнительно: журнал результата" +msgstr "Дополнительно: журнал вывода" -#: src/slic3r/GUI/FirmwareDialog.cpp:852 -#: src/slic3r/GUI/Mouse3DController.cpp:552 -#: src/slic3r/GUI/PrintHostDialogs.cpp:187 +#: src/slic3r/GUI/FirmwareDialog.cpp:852 src/slic3r/GUI/Mouse3DController.cpp:551 +#: src/slic3r/GUI/PrintHostDialogs.cpp:189 msgid "Close" msgstr "Закрыть" @@ -1575,676 +1603,685 @@ msgstr "Подтверждение" #: src/slic3r/GUI/FirmwareDialog.cpp:906 msgid "Cancelling..." -msgstr "Отмена…" +msgstr "Отмена..." -#: src/slic3r/GUI/GCodeViewer.cpp:220 +#: src/slic3r/GUI/GCodeViewer.cpp:239 msgid "Tool position" -msgstr "" +msgstr "Положение инструмента" -#: src/slic3r/GUI/GCodeViewer.cpp:984 +#: src/slic3r/GUI/GCodeViewer.cpp:1016 msgid "Generating toolpaths" -msgstr "" +msgstr "Создание траекторий инструмента" -#: src/slic3r/GUI/GCodeViewer.cpp:1375 +#: src/slic3r/GUI/GCodeViewer.cpp:1405 msgid "Generating vertex buffer" -msgstr "" +msgstr "Генерация буфера вершин" -#: src/slic3r/GUI/GCodeViewer.cpp:1468 +#: src/slic3r/GUI/GCodeViewer.cpp:1496 msgid "Generating index buffers" -msgstr "" +msgstr "Генерация буферов индекса" -#: src/slic3r/GUI/GCodeViewer.cpp:2212 +#: src/slic3r/GUI/GCodeViewer.cpp:2225 msgid "Click to hide" -msgstr "" +msgstr "Нажмите, чтобы скрыть" -#: src/slic3r/GUI/GCodeViewer.cpp:2212 +#: src/slic3r/GUI/GCodeViewer.cpp:2225 msgid "Click to show" -msgstr "" +msgstr "Нажмите, чтобы отобразить" -#: src/slic3r/GUI/GCodeViewer.cpp:2324 +#: src/slic3r/GUI/GCodeViewer.cpp:2337 msgid "up to" -msgstr "" +msgstr "до" -#: src/slic3r/GUI/GCodeViewer.cpp:2330 +#: src/slic3r/GUI/GCodeViewer.cpp:2343 msgid "above" -msgstr "" +msgstr "после" -#: src/slic3r/GUI/GCodeViewer.cpp:2338 +#: src/slic3r/GUI/GCodeViewer.cpp:2351 msgid "from" -msgstr "" +msgstr "из" -#: src/slic3r/GUI/GCodeViewer.cpp:2338 +#: src/slic3r/GUI/GCodeViewer.cpp:2351 msgid "to" -msgstr "" +msgstr "в" -#: src/slic3r/GUI/GCodeViewer.cpp:2366 src/slic3r/GUI/GCodeViewer.cpp:2374 -#: src/slic3r/GUI/GUI_Preview.cpp:228 src/slic3r/GUI/GUI_Preview.cpp:526 +#: src/slic3r/GUI/GCodeViewer.cpp:2379 src/slic3r/GUI/GCodeViewer.cpp:2387 +#: src/slic3r/GUI/GUI_Preview.cpp:214 src/slic3r/GUI/GUI_Preview.cpp:533 +#: src/slic3r/GUI/GUI_Preview.cpp:942 msgid "Feature type" msgstr "Типы линий" -#: src/slic3r/GUI/GCodeViewer.cpp:2366 src/slic3r/GUI/GCodeViewer.cpp:2374 +#: src/slic3r/GUI/GCodeViewer.cpp:2379 src/slic3r/GUI/GCodeViewer.cpp:2387 #: src/slic3r/GUI/RammingChart.cpp:76 msgid "Time" msgstr "Время" -#: src/slic3r/GUI/GCodeViewer.cpp:2374 +#: src/slic3r/GUI/GCodeViewer.cpp:2387 msgid "Percentage" -msgstr "" +msgstr "Процент" -#: src/slic3r/GUI/GCodeViewer.cpp:2377 +#: src/slic3r/GUI/GCodeViewer.cpp:2390 msgid "Height (mm)" msgstr "Высота (мм)" -#: src/slic3r/GUI/GCodeViewer.cpp:2378 +#: src/slic3r/GUI/GCodeViewer.cpp:2391 msgid "Width (mm)" msgstr "Ширина (мм)" -#: src/slic3r/GUI/GCodeViewer.cpp:2379 +#: src/slic3r/GUI/GCodeViewer.cpp:2392 msgid "Speed (mm/s)" msgstr "Скорость (мм/с)" -#: src/slic3r/GUI/GCodeViewer.cpp:2380 +#: src/slic3r/GUI/GCodeViewer.cpp:2393 msgid "Fan Speed (%)" msgstr "Скорость вентилятора (%)" -#: src/slic3r/GUI/GCodeViewer.cpp:2381 +#: src/slic3r/GUI/GCodeViewer.cpp:2394 msgid "Volumetric flow rate (mm³/s)" msgstr "Объёмный расход (мм³/с)" -#: src/slic3r/GUI/GCodeViewer.cpp:2382 src/slic3r/GUI/GUI_Preview.cpp:234 -#: src/slic3r/GUI/GUI_Preview.cpp:341 src/slic3r/GUI/GUI_Preview.cpp:477 -#: src/slic3r/GUI/GUI_Preview.cpp:525 src/slic3r/GUI/GUI_Preview.cpp:850 +#: src/slic3r/GUI/GCodeViewer.cpp:2395 src/slic3r/GUI/GUI_Preview.cpp:220 +#: src/slic3r/GUI/GUI_Preview.cpp:326 src/slic3r/GUI/GUI_Preview.cpp:471 +#: src/slic3r/GUI/GUI_Preview.cpp:532 src/slic3r/GUI/GUI_Preview.cpp:878 +#: src/slic3r/GUI/GUI_Preview.cpp:942 msgid "Tool" msgstr "Инструмент" -#: src/slic3r/GUI/GCodeViewer.cpp:2383 src/slic3r/GUI/GUI_Preview.cpp:235 -#: src/slic3r/GUI/GUI_Preview.cpp:523 +#: src/slic3r/GUI/GCodeViewer.cpp:2396 src/slic3r/GUI/GUI_Preview.cpp:221 +#: src/slic3r/GUI/GUI_Preview.cpp:530 src/slic3r/GUI/GUI_Preview.cpp:941 msgid "Color Print" msgstr "Цвет печати" -#: src/slic3r/GUI/GCodeViewer.cpp:2419 src/slic3r/GUI/GCodeViewer.cpp:2454 -#: src/slic3r/GUI/GCodeViewer.cpp:2459 src/slic3r/GUI/GUI_ObjectList.cpp:296 -#: src/slic3r/GUI/wxExtensions.cpp:515 src/libslic3r/PrintConfig.cpp:532 +#: src/slic3r/GUI/GCodeViewer.cpp:2432 src/slic3r/GUI/GCodeViewer.cpp:2467 +#: src/slic3r/GUI/GCodeViewer.cpp:2472 src/slic3r/GUI/GUI_ObjectList.cpp:312 +#: src/slic3r/GUI/wxExtensions.cpp:519 src/libslic3r/PrintConfig.cpp:547 msgid "Extruder" msgstr "Экструдер" -#: src/slic3r/GUI/GCodeViewer.cpp:2430 +#: src/slic3r/GUI/GCodeViewer.cpp:2443 msgid "Default color" -msgstr "" +msgstr "Цвет по умолчанию" -#: src/slic3r/GUI/GCodeViewer.cpp:2454 +#: src/slic3r/GUI/GCodeViewer.cpp:2467 msgid "default color" -msgstr "" +msgstr "цвет по умолчанию" -#: src/slic3r/GUI/GCodeViewer.cpp:2549 src/slic3r/GUI/GCodeViewer.cpp:2595 +#: src/slic3r/GUI/GCodeViewer.cpp:2562 src/slic3r/GUI/GCodeViewer.cpp:2608 msgid "Color change" -msgstr "" +msgstr "Смена цвета" -#: src/slic3r/GUI/GCodeViewer.cpp:2568 src/slic3r/GUI/GCodeViewer.cpp:2593 +#: src/slic3r/GUI/GCodeViewer.cpp:2581 src/slic3r/GUI/GCodeViewer.cpp:2606 msgid "Print" -msgstr "" +msgstr "Печать" -#: src/slic3r/GUI/GCodeViewer.cpp:2594 src/slic3r/GUI/GCodeViewer.cpp:2611 +#: src/slic3r/GUI/GCodeViewer.cpp:2607 src/slic3r/GUI/GCodeViewer.cpp:2624 msgid "Pause" msgstr "Пауза" -#: src/slic3r/GUI/GCodeViewer.cpp:2599 src/slic3r/GUI/GCodeViewer.cpp:2602 +#: src/slic3r/GUI/GCodeViewer.cpp:2612 src/slic3r/GUI/GCodeViewer.cpp:2615 msgid "Event" -msgstr "" +msgstr "Событие" -#: src/slic3r/GUI/GCodeViewer.cpp:2599 src/slic3r/GUI/GCodeViewer.cpp:2602 +#: src/slic3r/GUI/GCodeViewer.cpp:2612 src/slic3r/GUI/GCodeViewer.cpp:2615 msgid "Remaining time" -msgstr "" +msgstr "Точное время печати" -#: src/slic3r/GUI/GCodeViewer.cpp:2602 +#: src/slic3r/GUI/GCodeViewer.cpp:2615 msgid "Duration" -msgstr "" +msgstr "Продолжительность" -#: src/slic3r/GUI/GCodeViewer.cpp:2637 src/slic3r/GUI/GUI_Preview.cpp:976 -#: src/libslic3r/PrintConfig.cpp:2348 +#: src/slic3r/GUI/GCodeViewer.cpp:2650 src/slic3r/GUI/GUI_Preview.cpp:1023 +#: src/libslic3r/PrintConfig.cpp:2380 msgid "Travel" msgstr "Перемещение" -#: src/slic3r/GUI/GCodeViewer.cpp:2640 +#: src/slic3r/GUI/GCodeViewer.cpp:2653 msgid "Movement" -msgstr "" +msgstr "Перемещение" -#: src/slic3r/GUI/GCodeViewer.cpp:2641 +#: src/slic3r/GUI/GCodeViewer.cpp:2654 msgid "Extrusion" -msgstr "" +msgstr "Экструзия" -#: src/slic3r/GUI/GCodeViewer.cpp:2642 src/slic3r/GUI/Tab.cpp:1695 -#: src/slic3r/GUI/Tab.cpp:2577 +#: src/slic3r/GUI/GCodeViewer.cpp:2655 src/slic3r/GUI/Tab.cpp:1694 +#: src/slic3r/GUI/Tab.cpp:2582 msgid "Retraction" msgstr "Ретракт (втягивание)" -#: src/slic3r/GUI/GCodeViewer.cpp:2660 src/slic3r/GUI/GCodeViewer.cpp:2663 -#: src/slic3r/GUI/GUI_Preview.cpp:978 +#: src/slic3r/GUI/GCodeViewer.cpp:2672 src/slic3r/GUI/GCodeViewer.cpp:2675 +#: src/slic3r/GUI/GUI_Preview.cpp:1024 msgid "Wipe" -msgstr "" +msgstr "Очистка" -#: src/slic3r/GUI/GCodeViewer.cpp:2695 src/slic3r/GUI/GUI_Preview.cpp:262 -#: src/slic3r/GUI/GUI_Preview.cpp:278 +#: src/slic3r/GUI/GCodeViewer.cpp:2706 src/slic3r/GUI/GUI_Preview.cpp:248 +#: src/slic3r/GUI/GUI_Preview.cpp:262 msgid "Options" -msgstr "" +msgstr "Опции" -#: src/slic3r/GUI/GCodeViewer.cpp:2698 src/slic3r/GUI/GUI_Preview.cpp:980 +#: src/slic3r/GUI/GCodeViewer.cpp:2709 src/slic3r/GUI/GUI_Preview.cpp:1025 msgid "Retractions" msgstr "Ретракт" -#: src/slic3r/GUI/GCodeViewer.cpp:2699 src/slic3r/GUI/GUI_Preview.cpp:981 +#: src/slic3r/GUI/GCodeViewer.cpp:2710 src/slic3r/GUI/GUI_Preview.cpp:1026 msgid "Deretractions" -msgstr "" +msgstr "Подача (выдавливание)" -#: src/slic3r/GUI/GCodeViewer.cpp:2700 src/slic3r/GUI/GUI_Preview.cpp:982 +#: src/slic3r/GUI/GCodeViewer.cpp:2711 src/slic3r/GUI/GUI_Preview.cpp:1027 msgid "Tool changes" -msgstr "" +msgstr "Смена инструмента" -#: src/slic3r/GUI/GCodeViewer.cpp:2701 src/slic3r/GUI/GUI_Preview.cpp:983 +#: src/slic3r/GUI/GCodeViewer.cpp:2712 src/slic3r/GUI/GUI_Preview.cpp:1028 msgid "Color changes" -msgstr "" +msgstr "Смена цвета" -#: src/slic3r/GUI/GCodeViewer.cpp:2702 src/slic3r/GUI/GUI_Preview.cpp:984 +#: src/slic3r/GUI/GCodeViewer.cpp:2713 src/slic3r/GUI/GUI_Preview.cpp:1029 msgid "Print pauses" -msgstr "" +msgstr "Паузы печати" -#: src/slic3r/GUI/GCodeViewer.cpp:2703 src/slic3r/GUI/GUI_Preview.cpp:985 +#: src/slic3r/GUI/GCodeViewer.cpp:2714 src/slic3r/GUI/GUI_Preview.cpp:1030 msgid "Custom G-codes" -msgstr "" +msgstr "Пользовательский G-код" -#: src/slic3r/GUI/GCodeViewer.cpp:2714 src/slic3r/GUI/GCodeViewer.cpp:2738 -#: src/slic3r/GUI/Plater.cpp:697 src/libslic3r/PrintConfig.cpp:113 +#: src/slic3r/GUI/GCodeViewer.cpp:2725 src/slic3r/GUI/GCodeViewer.cpp:2749 +#: src/slic3r/GUI/Plater.cpp:697 src/libslic3r/PrintConfig.cpp:117 msgid "Printer" -msgstr "Принтер" +msgstr "Профиль принтера" -#: src/slic3r/GUI/GCodeViewer.cpp:2716 src/slic3r/GUI/GCodeViewer.cpp:2743 +#: src/slic3r/GUI/GCodeViewer.cpp:2727 src/slic3r/GUI/GCodeViewer.cpp:2754 #: src/slic3r/GUI/Plater.cpp:693 msgid "Print settings" -msgstr "Настройки печати" +msgstr "Профиль печати" -#: src/slic3r/GUI/GCodeViewer.cpp:2719 src/slic3r/GUI/GCodeViewer.cpp:2749 -#: src/slic3r/GUI/Plater.cpp:694 src/slic3r/GUI/Tab.cpp:1795 -#: src/slic3r/GUI/Tab.cpp:1796 +#: src/slic3r/GUI/GCodeViewer.cpp:2730 src/slic3r/GUI/GCodeViewer.cpp:2760 +#: src/slic3r/GUI/Plater.cpp:694 src/slic3r/GUI/Tab.cpp:1794 +#: src/slic3r/GUI/Tab.cpp:1795 msgid "Filament" -msgstr "Пруток" +msgstr "Профиль прутка" -#: src/slic3r/GUI/GCodeViewer.cpp:2774 src/slic3r/GUI/GCodeViewer.cpp:2779 +#: src/slic3r/GUI/GCodeViewer.cpp:2785 src/slic3r/GUI/GCodeViewer.cpp:2790 #: src/slic3r/GUI/Plater.cpp:242 src/slic3r/GUI/Plater.cpp:1135 #: src/slic3r/GUI/Plater.cpp:1220 msgid "Estimated printing time" msgstr "Расчётное время печати" -#: src/slic3r/GUI/GCodeViewer.cpp:2774 +#: src/slic3r/GUI/GCodeViewer.cpp:2785 msgid "Normal mode" msgstr "Нормальный режим" -#: src/slic3r/GUI/GCodeViewer.cpp:2779 +#: src/slic3r/GUI/GCodeViewer.cpp:2790 msgid "Stealth mode" msgstr "Тихий режим" -#: src/slic3r/GUI/GCodeViewer.cpp:2806 +#: src/slic3r/GUI/GCodeViewer.cpp:2817 msgid "Show stealth mode" -msgstr "Показывать нормальный режим" +msgstr "Показать в тихом режиме" -#: src/slic3r/GUI/GCodeViewer.cpp:2810 +#: src/slic3r/GUI/GCodeViewer.cpp:2821 msgid "Show normal mode" -msgstr "Показывать тихий режим" +msgstr "Показать в нормальном режиме" -#: src/slic3r/GUI/GLCanvas3D.cpp:228 src/slic3r/GUI/GLCanvas3D.cpp:4470 +#: src/slic3r/GUI/GLCanvas3D.cpp:236 src/slic3r/GUI/GLCanvas3D.cpp:4610 msgid "Variable layer height" -msgstr "Переменная высота слоя" +msgstr "Переменная высота слоёв" -#: src/slic3r/GUI/GLCanvas3D.cpp:230 +#: src/slic3r/GUI/GLCanvas3D.cpp:238 msgid "Left mouse button:" -msgstr "Левая кнопку мыши:" +msgstr "Левая кнопка мыши:" -#: src/slic3r/GUI/GLCanvas3D.cpp:232 +#: src/slic3r/GUI/GLCanvas3D.cpp:240 msgid "Add detail" -msgstr "" +msgstr "Увеличить детализацию" -#: src/slic3r/GUI/GLCanvas3D.cpp:234 +#: src/slic3r/GUI/GLCanvas3D.cpp:242 msgid "Right mouse button:" msgstr "Правая кнопка мыши:" -#: src/slic3r/GUI/GLCanvas3D.cpp:236 +#: src/slic3r/GUI/GLCanvas3D.cpp:244 msgid "Remove detail" -msgstr "Убрать подробности" +msgstr "Уменьшить детализацию" -#: src/slic3r/GUI/GLCanvas3D.cpp:238 +#: src/slic3r/GUI/GLCanvas3D.cpp:246 msgid "Shift + Left mouse button:" -msgstr "" +msgstr "Shift + Левая кнопка мыши:" -#: src/slic3r/GUI/GLCanvas3D.cpp:240 +#: src/slic3r/GUI/GLCanvas3D.cpp:248 msgid "Reset to base" -msgstr "" +msgstr "Сброс до базовой высоты слоя" -#: src/slic3r/GUI/GLCanvas3D.cpp:242 +#: src/slic3r/GUI/GLCanvas3D.cpp:250 msgid "Shift + Right mouse button:" -msgstr "" +msgstr "Shift + Правая кнопка мыши:" -#: src/slic3r/GUI/GLCanvas3D.cpp:244 +#: src/slic3r/GUI/GLCanvas3D.cpp:252 msgid "Smoothing" msgstr "Сглаживание" -#: src/slic3r/GUI/GLCanvas3D.cpp:246 +#: src/slic3r/GUI/GLCanvas3D.cpp:254 msgid "Mouse wheel:" msgstr "Колесо мыши:" -#: src/slic3r/GUI/GLCanvas3D.cpp:248 +#: src/slic3r/GUI/GLCanvas3D.cpp:256 msgid "Increase/decrease edit area" -msgstr "" +msgstr "Увелич. /уменьш. области редактирования" -#: src/slic3r/GUI/GLCanvas3D.cpp:251 +#: src/slic3r/GUI/GLCanvas3D.cpp:259 msgid "Adaptive" -msgstr "Адаптивный" +msgstr "Адаптивная" -#: src/slic3r/GUI/GLCanvas3D.cpp:257 +#: src/slic3r/GUI/GLCanvas3D.cpp:265 msgid "Quality / Speed" msgstr "Качество / Скорость" -#: src/slic3r/GUI/GLCanvas3D.cpp:260 +#: src/slic3r/GUI/GLCanvas3D.cpp:268 msgid "Higher print quality versus higher print speed." -msgstr "" +msgstr "Выбор между высоким качеством печати или высокой скоростью." -#: src/slic3r/GUI/GLCanvas3D.cpp:271 +#: src/slic3r/GUI/GLCanvas3D.cpp:279 msgid "Smooth" -msgstr "" +msgstr "Сгладить" -#: src/slic3r/GUI/GLCanvas3D.cpp:277 src/libslic3r/PrintConfig.cpp:556 +#: src/slic3r/GUI/GLCanvas3D.cpp:285 src/libslic3r/PrintConfig.cpp:571 msgid "Radius" msgstr "Радиус" -#: src/slic3r/GUI/GLCanvas3D.cpp:287 +#: src/slic3r/GUI/GLCanvas3D.cpp:295 msgid "Keep min" -msgstr "" +msgstr "Сохранять минимумы" -#: src/slic3r/GUI/GLCanvas3D.cpp:296 src/slic3r/GUI/GLCanvas3D.cpp:3908 +#: src/slic3r/GUI/GLCanvas3D.cpp:304 src/slic3r/GUI/GLCanvas3D.cpp:4050 msgid "Reset" msgstr "Сброс" -#: src/slic3r/GUI/GLCanvas3D.cpp:558 +#: src/slic3r/GUI/GLCanvas3D.cpp:566 msgid "Variable layer height - Manual edit" -msgstr "Переменная высота слоёв - Ручная правка" +msgstr "Переменная высота слоёв - Ручное редактирование" -#: src/slic3r/GUI/GLCanvas3D.cpp:626 +#: src/slic3r/GUI/GLCanvas3D.cpp:634 msgid "An object outside the print area was detected." -msgstr "" +msgstr "Обнаружена модель вне области печати." -#: src/slic3r/GUI/GLCanvas3D.cpp:627 +#: src/slic3r/GUI/GLCanvas3D.cpp:635 msgid "A toolpath outside the print area was detected." -msgstr "" +msgstr "Траектория движения инструмента выходит за пределы области печати." -#: src/slic3r/GUI/GLCanvas3D.cpp:628 +#: src/slic3r/GUI/GLCanvas3D.cpp:636 msgid "SLA supports outside the print area were detected." -msgstr "" +msgstr "Обнаружены SLA поддержки вне области печати." -#: src/slic3r/GUI/GLCanvas3D.cpp:629 +#: src/slic3r/GUI/GLCanvas3D.cpp:637 msgid "Some objects are not visible." -msgstr "" +msgstr "Некоторые модели не отображаются." -#: src/slic3r/GUI/GLCanvas3D.cpp:631 +#: src/slic3r/GUI/GLCanvas3D.cpp:639 msgid "" "An object outside the print area was detected.\n" "Resolve the current problem to continue slicing." msgstr "" +"Обнаружена модель вне области печати. \n" +"Решите текущую проблему, чтобы продолжить нарезку." -#: src/slic3r/GUI/GLCanvas3D.cpp:941 +#: src/slic3r/GUI/GLCanvas3D.cpp:949 msgid "Seq." -msgstr "" +msgstr "Очерёдность печати" -#: src/slic3r/GUI/GLCanvas3D.cpp:1416 +#: src/slic3r/GUI/GLCanvas3D.cpp:1455 msgid "Variable layer height - Reset" -msgstr "Переменная высота слоя - Сброс" +msgstr "Переменная высота слоёв - Сброс" -#: src/slic3r/GUI/GLCanvas3D.cpp:1424 +#: src/slic3r/GUI/GLCanvas3D.cpp:1463 msgid "Variable layer height - Adaptive" -msgstr "Переменная высота слоя - Адаптивная" +msgstr "Переменная высота слоёв - Адаптивная" -#: src/slic3r/GUI/GLCanvas3D.cpp:1432 +#: src/slic3r/GUI/GLCanvas3D.cpp:1471 msgid "Variable layer height - Smooth all" -msgstr "Переменная высота слоя - Сглаживание всех" +msgstr "Переменная высота слоёв - Сгладить всё" -#: src/slic3r/GUI/GLCanvas3D.cpp:1831 +#: src/slic3r/GUI/GLCanvas3D.cpp:1876 msgid "Mirror Object" -msgstr "Отразить обект" +msgstr "Отражение модели" -#: src/slic3r/GUI/GLCanvas3D.cpp:2682 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:520 +#: src/slic3r/GUI/GLCanvas3D.cpp:2746 src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:520 msgid "Gizmo-Move" -msgstr "" +msgstr "Гизмо перемещения" -#: src/slic3r/GUI/GLCanvas3D.cpp:2760 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:522 +#: src/slic3r/GUI/GLCanvas3D.cpp:2832 src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:522 msgid "Gizmo-Rotate" -msgstr "Повернуть" +msgstr "Гизмо поворота" -#: src/slic3r/GUI/GLCanvas3D.cpp:3275 +#: src/slic3r/GUI/GLCanvas3D.cpp:3388 msgid "Move Object" -msgstr "Переместить объект" +msgstr "Перемещение модели" -#: src/slic3r/GUI/GLCanvas3D.cpp:3744 src/slic3r/GUI/GLCanvas3D.cpp:4431 +#: src/slic3r/GUI/GLCanvas3D.cpp:3858 src/slic3r/GUI/GLCanvas3D.cpp:4571 msgid "Switch to Settings" -msgstr "" +msgstr "Переключение настроек" -#: src/slic3r/GUI/GLCanvas3D.cpp:3745 src/slic3r/GUI/GLCanvas3D.cpp:4431 +#: src/slic3r/GUI/GLCanvas3D.cpp:3859 src/slic3r/GUI/GLCanvas3D.cpp:4571 msgid "Print Settings Tab" -msgstr "" +msgstr "Вкладка настройки печати" -#: src/slic3r/GUI/GLCanvas3D.cpp:3746 src/slic3r/GUI/GLCanvas3D.cpp:4432 +#: src/slic3r/GUI/GLCanvas3D.cpp:3860 src/slic3r/GUI/GLCanvas3D.cpp:4572 msgid "Filament Settings Tab" -msgstr "" +msgstr "Вкладка настройки прутка" -#: src/slic3r/GUI/GLCanvas3D.cpp:3746 src/slic3r/GUI/GLCanvas3D.cpp:4432 +#: src/slic3r/GUI/GLCanvas3D.cpp:3860 src/slic3r/GUI/GLCanvas3D.cpp:4572 msgid "Material Settings Tab" -msgstr "" +msgstr "Вкладка настройки материала" -#: src/slic3r/GUI/GLCanvas3D.cpp:3747 src/slic3r/GUI/GLCanvas3D.cpp:4433 +#: src/slic3r/GUI/GLCanvas3D.cpp:3861 src/slic3r/GUI/GLCanvas3D.cpp:4573 msgid "Printer Settings Tab" -msgstr "" +msgstr "Вкладка настройки принтера" -#: src/slic3r/GUI/GLCanvas3D.cpp:3795 +#: src/slic3r/GUI/GLCanvas3D.cpp:3909 msgid "Undo History" -msgstr "Откатить по истории" +msgstr "История отмен" -#: src/slic3r/GUI/GLCanvas3D.cpp:3795 +#: src/slic3r/GUI/GLCanvas3D.cpp:3909 msgid "Redo History" -msgstr "Вернуть по истории" +msgstr "История повторов" -#: src/slic3r/GUI/GLCanvas3D.cpp:3816 +#: src/slic3r/GUI/GLCanvas3D.cpp:3930 #, c-format msgid "Undo %1$d Action" msgid_plural "Undo %1$d Actions" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "Отмена %1$d действия" +msgstr[1] "Отмена %1$d действий" +msgstr[2] "Отмена %1$d действий" -#: src/slic3r/GUI/GLCanvas3D.cpp:3816 +#: src/slic3r/GUI/GLCanvas3D.cpp:3930 #, c-format msgid "Redo %1$d Action" msgid_plural "Redo %1$d Actions" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "Повтор %1$d действия" +msgstr[1] "Повтор %1$d действий" +msgstr[2] "Повтор %1$d действий" -#: src/slic3r/GUI/GLCanvas3D.cpp:3836 src/slic3r/GUI/GLCanvas3D.cpp:4449 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 src/slic3r/GUI/Search.cpp:351 +#: src/slic3r/GUI/GLCanvas3D.cpp:3950 src/slic3r/GUI/GLCanvas3D.cpp:4589 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:98 src/slic3r/GUI/Search.cpp:351 msgid "Search" msgstr "Поиск" -#: src/slic3r/GUI/GLCanvas3D.cpp:3850 src/slic3r/GUI/GLCanvas3D.cpp:3858 +#: src/slic3r/GUI/GLCanvas3D.cpp:3964 src/slic3r/GUI/GLCanvas3D.cpp:3972 #: src/slic3r/GUI/Search.cpp:358 msgid "Enter a search term" -msgstr "" +msgstr "Ввод поискового запроса" -#: src/slic3r/GUI/GLCanvas3D.cpp:3889 +#: src/slic3r/GUI/GLCanvas3D.cpp:4003 msgid "Arrange options" -msgstr "" +msgstr "Параметры расстановки" -#: src/slic3r/GUI/GLCanvas3D.cpp:3896 -msgid "Gap size" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:4033 +msgid "Press %1%left mouse button to enter the exact value" +msgstr "Нажмите %1% левую кнопку мыши для ввода точного значения" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4035 +msgid "Spacing" +msgstr "Расстояние" -#: src/slic3r/GUI/GLCanvas3D.cpp:3901 +#: src/slic3r/GUI/GLCanvas3D.cpp:4042 msgid "Enable rotations (slow)" -msgstr "" +msgstr "Разрешить вращение (замедление)" -#: src/slic3r/GUI/GLCanvas3D.cpp:3920 src/slic3r/GUI/GLCanvas3D.cpp:4341 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 src/slic3r/GUI/Plater.cpp:1645 +#: src/slic3r/GUI/GLCanvas3D.cpp:4060 src/slic3r/GUI/GLCanvas3D.cpp:4481 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 src/slic3r/GUI/Plater.cpp:1648 msgid "Arrange" msgstr "Расставить" -#: src/slic3r/GUI/GLCanvas3D.cpp:4315 +#: src/slic3r/GUI/GLCanvas3D.cpp:4455 msgid "Add..." msgstr "Добавить..." -#: src/slic3r/GUI/GLCanvas3D.cpp:4323 src/slic3r/GUI/GUI_ObjectList.cpp:1846 -#: src/slic3r/GUI/Plater.cpp:3921 src/slic3r/GUI/Plater.cpp:3945 -#: src/slic3r/GUI/Tab.cpp:3474 +#: src/slic3r/GUI/GLCanvas3D.cpp:4463 src/slic3r/GUI/GUI_ObjectList.cpp:1878 +#: src/slic3r/GUI/Plater.cpp:3998 src/slic3r/GUI/Plater.cpp:4022 +#: src/slic3r/GUI/Tab.cpp:3484 msgid "Delete" msgstr "Удалить" -#: src/slic3r/GUI/GLCanvas3D.cpp:4332 src/slic3r/GUI/KBShortcutsDialog.cpp:116 -#: src/slic3r/GUI/Plater.cpp:5025 +#: src/slic3r/GUI/GLCanvas3D.cpp:4472 src/slic3r/GUI/KBShortcutsDialog.cpp:88 +#: src/slic3r/GUI/Plater.cpp:5107 msgid "Delete all" msgstr "Удалить всё" -#: src/slic3r/GUI/GLCanvas3D.cpp:4341 src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/GLCanvas3D.cpp:4481 src/slic3r/GUI/KBShortcutsDialog.cpp:121 msgid "Arrange selection" -msgstr "Расставить выделенное" +msgstr "Расставить только выбранные модели" -#: src/slic3r/GUI/GLCanvas3D.cpp:4341 +#: src/slic3r/GUI/GLCanvas3D.cpp:4481 msgid "Click right mouse button to show arrangement options" -msgstr "" +msgstr "Правая кнопку мыши, чтобы отобразить параметры расстановки" -#: src/slic3r/GUI/GLCanvas3D.cpp:4363 +#: src/slic3r/GUI/GLCanvas3D.cpp:4503 msgid "Copy" msgstr "Копировать" -#: src/slic3r/GUI/GLCanvas3D.cpp:4372 +#: src/slic3r/GUI/GLCanvas3D.cpp:4512 msgid "Paste" msgstr "Вставить" -#: src/slic3r/GUI/GLCanvas3D.cpp:4384 src/slic3r/GUI/Plater.cpp:3780 -#: src/slic3r/GUI/Plater.cpp:3792 src/slic3r/GUI/Plater.cpp:3930 +#: src/slic3r/GUI/GLCanvas3D.cpp:4524 src/slic3r/GUI/Plater.cpp:3857 +#: src/slic3r/GUI/Plater.cpp:3869 src/slic3r/GUI/Plater.cpp:4007 msgid "Add instance" -msgstr "Добавить экземпляр" +msgstr "Добавить копию" -#: src/slic3r/GUI/GLCanvas3D.cpp:4395 src/slic3r/GUI/Plater.cpp:3932 +#: src/slic3r/GUI/GLCanvas3D.cpp:4535 src/slic3r/GUI/Plater.cpp:4009 msgid "Remove instance" -msgstr "Удалить экземпляр" +msgstr "Удалить копию" -#: src/slic3r/GUI/GLCanvas3D.cpp:4408 +#: src/slic3r/GUI/GLCanvas3D.cpp:4548 msgid "Split to objects" -msgstr "Разбить на объекты" +msgstr "Разделить на модели" -#: src/slic3r/GUI/GLCanvas3D.cpp:4418 src/slic3r/GUI/GUI_ObjectList.cpp:1618 +#: src/slic3r/GUI/GLCanvas3D.cpp:4558 src/slic3r/GUI/GUI_ObjectList.cpp:1650 msgid "Split to parts" -msgstr "Разбить на части" +msgstr "Разделить на части" -#: src/slic3r/GUI/GLCanvas3D.cpp:4520 src/slic3r/GUI/KBShortcutsDialog.cpp:117 -#: src/slic3r/GUI/MainFrame.cpp:1129 +#: src/slic3r/GUI/GLCanvas3D.cpp:4660 src/slic3r/GUI/KBShortcutsDialog.cpp:89 +#: src/slic3r/GUI/MainFrame.cpp:1125 msgid "Undo" -msgstr "Отменить" +msgstr "Отмена действия" -#: src/slic3r/GUI/GLCanvas3D.cpp:4520 src/slic3r/GUI/GLCanvas3D.cpp:4559 +#: src/slic3r/GUI/GLCanvas3D.cpp:4660 src/slic3r/GUI/GLCanvas3D.cpp:4699 msgid "Click right mouse button to open/close History" -msgstr "Щелчок по правой кнопке мыши открывает/закрывает историю действий" +msgstr "Правая кнопку мыши, чтобы показать/скрыть историю действий" -#: src/slic3r/GUI/GLCanvas3D.cpp:4543 +#: src/slic3r/GUI/GLCanvas3D.cpp:4683 msgid "Next Undo action: %1%" -msgstr "Следующее отменяемое действие: %1%" +msgstr "Следующее действие отмены: %1%" -#: src/slic3r/GUI/GLCanvas3D.cpp:4559 src/slic3r/GUI/KBShortcutsDialog.cpp:118 -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/GLCanvas3D.cpp:4699 src/slic3r/GUI/KBShortcutsDialog.cpp:90 +#: src/slic3r/GUI/MainFrame.cpp:1128 msgid "Redo" -msgstr "Вернуть" +msgstr "Повтор действия" -#: src/slic3r/GUI/GLCanvas3D.cpp:4581 +#: src/slic3r/GUI/GLCanvas3D.cpp:4721 msgid "Next Redo action: %1%" -msgstr "Следующее возвращаемое действие: %1%" +msgstr "Следующее действие повтора: %1%" -#: src/slic3r/GUI/GLCanvas3D.cpp:6203 +#: src/slic3r/GUI/GLCanvas3D.cpp:6345 msgid "Selection-Add from rectangle" -msgstr "" +msgstr "Выбор\\Добавление из прямоугольника" -#: src/slic3r/GUI/GLCanvas3D.cpp:6222 +#: src/slic3r/GUI/GLCanvas3D.cpp:6364 msgid "Selection-Remove from rectangle" -msgstr "" +msgstr "Выбор\\Удаление из прямоугольника" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:48 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:146 src/libslic3r/PrintConfig.cpp:3655 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:54 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:151 +#: src/libslic3r/PrintConfig.cpp:3690 msgid "Cut" -msgstr "Обрезать" +msgstr "Разрезать" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:179 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:341 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:418 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:487 +msgid "in" +msgstr "дюйм" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:170 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:185 msgid "Keep upper part" msgstr "Оставить верхнюю часть" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:171 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:186 msgid "Keep lower part" msgstr "Оставить нижнюю часть" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:172 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:187 msgid "Rotate lower part upwards" -msgstr "Повернуть нижней частью вверх" +msgstr "Развернуть нижнюю часть" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:177 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:192 msgid "Perform cut" -msgstr "Выполнить обрезку" +msgstr "Выполнить разрез" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:33 msgid "Paint-on supports" -msgstr "" +msgstr "Рисование поддержек" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:42 -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:25 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49 src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:25 #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57 msgid "Clipping of view" -msgstr "" +msgstr "Отсечение вида" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:43 -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:26 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50 src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:26 #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58 msgid "Reset direction" -msgstr "Сбросить направление" +msgstr "Сброс направления" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:44 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:27 msgid "Brush size" -msgstr "" +msgstr "Размер кисти" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:45 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:28 msgid "Brush shape" -msgstr "" +msgstr "Форма кисти" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:29 msgid "Left mouse button" -msgstr "" +msgstr "Левая кнопка мыши" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47 msgid "Enforce supports" -msgstr "" +msgstr "Принудительная поддержка" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31 msgid "Right mouse button" -msgstr "" +msgstr "Правая кнопка мыши" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49 #: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:373 msgid "Block supports" -msgstr "" +msgstr "Блокировка поддержки" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33 msgid "Shift + Left mouse button" -msgstr "" +msgstr "Shift + Левая кнопка мыши" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34 #: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:368 #: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:378 msgid "Remove selection" -msgstr "" +msgstr "Удалить выделенное" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35 msgid "Remove all selection" -msgstr "" +msgstr "Удалить всё выделенное" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:36 msgid "Circle" -msgstr "" +msgstr "Круг" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54 -#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1563 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37 src/slic3r/GUI/GUI_ObjectList.cpp:1595 msgid "Sphere" msgstr "Сфера" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:129 msgid "Autoset by angle" -msgstr "" +msgstr "Автоустановка по углу" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:136 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:118 msgid "Reset selection" -msgstr "" +msgstr "Сброс выбранного" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:160 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:141 msgid "Alt + Mouse wheel" -msgstr "" +msgstr "Alt + Колесо мыши" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:178 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:159 msgid "Paints all facets inside, regardless of their orientation." -msgstr "" +msgstr "Закрашивает все грани внутри, независимо от их ориентации." #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:192 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:173 msgid "Ignores facets facing away from the camera." -msgstr "" +msgstr "Игнорирует грани, обращённые в сторону от камеры." #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:225 #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:203 msgid "Ctrl + Mouse wheel" -msgstr "" +msgstr "Ctrl + Колесо мыши" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:233 msgid "Autoset custom supports" -msgstr "" +msgstr "Автоустановка пользовательских поддержек" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:235 msgid "Threshold:" -msgstr "" +msgstr "Порог:" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:242 msgid "Enforce" -msgstr "" +msgstr "Принудительная" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:245 msgid "Block" -msgstr "" +msgstr "Блокировка" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:295 msgid "Block supports by angle" -msgstr "" +msgstr "Блокировка поддержек по углу" #: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:296 msgid "Add supports by angle" -msgstr "" +msgstr "Добавление поддержек по углу" #: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:40 msgid "Place on face" -msgstr "Положить гранью" +msgstr "Поверхностью на стол" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 msgid "Hollow this object" -msgstr "" +msgstr "Пустотелая модель" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41 msgid "Preview hollowed and drilled model" -msgstr "" +msgstr "Предпросмотр полости и отверстий в модели" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42 msgid "Offset" msgstr "Смещение" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43 -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:56 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43 src/slic3r/GUI/Jobs/SLAImportJob.cpp:56 msgid "Quality" msgstr "Качество" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44 -#: src/libslic3r/PrintConfig.cpp:3151 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44 src/libslic3r/PrintConfig.cpp:3183 msgid "Closing distance" -msgstr "Расстояние закрытия" +msgstr "Расстояние смыкания полости" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:45 msgid "Hole diameter" @@ -2252,7 +2289,7 @@ msgstr "Диаметр отверстия" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:46 msgid "Hole depth" -msgstr "" +msgstr "Глубина отверстия" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:47 msgid "Remove selected holes" @@ -2264,73 +2301,71 @@ msgstr "Удалить все отверстия" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:51 msgid "Show supports" -msgstr "Показать поддержки" +msgstr "Отображать поддержку" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:308 msgid "Add drainage hole" -msgstr "" +msgstr "Добавление отверстия" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:424 msgid "Delete drainage hole" -msgstr "Удалить дренажное отверстие" +msgstr "Удаление отверстия" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:624 msgid "Hollowing parameter change" -msgstr "" +msgstr "Изменение параметров пустотелой модели" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:693 msgid "Change drainage hole diameter" -msgstr "Изменить диаметр дренажного отверстия" +msgstr "Изменение диаметра отверстия" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:785 msgid "Hollow and drill" -msgstr "" +msgstr "Пустотелая модель и отверстия" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:835 msgid "Move drainage hole" -msgstr "" +msgstr "Перемещение отверстия" #: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:64 msgid "Move" -msgstr "Переместить" +msgstr "Перемещение" #: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:461 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:527 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:546 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 -#: src/libslic3r/PrintConfig.cpp:3704 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 src/libslic3r/PrintConfig.cpp:3739 msgid "Rotate" -msgstr "Повернуть" +msgstr "Поворот" #: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:78 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:238 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:547 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 -#: src/libslic3r/PrintConfig.cpp:3719 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 src/libslic3r/PrintConfig.cpp:3754 msgid "Scale" -msgstr "Масштабировать" +msgstr "Масштаб" #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:30 #: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:381 msgid "Enforce seam" -msgstr "" +msgstr "Принудительный шов" #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32 #: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:383 msgid "Block seam" -msgstr "" +msgstr "Блокировка шва" #: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:46 msgid "Seam painting" -msgstr "" +msgstr "Рисование шва" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47 msgid "Head diameter" -msgstr "Диаметр головы" +msgstr "Диаметр носика поддержки" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 msgid "Lock supports under new islands" -msgstr "" +msgstr "Блокировка поддержки под новые острова" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218 @@ -2344,30 +2379,29 @@ msgstr "Удалить все точки" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51 #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221 msgid "Apply changes" -msgstr "Выполнить изменения" +msgstr "Применить изменения" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52 #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1222 msgid "Discard changes" -msgstr "Отбросить изменения" +msgstr "Отменить изменения" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53 msgid "Minimal points distance" -msgstr "" +msgstr "Мин. расстояние м/у точками" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54 -#: src/libslic3r/PrintConfig.cpp:2981 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54 src/libslic3r/PrintConfig.cpp:3013 msgid "Support points density" -msgstr "Плотность опорных точек" +msgstr "Плотность точек поддержки" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55 #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224 msgid "Auto-generate points" -msgstr "Автоматическая генерация точек" +msgstr "Сгенерировать точки автоматически" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56 msgid "Manual editing" -msgstr "Правка вручную" +msgstr "Ручное редактирование" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:374 msgid "Add support point" @@ -2379,23 +2413,23 @@ msgstr "Удалить точку поддержки" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:694 msgid "Change point head diameter" -msgstr "" +msgstr "Изменение диаметра носика поддержки" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:762 msgid "Support parameter change" -msgstr "" +msgstr "Изменение параметра поддержки" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:869 msgid "SLA Support Points" -msgstr "Точки поддержек SLA" +msgstr "Точки SLA поддержки" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897 msgid "SLA gizmo turned on" -msgstr "" +msgstr "Гизмо SLA включено" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:911 msgid "Do you want to save your manually edited support points?" -msgstr "" +msgstr "Сохранить отредактированные вручную точки поддержки?" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:912 msgid "Save changes?" @@ -2403,48 +2437,49 @@ msgstr "Сохранить изменения?" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:924 msgid "SLA gizmo turned off" -msgstr "" +msgstr "Гизмо SLA отключено" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:955 msgid "Move support point" -msgstr "Переместить точку поддержки" +msgstr "Перемещение точки поддержки" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1048 msgid "Support points edit" -msgstr "Правка точек поддержки" +msgstr "Редактирование точек поддержки" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1127 msgid "Autogeneration will erase all manually edited points." -msgstr "" +msgstr "Автогенерация сотрёт все опорные точки, отредактированные вручную." #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1128 msgid "Are you sure you want to do it?" -msgstr "Вы уверены, что хотите сделать это?" +msgstr "Вы уверены, что хотите это сделать?" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1129 src/slic3r/GUI/GUI.cpp:256 #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:557 -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:581 -#: src/slic3r/GUI/WipeTowerDialog.cpp:45 src/slic3r/GUI/WipeTowerDialog.cpp:366 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:581 src/slic3r/GUI/WipeTowerDialog.cpp:45 +#: src/slic3r/GUI/WipeTowerDialog.cpp:366 msgid "Warning" msgstr "Предупреждение" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1134 msgid "Autogenerate support points" -msgstr "Автоматическая генерация точек поддержки" +msgstr "Автогенерация точек поддержки" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1181 msgid "SLA gizmo keyboard shortcuts" -msgstr "" +msgstr "Горячие клавиши \"Гизмо SLA\"" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1192 msgid "Note: some shortcuts work in (non)editing mode only." msgstr "" +"Примечание: некоторые сочетания клавиш работают только в режиме (не)редактирования." #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1210 #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1213 #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214 msgid "Left click" -msgstr "Щелчок левой клавишей" +msgstr "Левая кнопка мыши" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1210 msgid "Add point" @@ -2452,37 +2487,37 @@ msgstr "Добавить точку" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211 msgid "Right click" -msgstr "Щелчок правой клавишей" +msgstr "Правая кнопка мыши" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211 msgid "Remove point" -msgstr "Убрать точку" +msgstr "Удалить точку" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212 #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 msgid "Drag" -msgstr "Перетащить" +msgstr "Перетащить мышь" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212 msgid "Move point" -msgstr "Переместить точку" +msgstr "Передвинуть точку" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1213 msgid "Add point to selection" -msgstr "Добавить точку к выделению" +msgstr "Добавить точку к выбранным точкам" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214 msgid "Remove point from selection" -msgstr "Удалить точку из выделения" +msgstr "Удалить точку из выбранных точек" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 msgid "Select by rectangle" -msgstr "Выбрать прямоугольником" +msgstr "Выбрать точки прямоугольником" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 msgid "Deselect by rectangle" -msgstr "Удалить выбор прямоугольником" +msgstr "Убрать выбранные точки прямоугольником" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 msgid "Select all points" @@ -2494,11 +2529,11 @@ msgstr "Колесо мыши" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 msgid "Move clipping plane" -msgstr "" +msgstr "Переместить плоскость отсечения" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 msgid "Reset clipping plane" -msgstr "" +msgstr "Сброс плоскости отсечения" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1223 msgid "Switch to editing mode" @@ -2506,109 +2541,134 @@ msgstr "Переключиться в режим редактирования" #: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:521 msgid "Gizmo-Scale" -msgstr "Масштабировать" +msgstr "Гизмо масштаба" #: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:630 msgid "Gizmo-Place on Face" -msgstr "Поместить на грань" +msgstr "Гизмо поверхностью на стол" #: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:39 msgid "Entering Paint-on supports" -msgstr "" +msgstr "Войти в режим рисования поддержек" #: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:40 msgid "Entering Seam painting" -msgstr "" +msgstr "Войти в режим рисования шва" #: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:47 msgid "Leaving Seam painting" -msgstr "" +msgstr "Выйти из режима рисования шва" #: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:48 msgid "Leaving Paint-on supports" -msgstr "" +msgstr "Выйти из режима рисования поддержек" #: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:371 msgid "Add supports" -msgstr "" +msgstr "Добавление поддержек" -#: src/slic3r/GUI/GUI_App.cpp:235 +#: src/slic3r/GUI/GUI_App.cpp:239 msgid "is based on Slic3r by Alessandro Ranellucci and the RepRap community." -msgstr "" +msgstr "is based on Slic3r by Alessandro Ranellucci and the RepRap community." -#: src/slic3r/GUI/GUI_App.cpp:237 +#: src/slic3r/GUI/GUI_App.cpp:241 msgid "" "Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas " "Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous others." msgstr "" +"Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas " +"Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous others." -#: src/slic3r/GUI/GUI_App.cpp:238 +#: src/slic3r/GUI/GUI_App.cpp:242 msgid "Artwork model by Nora Al-Badri and Jan Nikolai Nelles" -msgstr "" +msgstr "Artwork model by Nora Al-Badri and Jan Nikolai Nelles" -#: src/slic3r/GUI/GUI_App.cpp:378 +#: src/slic3r/GUI/GUI_App.cpp:382 msgid "" -"Starting with %1% 2.3, configuration directory on Linux has changed " -"(according to XDG Base Directory Specification) to \n" +"Starting with %1% 2.3, configuration directory on Linux has changed (according to " +"XDG Base Directory Specification) to \n" "%2%.\n" "\n" -"This directory did not exist yet (maybe you run the new version for the " -"first time).\n" +"This directory did not exist yet (maybe you run the new version for the first " +"time).\n" "However, an old %1% configuration directory was detected in \n" "%3%.\n" "\n" -"Consider moving the contents of the old directory to the new location in " -"order to access your profiles, etc.\n" -"Note that if you decide to downgrade %1% in future, it will use the old " -"location again.\n" +"Consider moving the contents of the old directory to the new location in order to " +"access your profiles, etc.\n" +"Note that if you decide to downgrade %1% in future, it will use the old location " +"again.\n" "\n" "What do you want to do now?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:386 +#: src/slic3r/GUI/GUI_App.cpp:390 #, c-format msgid "%s - BREAKING CHANGE" -msgstr "" +msgstr "%s - КРИТИЧЕСКОЕ ИЗМЕНЕНИЕ" -#: src/slic3r/GUI/GUI_App.cpp:388 +#: src/slic3r/GUI/GUI_App.cpp:392 msgid "Quit, I will move my data now" -msgstr "" +msgstr "Выйти и перенести свои данные" -#: src/slic3r/GUI/GUI_App.cpp:388 +#: src/slic3r/GUI/GUI_App.cpp:392 msgid "Start the application" -msgstr "" +msgstr "Запустить приложение" -#: src/slic3r/GUI/GUI_App.cpp:576 +#: src/slic3r/GUI/GUI_App.cpp:580 #, c-format msgid "" -"%s has encountered an error. It was likely caused by running out of memory. " -"If you are sure you have enough RAM on your system, this may also be a bug " -"and we would be glad if you reported it.\n" +"%s has encountered an error. It was likely caused by running out of memory. If you " +"are sure you have enough RAM on your system, this may also be a bug and we would be " +"glad if you reported it.\n" "\n" "The application will now terminate." msgstr "" +"При работе с %s произошла с ошибкой. Скорее всего, это было вызвано нехваткой " +"памяти. Если вы уверены, что в вашей системе достаточно оперативной памяти и " +"произошла эта ошибка, сообщите нам об этом.\n" +"\n" +"Приложение будет закрыто." -#: src/slic3r/GUI/GUI_App.cpp:579 +#: src/slic3r/GUI/GUI_App.cpp:583 msgid "Fatal error" msgstr "Критическая ошибка" -#: src/slic3r/GUI/GUI_App.cpp:699 +#: src/slic3r/GUI/GUI_App.cpp:587 +msgid "" +"PrusaSlicer has encountered a localization error. Please report to PrusaSlicer " +"team, what language was active and in which scenario this issue happened. Thank " +"you.\n" +"\n" +"The application will now terminate." +msgstr "" +"PrusaSlicer обнаружил непредвиденную ошибку в локализации приложения. Пожалуйста, " +"сообщите команде PrusaSlicer, какой язык был активен и при каком сценарии произошла " +"эта ошибка.\n" +"Теперь приложение будет закрыто." + +#: src/slic3r/GUI/GUI_App.cpp:590 +msgid "Critical error" +msgstr "Критическая ошибка" + +#: src/slic3r/GUI/GUI_App.cpp:711 msgid "" -"Error parsing PrusaSlicer config file, it is probably corrupted. Try to " -"manually delete the file to recover from the error. Your user profiles will " -"not be affected." +"Error parsing PrusaSlicer config file, it is probably corrupted. Try to manually " +"delete the file to recover from the error. Your user profiles will not be affected." msgstr "" -"Ошибка при разборе файла настроек PrusaSlicer, вероятно, он повреждён. Чтобы " -"ошибка пропала, попробуйте удалить файл. Это не повлияет на ваши " -"пользовательские профили." +"Ошибка обработки конфигурационного файла PrusaSlicer. Вероятно, он повреждён. \n" +"Попробуйте вручную удалить файл для восстановления после ошибки. Пользовательские " +"профили не будут затронуты." -#: src/slic3r/GUI/GUI_App.cpp:705 +#: src/slic3r/GUI/GUI_App.cpp:717 msgid "" "Error parsing PrusaGCodeViewer config file, it is probably corrupted. Try to " "manually delete the file to recover from the error." msgstr "" +"Ошибка обработки конфигурационного файла PrusaGCodeViewer. Вероятно, он повреждён. " +"Попробуйте вручную удалить файл для восстановления после ошибки." -#: src/slic3r/GUI/GUI_App.cpp:759 +#: src/slic3r/GUI/GUI_App.cpp:771 #, c-format msgid "" "%s\n" @@ -2617,282 +2677,301 @@ msgstr "" "%s\n" "Хотите продолжить?" -#: src/slic3r/GUI/GUI_App.cpp:761 src/slic3r/GUI/UnsavedChangesDialog.cpp:659 +#: src/slic3r/GUI/GUI_App.cpp:773 src/slic3r/GUI/UnsavedChangesDialog.cpp:665 msgid "Remember my choice" -msgstr "" +msgstr "Запомнить мой выбор" -#: src/slic3r/GUI/GUI_App.cpp:796 +#: src/slic3r/GUI/GUI_App.cpp:808 msgid "Loading configuration" -msgstr "" +msgstr "Загрузка конфигурации" -#: src/slic3r/GUI/GUI_App.cpp:864 +#: src/slic3r/GUI/GUI_App.cpp:876 msgid "Preparing settings tabs" -msgstr "" +msgstr "Подготовка вкладок настроек" -#: src/slic3r/GUI/GUI_App.cpp:1109 -msgid "" -"You have the following presets with saved options for \"Print Host upload\"" +#: src/slic3r/GUI/GUI_App.cpp:1115 +msgid "You have the following presets with saved options for \"Print Host upload\"" msgstr "" +"У вас имеются следующие профили с сохраненными параметрами для загрузки на хост " +"печати" -#: src/slic3r/GUI/GUI_App.cpp:1113 +#: src/slic3r/GUI/GUI_App.cpp:1119 msgid "" -"But since this version of PrusaSlicer we don't show this information in " -"Printer Settings anymore.\n" +"But since this version of PrusaSlicer we don't show this information in Printer " +"Settings anymore.\n" "Settings will be available in physical printers settings." msgstr "" +"Начиная с этой версии PrusaSlicer мы больше не показываем эту информацию в " +"настройках принтера.\n" +"Теперь эти настройки будут доступны в разделе настройки физических принтеров." -#: src/slic3r/GUI/GUI_App.cpp:1115 +#: src/slic3r/GUI/GUI_App.cpp:1121 msgid "" -"By default new Printer devices will be named as \"Printer N\" during its " -"creation.\n" +"By default new Printer devices will be named as \"Printer N\" during its creation.\n" "Note: This name can be changed later from the physical printers settings" msgstr "" +"При создании новых принтеров они будут именоваться как \"Принтер N\".\n" +"Примечание: это имя можно изменить позже в настройках физических принтеров" -#: src/slic3r/GUI/GUI_App.cpp:1118 +#: src/slic3r/GUI/GUI_App.cpp:1124 src/slic3r/GUI/PhysicalPrinterDialog.cpp:626 msgid "Information" -msgstr "" +msgstr "Информация" -#: src/slic3r/GUI/GUI_App.cpp:1131 src/slic3r/GUI/GUI_App.cpp:1142 +#: src/slic3r/GUI/GUI_App.cpp:1137 src/slic3r/GUI/GUI_App.cpp:1148 msgid "Recreating" -msgstr "Пересоздание" +msgstr "Воссоздание" -#: src/slic3r/GUI/GUI_App.cpp:1147 +#: src/slic3r/GUI/GUI_App.cpp:1153 msgid "Loading of current presets" -msgstr "" +msgstr "Загрузка текущих профилей" -#: src/slic3r/GUI/GUI_App.cpp:1152 +#: src/slic3r/GUI/GUI_App.cpp:1158 msgid "Loading of a mode view" -msgstr "" +msgstr "Загрузка режима просмотра" -#: src/slic3r/GUI/GUI_App.cpp:1233 +#: src/slic3r/GUI/GUI_App.cpp:1234 msgid "Choose one file (3MF/AMF):" -msgstr "Выберите файл (3MF/AMF):" +msgstr "Выберите один файл (3MF/AMF):" -#: src/slic3r/GUI/GUI_App.cpp:1245 +#: src/slic3r/GUI/GUI_App.cpp:1246 msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):" msgstr "Выберите один или несколько файлов (STL/OBJ/AMF/3MF/PRUSA):" -#: src/slic3r/GUI/GUI_App.cpp:1257 +#: src/slic3r/GUI/GUI_App.cpp:1258 msgid "Choose one file (GCODE/.GCO/.G/.ngc/NGC):" -msgstr "" +msgstr "Выберите один файл (GCODE/.GCO/.G/.ngc/NGC):" -#: src/slic3r/GUI/GUI_App.cpp:1268 +#: src/slic3r/GUI/GUI_App.cpp:1269 msgid "Changing of an application language" -msgstr "Изменить язык приложения" +msgstr "Изменение языка приложения" -#: src/slic3r/GUI/GUI_App.cpp:1330 +#: src/slic3r/GUI/GUI_App.cpp:1392 msgid "Select the language" msgstr "Выбор языка" -#: src/slic3r/GUI/GUI_App.cpp:1330 +#: src/slic3r/GUI/GUI_App.cpp:1392 msgid "Language" msgstr "Язык" -#: src/slic3r/GUI/GUI_App.cpp:1460 +#: src/slic3r/GUI/GUI_App.cpp:1541 msgid "modified" msgstr "изменено" -#: src/slic3r/GUI/GUI_App.cpp:1509 +#: src/slic3r/GUI/GUI_App.cpp:1590 #, c-format msgid "Run %s" -msgstr "Запустите %s" +msgstr "Запустить %s" -#: src/slic3r/GUI/GUI_App.cpp:1513 +#: src/slic3r/GUI/GUI_App.cpp:1594 msgid "&Configuration Snapshots" -msgstr "Снапшоты настроек" +msgstr "&Резервные копии конфигурации (снапшот)" -#: src/slic3r/GUI/GUI_App.cpp:1513 +#: src/slic3r/GUI/GUI_App.cpp:1594 msgid "Inspect / activate configuration snapshots" -msgstr "Посмотреть/вернуть настройки из снапшота" +msgstr "Проверка и активация резервных копий конфигурации" -#: src/slic3r/GUI/GUI_App.cpp:1514 +#: src/slic3r/GUI/GUI_App.cpp:1595 msgid "Take Configuration &Snapshot" -msgstr "Сделать снапшот настроек" +msgstr "Сделать &снапшот" -#: src/slic3r/GUI/GUI_App.cpp:1514 +#: src/slic3r/GUI/GUI_App.cpp:1595 msgid "Capture a configuration snapshot" -msgstr "Сделать снапшот настроек" +msgstr "Сделать резервную копию конфигурации (снапшот)" -#: src/slic3r/GUI/GUI_App.cpp:1515 +#: src/slic3r/GUI/GUI_App.cpp:1596 msgid "Check for updates" -msgstr "Проверить обновления" +msgstr "Проверить наличие обновлений" -#: src/slic3r/GUI/GUI_App.cpp:1515 +#: src/slic3r/GUI/GUI_App.cpp:1596 msgid "Check for configuration updates" -msgstr "Проверить обновления настроек" +msgstr "Проверка наличие обновлений конфигурации" -#: src/slic3r/GUI/GUI_App.cpp:1518 +#: src/slic3r/GUI/GUI_App.cpp:1599 msgid "&Preferences" -msgstr "&Настройки" +msgstr "&Настройки приложения" -#: src/slic3r/GUI/GUI_App.cpp:1524 +#: src/slic3r/GUI/GUI_App.cpp:1605 msgid "Application preferences" msgstr "Настройки приложения" -#: src/slic3r/GUI/GUI_App.cpp:1529 src/slic3r/GUI/wxExtensions.cpp:673 +#: src/slic3r/GUI/GUI_App.cpp:1610 src/slic3r/GUI/wxExtensions.cpp:685 msgid "Simple" msgstr "Простой" -#: src/slic3r/GUI/GUI_App.cpp:1529 +#: src/slic3r/GUI/GUI_App.cpp:1610 msgid "Simple View Mode" -msgstr "Простой режим интерфейса" +msgstr "Простой режим просмотра интерфейса приложения" -#: src/slic3r/GUI/GUI_App.cpp:1531 src/slic3r/GUI/wxExtensions.cpp:675 +#: src/slic3r/GUI/GUI_App.cpp:1612 src/slic3r/GUI/wxExtensions.cpp:687 msgctxt "Mode" msgid "Advanced" msgstr "Расширенный" -#: src/slic3r/GUI/GUI_App.cpp:1531 +#: src/slic3r/GUI/GUI_App.cpp:1612 msgid "Advanced View Mode" -msgstr "Расширенный режим интерфейса" +msgstr "Расширенный режим просмотра интерфейса приложения" -#: src/slic3r/GUI/GUI_App.cpp:1532 src/slic3r/GUI/wxExtensions.cpp:676 +#: src/slic3r/GUI/GUI_App.cpp:1613 src/slic3r/GUI/wxExtensions.cpp:688 msgid "Expert" -msgstr "Экспертный" +msgstr "Продвинутый" -#: src/slic3r/GUI/GUI_App.cpp:1532 +#: src/slic3r/GUI/GUI_App.cpp:1613 msgid "Expert View Mode" -msgstr "Экспертный режим интерфейса" +msgstr "Продвинутый режим просмотра интерфейса приложения" -#: src/slic3r/GUI/GUI_App.cpp:1537 +#: src/slic3r/GUI/GUI_App.cpp:1618 msgid "Mode" -msgstr "Режим" +msgstr "Режим интерфейса" -#: src/slic3r/GUI/GUI_App.cpp:1537 +#: src/slic3r/GUI/GUI_App.cpp:1618 #, c-format msgid "%s View Mode" -msgstr "%s режим интерфейса" +msgstr "%s режим просмотра" -#: src/slic3r/GUI/GUI_App.cpp:1540 +#: src/slic3r/GUI/GUI_App.cpp:1621 msgid "&Language" -msgstr "&Язык" +msgstr "&Язык программы" -#: src/slic3r/GUI/GUI_App.cpp:1543 +#: src/slic3r/GUI/GUI_App.cpp:1624 msgid "Flash printer &firmware" -msgstr "Прошить принтер" +msgstr "&Прошивка принтера" -#: src/slic3r/GUI/GUI_App.cpp:1543 +#: src/slic3r/GUI/GUI_App.cpp:1624 msgid "Upload a firmware image into an Arduino based printer" msgstr "Загрузить прошивку в принтер на основе Arduino" -#: src/slic3r/GUI/GUI_App.cpp:1559 +#: src/slic3r/GUI/GUI_App.cpp:1640 msgid "Taking configuration snapshot" msgstr "Создание снапшота" -#: src/slic3r/GUI/GUI_App.cpp:1559 +#: src/slic3r/GUI/GUI_App.cpp:1640 msgid "Snapshot name" msgstr "Имя снапшота" -#: src/slic3r/GUI/GUI_App.cpp:1635 +#: src/slic3r/GUI/GUI_App.cpp:1669 +msgid "Failed to activate configuration snapshot." +msgstr "Сбой активации снапшота." + +#: src/slic3r/GUI/GUI_App.cpp:1719 msgid "Language selection" msgstr "Выбор языка" -#: src/slic3r/GUI/GUI_App.cpp:1637 +#: src/slic3r/GUI/GUI_App.cpp:1721 msgid "" "Switching the language will trigger application restart.\n" "You will lose content of the plater." msgstr "" -"При смене языка приложение будет перезапущено.\n" -"Исчезнет содержимое компоновки." +"Смена языка вызовет перезапуск приложения.\n" +"Вы потеряете содержимое стола." -#: src/slic3r/GUI/GUI_App.cpp:1639 +#: src/slic3r/GUI/GUI_App.cpp:1723 msgid "Do you want to proceed?" msgstr "Хотите продолжить?" -#: src/slic3r/GUI/GUI_App.cpp:1666 +#: src/slic3r/GUI/GUI_App.cpp:1750 msgid "&Configuration" msgstr "&Настройки" -#: src/slic3r/GUI/GUI_App.cpp:1697 +#: src/slic3r/GUI/GUI_App.cpp:1781 msgid "The preset(s) modifications are successfully saved" -msgstr "" +msgstr "Изменения в профиле(-ях) успешно сохранены" + +#: src/slic3r/GUI/GUI_App.cpp:1802 +msgid "The uploads are still ongoing" +msgstr "Загрузки всё ещё продолжаются" + +#: src/slic3r/GUI/GUI_App.cpp:1802 +msgid "Stop them and continue anyway?" +msgstr "Остановить их и продолжить?" + +#: src/slic3r/GUI/GUI_App.cpp:1805 +msgid "Ongoing uploads" +msgstr "Текущие загрузки" -#: src/slic3r/GUI/GUI_App.cpp:1907 src/slic3r/GUI/Tab.cpp:3232 +#: src/slic3r/GUI/GUI_App.cpp:2019 src/slic3r/GUI/Tab.cpp:3242 msgid "It's impossible to print multi-part object(s) with SLA technology." -msgstr "" -"Невозможно напечатать объект(ы), состоящий из нескольких частей с помощью " -"технологии SLA." +msgstr "По технологии SLA невозможно напечатать составную модель(и)." -#: src/slic3r/GUI/GUI_App.cpp:1908 +#: src/slic3r/GUI/GUI_App.cpp:2020 msgid "Please check and fix your object list." -msgstr "Проверьте и исправьте список объектов." +msgstr "Пожалуйста, проверьте и исправьте ваш список моделей." -#: src/slic3r/GUI/GUI_App.cpp:1909 src/slic3r/GUI/Jobs/SLAImportJob.cpp:210 -#: src/slic3r/GUI/Plater.cpp:2337 src/slic3r/GUI/Tab.cpp:3234 +#: src/slic3r/GUI/GUI_App.cpp:2021 src/slic3r/GUI/Jobs/SLAImportJob.cpp:210 +#: src/slic3r/GUI/Plater.cpp:2359 src/slic3r/GUI/Tab.cpp:3244 msgid "Attention!" msgstr "Внимание!" -#: src/slic3r/GUI/GUI_App.cpp:1926 +#: src/slic3r/GUI/GUI_App.cpp:2038 msgid "Select a gcode file:" -msgstr "Выберите файл gcode:" +msgstr "Выбрать файл G-кода:" #: src/slic3r/GUI/GUI_Init.cpp:73 src/slic3r/GUI/GUI_Init.cpp:76 msgid "PrusaSlicer GUI initialization failed" -msgstr "" +msgstr "Ошибка инициализации графического интерфейса PrusaSlicer" #: src/slic3r/GUI/GUI_Init.cpp:76 msgid "Fatal error, exception catched: %1%" -msgstr "" +msgstr "Критическая ошибка, обнаружено исключение: %1%" #: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 msgid "Start at height" -msgstr "Начать с высоты" +msgstr "Начинать с" #: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 msgid "Stop at height" -msgstr "Закончить на высоте" +msgstr "Закончить на" #: src/slic3r/GUI/GUI_ObjectLayers.cpp:161 msgid "Remove layer range" -msgstr "Удалить диапазон слоев" +msgstr "Удалить диапазон слоёв" #: src/slic3r/GUI/GUI_ObjectLayers.cpp:165 msgid "Add layer range" -msgstr "Добавить диапазон слоев" +msgstr "Добавить диапазон слоёв" #: src/slic3r/GUI/GUI_ObjectList.cpp:34 src/slic3r/GUI/GUI_ObjectList.cpp:92 -#: src/slic3r/GUI/GUI_ObjectList.cpp:651 src/libslic3r/PrintConfig.cpp:72 -#: src/libslic3r/PrintConfig.cpp:216 src/libslic3r/PrintConfig.cpp:225 -#: src/libslic3r/PrintConfig.cpp:449 src/libslic3r/PrintConfig.cpp:515 -#: src/libslic3r/PrintConfig.cpp:523 src/libslic3r/PrintConfig.cpp:953 -#: src/libslic3r/PrintConfig.cpp:1191 src/libslic3r/PrintConfig.cpp:1556 -#: src/libslic3r/PrintConfig.cpp:1622 src/libslic3r/PrintConfig.cpp:1803 -#: src/libslic3r/PrintConfig.cpp:2270 src/libslic3r/PrintConfig.cpp:2329 -#: src/libslic3r/PrintConfig.cpp:2338 +#: src/slic3r/GUI/GUI_ObjectList.cpp:667 src/libslic3r/PrintConfig.cpp:74 +#: src/libslic3r/PrintConfig.cpp:189 src/libslic3r/PrintConfig.cpp:231 +#: src/libslic3r/PrintConfig.cpp:240 src/libslic3r/PrintConfig.cpp:464 +#: src/libslic3r/PrintConfig.cpp:530 src/libslic3r/PrintConfig.cpp:538 +#: src/libslic3r/PrintConfig.cpp:970 src/libslic3r/PrintConfig.cpp:1219 +#: src/libslic3r/PrintConfig.cpp:1584 src/libslic3r/PrintConfig.cpp:1650 +#: src/libslic3r/PrintConfig.cpp:1835 src/libslic3r/PrintConfig.cpp:2302 +#: src/libslic3r/PrintConfig.cpp:2361 src/libslic3r/PrintConfig.cpp:2370 msgid "Layers and Perimeters" msgstr "Слои и периметры" #: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:95 -#: src/slic3r/GUI/GUI_ObjectList.cpp:654 src/slic3r/GUI/GUI_Preview.cpp:254 -#: src/slic3r/GUI/Tab.cpp:1473 src/slic3r/GUI/Tab.cpp:1475 +#: src/slic3r/GUI/GUI_ObjectList.cpp:670 src/slic3r/GUI/GUI_Preview.cpp:240 +#: src/slic3r/GUI/Tab.cpp:1472 src/slic3r/GUI/Tab.cpp:1474 #: src/libslic3r/ExtrusionEntity.cpp:320 src/libslic3r/ExtrusionEntity.cpp:352 -#: src/libslic3r/PrintConfig.cpp:411 src/libslic3r/PrintConfig.cpp:1683 -#: src/libslic3r/PrintConfig.cpp:2061 src/libslic3r/PrintConfig.cpp:2067 -#: src/libslic3r/PrintConfig.cpp:2075 src/libslic3r/PrintConfig.cpp:2087 -#: src/libslic3r/PrintConfig.cpp:2097 src/libslic3r/PrintConfig.cpp:2105 -#: src/libslic3r/PrintConfig.cpp:2120 src/libslic3r/PrintConfig.cpp:2141 -#: src/libslic3r/PrintConfig.cpp:2153 src/libslic3r/PrintConfig.cpp:2169 -#: src/libslic3r/PrintConfig.cpp:2178 src/libslic3r/PrintConfig.cpp:2187 -#: src/libslic3r/PrintConfig.cpp:2198 src/libslic3r/PrintConfig.cpp:2212 -#: src/libslic3r/PrintConfig.cpp:2220 src/libslic3r/PrintConfig.cpp:2221 -#: src/libslic3r/PrintConfig.cpp:2230 src/libslic3r/PrintConfig.cpp:2238 -#: src/libslic3r/PrintConfig.cpp:2252 +#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:1715 +#: src/libslic3r/PrintConfig.cpp:2093 src/libslic3r/PrintConfig.cpp:2099 +#: src/libslic3r/PrintConfig.cpp:2107 src/libslic3r/PrintConfig.cpp:2119 +#: src/libslic3r/PrintConfig.cpp:2129 src/libslic3r/PrintConfig.cpp:2137 +#: src/libslic3r/PrintConfig.cpp:2152 src/libslic3r/PrintConfig.cpp:2173 +#: src/libslic3r/PrintConfig.cpp:2185 src/libslic3r/PrintConfig.cpp:2201 +#: src/libslic3r/PrintConfig.cpp:2210 src/libslic3r/PrintConfig.cpp:2219 +#: src/libslic3r/PrintConfig.cpp:2230 src/libslic3r/PrintConfig.cpp:2244 +#: src/libslic3r/PrintConfig.cpp:2252 src/libslic3r/PrintConfig.cpp:2253 +#: src/libslic3r/PrintConfig.cpp:2262 src/libslic3r/PrintConfig.cpp:2270 +#: src/libslic3r/PrintConfig.cpp:2284 msgid "Support material" -msgstr "Материал поддержки" +msgstr "Поддержка" #: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:99 -#: src/slic3r/GUI/GUI_ObjectList.cpp:658 src/libslic3r/PrintConfig.cpp:2448 -#: src/libslic3r/PrintConfig.cpp:2456 +#: src/slic3r/GUI/GUI_ObjectList.cpp:674 src/libslic3r/PrintConfig.cpp:2480 +#: src/libslic3r/PrintConfig.cpp:2488 msgid "Wipe options" msgstr "Параметры очистки" #: src/slic3r/GUI/GUI_ObjectList.cpp:45 msgid "Pad and Support" -msgstr "" +msgstr "Подложка и Поддержка" #: src/slic3r/GUI/GUI_ObjectList.cpp:51 msgid "Add part" -msgstr "" +msgstr "Добавить элемент" #: src/slic3r/GUI/GUI_ObjectList.cpp:52 msgid "Add modifier" @@ -2900,629 +2979,623 @@ msgstr "Добавить модификатор" #: src/slic3r/GUI/GUI_ObjectList.cpp:53 msgid "Add support enforcer" -msgstr "" +msgstr "Принудительная поддержка" #: src/slic3r/GUI/GUI_ObjectList.cpp:54 msgid "Add support blocker" -msgstr "" +msgstr "Блокировщик поддержки" -#: src/slic3r/GUI/GUI_ObjectList.cpp:94 src/slic3r/GUI/GUI_ObjectList.cpp:653 -#: src/slic3r/GUI/GUI_Preview.cpp:250 src/slic3r/GUI/Tab.cpp:1443 +#: src/slic3r/GUI/GUI_ObjectList.cpp:94 src/slic3r/GUI/GUI_ObjectList.cpp:669 +#: src/slic3r/GUI/GUI_Preview.cpp:236 src/slic3r/GUI/Tab.cpp:1442 #: src/libslic3r/ExtrusionEntity.cpp:316 src/libslic3r/ExtrusionEntity.cpp:344 -#: src/libslic3r/PrintConfig.cpp:1198 src/libslic3r/PrintConfig.cpp:1204 -#: src/libslic3r/PrintConfig.cpp:1218 src/libslic3r/PrintConfig.cpp:1228 -#: src/libslic3r/PrintConfig.cpp:1236 src/libslic3r/PrintConfig.cpp:1238 +#: src/libslic3r/PrintConfig.cpp:1226 src/libslic3r/PrintConfig.cpp:1232 +#: src/libslic3r/PrintConfig.cpp:1246 src/libslic3r/PrintConfig.cpp:1256 +#: src/libslic3r/PrintConfig.cpp:1264 src/libslic3r/PrintConfig.cpp:1266 msgid "Ironing" msgstr "Разглаживание" -#: src/slic3r/GUI/GUI_ObjectList.cpp:96 src/slic3r/GUI/GUI_ObjectList.cpp:655 -#: src/slic3r/GUI/GUI_Preview.cpp:231 src/slic3r/GUI/Tab.cpp:1499 -#: src/libslic3r/PrintConfig.cpp:276 src/libslic3r/PrintConfig.cpp:503 -#: src/libslic3r/PrintConfig.cpp:984 src/libslic3r/PrintConfig.cpp:1164 -#: src/libslic3r/PrintConfig.cpp:1237 src/libslic3r/PrintConfig.cpp:1612 -#: src/libslic3r/PrintConfig.cpp:1884 src/libslic3r/PrintConfig.cpp:1936 -#: src/libslic3r/PrintConfig.cpp:2314 +#: src/slic3r/GUI/GUI_ObjectList.cpp:96 src/slic3r/GUI/GUI_ObjectList.cpp:671 +#: src/slic3r/GUI/GUI_Preview.cpp:217 src/slic3r/GUI/Tab.cpp:1498 +#: src/libslic3r/PrintConfig.cpp:291 src/libslic3r/PrintConfig.cpp:518 +#: src/libslic3r/PrintConfig.cpp:1012 src/libslic3r/PrintConfig.cpp:1192 +#: src/libslic3r/PrintConfig.cpp:1265 src/libslic3r/PrintConfig.cpp:1640 +#: src/libslic3r/PrintConfig.cpp:1916 src/libslic3r/PrintConfig.cpp:1968 +#: src/libslic3r/PrintConfig.cpp:2346 msgid "Speed" msgstr "Скорость" -#: src/slic3r/GUI/GUI_ObjectList.cpp:97 src/slic3r/GUI/GUI_ObjectList.cpp:656 -#: src/slic3r/GUI/Tab.cpp:1535 src/slic3r/GUI/Tab.cpp:2112 -#: src/libslic3r/PrintConfig.cpp:533 src/libslic3r/PrintConfig.cpp:1118 -#: src/libslic3r/PrintConfig.cpp:1590 src/libslic3r/PrintConfig.cpp:1905 -#: src/libslic3r/PrintConfig.cpp:2133 src/libslic3r/PrintConfig.cpp:2160 +#: src/slic3r/GUI/GUI_ObjectList.cpp:97 src/slic3r/GUI/GUI_ObjectList.cpp:672 +#: src/slic3r/GUI/Tab.cpp:1534 src/slic3r/GUI/Tab.cpp:2112 +#: src/libslic3r/PrintConfig.cpp:548 src/libslic3r/PrintConfig.cpp:1146 +#: src/libslic3r/PrintConfig.cpp:1618 src/libslic3r/PrintConfig.cpp:1937 +#: src/libslic3r/PrintConfig.cpp:2165 src/libslic3r/PrintConfig.cpp:2192 msgid "Extruders" msgstr "Экструдеры" -#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:657 -#: src/libslic3r/PrintConfig.cpp:492 src/libslic3r/PrintConfig.cpp:600 -#: src/libslic3r/PrintConfig.cpp:940 src/libslic3r/PrintConfig.cpp:1126 -#: src/libslic3r/PrintConfig.cpp:1599 src/libslic3r/PrintConfig.cpp:1925 -#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:2302 +#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:673 +#: src/libslic3r/PrintConfig.cpp:507 src/libslic3r/PrintConfig.cpp:616 +#: src/libslic3r/PrintConfig.cpp:957 src/libslic3r/PrintConfig.cpp:1154 +#: src/libslic3r/PrintConfig.cpp:1627 src/libslic3r/PrintConfig.cpp:1957 +#: src/libslic3r/PrintConfig.cpp:2174 src/libslic3r/PrintConfig.cpp:2334 msgid "Extrusion Width" msgstr "Ширина экструзии" -#: src/slic3r/GUI/GUI_ObjectList.cpp:102 src/slic3r/GUI/GUI_ObjectList.cpp:661 -#: src/slic3r/GUI/Tab.cpp:1429 src/slic3r/GUI/Tab.cpp:1453 -#: src/slic3r/GUI/Tab.cpp:1556 src/slic3r/GUI/Tab.cpp:1559 -#: src/slic3r/GUI/Tab.cpp:1855 src/slic3r/GUI/Tab.cpp:2192 -#: src/slic3r/GUI/Tab.cpp:4104 src/libslic3r/PrintConfig.cpp:90 -#: src/libslic3r/PrintConfig.cpp:128 src/libslic3r/PrintConfig.cpp:264 -#: src/libslic3r/PrintConfig.cpp:1069 src/libslic3r/PrintConfig.cpp:1153 -#: src/libslic3r/PrintConfig.cpp:2472 src/libslic3r/PrintConfig.cpp:2644 +#: src/slic3r/GUI/GUI_ObjectList.cpp:102 src/slic3r/GUI/GUI_ObjectList.cpp:677 +#: src/slic3r/GUI/Tab.cpp:1428 src/slic3r/GUI/Tab.cpp:1452 src/slic3r/GUI/Tab.cpp:1555 +#: src/slic3r/GUI/Tab.cpp:1558 src/slic3r/GUI/Tab.cpp:1855 src/slic3r/GUI/Tab.cpp:2197 +#: src/slic3r/GUI/Tab.cpp:4114 src/libslic3r/PrintConfig.cpp:92 +#: src/libslic3r/PrintConfig.cpp:132 src/libslic3r/PrintConfig.cpp:279 +#: src/libslic3r/PrintConfig.cpp:1097 src/libslic3r/PrintConfig.cpp:1181 +#: src/libslic3r/PrintConfig.cpp:2504 src/libslic3r/PrintConfig.cpp:2676 msgid "Advanced" -msgstr "Расширенный" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:104 src/slic3r/GUI/GUI_ObjectList.cpp:663 -#: src/slic3r/GUI/Plater.cpp:357 src/slic3r/GUI/Tab.cpp:4038 -#: src/slic3r/GUI/Tab.cpp:4039 src/libslic3r/PrintConfig.cpp:2810 -#: src/libslic3r/PrintConfig.cpp:2817 src/libslic3r/PrintConfig.cpp:2826 -#: src/libslic3r/PrintConfig.cpp:2835 src/libslic3r/PrintConfig.cpp:2845 -#: src/libslic3r/PrintConfig.cpp:2855 src/libslic3r/PrintConfig.cpp:2892 -#: src/libslic3r/PrintConfig.cpp:2899 src/libslic3r/PrintConfig.cpp:2910 -#: src/libslic3r/PrintConfig.cpp:2920 src/libslic3r/PrintConfig.cpp:2929 -#: src/libslic3r/PrintConfig.cpp:2942 src/libslic3r/PrintConfig.cpp:2952 -#: src/libslic3r/PrintConfig.cpp:2961 src/libslic3r/PrintConfig.cpp:2971 -#: src/libslic3r/PrintConfig.cpp:2982 src/libslic3r/PrintConfig.cpp:2990 +msgstr "Дополнительно" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:104 src/slic3r/GUI/GUI_ObjectList.cpp:679 +#: src/slic3r/GUI/Plater.cpp:357 src/slic3r/GUI/Tab.cpp:4048 +#: src/slic3r/GUI/Tab.cpp:4049 src/libslic3r/PrintConfig.cpp:2842 +#: src/libslic3r/PrintConfig.cpp:2849 src/libslic3r/PrintConfig.cpp:2858 +#: src/libslic3r/PrintConfig.cpp:2867 src/libslic3r/PrintConfig.cpp:2877 +#: src/libslic3r/PrintConfig.cpp:2887 src/libslic3r/PrintConfig.cpp:2924 +#: src/libslic3r/PrintConfig.cpp:2931 src/libslic3r/PrintConfig.cpp:2942 +#: src/libslic3r/PrintConfig.cpp:2952 src/libslic3r/PrintConfig.cpp:2961 +#: src/libslic3r/PrintConfig.cpp:2974 src/libslic3r/PrintConfig.cpp:2984 +#: src/libslic3r/PrintConfig.cpp:2993 src/libslic3r/PrintConfig.cpp:3003 +#: src/libslic3r/PrintConfig.cpp:3014 src/libslic3r/PrintConfig.cpp:3022 msgid "Supports" -msgstr "Поддержки" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:105 src/slic3r/GUI/GUI_ObjectList.cpp:664 -#: src/slic3r/GUI/Plater.cpp:500 src/slic3r/GUI/Tab.cpp:4079 -#: src/slic3r/GUI/Tab.cpp:4080 src/slic3r/GUI/Tab.cpp:4151 -#: src/libslic3r/PrintConfig.cpp:2998 src/libslic3r/PrintConfig.cpp:3005 -#: src/libslic3r/PrintConfig.cpp:3019 src/libslic3r/PrintConfig.cpp:3030 -#: src/libslic3r/PrintConfig.cpp:3040 src/libslic3r/PrintConfig.cpp:3062 -#: src/libslic3r/PrintConfig.cpp:3073 src/libslic3r/PrintConfig.cpp:3080 -#: src/libslic3r/PrintConfig.cpp:3087 src/libslic3r/PrintConfig.cpp:3098 -#: src/libslic3r/PrintConfig.cpp:3107 src/libslic3r/PrintConfig.cpp:3116 +msgstr "Поддержка" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:105 src/slic3r/GUI/GUI_ObjectList.cpp:680 +#: src/slic3r/GUI/Plater.cpp:500 src/slic3r/GUI/Tab.cpp:4089 +#: src/slic3r/GUI/Tab.cpp:4090 src/slic3r/GUI/Tab.cpp:4161 +#: src/libslic3r/PrintConfig.cpp:3030 src/libslic3r/PrintConfig.cpp:3037 +#: src/libslic3r/PrintConfig.cpp:3051 src/libslic3r/PrintConfig.cpp:3062 +#: src/libslic3r/PrintConfig.cpp:3072 src/libslic3r/PrintConfig.cpp:3094 +#: src/libslic3r/PrintConfig.cpp:3105 src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3119 src/libslic3r/PrintConfig.cpp:3130 +#: src/libslic3r/PrintConfig.cpp:3139 src/libslic3r/PrintConfig.cpp:3148 msgid "Pad" -msgstr "" +msgstr "Подложка" -#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/Tab.cpp:4097 -#: src/slic3r/GUI/Tab.cpp:4098 src/libslic3r/SLA/Hollowing.cpp:45 +#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/Tab.cpp:4107 +#: src/slic3r/GUI/Tab.cpp:4108 src/libslic3r/SLA/Hollowing.cpp:45 #: src/libslic3r/SLA/Hollowing.cpp:57 src/libslic3r/SLA/Hollowing.cpp:66 -#: src/libslic3r/SLA/Hollowing.cpp:75 src/libslic3r/PrintConfig.cpp:3126 -#: src/libslic3r/PrintConfig.cpp:3133 src/libslic3r/PrintConfig.cpp:3143 -#: src/libslic3r/PrintConfig.cpp:3152 +#: src/libslic3r/SLA/Hollowing.cpp:75 src/libslic3r/PrintConfig.cpp:3158 +#: src/libslic3r/PrintConfig.cpp:3165 src/libslic3r/PrintConfig.cpp:3175 +#: src/libslic3r/PrintConfig.cpp:3184 msgid "Hollowing" -msgstr "" +msgstr "Полость" -#: src/slic3r/GUI/GUI_ObjectList.cpp:284 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:161 +#: src/slic3r/GUI/GUI_ObjectList.cpp:300 src/slic3r/GUI/GUI_ObjectManipulation.cpp:161 msgid "Name" -msgstr "Имя" +msgstr "Файл" -#: src/slic3r/GUI/GUI_ObjectList.cpp:300 src/slic3r/GUI/GUI_ObjectList.cpp:441 +#: src/slic3r/GUI/GUI_ObjectList.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:457 msgid "Editing" -msgstr "Редактирование" +msgstr "Правка" -#: src/slic3r/GUI/GUI_ObjectList.cpp:386 +#: src/slic3r/GUI/GUI_ObjectList.cpp:402 #, c-format msgid "Auto-repaired (%d errors):" msgstr "Исправлено ошибок: %d" -#: src/slic3r/GUI/GUI_ObjectList.cpp:393 +#: src/slic3r/GUI/GUI_ObjectList.cpp:409 msgid "degenerate facets" -msgstr "граней вырождено" +msgstr "Вырожденных граней" -#: src/slic3r/GUI/GUI_ObjectList.cpp:394 +#: src/slic3r/GUI/GUI_ObjectList.cpp:410 msgid "edges fixed" -msgstr "рёбер починено" +msgstr "Рёбер починено" -#: src/slic3r/GUI/GUI_ObjectList.cpp:395 +#: src/slic3r/GUI/GUI_ObjectList.cpp:411 msgid "facets removed" -msgstr "граней удалено" +msgstr "Граней удалено" -#: src/slic3r/GUI/GUI_ObjectList.cpp:396 +#: src/slic3r/GUI/GUI_ObjectList.cpp:412 msgid "facets added" -msgstr "граней добавлено" +msgstr "Граней добавлено" -#: src/slic3r/GUI/GUI_ObjectList.cpp:397 +#: src/slic3r/GUI/GUI_ObjectList.cpp:413 msgid "facets reversed" -msgstr "граней реверсировано" +msgstr "Граней реверсировано" -#: src/slic3r/GUI/GUI_ObjectList.cpp:398 +#: src/slic3r/GUI/GUI_ObjectList.cpp:414 msgid "backwards edges" -msgstr "рёбер вывернуто" +msgstr "Вывернуто рёбер" -#: src/slic3r/GUI/GUI_ObjectList.cpp:406 +#: src/slic3r/GUI/GUI_ObjectList.cpp:422 msgid "Right button click the icon to fix STL through Netfabb" msgstr "" +"Щёлкните правой кнопкой мыши на восклицательный знак, чтобы исправить STL с помощью " +"сервиса Netfabb." -#: src/slic3r/GUI/GUI_ObjectList.cpp:443 +#: src/slic3r/GUI/GUI_ObjectList.cpp:459 msgid "Right button click the icon to change the object settings" -msgstr "" +msgstr "Щёлкните правой кнопкой мыши на значок, чтобы изменить настройки модели." -#: src/slic3r/GUI/GUI_ObjectList.cpp:445 +#: src/slic3r/GUI/GUI_ObjectList.cpp:461 msgid "Click the icon to change the object settings" -msgstr "" +msgstr "Щёлкните кнопкой мыши на значок, чтобы изменить настройки модели." -#: src/slic3r/GUI/GUI_ObjectList.cpp:449 +#: src/slic3r/GUI/GUI_ObjectList.cpp:465 msgid "Right button click the icon to change the object printable property" msgstr "" +"Щёлкните правой кнопкой мыши на значок, чтобы разрешить\\запретить печать модели." -#: src/slic3r/GUI/GUI_ObjectList.cpp:451 +#: src/slic3r/GUI/GUI_ObjectList.cpp:467 msgid "Click the icon to change the object printable property" -msgstr "" +msgstr "Щёлкните кнопкой мыши на значок, чтобы разрешить\\запретить печать модели." -#: src/slic3r/GUI/GUI_ObjectList.cpp:574 +#: src/slic3r/GUI/GUI_ObjectList.cpp:590 msgid "Change Extruder" -msgstr "Сменить экструдер" +msgstr "Смена экструдера" -#: src/slic3r/GUI/GUI_ObjectList.cpp:589 +#: src/slic3r/GUI/GUI_ObjectList.cpp:605 msgid "Rename Object" -msgstr "Переименовать объект" +msgstr "Переименование модели" -#: src/slic3r/GUI/GUI_ObjectList.cpp:589 +#: src/slic3r/GUI/GUI_ObjectList.cpp:605 msgid "Rename Sub-object" -msgstr "Переименовать подобъект" +msgstr "Переименование подобъекта" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1215 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4244 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1247 src/slic3r/GUI/GUI_ObjectList.cpp:4372 msgid "Instances to Separated Objects" -msgstr "" +msgstr "Копия как отдельная модель" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1230 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1262 msgid "Volumes in Object reordered" -msgstr "" +msgstr "Объёмы в модели переупорядочены" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1230 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1262 msgid "Object reordered" -msgstr "Объект переупорядочен" +msgstr "Модель переупорядочена" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1306 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1661 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1667 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2008 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1338 src/slic3r/GUI/GUI_ObjectList.cpp:1693 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1699 src/slic3r/GUI/GUI_ObjectList.cpp:2081 #, c-format msgid "Quick Add Settings (%s)" -msgstr "" +msgstr "Быстрое добавление настроек (%s)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1396 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1428 msgid "Select showing settings" -msgstr "Выбор настроек отображения" +msgstr "Выбор параметров отображения" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1445 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1477 msgid "Add Settings for Layers" -msgstr "" +msgstr "Добавление параметров для слоёв" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1446 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1478 msgid "Add Settings for Sub-object" -msgstr "" +msgstr "Добавление параметров для подобъекта" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1447 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1479 msgid "Add Settings for Object" -msgstr "" +msgstr "Добавление параметров для модели" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1517 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1549 msgid "Add Settings Bundle for Height range" -msgstr "" +msgstr "Добавление набора настроек для переменной высоты слоёв" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1518 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1550 msgid "Add Settings Bundle for Sub-object" -msgstr "" +msgstr "Добавление набора параметров для подобъекта" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1519 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1551 msgid "Add Settings Bundle for Object" -msgstr "" +msgstr "Добавление набора параметров для модели" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1558 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1590 msgid "Load" msgstr "Загрузить" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1563 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1595 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1599 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1595 src/slic3r/GUI/GUI_ObjectList.cpp:1627 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1631 msgid "Box" -msgstr "" +msgstr "Куб" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1563 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1595 msgid "Cylinder" msgstr "Цилиндр" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1563 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1595 msgid "Slab" -msgstr "" +msgstr "Плита" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1663 msgid "Height range Modifier" -msgstr "" +msgstr "Модификатор переменной высоты слоёв" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1640 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1672 msgid "Add settings" msgstr "Добавить настройки" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1718 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1750 msgid "Change type" msgstr "Изменить тип" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1728 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1740 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1760 src/slic3r/GUI/GUI_ObjectList.cpp:1772 msgid "Set as a Separated Object" -msgstr "" +msgstr "Превратить в отдельную модель" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1740 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1772 msgid "Set as a Separated Objects" -msgstr "" +msgstr "Превратить в отдельные модели" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1750 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1782 msgid "Printable" -msgstr "" +msgstr "Для печати" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1765 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1797 msgid "Rename" msgstr "Переименовать" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1776 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1808 msgid "Fix through the Netfabb" -msgstr "Починить в Netfabb" +msgstr "Ремонт модели службой Netfabb" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1786 src/slic3r/GUI/Plater.cpp:3958 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1818 src/slic3r/GUI/Plater.cpp:4035 msgid "Export as STL" msgstr "Экспорт в STL" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1793 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4439 src/slic3r/GUI/Plater.cpp:3924 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1825 src/slic3r/GUI/GUI_ObjectList.cpp:4567 +#: src/slic3r/GUI/Plater.cpp:4001 msgid "Reload the selected volumes from disk" -msgstr "Перезагрузить выделенные объёмы с диска" +msgstr "Перезагрузить выбранные объёмы с диска" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1800 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1832 msgid "Set extruder for selected items" -msgstr "" +msgstr "Задать экструдер для выбранных частей" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1832 src/libslic3r/PrintConfig.cpp:376 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1864 src/libslic3r/PrintConfig.cpp:391 msgid "Default" msgstr "По умолчанию" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1852 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1884 msgid "Scale to print volume" -msgstr "Масштабировать к объёму принтера" +msgstr "Отмасштабировать под область печати" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1852 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1884 msgid "Scale the selected object to fit the print volume" -msgstr "Масштабировать выделенный объект до объёма принтера" +msgstr "Отмасштабировать выбранную модель до объёма стола" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1858 src/slic3r/GUI/Plater.cpp:5142 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1913 src/slic3r/GUI/Plater.cpp:5224 msgid "Convert from imperial units" -msgstr "" +msgstr "Преобразовать размер из английской системы мер" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1861 src/slic3r/GUI/Plater.cpp:5142 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1915 src/slic3r/GUI/Plater.cpp:5224 msgid "Revert conversion from imperial units" -msgstr "" +msgstr "Отменить преобразование размера из английской системы мер" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1868 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1876 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2569 src/libslic3r/PrintConfig.cpp:3695 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1944 src/slic3r/GUI/GUI_ObjectList.cpp:1952 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2630 src/libslic3r/PrintConfig.cpp:3730 msgid "Merge" msgstr "Объединить" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1868 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1944 msgid "Merge objects to the one multipart object" -msgstr "" +msgstr "Объединить модели в одну составную модель" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1876 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1952 msgid "Merge objects to the one single object" -msgstr "" +msgstr "Объединить модели в одну единую модель" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1953 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2210 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2026 src/slic3r/GUI/GUI_ObjectList.cpp:2283 msgid "Add Shape" -msgstr "" +msgstr "Добавить фигуру" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2038 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2111 msgid "Load Part" -msgstr "Загрузить часть" +msgstr "Загрузка элемента" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2077 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2150 msgid "Error!" msgstr "Ошибка!" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2152 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2225 msgid "Add Generic Subobject" -msgstr "" +msgstr "Добавление сгенерированного элемента" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2181 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2254 msgid "Generic" -msgstr "Общие" +msgstr "Сгенерирован" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2307 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2408 -msgid "Last instance of an object cannot be deleted." -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2319 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2380 msgid "Delete Settings" -msgstr "Удалить настройки" +msgstr "Удаление настроек" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2341 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2402 msgid "Delete All Instances from Object" -msgstr "Удалить все экземпляры из объекта" +msgstr "Удаление всех копий из модели" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2357 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2418 msgid "Delete Height Range" -msgstr "" +msgstr "Удаление переменной высоты слоёв" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2389 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2450 msgid "From Object List You can't delete the last solid part from object." msgstr "" +"Вы не можете удалить из списка моделей последний твердотельный элемент модели." -#: src/slic3r/GUI/GUI_ObjectList.cpp:2393 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2454 msgid "Delete Subobject" -msgstr "Удалить подобъект" +msgstr "Удаление части" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2412 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2469 +msgid "Last instance of an object cannot be deleted." +msgstr "Последняя копия модели не может быть удалена." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2473 msgid "Delete Instance" -msgstr "Удалить экземпляр" +msgstr "Удаление копии" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2436 src/slic3r/GUI/Plater.cpp:2840 -msgid "" -"The selected object couldn't be split because it contains only one part." -msgstr "" -"Выбранный объект не может быть разделен, так как он состоит из одной части." +#: src/slic3r/GUI/GUI_ObjectList.cpp:2497 src/slic3r/GUI/Plater.cpp:2865 +msgid "The selected object couldn't be split because it contains only one part." +msgstr "Выбранная модель не может быть разделена, так как она состоит из одной части." -#: src/slic3r/GUI/GUI_ObjectList.cpp:2440 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2501 msgid "Split to Parts" -msgstr "Разбить на части" +msgstr "Разделение на части" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2576 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2637 msgid "Merged" -msgstr "" +msgstr "Объединённые" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2660 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2721 msgid "Merge all parts to the one single object" -msgstr "" +msgstr "Объединить все части в одну единую модель" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2692 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2753 msgid "Add Layers" -msgstr "Добавить слои" +msgstr "Добавление слоёв" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2846 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2907 msgid "Group manipulation" -msgstr "Действия с группой" +msgstr "Групповые манипуляции" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2858 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2919 msgid "Object manipulation" -msgstr "Действия с объектом" +msgstr "Манипуляция над моделями" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2871 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2932 msgid "Object Settings to modify" -msgstr "" +msgstr "Параметры модели для изменения" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2875 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2936 msgid "Part Settings to modify" -msgstr "" +msgstr "Параметры элемента для изменения" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2880 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2941 msgid "Layer range Settings to modify" -msgstr "" +msgstr "Изменение параметров диапазона слоёв" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2886 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2947 msgid "Part manipulation" -msgstr "" +msgstr "Манипуляция над элементом" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2892 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2953 msgid "Instance manipulation" -msgstr "Действия с экземпляром" +msgstr "Манипуляция с копиями" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2899 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2960 msgid "Height ranges" -msgstr "Диапазоны высот" +msgstr "Переменная высота слоёв" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2899 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2960 msgid "Settings for height range" -msgstr "" +msgstr "Настройки для переменной высоты слоёв" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3083 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3144 msgid "Delete Selected Item" -msgstr "Удалить выделенный элемент" +msgstr "Удаление выбранных частей" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3221 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3332 msgid "Delete Selected" -msgstr "Удалить выбранное" +msgstr "Удаление выбранного" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3297 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3325 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3345 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3408 src/slic3r/GUI/GUI_ObjectList.cpp:3436 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3456 msgid "Add Height Range" -msgstr "" +msgstr "Добавить переменную высоту слоёв" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3391 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3502 msgid "" "Cannot insert a new layer range after the current layer range.\n" "The next layer range is too thin to be split to two\n" "without violating the minimum layer height." msgstr "" +"Невозможно вставить новый диапазон слоёв после текущего \n" +"диапазона слоёв. Следующий диапазон слоёв слишком тонкий, \n" +"чтобы его можно было разделить на два слоя \n" +"без нарушения минимальной высоты слоя." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3395 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3506 msgid "" -"Cannot insert a new layer range between the current and the next layer " -"range.\n" +"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." msgstr "" +"Невозможно вставить новый диапазон слоёв между текущим \n" +"и следующим диапазонами слоёв. Зазор между текущим \n" +"диапазоном слоёв и следующим диапазоном слоёв меньше \n" +"минимально допустимой высоты слоя." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3400 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3511 msgid "" "Cannot insert a new layer range after the current layer range.\n" "Current layer range overlaps with the next layer range." msgstr "" +"Невозможно вставить новый диапазон слоёв после \n" +"текущего диапазона слоёв. Текущий диапазон слоёв \n" +"перекрывается со следующим диапазоном слоёв." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3459 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3570 msgid "Edit Height Range" -msgstr "" +msgstr "Редактирование переменной высоты слоёв" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3754 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3865 msgid "Selection-Remove from list" -msgstr "" +msgstr "Выбор\\Удаление из списка" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3762 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3873 msgid "Selection-Add from list" -msgstr "Выделение-Добавлено из списка" +msgstr "Выбор\\Добавление из списка" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3880 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4008 msgid "Object or Instance" -msgstr "Объект или экземпляр" +msgstr "Модель или копия" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3881 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4014 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4009 src/slic3r/GUI/GUI_ObjectList.cpp:4142 msgid "Part" -msgstr "" +msgstr "элемент" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3881 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4009 msgid "Layer" -msgstr "Слой" +msgstr "Слои" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3883 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4011 msgid "Unsupported selection" -msgstr "Неподдерживаемое выделение" +msgstr "Неподдерживаемый выбор" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3884 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4012 #, c-format msgid "You started your selection with %s Item." -msgstr "" +msgstr "Вы начали свой выбор с сущности %s." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3885 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4013 #, c-format msgid "In this mode you can select only other %s Items%s" -msgstr "" +msgstr "В этом режиме можно выбирать только сущности %s%s" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3888 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4016 msgid "of a current Object" -msgstr "текущего объекта" +msgstr "текущей модели" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3893 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3968 src/slic3r/GUI/Plater.cpp:143 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4021 src/slic3r/GUI/GUI_ObjectList.cpp:4096 +#: src/slic3r/GUI/Plater.cpp:143 msgid "Info" msgstr "Информация" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4009 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4137 msgid "You can't change a type of the last solid part of the object." -msgstr "" +msgstr "Вы не можете изменить тип последнего твердотельного элемента модели." -#: src/slic3r/GUI/GUI_ObjectList.cpp:4014 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4142 msgid "Modifier" msgstr "Модификатор" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4014 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4142 msgid "Support Enforcer" -msgstr "" +msgstr "Принудительная поддержка" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4014 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4142 msgid "Support Blocker" msgstr "Блокировщик поддержки" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4016 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4144 msgid "Select type of part" -msgstr "Выберите тип части" +msgstr "Выбор типа элемента" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4021 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4149 msgid "Change Part Type" -msgstr "" +msgstr "Изменение типа элемента" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4266 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4394 msgid "Enter new name" msgstr "Введите новое имя" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4266 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4394 msgid "Renaming" msgstr "Переименование" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4282 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4409 -#: src/slic3r/GUI/SavePresetDialog.cpp:101 -#: src/slic3r/GUI/SavePresetDialog.cpp:109 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4410 src/slic3r/GUI/GUI_ObjectList.cpp:4537 +#: src/slic3r/GUI/SavePresetDialog.cpp:101 src/slic3r/GUI/SavePresetDialog.cpp:109 msgid "The supplied name is not valid;" msgstr "Заданное имя недопустимо;" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4283 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4410 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4411 src/slic3r/GUI/GUI_ObjectList.cpp:4538 #: src/slic3r/GUI/SavePresetDialog.cpp:102 msgid "the following characters are not allowed:" msgstr "следующие знаки не разрешаются:" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4458 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4586 msgid "Select extruder number:" -msgstr "Задайте номер экструдера:" +msgstr "Выберите номер экструдера:" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4459 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4587 msgid "This extruder will be set for selected items" -msgstr "" +msgstr "Этот экструдер будет задан для выбранных частей" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4484 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4612 msgid "Change Extruders" msgstr "Смена экструдеров" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4581 src/slic3r/GUI/Selection.cpp:1512 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4709 src/slic3r/GUI/Selection.cpp:1485 msgid "Set Printable" -msgstr "Установить печатным" +msgstr "Задать \"Для печати\"" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4581 src/slic3r/GUI/Selection.cpp:1512 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4709 src/slic3r/GUI/Selection.cpp:1485 msgid "Set Unprintable" -msgstr "Установить непечатным" +msgstr "Задать \"Не для печати\"" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:68 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:111 msgid "World coordinates" -msgstr "Мировые координаты" +msgstr "Мировая СК" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:69 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:112 msgid "Local coordinates" -msgstr "Локальные координаты" +msgstr "Локальная СК" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:88 msgid "Select coordinate space, in which the transformation will be performed." msgstr "" +"Выберите координатное пространство, в котором будет выполняться преобразование." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:163 src/libslic3r/GCode.cpp:629 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:163 src/libslic3r/GCode.cpp:537 msgid "Object name" -msgstr "Имя объекта" +msgstr "Имя модели" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:223 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:505 msgid "Position" -msgstr "Положение" +msgstr "Позиция" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:224 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:506 -#: src/slic3r/GUI/Mouse3DController.cpp:487 -#: src/slic3r/GUI/Mouse3DController.cpp:508 +#: src/slic3r/GUI/Mouse3DController.cpp:486 src/slic3r/GUI/Mouse3DController.cpp:507 msgid "Rotation" msgstr "Вращение" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:271 #, c-format msgid "Toggle %c axis mirroring" -msgstr "" +msgstr "Отразить вдоль оси %c" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:305 msgid "Set Mirror" -msgstr "Отражение" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:341 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:418 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:487 -msgid "in" -msgstr "дюйм" +msgstr "Задание отражения" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:345 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:357 msgid "Drop to bed" -msgstr "" +msgstr "Положить на стол" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:372 msgid "Reset rotation" -msgstr "Сбросить поворот" +msgstr "Сброс вращения" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:394 msgid "Reset Rotation" -msgstr "Сбросить поворот" +msgstr "Сброс вращения" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:407 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409 msgid "Reset scale" -msgstr "" +msgstr "Сброс масштаба" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:423 +msgid "Inches" +msgstr "Дюймы" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:507 msgid "Scale factors" @@ -3530,33 +3603,37 @@ msgstr "Масштаб" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:561 msgid "Translate" -msgstr "" +msgstr "Перемещение" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:625 -msgid "" -"You cannot use non-uniform scaling mode for multiple objects/parts selection" +msgid "You cannot use non-uniform scaling mode for multiple objects/parts selection" msgstr "" +"Нельзя использовать режим неравномерного масштабирования, когда выбрано несколько " +"моделей/частей." #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:797 msgid "Set Position" -msgstr "Задать положение" +msgstr "Задание позиции" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:828 msgid "Set Orientation" -msgstr "Задать ориентацию" +msgstr "Задание поворота" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:893 msgid "Set Scale" -msgstr "Задать масштаб" +msgstr "Задание масштаба" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:925 msgid "" -"The currently manipulated object is tilted (rotation angles are not " -"multiples of 90°).\n" -"Non-uniform scaling of tilted objects is only possible in the World " -"coordinate system,\n" +"The currently manipulated object is tilted (rotation angles are not multiples of " +"90°).\n" +"Non-uniform scaling of tilted objects is only possible in the World coordinate " +"system,\n" "once the rotation is embedded into the object coordinates." msgstr "" +"Модель, с которой вы работаете, наклонена (углы поворота не кратен 90 °).\n" +"Неравномерное масштабирование наклонных объектов возможно только в мировой \n" +"системе координат, когда информация о вращении записывается в координаты модели." #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:928 msgid "" @@ -3564,7 +3641,7 @@ msgid "" "Do you want to proceed?" msgstr "" "Эта операция необратима.\n" -"Продолжить?" +"Хотите продолжить?" #: src/slic3r/GUI/GUI_ObjectSettings.cpp:62 msgid "Additional Settings" @@ -3577,133 +3654,134 @@ msgstr "Удалить параметр" #: src/slic3r/GUI/GUI_ObjectSettings.cpp:104 #, c-format msgid "Delete Option %s" -msgstr "Удалить параметр %s" +msgstr "Удаление параметра %s" #: src/slic3r/GUI/GUI_ObjectSettings.cpp:157 #, c-format msgid "Change Option %s" -msgstr "Изменить параметр %s" +msgstr "Изменение параметра %s" -#: src/slic3r/GUI/GUI_Preview.cpp:226 +#: src/slic3r/GUI/GUI_Preview.cpp:212 msgid "View" msgstr "Вид" -#: src/slic3r/GUI/GUI_Preview.cpp:229 src/libslic3r/PrintConfig.cpp:545 +#: src/slic3r/GUI/GUI_Preview.cpp:215 src/libslic3r/PrintConfig.cpp:560 msgid "Height" msgstr "Высота" -#: src/slic3r/GUI/GUI_Preview.cpp:230 src/libslic3r/PrintConfig.cpp:2434 +#: src/slic3r/GUI/GUI_Preview.cpp:216 src/libslic3r/PrintConfig.cpp:2466 msgid "Width" msgstr "Ширина" -#: src/slic3r/GUI/GUI_Preview.cpp:232 src/slic3r/GUI/Tab.cpp:1841 +#: src/slic3r/GUI/GUI_Preview.cpp:218 src/slic3r/GUI/Tab.cpp:1840 msgid "Fan speed" msgstr "Скорость вентилятора" -#: src/slic3r/GUI/GUI_Preview.cpp:233 +#: src/slic3r/GUI/GUI_Preview.cpp:219 msgid "Volumetric flow rate" msgstr "Объёмный расход" -#: src/slic3r/GUI/GUI_Preview.cpp:238 +#: src/slic3r/GUI/GUI_Preview.cpp:224 msgid "Show" msgstr "Отображать" -#: src/slic3r/GUI/GUI_Preview.cpp:241 src/slic3r/GUI/GUI_Preview.cpp:259 +#: src/slic3r/GUI/GUI_Preview.cpp:227 src/slic3r/GUI/GUI_Preview.cpp:245 msgid "Feature types" msgstr "Типы линий" -#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:310 +#: src/slic3r/GUI/GUI_Preview.cpp:230 src/libslic3r/ExtrusionEntity.cpp:310 #: src/libslic3r/ExtrusionEntity.cpp:332 msgid "Perimeter" -msgstr "Периметр" +msgstr "Внутренний периметр" -#: src/slic3r/GUI/GUI_Preview.cpp:245 src/libslic3r/ExtrusionEntity.cpp:311 +#: src/slic3r/GUI/GUI_Preview.cpp:231 src/libslic3r/ExtrusionEntity.cpp:311 #: src/libslic3r/ExtrusionEntity.cpp:334 msgid "External perimeter" msgstr "Внешний периметр" -#: src/slic3r/GUI/GUI_Preview.cpp:246 src/libslic3r/ExtrusionEntity.cpp:312 +#: src/slic3r/GUI/GUI_Preview.cpp:232 src/libslic3r/ExtrusionEntity.cpp:312 #: src/libslic3r/ExtrusionEntity.cpp:336 msgid "Overhang perimeter" msgstr "Нависающий периметр" -#: src/slic3r/GUI/GUI_Preview.cpp:247 src/libslic3r/ExtrusionEntity.cpp:313 +#: src/slic3r/GUI/GUI_Preview.cpp:233 src/libslic3r/ExtrusionEntity.cpp:313 #: src/libslic3r/ExtrusionEntity.cpp:338 msgid "Internal infill" msgstr "Заполнение" -#: src/slic3r/GUI/GUI_Preview.cpp:248 src/libslic3r/ExtrusionEntity.cpp:314 -#: src/libslic3r/ExtrusionEntity.cpp:340 src/libslic3r/PrintConfig.cpp:1924 -#: src/libslic3r/PrintConfig.cpp:1935 +#: src/slic3r/GUI/GUI_Preview.cpp:234 src/libslic3r/ExtrusionEntity.cpp:314 +#: src/libslic3r/ExtrusionEntity.cpp:340 src/libslic3r/PrintConfig.cpp:1956 +#: src/libslic3r/PrintConfig.cpp:1967 msgid "Solid infill" msgstr "Сплошное заполнение" -#: src/slic3r/GUI/GUI_Preview.cpp:249 src/libslic3r/ExtrusionEntity.cpp:315 -#: src/libslic3r/ExtrusionEntity.cpp:342 src/libslic3r/PrintConfig.cpp:2301 -#: src/libslic3r/PrintConfig.cpp:2313 +#: src/slic3r/GUI/GUI_Preview.cpp:235 src/libslic3r/ExtrusionEntity.cpp:315 +#: src/libslic3r/ExtrusionEntity.cpp:342 src/libslic3r/PrintConfig.cpp:2333 +#: src/libslic3r/PrintConfig.cpp:2345 msgid "Top solid infill" msgstr "Верхний сплошной слой" -#: src/slic3r/GUI/GUI_Preview.cpp:251 src/libslic3r/ExtrusionEntity.cpp:317 +#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/ExtrusionEntity.cpp:317 #: src/libslic3r/ExtrusionEntity.cpp:346 msgid "Bridge infill" -msgstr "Заполнение моста" +msgstr "Мосты" -#: src/slic3r/GUI/GUI_Preview.cpp:252 src/libslic3r/ExtrusionEntity.cpp:318 -#: src/libslic3r/ExtrusionEntity.cpp:348 src/libslic3r/PrintConfig.cpp:983 +#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:318 +#: src/libslic3r/ExtrusionEntity.cpp:348 src/libslic3r/PrintConfig.cpp:1011 msgid "Gap fill" msgstr "Заполнение пробелов" -#: src/slic3r/GUI/GUI_Preview.cpp:253 src/slic3r/GUI/Tab.cpp:1463 +#: src/slic3r/GUI/GUI_Preview.cpp:239 src/slic3r/GUI/Tab.cpp:1462 #: src/libslic3r/ExtrusionEntity.cpp:319 src/libslic3r/ExtrusionEntity.cpp:350 msgid "Skirt" msgstr "Юбка" -#: src/slic3r/GUI/GUI_Preview.cpp:255 src/libslic3r/ExtrusionEntity.cpp:321 -#: src/libslic3r/ExtrusionEntity.cpp:354 src/libslic3r/PrintConfig.cpp:2186 +#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:321 +#: src/libslic3r/ExtrusionEntity.cpp:354 src/libslic3r/PrintConfig.cpp:2218 msgid "Support material interface" msgstr "Связующий слой поддержки" -#: src/slic3r/GUI/GUI_Preview.cpp:256 src/slic3r/GUI/Tab.cpp:1546 +#: src/slic3r/GUI/GUI_Preview.cpp:242 src/slic3r/GUI/Tab.cpp:1545 #: src/libslic3r/ExtrusionEntity.cpp:322 src/libslic3r/ExtrusionEntity.cpp:356 msgid "Wipe tower" -msgstr "Башня очистки" +msgstr "Черновая башня" -#: src/slic3r/GUI/GUI_Preview.cpp:986 +#: src/slic3r/GUI/GUI_Preview.cpp:1031 msgid "Shells" msgstr "Оболочка" -#: src/slic3r/GUI/GUI_Preview.cpp:987 +#: src/slic3r/GUI/GUI_Preview.cpp:1032 msgid "Tool marker" -msgstr "" +msgstr "Маркер инструмента" -#: src/slic3r/GUI/GUI_Preview.cpp:988 +#: src/slic3r/GUI/GUI_Preview.cpp:1033 msgid "Legend/Estimated printing time" -msgstr "" +msgstr "Условные обозначения/Расчётное время печати" #: src/slic3r/GUI/ImGuiWrapper.cpp:804 src/slic3r/GUI/Search.cpp:389 msgid "Use for search" -msgstr "" +msgstr "Использовать для поиска" #: src/slic3r/GUI/ImGuiWrapper.cpp:805 src/slic3r/GUI/Search.cpp:383 msgid "Category" -msgstr "" +msgstr "Категория" #: src/slic3r/GUI/ImGuiWrapper.cpp:807 src/slic3r/GUI/Search.cpp:385 msgid "Search in English" -msgstr "" +msgstr "Искать на английском языке" -#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:146 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:145 msgid "Arranging" msgstr "Расстановка" #: src/slic3r/GUI/Jobs/ArrangeJob.cpp:175 msgid "Could not arrange model objects! Some geometries may be invalid." msgstr "" +"Не удалось расставить части модели! Некоторые геометрии могут быть недопустимыми." #: src/slic3r/GUI/Jobs/ArrangeJob.cpp:181 msgid "Arranging canceled." -msgstr "Авторасположение отменено." +msgstr "Расстановка отменена." #: src/slic3r/GUI/Jobs/ArrangeJob.cpp:182 msgid "Arranging done." @@ -3715,655 +3793,754 @@ msgstr "ОШИБКА: недостаточно ресурсов для выпо #: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:41 msgid "Searching for optimal orientation" -msgstr "" +msgstr "Поиск оптимального положения" #: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:73 msgid "Orientation search canceled." -msgstr "" +msgstr "Поиск оптимального положения отменён." #: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:74 msgid "Orientation found." -msgstr "Ориентация найдена." +msgstr "Оптимальное положения найдено." #: src/slic3r/GUI/Jobs/SLAImportJob.cpp:35 msgid "Choose SLA archive:" -msgstr "" +msgstr "Выберите SLA архив:" #: src/slic3r/GUI/Jobs/SLAImportJob.cpp:39 msgid "Import file" -msgstr "" +msgstr "Файл для импорта" #: src/slic3r/GUI/Jobs/SLAImportJob.cpp:46 msgid "Import model and profile" -msgstr "" +msgstr "Импортировать модель и профиль" #: src/slic3r/GUI/Jobs/SLAImportJob.cpp:47 msgid "Import profile only" -msgstr "" +msgstr "Импортировать только профиль" #: src/slic3r/GUI/Jobs/SLAImportJob.cpp:48 msgid "Import model only" -msgstr "" +msgstr "Импортировать только модель" #: src/slic3r/GUI/Jobs/SLAImportJob.cpp:59 msgid "Accurate" -msgstr "" +msgstr "Точность" #: src/slic3r/GUI/Jobs/SLAImportJob.cpp:60 msgid "Balanced" -msgstr "" +msgstr "Баланс" #: src/slic3r/GUI/Jobs/SLAImportJob.cpp:61 msgid "Quick" -msgstr "" +msgstr "Скорость" #: src/slic3r/GUI/Jobs/SLAImportJob.cpp:135 msgid "Importing SLA archive" -msgstr "" +msgstr "Импорт SLA архива" #: src/slic3r/GUI/Jobs/SLAImportJob.cpp:159 msgid "Importing canceled." -msgstr "" +msgstr "Импорт отменен." #: src/slic3r/GUI/Jobs/SLAImportJob.cpp:160 msgid "Importing done." -msgstr "" +msgstr "Импорт завершён." -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:208 src/slic3r/GUI/Plater.cpp:2335 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:208 src/slic3r/GUI/Plater.cpp:2357 msgid "You cannot load SLA project with a multi-part object on the bed" -msgstr "" +msgstr "Вы не можете загрузить SLA проект с составной моделью на столе" -#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:209 src/slic3r/GUI/Plater.cpp:2336 -#: src/slic3r/GUI/Tab.cpp:3233 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:209 src/slic3r/GUI/Plater.cpp:2358 +#: src/slic3r/GUI/Tab.cpp:3243 msgid "Please check your object list before preset changing." -msgstr "Проверьте список объектов перед изменением профиля." +msgstr "Пожалуйста, проверьте список моделей перед изменением профиля." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:34 src/slic3r/GUI/MainFrame.cpp:898 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:17 src/slic3r/GUI/MainFrame.cpp:894 msgid "Keyboard Shortcuts" -msgstr "Клавиатурные комбинации" +msgstr "Горячие клавиши" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:97 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:69 msgid "New project, clear plater" -msgstr "Новый проект, очистить компоновку" +msgstr "Новый проект, пустой стол" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:98 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:70 msgid "Open project STL/OBJ/AMF/3MF with config, clear plater" -msgstr "Открыть проект STL/OBJ/AMF/3MF с настройками, очистить компоновку" +msgstr "Открыть STL/OBJ/AMF/3MF проект с конфигурацией, очистив стол" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:99 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:71 msgid "Save project (3mf)" msgstr "Сохранить проект (3mf)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:72 msgid "Save project as (3mf)" -msgstr "Сохранить проект как (3mf)" +msgstr "Сохранить проект (3MF)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:101 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:73 msgid "(Re)slice" -msgstr "Нарезать" +msgstr "(Пере)Нарезать" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:103 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:75 msgid "Import STL/OBJ/AMF/3MF without config, keep plater" -msgstr "Импортировать проект STL/OBJ/AMF/3MF без настроек, оставить компоновку" +msgstr "Загрузить STL/OBJ/AMF/3MF проект с конфигурацией, не очищая стол" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:76 msgid "Import Config from ini/amf/3mf/gcode" -msgstr "Импортировать настройки из ini/amf/3mf/gcode" +msgstr "Загрузить конфигурацию из ini/amf/3mf/g-кода" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:105 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:77 msgid "Load Config from ini/amf/3mf/gcode and merge" -msgstr "Загрузить настройки из ini/amf/3mf/gcode и объединить" +msgstr "Загрузить конфигурацию из ini/amf/3mf/g-кода и объединить" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:107 src/slic3r/GUI/Plater.cpp:770 -#: src/slic3r/GUI/Plater.cpp:5961 src/libslic3r/PrintConfig.cpp:3600 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:79 src/slic3r/GUI/Plater.cpp:770 +#: src/slic3r/GUI/Plater.cpp:6054 src/libslic3r/PrintConfig.cpp:3635 msgid "Export G-code" -msgstr "Экспортировать G-код" +msgstr "Экспорт в G-код" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 src/slic3r/GUI/Plater.cpp:5962 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:80 src/slic3r/GUI/Plater.cpp:6055 msgid "Send G-code" -msgstr "Послать G-код" +msgstr "Отправить G-код" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:81 msgid "Export config" -msgstr "Экспортировать настройки" +msgstr "Сохранить текущую конфигурацию" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 src/slic3r/GUI/Plater.cpp:758 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:82 src/slic3r/GUI/Plater.cpp:758 msgid "Export to SD card / Flash drive" -msgstr "Экспортировать на SD-карту / Flash-накопитель" +msgstr "Экспорт на SD-карту / USB-накопитель" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:83 msgid "Eject SD card / Flash drive" -msgstr "Извлечь SD-карту / Flash-накопитель" +msgstr "Извлечь SD-карту / USB-накопитель" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:85 msgid "Select all objects" -msgstr "Выбрать все объекты" +msgstr "Выбрать все модели" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:86 msgid "Deselect all" -msgstr "Отменить всё" +msgstr "Снять выбор со всего" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:87 msgid "Delete selected" -msgstr "Удалить выбранное" +msgstr "Удалить выбранные" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:91 msgid "Copy to clipboard" -msgstr "Скопировать в буфер обмена" +msgstr "Копировать в буфер" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:92 msgid "Paste from clipboard" msgstr "Вставить из буфера обмена" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:94 src/slic3r/GUI/KBShortcutsDialog.cpp:96 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 msgid "Reload plater from disk" -msgstr "Перезагрузить компоновку с диска" +msgstr "Перезагрузить стол с диска" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 msgid "Select Plater Tab" -msgstr "Вкладка компоновки" +msgstr "Вкладка стола" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:125 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:101 msgid "Select Print Settings Tab" msgstr "Вкладка настройки печати" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 msgid "Select Filament Settings Tab" msgstr "Вкладка настройки прутка" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:103 msgid "Select Printer Settings Tab" msgstr "Вкладка настройки принтера" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:128 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 msgid "Switch to 3D" -msgstr "Переключиться в 3D" +msgstr "Переключиться на 3D вид" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:105 msgid "Switch to Preview" -msgstr "Переключиться в предварительный просмотр" +msgstr "Переключиться на предпросмотр" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 -#: src/slic3r/GUI/PrintHostDialogs.cpp:163 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 src/slic3r/GUI/PrintHostDialogs.cpp:165 msgid "Print host upload queue" -msgstr "Очередь отправки на узел печати" +msgstr "Очередь загрузки на хост печати" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:107 src/slic3r/GUI/MainFrame.cpp:65 +#: src/slic3r/GUI/MainFrame.cpp:1191 +msgid "Open new instance" +msgstr "Запустить новый экземпляр программы" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 msgid "Camera view" -msgstr "Виды с камеры" +msgstr "Позиция камеры" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:133 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 msgid "Show/Hide object/instance labels" -msgstr "Показать/скрыть метки объекта/экземпляра" +msgstr "Показать/Скрыть имена файлов модели/копии" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 src/slic3r/GUI/Preferences.cpp:12 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 src/slic3r/GUI/Preferences.cpp:13 msgid "Preferences" -msgstr "Параметры" +msgstr "Настройки приложения" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 msgid "Show keyboard shortcuts list" -msgstr "Показать список клавиш доступа к командам" +msgstr "Показать список сочетаний клавиш" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 src/slic3r/GUI/KBShortcutsDialog.cpp:191 msgid "Commands" msgstr "Команды" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 msgid "Add Instance of the selected object" -msgstr "Добавить экземпляр выбранного объекта" +msgstr "Сделать копию выбранной модели" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 msgid "Remove Instance of the selected object" -msgstr "Удалить экземпляр выбранного объекта" +msgstr "Удалить копию выбранной модели" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 msgid "" "Press to select multiple objects\n" "or move multiple objects with mouse" msgstr "" -"Нажмите для выбора или перемещения\n" -"нескольких объектов мышью" +"Выбор нескольких моделей или перемещение \n" +"нескольких моделей с помощью мышки" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:125 msgid "Press to activate selection rectangle" -msgstr "" +msgstr "Активация прямоугольника выделения" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 msgid "Press to activate deselection rectangle" -msgstr "" +msgstr "Активация прямоугольника отмены выделения" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:206 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:216 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 src/slic3r/GUI/KBShortcutsDialog.cpp:196 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/KBShortcutsDialog.cpp:219 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 src/slic3r/GUI/KBShortcutsDialog.cpp:243 msgid "Arrow Up" msgstr "Стрелка вверх" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 msgid "Move selection 10 mm in positive Y direction" -msgstr "" +msgstr "Перемещение выбранного на 10 мм по оси Y+" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:128 src/slic3r/GUI/KBShortcutsDialog.cpp:197 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:208 src/slic3r/GUI/KBShortcutsDialog.cpp:220 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 src/slic3r/GUI/KBShortcutsDialog.cpp:244 msgid "Arrow Down" msgstr "Стрелка вниз" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:128 msgid "Move selection 10 mm in negative Y direction" -msgstr "" +msgstr "Перемещение выбранного на 10 мм по оси Y-" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:229 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 src/slic3r/GUI/KBShortcutsDialog.cpp:198 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:221 src/slic3r/GUI/KBShortcutsDialog.cpp:228 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 src/slic3r/GUI/KBShortcutsDialog.cpp:246 msgid "Arrow Left" msgstr "Стрелка влево" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 msgid "Move selection 10 mm in negative X direction" -msgstr "" +msgstr "Перемещение выбранного на 10 мм по оси X-" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 src/slic3r/GUI/KBShortcutsDialog.cpp:199 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 src/slic3r/GUI/KBShortcutsDialog.cpp:229 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 src/slic3r/GUI/KBShortcutsDialog.cpp:247 msgid "Arrow Right" msgstr "Стрелка вправо" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 msgid "Move selection 10 mm in positive X direction" -msgstr "" +msgstr "Перемещение выбранного на 10 мм по оси X+" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:131 src/slic3r/GUI/KBShortcutsDialog.cpp:132 msgid "Any arrow" msgstr "Любая стрелка" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:131 msgid "Movement step set to 1 mm" -msgstr "" +msgstr "Зафиксировать шаг перемещения на 1 мм" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 msgid "Movement in camera space" -msgstr "" +msgstr "Перемещение выбранного по отношению к камере" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:133 msgid "Page Up" msgstr "Page Up" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:133 msgid "Rotate selection 45 degrees CCW" -msgstr "" +msgstr "Поворот выбранного на 45° против часовой стрелки" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 msgid "Page Down" msgstr "Page Down" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 msgid "Rotate selection 45 degrees CW" -msgstr "" +msgstr "Поворот выбранного на 45° по часовой стрелки" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 msgid "Gizmo move" -msgstr "" +msgstr "Гизмо перемещения" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 msgid "Gizmo scale" -msgstr "" +msgstr "Гизмо масштаба" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 msgid "Gizmo rotate" -msgstr "" +msgstr "Гизмо поворота" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 msgid "Gizmo cut" -msgstr "" +msgstr "Гизмо разреза" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 msgid "Gizmo Place face on bed" -msgstr "" +msgstr "Гизмо поверхностью на стол" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 msgid "Gizmo SLA hollow" -msgstr "" +msgstr "Гизмо полости" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 msgid "Gizmo SLA support points" -msgstr "" +msgstr "Гизмо точки SLA поддержки" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 msgid "Unselect gizmo or clear selection" -msgstr "" +msgstr "Убрать гизмо выделение или очистить выбор" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 msgid "Change camera type (perspective, orthographic)" -msgstr "" +msgstr "Тип камеры (вид в перспективе или ортогональный)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 msgid "Zoom to Bed" -msgstr "" +msgstr "Приблизить до размера стола" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 msgid "" "Zoom to selected object\n" "or all objects in scene, if none selected" msgstr "" +"Приближение камеры к выбранной модели \n" +"или всем моделям в сцене, если ничего не выбрано" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 msgid "Zoom in" -msgstr "" +msgstr "Приблизить" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 msgid "Zoom out" -msgstr "" +msgstr "Отдалить" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 msgid "Switch between Editor/Preview" -msgstr "" +msgstr "Переключение между редактором/предпросмотром" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 msgid "Collapse/Expand the sidebar" -msgstr "" +msgstr "Свернуть/Развернуть боковую панель" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:175 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 msgid "Show/Hide 3Dconnexion devices settings dialog, if enabled" msgstr "" +"Показать/скрыть диалоговое окно настроек устройств 3Dconnexion (если включено)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:177 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:181 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 src/slic3r/GUI/KBShortcutsDialog.cpp:158 msgid "Show/Hide 3Dconnexion devices settings dialog" msgstr "" +"Показать/Скрыть диалоговое окно настроек \n" +"устройств 3Dconnexion" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 src/slic3r/GUI/MainFrame.cpp:328 -#: src/slic3r/GUI/MainFrame.cpp:340 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 src/slic3r/GUI/MainFrame.cpp:331 +#: src/slic3r/GUI/MainFrame.cpp:343 msgid "Plater" -msgstr "Компоновка" +msgstr "Стол" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 msgid "All gizmos: Rotate - left mouse button; Pan - right mouse button" msgstr "" +"Все гизмо: Вращение камеры - левая кнопка мыши; Перемещение камеры - правая кнопка " +"мыши" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:194 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 msgid "Gizmo move: Press to snap by 1mm" -msgstr "" +msgstr "Гизмо перемещения: Фиксации перемещения на 1 мм" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:195 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 msgid "Gizmo scale: Press to snap by 5%" -msgstr "" +msgstr "Гизмо масштаба: Фиксация увеличения на 5%" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 msgid "Gizmo scale: Scale selection to fit print volume" -msgstr "" +msgstr "Гизмо масштаба: Масштабирование модели под область печати" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 msgid "Gizmo scale: Press to activate one direction scaling" -msgstr "" +msgstr "Гизмо масштаба: Активация масштабирования в одном направлении" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:175 msgid "Gizmo scale: Press to scale selected objects around their own center" -msgstr "" +msgstr "Гизмо масштаба: Масштабирование выбранных моделей вокруг своего центра" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 msgid "Gizmo rotate: Press to rotate selected objects around their own center" -msgstr "" +msgstr "Гизмо поворота: Поворот выбранных моделей вокруг своего центра" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:202 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 msgid "Gizmos" -msgstr "" +msgstr "Гизмо" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:206 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:208 -msgid "Upper Layer" -msgstr "Верхний слой" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +msgid "The following shortcuts are applicable when the specified gizmo is active" +msgstr "Следующие сочетания клавиш применимы, когда активна выбранная гизмо" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:209 -msgid "Lower Layer" -msgstr "Нижний слой" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:183 src/slic3r/GUI/MainFrame.cpp:1244 +msgid "Open a G-code file" +msgstr "Выберите G-код файл" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:210 -msgid "Show/Hide Legend & Estimated printing time" -msgstr "" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 src/slic3r/GUI/MainFrame.cpp:1142 +#: src/slic3r/GUI/MainFrame.cpp:1146 src/slic3r/GUI/MainFrame.cpp:1249 +#: src/slic3r/GUI/MainFrame.cpp:1253 +msgid "Reload the plater from disk" +msgstr "Перезагрузить стол с диска" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 src/slic3r/GUI/Plater.cpp:4124 -#: src/slic3r/GUI/Tab.cpp:2597 -msgid "Preview" -msgstr "Предпросмотр" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 src/slic3r/GUI/KBShortcutsDialog.cpp:200 +msgid "Vertical slider - Move active thumb Up" +msgstr "Вертикальный ползунок - Сдвинуть активный ползунок вверх" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:216 -msgid "Move current slider thumb Up" -msgstr "Переместить текущий ползунок вверх" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 src/slic3r/GUI/KBShortcutsDialog.cpp:201 +msgid "Vertical slider - Move active thumb Down" +msgstr "Вертикальный ползунок - Сдвинуть активный ползунок вниз" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 -msgid "Move current slider thumb Down" -msgstr "Переместить текущий ползунок вниз" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 src/slic3r/GUI/KBShortcutsDialog.cpp:202 +msgid "Horizontal slider - Move active thumb Left" +msgstr "Горизонтальный ползунок - Сдвинуть активный ползунок влево" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 -msgid "Set upper thumb to current slider thumb" -msgstr "Сделать верхний ползунок текущим" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 src/slic3r/GUI/KBShortcutsDialog.cpp:203 +msgid "Horizontal slider - Move active thumb Right" +msgstr "Горизонтальный ползунок - Сдвинуть активный ползунок вправо" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 +msgid "On/Off one layer mode of the vertical slider" +msgstr "Включение/Отключение функции \"Режим одного слоя\" у вертикального ползунка" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 +msgid "Show/Hide Legend and Estimated printing time" +msgstr "Показать/Скрыть условные обозначения/расчётное время печати" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 +msgid "Upper layer" +msgstr "Слой +" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:208 +msgid "Lower layer" +msgstr "Слой -" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:209 +msgid "Upper Layer" +msgstr "Слой +" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:210 +msgid "Lower Layer" +msgstr "Слой -" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:211 +msgid "Show/Hide Legend & Estimated printing time" +msgstr "Показать/Скрыть условные обозначения/расчётное время печати" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 src/slic3r/GUI/Plater.cpp:4200 +#: src/slic3r/GUI/Tab.cpp:2602 +msgid "Preview" +msgstr "Предпросмотр нарезки" #: src/slic3r/GUI/KBShortcutsDialog.cpp:219 -msgid "Set lower thumb to current slider thumb" -msgstr "Сделать нижний ползунок текущим" +msgid "Move active thumb Up" +msgstr "Сдвинуть активный ползунок вверх" #: src/slic3r/GUI/KBShortcutsDialog.cpp:220 +msgid "Move active thumb Down" +msgstr "Сдвинуть активный ползунок вниз" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:221 +msgid "Set upper thumb as active" +msgstr "Переместить ползунок в верхнее положение" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 +msgid "Set lower thumb as active" +msgstr "Переместить ползунок в нижнее положение" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 src/slic3r/GUI/KBShortcutsDialog.cpp:230 msgid "Add color change marker for current layer" msgstr "Добавить маркер смены цвета для текущего слоя" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:221 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 src/slic3r/GUI/KBShortcutsDialog.cpp:231 msgid "Delete color change marker for current layer" msgstr "Удалить маркер смены цвета для текущего слоя" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:231 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:232 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 +msgid "Move current slider thumb Up" +msgstr "Сдвинуть ползунок вверх" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 +msgid "Move current slider thumb Down" +msgstr "Сдвинуть ползунок вниз" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:228 +msgid "Set upper thumb to current slider thumb" +msgstr "Переместить ползунок в верхнее положение" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:229 +msgid "Set lower thumb to current slider thumb" +msgstr "Переместить ползунок в нижнее положение" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 src/slic3r/GUI/KBShortcutsDialog.cpp:234 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 src/slic3r/GUI/KBShortcutsDialog.cpp:250 msgid "" "Press to speed up 5 times while moving thumb\n" "with arrow keys or mouse wheel" msgstr "" +"Ускорить перемещение ползунка в 5 раз с помощью \n" +"стрелок на клавиатуре или колесом мыши" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 -msgid "Layers Slider" -msgstr "Ползунок по слоям" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:237 +msgid "Vertical Slider" +msgstr "Вертикальный ползунок" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:229 -msgid "Move current slider thumb Left" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:237 +msgid "" +"The following shortcuts are applicable in G-code preview when the vertical slider " +"is active" msgstr "" +"Следующие сочетания клавиш применимы в окне предпросмотра G-кода, когда " +"вертикальный ползунок активен" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 -msgid "Move current slider thumb Right" -msgstr "" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 +msgid "Move active thumb Left" +msgstr "Сдвинуть активный ползунок влево" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:235 -msgid "Sequential Slider" -msgstr "" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 +msgid "Move active thumb Right" +msgstr "Сдвинуть активный ползунок вправо" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:258 -msgid "Keyboard shortcuts" -msgstr "Клавиатурные комбинации" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 +msgid "Set left thumb as active" +msgstr "Переместить ползунок в левое положение" -#: src/slic3r/GUI/MainFrame.cpp:64 src/slic3r/GUI/MainFrame.cpp:1189 -msgid "Open new instance" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:244 +msgid "Set right thumb as active" +msgstr "Переместить ползунок в правое положение" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +msgid "Move active slider thumb Left" +msgstr "Сдвинуть активный ползунок влево" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:247 +msgid "Move active slider thumb Right" +msgstr "Сдвинуть активный ползунок вправо" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 +msgid "Horizontal Slider" +msgstr "Горизонтальный ползунок" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 +msgid "" +"The following shortcuts are applicable in G-code preview when the horizontal slider " +"is active" msgstr "" +"Следующие сочетания клавиш применимы в окне предпросмотра G-кода, когда " +"горизонтальный ползунок активен" -#: src/slic3r/GUI/MainFrame.cpp:64 src/slic3r/GUI/MainFrame.cpp:78 -#: src/slic3r/GUI/MainFrame.cpp:1189 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:276 +msgid "Keyboard shortcuts" +msgstr "Горячие клавиши" + +#: src/slic3r/GUI/MainFrame.cpp:65 src/slic3r/GUI/MainFrame.cpp:79 +#: src/slic3r/GUI/MainFrame.cpp:1191 msgid "Open a new PrusaSlicer instance" -msgstr "" +msgstr "Запустить новый экземпляр PrusaSlicer" -#: src/slic3r/GUI/MainFrame.cpp:67 src/slic3r/GUI/MainFrame.cpp:80 +#: src/slic3r/GUI/MainFrame.cpp:68 src/slic3r/GUI/MainFrame.cpp:81 msgid "G-code preview" -msgstr "" +msgstr "Предпросмотр G-кода" -#: src/slic3r/GUI/MainFrame.cpp:67 src/slic3r/GUI/MainFrame.cpp:1095 +#: src/slic3r/GUI/MainFrame.cpp:68 src/slic3r/GUI/MainFrame.cpp:1091 msgid "Open G-code viewer" -msgstr "" +msgstr "Открыть просмотрщик G-кода" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1250 +#: src/slic3r/GUI/MainFrame.cpp:79 src/slic3r/GUI/MainFrame.cpp:1260 msgid "Open PrusaSlicer" -msgstr "" +msgstr "Открыть PrusaSlicer" -#: src/slic3r/GUI/MainFrame.cpp:80 +#: src/slic3r/GUI/MainFrame.cpp:81 msgid "Open new G-code viewer" -msgstr "" +msgstr "Открыть новый просмотрщик G-кода" -#: src/slic3r/GUI/MainFrame.cpp:155 +#: src/slic3r/GUI/MainFrame.cpp:153 msgid "" -"Remember to check for updates at https://github.com/prusa3d/PrusaSlicer/" -"releases" +"Remember to check for updates at https://github.com/prusa3d/PrusaSlicer/releases" msgstr "" +"- Не забывайте периодически проверять обновления на https://github.com/prusa3d/" +"PrusaSlicer/releases" -#: src/slic3r/GUI/MainFrame.cpp:507 +#: src/slic3r/GUI/MainFrame.cpp:510 msgid "based on Slic3r" -msgstr "основывается на Slic3r" +msgstr "созданная на остове Slic3r" -#: src/slic3r/GUI/MainFrame.cpp:870 +#: src/slic3r/GUI/MainFrame.cpp:866 msgid "Prusa 3D &Drivers" -msgstr "Драйверы Prusa 3D" +msgstr "&Драйверы Prusa 3D" -#: src/slic3r/GUI/MainFrame.cpp:870 +#: src/slic3r/GUI/MainFrame.cpp:866 msgid "Open the Prusa3D drivers download page in your browser" -msgstr "Открыть страницу загрузки драйверов Prusa3D в браузере" +msgstr "Открыть страницу загрузки драйверов Prusa3D" -#: src/slic3r/GUI/MainFrame.cpp:872 +#: src/slic3r/GUI/MainFrame.cpp:868 msgid "Software &Releases" -msgstr "Выпуски ПО" +msgstr "PrusaSlicer на Github" -#: src/slic3r/GUI/MainFrame.cpp:872 +#: src/slic3r/GUI/MainFrame.cpp:868 msgid "Open the software releases page in your browser" -msgstr "Открыть страницу выпусков ПО в браузере" +msgstr "Открыть страницу программы PrusaSlicer на Github" -#: src/slic3r/GUI/MainFrame.cpp:878 +#: src/slic3r/GUI/MainFrame.cpp:874 #, c-format msgid "%s &Website" msgstr "Сайт %s" -#: src/slic3r/GUI/MainFrame.cpp:879 +#: src/slic3r/GUI/MainFrame.cpp:875 #, c-format msgid "Open the %s website in your browser" -msgstr "Открыть сайт %s в браузере" +msgstr "Открыть сайт %s" -#: src/slic3r/GUI/MainFrame.cpp:885 +#: src/slic3r/GUI/MainFrame.cpp:881 msgid "System &Info" -msgstr "Системная информация" +msgstr "&Информация о системе" -#: src/slic3r/GUI/MainFrame.cpp:885 +#: src/slic3r/GUI/MainFrame.cpp:881 msgid "Show system information" msgstr "Показать системную информацию" -#: src/slic3r/GUI/MainFrame.cpp:887 +#: src/slic3r/GUI/MainFrame.cpp:883 msgid "Show &Configuration Folder" -msgstr "Каталог настроек" +msgstr "Показать &конфигурационную папку" -#: src/slic3r/GUI/MainFrame.cpp:887 +#: src/slic3r/GUI/MainFrame.cpp:883 msgid "Show user configuration folder (datadir)" -msgstr "Открыть каталог настроек пользователя (datadir) во внешней программе" +msgstr "Показать папку конфигурации пользователя (datadir)" -#: src/slic3r/GUI/MainFrame.cpp:889 +#: src/slic3r/GUI/MainFrame.cpp:885 msgid "Report an I&ssue" -msgstr "Сообщить о проблеме" +msgstr "Сообщить о &проблеме" -#: src/slic3r/GUI/MainFrame.cpp:889 +#: src/slic3r/GUI/MainFrame.cpp:885 #, c-format msgid "Report an issue on %s" -msgstr "Сообщить о проблеме с %s" +msgstr "Сообщить о проблеме в %s" -#: src/slic3r/GUI/MainFrame.cpp:892 src/slic3r/GUI/MainFrame.cpp:895 +#: src/slic3r/GUI/MainFrame.cpp:888 src/slic3r/GUI/MainFrame.cpp:891 #, c-format msgid "&About %s" -msgstr "О %s" +msgstr "&O программе %s" -#: src/slic3r/GUI/MainFrame.cpp:892 src/slic3r/GUI/MainFrame.cpp:895 +#: src/slic3r/GUI/MainFrame.cpp:888 src/slic3r/GUI/MainFrame.cpp:891 msgid "Show about dialog" msgstr "Показать окно с информацией о программе" -#: src/slic3r/GUI/MainFrame.cpp:898 +#: src/slic3r/GUI/MainFrame.cpp:894 msgid "Show the list of the keyboard shortcuts" -msgstr "Показать список клавиш доступа к командам" +msgstr "Показать список сочетаний клавиш" -#: src/slic3r/GUI/MainFrame.cpp:912 +#: src/slic3r/GUI/MainFrame.cpp:908 msgid "Iso" msgstr "Изометрия" -#: src/slic3r/GUI/MainFrame.cpp:912 +#: src/slic3r/GUI/MainFrame.cpp:908 msgid "Iso View" msgstr "Изометрическая проекция" #. TRN To be shown in the main menu View->Top #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:916 src/libslic3r/PrintConfig.cpp:2328 -#: src/libslic3r/PrintConfig.cpp:2337 +#: src/slic3r/GUI/MainFrame.cpp:912 src/libslic3r/PrintConfig.cpp:2360 +#: src/libslic3r/PrintConfig.cpp:2369 msgid "Top" msgstr "Сверху" -#: src/slic3r/GUI/MainFrame.cpp:916 +#: src/slic3r/GUI/MainFrame.cpp:912 msgid "Top View" msgstr "Вид сверху" #. TRN To be shown in the main menu View->Bottom #. TRN To be shown in Print Settings "Bottom solid layers" #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:919 src/libslic3r/PrintConfig.cpp:215 -#: src/libslic3r/PrintConfig.cpp:224 +#: src/slic3r/GUI/MainFrame.cpp:915 src/libslic3r/PrintConfig.cpp:230 +#: src/libslic3r/PrintConfig.cpp:239 msgid "Bottom" msgstr "Снизу" -#: src/slic3r/GUI/MainFrame.cpp:919 +#: src/slic3r/GUI/MainFrame.cpp:915 msgid "Bottom View" msgstr "Вид снизу" -#: src/slic3r/GUI/MainFrame.cpp:921 +#: src/slic3r/GUI/MainFrame.cpp:917 msgid "Front" msgstr "Спереди" -#: src/slic3r/GUI/MainFrame.cpp:921 +#: src/slic3r/GUI/MainFrame.cpp:917 msgid "Front View" msgstr "Вид спереди" -#: src/slic3r/GUI/MainFrame.cpp:923 src/libslic3r/PrintConfig.cpp:1813 +#: src/slic3r/GUI/MainFrame.cpp:919 src/libslic3r/PrintConfig.cpp:1845 msgid "Rear" msgstr "Сзади" -#: src/slic3r/GUI/MainFrame.cpp:923 +#: src/slic3r/GUI/MainFrame.cpp:919 msgid "Rear View" msgstr "Вид сзади" -#: src/slic3r/GUI/MainFrame.cpp:925 +#: src/slic3r/GUI/MainFrame.cpp:921 msgid "Left" msgstr "Слева" -#: src/slic3r/GUI/MainFrame.cpp:925 +#: src/slic3r/GUI/MainFrame.cpp:921 msgid "Left View" msgstr "Вид слева" -#: src/slic3r/GUI/MainFrame.cpp:927 +#: src/slic3r/GUI/MainFrame.cpp:923 msgid "Right" msgstr "Справа" -#: src/slic3r/GUI/MainFrame.cpp:927 +#: src/slic3r/GUI/MainFrame.cpp:923 msgid "Right View" msgstr "Вид справа" -#: src/slic3r/GUI/MainFrame.cpp:940 +#: src/slic3r/GUI/MainFrame.cpp:936 msgid "&New Project" msgstr "&Новый проект" -#: src/slic3r/GUI/MainFrame.cpp:940 +#: src/slic3r/GUI/MainFrame.cpp:936 msgid "Start a new project" msgstr "Начать новый проект" -#: src/slic3r/GUI/MainFrame.cpp:943 +#: src/slic3r/GUI/MainFrame.cpp:939 msgid "&Open Project" msgstr "&Открыть проект" -#: src/slic3r/GUI/MainFrame.cpp:943 +#: src/slic3r/GUI/MainFrame.cpp:939 msgid "Open a project file" msgstr "Открыть файл проекта" -#: src/slic3r/GUI/MainFrame.cpp:948 +#: src/slic3r/GUI/MainFrame.cpp:944 msgid "Recent projects" msgstr "Недавние проекты" -#: src/slic3r/GUI/MainFrame.cpp:957 +#: src/slic3r/GUI/MainFrame.cpp:953 msgid "" "The selected project is no longer available.\n" "Do you want to remove it from the recent projects list?" @@ -4371,617 +4548,618 @@ msgstr "" "Выбранный проект больше недоступен.\n" "Удалить его из списка последних проектов?" -#: src/slic3r/GUI/MainFrame.cpp:957 src/slic3r/GUI/MainFrame.cpp:1333 -#: src/slic3r/GUI/PrintHostDialogs.cpp:259 +#: src/slic3r/GUI/MainFrame.cpp:953 src/slic3r/GUI/MainFrame.cpp:1343 +#: src/slic3r/GUI/PrintHostDialogs.cpp:263 msgid "Error" msgstr "Ошибка" -#: src/slic3r/GUI/MainFrame.cpp:982 +#: src/slic3r/GUI/MainFrame.cpp:978 msgid "&Save Project" msgstr "&Сохранить проект" -#: src/slic3r/GUI/MainFrame.cpp:982 +#: src/slic3r/GUI/MainFrame.cpp:978 msgid "Save current project file" -msgstr "Сохранить файл текущего проекта" +msgstr "Сохранить текущий файл проекта" -#: src/slic3r/GUI/MainFrame.cpp:986 src/slic3r/GUI/MainFrame.cpp:988 +#: src/slic3r/GUI/MainFrame.cpp:982 src/slic3r/GUI/MainFrame.cpp:984 msgid "Save Project &as" -msgstr "Сохранить проект как" +msgstr "Сохранить проект &как" -#: src/slic3r/GUI/MainFrame.cpp:986 src/slic3r/GUI/MainFrame.cpp:988 +#: src/slic3r/GUI/MainFrame.cpp:982 src/slic3r/GUI/MainFrame.cpp:984 msgid "Save current project file as" -msgstr "Сохранить файл текущего проекта под другим именем" +msgstr "Сохранить текущий файл проекта как" -#: src/slic3r/GUI/MainFrame.cpp:996 +#: src/slic3r/GUI/MainFrame.cpp:992 msgid "Import STL/OBJ/AM&F/3MF" -msgstr "Импортировать STL/OBJ/AM&F/3MF" +msgstr "Загрузить STL/OBJ/AMF/3MF" -#: src/slic3r/GUI/MainFrame.cpp:996 +#: src/slic3r/GUI/MainFrame.cpp:992 msgid "Load a model" msgstr "Загрузить модель" -#: src/slic3r/GUI/MainFrame.cpp:1000 +#: src/slic3r/GUI/MainFrame.cpp:996 msgid "Import STL (imperial units)" -msgstr "" +msgstr "Загрузить STL (английская система мер)" -#: src/slic3r/GUI/MainFrame.cpp:1000 +#: src/slic3r/GUI/MainFrame.cpp:996 msgid "Load an model saved with imperial units" -msgstr "" +msgstr "Загрузить модель, сохраненную с размерами в английской системе мер" -#: src/slic3r/GUI/MainFrame.cpp:1004 +#: src/slic3r/GUI/MainFrame.cpp:1000 msgid "Import SL1 archive" -msgstr "" +msgstr "Импорт SL1 архива" -#: src/slic3r/GUI/MainFrame.cpp:1004 +#: src/slic3r/GUI/MainFrame.cpp:1000 msgid "Load an SL1 archive" -msgstr "" +msgstr "Импорт SL1 архива" -#: src/slic3r/GUI/MainFrame.cpp:1009 +#: src/slic3r/GUI/MainFrame.cpp:1005 msgid "Import &Config" -msgstr "Импортировать настройки" +msgstr "Загрузить текущую конфигурацию" -#: src/slic3r/GUI/MainFrame.cpp:1009 +#: src/slic3r/GUI/MainFrame.cpp:1005 msgid "Load exported configuration file" -msgstr "Загрузить сохранённый файл настроек" +msgstr "Загрузить сохранённый файл конфигурации" -#: src/slic3r/GUI/MainFrame.cpp:1012 +#: src/slic3r/GUI/MainFrame.cpp:1008 msgid "Import Config from &project" -msgstr "Импортировать настройки из проекта" +msgstr "Загрузить конфигурацию из проекта" -#: src/slic3r/GUI/MainFrame.cpp:1012 +#: src/slic3r/GUI/MainFrame.cpp:1008 msgid "Load configuration from project file" -msgstr "Загрузить настройки из файла проекта" +msgstr "Загрузить конфигурацию из файла проекта" -#: src/slic3r/GUI/MainFrame.cpp:1016 +#: src/slic3r/GUI/MainFrame.cpp:1012 msgid "Import Config &Bundle" -msgstr "Импортировать комплект настроек" +msgstr "Импортировать все профили" -#: src/slic3r/GUI/MainFrame.cpp:1016 +#: src/slic3r/GUI/MainFrame.cpp:1012 msgid "Load presets from a bundle" -msgstr "Загрузить все профили из комплекта" +msgstr "Импортировать все профили из файла" -#: src/slic3r/GUI/MainFrame.cpp:1019 +#: src/slic3r/GUI/MainFrame.cpp:1015 msgid "&Import" -msgstr "Импорт" +msgstr "&Импорт" -#: src/slic3r/GUI/MainFrame.cpp:1022 src/slic3r/GUI/MainFrame.cpp:1295 +#: src/slic3r/GUI/MainFrame.cpp:1018 src/slic3r/GUI/MainFrame.cpp:1305 msgid "Export &G-code" -msgstr "Экспортировать G-код" +msgstr "Экспорт в G-&код" -#: src/slic3r/GUI/MainFrame.cpp:1022 +#: src/slic3r/GUI/MainFrame.cpp:1018 msgid "Export current plate as G-code" -msgstr "Экспортировать текущую компоновку как G-код" +msgstr "Экспортировать текущие модели со стола в G-код" -#: src/slic3r/GUI/MainFrame.cpp:1026 src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1022 src/slic3r/GUI/MainFrame.cpp:1306 msgid "S&end G-code" -msgstr "Послать G-код" +msgstr "&Отправить G-код" -#: src/slic3r/GUI/MainFrame.cpp:1026 +#: src/slic3r/GUI/MainFrame.cpp:1022 msgid "Send to print current plate as G-code" -msgstr "Послать на печать текущую компоновку как G-код" +msgstr "Отправить на печать текущий стол как G-код" -#: src/slic3r/GUI/MainFrame.cpp:1030 +#: src/slic3r/GUI/MainFrame.cpp:1026 msgid "Export G-code to SD card / Flash drive" -msgstr "Экспортировать G-код на SD-карту/флешку" +msgstr "Экспорт G-кода на SD-карту / USB-накопитель" -#: src/slic3r/GUI/MainFrame.cpp:1030 +#: src/slic3r/GUI/MainFrame.cpp:1026 msgid "Export current plate as G-code to SD card / Flash drive" -msgstr "Экспортировать текущую компоновку как G-код на SD-карту/флешку" +msgstr "Экспортировать текущие модели со стола в G-код на SD-карту / USB-накопитель" -#: src/slic3r/GUI/MainFrame.cpp:1034 +#: src/slic3r/GUI/MainFrame.cpp:1030 msgid "Export plate as &STL" -msgstr "Экспортировать компоновку в STL" +msgstr "Экспорт &стола в STL" -#: src/slic3r/GUI/MainFrame.cpp:1034 +#: src/slic3r/GUI/MainFrame.cpp:1030 msgid "Export current plate as STL" -msgstr "Экспортировать текущую компоновку в STL" +msgstr "Экспортировать текущие модели со стола в STL" -#: src/slic3r/GUI/MainFrame.cpp:1037 +#: src/slic3r/GUI/MainFrame.cpp:1033 msgid "Export plate as STL &including supports" -msgstr "Экспортировать компоновку в STL с поддержками" +msgstr "Экспорт стола в STL вместе с &поддержками" -#: src/slic3r/GUI/MainFrame.cpp:1037 +#: src/slic3r/GUI/MainFrame.cpp:1033 msgid "Export current plate as STL including supports" -msgstr "Экспортировать текущую компоновку в STL включая поддержки" +msgstr "Экспортировать текущий стол в STL, включая поддержки" -#: src/slic3r/GUI/MainFrame.cpp:1040 +#: src/slic3r/GUI/MainFrame.cpp:1036 msgid "Export plate as &AMF" -msgstr "Экспортировать компоновку в &AMF" +msgstr "Экспорт стол&а в AMF" -#: src/slic3r/GUI/MainFrame.cpp:1040 +#: src/slic3r/GUI/MainFrame.cpp:1036 msgid "Export current plate as AMF" -msgstr "Экспортировать текущую компоновку в AMF" +msgstr "Экспортировать текущие модели со стола в AMF" -#: src/slic3r/GUI/MainFrame.cpp:1044 src/slic3r/GUI/MainFrame.cpp:1247 +#: src/slic3r/GUI/MainFrame.cpp:1040 src/slic3r/GUI/MainFrame.cpp:1257 msgid "Export &toolpaths as OBJ" -msgstr "Экспортировать траектории в OBJ" +msgstr "Экспорт траектории &инструмента в OBJ" -#: src/slic3r/GUI/MainFrame.cpp:1044 src/slic3r/GUI/MainFrame.cpp:1247 +#: src/slic3r/GUI/MainFrame.cpp:1040 src/slic3r/GUI/MainFrame.cpp:1257 msgid "Export toolpaths as OBJ" -msgstr "Экспортировать траектории в OBJ" +msgstr "Экспортировать траекторию инструмента в OBJ" -#: src/slic3r/GUI/MainFrame.cpp:1048 +#: src/slic3r/GUI/MainFrame.cpp:1044 msgid "Export &Config" -msgstr "Экспортировать настройки" +msgstr "Экспорт &текущей конфигурации" -#: src/slic3r/GUI/MainFrame.cpp:1048 +#: src/slic3r/GUI/MainFrame.cpp:1044 msgid "Export current configuration to file" -msgstr "Экспортировать текущие настройки в файл" +msgstr "Экспортировать текущую конфигурацию в файл" -#: src/slic3r/GUI/MainFrame.cpp:1051 +#: src/slic3r/GUI/MainFrame.cpp:1047 msgid "Export Config &Bundle" -msgstr "Экспортировать комплект настроек" +msgstr "Экспорт &всех профилей" -#: src/slic3r/GUI/MainFrame.cpp:1051 +#: src/slic3r/GUI/MainFrame.cpp:1047 msgid "Export all presets to file" -msgstr "Экспортировать комплект настроек в файл" +msgstr "Экспортировать все профили в единый файл" -#: src/slic3r/GUI/MainFrame.cpp:1054 +#: src/slic3r/GUI/MainFrame.cpp:1050 msgid "Export Config Bundle With Physical Printers" -msgstr "" +msgstr "Экспорт всех профилей с физическими принтерами" -#: src/slic3r/GUI/MainFrame.cpp:1054 +#: src/slic3r/GUI/MainFrame.cpp:1050 msgid "Export all presets including physical printers to file" -msgstr "" +msgstr "Экспорт всех профилей в файл, включая физические принтеры" -#: src/slic3r/GUI/MainFrame.cpp:1057 +#: src/slic3r/GUI/MainFrame.cpp:1053 msgid "&Export" -msgstr "Экспорт" +msgstr "&Экспорт" -#: src/slic3r/GUI/MainFrame.cpp:1059 +#: src/slic3r/GUI/MainFrame.cpp:1055 msgid "Ejec&t SD card / Flash drive" -msgstr "Извлечь SD-карту / Flash-накопитель" +msgstr "Из&влечь SD-карту / USB-накопитель" -#: src/slic3r/GUI/MainFrame.cpp:1059 +#: src/slic3r/GUI/MainFrame.cpp:1055 msgid "Eject SD card / Flash drive after the G-code was exported to it." -msgstr "" -"Извлечь SD-карту / Flash-накопитель после экспортирования на неё G-кода." +msgstr "Извлечение SD-карты / USB-накопителя (после экспорта G-кода на носитель)" -#: src/slic3r/GUI/MainFrame.cpp:1067 +#: src/slic3r/GUI/MainFrame.cpp:1063 msgid "Quick Slice" -msgstr "Быстрая нарезка" +msgstr "Быстро нарезать" -#: src/slic3r/GUI/MainFrame.cpp:1067 +#: src/slic3r/GUI/MainFrame.cpp:1063 msgid "Slice a file into a G-code" -msgstr "Нарезать файл в G-код" +msgstr "Нарезать файл" -#: src/slic3r/GUI/MainFrame.cpp:1073 +#: src/slic3r/GUI/MainFrame.cpp:1069 msgid "Quick Slice and Save As" msgstr "Быстро нарезать и сохранить как" -#: src/slic3r/GUI/MainFrame.cpp:1073 +#: src/slic3r/GUI/MainFrame.cpp:1069 msgid "Slice a file into a G-code, save as" -msgstr "Нарезать файл в G-код, сохранить как" +msgstr "Нарезать файл и сохранить как" -#: src/slic3r/GUI/MainFrame.cpp:1079 +#: src/slic3r/GUI/MainFrame.cpp:1075 msgid "Repeat Last Quick Slice" msgstr "Повторить последнюю быструю нарезку" -#: src/slic3r/GUI/MainFrame.cpp:1079 +#: src/slic3r/GUI/MainFrame.cpp:1075 msgid "Repeat last quick slice" -msgstr "Повторить последнюю быструю нарезку" +msgstr "Повтор последней быстрой нарезки" -#: src/slic3r/GUI/MainFrame.cpp:1087 +#: src/slic3r/GUI/MainFrame.cpp:1083 msgid "(Re)Slice No&w" -msgstr "(Пере)Нарезать" +msgstr "(&Пере)Нарезать" -#: src/slic3r/GUI/MainFrame.cpp:1087 +#: src/slic3r/GUI/MainFrame.cpp:1083 msgid "Start new slicing process" msgstr "Начать новый процесс нарезки" -#: src/slic3r/GUI/MainFrame.cpp:1091 +#: src/slic3r/GUI/MainFrame.cpp:1087 msgid "&Repair STL file" -msgstr "Починить STL-файл" +msgstr "По&чинить STL файл" -#: src/slic3r/GUI/MainFrame.cpp:1091 +#: src/slic3r/GUI/MainFrame.cpp:1087 msgid "Automatically repair an STL file" -msgstr "Автоматическая починка STL-файла" +msgstr "Автоматическая починка STL файла" -#: src/slic3r/GUI/MainFrame.cpp:1095 +#: src/slic3r/GUI/MainFrame.cpp:1091 msgid "&G-code preview" -msgstr "" +msgstr "Пред&просмотр G-кода" -#: src/slic3r/GUI/MainFrame.cpp:1098 src/slic3r/GUI/MainFrame.cpp:1254 +#: src/slic3r/GUI/MainFrame.cpp:1094 src/slic3r/GUI/MainFrame.cpp:1264 msgid "&Quit" msgstr "&Выход" -#: src/slic3r/GUI/MainFrame.cpp:1098 src/slic3r/GUI/MainFrame.cpp:1254 +#: src/slic3r/GUI/MainFrame.cpp:1094 src/slic3r/GUI/MainFrame.cpp:1264 #, c-format msgid "Quit %s" -msgstr "Выход из %s" +msgstr "Выйти из %s" -#: src/slic3r/GUI/MainFrame.cpp:1113 +#: src/slic3r/GUI/MainFrame.cpp:1109 msgid "&Select all" -msgstr "Выбрать всё" +msgstr "Выбрать &всё" -#: src/slic3r/GUI/MainFrame.cpp:1114 +#: src/slic3r/GUI/MainFrame.cpp:1110 msgid "Selects all objects" -msgstr "Выбрать все объекты" +msgstr "Выбрать все модели" -#: src/slic3r/GUI/MainFrame.cpp:1116 +#: src/slic3r/GUI/MainFrame.cpp:1112 msgid "D&eselect all" -msgstr "Отменить всё" +msgstr "&Снять выбор со всего" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1113 msgid "Deselects all objects" -msgstr "Отменить выбор всех объектов" +msgstr "Выбрать все модели" -#: src/slic3r/GUI/MainFrame.cpp:1120 +#: src/slic3r/GUI/MainFrame.cpp:1116 msgid "&Delete selected" -msgstr "Удалить выбранное" +msgstr "&Удалить выбранные" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1117 msgid "Deletes the current selection" -msgstr "Удалить текущее выделение" +msgstr "Удалить текущие выбранные модели" -#: src/slic3r/GUI/MainFrame.cpp:1123 +#: src/slic3r/GUI/MainFrame.cpp:1119 msgid "Delete &all" -msgstr "Удалить всё" +msgstr "Уд&алить всё" -#: src/slic3r/GUI/MainFrame.cpp:1124 +#: src/slic3r/GUI/MainFrame.cpp:1120 msgid "Deletes all objects" -msgstr "Удалить все объекты" +msgstr "Удалить все модели" -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/MainFrame.cpp:1124 msgid "&Undo" -msgstr "&Отменить" +msgstr "&Отмена" -#: src/slic3r/GUI/MainFrame.cpp:1131 +#: src/slic3r/GUI/MainFrame.cpp:1127 msgid "&Redo" -msgstr "&Вернуть" +msgstr "&Повтор" -#: src/slic3r/GUI/MainFrame.cpp:1136 +#: src/slic3r/GUI/MainFrame.cpp:1132 msgid "&Copy" -msgstr "&Копировать" +msgstr "С&копировать" -#: src/slic3r/GUI/MainFrame.cpp:1137 +#: src/slic3r/GUI/MainFrame.cpp:1133 msgid "Copy selection to clipboard" -msgstr "Скопировать выделение в буфер обмена" +msgstr "Скопировать выделенное в буфер обмена" -#: src/slic3r/GUI/MainFrame.cpp:1139 +#: src/slic3r/GUI/MainFrame.cpp:1135 msgid "&Paste" msgstr "&Вставить" -#: src/slic3r/GUI/MainFrame.cpp:1140 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Paste clipboard" msgstr "Вставить из буфера обмена" -#: src/slic3r/GUI/MainFrame.cpp:1144 +#: src/slic3r/GUI/MainFrame.cpp:1141 src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1248 src/slic3r/GUI/MainFrame.cpp:1252 msgid "Re&load from disk" -msgstr "Перезагрузить с диска" - -#: src/slic3r/GUI/MainFrame.cpp:1145 -msgid "Reload the plater from disk" -msgstr "Перезагрузить компоновку с диска" +msgstr "Пере&загрузить с диска" -#: src/slic3r/GUI/MainFrame.cpp:1149 +#: src/slic3r/GUI/MainFrame.cpp:1151 msgid "Searc&h" -msgstr "Поиск" +msgstr "&Поиск" -#: src/slic3r/GUI/MainFrame.cpp:1150 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Search in settings" -msgstr "" +msgstr "Поиск в настройках" -#: src/slic3r/GUI/MainFrame.cpp:1158 +#: src/slic3r/GUI/MainFrame.cpp:1160 msgid "&Plater Tab" -msgstr "&Вкладка компоновки" +msgstr "Вкладка &стола" -#: src/slic3r/GUI/MainFrame.cpp:1158 +#: src/slic3r/GUI/MainFrame.cpp:1160 msgid "Show the plater" -msgstr "Показать компоновку" +msgstr "Показать вкладку стола" -#: src/slic3r/GUI/MainFrame.cpp:1163 +#: src/slic3r/GUI/MainFrame.cpp:1165 msgid "P&rint Settings Tab" -msgstr "Вкладка настройки печати" +msgstr "Вкладка настройки &печати" -#: src/slic3r/GUI/MainFrame.cpp:1163 +#: src/slic3r/GUI/MainFrame.cpp:1165 msgid "Show the print settings" msgstr "Показать настройки печати" -#: src/slic3r/GUI/MainFrame.cpp:1166 src/slic3r/GUI/MainFrame.cpp:1298 +#: src/slic3r/GUI/MainFrame.cpp:1168 src/slic3r/GUI/MainFrame.cpp:1308 msgid "&Filament Settings Tab" -msgstr "Вкладка настройки прутка" +msgstr "Вкладка настройки п&рутка" -#: src/slic3r/GUI/MainFrame.cpp:1166 +#: src/slic3r/GUI/MainFrame.cpp:1168 msgid "Show the filament settings" msgstr "Показать настройки прутка" -#: src/slic3r/GUI/MainFrame.cpp:1170 +#: src/slic3r/GUI/MainFrame.cpp:1172 msgid "Print&er Settings Tab" -msgstr "Вкладка настройки принтера" +msgstr "Вкладка настройки прин&тера" -#: src/slic3r/GUI/MainFrame.cpp:1170 +#: src/slic3r/GUI/MainFrame.cpp:1172 msgid "Show the printer settings" msgstr "Показать настройки принтера" -#: src/slic3r/GUI/MainFrame.cpp:1176 +#: src/slic3r/GUI/MainFrame.cpp:1178 msgid "3&D" -msgstr "3D" +msgstr "&3D-вид" -#: src/slic3r/GUI/MainFrame.cpp:1176 +#: src/slic3r/GUI/MainFrame.cpp:1178 msgid "Show the 3D editing view" -msgstr "Показать редактируемое отображение в 3D" +msgstr "Показать вкладку 3D-вид" -#: src/slic3r/GUI/MainFrame.cpp:1179 +#: src/slic3r/GUI/MainFrame.cpp:1181 msgid "Pre&view" -msgstr "Предварительный просмотр" +msgstr "Предпр&осмотр нарезки" -#: src/slic3r/GUI/MainFrame.cpp:1179 +#: src/slic3r/GUI/MainFrame.cpp:1181 msgid "Show the 3D slices preview" -msgstr "Показать 3D нарезку" +msgstr "Показать предпросмотр нарезки" -#: src/slic3r/GUI/MainFrame.cpp:1185 +#: src/slic3r/GUI/MainFrame.cpp:1187 msgid "Print &Host Upload Queue" -msgstr "Очередь отправки на узел печати" +msgstr "Очередь загрузки на &хост печати" -#: src/slic3r/GUI/MainFrame.cpp:1185 +#: src/slic3r/GUI/MainFrame.cpp:1187 msgid "Display the Print Host Upload Queue window" -msgstr "Показать окно очереди отправки на узел печати" +msgstr "Показать очередь загрузки на хост печати" -#: src/slic3r/GUI/MainFrame.cpp:1200 +#: src/slic3r/GUI/MainFrame.cpp:1201 msgid "Show &labels" -msgstr "Показать метки" +msgstr "Показать &имена файлов" -#: src/slic3r/GUI/MainFrame.cpp:1200 +#: src/slic3r/GUI/MainFrame.cpp:1201 msgid "Show object/instance labels in 3D scene" -msgstr "Показать метки объекта/экземпляра в 3D-сцене" +msgstr "Отображать имена файлов моделей\\копий в окне 3D-вида" -#: src/slic3r/GUI/MainFrame.cpp:1203 +#: src/slic3r/GUI/MainFrame.cpp:1204 msgid "&Collapse sidebar" -msgstr "Скрыть боковую панель" +msgstr "&Свернуть боковую панель" -#: src/slic3r/GUI/MainFrame.cpp:1203 src/slic3r/GUI/Plater.cpp:2225 +#: src/slic3r/GUI/MainFrame.cpp:1204 src/slic3r/GUI/Plater.cpp:2247 msgid "Collapse sidebar" -msgstr "Скрыть боковую панель" +msgstr "Свернуть боковую панель" -#: src/slic3r/GUI/MainFrame.cpp:1215 src/slic3r/GUI/MainFrame.cpp:1269 +#: src/slic3r/GUI/MainFrame.cpp:1216 src/slic3r/GUI/MainFrame.cpp:1279 msgid "&File" msgstr "&Файл" -#: src/slic3r/GUI/MainFrame.cpp:1216 +#: src/slic3r/GUI/MainFrame.cpp:1217 msgid "&Edit" msgstr "&Правка" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1218 msgid "&Window" msgstr "&Окна" -#: src/slic3r/GUI/MainFrame.cpp:1218 src/slic3r/GUI/MainFrame.cpp:1270 +#: src/slic3r/GUI/MainFrame.cpp:1219 src/slic3r/GUI/MainFrame.cpp:1280 msgid "&View" msgstr "&Вид" -#: src/slic3r/GUI/MainFrame.cpp:1221 src/slic3r/GUI/MainFrame.cpp:1273 +#: src/slic3r/GUI/MainFrame.cpp:1222 src/slic3r/GUI/MainFrame.cpp:1283 msgid "&Help" -msgstr "&Справка" +msgstr "&Помощь" -#: src/slic3r/GUI/MainFrame.cpp:1243 +#: src/slic3r/GUI/MainFrame.cpp:1244 msgid "&Open G-code" -msgstr "" +msgstr "&Открыть G-код файл" -#: src/slic3r/GUI/MainFrame.cpp:1243 -msgid "Open a G-code file" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:1250 +#: src/slic3r/GUI/MainFrame.cpp:1260 msgid "Open &PrusaSlicer" -msgstr "" +msgstr "Открыть &PrusaSlicer" -#: src/slic3r/GUI/MainFrame.cpp:1295 +#: src/slic3r/GUI/MainFrame.cpp:1305 msgid "E&xport" msgstr "&Экспорт" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1306 msgid "S&end to print" -msgstr "Послать на печать" +msgstr "&Отправить на печать" -#: src/slic3r/GUI/MainFrame.cpp:1298 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "Mate&rial Settings Tab" msgstr "Вкладка настройки материала" -#: src/slic3r/GUI/MainFrame.cpp:1321 +#: src/slic3r/GUI/MainFrame.cpp:1331 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "Выберите файл для нарезки (STL/OBJ/AMF/3MF/PRUSA):" -#: src/slic3r/GUI/MainFrame.cpp:1332 +#: src/slic3r/GUI/MainFrame.cpp:1342 msgid "No previously sliced file." msgstr "Нет ранее нарезанного файла." -#: src/slic3r/GUI/MainFrame.cpp:1338 +#: src/slic3r/GUI/MainFrame.cpp:1348 msgid "Previously sliced file (" msgstr "Ранее нарезанный файл" -#: src/slic3r/GUI/MainFrame.cpp:1338 +#: src/slic3r/GUI/MainFrame.cpp:1348 msgid ") not found." msgstr ") не найден." -#: src/slic3r/GUI/MainFrame.cpp:1339 +#: src/slic3r/GUI/MainFrame.cpp:1349 msgid "File Not Found" msgstr "Файл не найден" -#: src/slic3r/GUI/MainFrame.cpp:1374 +#: src/slic3r/GUI/MainFrame.cpp:1384 #, c-format msgid "Save %s file as:" -msgstr "Сохранить файл %s как:" +msgstr "Сохранить %s файл как:" -#: src/slic3r/GUI/MainFrame.cpp:1374 +#: src/slic3r/GUI/MainFrame.cpp:1384 msgid "SVG" msgstr "SVG" -#: src/slic3r/GUI/MainFrame.cpp:1374 +#: src/slic3r/GUI/MainFrame.cpp:1384 msgid "G-code" msgstr "G-код" -#: src/slic3r/GUI/MainFrame.cpp:1386 +#: src/slic3r/GUI/MainFrame.cpp:1396 msgid "Save zip file as:" -msgstr "Сохранить zip-файл как:" +msgstr "Сохранить .zip файл как:" -#: src/slic3r/GUI/MainFrame.cpp:1395 src/slic3r/GUI/Plater.cpp:2984 -#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:1576 -#: src/slic3r/GUI/Tab.cpp:4105 +#: src/slic3r/GUI/MainFrame.cpp:1405 src/slic3r/GUI/Plater.cpp:3009 +#: src/slic3r/GUI/Plater.cpp:5581 src/slic3r/GUI/Tab.cpp:1575 +#: src/slic3r/GUI/Tab.cpp:4115 msgid "Slicing" msgstr "Нарезка" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1397 +#: src/slic3r/GUI/MainFrame.cpp:1407 #, c-format msgid "Processing %s" -msgstr "Обрабатывается %s" +msgstr "Обработка %s" -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:1430 msgid "%1% was successfully sliced." -msgstr "" +msgstr "%1% успешно нарезан." -#: src/slic3r/GUI/MainFrame.cpp:1422 +#: src/slic3r/GUI/MainFrame.cpp:1432 msgid "Slicing Done!" msgstr "Нарезка завершена!" -#: src/slic3r/GUI/MainFrame.cpp:1437 +#: src/slic3r/GUI/MainFrame.cpp:1447 msgid "Select the STL file to repair:" msgstr "Выберите STL файл для починки:" -#: src/slic3r/GUI/MainFrame.cpp:1447 +#: src/slic3r/GUI/MainFrame.cpp:1457 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" -msgstr "Сохранить в OBJ как (меньше подвержен ошибкам в координатах, чем STL:" +msgstr "Сохранить в OBJ как (меньше подвержен ошибкам в координатах, чем STL):" -#: src/slic3r/GUI/MainFrame.cpp:1459 +#: src/slic3r/GUI/MainFrame.cpp:1469 msgid "Your file was repaired." msgstr "Ваш файл был починен." -#: src/slic3r/GUI/MainFrame.cpp:1459 src/libslic3r/PrintConfig.cpp:3700 +#: src/slic3r/GUI/MainFrame.cpp:1469 src/libslic3r/PrintConfig.cpp:3735 msgid "Repair" -msgstr "Починка" +msgstr "Ремонт" -#: src/slic3r/GUI/MainFrame.cpp:1473 +#: src/slic3r/GUI/MainFrame.cpp:1483 msgid "Save configuration as:" msgstr "Сохранить конфигурацию в файл как:" -#: src/slic3r/GUI/MainFrame.cpp:1492 src/slic3r/GUI/MainFrame.cpp:1554 +#: src/slic3r/GUI/MainFrame.cpp:1502 src/slic3r/GUI/MainFrame.cpp:1564 msgid "Select configuration to load:" msgstr "Выберите файл конфигурации для загрузки:" -#: src/slic3r/GUI/MainFrame.cpp:1528 +#: src/slic3r/GUI/MainFrame.cpp:1538 msgid "Save presets bundle as:" msgstr "Сохранить все профили в файл как:" -#: src/slic3r/GUI/MainFrame.cpp:1575 +#: src/slic3r/GUI/MainFrame.cpp:1585 #, c-format msgid "%d presets successfully imported." msgstr "Успешно импортировано профилей: %d шт." -#: src/slic3r/GUI/Mouse3DController.cpp:462 +#: src/slic3r/GUI/Mouse3DController.cpp:461 msgid "3Dconnexion settings" msgstr "Настройки 3Dconnexion" -#: src/slic3r/GUI/Mouse3DController.cpp:473 +#: src/slic3r/GUI/Mouse3DController.cpp:472 msgid "Device:" msgstr "Устройство:" -#: src/slic3r/GUI/Mouse3DController.cpp:478 +#: src/slic3r/GUI/Mouse3DController.cpp:477 msgid "Speed:" msgstr "Скорость:" -#: src/slic3r/GUI/Mouse3DController.cpp:481 -#: src/slic3r/GUI/Mouse3DController.cpp:502 +#: src/slic3r/GUI/Mouse3DController.cpp:480 src/slic3r/GUI/Mouse3DController.cpp:501 msgid "Translation" -msgstr "" +msgstr "Перемещение" -#: src/slic3r/GUI/Mouse3DController.cpp:493 -#: src/slic3r/GUI/Mouse3DController.cpp:502 +#: src/slic3r/GUI/Mouse3DController.cpp:492 src/slic3r/GUI/Mouse3DController.cpp:501 msgid "Zoom" -msgstr "Увеличение" +msgstr "Масштаб" -#: src/slic3r/GUI/Mouse3DController.cpp:499 +#: src/slic3r/GUI/Mouse3DController.cpp:498 msgid "Deadzone:" -msgstr "" +msgstr "Мёртвая зона:" -#: src/slic3r/GUI/Mouse3DController.cpp:514 +#: src/slic3r/GUI/Mouse3DController.cpp:513 msgid "Options:" -msgstr "Параметры:" +msgstr "Опции:" -#: src/slic3r/GUI/Mouse3DController.cpp:517 +#: src/slic3r/GUI/Mouse3DController.cpp:516 msgid "Swap Y/Z axes" -msgstr "" +msgstr "Поменять местами оси Y/Z" -#: src/slic3r/GUI/MsgDialog.cpp:73 +#: src/slic3r/GUI/MsgDialog.cpp:70 #, c-format msgid "%s error" -msgstr "Ошибка %s" +msgstr "%s ошибка" -#: src/slic3r/GUI/MsgDialog.cpp:74 +#: src/slic3r/GUI/MsgDialog.cpp:71 #, c-format msgid "%s has encountered an error" -msgstr "В %s возникла ошибка" +msgstr "%s обнаружил ошибку" -#: src/slic3r/GUI/NotificationManager.hpp:398 +#: src/slic3r/GUI/NotificationManager.hpp:471 msgid "3D Mouse disconnected." -msgstr "" +msgstr "3D-мышь отключена." -#: src/slic3r/GUI/NotificationManager.hpp:401 +#: src/slic3r/GUI/NotificationManager.hpp:474 msgid "Configuration update is available." -msgstr "" +msgstr "Доступно обновление конфигурации." -#: src/slic3r/GUI/NotificationManager.hpp:401 +#: src/slic3r/GUI/NotificationManager.hpp:474 msgid "See more." -msgstr "" +msgstr "Подробнее." -#: src/slic3r/GUI/NotificationManager.hpp:403 +#: src/slic3r/GUI/NotificationManager.hpp:476 msgid "New version is available." -msgstr "" +msgstr "Доступна новая версия." -#: src/slic3r/GUI/NotificationManager.hpp:403 +#: src/slic3r/GUI/NotificationManager.hpp:476 msgid "See Releases page." +msgstr "Смотрите страницу релизов." + +#: src/slic3r/GUI/NotificationManager.hpp:479 +msgid "" +"You have just added a G-code for color change, but its value is empty.\n" +"To export the G-code correctly, check the \"Color Change G-code\" in \"Printer " +"Settings > Custom G-code\"" msgstr "" +"Вы только что добавили G-код смена цвета, но его значение в соответствующем поле не " +"задано.\n" +"Для правильного экспорта G-кода, проверьте пункт \"G-код смены цвета\" в разделе " +"Настройки принтера > Пользовательский G-код." -#: src/slic3r/GUI/NotificationManager.cpp:387 -#: src/slic3r/GUI/NotificationManager.cpp:397 +#: src/slic3r/GUI/NotificationManager.cpp:490 +#: src/slic3r/GUI/NotificationManager.cpp:500 msgid "More" -msgstr "Больше" +msgstr "Подробнее" -#: src/slic3r/GUI/NotificationManager.cpp:690 -#: src/slic3r/GUI/NotificationManager.cpp:961 +#: src/slic3r/GUI/NotificationManager.cpp:864 +#: src/slic3r/GUI/NotificationManager.cpp:1141 msgid "Export G-Code." -msgstr "" +msgstr "Экспорт в G-код." -#: src/slic3r/GUI/NotificationManager.cpp:734 +#: src/slic3r/GUI/NotificationManager.cpp:908 msgid "Open Folder." -msgstr "" +msgstr "Открыть папку." -#: src/slic3r/GUI/NotificationManager.cpp:772 +#: src/slic3r/GUI/NotificationManager.cpp:946 msgid "Eject drive" -msgstr "" +msgstr "Извлечь диск" -#: src/slic3r/GUI/NotificationManager.cpp:880 -#: src/slic3r/GUI/NotificationManager.cpp:896 -#: src/slic3r/GUI/NotificationManager.cpp:907 +#: src/slic3r/GUI/NotificationManager.cpp:1060 +#: src/slic3r/GUI/NotificationManager.cpp:1076 +#: src/slic3r/GUI/NotificationManager.cpp:1087 msgid "ERROR:" -msgstr "" +msgstr "ОШИБКА:" -#: src/slic3r/GUI/NotificationManager.cpp:885 -#: src/slic3r/GUI/NotificationManager.cpp:900 -#: src/slic3r/GUI/NotificationManager.cpp:915 +#: src/slic3r/GUI/NotificationManager.cpp:1065 +#: src/slic3r/GUI/NotificationManager.cpp:1080 +#: src/slic3r/GUI/NotificationManager.cpp:1095 msgid "WARNING:" -msgstr "" +msgstr "ПРЕДУПРЕЖДЕНИЕ:" -#: src/slic3r/GUI/NotificationManager.cpp:964 +#: src/slic3r/GUI/NotificationManager.cpp:1144 msgid "Slicing finished." -msgstr "" +msgstr "Нарезка завершена." -#: src/slic3r/GUI/NotificationManager.cpp:1007 +#: src/slic3r/GUI/NotificationManager.cpp:1186 msgid "Exporting finished." -msgstr "" +msgstr "Экспорт завершён." #: src/slic3r/GUI/ObjectDataViewModel.cpp:58 msgid "Instances" -msgstr "Экземпляры" +msgstr "Копии" #: src/slic3r/GUI/ObjectDataViewModel.cpp:62 #: src/slic3r/GUI/ObjectDataViewModel.cpp:225 #, c-format msgid "Instance %d" -msgstr "Экземпляр %d" +msgstr "Копия %d" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 src/slic3r/GUI/Tab.cpp:3952 -#: src/slic3r/GUI/Tab.cpp:4034 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 src/slic3r/GUI/Tab.cpp:3962 +#: src/slic3r/GUI/Tab.cpp:4044 msgid "Layers" msgstr "Слои" @@ -4995,16 +5173,23 @@ msgid "" "PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n" "while OpenGL version %s, render %s, vendor %s was detected." msgstr "" +"Обнаружена графическая подсистема с поддержкой OpenGL версии %s (рендеринг %s, " +"поставщик %s).\n" +"Для правильной же работы PrusaSlicer требуется драйвер графической подсистемы, " +"поддерживающий OpenGL 2.0." #: src/slic3r/GUI/OpenGLManager.cpp:262 msgid "You may need to update your graphics card driver." -msgstr "" +msgstr "Возможно, вам потребуется обновить драйвер видеокарты." #: src/slic3r/GUI/OpenGLManager.cpp:265 msgid "" -"As a workaround, you may run PrusaSlicer with a software rendered 3D " -"graphics by running prusa-slicer.exe with the --sw_renderer parameter." +"As a workaround, you may run PrusaSlicer with a software rendered 3D graphics by " +"running prusa-slicer.exe with the --sw_renderer parameter." msgstr "" +"В качестве обходного пути вы можете запустить PrusaSlicer с программным рендерингом " +"(построения изображения без помощи GPU), запустив prusa-slicer.exe с параметром --" +"sw_renderer." #: src/slic3r/GUI/OpenGLManager.cpp:267 msgid "Unsupported OpenGL version" @@ -5016,52 +5201,54 @@ msgid "" "Unable to load the following shaders:\n" "%s" msgstr "" +"Не удалось загрузить следующие шейдеры:\n" +"%s" #: src/slic3r/GUI/OpenGLManager.cpp:276 msgid "Error loading shaders" -msgstr "" +msgstr "Ошибка загрузки шейдеров" -#: src/slic3r/GUI/OptionsGroup.cpp:333 +#: src/slic3r/GUI/OptionsGroup.cpp:335 msgctxt "Layers" msgid "Top" msgstr "Сверху" -#: src/slic3r/GUI/OptionsGroup.cpp:333 +#: src/slic3r/GUI/OptionsGroup.cpp:335 msgctxt "Layers" msgid "Bottom" msgstr "Снизу" #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:51 msgid "Delete this preset from this printer device" -msgstr "" +msgstr "Удалить этот профиль у данного принтера" #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:81 msgid "This printer will be shown in the presets list as" -msgstr "" +msgstr "Этот принтер будет отображаться в списке профилей как" #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:155 msgid "Physical Printer" -msgstr "" +msgstr "Физический принтер" #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:161 msgid "Type here the name of your printer device" -msgstr "" +msgstr "Введите здесь имя вашего принтера" #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:172 msgid "Descriptive name for the printer" -msgstr "" +msgstr "Имя принтера" #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:176 msgid "Add preset for this printer device" -msgstr "" +msgstr "Добавить профиль для этого принтера" #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:205 src/slic3r/GUI/Tab.cpp:2064 msgid "Print Host upload" -msgstr "Отправка на узел печати" +msgstr "Загрузка на хост печати" #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:260 msgid "Connection to printers connected via the print host failed." -msgstr "" +msgstr "Не удалось подключиться к принтерам, подключенным через через хост печати." #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:302 msgid "Test" @@ -5069,7 +5256,7 @@ msgstr "Тест" #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:307 msgid "Could not get a valid Printer Host reference" -msgstr "Невозможно получить корректную ссылку узла печати" +msgstr "Не удалось получить действительную ссылку на хост принтера" #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:319 msgid "Success!" @@ -5077,15 +5264,15 @@ msgstr "Успешно!" #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:329 msgid "Refresh Printers" -msgstr "" +msgstr "Обновить принтеры" #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:356 msgid "" -"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" -"signed certificate." +"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-signed " +"certificate." msgstr "" -"Файл УЦ для HTTPS не является обязательным. Файл необходим, только если вы " -"используете HTTPS с самоподписанным сертификатом." +"Файл HTTPS CA не обязателен. Он необходим только при использовании HTTPS с " +"самоподписанным сертификатом." #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:366 msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" @@ -5093,29 +5280,28 @@ msgstr "Файлы сертификатов (*.crt, *.pem)|*.crt;*.pem|Все ф #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:367 msgid "Open CA certificate file" -msgstr "Открыть файл сертификата УЦ" +msgstr "Открыть файл сертификата CA" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:395 -#: src/libslic3r/PrintConfig.cpp:120 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:395 src/libslic3r/PrintConfig.cpp:124 msgid "HTTPS CA File" -msgstr "Файл УЦ для HTTPS" +msgstr "Файл HTTPS CA сертификата" #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:396 #, c-format msgid "" -"On this system, %s uses HTTPS certificates from the system Certificate Store " -"or Keychain." +"On this system, %s uses HTTPS certificates from the system Certificate Store or " +"Keychain." msgstr "" -"В этой системе %s использует сертификаты HTTPS из системного хранилища " -"сертификатов или связки ключей." +"В этой системе %s использует HTTPS сертификаты из системного хранилища сертификатов/" +"Keychain." #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:397 msgid "" "To use a custom CA file, please import your CA file into Certificate Store / " "Keychain." msgstr "" -"Чтобы использовать свой файл УЦ, импортируйте этот файл в хранилище " -"сертификатов/связку ключей." +"Чтобы использовать пользовательский файл CA, импортируйте его в хранилище " +"сертификатов/Keychain." #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:543 msgid "The supplied name is empty. It can't be saved." @@ -5123,11 +5309,11 @@ msgstr "Имя не задано. Невозможно сохранить." #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:547 msgid "You should change the name of your printer device." -msgstr "" +msgstr "Пожалуйста, измените имя вашего принтера." #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:555 msgid "Printer with name \"%1%\" already exists." -msgstr "" +msgstr "Принтер с именем \"%1%\" уже существует." #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:556 msgid "Replace?" @@ -5135,17 +5321,15 @@ msgstr "Заменить?" #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:579 msgid "" -"Following printer preset(s) is duplicated:%1%The above preset for printer " -"\"%2%\" will be used just once." +"Following printer preset(s) is duplicated:%1%The above preset for printer \"%2%\" " +"will be used just once." msgstr "" +"Следующий профиль(-и) принтера будет продублирован: %1% Вышеуказанный профиль для " +"принтера %2% будет использован только один раз." #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:625 msgid "It's not possible to delete the last related preset for the printer." -msgstr "" - -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:626 -msgid "Infornation" -msgstr "" +msgstr "Невозможно удалить последний связанный профиль принтера." #: src/slic3r/GUI/Plater.cpp:163 msgid "Volume" @@ -5169,7 +5353,7 @@ msgstr "Информация о нарезке" #: src/slic3r/GUI/Plater.cpp:237 src/slic3r/GUI/Plater.cpp:1151 msgid "Used Filament (m)" -msgstr "" +msgstr "Использовано прутка в метрах" #: src/slic3r/GUI/Plater.cpp:238 src/slic3r/GUI/Plater.cpp:1163 msgid "Used Filament (mm³)" @@ -5181,44 +5365,46 @@ msgstr "Использовано прутка (г)" #: src/slic3r/GUI/Plater.cpp:240 msgid "Used Material (unit)" -msgstr "Использовано материалов (шт)" +msgstr "Использовано материала (единиц)" #: src/slic3r/GUI/Plater.cpp:241 msgid "Cost (money)" -msgstr "Стоимость (денег)" +msgstr "Стоимость" #: src/slic3r/GUI/Plater.cpp:243 msgid "Number of tool changes" -msgstr "Количество смен сопла" +msgstr "Количество инструментов" #: src/slic3r/GUI/Plater.cpp:360 msgid "Select what kind of support do you need" -msgstr "Выбор варианта поддержек" +msgstr "Выбор варианта поддержки" -#: src/slic3r/GUI/Plater.cpp:362 src/libslic3r/PrintConfig.cpp:2096 -#: src/libslic3r/PrintConfig.cpp:2891 +#: src/slic3r/GUI/Plater.cpp:362 src/libslic3r/PrintConfig.cpp:2128 +#: src/libslic3r/PrintConfig.cpp:2923 msgid "Support on build plate only" -msgstr "Только от платформы" +msgstr "Только от стола" #: src/slic3r/GUI/Plater.cpp:363 src/slic3r/GUI/Plater.cpp:489 msgid "For support enforcers only" -msgstr "Только для принудительных поддержек" +msgstr "Только принудительная" #: src/slic3r/GUI/Plater.cpp:364 msgid "Everywhere" msgstr "Везде" -#: src/slic3r/GUI/Plater.cpp:396 src/slic3r/GUI/Tab.cpp:1470 +#: src/slic3r/GUI/Plater.cpp:396 src/slic3r/GUI/Tab.cpp:1469 msgid "Brim" msgstr "Кайма" #: src/slic3r/GUI/Plater.cpp:398 msgid "" -"This flag enables the brim that will be printed around each object on the " -"first layer." +"This flag enables the brim that will be printed around each object on the first " +"layer." msgstr "" -"Включает кайму, которая будет печататься вокруг каждого объекта на первом " -"слое." +"Расстояние от модели до самой дальней линии каймы. Широкая кайма повышает адгезию к " +"столу, но уменьшает полезную площадь печати. Увеличение этого параметра очень важно " +"для моделей с маленькой площадью контакта со столом и особенно важно при печати ABS " +"пластиком." #: src/slic3r/GUI/Plater.cpp:406 msgid "Purging volumes" @@ -5226,32 +5412,32 @@ msgstr "Объём очистки" #: src/slic3r/GUI/Plater.cpp:503 msgid "Select what kind of pad do you need" -msgstr "" +msgstr "Выбор варианта подложки" #: src/slic3r/GUI/Plater.cpp:505 msgid "Below object" -msgstr "Ниже объекта" +msgstr "Ниже модели" #: src/slic3r/GUI/Plater.cpp:506 msgid "Around object" -msgstr "Вокруг объекта" +msgstr "Вокруг модели" #: src/slic3r/GUI/Plater.cpp:695 msgid "SLA print settings" -msgstr "Настройки печати SLA" +msgstr "Настройки SLA печати" -#: src/slic3r/GUI/Plater.cpp:756 src/slic3r/GUI/Plater.cpp:5962 +#: src/slic3r/GUI/Plater.cpp:756 src/slic3r/GUI/Plater.cpp:6055 msgid "Send to printer" -msgstr "Отправить на принтер" +msgstr "На принтер" -#: src/slic3r/GUI/Plater.cpp:771 src/slic3r/GUI/Plater.cpp:2984 -#: src/slic3r/GUI/Plater.cpp:5499 +#: src/slic3r/GUI/Plater.cpp:771 src/slic3r/GUI/Plater.cpp:3009 +#: src/slic3r/GUI/Plater.cpp:5584 msgid "Slice now" -msgstr "Нарезать" +msgstr "НАРЕЗАТЬ" #: src/slic3r/GUI/Plater.cpp:926 msgid "Hold Shift to Slice & Export G-code" -msgstr "Зажмите Shift что нарезать и экспортировать G-код" +msgstr "Удерживайте клавишу Shift, чтобы нарезать и экспортировать в G-код" #: src/slic3r/GUI/Plater.cpp:1071 #, c-format @@ -5266,11 +5452,11 @@ msgstr "Исправлено ошибок: %d" #: src/slic3r/GUI/Plater.cpp:1079 #, c-format msgid "" -"%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d " -"facets reversed, %d backwards edges" +"%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d facets " +"reversed, %d backwards edges" msgstr "" -"вырождено %d граней, починено %d рёбер, %d граней удалено, %d граней " -"добавлено, %d граней реверсировано, вывернуто %d рёбер" +"Вырожденных граней: %d. | Рёбер починено: %d. | Граней удалено: %d. | Граней " +"добавлено: %d. | Граней реверсировано: %d. | Вывернуто рёбер: %d." #: src/slic3r/GUI/Plater.cpp:1089 msgid "Yes" @@ -5282,38 +5468,38 @@ msgstr "Использовано материала (мл)" #: src/slic3r/GUI/Plater.cpp:1113 msgid "object(s)" -msgstr "объект(ы)" +msgstr "модель(и)" #: src/slic3r/GUI/Plater.cpp:1113 msgid "supports and pad" -msgstr "" +msgstr "поддержка и подложка" #: src/slic3r/GUI/Plater.cpp:1151 msgid "Used Filament (in)" -msgstr "" +msgstr "Использовано прутка (дюймы)" #: src/slic3r/GUI/Plater.cpp:1153 src/slic3r/GUI/Plater.cpp:1206 msgid "objects" -msgstr "объекты" +msgstr "модели" #: src/slic3r/GUI/Plater.cpp:1153 src/slic3r/GUI/Plater.cpp:1206 msgid "wipe tower" -msgstr "башня очистки" +msgstr "черновой башни" #: src/slic3r/GUI/Plater.cpp:1163 msgid "Used Filament (in³)" -msgstr "" +msgstr "Использовано прутка (дюймы³)" #: src/slic3r/GUI/Plater.cpp:1189 msgid "Filament at extruder %1%" -msgstr "" +msgstr "Прутка в экструдере %1%" #: src/slic3r/GUI/Plater.cpp:1195 -msgid "(weight with spool)" -msgstr "" +msgid "(including spool)" +msgstr "(включая катушку)" -#: src/slic3r/GUI/Plater.cpp:1204 src/libslic3r/PrintConfig.cpp:805 -#: src/libslic3r/PrintConfig.cpp:2706 src/libslic3r/PrintConfig.cpp:2707 +#: src/slic3r/GUI/Plater.cpp:1204 src/libslic3r/PrintConfig.cpp:822 +#: src/libslic3r/PrintConfig.cpp:2738 src/libslic3r/PrintConfig.cpp:2739 msgid "Cost" msgstr "Стоимость" @@ -5323,1095 +5509,1115 @@ msgstr "нормальный режим" #: src/slic3r/GUI/Plater.cpp:1232 msgid "stealth mode" -msgstr "" +msgstr "тихий режим" -#: src/slic3r/GUI/Plater.cpp:1400 src/slic3r/GUI/Plater.cpp:4841 +#: src/slic3r/GUI/Plater.cpp:1403 src/slic3r/GUI/Plater.cpp:4923 #, c-format msgid "%s - Drop project file" -msgstr "" +msgstr "%s - Перетаскивание файла-проекта" -#: src/slic3r/GUI/Plater.cpp:1407 src/slic3r/GUI/Plater.cpp:4848 +#: src/slic3r/GUI/Plater.cpp:1410 src/slic3r/GUI/Plater.cpp:4930 msgid "Open as project" -msgstr "" +msgstr "Открыть как проект" -#: src/slic3r/GUI/Plater.cpp:1408 src/slic3r/GUI/Plater.cpp:4849 +#: src/slic3r/GUI/Plater.cpp:1411 src/slic3r/GUI/Plater.cpp:4931 msgid "Import geometry only" -msgstr "" +msgstr "Импортировать только геометрию" -#: src/slic3r/GUI/Plater.cpp:1409 src/slic3r/GUI/Plater.cpp:4850 +#: src/slic3r/GUI/Plater.cpp:1412 src/slic3r/GUI/Plater.cpp:4932 msgid "Import config only" -msgstr "" +msgstr "Импортировать только конфигурацию" -#: src/slic3r/GUI/Plater.cpp:1412 src/slic3r/GUI/Plater.cpp:4853 +#: src/slic3r/GUI/Plater.cpp:1415 src/slic3r/GUI/Plater.cpp:4935 msgid "Select an action to apply to the file" -msgstr "" +msgstr "Выберите действие для применения к файлу" -#: src/slic3r/GUI/Plater.cpp:1413 src/slic3r/GUI/Plater.cpp:4854 +#: src/slic3r/GUI/Plater.cpp:1416 src/slic3r/GUI/Plater.cpp:4936 msgid "Action" -msgstr "" +msgstr "Действие" -#: src/slic3r/GUI/Plater.cpp:1421 src/slic3r/GUI/Plater.cpp:4862 +#: src/slic3r/GUI/Plater.cpp:1424 src/slic3r/GUI/Plater.cpp:4944 msgid "Don't show again" -msgstr "" +msgstr "Больше не показывать" -#: src/slic3r/GUI/Plater.cpp:1466 src/slic3r/GUI/Plater.cpp:4899 +#: src/slic3r/GUI/Plater.cpp:1469 src/slic3r/GUI/Plater.cpp:4981 msgid "You can open only one .gcode file at a time." -msgstr "" +msgstr "За раз вы можете открыть только один .gcode файл." -#: src/slic3r/GUI/Plater.cpp:1467 src/slic3r/GUI/Plater.cpp:4900 +#: src/slic3r/GUI/Plater.cpp:1470 src/slic3r/GUI/Plater.cpp:4982 msgid "Drag and drop G-code file" -msgstr "" +msgstr "Перетащите G-код файл" -#: src/slic3r/GUI/Plater.cpp:1521 src/slic3r/GUI/Plater.cpp:4720 -#: src/slic3r/GUI/Plater.cpp:4954 +#: src/slic3r/GUI/Plater.cpp:1524 src/slic3r/GUI/Plater.cpp:4796 +#: src/slic3r/GUI/Plater.cpp:5036 msgid "Import Object" -msgstr "Импортировать объект" +msgstr "Импорт модели" -#: src/slic3r/GUI/Plater.cpp:1543 src/slic3r/GUI/Plater.cpp:4976 +#: src/slic3r/GUI/Plater.cpp:1546 src/slic3r/GUI/Plater.cpp:5058 msgid "Load File" msgstr "Загрузить файл" -#: src/slic3r/GUI/Plater.cpp:1548 src/slic3r/GUI/Plater.cpp:4981 +#: src/slic3r/GUI/Plater.cpp:1551 src/slic3r/GUI/Plater.cpp:5063 msgid "Load Files" msgstr "Загрузить файлы" -#: src/slic3r/GUI/Plater.cpp:1651 +#: src/slic3r/GUI/Plater.cpp:1654 msgid "Fill bed" -msgstr "" +msgstr "Заполнение всего стола копиями" -#: src/slic3r/GUI/Plater.cpp:1657 +#: src/slic3r/GUI/Plater.cpp:1660 msgid "Optimize Rotation" -msgstr "Оптимизировать поворот" +msgstr "Оптимизация положения" -#: src/slic3r/GUI/Plater.cpp:1663 +#: src/slic3r/GUI/Plater.cpp:1666 msgid "Import SLA archive" -msgstr "Импорт архива SLA" +msgstr "Импорт SLA архива" -#: src/slic3r/GUI/Plater.cpp:2109 +#: src/slic3r/GUI/Plater.cpp:2129 #, c-format msgid "" "Successfully unmounted. The device %s(%s) can now be safely removed from the " "computer." msgstr "" +"Размонтирование прошло успешно. Теперь устройство %s(%s) может быть безопасно " +"извлечено из компьютера." -#: src/slic3r/GUI/Plater.cpp:2112 +#: src/slic3r/GUI/Plater.cpp:2134 #, c-format msgid "Ejecting of device %s(%s) has failed." msgstr "Не удалось извлечь устройство %s(%s)." -#: src/slic3r/GUI/Plater.cpp:2131 +#: src/slic3r/GUI/Plater.cpp:2153 msgid "New Project" msgstr "Новый проект" -#: src/slic3r/GUI/Plater.cpp:2224 +#: src/slic3r/GUI/Plater.cpp:2246 msgid "Expand sidebar" -msgstr "" +msgstr "Развернуть боковую панель" -#: src/slic3r/GUI/Plater.cpp:2297 +#: src/slic3r/GUI/Plater.cpp:2319 msgid "Loading" -msgstr "Загружается" +msgstr "Загрузка" -#: src/slic3r/GUI/Plater.cpp:2307 +#: src/slic3r/GUI/Plater.cpp:2329 msgid "Loading file" -msgstr "" +msgstr "Загрузка файла" -#: src/slic3r/GUI/Plater.cpp:2390 +#: src/slic3r/GUI/Plater.cpp:2415 #, c-format msgid "" "Some object(s) in file %s looks like saved in inches.\n" "Should I consider them as a saved in inches and convert them?" msgstr "" +"Похоже какая-то модель(-и) в файле %s сохранена в дюймах.\n" +"Считать что она сохранена в дюймах и конвертировать?" -#: src/slic3r/GUI/Plater.cpp:2392 +#: src/slic3r/GUI/Plater.cpp:2417 msgid "The object appears to be saved in inches" -msgstr "" +msgstr "Похоже какая-то модель(-и) в файле %s сохранена в дюймах" -#: src/slic3r/GUI/Plater.cpp:2400 +#: src/slic3r/GUI/Plater.cpp:2425 msgid "" "This file contains several objects positioned at multiple heights.\n" "Instead of considering them as multiple objects, should I consider\n" "this file as a single object having multiple parts?" msgstr "" -"Этот файл содержит несколько объектов, расположенных на разных высотах.\n" -"Вместо того, чтобы рассматривать их как несколько объектов, следует ли\n" -"рассматривать этот файл как один объект, состоящий из нескольких частей?" +"Этот файл содержит несколько моделей, расположенных на разных высотах.\n" +"Вместо того, чтобы рассматривать их как несколько моделей, следует ли рассматривать " +"этот файл как одну модель состоящую из несколько частей?" -#: src/slic3r/GUI/Plater.cpp:2403 src/slic3r/GUI/Plater.cpp:2456 +#: src/slic3r/GUI/Plater.cpp:2428 src/slic3r/GUI/Plater.cpp:2481 msgid "Multi-part object detected" -msgstr "Обнаружен объект, состоящий из нескольких частей" +msgstr "Обнаружена модель, состоящая из нескольких частей" -#: src/slic3r/GUI/Plater.cpp:2410 +#: src/slic3r/GUI/Plater.cpp:2435 msgid "" -"This file cannot be loaded in a simple mode. Do you want to switch to an " -"advanced mode?" +"This file cannot be loaded in a simple mode. Do you want to switch to an advanced " +"mode?" msgstr "" +"Этот файл не может быть загружен в простом режиме. Хотите перейти в расширенный " +"режим?" -#: src/slic3r/GUI/Plater.cpp:2411 +#: src/slic3r/GUI/Plater.cpp:2436 msgid "Detected advanced data" msgstr "Обнаружены расширенные данные" -#: src/slic3r/GUI/Plater.cpp:2433 +#: src/slic3r/GUI/Plater.cpp:2458 #, c-format msgid "" -"You can't to add the object(s) from %s because of one or some of them " -"is(are) multi-part" +"You can't to add the object(s) from %s because of one or some of them is(are) multi-" +"part" msgstr "" +"Вы не можете добавить модель(и) из %s, потому что одна или несколько из них " +"являются составными (состоят из нескольких частей)" -#: src/slic3r/GUI/Plater.cpp:2453 +#: src/slic3r/GUI/Plater.cpp:2478 msgid "" "Multiple objects were loaded for a multi-material printer.\n" "Instead of considering them as multiple objects, should I consider\n" "these files to represent a single object having multiple parts?" msgstr "" -"Для мультиматериального принтера было загружено несколько объектов. \n" -"Вместо того, чтобы рассматривать их как несколько моделей, следует ли " -"рассматривать их как одну модель,\n" -"состоящую из несколько частей?" +"Для мультиматериального принтера было загружено несколько моделей.\n" +"Вместо того, чтобы рассматривать их как несколько моделей, следует ли рассматривать " +"их как одну модель, состоящую из несколько частей?" -#: src/slic3r/GUI/Plater.cpp:2469 +#: src/slic3r/GUI/Plater.cpp:2494 msgid "Loaded" msgstr "Загружено" -#: src/slic3r/GUI/Plater.cpp:2571 +#: src/slic3r/GUI/Plater.cpp:2596 msgid "" -"Your object appears to be too large, so it was automatically scaled down to " -"fit your print bed." +"Your object appears to be too large, so it was automatically scaled down to fit " +"your print bed." msgstr "" -"Ваш объект слишком большой, поэтому он был автоматически уменьшен до размера " -"платформы печати." +"Ваша модель слишком большая, поэтому она была автоматически уменьшена до размера " +"вашего печатного стола." -#: src/slic3r/GUI/Plater.cpp:2572 +#: src/slic3r/GUI/Plater.cpp:2597 msgid "Object too large?" msgstr "Модель слишком большая?" -#: src/slic3r/GUI/Plater.cpp:2634 +#: src/slic3r/GUI/Plater.cpp:2659 msgid "Export STL file:" -msgstr "Экспорт STL-файла:" +msgstr "Экспорт в STL файл:" -#: src/slic3r/GUI/Plater.cpp:2641 +#: src/slic3r/GUI/Plater.cpp:2666 msgid "Export AMF file:" -msgstr "Экспорт AMF-файла:" +msgstr "Экспорт в AMF файл:" -#: src/slic3r/GUI/Plater.cpp:2647 +#: src/slic3r/GUI/Plater.cpp:2672 msgid "Save file as:" msgstr "Сохранить файл как:" -#: src/slic3r/GUI/Plater.cpp:2653 +#: src/slic3r/GUI/Plater.cpp:2678 msgid "Export OBJ file:" -msgstr "Экспорт OBJ-файла:" +msgstr "Экспорт в OBJ файл:" -#: src/slic3r/GUI/Plater.cpp:2749 +#: src/slic3r/GUI/Plater.cpp:2774 msgid "Delete Object" -msgstr "Удалить объект" +msgstr "Удаление модели" -#: src/slic3r/GUI/Plater.cpp:2760 +#: src/slic3r/GUI/Plater.cpp:2785 msgid "Reset Project" -msgstr "Сбросить проект" +msgstr "Обнуление проекта" -#: src/slic3r/GUI/Plater.cpp:2832 +#: src/slic3r/GUI/Plater.cpp:2857 msgid "" "The selected object can't be split because it contains more than one volume/" "material." msgstr "" -"Выбранный объект не может быть разделен, так как он содержит более одного " -"объёма/материала." +"Выбранная модель не может быть разделена, так как она содержит более одного объёма/" +"материала." -#: src/slic3r/GUI/Plater.cpp:2843 +#: src/slic3r/GUI/Plater.cpp:2868 msgid "Split to Objects" -msgstr "Разделить на объекты" +msgstr "Разделить на модели" -#: src/slic3r/GUI/Plater.cpp:2968 src/slic3r/GUI/Plater.cpp:3651 +#: src/slic3r/GUI/Plater.cpp:2993 src/slic3r/GUI/Plater.cpp:3723 msgid "Invalid data" -msgstr "" +msgstr "Неверные данные" -#: src/slic3r/GUI/Plater.cpp:2978 +#: src/slic3r/GUI/Plater.cpp:3003 msgid "Ready to slice" -msgstr "" +msgstr "Готов к нарезке на слои" -#: src/slic3r/GUI/Plater.cpp:3016 src/slic3r/GUI/PrintHostDialogs.cpp:260 +#: src/slic3r/GUI/Plater.cpp:3041 src/slic3r/GUI/PrintHostDialogs.cpp:264 msgid "Cancelling" msgstr "Отмена" -#: src/slic3r/GUI/Plater.cpp:3035 +#: src/slic3r/GUI/Plater.cpp:3060 msgid "Another export job is currently running." msgstr "Уже идёт другой процесс экспорта." -#: src/slic3r/GUI/Plater.cpp:3152 +#: src/slic3r/GUI/Plater.cpp:3177 msgid "Please select the file to reload" msgstr "Пожалуйста, выберите файл для перезагрузки" -#: src/slic3r/GUI/Plater.cpp:3187 +#: src/slic3r/GUI/Plater.cpp:3212 msgid "It is not allowed to change the file to reload" -msgstr "" +msgstr "Не разрешается заменять перезагружаемый файл" -#: src/slic3r/GUI/Plater.cpp:3187 +#: src/slic3r/GUI/Plater.cpp:3212 msgid "Do you want to retry" -msgstr "Хотите продолжить" +msgstr "Повторить снова" -#: src/slic3r/GUI/Plater.cpp:3205 +#: src/slic3r/GUI/Plater.cpp:3230 msgid "Reload from:" -msgstr "Перезагрузить с:" +msgstr "Перезагрузка из:" -#: src/slic3r/GUI/Plater.cpp:3296 +#: src/slic3r/GUI/Plater.cpp:3323 msgid "Unable to reload:" -msgstr "Не удаётся перезагрузить:" +msgstr "Не удалось перезагрузить:" -#: src/slic3r/GUI/Plater.cpp:3301 +#: src/slic3r/GUI/Plater.cpp:3328 msgid "Error during reload" -msgstr "Ошибка при перезагрузке" +msgstr "Ошибка во время перезагрузки" -#: src/slic3r/GUI/Plater.cpp:3320 +#: src/slic3r/GUI/Plater.cpp:3347 msgid "Reload all from disk" msgstr "Перезагрузить всё с диска" -#: src/slic3r/GUI/Plater.cpp:3341 -msgid "Fix Throught NetFabb" -msgstr "Починить с помощью Netfabb" +#: src/slic3r/GUI/Plater.cpp:3374 +msgid "" +"ERROR: Please close all manipulators available from the left toolbar before fixing " +"the mesh." +msgstr "" +"ОШИБКА: Пожалуйста, перед починкой сетки, завершите все манипуляции на панели " +"инструментов." + +#: src/slic3r/GUI/Plater.cpp:3380 +msgid "Fix through NetFabb" +msgstr "Ремонт модели службой Netfabb" -#: src/slic3r/GUI/Plater.cpp:3609 +#: src/slic3r/GUI/Plater.cpp:3397 +msgid "Custom supports and seams were removed after repairing the mesh." +msgstr "Пользовательские поддержки и швы были удалены после почитки сетки." + +#: src/slic3r/GUI/Plater.cpp:3680 msgid "There are active warnings concerning sliced models:" -msgstr "" +msgstr "Имеются активные предупреждения о нарезанных моделях:" -#: src/slic3r/GUI/Plater.cpp:3620 +#: src/slic3r/GUI/Plater.cpp:3691 msgid "generated warnings" -msgstr "" +msgstr "вызвала предупреждения" -#: src/slic3r/GUI/Plater.cpp:3659 src/slic3r/GUI/PrintHostDialogs.cpp:261 +#: src/slic3r/GUI/Plater.cpp:3731 src/slic3r/GUI/PrintHostDialogs.cpp:265 msgid "Cancelled" msgstr "Отменено" -#: src/slic3r/GUI/Plater.cpp:3921 src/slic3r/GUI/Plater.cpp:3945 +#: src/slic3r/GUI/Plater.cpp:3998 src/slic3r/GUI/Plater.cpp:4022 msgid "Remove the selected object" -msgstr "Удалить выбранный объект" +msgstr "Удалить выбранную модель" -#: src/slic3r/GUI/Plater.cpp:3930 +#: src/slic3r/GUI/Plater.cpp:4007 msgid "Add one more instance of the selected object" -msgstr "Добавить ещё один экземпляр выбранного объекта" +msgstr "Добавить ещё одну копию выбранной модели" -#: src/slic3r/GUI/Plater.cpp:3932 +#: src/slic3r/GUI/Plater.cpp:4009 msgid "Remove one instance of the selected object" -msgstr "Удалить один экземпляр выбранного объекта" +msgstr "Удалить одну копию выбранной модели" -#: src/slic3r/GUI/Plater.cpp:3934 +#: src/slic3r/GUI/Plater.cpp:4011 msgid "Set number of instances" -msgstr "Задать количество экземпляров" +msgstr "Задать количество копий" -#: src/slic3r/GUI/Plater.cpp:3934 +#: src/slic3r/GUI/Plater.cpp:4011 msgid "Change the number of instances of the selected object" -msgstr "Изменить количество экземпляров выбранного объекта" +msgstr "Изменить количества копий выбранной модели" -#: src/slic3r/GUI/Plater.cpp:3936 +#: src/slic3r/GUI/Plater.cpp:4013 msgid "Fill bed with instances" -msgstr "" +msgstr "Заполнить весь стол копиями" -#: src/slic3r/GUI/Plater.cpp:3936 +#: src/slic3r/GUI/Plater.cpp:4013 msgid "Fill the remaining area of bed with instances of the selected object" -msgstr "" +msgstr "Заполнить оставшуюся область печатного стола копиями выбранной модели" -#: src/slic3r/GUI/Plater.cpp:3955 +#: src/slic3r/GUI/Plater.cpp:4032 msgid "Reload the selected object from disk" -msgstr "Перезагрузить выбранный объект с диска" +msgstr "Перезагрузить выбранную модель файл с диска" -#: src/slic3r/GUI/Plater.cpp:3958 +#: src/slic3r/GUI/Plater.cpp:4035 msgid "Export the selected object as STL file" -msgstr "Экспортировать выбранный объект в STL файл" +msgstr "Экспортировать выбранную модель в STL файл" -#: src/slic3r/GUI/Plater.cpp:3989 +#: src/slic3r/GUI/Plater.cpp:4065 msgid "Along X axis" msgstr "Вдоль оси X" -#: src/slic3r/GUI/Plater.cpp:3989 +#: src/slic3r/GUI/Plater.cpp:4065 msgid "Mirror the selected object along the X axis" -msgstr "Отразить выбранный объект вдоль оси X" +msgstr "Отразить выбранную модель вдоль оси X" -#: src/slic3r/GUI/Plater.cpp:3991 +#: src/slic3r/GUI/Plater.cpp:4067 msgid "Along Y axis" msgstr "Вдоль оси Y" -#: src/slic3r/GUI/Plater.cpp:3991 +#: src/slic3r/GUI/Plater.cpp:4067 msgid "Mirror the selected object along the Y axis" -msgstr "Отразить выбранный объект вдоль оси Y" +msgstr "Отразить выбранную модель вдоль оси Y" -#: src/slic3r/GUI/Plater.cpp:3993 +#: src/slic3r/GUI/Plater.cpp:4069 msgid "Along Z axis" msgstr "Вдоль оси Z" -#: src/slic3r/GUI/Plater.cpp:3993 +#: src/slic3r/GUI/Plater.cpp:4069 msgid "Mirror the selected object along the Z axis" -msgstr "Отразить выбранный объект вдоль оси Z" +msgstr "Отразить выбранную модель вдоль оси Z" -#: src/slic3r/GUI/Plater.cpp:3996 +#: src/slic3r/GUI/Plater.cpp:4072 msgid "Mirror" msgstr "Отразить" -#: src/slic3r/GUI/Plater.cpp:3996 +#: src/slic3r/GUI/Plater.cpp:4072 msgid "Mirror the selected object" -msgstr "Отразить выбранный объект" +msgstr "Отразить выбранную модель" -#: src/slic3r/GUI/Plater.cpp:4008 +#: src/slic3r/GUI/Plater.cpp:4084 msgid "To objects" -msgstr "В объекты" +msgstr "На модели" -#: src/slic3r/GUI/Plater.cpp:4008 src/slic3r/GUI/Plater.cpp:4028 +#: src/slic3r/GUI/Plater.cpp:4084 src/slic3r/GUI/Plater.cpp:4104 msgid "Split the selected object into individual objects" -msgstr "Разделить выбранный объект на отдельные объекты" +msgstr "Разделить выбранную модель на отдельные модели" -#: src/slic3r/GUI/Plater.cpp:4010 +#: src/slic3r/GUI/Plater.cpp:4086 msgid "To parts" -msgstr "" +msgstr "На части" -#: src/slic3r/GUI/Plater.cpp:4010 src/slic3r/GUI/Plater.cpp:4046 +#: src/slic3r/GUI/Plater.cpp:4086 src/slic3r/GUI/Plater.cpp:4122 msgid "Split the selected object into individual sub-parts" -msgstr "Разделить выбранный объект на отдельные части" +msgstr "Разделить выбранную модель на отдельные части" -#: src/slic3r/GUI/Plater.cpp:4013 src/slic3r/GUI/Plater.cpp:4028 -#: src/slic3r/GUI/Plater.cpp:4046 src/libslic3r/PrintConfig.cpp:3724 +#: src/slic3r/GUI/Plater.cpp:4089 src/slic3r/GUI/Plater.cpp:4104 +#: src/slic3r/GUI/Plater.cpp:4122 src/libslic3r/PrintConfig.cpp:3759 msgid "Split" -msgstr "Разделить на части" +msgstr "Разделить" -#: src/slic3r/GUI/Plater.cpp:4013 +#: src/slic3r/GUI/Plater.cpp:4089 msgid "Split the selected object" -msgstr "Разделить выбранный объект" +msgstr "Разделить выбранную модель" -#: src/slic3r/GUI/Plater.cpp:4035 +#: src/slic3r/GUI/Plater.cpp:4111 msgid "Optimize orientation" -msgstr "Оптимизировать ориентацию" +msgstr "Оптимизация положения модели" -#: src/slic3r/GUI/Plater.cpp:4036 +#: src/slic3r/GUI/Plater.cpp:4112 msgid "Optimize the rotation of the object for better print results." -msgstr "" +msgstr "Оптимизация положения модели для лучшего результата печати." -#: src/slic3r/GUI/Plater.cpp:4116 +#: src/slic3r/GUI/Plater.cpp:4192 msgid "3D editor view" -msgstr "" +msgstr "3D-вид" -#: src/slic3r/GUI/Plater.cpp:4488 +#: src/slic3r/GUI/Plater.cpp:4564 msgid "" -"%1% printer was active at the time the target Undo / Redo snapshot was " -"taken. Switching to %1% printer requires reloading of %1% presets." +"%1% printer was active at the time the target Undo / Redo snapshot was taken. " +"Switching to %1% printer requires reloading of %1% presets." msgstr "" +"Принтер %1% был активен в момент создания целевого снапшота Отмены / Повтора. " +"Переключение на принтер %1% потребует перезагрузки профиля %1%." -#: src/slic3r/GUI/Plater.cpp:4692 +#: src/slic3r/GUI/Plater.cpp:4768 msgid "Load Project" -msgstr "Загрузить проект" +msgstr "Загрузка проекта" -#: src/slic3r/GUI/Plater.cpp:4724 +#: src/slic3r/GUI/Plater.cpp:4800 msgid "Import Objects" -msgstr "Импортировать объекты" +msgstr "Импорт моделей" -#: src/slic3r/GUI/Plater.cpp:4793 +#: src/slic3r/GUI/Plater.cpp:4868 msgid "The selected file" -msgstr "" +msgstr "В выбранном файле" -#: src/slic3r/GUI/Plater.cpp:4793 +#: src/slic3r/GUI/Plater.cpp:4868 msgid "does not contain valid gcode." -msgstr "" +msgstr "G-кода содержатся недопустимые данные." -#: src/slic3r/GUI/Plater.cpp:4794 +#: src/slic3r/GUI/Plater.cpp:4869 msgid "Error while loading .gcode file" -msgstr "" +msgstr "Ошибка при загрузке .gcode файла" -#: src/slic3r/GUI/Plater.cpp:5025 +#: src/slic3r/GUI/Plater.cpp:5107 msgid "All objects will be removed, continue?" -msgstr "Будут удалены все объекты, продолжить?" +msgstr "Все модели будут удалены, продолжить?" -#: src/slic3r/GUI/Plater.cpp:5033 +#: src/slic3r/GUI/Plater.cpp:5115 msgid "Delete Selected Objects" -msgstr "Удалить выделенные объекты" +msgstr "Удаление выбранных моделей" -#: src/slic3r/GUI/Plater.cpp:5041 +#: src/slic3r/GUI/Plater.cpp:5123 msgid "Increase Instances" -msgstr "Добавить экземпляр" +msgstr "Добавление копии" -#: src/slic3r/GUI/Plater.cpp:5075 +#: src/slic3r/GUI/Plater.cpp:5157 msgid "Decrease Instances" -msgstr "Удалить экземпляр" +msgstr "Удаление копии" -#: src/slic3r/GUI/Plater.cpp:5106 +#: src/slic3r/GUI/Plater.cpp:5188 msgid "Enter the number of copies:" msgstr "Введите количество копий:" -#: src/slic3r/GUI/Plater.cpp:5107 +#: src/slic3r/GUI/Plater.cpp:5189 msgid "Copies of the selected object" -msgstr "Копии выделенного объекта" +msgstr "Количество копий выбранной модели" -#: src/slic3r/GUI/Plater.cpp:5111 +#: src/slic3r/GUI/Plater.cpp:5193 #, c-format msgid "Set numbers of copies to %d" -msgstr "Задать количество копий равным %d" +msgstr "Задать количество копий: %d" -#: src/slic3r/GUI/Plater.cpp:5177 +#: src/slic3r/GUI/Plater.cpp:5259 msgid "Cut by Plane" -msgstr "" +msgstr "Разрез по плоскости" -#: src/slic3r/GUI/Plater.cpp:5231 +#: src/slic3r/GUI/Plater.cpp:5316 msgid "Save G-code file as:" msgstr "Сохранить файл G-кода как:" -#: src/slic3r/GUI/Plater.cpp:5231 +#: src/slic3r/GUI/Plater.cpp:5316 msgid "Save SL1 file as:" -msgstr "Сохранить файл SL1 как:" +msgstr "Сохранить SL1 файл как:" -#: src/slic3r/GUI/Plater.cpp:5378 +#: src/slic3r/GUI/Plater.cpp:5463 #, c-format msgid "STL file exported to %s" -msgstr "STL-файл экспортирован в %s" +msgstr "STL файл экспортирован в %s" -#: src/slic3r/GUI/Plater.cpp:5395 +#: src/slic3r/GUI/Plater.cpp:5480 #, c-format msgid "AMF file exported to %s" -msgstr "AMF-файл экспортирован в %s" +msgstr "AMF файл экспортирован в %s" -#: src/slic3r/GUI/Plater.cpp:5398 +#: src/slic3r/GUI/Plater.cpp:5483 #, c-format msgid "Error exporting AMF file %s" -msgstr "Ошибка экспортирования AMF-файла %s" +msgstr "AMF файл экспортирован в %s" -#: src/slic3r/GUI/Plater.cpp:5427 +#: src/slic3r/GUI/Plater.cpp:5512 #, c-format msgid "3MF file exported to %s" -msgstr "3MF-файл экспортирован в %s" +msgstr "3MF файл экспортирован в %s" -#: src/slic3r/GUI/Plater.cpp:5432 +#: src/slic3r/GUI/Plater.cpp:5517 #, c-format msgid "Error exporting 3MF file %s" -msgstr "Ошибка экспортирования 3MF-файла %s" +msgstr "3MF файл экспортирован в %s" -#: src/slic3r/GUI/Plater.cpp:5961 +#: src/slic3r/GUI/Plater.cpp:6054 msgid "Export" msgstr "Экспорт" -#: src/slic3r/GUI/Plater.cpp:6056 +#: src/slic3r/GUI/Plater.cpp:6149 msgid "Paste From Clipboard" -msgstr "Вставить из буфера обмена" +msgstr "Вставка из буфера обмена" -#: src/slic3r/GUI/Preferences.cpp:24 src/slic3r/GUI/Tab.cpp:2098 -#: src/slic3r/GUI/Tab.cpp:2280 src/slic3r/GUI/Tab.cpp:2388 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1072 +#: src/slic3r/GUI/Preferences.cpp:56 src/slic3r/GUI/Tab.cpp:2098 +#: src/slic3r/GUI/Tab.cpp:2285 src/slic3r/GUI/Tab.cpp:2393 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1080 msgid "General" msgstr "Общие" -#: src/slic3r/GUI/Preferences.cpp:48 +#: src/slic3r/GUI/Preferences.cpp:69 msgid "Remember output directory" -msgstr "Запоминать каталог результата" +msgstr "Запоминать папку сохранения" -#: src/slic3r/GUI/Preferences.cpp:50 +#: src/slic3r/GUI/Preferences.cpp:71 msgid "" -"If this is enabled, Slic3r will prompt the last output directory instead of " -"the one containing the input files." +"If this is enabled, Slic3r will prompt the last output directory instead of the one " +"containing the input files." msgstr "" -"Если включено, при сохранении G-кода Slic3r откроет последний использованный " +"Если включено, при сохранении G-кода PrusaSlicer откроет последний использованный " "выходной каталог вместо того, где лежит исходный файл." -#: src/slic3r/GUI/Preferences.cpp:56 +#: src/slic3r/GUI/Preferences.cpp:77 msgid "Auto-center parts" -msgstr "Автоматическое центрирование частей" +msgstr "Автоцентровка моделей" -#: src/slic3r/GUI/Preferences.cpp:58 +#: src/slic3r/GUI/Preferences.cpp:79 msgid "" -"If this is enabled, Slic3r will auto-center objects around the print bed " -"center." -msgstr "" -"Если включено, Slic3r будет автоматически центрировать объекты вокруг центра " -"платформы печати." +"If this is enabled, Slic3r will auto-center objects around the print bed center." +msgstr "Если включено, PrusaSlicer будет автоматически центрировать модели на столе." -#: src/slic3r/GUI/Preferences.cpp:64 +#: src/slic3r/GUI/Preferences.cpp:85 msgid "Background processing" msgstr "Фоновая обработка" -#: src/slic3r/GUI/Preferences.cpp:66 +#: src/slic3r/GUI/Preferences.cpp:87 msgid "" -"If this is enabled, Slic3r will pre-process objects as soon as they're " -"loaded in order to save time when exporting G-code." +"If this is enabled, Slic3r will pre-process objects as soon as they're loaded in " +"order to save time when exporting G-code." msgstr "" -"Если включено, Slic3r будет предварительно просчитывать объекты при " -"загрузке, чтобы сэкономить время при экспорте G-кода." +"Если включено, PrusaSlicer будет предварительно просчитывать модели при загрузке, " +"чтобы сэкономить время при экспорте G-кода." -#: src/slic3r/GUI/Preferences.cpp:75 +#: src/slic3r/GUI/Preferences.cpp:96 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." +"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 "" -"Если включено, то PrusaSlicer проверяет наличие своих новых версий в сети. " -"Если доступна новая версия, то при следующем запуске отображается " -"уведомление (не отображается во время работы программы). Автоматическая " -"установка не производится. Вы увидите только уведомление." +"Если включено, то PrusaSlicer проверяет наличие новых версий в сети. Если доступна " +"новая версия при следующем запуске отображается уведомление (не во время работы " +"программы). Автоматическая установка не производится. Вы увидите только уведомление." -#: src/slic3r/GUI/Preferences.cpp:81 +#: src/slic3r/GUI/Preferences.cpp:102 msgid "Export sources full pathnames to 3mf and amf" -msgstr "Экспорт полных имён источников в 3mf и amf" +msgstr "При экспорте в 3mf, amf, сохранять полные пути к исходным файлам" -#: src/slic3r/GUI/Preferences.cpp:83 +#: src/slic3r/GUI/Preferences.cpp:104 msgid "" -"If enabled, allows the Reload from disk command to automatically find and " -"load the files when invoked." +"If enabled, allows the Reload from disk command to automatically find and load the " +"files when invoked." msgstr "" -"Если включено, позволяет команде перезагрузки с диска автоматически находить " -"и загружать файлы при вызове." +"Если включено, при выполнении команды \"Перезагрузить с диска\" программа будут " +"автоматически находить и загружать файлы проекта." -#: src/slic3r/GUI/Preferences.cpp:93 +#: src/slic3r/GUI/Preferences.cpp:114 msgid "If enabled, sets PrusaSlicer as default application to open .3mf files." msgstr "" +"Если включено, назначает PrusaSlicer в качестве приложения по умолчанию для " +"открытия .3mf файлов." -#: src/slic3r/GUI/Preferences.cpp:100 +#: src/slic3r/GUI/Preferences.cpp:121 msgid "If enabled, sets PrusaSlicer as default application to open .stl files." msgstr "" +"Если включено, назначает PrusaSlicer в качестве приложения по умолчанию для " +"открытия .stl файлов." -#: src/slic3r/GUI/Preferences.cpp:110 +#: src/slic3r/GUI/Preferences.cpp:131 msgid "" -"If enabled, Slic3r 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." +"If enabled, Slic3r 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 "" -"Если включено, то Slic3r будет загружать обновления встроенных системных " -"профилей в фоновом режиме. Эти обновления загружаются в отдельную временную " -"папку. Когда новые профили становятся доступны, они предлагаются при запуске " -"приложения." +"Если включено, то PrusaSlicer будет загружать обновления встроенных системных " +"профилей в фоновом режиме. Эти обновления загружаются в отдельную временную папку. " +"Когда новые профили становятся доступны, они предлагаются при запуске приложения." -#: src/slic3r/GUI/Preferences.cpp:115 +#: src/slic3r/GUI/Preferences.cpp:136 msgid "Suppress \" - default - \" presets" msgstr "Подавить профили по умолчанию" -#: src/slic3r/GUI/Preferences.cpp:117 +#: src/slic3r/GUI/Preferences.cpp:138 msgid "" -"Suppress \" - default - \" presets in the Print / Filament / Printer " -"selections once there are any other valid presets available." +"Suppress \" - default - \" presets in the Print / Filament / Printer selections " +"once there are any other valid presets available." msgstr "" -"Подавлять профили по умолчанию во вкладках Настройки печати/Настройки прутка/" -"Настройки принтера, при наличии других допустимых профилей." +"Подавлять профили по умолчанию во вкладках Настройки печати/Настройки прутка/Настройки принтера, " +"при наличии других допустимых профилей." -#: src/slic3r/GUI/Preferences.cpp:123 +#: src/slic3r/GUI/Preferences.cpp:144 msgid "Show incompatible print and filament presets" msgstr "Показывать несовместимые профили печати и прутка" -#: src/slic3r/GUI/Preferences.cpp:125 +#: src/slic3r/GUI/Preferences.cpp:146 msgid "" -"When checked, the print and filament presets are shown in the preset editor " -"even if they are marked as incompatible with the active printer" +"When checked, the print and filament presets are shown in the preset editor even if " +"they are marked as incompatible with the active printer" msgstr "" -"Если отмечено, то профили печати и прутка отображаются в редакторе профилей, " -"даже если они помечены как несовместимые с активным принтером" +"Если включено, то профили печати и прутка отображаются в редакторе профилей, даже " +"если они помечены как несовместимые с активным принтером." -#: src/slic3r/GUI/Preferences.cpp:131 +#: src/slic3r/GUI/Preferences.cpp:152 msgid "Show drop project dialog" -msgstr "" +msgstr "Диалоговое окно при перетаскивании файла-проекта" -#: src/slic3r/GUI/Preferences.cpp:133 +#: src/slic3r/GUI/Preferences.cpp:154 msgid "" -"When checked, whenever dragging and dropping a project file on the " -"application, shows a dialog asking to select the action to take on the file " -"to load." +"When checked, whenever dragging and dropping a project file on the application, " +"shows a dialog asking to select the action to take on the file to load." msgstr "" +"Если включено, то при каждом перетаскивании в приложение файла-проекта будет " +"отображается диалоговое окно с просьбой выбрать действие, которое необходимо " +"выполнить с файлом." -#: src/slic3r/GUI/Preferences.cpp:138 src/libslic3r/PrintConfig.cpp:3751 -msgid "Single instance mode" -msgstr "" +#: src/slic3r/GUI/Preferences.cpp:161 src/slic3r/GUI/Preferences.cpp:165 +msgid "Allow just a single PrusaSlicer instance" +msgstr "Только одни экземпляр программы" -#: src/slic3r/GUI/Preferences.cpp:141 +#: src/slic3r/GUI/Preferences.cpp:163 msgid "" -"On OSX there is always only one instance of app running by default. However " -"it is allowed to run multiple instances of same app from the command line. " -"In such case this settings will allow only one instance." +"On OSX there is always only one instance of app running by default. However it is " +"allowed to run multiple instances of same app from the command line. In such case " +"this settings will allow only one instance." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:143 +#: src/slic3r/GUI/Preferences.cpp:167 msgid "" -"If this is enabled, when starting PrusaSlicer and another instance of the " -"same PrusaSlicer is already running, that instance will be reactivated " -"instead." +"If this is enabled, when starting PrusaSlicer and another instance of the same " +"PrusaSlicer is already running, that instance will be reactivated instead." msgstr "" +"Если включено, разрешена работа только одного экземпляра той же самой версии " +"программы." -#: src/slic3r/GUI/Preferences.cpp:160 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:665 +#: src/slic3r/GUI/Preferences.cpp:173 src/slic3r/GUI/UnsavedChangesDialog.cpp:671 msgid "Ask for unsaved changes when closing application" -msgstr "" +msgstr "Запрос о несохраненных изменениях при закрытии приложения" -#: src/slic3r/GUI/Preferences.cpp:162 +#: src/slic3r/GUI/Preferences.cpp:175 msgid "When closing the application, always ask for unsaved changes" -msgstr "" +msgstr "Всегда спрашивать о несохраненных изменениях при закрытии приложения." -#: src/slic3r/GUI/Preferences.cpp:167 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:666 +#: src/slic3r/GUI/Preferences.cpp:180 src/slic3r/GUI/UnsavedChangesDialog.cpp:672 msgid "Ask for unsaved changes when selecting new preset" -msgstr "" +msgstr "Запрос о несохраненных изменениях при выборе нового профиля" -#: src/slic3r/GUI/Preferences.cpp:169 +#: src/slic3r/GUI/Preferences.cpp:182 msgid "Always ask for unsaved changes when selecting new preset" -msgstr "" +msgstr "Всегда спрашивать о несохраненных изменениях при выборе нового профиля." -#: src/slic3r/GUI/Preferences.cpp:177 +#: src/slic3r/GUI/Preferences.cpp:190 msgid "Associate .gcode files to PrusaSlicer G-code Viewer" -msgstr "" +msgstr "Ассоциировать файлы .gcode с PrusaSlicer G-code Viewer" -#: src/slic3r/GUI/Preferences.cpp:179 +#: src/slic3r/GUI/Preferences.cpp:192 msgid "" -"If enabled, sets PrusaSlicer G-code Viewer as default application to open ." -"gcode files." +"If enabled, sets PrusaSlicer G-code Viewer as default application to open .gcode " +"files." msgstr "" +"Если включено, назначает PrusaSlicer G-code Viewer в качестве приложения по " +"умолчанию для открытия .gcode файлов." -#: src/slic3r/GUI/Preferences.cpp:188 +#: src/slic3r/GUI/Preferences.cpp:201 msgid "Use Retina resolution for the 3D scene" -msgstr "" +msgstr "Использовать разрешение дисплея Retina для окна 3D-вида" -#: src/slic3r/GUI/Preferences.cpp:190 +#: src/slic3r/GUI/Preferences.cpp:203 msgid "" "If enabled, the 3D scene will be rendered in Retina resolution. If you are " "experiencing 3D performance problems, disabling this option may help." msgstr "" +"Если включено, окно 3D-вида будет отображаться с разрешением дисплея Retina. Если у " +"вас возникают проблемы с производительностью 3D, отключение этой опции может помочь." -#: src/slic3r/GUI/Preferences.cpp:198 src/slic3r/GUI/Preferences.cpp:200 +#: src/slic3r/GUI/Preferences.cpp:211 src/slic3r/GUI/Preferences.cpp:213 msgid "Show splash screen" -msgstr "" +msgstr "Показывать заставку при запуске программы" -#: src/slic3r/GUI/Preferences.cpp:207 +#: src/slic3r/GUI/Preferences.cpp:220 msgid "Enable support for legacy 3DConnexion devices" -msgstr "" +msgstr "Включить поддержку устаревших устройств 3DConnexion" -#: src/slic3r/GUI/Preferences.cpp:209 +#: src/slic3r/GUI/Preferences.cpp:222 msgid "" -"If enabled, the legacy 3DConnexion devices settings dialog is available by " -"pressing CTRL+M" +"If enabled, the legacy 3DConnexion devices settings dialog is available by pressing " +"CTRL+M" msgstr "" +"Если включено, диалоговое окно настроек устаревших устройств 3DConnexion будет " +"доступно при нажатии CTRL+M." -#: src/slic3r/GUI/Preferences.cpp:218 +#: src/slic3r/GUI/Preferences.cpp:232 msgid "Camera" msgstr "Камера" -#: src/slic3r/GUI/Preferences.cpp:224 +#: src/slic3r/GUI/Preferences.cpp:237 msgid "Use perspective camera" -msgstr "Использовать перспективную камера" +msgstr "Использовать вид в перспективе" -#: src/slic3r/GUI/Preferences.cpp:226 -msgid "" -"If enabled, use perspective camera. If not enabled, use orthographic camera." -msgstr "" -"Если включено, то используется перспективная камера. Если нет, то " -"ортогональная камера." +#: src/slic3r/GUI/Preferences.cpp:239 +msgid "If enabled, use perspective camera. If not enabled, use orthographic camera." +msgstr "Если включено, используется вид в перспективе, иначе - ортогональный." -#: src/slic3r/GUI/Preferences.cpp:231 +#: src/slic3r/GUI/Preferences.cpp:244 msgid "Use free camera" msgstr "Использовать свободную камеру" -#: src/slic3r/GUI/Preferences.cpp:233 +#: src/slic3r/GUI/Preferences.cpp:246 msgid "If enabled, use free camera. If not enabled, use constrained camera." msgstr "" -"Если включено, то используется свободная камера. Если нет, то закреплённая " -"камера." +"Если включено, используется свободное вращение камеры. Если выключено, используется " +"вращение камера с ограничениями." -#: src/slic3r/GUI/Preferences.cpp:238 +#: src/slic3r/GUI/Preferences.cpp:251 msgid "Reverse direction of zoom with mouse wheel" -msgstr "" +msgstr "Обратное направление масштабирования колесиком мыши" -#: src/slic3r/GUI/Preferences.cpp:240 +#: src/slic3r/GUI/Preferences.cpp:253 msgid "If enabled, reverses the direction of zoom with mouse wheel" -msgstr "" +msgstr "Если включено, меняется направление масштабирования с помощью колеса мыши." -#: src/slic3r/GUI/Preferences.cpp:247 +#: src/slic3r/GUI/Preferences.cpp:261 msgid "GUI" -msgstr "Графический интерфейс" +msgstr "Интерфейс программы" -#: src/slic3r/GUI/Preferences.cpp:262 -msgid "Show sidebar collapse/expand button" -msgstr "" +#: src/slic3r/GUI/Preferences.cpp:276 +msgid "Sequential slider applied only to top layer" +msgstr "Ползунок положения инструмента применяется только к верхнему слою" -#: src/slic3r/GUI/Preferences.cpp:264 +#: src/slic3r/GUI/Preferences.cpp:278 msgid "" -"If enabled, the button for the collapse sidebar will be appeared in top " -"right corner of the 3D Scene" +"If enabled, changes made using the sequential slider, in preview, apply only to " +"gcode top layer. If disabled, changes made using the sequential slider, in preview, " +"apply to the whole gcode." msgstr "" -"Если включено, то в верхнем правом углу 3D-сцены появится кнопка скрытия " -"боковой панели" +"Если включено, изменения, сделанные с помощью ползунка положения инструмента, в " +"окне предпросмотра нарезки, применяются только к верхнему слою G-коду. Если " +"отключено, изменения, сделанные с помощью ползунка положения инструмента, в окне " +"предпросмотра нарезки, применяются ко всему G-коду." -#: src/slic3r/GUI/Preferences.cpp:269 -msgid "Use custom size for toolbar icons" -msgstr "Использовать задаваемый размер значков панели инструментов" +#: src/slic3r/GUI/Preferences.cpp:285 +msgid "Show sidebar collapse/expand button" +msgstr "Показать кнопку свертывания/раскрытия боковой панели" -#: src/slic3r/GUI/Preferences.cpp:271 -msgid "If enabled, you can change size of toolbar icons manually." -msgstr "Если включено, то вы можете задать размер значков панели инструментов." +#: src/slic3r/GUI/Preferences.cpp:287 +msgid "" +"If enabled, the button for the collapse sidebar will be appeared in top right " +"corner of the 3D Scene" +msgstr "" +"Если включено, в правом верхнем углу 3D-сцены появится кнопка свертывания боковой " +"панели." -#: src/slic3r/GUI/Preferences.cpp:276 +#: src/slic3r/GUI/Preferences.cpp:292 msgid "Suppress to open hyperlink in browser" -msgstr "" +msgstr "Запретить открытие гиперссылок в браузере" -#: src/slic3r/GUI/Preferences.cpp:278 +#: src/slic3r/GUI/Preferences.cpp:294 msgid "" -"If enabled, the descriptions of configuration parameters in settings tabs " -"wouldn't work as hyperlinks. If disabled, the descriptions of configuration " -"parameters in settings tabs will work as hyperlinks." +"If enabled, the descriptions of configuration parameters in settings tabs wouldn't " +"work as hyperlinks. If disabled, the descriptions of configuration parameters in " +"settings tabs will work as hyperlinks." msgstr "" +"Если включено, то работа гиперссылок описаний параметров во вкладках настроек будет " +"отключена." -#: src/slic3r/GUI/Preferences.cpp:285 -msgid "Sequential slider applied only to top layer" -msgstr "" +#: src/slic3r/GUI/Preferences.cpp:300 +msgid "Use custom size for toolbar icons" +msgstr "Использовать нестандартный размер значков панели инструментов" -#: src/slic3r/GUI/Preferences.cpp:287 -msgid "" -"If enabled, changes made using the sequential slider, in preview, apply only " -"to gcode top layer. If disabled, changes made using the sequential slider, " -"in preview, apply to the whole gcode." -msgstr "" +#: src/slic3r/GUI/Preferences.cpp:302 +msgid "If enabled, you can change size of toolbar icons manually." +msgstr "Если включено, вы можете изменить размер значков панели инструментов вручную." -#: src/slic3r/GUI/Preferences.cpp:304 +#: src/slic3r/GUI/Preferences.cpp:320 msgid "Render" -msgstr "Отрисовка" +msgstr "Визуализация" -#: src/slic3r/GUI/Preferences.cpp:310 +#: src/slic3r/GUI/Preferences.cpp:325 msgid "Use environment map" -msgstr "Использовать карту окружения" +msgstr "Использовать карты окружения" -#: src/slic3r/GUI/Preferences.cpp:312 +#: src/slic3r/GUI/Preferences.cpp:327 msgid "If enabled, renders object using the environment map." -msgstr "" -"Если включено, то объекты отрисовываются с использованием карты окружения." +msgstr "Если включено, визуализация моделей выполняется с помощью карты окружения." -#: src/slic3r/GUI/Preferences.cpp:345 +#: src/slic3r/GUI/Preferences.cpp:352 #, c-format msgid "You need to restart %s to make the changes effective." msgstr "Необходимо перезапустить %s, чтобы изменения вступили в силу." -#: src/slic3r/GUI/Preferences.cpp:420 +#: src/slic3r/GUI/Preferences.cpp:427 msgid "Icon size in a respect to the default size" -msgstr "Размер значка по отношению к размеру по умолчанию" +msgstr "Размер значка относительно размера по умолчанию" -#: src/slic3r/GUI/Preferences.cpp:435 +#: src/slic3r/GUI/Preferences.cpp:442 msgid "Select toolbar icon size in respect to the default one." -msgstr "Выберите размер значка по отношению к размеру по умолчанию." +msgstr "" +"Выбор размера значка панели инструментов по отношению к значению по умолчанию." -#: src/slic3r/GUI/Preferences.cpp:466 +#: src/slic3r/GUI/Preferences.cpp:473 msgid "Old regular layout with the tab bar" -msgstr "" +msgstr "Старая обычная компоновка с вкладками на столе" -#: src/slic3r/GUI/Preferences.cpp:467 +#: src/slic3r/GUI/Preferences.cpp:474 msgid "New layout, access via settings button in the top menu" -msgstr "" +msgstr "Новая компоновка с кнопкой настроек в верхнем меню" -#: src/slic3r/GUI/Preferences.cpp:468 +#: src/slic3r/GUI/Preferences.cpp:475 msgid "Settings in non-modal window" -msgstr "" +msgstr "Настройки будут отображаться в отдельном окне" -#: src/slic3r/GUI/Preferences.cpp:477 +#: src/slic3r/GUI/Preferences.cpp:484 msgid "Layout Options" -msgstr "" +msgstr "Настройка внешнего вида" -#: src/slic3r/GUI/PresetComboBoxes.cpp:197 -#: src/slic3r/GUI/PresetComboBoxes.cpp:235 -#: src/slic3r/GUI/PresetComboBoxes.cpp:761 -#: src/slic3r/GUI/PresetComboBoxes.cpp:811 -#: src/slic3r/GUI/PresetComboBoxes.cpp:925 -#: src/slic3r/GUI/PresetComboBoxes.cpp:969 +#: src/slic3r/GUI/PresetComboBoxes.cpp:197 src/slic3r/GUI/PresetComboBoxes.cpp:235 +#: src/slic3r/GUI/PresetComboBoxes.cpp:761 src/slic3r/GUI/PresetComboBoxes.cpp:811 +#: src/slic3r/GUI/PresetComboBoxes.cpp:925 src/slic3r/GUI/PresetComboBoxes.cpp:969 msgid "System presets" msgstr "Системные профили" -#: src/slic3r/GUI/PresetComboBoxes.cpp:239 -#: src/slic3r/GUI/PresetComboBoxes.cpp:815 +#: src/slic3r/GUI/PresetComboBoxes.cpp:239 src/slic3r/GUI/PresetComboBoxes.cpp:815 #: src/slic3r/GUI/PresetComboBoxes.cpp:973 msgid "User presets" msgstr "Пользовательские профили" #: src/slic3r/GUI/PresetComboBoxes.cpp:250 msgid "Incompatible presets" -msgstr "" +msgstr "Несовместимые профили" #: src/slic3r/GUI/PresetComboBoxes.cpp:285 msgid "Are you sure you want to delete \"%1%\" printer?" -msgstr "" +msgstr "Вы уверены, что хотите удалить принтер \"%1%\"?" #: src/slic3r/GUI/PresetComboBoxes.cpp:287 msgid "Delete Physical Printer" -msgstr "" +msgstr "Удалить физический принтер" #: src/slic3r/GUI/PresetComboBoxes.cpp:624 msgid "Click to edit preset" -msgstr "Щёлкните для редактирования" +msgstr "Нажмите, чтобы изменить профиль" -#: src/slic3r/GUI/PresetComboBoxes.cpp:680 -#: src/slic3r/GUI/PresetComboBoxes.cpp:710 +#: src/slic3r/GUI/PresetComboBoxes.cpp:680 src/slic3r/GUI/PresetComboBoxes.cpp:710 msgid "Add/Remove presets" -msgstr "" +msgstr "Добавить/удалить профиль" -#: src/slic3r/GUI/PresetComboBoxes.cpp:685 -#: src/slic3r/GUI/PresetComboBoxes.cpp:715 src/slic3r/GUI/Tab.cpp:2985 +#: src/slic3r/GUI/PresetComboBoxes.cpp:685 src/slic3r/GUI/PresetComboBoxes.cpp:715 +#: src/slic3r/GUI/Tab.cpp:2990 msgid "Add physical printer" -msgstr "" +msgstr "Добавить физический профиль" #: src/slic3r/GUI/PresetComboBoxes.cpp:699 msgid "Edit preset" -msgstr "" +msgstr "Изменить профиль" -#: src/slic3r/GUI/PresetComboBoxes.cpp:703 src/slic3r/GUI/Tab.cpp:2985 +#: src/slic3r/GUI/PresetComboBoxes.cpp:703 src/slic3r/GUI/Tab.cpp:2990 msgid "Edit physical printer" -msgstr "" +msgstr "Изменить физический профиль" #: src/slic3r/GUI/PresetComboBoxes.cpp:706 msgid "Delete physical printer" -msgstr "" +msgstr "Удалить физический принтер" -#: src/slic3r/GUI/PresetComboBoxes.cpp:826 -#: src/slic3r/GUI/PresetComboBoxes.cpp:987 +#: src/slic3r/GUI/PresetComboBoxes.cpp:826 src/slic3r/GUI/PresetComboBoxes.cpp:987 msgid "Physical printers" -msgstr "" +msgstr "Физические принтеры" #: src/slic3r/GUI/PresetComboBoxes.cpp:850 msgid "Add/Remove filaments" -msgstr "Добавление/Удаление прутков" +msgstr "Добавить/удалить пруток" #: src/slic3r/GUI/PresetComboBoxes.cpp:852 msgid "Add/Remove materials" -msgstr "Добавление/Удаление материалов" +msgstr "Добавить/удалить материал" -#: src/slic3r/GUI/PresetComboBoxes.cpp:854 -#: src/slic3r/GUI/PresetComboBoxes.cpp:1011 +#: src/slic3r/GUI/PresetComboBoxes.cpp:854 src/slic3r/GUI/PresetComboBoxes.cpp:1011 msgid "Add/Remove printers" -msgstr "Добавление/Удаление принтеров" +msgstr "Добавить/удалить принтер" -#: src/slic3r/GUI/PresetHints.cpp:28 +#: src/slic3r/GUI/PresetHints.cpp:32 msgid "" -"If estimated layer time is below ~%1%s, fan will run at %2%%% and print " -"speed will be reduced so that no less than %3%s are spent on that layer " -"(however, speed will never be reduced below %4%mm/s)." +"If estimated layer time is below ~%1%s, fan will run at %2%%% and print speed will " +"be reduced so that no less than %3%s are spent on that layer (however, speed will " +"never be reduced below %4%mm/s)." msgstr "" -"Если расчётное время печати слоя меньше ~%1%с, вентилятор будет работать на " -"%2%%%, а скорость печати будет уменьшена так, что на этот слой будет " -"затрачено не менее %3%с (однако, скорость никогда не будет уменьшена ниже " -"%4%мм/с)." +"Если расчётное время печати слоя меньше ~%1% сек., вентилятор будет работать на %2%%" +"%, а скорость печати будет уменьшена, так что на этот слой будет затрачено не менее " +"%3% сек. (однако скорость никогда не будет уменьшена ниже %4%мм/с)." -#: src/slic3r/GUI/PresetHints.cpp:35 +#: src/slic3r/GUI/PresetHints.cpp:39 msgid "" "If estimated layer time is greater, but still below ~%1%s, fan will run at a " "proportionally decreasing speed between %2%%% and %3%%%." msgstr "" -"Если расчётное время слоя большое, но всё ещё ниже ~%1%с, вентилятор будет " -"работать с плавно падающей скоростью между %2%%% и %3%%%." +"Если расчётное время печати слоя большое, но всё ещё ниже ~%1% сек., вентилятор " +"будет работать с плавно падающей скоростью между %2%%%-%3%%%." -#: src/slic3r/GUI/PresetHints.cpp:39 -msgid "During the other layers, fan" -msgstr "Во время печати других слоёв, вентилятор" +#: src/slic3r/GUI/PresetHints.cpp:49 +msgid "Fan speed will be ramped from zero at layer %1% to %2%%% at layer %3%." +msgstr "Скорость вентилятора будет увеличена с нуля на %1% слое до %2%%% на %3% слое." -#: src/slic3r/GUI/PresetHints.cpp:41 -msgid "Fan" -msgstr "Вентилятор" +#: src/slic3r/GUI/PresetHints.cpp:51 +msgid "During the other layers, fan will always run at %1%%%" +msgstr "Во время печати других слоёв, вентилятор всегда будет работать на %1%%%\"" -#: src/slic3r/GUI/PresetHints.cpp:47 -msgid "will always run at %1%%%" -msgstr "всегда будет работать на %1%%%" +#: src/slic3r/GUI/PresetHints.cpp:51 +msgid "Fan will always run at %1%%%" +msgstr "Вентилятор всегда будет работать на %1%%%" -#: src/slic3r/GUI/PresetHints.cpp:50 +#: src/slic3r/GUI/PresetHints.cpp:53 msgid "except for the first %1% layers." msgstr ", за исключением первых %1% слоёв." -#: src/slic3r/GUI/PresetHints.cpp:52 +#: src/slic3r/GUI/PresetHints.cpp:55 msgid "except for the first layer." msgstr ", за исключением первого слоя." -#: src/slic3r/GUI/PresetHints.cpp:54 -msgid "will be turned off." -msgstr "отключён." +#: src/slic3r/GUI/PresetHints.cpp:58 +msgid "During the other layers, fan will be turned off." +msgstr "Во время печати других слоёв, вентилятор будет выключен." + +#: src/slic3r/GUI/PresetHints.cpp:58 +msgid "Fan will be turned off." +msgstr "Вентилятор будет выключен." -#: src/slic3r/GUI/PresetHints.cpp:155 +#: src/slic3r/GUI/PresetHints.cpp:159 msgid "external perimeters" msgstr "внешних периметров" -#: src/slic3r/GUI/PresetHints.cpp:164 +#: src/slic3r/GUI/PresetHints.cpp:168 msgid "perimeters" msgstr "периметры" -#: src/slic3r/GUI/PresetHints.cpp:173 +#: src/slic3r/GUI/PresetHints.cpp:177 msgid "infill" -msgstr "заполнение" +msgstr "заполнения" -#: src/slic3r/GUI/PresetHints.cpp:183 +#: src/slic3r/GUI/PresetHints.cpp:187 msgid "solid infill" msgstr "сплошные слои заполнения" -#: src/slic3r/GUI/PresetHints.cpp:191 +#: src/slic3r/GUI/PresetHints.cpp:195 msgid "top solid infill" msgstr "верхние сплошные слои заполнения" -#: src/slic3r/GUI/PresetHints.cpp:202 +#: src/slic3r/GUI/PresetHints.cpp:206 msgid "support" msgstr "поддержки" -#: src/slic3r/GUI/PresetHints.cpp:212 +#: src/slic3r/GUI/PresetHints.cpp:216 msgid "support interface" msgstr "связующая слой поддержки" -#: src/slic3r/GUI/PresetHints.cpp:218 +#: src/slic3r/GUI/PresetHints.cpp:222 msgid "First layer volumetric" msgstr "Объёмный расход первого слоя" -#: src/slic3r/GUI/PresetHints.cpp:218 +#: src/slic3r/GUI/PresetHints.cpp:222 msgid "Bridging volumetric" msgstr "Объёмный расход мостов" -#: src/slic3r/GUI/PresetHints.cpp:218 +#: src/slic3r/GUI/PresetHints.cpp:222 msgid "Volumetric" msgstr "Объёмный расход" -#: src/slic3r/GUI/PresetHints.cpp:219 +#: src/slic3r/GUI/PresetHints.cpp:223 msgid "flow rate is maximized" -msgstr "скорость потока максимальна" +msgstr "увеличивается" -#: src/slic3r/GUI/PresetHints.cpp:222 +#: src/slic3r/GUI/PresetHints.cpp:226 msgid "by the print profile maximum" msgstr "по максимальному значению для профилю печати" -#: src/slic3r/GUI/PresetHints.cpp:223 +#: src/slic3r/GUI/PresetHints.cpp:227 msgid "when printing" msgstr "при печати" -#: src/slic3r/GUI/PresetHints.cpp:224 +#: src/slic3r/GUI/PresetHints.cpp:228 msgid "with a volumetric rate" msgstr "с объёмной скоростью" -#: src/slic3r/GUI/PresetHints.cpp:228 +#: src/slic3r/GUI/PresetHints.cpp:232 #, c-format msgid "%3.2f mm³/s at filament speed %3.2f mm/s." -msgstr "%3.2f мм³/с при скорости пластиковой нити %3.2f мм/с." +msgstr "%3.2f мм³/с при скорости прутка %3.2f мм/с." -#: src/slic3r/GUI/PresetHints.cpp:246 +#: src/slic3r/GUI/PresetHints.cpp:250 msgid "" -"Recommended object thin wall thickness: Not available due to invalid layer " -"height." +"Recommended object thin wall thickness: Not available due to invalid layer height." msgstr "" -"Рекомендуемая толщина тонких стенок объекта: недоступно из-за недопустимой " -"высоты слоя." +"Рекомендуемая толщина тонких стенок модели: недоступно из-за недопустимой высоты " +"слоя." -#: src/slic3r/GUI/PresetHints.cpp:262 +#: src/slic3r/GUI/PresetHints.cpp:266 #, c-format msgid "Recommended object thin wall thickness for layer height %.2f and" -msgstr "" -"Рекомендуемая толщина тонких стенок объекта для слоя с высотой %.2f мм и" +msgstr "Рекомендуемая толщина тонких стенок модели при высоте слоя %.2f мм и" -#: src/slic3r/GUI/PresetHints.cpp:269 +#: src/slic3r/GUI/PresetHints.cpp:273 #, c-format msgid "%d lines: %.2f mm" -msgstr "%d линий: %.2f мм" +msgstr "%d линий периметра - %.2f мм" -#: src/slic3r/GUI/PresetHints.cpp:273 +#: src/slic3r/GUI/PresetHints.cpp:277 msgid "" -"Recommended object thin wall thickness: Not available due to excessively " -"small extrusion width." +"Recommended object thin wall thickness: Not available due to excessively small " +"extrusion width." msgstr "" -"Рекомендуемая толщина тонких стенок объекта: недоступно из-за недопустимо " -"малой ширины экструзии." +"Рекомендуемая толщина тонких стенок модели: недоступно из-за чрезмерно малой ширины " +"экструзии." -#: src/slic3r/GUI/PresetHints.cpp:302 -msgid "" -"Top / bottom shell thickness hint: Not available due to invalid layer height." +#: src/slic3r/GUI/PresetHints.cpp:306 +msgid "Top / bottom shell thickness hint: Not available due to invalid layer height." msgstr "" -"Рекомендуемая толщина верхней/нижней оболочки: недоступно из-за недопустимой " -"высоты слоя." +"Подсказка о толщине верхней/нижней оболочки недоступна из-за неправильной высоты " +"слоя." -#: src/slic3r/GUI/PresetHints.cpp:315 +#: src/slic3r/GUI/PresetHints.cpp:319 msgid "Top shell is %1% mm thick for layer height %2% mm." -msgstr "Толщина верхней оболочки равна %1% мм для высоты слоя в %2% мм." +msgstr "Верхняя оболочка будет имеет толщину %1% мм при высоте слоя %2% мм." -#: src/slic3r/GUI/PresetHints.cpp:318 +#: src/slic3r/GUI/PresetHints.cpp:322 msgid "Minimum top shell thickness is %1% mm." -msgstr "Минимальная толщина верхней оболочки равна %1% мм." +msgstr "Минимальная толщина оболочки сверху составляет %1% мм." -#: src/slic3r/GUI/PresetHints.cpp:321 +#: src/slic3r/GUI/PresetHints.cpp:325 msgid "Top is open." -msgstr "Нет верхней оболочки." +msgstr "Оболочки сверху (крыша) отсутствуют." -#: src/slic3r/GUI/PresetHints.cpp:334 +#: src/slic3r/GUI/PresetHints.cpp:338 msgid "Bottom shell is %1% mm thick for layer height %2% mm." -msgstr "Толщина нижней оболочки равна %1% мм для высоты слоя в %2% мм." +msgstr "Нижняя оболочка будет имеет толщину %1% мм при высоте слоя %2% мм." -#: src/slic3r/GUI/PresetHints.cpp:337 +#: src/slic3r/GUI/PresetHints.cpp:341 msgid "Minimum bottom shell thickness is %1% mm." -msgstr "Минимальная толщина нижней оболочки равна %1% мм." +msgstr "Минимальная толщина оболочки снизу составляет %1% мм." -#: src/slic3r/GUI/PresetHints.cpp:340 +#: src/slic3r/GUI/PresetHints.cpp:344 msgid "Bottom is open." -msgstr "Нет нижней оболочки." +msgstr "Оболочки снизу (дно) отсутствуют." -#: src/slic3r/GUI/PrintHostDialogs.cpp:34 +#: src/slic3r/GUI/PrintHostDialogs.cpp:35 msgid "Send G-Code to printer host" -msgstr "Послать G-код на узел печати" +msgstr "Отправить G-кода на хост принтера" -#: src/slic3r/GUI/PrintHostDialogs.cpp:34 +#: src/slic3r/GUI/PrintHostDialogs.cpp:35 msgid "Upload to Printer Host with the following filename:" -msgstr "Загрузить на узел печати со следующим именем файла:" +msgstr "Загрузить на хост принтера со следующим именем:" -#: src/slic3r/GUI/PrintHostDialogs.cpp:36 +#: src/slic3r/GUI/PrintHostDialogs.cpp:37 msgid "Start printing after upload" msgstr "Начать печать после загрузки" -#: src/slic3r/GUI/PrintHostDialogs.cpp:44 +#: src/slic3r/GUI/PrintHostDialogs.cpp:45 msgid "Use forward slashes ( / ) as a directory separator if needed." msgstr "" -"При необходимости используйте косую черту ( / ) в качестве разделителя " -"каталогов." +"При необходимости используйте косую черту ( / ) в качестве разделителя каталогов." -#: src/slic3r/GUI/PrintHostDialogs.cpp:57 +#: src/slic3r/GUI/PrintHostDialogs.cpp:58 msgid "Group" -msgstr "" +msgstr "Группа" -#: src/slic3r/GUI/PrintHostDialogs.cpp:174 +#: src/slic3r/GUI/PrintHostDialogs.cpp:176 msgid "ID" msgstr "ID" -#: src/slic3r/GUI/PrintHostDialogs.cpp:175 +#: src/slic3r/GUI/PrintHostDialogs.cpp:177 msgid "Progress" -msgstr "Ход выполнения" +msgstr "Прогресс" -#: src/slic3r/GUI/PrintHostDialogs.cpp:176 +#: src/slic3r/GUI/PrintHostDialogs.cpp:178 msgid "Status" -msgstr "Состояние" +msgstr "Статус" -#: src/slic3r/GUI/PrintHostDialogs.cpp:177 +#: src/slic3r/GUI/PrintHostDialogs.cpp:179 msgid "Host" -msgstr "Узел" +msgstr "Хост" -#: src/slic3r/GUI/PrintHostDialogs.cpp:178 +#: src/slic3r/GUI/PrintHostDialogs.cpp:180 msgid "Filename" -msgstr "Файл" +msgstr "Имя файла" -#: src/slic3r/GUI/PrintHostDialogs.cpp:179 +#: src/slic3r/GUI/PrintHostDialogs.cpp:181 msgid "Error Message" msgstr "Сообщение об ошибке" -#: src/slic3r/GUI/PrintHostDialogs.cpp:182 +#: src/slic3r/GUI/PrintHostDialogs.cpp:184 msgid "Cancel selected" msgstr "Отменить выбранное" -#: src/slic3r/GUI/PrintHostDialogs.cpp:184 +#: src/slic3r/GUI/PrintHostDialogs.cpp:186 msgid "Show error message" msgstr "Показать сообщение об ошибке" -#: src/slic3r/GUI/PrintHostDialogs.cpp:226 -#: src/slic3r/GUI/PrintHostDialogs.cpp:257 +#: src/slic3r/GUI/PrintHostDialogs.cpp:228 src/slic3r/GUI/PrintHostDialogs.cpp:261 msgid "Enqueued" -msgstr "В очереди" +msgstr "Поставлено в очередь" -#: src/slic3r/GUI/PrintHostDialogs.cpp:258 +#: src/slic3r/GUI/PrintHostDialogs.cpp:262 msgid "Uploading" -msgstr "Загружается" +msgstr "Отправка" -#: src/slic3r/GUI/PrintHostDialogs.cpp:262 +#: src/slic3r/GUI/PrintHostDialogs.cpp:266 msgid "Completed" msgstr "Завершено" -#: src/slic3r/GUI/PrintHostDialogs.cpp:300 +#: src/slic3r/GUI/PrintHostDialogs.cpp:304 msgid "Error uploading to print host:" -msgstr "Ошибка при загрузке на узел печати:" +msgstr "Ошибка при отправке на хост печати:" #: src/slic3r/GUI/RammingChart.cpp:23 msgid "NO RAMMING AT ALL" msgstr "НЕ ДОПУСКАТЬ РЭММИНГ" #: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/WipeTowerDialog.cpp:83 -#: src/libslic3r/PrintConfig.cpp:689 src/libslic3r/PrintConfig.cpp:733 -#: src/libslic3r/PrintConfig.cpp:748 src/libslic3r/PrintConfig.cpp:2604 -#: src/libslic3r/PrintConfig.cpp:2613 src/libslic3r/PrintConfig.cpp:2723 -#: src/libslic3r/PrintConfig.cpp:2731 src/libslic3r/PrintConfig.cpp:2739 -#: src/libslic3r/PrintConfig.cpp:2746 src/libslic3r/PrintConfig.cpp:2754 -#: src/libslic3r/PrintConfig.cpp:2762 +#: src/libslic3r/PrintConfig.cpp:706 src/libslic3r/PrintConfig.cpp:750 +#: src/libslic3r/PrintConfig.cpp:765 src/libslic3r/PrintConfig.cpp:2636 +#: src/libslic3r/PrintConfig.cpp:2645 src/libslic3r/PrintConfig.cpp:2755 +#: src/libslic3r/PrintConfig.cpp:2763 src/libslic3r/PrintConfig.cpp:2771 +#: src/libslic3r/PrintConfig.cpp:2778 src/libslic3r/PrintConfig.cpp:2786 +#: src/libslic3r/PrintConfig.cpp:2794 msgid "s" msgstr "с" @@ -6419,8 +6625,8 @@ msgstr "с" msgid "Volumetric speed" msgstr "Объёмная скорость подачи" -#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:646 -#: src/libslic3r/PrintConfig.cpp:1430 +#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:663 +#: src/libslic3r/PrintConfig.cpp:1458 msgid "mm³/s" msgstr "мм³/с" @@ -6431,7 +6637,7 @@ msgstr "Сохранить %s как:" #: src/slic3r/GUI/SavePresetDialog.cpp:110 msgid "the following suffix is not allowed:" -msgstr "следующий суффикс не допускается:" +msgstr "следующий суффикс не разрешается:" #: src/slic3r/GUI/SavePresetDialog.cpp:116 msgid "The supplied name is not available." @@ -6447,394 +6653,403 @@ msgstr "Невозможно перезаписать внешний профи #: src/slic3r/GUI/SavePresetDialog.cpp:134 msgid "Preset with name \"%1%\" already exists." -msgstr "Профиль с именем «%1%» уже существует." +msgstr "Профиль с именем \"%1%\" уже существует." #: src/slic3r/GUI/SavePresetDialog.cpp:136 msgid "" -"Preset with name \"%1%\" already exists and is imcopatible with selected " -"printer." -msgstr "" +"Preset with name \"%1%\" already exists and is incompatible with selected printer." +msgstr "Профиль с именем \"%1%\" уже существует и несовместим с выбранным принтером." #: src/slic3r/GUI/SavePresetDialog.cpp:137 msgid "Note: This preset will be replaced after saving" -msgstr "" +msgstr "Примечание: этот профиль будет заменён после сохранения" #: src/slic3r/GUI/SavePresetDialog.cpp:142 msgid "The name cannot be empty." -msgstr "" +msgstr "Данное имя не может быть пустым." + +#: src/slic3r/GUI/SavePresetDialog.cpp:147 +msgid "The name cannot start with space character." +msgstr "Имя не должно начитаться с пробела." -#: src/slic3r/GUI/SavePresetDialog.cpp:176 -#: src/slic3r/GUI/SavePresetDialog.cpp:182 +#: src/slic3r/GUI/SavePresetDialog.cpp:152 +msgid "The name cannot end with space character." +msgstr "Имя не должно заканчиваться пробелом." + +#: src/slic3r/GUI/SavePresetDialog.cpp:186 src/slic3r/GUI/SavePresetDialog.cpp:192 msgid "Save preset" -msgstr "Сохранить профиль" +msgstr "Сохранение профиля" -#: src/slic3r/GUI/SavePresetDialog.cpp:205 +#: src/slic3r/GUI/SavePresetDialog.cpp:215 msgctxt "PresetName" msgid "Copy" msgstr "Копия" -#: src/slic3r/GUI/SavePresetDialog.cpp:263 +#: src/slic3r/GUI/SavePresetDialog.cpp:273 msgid "" "You have selected physical printer \"%1%\" \n" "with related printer preset \"%2%\"" msgstr "" +"Выбран физический принтер \"%1%\" со \n" +"связанным профилем принтера \"%2%\"" -#: src/slic3r/GUI/SavePresetDialog.cpp:296 +#: src/slic3r/GUI/SavePresetDialog.cpp:306 msgid "What would you like to do with \"%1%\" preset after saving?" -msgstr "" +msgstr "Что вы хотите сделать с профилем \"%1%\" после сохранения?" -#: src/slic3r/GUI/SavePresetDialog.cpp:299 +#: src/slic3r/GUI/SavePresetDialog.cpp:309 msgid "Change \"%1%\" to \"%2%\" for this physical printer \"%3%\"" -msgstr "" +msgstr "Сменить \"%1%\" на \"%2%\" для этого физического принтера \"%3%\"" -#: src/slic3r/GUI/SavePresetDialog.cpp:300 +#: src/slic3r/GUI/SavePresetDialog.cpp:310 msgid "Add \"%1%\" as a next preset for the the physical printer \"%2%\"" msgstr "" +"Добавить \"%1%\" в качестве следующего профиля для физического принтера \"%2%\"" -#: src/slic3r/GUI/SavePresetDialog.cpp:301 +#: src/slic3r/GUI/SavePresetDialog.cpp:311 msgid "Just switch to \"%1%\" preset" -msgstr "" +msgstr "Просто переключиться на профиль \"%1%\"" -#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2416 +#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2421 msgid "Stealth" -msgstr "Тихий" +msgstr "Тихий режим" -#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2410 +#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2415 msgid "Normal" -msgstr "Нормальный" +msgstr "Нормальный режим" #: src/slic3r/GUI/Selection.cpp:172 msgid "Selection-Add" -msgstr "Выбор-добавление" +msgstr "Выбор\\Добавление" #: src/slic3r/GUI/Selection.cpp:213 msgid "Selection-Remove" -msgstr "Выбор-удаление" +msgstr "Выбор\\Удаление" #: src/slic3r/GUI/Selection.cpp:245 msgid "Selection-Add Object" -msgstr "Выбор-добавление объекта" +msgstr "Выбор\\Добавление модели" #: src/slic3r/GUI/Selection.cpp:264 msgid "Selection-Remove Object" -msgstr "Выбор-удаление объекта" +msgstr "Выбор\\Удаление модели" #: src/slic3r/GUI/Selection.cpp:282 msgid "Selection-Add Instance" -msgstr "Выбор-добавление экземпляра" +msgstr "Выбор\\Добавление копии" #: src/slic3r/GUI/Selection.cpp:301 msgid "Selection-Remove Instance" -msgstr "Выбор-удаление экземпляра" +msgstr "Выбор\\Удаление копии" #: src/slic3r/GUI/Selection.cpp:402 msgid "Selection-Add All" -msgstr "Выбор-добавление всего" +msgstr "Выбор\\Добавление всего" #: src/slic3r/GUI/Selection.cpp:428 msgid "Selection-Remove All" -msgstr "Выбор-удаление всего" +msgstr "Выбор\\Удаление всего" -#: src/slic3r/GUI/Selection.cpp:987 +#: src/slic3r/GUI/Selection.cpp:960 msgid "Scale To Fit" -msgstr "Масштабировать по размеру" +msgstr "Отмасштабировать под область печати" -#: src/slic3r/GUI/Selection.cpp:1514 +#: src/slic3r/GUI/Selection.cpp:1487 msgid "Set Printable Instance" -msgstr "" +msgstr "Копия для печати" -#: src/slic3r/GUI/Selection.cpp:1514 +#: src/slic3r/GUI/Selection.cpp:1487 msgid "Set Unprintable Instance" -msgstr "" +msgstr "Копия не для печати" #: src/slic3r/GUI/SysInfoDialog.cpp:82 msgid "System Information" -msgstr "Информация о системе" +msgstr "Системная информация" #: src/slic3r/GUI/SysInfoDialog.cpp:158 msgid "Copy to Clipboard" -msgstr "Копировать в буфер обмена" +msgstr "Скопировать в буфер обмена" -#: src/slic3r/GUI/Tab.cpp:112 src/libslic3r/PrintConfig.cpp:306 +#: src/slic3r/GUI/Tab.cpp:109 src/libslic3r/PrintConfig.cpp:321 msgid "Compatible printers" msgstr "Совместимые принтеры" -#: src/slic3r/GUI/Tab.cpp:113 +#: src/slic3r/GUI/Tab.cpp:110 msgid "Select the printers this profile is compatible with." msgstr "Выберите принтеры, совместимые с данным профилем." -#: src/slic3r/GUI/Tab.cpp:118 src/libslic3r/PrintConfig.cpp:321 +#: src/slic3r/GUI/Tab.cpp:115 src/libslic3r/PrintConfig.cpp:336 msgid "Compatible print profiles" msgstr "Совместимые профили печати" -#: src/slic3r/GUI/Tab.cpp:119 +#: src/slic3r/GUI/Tab.cpp:116 msgid "Select the print profiles this profile is compatible with." -msgstr "Выберите профили печати, совместимые с данным профилем." +msgstr "Выберите профили печати, с которыми этот профиль совместим." #. TRN "Save current Settings" -#: src/slic3r/GUI/Tab.cpp:214 +#: src/slic3r/GUI/Tab.cpp:211 #, c-format msgid "Save current %s" -msgstr "Сохранить %s" +msgstr "Сохранить текущие %s" -#: src/slic3r/GUI/Tab.cpp:215 +#: src/slic3r/GUI/Tab.cpp:212 msgid "Delete this preset" msgstr "Удалить этот профиль" -#: src/slic3r/GUI/Tab.cpp:219 +#: src/slic3r/GUI/Tab.cpp:216 msgid "" "Hover the cursor over buttons to find more information \n" "or click this button." msgstr "" -"Наведите курсор на кнопки для получения дополнительной информации или " -"нажмите эту кнопку." +"Наведите курсор на кнопки для получения дополнительной информации или нажмите эту " +"кнопку." -#: src/slic3r/GUI/Tab.cpp:223 +#: src/slic3r/GUI/Tab.cpp:220 msgid "Search in settings [%1%]" -msgstr "" +msgstr "Поиск в настройках [%1%]" -#: src/slic3r/GUI/Tab.cpp:1239 +#: src/slic3r/GUI/Tab.cpp:1237 msgid "Detach from system preset" msgstr "Отсоединить от системного профиля" -#: src/slic3r/GUI/Tab.cpp:1252 +#: src/slic3r/GUI/Tab.cpp:1250 msgid "" -"A copy of the current system preset will be created, which will be detached " -"from the system preset." +"A copy of the current system preset will be created, which will be detached from " +"the system preset." msgstr "" +"Будет создана копия текущего системного профиля, который будет отсоединён от " +"системного профиля." -#: src/slic3r/GUI/Tab.cpp:1253 -msgid "" -"The current custom preset will be detached from the parent system preset." +#: src/slic3r/GUI/Tab.cpp:1251 +msgid "The current custom preset will be detached from the parent system preset." msgstr "" +"Текущий пользовательский профиль будет отсоединён от родительского системного " +"профиля." -#: src/slic3r/GUI/Tab.cpp:1256 +#: src/slic3r/GUI/Tab.cpp:1254 msgid "Modifications to the current profile will be saved." -msgstr "" +msgstr "Изменения будут сохранены в текущем профиле." -#: src/slic3r/GUI/Tab.cpp:1259 +#: src/slic3r/GUI/Tab.cpp:1257 msgid "" "This action is not revertable.\n" "Do you want to proceed?" msgstr "" +"Эта операция необратима.\n" +"Хотите продолжить?" -#: src/slic3r/GUI/Tab.cpp:1261 +#: src/slic3r/GUI/Tab.cpp:1259 msgid "Detach preset" msgstr "Отсоединить профиль" -#: src/slic3r/GUI/Tab.cpp:1287 +#: src/slic3r/GUI/Tab.cpp:1285 msgid "This is a default preset." msgstr "Это профиль по умолчанию." -#: src/slic3r/GUI/Tab.cpp:1289 +#: src/slic3r/GUI/Tab.cpp:1287 msgid "This is a system preset." msgstr "Это системный профиль." -#: src/slic3r/GUI/Tab.cpp:1291 +#: src/slic3r/GUI/Tab.cpp:1289 msgid "Current preset is inherited from the default preset." -msgstr "Текущий профиль унаследован от профиля по умолчанию." +msgstr "Текущий профиль наследуется от профиля по умолчанию." -#: src/slic3r/GUI/Tab.cpp:1295 +#: src/slic3r/GUI/Tab.cpp:1293 msgid "Current preset is inherited from" -msgstr "Текущий профиль унаследован от" +msgstr "Текущий профиль наследуется от" -#: src/slic3r/GUI/Tab.cpp:1299 +#: src/slic3r/GUI/Tab.cpp:1297 msgid "It can't be deleted or modified." -msgstr "Его нельзя будет удалить или изменить." +msgstr "Его нельзя удалить или изменить." -#: src/slic3r/GUI/Tab.cpp:1300 -msgid "" -"Any modifications should be saved as a new preset inherited from this one." +#: src/slic3r/GUI/Tab.cpp:1298 +msgid "Any modifications should be saved as a new preset inherited from this one." msgstr "" -"Любые изменения должны быть сохранены как новый профиль, унаследованный от " -"текущего." +"Любые изменения должны быть сохранены как новый профиль, унаследованный от текущего." -#: src/slic3r/GUI/Tab.cpp:1301 +#: src/slic3r/GUI/Tab.cpp:1299 msgid "To do that please specify a new name for the preset." msgstr "Для этого укажите новое имя для профиля." -#: src/slic3r/GUI/Tab.cpp:1305 +#: src/slic3r/GUI/Tab.cpp:1303 msgid "Additional information:" msgstr "Дополнительная информация:" -#: src/slic3r/GUI/Tab.cpp:1311 +#: src/slic3r/GUI/Tab.cpp:1309 msgid "printer model" msgstr "модель принтера" -#: src/slic3r/GUI/Tab.cpp:1319 +#: src/slic3r/GUI/Tab.cpp:1317 msgid "default print profile" msgstr "профиль печати по умолчанию" -#: src/slic3r/GUI/Tab.cpp:1322 +#: src/slic3r/GUI/Tab.cpp:1320 msgid "default filament profile" msgstr "профиль прутка по умолчанию" -#: src/slic3r/GUI/Tab.cpp:1336 +#: src/slic3r/GUI/Tab.cpp:1334 msgid "default SLA material profile" -msgstr "профиль по умолчанию материала SLA" +msgstr "профиль SLA материала по умолчанию" -#: src/slic3r/GUI/Tab.cpp:1340 +#: src/slic3r/GUI/Tab.cpp:1338 msgid "default SLA print profile" -msgstr "профиль по умолчанию для печати SLA" +msgstr "профиль SLA печати по умолчанию" -#: src/slic3r/GUI/Tab.cpp:1348 +#: src/slic3r/GUI/Tab.cpp:1346 msgid "full profile name" -msgstr "полное название профиля" +msgstr "полное имя профиля" -#: src/slic3r/GUI/Tab.cpp:1349 +#: src/slic3r/GUI/Tab.cpp:1347 msgid "symbolic profile name" -msgstr "сокращённое название профиля" +msgstr "символическое имя профиля" -#: src/slic3r/GUI/Tab.cpp:1387 src/slic3r/GUI/Tab.cpp:4032 +#: src/slic3r/GUI/Tab.cpp:1385 src/slic3r/GUI/Tab.cpp:4042 msgid "Layers and perimeters" msgstr "Слои и периметры" -#: src/slic3r/GUI/Tab.cpp:1393 +#: src/slic3r/GUI/Tab.cpp:1391 msgid "Vertical shells" msgstr "Вертикальные оболочки" -#: src/slic3r/GUI/Tab.cpp:1405 +#: src/slic3r/GUI/Tab.cpp:1403 msgid "Horizontal shells" -msgstr "Горизонтальные оболочки (слои сверху и снизу)" +msgstr "Горизонтальные оболочки (слои сверху и снизу модели)" -#: src/slic3r/GUI/Tab.cpp:1406 src/libslic3r/PrintConfig.cpp:1948 +#: src/slic3r/GUI/Tab.cpp:1404 src/libslic3r/PrintConfig.cpp:1980 msgid "Solid layers" msgstr "Сплошных слоёв" -#: src/slic3r/GUI/Tab.cpp:1411 +#: src/slic3r/GUI/Tab.cpp:1409 msgid "Minimum shell thickness" msgstr "Минимальная толщина оболочки" -#: src/slic3r/GUI/Tab.cpp:1422 +#: src/slic3r/GUI/Tab.cpp:1420 msgid "Quality (slower slicing)" msgstr "Качество (замедляет нарезку)" -#: src/slic3r/GUI/Tab.cpp:1449 +#: src/slic3r/GUI/Tab.cpp:1448 msgid "Reducing printing time" msgstr "Сокращение времени печати" -#: src/slic3r/GUI/Tab.cpp:1461 +#: src/slic3r/GUI/Tab.cpp:1460 msgid "Skirt and brim" msgstr "Юбка и кайма" -#: src/slic3r/GUI/Tab.cpp:1481 +#: src/slic3r/GUI/Tab.cpp:1480 msgid "Raft" msgstr "Подложка" -#: src/slic3r/GUI/Tab.cpp:1485 +#: src/slic3r/GUI/Tab.cpp:1484 msgid "Options for support material and raft" -msgstr "Параметры поддержек и подложки" +msgstr "Опции для поддержки и подложки" -#: src/slic3r/GUI/Tab.cpp:1500 +#: src/slic3r/GUI/Tab.cpp:1499 msgid "Speed for print moves" -msgstr "Скорость передвижения при печати" +msgstr "Скорость перемещения при печати" -#: src/slic3r/GUI/Tab.cpp:1513 +#: src/slic3r/GUI/Tab.cpp:1512 msgid "Speed for non-print moves" -msgstr "Скорость передвижения без печати" +msgstr "Скорость перемещения без печати" -#: src/slic3r/GUI/Tab.cpp:1516 +#: src/slic3r/GUI/Tab.cpp:1515 msgid "Modifiers" msgstr "Модификаторы" -#: src/slic3r/GUI/Tab.cpp:1519 +#: src/slic3r/GUI/Tab.cpp:1518 msgid "Acceleration control (advanced)" msgstr "Управление ускорением (дополнительно)" -#: src/slic3r/GUI/Tab.cpp:1526 +#: src/slic3r/GUI/Tab.cpp:1525 msgid "Autospeed (advanced)" msgstr "Автоматическое управление скоростью (дополнительно)" -#: src/slic3r/GUI/Tab.cpp:1534 +#: src/slic3r/GUI/Tab.cpp:1533 msgid "Multiple Extruders" msgstr "Несколько экструдеров" -#: src/slic3r/GUI/Tab.cpp:1542 +#: src/slic3r/GUI/Tab.cpp:1541 msgid "Ooze prevention" -msgstr "Предотвращение утечек" +msgstr "Предотвращение течи материала" -#: src/slic3r/GUI/Tab.cpp:1560 +#: src/slic3r/GUI/Tab.cpp:1559 msgid "Extrusion width" msgstr "Ширина экструзии" -#: src/slic3r/GUI/Tab.cpp:1570 +#: src/slic3r/GUI/Tab.cpp:1569 msgid "Overlap" msgstr "Перекрытие" -#: src/slic3r/GUI/Tab.cpp:1573 +#: src/slic3r/GUI/Tab.cpp:1572 msgid "Flow" msgstr "Поток" -#: src/slic3r/GUI/Tab.cpp:1582 +#: src/slic3r/GUI/Tab.cpp:1581 msgid "Other" msgstr "Прочее" -#: src/slic3r/GUI/Tab.cpp:1585 src/slic3r/GUI/Tab.cpp:4108 +#: src/slic3r/GUI/Tab.cpp:1584 src/slic3r/GUI/Tab.cpp:4118 msgid "Output options" msgstr "Выходные параметры" -#: src/slic3r/GUI/Tab.cpp:1586 +#: src/slic3r/GUI/Tab.cpp:1585 msgid "Sequential printing" -msgstr "Последовательность печати" +msgstr "Последовательная печать" -#: src/slic3r/GUI/Tab.cpp:1588 -msgid "Extruder clearance (mm)" -msgstr "Радиус безопасной зоны экструдера (мм)" +#: src/slic3r/GUI/Tab.cpp:1587 +msgid "Extruder clearance" +msgstr "Радиус безопасной зоны экструдера" -#: src/slic3r/GUI/Tab.cpp:1593 src/slic3r/GUI/Tab.cpp:4109 +#: src/slic3r/GUI/Tab.cpp:1592 src/slic3r/GUI/Tab.cpp:4119 msgid "Output file" msgstr "Выходной файл" -#: src/slic3r/GUI/Tab.cpp:1600 src/libslic3r/PrintConfig.cpp:1634 +#: src/slic3r/GUI/Tab.cpp:1599 src/libslic3r/PrintConfig.cpp:1662 msgid "Post-processing scripts" msgstr "Скрипты постобработки" -#: src/slic3r/GUI/Tab.cpp:1606 src/slic3r/GUI/Tab.cpp:1607 -#: src/slic3r/GUI/Tab.cpp:1927 src/slic3r/GUI/Tab.cpp:1928 -#: src/slic3r/GUI/Tab.cpp:2261 src/slic3r/GUI/Tab.cpp:2262 -#: src/slic3r/GUI/Tab.cpp:2337 src/slic3r/GUI/Tab.cpp:2338 -#: src/slic3r/GUI/Tab.cpp:3975 src/slic3r/GUI/Tab.cpp:3976 +#: src/slic3r/GUI/Tab.cpp:1605 src/slic3r/GUI/Tab.cpp:1606 src/slic3r/GUI/Tab.cpp:1927 +#: src/slic3r/GUI/Tab.cpp:1928 src/slic3r/GUI/Tab.cpp:2266 src/slic3r/GUI/Tab.cpp:2267 +#: src/slic3r/GUI/Tab.cpp:2342 src/slic3r/GUI/Tab.cpp:2343 src/slic3r/GUI/Tab.cpp:3985 +#: src/slic3r/GUI/Tab.cpp:3986 msgid "Notes" msgstr "Заметки" -#: src/slic3r/GUI/Tab.cpp:1613 src/slic3r/GUI/Tab.cpp:1935 -#: src/slic3r/GUI/Tab.cpp:2268 src/slic3r/GUI/Tab.cpp:2344 -#: src/slic3r/GUI/Tab.cpp:3983 src/slic3r/GUI/Tab.cpp:4114 +#: src/slic3r/GUI/Tab.cpp:1612 src/slic3r/GUI/Tab.cpp:1935 src/slic3r/GUI/Tab.cpp:2273 +#: src/slic3r/GUI/Tab.cpp:2349 src/slic3r/GUI/Tab.cpp:3993 src/slic3r/GUI/Tab.cpp:4124 msgid "Dependencies" msgstr "Зависимости" -#: src/slic3r/GUI/Tab.cpp:1614 src/slic3r/GUI/Tab.cpp:1936 -#: src/slic3r/GUI/Tab.cpp:2269 src/slic3r/GUI/Tab.cpp:2345 -#: src/slic3r/GUI/Tab.cpp:3984 src/slic3r/GUI/Tab.cpp:4115 +#: src/slic3r/GUI/Tab.cpp:1613 src/slic3r/GUI/Tab.cpp:1936 src/slic3r/GUI/Tab.cpp:2274 +#: src/slic3r/GUI/Tab.cpp:2350 src/slic3r/GUI/Tab.cpp:3994 src/slic3r/GUI/Tab.cpp:4125 msgid "Profile dependencies" msgstr "Зависимости профиля" -#: src/slic3r/GUI/Tab.cpp:1694 +#: src/slic3r/GUI/Tab.cpp:1693 msgid "Filament Overrides" -msgstr "Переопределения прутка" +msgstr "Переопределение парам. прутка" -#: src/slic3r/GUI/Tab.cpp:1816 +#: src/slic3r/GUI/Tab.cpp:1815 msgid "Temperature" msgstr "Температура" -#: src/slic3r/GUI/Tab.cpp:1817 +#: src/slic3r/GUI/Tab.cpp:1816 msgid "Nozzle" msgstr "Сопло" -#: src/slic3r/GUI/Tab.cpp:1822 +#: src/slic3r/GUI/Tab.cpp:1821 msgid "Bed" -msgstr "Платформа" +msgstr "Стол" -#: src/slic3r/GUI/Tab.cpp:1827 +#: src/slic3r/GUI/Tab.cpp:1826 msgid "Cooling" msgstr "Охлаждение" -#: src/slic3r/GUI/Tab.cpp:1829 src/libslic3r/PrintConfig.cpp:1537 -#: src/libslic3r/PrintConfig.cpp:2396 +#: src/slic3r/GUI/Tab.cpp:1828 src/libslic3r/PrintConfig.cpp:1565 +#: src/libslic3r/PrintConfig.cpp:2428 msgid "Enable" -msgstr "Включить" +msgstr "Вкл." -#: src/slic3r/GUI/Tab.cpp:1840 +#: src/slic3r/GUI/Tab.cpp:1839 msgid "Fan settings" msgstr "Настройки вентилятора" @@ -6844,7 +7059,7 @@ msgstr "Пороги включения обдува" #: src/slic3r/GUI/Tab.cpp:1856 msgid "Filament properties" -msgstr "Свойства прутка" +msgstr "Настройки прутка" #: src/slic3r/GUI/Tab.cpp:1863 msgid "Print speed override" @@ -6852,53 +7067,60 @@ msgstr "Ограничение скорости печати" #: src/slic3r/GUI/Tab.cpp:1873 msgid "Wipe tower parameters" -msgstr "Параметры башни очистки" +msgstr "Параметры черновой башни" #: src/slic3r/GUI/Tab.cpp:1876 msgid "Toolchange parameters with single extruder MM printers" -msgstr "Параметры смены сопла в одноэкструдерных мультиматериальных принтерах" +msgstr "Параметры смены инструмента в одноэкструдерных мультиматериальных принтерах" #: src/slic3r/GUI/Tab.cpp:1889 msgid "Ramming settings" msgstr "Настройки рэмминга" -#: src/slic3r/GUI/Tab.cpp:1912 src/slic3r/GUI/Tab.cpp:2200 -#: src/libslic3r/PrintConfig.cpp:2031 +#: src/slic3r/GUI/Tab.cpp:1912 src/slic3r/GUI/Tab.cpp:2205 +#: src/libslic3r/PrintConfig.cpp:2063 msgid "Custom G-code" msgstr "Пользовательский G-код" -#: src/slic3r/GUI/Tab.cpp:1913 src/slic3r/GUI/Tab.cpp:2201 -#: src/libslic3r/PrintConfig.cpp:1981 src/libslic3r/PrintConfig.cpp:1996 +#: src/slic3r/GUI/Tab.cpp:1913 src/slic3r/GUI/Tab.cpp:2206 +#: src/libslic3r/PrintConfig.cpp:2013 src/libslic3r/PrintConfig.cpp:2028 msgid "Start G-code" msgstr "Стартовый G-код" -#: src/slic3r/GUI/Tab.cpp:1920 src/slic3r/GUI/Tab.cpp:2208 -#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:436 +#: src/slic3r/GUI/Tab.cpp:1920 src/slic3r/GUI/Tab.cpp:2213 +#: src/libslic3r/PrintConfig.cpp:441 src/libslic3r/PrintConfig.cpp:451 msgid "End G-code" msgstr "Завершающий G-код" #: src/slic3r/GUI/Tab.cpp:1970 msgid "Volumetric flow hints not available" -msgstr "Подсказки по объемному расходу недоступны" +msgstr "Подсказки об объёмном расходе недоступны." #: src/slic3r/GUI/Tab.cpp:2066 msgid "" -"Note: All parameters from this group are moved to the Physical Printer " -"settings (see changelog).\n" +"Note: All parameters from this group are moved to the Physical Printer settings " +"(see changelog).\n" "\n" -"A new Physical Printer profile is created by clicking on the \"cog\" icon " -"right of the Printer profiles combo box, by selecting the \"Add physical " -"printer\" item in the Printer combo box. The Physical Printer profile editor " -"opens also when clicking on the \"cog\" icon in the Printer settings tab. " -"The Physical Printer profiles are being stored into PrusaSlicer/" -"physical_printer directory." -msgstr "" +"A new Physical Printer profile is created by clicking on the \"cog\" icon right of " +"the Printer profiles combo box, by selecting the \"Add physical printer\" item in " +"the Printer combo box. The Physical Printer profile editor opens also when clicking " +"on the \"cog\" icon in the Printer settings tab. The Physical Printer profiles are " +"being stored into PrusaSlicer/physical_printer directory." +msgstr "" +"Примечание: все параметры из этой группы перенесены в настройки физического " +"принтера (см. список изменений).\n" +"\n" +"Новый профиль физического принтера создаётся нажатием по значку \"шестеренка\" " +"справа от поля со списком профилей принтеров, выбрав \"Добавить физический принтер" +"\". Редактор профиля физического принтера открывается также при нажатии на значок " +"\"шестеренка\" на вкладке настройки принтера. Профили физического принтера " +"сохраняются в папке PrusaSlicer/physical_printer." -#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:2281 +#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:2286 msgid "Size and coordinates" msgstr "Размер и координаты" -#: src/slic3r/GUI/Tab.cpp:2108 src/slic3r/GUI/UnsavedChangesDialog.cpp:1072 +#: src/slic3r/GUI/Tab.cpp:2108 src/slic3r/GUI/UnsavedChangesDialog.cpp:1080 msgid "Capabilities" msgstr "Характеристики принтера" @@ -6910,135 +7132,141 @@ msgstr "Количество экструдеров у принтера." msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" -"Do you want to change the diameter for all extruders to first extruder " -"nozzle diameter value?" +"Do you want to change the diameter for all extruders to first extruder nozzle " +"diameter value?" msgstr "" +"Выбран мультиматериальный одиночный экструдер, \n" +"поэтому все экструдеры должны иметь одинаковый диаметр.\n" +"Изменить диаметр всех экструдеров на значение диаметра сопла первого экструдера?" -#: src/slic3r/GUI/Tab.cpp:2144 src/slic3r/GUI/Tab.cpp:2547 -#: src/libslic3r/PrintConfig.cpp:1506 +#: src/slic3r/GUI/Tab.cpp:2144 src/slic3r/GUI/Tab.cpp:2552 +#: src/libslic3r/PrintConfig.cpp:1534 msgid "Nozzle diameter" msgstr "Диаметр сопла" -#: src/slic3r/GUI/Tab.cpp:2215 src/libslic3r/PrintConfig.cpp:194 +#: src/slic3r/GUI/Tab.cpp:2220 src/libslic3r/PrintConfig.cpp:209 msgid "Before layer change G-code" msgstr "G-код, выполняемый перед сменой слоя" -#: src/slic3r/GUI/Tab.cpp:2222 src/libslic3r/PrintConfig.cpp:1245 +#: src/slic3r/GUI/Tab.cpp:2227 src/libslic3r/PrintConfig.cpp:1273 msgid "After layer change G-code" -msgstr "G-код, выполняемый после смены слоя" +msgstr "G-код выполняемый после смены слоя" -#: src/slic3r/GUI/Tab.cpp:2229 src/libslic3r/PrintConfig.cpp:2289 +#: src/slic3r/GUI/Tab.cpp:2234 src/libslic3r/PrintConfig.cpp:2321 msgid "Tool change G-code" -msgstr "G-код, выполняемый для смены инструмента" +msgstr "G-код выполняемый при смене инструмента" -#: src/slic3r/GUI/Tab.cpp:2236 +#: src/slic3r/GUI/Tab.cpp:2241 msgid "Between objects G-code (for sequential printing)" -msgstr "G-код, выполняемый между объектами (для последовательной печати)" +msgstr "G-код выполняемый между моделями (для последовательной печати)" -#: src/slic3r/GUI/Tab.cpp:2243 +#: src/slic3r/GUI/Tab.cpp:2248 msgid "Color Change G-code" -msgstr "G-код, выполняемый для смены цвета" +msgstr "G-код смены цвета" -#: src/slic3r/GUI/Tab.cpp:2249 src/libslic3r/PrintConfig.cpp:2022 +#: src/slic3r/GUI/Tab.cpp:2254 src/libslic3r/PrintConfig.cpp:2054 msgid "Pause Print G-code" -msgstr "G-код, выполняемый для паузы печати" +msgstr "G-код паузы печати" -#: src/slic3r/GUI/Tab.cpp:2255 +#: src/slic3r/GUI/Tab.cpp:2260 msgid "Template Custom G-code" -msgstr "Шаблон пользовательского G-кода" +msgstr "Пользовательский шаблон G-кода" -#: src/slic3r/GUI/Tab.cpp:2288 +#: src/slic3r/GUI/Tab.cpp:2293 msgid "Display" -msgstr "" +msgstr "Дисплей" -#: src/slic3r/GUI/Tab.cpp:2303 +#: src/slic3r/GUI/Tab.cpp:2308 msgid "Tilt" -msgstr "" +msgstr "Наклон ванночки" -#: src/slic3r/GUI/Tab.cpp:2304 +#: src/slic3r/GUI/Tab.cpp:2309 msgid "Tilt time" -msgstr "" +msgstr "Время наклона ванночки" -#: src/slic3r/GUI/Tab.cpp:2310 src/slic3r/GUI/Tab.cpp:3959 +#: src/slic3r/GUI/Tab.cpp:2315 src/slic3r/GUI/Tab.cpp:3969 msgid "Corrections" -msgstr "Исправления" +msgstr "Корректировка" -#: src/slic3r/GUI/Tab.cpp:2327 src/slic3r/GUI/Tab.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:2332 src/slic3r/GUI/Tab.cpp:3965 msgid "Exposure" -msgstr "" +msgstr "Экспозиция" -#: src/slic3r/GUI/Tab.cpp:2386 src/slic3r/GUI/Tab.cpp:2480 -#: src/libslic3r/PrintConfig.cpp:1274 src/libslic3r/PrintConfig.cpp:1309 -#: src/libslic3r/PrintConfig.cpp:1326 src/libslic3r/PrintConfig.cpp:1343 -#: src/libslic3r/PrintConfig.cpp:1359 src/libslic3r/PrintConfig.cpp:1369 -#: src/libslic3r/PrintConfig.cpp:1379 src/libslic3r/PrintConfig.cpp:1389 +#: src/slic3r/GUI/Tab.cpp:2391 src/slic3r/GUI/Tab.cpp:2485 +#: src/libslic3r/PrintConfig.cpp:1302 src/libslic3r/PrintConfig.cpp:1337 +#: src/libslic3r/PrintConfig.cpp:1354 src/libslic3r/PrintConfig.cpp:1371 +#: src/libslic3r/PrintConfig.cpp:1387 src/libslic3r/PrintConfig.cpp:1397 +#: src/libslic3r/PrintConfig.cpp:1407 src/libslic3r/PrintConfig.cpp:1417 msgid "Machine limits" msgstr "Ограничения принтера" -#: src/slic3r/GUI/Tab.cpp:2409 +#: src/slic3r/GUI/Tab.cpp:2414 msgid "Values in this column are for Normal mode" -msgstr "Значения в этом столбце относятся к нормальному режиму" +msgstr "Значения в этой колонке для нормального режима" -#: src/slic3r/GUI/Tab.cpp:2415 +#: src/slic3r/GUI/Tab.cpp:2420 msgid "Values in this column are for Stealth mode" -msgstr "Значения в этом столбце относятся к тихому режиму" +msgstr "Значения в этой колонке для тихого режима" -#: src/slic3r/GUI/Tab.cpp:2424 +#: src/slic3r/GUI/Tab.cpp:2429 msgid "Maximum feedrates" -msgstr "Максимальные скорости подачи" +msgstr "Максимальная скорость (#define DEFAULT_MAX_FEEDRATE {X, Y, Z, E})" -#: src/slic3r/GUI/Tab.cpp:2429 +#: src/slic3r/GUI/Tab.cpp:2434 msgid "Maximum accelerations" -msgstr "Максимальные ускорения" +msgstr "" +"Максимальное ускорение (#define DEFAULT_MAX_ACCELERATION {X,Y,Z,E}, #define " +"DEFAULT_RETRACT_ACCELERATION, )" -#: src/slic3r/GUI/Tab.cpp:2436 +#: src/slic3r/GUI/Tab.cpp:2441 msgid "Jerk limits" -msgstr "Ограничение рывка" +msgstr "Ограничение рывка (#define DEFAULT_{X,Y,Z,E}JERK)" -#: src/slic3r/GUI/Tab.cpp:2441 +#: src/slic3r/GUI/Tab.cpp:2446 msgid "Minimum feedrates" -msgstr "Минимальные скорости подачи" +msgstr "" +"Минимальная скорость (#define DEFAULT_MINIMUMFEEDRATE и #define " +"DEFAULT_MINTRAVELFEEDRATE)" -#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2513 +#: src/slic3r/GUI/Tab.cpp:2510 src/slic3r/GUI/Tab.cpp:2518 msgid "Single extruder MM setup" msgstr "Экструдер в ММ принтере" -#: src/slic3r/GUI/Tab.cpp:2514 +#: src/slic3r/GUI/Tab.cpp:2519 msgid "Single extruder multimaterial parameters" -msgstr "" -"Параметры экструдера в одноэкструдерном мультиматериальном (ММ) принтере" +msgstr "Параметры экструдера в одноэкструдерном мультиматериальном (ММ) принтере" -#: src/slic3r/GUI/Tab.cpp:2545 +#: src/slic3r/GUI/Tab.cpp:2550 msgid "" -"This is a single extruder multimaterial printer, diameters of all extruders " -"will be set to the new value. Do you want to proceed?" +"This is a single extruder multimaterial printer, diameters of all extruders will be " +"set to the new value. Do you want to proceed?" msgstr "" +"Это одноэкструдерный мультиматериальный принтер, диаметры всех экструдеров будут " +"установлены на новое значение. Вы хотите продолжить?" -#: src/slic3r/GUI/Tab.cpp:2569 +#: src/slic3r/GUI/Tab.cpp:2574 msgid "Layer height limits" msgstr "Ограничение высоты слоя" -#: src/slic3r/GUI/Tab.cpp:2574 +#: src/slic3r/GUI/Tab.cpp:2579 msgid "Position (for multi-extruder printers)" msgstr "Позиция экструдера (для многоэкструдерных принтеров)" -#: src/slic3r/GUI/Tab.cpp:2580 +#: src/slic3r/GUI/Tab.cpp:2585 msgid "Only lift Z" -msgstr "Только подъём Z" +msgstr "Приподнимать сопло только" -#: src/slic3r/GUI/Tab.cpp:2593 -msgid "" -"Retraction when tool is disabled (advanced settings for multi-extruder " -"setups)" +#: src/slic3r/GUI/Tab.cpp:2598 +msgid "Retraction when tool is disabled (advanced settings for multi-extruder setups)" msgstr "" -"Ретракт, при отключении сопла (дополнительные настройки для " -"многоэкструдерных принтеров)" +"Ретракт, при отключении сопла (дополнительные настройки для многоэкструдерных " +"принтеров)" -#: src/slic3r/GUI/Tab.cpp:2600 +#: src/slic3r/GUI/Tab.cpp:2605 msgid "Reset to Filament Color" -msgstr "Сбросить в цвет прутка" +msgstr "Сброс в цвет прутка" -#: src/slic3r/GUI/Tab.cpp:2778 +#: src/slic3r/GUI/Tab.cpp:2783 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -7048,392 +7276,407 @@ msgstr "" "\n" "Отключить его для включения ретракта из прошивки?" -#: src/slic3r/GUI/Tab.cpp:2780 +#: src/slic3r/GUI/Tab.cpp:2785 msgid "Firmware Retraction" msgstr "Ретракт из прошивки" -#: src/slic3r/GUI/Tab.cpp:3366 +#: src/slic3r/GUI/Tab.cpp:3376 msgid "Detached" msgstr "Отсоединён" -#: src/slic3r/GUI/Tab.cpp:3429 +#: src/slic3r/GUI/Tab.cpp:3439 msgid "remove" msgstr "убрать" -#: src/slic3r/GUI/Tab.cpp:3429 +#: src/slic3r/GUI/Tab.cpp:3439 msgid "delete" msgstr "удалить" -#: src/slic3r/GUI/Tab.cpp:3438 +#: src/slic3r/GUI/Tab.cpp:3448 msgid "It's a last preset for this physical printer." -msgstr "" +msgstr "Это последний профиль для этого физического принтера." -#: src/slic3r/GUI/Tab.cpp:3443 +#: src/slic3r/GUI/Tab.cpp:3453 msgid "" -"Are you sure you want to delete \"%1%\" preset from the physical printer " -"\"%2%\"?" +"Are you sure you want to delete \"%1%\" preset from the physical printer \"%2%\"?" msgstr "" +"Вы действительно хотите удалить профиль \"%1%\" из физического принтера \"%2%\"?" -#: src/slic3r/GUI/Tab.cpp:3455 -msgid "" -"The physical printer(s) below is based on the preset, you are going to " -"delete." +#: src/slic3r/GUI/Tab.cpp:3465 +msgid "The physical printer(s) below is based on the preset, you are going to delete." msgstr "" +"Физические принтеры, указанные ниже, основаны на профиле, которые вы собираетесь " +"удалить." -#: src/slic3r/GUI/Tab.cpp:3459 -msgid "" -"Note, that selected preset will be deleted from this/those printer(s) too." -msgstr "" +#: src/slic3r/GUI/Tab.cpp:3469 +msgid "Note, that selected preset will be deleted from this/those printer(s) too." +msgstr "Обратите внимание, выбранный профиль будет удалён из этого принтера тоже." -#: src/slic3r/GUI/Tab.cpp:3463 +#: src/slic3r/GUI/Tab.cpp:3473 msgid "" -"The physical printer(s) below is based only on the preset, you are going to " -"delete." +"The physical printer(s) below is based only on the preset, you are going to delete." msgstr "" +"Физические принтеры, указанные ниже, основаны только на профиле, которые вы " +"собираетесь удалить." -#: src/slic3r/GUI/Tab.cpp:3467 +#: src/slic3r/GUI/Tab.cpp:3477 msgid "" -"Note, that this/those printer(s) will be deleted after deleting of the " -"selected preset." +"Note, that this/those printer(s) will be deleted after deleting of the selected " +"preset." msgstr "" +"Обратите внимание, этот принтер(-ы) будет удалён после удаления выбранного профиля." -#: src/slic3r/GUI/Tab.cpp:3471 +#: src/slic3r/GUI/Tab.cpp:3481 msgid "Are you sure you want to %1% the selected preset?" -msgstr "Удалить выбранный профиль %1%?" +msgstr "Вы уверены, что хотите %1% выбранный профиль?" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3476 +#: src/slic3r/GUI/Tab.cpp:3486 msgid "%1% Preset" msgstr "Профиль %1%" -#: src/slic3r/GUI/Tab.cpp:3557 src/slic3r/GUI/Tab.cpp:3629 +#: src/slic3r/GUI/Tab.cpp:3567 src/slic3r/GUI/Tab.cpp:3639 msgid "Set" msgstr "Выбор" -#: src/slic3r/GUI/Tab.cpp:3693 -msgid "" -"Machine limits will be emitted to G-code and used to estimate print time." +#: src/slic3r/GUI/Tab.cpp:3703 +msgid "Machine limits will be emitted to G-code and used to estimate print time." msgstr "" +"Ограничения принтера будут передаваться в G-код и использоваться для оценки времени " +"печати." -#: src/slic3r/GUI/Tab.cpp:3696 +#: src/slic3r/GUI/Tab.cpp:3706 msgid "" -"Machine limits will NOT be emitted to G-code, however they will be used to " -"estimate print time, which may therefore not be accurate as the printer may " -"apply a different set of machine limits." +"Machine limits will NOT be emitted to G-code, however they will be used to estimate " +"print time, which may therefore not be accurate as the printer may apply a " +"different set of machine limits." msgstr "" +"Ограничения принтера не будут передаваться в G-код, тем не менее они будут " +"используются для оценки времени печати, которое может быть неточным, поскольку " +"принтер может применять другой набор ограничений для принтера." -#: src/slic3r/GUI/Tab.cpp:3700 +#: src/slic3r/GUI/Tab.cpp:3710 msgid "" -"Machine limits are not set, therefore the print time estimate may not be " -"accurate." +"Machine limits are not set, therefore the print time estimate may not be accurate." msgstr "" +"Ограничения принтера не заданы, поэтому оценка времени печати может быть неточной." -#: src/slic3r/GUI/Tab.cpp:3722 +#: src/slic3r/GUI/Tab.cpp:3732 msgid "LOCKED LOCK" -msgstr "ЗАКРЫТЫЙ ЗАМОК" +msgstr "ЗАКРЫТЫЙ ЗАМОЧЕК" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3724 +#: src/slic3r/GUI/Tab.cpp:3734 msgid "" -"indicates that the settings are the same as the system (or default) values " -"for the current option group" +"indicates that the settings are the same as the system (or default) values for the " +"current option group" msgstr "" -"указывает, что настройки совпадают с системными (умолчательным) значениями " -"текущей группы параметров" +"указывает, что настройки совпадают с системными значениями (или значениями по " +"умолчанию) для текущей группы." -#: src/slic3r/GUI/Tab.cpp:3726 +#: src/slic3r/GUI/Tab.cpp:3736 msgid "UNLOCKED LOCK" -msgstr "ОТКРЫТЫЙ ЗАМОК" +msgstr "ОТКРЫТЫЙ ЗАМОЧЕК" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3728 +#: src/slic3r/GUI/Tab.cpp:3738 msgid "" -"indicates that some settings were changed and are not equal to the system " -"(or default) values for the current option group.\n" -"Click the UNLOCKED LOCK icon to reset all settings for current option group " -"to the system (or default) values." +"indicates that some settings were changed and are not equal to the system (or " +"default) values for the current option group.\n" +"Click the UNLOCKED LOCK icon to reset all settings for current option group to the " +"system (or default) values." msgstr "" -"указывает, что некоторые настройки были изменены и не равны системным " -"(умолчательным) значениям текущей группы параметров.\n" -"Нажмите на ОТКРЫТЫЙ ЗАМОК, чтобы сбросить все настройки текущей группы " -"параметров в системные значения." +"указывает, что некоторые настройки были изменены и не равны системным значениям " +"(или значениям по умолчанию) для текущей группы.\n" +"Нажмите, чтобы сбросить все настройки текущей группы до системных значений (или " +"значений по умолчанию)." -#: src/slic3r/GUI/Tab.cpp:3733 +#: src/slic3r/GUI/Tab.cpp:3743 msgid "WHITE BULLET" msgstr "БЕЛЫЙ МАРКЕР" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:3735 +#: src/slic3r/GUI/Tab.cpp:3745 msgid "" "for the left button: indicates a non-system (or non-default) preset,\n" "for the right button: indicates that the settings hasn't been modified." msgstr "" -"маркер слева указывает на несистемный профиль,\n" -"а правый, что параметры не были изменены." +"слева: указывает на не системный профиль (или профиль не по умолчанию),\n" +"справа: указывает, что параметры не были изменены." -#: src/slic3r/GUI/Tab.cpp:3738 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "BACK ARROW" -msgstr "СТРЕЛКА РАЗВОРОТА" +msgstr "ЗНАЧОК СО СТРЕЛКОЙ" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:3740 +#: src/slic3r/GUI/Tab.cpp:3750 msgid "" -"indicates that the settings were changed and are not equal to the last saved " -"preset for the current option group.\n" -"Click the BACK ARROW icon to reset all settings for the current option group " -"to the last saved preset." +"indicates that the settings were changed and are not equal to the last saved preset " +"for the current option group.\n" +"Click the BACK ARROW icon to reset all settings for the current option group to the " +"last saved preset." msgstr "" -"указывает, что настройки были изменены и не совпадают с настройками в " -"последнем сохранённом профиле для текущей группы параметров.\n" -"Нажмите на значок СТРЕЛКИ РАЗВОРОТА, чтобы сбросить все настройки для " -"текущей группы в последние сохранённые значения профиля." +"указывает, что настройки были изменены и не совпадают с настройками в последнем " +"сохранённом профиле\n" +"для текущей группы. Нажмите на значок со стрелкой, чтобы сбросить все настройки для " +"текущей группы до последнего\n" +"сохранённого значения профиля." -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3760 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" msgstr "" -"Закрытый замочек указывает, что настройки совпадают с системными значениями " -"для текущей группы" +"ЗАКРЫТЫЙ ЗАМОЧЕК указывает, что настройки совпадают с системными значениями (или " +"значениями по умолчанию) для текущей группы." -#: src/slic3r/GUI/Tab.cpp:3752 +#: src/slic3r/GUI/Tab.cpp:3762 msgid "" -"UNLOCKED LOCK icon indicates that some settings were changed and are not " -"equal to the system (or default) values for the current option group.\n" -"Click to reset all settings for current option group to the system (or " -"default) values." +"UNLOCKED LOCK icon indicates that some settings were changed and are not equal to " +"the system (or default) values for the current option group.\n" +"Click to reset all settings for current option group to the system (or default) " +"values." msgstr "" -"Открытый замочек указывает, что некоторые настройки были изменены и не равны " +"ОТКРЫТЫЙ ЗАМОЧЕК указывает, что некоторые настройки были изменены и не равны " "системным значениям (или значениям по умолчанию) для текущей группы.\n" -"Нажмите, чтобы сбросить все настройки текущей группы до системных значений." +"Нажмите, чтобы сбросить все настройки текущей группы до системных значений (или " +"значений по умолчанию)." -#: src/slic3r/GUI/Tab.cpp:3755 +#: src/slic3r/GUI/Tab.cpp:3765 msgid "WHITE BULLET icon indicates a non system (or non default) preset." -msgstr "" -"Белый маркер указывает на несистемный профиль (либо профиль не по умолчанию)." +msgstr "БЕЛЫЙ МАРКЕР указывает на не системный профиль (или профиль не по умолчанию)." -#: src/slic3r/GUI/Tab.cpp:3758 +#: src/slic3r/GUI/Tab.cpp:3768 msgid "" -"WHITE BULLET icon indicates that the settings are the same as in the last " -"saved preset for the current option group." +"WHITE BULLET icon indicates that the settings are the same as in the last saved " +"preset for the current option group." msgstr "" -"Белый маркер означает, что настройки совпадают с настройками в последнем " +"БЕЛЫЙ МАРКЕР означает, что настройки совпадают с настройками в последнем " "сохранённом профиле для текущей группы." -#: src/slic3r/GUI/Tab.cpp:3760 +#: src/slic3r/GUI/Tab.cpp:3770 msgid "" -"BACK ARROW icon indicates that the settings were changed and are not equal " -"to the last saved preset for the current option group.\n" -"Click to reset all settings for the current option group to the last saved " -"preset." +"BACK ARROW icon indicates that the settings were changed and are not equal to the " +"last saved preset for the current option group.\n" +"Click to reset all settings for the current option group to the last saved preset." msgstr "" -"Значок со стрелкой указывает, что настройки были изменены и не совпадают с " +"ЗНАЧОК СО СТРЕЛКОЙ указывает, что настройки были изменены и не совпадают с " "настройками в последнем сохранённом профиле для текущей группы.\n" -"Нажмите, чтобы сбросить все настройки для текущей группы до последнего " -"сохранённого значения профиля." +"Нажмите, чтобы сбросить все настройки для текущей группы до последнего сохранённого " +"значения профиля." -#: src/slic3r/GUI/Tab.cpp:3766 +#: src/slic3r/GUI/Tab.cpp:3776 msgid "" -"LOCKED LOCK icon indicates that the value is the same as the system (or " -"default) value." +"LOCKED LOCK icon indicates that the value is the same as the system (or default) " +"value." msgstr "" -"Закрытый замочек указывает, что значение совпадает с системным значением " -"(либо значием по умолчанию)." +"ЗАКРЫТЫЙ ЗАМОЧЕК указывает, что значение совпадает с системным значением (или " +"значение по умолчанию)." -#: src/slic3r/GUI/Tab.cpp:3767 +#: src/slic3r/GUI/Tab.cpp:3777 msgid "" -"UNLOCKED LOCK icon indicates that the value was changed and is not equal to " -"the system (or default) value.\n" +"UNLOCKED LOCK icon indicates that the value was changed and is not equal to the " +"system (or default) value.\n" "Click to reset current value to the system (or default) value." msgstr "" -"Открытый замочек указывает, что значение было изменено и не равно системному " -"значению(или значениям по умолчанию).\n" -"Нажмите, чтобы сбросить текущее значение к системному значению." +"ОТКРЫТЫЙ ЗАМОЧЕК указывает, что значение было изменено и не равно системному " +"значению (или значению по умолчанию).\n" +"Нажмите, чтобы сбросить текущее значение к системному значению (или значению по " +"умолчанию)." -#: src/slic3r/GUI/Tab.cpp:3773 +#: src/slic3r/GUI/Tab.cpp:3783 msgid "" -"WHITE BULLET icon indicates that the value is the same as in the last saved " -"preset." +"WHITE BULLET icon indicates that the value is the same as in the last saved preset." msgstr "" -"Белый маркер указывает, что значение совпадает со значением в последнем " -"сохранённом профиле." +"БЕЛЫЙ МАРКЕР указывает, что значение совпадает со значением в последнем сохранённом " +"профиле." -#: src/slic3r/GUI/Tab.cpp:3774 +#: src/slic3r/GUI/Tab.cpp:3784 msgid "" -"BACK ARROW icon indicates that the value was changed and is not equal to the " -"last saved preset.\n" +"BACK ARROW icon indicates that the value was changed and is not equal to the last " +"saved preset.\n" "Click to reset current value to the last saved preset." msgstr "" -"Значок со стрелкой указывает, что значение было изменено и не совпадает со " +"ЗНАЧОК СО СТРЕЛКОЙ указывает, что значение было изменено и не совпадает со " "значением в последнем сохранённом профиле для текущей группы.\n" "Нажмите, чтобы сбросить значение до последнего сохранённого значения профиля." -#: src/slic3r/GUI/Tab.cpp:3918 src/slic3r/GUI/Tab.cpp:3920 +#: src/slic3r/GUI/Tab.cpp:3928 src/slic3r/GUI/Tab.cpp:3930 msgid "Material" msgstr "Материал" -#: src/slic3r/GUI/Tab.cpp:4042 +#: src/slic3r/GUI/Tab.cpp:4052 msgid "Support head" -msgstr "" +msgstr "Носик поддержки" -#: src/slic3r/GUI/Tab.cpp:4047 +#: src/slic3r/GUI/Tab.cpp:4057 msgid "Support pillar" -msgstr "Опорная стойка" +msgstr "Тело поддержки" -#: src/slic3r/GUI/Tab.cpp:4070 +#: src/slic3r/GUI/Tab.cpp:4080 msgid "Connection of the support sticks and junctions" -msgstr "" +msgstr "Соединения опор поддержки со связующим узлом" -#: src/slic3r/GUI/Tab.cpp:4075 +#: src/slic3r/GUI/Tab.cpp:4085 msgid "Automatic generation" msgstr "Автоматическая генерация" -#: src/slic3r/GUI/Tab.cpp:4149 +#: src/slic3r/GUI/Tab.cpp:4159 msgid "" "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" "To enable \"%1%\", please switch off \"%2%\"" msgstr "" +"\"%1%\" отключена, так как \"%2%\" находится в категории \"%3%\".\n" +"Чтобы включить \"%1%\", отключите \"%2%\"" -#: src/slic3r/GUI/Tab.cpp:4151 src/libslic3r/PrintConfig.cpp:2970 +#: src/slic3r/GUI/Tab.cpp:4161 src/libslic3r/PrintConfig.cpp:3002 msgid "Object elevation" -msgstr "" +msgstr "Высота подъёма модели" -#: src/slic3r/GUI/Tab.cpp:4151 src/libslic3r/PrintConfig.cpp:3072 +#: src/slic3r/GUI/Tab.cpp:4161 src/libslic3r/PrintConfig.cpp:3104 msgid "Pad around object" -msgstr "" +msgstr "Подложка вокруг модели" -#: src/slic3r/GUI/Tab.hpp:374 src/slic3r/GUI/Tab.hpp:496 +#: src/slic3r/GUI/Tab.hpp:370 src/slic3r/GUI/Tab.hpp:492 msgid "Print Settings" msgstr "Настройки печати" -#: src/slic3r/GUI/Tab.hpp:405 +#: src/slic3r/GUI/Tab.hpp:401 msgid "Filament Settings" msgstr "Настройки прутка" -#: src/slic3r/GUI/Tab.hpp:446 +#: src/slic3r/GUI/Tab.hpp:442 msgid "Printer Settings" msgstr "Настройки принтера" -#: src/slic3r/GUI/Tab.hpp:480 +#: src/slic3r/GUI/Tab.hpp:476 msgid "Material Settings" -msgstr "Настройки материала" +msgstr "Настройка материала" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:143 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:152 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:851 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:149 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:158 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:857 msgid "Undef" -msgstr "" +msgstr "Не задано" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:531 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:537 msgid "PrusaSlicer is closing: Unsaved Changes" -msgstr "" +msgstr "Закрытие PrusaSlicer: несохраненные изменения" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:548 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:554 msgid "Switching Presets: Unsaved Changes" -msgstr "" +msgstr "Смена профилей: несохраненные изменения" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:614 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:620 msgid "Old Value" msgstr "Старое значение" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:615 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:621 msgid "New Value" msgstr "Новое значение" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:646 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:652 msgid "Transfer" msgstr "Перенести" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:647 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:653 msgid "Discard" -msgstr "Сбросить" +msgstr "Не сохранять" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:648 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:654 msgid "Save" msgstr "Сохранить" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:668 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:674 msgid "PrusaSlicer will remember your action." -msgstr "" +msgstr "PrusaSlicer запомнит ваш выбор." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:670 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:676 msgid "" -"You will not be asked about the unsaved changes the next time you close " -"PrusaSlicer." +"You will not be asked about the unsaved changes the next time you close PrusaSlicer." msgstr "" +"Запрос о несохраненных изменениях не будет появляться при закрытии PrusaSlicer." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:671 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:677 msgid "" -"You will not be asked about the unsaved changes the next time you switch a " -"preset." +"You will not be asked about the unsaved changes the next time you switch a preset." msgstr "" +"Запрос о несохраненных изменениях не будет появляться при следующем переключении " +"профиля." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:672 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:678 msgid "" "Visit \"Preferences\" and check \"%1%\"\n" "to be asked about unsaved changes again." msgstr "" +"Зайдите в \"Настройки приложения\" и установите флажок \"%1%\",\n" +"чтобы вернуть запрос о несохраненных изменениях." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:674 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:680 msgid "PrusaSlicer: Don't ask me again" -msgstr "" +msgstr "PrusaSlicer: Не спрашивать снова" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:741 -msgid "" -"Some fields are too long to fit. Right mouse click reveals the full text." +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:747 +msgid "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" +"Некоторые поля слишком длинные. Щёлкните правой кнопкой мыши, чтобы показать полный " +"текст." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:743 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:749 msgid "All settings changes will be discarded." -msgstr "" +msgstr "Все изменённые параметры будут потеряны." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:746 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:752 msgid "Save the selected options." -msgstr "" +msgstr "Сохранить выбранные параметры." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:746 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:752 msgid "Transfer the selected settings to the newly selected preset." -msgstr "" +msgstr "Перенести выбранные параметры во вновь выбранный профиль." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:750 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:756 msgid "Save the selected options to preset \"%1%\"." -msgstr "" +msgstr "Сохранить выбранные параметры в профиле \"%1%\"." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:751 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:757 msgid "Transfer the selected options to the newly selected preset \"%1%\"." -msgstr "" +msgstr "Перенести выбранные параметры во вновь выбранный профиль \"%1%\"." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1010 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1019 msgid "The following presets were modified:" -msgstr "" +msgstr "Следующие профили были изменены:" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1015 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1024 msgid "Preset \"%1%\" has the following unsaved changes:" -msgstr "" +msgstr "Профиль \"%1%\" имеет следующие несохранённые изменения:" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1019 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1028 msgid "" "Preset \"%1%\" is not compatible with the new printer profile and it has the " "following unsaved changes:" msgstr "" +"Профиль \"%1%\" несовместим с новым профилем принтера, и в нём есть следующие " +"несохраненные изменения:" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1020 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1029 msgid "" "Preset \"%1%\" is not compatible with the new print profile and it has the " "following unsaved changes:" msgstr "" +"Профиль \"%1%\" несовместим с новым профилем печати, и имеет следующие " +"несохраненные изменения:" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1067 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1075 msgid "Extruders count" -msgstr "" +msgstr "Количество экструдеров" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1183 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1197 msgid "Old value" -msgstr "" +msgstr "Старое значение" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1184 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1198 msgid "New value" -msgstr "" +msgstr "Новое значение" #: src/slic3r/GUI/UpdateDialogs.cpp:38 msgid "Update available" @@ -7454,20 +7697,20 @@ msgstr "Новая версия:" #: src/slic3r/GUI/UpdateDialogs.cpp:53 msgid "Changelog && Download" -msgstr "Журнал изменение && Скачивание" +msgstr "История изменений && Скачать" #: src/slic3r/GUI/UpdateDialogs.cpp:60 src/slic3r/GUI/UpdateDialogs.cpp:125 #: src/slic3r/GUI/UpdateDialogs.cpp:183 msgid "Open changelog page" -msgstr "Открыть страницу изменений" +msgstr "Открыть страницу истории изменений" #: src/slic3r/GUI/UpdateDialogs.cpp:65 msgid "Open download page" -msgstr "Открыть страницу закачки" +msgstr "Открыть страницу загрузки" #: src/slic3r/GUI/UpdateDialogs.cpp:71 msgid "Don't notify about new releases any more" -msgstr "Больше не уведомлять о новых выпусках" +msgstr "Больше не уведомлять о новых релизах" #: src/slic3r/GUI/UpdateDialogs.cpp:89 src/slic3r/GUI/UpdateDialogs.cpp:266 msgid "Configuration update" @@ -7481,15 +7724,15 @@ msgstr "Доступно обновление конфигурации" msgid "" "Would you like to install it?\n" "\n" -"Note that a full configuration snapshot will be created first. It can then " -"be restored at any time should there be a problem with the new version.\n" +"Note that a full configuration snapshot will be created first. It can then be " +"restored at any time should there be a problem with the new version.\n" "\n" "Updated configuration bundles:" msgstr "" "Вы хотите установить его?\n" "\n" -"Обратите внимание, что сначала будет создан снапшот. Он может быть " -"восстановлен в любое время, если возникнет проблема с новой версией.\n" +"Обратите внимание, что сначала будет создан снапшот. Он может быть восстановлен в " +"любое время, если возникнет проблема с новой версией.\n" "\n" "Обновлённые пакеты конфигурации:" @@ -7500,64 +7743,62 @@ msgstr "Комментарий:" #: src/slic3r/GUI/UpdateDialogs.cpp:148 src/slic3r/GUI/UpdateDialogs.cpp:210 #, c-format msgid "%s incompatibility" -msgstr "Несовместимость %s" +msgstr "Несовместимость с %s" #: src/slic3r/GUI/UpdateDialogs.cpp:148 msgid "You must install a configuration update." -msgstr "Вы должны установить обновление настроек." +msgstr "Необходимо установить обновление конфигурации." #: src/slic3r/GUI/UpdateDialogs.cpp:151 #, c-format msgid "" "%s will now start updates. Otherwise it won't be able to start.\n" "\n" -"Note that a full configuration snapshot will be created first. It can then " -"be restored at any time should there be a problem with the new version.\n" +"Note that a full configuration snapshot will be created first. It can then be " +"restored at any time should there be a problem with the new version.\n" "\n" "Updated configuration bundles:" msgstr "" -"%s начнет обновления. В противном случае он не запустится.\n" +"Теперь %s запустит обновление. Иначе он не сможет начать работу.\n" "\n" -"Обратите внимание, что сначала будет создан снапшот полной конфигурации. Он " -"может быть восстановлен в любое время, если возникнет проблема с новой " -"версией.\n" +"Обратите внимание, что сначала будет создан снапшот. Он может быть восстановлен в " +"любое время, если возникнет проблема с новой версией.\n" "\n" "Обновлённые пакеты конфигурации:" #: src/slic3r/GUI/UpdateDialogs.cpp:191 src/slic3r/GUI/UpdateDialogs.cpp:246 #, c-format msgid "Exit %s" -msgstr "Выход из %s" +msgstr "Выйти из %s" #: src/slic3r/GUI/UpdateDialogs.cpp:211 #, c-format msgid "%s configuration is incompatible" -msgstr "Настройки %s несовместимы" +msgstr "Несовместимая конфигурация %s" #: src/slic3r/GUI/UpdateDialogs.cpp:216 #, c-format msgid "" "This version of %s is not compatible with currently installed configuration " "bundles.\n" -"This probably happened as a result of running an older %s after using a " -"newer one.\n" +"This probably happened as a result of running an older %s after using a newer one.\n" "\n" -"You may either exit %s and try again with a newer version, or you may re-run " -"the initial configuration. Doing so will create a backup snapshot of the " -"existing configuration before installing files compatible with this %s." +"You may either exit %s and try again with a newer version, or you may re-run the " +"initial configuration. Doing so will create a backup snapshot of the existing " +"configuration before installing files compatible with this %s." msgstr "" -"Эта версия %s не совместима с установленными пакетами настроек.\n" +"Эта версия %s не совместима с установленными пакетами конфигурации.\n" "Вероятно, это произошло в результате запуска более старой версии %s после " "использования более новой.\n" "\n" -"Вы можете выйти из %s и повторить попытку с новой версией, либо повторно " -"запустить начальную настройку. Это создаст резервную копию существующих " -"настроек перед установкой файлов, совместимых с этой версией %s." +"Вы можете выйти из %s и повторить попытку с новой версией, либо повторно запустить " +"начальную конфигурацию. Это создаст резервную копию существующей конфигурации перед " +"установкой файлов, совместимых с этой версией %s." #: src/slic3r/GUI/UpdateDialogs.cpp:225 #, c-format msgid "This %s version: %s" -msgstr "%s, версия %s" +msgstr "Версия %s: %s" #: src/slic3r/GUI/UpdateDialogs.cpp:230 msgid "Incompatible bundles:" @@ -7572,22 +7813,22 @@ msgstr "Перенастроить" msgid "" "%s now uses an updated configuration structure.\n" "\n" -"So called 'System presets' have been introduced, which hold the built-in " -"default settings for various printers. These System presets cannot be " -"modified, instead, users now may create their own presets inheriting " -"settings from one of the System presets.\n" -"An inheriting preset may either inherit a particular value from its parent " -"or override it with a customized value.\n" +"So called 'System presets' have been introduced, which hold the built-in default " +"settings for various printers. These System presets cannot be modified, instead, " +"users now may create their own presets inheriting settings from one of the System " +"presets.\n" +"An inheriting preset may either inherit a particular value from its parent or " +"override it with a customized value.\n" "\n" -"Please proceed with the %s that follows to set up the new presets and to " -"choose whether to enable automatic preset updates." +"Please proceed with the %s that follows to set up the new presets and to choose " +"whether to enable automatic preset updates." msgstr "" -"В %s изменилась структура настроек.\n" +"Теперь %s использует обновлённую структуру конфигурации.\n" "\n" "Были введены так называемые 'системные профили', которые содержат встроенные " -"настройки по умолчанию для разных принтеров. Эти системные профили не могут " -"быть изменены. Вместо этого пользователи теперь могут создавать собственные " -"профили, наследующие настройки от одного из системных профилей.\n" +"настройки по умолчанию для разных принтеров. Эти системные профили не могут быть " +"изменены. Вместо этого пользователи теперь могут создавать собственные профили, " +"наследующие настройки от одного из системных профилей.\n" "Наследующий профиль может либо наследовать определённое значение от своего " "родителя, либо переопределить его с помощью настроенного значения.\n" "\n" @@ -7596,21 +7837,20 @@ msgstr "" #: src/slic3r/GUI/UpdateDialogs.cpp:287 msgid "For more information please visit our wiki page:" -msgstr "" -"Для получения дополнительной информации, посетите нашу страницу в Википедии:" +msgstr "Для получения дополнительной информации, посетите нашу вики-страницу:" #: src/slic3r/GUI/UpdateDialogs.cpp:304 msgid "Configuration updates" -msgstr "Обновления конфигурации" +msgstr "Обновление конфигурации" #: src/slic3r/GUI/UpdateDialogs.cpp:304 msgid "No updates available" -msgstr "Нет доступных обновлений" +msgstr "Обновления отсутствуют" #: src/slic3r/GUI/UpdateDialogs.cpp:309 #, c-format msgid "%s has no configuration updates available." -msgstr "%s не имеет доступных обновлений конфигурации." +msgstr "Обновления конфигурации для %s отсутствуют." #: src/slic3r/GUI/WipeTowerDialog.cpp:15 msgid "Ramming customization" @@ -7618,26 +7858,26 @@ msgstr "Настройки рэмминга" #: src/slic3r/GUI/WipeTowerDialog.cpp:41 msgid "" -"Ramming denotes the rapid extrusion just before a tool change in a single-" -"extruder MM printer. Its purpose is to properly shape the end of the " -"unloaded filament so it does not prevent insertion of the new filament and " -"can itself be reinserted later. This phase is important and different " -"materials can require different extrusion speeds to get the good shape. For " -"this reason, the extrusion rates during ramming are adjustable.\n" +"Ramming denotes the rapid extrusion just before a tool change in a single-extruder " +"MM printer. Its purpose is to properly shape the end of the unloaded filament so it " +"does not prevent insertion of the new filament and can itself be reinserted later. " +"This phase is important and different materials can require different extrusion " +"speeds to get the good shape. For this reason, the extrusion rates during ramming " +"are adjustable.\n" "\n" -"This is an expert-level setting, incorrect adjustment will likely lead to " -"jams, extruder wheel grinding into filament etc." +"This is an expert-level setting, incorrect adjustment will likely lead to jams, " +"extruder wheel grinding into filament etc." msgstr "" "Рэмминг (ramming) означает быстрое экструдирование непосредственно перед " -"сменой сопла в одноэкструдерном мультиматериальном принтере. Его цель " -"состоит в том, чтобы правильно сформировать конец не загруженного прутка, " -"чтобы он не препятствовал вставке нового прутка или позднее повторно " -"вставляемого этого же. Эта фаза важна, и разные материалы могут потребовать " -"разных скоростей экструзии, чтобы получить хорошую форму. По этой причине " -"скорость экструзии во время рэмминга регулируется.\n" +"сменой инструмента в одноэкструдерном мультиматериальном принтере. Его цель состоит в том, " +"чтобы правильно сформировать конец незагруженного прутка, чтобы он не препятствовал " +"вставке нового прутка или этого же прутка, вставленного позже. Эта фаза важна " +"и разные материалы могут потребовать разных скоростей экструзии, чтобы " +"получить хорошую форму. По этой причине скорость экструзии во время рэмминга " +"регулируется.\n" "\n" -"Этот параметр для опытных пользователей, неправильная настройка, может " -"привести к замятию, протирание прутка приводом экструдера и т.д." +"Эта опция для опытных пользователей, неправильная настройка может привести к " +"замятию, протиранию прутка приводом экструдера и т.д." #: src/slic3r/GUI/WipeTowerDialog.cpp:83 msgid "Total ramming time" @@ -7657,27 +7897,25 @@ msgstr "Расстояние между линиями при рэмминге" #: src/slic3r/GUI/WipeTowerDialog.cpp:142 msgid "Wipe tower - Purging volume adjustment" -msgstr "Башня очистки - регулировка объёма сброса пластика" +msgstr "Черновая башня - регулировка объёма сброса пластика" #: src/slic3r/GUI/WipeTowerDialog.cpp:254 -msgid "" -"Here you can adjust required purging volume (mm³) for any given pair of " -"tools." +msgid "Here you can adjust required purging volume (mm³) for any given pair of tools." msgstr "" "Здесь вы можете отрегулировать требуемый объём очистки (мм³) для любой пары " -"сопел." +"инструментов." #: src/slic3r/GUI/WipeTowerDialog.cpp:255 msgid "Extruder changed to" -msgstr "Экструдер изменен на" +msgstr "Экструдер перешёл на - " #: src/slic3r/GUI/WipeTowerDialog.cpp:263 msgid "unloaded" -msgstr "выгрузку" +msgstr "выгрузка" #: src/slic3r/GUI/WipeTowerDialog.cpp:264 msgid "loaded" -msgstr "загрузку" +msgstr "загрузка" #: src/slic3r/GUI/WipeTowerDialog.cpp:276 msgid "Tool #" @@ -7685,11 +7923,11 @@ msgstr "Инструмент #" #: src/slic3r/GUI/WipeTowerDialog.cpp:285 msgid "" -"Total purging volume is calculated by summing two values below, depending on " -"which tools are loaded/unloaded." +"Total purging volume is calculated by summing two values below, depending on which " +"tools are loaded/unloaded." msgstr "" -"Общий объём прочистки вычисляется путём суммирования двух нижеуказанных " -"значений, в зависимости от того, какие сопла предзагружены/выгружены." +"Общий объём прочистки вычисляется путём суммирования двух нижеуказанных значений, в " +"зависимости от того, какие инструменты предзагружены/выгружены." #: src/slic3r/GUI/WipeTowerDialog.cpp:286 msgid "Volume to purge (mm³) when the filament is being" @@ -7701,13 +7939,12 @@ msgstr "Из" #: src/slic3r/GUI/WipeTowerDialog.cpp:365 msgid "" -"Switching to simple settings will discard changes done in the advanced " -"mode!\n" +"Switching to simple settings will discard changes done in the advanced mode!\n" "\n" "Do you want to proceed?" msgstr "" -"Переключение на упрощённые настройки отменит изменения, сделанные в " -"расширенном режиме!\n" +"Переключение на упрощённые настройки отменит изменения, сделанные в расширенном " +"режиме!\n" "\n" "Хотите продолжить?" @@ -7719,24 +7956,24 @@ msgstr "Показать упрощённые настройки" msgid "Show advanced settings" msgstr "Показать расширенные настройки" -#: src/slic3r/GUI/wxExtensions.cpp:623 +#: src/slic3r/GUI/wxExtensions.cpp:627 #, c-format msgid "Switch to the %s mode" -msgstr "Переключиться в %s режим" +msgstr "Переключиться в режим %s" -#: src/slic3r/GUI/wxExtensions.cpp:624 +#: src/slic3r/GUI/wxExtensions.cpp:628 #, c-format msgid "Current mode is %s" -msgstr "Текущий режим: %s" +msgstr "Текущий режим %s" #: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:68 #, c-format msgid "Mismatched type of print host: %s" -msgstr "" +msgstr "Несоответствующий тип хоста печати: %s" #: src/slic3r/Utils/AstroBox.cpp:84 msgid "Connection to AstroBox works correctly." -msgstr "Подключение к AstroBox установлено." +msgstr "Соединение с AstroBox успешно установлено." #: src/slic3r/Utils/AstroBox.cpp:90 msgid "Could not connect to AstroBox" @@ -7748,7 +7985,7 @@ msgstr "Примечание: требуется версия AstroBox не ни #: src/slic3r/Utils/Duet.cpp:47 msgid "Connection to Duet works correctly." -msgstr "Подключение к Duet установлено." +msgstr "Соединение с Duet успешно установлено." #: src/slic3r/Utils/Duet.cpp:53 msgid "Could not connect to Duet" @@ -7758,7 +7995,7 @@ msgstr "Не удалось подключиться к Duet" #: src/slic3r/Utils/FlashAir.cpp:122 src/slic3r/Utils/FlashAir.cpp:143 #: src/slic3r/Utils/FlashAir.cpp:159 msgid "Unknown error occured" -msgstr "Возникла неизвестная ошибка" +msgstr "Произошла неизвестная ошибка" #: src/slic3r/Utils/Duet.cpp:145 msgid "Wrong password" @@ -7766,108 +8003,104 @@ msgstr "Неправильный пароль" #: src/slic3r/Utils/Duet.cpp:148 msgid "Could not get resources to create a new connection" -msgstr "" +msgstr "Не удалось получить ресурсы для создания нового подключения" -#: src/slic3r/Utils/FixModelByWin10.cpp:219 -#: src/slic3r/Utils/FixModelByWin10.cpp:359 +#: src/slic3r/Utils/FixModelByWin10.cpp:219 src/slic3r/Utils/FixModelByWin10.cpp:359 msgid "Exporting source model" -msgstr "Экспортируется исходная модель" +msgstr "Экспорт исходной модели" #: src/slic3r/Utils/FixModelByWin10.cpp:235 msgid "Failed loading the input model." -msgstr "" +msgstr "Ошибка загрузки входной модели." #: src/slic3r/Utils/FixModelByWin10.cpp:242 msgid "Repairing model by the Netfabb service" -msgstr "" +msgstr "Ремонт модели с помощью сервиса Netfabb" #: src/slic3r/Utils/FixModelByWin10.cpp:248 msgid "Mesh repair failed." -msgstr "" +msgstr "Ошибка восстановления сетки." -#: src/slic3r/Utils/FixModelByWin10.cpp:251 -#: src/slic3r/Utils/FixModelByWin10.cpp:378 +#: src/slic3r/Utils/FixModelByWin10.cpp:251 src/slic3r/Utils/FixModelByWin10.cpp:378 msgid "Loading repaired model" -msgstr "Загружается исправленная модель" +msgstr "Загрузка отремонтированной модели" -#: src/slic3r/Utils/FixModelByWin10.cpp:263 -#: src/slic3r/Utils/FixModelByWin10.cpp:270 +#: src/slic3r/Utils/FixModelByWin10.cpp:263 src/slic3r/Utils/FixModelByWin10.cpp:270 #: src/slic3r/Utils/FixModelByWin10.cpp:302 msgid "Saving mesh into the 3MF container failed." -msgstr "" +msgstr "Не удалось сохранить сетку в 3MF контейнер." #: src/slic3r/Utils/FixModelByWin10.cpp:340 msgid "Model fixing" -msgstr "" +msgstr "Починка модели" #: src/slic3r/Utils/FixModelByWin10.cpp:341 msgid "Exporting model" -msgstr "" +msgstr "Экспорт модели" #: src/slic3r/Utils/FixModelByWin10.cpp:368 msgid "Export of a temporary 3mf file failed" -msgstr "" +msgstr "Ошибка экспорта временного 3mf файла" #: src/slic3r/Utils/FixModelByWin10.cpp:383 msgid "Import of the repaired 3mf file failed" -msgstr "" +msgstr "Сбой импорта восстановленного 3mf файла" #: src/slic3r/Utils/FixModelByWin10.cpp:385 msgid "Repaired 3MF file does not contain any object" -msgstr "" +msgstr "Отремонтированный 3MF файл не содержит никаких моделей" #: src/slic3r/Utils/FixModelByWin10.cpp:387 msgid "Repaired 3MF file contains more than one object" -msgstr "" +msgstr "Отремонтированный 3MF файл содержит более одной модели" #: src/slic3r/Utils/FixModelByWin10.cpp:389 msgid "Repaired 3MF file does not contain any volume" -msgstr "" +msgstr "Отремонтированный 3MF файл не содержит объёма" #: src/slic3r/Utils/FixModelByWin10.cpp:391 msgid "Repaired 3MF file contains more than one volume" -msgstr "" +msgstr "Отремонтированный 3MF файл содержит более одного объёма" #: src/slic3r/Utils/FixModelByWin10.cpp:400 msgid "Model repair finished" -msgstr "Исправление модели закончено" +msgstr "Ремонт модели закончен" #: src/slic3r/Utils/FixModelByWin10.cpp:406 msgid "Model repair canceled" -msgstr "Исправление модели отменено" +msgstr "Ремонт модели отменён" #: src/slic3r/Utils/FixModelByWin10.cpp:423 msgid "Model repaired successfully" -msgstr "Исправление модели выполнено успешно" +msgstr "Модель успешно отремонтирована" -#: src/slic3r/Utils/FixModelByWin10.cpp:423 -#: src/slic3r/Utils/FixModelByWin10.cpp:426 +#: src/slic3r/Utils/FixModelByWin10.cpp:423 src/slic3r/Utils/FixModelByWin10.cpp:426 msgid "Model Repair by the Netfabb service" -msgstr "Исправление модели через службу Netfabb" +msgstr "Ремонт модели службой Netfabb" #: src/slic3r/Utils/FixModelByWin10.cpp:426 msgid "Model repair failed:" -msgstr "Ошибка при исправлении модели:" +msgstr "Ошибка починки модели:" #: src/slic3r/Utils/FlashAir.cpp:58 msgid "Upload not enabled on FlashAir card." -msgstr "" +msgstr "Загрузка на карту FlashAir не была включена." #: src/slic3r/Utils/FlashAir.cpp:68 msgid "Connection to FlashAir works correctly and upload is enabled." -msgstr "Подключение к FlashAir установлено и загрузка включена." +msgstr "Подключение к FlashAir работает корректно. Загрузка на карту включена." #: src/slic3r/Utils/FlashAir.cpp:74 msgid "Could not connect to FlashAir" -msgstr "Не удалось подключиться к FlashAir" +msgstr "Не удаётся подключиться к FlashAir" #: src/slic3r/Utils/FlashAir.cpp:76 msgid "" -"Note: FlashAir with firmware 2.00.02 or newer and activated upload function " -"is required." +"Note: FlashAir with firmware 2.00.02 or newer and activated upload function is " +"required." msgstr "" -"Замечание: требуется FlashAir с прошивкой 2.00.02 или новее, а также " -"включение функции заливки." +"Примечание: для активации функцией загрузки, требуется FlashAir с прошивкой 2.00.02 " +"и выше." #: src/slic3r/Utils/OctoPrint.cpp:83 msgid "Connection to OctoPrint works correctly." @@ -7909,69 +8142,87 @@ msgid "" "Could not detect system SSL certificate store. PrusaSlicer will be unable to " "establish secure network connections." msgstr "" +"Не удалось обнаружить системное хранилище SSL-сертификатов. PrusaSlicer не сможет " +"устанавливать безопасные сетевые соединения." #: src/slic3r/Utils/Http.cpp:78 msgid "PrusaSlicer detected system SSL certificate store in: %1%" -msgstr "" +msgstr "PrusaSlicer обнаружил хранилище системных SSL-сертификатов в: %1%" #: src/slic3r/Utils/Http.cpp:82 msgid "" -"To specify the system certificate store manually, please set the %1% " -"environment variable to the correct CA bundle and restart the application." +"To specify the system certificate store manually, please set the %1% environment " +"variable to the correct CA bundle and restart the application." msgstr "" +"Чтобы вручную указать хранилище системных сертификатов, задайте для переменной " +"среды %1% правильный пакет CA и перезапустите приложение." #: src/slic3r/Utils/Http.cpp:91 msgid "" -"CURL init has failed. PrusaSlicer will be unable to establish network " -"connections. See logs for additional details." +"CURL init has failed. PrusaSlicer will be unable to establish network connections. " +"See logs for additional details." msgstr "" +"Ошибка инициализации URL-адреса клиента. PrusaSlicer не сможет установить сетевые " +"подключения. Смотрите журнал для дополнительные информации." #: src/slic3r/Utils/Process.cpp:151 msgid "Open G-code file:" -msgstr "" +msgstr "Выберите G-код файл:" -#: src/libslic3r/GCode.cpp:610 +#: src/libslic3r/GCode.cpp:518 msgid "There is an object with no extrusions on the first layer." -msgstr "" +msgstr "На первом слое у модели отсутствует слой для экструзии." -#: src/libslic3r/GCode.cpp:628 +#: src/libslic3r/GCode.cpp:536 msgid "Empty layers detected, the output would not be printable." -msgstr "" +msgstr "Обнаружены пустые слои, печать невозможна." -#: src/libslic3r/GCode.cpp:629 +#: src/libslic3r/GCode.cpp:537 msgid "Print z" +msgstr "Печать на высоте" + +#: src/libslic3r/GCode.cpp:538 +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 "" +"Обычно это происходит из-за ничтожно малой экструзии или из-за повреждённой " +"модели. \n" +"Попробуйте отремонтировать модель или изменить её ориентацию на столе." -#: src/libslic3r/GCode.cpp:630 +#: src/libslic3r/GCode.cpp:1261 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." +"Your print is very close to the priming regions. Make sure there is no collision." msgstr "" +"Модель(-и) находится очень близко к области предзарядки (область подготовки " +"экструдера). Убедитесь, что не произойдёт столкновения." #: src/libslic3r/ExtrusionEntity.cpp:324 src/libslic3r/ExtrusionEntity.cpp:360 msgid "Mixed" msgstr "Смешанный" #: src/libslic3r/Flow.cpp:61 -msgid "" -"Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible." +msgid "Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible." msgstr "" +"Не удаётся рассчитать ширину экструзии для %1%: Переменная \"%2%\" недоступна." -#: src/libslic3r/Format/3mf.cpp:1667 +#: src/libslic3r/Format/3mf.cpp:1668 msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " "compatible." msgstr "" +"Выбранный 3mf файл не совместим, так как был сохранён в более новой версии %1%." -#: src/libslic3r/Format/AMF.cpp:955 +#: src/libslic3r/Format/AMF.cpp:958 msgid "" "The selected amf file has been saved with a newer version of %1% and is not " "compatible." msgstr "" +"Выбранный amf файл не совместим, так как был сохранён в более новой версии %1%." #: src/libslic3r/miniz_extension.cpp:91 msgid "undefined error" -msgstr "неопределённая ошибка" +msgstr "неопределенная ошибка" #: src/libslic3r/miniz_extension.cpp:93 msgid "too many files" @@ -7979,7 +8230,7 @@ msgstr "слишком много файлов" #: src/libslic3r/miniz_extension.cpp:95 msgid "file too large" -msgstr "слишком большой файл" +msgstr "файл слишком большой" #: src/libslic3r/miniz_extension.cpp:97 msgid "unsupported method" @@ -7991,87 +8242,87 @@ msgstr "неподдерживаемое шифрование" #: src/libslic3r/miniz_extension.cpp:101 msgid "unsupported feature" -msgstr "неподдерживаемое свойство" +msgstr "неподдерживаемая функция" #: src/libslic3r/miniz_extension.cpp:103 msgid "failed finding central directory" -msgstr "" +msgstr "не удалось найти центральный каталог" #: src/libslic3r/miniz_extension.cpp:105 msgid "not a ZIP archive" -msgstr "" +msgstr "это не ZIP архив" #: src/libslic3r/miniz_extension.cpp:107 msgid "invalid header or archive is corrupted" -msgstr "" +msgstr "неверный заголовок или архив поврежден" #: src/libslic3r/miniz_extension.cpp:109 msgid "unsupported multidisk archive" -msgstr "" +msgstr "неподдерживаемый многофайловый архив" #: src/libslic3r/miniz_extension.cpp:111 msgid "decompression failed or archive is corrupted" -msgstr "" +msgstr "сбой распаковки или повреждённый архив" #: src/libslic3r/miniz_extension.cpp:113 msgid "compression failed" -msgstr "сбой сжатия" +msgstr "сжатие не удалось" #: src/libslic3r/miniz_extension.cpp:115 msgid "unexpected decompressed size" -msgstr "" +msgstr "непредвиденный распакованный размер" #: src/libslic3r/miniz_extension.cpp:117 msgid "CRC-32 check failed" -msgstr "" +msgstr "Ошибка проверки CRC-32" #: src/libslic3r/miniz_extension.cpp:119 msgid "unsupported central directory size" -msgstr "" +msgstr "неподдерживаемый размер заголовка файла центрального каталога" #: src/libslic3r/miniz_extension.cpp:121 msgid "allocation failed" -msgstr "распределение не удалось" +msgstr "ошибка выделения" #: src/libslic3r/miniz_extension.cpp:123 msgid "file open failed" -msgstr "" +msgstr "ошибка открытия файла" #: src/libslic3r/miniz_extension.cpp:125 msgid "file create failed" -msgstr "" +msgstr "ошибка создания файла" #: src/libslic3r/miniz_extension.cpp:127 msgid "file write failed" -msgstr "не удалось записать файл" +msgstr "ошибка записи файла" #: src/libslic3r/miniz_extension.cpp:129 msgid "file read failed" -msgstr "" +msgstr "ошибка чтения файла" #: src/libslic3r/miniz_extension.cpp:131 msgid "file close failed" -msgstr "" +msgstr "ошибка закрытия файла" #: src/libslic3r/miniz_extension.cpp:133 msgid "file seek failed" -msgstr "" +msgstr "файл не найден" #: src/libslic3r/miniz_extension.cpp:135 msgid "file stat failed" -msgstr "" +msgstr "ошибка файла статистики" #: src/libslic3r/miniz_extension.cpp:137 msgid "invalid parameter" -msgstr "некорректный параметр" +msgstr "неверный параметр" #: src/libslic3r/miniz_extension.cpp:139 msgid "invalid filename" -msgstr "" +msgstr "неверное имя" #: src/libslic3r/miniz_extension.cpp:141 msgid "buffer too small" -msgstr "" +msgstr "буфер слишком мал" #: src/libslic3r/miniz_extension.cpp:143 msgid "internal error" @@ -8083,249 +8334,256 @@ msgstr "файл не найден" #: src/libslic3r/miniz_extension.cpp:147 msgid "archive is too large" -msgstr "" +msgstr "архив слишком большой" #: src/libslic3r/miniz_extension.cpp:149 msgid "validation failed" -msgstr "проверка не удалась" +msgstr "ошибка проверки" #: src/libslic3r/miniz_extension.cpp:151 msgid "write calledback failed" -msgstr "" +msgstr "ошибка записи обратного вызова" -#: src/libslic3r/Preset.cpp:1258 +#: src/libslic3r/Preset.cpp:1299 msgid "filament" msgstr "пруток" -#: src/libslic3r/Print.cpp:1247 +#: src/libslic3r/Print.cpp:1251 msgid "All objects are outside of the print volume." -msgstr "Все объекты находятся за пределами объёма печати." +msgstr "Все модели находятся за пределами области печати." -#: src/libslic3r/Print.cpp:1250 +#: src/libslic3r/Print.cpp:1254 msgid "The supplied settings will cause an empty print." msgstr "Заданные настройки приведут к пустой печати." -#: src/libslic3r/Print.cpp:1254 +#: src/libslic3r/Print.cpp:1258 msgid "Some objects are too close; your extruder will collide with them." msgstr "" -"Некоторые объекты находятся слишком близко друг к другу. Экструдер при " -"печати столкнётся с ними." +"Некоторые модели находятся слишком близко друг к другу. Экструдер при печати " +"столкнётся с ними." -#: src/libslic3r/Print.cpp:1256 -msgid "" -"Some objects are too tall and cannot be printed without extruder collisions." -msgstr "" -"Некоторые объекты слишком высокие и при печати экструдер столкнётся с ними." +#: src/libslic3r/Print.cpp:1260 +msgid "Some objects are too tall and cannot be printed without extruder collisions." +msgstr "Некоторые модели слишком высокие и при печати экструдер столкнётся с ними." -#: src/libslic3r/Print.cpp:1265 -msgid "The Spiral Vase option can only be used when printing a single object." +#: src/libslic3r/Print.cpp:1269 +msgid "" +"Only a single object may be printed at a time in Spiral Vase mode. Either remove " +"all but the last object, or enable sequential mode by \"complete_objects\"." msgstr "" -"Режим «Cпиральная ваза» может использоваться только при печати одиночного " -"объекта." +"Режим \"Спиральная ваза\" может использоваться для печати только одной модели. Либо " +"оставьте на столе одну модель или включите последовательную печать с помощью " +"\"complete_objects\"." -#: src/libslic3r/Print.cpp:1272 -msgid "" -"The Spiral Vase option can only be used when printing single material " -"objects." -msgstr "В режиме \"Cпиральная ваза\" можно печатать только одним материалом." +#: src/libslic3r/Print.cpp:1277 +msgid "The Spiral Vase option can only be used when printing single material objects." +msgstr "В режиме \"Спиральная ваза\" можно печатать только одним материалом." -#: src/libslic3r/Print.cpp:1285 +#: src/libslic3r/Print.cpp:1290 msgid "" -"The wipe tower is only supported if all extruders have the same nozzle " -"diameter and use filaments of the same diameter." +"The wipe tower is only supported if all extruders have the same nozzle diameter and " +"use filaments of the same diameter." msgstr "" -"Черновая башня поддерживается только, если у всех экструдеров одинаковый " -"диаметр сопла и используется пруток одинакового диаметра." +"Режим черновой башни применим только в том случае, если все экструдеры имеют " +"одинаковый диаметр сопла и используется пруток одного диаметра." -#: src/libslic3r/Print.cpp:1291 +#: src/libslic3r/Print.cpp:1296 msgid "" "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter, " "RepRapFirmware and Repetier G-code flavors." msgstr "" +"В настоящее время режим черновой башни поддерживается только следующими типами G-" +"кода: Marlin, RepRap/Sprinter, RepRapFirmware, Repetier." -#: src/libslic3r/Print.cpp:1293 +#: src/libslic3r/Print.cpp:1298 msgid "" -"The Wipe Tower is currently only supported with the relative extruder " -"addressing (use_relative_e_distances=1)." +"The Wipe Tower is currently only supported with the relative extruder addressing " +"(use_relative_e_distances=1)." msgstr "" -"В настоящее время для режима башни очистки поддерживается только " -"относительная адресация экструдера (use_relative_e_distances=1)." +"В настоящее время для режима черновой башни поддерживается только относительная " +"адресация экструдера (use_relative_e_distances=1)." -#: src/libslic3r/Print.cpp:1295 +#: src/libslic3r/Print.cpp:1300 msgid "Ooze prevention is currently not supported with the wipe tower enabled." msgstr "" +"\"Предотвращение течи материала\" в настоящее время не поддерживается при " +"включённой черновой башне." -#: src/libslic3r/Print.cpp:1297 -msgid "" -"The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)." +#: src/libslic3r/Print.cpp:1302 +msgid "The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)." msgstr "" +"Черновая башня в настоящее время не поддерживает объёмные значения E " +"(use_volumetric_e=0)." -#: src/libslic3r/Print.cpp:1299 -msgid "" -"The Wipe Tower is currently not supported for multimaterial sequential " -"prints." +#: src/libslic3r/Print.cpp:1304 +msgid "The Wipe Tower is currently not supported for multimaterial sequential prints." msgstr "" -"Режим башни очистки применим для нескольких объектов только в том случае, " -"если они имеют одинаковую высоту слоя." +"В настоящее время режим черновой башни не поддерживает последовательную печать для " +"мультиматериальных принтеров." -#: src/libslic3r/Print.cpp:1320 +#: src/libslic3r/Print.cpp:1325 msgid "" -"The Wipe Tower is only supported for multiple objects if they have equal " -"layer heights" +"The Wipe Tower is only supported for multiple objects if they have equal layer " +"heights" msgstr "" -"Режим башни очистки применим для нескольких объектов только в том случае, " -"если они имеют одинаковую высоту слоя" +"Режим черновой башни применим для нескольких моделей только в том случае, если они " +"имеют одинаковую высоту слоя." -#: src/libslic3r/Print.cpp:1322 +#: src/libslic3r/Print.cpp:1327 msgid "" -"The Wipe Tower is only supported for multiple objects if they are printed " -"over an equal number of raft layers" +"The Wipe Tower is only supported for multiple objects if they are printed over an " +"equal number of raft layers" msgstr "" -"Режим башни очистки применим для нескольких объектов только в том случае, " -"если они имеют одинаковое число слоёв подложки" +"Режим черновой башни применим для нескольких моделей только в том случае, если они " +"имеют одинаковое число слоёв подложки." -#: src/libslic3r/Print.cpp:1324 +#: src/libslic3r/Print.cpp:1329 msgid "" -"The Wipe Tower is only supported for multiple objects if they are printed " -"with the same support_material_contact_distance" +"The Wipe Tower is only supported for multiple objects if they are printed with the " +"same support_material_contact_distance" msgstr "" -"Башня очистки поддерживается для нескольких объектов только в том случае, " -"если они печатаются с одинаковым значением support_material_contact_distance" +"Режим черновой башни применим для нескольких моделей только в том случае, если они " +"печатаются с одинаковым support_material_contact_distance (расстояние от поддержки " +"до модели по вертикали)." -#: src/libslic3r/Print.cpp:1326 +#: src/libslic3r/Print.cpp:1331 msgid "" -"The Wipe Tower is only supported for multiple objects if they are sliced " -"equally." +"The Wipe Tower is only supported for multiple objects if they are sliced equally." msgstr "" -"Режим башни очистки применим для нескольких объектов только в том случае, " -"если они нарезаны одинаково." +"Режим черновой башни применим для нескольких моделей только в том случае, если они " +"нарезаны одинаково." -#: src/libslic3r/Print.cpp:1368 +#: src/libslic3r/Print.cpp:1373 msgid "" -"The Wipe tower is only supported if all objects have the same variable layer " -"height" +"The Wipe tower is only supported if all objects have the same variable layer height" msgstr "" -"Черновая башня поддерживается только, если все объекты имеют одинаковую " -"значение настройки переменной высоты слоя" +"Режим черновой башни применим только в том случае, если все модели имеют одну и " +"туже переменную высоту слоя." -#: src/libslic3r/Print.cpp:1394 -msgid "" -"One or more object were assigned an extruder that the printer does not have." +#: src/libslic3r/Print.cpp:1399 +msgid "One or more object were assigned an extruder that the printer does not have." msgstr "" -"Для одного или нескольких объектов был назначен экструдер, который у " -"принтера отсутствует." +"Для одного или нескольких моделей был назначен экструдер, который у принтера " +"отсутствует." -#: src/libslic3r/Print.cpp:1403 +#: src/libslic3r/Print.cpp:1408 msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm" -msgstr "" +msgstr "Значение параметра %1%=%2% мм слишком мало для печати при высоте слоя %3% мм" -#: src/libslic3r/Print.cpp:1406 +#: src/libslic3r/Print.cpp:1411 msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm" -msgstr "" +msgstr "Чрезмерное значение параметра %1%=%2% мм для печати при диаметре сопла %3% мм" -#: src/libslic3r/Print.cpp:1417 +#: src/libslic3r/Print.cpp:1422 msgid "" -"Printing with multiple extruders of differing nozzle diameters. If support " -"is to be printed with the current extruder (support_material_extruder == 0 " -"or support_material_interface_extruder == 0), all nozzles have to be of the " -"same diameter." +"Printing with multiple extruders of differing nozzle diameters. If support is to be " +"printed with the current extruder (support_material_extruder == 0 or " +"support_material_interface_extruder == 0), all nozzles have to be of the same " +"diameter." msgstr "" -"Печать несколькими экструдерами с соплами различного диаметра. Если " -"поддержка должна быть напечатана текущим экструдером " -"(support_material_extruder == 0 или support_material_interface_extruder == " -"0), все сопла должны иметь одинаковый диаметр." +"Печать несколькими экструдерами с соплами различного диаметра. Если поддержка " +"должна быть напечатана текущим экструдером (support_material_extruder == 0 или " +"support_material_interface_extruder == 0), все сопла должны иметь одинаковый " +"диаметр." -#: src/libslic3r/Print.cpp:1425 +#: src/libslic3r/Print.cpp:1430 msgid "" -"For the Wipe Tower to work with the soluble supports, the support layers " -"need to be synchronized with the object layers." +"For the Wipe Tower to work with the soluble supports, the support layers need to be " +"synchronized with the object layers." msgstr "" -"Для того, чтобы башня очистки работала с растворимыми поддержками, слои " -"поддержек должны быть синхронизированы со слоями объекта." +"Для того, чтобы режим черновой башни работал с растворимой поддержкой, слои " +"поддержки должны быть синхронизированы со слоями модели." -#: src/libslic3r/Print.cpp:1429 +#: src/libslic3r/Print.cpp:1434 msgid "" -"The Wipe Tower currently supports the non-soluble supports only if they are " -"printed with the current extruder without triggering a tool change. (both " -"support_material_extruder and support_material_interface_extruder need to be " -"set to 0)." +"The Wipe Tower currently supports the non-soluble supports only if they are printed " +"with the current extruder without triggering a tool change. (both " +"support_material_extruder and support_material_interface_extruder need to be set to " +"0)." msgstr "" -"В настоящее время башня очистки поддерживает нерастворимые поддержки только " +"В настоящее время режим черновой башни поддерживает нерастворимую поддержку только " "в том случае, если они печатаются текущим экструдером, без запуска смены " -"сопла. (Значения \"Экструдер, печатающий поддержки/подложки/юбки\" и " -"\"Экструдер, печатающий связующий слой поддержки/подложки\" должны быть " -"установлены в 0)." +"инструмента. (Значения \"Экструдер, печатающий поддержки/подложки/юбки\" и " +"\"Экструдер, печатающий связующий слой поддержки/подложки\" должны быть установлены " +"в 0)." -#: src/libslic3r/Print.cpp:1451 +#: src/libslic3r/Print.cpp:1456 msgid "First layer height can't be greater than nozzle diameter" -msgstr "Высота первого слоя не может быть больше диаметра сопла" +msgstr "Высота первого слоя не может быть больше диаметра сопла." -#: src/libslic3r/Print.cpp:1456 +#: src/libslic3r/Print.cpp:1461 msgid "Layer height can't be greater than nozzle diameter" msgstr "Высота слоя не может быть больше диаметра сопла" -#: src/libslic3r/Print.cpp:1615 +#: src/libslic3r/Print.cpp:1620 msgid "Infilling layers" -msgstr "Слоёв заполнения" +msgstr "Заполнение слоёв" -#: src/libslic3r/Print.cpp:1641 +#: src/libslic3r/Print.cpp:1646 msgid "Generating skirt" -msgstr "Генерируется юбка" +msgstr "Генерация юбки" -#: src/libslic3r/Print.cpp:1650 +#: src/libslic3r/Print.cpp:1655 msgid "Generating brim" -msgstr "Генерируется кайма" +msgstr "Генерация каймы" -#: src/libslic3r/Print.cpp:1673 +#: src/libslic3r/Print.cpp:1678 msgid "Exporting G-code" -msgstr "Экспортируется G-код" +msgstr "Экспорт в G-код" -#: src/libslic3r/Print.cpp:1677 +#: src/libslic3r/Print.cpp:1682 msgid "Generating G-code" -msgstr "Генерируется G-код" +msgstr "Генерация G-кода" #: src/libslic3r/SLA/Pad.cpp:532 msgid "Pad brim size is too small for the current configuration." -msgstr "" +msgstr "Размер каймы подложки слишком мал для текущих настроек." -#: src/libslic3r/SLAPrint.cpp:628 +#: src/libslic3r/SLAPrint.cpp:630 msgid "" "Cannot proceed without support points! Add support points or disable support " "generation." msgstr "" +"Невозможно продолжить без точек поддержки! Добавьте точки поддержки или отключите " +"генерацию поддержки." -#: src/libslic3r/SLAPrint.cpp:640 +#: src/libslic3r/SLAPrint.cpp:642 msgid "" -"Elevation is too low for object. Use the \"Pad around object\" feature to " -"print the object without elevation." +"Elevation is too low for object. Use the \"Pad around object\" feature to print the " +"object without elevation." msgstr "" +"Высота подъёма слишком низкая для модели. Используйте \"Подложка вокруг модели\", " +"чтобы напечатать модель без подъёма." -#: src/libslic3r/SLAPrint.cpp:646 +#: src/libslic3r/SLAPrint.cpp:648 msgid "" -"The endings of the support pillars will be deployed on the gap between the " -"object and the pad. 'Support base safety distance' has to be greater than " -"the 'Pad object gap' parameter to avoid this." +"The endings of the support pillars will be deployed on the gap between the object " +"and the pad. 'Support base safety distance' has to be greater than the 'Pad object " +"gap' parameter to avoid this." msgstr "" +"Концы тела поддержки будут размещены в зазоре между моделью и подложкой. Чтобы " +"избежать этого, \"Безопасное расстояние основания поддержки\" должно быть больше, " +"чем параметр \"Зазор между дном модели и подложкой\"." -#: src/libslic3r/SLAPrint.cpp:661 +#: src/libslic3r/SLAPrint.cpp:663 msgid "Exposition time is out of printer profile bounds." -msgstr "" +msgstr "Время засветки основных слоёв выходит за пределы профиля принтера." -#: src/libslic3r/SLAPrint.cpp:668 +#: src/libslic3r/SLAPrint.cpp:670 msgid "Initial exposition time is out of printer profile bounds." -msgstr "" +msgstr "Время засветки начальных слоёв выходит за пределы профиля принтера." -#: src/libslic3r/SLAPrint.cpp:784 +#: src/libslic3r/SLAPrint.cpp:786 msgid "Slicing done" msgstr "Нарезка завершена" #: src/libslic3r/SLAPrintSteps.cpp:44 msgid "Hollowing model" -msgstr "" +msgstr "Создание полости в модели" #: src/libslic3r/SLAPrintSteps.cpp:45 msgid "Drilling holes into model." -msgstr "" +msgstr "Создание отверстий в модели." #: src/libslic3r/SLAPrintSteps.cpp:46 msgid "Slicing model" @@ -8333,57 +8591,61 @@ msgstr "Нарезка модели" #: src/libslic3r/SLAPrintSteps.cpp:47 src/libslic3r/SLAPrintSteps.cpp:359 msgid "Generating support points" -msgstr "Генерируются вспомогательные структуры" +msgstr "Генерация точек поддержки" #: src/libslic3r/SLAPrintSteps.cpp:48 msgid "Generating support tree" -msgstr "Генерируется вспомогательное дерево" +msgstr "Генерация древовидной поддержки" #: src/libslic3r/SLAPrintSteps.cpp:49 msgid "Generating pad" -msgstr "" +msgstr "Генерация подложки" #: src/libslic3r/SLAPrintSteps.cpp:50 msgid "Slicing supports" -msgstr "Нарезаются поддержки" +msgstr "Нарезка поддержки" #: src/libslic3r/SLAPrintSteps.cpp:65 msgid "Merging slices and calculating statistics" -msgstr "" +msgstr "Объединение срезов и подсчёт статистики" #: src/libslic3r/SLAPrintSteps.cpp:66 msgid "Rasterizing layers" -msgstr "" +msgstr "Растрирование слоёв" #: src/libslic3r/SLAPrintSteps.cpp:192 msgid "Too many overlapping holes." -msgstr "" +msgstr "Слишком много пересекающихся отверстий." #: src/libslic3r/SLAPrintSteps.cpp:201 msgid "" -"Drilling holes into the mesh failed. This is usually caused by broken model. " -"Try to fix it first." +"Drilling holes into the mesh failed. This is usually caused by broken model. Try to " +"fix it first." msgstr "" +"Не удалось проделать отверстия в сетке модели. Обычно это связано с проблемой в " +"самой модели. Попробуйте сначала починить её." #: src/libslic3r/SLAPrintSteps.cpp:247 -msgid "" -"Slicing had to be stopped due to an internal error: Inconsistent slice index." +msgid "Slicing had to be stopped due to an internal error: Inconsistent slice index." msgstr "" +"Нарезку пришлось остановить из-за внутренней ошибки: несоответствие индекса среза." #: src/libslic3r/SLAPrintSteps.cpp:411 src/libslic3r/SLAPrintSteps.cpp:420 #: src/libslic3r/SLAPrintSteps.cpp:459 msgid "Visualizing supports" -msgstr "" +msgstr "Визуализация поддержек" #: src/libslic3r/SLAPrintSteps.cpp:451 msgid "No pad can be generated for this model with the current configuration" -msgstr "" +msgstr "Для этой модели с текущими настройками нельзя создать подложку." #: src/libslic3r/SLAPrintSteps.cpp:619 msgid "" -"There are unprintable objects. Try to adjust support settings to make the " -"objects printable." +"There are unprintable objects. Try to adjust support settings to make the objects " +"printable." msgstr "" +"Имеются непечатаемые модели. Попробуйте настроить параметры поддержки так, чтобы " +"сделать их доступными для печати." #: src/libslic3r/PrintBase.cpp:72 msgid "Failed processing of the output_filename_format template." @@ -8395,4453 +8657,4000 @@ msgstr "Технология принтера" #: src/libslic3r/PrintConfig.cpp:51 msgid "Bed shape" -msgstr "Форма платформы" +msgstr "Форма и размеры стола" #: src/libslic3r/PrintConfig.cpp:56 msgid "Bed custom texture" -msgstr "Пользовательская текстура платформы" +msgstr "Пользовательская текстура стола" #: src/libslic3r/PrintConfig.cpp:61 msgid "Bed custom model" -msgstr "Пользовательская модель подложки" +msgstr "Пользовательская модель стола" #: src/libslic3r/PrintConfig.cpp:66 -msgid "Picture sizes to be stored into a .gcode and .sl1 files" +msgid "G-code thumbnails" +msgstr "Эскизы G-код" + +#: src/libslic3r/PrintConfig.cpp:67 +msgid "" +"Picture sizes to be stored into a .gcode and .sl1 files, in the following format: " +"\"XxY, XxY, ...\"" msgstr "" +"Размеры изображений, сохраняемых в .gcode и .sl1 файлах (формат: \"XxY, XxY, ...\")" -#: src/libslic3r/PrintConfig.cpp:73 +#: src/libslic3r/PrintConfig.cpp:75 msgid "" -"This setting controls the height (and thus the total number) of the slices/" -"layers. Thinner layers give better accuracy but take more time to print." +"This setting controls the height (and thus the total number) of the slices/layers. " +"Thinner layers give better accuracy but take more time to print." msgstr "" -"Этот параметр определяет высоту слоя. Чем выше значение, тем быстрее печать, " -"но более низкое разрешение, и наоборот. Этот параметр не может превышать " -"диаметр используемого сопла (желательно ставить не больше ¾ от этого " -"диаметра)." +"Этот параметр определяет высоту слоя. Чем выше значение, тем быстрее печать, но " +"более низкое разрешение, и наоборот. Этот параметр не может превышать диаметр " +"используемого сопла (желательно ставить не больше ¾ от этого диаметра)." -#: src/libslic3r/PrintConfig.cpp:80 +#: src/libslic3r/PrintConfig.cpp:82 msgid "Max print height" msgstr "Максимальная высота печати" -#: src/libslic3r/PrintConfig.cpp:81 +#: src/libslic3r/PrintConfig.cpp:83 msgid "" -"Set this to the maximum height that can be reached by your extruder while " -"printing." +"Set this to the maximum height that can be reached by your extruder while printing." msgstr "" -"Задаётся максимальная высота, которую может достичь ваш экструдером во время " -"печати." +"Задаётся максимальная высота, которую может достичь ваш экструдер во время печати." -#: src/libslic3r/PrintConfig.cpp:89 +#: src/libslic3r/PrintConfig.cpp:91 msgid "Slice gap closing radius" -msgstr "" +msgstr "Радиус закрытия пробелов при нарезке" -#: src/libslic3r/PrintConfig.cpp:91 +#: src/libslic3r/PrintConfig.cpp:93 msgid "" -"Cracks smaller than 2x gap closing radius are being filled during the " -"triangle mesh slicing. The gap closing operation may reduce the final print " -"resolution, therefore it is advisable to keep the value reasonably low." +"Cracks smaller than 2x gap closing radius are being filled during the triangle mesh " +"slicing. The gap closing operation may reduce the final print resolution, therefore " +"it is advisable to keep the value reasonably low." msgstr "" +"Трещины, меньше чем 2-кратный радиус закрытия пробелов, будут заполняться во время " +"нарезки треугольной сетки. Операция закрытия пробелов может уменьшить окончательное " +"разрешение печати, поэтому рекомендуется выставлять это значение достаточно низким." -#: src/libslic3r/PrintConfig.cpp:99 +#: src/libslic3r/PrintConfig.cpp:101 msgid "Hostname, IP or URL" -msgstr "Имя узла, IP или URL" +msgstr "Имя хоста, IP или URL" -#: src/libslic3r/PrintConfig.cpp:100 +#: src/libslic3r/PrintConfig.cpp:102 msgid "" -"Slic3r can upload G-code files to a printer host. This field should contain " -"the hostname, IP address or URL of the printer host instance." +"Slic3r can upload G-code files to a printer host. This field should contain the " +"hostname, IP address or URL of the printer host instance. Print host behind HAProxy " +"with basic auth enabled can be accessed by putting the user name and password into " +"the URL in the following format: https://username:password@your-octopi-address/" msgstr "" -"Slic3r может загрузить файлы G-кода на узел печати. В этом поле нужно " -"указать имя узла, IP-адрес или URL экземпляра узла печати." +"PrusaSlicer может загружать G-код файлы на хост принтера. В этом поле нужно указать " +"имя хоста, IP-адрес или URL-адрес хост-экземпляра печати. Доступ к узлу печати на " +"основе HAProxy с включенной базовой аутентификацией можно получить, указав имя " +"пользователя и пароль в поле URL-адрес в следующем формате: https://username:" +"password@your-octopi-address" -#: src/libslic3r/PrintConfig.cpp:106 +#: src/libslic3r/PrintConfig.cpp:110 msgid "API Key / Password" -msgstr "Ключ API / Пароль" +msgstr "API-ключ / Пароль" -#: src/libslic3r/PrintConfig.cpp:107 +#: src/libslic3r/PrintConfig.cpp:111 msgid "" -"Slic3r can upload G-code files to a printer host. This field should contain " -"the API Key or the password required for authentication." +"Slic3r can upload G-code files to a printer host. This field should contain the API " +"Key or the password required for authentication." msgstr "" -"Slic3r может загрузить файлы G-кода на узел печати. В этом поле нужно " -"указать ключ API или пароль, требуемые для аутентификации." +"PrusaSlicer может загружать G-код файлы на хост принтера. Это поле должно содержать " +"API ключ или пароль, необходимые для проверки подлинности." -#: src/libslic3r/PrintConfig.cpp:114 +#: src/libslic3r/PrintConfig.cpp:118 msgid "Name of the printer" -msgstr "" +msgstr "Название принтера" -#: src/libslic3r/PrintConfig.cpp:121 +#: src/libslic3r/PrintConfig.cpp:125 msgid "" -"Custom CA certificate file can be specified for HTTPS OctoPrint connections, " -"in crt/pem format. If left blank, the default OS CA certificate repository " -"is used." +"Custom CA certificate file can be specified for HTTPS OctoPrint connections, in crt/" +"pem format. If left blank, the default OS CA certificate repository is used." msgstr "" +"Пользовательский файл сертификата CA может быть указан для соединения по HTTPS к " +"OctoPrint в формате crt/pem. Если оставить поле пустым, будет использоваться " +"хранилище сертификатов ОС по умолчанию." -#: src/libslic3r/PrintConfig.cpp:127 +#: src/libslic3r/PrintConfig.cpp:131 msgid "Elephant foot compensation" msgstr "Компенсация расширения первого слоя" -#: src/libslic3r/PrintConfig.cpp:129 +#: src/libslic3r/PrintConfig.cpp:133 msgid "" "The first layer will be shrunk in the XY plane by the configured value to " "compensate for the 1st layer squish aka an Elephant Foot effect." msgstr "" "Первый слой будет уменьшен в плоскости XY на заданное значение, чтобы " -"компенсировать эффект \"хлюпанье\" первого слоя, известное как \"слоновья " -"нога\"." +"компенсировать эффект \"хлюпанье\" первого слоя, известное как \"слоновья нога\"." -#: src/libslic3r/PrintConfig.cpp:145 +#: src/libslic3r/PrintConfig.cpp:149 msgid "Password" -msgstr "" +msgstr "Пароль" -#: src/libslic3r/PrintConfig.cpp:151 +#: src/libslic3r/PrintConfig.cpp:155 msgid "Printer preset name" -msgstr "" +msgstr "Имя профиля принтера" -#: src/libslic3r/PrintConfig.cpp:152 +#: src/libslic3r/PrintConfig.cpp:156 msgid "Related printer preset name" -msgstr "" +msgstr "Имя связанного профиля принтера" -#: src/libslic3r/PrintConfig.cpp:157 +#: src/libslic3r/PrintConfig.cpp:161 msgid "Authorization Type" -msgstr "" +msgstr "Тип авторизации" -#: src/libslic3r/PrintConfig.cpp:162 +#: src/libslic3r/PrintConfig.cpp:166 msgid "API key" -msgstr "" +msgstr "API-ключ" -#: src/libslic3r/PrintConfig.cpp:163 +#: src/libslic3r/PrintConfig.cpp:167 msgid "HTTP digest" -msgstr "" +msgstr "HTTP digest-авторизация" -#: src/libslic3r/PrintConfig.cpp:176 +#: src/libslic3r/PrintConfig.cpp:180 msgid "Avoid crossing perimeters" msgstr "Избегать пересечения периметров" -#: src/libslic3r/PrintConfig.cpp:177 +#: src/libslic3r/PrintConfig.cpp:181 msgid "" -"Optimize travel moves in order to minimize the crossing of perimeters. This " -"is mostly useful with Bowden extruders which suffer from oozing. This " -"feature slows down both the print and the G-code generation." +"Optimize travel moves in order to minimize the crossing of perimeters. This is " +"mostly useful with Bowden extruders which suffer from oozing. This feature slows " +"down both the print and the G-code generation." msgstr "" -"Этот параметр призван оптимизировать маршрут движения печатающей головки, " -"чтобы свести к минимуму пересечение стенок при движении. Полезно " -"использовать с экструдерами Боудена, которые страдают от просачивание " -"расплавленного материала. Эта функция замедляет как печать, так и генерацию " -"G-кода." +"Этот параметр призван оптимизировать маршрут движения печатающей головки, чтобы " +"свести к минимуму пересечение стенок при движении. Полезно использовать с " +"экструдерами Боудена, которые страдают от просачивание расплавленного материала. " +"Эта функция замедляет как печать, так и генерацию G-кода." -#: src/libslic3r/PrintConfig.cpp:184 src/libslic3r/PrintConfig.cpp:2259 -msgid "Other layers" -msgstr "Последующие слои" +#: src/libslic3r/PrintConfig.cpp:188 +msgid "Avoid crossing perimeters - Max detour length" +msgstr "Избегать пересечения периметров - Макс. длина обхода" -#: src/libslic3r/PrintConfig.cpp:185 +#: src/libslic3r/PrintConfig.cpp:190 msgid "" -"Bed temperature for layers after the first one. Set this to zero to disable " -"bed temperature control commands in the output." +"The maximum detour length for avoid crossing perimeters. If the detour is longer " +"than this value, avoid crossing perimeters is not applied for this travel path. " +"Detour length could be specified either as an absolute value or as percentage (for " +"example 50%) of a direct travel path." msgstr "" -"Температура платформы для слоёв после первого. Установите 0, " -"чтобы отключить команды управления температурой платформы в результате." +"Максимальное расстояние обхода сопла от модели во избежание пересечения периметров " +"при движении. Если расстояние обхода превышает это значение, то для данного " +"маршрута эта опция не применяется. Длина обхода может быть указана как абсолютном " +"значении, так и в процентах (например, 50%) от траектории перемещения. ???" -#: src/libslic3r/PrintConfig.cpp:188 -msgid "Bed temperature" -msgstr "Температура платформы" +#: src/libslic3r/PrintConfig.cpp:193 +msgid "mm or % (zero to disable)" +msgstr "мм или % (0 - отключено)" + +#: src/libslic3r/PrintConfig.cpp:199 src/libslic3r/PrintConfig.cpp:2291 +msgid "Other layers" +msgstr "Последующие слои" -#: src/libslic3r/PrintConfig.cpp:195 +#: src/libslic3r/PrintConfig.cpp:200 msgid "" -"This custom code is inserted at every layer change, right before the Z move. " -"Note that you can use placeholder variables for all Slic3r settings as well " -"as [layer_num] and [layer_z]." +"Bed temperature for layers after the first one. Set this to zero to disable bed " +"temperature control commands in the output." msgstr "" -"Этот пользовательский код вставляется при каждой смене слоя, непосредственно " -"перед перемещения оси Z. Обратите внимание, что вы можете использовать " -"шаблонные переменные для всех параметров Slic3r, в том числе [layer_num] и " -"[layer_z]." +"Температура подогреваемого стола для слоёв после первого. Установите 0, чтобы " +"отключить команды управления температурой стола на выходе." -#: src/libslic3r/PrintConfig.cpp:205 -msgid "Between objects G-code" -msgstr "G-код между объектами" +#: src/libslic3r/PrintConfig.cpp:203 +msgid "Bed temperature" +msgstr "Температура стола" -#: src/libslic3r/PrintConfig.cpp:206 +#: src/libslic3r/PrintConfig.cpp:210 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." +"This custom code is inserted at every layer change, right before the Z move. Note " +"that you can use placeholder variables for all Slic3r settings as well as " +"[layer_num] and [layer_z]." msgstr "" -"Этот код вставляется между объектами при включении последовательной печати. " -"По умолчанию температура экструдера и платформы сбрасываются с помощью " -"команды без ожидания; однако, если в этом пользовательском коде " -"обнаруживаются команды M104, M109, M140 или M190, то Slic3r не добавит " -"команды температуры. Обратите внимание, что вы можете использовать шаблонные " -"переменные для всех параметров Slic3r, поэтому вы можете вставить команду " -"\"M109 S[first_layer_temperature]\" где угодно." +"Этот пользовательский код вставляется при каждой смене слоя, непосредственно перед " +"перемещения оси Z. Обратите внимание, что вы можете использовать шаблонные " +"переменные для всех параметров PrusaSlicer, в том числе [layer_num] и [layer_z]." -#: src/libslic3r/PrintConfig.cpp:217 +#: src/libslic3r/PrintConfig.cpp:220 +msgid "Between objects G-code" +msgstr "G-код между моделями" + +#: src/libslic3r/PrintConfig.cpp:221 +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, " +"M109, M140 или M190, то PrusaSlicer не добавит команды температуры. Обратите " +"внимание, что вы можете использовать шаблонные переменные для всех параметров " +"PrusaSlicer, поэтому вы можете вставить команду \"M109 S[first_layer_temperature]\" " +"где угодно." + +#: src/libslic3r/PrintConfig.cpp:232 msgid "Number of solid layers to generate on bottom surfaces." -msgstr "Количество сплошных слоёв для генерации нижних поверхностей." +msgstr "Количество сплошных слоёв при печати нижней поверхности модели." -#: src/libslic3r/PrintConfig.cpp:218 +#: src/libslic3r/PrintConfig.cpp:233 msgid "Bottom solid layers" msgstr "Нижних сплошных слоёв" -#: src/libslic3r/PrintConfig.cpp:226 +#: src/libslic3r/PrintConfig.cpp:241 msgid "" "The number of bottom solid layers is increased above bottom_solid_layers if " "necessary to satisfy minimum thickness of bottom shell." msgstr "" +"При необходимости количество нижних сплошных слоёв увеличивается выше значения " +"bottom_solid_layers (\"Сплошных слоёв снизу\") для удовлетворения минимальной " +"толщины оболочки снизу." -#: src/libslic3r/PrintConfig.cpp:228 +#: src/libslic3r/PrintConfig.cpp:243 msgid "Minimum bottom shell thickness" -msgstr "" +msgstr "Минимальная толщина оболочки снизу" -#: src/libslic3r/PrintConfig.cpp:234 +#: src/libslic3r/PrintConfig.cpp:249 msgid "Bridge" -msgstr "Мост" +msgstr "Мосты" -#: src/libslic3r/PrintConfig.cpp:235 +#: src/libslic3r/PrintConfig.cpp:250 msgid "" -"This is the acceleration your printer will use for bridges. Set zero to " -"disable acceleration control for bridges." +"This is the acceleration your printer will use for bridges. Set zero to disable " +"acceleration control for bridges." msgstr "" -"Ускорение, которое принтер будет использовать для печати мостов. Установить " -"0, чтобы отключить управление ускорением для мостов." +"Ускорение, которое принтер будет использовать для печати мостов. Установить 0, " +"чтобы отключить управление ускорением для мостов." -#: src/libslic3r/PrintConfig.cpp:237 src/libslic3r/PrintConfig.cpp:380 -#: src/libslic3r/PrintConfig.cpp:923 src/libslic3r/PrintConfig.cpp:1051 -#: src/libslic3r/PrintConfig.cpp:1332 src/libslic3r/PrintConfig.cpp:1381 -#: src/libslic3r/PrintConfig.cpp:1391 src/libslic3r/PrintConfig.cpp:1584 +#: src/libslic3r/PrintConfig.cpp:252 src/libslic3r/PrintConfig.cpp:395 +#: src/libslic3r/PrintConfig.cpp:940 src/libslic3r/PrintConfig.cpp:1079 +#: src/libslic3r/PrintConfig.cpp:1360 src/libslic3r/PrintConfig.cpp:1409 +#: src/libslic3r/PrintConfig.cpp:1419 src/libslic3r/PrintConfig.cpp:1612 msgid "mm/s²" msgstr "мм/с²" -#: src/libslic3r/PrintConfig.cpp:243 +#: src/libslic3r/PrintConfig.cpp:258 msgid "Bridging angle" msgstr "Угол (направление) печати мостов" -#: src/libslic3r/PrintConfig.cpp:245 +#: src/libslic3r/PrintConfig.cpp:260 msgid "" -"Bridging angle override. If left to zero, the bridging angle will be " -"calculated automatically. Otherwise the provided angle will be used for all " -"bridges. Use 180° for zero angle." +"Bridging angle override. If left to zero, the bridging angle will be calculated " +"automatically. Otherwise the provided angle will be used for all bridges. Use 180° " +"for zero angle." msgstr "" -"Принудительная печать мостов в одном, заданном направлении. Если задано 0, " -"угол печати мостов рассчитывается автоматически. В противном случае заданный " -"угол будет использоваться для всех мостов. Для нулевого угла установите 180°." +"Принудительная печать мостов в одном, заданном направлении. Если задано 0, угол " +"печати мостов рассчитывается автоматически. В противном случае заданный угол будет " +"использоваться для всех мостов. Для нулевого угла установите 180°." -#: src/libslic3r/PrintConfig.cpp:248 src/libslic3r/PrintConfig.cpp:835 -#: src/libslic3r/PrintConfig.cpp:1821 src/libslic3r/PrintConfig.cpp:1831 -#: src/libslic3r/PrintConfig.cpp:2089 src/libslic3r/PrintConfig.cpp:2244 -#: src/libslic3r/PrintConfig.cpp:2443 src/libslic3r/PrintConfig.cpp:2944 -#: src/libslic3r/PrintConfig.cpp:3065 +#: src/libslic3r/PrintConfig.cpp:263 src/libslic3r/PrintConfig.cpp:852 +#: src/libslic3r/PrintConfig.cpp:1853 src/libslic3r/PrintConfig.cpp:1863 +#: src/libslic3r/PrintConfig.cpp:2121 src/libslic3r/PrintConfig.cpp:2276 +#: src/libslic3r/PrintConfig.cpp:2475 src/libslic3r/PrintConfig.cpp:2976 +#: src/libslic3r/PrintConfig.cpp:3097 msgid "°" msgstr "°" -#: src/libslic3r/PrintConfig.cpp:254 +#: src/libslic3r/PrintConfig.cpp:269 msgid "Bridges fan speed" msgstr "Скорость вентилятора при печати мостов" -#: src/libslic3r/PrintConfig.cpp:255 +#: src/libslic3r/PrintConfig.cpp:270 msgid "This fan speed is enforced during all bridges and overhangs." -msgstr "" -"Скорость вращения вентилятора при печати мостов и нависающих частей модели." +msgstr "Скорость вращения вентилятора при печати мостов и нависающих частей модели." -#: src/libslic3r/PrintConfig.cpp:256 src/libslic3r/PrintConfig.cpp:847 -#: src/libslic3r/PrintConfig.cpp:1220 src/libslic3r/PrintConfig.cpp:1399 -#: src/libslic3r/PrintConfig.cpp:1462 src/libslic3r/PrintConfig.cpp:1713 -#: src/libslic3r/PrintConfig.cpp:2621 src/libslic3r/PrintConfig.cpp:2858 -#: src/libslic3r/PrintConfig.cpp:2984 +#: src/libslic3r/PrintConfig.cpp:271 src/libslic3r/PrintConfig.cpp:864 +#: src/libslic3r/PrintConfig.cpp:1248 src/libslic3r/PrintConfig.cpp:1427 +#: src/libslic3r/PrintConfig.cpp:1490 src/libslic3r/PrintConfig.cpp:1745 +#: src/libslic3r/PrintConfig.cpp:2653 src/libslic3r/PrintConfig.cpp:2890 +#: src/libslic3r/PrintConfig.cpp:3016 msgid "%" msgstr "%" -#: src/libslic3r/PrintConfig.cpp:263 +#: src/libslic3r/PrintConfig.cpp:278 msgid "Bridge flow ratio" -msgstr "Соотношение потока при печати мостов" +msgstr "Коэффициент подачи пластика при печати мостов" -#: src/libslic3r/PrintConfig.cpp:265 +#: src/libslic3r/PrintConfig.cpp:280 msgid "" "This factor affects the amount of plastic for bridging. You can decrease it " -"slightly to pull the extrudates and prevent sagging, although default " -"settings are usually good and you should experiment with cooling (use a fan) " -"before tweaking this." -msgstr "" -"Этот параметр задаёт количество пластика, затрачивающегося на построение " -"мостов. В большинстве случаев настроек по умолчанию (1) достаточно, тем не " -"менее, при печати некоторых объектов уменьшение параметра может сократить " -"провисание пластика при печати мостов. Если при печати мостов протягиваемый " -"пруток рвётся, параметр нужно увеличить (например, до 1.1). Перед " -"редактированием этого параметра не забывайте, что регулировать качество " -"натяжки мостов можно и при помощи обдува модели." - -#: src/libslic3r/PrintConfig.cpp:275 +"slightly to pull the extrudates and prevent sagging, although default settings are " +"usually good and you should experiment with cooling (use a fan) before tweaking " +"this." +msgstr "" +"Этот параметр задаёт количество пластика, затрачивающегося на построение мостов. В " +"большинстве случаев настроек по умолчанию (1) достаточно, тем не менее, при печати " +"некоторых моделей уменьшение параметра может сократить провисание пластика при " +"печати мостов. Если при печати мостов протягиваемый пруток рвётся, параметр нужно " +"увеличить (например, до 1.1). Перед редактированием этого параметра не забывайте, " +"что регулировать качество натяжки мостов можно и при помощи обдува модели." + +#: src/libslic3r/PrintConfig.cpp:290 msgid "Bridges" msgstr "Мосты" -#: src/libslic3r/PrintConfig.cpp:277 +#: src/libslic3r/PrintConfig.cpp:292 msgid "Speed for printing bridges." msgstr "Скорость печати мостов." -#: src/libslic3r/PrintConfig.cpp:278 src/libslic3r/PrintConfig.cpp:654 -#: src/libslic3r/PrintConfig.cpp:662 src/libslic3r/PrintConfig.cpp:671 -#: src/libslic3r/PrintConfig.cpp:679 src/libslic3r/PrintConfig.cpp:706 -#: src/libslic3r/PrintConfig.cpp:725 src/libslic3r/PrintConfig.cpp:987 -#: src/libslic3r/PrintConfig.cpp:1166 src/libslic3r/PrintConfig.cpp:1239 -#: src/libslic3r/PrintConfig.cpp:1315 src/libslic3r/PrintConfig.cpp:1349 -#: src/libslic3r/PrintConfig.cpp:1361 src/libslic3r/PrintConfig.cpp:1371 -#: src/libslic3r/PrintConfig.cpp:1421 src/libslic3r/PrintConfig.cpp:1480 -#: src/libslic3r/PrintConfig.cpp:1614 src/libslic3r/PrintConfig.cpp:1788 -#: src/libslic3r/PrintConfig.cpp:1797 src/libslic3r/PrintConfig.cpp:2223 -#: src/libslic3r/PrintConfig.cpp:2350 +#: src/libslic3r/PrintConfig.cpp:293 src/libslic3r/PrintConfig.cpp:671 +#: src/libslic3r/PrintConfig.cpp:679 src/libslic3r/PrintConfig.cpp:688 +#: src/libslic3r/PrintConfig.cpp:696 src/libslic3r/PrintConfig.cpp:723 +#: src/libslic3r/PrintConfig.cpp:742 src/libslic3r/PrintConfig.cpp:1015 +#: src/libslic3r/PrintConfig.cpp:1194 src/libslic3r/PrintConfig.cpp:1267 +#: src/libslic3r/PrintConfig.cpp:1343 src/libslic3r/PrintConfig.cpp:1377 +#: src/libslic3r/PrintConfig.cpp:1389 src/libslic3r/PrintConfig.cpp:1399 +#: src/libslic3r/PrintConfig.cpp:1449 src/libslic3r/PrintConfig.cpp:1508 +#: src/libslic3r/PrintConfig.cpp:1642 src/libslic3r/PrintConfig.cpp:1820 +#: src/libslic3r/PrintConfig.cpp:1829 src/libslic3r/PrintConfig.cpp:2255 +#: src/libslic3r/PrintConfig.cpp:2382 msgid "mm/s" msgstr "мм/с" -#: src/libslic3r/PrintConfig.cpp:285 +#: src/libslic3r/PrintConfig.cpp:300 msgid "Brim width" msgstr "Ширина каймы" -#: src/libslic3r/PrintConfig.cpp:286 +#: src/libslic3r/PrintConfig.cpp:301 msgid "" -"Horizontal width of the brim that will be printed around each object on the " -"first layer." +"Horizontal width of the brim that will be printed around each object on the first " +"layer." msgstr "" -"Горизонтальная ширина каймы, которая будет печататься на первом слое вокруг " -"каждого объекта." +"Расстояние от модели до самой дальней линии каймы. Широкая кайма повышает адгезию к " +"столу, но уменьшает полезную площадь печати. Увеличение этого параметра очень важно " +"для моделей с маленькой площадью контакта со столом и особенно важно при печати ABS " +"пластиком." -#: src/libslic3r/PrintConfig.cpp:293 +#: src/libslic3r/PrintConfig.cpp:308 msgid "Clip multi-part objects" -msgstr "Обрезать составные объекты (состоящие из нескольких частей)" +msgstr "Обрезать составные модели (состоящие из нескольких частей)" -#: src/libslic3r/PrintConfig.cpp:294 +#: src/libslic3r/PrintConfig.cpp:309 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)." +"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 "" -"При печати объектов несколькими материалами эта настройка заставляет slic3r " -"обрезать части, которые перекрываются друг другом (вторая часть будет " -"обрезана первой, третья - первой и второй и т.д.)." +"При печати моделей несколькими материалами эта настройка заставляет PrusaSlicer " +"обрезать части, которые перекрываются друг другом (вторая часть будет обрезана " +"первой, третья - первой и второй и т.д.)." -#: src/libslic3r/PrintConfig.cpp:301 +#: src/libslic3r/PrintConfig.cpp:316 msgid "Colorprint height" -msgstr "Высота цветной печати" +msgstr "Высота смены цвета" -#: src/libslic3r/PrintConfig.cpp:302 +#: src/libslic3r/PrintConfig.cpp:317 msgid "Heights at which a filament change is to occur." -msgstr "" +msgstr "Высота, на которой должна происходить смена прутка." -#: src/libslic3r/PrintConfig.cpp:312 +#: src/libslic3r/PrintConfig.cpp:327 msgid "Compatible printers condition" msgstr "Условия совместимости с принтером" -#: src/libslic3r/PrintConfig.cpp:313 +#: src/libslic3r/PrintConfig.cpp:328 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." +"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 "" "Логическое выражение, использующее значения конфигурации активного профиля " "принтера. Если это выражение имеет значение true, этот профиль считается " "совместимым с активным профилем принтера." -#: src/libslic3r/PrintConfig.cpp:327 +#: src/libslic3r/PrintConfig.cpp:342 msgid "Compatible print profiles condition" -msgstr "Условия совместимости с профилем печати" +msgstr "Условия совместимости профилей печати" -#: src/libslic3r/PrintConfig.cpp:328 +#: src/libslic3r/PrintConfig.cpp:343 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." +"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 "" -"Логическое выражение, использующее значения конфигурации активного профиля " -"принтера. Если это выражение имеет значение true, этот профиль считается " -"совместимым с активным профилем принтера." +"Логическое выражение, использующее значения конфигурации активного профиля печати. " +"Если это выражение имеет значение true, этот профиль считается совместимым с " +"активным профилем принтера." -#: src/libslic3r/PrintConfig.cpp:345 +#: src/libslic3r/PrintConfig.cpp:360 msgid "Complete individual objects" -msgstr "Печатать объекты последовательно" +msgstr "Печатать модели по очереди" -#: src/libslic3r/PrintConfig.cpp:346 +#: src/libslic3r/PrintConfig.cpp:361 msgid "" -"When printing multiple objects or copies, this feature will complete each " -"object before moving onto next one (and starting it from its bottom layer). " -"This feature is useful to avoid the risk of ruined prints. Slic3r should " -"warn and prevent you from extruder collisions, but beware." +"When printing multiple objects or copies, this feature will complete each object " +"before moving onto next one (and starting it from its bottom layer). This feature " +"is useful to avoid the risk of ruined prints. Slic3r should warn and prevent you " +"from extruder collisions, but beware." msgstr "" -"Когда печатается несколько объектов или копий, эта функция позволяет " -"печатать их по очереди — сначала будет напечатана один, потом второй (и " -"печать начинается с его нижнего слоя). Позволяет избежать риска испортить " -"всю печать целиком. Slic3r должен предупреждать и предотвращать столкновения " -"экструдера, но используйте аккуратно." +"Когда на печатающем столе размещено несколько моделей, эта функция позволяет " +"печатать их по очереди - сначала будет напечатана одна модель, потом вторая. Этот " +"режим может быть использован только в том случае, когда все модели разнесены таким " +"образом, что вся печатающая головка может перемещаться между ними." -#: src/libslic3r/PrintConfig.cpp:354 +#: src/libslic3r/PrintConfig.cpp:369 msgid "Enable auto cooling" msgstr "Автоматическое управление охлаждением" -#: src/libslic3r/PrintConfig.cpp:355 +#: src/libslic3r/PrintConfig.cpp:370 msgid "" -"This flag enables the automatic cooling logic that adjusts print speed and " -"fan speed according to layer printing time." +"This flag enables the automatic cooling logic that adjusts print speed and fan " +"speed according to layer printing time." msgstr "" "Программа задействует алгоритм автоматического охлаждения и сама регулирует " "скорость печати и скорость вентилятора в зависимости от времени печати слоя." -#: src/libslic3r/PrintConfig.cpp:360 +#: src/libslic3r/PrintConfig.cpp:375 msgid "Cooling tube position" msgstr "Позиция охлаждающей трубки" -#: src/libslic3r/PrintConfig.cpp:361 +#: src/libslic3r/PrintConfig.cpp:376 msgid "Distance of the center-point of the cooling tube from the extruder tip." -msgstr "" -"Расстояние между центральной точкой охлаждающей трубки и кончиком экструдера." +msgstr "Расстояние между центральной точкой охлаждающей трубки и кончиком экструдера." -#: src/libslic3r/PrintConfig.cpp:368 +#: src/libslic3r/PrintConfig.cpp:383 msgid "Cooling tube length" msgstr "Длина охлаждающей трубки" -#: src/libslic3r/PrintConfig.cpp:369 +#: src/libslic3r/PrintConfig.cpp:384 msgid "Length of the cooling tube to limit space for cooling moves inside it." msgstr "" -"Длина трубки охлаждения для ограничения перемещения при охлаждающих " -"движениях." +"Длина трубки охлаждения для ограничения перемещения при охлаждающих движениях." -#: src/libslic3r/PrintConfig.cpp:377 +#: src/libslic3r/PrintConfig.cpp:392 msgid "" -"This is the acceleration your printer will be reset to after the role-" -"specific acceleration values are used (perimeter/infill). Set zero to " -"prevent resetting acceleration at all." +"This is the acceleration your printer will be reset to after the role-specific " +"acceleration values are used (perimeter/infill). Set zero to prevent resetting " +"acceleration at all." msgstr "" -"Это ускорение, на которое переключится принтер после использования " -"определённых настроек ускорения, например установленных для печати периметра/" -"заполнения. Установите 0, чтобы предотвратить сброс ускорения вообще." +"Это ускорение, на которое переключится принтер после использования определённых " +"настроек ускорения, например установленных для печати периметра/заполнения. " +"Установите 0, чтобы предотвратить сброс ускорения вообще." -#: src/libslic3r/PrintConfig.cpp:386 +#: src/libslic3r/PrintConfig.cpp:401 msgid "Default filament profile" msgstr "Профиль прутка по умолчанию" -#: src/libslic3r/PrintConfig.cpp:387 +#: src/libslic3r/PrintConfig.cpp:402 msgid "" -"Default filament profile associated with the current printer profile. On " -"selection of the current printer profile, this filament profile will be " -"activated." +"Default filament profile associated with the current printer profile. On selection " +"of the current printer profile, this filament profile will be activated." msgstr "" -"Профиль прутка по умолчанию, связанный с текущим профилем принтера. При " -"выборе текущего профиля принтера, будет активирован этот профиль прутка." +"Профиль прутка по умолчанию, связанный с текущим профилем принтера. При выборе " +"текущего профиля принтера, будет активирован этот профиль прутка." -#: src/libslic3r/PrintConfig.cpp:393 +#: src/libslic3r/PrintConfig.cpp:408 msgid "Default print profile" msgstr "Профиль печати по умолчанию" -#: src/libslic3r/PrintConfig.cpp:394 src/libslic3r/PrintConfig.cpp:2788 -#: src/libslic3r/PrintConfig.cpp:2799 +#: src/libslic3r/PrintConfig.cpp:409 src/libslic3r/PrintConfig.cpp:2820 +#: src/libslic3r/PrintConfig.cpp:2831 msgid "" -"Default print profile associated with the current printer profile. On " -"selection of the current printer profile, this print profile will be " -"activated." +"Default print profile associated with the current printer profile. On selection of " +"the current printer profile, this print profile will be activated." msgstr "" -"Профиль печати по умолчанию, связанный с текущим профилем принтера. При " -"выборе текущего профиля принтера, будет активирован этот профиль печати." +"Профиль печати по умолчанию, связанный с текущим профилем принтера. При выборе " +"текущего профиля принтера, будет активирован этот профиль печати." -#: src/libslic3r/PrintConfig.cpp:400 +#: src/libslic3r/PrintConfig.cpp:415 msgid "Disable fan for the first" -msgstr "Не включать вентилятор на первых слоях" +msgstr "Не включать вентилятор на первых" -#: src/libslic3r/PrintConfig.cpp:401 +#: src/libslic3r/PrintConfig.cpp:416 msgid "" -"You can set this to a positive value to disable fan at all during the first " -"layers, so that it does not make adhesion worse." +"You can set this to a positive value to disable fan at all during the first layers, " +"so that it does not make adhesion worse." msgstr "" -"Вы можете задать положительное значение, чтобы отключить вентилятор при " -"печати первых слоёв, чтобы не ухудшить прилипание." +"Вы можете задать положительное значение, чтобы отключить вентилятор при печати " +"первых слоёв, чтобы не ухудшить адгезию к столу." -#: src/libslic3r/PrintConfig.cpp:410 +#: src/libslic3r/PrintConfig.cpp:425 msgid "Don't support bridges" -msgstr "Не печатать поддержки под мостами" +msgstr "Не печатать поддержку под мостами" -#: src/libslic3r/PrintConfig.cpp:412 +#: src/libslic3r/PrintConfig.cpp:427 msgid "" -"Experimental option for preventing support material from being generated " -"under bridged areas." +"Experimental option for preventing support material from being generated under " +"bridged areas." msgstr "Экспериментальная опция препятствующая печати поддержки под мостами." -#: src/libslic3r/PrintConfig.cpp:418 +#: src/libslic3r/PrintConfig.cpp:433 msgid "Distance between copies" msgstr "Расстояние между копиями" -#: src/libslic3r/PrintConfig.cpp:419 +#: src/libslic3r/PrintConfig.cpp:434 msgid "Distance used for the auto-arrange feature of the plater." -msgstr "" -"Расстояние между объектами, используемое авторасстановкой при компоновке." +msgstr "Расстояние, между моделям при авторасстановке их на столе." -#: src/libslic3r/PrintConfig.cpp:427 +#: src/libslic3r/PrintConfig.cpp:442 msgid "" -"This end procedure is inserted at the end of the output file. Note that you " -"can use placeholder variables for all PrusaSlicer settings." +"This end procedure is inserted at the end of the output file. Note that you can use " +"placeholder variables for all PrusaSlicer settings." msgstr "" -"Это последняя процедура, вставляется в конец файла. Обратите внимание, что " -"вы можете использовать шаблонные переменные для всех параметров PrusaSlicer." +"Команды в G-коде, которые будут вставляться в конец выходного файла. Обратите " +"внимание, что вы можете использовать шаблонные переменные для всех параметров " +"PrusaSlicer." -#: src/libslic3r/PrintConfig.cpp:437 +#: src/libslic3r/PrintConfig.cpp:452 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." +"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 "" -"Это последняя процедура, вставляется в конец файла перед конечным G-кодом " -"принтера (и перед сменой инструмента для этого прутка в случае " -"многоматериальных принтеров). Обратите внимание, что вы можете использовать " -"шаблонные переменные для всех параметров PrusaSlicer. Если имеется несколько " -"экструдеров, G-код обрабатывается в соответствии с порядковым номером " +"Команды в G-коде, которые будут вставляться в конец выходного файла перед конечным " +"G-кодом принтера (и перед каждым переключением инструмента с текущим прутком " +"в случае мультиматериальных принтеров). Обратите внимание, что вы можете " +"использовать шаблонные переменные для всех параметров PrusaSlicer. Если у вас " +"несколько экструдеров, G-код обрабатывается в соответствии с порядковым номером " "экструдера." -#: src/libslic3r/PrintConfig.cpp:448 +#: src/libslic3r/PrintConfig.cpp:463 msgid "Ensure vertical shell thickness" msgstr "Обеспечивать вертикальную толщину оболочки" -#: src/libslic3r/PrintConfig.cpp:450 +#: src/libslic3r/PrintConfig.cpp:465 msgid "" -"Add solid infill near sloping surfaces to guarantee the vertical shell " -"thickness (top+bottom solid layers)." +"Add solid infill near sloping surfaces to guarantee the vertical shell thickness " +"(top+bottom solid layers)." msgstr "" -"Добавляет сплошные опоры у наклонных поверхностей для того, чтобы " -"гарантировать вертикальную толщину оболочки (верхние+нижние сплошные слои). " -"Это помогает избежать дыр на наклонной поверхности." +"Добавляет сплошные опоры у наклонных поверхностей для того, чтобы гарантировать " +"вертикальную толщину оболочки (верхние+нижние сплошные слои). Это помогает избежать " +"дыр на наклонной поверхности." -#: src/libslic3r/PrintConfig.cpp:456 +#: src/libslic3r/PrintConfig.cpp:471 msgid "Top fill pattern" -msgstr "Шаблон заполнения верха" +msgstr "Шаблон заполнения верхней поверхности" -#: src/libslic3r/PrintConfig.cpp:458 +#: src/libslic3r/PrintConfig.cpp:473 msgid "" -"Fill pattern for top infill. This only affects the top visible layer, and " -"not its adjacent solid shells." +"Fill pattern for top infill. This only affects the top visible layer, and not its " +"adjacent solid shells." msgstr "" -"Шаблон заполнения, которым закрывается верхняя поверхность. Это влияет " -"только на внешний видимый слой, а не на прилегающие к нему сплошные оболочки." +"Тип сетки, которой закрывается верхняя поверхность. Это влияет только на внешний " +"видимый слой, а не на прилегающие к нему твёрдые оболочки." -#: src/libslic3r/PrintConfig.cpp:468 src/libslic3r/PrintConfig.cpp:901 -#: src/libslic3r/PrintConfig.cpp:2204 +#: src/libslic3r/PrintConfig.cpp:483 src/libslic3r/PrintConfig.cpp:918 +#: src/libslic3r/PrintConfig.cpp:2236 msgid "Rectilinear" msgstr "Прямолинейный" -#: src/libslic3r/PrintConfig.cpp:469 +#: src/libslic3r/PrintConfig.cpp:484 msgid "Monotonic" -msgstr "" +msgstr "Монотонный" -#: src/libslic3r/PrintConfig.cpp:470 src/libslic3r/PrintConfig.cpp:902 +#: src/libslic3r/PrintConfig.cpp:485 src/libslic3r/PrintConfig.cpp:919 msgid "Aligned Rectilinear" -msgstr "" +msgstr "Выровн. прямолинейн." -#: src/libslic3r/PrintConfig.cpp:471 src/libslic3r/PrintConfig.cpp:908 +#: src/libslic3r/PrintConfig.cpp:486 src/libslic3r/PrintConfig.cpp:925 msgid "Concentric" msgstr "Концентрический" -#: src/libslic3r/PrintConfig.cpp:472 src/libslic3r/PrintConfig.cpp:912 +#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:929 msgid "Hilbert Curve" msgstr "Кривая Гильберта" -#: src/libslic3r/PrintConfig.cpp:473 src/libslic3r/PrintConfig.cpp:913 +#: src/libslic3r/PrintConfig.cpp:488 src/libslic3r/PrintConfig.cpp:930 msgid "Archimedean Chords" msgstr "Хорды Архимеда" -#: src/libslic3r/PrintConfig.cpp:474 src/libslic3r/PrintConfig.cpp:914 +#: src/libslic3r/PrintConfig.cpp:489 src/libslic3r/PrintConfig.cpp:931 msgid "Octagram Spiral" msgstr "Спиральная октаграмма" -#: src/libslic3r/PrintConfig.cpp:480 +#: src/libslic3r/PrintConfig.cpp:495 msgid "Bottom fill pattern" -msgstr "Шаблон заполнения низа" +msgstr "Шаблон заполнения нижней поверхности" -#: src/libslic3r/PrintConfig.cpp:482 +#: src/libslic3r/PrintConfig.cpp:497 msgid "" -"Fill pattern for bottom infill. This only affects the bottom external " -"visible layer, and not its adjacent solid shells." +"Fill pattern for bottom infill. This only affects the bottom external visible " +"layer, and not its adjacent solid shells." msgstr "" -"Шаблон заполнения, которым закрывается нижняя поверхность. Это влияет только " -"на внешний видимый слой, а не на прилегающие к нему сплошные оболочки." +"Тип сетки, которой закрывается нижняя поверхность. Это влияет только на нижний " +"внешний видимый слой, а не на прилегающие к нему твёрдые оболочки." -#: src/libslic3r/PrintConfig.cpp:491 src/libslic3r/PrintConfig.cpp:502 +#: src/libslic3r/PrintConfig.cpp:506 src/libslic3r/PrintConfig.cpp:517 msgid "External perimeters" msgstr "Внешние периметры" -#: src/libslic3r/PrintConfig.cpp:493 +#: src/libslic3r/PrintConfig.cpp:508 msgid "" "Set this to a non-zero value to set a manual extrusion width for external " -"perimeters. If left zero, default extrusion width will be used if set, " -"otherwise 1.125 x nozzle diameter will be used. If expressed as percentage " -"(for example 200%), it will be computed over layer height." +"perimeters. If left zero, default extrusion width will be used if set, otherwise " +"1.125 x nozzle diameter will be used. If expressed as percentage (for example " +"200%), it will be computed over layer height." msgstr "" "Установите значение отличное от 0, чтобы вручную задать ширину экструзии для " -"внешних периметров. Если оставить 0, будет использоваться \"Ширина экструзии " -"по умолчанию\" - если она задана, в противном случае будет использоваться " -"1,125 x диаметра сопла. Если задано в процентах, параметр вычисляется " -"относительно высоты слоя." - -#: src/libslic3r/PrintConfig.cpp:496 src/libslic3r/PrintConfig.cpp:605 -#: src/libslic3r/PrintConfig.cpp:945 src/libslic3r/PrintConfig.cpp:958 -#: src/libslic3r/PrintConfig.cpp:1076 src/libslic3r/PrintConfig.cpp:1131 -#: src/libslic3r/PrintConfig.cpp:1157 src/libslic3r/PrintConfig.cpp:1604 -#: src/libslic3r/PrintConfig.cpp:1929 src/libslic3r/PrintConfig.cpp:2078 -#: src/libslic3r/PrintConfig.cpp:2146 src/libslic3r/PrintConfig.cpp:2307 +"внешних периметров. Если оставить 0, будет использоваться \"Ширина экструзии по " +"умолчанию\" - если она задана, в противном случае будет использоваться 1,125 x " +"диаметра сопла. Если задано в процентах, параметр вычисляется относительно высоты " +"слоя." + +#: src/libslic3r/PrintConfig.cpp:511 src/libslic3r/PrintConfig.cpp:621 +#: src/libslic3r/PrintConfig.cpp:962 src/libslic3r/PrintConfig.cpp:975 +#: src/libslic3r/PrintConfig.cpp:1104 src/libslic3r/PrintConfig.cpp:1159 +#: src/libslic3r/PrintConfig.cpp:1185 src/libslic3r/PrintConfig.cpp:1632 +#: src/libslic3r/PrintConfig.cpp:1961 src/libslic3r/PrintConfig.cpp:2110 +#: src/libslic3r/PrintConfig.cpp:2178 src/libslic3r/PrintConfig.cpp:2339 msgid "mm or %" msgstr "мм или %" -#: src/libslic3r/PrintConfig.cpp:504 +#: src/libslic3r/PrintConfig.cpp:519 msgid "" -"This separate setting will affect the speed of external perimeters (the " -"visible ones). If expressed as percentage (for example: 80%) it will be " -"calculated on the perimeters speed setting above. Set to zero for auto." +"This separate setting will affect the speed of external perimeters (the visible " +"ones). If expressed as percentage (for example: 80%) it will be calculated on the " +"perimeters speed setting above. Set to zero for auto." msgstr "" -"Этот параметр влияет на скорость печати внешних периметров (видимых). Если " -"задано в процентах, параметр вычисляется относительно скорости печати " -"внутренних периметров. Установите 0 для автонастройки." +"Этот параметр влияет на скорость печати внешних периметров (видимых). Если задано в " +"процентах, параметр вычисляется относительно скорости печати внутренних периметров. " +"Установите 0 для автонастройки." -#: src/libslic3r/PrintConfig.cpp:507 src/libslic3r/PrintConfig.cpp:967 -#: src/libslic3r/PrintConfig.cpp:1888 src/libslic3r/PrintConfig.cpp:1940 -#: src/libslic3r/PrintConfig.cpp:2190 src/libslic3r/PrintConfig.cpp:2320 +#: src/libslic3r/PrintConfig.cpp:522 src/libslic3r/PrintConfig.cpp:984 +#: src/libslic3r/PrintConfig.cpp:1920 src/libslic3r/PrintConfig.cpp:1972 +#: src/libslic3r/PrintConfig.cpp:2222 src/libslic3r/PrintConfig.cpp:2352 msgid "mm/s or %" msgstr "мм/с или %" -#: src/libslic3r/PrintConfig.cpp:514 +#: src/libslic3r/PrintConfig.cpp:529 msgid "External perimeters first" msgstr "Внешние периметры печатать первыми" -#: src/libslic3r/PrintConfig.cpp:516 +#: src/libslic3r/PrintConfig.cpp:531 msgid "" -"Print contour perimeters from the outermost one to the innermost one instead " -"of the default inverse order." +"Print contour perimeters from the outermost one to the innermost one instead of the " +"default inverse order." msgstr "" -"При включении, сначала будет печататься внешний слой периметра, потом " -"внутренний. Например, если периметр состоит из трёх слоёв, то, включив этот " -"параметр, печать будет идти в следующем порядке: сначала внешний, потом " -"средний, потом внутренний слой." +"При включении, сначала будет печататься внешний слой периметра, потом внутренний. " +"Например, если периметр состоит из трёх слоёв, то, включив этот параметр, печать " +"будет идти в следующем порядке: сначала внешний, потом средний, потом внутренний " +"слой." -#: src/libslic3r/PrintConfig.cpp:522 +#: src/libslic3r/PrintConfig.cpp:537 msgid "Extra perimeters if needed" -msgstr "Дополнительные стенки при необходимости" +msgstr "Дополнительные периметры при необходимости" -#: src/libslic3r/PrintConfig.cpp:524 -#, c-format +#: src/libslic3r/PrintConfig.cpp:539 msgid "" -"Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r " -"keeps adding perimeters, until more than 70% of the loop immediately above " -"is supported." +"Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r keeps " +"adding perimeters, until more than 70% of the loop immediately above is supported." msgstr "" -"Добавляет дополнительные стенки, когда это необходимо, чтобы избежать " -"пробелов в наклонных стенках. Slic3r добавляет стенки до тех пор, пока не " -"будет поддержано более 70% верхнего контура." +"Добавляет дополнительные периметры, когда это необходимо, чтобы избежать пробелов в " +"наклонных стенках. PrusaSlicer продолжит добавлять периметры пока в следующем слое " +"не будет поддерживаться более 70% периметра." -#: src/libslic3r/PrintConfig.cpp:534 +#: src/libslic3r/PrintConfig.cpp:549 msgid "" -"The extruder to use (unless more specific extruder settings are specified). " -"This value overrides perimeter and infill extruders, but not the support " -"extruders." +"The extruder to use (unless more specific extruder settings are specified). This " +"value overrides perimeter and infill extruders, but not the support extruders." msgstr "" -"Используемый экструдер (если не заданы более конкретные параметры " -"экструдера). Это значение переопределяет экструдеры периметра и заполнения, " -"но не экструдеры поддержки." +"Используемый экструдер (если не заданы более конкретные параметры экструдера). Это " +"значение переопределяет экструдеры периметра и заполнения, но не экструдеры " +"поддержки." -#: src/libslic3r/PrintConfig.cpp:546 +#: src/libslic3r/PrintConfig.cpp:561 msgid "" -"Set this to the vertical distance between your nozzle tip and (usually) the " -"X carriage rods. In other words, this is the height of the clearance " -"cylinder around your extruder, and it represents the maximum depth the " -"extruder can peek before colliding with other printed objects." +"Set this to the vertical distance between your nozzle tip and (usually) the X " +"carriage rods. In other words, this is the height of the clearance cylinder around " +"your extruder, and it represents the maximum depth the extruder can peek before " +"colliding with other printed objects." msgstr "" -"Задаёт вертикальное расстояние между кончиком сопла и (обычно) осью валов X " -"на которых ездит каретка. Другими словами, это высота воображаемого цилиндра " -"вокруг экструдера, которая определяет максимальную глубину, до которой " -"экструдер может опуститься, чтобы не столкнуться объектами печати." +"Задаёт вертикальное расстояние между кончиком сопла и (обычно) осью валов на " +"которых ездит каретка. Другими словами, это высота воображаемого цилиндра вокруг " +"экструдера, которая определяет максимальную глубину, до которой экструдер может " +"опуститься, чтобы не столкнуться с моделью." -#: src/libslic3r/PrintConfig.cpp:557 +#: src/libslic3r/PrintConfig.cpp:572 msgid "" -"Set this to the clearance radius around your extruder. If the extruder is " -"not centered, choose the largest value for safety. This setting is used to " -"check for collisions and to display the graphical preview in the plater." +"Set this to the clearance radius around your extruder. If the extruder is not " +"centered, choose the largest value for safety. This setting is used to check for " +"collisions and to display the graphical preview in the plater." msgstr "" -"Безопасное расстояние (зазор) вокруг экструдера. Если экструдер установлен " -"не по центру, то берётся наибольшее безопасное значение. Этот параметр " -"используется для предотвращения столкновения экструдера с моделью и в " -"предварительном просмотре компоновки." +"Безопасное расстояние (зазор) вокруг экструдера. Если экструдер установлен не по " +"центру - взять наибольшее безопасное значение. Этот параметр используется для " +"предотвращения столкновения экструдера с моделью и графического отображения на " +"столе." -#: src/libslic3r/PrintConfig.cpp:567 +#: src/libslic3r/PrintConfig.cpp:582 msgid "Extruder Color" msgstr "Цвет экструдера" -#: src/libslic3r/PrintConfig.cpp:568 src/libslic3r/PrintConfig.cpp:628 +#: src/libslic3r/PrintConfig.cpp:583 src/libslic3r/PrintConfig.cpp:645 msgid "This is only used in the Slic3r interface as a visual help." msgstr "" -"Этот параметр используется только в интерфейсе Slic3r в качестве визуальной " +"Этот параметр используется только в интерфейсе PrusaSlicer в качестве визуальной " "помощи." -#: src/libslic3r/PrintConfig.cpp:574 +#: src/libslic3r/PrintConfig.cpp:589 msgid "Extruder offset" msgstr "Смещение экструдера по осям X/Y" -#: src/libslic3r/PrintConfig.cpp:575 +#: src/libslic3r/PrintConfig.cpp:590 msgid "" -"If your firmware doesn't handle the extruder displacement you need the G-" -"code to take it into account. This option lets you specify the displacement " -"of each extruder with respect to the first one. It expects positive " -"coordinates (they will be subtracted from the XY coordinate)." +"If your firmware doesn't handle the extruder displacement you need the G-code to " +"take it into account. This option lets you specify the displacement of each " +"extruder with respect to the first one. It expects positive coordinates (they will " +"be subtracted from the XY coordinate)." msgstr "" -"Если прошивка принтера правильно не обрабатывает расположение/смещение " -"экструдера, следует учесть это в G-коде. Этот параметр позволяет задать " -"смещение каждого экструдера относительно первого. Вводятся положительные " -"координаты (они будут вычтены из XY координат)." +"Актуально только для принтеров с несколькими экструдерами. Если прошивка вашего " +"принтера правильно не обрабатывает расположение/смещение экструдера, следует учесть " +"это в G-коде. Этот параметр позволяет задать смещение каждого экструдера " +"относительно первого. Вводятся положительные координаты (они будут вычтены из XY " +"координат)." -#: src/libslic3r/PrintConfig.cpp:584 +#: src/libslic3r/PrintConfig.cpp:599 msgid "Extrusion axis" msgstr "Экструзионные оси" -#: src/libslic3r/PrintConfig.cpp:585 +#: src/libslic3r/PrintConfig.cpp:600 msgid "" "Use this option to set the axis letter associated to your printer's extruder " "(usually E but some printers use A)." msgstr "" -"Используйте эту опцию, чтобы задать букву оси, связанную с экструдером " -"вашего принтера (обычно это E, но на некоторых принтерах A)." +"Используйте эту опцию, чтобы задать букву оси, связанную с экструдером вашего " +"принтера (обычно это E, но на некоторых принтерах A)." -#: src/libslic3r/PrintConfig.cpp:590 +#: src/libslic3r/PrintConfig.cpp:605 msgid "Extrusion multiplier" msgstr "Экструзионный множитель" -#: src/libslic3r/PrintConfig.cpp:591 +#: src/libslic3r/PrintConfig.cpp:606 msgid "" -"This factor changes the amount of flow proportionally. You may need to tweak " -"this setting to get nice surface finish and correct single wall widths. " -"Usual values are between 0.9 and 1.1. If you think you need to change this " -"more, check filament diameter and your firmware E steps." +"This factor changes the amount of flow proportionally. You may need to tweak this " +"setting to get nice surface finish and correct single wall widths. Usual values are " +"between 0.9 and 1.1. If you think you need to change this more, check filament " +"diameter and your firmware E steps." msgstr "" -"Коэффициент количества подаваемого пластика по сравнению с основным " -"значением. В других слайсерах называется Текучесть (Flow). Вам может " -"понадобиться настроить этот параметр, чтобы получить красивую поверхность и " -"правильную ширину одиночной стенки. Обычные значения составляют от 0.9 до " -"1.1. Если вы считаете, что вам требуется большее значение, проверьте диаметр " -"прутка и шаги экструдера в вашей прошивке." +"Коэффициент количества подаваемого пластика по сравнению с основным значением. В " +"других слайсерах называется Текучесть (Flow). Вам может понадобиться настроить этот " +"параметр, чтобы получить красивую поверхность и правильную ширину одиночной стенки. " +"Обычные значения составляют от 0.9 до 1.1. Если вы считаете, что вам требуется " +"большее значение, проверьте диаметр прутка и шаги экструдера в вашей прошивке." -#: src/libslic3r/PrintConfig.cpp:599 +#: src/libslic3r/PrintConfig.cpp:615 msgid "Default extrusion width" msgstr "Ширина экструзии по умолчанию" -#: src/libslic3r/PrintConfig.cpp:601 +#: src/libslic3r/PrintConfig.cpp:617 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." +"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 "" -"Установите значение отличное от 0, чтобы вручную задать ширину экструзии. " -"Если оставить 0, будет использоваться заданный диаметр сопла. Если задано в " -"процентах, параметр вычисляется относительно высоты слоя." +"Установите значение отличное от 0, чтобы вручную задать ширину экструзии " +"заполнения. Если оставить 0, будет использоваться заданный диаметр сопла. Если " +"задано в процентах, параметр вычисляется относительно высоты слоя." -#: src/libslic3r/PrintConfig.cpp:611 +#: src/libslic3r/PrintConfig.cpp:628 msgid "Keep fan always on" msgstr "Вентилятор включён всегда" -#: src/libslic3r/PrintConfig.cpp:612 +#: src/libslic3r/PrintConfig.cpp:629 msgid "" -"If this is enabled, fan will never be disabled and will be kept running at " -"least at its minimum speed. Useful for PLA, harmful for ABS." +"If this is enabled, fan will never be disabled and will be kept running at least at " +"its minimum speed. Useful for PLA, harmful for ABS." msgstr "" -"Если эта опция включена, вентилятор никогда не будет отключаться и будет " -"работает хотя бы на минимальной скорости. Полезно для PLA, вредно для ABS." +"Если эта опция включена, вентилятор никогда не будет отключаться и будет работать " +"хотя бы на минимальной скорости. Полезно для PLA, вредно для ABS." -#: src/libslic3r/PrintConfig.cpp:617 +#: src/libslic3r/PrintConfig.cpp:634 msgid "Enable fan if layer print time is below" msgstr "Включить обдув, если время печати слоя менее" -#: src/libslic3r/PrintConfig.cpp:618 +#: src/libslic3r/PrintConfig.cpp:635 msgid "" -"If layer print time is estimated below this number of seconds, fan will be " -"enabled and its speed will be calculated by interpolating the minimum and " -"maximum speeds." +"If layer print time is estimated below this number of seconds, fan will be enabled " +"and its speed will be calculated by interpolating the minimum and maximum speeds." msgstr "" -"Если время печати слоя оценивается ниже этого количества секунд, будет " -"включён вентилятор, и его скорость будет рассчитываться путём интерполяции " -"минимальных и максимальных скоростей." +"Если время печати слоя оценивается ниже этого количества секунд, будет включён " +"вентилятор, и его скорость будет рассчитываться путём интерполяции минимальных и " +"максимальных скоростей." -#: src/libslic3r/PrintConfig.cpp:620 src/libslic3r/PrintConfig.cpp:1876 +#: src/libslic3r/PrintConfig.cpp:637 src/libslic3r/PrintConfig.cpp:1908 msgid "approximate seconds" msgstr "приблизительно секунд" -#: src/libslic3r/PrintConfig.cpp:627 +#: src/libslic3r/PrintConfig.cpp:644 msgid "Color" msgstr "Цвет" -#: src/libslic3r/PrintConfig.cpp:633 +#: src/libslic3r/PrintConfig.cpp:650 msgid "Filament notes" msgstr "Примечание о прутке" -#: src/libslic3r/PrintConfig.cpp:634 +#: src/libslic3r/PrintConfig.cpp:651 msgid "You can put your notes regarding the filament here." -msgstr "Здесь вы можете написать свои примечания для прутка." +msgstr "Здесь вы можете написать свои примечания относительно прутка." -#: src/libslic3r/PrintConfig.cpp:642 src/libslic3r/PrintConfig.cpp:1427 +#: src/libslic3r/PrintConfig.cpp:659 src/libslic3r/PrintConfig.cpp:1455 msgid "Max volumetric speed" -msgstr "Макс. объёмная скорость" +msgstr "Максимальная объёмная скорость" -#: src/libslic3r/PrintConfig.cpp:643 +#: src/libslic3r/PrintConfig.cpp:660 msgid "" -"Maximum volumetric speed allowed for this filament. Limits the maximum " -"volumetric speed of a print to the minimum of print and filament volumetric " -"speed. Set to zero for no limit." +"Maximum volumetric speed allowed for this filament. Limits the maximum volumetric " +"speed of a print to the minimum of print and filament volumetric speed. Set to zero " +"for no limit." msgstr "" -"Максимальная объёмная скорость подачи, разрешённая для этого прутка. " -"Ограничивает максимальную объёмную скорость печати до минимальной для этого " -"принтера и прутка. Установите 0, чтобы убрать ограничения." +"Максимальная объёмная скорость подачи (объёмный расход), разрешённая для этого " +"прутка. Ограничивает максимальную объёмную скорость печати до минимальной " +"для этого принтера и прутка. Установите 0, чтобы убрать ограничения." -#: src/libslic3r/PrintConfig.cpp:652 +#: src/libslic3r/PrintConfig.cpp:669 msgid "Loading speed" msgstr "Скорость загрузки" -#: src/libslic3r/PrintConfig.cpp:653 +#: src/libslic3r/PrintConfig.cpp:670 msgid "Speed used for loading the filament on the wipe tower." -msgstr "Скорость загрузки прутка на башню очистки." +msgstr "Скорость загрузки прутка при печати черновой башни." -#: src/libslic3r/PrintConfig.cpp:660 +#: src/libslic3r/PrintConfig.cpp:677 msgid "Loading speed at the start" msgstr "Начальная скорость загрузки" -#: src/libslic3r/PrintConfig.cpp:661 +#: src/libslic3r/PrintConfig.cpp:678 msgid "Speed used at the very beginning of loading phase." -msgstr "Скорость, используемая на очень ранней стадии загрузки." +msgstr "Скорость в начальной фазе загрузки прутка." -#: src/libslic3r/PrintConfig.cpp:668 +#: src/libslic3r/PrintConfig.cpp:685 msgid "Unloading speed" msgstr "Скорость выгрузки" -#: src/libslic3r/PrintConfig.cpp:669 +#: src/libslic3r/PrintConfig.cpp:686 msgid "" -"Speed used for unloading the filament on the wipe tower (does not affect " -"initial part of unloading just after ramming)." +"Speed used for unloading the filament on the wipe tower (does not affect initial " +"part of unloading just after ramming)." msgstr "" -"Скорость выгрузки прутка на башню очистки (не влияет на начальную фазу " -"выгрузки сразу после рэмминга)." +"Скорость выгрузки прутка на черновую башню. (не влияет на начальную фазу выгрузки " +"сразу после рэмминга)." -#: src/libslic3r/PrintConfig.cpp:677 +#: src/libslic3r/PrintConfig.cpp:694 msgid "Unloading speed at the start" msgstr "Начальная скорость выгрузки" -#: src/libslic3r/PrintConfig.cpp:678 -msgid "" -"Speed used for unloading the tip of the filament immediately after ramming." +#: src/libslic3r/PrintConfig.cpp:695 +msgid "Speed used for unloading the tip of the filament immediately after ramming." msgstr "Скорость выгрузки кончика прутка сразу после рэмминга." -#: src/libslic3r/PrintConfig.cpp:685 +#: src/libslic3r/PrintConfig.cpp:702 msgid "Delay after unloading" msgstr "Задержка после выгрузки" -#: src/libslic3r/PrintConfig.cpp:686 +#: src/libslic3r/PrintConfig.cpp:703 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." +"Time to wait after the filament is unloaded. May help to get reliable toolchanges " +"with flexible materials that may need more time to shrink to original dimensions." msgstr "" -"Время ожидания после выгрузки прутка. Это может помочь вам легко сменить " -"сопло при печати гибкими материалами, которым требуется больше времени, " -"чтобы вернуться к своим первоначальным размерам." +"Время ожидания после выгрузки прутка. Это может помочь вам легко сменить сопло при " +"печати гибкими материалами, которым требуется больше времени, чтобы вернуться к " +"своим первоначальным размерам." -#: src/libslic3r/PrintConfig.cpp:695 +#: src/libslic3r/PrintConfig.cpp:712 msgid "Number of cooling moves" msgstr "Количество охлаждающих движений" -#: src/libslic3r/PrintConfig.cpp:696 +#: src/libslic3r/PrintConfig.cpp:713 msgid "" -"Filament is cooled by being moved back and forth in the cooling tubes. " -"Specify desired number of these moves." +"Filament is cooled by being moved back and forth in the cooling tubes. Specify " +"desired number of these moves." msgstr "" "Пруток охлаждается в охлаждающих трубках путём перемещения назад и вперёд. " "Укажите желаемое количество таких движений." -#: src/libslic3r/PrintConfig.cpp:704 +#: src/libslic3r/PrintConfig.cpp:721 msgid "Speed of the first cooling move" msgstr "Скорость первого охлаждающего движения" -#: src/libslic3r/PrintConfig.cpp:705 +#: src/libslic3r/PrintConfig.cpp:722 msgid "Cooling moves are gradually accelerating beginning at this speed." msgstr "Охлаждающие движения постепенно ускоряются, начиная с этой скорости." -#: src/libslic3r/PrintConfig.cpp:712 +#: src/libslic3r/PrintConfig.cpp:729 msgid "Minimal purge on wipe tower" -msgstr "Минимальная длина очистки на башне" +msgstr "Мин. объём сброса на черновой башне" -#: src/libslic3r/PrintConfig.cpp:713 +#: src/libslic3r/PrintConfig.cpp:730 msgid "" -"After a tool change, the exact position of the newly loaded filament inside " -"the nozzle may not be known, and the filament pressure is likely not yet " -"stable. Before purging the print head into an infill or a sacrificial " -"object, Slic3r will always prime this amount of material into the wipe tower " -"to produce successive infill or sacrificial object extrusions reliably." +"After a tool change, the exact position of the newly loaded filament inside the " +"nozzle may not be known, and the filament pressure is likely not yet stable. Before " +"purging the print head into an infill or a sacrificial object, Slic3r will always " +"prime this amount of material into the wipe tower to produce successive infill or " +"sacrificial object extrusions reliably." msgstr "" +"После смены инструмента, точное положение вновь загруженного прутка внутри него может " +"быть неизвестно, и давление прутка, вероятно, ещё не стабильно. Перед тем, как " +"очистить печатающую головку в заполнение или в \"жертвенную\" модель, PrusaSlicer " +"всегда будет выдавливать это количество материала на черновую башню, чтобы " +"обеспечить надёжную печать заполнения или \"жертвенной\" модели." -#: src/libslic3r/PrintConfig.cpp:717 +#: src/libslic3r/PrintConfig.cpp:734 msgid "mm³" msgstr "мм³" -#: src/libslic3r/PrintConfig.cpp:723 +#: src/libslic3r/PrintConfig.cpp:740 msgid "Speed of the last cooling move" msgstr "Скорость последнего охлаждающего движения" -#: src/libslic3r/PrintConfig.cpp:724 +#: src/libslic3r/PrintConfig.cpp:741 msgid "Cooling moves are gradually accelerating towards this speed." msgstr "Охлаждающие движения постепенно ускоряют до этой скорости." -#: src/libslic3r/PrintConfig.cpp:731 +#: src/libslic3r/PrintConfig.cpp:748 msgid "Filament load time" -msgstr "Время загрузки прутка" +msgstr "Время загрузки пластика" -#: src/libslic3r/PrintConfig.cpp:732 +#: src/libslic3r/PrintConfig.cpp:749 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to load a new " -"filament during a tool change (when executing the T code). This time is " -"added to the total print time by the G-code time estimator." +"filament during a tool change (when executing the T code). This time is added to " +"the total print time by the G-code time estimator." msgstr "" +"Время за которое прошивка принтера (или Multi Material Unit 2.0) выгружает " +"пруток во время смены инструмента (при выполнении кода Т). Это время добавляется " +"к общему времени печати с помощью алгоритма оценки времени выполнения G-" +"кода." -#: src/libslic3r/PrintConfig.cpp:739 +#: src/libslic3r/PrintConfig.cpp:756 msgid "Ramming parameters" msgstr "Параметры рэмминга" -#: src/libslic3r/PrintConfig.cpp:740 +#: src/libslic3r/PrintConfig.cpp:757 msgid "" -"This string is edited by RammingDialog and contains ramming specific " -"parameters." +"This string is edited by RammingDialog and contains ramming specific parameters." msgstr "" "Эта строка редактируется диалоговым окном рэмминга и содержит его конкретные " "параметры." -#: src/libslic3r/PrintConfig.cpp:746 +#: src/libslic3r/PrintConfig.cpp:763 msgid "Filament unload time" -msgstr "Время выгрузки прутка" +msgstr "Время выгрузки пластика" -#: src/libslic3r/PrintConfig.cpp:747 +#: src/libslic3r/PrintConfig.cpp:764 msgid "" -"Time for the printer firmware (or the Multi Material Unit 2.0) to unload a " -"filament during a tool change (when executing the T code). This time is " -"added to the total print time by the G-code time estimator." +"Time for the printer firmware (or the Multi Material Unit 2.0) to unload a filament " +"during a tool change (when executing the T code). This time is added to the total " +"print time by the G-code time estimator." msgstr "" +"Время за которое прошивка принтера (или Multi Material Unit 2.0) выгружает " +"пруток во время смены инструмента (при выполнении кода Т). Это время " +"добавляется к общему времени печати с помощью алгоритма оценки времени выполнения G-" +"кода." -#: src/libslic3r/PrintConfig.cpp:755 +#: src/libslic3r/PrintConfig.cpp:772 msgid "" -"Enter your filament diameter here. Good precision is required, so use a " -"caliper and do multiple measurements along the filament, then compute the " -"average." +"Enter your filament diameter here. Good precision is required, so use a caliper and " +"do multiple measurements along the filament, then compute the average." msgstr "" -"Здесь задаётся диаметр используемого прутка. Требуется хорошая точность, " -"поэтому используйте штангенциркуль, чтобы сделать несколько измерений вдоль " -"прутка и вычислить среднее значение." +"Здесь задаётся диаметр прутка. Требуется хорошая точность, поэтому " +"используйте штангенциркуль, чтобы сделать несколько измерений вдоль прутка и " +"вычислить среднее значение." -#: src/libslic3r/PrintConfig.cpp:762 src/libslic3r/PrintConfig.cpp:2699 -#: src/libslic3r/PrintConfig.cpp:2700 +#: src/libslic3r/PrintConfig.cpp:779 src/libslic3r/PrintConfig.cpp:2731 +#: src/libslic3r/PrintConfig.cpp:2732 msgid "Density" msgstr "Плотность" -#: src/libslic3r/PrintConfig.cpp:763 +#: src/libslic3r/PrintConfig.cpp:780 msgid "" -"Enter your filament density here. This is only for statistical information. " -"A decent way is to weigh a known length of filament and compute the ratio of " -"the length to volume. Better is to calculate the volume directly through " -"displacement." +"Enter your filament density here. This is only for statistical information. A " +"decent way is to weigh a known length of filament and compute the ratio of the " +"length to volume. Better is to calculate the volume directly through displacement." msgstr "" -"Введите здесь плотность используемого прутка. Это необходимо только для " -"статистической информации. Хорошим методом является взвешивание куска прутка " -"известной длины и вычисление отношения длины к его объёму. Объём же лучше " +"Введите здесь плотность (г/см3) используемого марериала прутка. Это необходимо " +"только для статистической информации. Хорошим методом является взвешивание кусочка " +"прутка известной длины и вычисление отношения длины к его объёму. Объём же лучше " "вычислять непосредственно путём вытеснения жидкости." -#: src/libslic3r/PrintConfig.cpp:766 +#: src/libslic3r/PrintConfig.cpp:783 msgid "g/cm³" msgstr "г/см³" -#: src/libslic3r/PrintConfig.cpp:771 +#: src/libslic3r/PrintConfig.cpp:788 msgid "Filament type" msgstr "Тип прутка" -#: src/libslic3r/PrintConfig.cpp:772 +#: src/libslic3r/PrintConfig.cpp:789 msgid "The filament material type for use in custom G-codes." -msgstr "" +msgstr "Тип прутка для использования в пользовательских G-кодах." -#: src/libslic3r/PrintConfig.cpp:799 +#: src/libslic3r/PrintConfig.cpp:816 msgid "Soluble material" msgstr "Растворимый материал" -#: src/libslic3r/PrintConfig.cpp:800 +#: src/libslic3r/PrintConfig.cpp:817 msgid "Soluble material is most likely used for a soluble support." msgstr "Растворимый материал, чаше всего используют для растворимой поддержки." -#: src/libslic3r/PrintConfig.cpp:806 +#: src/libslic3r/PrintConfig.cpp:823 msgid "" -"Enter your filament cost per kg here. This is only for statistical " -"information." +"Enter your filament cost per kg here. This is only for statistical information." msgstr "" "Введите стоимость прутка за 1 кг. Это необходимо только для статистической " "информации." -#: src/libslic3r/PrintConfig.cpp:807 +#: src/libslic3r/PrintConfig.cpp:824 msgid "money/kg" -msgstr "денег/кг" +msgstr "цена/кг" -#: src/libslic3r/PrintConfig.cpp:812 +#: src/libslic3r/PrintConfig.cpp:829 msgid "Spool weight" -msgstr "Вес катушки" +msgstr "Вес пустой катушки" -#: src/libslic3r/PrintConfig.cpp:813 +#: src/libslic3r/PrintConfig.cpp:830 msgid "" "Enter weight of the empty filament spool. One may weigh a partially consumed " -"filament spool before printing and one may compare the measured weight with " -"the calculated weight of the filament with the spool to find out whether the " -"amount of filament on the spool is sufficient to finish the print." +"filament spool before printing and one may compare the measured weight with the " +"calculated weight of the filament with the spool to find out whether the amount of " +"filament on the spool is sufficient to finish the print." msgstr "" +"Введите вес пустой катушки. Чтобы выяснить, хватит ли прутка на катушке для завершения печати, " +"можно перед началом печати взвесить частично израсходованную катушку с прутком и сравнить этот " +"вес с весом прутка (с катушкой), рассчитанным в процессе нарезки модели." -#: src/libslic3r/PrintConfig.cpp:817 +#: src/libslic3r/PrintConfig.cpp:834 msgid "g" msgstr "г" -#: src/libslic3r/PrintConfig.cpp:826 src/libslic3r/PrintConfig.cpp:2783 +#: src/libslic3r/PrintConfig.cpp:843 src/libslic3r/PrintConfig.cpp:2815 msgid "(Unknown)" msgstr "(Неизвестно)" -#: src/libslic3r/PrintConfig.cpp:830 +#: src/libslic3r/PrintConfig.cpp:847 msgid "Fill angle" msgstr "Угол печати заполнения" -#: src/libslic3r/PrintConfig.cpp:832 +#: src/libslic3r/PrintConfig.cpp:849 msgid "" -"Default base angle for infill orientation. Cross-hatching will be applied to " -"this. Bridges will be infilled using the best direction Slic3r can detect, " -"so this setting does not affect them." +"Default base angle for infill orientation. Cross-hatching will be applied to this. " +"Bridges will be infilled using the best direction Slic3r can detect, so this " +"setting does not affect them." msgstr "" "Базовый угол для ориентации шаблона заполнения. Для этого будет применяться " -"штриховка крест-накрест. Для мостов будет использоваться лучший тип " -"заполнения, так что этот параметр не влияет на них." +"штриховка крест-накрест. Для мостов будет использоваться лучший тип заполнения, так " +"что этот параметр не влияет на них." -#: src/libslic3r/PrintConfig.cpp:844 +#: src/libslic3r/PrintConfig.cpp:861 msgid "Fill density" msgstr "Плотность заполнения" -#: src/libslic3r/PrintConfig.cpp:846 +#: src/libslic3r/PrintConfig.cpp:863 msgid "Density of internal infill, expressed in the range 0% - 100%." msgstr "" "Плотность внутреннего заполнения, выраженная в диапазоне 0% - 100%. Чем выше " -"процент заполнения, тем крепче получается объект, но печатается она при этом " +"процент заполнения, тем крепче получается модель, но печатается она при этом " "гораздо дольше." -#: src/libslic3r/PrintConfig.cpp:881 +#: src/libslic3r/PrintConfig.cpp:898 msgid "Fill pattern" msgstr "Шаблон заполнения" -#: src/libslic3r/PrintConfig.cpp:883 +#: src/libslic3r/PrintConfig.cpp:900 msgid "Fill pattern for general low-density infill." -msgstr "Задаёт рисунок, используемый для уменьшения плотности заполнения." +msgstr "Задаёт то каким рисунком будет напечатано заполнение." -#: src/libslic3r/PrintConfig.cpp:903 +#: src/libslic3r/PrintConfig.cpp:920 msgid "Grid" msgstr "Сетка" -#: src/libslic3r/PrintConfig.cpp:904 +#: src/libslic3r/PrintConfig.cpp:921 msgid "Triangles" msgstr "Треугольники" -#: src/libslic3r/PrintConfig.cpp:905 +#: src/libslic3r/PrintConfig.cpp:922 msgid "Stars" msgstr "Звезды" -#: src/libslic3r/PrintConfig.cpp:906 +#: src/libslic3r/PrintConfig.cpp:923 msgid "Cubic" -msgstr "Куб" +msgstr "Кубический" -#: src/libslic3r/PrintConfig.cpp:907 +#: src/libslic3r/PrintConfig.cpp:924 msgid "Line" msgstr "Линии" -#: src/libslic3r/PrintConfig.cpp:909 src/libslic3r/PrintConfig.cpp:2206 +#: src/libslic3r/PrintConfig.cpp:926 src/libslic3r/PrintConfig.cpp:2238 msgid "Honeycomb" msgstr "Медовые соты" -#: src/libslic3r/PrintConfig.cpp:910 +#: src/libslic3r/PrintConfig.cpp:927 msgid "3D Honeycomb" msgstr "3D соты" -#: src/libslic3r/PrintConfig.cpp:911 +#: src/libslic3r/PrintConfig.cpp:928 msgid "Gyroid" -msgstr "Гироидное" +msgstr "Гироидный" -#: src/libslic3r/PrintConfig.cpp:915 +#: src/libslic3r/PrintConfig.cpp:932 msgid "Adaptive Cubic" -msgstr "" +msgstr "Динамический куб" -#: src/libslic3r/PrintConfig.cpp:916 +#: src/libslic3r/PrintConfig.cpp:933 msgid "Support Cubic" -msgstr "" +msgstr "Динам. куб. поддержка" -#: src/libslic3r/PrintConfig.cpp:920 src/libslic3r/PrintConfig.cpp:929 -#: src/libslic3r/PrintConfig.cpp:939 src/libslic3r/PrintConfig.cpp:973 +#: src/libslic3r/PrintConfig.cpp:937 src/libslic3r/PrintConfig.cpp:946 +#: src/libslic3r/PrintConfig.cpp:956 src/libslic3r/PrintConfig.cpp:990 msgid "First layer" msgstr "Первый слой" -#: src/libslic3r/PrintConfig.cpp:921 +#: src/libslic3r/PrintConfig.cpp:938 msgid "" -"This is the acceleration your printer will use for first layer. Set zero to " -"disable acceleration control for first layer." +"This is the acceleration your printer will use for first layer. Set zero to disable " +"acceleration control for first layer." msgstr "" -"Ускорение, которое принтер будет использовать для печати первого слоя. " -"Установить 0, чтобы отключить управление ускорением для первого слоя." +"Ускорение, которое принтер будет использовать для печати первого слоя. Установить " +"0, чтобы отключить управление ускорением для первого слоя." -#: src/libslic3r/PrintConfig.cpp:930 +#: src/libslic3r/PrintConfig.cpp:947 msgid "First layer bed temperature" -msgstr "Температура платформы на первом слое" +msgstr "Температура стола на первом слое" -#: src/libslic3r/PrintConfig.cpp:931 +#: src/libslic3r/PrintConfig.cpp:948 msgid "" -"Heated build plate temperature for the first layer. Set this to zero to " -"disable bed temperature control commands in the output." +"Heated build plate temperature for the first layer. Set this to zero to disable bed " +"temperature control commands in the output." msgstr "" -"Температура платформы для первого слоя. Установите 0, чтобы " -"отключить команды управления температурой платформы в результате." +"Температура подогреваемого стола для первого слоя. Установите 0, чтобы отключить " +"команды управления температурой стола на выходе." -#: src/libslic3r/PrintConfig.cpp:941 +#: src/libslic3r/PrintConfig.cpp:958 msgid "" -"Set this to a non-zero value to set a manual extrusion width for first " -"layer. You can use this to force fatter extrudates for better adhesion. If " -"expressed as percentage (for example 120%) it will be computed over first " -"layer height. If set to zero, it will use the default extrusion width." +"Set this to a non-zero value to set a manual extrusion width for first layer. You " +"can use this to force fatter extrudates for better adhesion. If expressed as " +"percentage (for example 120%) it will be computed over first layer height. If set " +"to zero, it will use the default extrusion width." msgstr "" "Установите значение отличное от 0, чтобы вручную задать ширину экструзии для " -"первого слоя. Вы можете поставить большее значение, чем по умолчанию, для " -"лучшей адгезии. Если задано в процентах, параметр вычисляется относительно " -"высоты слоя. При 0, будет использоваться \"Ширина экструзии по умолчанию\"." +"первого слоя. Вы можете поставить большее значение, чем по умолчанию, для лучшей " +"адгезии. Если задано в процентах, параметр вычисляется относительно высоты слоя. " +"При 0, будет использоваться \"Ширина экструзии по умолчанию\"." -#: src/libslic3r/PrintConfig.cpp:954 +#: src/libslic3r/PrintConfig.cpp:971 msgid "" -"When printing with very low layer heights, you might still want to print a " -"thicker bottom layer to improve adhesion and tolerance for non perfect build " -"plates. This can be expressed as an absolute value or as a percentage (for " -"example: 150%) over the default layer height." +"When printing with very low layer heights, you might still want to print a thicker " +"bottom layer to improve adhesion and tolerance for non perfect build plates. This " +"can be expressed as an absolute value or as a percentage (for example: 150%) over " +"the default layer height." msgstr "" -"При печати очень тонкими слоями на неидеально ровных платформах " -"для лучшего прилипания и удерживаемости может потребоваться печать нижнего" -" слоя шире обычного. " -"Эта величина задаётся абсолютным значением или в процентах (например, 150%) " -"от высоты слоя по умолчанию." +"Высота первого (самого нижнего) слоя. Как правило, задаётся немного больше \"Высота " +"слоя\" для лучшего закрепления (адгезии) модели на столе. Эта величина так же не " +"может быть больше диаметра сопла." -#: src/libslic3r/PrintConfig.cpp:963 +#: src/libslic3r/PrintConfig.cpp:980 msgid "First layer speed" msgstr "Скорость печати первого слоя" -#: src/libslic3r/PrintConfig.cpp:964 +#: src/libslic3r/PrintConfig.cpp:981 msgid "" -"If expressed as absolute value in mm/s, this speed will be applied to all " -"the print moves of the first layer, regardless of their type. If expressed " -"as a percentage (for example: 40%) it will scale the default speeds." +"If expressed as absolute value in mm/s, this speed will be applied to all the print " +"moves of the first layer, regardless of their type. If expressed as a percentage " +"(for example: 40%) it will scale the default speeds." msgstr "" -"Если задано абсолютным значением в мм/с, эта скорость будет применена ко " -"всем перемещениям при печати первого слоя, независимо от их типа. Если " -"задано в процентах (например, 40%), то параметр вычисляется относительно " -"скоростей по умолчанию." +"Если задано в абсолютном значении (мм/с), эта скорость будет применена ко всем " +"перемещениям при печати первого слоя, независимо от их типа. Если задано в " +"процентах, параметр вычисляется относительно выставленных скоростей по умолчанию. " +"Как правило, для лучшего прилипания модели к столу задаётся меньше остальных на " +"30-50%." -#: src/libslic3r/PrintConfig.cpp:974 +#: src/libslic3r/PrintConfig.cpp:991 msgid "First layer nozzle temperature" +msgstr "Температура сопла на первом слое" + +#: src/libslic3r/PrintConfig.cpp:992 +msgid "" +"Nozzle temperature for the first layer. If you want to control temperature manually " +"during print, set this to zero to disable temperature control commands in the " +"output G-code." msgstr "" +"Температура сопла при печати первого слоя. Если хотите контролировать температуру " +"во время печати вручную, установите 0 для отключения команд управления температурой " +"в выходном G-коде." -#: src/libslic3r/PrintConfig.cpp:975 +#: src/libslic3r/PrintConfig.cpp:1000 +msgid "Full fan speed at layer" +msgstr "Полная скорость вентилятора на слое" + +#: src/libslic3r/PrintConfig.cpp:1001 msgid "" -"Nozzle temperature for the first layer. If you want to control temperature " -"manually during print, set this to zero to disable temperature control " -"commands in the output G-code." +"Fan speed will be ramped up linearly from zero at layer \"disable_fan_first_layers" +"\" to maximum at layer \"full_fan_speed_layer\". \"full_fan_speed_layer\" will be " +"ignored if lower than \"disable_fan_first_layers\", in which case the fan will be " +"running at maximum allowed speed at layer \"disable_fan_first_layers\" + 1." msgstr "" +"Скорость вентилятора будет линейно увеличиваться от нуля на слое " +"«disable_fan_first_layers» до максимальной на слое «full_fan_speed_layer». " +"\"full_fan_speed_layer\" будет игнорироваться, если она ниже, чем " +"\"disable_fan_first_layers\", и в этом случае вентилятор будет работать с " +"максимально допустимой скоростью на слое \"disable_fan_first_layers\" +1." -#: src/libslic3r/PrintConfig.cpp:985 +#: src/libslic3r/PrintConfig.cpp:1013 msgid "" -"Speed for filling small gaps using short zigzag moves. Keep this reasonably " -"low to avoid too much shaking and resonance issues. Set zero to disable gaps " -"filling." +"Speed for filling small gaps using short zigzag moves. Keep this reasonably low to " +"avoid too much shaking and resonance issues. Set zero to disable gaps filling." msgstr "" -"Скорость заполнения небольших поверхностей (пробелов). Печать происходит " -"быстрыми зигзагообразными движениями, в результате, весь принтер может " -"прилично трясти. Задавайте низкие значения, чтобы избежать этого. Установите " -"0, чтобы отключить заполнение пробелов." +"Скорость заполнения небольших поверхностей (пробелов). Печать происходит быстрыми " +"зигзагообразными движениями, в результате, весь принтер может прилично трясти. " +"Задавайте низкие значения, чтобы избежать этого. Установите 0, чтобы отключить " +"заполнение пробелов." -#: src/libslic3r/PrintConfig.cpp:993 +#: src/libslic3r/PrintConfig.cpp:1021 msgid "Verbose G-code" msgstr "Подробный G-код" -#: src/libslic3r/PrintConfig.cpp:994 +#: src/libslic3r/PrintConfig.cpp:1022 msgid "" "Enable this to get a commented G-code file, with each line explained by a " -"descriptive text. If you print from SD card, the additional weight of the " -"file could make your firmware slow down." +"descriptive text. If you print from SD card, the additional weight of the file " +"could make your firmware slow down." msgstr "" -"Включите эту опцию, чтобы в каждой строке файла G-кода, присутствовал " -"комментарий с поясняющим текстом. При печати с SD-карты, скорость чтение " -"данных вашей прошивкой может снизится за счёт увеличения размера файла." +"Включите эту опцию, чтобы в каждой строке G-код файла, присутствовал комментарий с " +"поясняющим текстом. При печати с SD-карты, скорость чтение данных вашей прошивкой " +"может снизится за счёт увеличения размера файла." -#: src/libslic3r/PrintConfig.cpp:1001 +#: src/libslic3r/PrintConfig.cpp:1029 msgid "G-code flavor" -msgstr "Вариант G-кода" +msgstr "Тип G-кода" -#: src/libslic3r/PrintConfig.cpp:1002 +#: src/libslic3r/PrintConfig.cpp:1030 msgid "" "Some G/M-code commands, including temperature control and others, are not " -"universal. Set this option to your printer's firmware to get a compatible " -"output. The \"No extrusion\" flavor prevents PrusaSlicer from exporting any " -"extrusion value at all." +"universal. Set this option to your printer's firmware to get a compatible output. " +"The \"No extrusion\" flavor prevents PrusaSlicer from exporting any extrusion value " +"at all." msgstr "" -"Некоторые команды G/M-кода, такие как контроль температуры и другие, не " -"являются универсальными. Выберите тип прошивки вашего принтера, чтобы " -"получить совместимый результат. Вариант «Без экструзии» не позволяет " -"PrusaSlicer экспортировать какие-либо значения экструзии." +"Некоторые команды G/M-кода, такие как контроль температуры и другие, не являются " +"универсальными. Выберите тип прошивки вашего принтера, чтобы получить " +"совместимость. Параметр \"Без экструзии\" не позволяет PrusaSlicer экспортировать " +"какие-либо значения экструзии." -#: src/libslic3r/PrintConfig.cpp:1027 +#: src/libslic3r/PrintConfig.cpp:1055 msgid "No extrusion" msgstr "Без экструзии" -#: src/libslic3r/PrintConfig.cpp:1032 +#: src/libslic3r/PrintConfig.cpp:1060 msgid "Label objects" -msgstr "Помечать объекты" +msgstr "Название моделей" -#: src/libslic3r/PrintConfig.cpp:1033 +#: src/libslic3r/PrintConfig.cpp:1061 msgid "" -"Enable this to add comments into the G-Code labeling print moves with what " -"object they belong to, which is useful for the Octoprint CancelObject " -"plugin. This settings is NOT compatible with Single Extruder Multi Material " -"setup and Wipe into Object / Wipe into Infill." +"Enable this to add comments into the G-Code labeling print moves with what object " +"they belong to, which is useful for the Octoprint CancelObject plugin. This " +"settings is NOT compatible with Single Extruder Multi Material setup and Wipe into " +"Object / Wipe into Infill." msgstr "" -"Если включено, то в строки G-кода перемещения добавляются комментарии об " -"объекте, которому они принадлежат, что полезно для модуля Octoprint " -"CancelObject. Эта настройка НЕ совместима с Single Extruder Multi Material " -"setup и Wipe into Object / Wipe into Infill." +"Включите эту опцию, чтобы добавить комментарии в G-код с указанием того, к какой " +"модели он принадлежит, что полезно для плагина Octoprint CancelObject. Эта " +"настройка не совместима с настройкой \"Мультиматериальный одиночный экструдер\" и " +"\"Очистка в модель\" / \"Очистка в заполнение модели\"." -#: src/libslic3r/PrintConfig.cpp:1040 +#: src/libslic3r/PrintConfig.cpp:1068 msgid "High extruder current on filament swap" -msgstr "" +msgstr "Повышение тока экструдера при замене прутка" -#: src/libslic3r/PrintConfig.cpp:1041 +#: src/libslic3r/PrintConfig.cpp:1069 msgid "" -"It may be beneficial to increase the extruder motor current during the " -"filament exchange sequence to allow for rapid ramming feed rates and to " -"overcome resistance when loading a filament with an ugly shaped tip." +"It may be beneficial to increase the extruder motor current during the filament " +"exchange sequence to allow for rapid ramming feed rates and to overcome resistance " +"when loading a filament with an ugly shaped tip." msgstr "" +"Это может быть полезно для увеличения тока двигателя экструдера во время замены " +"прутка, чтобы быстро увеличить скорость подачи и преодолеть сопротивление " +"при загрузке прутка с плохой формой кончика." -#: src/libslic3r/PrintConfig.cpp:1049 +#: src/libslic3r/PrintConfig.cpp:1077 msgid "" -"This is the acceleration your printer will use for infill. Set zero to " -"disable acceleration control for infill." +"This is the acceleration your printer will use for infill. Set zero to disable " +"acceleration control for infill." msgstr "" -"Ускорение, которое принтер будет использовать для заполнения. Установить 0, " -"чтобы отключить управление ускорением для заполнения." +"Ускорение, которое принтер будет использовать для заполнения. Установить 0, чтобы " +"отключить управление ускорением для заполнения." -#: src/libslic3r/PrintConfig.cpp:1057 +#: src/libslic3r/PrintConfig.cpp:1085 msgid "Combine infill every" msgstr "Объединять заполнение каждые" -#: src/libslic3r/PrintConfig.cpp:1059 +#: src/libslic3r/PrintConfig.cpp:1087 msgid "" -"This feature allows to combine infill and speed up your print by extruding " -"thicker infill layers while preserving thin perimeters, thus accuracy." +"This feature allows to combine infill and speed up your print by extruding thicker " +"infill layers while preserving thin perimeters, thus accuracy." msgstr "" -"Для экономии времени печати есть возможность печатать заполнение не на " -"каждом слое, а скажем, на двух или трёх слоях сразу. По умолчанию стоит 1, " -"то есть печатать заполнение в каждом слое. Если, например, поставить 2, " -"тогда на два слоя периметра будет печататься один слой заполнения удвоенной " -"толщины. При этом сохраняются тонкие периметры, и тем самым точность." +"Для экономии времени печати есть возможность печатать заполнение не на каждом слое, " +"а скажем, на двух или трёх слоях сразу. По умолчанию стоит 1, то есть печатать " +"заполнение в каждом слое. Если, например, поставить 2, тогда на два слоя периметра " +"будет печататься один слой заполнения удвоенной толщины. При этом сохраняются " +"тонкие периметры, и тем самым точность." -#: src/libslic3r/PrintConfig.cpp:1062 +#: src/libslic3r/PrintConfig.cpp:1090 msgid "Combine infill every n layers" -msgstr "Объединять заполнение каждые" +msgstr "" +"Объединять заполнение каждые" -#: src/libslic3r/PrintConfig.cpp:1068 +#: src/libslic3r/PrintConfig.cpp:1096 msgid "Length of the infill anchor" -msgstr "" +msgstr "Длина привязок разреженного заполнения" -#: src/libslic3r/PrintConfig.cpp:1070 +#: src/libslic3r/PrintConfig.cpp:1098 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " -"additional perimeter. If expressed as percentage (example: 15%) it is " -"calculated over infill extrusion width. PrusaSlicer tries to connect two " -"close infill lines to a short perimeter segment. If no such perimeter " -"segment shorter than infill_anchor_max is found, the infill line is " -"connected to a perimeter segment at just one side and the length of the " -"perimeter segment taken is limited to this parameter, but no longer than " -"anchor_length_max. Set this parameter to zero to disable anchoring " -"perimeters connected to a single infill line." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:1085 +"additional perimeter. If expressed as percentage (example: 15%) it is calculated " +"over infill extrusion width. PrusaSlicer tries to connect two close infill lines to " +"a short perimeter segment. If no such perimeter segment shorter than " +"infill_anchor_max is found, the infill line is connected to a perimeter segment at " +"just one side and the length of the perimeter segment taken is limited to this " +"parameter, but no longer than anchor_length_max. Set this parameter to zero to " +"disable anchoring perimeters connected to a single infill line." +msgstr "" +"Соединять линию заполнения с внутренним периметром с помощью короткого отрезка " +"дополнительного периметра (привязок). Если выражено в процентах (например 15%), то " +"она вычисляется по ширине экструзии заполнения. PrusaSlicer пытается соединить две " +"ближайшие линии заполнения с коротким отрезком периметра. Если не найдено такого " +"отрезка периметра короче \"Максимальной длины привязок разреженного заполнения" +"\" (anchor_length_max), то линия заполнения соединяется с отрезком периметра только " +"с одной стороны, а длина отрезка периметра ограничена этим параметром, но не больше " +"\"Максимальной длины привязок разреженного заполнения\" (anchor_length_max). " +"Установите этот параметр равным нулю для отключения привязок периметров, " +"соединённых к одной линии заполнения." + +#: src/libslic3r/PrintConfig.cpp:1113 msgid "0 (no open anchors)" -msgstr "" +msgstr "0 (нет открытых привязок)" -#: src/libslic3r/PrintConfig.cpp:1090 src/libslic3r/PrintConfig.cpp:1112 +#: src/libslic3r/PrintConfig.cpp:1118 src/libslic3r/PrintConfig.cpp:1140 msgid "1000 (unlimited)" -msgstr "" +msgstr "1000 (неограниченно)" -#: src/libslic3r/PrintConfig.cpp:1095 +#: src/libslic3r/PrintConfig.cpp:1123 msgid "Maximum length of the infill anchor" -msgstr "" +msgstr "Максимальная длина привязок разреженного заполнения" -#: src/libslic3r/PrintConfig.cpp:1097 +#: src/libslic3r/PrintConfig.cpp:1125 msgid "" "Connect an infill line to an internal perimeter with a short segment of an " -"additional perimeter. If expressed as percentage (example: 15%) it is " -"calculated over infill extrusion width. PrusaSlicer tries to connect two " -"close infill lines to a short perimeter segment. If no such perimeter " -"segment shorter than this parameter is found, the infill line is connected " -"to a perimeter segment at just one side and the length of the perimeter " -"segment taken is limited to infill_anchor, but no longer than this " -"parameter. Set this parameter to zero to disable anchoring." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:1107 +"additional perimeter. If expressed as percentage (example: 15%) it is calculated " +"over infill extrusion width. PrusaSlicer tries to connect two close infill lines to " +"a short perimeter segment. If no such perimeter segment shorter than this parameter " +"is found, the infill line is connected to a perimeter segment at just one side and " +"the length of the perimeter segment taken is limited to infill_anchor, but no " +"longer than this parameter. Set this parameter to zero to disable anchoring." +msgstr "" +"Соединять линию заполнения с внутренним периметром с помощью короткого отрезка " +"дополнительного периметра (привязок). Если выражено в процентах (например 15%), то " +"она вычисляется по ширине экструзии заполнения. PrusaSlicer пытается соединить две " +"ближайшие линии заполнения с коротким отрезком периметра. Если не найдено такого " +"отрезка периметра короче этого параметра, линия заполнения соединяется с отрезком " +"периметра только с одной стороны, а длина отрезка периметра ограничена \"Длиной " +"привязок разреженного заполнения\" (infill_anchor), но не больше этого параметра. " +"Установите этот параметр равным нулю для отключения привязок." + +#: src/libslic3r/PrintConfig.cpp:1135 msgid "0 (not anchored)" -msgstr "" +msgstr "0 (без привязок)" -#: src/libslic3r/PrintConfig.cpp:1117 +#: src/libslic3r/PrintConfig.cpp:1145 msgid "Infill extruder" msgstr "Экструдер заполнения" -#: src/libslic3r/PrintConfig.cpp:1119 +#: src/libslic3r/PrintConfig.cpp:1147 msgid "The extruder to use when printing infill." msgstr "Номер экструдера, которым печатается заполнение." -#: src/libslic3r/PrintConfig.cpp:1127 +#: src/libslic3r/PrintConfig.cpp:1155 msgid "" -"Set this to a non-zero value to set a manual extrusion width for infill. If " -"left zero, default extrusion width will be used if set, otherwise 1.125 x " -"nozzle diameter will be used. You may want to use fatter extrudates to speed " -"up the infill and make your parts stronger. If expressed as percentage (for " -"example 90%) it will be computed over layer height." +"Set this to a non-zero value to set a manual extrusion width for infill. If left " +"zero, default extrusion width will be used if set, otherwise 1.125 x nozzle " +"diameter will be used. You may want to use fatter extrudates to speed up the infill " +"and make your parts stronger. If expressed as percentage (for example 90%) it will " +"be computed over layer height." msgstr "" "Установите значение отличное от 0, чтобы вручную задать ширину экструзии для " -"заполнения. Если оставить 0, будет использоваться \"Ширина экструзии по " -"умолчанию\" - если она задана, в противном случае будет использоваться 1,125 " -"x диаметра сопла. Вы можете использовать сопла большего диаметра, чтобы " -"ускорить заполнение и сделать ваши детали прочнее. Если задано в процентах, " -"параметр вычисляется относительно высоты слоя." +"заполнения. Если оставить 0, будет использоваться \"Ширина экструзии по умолчанию\" " +"- если она задана, в противном случае будет использоваться 1,125 x диаметра сопла. " +"Вы можете использовать сопла большего диаметра, чтобы ускорить заполнение и сделать " +"ваши детали прочнее. Если задано в процентах, параметр вычисляется относительно " +"высоты слоя." -#: src/libslic3r/PrintConfig.cpp:1137 +#: src/libslic3r/PrintConfig.cpp:1165 msgid "Infill before perimeters" msgstr "Сначала печатать заполнение" -#: src/libslic3r/PrintConfig.cpp:1138 +#: src/libslic3r/PrintConfig.cpp:1166 msgid "" -"This option will switch the print order of perimeters and infill, making the " -"latter first." +"This option will switch the print order of perimeters and infill, making the latter " +"first." msgstr "" "Изменяет порядок печати слоёв. Обычно сначала печатается периметр, а потом " -"заполнение. Включив этот параметр, будет сначала печатаете заполнение, а " -"потом периметр. Имеет смысл, если периметр печатается в один слой." +"заполнение. Включив этот параметр, сначала будет печататься заполнение, а потом " +"периметр. Имеет смысл, если периметр печатается в один слой." -#: src/libslic3r/PrintConfig.cpp:1143 +#: src/libslic3r/PrintConfig.cpp:1171 msgid "Only infill where needed" msgstr "Заполнение только там, где нужно" -#: src/libslic3r/PrintConfig.cpp:1145 +#: src/libslic3r/PrintConfig.cpp:1173 msgid "" -"This option will limit infill to the areas actually needed for supporting " -"ceilings (it will act as internal support material). If enabled, slows down " -"the G-code generation due to the multiple checks involved." +"This option will limit infill to the areas actually needed for supporting ceilings " +"(it will act as internal support material). If enabled, slows down the G-code " +"generation due to the multiple checks involved." msgstr "" -"Slic3r проанализирует модель и выберет где именно необходимо заполнение для " -"того, чтобы поддержать внутренние потолки и свесы. Полезно для уменьшения " -"времени и материалов, но параметр очень влияет на прочность модели, поэтому " -"пользоваться надо с осторожностью. Если включено, замедляет генерацию G-кода " -"из-за многочисленных расчётов." +"PrusaSlicer проанализирует модель и выберет где именно необходимо заполнение для " +"того, чтобы поддержать внутренние потолки и свесы. Полезно для уменьшения времени и " +"материалов, но параметр очень влияет на прочность модели, поэтому пользоваться надо " +"с осторожностью. Если включено, замедляет генерацию G-кода из-за многочисленных " +"расчётов." -#: src/libslic3r/PrintConfig.cpp:1152 +#: src/libslic3r/PrintConfig.cpp:1180 msgid "Infill/perimeters overlap" -msgstr "Перекрытие заполнения с линиями периметра" +msgstr "Перекрытие линий заполнения с линиями периметра" -#: src/libslic3r/PrintConfig.cpp:1154 +#: src/libslic3r/PrintConfig.cpp:1182 msgid "" -"This setting applies an additional overlap between infill and perimeters for " -"better bonding. Theoretically this shouldn't be needed, but backlash might " -"cause gaps. If expressed as percentage (example: 15%) it is calculated over " -"perimeter extrusion width." +"This setting applies an additional overlap between infill and perimeters for better " +"bonding. Theoretically this shouldn't be needed, but backlash might cause gaps. If " +"expressed as percentage (example: 15%) it is calculated over perimeter extrusion " +"width." msgstr "" -"Параметр указывает на сколько миллиметров или процентов печать заполнения " -"будет перекрывать периметры для лучшего соединения. Теоретически надобности " -"в этом нет, но люфты при движении могут вызывать пробелы при печати. Если " -"задано в процентах, параметр вычисляется относительно ширины экструзии " -"периметра." +"Параметр указывает на сколько миллиметров или процентов печать заполнения будет " +"перекрывать периметры для лучшего соединения. Теоретически надобности в этом нет, " +"но люфты при движении могут вызывать пробелы при печати. Если задано в процентах, " +"параметр вычисляется относительно ширины экструзии периметра." -#: src/libslic3r/PrintConfig.cpp:1165 +#: src/libslic3r/PrintConfig.cpp:1193 msgid "Speed for printing the internal fill. Set to zero for auto." msgstr "" "Скорость печати внутреннего заполнения. Если установлено 0, то слайсер " "автоматически настраивает этот параметр." -#: src/libslic3r/PrintConfig.cpp:1173 +#: src/libslic3r/PrintConfig.cpp:1201 msgid "Inherits profile" msgstr "Наследует профиль" -#: src/libslic3r/PrintConfig.cpp:1174 +#: src/libslic3r/PrintConfig.cpp:1202 msgid "Name of the profile, from which this profile inherits." msgstr "Имя профиля, от которого наследуется данный профиль." -#: src/libslic3r/PrintConfig.cpp:1187 +#: src/libslic3r/PrintConfig.cpp:1215 msgid "Interface shells" msgstr "Связующие оболочки" -#: src/libslic3r/PrintConfig.cpp:1188 +#: src/libslic3r/PrintConfig.cpp:1216 msgid "" -"Force the generation of solid shells between adjacent materials/volumes. " -"Useful for multi-extruder prints with translucent materials or manual " -"soluble support material." +"Force the generation of solid shells between adjacent materials/volumes. Useful for " +"multi-extruder prints with translucent materials or manual soluble support material." msgstr "" -"Принудительное создание замкнутых (сплошных) оболочек между смежными " -"материалами/объёмами. Полезно для многоэкструдерных принтеров при печати " -"полупрозрачными материалами или растворимыми поддержками. Помогает избежать " -"диффузию материалов." +"Принудительное создание замкнутых (сплошных) оболочек между смежными материалами/" +"объёмами. Полезно для многоэкструдерных принтеров при печати полупрозрачными " +"материалами или растворимой поддержкой. Помогает избежать диффузию материалов." -#: src/libslic3r/PrintConfig.cpp:1196 +#: src/libslic3r/PrintConfig.cpp:1224 msgid "Enable ironing" -msgstr "Включить разглаживание" +msgstr "Вкл. разглаживание" -#: src/libslic3r/PrintConfig.cpp:1197 -msgid "" -"Enable ironing of the top layers with the hot print head for smooth surface" +#: src/libslic3r/PrintConfig.cpp:1225 +msgid "Enable ironing of the top layers with the hot print head for smooth surface" msgstr "" +"Включение разглаживания верхних слоёв с помощью горячего сопла для получения " +"гладкой поверхности." -#: src/libslic3r/PrintConfig.cpp:1203 src/libslic3r/PrintConfig.cpp:1205 +#: src/libslic3r/PrintConfig.cpp:1231 src/libslic3r/PrintConfig.cpp:1233 msgid "Ironing Type" msgstr "Тип разглаживания" -#: src/libslic3r/PrintConfig.cpp:1210 +#: src/libslic3r/PrintConfig.cpp:1238 msgid "All top surfaces" -msgstr "" +msgstr "Все верхние поверх." -#: src/libslic3r/PrintConfig.cpp:1211 +#: src/libslic3r/PrintConfig.cpp:1239 msgid "Topmost surface only" -msgstr "" +msgstr "Самые верхние поверх." -#: src/libslic3r/PrintConfig.cpp:1212 +#: src/libslic3r/PrintConfig.cpp:1240 msgid "All solid surfaces" -msgstr "" +msgstr "Все сплошные поверх." -#: src/libslic3r/PrintConfig.cpp:1217 +#: src/libslic3r/PrintConfig.cpp:1245 msgid "Flow rate" -msgstr "Скорость потока" +msgstr "Поток" -#: src/libslic3r/PrintConfig.cpp:1219 +#: src/libslic3r/PrintConfig.cpp:1247 msgid "Percent of a flow rate relative to object's normal layer height." -msgstr "" +msgstr "Процент потока разглаживания относительно нормальной высоты слоя модели." -#: src/libslic3r/PrintConfig.cpp:1227 +#: src/libslic3r/PrintConfig.cpp:1255 msgid "Spacing between ironing passes" -msgstr "Расстояние между линиями поддержки" +msgstr "Расстояние между линиями разглаживания" -#: src/libslic3r/PrintConfig.cpp:1229 +#: src/libslic3r/PrintConfig.cpp:1257 msgid "Distance between ironing lines" -msgstr "" +msgstr "Расстояние между линиями разглаживания." -#: src/libslic3r/PrintConfig.cpp:1246 +#: src/libslic3r/PrintConfig.cpp:1274 msgid "" -"This custom code is inserted at every layer change, right after the Z move " -"and before the extruder moves to the first layer point. Note that you can " -"use placeholder variables for all Slic3r settings as well as [layer_num] and " -"[layer_z]." +"This custom code is inserted at every layer change, right after the Z move and " +"before the extruder moves to the first layer point. Note that you can use " +"placeholder variables for all Slic3r settings as well as [layer_num] and [layer_z]." msgstr "" -"Этот пользовательский код вставляется при каждой смене слоя, сразу после " -"движения оси Z и до того, как экструдер переместиться в точку первого слоя. " -"Обратите внимание, что вы можете использовать шаблонные переменные для всех " -"параметров Slic3r, в том числе [layer_num] и [layer_z]." +"Этот пользовательский код вставляется при каждой смене слоя, сразу после движения " +"оси Z и до того, как экструдер переместиться в точку первого слоя. Обратите " +"внимание, что вы можете использовать шаблонные переменные для всех параметров " +"PrusaSlicer в том числе [layer_num] и [layer_z]." -#: src/libslic3r/PrintConfig.cpp:1257 +#: src/libslic3r/PrintConfig.cpp:1285 msgid "Supports remaining times" -msgstr "" +msgstr "Поддержка точного времени печати" -#: src/libslic3r/PrintConfig.cpp:1258 +#: src/libslic3r/PrintConfig.cpp:1286 msgid "" -"Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute " -"intervals into the G-code to let the firmware show accurate remaining time. " -"As of now only the Prusa i3 MK3 firmware recognizes M73. Also the i3 MK3 " -"firmware supports M73 Qxx Sxx for the silent mode." +"Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute intervals into " +"the G-code to let the firmware show accurate remaining time. As of now only the " +"Prusa i3 MK3 firmware recognizes M73. Also the i3 MK3 firmware supports M73 Qxx Sxx " +"for the silent mode." msgstr "" +"Добавляет команду М73 P[процентов напечатано в нормальном режиме] R[оставшееся " +"время в секундах в нормальном режиме] с интервалом в 1 минуту в G-код, чтобы " +"прошивка отображала оставшееся время печати. На данный момент только прошивка Prusa " +"i3 MK3 распознает команду M73. Также прошивка i3 MK3 поддерживает команду M73 Qxx " +"Sxx для тихого режима печати." -#: src/libslic3r/PrintConfig.cpp:1266 +#: src/libslic3r/PrintConfig.cpp:1294 msgid "Supports stealth mode" msgstr "Поддержка тихого режима" -#: src/libslic3r/PrintConfig.cpp:1267 +#: src/libslic3r/PrintConfig.cpp:1295 msgid "The firmware supports stealth mode" -msgstr "" +msgstr "Прошивка должна поддерживать тихий режим" -#: src/libslic3r/PrintConfig.cpp:1272 +#: src/libslic3r/PrintConfig.cpp:1300 msgid "How to apply limits" -msgstr "Как применять ограничения" +msgstr "Как применять ограничения принтера" -#: src/libslic3r/PrintConfig.cpp:1273 +#: src/libslic3r/PrintConfig.cpp:1301 msgid "Purpose of Machine Limits" -msgstr "" +msgstr "Назначение ограничений принтера" -#: src/libslic3r/PrintConfig.cpp:1275 +#: src/libslic3r/PrintConfig.cpp:1303 msgid "How to apply the Machine Limits" -msgstr "" +msgstr "Как применять ограничения принтера" -#: src/libslic3r/PrintConfig.cpp:1280 +#: src/libslic3r/PrintConfig.cpp:1308 msgid "Emit to G-code" -msgstr "" +msgstr "Отправлять в G-код" -#: src/libslic3r/PrintConfig.cpp:1281 +#: src/libslic3r/PrintConfig.cpp:1309 msgid "Use for time estimate" -msgstr "" +msgstr "Использовать для оценки времени" -#: src/libslic3r/PrintConfig.cpp:1282 +#: src/libslic3r/PrintConfig.cpp:1310 msgid "Ignore" -msgstr "" +msgstr "Игнорировать" -#: src/libslic3r/PrintConfig.cpp:1305 +#: src/libslic3r/PrintConfig.cpp:1333 msgid "Maximum feedrate X" -msgstr "Макс. скорость подачи X" +msgstr "Максимальная скорость перемещения по X" -#: src/libslic3r/PrintConfig.cpp:1306 +#: src/libslic3r/PrintConfig.cpp:1334 msgid "Maximum feedrate Y" -msgstr "Макс. скорость подачи Y" +msgstr "Максимальная скорость перемещения по Y" -#: src/libslic3r/PrintConfig.cpp:1307 +#: src/libslic3r/PrintConfig.cpp:1335 msgid "Maximum feedrate Z" -msgstr "Макс. скорость подачи Z" +msgstr "Максимальная скорость перемещения по Z" -#: src/libslic3r/PrintConfig.cpp:1308 +#: src/libslic3r/PrintConfig.cpp:1336 msgid "Maximum feedrate E" -msgstr "Макс. скорость подачи E" +msgstr "Максимальная скорость подачи у экструдера (E)" -#: src/libslic3r/PrintConfig.cpp:1311 +#: src/libslic3r/PrintConfig.cpp:1339 msgid "Maximum feedrate of the X axis" -msgstr "Максимальная скорость подачи по оси X" +msgstr "Максимальная скорость перемещения по оси X" -#: src/libslic3r/PrintConfig.cpp:1312 +#: src/libslic3r/PrintConfig.cpp:1340 msgid "Maximum feedrate of the Y axis" -msgstr "Максимальная скорость подачи по оси Y" +msgstr "Максимальная скорость перемещения по оси Y" -#: src/libslic3r/PrintConfig.cpp:1313 +#: src/libslic3r/PrintConfig.cpp:1341 msgid "Maximum feedrate of the Z axis" -msgstr "Максимальная скорость подачи по оси Z" +msgstr "Максимальная скорость перемещения по оси Z" -#: src/libslic3r/PrintConfig.cpp:1314 +#: src/libslic3r/PrintConfig.cpp:1342 msgid "Maximum feedrate of the E axis" -msgstr "Максимальная скорость подачи по оси E" +msgstr "Максимальная скорость подачи у экструдера (E)" -#: src/libslic3r/PrintConfig.cpp:1322 +#: src/libslic3r/PrintConfig.cpp:1350 msgid "Maximum acceleration X" -msgstr "Макс. ускорение X" +msgstr "Максимальное ускорение по X" -#: src/libslic3r/PrintConfig.cpp:1323 +#: src/libslic3r/PrintConfig.cpp:1351 msgid "Maximum acceleration Y" -msgstr "Макс. ускорение Y" +msgstr "Максимальное ускорение по Y" -#: src/libslic3r/PrintConfig.cpp:1324 +#: src/libslic3r/PrintConfig.cpp:1352 msgid "Maximum acceleration Z" -msgstr "Макс. ускорение Z" +msgstr "Максимальное ускорение по Z" -#: src/libslic3r/PrintConfig.cpp:1325 +#: src/libslic3r/PrintConfig.cpp:1353 msgid "Maximum acceleration E" -msgstr "Макс. ускорение E" +msgstr "Максимальное ускорение подачи у экструдера (E)" -#: src/libslic3r/PrintConfig.cpp:1328 +#: src/libslic3r/PrintConfig.cpp:1356 msgid "Maximum acceleration of the X axis" -msgstr "Максимальное ускорение по оси X" +msgstr "Максимальное ускорение при перемещении по оси X" -#: src/libslic3r/PrintConfig.cpp:1329 +#: src/libslic3r/PrintConfig.cpp:1357 msgid "Maximum acceleration of the Y axis" -msgstr "Максимальное ускорение по оси Y" +msgstr "Максимальное ускорение при перемещении по оси Y" -#: src/libslic3r/PrintConfig.cpp:1330 +#: src/libslic3r/PrintConfig.cpp:1358 msgid "Maximum acceleration of the Z axis" -msgstr "Максимальное ускорение по оси Z" +msgstr "Максимальное ускорение при перемещении по оси Z" -#: src/libslic3r/PrintConfig.cpp:1331 +#: src/libslic3r/PrintConfig.cpp:1359 msgid "Maximum acceleration of the E axis" -msgstr "Максимальное ускорение по оси E" +msgstr "Максимальное ускорение подачи у экструдера (E)" -#: src/libslic3r/PrintConfig.cpp:1339 +#: src/libslic3r/PrintConfig.cpp:1367 msgid "Maximum jerk X" -msgstr "Максимальный рывок X" +msgstr "Максимальный рывок по X" -#: src/libslic3r/PrintConfig.cpp:1340 +#: src/libslic3r/PrintConfig.cpp:1368 msgid "Maximum jerk Y" -msgstr "Максимальный рывок Y" +msgstr "Максимальный рывок по Y" -#: src/libslic3r/PrintConfig.cpp:1341 +#: src/libslic3r/PrintConfig.cpp:1369 msgid "Maximum jerk Z" -msgstr "Максимальный рывок Z" +msgstr "Максимальный рывок по Z" -#: src/libslic3r/PrintConfig.cpp:1342 +#: src/libslic3r/PrintConfig.cpp:1370 msgid "Maximum jerk E" -msgstr "Максимальный рывок E" +msgstr "Максимальный рывок у экструдера (E)" -#: src/libslic3r/PrintConfig.cpp:1345 +#: src/libslic3r/PrintConfig.cpp:1373 msgid "Maximum jerk of the X axis" msgstr "Максимальный рывок по оси X" -#: src/libslic3r/PrintConfig.cpp:1346 +#: src/libslic3r/PrintConfig.cpp:1374 msgid "Maximum jerk of the Y axis" msgstr "Максимальный рывок по оси Y" -#: src/libslic3r/PrintConfig.cpp:1347 +#: src/libslic3r/PrintConfig.cpp:1375 msgid "Maximum jerk of the Z axis" msgstr "Максимальный рывок по оси Z" -#: src/libslic3r/PrintConfig.cpp:1348 +#: src/libslic3r/PrintConfig.cpp:1376 msgid "Maximum jerk of the E axis" -msgstr "Максимальный рывок по оси E" +msgstr "Максимальный рывок у экструдера (E)" -#: src/libslic3r/PrintConfig.cpp:1358 +#: src/libslic3r/PrintConfig.cpp:1386 msgid "Minimum feedrate when extruding" -msgstr "Минимальная скорость подачи при экструзии" +msgstr "Минимальная скорость перемещения при печати" -#: src/libslic3r/PrintConfig.cpp:1360 +#: src/libslic3r/PrintConfig.cpp:1388 msgid "Minimum feedrate when extruding (M205 S)" -msgstr "Минимальная скорость подачи при экструзии (M205 S)" +msgstr "Минимальная скорость перемещения при печати (M205 S)" -#: src/libslic3r/PrintConfig.cpp:1368 +#: src/libslic3r/PrintConfig.cpp:1396 msgid "Minimum travel feedrate" -msgstr "Скорость подачи при минимальных перемещениях" +msgstr "Минимальная скорость перемещения без печати" -#: src/libslic3r/PrintConfig.cpp:1370 +#: src/libslic3r/PrintConfig.cpp:1398 msgid "Minimum travel feedrate (M205 T)" -msgstr "Скорость подачи при минимальных перемещениях (M205 T)" +msgstr "Минимальная скорость перемещения без печати (M205 T)" -#: src/libslic3r/PrintConfig.cpp:1378 +#: src/libslic3r/PrintConfig.cpp:1406 msgid "Maximum acceleration when extruding" -msgstr "Макс. ускорение при выдавливании" +msgstr "Максимальное ускорение при печати" -#: src/libslic3r/PrintConfig.cpp:1380 +#: src/libslic3r/PrintConfig.cpp:1408 msgid "Maximum acceleration when extruding (M204 S)" -msgstr "Максимальное ускорение при выдавливании (M204 S)" +msgstr "Максимальное ускорение при печати (M204 S)" -#: src/libslic3r/PrintConfig.cpp:1388 +#: src/libslic3r/PrintConfig.cpp:1416 msgid "Maximum acceleration when retracting" -msgstr "Макс. ускорение при ретракте" +msgstr "Максимальное ускорение ретракта" -#: src/libslic3r/PrintConfig.cpp:1390 +#: src/libslic3r/PrintConfig.cpp:1418 msgid "Maximum acceleration when retracting (M204 T)" -msgstr "Максимальное ускорение при ретракте (M204 T)" +msgstr "Максимальное ускорение экструдера при ретракте (M204 T)" -#: src/libslic3r/PrintConfig.cpp:1397 src/libslic3r/PrintConfig.cpp:1406 +#: src/libslic3r/PrintConfig.cpp:1425 src/libslic3r/PrintConfig.cpp:1434 msgid "Max" -msgstr "Максимум" +msgstr "Макс." -#: src/libslic3r/PrintConfig.cpp:1398 +#: src/libslic3r/PrintConfig.cpp:1426 msgid "This setting represents the maximum speed of your fan." msgstr "Этот параметр регулирует максимальную скорость вращения вентилятора." -#: src/libslic3r/PrintConfig.cpp:1407 +#: src/libslic3r/PrintConfig.cpp:1435 msgid "" -"This is the highest printable layer height for this extruder, used to cap " -"the variable layer height and support layer height. Maximum recommended " -"layer height is 75% of the extrusion width to achieve reasonable inter-layer " -"adhesion. If set to 0, layer height is limited to 75% of the nozzle diameter." +"This is the highest printable layer height for this extruder, used to cap the " +"variable layer height and support layer height. Maximum recommended layer height is " +"75% of the extrusion width to achieve reasonable inter-layer adhesion. If set to 0, " +"layer height is limited to 75% of the nozzle diameter." msgstr "" -"Это наибольшая высота печатного слоя для этого экструдера, которая " -"используется для ограничения функции \"Переменная высота слоёв\" и высоты " -"поддерживающего слоя. Для достижения хорошей межслойной адгезии, " -"максимальная рекомендуемая высота слоя составляет 75% ширины экструзии. Если " -"установлено 0, высота слоя ограничивается 75% диаметра сопла." +"Это наибольшая высота печатного слоя для этого экструдера, которая также " +"используется для ограничения функции \"Переменная высота слоёв\" и высоты слоя " +"поддержки. Для достижения хорошей межслойной адгезии, максимальная рекомендуемая " +"высота слоя составляет 75% ширины экструзии. Если установлено 0, высота слоя " +"ограничивается 75% диаметра сопла." -#: src/libslic3r/PrintConfig.cpp:1417 +#: src/libslic3r/PrintConfig.cpp:1445 msgid "Max print speed" msgstr "Максимальная скорость печати" -#: src/libslic3r/PrintConfig.cpp:1418 +#: src/libslic3r/PrintConfig.cpp:1446 msgid "" -"When setting other speed settings to 0 Slic3r will autocalculate the optimal " -"speed in order to keep constant extruder pressure. This experimental setting " -"is used to set the highest print speed you want to allow." +"When setting other speed settings to 0 Slic3r will autocalculate the optimal speed " +"in order to keep constant extruder pressure. This experimental setting is used to " +"set the highest print speed you want to allow." msgstr "" -"При установке других параметров скорости в 0, Slic3r автоматически " -"рассчитает оптимальную скорость для поддержания постоянного давления в " -"экструдере. Этот экспериментальный параметр используется для задания " -"желаемой вами максимальной скорости печати." +"При установке других параметров скорости в 0, PrusaSlicer автоматически рассчитает " +"оптимальную скорость для поддержания постоянного давления в экструдере. Этот " +"экспериментальный параметр используется для задания желаемой вами максимальной " +"скорости печати." -#: src/libslic3r/PrintConfig.cpp:1428 +#: src/libslic3r/PrintConfig.cpp:1456 msgid "" -"This experimental setting is used to set the maximum volumetric speed your " -"extruder supports." +"This experimental setting is used to set the maximum volumetric speed your extruder " +"supports." msgstr "" -"Экспериментальная опция используется для установки максимальной объёмной " -"скорости подачи (выдавливания) материала, которую поддерживает ваш " -"экструдер. 0 - без ограничений." +"Экспериментальная опция используется для установки максимальной объёмной скорости " +"подачи (выдавливания) материала, которую поддерживает ваш экструдер. 0 - без " +"ограничений." -#: src/libslic3r/PrintConfig.cpp:1437 +#: src/libslic3r/PrintConfig.cpp:1465 msgid "Max volumetric slope positive" msgstr "Макс. положительное объёмное нависание" -#: src/libslic3r/PrintConfig.cpp:1438 src/libslic3r/PrintConfig.cpp:1449 +#: src/libslic3r/PrintConfig.cpp:1466 src/libslic3r/PrintConfig.cpp:1477 msgid "" -"This experimental setting is used to limit the speed of change in extrusion " -"rate. A value of 1.8 mm³/s² ensures, that a change from the extrusion rate " -"of 1.8 mm³/s (0.45mm extrusion width, 0.2mm extrusion height, feedrate 20 mm/" -"s) to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds." +"This experimental setting is used to limit the speed of change in extrusion rate. A " +"value of 1.8 mm³/s² ensures, that a change from the extrusion rate of 1.8 mm³/s " +"(0.45mm extrusion width, 0.2mm extrusion height, feedrate 20 mm/s) to 5.4 mm³/s " +"(feedrate 60 mm/s) will take at least 2 seconds." msgstr "" -"Этот экспериментальный параметр используется для ограничения скорости " -"изменения экструзии. Значение 1.8 мм³/с² гарантирует, что изменение скорости " -"экструзии с 1.8 мм³/с (ширина экструзии 0.45 мм, высота экструзии 0.2 мм, " -"скорость подачи 20 мм/с) до 5.4 мм³/с (скорость подачи 60 мм/с) займёт не " -"менее 2-х секунд." +"Этот экспериментальный параметр используется для ограничения скорости изменения " +"экструзии. Значение 1.8 мм³/с² гарантирует, что изменение скорости экструзии с 1.8 " +"мм³/с (ширина экструзии 0.45 мм, высота экструзии 0.2 мм, скорость подачи 20 мм/с) " +"до 5.4 мм³/с (скорость подачи 60 мм/с) займёт не менее 2-х секунд." -#: src/libslic3r/PrintConfig.cpp:1442 src/libslic3r/PrintConfig.cpp:1453 +#: src/libslic3r/PrintConfig.cpp:1470 src/libslic3r/PrintConfig.cpp:1481 msgid "mm³/s²" msgstr "мм³/с²" -#: src/libslic3r/PrintConfig.cpp:1448 +#: src/libslic3r/PrintConfig.cpp:1476 msgid "Max volumetric slope negative" msgstr "Макс. отрицательное объёмное нависание" -#: src/libslic3r/PrintConfig.cpp:1460 src/libslic3r/PrintConfig.cpp:1469 +#: src/libslic3r/PrintConfig.cpp:1488 src/libslic3r/PrintConfig.cpp:1497 msgid "Min" -msgstr "Минимум" +msgstr "Мин." -#: src/libslic3r/PrintConfig.cpp:1461 +#: src/libslic3r/PrintConfig.cpp:1489 msgid "This setting represents the minimum PWM your fan needs to work." msgstr "Этот параметр регулирует минимальную скорость вращения вентилятора." -#: src/libslic3r/PrintConfig.cpp:1470 +#: src/libslic3r/PrintConfig.cpp:1498 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." +"resolution for variable layer height. Typical values are between 0.05 mm and 0.1 mm." msgstr "" -"Это наименьшая высота печатаемого слоя для данного экструдера и в то же " -"время нижний предел для функции \"Переменная высота слоёв\". Обычно это 0.05 " -"или 0.1 мм." +"Это наименьшая высота печатаемого слоя для данного экструдера и в то же время " +"нижний предел для функции \"Переменная высота слоёв\". Обычно это 0.05 или 0.1 мм." -#: src/libslic3r/PrintConfig.cpp:1478 +#: src/libslic3r/PrintConfig.cpp:1506 msgid "Min print speed" msgstr "Минимальная скорость печати" -#: src/libslic3r/PrintConfig.cpp:1479 +#: src/libslic3r/PrintConfig.cpp:1507 msgid "Slic3r will not scale speed down below this speed." msgstr "" -"Нижний предел того, как медленно слой может быть напечатан. Slic3 не будет " -"снижать скорость ниже этой." +"Нижний предел того, как медленно слой может быть напечатан. Slic3 не будет снижать " +"скорость ниже этой." -#: src/libslic3r/PrintConfig.cpp:1486 +#: src/libslic3r/PrintConfig.cpp:1514 msgid "Minimal filament extrusion length" msgstr "Минимальная длина экструзии" -#: src/libslic3r/PrintConfig.cpp:1487 +#: src/libslic3r/PrintConfig.cpp:1515 msgid "" -"Generate no less than the number of skirt loops required to consume the " -"specified amount of filament on the bottom layer. For multi-extruder " -"machines, this minimum applies to each extruder." +"Generate no less than the number of skirt loops required to consume the specified " +"amount of filament on the bottom layer. For multi-extruder machines, this minimum " +"applies to each extruder." msgstr "" -"Минимальное количество пластика, которое должен протолкнуть экструдер при " -"печати юбки в миллиметрах. Для принтеров с несколькими экструдерами этот " -"минимум относится к каждому экструдеру." +"Минимальное количество пластика, которое должен протолкнуть экструдер при печати " +"юбки в миллиметрах. Для принтеров с несколькими экструдерами этот минимум относится " +"к каждому экструдеру." -#: src/libslic3r/PrintConfig.cpp:1496 +#: src/libslic3r/PrintConfig.cpp:1524 msgid "Configuration notes" msgstr "Примечание конфигурации" -#: src/libslic3r/PrintConfig.cpp:1497 +#: src/libslic3r/PrintConfig.cpp:1525 msgid "" -"You can put here your personal notes. This text will be added to the G-code " -"header comments." +"You can put here your personal notes. This text will be added to the G-code header " +"comments." msgstr "" -"Здесь вы можете оставить свои замечания для текущего профиля. Этот текст " -"будет добавлен к комментариям в заголовок G-кода." +"Здесь вы можете оставить свои замечания для текущего профиля. Этот текст будет " +"добавлен к комментариям в заголовок G-кода." -#: src/libslic3r/PrintConfig.cpp:1507 -msgid "" -"This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" +#: src/libslic3r/PrintConfig.cpp:1535 +msgid "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" msgstr "Диаметр используемого сопла (например: 0.5, 0.35 и др.)" -#: src/libslic3r/PrintConfig.cpp:1512 +#: src/libslic3r/PrintConfig.cpp:1540 msgid "Host Type" -msgstr "Тип узла" +msgstr "Тип хоста" -#: src/libslic3r/PrintConfig.cpp:1513 +#: src/libslic3r/PrintConfig.cpp:1541 msgid "" -"Slic3r can upload G-code files to a printer host. This field must contain " -"the kind of the host." +"Slic3r can upload G-code files to a printer host. This field must contain the kind " +"of the host." msgstr "" -"Slic3r может загрузить файлы G-кода на узел печати. Это поле должно " -"содержать тип этого узла." +"PrusaSlicer может загружать G-код файлы на хост принтера. Это поле должно содержать " +"тип хоста." -#: src/libslic3r/PrintConfig.cpp:1530 +#: src/libslic3r/PrintConfig.cpp:1558 msgid "Only retract when crossing perimeters" msgstr "Ретракт только при пересечении периметров" -#: src/libslic3r/PrintConfig.cpp:1531 +#: src/libslic3r/PrintConfig.cpp:1559 msgid "" "Disables retraction when the travel path does not exceed the upper layer's " "perimeters (and thus any ooze will be probably invisible)." msgstr "" -"При включённом параметре процесс ретракта включается только тогда, когда " -"сопло выходит за внешний контур." +"При включённом параметре процесс ретракта включается только тогда, когда сопло " +"выходит за внешний контур." -#: src/libslic3r/PrintConfig.cpp:1538 +#: src/libslic3r/PrintConfig.cpp:1566 msgid "" -"This option will drop the temperature of the inactive extruders to prevent " -"oozing. It will enable a tall skirt automatically and move extruders outside " -"such skirt when changing temperatures." +"This option will drop the temperature of the inactive extruders to prevent oozing. " +"It will enable a tall skirt automatically and move extruders outside such skirt " +"when changing temperatures." msgstr "" "Этот параметр снижает температуру неактивных экструдеров для предотвращения " "просачивания расплавленного материала из сопла. Это автоматически активирует " "генерацию юбки и перемещает экструдеры на эту юбки при изменении температуры." -#: src/libslic3r/PrintConfig.cpp:1545 +#: src/libslic3r/PrintConfig.cpp:1573 msgid "Output filename format" msgstr "Формат выходного файла" -#: src/libslic3r/PrintConfig.cpp:1546 +#: src/libslic3r/PrintConfig.cpp:1574 msgid "" "You can use all configuration options as variables inside this template. For " -"example: [layer_height], [fill_density] etc. You can also use [timestamp], " -"[year], [month], [day], [hour], [minute], [second], [version], " -"[input_filename], [input_filename_base]." -msgstr "" -"Вы можете использовать все параметры в качестве переменных внутри этого " -"шаблона. Они будят добавлены к имени файла. Например: [layer_height], " -"[fill_density]. Так же вы можете использовать [timestamp], [year], [month], " -"[day], [hour], [minute], [second], [version], [input_filename], " +"example: [layer_height], [fill_density] etc. You can also use [timestamp], [year], " +"[month], [day], [hour], [minute], [second], [version], [input_filename], " "[input_filename_base]." +msgstr "" +"Вы можете использовать все параметры в качестве переменных внутри этого шаблона. " +"Они будят добавлены к имени файла. Например: [layer_height], [fill_density]. Так же " +"вы можете использовать [timestamp], [year], [month], [day], [hour], [minute], " +"[second], [version], [input_filename], [input_filename_base]." -#: src/libslic3r/PrintConfig.cpp:1555 +#: src/libslic3r/PrintConfig.cpp:1583 msgid "Detect bridging perimeters" msgstr "Определять нависающие периметры" -#: src/libslic3r/PrintConfig.cpp:1557 +#: src/libslic3r/PrintConfig.cpp:1585 msgid "" -"Experimental option to adjust flow for overhangs (bridge flow will be used), " -"to apply bridge speed to them and enable fan." +"Experimental option to adjust flow for overhangs (bridge flow will be used), to " +"apply bridge speed to them and enable fan." msgstr "" -"Экспериментальная опция. Если у объекта есть части имеющие свесы, программа " -"рассчитает возможность их печати без поддержки, при этом увеличит обдув " -"модели и выставит скорость печати, как при печати мостов." +"Экспериментальная опция. Если у модели есть части имеющие свесы, программа " +"рассчитает возможность их печати без поддержки, при этом увеличит обдув модели и " +"выставит скорость печати, как при печати мостов." -#: src/libslic3r/PrintConfig.cpp:1563 +#: src/libslic3r/PrintConfig.cpp:1591 msgid "Filament parking position" msgstr "Положение парковки прутка" -#: src/libslic3r/PrintConfig.cpp:1564 +#: src/libslic3r/PrintConfig.cpp:1592 msgid "" -"Distance of the extruder tip from the position where the filament is parked " -"when unloaded. This should match the value in printer firmware." +"Distance of the extruder tip from the position where the filament is parked when " +"unloaded. This should match the value in printer firmware." msgstr "" -"Расстояние от кончика экструдера до точки, где размещается пруток при " -"выгрузке. Расстояние должно совпадать со значением в прошивке принтера." +"Расстояние от кончика экструдера до точки, где размещается пруток при выгрузке. " +"Расстояние должно соответствовать значению в прошивке принтера." -#: src/libslic3r/PrintConfig.cpp:1572 +#: src/libslic3r/PrintConfig.cpp:1600 msgid "Extra loading distance" msgstr "Дополнительная длина загрузки" -#: src/libslic3r/PrintConfig.cpp:1573 +#: src/libslic3r/PrintConfig.cpp:1601 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." +"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 "" -"Если установлено 0, то расстояние, которое проходит пруток при перемещении " -"из положения парковки во время загрузки, точно такое же, как и при выгрузке. " -"При положительном значении, она загружается дальше; при отрицательном, ход " -"загрузки короче (по сравнению с выгрузкой)." +"Если установлено 0, то расстояние, которое проходит пруток при перемещении из " +"положения парковки во время загрузки, точно такое же, как и при выгрузке. При " +"положительном значении, она загружается дальше; при отрицательном, ход загрузки " +"короче (по сравнению с выгрузкой)." -#: src/libslic3r/PrintConfig.cpp:1581 src/libslic3r/PrintConfig.cpp:1598 -#: src/libslic3r/PrintConfig.cpp:1611 src/libslic3r/PrintConfig.cpp:1621 +#: src/libslic3r/PrintConfig.cpp:1609 src/libslic3r/PrintConfig.cpp:1626 +#: src/libslic3r/PrintConfig.cpp:1639 src/libslic3r/PrintConfig.cpp:1649 msgid "Perimeters" msgstr "Периметры" -#: src/libslic3r/PrintConfig.cpp:1582 +#: src/libslic3r/PrintConfig.cpp:1610 msgid "" -"This is the acceleration your printer will use for perimeters. Set zero to " -"disable acceleration control for perimeters." +"This is the acceleration your printer will use for perimeters. Set zero to disable " +"acceleration control for perimeters." msgstr "" +"Это ускорение, которое ваш принтер будет использовать для печати периметров. " +"Установите ноль, чтобы отключить управление ускорением по периметру." -#: src/libslic3r/PrintConfig.cpp:1589 +#: src/libslic3r/PrintConfig.cpp:1617 msgid "Perimeter extruder" msgstr "Экструдер, печатающий внешние периметры" -#: src/libslic3r/PrintConfig.cpp:1591 -msgid "" -"The extruder to use when printing perimeters and brim. First extruder is 1." +#: src/libslic3r/PrintConfig.cpp:1619 +msgid "The extruder to use when printing perimeters and brim. First extruder is 1." msgstr "" -"Номер экструдера, которым печатаются периметры и кайма. Первый экструдер — 1." +"Номер экструдера, которым печатаются внешние периметры модели и кайма. Первый " +"экструдер - 1." -#: src/libslic3r/PrintConfig.cpp:1600 +#: src/libslic3r/PrintConfig.cpp:1628 msgid "" -"Set this to a non-zero value to set a manual extrusion width for perimeters. " -"You may want to use thinner extrudates to get more accurate surfaces. If " -"left zero, default extrusion width will be used if set, otherwise 1.125 x " -"nozzle diameter will be used. If expressed as percentage (for example 200%) " -"it will be computed over layer height." +"Set this to a non-zero value to set a manual extrusion width for perimeters. You " +"may want to use thinner extrudates to get more accurate surfaces. If left zero, " +"default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will " +"be used. If expressed as percentage (for example 200%) it will be computed over " +"layer height." msgstr "" "Установите значение отличное от 0, чтобы вручную задать ширину экструзии для " -"периметров. Вы можете использовать более тонкие сопла, чтобы получить более " -"точных поверхностей. Если оставить 0, будет использоваться \"Ширина " -"экструзии по умолчанию\" - если она задана, в противном случае будет " -"использоваться 1,125 x диаметра сопла. Если задано в процентах, параметр " -"вычисляется относительно высоты слоя." +"периметров. Вы можете использовать более тонкие сопла, чтобы получить более точных " +"поверхностей. Если оставить 0, будет использоваться \"Ширина экструзии по умолчанию" +"\" - если она задана, в противном случае будет использоваться 1,125 x диаметра " +"сопла. Если задано в процентах, параметр вычисляется относительно высоты слоя." -#: src/libslic3r/PrintConfig.cpp:1613 -msgid "" -"Speed for perimeters (contours, aka vertical shells). Set to zero for auto." +#: src/libslic3r/PrintConfig.cpp:1641 +msgid "Speed for perimeters (contours, aka vertical shells). Set to zero for auto." msgstr "" -"Скорость печати периметров (контуров, иначе вертикальных стенок). Установите " -"0 для автонастройки." +"Скорость печати периметров (контуров, иначе вертикальных стенок). Установите 0 для " +"автонастройки." -#: src/libslic3r/PrintConfig.cpp:1623 +#: src/libslic3r/PrintConfig.cpp:1651 msgid "" -"This option sets the number of perimeters to generate for each layer. Note " -"that Slic3r may increase this number automatically when it detects sloping " -"surfaces which benefit from a higher number of perimeters if the Extra " -"Perimeters option is enabled." +"This option sets the number of perimeters to generate for each layer. Note that " +"Slic3r may increase this number automatically when it detects sloping surfaces " +"which benefit from a higher number of perimeters if the Extra Perimeters option is " +"enabled." msgstr "" -"Количество слоёв контура объекта (или количество вертикальных слоёв стенки " -"объекта). Чем меньше число, тем меньше толщина стенки объекта, а значит, " -"объект будет более хрупкий. Обратите внимание, если включена опция " -"\"Дополнительные периметры при необходимости\", Slic3r может автоматически " -"увеличить это значение, если обнаружит наклонные поверхности." +"Количество слоёв контура модели (или количество вертикальных слоёв стенки модели). " +"Чем меньше число, тем меньше толщина стенки модели, а значит, модель будет более " +"хрупкая. Обратите внимание, если включена опция \"Дополнительные периметры при " +"необходимости\", PrusaSlicer может автоматически увеличить это значение, если " +"обнаружит наклонные поверхности." -#: src/libslic3r/PrintConfig.cpp:1627 +#: src/libslic3r/PrintConfig.cpp:1655 msgid "(minimum)" msgstr "(минимум)" -#: src/libslic3r/PrintConfig.cpp:1635 +#: src/libslic3r/PrintConfig.cpp:1663 msgid "" -"If you want to process the output G-code through custom scripts, just list " -"their absolute paths here. Separate multiple scripts with a semicolon. " -"Scripts will be passed the absolute path to the G-code file as the first " -"argument, and they can access the Slic3r config settings by reading " -"environment variables." +"If you want to process the output G-code through custom scripts, just list their " +"absolute paths here. Separate multiple scripts with a semicolon. Scripts will be " +"passed the absolute path to the G-code file as the first argument, and they can " +"access the Slic3r config settings by reading environment variables." msgstr "" -"Если вы хотите обработать выходной G-код с помощью пользовательских " -"скриптов, просто перечислите здесь абсолютные пути к ним. Разделяйте скрипты " -"точкой с запятой. Скриптам будет передан абсолютный путь к файлу G-кода в " -"качестве первого аргумента, и они смогут получить доступ к настройкам " -"конфигурации Slic3r, читая переменные окружения." +"Если вы хотите обработать выходной G-код с помощью пользовательских скриптов, " +"просто перечислите здесь абсолютные пути к ним. Разделяйте скрипты точкой с " +"запятой. Скриптам будет передан абсолютный путь к файлу G-кода в качестве первого " +"аргумента, и они смогут получить доступ к настройкам конфигурации PrusaSlicer, " +"читая переменные окружения." -#: src/libslic3r/PrintConfig.cpp:1647 +#: src/libslic3r/PrintConfig.cpp:1675 msgid "Printer type" msgstr "Тип принтера" -#: src/libslic3r/PrintConfig.cpp:1648 +#: src/libslic3r/PrintConfig.cpp:1676 msgid "Type of the printer." msgstr "Тип принтера." -#: src/libslic3r/PrintConfig.cpp:1653 +#: src/libslic3r/PrintConfig.cpp:1681 msgid "Printer notes" msgstr "Примечания к принтеру" -#: src/libslic3r/PrintConfig.cpp:1654 +#: src/libslic3r/PrintConfig.cpp:1682 msgid "You can put your notes regarding the printer here." msgstr "Здесь вы можете разместить свои заметки о принтере." -#: src/libslic3r/PrintConfig.cpp:1662 +#: src/libslic3r/PrintConfig.cpp:1690 msgid "Printer vendor" msgstr "Производитель принтера" -#: src/libslic3r/PrintConfig.cpp:1663 +#: src/libslic3r/PrintConfig.cpp:1691 msgid "Name of the printer vendor." msgstr "Название производителя принтера." -#: src/libslic3r/PrintConfig.cpp:1668 +#: src/libslic3r/PrintConfig.cpp:1696 msgid "Printer variant" msgstr "Модификация принтера" -#: src/libslic3r/PrintConfig.cpp:1669 +#: src/libslic3r/PrintConfig.cpp:1697 msgid "" "Name of the printer variant. For example, the printer variants may be " "differentiated by a nozzle diameter." msgstr "" -"Название модификации принтера. Например, это можно различать по диаметру " -"сопла." +"Название модификации принтера. Например, это можно различать по диаметру сопла." -#: src/libslic3r/PrintConfig.cpp:1682 +#: src/libslic3r/PrintConfig.cpp:1714 msgid "Raft layers" msgstr "Слоёв в подложке" -#: src/libslic3r/PrintConfig.cpp:1684 +#: src/libslic3r/PrintConfig.cpp:1716 msgid "" -"The object will be raised by this number of layers, and support material " -"will be generated under it." +"The object will be raised by this number of layers, and support material will be " +"generated under it." msgstr "" -"Параметр устанавливает высоту подложки в слоях. Ноль - отключает создание " -"подложки." +"Параметр устанавливает высоту подложки в слоях. Ноль - отключает создание подложки." -#: src/libslic3r/PrintConfig.cpp:1692 +#: src/libslic3r/PrintConfig.cpp:1724 msgid "Resolution" msgstr "Разрешение" -#: src/libslic3r/PrintConfig.cpp:1693 +#: src/libslic3r/PrintConfig.cpp:1725 msgid "" -"Minimum detail resolution, used to simplify the input file for speeding up " -"the slicing job and reducing memory usage. High-resolution models often " -"carry more detail than printers can render. Set to zero to disable any " -"simplification and use full resolution from input." +"Minimum detail resolution, used to simplify the input file for speeding up the " +"slicing job and reducing memory usage. High-resolution models often carry more " +"detail than printers can render. Set to zero to disable any simplification and use " +"full resolution from input." msgstr "" -"Минимальное разрешение детализации. Используется, чтобы упростить входной " -"файл для ускорения нарезки и уменьшения потребления оперативной памяти. " -"Модели с высоким разрешением часто больше детализированы, чем могут " -"отрисовать принтеры. Установите 0, чтобы отключить любое упрощение и " -"использовать полное разрешение из входного файла." +"Минимальное разрешение деталей модели. Используется, чтобы упростить входной файл " +"для ускорения нарезки и уменьшения потребления оперативной памяти. Модели с высоким " +"разрешением часто содержат больше деталей, чем принтеры могут выдать. Установите 0, " +"чтобы отключить любое упрощение и использовать полное разрешение для входного файла." -#: src/libslic3r/PrintConfig.cpp:1703 +#: src/libslic3r/PrintConfig.cpp:1735 msgid "Minimum travel after retraction" -msgstr "Мин. перемещение после ретракта" +msgstr "Минимальное расстояние перемещения для ретракта" -#: src/libslic3r/PrintConfig.cpp:1704 -msgid "" -"Retraction is not triggered when travel moves are shorter than this length." +#: src/libslic3r/PrintConfig.cpp:1736 +msgid "Retraction is not triggered when travel moves are shorter than this length." msgstr "" -"Ретракт не будет срабатывать, если расстояние между точками печати меньше " -"заданного в этом параметре." +"Ретракт не будет срабатывать, если расстояние между точками печати меньше заданного " +"значения." -#: src/libslic3r/PrintConfig.cpp:1710 +#: src/libslic3r/PrintConfig.cpp:1742 msgid "Retract amount before wipe" msgstr "Величина ретракта перед очисткой" -#: src/libslic3r/PrintConfig.cpp:1711 +#: src/libslic3r/PrintConfig.cpp:1743 msgid "" -"With bowden extruders, it may be wise to do some amount of quick retract " -"before doing the wipe movement." +"With bowden extruders, it may be wise to do some amount of quick retract before " +"doing the wipe movement." msgstr "" -"При использовании боуден-экструдеров, будет разумно сделать несколько " -"быстрых ретрактов перед тем, как совершить движение очистки." +"При использовании боуден-экструдеров, будет разумно сделать небольшое втягивание " +"прутка перед тем, как совершить движение очистки." -#: src/libslic3r/PrintConfig.cpp:1718 +#: src/libslic3r/PrintConfig.cpp:1750 msgid "Retract on layer change" msgstr "Ретракт при смене слоя" -#: src/libslic3r/PrintConfig.cpp:1719 +#: src/libslic3r/PrintConfig.cpp:1751 msgid "This flag enforces a retraction whenever a Z move is done." msgstr "Эта опция включает ретракт при переходе со слоя на слой." -#: src/libslic3r/PrintConfig.cpp:1724 src/libslic3r/PrintConfig.cpp:1732 +#: src/libslic3r/PrintConfig.cpp:1756 src/libslic3r/PrintConfig.cpp:1764 msgid "Length" msgstr "Длина" -#: src/libslic3r/PrintConfig.cpp:1725 +#: src/libslic3r/PrintConfig.cpp:1757 msgid "Retraction Length" msgstr "Длина ретракта" -#: src/libslic3r/PrintConfig.cpp:1726 +#: src/libslic3r/PrintConfig.cpp:1758 msgid "" -"When retraction is triggered, filament is pulled back by the specified " -"amount (the length is measured on raw filament, before it enters the " -"extruder)." +"When retraction is triggered, filament is pulled back by the specified amount (the " +"length is measured on raw filament, before it enters the extruder)." msgstr "" -"Когда срабатывает ретракт пруток втягивается назад на указанную величину " -"(длина измеряется по ненагретому прутку , то есть до попадания его в " -"экструдер)." +"Когда срабатывает ретракт, пруток втягивается назад на указанную величину " +"(длина измеряется по \"сырому\" прутку, то есть до попадания её в экструдер)." -#: src/libslic3r/PrintConfig.cpp:1728 src/libslic3r/PrintConfig.cpp:1737 +#: src/libslic3r/PrintConfig.cpp:1760 src/libslic3r/PrintConfig.cpp:1769 msgid "mm (zero to disable)" msgstr "мм (0 - отключено)" -#: src/libslic3r/PrintConfig.cpp:1733 +#: src/libslic3r/PrintConfig.cpp:1765 msgid "Retraction Length (Toolchange)" -msgstr "Длина ретракта (при смене сопла)" +msgstr "Длина ретракта (при смене инструмента)" -#: src/libslic3r/PrintConfig.cpp:1734 +#: src/libslic3r/PrintConfig.cpp:1766 msgid "" -"When retraction is triggered before changing tool, filament is pulled back " -"by the specified amount (the length is measured on raw filament, before it " -"enters the extruder)." +"When retraction is triggered before changing tool, filament is pulled back by the " +"specified amount (the length is measured on raw filament, before it enters the " +"extruder)." msgstr "" -"Когда срабатывает ретракт перед сменой инструмента, пруток втягивается назад " -"на указанную величину (длина измеряется по сырому прутку, то есть до " +"Когда срабатывает ретракт, перед сменой сопла, пруток втягивается назад " +"на указанную величину (длина измеряется по \"сырому\" прутку, то есть до " "попадания его в экструдер)." -#: src/libslic3r/PrintConfig.cpp:1742 +#: src/libslic3r/PrintConfig.cpp:1774 msgid "Lift Z" msgstr "Приподнимать сопло на" -#: src/libslic3r/PrintConfig.cpp:1743 +#: src/libslic3r/PrintConfig.cpp:1775 msgid "" -"If you set this to a positive value, Z is quickly raised every time a " -"retraction is triggered. When using multiple extruders, only the setting for " -"the first extruder will be considered." +"If you set this to a positive value, Z is quickly raised every time a retraction is " +"triggered. When using multiple extruders, only the setting for the first extruder " +"will be considered." msgstr "" -"Задаёт на сколько миллиметров вверх будет каждый раз приподниматься сопло, " -"когда срабатывает ретракт. При использовании нескольких экструдеров будет " -"учитывается настройки только первого экструдера." +"Задаёт на сколько миллиметров вверх будет каждый раз приподниматься сопло, когда " +"срабатывает ретракт. При использовании нескольких экструдеров будут учитываться " +"настройки только первого экструдера." -#: src/libslic3r/PrintConfig.cpp:1750 +#: src/libslic3r/PrintConfig.cpp:1782 msgid "Above Z" -msgstr "Выше Z" +msgstr "Выше" -#: src/libslic3r/PrintConfig.cpp:1751 +#: src/libslic3r/PrintConfig.cpp:1783 msgid "Only lift Z above" -msgstr "Приподнимать сопло только выше (после)" +msgstr "Приподнимать сопло только выше" -#: src/libslic3r/PrintConfig.cpp:1752 +#: src/libslic3r/PrintConfig.cpp:1784 msgid "" "If you set this to a positive value, Z lift will only take place above the " -"specified absolute Z. You can tune this setting for skipping lift on the " -"first layers." +"specified absolute Z. You can tune this setting for skipping lift on the first " +"layers." msgstr "" -"Если указать положительное значение, то подъём Z будет " -"выполнен только после превышения заданной здесь абсолютной высоты Z. " -"Таким образом можно отключить подъём сопла при печати на первых слоях." +"Если указать положительное значение, экструдер будет подыматься только выше (после) " +"заданной здесь высоты (высота считается от стола). Таким образом вы можете " +"отключить подъём сопла при печати на первых слоях (в начале печати)." -#: src/libslic3r/PrintConfig.cpp:1759 +#: src/libslic3r/PrintConfig.cpp:1791 msgid "Below Z" -msgstr "Ниже Z" +msgstr "Ниже" -#: src/libslic3r/PrintConfig.cpp:1760 +#: src/libslic3r/PrintConfig.cpp:1792 msgid "Only lift Z below" -msgstr "Приподнимать сопло только ниже (до)" +msgstr "Приподнимать сопло только ниже" -#: src/libslic3r/PrintConfig.cpp:1761 +#: src/libslic3r/PrintConfig.cpp:1793 msgid "" "If you set this to a positive value, Z lift will only take place below the " -"specified absolute Z. You can tune this setting for limiting lift to the " -"first layers." +"specified absolute Z. You can tune this setting for limiting lift to the first " +"layers." msgstr "" -"Если указать положительное значение, экструдер при перемещении будет " -"подыматься только до заданной здесь абсолютной высоты. " -"Таким образом можно ограничить подъём сопла при печати до первых слоёв." +"Если указать положительное значение, экструдер будет подыматься только ниже (до) " +"заданной здесь высоты (высота считается от стола). Таким образом вы можете " +"запретить подъём сопла выше установленной высоты." -#: src/libslic3r/PrintConfig.cpp:1769 src/libslic3r/PrintConfig.cpp:1777 +#: src/libslic3r/PrintConfig.cpp:1801 src/libslic3r/PrintConfig.cpp:1809 msgid "Extra length on restart" msgstr "Дополнительная длина подачи перед возобновлением печати" -#: src/libslic3r/PrintConfig.cpp:1770 +#: src/libslic3r/PrintConfig.cpp:1802 msgid "" -"When the retraction is compensated after the travel move, the extruder will " -"push this additional amount of filament. This setting is rarely needed." +"When the retraction is compensated after the travel move, the extruder will push " +"this additional amount of filament. This setting is rarely needed." msgstr "" -"Компенсация длины выдавливаемого пластика после перемещения экструдера, " -"после работы ретракта. После того как экструдер втянул пруток и переместился " -"в другое место печати, происходит обратная подача того же количества прутка " -"+ заданное тут значение. Для увеличения ставим положительное значение " -"(например 0.5 мм), для уменьшения - отрицательное. Этот параметр редко " -"необходим." +"Компенсация длины выдавливаемого пластика после перемещения экструдера, после " +"работы ретракта. После того как экструдер втянул пруток и переместился в другое место " +"печати, происходит обратная подача того же количества прутка + заданное тут значение. " +"Для увеличения ставим положительное значение (например 0.5 мм), для уменьшения - " +"отрицательное. Этот параметр редко необходим." -#: src/libslic3r/PrintConfig.cpp:1778 +#: src/libslic3r/PrintConfig.cpp:1810 msgid "" -"When the retraction is compensated after changing tool, the extruder will " -"push this additional amount of filament." +"When the retraction is compensated after changing tool, the extruder will push this " +"additional amount of filament." msgstr "" -"Компенсация длины выдавливаемого пластика перед возобновлением печати после " -"смены сопла." +"Компенсация длины выдавливаемого пластика перед возобновлением печати после смены " +"сопла." -#: src/libslic3r/PrintConfig.cpp:1785 src/libslic3r/PrintConfig.cpp:1786 +#: src/libslic3r/PrintConfig.cpp:1817 src/libslic3r/PrintConfig.cpp:1818 msgid "Retraction Speed" msgstr "Скорость ретракта" -#: src/libslic3r/PrintConfig.cpp:1787 +#: src/libslic3r/PrintConfig.cpp:1819 msgid "The speed for retractions (it only applies to the extruder motor)." msgstr "" -"Скорость с которой происходит ретракт - втягивание прутка (относится только " -"к двигателю экструдера)." +"Скорость с которой происходит ретракт - втягивание прутка (относится только к " +"двигателю экструдера)." -#: src/libslic3r/PrintConfig.cpp:1793 src/libslic3r/PrintConfig.cpp:1794 +#: src/libslic3r/PrintConfig.cpp:1825 src/libslic3r/PrintConfig.cpp:1826 msgid "Deretraction Speed" msgstr "Скорость компенсирующего ретракта" -#: src/libslic3r/PrintConfig.cpp:1795 +#: src/libslic3r/PrintConfig.cpp:1827 msgid "" -"The speed for loading of a filament into extruder after retraction (it only " -"applies to the extruder motor). If left to zero, the retraction speed is " -"used." +"The speed for loading of a filament into extruder after retraction (it only applies " +"to the extruder motor). If left to zero, the retraction speed is used." msgstr "" -"Скорость загрузки прутка в экструдер после ретракта (применима только к " -"двигателю экструдера). Если оставить ноль, будет использоваться скорость " -"ретракта." +"Скорость загрузки прутка в экструдер после ретракта (применима только к двигателю " +"экструдера). Если оставить ноль, будет использоваться скорость ретракта." -#: src/libslic3r/PrintConfig.cpp:1802 +#: src/libslic3r/PrintConfig.cpp:1834 msgid "Seam position" msgstr "Позиция шва" -#: src/libslic3r/PrintConfig.cpp:1804 +#: src/libslic3r/PrintConfig.cpp:1836 msgid "Position of perimeters starting points." msgstr "" -"Этот параметр позволяет выбрать начальную точку каждого слоя в направлении " -"Z, и таким образом определяет, где будет шов объекта. Изменяя этот параметр " -"можно уменьшить видимость шва." +"Этот параметр позволяет выбрать начальную точку каждого слоя в направлении Z, и " +"таким образом определяет, где будет шов модели. Изменяя этот параметр можно " +"уменьшить видимость шва." -#: src/libslic3r/PrintConfig.cpp:1810 +#: src/libslic3r/PrintConfig.cpp:1842 msgid "Random" msgstr "Случайно" -#: src/libslic3r/PrintConfig.cpp:1811 +#: src/libslic3r/PrintConfig.cpp:1843 msgid "Nearest" msgstr "Ближайшая" -#: src/libslic3r/PrintConfig.cpp:1812 +#: src/libslic3r/PrintConfig.cpp:1844 msgid "Aligned" -msgstr "Выровнять" +msgstr "По краю" -#: src/libslic3r/PrintConfig.cpp:1820 +#: src/libslic3r/PrintConfig.cpp:1852 msgid "Direction" msgstr "Направление" -#: src/libslic3r/PrintConfig.cpp:1822 +#: src/libslic3r/PrintConfig.cpp:1854 msgid "Preferred direction of the seam" msgstr "Предпочтительное направление шва" -#: src/libslic3r/PrintConfig.cpp:1823 +#: src/libslic3r/PrintConfig.cpp:1855 msgid "Seam preferred direction" msgstr "Предпочтительное направление шва" -#: src/libslic3r/PrintConfig.cpp:1830 +#: src/libslic3r/PrintConfig.cpp:1862 msgid "Jitter" msgstr "Разброс шва" -#: src/libslic3r/PrintConfig.cpp:1832 +#: src/libslic3r/PrintConfig.cpp:1864 msgid "Seam preferred direction jitter" -msgstr "Предпочтительное направление разброса шва" +msgstr "Предпочтительное направление разброса шва (в градусах) " -#: src/libslic3r/PrintConfig.cpp:1833 +#: src/libslic3r/PrintConfig.cpp:1865 msgid "Preferred direction of the seam - jitter" msgstr "Предпочтительное направление разброса шва (в градусах) " -#: src/libslic3r/PrintConfig.cpp:1840 +#: src/libslic3r/PrintConfig.cpp:1872 msgid "Distance from object" -msgstr "Расстояние от объекта" +msgstr "Расстояние от юбки до модели" -#: src/libslic3r/PrintConfig.cpp:1841 +#: src/libslic3r/PrintConfig.cpp:1873 msgid "" -"Distance between skirt and object(s). Set this to zero to attach the skirt " -"to the object(s) and get a brim for better adhesion." +"Distance between skirt and object(s). Set this to zero to attach the skirt to the " +"object(s) and get a brim for better adhesion." msgstr "" -"Расстояние между юбкой и объектом. Укажите 0, чтобы прикрепить юбку к " -"объекту и получить кайму для лучшего прилипания." +"Задаёт на каком расстоянии от модели будет располагаться юбка. Установите 0, чтобы " +"прикрепить юбку к модели и получить кайму для лучшего прилипания." -#: src/libslic3r/PrintConfig.cpp:1848 +#: src/libslic3r/PrintConfig.cpp:1880 msgid "Skirt height" msgstr "Слоёв юбки" -#: src/libslic3r/PrintConfig.cpp:1849 +#: src/libslic3r/PrintConfig.cpp:1881 msgid "" -"Height of skirt expressed in layers. Set this to a tall value to use skirt " -"as a shield against drafts." +"Height of skirt expressed in layers. Set this to a tall value to use skirt as a " +"shield against drafts." msgstr "" "Высота юбки выраженная количеством слоёв. Установите высокое значение, чтобы " -"использовать юбку в качестве защиты от сквозняка." +"использовать юбку в качестве защиты от внешнего воздушного потока." -#: src/libslic3r/PrintConfig.cpp:1856 +#: src/libslic3r/PrintConfig.cpp:1888 msgid "Draft shield" -msgstr "Защита от сквозняка" +msgstr "Защитный кожух" -#: src/libslic3r/PrintConfig.cpp:1857 +#: src/libslic3r/PrintConfig.cpp:1889 msgid "" -"If enabled, the skirt will be as tall as a highest printed object. This is " -"useful to protect an ABS or ASA print from warping and detaching from print " -"bed due to wind draft." +"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." msgstr "" -"Если включено, то высота юбки будет равна самому высокому печатаемому" -" объекту. Это " -"полезно при печати ABS или ASA для защиты от скручивания и отрыва от" -" платформы, " -"возникающих от сквозняка." +"Если включено, юбка будет печататься высотой с самую высокую печатаемую модель. Это " +"полезно для защиты материалов типа ABS или ASA от деформации и отрыва от стола из-" +"за внешнего воздушного потока." -#: src/libslic3r/PrintConfig.cpp:1863 +#: src/libslic3r/PrintConfig.cpp:1895 msgid "Loops (minimum)" -msgstr "Петель (минимум)" +msgstr "Юбок вокруг модели (минимум)" -#: src/libslic3r/PrintConfig.cpp:1864 +#: src/libslic3r/PrintConfig.cpp:1896 msgid "Skirt Loops" -msgstr "Кругов юбки" +msgstr "Петель юбки" -#: src/libslic3r/PrintConfig.cpp:1865 +#: src/libslic3r/PrintConfig.cpp:1897 msgid "" -"Number of loops for the skirt. If the Minimum Extrusion Length option is " -"set, the number of loops might be greater than the one configured here. Set " -"this to zero to disable skirt completely." +"Number of loops for the skirt. If the Minimum Extrusion Length option is set, the " +"number of loops might be greater than the one configured here. Set this to zero to " +"disable skirt completely." msgstr "" -"Количество юбок вокруг модели. Если задан параметр \"Минимальная длина " -"экструзии\", количество юбок может быть больше, чем задано здесь. Чтобы " -"полностью отключить юбку, установите 0." +"Количество юбок вокруг модели. Если задан параметр \"Минимальная длина экструзии\", " +"количество юбок может быть больше, чем задано здесь. Чтобы полностью отключить " +"юбку, установите 0." -#: src/libslic3r/PrintConfig.cpp:1873 +#: src/libslic3r/PrintConfig.cpp:1905 msgid "Slow down if layer print time is below" msgstr "Замедление при печати слоя менее" -#: src/libslic3r/PrintConfig.cpp:1874 +#: src/libslic3r/PrintConfig.cpp:1906 msgid "" -"If layer print time is estimated below this number of seconds, print moves " -"speed will be scaled down to extend duration to this value." +"If layer print time is estimated below this number of seconds, print moves speed " +"will be scaled down to extend duration to this value." msgstr "" -"Если время печати слоя оценивается ниже этого количества секунд, скорость " -"печати будет пропорционально уменьшена, чтобы увеличить продолжительность до " -"этого значения." +"Если время печати слоя оценивается ниже этого количества секунд, скорость печати " +"будет пропорционально уменьшена, чтобы увеличить продолжительность до этого " +"значения." -#: src/libslic3r/PrintConfig.cpp:1883 +#: src/libslic3r/PrintConfig.cpp:1915 msgid "Small perimeters" msgstr "Маленькие периметры" -#: src/libslic3r/PrintConfig.cpp:1885 +#: src/libslic3r/PrintConfig.cpp:1917 msgid "" -"This separate setting will affect the speed of perimeters having radius <= " -"6.5mm (usually holes). If expressed as percentage (for example: 80%) it will " -"be calculated on the perimeters speed setting above. Set to zero for auto." +"This separate setting will affect the speed of perimeters having radius <= 6.5mm " +"(usually holes). If expressed as percentage (for example: 80%) it will be " +"calculated on the perimeters speed setting above. Set to zero for auto." msgstr "" "Этот параметр влияет на скорость печати периметров с радиусом \n" -"<= 6,5 мм (обычно это отверстия). Если задано в процентах, параметр " -"вычисляется относительно скорости печати внутренних периметров. Установите 0 " -"для автонастройки." +"<= 6,5 мм (обычно это отверстия). Если задано в процентах, параметр вычисляется " +"относительно скорости печати периметров указанной выше. Установите 0 для " +"автонастройки." -#: src/libslic3r/PrintConfig.cpp:1895 +#: src/libslic3r/PrintConfig.cpp:1927 msgid "Solid infill threshold area" msgstr "Заполнение площади, меньше указанной" -#: src/libslic3r/PrintConfig.cpp:1897 +#: src/libslic3r/PrintConfig.cpp:1929 msgid "" -"Force solid infill for regions having a smaller area than the specified " -"threshold." +"Force solid infill for regions having a smaller area than the specified threshold." msgstr "" "Заполнение площади меньше указанной будет производиться \n" "100% (сплошным) заполнением." -#: src/libslic3r/PrintConfig.cpp:1898 +#: src/libslic3r/PrintConfig.cpp:1930 msgid "mm²" msgstr "мм²" -#: src/libslic3r/PrintConfig.cpp:1904 +#: src/libslic3r/PrintConfig.cpp:1936 msgid "Solid infill extruder" -msgstr "Экструдер, печатающий сплошные слои заполнения" +msgstr "" +"Экструдер, печатающий сплошные слои заполнения" -#: src/libslic3r/PrintConfig.cpp:1906 +#: src/libslic3r/PrintConfig.cpp:1938 msgid "The extruder to use when printing solid infill." msgstr "Номер экструдера, которым печатаются сплошные слои заполнения." -#: src/libslic3r/PrintConfig.cpp:1912 +#: src/libslic3r/PrintConfig.cpp:1944 msgid "Solid infill every" msgstr "Сплошное заполнение каждые" -#: src/libslic3r/PrintConfig.cpp:1914 +#: src/libslic3r/PrintConfig.cpp:1946 msgid "" -"This feature allows to force a solid layer every given number of layers. " -"Zero to disable. You can set this to any value (for example 9999); Slic3r " -"will automatically choose the maximum possible number of layers to combine " -"according to nozzle diameter and layer height." +"This feature allows to force a solid layer every given number of layers. Zero to " +"disable. You can set this to any value (for example 9999); Slic3r will " +"automatically choose the maximum possible number of layers to combine according to " +"nozzle diameter and layer height." msgstr "" -"Эта функция позволяет принудительно делать сплошное заполнение через " -"указанное количество слоёв. Чтобы отключить, установите 0. Вы можете задать " -"любое значение, Slic3r автоматически выберет максимально возможное " -"количество слоёв в зависимости от диаметра сопла и высоты слоя." +"Эта функция позволяет принудительно делать сплошное заполнение через указанное " +"количество слоёв. Чтобы отключить, установите 0. Вы можете задать любое значение, " +"PrusaSlicer автоматически выберет максимально возможное количество слоёв в " +"зависимости от диаметра сопла и высоты слоя." -#: src/libslic3r/PrintConfig.cpp:1926 +#: src/libslic3r/PrintConfig.cpp:1958 msgid "" -"Set this to a non-zero value to set a manual extrusion width for infill for " -"solid surfaces. If left zero, default extrusion width will be used if set, " -"otherwise 1.125 x nozzle diameter will be used. If expressed as percentage " -"(for example 90%) it will be computed over layer height." +"Set this to a non-zero value to set a manual extrusion width for infill for solid " +"surfaces. If left zero, default extrusion width will be used if set, otherwise " +"1.125 x nozzle diameter will be used. If expressed as percentage (for example 90%) " +"it will be computed over layer height." msgstr "" "Установите значение отличное от 0, чтобы вручную задать ширину экструзии для " -"заполнения сплошных поверхностей. Если оставить 0, будет использоваться " -"\"Ширина экструзии по умолчанию\" - если она задана, в противном случае " -"будет использоваться 1,125 x диаметра сопла. Если задано в процентах, " -"параметр вычисляется относительно высоты слоя." +"заполнения сплошных поверхностей. Если оставить 0, будет использоваться \"Ширина " +"экструзии по умолчанию\" - если она задана, в противном случае будет использоваться " +"1,125 x диаметра сопла. Если задано в процентах, параметр вычисляется относительно " +"высоты слоя." -#: src/libslic3r/PrintConfig.cpp:1937 +#: src/libslic3r/PrintConfig.cpp:1969 msgid "" -"Speed for printing solid regions (top/bottom/internal horizontal shells). " -"This can be expressed as a percentage (for example: 80%) over the default " -"infill speed above. Set to zero for auto." +"Speed for printing solid regions (top/bottom/internal horizontal shells). This can " +"be expressed as a percentage (for example: 80%) over the default infill speed " +"above. Set to zero for auto." msgstr "" -"Скорость печати сплошных областей (верха/низа/внутренних горизонтальных " -"оболочек). Если задано в процентах, параметр вычисляется относительно " -"скорости заполнения указанной выше. Установите 0 для автонастройки." +"Скорость печати сплошных областей (верха/низа/внутренних горизонтальных оболочек). " +"Если задано в процентах, параметр вычисляется относительно скорости заполнения " +"указанной выше. Установите 0 для автонастройки." -#: src/libslic3r/PrintConfig.cpp:1949 +#: src/libslic3r/PrintConfig.cpp:1981 msgid "Number of solid layers to generate on top and bottom surfaces." -msgstr "Количество сплошных слоёв для генерации верхних и нижних поверхностей." +msgstr "Количество сплошных слоёв при печати верхней и нижней поверхности модели." -#: src/libslic3r/PrintConfig.cpp:1955 src/libslic3r/PrintConfig.cpp:1956 +#: src/libslic3r/PrintConfig.cpp:1987 src/libslic3r/PrintConfig.cpp:1988 msgid "Minimum thickness of a top / bottom shell" -msgstr "" +msgstr "Минимальная толщина оболочки сверху/снизу" -#: src/libslic3r/PrintConfig.cpp:1962 +#: src/libslic3r/PrintConfig.cpp:1994 msgid "Spiral vase" msgstr "Спиральная ваза" -#: src/libslic3r/PrintConfig.cpp:1963 +#: src/libslic3r/PrintConfig.cpp:1995 msgid "" -"This feature will raise Z gradually while printing a single-walled object in " -"order to remove any visible seam. This option requires a single perimeter, " -"no infill, no top solid layers and no support material. You can still set " -"any number of bottom solid layers as well as skirt/brim loops. It won't work " -"when printing more than an object." +"This feature will raise Z gradually while printing a single-walled object in order " +"to remove any visible seam. This option requires a single perimeter, no infill, no " +"top solid layers and no support material. You can still set any number of bottom " +"solid layers as well as skirt/brim loops. It won't work when printing more than one " +"single object." msgstr "" "Данная настройка применяется при печати спиральных и пустотелых, а также " -"тонкостенных объектов. Модель печатается в одну стенку без верней " -"поверхности, заполнения и поддержки. При этом сопло движется вдоль периметра " -"непрерывно постепенно поднимаясь, так получаются ровные красивые вазы без " -"видимых швов. Вы можете задать любое количество нижних сплошных слоёв, а " -"также печать юбки/каймы. При включении этого параметра невозможно напечатать " -"горизонтальную плоскость - горизонтальные слои без поддержки будут провисать." - -#: src/libslic3r/PrintConfig.cpp:1971 +"тонкостенных моделей. Модель печатается в одну стенку без верней поверхности, " +"заполнения и поддержки. При этом сопло движется вдоль периметра непрерывно " +"постепенно поднимаясь, так получаются ровные красивые вазы без видимых швов. Вы " +"можете задать любое количество нижних сплошных слоёв, а также печать юбки/каймы. " +"При включении этого параметра невозможно напечатать горизонтальную плоскость - " +"горизонтальные слои без поддержки будут провисать." + +#: src/libslic3r/PrintConfig.cpp:2003 msgid "Temperature variation" msgstr "Колебания температуры" -#: src/libslic3r/PrintConfig.cpp:1972 +#: src/libslic3r/PrintConfig.cpp:2004 msgid "" -"Temperature difference to be applied when an extruder is not active. Enables " -"a full-height \"sacrificial\" skirt on which the nozzles are periodically " -"wiped." +"Temperature difference to be applied when an extruder is not active. Enables a full-" +"height \"sacrificial\" skirt on which the nozzles are periodically wiped." msgstr "" -"Разность температур, которая применяется, когда экструдер не используется. " -"Включает печать \"жертвенной\" юбки с высотой, равной высоте модели, об " -"которую сопла будут время от времени очищаться." +"Разность температур, которая применяется, когда экструдер не используется. Включает " +"печать \"жертвенной\" юбки с высотой, равной высоте модели, об которую сопла будут " +"время от времени очищаться." -#: src/libslic3r/PrintConfig.cpp:1982 +#: src/libslic3r/PrintConfig.cpp:2014 msgid "" -"This start procedure is inserted at the beginning, after bed has reached the " -"target temperature and extruder just started heating, and before extruder " -"has finished heating. If PrusaSlicer detects M104 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." +"This start procedure is inserted at the beginning, after bed has reached the target " +"temperature and extruder just started heating, and before extruder has finished " +"heating. If PrusaSlicer detects M104 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." msgstr "" -"Этот код вставляется в начало, после того как платформа уже достигла заданной " -"температуры, а экструдер только начал нагреваться, и до того, как экструдер " -"закончил нагрев. Если PrusaSlicer обнаруживает M104 или M190 в вашем " -"пользовательском коде, то такие команды (нагрева) не будут добавляться" -" автоматически, " -"поэтому вы можете настроить порядок команд подогрева и другие действия. " +"Этот код выполняется в начале, после того как стол уже достиг заданной температуры, " +"а экструдер только начал нагреваться, и до того, как экструдер закончил нагрев. " +"Если PrusaSlicer обнаруживает M104 или M190 в ваших пользовательских кодах, такие " +"команды не будут добавляться автоматически, поэтому вы можете настроить порядок " +"команд нагрева и другие действия. Обратите внимание, что вы можете использовать " +"шаблонные переменные для всех параметров PrusaSlicer, поэтому вы можете вставить " +"команду \"M109 S[first_layer_temperature]\" где угодно." + +#: src/libslic3r/PrintConfig.cpp:2029 +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 "" +"Этот код выполняется в начале, после каждого запуска принтером G-кода (и после " +"каждого переключения инструмента на нужный пруток в случае мультиматериальных" +"принтеров). Это используется для переопределения параметров для " +"конкретного прутка. Если PrusaSlicer обнаруживает M104, M109, M140 или " +"M190 в ваших пользовательских кодах, такие команды не будут добавляться " +"автоматически, поэтому вы можете вставить порядок команд нагрева и другие действия. " "Обратите внимание, что вы можете использовать шаблонные переменные для всех " -"параметров PrusaSlicer, поэтому можете вставить команду \"M109" -" S[first_layer_temperature]\" где угодно." - -#: src/libslic3r/PrintConfig.cpp:1997 -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 "" -"Этот код выполняется в начале, после выполнения стартового G-кода принтера. " -"Он используется для переопределения настроек для определённого прутка. Если " -"Slic3r обнаруживает M104, M109, M140 или M190 в вашем пользовательском коде, " -"такие команды не будут автоматически добавляться, поэтому вы можете " -"настроить порядок команд подогрева и другие действия. Обратите внимание, что " -"вы можете использовать шаблонные переменные для всех параметров Slic3r, " -"поэтому вы можете вставить команду \"M109 S[first_layer_temperature]\" где " -"угодно. Если у вас есть несколько экструдеров, G-код обрабатывается в " -"соответствии с порядковым номером экструдера." - -#: src/libslic3r/PrintConfig.cpp:2013 +"параметров PrusaSlicer, поэтому вы можете вставить команду \"M109 " +"S[first_layer_temperature]\" где угодно. Если у вас несколько экструдеров, G-код " +"обрабатывается в соответствии с порядковым номером экструдера." + +#: src/libslic3r/PrintConfig.cpp:2045 msgid "Color change G-code" -msgstr "G-код, выполняемый при смене цвета" +msgstr "G-код смены цвета" -#: src/libslic3r/PrintConfig.cpp:2014 +#: src/libslic3r/PrintConfig.cpp:2046 msgid "This G-code will be used as a code for the color change" -msgstr "" +msgstr "Этот G-код будет использоваться для изменения цвета." -#: src/libslic3r/PrintConfig.cpp:2023 +#: src/libslic3r/PrintConfig.cpp:2055 msgid "This G-code will be used as a code for the pause print" -msgstr "" +msgstr "Этот G-код будет использоваться для паузы печати." -#: src/libslic3r/PrintConfig.cpp:2032 +#: src/libslic3r/PrintConfig.cpp:2064 msgid "This G-code will be used as a custom code" -msgstr "" +msgstr "Этот G-код будет использоваться для пользовательского кода." -#: src/libslic3r/PrintConfig.cpp:2040 +#: src/libslic3r/PrintConfig.cpp:2072 msgid "Single Extruder Multi Material" msgstr "Мультиматериальный одиночный экструдер" -#: src/libslic3r/PrintConfig.cpp:2041 +#: src/libslic3r/PrintConfig.cpp:2073 msgid "The printer multiplexes filaments into a single hot end." msgstr "" -"Принтер способный печатать несколькими видами/цветами пластика (соединяя их " -"в одну нить) с одной экструзионной головкой." +"Принтер способный печатать несколькими видами/цветами пластика (соединяя их в однин " +"пруток) с одной экструзионной головкой." -#: src/libslic3r/PrintConfig.cpp:2046 +#: src/libslic3r/PrintConfig.cpp:2078 msgid "Prime all printing extruders" -msgstr "Заправка всех печатающих экструдеров" +msgstr "Подготовка всех печатающих экструдеров" -#: src/libslic3r/PrintConfig.cpp:2047 +#: src/libslic3r/PrintConfig.cpp:2079 msgid "" -"If enabled, all printing extruders will be primed at the front edge of the " -"print bed at the start of the print." +"If enabled, all printing extruders will be primed at the front edge of the print " +"bed at the start of the print." msgstr "" +"Если этот параметр включён, все печатающие экструдеры в начале печати будут " +"подготавливаться на переднем крае стола." -#: src/libslic3r/PrintConfig.cpp:2052 +#: src/libslic3r/PrintConfig.cpp:2084 msgid "No sparse layers (EXPERIMENTAL)" -msgstr "" +msgstr "Отсутствие разреженных слоёв (ЭКСПЕРИМЕНТАЛЬНО)" -#: src/libslic3r/PrintConfig.cpp:2053 +#: src/libslic3r/PrintConfig.cpp:2085 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." +"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 "" +"Если этот параметр включён, черновая башня не будет печататься на слоях где не " +"происходит смена инструмента. На слоях, где происходит смена инструмента, экструдер " +"будет опускаться вниз до верхней части черновой башни, чтобы напечатать её. Так как " +"PrusaSlicer в настоящее время не проверяет столкновения экструдера с напечатанным " +"объектом при опускании его вниз до верхней части черновой башни, эта функция " +"помечена как экспериментальная. Пользователь несёт ответственность за то, чтобы " +"избежать столкновения с напечатанным." -#: src/libslic3r/PrintConfig.cpp:2060 +#: src/libslic3r/PrintConfig.cpp:2092 msgid "Generate support material" msgstr "Генерация вспомогательных структур" -#: src/libslic3r/PrintConfig.cpp:2062 +#: src/libslic3r/PrintConfig.cpp:2094 msgid "Enable support material generation." msgstr "" -"Включение печати вспомогательных структур, поддерживающих выступающие и " -"свисающие элементы печатаемой модели." +"Включение печати вспомогательных структур, поддерживающих выступающие и свисающие " +"элементы печатаемой модели." -#: src/libslic3r/PrintConfig.cpp:2066 +#: src/libslic3r/PrintConfig.cpp:2098 msgid "Auto generated supports" -msgstr "Автоматическая генерация поддержек" +msgstr "Автоматически созданные поддержки" -#: src/libslic3r/PrintConfig.cpp:2068 +#: src/libslic3r/PrintConfig.cpp:2100 msgid "" "If checked, supports will be generated automatically based on the overhang " -"threshold value. If unchecked, supports will be generated inside the " -"\"Support Enforcer\" volumes only." +"threshold value. If unchecked, supports will be generated inside the \"Support " +"Enforcer\" volumes only." msgstr "" -"Если включено, то поддержки будут генерироваться автоматически, исходя из " -"значения порога нависания. Если выключено, то поддержки будут генерироваться " -"только внутри пространств «Support Enforcer»." +"Если флажок установлен, поддержка будет генерироваться автоматически в зависимости " +"от нижестоящего значения \"Угол нависания поддержки\". Если флажок не установлен, " +"поддержка будет генерироваться только внутри значения принудительной поддержки " +"заданной ниже." -#: src/libslic3r/PrintConfig.cpp:2074 +#: src/libslic3r/PrintConfig.cpp:2106 msgid "XY separation between an object and its support" -msgstr "Зазор между объектом и поддержкой по осям XY" +msgstr "Зазор между моделью и поддержкой по осям XY" -#: src/libslic3r/PrintConfig.cpp:2076 +#: src/libslic3r/PrintConfig.cpp:2108 msgid "" -"XY separation between an object and its support. If expressed as percentage " -"(for example 50%), it will be calculated over external perimeter width." +"XY separation between an object and its support. If expressed as percentage (for " +"example 50%), it will be calculated over external perimeter width." msgstr "" -"Расстояние между поддержкой и печатаемым объектом по осям XY. Если задано в " -"процентах, то расстояние будет рассчитано исходя от ширины внешнего " -"периметра." +"Расстояние между поддержкой и печатаемой моделью по осям XY. Если задано в " +"процентах, то расстояние будет рассчитано исходя от ширины внешнего периметра." -#: src/libslic3r/PrintConfig.cpp:2086 +#: src/libslic3r/PrintConfig.cpp:2118 msgid "Pattern angle" msgstr "Угол печати поддержки и подложки" -#: src/libslic3r/PrintConfig.cpp:2088 +#: src/libslic3r/PrintConfig.cpp:2120 msgid "" -"Use this setting to rotate the support material pattern on the horizontal " -"plane." +"Use this setting to rotate the support material pattern on the horizontal plane." msgstr "" -"Используйте этот параметр для поворота рисунка поддержки в горизонтальной " -"плоскости." +"Используйте этот параметр для поворота рисунка поддержки в горизонтальной плоскости." -#: src/libslic3r/PrintConfig.cpp:2098 src/libslic3r/PrintConfig.cpp:2893 +#: src/libslic3r/PrintConfig.cpp:2130 src/libslic3r/PrintConfig.cpp:2925 msgid "" -"Only create support if it lies on a build plate. Don't create support on a " -"print." -msgstr "" -"Создавать поддержки только от платформы. Поддержки от объектов построены не " -"будут." +"Only create support if it lies on a build plate. Don't create support on a print." +msgstr "Создавать поддержки только от стола. Поддержки от модели построены не будут." -#: src/libslic3r/PrintConfig.cpp:2104 +#: src/libslic3r/PrintConfig.cpp:2136 msgid "Contact Z distance" -msgstr "Расстояние от поддержки до объекта по вертикали" +msgstr "Расстояние от поддержки до модели по вертикали" -#: src/libslic3r/PrintConfig.cpp:2106 +#: src/libslic3r/PrintConfig.cpp:2138 msgid "" -"The vertical distance between object and support material interface. Setting " -"this to 0 will also prevent Slic3r from using bridge flow and speed for the " -"first object layer." +"The vertical distance between object and support material interface. Setting this " +"to 0 will also prevent Slic3r from using bridge flow and speed for the first object " +"layer." msgstr "" -"Вертикальное расстояние между объектом и связующим слоем поддержки. Если " -"установить 0, то Slic3r не будет использовать функцию \"Соотношение потока " -"при печати мостов\" и \"Скорость печати первого слоя\" объекта." +"Вертикальное расстояние между моделью и связующим слоем поддержки. Если установить " +"0, то PrusaSlicer не будет использовать функцию \"Соотношение потока при печати " +"мостов\" и \"Скорость печати первого слоя\" модели." -#: src/libslic3r/PrintConfig.cpp:2113 +#: src/libslic3r/PrintConfig.cpp:2145 msgid "0 (soluble)" msgstr "0 (растворимые)" -#: src/libslic3r/PrintConfig.cpp:2114 +#: src/libslic3r/PrintConfig.cpp:2146 msgid "0.2 (detachable)" msgstr "0.2 (нерастворимые)" -#: src/libslic3r/PrintConfig.cpp:2119 +#: src/libslic3r/PrintConfig.cpp:2151 msgid "Enforce support for the first" msgstr "Принудительная поддержка для первых" -#: src/libslic3r/PrintConfig.cpp:2121 +#: src/libslic3r/PrintConfig.cpp:2153 msgid "" -"Generate support material for the specified number of layers counting from " -"bottom, regardless of whether normal support material is enabled or not and " -"regardless of any angle threshold. This is useful for getting more adhesion " -"of objects having a very thin or poor footprint on the build plate." +"Generate support material for the specified number of layers counting from bottom, " +"regardless of whether normal support material is enabled or not and regardless of " +"any angle threshold. This is useful for getting more adhesion of objects having a " +"very thin or poor footprint on the build plate." msgstr "" -"Генерация поддержек для указанного количества слоёв начиная со дна, вне " -"зависимости от порога свеса и установленного параметра создания поддержек. " -"Это полезно для лучшего прилипания тонких объектов или при малой площади " -"контакта с платформой." +"Генерация поддержки для указанного количества слоёв начиная со дна модели, вне " +"зависимости от порога свеса и включения опции \"Создавать поддержки\". Это полезно " +"для получения лучшего прилипания моделей, имеющих очень тонкий или плохой контакт " +"со столом." -#: src/libslic3r/PrintConfig.cpp:2126 +#: src/libslic3r/PrintConfig.cpp:2158 msgid "Enforce support for the first n layers" -msgstr "Принудительная поддержка для первых N слоёв" +msgstr "Принудительная поддержка для первых n слоёв" -#: src/libslic3r/PrintConfig.cpp:2132 +#: src/libslic3r/PrintConfig.cpp:2164 msgid "Support material/raft/skirt extruder" msgstr "Экструдер, печатающий поддержки/подложки/юбки" -#: src/libslic3r/PrintConfig.cpp:2134 +#: src/libslic3r/PrintConfig.cpp:2166 msgid "" -"The extruder to use when printing support material, raft and skirt (1+, 0 to " -"use the current extruder to minimize tool changes)." +"The extruder to use when printing support material, raft and skirt (1+, 0 to use " +"the current extruder to minimize tool changes)." msgstr "" "Номер экструдера, которым печатаются поддержка, подложка и юбка (1+, 0 для " "использования текущего экструдера для минимизации смены инструмента)." -#: src/libslic3r/PrintConfig.cpp:2143 +#: src/libslic3r/PrintConfig.cpp:2175 msgid "" -"Set this to a non-zero value to set a manual extrusion width for support " -"material. If left zero, default extrusion width will be used if set, " -"otherwise nozzle diameter will be used. If expressed as percentage (for " -"example 90%) it will be computed over layer height." +"Set this to a non-zero value to set a manual extrusion width for support material. " +"If left zero, default extrusion width will be used if set, otherwise nozzle " +"diameter will be used. If expressed as percentage (for example 90%) it will be " +"computed over layer height." msgstr "" "Установите значение отличное от 0, чтобы вручную задать ширину экструзии для " -"поддержки. Если оставить 0, будет использоваться \"Ширина экструзии по " -"умолчанию\" - если она задана, в противном случае будет использоваться " -"диаметр сопла. Если задано в процентах, параметр вычисляется относительно " -"высоты слоя." +"поддержки. Если оставить 0, будет использоваться \"Ширина экструзии по умолчанию\" " +"- если она задана, в противном случае будет использоваться диаметр сопла. Если " +"задано в процентах, параметр вычисляется относительно высоты слоя." -#: src/libslic3r/PrintConfig.cpp:2152 +#: src/libslic3r/PrintConfig.cpp:2184 msgid "Interface loops" msgstr "Связующий слой петлями" -#: src/libslic3r/PrintConfig.cpp:2154 -msgid "" -"Cover the top contact layer of the supports with loops. Disabled by default." +#: src/libslic3r/PrintConfig.cpp:2186 +msgid "Cover the top contact layer of the supports with loops. Disabled by default." msgstr "Печатать верхний связующий слой петлями. По умолчанию отключено." -#: src/libslic3r/PrintConfig.cpp:2159 +#: src/libslic3r/PrintConfig.cpp:2191 msgid "Support material/raft interface extruder" -msgstr "Экструдер, печатающий связующий слой поддержки/подложки" +msgstr "" +"Экструдер, печатающий связующий слой поддержки/подложки" -#: src/libslic3r/PrintConfig.cpp:2161 +#: src/libslic3r/PrintConfig.cpp:2193 msgid "" -"The extruder to use when printing support material interface (1+, 0 to use " -"the current extruder to minimize tool changes). This affects raft too." +"The extruder to use when printing support material interface (1+, 0 to use the " +"current extruder to minimize tool changes). This affects raft too." msgstr "" "Номер экструдера, которым печатаются связующие слой поддержки (1+, 0 для " -"использования текущего экструдера для минимизации смены инструмента). Это " -"также влияет на печать подложки." +"использования текущего экструдера для минимизации смены инструмента). Это также " +"влияет на печать подложки." -#: src/libslic3r/PrintConfig.cpp:2168 +#: src/libslic3r/PrintConfig.cpp:2200 msgid "Interface layers" msgstr "Связующих слоёв" -#: src/libslic3r/PrintConfig.cpp:2170 +#: src/libslic3r/PrintConfig.cpp:2202 msgid "" -"Number of interface layers to insert between the object(s) and support " -"material." +"Number of interface layers to insert between the object(s) and support material." msgstr "Количество связующих слоёв между моделью и материалом поддержки." -#: src/libslic3r/PrintConfig.cpp:2177 +#: src/libslic3r/PrintConfig.cpp:2209 msgid "Interface pattern spacing" msgstr "Расстояние между связующими линиями" -#: src/libslic3r/PrintConfig.cpp:2179 +#: src/libslic3r/PrintConfig.cpp:2211 msgid "Spacing between interface lines. Set zero to get a solid interface." msgstr "" -"Расстояние между связующими линиями. Установите 0, чтобы получить сплошной " -"слой." +"Расстояние между связующими линиями. Установите 0, чтобы получить сплошной слой." -#: src/libslic3r/PrintConfig.cpp:2188 +#: src/libslic3r/PrintConfig.cpp:2220 msgid "" -"Speed for printing support material interface layers. If expressed as " -"percentage (for example 50%) it will be calculated over support material " -"speed." +"Speed for printing support material interface layers. If expressed as percentage " +"(for example 50%) it will be calculated over support material speed." msgstr "" -"Скорость печати связующих слоёв поддержки. Если она выражена в процентах, то " -"будет рассчитана относительно скорости печати поддержки указанной выше." +"Скорость печати связующих слоёв поддержки. Если она выражена в процентах, то будет " +"рассчитана относительно скорости печати поддержки указанной выше." -#: src/libslic3r/PrintConfig.cpp:2197 +#: src/libslic3r/PrintConfig.cpp:2229 msgid "Pattern" msgstr "Шаблон поддержки и подложки" -#: src/libslic3r/PrintConfig.cpp:2199 +#: src/libslic3r/PrintConfig.cpp:2231 msgid "Pattern used to generate support material." msgstr "Шаблон, по которому будет происходить печать поддержки." -#: src/libslic3r/PrintConfig.cpp:2205 +#: src/libslic3r/PrintConfig.cpp:2237 msgid "Rectilinear grid" msgstr "Прямолинейная сетка" -#: src/libslic3r/PrintConfig.cpp:2211 +#: src/libslic3r/PrintConfig.cpp:2243 msgid "Pattern spacing" msgstr "Плотность поддержки" -#: src/libslic3r/PrintConfig.cpp:2213 +#: src/libslic3r/PrintConfig.cpp:2245 msgid "Spacing between support material lines." msgstr "Расстояние между линиями поддержки." -#: src/libslic3r/PrintConfig.cpp:2222 +#: src/libslic3r/PrintConfig.cpp:2254 msgid "Speed for printing support material." -msgstr "Скорость печати поддержек." +msgstr "Скорость печати поддержки." -#: src/libslic3r/PrintConfig.cpp:2229 +#: src/libslic3r/PrintConfig.cpp:2261 msgid "Synchronize with object layers" -msgstr "Синхронизация со слоями объекта" +msgstr "Синхронизация со слоями модели" -#: src/libslic3r/PrintConfig.cpp:2231 +#: src/libslic3r/PrintConfig.cpp:2263 msgid "" -"Synchronize support layers with the object print layers. This is useful with " -"multi-material printers, where the extruder switch is expensive." +"Synchronize support layers with the object print layers. This is useful with multi-" +"material printers, where the extruder switch is expensive." msgstr "" -"Синхронизирует слои поддержки со слоями печатаемого объекта. Это полезно для " +"Синхронизирует слои поддержки со слоями печатаемой модели. Это полезно для " "мультиматериальных принтеров, которые требуют больших затрат на смену одного " "экструдера на другой." -#: src/libslic3r/PrintConfig.cpp:2237 +#: src/libslic3r/PrintConfig.cpp:2269 msgid "Overhang threshold" msgstr "Угол нависания поддержки" -#: src/libslic3r/PrintConfig.cpp:2239 +#: src/libslic3r/PrintConfig.cpp:2271 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)." +"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 "" -"Задаётся угол нависания, при превышении которого будут использоваться " -"поддержки (угол задаётся относительно вертикальной оси). Установите 0 для " -"формирования поддержки в автоматическом режиме." +"Задаётся угол нависания, при превышении которого будут использоваться поддержки " +"(угол задаётся относительно вертикальной оси). Установите 0 для формирования " +"поддержки в автоматическом режиме." -#: src/libslic3r/PrintConfig.cpp:2251 +#: src/libslic3r/PrintConfig.cpp:2283 msgid "With sheath around the support" msgstr "Оболочка вокруг поддержки" -#: src/libslic3r/PrintConfig.cpp:2253 +#: src/libslic3r/PrintConfig.cpp:2285 msgid "" -"Add a sheath (a single perimeter line) around the base support. This makes " -"the support more reliable, but also more difficult to remove." +"Add a sheath (a single perimeter line) around the base support. This makes the " +"support more reliable, but also more difficult to remove." msgstr "" -"Добавить оболочку (одну линию периметра) вокруг базовой поддержки. Это " -"делает поддержку более надёжной, но её труднее удалить." +"Добавить оболочку (одну линию периметра) вокруг базовой поддержки. Это делает " +"поддержку более надёжной, но её труднее удалить." -#: src/libslic3r/PrintConfig.cpp:2260 +#: src/libslic3r/PrintConfig.cpp:2292 msgid "" -"Nozzle temperature for layers after the first one. Set this to zero to " -"disable temperature control commands in the output G-code." +"Nozzle temperature for layers after the first one. Set this to zero to disable " +"temperature control commands in the output G-code." msgstr "" +"Температура сопла при печати для слоёв после первого. Установите 0 для отключения " +"команд управления температурой в выходом G-коде." -#: src/libslic3r/PrintConfig.cpp:2263 +#: src/libslic3r/PrintConfig.cpp:2295 msgid "Nozzle temperature" -msgstr "" +msgstr "Температура сопла" -#: src/libslic3r/PrintConfig.cpp:2269 +#: src/libslic3r/PrintConfig.cpp:2301 msgid "Detect thin walls" msgstr "Обнаружение тонких стенок" -#: src/libslic3r/PrintConfig.cpp:2271 +#: src/libslic3r/PrintConfig.cpp:2303 msgid "" -"Detect single-width walls (parts where two extrusions don't fit and we need " -"to collapse them into a single trace)." +"Detect single-width walls (parts where two extrusions don't fit and we need to " +"collapse them into a single trace)." msgstr "" "Данный параметр ищет тонкие стенки (стенки одинарной ширины), которые можно " "напечатать только в один проход экструдера, и производит нарезку правильно." -#: src/libslic3r/PrintConfig.cpp:2277 +#: src/libslic3r/PrintConfig.cpp:2309 msgid "Threads" msgstr "Потоков" -#: src/libslic3r/PrintConfig.cpp:2278 +#: src/libslic3r/PrintConfig.cpp:2310 msgid "" -"Threads are used to parallelize long-running tasks. Optimal threads number " -"is slightly above the number of available cores/processors." +"Threads are used to parallelize long-running tasks. Optimal threads number is " +"slightly above the number of available cores/processors." msgstr "" -"Количество потоков для распараллеливания длительных задач. Оптимальное " -"количество потоков немного превышает количество доступных ядер/процессоров." +"Количество потоков для распараллеливания длительных задач. Оптимальное количество " +"потоков несколько превышает количество доступных ядер/процессоров." -#: src/libslic3r/PrintConfig.cpp:2290 +#: src/libslic3r/PrintConfig.cpp:2322 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." +"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 "" +"Этот пользовательский код вставляется перед каждой сменой инструмента. Вы можете " +"использовать шаблонные переменные для всех параметров PrusaSlicer в том числе " +"{previous_extruder} и {next_extruder}. При включении команды смены инструмента, " +"которая заменяет правильный экструдер (например T{next_extruder}), PrusaSlicer не " +"будет запускать никакие другие подобные команды. Таким образом, можно создавать " +"собственные сценарии поведения до и после смены инструмента.???" -#: src/libslic3r/PrintConfig.cpp:2303 +#: src/libslic3r/PrintConfig.cpp:2335 msgid "" -"Set this to a non-zero value to set a manual extrusion width for infill for " -"top surfaces. You may want to use thinner extrudates to fill all narrow " -"regions and get a smoother finish. If left zero, default extrusion width " -"will be used if set, otherwise nozzle diameter will be used. If expressed as " -"percentage (for example 90%) it will be computed over layer height." +"Set this to a non-zero value to set a manual extrusion width for infill for top " +"surfaces. You may want to use thinner extrudates to fill all narrow regions and get " +"a smoother finish. If left zero, default extrusion width will be used if set, " +"otherwise nozzle diameter will be used. If expressed as percentage (for example " +"90%) it will be computed over layer height." msgstr "" "Установите значение отличное от 0, чтобы вручную задать ширину экструзии для " -"заполнения верхней поверхности. Вы можете использовать более тонкие сопла, " -"чтобы заполнить все узкие области и получить более гладкую поверхность. Если " -"оставить 0, будет использоваться \"Ширина экструзии по умолчанию\" - если " -"она задана, в противном случае будет использоваться диаметр сопла. Если " -"задано в процентах, параметр вычисляется относительно высоты слоя." +"заполнения верхней поверхности. Вы можете использовать более тонкие сопла, чтобы " +"заполнить все узкие области и получить более гладкую поверхность. Если оставить 0, " +"будет использоваться \"Ширина экструзии по умолчанию\" - если она задана, в " +"противном случае будет использоваться диаметр сопла. Если задано в процентах, " +"параметр вычисляется относительно высоты слоя." -#: src/libslic3r/PrintConfig.cpp:2315 +#: src/libslic3r/PrintConfig.cpp:2347 msgid "" -"Speed for printing top solid layers (it only applies to the uppermost " -"external layers and not to their internal solid layers). You may want to " -"slow down this to get a nicer surface finish. This can be expressed as a " -"percentage (for example: 80%) over the solid infill speed above. Set to zero " -"for auto." +"Speed for printing top solid layers (it only applies to the uppermost external " +"layers and not to their internal solid layers). You may want to slow down this to " +"get a nicer surface finish. This can be expressed as a percentage (for example: " +"80%) over the solid infill speed above. Set to zero for auto." msgstr "" -"Скорость печати верхних сплошных слоёв. Вы можете снизить скорость, чтобы " -"получить более качественную поверхность. Если задано в процентах, параметр " -"вычисляется относительно скорости сплошного заполнения указанной выше. " -"Установите 0 для автонастройки." +"Скорость печати верхних сплошных слоёв. Вы можете снизить скорость, чтобы получить " +"более качественную поверхность. Если задано в процентах, параметр вычисляется " +"относительно скорости сплошного заполнения указанной выше. Установите 0 для " +"автонастройки." -#: src/libslic3r/PrintConfig.cpp:2330 +#: src/libslic3r/PrintConfig.cpp:2362 msgid "Number of solid layers to generate on top surfaces." msgstr "Количество сплошных слоёв при печати верхней поверхности модели." -#: src/libslic3r/PrintConfig.cpp:2331 +#: src/libslic3r/PrintConfig.cpp:2363 msgid "Top solid layers" msgstr "Верхних сплошных слоёв" -#: src/libslic3r/PrintConfig.cpp:2339 +#: src/libslic3r/PrintConfig.cpp:2371 msgid "" -"The number of top solid layers is increased above top_solid_layers if " -"necessary to satisfy minimum thickness of top shell. This is useful to " -"prevent pillowing effect when printing with variable layer height." +"The number of top solid layers is increased above top_solid_layers if necessary to " +"satisfy minimum thickness of top shell. This is useful to prevent pillowing effect " +"when printing with variable layer height." msgstr "" -"На сколько количество верхних сплошных слоёв может быть больше " -"top_solid_layers, если это необходимо для получения минимальной толщины " -"верхней оболочки. Это полезно для убирания эффекта подушки при печати с " -"переменной высотой слоя." +"При необходимости количество верхних сплошных слоёв увеличивается выше значения " +"top_solid_layers (\"Сплошных слоёв сверху\") для удовлетворения минимальной толщины " +"оболочки сверху. Полезно для предотвращения эффекта \"дырявой подушки\" (верхняя " +"поверхность не полностью закрыта или имеет неровности) при печати с переменной " +"высотой слоя." -#: src/libslic3r/PrintConfig.cpp:2342 +#: src/libslic3r/PrintConfig.cpp:2374 msgid "Minimum top shell thickness" -msgstr "Минимальная толщина верхней оболочки" +msgstr "Минимальная толщина оболочки сверху" -#: src/libslic3r/PrintConfig.cpp:2349 +#: src/libslic3r/PrintConfig.cpp:2381 msgid "Speed for travel moves (jumps between distant extrusion points)." msgstr "Скорость перемещения экструдера при позиционировании без печати." -#: src/libslic3r/PrintConfig.cpp:2357 +#: src/libslic3r/PrintConfig.cpp:2389 msgid "Use firmware retraction" msgstr "Использовать ретракт из прошивки" -#: src/libslic3r/PrintConfig.cpp:2358 +#: src/libslic3r/PrintConfig.cpp:2390 msgid "" -"This experimental setting uses G10 and G11 commands to have the firmware " -"handle the retraction. This is only supported in recent Marlin." +"This experimental setting uses G10 and G11 commands to have the firmware handle the " +"retraction. This is only supported in recent Marlin." msgstr "" -"Эта экспериментальная настройка использует команды G10 и G11, чтобы прошивка " -"обрабатывала ретракт. Поддерживается только в последних версиях Marlin." +"Эта экспериментальная опция использует команды G10 и G11, чтобы прошивка " +"обрабатывала ретракт. Поддерживается только в последних версиях Marlin. " -#: src/libslic3r/PrintConfig.cpp:2364 +#: src/libslic3r/PrintConfig.cpp:2396 msgid "Use relative E distances" -msgstr "Использовать относительные расстояния E" +msgstr "Использовать относительные координаты для экструдера (E)" -#: src/libslic3r/PrintConfig.cpp:2365 +#: src/libslic3r/PrintConfig.cpp:2397 msgid "" "If your firmware requires relative E values, check this, otherwise leave it " "unchecked. Most firmwares use absolute values." msgstr "" "Движение экструдера (E) по отношению к предыдущей позиции не в абсолютном " -"выражении, а в относительном. Большинство прошивок используют абсолютные " -"значения при позиционировании. Если вы не знаете - использует ли ваша " -"прошивка эту функцию, то не отмечайте это значение." +"выражении, а в относительном. Большинство прошивок используют абсолютные значения " +"при позиционировании. Если вы не знаете - использует ли ваша прошивка эту функцию, " +"то не отмечайте это значение." -#: src/libslic3r/PrintConfig.cpp:2371 +#: src/libslic3r/PrintConfig.cpp:2403 msgid "Use volumetric E" -msgstr "Использовать объёмные значения E" +msgstr "Использовать объёмные значения для экструдера (E)" -#: src/libslic3r/PrintConfig.cpp:2372 +#: src/libslic3r/PrintConfig.cpp:2404 msgid "" -"This experimental setting uses outputs the E values in cubic millimeters " -"instead of linear millimeters. If your firmware doesn't already know " -"filament diameter(s), you can put commands like 'M200 D[filament_diameter_0] " -"T0' in your start G-code in order to turn volumetric mode on and use the " -"filament diameter associated to the filament selected in Slic3r. This is " -"only supported in recent Marlin." +"This experimental setting uses outputs the E values in cubic millimeters instead of " +"linear millimeters. If your firmware doesn't already know filament diameter(s), you " +"can put commands like 'M200 D[filament_diameter_0] T0' in your start G-code in " +"order to turn volumetric mode on and use the filament diameter associated to the " +"filament selected in Slic3r. This is only supported in recent Marlin." msgstr "" -"Это экспериментальный параметр использует выходные значения экструдера в " -"кубических миллиметрах вместо линейных миллиметров. Если ваша прошивка ещё " -"не знает диаметр прутка, вы можете поместить в свой стартовый G-код команду " -"«M200 D [диаметр_прутка_0] T0», чтобы включить объёмный режим и использовать " -"диаметр прутка, указанный в Slic3r. Поддерживается только в последних " -"версиях Marlin." +"Эта экспериментальная опция использует выходные значения экструдера в кубических " +"миллиметрах вместо линейных миллиметров. Если в вашей прошивке ещё не задан диаметр " +"прутка, вы можете прописать в свой стартовый G-код команды, например такую как 'M200 " +"D [filament_diameter_0] T0', чтобы включить объёмный режим и использовать диаметр " +"прутка указанный в PrusaSlicer. Это функция поддерживается только в последних версиях " +"Marlin." -#: src/libslic3r/PrintConfig.cpp:2382 +#: src/libslic3r/PrintConfig.cpp:2414 msgid "Enable variable layer height feature" msgstr "Включить функцию переменной высоты слоёв" -#: src/libslic3r/PrintConfig.cpp:2383 +#: src/libslic3r/PrintConfig.cpp:2415 msgid "" -"Some printers or printer setups may have difficulties printing with a " -"variable layer height. Enabled by default." +"Some printers or printer setups may have difficulties printing with a variable " +"layer height. Enabled by default." msgstr "" -"Некоторые принтеры (или из-за настроек принтера) могут испытывать трудности " -"при печати с функцией переменной высотой слоёв. По умолчанию включено." +"Некоторые принтеры (или из-за настроек принтера) могут испытывать трудности при " +"печати с функцией переменной высотой слоёв. По умолчанию включено." -#: src/libslic3r/PrintConfig.cpp:2389 +#: src/libslic3r/PrintConfig.cpp:2421 msgid "Wipe while retracting" -msgstr "Ретракт во время перемещения" +msgstr "Очистка сопла при ретракте" -#: src/libslic3r/PrintConfig.cpp:2390 +#: src/libslic3r/PrintConfig.cpp:2422 msgid "" -"This flag will move the nozzle while retracting to minimize the possible " -"blob on leaky extruders." +"This flag will move the nozzle while retracting to minimize the possible blob on " +"leaky extruders." msgstr "" -"Позволяет соплу перемещаться во время ретракта (втягивания прутка), чтобы " -"свести к минимуму возможное образование капли на не герметичных экструдерах." +"Позволяет соплу совершать разглаживавшее движение во время ретракта, чтобы свести к " +"минимуму возможное образование пупырышек в начале/конце слоя на экструдерах, " +"которые имеют тенденцию к течи." -#: src/libslic3r/PrintConfig.cpp:2397 +#: src/libslic3r/PrintConfig.cpp:2429 msgid "" -"Multi material printers may need to prime or purge extruders on tool " -"changes. Extrude the excess material into the wipe tower." +"Multi material printers may need to prime or purge extruders on tool changes. " +"Extrude the excess material into the wipe tower." msgstr "" -"Для мультиматериальных принтеров может потребоваться предзарядка и прочистка " -"сопел при их смене. Избыточный материал будет выдавливаться на башню очистки." +"Для мультиматериальных принтеров может потребоваться предзарядка и смена " +"инструмента. Избыточный материал будет выдавливаться на черновую башню." -#: src/libslic3r/PrintConfig.cpp:2403 +#: src/libslic3r/PrintConfig.cpp:2435 msgid "Purging volumes - load/unload volumes" msgstr "Очищающие объёмы - загрузка/выгрузка объёмов" -#: src/libslic3r/PrintConfig.cpp:2404 +#: src/libslic3r/PrintConfig.cpp:2436 msgid "" -"This vector saves required volumes to change from/to each tool used on the " -"wipe tower. These values are used to simplify creation of the full purging " -"volumes below." +"This vector saves required volumes to change from/to each tool used on the wipe " +"tower. These values are used to simplify creation of the full purging volumes below." msgstr "" -"Этот вектор задаёт объём материала, который будет выдавлен на башню очистки " -"для прочистки сопла при смене экструдеров/инструментов. Эти значения " -"используются для упрощения создания полноты объёмов очистки, указанной ниже." +"Этот параметр задаёт объём материала, который будет выдавлен на черновую башню для " +"прочистки сопла при смене экструдеров/инструментов. Эти значения используются для " +"упрощения создания полноты объёмов очистки указанной ниже." -#: src/libslic3r/PrintConfig.cpp:2410 +#: src/libslic3r/PrintConfig.cpp:2442 msgid "Purging volumes - matrix" msgstr "Таблица очищающих объёмов" -#: src/libslic3r/PrintConfig.cpp:2411 +#: src/libslic3r/PrintConfig.cpp:2443 msgid "" -"This matrix describes volumes (in cubic milimetres) required to purge the " -"new filament on the wipe tower for any given pair of tools." +"This matrix describes volumes (in cubic milimetres) required to purge the new " +"filament on the wipe tower for any given pair of tools." msgstr "" -"Эта таблица описывает объёмы (в кубических миллиметрах), необходимые для " -"прочистки нового прутка на башне очистки для заданной пары сопел/экструдеров." +"Эта таблица описывает объёмы (в кубических миллиметрах), необходимые для прочистки " +"нового прутка на черновой башне для любой пары сопел\\экструдеров." -#: src/libslic3r/PrintConfig.cpp:2420 +#: src/libslic3r/PrintConfig.cpp:2452 msgid "Position X" -msgstr "Х позиция" +msgstr "Х позиция башни" -#: src/libslic3r/PrintConfig.cpp:2421 +#: src/libslic3r/PrintConfig.cpp:2453 msgid "X coordinate of the left front corner of a wipe tower" -msgstr "X координата левого переднего угла башни очистки" +msgstr "X координата левого переднего угла черновой башни" -#: src/libslic3r/PrintConfig.cpp:2427 +#: src/libslic3r/PrintConfig.cpp:2459 msgid "Position Y" -msgstr "Y позиция" +msgstr "Y позиция башни" -#: src/libslic3r/PrintConfig.cpp:2428 +#: src/libslic3r/PrintConfig.cpp:2460 msgid "Y coordinate of the left front corner of a wipe tower" -msgstr "Y координата левого переднего угла башни очистки" +msgstr "Y координата левого переднего угла черновой башне" -#: src/libslic3r/PrintConfig.cpp:2435 +#: src/libslic3r/PrintConfig.cpp:2467 msgid "Width of a wipe tower" -msgstr "Ширина башни очистки" +msgstr "Ширина черновой башни" -#: src/libslic3r/PrintConfig.cpp:2441 +#: src/libslic3r/PrintConfig.cpp:2473 msgid "Wipe tower rotation angle" -msgstr "Угол поворота башни очистки" +msgstr "Угол поворота черновой башни" -#: src/libslic3r/PrintConfig.cpp:2442 +#: src/libslic3r/PrintConfig.cpp:2474 msgid "Wipe tower rotation angle with respect to x-axis." -msgstr "Угол поворота башни очистки относительно оси X." +msgstr "Угол поворота черновой башни относительно оси X." -#: src/libslic3r/PrintConfig.cpp:2449 +#: src/libslic3r/PrintConfig.cpp:2481 msgid "Wipe into this object's infill" -msgstr "" +msgstr "Очистка в заполнение модели" -#: src/libslic3r/PrintConfig.cpp:2450 +#: src/libslic3r/PrintConfig.cpp:2482 msgid "" -"Purging after toolchange will done inside this object's infills. This lowers " -"the amount of waste but may result in longer print time due to additional " -"travel moves." +"Purging after toolchange will done inside this object's infills. This lowers the " +"amount of waste but may result in longer print time due to additional travel moves." msgstr "" -"Прочистка сопла после смены будет выполняться внутри заполнения. Это " -"уменьшает количество отходов, но может привести к увеличению времени печати " -"из-за дополнительных перемещений." +"Очистка после замены инструмента будет выполняться внутри заполнения модели. Опция " +"уменьшает количество отходов, но может привести к увеличению времени печати из-за " +"дополнительных перемещений." -#: src/libslic3r/PrintConfig.cpp:2457 +#: src/libslic3r/PrintConfig.cpp:2489 msgid "Wipe into this object" -msgstr "Прочистка в объект" +msgstr "Очистка в модель" -#: src/libslic3r/PrintConfig.cpp:2458 +#: src/libslic3r/PrintConfig.cpp:2490 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." +"Object will be used to purge the nozzle after a toolchange to save material that " +"would otherwise end up in the wipe tower and decrease print time. Colours of the " +"objects will be mixed as a result." msgstr "" -"Прочистка сопла после смены будет выполняться в объекте, чтобы сохранить " -"материал (который иначе попал бы на башню очистки) и сократить время печати. " -"В результате цвета объектов будут смешаны." +"Очистка сопла после смены инструмента будет выполняться в модель, чтобы сохранить " +"материал (который иначе попал бы на черновую башню) и сократить время печати. В " +"результате цвета моделей будут смешаны." -#: src/libslic3r/PrintConfig.cpp:2464 +#: src/libslic3r/PrintConfig.cpp:2496 msgid "Maximal bridging distance" msgstr "Максимальное длина моста" -#: src/libslic3r/PrintConfig.cpp:2465 +#: src/libslic3r/PrintConfig.cpp:2497 msgid "Maximal distance between supports on sparse infill sections." -msgstr "" -"Максимальное расстояние между опорами на разряженных участках заполнения." +msgstr "Максимальное расстояние между опорами на разряженных участках заполнения." -#: src/libslic3r/PrintConfig.cpp:2471 +#: src/libslic3r/PrintConfig.cpp:2503 msgid "XY Size Compensation" msgstr "Коррекция горизонтальных размеров модели" -#: src/libslic3r/PrintConfig.cpp:2473 +#: src/libslic3r/PrintConfig.cpp:2505 msgid "" -"The object will be grown/shrunk in the XY plane by the configured value " -"(negative = inwards, positive = outwards). This might be useful for fine-" -"tuning hole sizes." +"The object will be grown/shrunk in the XY plane by the configured value (negative = " +"inwards, positive = outwards). This might be useful for fine-tuning hole sizes." msgstr "" -"Параметр, отвечает за смещение границы контура печатаемого объекта в " -"плоскости XY на заданное значение. Отрицательное значение - во внутрь, " -"положительный - наружу. Может быть полезно для точной настройки размеров " -"отверстий, при печати шевронных подшипников." +"Параметр отвечает за смещение границы контура печатаемой модели в плоскости XY на " +"заданное значение. Отрицательное значение - во внутрь, положительный - наружу. " +"Может быть полезно для точной настройки размеров отверстий при печати шевронных " +"подшипников." -#: src/libslic3r/PrintConfig.cpp:2481 +#: src/libslic3r/PrintConfig.cpp:2513 msgid "Z offset" -msgstr "Смещение платформы по оси Z" +msgstr "Смещение стола по оси Z" -#: src/libslic3r/PrintConfig.cpp:2482 +#: src/libslic3r/PrintConfig.cpp:2514 msgid "" -"This value will be added (or subtracted) from all the Z coordinates in the " -"output G-code. It is used to compensate for bad Z endstop position: for " -"example, if your endstop zero actually leaves the nozzle 0.3mm far from the " -"print bed, set this to -0.3 (or fix your endstop)." +"This value will be added (or subtracted) from all the Z coordinates in the output G-" +"code. It is used to compensate for bad Z endstop position: for example, if your " +"endstop zero actually leaves the nozzle 0.3mm far from the print bed, set this to " +"-0.3 (or fix your endstop)." msgstr "" -"Это значение будет добавлено (или вычтено) из всех координат Z в конечном" -" G-коде. " -"Используется для исправления ошибок работы концевого датчика Z: например, " -"если при нулевом значении по датчику сопло в действительности выше платформы" -" на " -"0.3 мм, то укажите здесь -0.3 (или исправьте датчик)." +"Смещение стола по вертикальной оси Z при ошибках работы концевого датчика. Это " +"значение будет прибавлено (или вычтено) из всех Z координат в выходном G-коде." -#: src/libslic3r/PrintConfig.cpp:2549 +#: src/libslic3r/PrintConfig.cpp:2581 msgid "Display width" msgstr "Ширина дисплея" -#: src/libslic3r/PrintConfig.cpp:2550 +#: src/libslic3r/PrintConfig.cpp:2582 msgid "Width of the display" -msgstr "" +msgstr "Высота дисплея." -#: src/libslic3r/PrintConfig.cpp:2555 +#: src/libslic3r/PrintConfig.cpp:2587 msgid "Display height" msgstr "Высота дисплея" -#: src/libslic3r/PrintConfig.cpp:2556 +#: src/libslic3r/PrintConfig.cpp:2588 msgid "Height of the display" -msgstr "" +msgstr "Высота дисплея." -#: src/libslic3r/PrintConfig.cpp:2561 +#: src/libslic3r/PrintConfig.cpp:2593 msgid "Number of pixels in" -msgstr "Количество пикселей в" +msgstr "Количество пикселей" -#: src/libslic3r/PrintConfig.cpp:2563 +#: src/libslic3r/PrintConfig.cpp:2595 msgid "Number of pixels in X" -msgstr "Количество пикселей в X" +msgstr "Количество пикселей по X." -#: src/libslic3r/PrintConfig.cpp:2569 +#: src/libslic3r/PrintConfig.cpp:2601 msgid "Number of pixels in Y" -msgstr "Количество пикселей в Y" +msgstr "Количество пикселей по Y." -#: src/libslic3r/PrintConfig.cpp:2574 +#: src/libslic3r/PrintConfig.cpp:2606 msgid "Display horizontal mirroring" -msgstr "" +msgstr "Горизонтальное зеркалирование дисплея" -#: src/libslic3r/PrintConfig.cpp:2575 +#: src/libslic3r/PrintConfig.cpp:2607 msgid "Mirror horizontally" -msgstr "" +msgstr "Зеркалировать по горизонтали" -#: src/libslic3r/PrintConfig.cpp:2576 +#: src/libslic3r/PrintConfig.cpp:2608 msgid "Enable horizontal mirroring of output images" -msgstr "" +msgstr "Включение горизонтального зеркалирования выходных изображений." -#: src/libslic3r/PrintConfig.cpp:2581 +#: src/libslic3r/PrintConfig.cpp:2613 msgid "Display vertical mirroring" -msgstr "" +msgstr "Вертикальное зеркалирование дисплея" -#: src/libslic3r/PrintConfig.cpp:2582 +#: src/libslic3r/PrintConfig.cpp:2614 msgid "Mirror vertically" -msgstr "" +msgstr "Зеркалировать по вертикали" -#: src/libslic3r/PrintConfig.cpp:2583 +#: src/libslic3r/PrintConfig.cpp:2615 msgid "Enable vertical mirroring of output images" -msgstr "" +msgstr "Включение вертикального зеркалирования выходных изображений." -#: src/libslic3r/PrintConfig.cpp:2588 +#: src/libslic3r/PrintConfig.cpp:2620 msgid "Display orientation" -msgstr "" +msgstr "Ориентация дисплея" -#: src/libslic3r/PrintConfig.cpp:2589 +#: src/libslic3r/PrintConfig.cpp:2621 msgid "" -"Set the actual LCD display orientation inside the SLA printer. Portrait mode " -"will flip the meaning of display width and height parameters and the output " -"images will be rotated by 90 degrees." +"Set the actual LCD display orientation inside the SLA printer. Portrait mode will " +"flip the meaning of display width and height parameters and the output images will " +"be rotated by 90 degrees." msgstr "" +"Установите фактическую ориентацию ЖК-дисплея внутри SLA принтера. Портретный режим " +"перевернёт значения параметров ширины и высоты дисплея, а выходные изображения " +"будут повёрнуты на 90 градусов." -#: src/libslic3r/PrintConfig.cpp:2595 +#: src/libslic3r/PrintConfig.cpp:2627 msgid "Landscape" -msgstr "" +msgstr "Альбомная" -#: src/libslic3r/PrintConfig.cpp:2596 +#: src/libslic3r/PrintConfig.cpp:2628 msgid "Portrait" -msgstr "" +msgstr "Портретная" -#: src/libslic3r/PrintConfig.cpp:2601 +#: src/libslic3r/PrintConfig.cpp:2633 msgid "Fast" -msgstr "" +msgstr "Быстро" -#: src/libslic3r/PrintConfig.cpp:2602 +#: src/libslic3r/PrintConfig.cpp:2634 msgid "Fast tilt" -msgstr "" +msgstr "Быстрый наклон" -#: src/libslic3r/PrintConfig.cpp:2603 +#: src/libslic3r/PrintConfig.cpp:2635 msgid "Time of the fast tilt" -msgstr "" +msgstr "Время быстрого наклона." -#: src/libslic3r/PrintConfig.cpp:2610 +#: src/libslic3r/PrintConfig.cpp:2642 msgid "Slow" -msgstr "" +msgstr "Медленно" -#: src/libslic3r/PrintConfig.cpp:2611 +#: src/libslic3r/PrintConfig.cpp:2643 msgid "Slow tilt" -msgstr "" +msgstr "Медленный наклон" -#: src/libslic3r/PrintConfig.cpp:2612 +#: src/libslic3r/PrintConfig.cpp:2644 msgid "Time of the slow tilt" -msgstr "" +msgstr "Время медленного наклона." -#: src/libslic3r/PrintConfig.cpp:2619 +#: src/libslic3r/PrintConfig.cpp:2651 msgid "Area fill" -msgstr "" +msgstr "Площадь заполнения" -#: src/libslic3r/PrintConfig.cpp:2620 +#: src/libslic3r/PrintConfig.cpp:2652 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" "then a slow tilt will be used, otherwise - a fast tilt" msgstr "" +"Процент от площади стола. Если область печати превышает указанное значение, то " +"будет использоваться медленный наклон, в противном случае - быстрый наклон." -#: src/libslic3r/PrintConfig.cpp:2627 src/libslic3r/PrintConfig.cpp:2628 -#: src/libslic3r/PrintConfig.cpp:2629 +#: src/libslic3r/PrintConfig.cpp:2659 src/libslic3r/PrintConfig.cpp:2660 +#: src/libslic3r/PrintConfig.cpp:2661 msgid "Printer scaling correction" -msgstr "" +msgstr "Корректировка масштабирования" -#: src/libslic3r/PrintConfig.cpp:2635 src/libslic3r/PrintConfig.cpp:2636 +#: src/libslic3r/PrintConfig.cpp:2667 src/libslic3r/PrintConfig.cpp:2668 msgid "Printer absolute correction" -msgstr "" +msgstr "Абсолютная корректировка принтера" -#: src/libslic3r/PrintConfig.cpp:2637 +#: src/libslic3r/PrintConfig.cpp:2669 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." msgstr "" +"Будет надувать или сдувать нарезанные 2D-полигоны в соответствии со знаком " +"коррекции." -#: src/libslic3r/PrintConfig.cpp:2643 +#: src/libslic3r/PrintConfig.cpp:2675 msgid "Elephant foot minimum width" -msgstr "" +msgstr "Минимальная ширина \"слоновьей ноги\"" -#: src/libslic3r/PrintConfig.cpp:2645 -msgid "" -"Minimum width of features to maintain when doing elephant foot compensation." +#: src/libslic3r/PrintConfig.cpp:2677 +msgid "Minimum width of features to maintain when doing elephant foot compensation." msgstr "" +"Минимальная ширина, которую нужно поддерживать для компенсации \"слоновьей ноги\"." -#: src/libslic3r/PrintConfig.cpp:2652 src/libslic3r/PrintConfig.cpp:2653 +#: src/libslic3r/PrintConfig.cpp:2684 src/libslic3r/PrintConfig.cpp:2685 msgid "Printer gamma correction" -msgstr "Гамма модификация принтера" +msgstr "Корректировка гаммы-коррекции" -#: src/libslic3r/PrintConfig.cpp:2654 +#: src/libslic3r/PrintConfig.cpp:2686 msgid "" -"This will apply a gamma correction to the rasterized 2D polygons. A gamma " -"value of zero means thresholding with the threshold in the middle. This " -"behaviour eliminates antialiasing without losing holes in polygons." +"This will apply a gamma correction to the rasterized 2D polygons. A gamma value of " +"zero means thresholding with the threshold in the middle. This behaviour eliminates " +"antialiasing without losing holes in polygons." msgstr "" +"Будет применена гамма-коррекция к растрированным 2D-полигонам. Нулевое значение " +"гаммы означает пороговое значение с порогом посередине. Такое поведение убирает " +"сглаживание без потери отверстий в полигонах." -#: src/libslic3r/PrintConfig.cpp:2666 src/libslic3r/PrintConfig.cpp:2667 +#: src/libslic3r/PrintConfig.cpp:2698 src/libslic3r/PrintConfig.cpp:2699 msgid "SLA material type" -msgstr "Тип материала SLA" +msgstr "Тип SLA материала" -#: src/libslic3r/PrintConfig.cpp:2678 src/libslic3r/PrintConfig.cpp:2679 +#: src/libslic3r/PrintConfig.cpp:2710 src/libslic3r/PrintConfig.cpp:2711 msgid "Initial layer height" -msgstr "Высота исходного слоя" +msgstr "Начальная высота слоя" -#: src/libslic3r/PrintConfig.cpp:2685 src/libslic3r/PrintConfig.cpp:2686 +#: src/libslic3r/PrintConfig.cpp:2717 src/libslic3r/PrintConfig.cpp:2718 msgid "Bottle volume" -msgstr "Объем бутылки" +msgstr "Объём бутылки" -#: src/libslic3r/PrintConfig.cpp:2687 +#: src/libslic3r/PrintConfig.cpp:2719 msgid "ml" msgstr "мл" -#: src/libslic3r/PrintConfig.cpp:2692 src/libslic3r/PrintConfig.cpp:2693 +#: src/libslic3r/PrintConfig.cpp:2724 src/libslic3r/PrintConfig.cpp:2725 msgid "Bottle weight" -msgstr "" +msgstr "Вес бутылки" -#: src/libslic3r/PrintConfig.cpp:2694 +#: src/libslic3r/PrintConfig.cpp:2726 msgid "kg" msgstr "кг" -#: src/libslic3r/PrintConfig.cpp:2701 +#: src/libslic3r/PrintConfig.cpp:2733 msgid "g/ml" msgstr "г/мл" -#: src/libslic3r/PrintConfig.cpp:2708 +#: src/libslic3r/PrintConfig.cpp:2740 msgid "money/bottle" -msgstr "денег/бутылка" +msgstr "цена/бутылка" -#: src/libslic3r/PrintConfig.cpp:2713 +#: src/libslic3r/PrintConfig.cpp:2745 msgid "Faded layers" -msgstr "" +msgstr "Начальных слоёв" -#: src/libslic3r/PrintConfig.cpp:2714 +#: src/libslic3r/PrintConfig.cpp:2746 msgid "" -"Number of the layers needed for the exposure time fade from initial exposure " -"time to the exposure time" +"Number of the layers needed for the exposure time fade from initial exposure time " +"to the exposure time" msgstr "" +"Количество начальных слоёв, необходимых для изменения времени засветки от \"Время " +"засветки начальных слоёв\" до \"Время засветки основных слоёв\"." -#: src/libslic3r/PrintConfig.cpp:2721 src/libslic3r/PrintConfig.cpp:2722 +#: src/libslic3r/PrintConfig.cpp:2753 src/libslic3r/PrintConfig.cpp:2754 msgid "Minimum exposure time" -msgstr "Минимальное время контакта" +msgstr "Мин. время засветки основных слоёв" -#: src/libslic3r/PrintConfig.cpp:2729 src/libslic3r/PrintConfig.cpp:2730 +#: src/libslic3r/PrintConfig.cpp:2761 src/libslic3r/PrintConfig.cpp:2762 msgid "Maximum exposure time" -msgstr "Максимальное время контакта" +msgstr "Макс. время засветки основных слоёв" -#: src/libslic3r/PrintConfig.cpp:2737 src/libslic3r/PrintConfig.cpp:2738 +#: src/libslic3r/PrintConfig.cpp:2769 src/libslic3r/PrintConfig.cpp:2770 msgid "Exposure time" -msgstr "Время контакта" +msgstr "Время засветки обычных слоёв" -#: src/libslic3r/PrintConfig.cpp:2744 src/libslic3r/PrintConfig.cpp:2745 +#: src/libslic3r/PrintConfig.cpp:2776 src/libslic3r/PrintConfig.cpp:2777 msgid "Minimum initial exposure time" -msgstr "Минимальное начальное время контакта" +msgstr "Мин. время засветки начальных слоёв" -#: src/libslic3r/PrintConfig.cpp:2752 src/libslic3r/PrintConfig.cpp:2753 +#: src/libslic3r/PrintConfig.cpp:2784 src/libslic3r/PrintConfig.cpp:2785 msgid "Maximum initial exposure time" -msgstr "" +msgstr "Макс. время засветки начальных слоёв" -#: src/libslic3r/PrintConfig.cpp:2760 src/libslic3r/PrintConfig.cpp:2761 +#: src/libslic3r/PrintConfig.cpp:2792 src/libslic3r/PrintConfig.cpp:2793 msgid "Initial exposure time" -msgstr "" +msgstr "Время засветки начальных слоёв" -#: src/libslic3r/PrintConfig.cpp:2767 src/libslic3r/PrintConfig.cpp:2768 +#: src/libslic3r/PrintConfig.cpp:2799 src/libslic3r/PrintConfig.cpp:2800 msgid "Correction for expansion" -msgstr "" +msgstr "Коррекция расширения" -#: src/libslic3r/PrintConfig.cpp:2774 +#: src/libslic3r/PrintConfig.cpp:2806 msgid "SLA print material notes" -msgstr "Примечания к материалу для SLA-печати" +msgstr "Примечание к SLA материалу" -#: src/libslic3r/PrintConfig.cpp:2775 +#: src/libslic3r/PrintConfig.cpp:2807 msgid "You can put your notes regarding the SLA print material here." -msgstr "Здесь вы можете разместить свои заметки о материале для SLA печати." +msgstr "" +"Здесь вы можете разместить свои заметки относительно SLA материала для печати." -#: src/libslic3r/PrintConfig.cpp:2787 src/libslic3r/PrintConfig.cpp:2798 +#: src/libslic3r/PrintConfig.cpp:2819 src/libslic3r/PrintConfig.cpp:2830 msgid "Default SLA material profile" -msgstr "Профиль материала SLA-печати по умолчанию" +msgstr "Профиль SLA материала по умолчанию" -#: src/libslic3r/PrintConfig.cpp:2809 +#: src/libslic3r/PrintConfig.cpp:2841 msgid "Generate supports" -msgstr "" +msgstr "Генерировать поддержку" -#: src/libslic3r/PrintConfig.cpp:2811 +#: src/libslic3r/PrintConfig.cpp:2843 msgid "Generate supports for the models" -msgstr "" +msgstr "Генерация поддержки для моделей." -#: src/libslic3r/PrintConfig.cpp:2816 +#: src/libslic3r/PrintConfig.cpp:2848 msgid "Pinhead front diameter" -msgstr "" +msgstr "Диаметр носика поддержки" -#: src/libslic3r/PrintConfig.cpp:2818 +#: src/libslic3r/PrintConfig.cpp:2850 msgid "Diameter of the pointing side of the head" -msgstr "" +msgstr "Диаметр носика поддержки." -#: src/libslic3r/PrintConfig.cpp:2825 +#: src/libslic3r/PrintConfig.cpp:2857 msgid "Head penetration" -msgstr "" +msgstr "Глубина проникновения носика поддержки" -#: src/libslic3r/PrintConfig.cpp:2827 +#: src/libslic3r/PrintConfig.cpp:2859 msgid "How much the pinhead has to penetrate the model surface" -msgstr "" +msgstr "Задаёт, как глубоко носик поддержки будет проникать в модель." -#: src/libslic3r/PrintConfig.cpp:2834 +#: src/libslic3r/PrintConfig.cpp:2866 msgid "Pinhead width" -msgstr "" +msgstr "Длина носика поддержки" -#: src/libslic3r/PrintConfig.cpp:2836 +#: src/libslic3r/PrintConfig.cpp:2868 msgid "Width from the back sphere center to the front sphere center" msgstr "" +"Длина носика поддержки (ширина от центра задней сферы до центра передней сферы)." -#: src/libslic3r/PrintConfig.cpp:2844 +#: src/libslic3r/PrintConfig.cpp:2876 msgid "Pillar diameter" -msgstr "" +msgstr "Диаметр тела поддержки" -#: src/libslic3r/PrintConfig.cpp:2846 +#: src/libslic3r/PrintConfig.cpp:2878 msgid "Diameter in mm of the support pillars" -msgstr "" +msgstr "Диаметр тела поддержки в мм." -#: src/libslic3r/PrintConfig.cpp:2854 +#: src/libslic3r/PrintConfig.cpp:2886 msgid "Small pillar diameter percent" -msgstr "" +msgstr "Диаметр маленьких тел поддержки в процентах" -#: src/libslic3r/PrintConfig.cpp:2856 +#: src/libslic3r/PrintConfig.cpp:2888 msgid "" -"The percentage of smaller pillars compared to the normal pillar diameter " -"which are used in problematic areas where a normal pilla cannot fit." +"The percentage of smaller pillars compared to the normal pillar diameter which are " +"used in problematic areas where a normal pilla cannot fit." msgstr "" +"Размер тел поддержки меньшего размера в процентах по сравнению с обычным диаметром " +"тел поддержки, которые используются в проблемных областях, где нормальный столбик " +"поддержки не может поместиться." -#: src/libslic3r/PrintConfig.cpp:2865 +#: src/libslic3r/PrintConfig.cpp:2897 msgid "Max bridges on a pillar" -msgstr "" +msgstr "Макс. количество мостов на теле поддержки" -#: src/libslic3r/PrintConfig.cpp:2867 +#: src/libslic3r/PrintConfig.cpp:2899 msgid "" -"Maximum number of bridges that can be placed on a pillar. Bridges hold " -"support point pinheads and connect to pillars as small branches." +"Maximum number of bridges that can be placed on a pillar. Bridges hold support " +"point pinheads and connect to pillars as small branches." msgstr "" +"Максимальное количество мостов, которые можно разместить на теле поддержки. Мосты " +"удерживают носики поддержки и соединяются с телами поддержки в виде небольших " +"ветвей." -#: src/libslic3r/PrintConfig.cpp:2875 +#: src/libslic3r/PrintConfig.cpp:2907 msgid "Pillar connection mode" -msgstr "" +msgstr "Тип соединения тела поддержки" -#: src/libslic3r/PrintConfig.cpp:2876 +#: src/libslic3r/PrintConfig.cpp:2908 msgid "" -"Controls the bridge type between two neighboring pillars. Can be zig-zag, " -"cross (double zig-zag) or dynamic which will automatically switch between " -"the first two depending on the distance of the two pillars." +"Controls the bridge type between two neighboring pillars. Can be zig-zag, cross " +"(double zig-zag) or dynamic which will automatically switch between the first two " +"depending on the distance of the two pillars." msgstr "" +"Управляет типом мостов, которые соединяют соседние тела поддержки. Может быть " +"зигзагообразным, перекрёстным (двойной зигзаг) или динамическим, который " +"автоматически переключается между первыми двумя, в зависимости от расстояния между " +"телами поддержки." -#: src/libslic3r/PrintConfig.cpp:2884 +#: src/libslic3r/PrintConfig.cpp:2916 msgid "Zig-Zag" -msgstr "" +msgstr "Зигзагообразный" -#: src/libslic3r/PrintConfig.cpp:2885 +#: src/libslic3r/PrintConfig.cpp:2917 msgid "Cross" -msgstr "" +msgstr "Перекрёстный" -#: src/libslic3r/PrintConfig.cpp:2886 +#: src/libslic3r/PrintConfig.cpp:2918 msgid "Dynamic" -msgstr "" +msgstr "Динамический" -#: src/libslic3r/PrintConfig.cpp:2898 +#: src/libslic3r/PrintConfig.cpp:2930 msgid "Pillar widening factor" -msgstr "" +msgstr "Коэффициент расширения тела поддержки" -#: src/libslic3r/PrintConfig.cpp:2900 +#: src/libslic3r/PrintConfig.cpp:2932 msgid "" -"Merging bridges or pillars into another pillars can increase the radius. " -"Zero means no increase, one means full increase." +"Merging bridges or pillars into another pillars can increase the radius. Zero means " +"no increase, one means full increase." msgstr "" +"Слияние мостов или тел поддержки в другие тела поддержки может увеличить их радиус. " +"0 - отсутствие увеличения, 1 - полное увеличение." -#: src/libslic3r/PrintConfig.cpp:2909 +#: src/libslic3r/PrintConfig.cpp:2941 msgid "Support base diameter" -msgstr "" +msgstr "Диаметр основания поддержки" -#: src/libslic3r/PrintConfig.cpp:2911 +#: src/libslic3r/PrintConfig.cpp:2943 msgid "Diameter in mm of the pillar base" -msgstr "" +msgstr "Диаметр основания поддержки в мм." -#: src/libslic3r/PrintConfig.cpp:2919 +#: src/libslic3r/PrintConfig.cpp:2951 msgid "Support base height" -msgstr "" +msgstr "Высота основания поддержки" -#: src/libslic3r/PrintConfig.cpp:2921 +#: src/libslic3r/PrintConfig.cpp:2953 msgid "The height of the pillar base cone" -msgstr "" +msgstr "Высота конусообразного основания поддержки." -#: src/libslic3r/PrintConfig.cpp:2928 +#: src/libslic3r/PrintConfig.cpp:2960 msgid "Support base safety distance" -msgstr "" +msgstr "Безопасное расстояние основания поддержки" -#: src/libslic3r/PrintConfig.cpp:2931 +#: src/libslic3r/PrintConfig.cpp:2963 msgid "" -"The minimum distance of the pillar base from the model in mm. Makes sense in " -"zero elevation mode where a gap according to this parameter is inserted " -"between the model and the pad." +"The minimum distance of the pillar base from the model in mm. Makes sense in zero " +"elevation mode where a gap according to this parameter is inserted between the " +"model and the pad." msgstr "" +"Минимальное расстояние между основанием поддержки и моделью в мм. Имеет смысл в " +"режиме нулевой высоты подъёма, когда между моделью и подложкой вставляется зазор " +"заданный этим параметром." -#: src/libslic3r/PrintConfig.cpp:2941 +#: src/libslic3r/PrintConfig.cpp:2973 msgid "Critical angle" msgstr "Критический угол" -#: src/libslic3r/PrintConfig.cpp:2943 +#: src/libslic3r/PrintConfig.cpp:2975 msgid "The default angle for connecting support sticks and junctions." -msgstr "" +msgstr "Угол соединения опор поддержки со связующим узлом." -#: src/libslic3r/PrintConfig.cpp:2951 +#: src/libslic3r/PrintConfig.cpp:2983 msgid "Max bridge length" -msgstr "" +msgstr "Максимальная длина моста" -#: src/libslic3r/PrintConfig.cpp:2953 +#: src/libslic3r/PrintConfig.cpp:2985 msgid "The max length of a bridge" -msgstr "" +msgstr "Максимальная длина моста." -#: src/libslic3r/PrintConfig.cpp:2960 +#: src/libslic3r/PrintConfig.cpp:2992 msgid "Max pillar linking distance" -msgstr "" +msgstr "Максимальное расстояние между телом поддержки" -#: src/libslic3r/PrintConfig.cpp:2962 +#: src/libslic3r/PrintConfig.cpp:2994 msgid "" -"The max distance of two pillars to get linked with each other. A zero value " -"will prohibit pillar cascading." +"The max distance of two pillars to get linked with each other. A zero value will " +"prohibit pillar cascading." msgstr "" +"Максимальное расстояние между двумя телами поддержки для связи друг с другом. " +"Нулевое значение - запрет на соединение тел поддержки каскадом." -#: src/libslic3r/PrintConfig.cpp:2972 +#: src/libslic3r/PrintConfig.cpp:3004 msgid "" -"How much the supports should lift up the supported object. If \"Pad around " -"object\" is enabled, this value is ignored." +"How much the supports should lift up the supported object. If \"Pad around object\" " +"is enabled, this value is ignored." msgstr "" +"Определяет насколько опоры должны поднимать поддерживаемую модель. Если включёно " +"\"Подложка вокруг модели\", это значение игнорируется." -#: src/libslic3r/PrintConfig.cpp:2983 +#: src/libslic3r/PrintConfig.cpp:3015 msgid "This is a relative measure of support points density." -msgstr "" +msgstr "Относительный показатель плотности точек поддержки." -#: src/libslic3r/PrintConfig.cpp:2989 +#: src/libslic3r/PrintConfig.cpp:3021 msgid "Minimal distance of the support points" -msgstr "Минимальное расстояние опорных точек" +msgstr "Минимальное расстояние между точками поддержки" -#: src/libslic3r/PrintConfig.cpp:2991 +#: src/libslic3r/PrintConfig.cpp:3023 msgid "No support points will be placed closer than this threshold." -msgstr "" +msgstr "Точки поддержки не будут размещены ближе этого порогового значения." -#: src/libslic3r/PrintConfig.cpp:2997 +#: src/libslic3r/PrintConfig.cpp:3029 msgid "Use pad" -msgstr "" +msgstr "Использовать подложку" -#: src/libslic3r/PrintConfig.cpp:2999 +#: src/libslic3r/PrintConfig.cpp:3031 msgid "Add a pad underneath the supported model" -msgstr "" +msgstr "Добавляет подложку под поддерживаемую модель." -#: src/libslic3r/PrintConfig.cpp:3004 +#: src/libslic3r/PrintConfig.cpp:3036 msgid "Pad wall thickness" -msgstr "" +msgstr "Толщина стенки подложки" -#: src/libslic3r/PrintConfig.cpp:3006 +#: src/libslic3r/PrintConfig.cpp:3038 msgid "The thickness of the pad and its optional cavity walls." -msgstr "" +msgstr "Толщина подложки и её дополнительных стенок полости." -#: src/libslic3r/PrintConfig.cpp:3014 +#: src/libslic3r/PrintConfig.cpp:3046 msgid "Pad wall height" -msgstr "" +msgstr "Высота стенки подложки" -#: src/libslic3r/PrintConfig.cpp:3015 +#: src/libslic3r/PrintConfig.cpp:3047 msgid "" -"Defines the pad cavity depth. Set to zero to disable the cavity. Be careful " -"when enabling this feature, as some resins may produce an extreme suction " -"effect inside the cavity, which makes peeling the print off the vat foil " -"difficult." +"Defines the pad cavity depth. Set to zero to disable the cavity. Be careful when " +"enabling this feature, as some resins may produce an extreme suction effect inside " +"the cavity, which makes peeling the print off the vat foil difficult." msgstr "" +"Определяет глубину полости в подложке. Установите нулевое значение, чтобы не делать " +"полость. Будьте осторожны при включении этой функции, так как некоторые смолы могут " +"создавать чрезмерный эффект всасывания внутри полости, что затрудняет снятие модели." -#: src/libslic3r/PrintConfig.cpp:3028 +#: src/libslic3r/PrintConfig.cpp:3060 msgid "Pad brim size" -msgstr "" +msgstr "Размер каймы подложки" -#: src/libslic3r/PrintConfig.cpp:3029 +#: src/libslic3r/PrintConfig.cpp:3061 msgid "How far should the pad extend around the contained geometry" -msgstr "" +msgstr "Как далеко должна простираться подложка вокруг существующей геометрии." -#: src/libslic3r/PrintConfig.cpp:3039 +#: src/libslic3r/PrintConfig.cpp:3071 msgid "Max merge distance" -msgstr "" +msgstr "Максимальное расстояние слияния" -#: src/libslic3r/PrintConfig.cpp:3041 +#: src/libslic3r/PrintConfig.cpp:3073 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." +"Some objects can get along with a few smaller pads instead of a single big one. " +"This parameter defines how far the center of two smaller pads should be. If theyare " +"closer, they will get merged into one pad." msgstr "" +"Некоторые модели могут поместиться на нескольких маленьких подложках вместо одной " +"большой. Этот параметр определяет, как далеко должен находиться центр двух меньших " +"подложек. Если они находятся слишком близко, то будут объединены в одну подложку." -#: src/libslic3r/PrintConfig.cpp:3061 +#: src/libslic3r/PrintConfig.cpp:3093 msgid "Pad wall slope" -msgstr "" +msgstr "Наклон стенки подложки" -#: src/libslic3r/PrintConfig.cpp:3063 +#: src/libslic3r/PrintConfig.cpp:3095 msgid "" -"The slope of the pad wall relative to the bed plane. 90 degrees means " -"straight walls." +"The slope of the pad wall relative to the bed plane. 90 degrees means straight " +"walls." msgstr "" +"Наклон стенки подложки относительно плоскости стола. 90 градусов означает прямые " +"стены." -#: src/libslic3r/PrintConfig.cpp:3074 +#: src/libslic3r/PrintConfig.cpp:3106 msgid "Create pad around object and ignore the support elevation" -msgstr "" +msgstr "Создаёт подложку вокруг модели, игнорируя высоту подъёма поддержкой." -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3111 msgid "Pad around object everywhere" -msgstr "" +msgstr "Подложка вокруг модели везде" -#: src/libslic3r/PrintConfig.cpp:3081 +#: src/libslic3r/PrintConfig.cpp:3113 msgid "Force pad around object everywhere" -msgstr "" +msgstr "Принудительное создание подложки вокруг модели везде." -#: src/libslic3r/PrintConfig.cpp:3086 +#: src/libslic3r/PrintConfig.cpp:3118 msgid "Pad object gap" -msgstr "" +msgstr "Зазор между дном модели и подложкой" -#: src/libslic3r/PrintConfig.cpp:3088 +#: src/libslic3r/PrintConfig.cpp:3120 msgid "" -"The gap between the object bottom and the generated pad in zero elevation " -"mode." +"The gap between the object bottom and the generated pad in zero elevation mode." msgstr "" +"Зазор между дном модели и сгенерированной подложкой в режиме нулевой высоты подъёма." -#: src/libslic3r/PrintConfig.cpp:3097 +#: src/libslic3r/PrintConfig.cpp:3129 msgid "Pad object connector stride" -msgstr "" +msgstr "Шаг соединительного элемента подложки модели" -#: src/libslic3r/PrintConfig.cpp:3099 +#: src/libslic3r/PrintConfig.cpp:3131 msgid "" -"Distance between two connector sticks which connect the object and the " -"generated pad." +"Distance between two connector sticks which connect the object and the generated " +"pad." msgstr "" +"Расстояние между двумя соединительными опорами, которые соединяют модель и " +"сгенерированную подложку." -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3138 msgid "Pad object connector width" -msgstr "" +msgstr "Ширина соединительного элемента подложки модели" -#: src/libslic3r/PrintConfig.cpp:3108 -msgid "" -"Width of the connector sticks which connect the object and the generated pad." +#: src/libslic3r/PrintConfig.cpp:3140 +msgid "Width of the connector sticks which connect the object and the generated pad." msgstr "" +"Ширина соединительных опор, которые соединяют модель со сгенерированной подложкой." -#: src/libslic3r/PrintConfig.cpp:3115 +#: src/libslic3r/PrintConfig.cpp:3147 msgid "Pad object connector penetration" -msgstr "" +msgstr "Глубина проникновения соединительного элемента в модель" -#: src/libslic3r/PrintConfig.cpp:3118 +#: src/libslic3r/PrintConfig.cpp:3150 msgid "How much should the tiny connectors penetrate into the model body." -msgstr "" +msgstr "Задаёт как глубоко соединительные элементы должны проникают в тело модели." -#: src/libslic3r/PrintConfig.cpp:3125 +#: src/libslic3r/PrintConfig.cpp:3157 msgid "Enable hollowing" -msgstr "" +msgstr "Создавать полость" -#: src/libslic3r/PrintConfig.cpp:3127 +#: src/libslic3r/PrintConfig.cpp:3159 msgid "Hollow out a model to have an empty interior" -msgstr "" +msgstr "Создание пустотелой модели." -#: src/libslic3r/PrintConfig.cpp:3132 +#: src/libslic3r/PrintConfig.cpp:3164 msgid "Wall thickness" -msgstr "" +msgstr "Толщина стенки" -#: src/libslic3r/PrintConfig.cpp:3134 +#: src/libslic3r/PrintConfig.cpp:3166 msgid "Minimum wall thickness of a hollowed model." -msgstr "" +msgstr "Минимальная толщина стенки полой модели." -#: src/libslic3r/PrintConfig.cpp:3142 +#: src/libslic3r/PrintConfig.cpp:3174 msgid "Accuracy" -msgstr "" +msgstr "Точность" -#: src/libslic3r/PrintConfig.cpp:3144 +#: src/libslic3r/PrintConfig.cpp:3176 msgid "" -"Performance vs accuracy of calculation. Lower values may produce unwanted " -"artifacts." +"Performance vs accuracy of calculation. Lower values may produce unwanted artifacts." msgstr "" +"Быстродействие расчёта против точности расчёта. \n" +"Низкие значения этого параметра могут привести к нежелательным артефактам." -#: src/libslic3r/PrintConfig.cpp:3154 +#: src/libslic3r/PrintConfig.cpp:3186 msgid "" -"Hollowing is done in two steps: first, an imaginary interior is calculated " -"deeper (offset plus the closing distance) in the object and then it's " -"inflated back to the specified offset. A greater closing distance makes the " -"interior more rounded. At zero, the interior will resemble the exterior the " -"most." +"Hollowing is done in two steps: first, an imaginary interior is calculated deeper " +"(offset plus the closing distance) in the object and then it's inflated back to the " +"specified offset. A greater closing distance makes the interior more rounded. At " +"zero, the interior will resemble the exterior the most." msgstr "" +"Полость в модели формуется в два этапа: сначала воображаемое внутреннее " +"пространство просчитывает глубину в объекте (смещение, плюс расстояние смыкания), а " +"затем раздувается обратно до указанного смещения. Большое значение расстояния " +"сшивки делает внутреннее пространство более округлым. При нулевом значении " +"внутреннее пространство будет больше всего напоминать наружную сторону модели." -#: src/libslic3r/PrintConfig.cpp:3567 +#: src/libslic3r/PrintConfig.cpp:3602 msgid "Export OBJ" msgstr "Экспорт в OBJ" -#: src/libslic3r/PrintConfig.cpp:3568 +#: src/libslic3r/PrintConfig.cpp:3603 msgid "Export the model(s) as OBJ." -msgstr "" +msgstr "Экспортировать модель(и) в формат OBJ." -#: src/libslic3r/PrintConfig.cpp:3579 +#: src/libslic3r/PrintConfig.cpp:3614 msgid "Export SLA" -msgstr "" +msgstr "Экспорт для SLA печати" -#: src/libslic3r/PrintConfig.cpp:3580 +#: src/libslic3r/PrintConfig.cpp:3615 msgid "Slice the model and export SLA printing layers as PNG." -msgstr "" +msgstr "Нарезать модель и экспортировать слои печати для SLA в формат PNG." -#: src/libslic3r/PrintConfig.cpp:3585 +#: src/libslic3r/PrintConfig.cpp:3620 msgid "Export 3MF" msgstr "Экспорт в 3MF" -#: src/libslic3r/PrintConfig.cpp:3586 +#: src/libslic3r/PrintConfig.cpp:3621 msgid "Export the model(s) as 3MF." -msgstr "Экспортировать модель(и) в 3MF." +msgstr "Экспортировать модель(и) в формат 3MF." -#: src/libslic3r/PrintConfig.cpp:3590 +#: src/libslic3r/PrintConfig.cpp:3625 msgid "Export AMF" msgstr "Экспорт в AMF" -#: src/libslic3r/PrintConfig.cpp:3591 +#: src/libslic3r/PrintConfig.cpp:3626 msgid "Export the model(s) as AMF." -msgstr "Экспортировать модель(и) в AMF." +msgstr "Экспортировать модель(и) в формат AMF." -#: src/libslic3r/PrintConfig.cpp:3595 +#: src/libslic3r/PrintConfig.cpp:3630 msgid "Export STL" msgstr "Экспорт в STL" -#: src/libslic3r/PrintConfig.cpp:3596 +#: src/libslic3r/PrintConfig.cpp:3631 msgid "Export the model(s) as STL." -msgstr "Экспортировать модель(и) в STL." +msgstr "Экспортировать модель(и) в формат STL." -#: src/libslic3r/PrintConfig.cpp:3601 +#: src/libslic3r/PrintConfig.cpp:3636 msgid "Slice the model and export toolpaths as G-code." -msgstr "Нарезать модель и экспортировать траектории в G-код." +msgstr "" +"Нарезать модель и экспортировать траекторию движения инструмента в G-код файл." -#: src/libslic3r/PrintConfig.cpp:3606 +#: src/libslic3r/PrintConfig.cpp:3641 msgid "G-code viewer" -msgstr "" +msgstr "Просмотрщик G-кода" -#: src/libslic3r/PrintConfig.cpp:3607 +#: src/libslic3r/PrintConfig.cpp:3642 msgid "Visualize an already sliced and saved G-code" -msgstr "" +msgstr "Визуализация уже нарезанного и сохраненного G-кода" -#: src/libslic3r/PrintConfig.cpp:3612 +#: src/libslic3r/PrintConfig.cpp:3647 msgid "Slice" msgstr "Нарезать" -#: src/libslic3r/PrintConfig.cpp:3613 +#: src/libslic3r/PrintConfig.cpp:3648 msgid "" -"Slice the model as FFF or SLA based on the printer_technology configuration " -"value." +"Slice the model as FFF or SLA based on the printer_technology configuration value." msgstr "" +"Нарезает модель в зависимости от типа печати (FFF или SLA) на основе значения " +"конфигурации printer_technology." -#: src/libslic3r/PrintConfig.cpp:3618 +#: src/libslic3r/PrintConfig.cpp:3653 msgid "Help" -msgstr "Справка" +msgstr "Помощь" -#: src/libslic3r/PrintConfig.cpp:3619 +#: src/libslic3r/PrintConfig.cpp:3654 msgid "Show this help." -msgstr "Показать эту справку." +msgstr "Показать помощь." -#: src/libslic3r/PrintConfig.cpp:3624 +#: src/libslic3r/PrintConfig.cpp:3659 msgid "Help (FFF options)" -msgstr "Справка (параметры для FFF)" +msgstr "Помощь (FFF настройки)" -#: src/libslic3r/PrintConfig.cpp:3625 +#: src/libslic3r/PrintConfig.cpp:3660 msgid "Show the full list of print/G-code configuration options." -msgstr "Показать полный список параметров настройки печати/G-кода." +msgstr "Показать полный список параметров конфигурации печати/G-кода." -#: src/libslic3r/PrintConfig.cpp:3629 +#: src/libslic3r/PrintConfig.cpp:3664 msgid "Help (SLA options)" -msgstr "Справка (параметры для SLA)" +msgstr "Помощь (SLA настройки)" -#: src/libslic3r/PrintConfig.cpp:3630 +#: src/libslic3r/PrintConfig.cpp:3665 msgid "Show the full list of SLA print configuration options." -msgstr "Показать полный список параметров настройки печати по технологии SLA." +msgstr "Показать полный список параметров конфигурации SLA печати." -#: src/libslic3r/PrintConfig.cpp:3634 +#: src/libslic3r/PrintConfig.cpp:3669 msgid "Output Model Info" -msgstr "Вывести информацию о модели" +msgstr "Информация о выходной модели" -#: src/libslic3r/PrintConfig.cpp:3635 +#: src/libslic3r/PrintConfig.cpp:3670 msgid "Write information about the model to the console." msgstr "Записать информацию о модели в консоль." -#: src/libslic3r/PrintConfig.cpp:3639 +#: src/libslic3r/PrintConfig.cpp:3674 msgid "Save config file" -msgstr "Сохранить файл настроек" +msgstr "Сохранить конфигурацию" -#: src/libslic3r/PrintConfig.cpp:3640 +#: src/libslic3r/PrintConfig.cpp:3675 msgid "Save configuration to the specified file." -msgstr "Сохранить настройки в указанный файл." +msgstr "Сохраните конфигурацию в указанный файл." -#: src/libslic3r/PrintConfig.cpp:3650 +#: src/libslic3r/PrintConfig.cpp:3685 msgid "Align XY" -msgstr "Выровнять XY" +msgstr "Выровнять по XY" -#: src/libslic3r/PrintConfig.cpp:3651 +#: src/libslic3r/PrintConfig.cpp:3686 msgid "Align the model to the given point." -msgstr "Выровнять модель в указанной точке." +msgstr "Выровнять модель по заданной точке." -#: src/libslic3r/PrintConfig.cpp:3656 +#: src/libslic3r/PrintConfig.cpp:3691 msgid "Cut model at the given Z." -msgstr "Разрезать модель на указанном Z." +msgstr "Разрезать модель по Z." -#: src/libslic3r/PrintConfig.cpp:3677 +#: src/libslic3r/PrintConfig.cpp:3712 msgid "Center" -msgstr "Центр" +msgstr "По центру" -#: src/libslic3r/PrintConfig.cpp:3678 +#: src/libslic3r/PrintConfig.cpp:3713 msgid "Center the print around the given center." -msgstr "Расположить печать вокруг указанного центра." +msgstr "Центрировать печать вокруг данного центра." -#: src/libslic3r/PrintConfig.cpp:3682 +#: src/libslic3r/PrintConfig.cpp:3717 msgid "Don't arrange" msgstr "Не расставлять" -#: src/libslic3r/PrintConfig.cpp:3683 +#: src/libslic3r/PrintConfig.cpp:3718 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." msgstr "" +"Не переставлять данные модели перед объединением и сохранять их исходные XY " +"координаты." -#: src/libslic3r/PrintConfig.cpp:3686 +#: src/libslic3r/PrintConfig.cpp:3721 msgid "Duplicate" -msgstr "" +msgstr "Дубликат" -#: src/libslic3r/PrintConfig.cpp:3687 +#: src/libslic3r/PrintConfig.cpp:3722 msgid "Multiply copies by this factor." -msgstr "" +msgstr "Увеличить количество копий на этот коэффициент." -#: src/libslic3r/PrintConfig.cpp:3691 +#: src/libslic3r/PrintConfig.cpp:3726 msgid "Duplicate by grid" -msgstr "" +msgstr "Дублировать по сетке" -#: src/libslic3r/PrintConfig.cpp:3692 +#: src/libslic3r/PrintConfig.cpp:3727 msgid "Multiply copies by creating a grid." -msgstr "" +msgstr "Увеличить количество копий путём создания сетки." -#: src/libslic3r/PrintConfig.cpp:3696 +#: src/libslic3r/PrintConfig.cpp:3731 msgid "" -"Arrange the supplied models in a plate and merge them in a single model in " -"order to perform actions once." +"Arrange the supplied models in a plate and merge them in a single model in order to " +"perform actions once." msgstr "" +"Расставьте представленные модели на столе и объединить их в одну модель, чтобы " +"выполнить действия один раз." -#: src/libslic3r/PrintConfig.cpp:3701 +#: src/libslic3r/PrintConfig.cpp:3736 msgid "" -"Try to repair any non-manifold meshes (this option is implicitly added " -"whenever we need to slice the model to perform the requested action)." +"Try to repair any non-manifold meshes (this option is implicitly added whenever we " +"need to slice the model to perform the requested action)." msgstr "" +"Попробуйте отремонтировать любые нецелостные сетки (эта опция добавляется всякий " +"раз, когда нужно нарезать модель для выполнения запрошенного действия)." -#: src/libslic3r/PrintConfig.cpp:3705 +#: src/libslic3r/PrintConfig.cpp:3740 msgid "Rotation angle around the Z axis in degrees." -msgstr "" +msgstr "Угол поворота вокруг оси Z в градусах." -#: src/libslic3r/PrintConfig.cpp:3709 +#: src/libslic3r/PrintConfig.cpp:3744 msgid "Rotate around X" -msgstr "Повернуть вокруг X" +msgstr "Поворот вокруг оси X" -#: src/libslic3r/PrintConfig.cpp:3710 +#: src/libslic3r/PrintConfig.cpp:3745 msgid "Rotation angle around the X axis in degrees." -msgstr "Поворот вокруг оси X в градусах." +msgstr "Угол поворота вокруг оси X в градусах." -#: src/libslic3r/PrintConfig.cpp:3714 +#: src/libslic3r/PrintConfig.cpp:3749 msgid "Rotate around Y" -msgstr "Повернуть вокруг Y" +msgstr "Поворот вокруг оси Y" -#: src/libslic3r/PrintConfig.cpp:3715 +#: src/libslic3r/PrintConfig.cpp:3750 msgid "Rotation angle around the Y axis in degrees." -msgstr "Поворот вокруг оси Y в градусах." +msgstr "Угол поворота вокруг оси Y в градусах." -#: src/libslic3r/PrintConfig.cpp:3720 +#: src/libslic3r/PrintConfig.cpp:3755 msgid "Scaling factor or percentage." -msgstr "" +msgstr "Коэффициент масштабирования или процент." -#: src/libslic3r/PrintConfig.cpp:3725 +#: src/libslic3r/PrintConfig.cpp:3760 msgid "" -"Detect unconnected parts in the given model(s) and split them into separate " -"objects." +"Detect unconnected parts in the given model(s) and split them into separate objects." msgstr "" +"Обнаружение несвязанных частей в выбранных моделях и разделение их на отдельные " +"объекты." -#: src/libslic3r/PrintConfig.cpp:3728 +#: src/libslic3r/PrintConfig.cpp:3763 msgid "Scale to Fit" -msgstr "Масштабировать по размеру" +msgstr "Отмасштабировать под область печати" -#: src/libslic3r/PrintConfig.cpp:3729 +#: src/libslic3r/PrintConfig.cpp:3764 msgid "Scale to fit the given volume." -msgstr "" +msgstr "Масштабировать в соответствии с заданным объёмом." -#: src/libslic3r/PrintConfig.cpp:3738 +#: src/libslic3r/PrintConfig.cpp:3773 msgid "Ignore non-existent config files" -msgstr "" +msgstr "Игнорировать несуществующие конфигурационные файлы" -#: src/libslic3r/PrintConfig.cpp:3739 +#: src/libslic3r/PrintConfig.cpp:3774 msgid "Do not fail if a file supplied to --load does not exist." -msgstr "" +msgstr "Не терпеть неудачу, если файла, предоставленного для --load, не существует." -#: src/libslic3r/PrintConfig.cpp:3742 +#: src/libslic3r/PrintConfig.cpp:3777 msgid "Load config file" -msgstr "Загрузить конфигурационный файл" +msgstr "Загрузить конфигурацию" -#: src/libslic3r/PrintConfig.cpp:3743 +#: src/libslic3r/PrintConfig.cpp:3778 msgid "" -"Load configuration from the specified file. It can be used more than once to " -"load options from multiple files." +"Load configuration from the specified file. It can be used more than once to load " +"options from multiple files." msgstr "" +"Загрузить конфигурацию из указанного файла. Его можно использовать более одного " +"раза для загрузки параметров из нескольких файлов." -#: src/libslic3r/PrintConfig.cpp:3746 +#: src/libslic3r/PrintConfig.cpp:3781 msgid "Output File" msgstr "Выходной файл" -#: src/libslic3r/PrintConfig.cpp:3747 +#: src/libslic3r/PrintConfig.cpp:3782 msgid "" -"The file where the output will be written (if not specified, it will be " -"based on the input file)." +"The file where the output will be written (if not specified, it will be based on " +"the input file)." msgstr "" -"Файл, в который будет записан результат (если не указан, то имя будет " -"основано на имени входного файла)." +"Файл, в который будут записываться выходные данные (если он не указан, то будет " +"основан на входном файле)." -#: src/libslic3r/PrintConfig.cpp:3752 +#: src/libslic3r/PrintConfig.cpp:3786 +msgid "Single instance mode" +msgstr "Одни экземпляр программы" + +#: src/libslic3r/PrintConfig.cpp:3787 msgid "" -"If enabled, the command line arguments are sent to an existing instance of " -"GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides " -"the \"single_instance\" configuration value from application preferences." +"If enabled, the command line arguments are sent to an existing instance of GUI " +"PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides the " +"\"single_instance\" configuration value from application preferences." msgstr "" +"Если включено, аргументы командной строки посылаются в существующий экземпляр GUI " +"PrusaSlicer, либо активируется существующее окно PrusaSlicer. Переопределяет " +"значение конфигурации \"single_instance\" из настроек приложения." -#: src/libslic3r/PrintConfig.cpp:3763 +#: src/libslic3r/PrintConfig.cpp:3798 msgid "Data directory" -msgstr "Каталог данных" +msgstr "Папка конфигурации пользователя" -#: src/libslic3r/PrintConfig.cpp:3764 +#: src/libslic3r/PrintConfig.cpp:3799 msgid "" -"Load and store settings at the given directory. This is useful for " -"maintaining different profiles or including configurations from a network " -"storage." +"Load and store settings at the given directory. This is useful for maintaining " +"different profiles or including configurations from a network storage." msgstr "" -"Загрузка и сохранение настроек в указанный каталог. Полезно для хранения " -"различных профилей или включения настроек из сетевого хранилища." +"Загрузите и сохраните настройки в данном каталоге. Это полезно для сохранения " +"различных профилей или конфигураций из сетевого хранилища." -#: src/libslic3r/PrintConfig.cpp:3767 +#: src/libslic3r/PrintConfig.cpp:3802 msgid "Logging level" -msgstr "Уровень протоколирования" +msgstr "Уровень ведения журнала" -#: src/libslic3r/PrintConfig.cpp:3768 +#: src/libslic3r/PrintConfig.cpp:3803 msgid "" -"Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" -"trace\n" +"Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:trace\n" "For example. loglevel=2 logs fatal, error and warning level messages." msgstr "" +"Задаёт параметр чувствительности записи событий в журнал. \n" +"0: Неустранимая ошибка, 1: Ошибка, 2: Предупреждение, 3: Информация, 4: Отладка, 5: " +"Трассировка\n" +"Например, loglevel=2 регистрирует неустранимые ошибки, ошибки и предупреждения." -#: src/libslic3r/PrintConfig.cpp:3774 +#: src/libslic3r/PrintConfig.cpp:3809 msgid "Render with a software renderer" -msgstr "" +msgstr "Визуализация с помощью программного рендеринга" -#: src/libslic3r/PrintConfig.cpp:3775 +#: src/libslic3r/PrintConfig.cpp:3810 msgid "" -"Render with a software renderer. The bundled MESA software renderer is " -"loaded instead of the default OpenGL driver." +"Render with a software renderer. The bundled MESA software renderer is loaded " +"instead of the default OpenGL driver." msgstr "" +"Вместо стандартного драйвера OpenGL будет использоваться программный рендеринг MESA." #: src/libslic3r/Zipper.cpp:27 msgid "Error with zip archive" -msgstr "" +msgstr "Ошибка с zip-архивом" -#: src/libslic3r/PrintObject.cpp:113 +#: src/libslic3r/PrintObject.cpp:112 msgid "Processing triangulated mesh" -msgstr "Обрабатывает треугольная сетка" +msgstr "Обработка триангулированной сетки" #: src/libslic3r/PrintObject.cpp:157 msgid "Generating perimeters" -msgstr "Генерируются периметры" +msgstr "Генерация периметров" #: src/libslic3r/PrintObject.cpp:260 msgid "Preparing infill" -msgstr "Подготовка заполнения" +msgstr "Подготовка к заполнению" #: src/libslic3r/PrintObject.cpp:421 msgid "Generating support material" -msgstr "Генерируется материал поддержки" - -#~ msgid "Jump to height %s or Set extruder sequence for the entire print" -#~ msgstr "" -#~ "Перейти к высоте %s или установить последовательность экструдеров для " -#~ "всей печати" - -#~ msgid "Default print color" -#~ msgstr "Цвет печати по умолчанию" - -#~ msgid "Pause print or custom G-code" -#~ msgstr "Пауза печати или пользовательский G-код" - -#~ msgid "%.2f - %.2f mm" -#~ msgstr "%.2f - %.2f мм" - -#~ msgid "Legend" -#~ msgstr "Обозначения" - -#~ msgid "" -#~ "This is the acceleration your printer will use for perimeters. A high " -#~ "value like 9000 usually gives good results if your hardware is up to the " -#~ "job. Set zero to disable acceleration control for perimeters." -#~ msgstr "" -#~ "Ускорение, которое принтер будет использовать для печати внутренних " -#~ "периметров. Высокое значение, такое как 9000, обычно даёт хороший " -#~ "результат, если ваше оборудование справляется с таким значением. " -#~ "Установите 0, чтобы отключить управление ускорением для внутренних " -#~ "периметров." - -#~ msgid "" -#~ "Copying of the temporary G-code to the output G-code failed. Maybe the SD " -#~ "card is write locked?" -#~ msgstr "" -#~ "Не удалось скопировать временный G-код в конечный G-код. Возможно SD-" -#~ "карта защищена от записи?" - -#~ msgid "Extruder and Bed Temperatures" -#~ msgstr "Температуры экструдера и стола" - -#~ msgid "An object outside the print area was detected" -#~ msgstr "Обнаружен объект, выходящий за пределы области печати" - -#~ msgid "A toolpath outside the print area was detected" -#~ msgstr "Обнаружена траектория, выходящая за пределы области печати" - -#~ msgid "Some objects are not visible" -#~ msgstr "Некоторые объекты невидимы" - -#~ msgid "FDM Support Editing" -#~ msgstr "Правка поддержек FDM" - -#~ msgid "The presets on the following tabs were modified" -#~ msgstr "Изменены настройки на следующих вкладках" - -#~ msgid "Discard changes and continue anyway?" -#~ msgstr "Отбросить изменения и продолжить?" - -#~ msgid "Unsaved Presets" -#~ msgstr "Несохранённые настройки" - -#~ msgid "Unretractions" -#~ msgstr "Подача (выдавливание)" - -#~ msgid "" -#~ "Scale selection to fit print volume\n" -#~ "in Gizmo scale" -#~ msgstr "Масштабировать выбранную модель по осям XYZ" - -#~ msgid "Show/Hide Legend" -#~ msgstr "Показать/скрыть подсказку" - -#~ msgid "" -#~ " - Remember to check for updates at http://github.com/prusa3d/PrusaSlicer/" -#~ "releases" -#~ msgstr "" -#~ " - Не забывайте проверять обновления на https://github.com/prusa3d/" -#~ "PrusaSlicer/" - -#~ msgid "Find option" -#~ msgstr "Параметры поиска" - -#~ msgid "Show &slope" -#~ msgstr "Показать метки" - -#~ msgid "&Options" -#~ msgstr "Параметры" - -#~ msgid " was successfully sliced." -#~ msgstr " успешно нарезан." - -#~ msgid "Expand right panel" -#~ msgstr "Раскрыть правую панель" - -#~ msgid "Collapse right panel" -#~ msgstr "Скрыть правую панель" - -#~ msgid "Single Instance" -#~ msgstr "Один экземпляр" - -#~ msgid "" -#~ "If this is enabled, when staring PrusaSlicer and another instance of same " -#~ "PrusaSlicer is running, that instance will be reactivated instead." -#~ msgstr "" -#~ "Если включено, то при запуске проверяется нет ли уже работающего " -#~ "PrusaSlicer, и при наличии открывается уже запущенный." - -#~ msgid "Show the button for the collapse sidebar" -#~ msgstr "Показывать кнопку скрытия боковой панели." - -#~ msgid "Add a new printer" -#~ msgstr "Добавить новый принтер" - -#~ msgid "USB/Serial connection" -#~ msgstr "USB/Последовательный порт" - -#~ msgid "Serial port" -#~ msgstr "Последовательный порт" - -#~ msgid "Rescan serial ports" -#~ msgstr "Пересканировать последовательные порты" - -#~ msgid "Connection to printer works correctly." -#~ msgstr "Подключение к принтеру установлено." - -#~ msgid "Connection failed." -#~ msgstr "Сбой подключения." - -#~ msgid "Default preset (%s)" -#~ msgstr "Профиль по умолчанию (%s)" - -#~ msgid "Preset (%s)" -#~ msgstr "Профиль (%s)" - -#~ msgid "has the following unsaved changes:" -#~ msgstr "имеет следующие несохранённые изменения:" - -#~ msgid "is not compatible with printer" -#~ msgstr "не совместим с принтером" - -#~ msgid "is not compatible with print profile" -#~ msgstr "не совместим с профилем принтера" - -#~ msgid "and it has the following unsaved changes:" -#~ msgstr "и имеет следующие несохранённые изменения:" - -#~ msgid "Unsaved Changes" -#~ msgstr "Несохранённые изменения" - -#~ msgid "Exporting model..." -#~ msgstr "Экспортируется модель…" - -#~ msgid "" -#~ "The Wipe Tower is currently only supported for the Marlin, RepRap/" -#~ "Sprinter and Repetier G-code flavors." -#~ msgstr "" -#~ "В настоящее время режим черновой башни поддерживается только для Marlin и " -#~ "RepRap/Sprinter типов G-кода." - -#~ msgid "First layer extruder temperature" -#~ msgstr "Объёмный расход первого слоя" - -#~ msgid "" -#~ "Extruder temperature for first layer. If you want to control temperature " -#~ "manually during print, set this to zero to disable temperature control " -#~ "commands in the output file." -#~ msgstr "" -#~ "Температура экструдера при печати первого слоя. Если во время печати " -#~ "хотите контролировать температуру вручную, установите 0 для отключить " -#~ "команд управления температурой в выходном файле." - -#~ msgid "Distance between ironing lins" -#~ msgstr "Расстояние между копиями" - -#~ msgid "Ironing speed" -#~ msgstr "Скорость разглаживания" - -#~ msgid "USB/serial port for printer connection." -#~ msgstr "Подключение к принтеру через USB/Последовательный порт." - -#~ msgid "Serial port speed" -#~ msgstr "Скорость последовательного порта" - -#~ msgid "Speed (baud) of USB/serial port for printer connection." -#~ msgstr "" -#~ "Скорость в бодах при подключении к принтеру через USB/Последовательный " -#~ "порт." - -#~ msgid "" -#~ "Extruder temperature for layers after the first one. Set this to zero to " -#~ "disable temperature control commands in the output." -#~ msgstr "" -#~ "Температура экструдера для слоёв после первого. Установите 0 для " -#~ "отключения команд контроля температуры на выходе." - -#~ msgid "Extruder temperature" -#~ msgstr "Температуры экструдера и стола" - -#~ msgid "Support head front diameter" -#~ msgstr "Поддержка тихого режима" - -#~ msgid "Support head penetration" -#~ msgstr "Генератор поддержек" - -#~ msgid "Support head width" -#~ msgstr "Генератор поддержек" - -#~ msgid "Support pillar diameter" -#~ msgstr "Поддержка тихого режима" - -#~ msgid "Support pillar connection mode" -#~ msgstr "Поддержка тихого режима" - -#~ msgid "Layer height:" -#~ msgstr "Высота слоя:" - -#~ msgid "Remove device" -#~ msgstr "Удалить устройство" - -#~ msgid "" -#~ "Unmounting successful. The device %s(%s) can now be safely removed from " -#~ "the computer." -#~ msgstr "" -#~ "Размонтирование выполнено. Теперь устройство %s(%s) можно отключить от " -#~ "компьютера." - -#~ msgid "Processing input file %s" -#~ msgstr "Обрабатывается входной файл %s" - -#~ msgid "Export failed" -#~ msgstr "Не удалось выполнить экспорт" - -#~ msgid "Indexing hollowed object" -#~ msgstr "Ниже объекта" - -#~ msgid "Hollowing cancelled." -#~ msgstr "Прошивка отменена." - -#~ msgid "Hollowing done." -#~ msgstr "Нарезка завершена" - -#~ msgid "Hollowing failed." -#~ msgstr "Сбой подключения." - -#~ msgid "" -#~ "To except of redundant tool manipulation, \n" -#~ "Color change(s) for unused extruder(s) was(were) deleted" -#~ msgstr "" -#~ "Для исключения ненужной работы с инструментом\n" -#~ "была удалена смена цвета в неиспользуемых экструдерах" - -#~ msgid "Position (mm)" -#~ msgstr "Х позиция башни" - -#~ msgid "Displacement (mm)" -#~ msgstr "Использовано прутка в мм³" - -#~ msgid "Rotation (deg)" -#~ msgstr "Длина ретракта" - -#~ msgid "Scale (%)" -#~ msgstr "Масштаб" - -#~ msgid "Change Application &Language" -#~ msgstr "Изменить язык приложения" - -#~ msgid "Select extruder number for selected objects and/or parts" -#~ msgstr "Разделить выбранную модель на отдельные части" - -#~ msgid "Main Shortcuts" -#~ msgstr "Основные команды" - -#~ msgid "Select All objects" -#~ msgstr "Выбрать все объекты" - -#~ msgid "Delete All" -#~ msgstr "Удалить всё" - - -#~ msgid "Zoom to selected object" -#~ msgstr "Удалить выбранную модель" - -#~ msgid "Plater Shortcuts" -#~ msgstr "Команды работы на вкладке плиты" - -#~ msgid "The selected project is no more available" -#~ msgstr "Выбранный проект больше недоступен" +msgstr "Генерация поддержек" -#~ msgid "(default)" -#~ msgstr "(по умолчанию)" +msgid "1 mm" +msgstr "1 мм" -#~ msgid "Welcome to the Slic3r %s" -#~ msgstr "Приветствуем в Slic3r %s" +msgid "2 mm" +msgstr "2 мм" -#~ msgid "Other vendors" -#~ msgstr "Другие производители" +msgid "5 mm" +msgstr "5 мм" -#~ msgid "Detected object outside print volume" -#~ msgstr "Модель не помещается в печатную область принтера" +msgid "10 mm" +msgstr "10 мм" -#~ msgid "Array of language names and identifiers should have the same size." -#~ msgstr "Список языков и идентификаторов должен быть одного размера." +msgid "Enable rotations" +msgstr "Разрешить вращение" -#~ msgid "Application will be restarted" -#~ msgstr "Приложение будет перезапущено." - -#~ msgid "You have unsaved changes " -#~ msgstr "У вас есть несохраненные изменения в профиле: " - -#~ msgid "Attempt to free unreferenced scalar" -#~ msgstr "Попытка освободить неопределённый скаляр" - -#~ msgid "The " -#~ msgstr "Шаблон заполнения " - -#~ msgid "Temperature " -#~ msgstr "Температура " - -#~ msgid "Values in this column are for Full Power mode" -#~ msgstr "Значения в этом столбце относятся к режиму полной мощности" - -#~ msgid "Full Power" -#~ msgstr "Полная мощность" - -#~ msgid "Silent" -#~ msgstr "Тихий режим" - -#~ msgid "Default " -#~ msgstr "По умолчанию " - -#~ msgid " preset\n" -#~ msgstr " шаблон\n" - -#~ msgid "" -#~ "\n" -#~ "\n" -#~ "Discard changes and continue anyway?" -#~ msgstr "" -#~ "\n" -#~ "\n" -#~ "Отменить изменения и продолжить в любом случае?" - -#~ msgid " the selected preset?" -#~ msgstr " выбранный профиль?" - -#~ msgid " as:" -#~ msgstr " как:" - -#~ msgid "%3.2f mm³/s" -#~ msgstr "%3.2f мм³/с" - -#~ msgid "Disable USB/serial connection" -#~ msgstr "Отключить последовательный порт/USB" - -#~ msgid "" -#~ "Disable communication with the printer over a serial / USB cable. This " -#~ "simplifies the user interface in case the printer is never attached to " -#~ "the computer." -#~ msgstr "" -#~ "Отключить связь с принтером через последовательный порт / USB кабель. " -#~ "Опция упрощает пользовательский интерфейс в случае, если принтер не будет " -#~ "подключаться к компьютеру." - -#~ msgid "Use legacy OpenGL 1.1 rendering" -#~ msgstr "Использовать устаревшую версию OpenGL 1.1" - -#~ msgid "" -#~ "If you have rendering issues caused by a buggy OpenGL 2.0 driver, you may " -#~ "try to check this checkbox. This will disable the layer height editing " -#~ "and anti aliasing, so it is likely better to upgrade your graphics driver." -#~ msgstr "" -#~ "Если у вас возникли проблемы с отрисовкой в программе, вызванные " -#~ "неисправным драйвером OpenGL 2.0, вы можете попробовать установить этот " -#~ "флажок. Это отключит функцию \"Переменная высота слоёв\" и сглаживание, " -#~ "поэтому вам всё же лучше обновить графический драйвер." - -#~ msgid "To download, follow the link below." -#~ msgstr "Чтобы скачать, перейдите по ссылке ниже." - -#~ msgid "Exit Slic3r" -#~ msgstr "Выйти из Slic3r" - -#~ msgid "Sending G-code file to the OctoPrint server..." -#~ msgstr "Отправка файла G-кода на сервер OctoPrint..." - -#~ msgid "" -#~ "All extruders must have the same diameter for single extruder " -#~ "multimaterial printer." -#~ msgstr "" -#~ "Все экструдеры в одноэкструдерном мультиматериальном принтере должны " -#~ "иметь сопло одинакового диаметра." - -#~ msgid "first_layer_height" -#~ msgstr "first_layer_height" - -#~ msgid "mm or % (leave 0 for default)" -#~ msgstr "мм или % (по умолчанию 0)" - -#~ msgid "mm or % (leave 0 for auto)" -#~ msgstr "мм или % (0 для автонастройки)" - -#~ msgid "Set silent mode for the G-code flavor" -#~ msgstr "Тихий режим для выбранного G-кода." - -#~ msgid "Maximum feedrate %1%" -#~ msgstr "Максимальная скорость подачи %1%" - -#~ msgid "Maximum acceleration %1%" -#~ msgstr "Максимальное ускорение %1%" - -#~ msgid "API Key" -#~ msgstr "API ключ" - -#~ msgid "" -#~ "This custom code is inserted right before every extruder change. Note " -#~ "that you can use placeholder variables for all Slic3r settings as well as " -#~ "[previous_extruder] and [next_extruder]." -#~ msgstr "" -#~ "Этот пользовательский код вставляется перед каждой сменой экструдера. " -#~ "Обратите внимание, что вы можете использовать шаблонные переменные для " -#~ "всех параметров Slic3r, в том числе [previous_extruder] и [next_extruder] " -#~ "(предыдущий_экструдер и следующий_экструдер)" - -#~ msgid "degrees" -#~ msgstr "градусы" - -#~ msgid "Purging into infill" -#~ msgstr "Прочистка в заполнение" - -#~ msgid "Version " -#~ msgstr "Версия " - -#~ msgid "Controller" -#~ msgstr "Управления принтером" - -#~ msgid "&Load Config…\tCtrl+L" -#~ msgstr "&Загрузить конфигурацию…\tCtrl+L" - -#~ msgid "&Export Config…\tCtrl+E" -#~ msgstr "&Сохранить текущую конфигурацию…\tCtrl+E" - -#~ msgid "Q&uick Slice…\tCtrl+U" -#~ msgstr "Быстрая &нарезка…\tCtrl+U" - -#~ msgid "&Repeat Last Quick Slice\tCtrl+Shift+U" -#~ msgstr "&Повтор последней быстрой нарезки\tCtrl+Shift+U" - -#~ msgid "Slice to SV&G…\tCtrl+G" -#~ msgstr "Нарезать в SV&G…\tCtrl+G" - -#~ msgid "Slice file to a multi-layer SVG" -#~ msgstr "Нарезать в SVG" - -#~ msgid "Export current plate as 3MF" -#~ msgstr "Экспортировать текущие модели со стола в 3MF" - -#~ msgid "Select &Controller Tab\tCtrl+T" -#~ msgstr "Вкладка управления принтером\tCtrl+T" - -#~ msgid "Show the printer controller" -#~ msgstr "Показать управление принтером" - -#~ msgid "Prusa Edition Releases" -#~ msgstr "Сайт Prusa Edition" - -#~ msgid "Slic3r &Manual" -#~ msgstr "Онлайн руководство по Slic3r" - -#~ msgid "Open the Slic3r manual in your browser" -#~ msgstr "Открыть руководство по Slic3r" - -#~ msgid "Report an issue on the Slic3r Prusa Edition" -#~ msgstr "Сообщить о проблеме в Slic3r Prusa Edition" - -#~ msgid "2D" -#~ msgstr "2D" - -#~ msgid "Add…" -#~ msgstr "Добавить…" - -#~ msgid "Fewer" -#~ msgstr "Меньше" - -#~ msgid "45° ccw" -#~ msgstr "45° влево" - -#~ msgid "45° cw" -#~ msgstr "45° вправо" - -#~ msgid "Scale…" -#~ msgstr "Масштабирование..." - -#~ msgid "Cut…" -#~ msgstr "Разрезать…" - -#~ msgid "Settings…" -#~ msgstr "Настройки…" - -#~ msgid "Copies" -#~ msgstr "Копий" - -#~ msgid "Export G-code…" -#~ msgstr "Экспорт G-кода…" - -#~ msgid "Print…" -#~ msgstr "Печать…" - -#~ msgid "Enter the number of copies of the selected object:" -#~ msgstr "Введите нужное количество копий выбранной модели:" - -#~ msgid "" -#~ "\n" -#~ "Non-positive value." -#~ msgstr "" -#~ "\n" -#~ "Не положительное значение." - -#~ msgid "" -#~ "\n" -#~ "Not a numeric value." -#~ msgstr "" -#~ "\n" -#~ "Не числовое значение." - -#~ msgid "Slic3r Error" -#~ msgstr "Ошибка Slic3r" - -#~ msgid "Enter the rotation angle:" -#~ msgstr "Введите угол поворота:" - -#~ msgid "Enter the new size for the selected object (print bed: %smm):" -#~ msgstr "Введите новый размер для выбранной модели (стол: %s мм):" - -#~ msgid "Scale along " -#~ msgstr "Масштаб по оси " - -#~ msgid "Enter the scale % for the selected object:" -#~ msgstr "Введите нужный масштаб в % для выбранной модели:" - -#~ msgid "Enter the new max size for the selected object:" -#~ msgstr "Введите новый максимальный размер для выбранной модели:" - -#~ msgid "Slicing cancelled" -#~ msgstr "Нарезка отменена" - -#~ msgid "File added to print queue" -#~ msgstr "Файл добавлен в очередь печати" - -#~ msgid "OctoPrint upload finished." -#~ msgstr "Отправка на сервер OctoPrint выполнена." - -#~ msgid "Estimated printing time (silent mode)" -#~ msgstr "Расчётное время печати (тихий режим)" - -#~ msgid "Rotate 45° clockwise" -#~ msgstr "Поворот на 45° по часовой стрелке" - -#~ msgid "Rotate the selected object by 45° clockwise" -#~ msgstr "Поворот выбранной модели на 45° по часовой стрелке" - -#~ msgid "Rotate 45° counter-clockwise" -#~ msgstr "Поворот на 45° против часовой стрелки" - -#~ msgid "Rotate the selected object by 45° counter-clockwise" -#~ msgstr "Поворот выбранной модели на 45° против часовой стрелки" - -#~ msgid "Rotate the selected object by an arbitrary angle" -#~ msgstr "Поворот выбранной модели на произвольный угол" - -#~ msgid "Around X axis…" -#~ msgstr "Вокруг оси X..." - -#~ msgid "Rotate the selected object by an arbitrary angle around X axis" -#~ msgstr "Поворот выбранной модели на произвольный угол вокруг оси X" - -#~ msgid "Around Y axis…" -#~ msgstr "Вокруг оси Y..." - -#~ msgid "Rotate the selected object by an arbitrary angle around Y axis" -#~ msgstr "Поворот выбранной модели на произвольный угол вокруг оси Y" - -#~ msgid "Around Z axis…" -#~ msgstr "Вокруг оси Z..." - -#~ msgid "Rotate the selected object by an arbitrary angle around Z axis" -#~ msgstr "Поворот выбранной модели на произвольный угол вокруг оси Z" +msgid "Gap size" +msgstr "Зазор между моделями" -#~ msgid "Scale the selected object along a single axis" -#~ msgstr "Масштабирование выбранной модели вдоль одной оси" +msgid "Jump to height %s or Set ruler mode" +msgstr "Перейти к заданной высоте %s или задать режимы линейки" -#~ msgid "Uniformly…" -#~ msgstr "Одинаково..." +msgid "You will not be asked about it again on label hovering." +msgstr "Вас больше не будут спрашивать об этом при нажатии на параметры." -#~ msgid "Scale the selected object along the X axis" -#~ msgstr "Масштабировать выбранную модель вдоль оси Х" +msgid "Should we suppress to use hyperlinks in PrusaSlicer?" +msgstr "Хотите запретить использование гиперссылок в PrusaSlicer?" -#~ msgid "Scale the selected object along the Y axis" -#~ msgstr "Масштабировать выбранную модель вдоль оси Y" +msgid "time" +msgstr "Время" -#~ msgid "Scale the selected object along the Z axis" -#~ msgstr "Масштабировать выбранную модель вдоль оси Z" +msgid "PrusaSlicer: Open hyperlink" +msgstr "PrusaSlicer: открытие гиперссылки" -#~ msgid "Open the 3D cutting tool" -#~ msgstr "Открыть режущий инструмент" +msgid "Should we open this hyperlink in your default browser?" +msgstr "Открыть эту гиперссылку в браузере по умолчанию?" -#~ msgid "Open the object editor dialog" -#~ msgstr "Открыть диалоговое окно редактора модели" +msgid "During the other layers, fan" +msgstr "Во время печати других слоёв, вентилятор" -#~ msgid "Export object as STL…" -#~ msgstr "Экспорт модели в STL..." +msgid "Fan speed will be ramped from zero at layer %1% to %2%%% at layer %3%" +msgstr "Скорость вентилятора будет увеличена с нуля на %1% слое до %2%%% на %3% слое." -#~ msgid "" -#~ "Fix the model by sending it to a Netfabb cloud service through Windows 10 " -#~ "API" -#~ msgstr "" -#~ "Исправить модель, отправив её в облачную службу Netfabb через API Windows " -#~ "10" +msgid "Select a file" +msgstr "Выберите файл" diff --git a/resources/localization/uk/PrusaSlicer.mo b/resources/localization/uk/PrusaSlicer.mo index aae82889f3d..66b5e0be3e9 100644 Binary files a/resources/localization/uk/PrusaSlicer.mo and b/resources/localization/uk/PrusaSlicer.mo differ diff --git a/resources/localization/uk/PrusaSlicer_uk.po b/resources/localization/uk/PrusaSlicer_uk.po index 42b067361e2..fefe52eb52b 100644 --- a/resources/localization/uk/PrusaSlicer_uk.po +++ b/resources/localization/uk/PrusaSlicer_uk.po @@ -2,95 +2,234 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-04-09 14:34+0200\n" -"PO-Revision-Date: 2019-04-09 15:18+0200\n" +"POT-Creation-Date: 2020-12-18 13:59+0100\n" +"PO-Revision-Date: 2021-02-03 17:15+0100\n" "Last-Translator: Oleksandra Iushchenko \n" "Language-Team: \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.8\n" +"X-Generator: Poedit 2.4.2\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: src/slic3r/GUI/AboutDialog.cpp:35 -msgid "About Slic3r" -msgstr "Про Slic3r" +#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:299 +msgid "Portions copyright" +msgstr "Використані розробки" -#: src/slic3r/GUI/AboutDialog.cpp:64 src/slic3r/GUI/MainFrame.cpp:52 +#: src/slic3r/GUI/AboutDialog.cpp:135 src/slic3r/GUI/AboutDialog.cpp:263 +msgid "Copyright" +msgstr "Копірайт" + +#. TRN "Slic3r _is licensed under the_ License" +#: src/slic3r/GUI/AboutDialog.cpp:137 +msgid "" +"License agreements of all following programs (libraries) are part of " +"application license agreement" +msgstr "" +"Ліцензійні угоди всіх наступних програм (бібліотек) є частиною ліцензійної " +"угоди програми" + +#: src/slic3r/GUI/AboutDialog.cpp:206 +#, c-format +msgid "About %s" +msgstr "О %s" + +#: src/slic3r/GUI/AboutDialog.cpp:238 src/slic3r/GUI/AboutDialog.cpp:361 +#: src/slic3r/GUI/GUI_App.cpp:235 src/slic3r/GUI/MainFrame.cpp:151 msgid "Version" msgstr "Версія" -#: src/slic3r/GUI/BedShapeDialog.cpp:43 -msgid "Shape" -msgstr "Вигляд (Форма)" +#. TRN "Slic3r _is licensed under the_ License" +#: src/slic3r/GUI/AboutDialog.cpp:265 src/slic3r/GUI/GUI_App.cpp:240 +msgid "is licensed under the" +msgstr "ліцензовано згідно" -#: src/slic3r/GUI/BedShapeDialog.cpp:51 -msgid "Rectangular" -msgstr "Прямокутний" +#: src/slic3r/GUI/AboutDialog.cpp:266 src/slic3r/GUI/GUI_App.cpp:240 +msgid "GNU Affero General Public License, version 3" +msgstr "Загальна публічна ліцензія GNU Affero, версія 3" + +#: src/slic3r/GUI/AboutDialog.cpp:267 +msgid "" +"PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " +"community." +msgstr "" +"PrusaSlicer заснований на Slic3r від Alessandro Ranellucci та спільноти " +"RepRap." + +#: src/slic3r/GUI/AboutDialog.cpp:268 +msgid "" +"Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " +"Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " +"numerous others." +msgstr "" +"Розробки від Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr " +"Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik та багатьох " +"інших." + +#: src/slic3r/GUI/AboutDialog.cpp:304 +msgid "Copy Version Info" +msgstr "Скопіювати інформацію про версію" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:78 +#, c-format +msgid "" +"%s has encountered an error. It was likely caused by running out of memory. " +"If you are sure you have enough RAM on your system, this may also be a bug " +"and we would be glad if you reported it." +msgstr "" +"%s виявив помилку. Ймовірно, це було пов’язано з закінченням пам’яті. Якщо " +"ви впевнені, що у вашій системі достатньо оперативної пам'яті, це також може " +"бути помилкою, і ми будемо раді, якщо ви нам про це повідомите." + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:163 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:183 +msgid "Unknown error occured during exporting G-code." +msgstr "Під час експорту G-коду сталася невідома помилка." + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:168 +msgid "" +"Copying of the temporary G-code to the output G-code failed. Maybe the SD " +"card is write locked?\n" +"Error message: %1%" +msgstr "" +"Не вдалося скопіювати тимчасовий G-код у вихідний G-код. Можливо, SD-карта " +"заблокована?\n" +"Повідомлення про помилку: %1%" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:171 +msgid "" +"Copying of the temporary G-code to the output G-code failed. There might be " +"problem with target device, please try exporting again or using different " +"device. The corrupted output G-code is at %1%.tmp." +msgstr "" +"Не вдалося скопіювати тимчасовий G-код у вихідний G-код. Можливо, проблема з " +"цільовим пристроєм, спробуйте експортувати ще раз або використати інший " +"пристрій. Пошкоджений вихідний G-код - %1% .tmp." + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:174 +msgid "" +"Renaming of the G-code after copying to the selected destination folder has " +"failed. Current path is %1%.tmp. Please try exporting again." +msgstr "" +"Не вдалося перейменувати G-код після копіювання у вибрану папку призначення. " +"Поточний шлях - %1%.tmp. Спробуйте експортувати ще раз." + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:177 +msgid "" +"Copying of the temporary G-code has finished but the original code at %1% " +"couldn't be opened during copy check. The output G-code is at %2%.tmp." +msgstr "" +"Копіювання тимчасового G-коду закінчено, але оригінальний код на рівні %1% " +"не вдалося відкрити під час перевірки копії. Вихідний G-код - %2% .tmp." + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:180 +msgid "" +"Copying of the temporary G-code has finished but the exported code couldn't " +"be opened during copy check. The output G-code is at %1%.tmp." +msgstr "" +"Копіювання тимчасового G-коду завершено, але експортований код не вдалося " +"відкрити під час перевірки копії. Вихідний G-код - %1% .tmp." + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:187 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:536 +msgid "Running post-processing scripts" +msgstr "Запуск скриптів пост-обробки" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:189 +msgid "G-code file exported to %1%" +msgstr "Файл G-коду експортується до %1%" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:194 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:243 +msgid "Slicing complete" +msgstr "Нарізання завершено" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:238 +msgid "Masked SLA file exported to %1%" +msgstr "Файл SLA експортовано до %1%" -#: src/slic3r/GUI/BedShapeDialog.cpp:55 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:118 src/slic3r/GUI/Plater.cpp:136 -#: src/slic3r/GUI/Tab.cpp:2185 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:539 +msgid "Copying of the temporary G-code to the output G-code failed" +msgstr "Не вдалося скопіювати тимчасовий G-код у вихідний G-код" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:562 +msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" +msgstr "" +"Планування завантаження до `%1%`. Див. Вікно -> Черга завантаження хоста " +"друку" + +#: src/slic3r/GUI/BedShapeDialog.cpp:93 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:240 src/slic3r/GUI/Plater.cpp:162 +#: src/slic3r/GUI/Tab.cpp:2536 msgid "Size" msgstr "Розмір" -#: src/slic3r/GUI/BedShapeDialog.cpp:56 -msgid "Size in X and Y of the rectangular plate." -msgstr "Розмір прямокутної подложки за X та Y." - -#: src/slic3r/GUI/BedShapeDialog.cpp:62 +#: src/slic3r/GUI/BedShapeDialog.cpp:94 msgid "Origin" msgstr "Початок координат" -#: src/slic3r/GUI/BedShapeDialog.cpp:63 +#: src/slic3r/GUI/BedShapeDialog.cpp:95 src/libslic3r/PrintConfig.cpp:771 +msgid "Diameter" +msgstr "Діаметр" + +#: src/slic3r/GUI/BedShapeDialog.cpp:110 +msgid "Size in X and Y of the rectangular plate." +msgstr "Розмір прямокутної подложки за X та Y." + +#: src/slic3r/GUI/BedShapeDialog.cpp:121 msgid "" "Distance of the 0,0 G-code coordinate from the front left corner of the " "rectangle." msgstr "Відстань координат 0,0 G-коду від нижнього лівого кута прямокутника." -#: src/slic3r/GUI/BedShapeDialog.cpp:67 -msgid "Circular" -msgstr "Круговий" - -#: src/slic3r/GUI/BedShapeDialog.cpp:70 src/slic3r/GUI/ConfigWizard.cpp:111 -#: src/slic3r/GUI/ConfigWizard.cpp:544 src/slic3r/GUI/ConfigWizard.cpp:558 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:115 -#: src/slic3r/GUI/RammingChart.cpp:81 src/slic3r/GUI/WipeTowerDialog.cpp:84 -#: src/libslic3r/PrintConfig.cpp:59 src/libslic3r/PrintConfig.cpp:66 -#: src/libslic3r/PrintConfig.cpp:75 src/libslic3r/PrintConfig.cpp:209 -#: src/libslic3r/PrintConfig.cpp:284 src/libslic3r/PrintConfig.cpp:292 -#: src/libslic3r/PrintConfig.cpp:342 src/libslic3r/PrintConfig.cpp:352 -#: src/libslic3r/PrintConfig.cpp:472 src/libslic3r/PrintConfig.cpp:483 -#: src/libslic3r/PrintConfig.cpp:501 src/libslic3r/PrintConfig.cpp:679 -#: src/libslic3r/PrintConfig.cpp:1165 src/libslic3r/PrintConfig.cpp:1226 -#: src/libslic3r/PrintConfig.cpp:1244 src/libslic3r/PrintConfig.cpp:1262 -#: src/libslic3r/PrintConfig.cpp:1314 src/libslic3r/PrintConfig.cpp:1324 -#: src/libslic3r/PrintConfig.cpp:1445 src/libslic3r/PrintConfig.cpp:1453 -#: src/libslic3r/PrintConfig.cpp:1494 src/libslic3r/PrintConfig.cpp:1502 -#: src/libslic3r/PrintConfig.cpp:1512 src/libslic3r/PrintConfig.cpp:1520 -#: src/libslic3r/PrintConfig.cpp:1528 src/libslic3r/PrintConfig.cpp:1611 -#: src/libslic3r/PrintConfig.cpp:1827 src/libslic3r/PrintConfig.cpp:1897 -#: src/libslic3r/PrintConfig.cpp:1931 src/libslic3r/PrintConfig.cpp:2123 -#: src/libslic3r/PrintConfig.cpp:2130 src/libslic3r/PrintConfig.cpp:2137 -#: src/libslic3r/PrintConfig.cpp:2167 src/libslic3r/PrintConfig.cpp:2177 -#: src/libslic3r/PrintConfig.cpp:2187 src/libslic3r/PrintConfig.cpp:2293 -#: src/libslic3r/PrintConfig.cpp:2368 src/libslic3r/PrintConfig.cpp:2377 -#: src/libslic3r/PrintConfig.cpp:2386 src/libslic3r/PrintConfig.cpp:2396 -#: src/libslic3r/PrintConfig.cpp:2440 src/libslic3r/PrintConfig.cpp:2450 -#: src/libslic3r/PrintConfig.cpp:2469 src/libslic3r/PrintConfig.cpp:2479 -#: src/libslic3r/PrintConfig.cpp:2488 src/libslic3r/PrintConfig.cpp:2506 -#: src/libslic3r/PrintConfig.cpp:2521 src/libslic3r/PrintConfig.cpp:2532 -#: src/libslic3r/PrintConfig.cpp:2545 src/libslic3r/PrintConfig.cpp:2555 +#: src/slic3r/GUI/BedShapeDialog.cpp:129 src/slic3r/GUI/ConfigWizard.cpp:242 +#: src/slic3r/GUI/ConfigWizard.cpp:1368 src/slic3r/GUI/ConfigWizard.cpp:1382 +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:88 +#: src/slic3r/GUI/GCodeViewer.cpp:2337 src/slic3r/GUI/GCodeViewer.cpp:2343 +#: src/slic3r/GUI/GCodeViewer.cpp:2351 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:179 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:145 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:341 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:418 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:487 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:96 +#: src/slic3r/GUI/WipeTowerDialog.cpp:85 src/libslic3r/PrintConfig.cpp:77 +#: src/libslic3r/PrintConfig.cpp:84 src/libslic3r/PrintConfig.cpp:95 +#: src/libslic3r/PrintConfig.cpp:135 src/libslic3r/PrintConfig.cpp:244 +#: src/libslic3r/PrintConfig.cpp:302 src/libslic3r/PrintConfig.cpp:377 +#: src/libslic3r/PrintConfig.cpp:385 src/libslic3r/PrintConfig.cpp:435 +#: src/libslic3r/PrintConfig.cpp:565 src/libslic3r/PrintConfig.cpp:576 +#: src/libslic3r/PrintConfig.cpp:594 src/libslic3r/PrintConfig.cpp:774 +#: src/libslic3r/PrintConfig.cpp:1258 src/libslic3r/PrintConfig.cpp:1439 +#: src/libslic3r/PrintConfig.cpp:1500 src/libslic3r/PrintConfig.cpp:1518 +#: src/libslic3r/PrintConfig.cpp:1536 src/libslic3r/PrintConfig.cpp:1594 +#: src/libslic3r/PrintConfig.cpp:1604 src/libslic3r/PrintConfig.cpp:1729 +#: src/libslic3r/PrintConfig.cpp:1737 src/libslic3r/PrintConfig.cpp:1778 +#: src/libslic3r/PrintConfig.cpp:1786 src/libslic3r/PrintConfig.cpp:1796 +#: src/libslic3r/PrintConfig.cpp:1804 src/libslic3r/PrintConfig.cpp:1812 +#: src/libslic3r/PrintConfig.cpp:1875 src/libslic3r/PrintConfig.cpp:2141 +#: src/libslic3r/PrintConfig.cpp:2212 src/libslic3r/PrintConfig.cpp:2246 +#: src/libslic3r/PrintConfig.cpp:2375 src/libslic3r/PrintConfig.cpp:2454 +#: src/libslic3r/PrintConfig.cpp:2461 src/libslic3r/PrintConfig.cpp:2468 +#: src/libslic3r/PrintConfig.cpp:2498 src/libslic3r/PrintConfig.cpp:2508 +#: src/libslic3r/PrintConfig.cpp:2518 src/libslic3r/PrintConfig.cpp:2678 +#: src/libslic3r/PrintConfig.cpp:2712 src/libslic3r/PrintConfig.cpp:2851 +#: src/libslic3r/PrintConfig.cpp:2860 src/libslic3r/PrintConfig.cpp:2869 +#: src/libslic3r/PrintConfig.cpp:2879 src/libslic3r/PrintConfig.cpp:2944 +#: src/libslic3r/PrintConfig.cpp:2954 src/libslic3r/PrintConfig.cpp:2966 +#: src/libslic3r/PrintConfig.cpp:2986 src/libslic3r/PrintConfig.cpp:2996 +#: src/libslic3r/PrintConfig.cpp:3006 src/libslic3r/PrintConfig.cpp:3024 +#: src/libslic3r/PrintConfig.cpp:3039 src/libslic3r/PrintConfig.cpp:3053 +#: src/libslic3r/PrintConfig.cpp:3064 src/libslic3r/PrintConfig.cpp:3077 +#: src/libslic3r/PrintConfig.cpp:3122 src/libslic3r/PrintConfig.cpp:3132 +#: src/libslic3r/PrintConfig.cpp:3141 src/libslic3r/PrintConfig.cpp:3151 +#: src/libslic3r/PrintConfig.cpp:3167 src/libslic3r/PrintConfig.cpp:3191 msgid "mm" msgstr "мм" -#: src/slic3r/GUI/BedShapeDialog.cpp:71 src/libslic3r/PrintConfig.cpp:676 -msgid "Diameter" -msgstr "Діаметр" - -#: src/slic3r/GUI/BedShapeDialog.cpp:72 +#: src/slic3r/GUI/BedShapeDialog.cpp:131 msgid "" "Diameter of the print bed. It is assumed that origin (0,0) is located in the " "center." @@ -98,55 +237,106 @@ msgstr "" "Діаметр подложки. Передбачається, що початок координат (0,0) знаходиться в " "центрі." -#: src/slic3r/GUI/BedShapeDialog.cpp:76 src/slic3r/GUI/GUI_Preview.cpp:239 -#: src/libslic3r/GCode/PreviewData.cpp:175 +#: src/slic3r/GUI/BedShapeDialog.cpp:141 +msgid "Rectangular" +msgstr "Прямокутний" + +#: src/slic3r/GUI/BedShapeDialog.cpp:142 +msgid "Circular" +msgstr "Круговий" + +#: src/slic3r/GUI/BedShapeDialog.cpp:143 src/slic3r/GUI/GUI_Preview.cpp:243 +#: src/libslic3r/ExtrusionEntity.cpp:323 src/libslic3r/ExtrusionEntity.cpp:358 msgid "Custom" msgstr "Користувацький" -#: src/slic3r/GUI/BedShapeDialog.cpp:80 +#: src/slic3r/GUI/BedShapeDialog.cpp:145 +msgid "Invalid" +msgstr "Недійсний" + +#: src/slic3r/GUI/BedShapeDialog.cpp:156 src/slic3r/GUI/BedShapeDialog.cpp:222 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2288 +msgid "Shape" +msgstr "Форма" + +#: src/slic3r/GUI/BedShapeDialog.cpp:243 msgid "Load shape from STL..." msgstr "Завантажте форму з STL ..." -#: src/slic3r/GUI/BedShapeDialog.cpp:126 +#: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/MainFrame.cpp:1826 msgid "Settings" msgstr "Налаштування" -#: src/slic3r/GUI/BedShapeDialog.cpp:299 -msgid "Choose a file to import bed shape from (STL/OBJ/AMF/3MF/PRUSA):" -msgstr "Виберіть файл, щоб імпортувати форму полотна з (STL/OBJ/AMF/PRUSA):" +#: src/slic3r/GUI/BedShapeDialog.cpp:315 +msgid "Texture" +msgstr "Текстура" + +#: src/slic3r/GUI/BedShapeDialog.cpp:325 src/slic3r/GUI/BedShapeDialog.cpp:405 +msgid "Load..." +msgstr "Завантажити..." + +#: src/slic3r/GUI/BedShapeDialog.cpp:333 src/slic3r/GUI/BedShapeDialog.cpp:413 +#: src/slic3r/GUI/Tab.cpp:3484 +msgid "Remove" +msgstr "Видалити" + +#: src/slic3r/GUI/BedShapeDialog.cpp:366 src/slic3r/GUI/BedShapeDialog.cpp:446 +msgid "Not found:" +msgstr "Не знайдено:" -#: src/slic3r/GUI/BedShapeDialog.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:1252 -msgid "Error! " -msgstr "Помилка! " +#: src/slic3r/GUI/BedShapeDialog.cpp:395 +msgid "Model" +msgstr "Модель" -#: src/slic3r/GUI/BedShapeDialog.cpp:325 +#: src/slic3r/GUI/BedShapeDialog.cpp:563 +msgid "Choose an STL file to import bed shape from:" +msgstr "Виберіть STL-файл для імпорту форми столу з:" + +#: src/slic3r/GUI/BedShapeDialog.cpp:570 src/slic3r/GUI/BedShapeDialog.cpp:619 +#: src/slic3r/GUI/BedShapeDialog.cpp:642 +msgid "Invalid file format." +msgstr "Недійсний формат файлу." + +#: src/slic3r/GUI/BedShapeDialog.cpp:581 +msgid "Error! Invalid model" +msgstr "Помилка! Недійсна модель" + +#: src/slic3r/GUI/BedShapeDialog.cpp:589 msgid "The selected file contains no geometry." msgstr "Обраний файл не містить геометрії." -#: src/slic3r/GUI/BedShapeDialog.cpp:329 +#: src/slic3r/GUI/BedShapeDialog.cpp:593 msgid "" "The selected file contains several disjoint areas. This is not supported." msgstr "Обраний файл містить декілька непересічних областей. Не підтримується." -#: src/slic3r/GUI/BedShapeDialog.hpp:44 src/slic3r/GUI/ConfigWizard.cpp:507 +#: src/slic3r/GUI/BedShapeDialog.cpp:608 +msgid "Choose a file to import bed texture from (PNG/SVG):" +msgstr "Виберіть файл для імпорту текстури столу (PNG / SVG):" + +#: src/slic3r/GUI/BedShapeDialog.cpp:631 +msgid "Choose an STL file to import bed model from:" +msgstr "Виберіть STL-файл для імпорту моделі столу з:" + +#: src/slic3r/GUI/BedShapeDialog.hpp:98 src/slic3r/GUI/ConfigWizard.cpp:1327 msgid "Bed Shape" -msgstr "Форма полотна" +msgstr "Форма столу" #: src/slic3r/GUI/BonjourDialog.cpp:55 msgid "Network lookup" -msgstr "" +msgstr "Пошук мережі" #: src/slic3r/GUI/BonjourDialog.cpp:72 msgid "Address" -msgstr "" +msgstr "Адреса" #: src/slic3r/GUI/BonjourDialog.cpp:73 msgid "Hostname" -msgstr "" +msgstr "Назва хоста" #: src/slic3r/GUI/BonjourDialog.cpp:74 msgid "Service name" -msgstr "" +msgstr "Назва сервісу" #: src/slic3r/GUI/BonjourDialog.cpp:76 msgid "OctoPrint version" @@ -154,417 +344,1184 @@ msgstr "Версія OctoPrint" #: src/slic3r/GUI/BonjourDialog.cpp:218 msgid "Searching for devices" -msgstr "" +msgstr "Пошук пристроїв" #: src/slic3r/GUI/BonjourDialog.cpp:225 msgid "Finished" -msgstr "" +msgstr "Завершено" -#: src/slic3r/GUI/ButtonsDescription.cpp:15 +#: src/slic3r/GUI/ButtonsDescription.cpp:16 msgid "Buttons And Text Colors Description" -msgstr "" +msgstr "Опис кнопок та кольорів тексту" -#: src/slic3r/GUI/ButtonsDescription.cpp:40 +#: src/slic3r/GUI/ButtonsDescription.cpp:36 msgid "Value is the same as the system value" -msgstr "" +msgstr "Значення таке ж, як системне" -#: src/slic3r/GUI/ButtonsDescription.cpp:57 +#: src/slic3r/GUI/ButtonsDescription.cpp:53 msgid "" "Value was changed and is not equal to the system value or the last saved " "preset" msgstr "" +"Значення було змінено і не дорівнює системному значенню або останньому " +"збереженому пресету" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:17 -msgid "Upgrade" +#: src/slic3r/GUI/ConfigManipulation.cpp:48 +msgid "" +"Zero layer height is not valid.\n" +"\n" +"The layer height will be reset to 0.01." msgstr "" +"Нульового висота шару є недійсною.\n" +"\n" +"Висота шару буде скинута до 0,01." -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:19 -msgid "Downgrade" +#: src/slic3r/GUI/ConfigManipulation.cpp:49 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1387 +#: src/libslic3r/PrintConfig.cpp:73 +msgid "Layer height" +msgstr "Висота шару" + +#: src/slic3r/GUI/ConfigManipulation.cpp:60 +msgid "" +"Zero first layer height is not valid.\n" +"\n" +"The first layer height will be reset to 0.01." msgstr "" +"Нульового висота першого шару є недійсною.\n" +"\n" +"Висота першого шару буде скинута до 0,01." -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:21 -msgid "Before roll back" +#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:969 +msgid "First layer height" +msgstr "Висота першого шару" + +#: src/slic3r/GUI/ConfigManipulation.cpp:81 +msgid "" +"The Spiral Vase mode requires:\n" +"- one perimeter\n" +"- no top solid layers\n" +"- 0% fill density\n" +"- no support material\n" +"- Ensure vertical shell thickness enabled\n" +"- Detect thin walls disabled" msgstr "" +"Режим спіральної вази вимагає:\n" +"- один периметр\n" +"- немає верхніх щільних шарів\n" +"- щільність заповнення 0%\n" +"- немає підтримуючого матеріалу\n" +"- \"Забезпечення товщини вертикальної оболонки\" увімкнено\n" +"- \"Виявлення тонких стінок\" вимкнено" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:23 -msgid "User" +#: src/slic3r/GUI/ConfigManipulation.cpp:89 +msgid "Shall I adjust those settings in order to enable Spiral Vase?" msgstr "" +"Чи потрібно змінити ці налаштування, щоб увімкнути режим Спіральної вази?" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:26 -msgid "Unknown" +#: src/slic3r/GUI/ConfigManipulation.cpp:90 +msgid "Spiral Vase" +msgstr "Спіральна ваза" + +#: src/slic3r/GUI/ConfigManipulation.cpp:115 +msgid "" +"The Wipe Tower currently supports the non-soluble supports only\n" +"if they are printed with the current extruder without triggering a tool " +"change.\n" +"(both support_material_extruder and support_material_interface_extruder need " +"to be set to 0)." +msgstr "" +"Вежа витирання в даний момент підтримує лише нерозчинні підтримки,\n" +"якщо вони друкуються з поточним екструдером, не запускаючи зміну " +"інструменту.\n" +"(обидва значення support_material_extruder і " +"support_material_interface_extruder повинні бути встановлені на 0)." + +#: src/slic3r/GUI/ConfigManipulation.cpp:119 +msgid "Shall I adjust those settings in order to enable the Wipe Tower?" +msgstr "Чи потрібно коригувати ці налаштування, щоб увімкнути вежу витирання?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:120 +#: src/slic3r/GUI/ConfigManipulation.cpp:140 +msgid "Wipe Tower" +msgstr "Вежа витирання" + +#: src/slic3r/GUI/ConfigManipulation.cpp:136 +msgid "" +"For the Wipe Tower to work with the soluble supports, the support layers\n" +"need to be synchronized with the object layers." msgstr "" +"Для того, щоб вежа витирання працювала з розчинними підтримками, шари " +"підтримки\n" +"повинні бути синхронізовані з шаром об'єкта." + +#: src/slic3r/GUI/ConfigManipulation.cpp:139 +msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" +msgstr "" +"Чи потрібно синхронізувати шари підтримки, щоб увімкнути вежу витирання?" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:38 -msgid "Active: " +#: src/slic3r/GUI/ConfigManipulation.cpp:159 +msgid "" +"Supports work better, if the following feature is enabled:\n" +"- Detect bridging perimeters" msgstr "" +"Підтримка працює краще, якщо ввімкнена така функція:\n" +"- Виявлення нависаючих периметрів(перемичок)" + +#: src/slic3r/GUI/ConfigManipulation.cpp:162 +msgid "Shall I adjust those settings for supports?" +msgstr "Чи потрібно змінити ці налаштування для підтримки?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:163 +msgid "Support Generator" +msgstr "Створення підтримки" + +#: src/slic3r/GUI/ConfigManipulation.cpp:198 +msgid "The %1% infill pattern is not supposed to work at 100%% density." +msgstr "Шаблон заповнення %1% не підтримується при щільності 100%%." + +#: src/slic3r/GUI/ConfigManipulation.cpp:201 +msgid "Shall I switch to rectilinear fill pattern?" +msgstr "Чи потрібно змінити його на прямолінійний шаблон заповнення?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:202 +#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:93 +#: src/slic3r/GUI/GUI_ObjectList.cpp:668 src/slic3r/GUI/Plater.cpp:389 +#: src/slic3r/GUI/Tab.cpp:1432 src/slic3r/GUI/Tab.cpp:1434 +#: src/libslic3r/PrintConfig.cpp:259 src/libslic3r/PrintConfig.cpp:472 +#: src/libslic3r/PrintConfig.cpp:496 src/libslic3r/PrintConfig.cpp:848 +#: src/libslic3r/PrintConfig.cpp:862 src/libslic3r/PrintConfig.cpp:899 +#: src/libslic3r/PrintConfig.cpp:1076 src/libslic3r/PrintConfig.cpp:1086 +#: src/libslic3r/PrintConfig.cpp:1153 src/libslic3r/PrintConfig.cpp:1172 +#: src/libslic3r/PrintConfig.cpp:1191 src/libslic3r/PrintConfig.cpp:1928 +#: src/libslic3r/PrintConfig.cpp:1945 +msgid "Infill" +msgstr "Заповнення" + +#: src/slic3r/GUI/ConfigManipulation.cpp:320 +msgid "Head penetration should not be greater than the head width." +msgstr "Проникнення головки не повинно бути більше її ширини." + +#: src/slic3r/GUI/ConfigManipulation.cpp:322 +msgid "Invalid Head penetration" +msgstr "Неприпустиме проникнення головки" + +#: src/slic3r/GUI/ConfigManipulation.cpp:333 +msgid "Pinhead diameter should be smaller than the pillar diameter." +msgstr "Діаметр головки стовпа повинен бути менше діаметра стовпа." + +#: src/slic3r/GUI/ConfigManipulation.cpp:335 +msgid "Invalid pinhead diameter" +msgstr "Неприпустимий діаметр головки" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:19 +msgid "Upgrade" +msgstr "Оновити" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:21 +msgid "Downgrade" +msgstr "Повернути до попередньої версії" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:23 +msgid "Before roll back" +msgstr "Перед відкатом" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:25 src/libslic3r/PrintConfig.cpp:143 +msgid "User" +msgstr "Користувацький" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:28 +#: src/slic3r/GUI/GUI_Preview.cpp:229 src/libslic3r/ExtrusionEntity.cpp:309 +msgid "Unknown" +msgstr "Невідомий" #: src/slic3r/GUI/ConfigSnapshotDialog.cpp:44 -msgid "slic3r version" -msgstr "версія slic3r" +msgid "Active" +msgstr "Активний" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 +msgid "PrusaSlicer version" +msgstr "Версія PrusaSlicer" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:45 src/slic3r/GUI/Preset.cpp:1250 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:55 src/libslic3r/Preset.cpp:1298 msgid "print" -msgstr "" +msgstr "друк" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:46 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:56 msgid "filaments" -msgstr "" +msgstr "філаменти" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:59 src/libslic3r/Preset.cpp:1300 +msgid "SLA print" +msgstr "SLA-друк" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 src/slic3r/GUI/Plater.cpp:696 +#: src/libslic3r/Preset.cpp:1301 +msgid "SLA material" +msgstr "SLA-матеріал" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:47 src/slic3r/GUI/Preset.cpp:1254 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:62 src/libslic3r/Preset.cpp:1302 msgid "printer" -msgstr "" +msgstr "принтер" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/slic3r/GUI/Tab.cpp:872 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:66 src/slic3r/GUI/Tab.cpp:1304 msgid "vendor" -msgstr "" +msgstr "виробник" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:66 msgid "version" msgstr "версія" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 -msgid "min slic3r version" -msgstr "мінімальна версія slic3r" +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:67 +msgid "min PrusaSlicer version" +msgstr "мінімальна версія PrusaSlicer" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:54 -msgid "max slic3r version" -msgstr "максимальна версія slic3r" +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:69 +msgid "max PrusaSlicer version" +msgstr "максимальна версія PrusaSlicer" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:72 msgid "model" -msgstr "" +msgstr "модель" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:72 msgid "variants" -msgstr "" +msgstr "варіанти" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:69 -msgid "Incompatible with this Slic3r" -msgstr "" +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:84 +#, c-format +msgid "Incompatible with this %s" +msgstr "Є несумісним з цією версією %s" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:72 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:87 msgid "Activate" -msgstr "" +msgstr "Активувати" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:98 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:113 msgid "Configuration Snapshots" -msgstr "" +msgstr "Знімки конфігурації" -#: src/slic3r/GUI/ConfigWizard.cpp:111 +#: src/slic3r/GUI/ConfigWizard.cpp:242 msgid "nozzle" -msgstr "" +msgstr "сопло" -#: src/slic3r/GUI/ConfigWizard.cpp:115 +#: src/slic3r/GUI/ConfigWizard.cpp:246 msgid "Alternate nozzles:" -msgstr "" +msgstr "Альтернативні сопла:" -#: src/slic3r/GUI/ConfigWizard.cpp:181 +#: src/slic3r/GUI/ConfigWizard.cpp:310 msgid "All standard" -msgstr "" +msgstr "Всі стандартні" -#: src/slic3r/GUI/ConfigWizard.cpp:182 src/slic3r/GUI/Tab.cpp:2909 +#: src/slic3r/GUI/ConfigWizard.cpp:310 +msgid "Standard" +msgstr "Стандартний" + +#: src/slic3r/GUI/ConfigWizard.cpp:311 src/slic3r/GUI/ConfigWizard.cpp:605 +#: src/slic3r/GUI/Tab.cpp:3565 src/slic3r/GUI/UnsavedChangesDialog.cpp:933 msgid "All" msgstr "Всі" -#: src/slic3r/GUI/ConfigWizard.cpp:183 src/slic3r/GUI/Plater.cpp:414 -#: src/libslic3r/GCode/PreviewData.cpp:162 +#: src/slic3r/GUI/ConfigWizard.cpp:312 src/slic3r/GUI/ConfigWizard.cpp:606 +#: src/slic3r/GUI/DoubleSlider.cpp:1859 src/slic3r/GUI/Plater.cpp:361 +#: src/slic3r/GUI/Plater.cpp:504 msgid "None" msgstr "Жодне" -#: src/slic3r/GUI/ConfigWizard.cpp:284 +#: src/slic3r/GUI/ConfigWizard.cpp:452 +#, c-format +msgid "Welcome to the %s Configuration Assistant" +msgstr "Ласкаво просимо до Асистента конфігурації %s" + +#: src/slic3r/GUI/ConfigWizard.cpp:454 #, c-format -msgid "Welcome to the Slic3r %s" -msgstr "Ласкаво просимо до Slic3r %s" +msgid "Welcome to the %s Configuration Wizard" +msgstr "Ласкаво просимо до Майстру конфігурації %s" -#: src/slic3r/GUI/ConfigWizard.cpp:284 +#: src/slic3r/GUI/ConfigWizard.cpp:456 msgid "Welcome" msgstr "Ласкаво просимо" -#: src/slic3r/GUI/ConfigWizard.cpp:288 src/slic3r/GUI/GUI_App.cpp:600 -#, c-format -msgid "Run %s" -msgstr "" - -#: src/slic3r/GUI/ConfigWizard.cpp:290 +#: src/slic3r/GUI/ConfigWizard.cpp:458 #, c-format msgid "" -"Hello, welcome to Slic3r Prusa Edition! This %s helps you with the initial " -"configuration; just a few settings and you will be ready to print." +"Hello, welcome to %s! This %s helps you with the initial configuration; just " +"a few settings and you will be ready to print." msgstr "" +"Вітаємо, ласкаво просимо до %s! Цей %s допоможе вам в початковій " +"конфігурації; лише кілька налаштувань, і ви будете готові до друку." -#: src/slic3r/GUI/ConfigWizard.cpp:294 -msgid "" -"Remove user profiles - install from scratch (a snapshot will be taken " -"beforehand)" -msgstr "" +#: src/slic3r/GUI/ConfigWizard.cpp:463 +msgid "Remove user profiles (a snapshot will be taken beforehand)" +msgstr "Видалити профілі користувачів (знімок буде зроблено заздалегідь)" -#: src/slic3r/GUI/ConfigWizard.cpp:325 +#: src/slic3r/GUI/ConfigWizard.cpp:506 #, c-format msgid "%s Family" +msgstr "%s Родина" + +#: src/slic3r/GUI/ConfigWizard.cpp:594 +msgid "Printer:" +msgstr "Принтер:" + +#: src/slic3r/GUI/ConfigWizard.cpp:596 +msgid "Vendor:" +msgstr "Виробник:" + +#: src/slic3r/GUI/ConfigWizard.cpp:597 +msgid "Profile:" +msgstr "Профіль:" + +#: src/slic3r/GUI/ConfigWizard.cpp:669 src/slic3r/GUI/ConfigWizard.cpp:819 +#: src/slic3r/GUI/ConfigWizard.cpp:880 src/slic3r/GUI/ConfigWizard.cpp:1017 +msgid "(All)" +msgstr "(Всі)" + +#: src/slic3r/GUI/ConfigWizard.cpp:698 +msgid "" +"Filaments marked with * are not compatible with some installed " +"printers." msgstr "" +"Філаменти, позначені *, є несумісні з деякими встановленими " +"принтерами." + +#: src/slic3r/GUI/ConfigWizard.cpp:701 +msgid "All installed printers are compatible with the selected filament." +msgstr "Усі встановлені принтери сумісні з обраним філаментем." -#: src/slic3r/GUI/ConfigWizard.cpp:362 +#: src/slic3r/GUI/ConfigWizard.cpp:721 +msgid "" +"Only the following installed printers are compatible with the selected " +"filament:" +msgstr "Тільки наступні встановлені принтери сумісні з обраним філаментом:" + +#: src/slic3r/GUI/ConfigWizard.cpp:1107 msgid "Custom Printer Setup" -msgstr "" +msgstr "Користувацьке налаштування принтера" -#: src/slic3r/GUI/ConfigWizard.cpp:362 +#: src/slic3r/GUI/ConfigWizard.cpp:1107 msgid "Custom Printer" -msgstr "" +msgstr "Користувацький принтер" -#: src/slic3r/GUI/ConfigWizard.cpp:364 +#: src/slic3r/GUI/ConfigWizard.cpp:1109 msgid "Define a custom printer profile" -msgstr "" +msgstr "Визначте власний профіль принтера" -#: src/slic3r/GUI/ConfigWizard.cpp:366 +#: src/slic3r/GUI/ConfigWizard.cpp:1111 msgid "Custom profile name:" -msgstr "" +msgstr "Користувацьке ім'я пресету:" -#: src/slic3r/GUI/ConfigWizard.cpp:390 +#: src/slic3r/GUI/ConfigWizard.cpp:1136 msgid "Automatic updates" -msgstr "" +msgstr "Автоматичні оновлення" -#: src/slic3r/GUI/ConfigWizard.cpp:390 +#: src/slic3r/GUI/ConfigWizard.cpp:1136 msgid "Updates" -msgstr "" +msgstr "Оновлення" -#: src/slic3r/GUI/ConfigWizard.cpp:398 src/slic3r/GUI/Preferences.cpp:59 +#: src/slic3r/GUI/ConfigWizard.cpp:1144 src/slic3r/GUI/Preferences.cpp:94 msgid "Check for application updates" -msgstr "" +msgstr "Перевірте наявність оновлень програми" -#: src/slic3r/GUI/ConfigWizard.cpp:401 src/slic3r/GUI/Preferences.cpp:61 +#: src/slic3r/GUI/ConfigWizard.cpp:1148 +#, c-format msgid "" -"If enabled, Slic3r checks for new versions of Slic3r PE online. When a new " -"version becomes available a notification is displayed at the next " +"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 "" +"Якщо цей параметр увімкнено, %s перевіряє наявність нової версії онлайн. " +"Коли нова версія стає доступною, сповіщення відображатиметься під час " +"наступного запуску застосування (ніколи не під час використання програми). " +"Це лише механізми сповіщення, автоматична інсталяція не виконується." -#: src/slic3r/GUI/ConfigWizard.cpp:405 src/slic3r/GUI/Preferences.cpp:67 +#: src/slic3r/GUI/ConfigWizard.cpp:1154 src/slic3r/GUI/Preferences.cpp:129 msgid "Update built-in Presets automatically" -msgstr "" +msgstr "Автоматично оновлювати вбудовані пресети" -#: src/slic3r/GUI/ConfigWizard.cpp:408 src/slic3r/GUI/Preferences.cpp:69 +#: src/slic3r/GUI/ConfigWizard.cpp:1158 +#, c-format msgid "" -"If enabled, Slic3r downloads updates of built-in system presets in the " -"background. These updates are downloaded into a separate temporary location. " +"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 "" +"Якщо увімкнено, %s завантажує оновлення вбудованих системних пресетів у " +"фоновому режимі. Ці оновлення завантажуються в окреме тимчасове місце. Коли " +"з’являється нова попередньо встановлена версія, вона пропонується під час " +"запуску програми." -#: src/slic3r/GUI/ConfigWizard.cpp:409 +#: src/slic3r/GUI/ConfigWizard.cpp:1161 msgid "" "Updates are never applied without user's consent and never overwrite user's " "customized settings." msgstr "" +"Оновлення ніколи не застосовуються без згоди користувача та ніколи не " +"перезаписують власні налаштування користувача." -#: src/slic3r/GUI/ConfigWizard.cpp:414 +#: src/slic3r/GUI/ConfigWizard.cpp:1166 msgid "" "Additionally a backup snapshot of the whole configuration is created before " "an update is applied." msgstr "" +"Крім того, перед застосуванням оновлення створюється резервний знімок всієї " +"конфігурації." -#: src/slic3r/GUI/ConfigWizard.cpp:421 -msgid "Other Vendors" +#: src/slic3r/GUI/ConfigWizard.cpp:1173 src/slic3r/GUI/GUI_ObjectList.cpp:1825 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4567 src/slic3r/GUI/Plater.cpp:3116 +#: src/slic3r/GUI/Plater.cpp:4001 src/slic3r/GUI/Plater.cpp:4032 +msgid "Reload from disk" +msgstr "Перезавантажити з диска" + +#: src/slic3r/GUI/ConfigWizard.cpp:1176 +msgid "" +"Export full pathnames of models and parts sources into 3mf and amf files" msgstr "" +"Експортуйте повні назви шляхів джерел моделей та частей у файли 3MF та AMF" -#: src/slic3r/GUI/ConfigWizard.cpp:423 -msgid "Pick another vendor supported by Slic3r PE:" +#: src/slic3r/GUI/ConfigWizard.cpp:1180 +msgid "" +"If enabled, allows the Reload from disk command to automatically find and " +"load the files when invoked.\n" +"If not enabled, the Reload from disk command will ask to select each file " +"using an open file dialog." msgstr "" +"Якщо ввімкнено, дозволяє команді «Перезавантажити з диска» автоматично " +"знаходити та завантажувати файли при виклику.\n" +"Якщо не ввімкнено, команда «Перезавантажити з диска» попросить вибрати кожен " +"файл за допомогою діалогового вікна відкритого файлу." -#: src/slic3r/GUI/ConfigWizard.cpp:469 -msgid "Firmware Type" +#: src/slic3r/GUI/ConfigWizard.cpp:1190 +msgid "Files association" +msgstr "Асоціація файлів" + +#: src/slic3r/GUI/ConfigWizard.cpp:1192 src/slic3r/GUI/Preferences.cpp:112 +msgid "Associate .3mf files to PrusaSlicer" +msgstr "Асоціювати 3MF-файли з PrusaSlicer" + +#: src/slic3r/GUI/ConfigWizard.cpp:1193 src/slic3r/GUI/Preferences.cpp:119 +msgid "Associate .stl files to PrusaSlicer" +msgstr "Асоціювати stl-файли з PrusaSlicer" + +#: src/slic3r/GUI/ConfigWizard.cpp:1204 +msgid "View mode" +msgstr "Режим перегляду" + +#: src/slic3r/GUI/ConfigWizard.cpp:1206 +msgid "" +"PrusaSlicer's user interfaces comes in three variants:\n" +"Simple, Advanced, and Expert.\n" +"The Simple mode shows only the most frequently used settings relevant for " +"regular 3D printing. The other two offer progressively more sophisticated " +"fine-tuning, they are suitable for advanced and expert users, respectively." msgstr "" +"Користувацький інтерфейс PrusaSlicer поставляються в трьох варіантах:\n" +"Простий, Розширений та Експертний.\n" +"У простому режимі відображаються лише найбільш часто використовувані " +"налаштування, що стосуються звичайного 3D-друку. Два інших пропонують " +"поступово більш досконалу точну настройку, вони підходять для більш " +"досвідчених користувачів." + +#: src/slic3r/GUI/ConfigWizard.cpp:1211 +msgid "Simple mode" +msgstr "Простий режим" + +#: src/slic3r/GUI/ConfigWizard.cpp:1212 +msgid "Advanced mode" +msgstr "Розширений режим" -#: src/slic3r/GUI/ConfigWizard.cpp:469 src/slic3r/GUI/Tab.cpp:1870 +#: src/slic3r/GUI/ConfigWizard.cpp:1213 +msgid "Expert mode" +msgstr "Експертний режим" + +#: src/slic3r/GUI/ConfigWizard.cpp:1219 +msgid "The size of the object can be specified in inches" +msgstr "Розмір предмета можна вказати в дюймах" + +#: src/slic3r/GUI/ConfigWizard.cpp:1220 +msgid "Use inches" +msgstr "Використовувати дюйми" + +#: src/slic3r/GUI/ConfigWizard.cpp:1254 +msgid "Other Vendors" +msgstr "Інші постачальники" + +#: src/slic3r/GUI/ConfigWizard.cpp:1258 +#, c-format +msgid "Pick another vendor supported by %s" +msgstr "Виберіть іншого постачальника, який підтримує %s" + +#: src/slic3r/GUI/ConfigWizard.cpp:1289 +msgid "Firmware Type" +msgstr "Тип прошивки" + +#: src/slic3r/GUI/ConfigWizard.cpp:1289 src/slic3r/GUI/Tab.cpp:2172 msgid "Firmware" msgstr "Прошивка" -#: src/slic3r/GUI/ConfigWizard.cpp:473 +#: src/slic3r/GUI/ConfigWizard.cpp:1293 msgid "Choose the type of firmware used by your printer." -msgstr "" +msgstr "Виберіть тип прошивки, що використовуються вашим принтером." -#: src/slic3r/GUI/ConfigWizard.cpp:507 +#: src/slic3r/GUI/ConfigWizard.cpp:1327 msgid "Bed Shape and Size" -msgstr "" +msgstr "Форма та розмір столу" -#: src/slic3r/GUI/ConfigWizard.cpp:510 +#: src/slic3r/GUI/ConfigWizard.cpp:1330 msgid "Set the shape of your printer's bed." -msgstr "" +msgstr "Встановіть форму столу свого принтеру." -#: src/slic3r/GUI/ConfigWizard.cpp:524 +#: src/slic3r/GUI/ConfigWizard.cpp:1350 msgid "Filament and Nozzle Diameters" -msgstr "" +msgstr "Діаметри філатенту та сопла" -#: src/slic3r/GUI/ConfigWizard.cpp:524 +#: src/slic3r/GUI/ConfigWizard.cpp:1350 msgid "Print Diameters" -msgstr "" +msgstr "Діаметри друку" -#: src/slic3r/GUI/ConfigWizard.cpp:540 +#: src/slic3r/GUI/ConfigWizard.cpp:1364 msgid "Enter the diameter of your printer's hot end nozzle." -msgstr "" +msgstr "Введіть діаметр кінчику екструдерного сопла." -#: src/slic3r/GUI/ConfigWizard.cpp:543 +#: src/slic3r/GUI/ConfigWizard.cpp:1367 msgid "Nozzle Diameter:" -msgstr "" +msgstr "Діаметр сопла:" -#: src/slic3r/GUI/ConfigWizard.cpp:553 +#: src/slic3r/GUI/ConfigWizard.cpp:1377 msgid "Enter the diameter of your filament." -msgstr "" +msgstr "Введіть діаметр вашого філаметну." -#: src/slic3r/GUI/ConfigWizard.cpp:554 +#: src/slic3r/GUI/ConfigWizard.cpp:1378 msgid "" "Good precision is required, so use a caliper and do multiple measurements " "along the filament, then compute the average." msgstr "" +"Необхідна висока точність, тому використовуйте калібрувальник і виконайте " +"декілька вимірювань вздовж філаменту, потім обчисліть середнє значення." -#: src/slic3r/GUI/ConfigWizard.cpp:557 +#: src/slic3r/GUI/ConfigWizard.cpp:1381 msgid "Filament Diameter:" -msgstr "" +msgstr "Діаметр філаменту:" -#: src/slic3r/GUI/ConfigWizard.cpp:575 -msgid "Extruder and Bed Temperatures" -msgstr "" +#: src/slic3r/GUI/ConfigWizard.cpp:1415 +msgid "Nozzle and Bed Temperatures" +msgstr "Температура сопла та столу" -#: src/slic3r/GUI/ConfigWizard.cpp:575 +#: src/slic3r/GUI/ConfigWizard.cpp:1415 msgid "Temperatures" -msgstr "" +msgstr "Температури" -#: src/slic3r/GUI/ConfigWizard.cpp:591 +#: src/slic3r/GUI/ConfigWizard.cpp:1431 msgid "Enter the temperature needed for extruding your filament." -msgstr "" +msgstr "Введіть температуру, необхідну для екструдування вашого філаменту." -#: src/slic3r/GUI/ConfigWizard.cpp:592 +#: src/slic3r/GUI/ConfigWizard.cpp:1432 msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." -msgstr "" +msgstr "Зазвичай - 160-230°C для PLA та 215-250°C для ABS." -#: src/slic3r/GUI/ConfigWizard.cpp:595 +#: src/slic3r/GUI/ConfigWizard.cpp:1435 msgid "Extrusion Temperature:" -msgstr "" +msgstr "Температура екструзії:" -#: src/slic3r/GUI/ConfigWizard.cpp:596 src/slic3r/GUI/ConfigWizard.cpp:610 +#: src/slic3r/GUI/ConfigWizard.cpp:1436 src/slic3r/GUI/ConfigWizard.cpp:1450 +#: src/libslic3r/PrintConfig.cpp:202 src/libslic3r/PrintConfig.cpp:950 +#: src/libslic3r/PrintConfig.cpp:994 src/libslic3r/PrintConfig.cpp:2294 msgid "°C" -msgstr "" +msgstr "°C" -#: src/slic3r/GUI/ConfigWizard.cpp:605 +#: src/slic3r/GUI/ConfigWizard.cpp:1445 msgid "" "Enter the bed temperature needed for getting your filament to stick to your " "heated bed." msgstr "" +"Введіть температуру столу, необхідну для того, щоб ваш філамент добре " +"кріпився до нагрітого столу." -#: src/slic3r/GUI/ConfigWizard.cpp:606 +#: src/slic3r/GUI/ConfigWizard.cpp:1446 msgid "" "A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have " "no heated bed." msgstr "" +"Зазвичай - 60°C для PLA та 110°C для ABS. Залиште рівним нулю, якщо стіл " +"нерозігрітий." -#: src/slic3r/GUI/ConfigWizard.cpp:609 +#: src/slic3r/GUI/ConfigWizard.cpp:1449 msgid "Bed Temperature:" +msgstr "Температура столу:" + +#: src/slic3r/GUI/ConfigWizard.cpp:1909 src/slic3r/GUI/ConfigWizard.cpp:2582 +msgid "Filaments" +msgstr "Філаменти" + +#: src/slic3r/GUI/ConfigWizard.cpp:1909 src/slic3r/GUI/ConfigWizard.cpp:2584 +msgid "SLA Materials" +msgstr "SLA-матеріали" + +#: src/slic3r/GUI/ConfigWizard.cpp:1963 +msgid "FFF Technology Printers" +msgstr "Принтери технології FFF" + +#: src/slic3r/GUI/ConfigWizard.cpp:1968 +msgid "SLA Technology Printers" +msgstr "Принтери технології SLA" + +#: src/slic3r/GUI/ConfigWizard.cpp:2274 src/slic3r/GUI/DoubleSlider.cpp:2245 +#: src/slic3r/GUI/DoubleSlider.cpp:2265 src/slic3r/GUI/GUI.cpp:244 +msgid "Notice" +msgstr "Зауваження" + +#: src/slic3r/GUI/ConfigWizard.cpp:2295 +msgid "The following FFF printer models have no filament selected:" +msgstr "Наступні моделі FFF-принтерів не мають вибраного філаменту:" + +#: src/slic3r/GUI/ConfigWizard.cpp:2299 +msgid "Do you want to select default filaments for these FFF printer models?" msgstr "" +"Ви хочете вибрати філаменти за замовчуванням для цих моделей FFF-принтерів?" -#: src/slic3r/GUI/ConfigWizard.cpp:1001 -msgid "Select all standard printers" +#: src/slic3r/GUI/ConfigWizard.cpp:2313 +msgid "The following SLA printer models have no materials selected:" +msgstr "Наступні моделі SLA-принтерів не мають вибраного матеріалу:" + +#: src/slic3r/GUI/ConfigWizard.cpp:2317 +msgid "Do you want to select default SLA materials for these printer models?" msgstr "" +"Ви хочете вибрати матеріали за замовчуванням для цих моделей SLA-принтерів?" + +#: src/slic3r/GUI/ConfigWizard.cpp:2545 +msgid "Select all standard printers" +msgstr "Виберіть усі стандартні принтери" -#: src/slic3r/GUI/ConfigWizard.cpp:1004 +#: src/slic3r/GUI/ConfigWizard.cpp:2548 msgid "< &Back" -msgstr "" +msgstr "< Назад" -#: src/slic3r/GUI/ConfigWizard.cpp:1005 +#: src/slic3r/GUI/ConfigWizard.cpp:2549 msgid "&Next >" -msgstr "" +msgstr "Далі >" -#: src/slic3r/GUI/ConfigWizard.cpp:1006 +#: src/slic3r/GUI/ConfigWizard.cpp:2550 msgid "&Finish" -msgstr "" +msgstr "Завершити" -#: src/slic3r/GUI/ConfigWizard.cpp:1007 src/slic3r/GUI/FirmwareDialog.cpp:142 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:37 -#: src/slic3r/GUI/ProgressStatusBar.cpp:28 +#: src/slic3r/GUI/ConfigWizard.cpp:2551 src/slic3r/GUI/FirmwareDialog.cpp:151 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:248 +#: src/slic3r/GUI/ProgressStatusBar.cpp:26 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:656 msgid "Cancel" -msgstr "" +msgstr "Скасувати" -#: src/slic3r/GUI/ConfigWizard.cpp:1021 +#: src/slic3r/GUI/ConfigWizard.cpp:2564 msgid "Prusa FFF Technology Printers" -msgstr "" +msgstr "Принтери технології FFF" -#: src/slic3r/GUI/ConfigWizard.cpp:1024 +#: src/slic3r/GUI/ConfigWizard.cpp:2567 msgid "Prusa MSLA Technology Printers" -msgstr "" +msgstr "Принтери технології MSLA" -#: src/slic3r/GUI/ConfigWizard.cpp:1111 +#: src/slic3r/GUI/ConfigWizard.cpp:2582 +msgid "Filament Profiles Selection" +msgstr "Вибір профілів філаменту" + +#: src/slic3r/GUI/ConfigWizard.cpp:2582 src/slic3r/GUI/ConfigWizard.cpp:2584 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4144 +msgid "Type:" +msgstr "Тип:" + +#: src/slic3r/GUI/ConfigWizard.cpp:2584 +msgid "SLA Material Profiles Selection" +msgstr "Вибір профілів SLA-матеріалу" + +#: src/slic3r/GUI/ConfigWizard.cpp:2701 +msgid "Configuration Assistant" +msgstr "Асистент конфігурації" + +#: src/slic3r/GUI/ConfigWizard.cpp:2702 +msgid "Configuration &Assistant" +msgstr "Асистент конфігурації" + +#: src/slic3r/GUI/ConfigWizard.cpp:2704 msgid "Configuration Wizard" -msgstr "" +msgstr "Майстер конфігурації" -#: src/slic3r/GUI/ConfigWizard.cpp:1112 +#: src/slic3r/GUI/ConfigWizard.cpp:2705 msgid "Configuration &Wizard" +msgstr "Майстер конфігурації" + +#: src/slic3r/GUI/DoubleSlider.cpp:97 +msgid "Place bearings in slots and resume printing" +msgstr "Розмістіть необхідні деталі в гніздах і відновіть друк" + +#: src/slic3r/GUI/DoubleSlider.cpp:1224 +msgid "One layer mode" +msgstr "Одношаровий режим" + +#: src/slic3r/GUI/DoubleSlider.cpp:1226 +msgid "Discard all custom changes" +msgstr "Відхилити всі користувацькі зміни" + +#: src/slic3r/GUI/DoubleSlider.cpp:1230 src/slic3r/GUI/DoubleSlider.cpp:1995 +msgid "Jump to move" +msgstr "Перейти до руху" + +#: src/slic3r/GUI/DoubleSlider.cpp:1233 +#, c-format +msgid "" +"Jump to height %s\n" +"Set ruler mode\n" +"or Set extruder sequence for the entire print" msgstr "" +"Перейти на висоту %s\n" +"Налаштувати режим лінійки\n" +"або Налаштувати послідовність екструдерів для поточного тіску" -#: src/slic3r/GUI/ConfigWizard.cpp:1114 -msgid "Configuration Assistant" +#: src/slic3r/GUI/DoubleSlider.cpp:1236 +#, c-format +msgid "" +"Jump to height %s\n" +"or Set ruler mode" msgstr "" +"Перейти на висоту %s\n" +"або Налаштувати режим лінійки" -#: src/slic3r/GUI/ConfigWizard.cpp:1115 -msgid "Configuration &Assistant" +#: src/slic3r/GUI/DoubleSlider.cpp:1241 +msgid "Edit current color - Right click the colored slider segment" msgstr "" +"Редагувати поточний колір - Клацніть правою кнопкою миші на кольоровий " +"сегмент повзунка" -#: src/slic3r/GUI/Field.cpp:112 -msgid "default value" +#: src/slic3r/GUI/DoubleSlider.cpp:1251 +msgid "Print mode" +msgstr "Режим друку" + +#: src/slic3r/GUI/DoubleSlider.cpp:1265 +msgid "Add extruder change - Left click" +msgstr "Додати зміну екструдеру - ліва кнопка миші" + +#: src/slic3r/GUI/DoubleSlider.cpp:1267 +msgid "" +"Add color change - Left click for predefined color or Shift + Left click for " +"custom color selection" msgstr "" +"Додати зміну кольору - ліва кнопка миші для попередньо визначеного кольору " +"або Shift + ліва кнопка миші для властного вибору кольору" -#: src/slic3r/GUI/Field.cpp:115 -msgid "parameter name" +#: src/slic3r/GUI/DoubleSlider.cpp:1269 +msgid "Add color change - Left click" +msgstr "Додати зміну кольору - ліва кнопка миші" + +#: src/slic3r/GUI/DoubleSlider.cpp:1270 +msgid "or press \"+\" key" +msgstr "або натисніть клавішу \"+\"" + +#: src/slic3r/GUI/DoubleSlider.cpp:1272 +msgid "Add another code - Ctrl + Left click" +msgstr "Додайте інший код - Ctrl + ліва кнопка миші" + +#: src/slic3r/GUI/DoubleSlider.cpp:1273 +msgid "Add another code - Right click" +msgstr "Додайте інший код - права кнопка миші" + +#: src/slic3r/GUI/DoubleSlider.cpp:1279 +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 "" +"Послідовний друк увімкнено.\n" +"Неможливо застосувати будь-який власний G-код для послідовного друку " +"об'єктів.\n" +"Цей код не буде оброблятися під час створення G-коду." + +#: src/slic3r/GUI/DoubleSlider.cpp:1288 +msgid "Color change (\"%1%\")" +msgstr "Зміну кольору (\"%1%\")" + +#: src/slic3r/GUI/DoubleSlider.cpp:1289 +msgid "Color change (\"%1%\") for Extruder %2%" +msgstr "Зміну кольору (\"%1%\") для екструдеру %2%" + +#: src/slic3r/GUI/DoubleSlider.cpp:1291 +msgid "Pause print (\"%1%\")" +msgstr "Пауза друку (\"%1%\")" + +#: src/slic3r/GUI/DoubleSlider.cpp:1293 +msgid "Custom template (\"%1%\")" +msgstr "Користувацький шаблон (\"%1%\")" + +#: src/slic3r/GUI/DoubleSlider.cpp:1295 +msgid "Extruder (tool) is changed to Extruder \"%1%\"" +msgstr "Екструдер (інструмент) змінено на Екструдер \"%1%\"" + +#: src/slic3r/GUI/DoubleSlider.cpp:1302 +msgid "Note" +msgstr "Примітка" + +#: src/slic3r/GUI/DoubleSlider.cpp:1304 +msgid "" +"G-code associated to this tick mark is in a conflict with print mode.\n" +"Editing it will cause changes of Slider data." +msgstr "" +"G-код, пов'язаний з цим маркером, суперечить режиму друку.\n" +"Редагування призведе до змін даних повзунка." + +#: src/slic3r/GUI/DoubleSlider.cpp:1307 +msgid "" +"There is a color change for extruder that won't be used till the end of " +"print job.\n" +"This code won't be processed during G-code generation." +msgstr "" +"Змінено колір екструдера, який не використовуватиметься до кінця завдання " +"друку.\n" +"Цей код не буде оброблятися під час створення G-коду." + +#: src/slic3r/GUI/DoubleSlider.cpp:1310 +msgid "" +"There is an extruder change set to the same extruder.\n" +"This code won't be processed during G-code generation." msgstr "" +"Існує зміна екструдера, встановлена на той самий екструдер.\n" +"Цей код не буде оброблятися під час створення G-коду." -#: src/slic3r/GUI/Field.cpp:143 +#: src/slic3r/GUI/DoubleSlider.cpp:1313 +msgid "" +"There is a color change for extruder that has not been used before.\n" +"Check your settings to avoid redundant color changes." +msgstr "" +"Змінюється колір екструдера, який раніше не застосовувався.\n" +"Перевірте свої налаштування, щоб уникнути зайвих змін кольору." + +#: src/slic3r/GUI/DoubleSlider.cpp:1318 +msgid "Delete tick mark - Left click or press \"-\" key" +msgstr "" +"Видалити маркер - клацніть лівою кнопкою миші або натисніть клавішу \"-\"" + +#: src/slic3r/GUI/DoubleSlider.cpp:1320 +msgid "Edit tick mark - Ctrl + Left click" +msgstr "Змінити маркер - Ctrl+Ліва кнопка миші" + +#: src/slic3r/GUI/DoubleSlider.cpp:1321 +msgid "Edit tick mark - Right click" +msgstr "Змінити маркер - Права кнопка миші" + +#: src/slic3r/GUI/DoubleSlider.cpp:1417 src/slic3r/GUI/DoubleSlider.cpp:1451 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1864 #, c-format -msgid "%s doesn't support percentage" +msgid "Extruder %d" +msgstr "Екструдер %d" + +#: src/slic3r/GUI/DoubleSlider.cpp:1418 src/slic3r/GUI/GUI_ObjectList.cpp:1865 +msgid "active" +msgstr "активний" + +#: src/slic3r/GUI/DoubleSlider.cpp:1427 +msgid "Switch code to Change extruder" +msgstr "Переключити код на \"Змінити екструдер\"" + +#: src/slic3r/GUI/DoubleSlider.cpp:1427 src/slic3r/GUI/GUI_ObjectList.cpp:1832 +msgid "Change extruder" +msgstr "Змінити екструдер" + +#: src/slic3r/GUI/DoubleSlider.cpp:1428 +msgid "Change extruder (N/A)" +msgstr "Змінити екструдер (Недоступний)" + +#: src/slic3r/GUI/DoubleSlider.cpp:1430 +msgid "Use another extruder" +msgstr "Використати інший екструдер" + +#: src/slic3r/GUI/DoubleSlider.cpp:1452 +msgid "used" +msgstr "використовується" + +#: src/slic3r/GUI/DoubleSlider.cpp:1460 +msgid "Switch code to Color change (%1%) for:" +msgstr "Переключити код на \"Змінити колір\" (%1%) для:" + +#: src/slic3r/GUI/DoubleSlider.cpp:1461 +msgid "Add color change (%1%) for:" +msgstr "Додати зміну кольору (%1%) для:" + +#: src/slic3r/GUI/DoubleSlider.cpp:1797 +msgid "Add color change" +msgstr "Додати зміну кольору" + +#: src/slic3r/GUI/DoubleSlider.cpp:1808 +msgid "Add pause print" +msgstr "Додати паузу друку" + +#: src/slic3r/GUI/DoubleSlider.cpp:1812 +msgid "Add custom template" +msgstr "Додати власний шаблон" + +#: src/slic3r/GUI/DoubleSlider.cpp:1815 +msgid "Add custom G-code" +msgstr "Додати власний G-код" + +#: src/slic3r/GUI/DoubleSlider.cpp:1833 +msgid "Edit color" +msgstr "Редагувати колір" + +#: src/slic3r/GUI/DoubleSlider.cpp:1834 +msgid "Edit pause print message" +msgstr "Редагувати повідомлення під час паузи друку" + +#: src/slic3r/GUI/DoubleSlider.cpp:1835 +msgid "Edit custom G-code" +msgstr "Редагувати власний G-код" + +#: src/slic3r/GUI/DoubleSlider.cpp:1841 +msgid "Delete color change" +msgstr "Видалити зміну кольору" + +#: src/slic3r/GUI/DoubleSlider.cpp:1842 +msgid "Delete tool change" +msgstr "Видалити зміну інструменту" + +#: src/slic3r/GUI/DoubleSlider.cpp:1843 +msgid "Delete pause print" +msgstr "Видалити паузу друку" + +#: src/slic3r/GUI/DoubleSlider.cpp:1844 +msgid "Delete custom G-code" +msgstr "Видалити власний G-код" + +#: src/slic3r/GUI/DoubleSlider.cpp:1854 src/slic3r/GUI/DoubleSlider.cpp:1995 +msgid "Jump to height" +msgstr "Перейти на висоту" + +#: src/slic3r/GUI/DoubleSlider.cpp:1859 +msgid "Hide ruler" +msgstr "Сховати лінійку" + +#: src/slic3r/GUI/DoubleSlider.cpp:1863 +msgid "Show object height" +msgstr "Показувати висоту об’єкта" + +#: src/slic3r/GUI/DoubleSlider.cpp:1863 +msgid "Show object height on the ruler" +msgstr "Показувати висоту об’єкта на лінійці" + +#: src/slic3r/GUI/DoubleSlider.cpp:1867 +msgid "Show estimated print time" +msgstr "Показувати приблизний час друку" + +#: src/slic3r/GUI/DoubleSlider.cpp:1867 +msgid "Show estimated print time on the ruler" +msgstr "Показувати приблизний час друку на лінійці" + +#: src/slic3r/GUI/DoubleSlider.cpp:1871 +msgid "Ruler mode" +msgstr "Режим лінійки" + +#: src/slic3r/GUI/DoubleSlider.cpp:1871 +msgid "Set ruler mode" +msgstr "Встановити режим лінійки" + +#: src/slic3r/GUI/DoubleSlider.cpp:1876 +msgid "Set extruder sequence for the entire print" +msgstr "Встановити послідовність екструдерів для всього друку" + +#: src/slic3r/GUI/DoubleSlider.cpp:1962 +msgid "Enter custom G-code used on current layer" +msgstr "Введіть власний G-код, для використання на поточному шарі" + +#: src/slic3r/GUI/DoubleSlider.cpp:1963 +msgid "Custom G-code on current layer (%1% mm)." +msgstr "Користувацький G-код на поточному шарі (%1% мм)." + +#: src/slic3r/GUI/DoubleSlider.cpp:1978 +msgid "Enter short message shown on Printer display when a print is paused" msgstr "" +"Введіть коротке повідомлення, що відображатиметься на дисплеї принтера піж " +"час паузи друку" -#: src/slic3r/GUI/Field.cpp:157 src/slic3r/GUI/Field.cpp:180 -msgid "Invalid numeric input." +#: src/slic3r/GUI/DoubleSlider.cpp:1979 +msgid "Message for pause print on current layer (%1% mm)." +msgstr "Повідомлення для паузи друку на поточному шарі (%1% мм)." + +#: src/slic3r/GUI/DoubleSlider.cpp:1994 +msgid "Enter the move you want to jump to" +msgstr "Введіть рух, до якого ви хочете перейти" + +#: src/slic3r/GUI/DoubleSlider.cpp:1994 +msgid "Enter the height you want to jump to" +msgstr "Введіть висоту, на яку ви хочете перейти" + +#: src/slic3r/GUI/DoubleSlider.cpp:2239 +msgid "The last color change data was saved for a single extruder printing." msgstr "" +"Дані про останню зміну кольору були збережені для одно-екструдерного друку." -#: src/slic3r/GUI/Field.cpp:162 -msgid "Input value is out of range" +#: src/slic3r/GUI/DoubleSlider.cpp:2240 src/slic3r/GUI/DoubleSlider.cpp:2255 +msgid "The last color change data was saved for a multi extruder printing." +msgstr "" +"Дані про останню зміну кольору були збережені для багато-екструдерного друку." + +#: src/slic3r/GUI/DoubleSlider.cpp:2242 +msgid "Your current changes will delete all saved color changes." +msgstr "Ваші поточні зміни видалять усі збережені зміни кольору." + +#: src/slic3r/GUI/DoubleSlider.cpp:2243 src/slic3r/GUI/DoubleSlider.cpp:2263 +msgid "Are you sure you want to continue?" +msgstr "Ви впевнені, що хочете продовжити?" + +#: src/slic3r/GUI/DoubleSlider.cpp:2256 +msgid "" +"Select YES if you want to delete all saved tool changes, \n" +"NO if you want all tool changes switch to color changes, \n" +"or CANCEL to leave it unchanged." +msgstr "" +"Виберіть ТАК, якщо ви хочете видалити всі збережені зміни інструменту,\n" +"НІ, якщо ви хочете, щоб усі зміни інструменту було змінено на зміну " +"кольору,\n" +"або СКАСУВАТИ, щоб залишити це без змін." + +#: src/slic3r/GUI/DoubleSlider.cpp:2259 +msgid "Do you want to delete all saved tool changes?" +msgstr "Ви хочете видалити всі збережені зміни інструменту?" + +#: src/slic3r/GUI/DoubleSlider.cpp:2261 +msgid "" +"The last color change data was saved for a multi extruder printing with tool " +"changes for whole print." msgstr "" +"Дані про останню зміну кольору були збережені для багато-екструдерного друку " +"зі зміною інструменту для цілого друку." -#: src/slic3r/GUI/Field.cpp:188 +#: src/slic3r/GUI/DoubleSlider.cpp:2262 +msgid "Your current changes will delete all saved extruder (tool) changes." +msgstr "" +"Ваші поточні зміни видалять усі збережені зміни екструдера (інструменту)." + +#: src/slic3r/GUI/ExtraRenderers.cpp:297 src/slic3r/GUI/GUI_ObjectList.cpp:512 +#: src/slic3r/GUI/GUI_ObjectList.cpp:524 src/slic3r/GUI/GUI_ObjectList.cpp:1033 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4582 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4592 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4627 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:209 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:266 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:291 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:499 src/libslic3r/PrintConfig.cpp:552 +msgid "default" +msgstr "за замовчанням" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:24 +msgid "Set extruder sequence" +msgstr "Встановити послідовність екструдерів" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:40 +msgid "Set extruder change for every" +msgstr "Встановіть зміну екструдера для кожних" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:53 +#: src/libslic3r/PrintConfig.cpp:418 src/libslic3r/PrintConfig.cpp:1089 +#: src/libslic3r/PrintConfig.cpp:1718 src/libslic3r/PrintConfig.cpp:1883 +#: src/libslic3r/PrintConfig.cpp:1950 src/libslic3r/PrintConfig.cpp:2157 +#: src/libslic3r/PrintConfig.cpp:2203 +msgid "layers" +msgstr "шару(ів)" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:137 +msgid "Set extruder(tool) sequence" +msgstr "Встановити послідовність екструдерів (інструментів)" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:183 +msgid "Remove extruder from sequence" +msgstr "Видалити екструдер з послідовності" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:193 +msgid "Add extruder to sequence" +msgstr "Додати екструдер до послідовності" + +#: src/slic3r/GUI/Field.cpp:197 +msgid "default value" +msgstr "значення за замовчанням" + +#: src/slic3r/GUI/Field.cpp:200 +msgid "parameter name" +msgstr "назва параметра" + +#: src/slic3r/GUI/Field.cpp:211 src/slic3r/GUI/OptionsGroup.cpp:781 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:886 +msgid "N/A" +msgstr "Н/Д" + +#: src/slic3r/GUI/Field.cpp:233 +#, c-format +msgid "%s doesn't support percentage" +msgstr "%s не підтримує відсотки" + +#: src/slic3r/GUI/Field.cpp:253 src/slic3r/GUI/Field.cpp:307 +#: src/slic3r/GUI/Field.cpp:1520 src/slic3r/GUI/GUI_ObjectLayers.cpp:413 +msgid "Invalid numeric input." +msgstr "Недійсне числове значення." + +#: src/slic3r/GUI/Field.cpp:264 #, c-format msgid "" -"Do you mean %d%% instead of %d %s?\n" -"Select YES if you want to change this value to %d%%, \n" -"or NO if you are sure that %d %s is a correct value." +"Input value is out of range\n" +"Are you sure that %s is a correct value and that you want to continue?" msgstr "" +"Вхідне значення виходить за межі діапазону\n" +"Ви впевнені, що %s є правильним значенням і хочете продовжити?" -#: src/slic3r/GUI/Field.cpp:191 +#: src/slic3r/GUI/Field.cpp:266 src/slic3r/GUI/Field.cpp:326 msgid "Parameter validation" +msgstr "Перевірка параметрів" + +#: src/slic3r/GUI/Field.cpp:279 src/slic3r/GUI/Field.cpp:373 +#: src/slic3r/GUI/Field.cpp:1532 +msgid "Input value is out of range" +msgstr "Вхідне значення виходить за межі діапазону" + +#: src/slic3r/GUI/Field.cpp:323 +#, c-format +msgid "" +"Do you mean %s%% instead of %s %s?\n" +"Select YES if you want to change this value to %s%%, \n" +"or NO if you are sure that %s %s is a correct value." msgstr "" +"Ви маєте на увазі %s%% замість %s %s?\n" +"Виберіть ТАК, якщо ви хочете змінити це значення на %s%%,\n" +"або НІ, якщо ви впевнені, що %s %s є правильним значенням." -#: src/slic3r/GUI/FirmwareDialog.cpp:141 -msgid "Flash!" +#: src/slic3r/GUI/Field.cpp:381 +msgid "" +"Invalid input format. Expected vector of dimensions in the following format: " +"\"%1%\"" msgstr "" +"Недійсний формат введення. Очікується вектор розмірів у наступному форматі: " +"\"%1%\"" -#: src/slic3r/GUI/FirmwareDialog.cpp:143 +#: src/slic3r/GUI/FirmwareDialog.cpp:150 +msgid "Flash!" +msgstr "Прошити!" + +#: src/slic3r/GUI/FirmwareDialog.cpp:152 msgid "Flashing in progress. Please do not disconnect the printer!" -msgstr "" +msgstr "Триває прошивка. Будь ласка, не від'єднуй принтер!" -#: src/slic3r/GUI/FirmwareDialog.cpp:187 -msgid "Flashing failed: " -msgstr "" +#: src/slic3r/GUI/FirmwareDialog.cpp:199 +msgid "Flashing failed" +msgstr "Помилка прошивки" -#: src/slic3r/GUI/FirmwareDialog.cpp:268 +#: src/slic3r/GUI/FirmwareDialog.cpp:282 msgid "Flashing succeeded!" -msgstr "" +msgstr "Прошивка вдалася!" -#: src/slic3r/GUI/FirmwareDialog.cpp:269 +#: src/slic3r/GUI/FirmwareDialog.cpp:283 msgid "Flashing failed. Please see the avrdude log below." -msgstr "" +msgstr "Помилка прошивки. Будь ласка, переглянте журнал avrdude нижче." -#: src/slic3r/GUI/FirmwareDialog.cpp:270 +#: src/slic3r/GUI/FirmwareDialog.cpp:284 msgid "Flashing cancelled." -msgstr "" +msgstr "Прошивку скасовано." -#: src/slic3r/GUI/FirmwareDialog.cpp:308 +#: src/slic3r/GUI/FirmwareDialog.cpp:332 #, c-format msgid "" "This firmware hex file does not match the printer model.\n" @@ -574,1779 +1531,4036 @@ msgid "" "Do you want to continue and flash this hex file anyway?\n" "Please only continue if you are sure this is the right thing to do." msgstr "" +"Цей hex-файл не відповідає моделі принтера.\n" +"Даний hex-файл призначений для: %s\n" +"Повідомлено для принтеру: %s\n" +"\n" +"Продовжити роботу та все одно прошити цей hex-файл?\n" +"Будь ласка, продовжуйте, тільки якщо ви впевнені, що це правильно робити." -#: src/slic3r/GUI/FirmwareDialog.cpp:395 src/slic3r/GUI/FirmwareDialog.cpp:431 +#: src/slic3r/GUI/FirmwareDialog.cpp:419 src/slic3r/GUI/FirmwareDialog.cpp:454 #, c-format msgid "" "Multiple %s devices found. Please only connect one at a time for flashing." msgstr "" +"Знайдено кілька пристроїв %s . Будь ласка, підключайте лише один пристрій " +"для прошивки." -#: src/slic3r/GUI/FirmwareDialog.cpp:412 +#: src/slic3r/GUI/FirmwareDialog.cpp:436 #, c-format msgid "" "The %s device was not found.\n" "If the device is connected, please press the Reset button next to the USB " "connector ..." msgstr "" +"Пристрій %s не знайдено.\n" +"Якщо пристрій підключений, натисніть кнопку Скинути поруч з USB-роз'ємом ..." -#: src/slic3r/GUI/FirmwareDialog.cpp:525 +#: src/slic3r/GUI/FirmwareDialog.cpp:548 #, c-format msgid "The %s device could not have been found" -msgstr "" +msgstr "Пристрою %s не знайдено" -#: src/slic3r/GUI/FirmwareDialog.cpp:603 +#: src/slic3r/GUI/FirmwareDialog.cpp:645 #, c-format msgid "Error accessing port at %s: %s" -msgstr "" +msgstr "Помилка доступу до порту на %s: %s" -#: src/slic3r/GUI/FirmwareDialog.cpp:605 +#: src/slic3r/GUI/FirmwareDialog.cpp:647 #, c-format msgid "Error: %s" -msgstr "" +msgstr "Помилка: %s" -#: src/slic3r/GUI/FirmwareDialog.cpp:735 +#: src/slic3r/GUI/FirmwareDialog.cpp:777 msgid "Firmware flasher" -msgstr "" +msgstr "Пепепрошивка" -#: src/slic3r/GUI/FirmwareDialog.cpp:762 +#: src/slic3r/GUI/FirmwareDialog.cpp:802 msgid "Firmware image:" -msgstr "" +msgstr "Імідж прошивки:" + +#: src/slic3r/GUI/FirmwareDialog.cpp:805 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:289 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:364 +msgid "Browse" +msgstr "Переглянути" -#: src/slic3r/GUI/FirmwareDialog.cpp:766 +#: src/slic3r/GUI/FirmwareDialog.cpp:807 msgid "Serial port:" -msgstr "" +msgstr "Послідовний порт:" -#: src/slic3r/GUI/FirmwareDialog.cpp:768 +#: src/slic3r/GUI/FirmwareDialog.cpp:809 msgid "Autodetected" -msgstr "" +msgstr "Автоматично виявлено" -#: src/slic3r/GUI/FirmwareDialog.cpp:769 +#: src/slic3r/GUI/FirmwareDialog.cpp:810 msgid "Rescan" -msgstr "" +msgstr "Пересканувати" -#: src/slic3r/GUI/FirmwareDialog.cpp:776 +#: src/slic3r/GUI/FirmwareDialog.cpp:817 msgid "Progress:" -msgstr "" +msgstr "Прогрес:" -#: src/slic3r/GUI/FirmwareDialog.cpp:779 +#: src/slic3r/GUI/FirmwareDialog.cpp:820 msgid "Status:" -msgstr "" +msgstr "Статус:" -#: src/slic3r/GUI/FirmwareDialog.cpp:780 +#: src/slic3r/GUI/FirmwareDialog.cpp:821 msgid "Ready" -msgstr "" +msgstr "Готово" -#: src/slic3r/GUI/FirmwareDialog.cpp:800 +#: src/slic3r/GUI/FirmwareDialog.cpp:841 msgid "Advanced: Output log" -msgstr "" +msgstr "Розширений: журнал виводу" -#: src/slic3r/GUI/FirmwareDialog.cpp:811 -#: src/slic3r/GUI/PrintHostDialogs.cpp:161 +#: src/slic3r/GUI/FirmwareDialog.cpp:852 +#: src/slic3r/GUI/Mouse3DController.cpp:551 +#: src/slic3r/GUI/PrintHostDialogs.cpp:189 msgid "Close" -msgstr "" +msgstr "Закрити" -#: src/slic3r/GUI/FirmwareDialog.cpp:859 +#: src/slic3r/GUI/FirmwareDialog.cpp:902 msgid "" "Are you sure you want to cancel firmware flashing?\n" "This could leave your printer in an unusable state!" msgstr "" +"Ви впевнені, що хочете скасувати перепрошивку?\n" +"Це може привести ваш принтер у непридатний стан!" -#: src/slic3r/GUI/FirmwareDialog.cpp:860 +#: src/slic3r/GUI/FirmwareDialog.cpp:903 msgid "Confirmation" -msgstr "" +msgstr "Підтвердження" -#: src/slic3r/GUI/FirmwareDialog.cpp:863 +#: src/slic3r/GUI/FirmwareDialog.cpp:906 msgid "Cancelling..." -msgstr "" +msgstr "Скасування..." -#: src/slic3r/GUI/GLCanvas3D.cpp:709 -msgid "Detected object outside print volume" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:239 +msgid "Tool position" +msgstr "Позиція інструменту" -#: src/slic3r/GUI/GLCanvas3D.cpp:710 -msgid "Detected toolpath outside print volume" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:1016 +msgid "Generating toolpaths" +msgstr "Створення траєкторій" -#: src/slic3r/GUI/GLCanvas3D.cpp:711 -msgid "Some objects are not visible when editing supports" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:1405 +msgid "Generating vertex buffer" +msgstr "Створення буфера вершин" -#: src/slic3r/GUI/GLCanvas3D.cpp:713 -msgid "" -"Detected object outside print volume\n" -"Resolve a clash to continue slicing/export process correctly" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:1496 +msgid "Generating index buffers" +msgstr "Формування буферів індексів" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:35 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:195 -msgid "Rotate lower part upwards" -msgstr "Повернути нижню частину вгору" +#: src/slic3r/GUI/GCodeViewer.cpp:2225 +msgid "Click to hide" +msgstr "Клацніть, щоб сховати" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:36 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:198 -msgid "Perform cut" -msgstr "Виконати розріз" +#: src/slic3r/GUI/GCodeViewer.cpp:2225 +msgid "Click to show" +msgstr "Клацніть, щоб показати" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:43 -msgid "Cut object:" -msgstr "Розрізати об'єкт:" +#: src/slic3r/GUI/GCodeViewer.cpp:2337 +msgid "up to" +msgstr "аж до" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:88 -msgid "Cut [C]" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2343 +msgid "above" +msgstr "вище" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 src/libslic3r/PrintConfig.cpp:3006 -msgid "Cut" -msgstr "Розрізати" +#: src/slic3r/GUI/GCodeViewer.cpp:2351 +msgid "from" +msgstr "від" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:193 -msgid "Keep upper part" -msgstr "Залишити верхню частину" +#: src/slic3r/GUI/GCodeViewer.cpp:2351 +msgid "to" +msgstr "до" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:194 -msgid "Keep lower part" -msgstr "Залишити нижню частину" +#: src/slic3r/GUI/GCodeViewer.cpp:2379 src/slic3r/GUI/GCodeViewer.cpp:2387 +#: src/slic3r/GUI/GUI_Preview.cpp:214 src/slic3r/GUI/GUI_Preview.cpp:533 +#: src/slic3r/GUI/GUI_Preview.cpp:942 +msgid "Feature type" +msgstr "Тип ознаки" -#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:32 -msgid "Place on face [F]" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2379 src/slic3r/GUI/GCodeViewer.cpp:2387 +#: src/slic3r/GUI/RammingChart.cpp:76 +msgid "Time" +msgstr "Час" -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:51 -msgid "Move [M]" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2387 +msgid "Percentage" +msgstr "Процент" -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:176 -msgid "Position (mm)" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2390 +msgid "Height (mm)" +msgstr "Висота (мм)" -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:176 -msgid "Displacement (mm)" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2391 +msgid "Width (mm)" +msgstr "Ширина (мм)" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:458 -msgid "Rotate [R]" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2392 +msgid "Speed (mm/s)" +msgstr "Швидкість (мм/с)" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:491 -msgid "Rotation (deg)" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2393 +msgid "Fan Speed (%)" +msgstr "Швидкість вентилятора (%)" -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:51 -msgid "Scale [S]" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2394 +msgid "Volumetric flow rate (mm³/s)" +msgstr "Об'ємна швидкість потоку (мм³/с)" -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:276 -msgid "Scale (%)" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2395 src/slic3r/GUI/GUI_Preview.cpp:220 +#: src/slic3r/GUI/GUI_Preview.cpp:326 src/slic3r/GUI/GUI_Preview.cpp:471 +#: src/slic3r/GUI/GUI_Preview.cpp:532 src/slic3r/GUI/GUI_Preview.cpp:878 +#: src/slic3r/GUI/GUI_Preview.cpp:942 +msgid "Tool" +msgstr "Інструмент" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:597 -msgid "Left mouse click - add point" -msgstr "Ліва кнопка миші - додати точку" +#: src/slic3r/GUI/GCodeViewer.cpp:2396 src/slic3r/GUI/GUI_Preview.cpp:221 +#: src/slic3r/GUI/GUI_Preview.cpp:530 src/slic3r/GUI/GUI_Preview.cpp:941 +msgid "Color Print" +msgstr "Кольоровий друк" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:598 -msgid "Right mouse click - remove point" -msgstr "Права кнопка миші - видалити точку" +#: src/slic3r/GUI/GCodeViewer.cpp:2432 src/slic3r/GUI/GCodeViewer.cpp:2467 +#: src/slic3r/GUI/GCodeViewer.cpp:2472 src/slic3r/GUI/GUI_ObjectList.cpp:312 +#: src/slic3r/GUI/wxExtensions.cpp:519 src/libslic3r/PrintConfig.cpp:547 +msgid "Extruder" +msgstr "Екструдер" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:599 -msgid "Shift + Left (+ drag) - select point(s)" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2443 +msgid "Default color" +msgstr "Колір за замовчуванням" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:606 -msgid "Head diameter: " -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2467 +msgid "default color" +msgstr "колір за замовчуванням" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:618 -msgid "Lock supports under new islands" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2562 src/slic3r/GUI/GCodeViewer.cpp:2608 +msgid "Color change" +msgstr "Зміна кольору" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:622 -msgid "Remove selected points" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2581 src/slic3r/GUI/GCodeViewer.cpp:2606 +msgid "Print" +msgstr "Друк" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:626 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:679 -msgid "Remove all points" -msgstr "Видалити всі точки" +#: src/slic3r/GUI/GCodeViewer.cpp:2607 src/slic3r/GUI/GCodeViewer.cpp:2624 +msgid "Pause" +msgstr "Пауза" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:631 -msgid "Apply changes" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2612 src/slic3r/GUI/GCodeViewer.cpp:2615 +msgid "Event" +msgstr "Подія" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:636 -msgid "Discard changes" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2612 src/slic3r/GUI/GCodeViewer.cpp:2615 +msgid "Remaining time" +msgstr "Час, що залишився" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:644 -msgid "Minimal points distance: " -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2615 +msgid "Duration" +msgstr "Тривалість" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:655 -msgid "Support points density: " -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2650 src/slic3r/GUI/GUI_Preview.cpp:1023 +#: src/libslic3r/PrintConfig.cpp:2380 +msgid "Travel" +msgstr "Пересування" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:669 -msgid "Auto-generate points [A]" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2653 +msgid "Movement" +msgstr "Переміщення" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:675 -msgid "Manual editing [M]" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2654 +msgid "Extrusion" +msgstr "Екструзія" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:738 -msgid "SLA Support Points [L]" -msgstr "Точки SLA підтримки [L]" +#: src/slic3r/GUI/GCodeViewer.cpp:2655 src/slic3r/GUI/Tab.cpp:1694 +#: src/slic3r/GUI/Tab.cpp:2582 +msgid "Retraction" +msgstr "Переривання" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:767 -msgid "Do you want to save your manually edited support points ?\n" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2672 src/slic3r/GUI/GCodeViewer.cpp:2675 +#: src/slic3r/GUI/GUI_Preview.cpp:1024 +msgid "Wipe" +msgstr "Витирання" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:768 -msgid "Save changes?" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2706 src/slic3r/GUI/GUI_Preview.cpp:248 +#: src/slic3r/GUI/GUI_Preview.cpp:262 +msgid "Options" +msgstr "Параметри" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897 -msgid "" -"Autogeneration will erase all manually edited points.\n" -"\n" -"Are you sure you want to do it?\n" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2709 src/slic3r/GUI/GUI_Preview.cpp:1025 +msgid "Retractions" +msgstr "Переривання" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:899 src/slic3r/GUI/GUI.cpp:288 -#: src/slic3r/GUI/WipeTowerDialog.cpp:44 src/slic3r/GUI/WipeTowerDialog.cpp:328 -msgid "Warning" -msgstr "Застереження" +#: src/slic3r/GUI/GCodeViewer.cpp:2710 src/slic3r/GUI/GUI_Preview.cpp:1026 +msgid "Deretractions" +msgstr "Зниження" -#: src/slic3r/GUI/GUI.cpp:147 src/slic3r/GUI/Tab.cpp:2720 -msgid "It's impossible to print multi-part object(s) with SLA technology." -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2711 src/slic3r/GUI/GUI_Preview.cpp:1027 +msgid "Tool changes" +msgstr "Зміна інструменту" -#: src/slic3r/GUI/GUI.cpp:148 -msgid "Please check and fix your object list." -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2712 src/slic3r/GUI/GUI_Preview.cpp:1028 +msgid "Color changes" +msgstr "Зміни кольору" -#: src/slic3r/GUI/GUI.cpp:149 src/slic3r/GUI/GUI_App.cpp:679 -#: src/slic3r/GUI/Tab.cpp:2722 -msgid "Attention!" -msgstr "Увага!" +#: src/slic3r/GUI/GCodeViewer.cpp:2713 src/slic3r/GUI/GUI_Preview.cpp:1029 +msgid "Print pauses" +msgstr "Паузи друку" -#: src/slic3r/GUI/GUI.cpp:282 -msgid "Notice" -msgstr "Зауваження" +#: src/slic3r/GUI/GCodeViewer.cpp:2714 src/slic3r/GUI/GUI_Preview.cpp:1030 +msgid "Custom G-codes" +msgstr "Користувацькі G-коди" -#: src/slic3r/GUI/GUI_App.cpp:318 -msgid "Changing of an application language" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2725 src/slic3r/GUI/GCodeViewer.cpp:2749 +#: src/slic3r/GUI/Plater.cpp:697 src/libslic3r/PrintConfig.cpp:117 +msgid "Printer" +msgstr "Принтер" -#: src/slic3r/GUI/GUI_App.cpp:326 src/slic3r/GUI/GUI_App.cpp:335 -msgid "Recreating" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2727 src/slic3r/GUI/GCodeViewer.cpp:2754 +#: src/slic3r/GUI/Plater.cpp:693 +msgid "Print settings" +msgstr "Параметри друку" -#: src/slic3r/GUI/GUI_App.cpp:339 -msgid "Loading of a current presets" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2730 src/slic3r/GUI/GCodeViewer.cpp:2760 +#: src/slic3r/GUI/Plater.cpp:694 src/slic3r/GUI/Tab.cpp:1794 +#: src/slic3r/GUI/Tab.cpp:1795 +msgid "Filament" +msgstr "Філамент" -#: src/slic3r/GUI/GUI_App.cpp:347 -msgid "Loading of a mode view" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2785 src/slic3r/GUI/GCodeViewer.cpp:2790 +#: src/slic3r/GUI/Plater.cpp:242 src/slic3r/GUI/Plater.cpp:1135 +#: src/slic3r/GUI/Plater.cpp:1220 +msgid "Estimated printing time" +msgstr "Приблизний час друку" -#: src/slic3r/GUI/GUI_App.cpp:429 -msgid "Choose one file (3MF):" -msgstr "" +#: src/slic3r/GUI/GCodeViewer.cpp:2785 +msgid "Normal mode" +msgstr "Нормальний режим" -#: src/slic3r/GUI/GUI_App.cpp:441 -msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):" -msgstr "Виберіть один чи кілька файлів (STL/OBJ/AMF/PRUSA):" +#: src/slic3r/GUI/GCodeViewer.cpp:2790 +msgid "Stealth mode" +msgstr "Тихий режим" -#: src/slic3r/GUI/GUI_App.cpp:454 -msgid "Array of language names and identifiers should have the same size." -msgstr "Масив імен мов та їх ідентифікаторів має бути однакового розміру." +#: src/slic3r/GUI/GCodeViewer.cpp:2817 +msgid "Show stealth mode" +msgstr "Показати тихий режим" -#: src/slic3r/GUI/GUI_App.cpp:464 -msgid "Select the language" -msgstr "Оберіть мову" +#: src/slic3r/GUI/GCodeViewer.cpp:2821 +msgid "Show normal mode" +msgstr "Показати нормальний режим" -#: src/slic3r/GUI/GUI_App.cpp:464 -msgid "Language" -msgstr "Мова" +#: src/slic3r/GUI/GLCanvas3D.cpp:236 src/slic3r/GUI/GLCanvas3D.cpp:4610 +msgid "Variable layer height" +msgstr "Змінна висота шарів" -#: src/slic3r/GUI/GUI_App.cpp:534 src/slic3r/GUI/GUI_ObjectList.cpp:1067 -#: src/libslic3r/PrintConfig.cpp:298 -msgid "Default" -msgstr "За замовчуванням" +#: src/slic3r/GUI/GLCanvas3D.cpp:238 +msgid "Left mouse button:" +msgstr "Ліва кнопка миші:" -#: src/slic3r/GUI/GUI_App.cpp:603 -msgid "&Configuration Snapshots" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:240 +msgid "Add detail" +msgstr "Додати деталь" -#: src/slic3r/GUI/GUI_App.cpp:603 -msgid "Inspect / activate configuration snapshots" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:242 +msgid "Right mouse button:" +msgstr "Права кнопка миші:" -#: src/slic3r/GUI/GUI_App.cpp:604 -msgid "Take Configuration &Snapshot" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:244 +msgid "Remove detail" +msgstr "Видалити деталь" -#: src/slic3r/GUI/GUI_App.cpp:604 -msgid "Capture a configuration snapshot" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:246 +msgid "Shift + Left mouse button:" +msgstr "Shift + Ліва кнопка миші:" -#: src/slic3r/GUI/GUI_App.cpp:607 -msgid "&Preferences" -msgstr "&Преференції" +#: src/slic3r/GUI/GLCanvas3D.cpp:248 +msgid "Reset to base" +msgstr "Скинути до базової висоти шару" -#: src/slic3r/GUI/GUI_App.cpp:613 -msgid "Application preferences" -msgstr "Преференції застосування" +#: src/slic3r/GUI/GLCanvas3D.cpp:250 +msgid "Shift + Right mouse button:" +msgstr "Shift + Права кнопка миші:" -#: src/slic3r/GUI/GUI_App.cpp:616 src/slic3r/GUI/wxExtensions.cpp:2446 -msgid "Simple" -msgstr "Простий" +#: src/slic3r/GUI/GLCanvas3D.cpp:252 +msgid "Smoothing" +msgstr "Згладжування" -#: src/slic3r/GUI/GUI_App.cpp:616 -msgid "Simple View Mode" -msgstr "Простий режим перегляду" +#: src/slic3r/GUI/GLCanvas3D.cpp:254 +msgid "Mouse wheel:" +msgstr "Колесо миші:" -#: src/slic3r/GUI/GUI_App.cpp:617 src/slic3r/GUI/GUI_ObjectList.cpp:73 -#: src/slic3r/GUI/Tab.cpp:977 src/slic3r/GUI/Tab.cpp:992 -#: src/slic3r/GUI/Tab.cpp:1090 src/slic3r/GUI/Tab.cpp:1093 -#: src/slic3r/GUI/Tab.cpp:1466 src/slic3r/GUI/Tab.cpp:1890 -#: src/slic3r/GUI/Tab.cpp:3347 src/slic3r/GUI/wxExtensions.cpp:2447 -#: src/libslic3r/PrintConfig.cpp:72 src/libslic3r/PrintConfig.cpp:186 -#: src/libslic3r/PrintConfig.cpp:349 src/libslic3r/PrintConfig.cpp:987 -#: src/libslic3r/PrintConfig.cpp:2173 -msgid "Advanced" -msgstr "Розширений" +#: src/slic3r/GUI/GLCanvas3D.cpp:256 +msgid "Increase/decrease edit area" +msgstr "Збільшити/зменшити області редагування" -#: src/slic3r/GUI/GUI_App.cpp:617 -msgid "Advanced View Mode" -msgstr "Розширений режим перегляду" +#: src/slic3r/GUI/GLCanvas3D.cpp:259 +msgid "Adaptive" +msgstr "Адаптивний" -#: src/slic3r/GUI/GUI_App.cpp:618 src/slic3r/GUI/wxExtensions.cpp:2448 -msgid "Expert" -msgstr "Експерт" +#: src/slic3r/GUI/GLCanvas3D.cpp:265 +msgid "Quality / Speed" +msgstr "Якість / Швидкість" -#: src/slic3r/GUI/GUI_App.cpp:618 -msgid "Expert View Mode" -msgstr "Режим перегляду Експерт" +#: src/slic3r/GUI/GLCanvas3D.cpp:268 +msgid "Higher print quality versus higher print speed." +msgstr "Вища якість друку порівняно з вищою швидкістю друку." -#: src/slic3r/GUI/GUI_App.cpp:623 -msgid "Mode" -msgstr "Режим" +#: src/slic3r/GUI/GLCanvas3D.cpp:279 +msgid "Smooth" +msgstr "Згладити" -#: src/slic3r/GUI/GUI_App.cpp:623 -msgid "Slic3r View Mode" -msgstr "Режим перегляду Slic3r'у" +#: src/slic3r/GUI/GLCanvas3D.cpp:285 src/libslic3r/PrintConfig.cpp:571 +msgid "Radius" +msgstr "Радіус" -#: src/slic3r/GUI/GUI_App.cpp:625 -msgid "Change Application &Language" -msgstr "Змінити &мову застосування" +#: src/slic3r/GUI/GLCanvas3D.cpp:295 +msgid "Keep min" +msgstr "Залишити мін" -#: src/slic3r/GUI/GUI_App.cpp:627 -msgid "Flash printer &firmware" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:304 src/slic3r/GUI/GLCanvas3D.cpp:4050 +msgid "Reset" +msgstr "Скинути" -#: src/slic3r/GUI/GUI_App.cpp:627 -msgid "Upload a firmware image into an Arduino based printer" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:566 +msgid "Variable layer height - Manual edit" +msgstr "Змінна висота шарів - Ручне редагування" -#: src/slic3r/GUI/GUI_App.cpp:639 -msgid "Taking configuration snapshot" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:634 +msgid "An object outside the print area was detected." +msgstr "Виявлено об'єкт за межами області друку." -#: src/slic3r/GUI/GUI_App.cpp:639 -msgid "Snapshot name" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:635 +msgid "A toolpath outside the print area was detected." +msgstr "Виявлено траєкторію за межами області друку." -#: src/slic3r/GUI/GUI_App.cpp:676 -msgid "Application will be restarted after language change." -msgstr "Застосування буде перезапущене після зміни мови." +#: src/slic3r/GUI/GLCanvas3D.cpp:636 +msgid "SLA supports outside the print area were detected." +msgstr "Виявлено SLA-підтримки за межами області друку." -#: src/slic3r/GUI/GUI_App.cpp:677 -msgid "3D-Scene will be cleaned." -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:637 +msgid "Some objects are not visible." +msgstr "Деякі об'єкти не видно." -#: src/slic3r/GUI/GUI_App.cpp:678 -msgid "Please, check your changes before." +#: src/slic3r/GUI/GLCanvas3D.cpp:639 +msgid "" +"An object outside the print area was detected.\n" +"Resolve the current problem to continue slicing." msgstr "" +"Виявлено об’єкт за межами області друку.\n" +"Вирішіть поточну проблему, щоб продовжувати нарізання." -#: src/slic3r/GUI/GUI_App.cpp:706 -msgid "&Configuration" -msgstr "&Конфігурація" +#: src/slic3r/GUI/GLCanvas3D.cpp:949 +msgid "Seq." +msgstr "Послід." -#: src/slic3r/GUI/GUI_App.cpp:726 -msgid "You have unsaved changes " -msgstr "У вас є незбережені зміни " - -#: src/slic3r/GUI/GUI_App.cpp:726 -msgid ". Discard changes and continue anyway?" -msgstr ". Відхилити зміни і продовжити в будь-якому випадку?" - -#: src/slic3r/GUI/GUI_App.cpp:727 -msgid "Unsaved Presets" -msgstr "Незбереженні налаштування" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:28 src/slic3r/GUI/GUI_ObjectList.cpp:65 -#: src/libslic3r/PrintConfig.cpp:56 src/libslic3r/PrintConfig.cpp:149 -#: src/libslic3r/PrintConfig.cpp:380 src/libslic3r/PrintConfig.cpp:437 -#: src/libslic3r/PrintConfig.cpp:445 src/libslic3r/PrintConfig.cpp:841 -#: src/libslic3r/PrintConfig.cpp:1025 src/libslic3r/PrintConfig.cpp:1304 -#: src/libslic3r/PrintConfig.cpp:1370 src/libslic3r/PrintConfig.cpp:1551 -#: src/libslic3r/PrintConfig.cpp:1986 src/libslic3r/PrintConfig.cpp:2042 -msgid "Layers and Perimeters" -msgstr "Шари та периметри" +#: src/slic3r/GUI/GLCanvas3D.cpp:1455 +msgid "Variable layer height - Reset" +msgstr "Змінна висота шарів - Скасувати" -#: src/slic3r/GUI/GUI_ObjectList.cpp:29 src/slic3r/GUI/GUI_ObjectList.cpp:66 -#: src/slic3r/GUI/Plater.cpp:431 src/slic3r/GUI/Tab.cpp:981 -#: src/slic3r/GUI/Tab.cpp:982 src/slic3r/GUI/Tab.cpp:1311 -#: src/libslic3r/PrintConfig.cpp:166 src/libslic3r/PrintConfig.cpp:388 -#: src/libslic3r/PrintConfig.cpp:728 src/libslic3r/PrintConfig.cpp:742 -#: src/libslic3r/PrintConfig.cpp:779 src/libslic3r/PrintConfig.cpp:932 -#: src/libslic3r/PrintConfig.cpp:942 src/libslic3r/PrintConfig.cpp:960 -#: src/libslic3r/PrintConfig.cpp:978 src/libslic3r/PrintConfig.cpp:997 -#: src/libslic3r/PrintConfig.cpp:1658 src/libslic3r/PrintConfig.cpp:1675 -msgid "Infill" -msgstr "Заповнення" +#: src/slic3r/GUI/GLCanvas3D.cpp:1463 +msgid "Variable layer height - Adaptive" +msgstr "Змінна висота шарів - Адаптивний" -#: src/slic3r/GUI/GUI_ObjectList.cpp:30 src/slic3r/GUI/GUI_ObjectList.cpp:67 -#: src/slic3r/GUI/GUI_Preview.cpp:236 src/slic3r/GUI/Tab.cpp:1010 -#: src/slic3r/GUI/Tab.cpp:1011 src/libslic3r/PrintConfig.cpp:333 -#: src/libslic3r/PrintConfig.cpp:1431 src/libslic3r/PrintConfig.cpp:1779 -#: src/libslic3r/PrintConfig.cpp:1785 src/libslic3r/PrintConfig.cpp:1793 -#: src/libslic3r/PrintConfig.cpp:1805 src/libslic3r/PrintConfig.cpp:1815 -#: src/libslic3r/PrintConfig.cpp:1823 src/libslic3r/PrintConfig.cpp:1838 -#: src/libslic3r/PrintConfig.cpp:1859 src/libslic3r/PrintConfig.cpp:1870 -#: src/libslic3r/PrintConfig.cpp:1886 src/libslic3r/PrintConfig.cpp:1895 -#: src/libslic3r/PrintConfig.cpp:1904 src/libslic3r/PrintConfig.cpp:1915 -#: src/libslic3r/PrintConfig.cpp:1929 src/libslic3r/PrintConfig.cpp:1937 -#: src/libslic3r/PrintConfig.cpp:1938 src/libslic3r/PrintConfig.cpp:1947 -#: src/libslic3r/PrintConfig.cpp:1955 src/libslic3r/PrintConfig.cpp:1969 -#: src/libslic3r/GCode/PreviewData.cpp:172 -msgid "Support material" -msgstr "Підтримка" +#: src/slic3r/GUI/GLCanvas3D.cpp:1471 +msgid "Variable layer height - Smooth all" +msgstr "Змінна висота шарів - Згладити все" -#: src/slic3r/GUI/GUI_ObjectList.cpp:33 src/slic3r/GUI/GUI_ObjectList.cpp:69 -#: src/slic3r/GUI/Tab.cpp:1070 src/slic3r/GUI/Tab.cpp:1794 -#: src/libslic3r/PrintConfig.cpp:455 src/libslic3r/PrintConfig.cpp:953 -#: src/libslic3r/PrintConfig.cpp:1339 src/libslic3r/PrintConfig.cpp:1667 -#: src/libslic3r/PrintConfig.cpp:1851 src/libslic3r/PrintConfig.cpp:1877 -#: src/libslic3r/PrintConfig.cpp:2149 src/libslic3r/PrintConfig.cpp:2157 -msgid "Extruders" -msgstr "Екструдери" +#: src/slic3r/GUI/GLCanvas3D.cpp:1876 +msgid "Mirror Object" +msgstr "Віддзеркалити об'єкт" -#: src/slic3r/GUI/GUI_ObjectList.cpp:39 -msgid "Pad and Support" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:2746 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:520 +msgid "Gizmo-Move" +msgstr "Gizmo переміщення" -#: src/slic3r/GUI/GUI_ObjectList.cpp:68 src/slic3r/GUI/GUI_Preview.cpp:215 -#: src/slic3r/GUI/Tab.cpp:1035 src/libslic3r/PrintConfig.cpp:198 -#: src/libslic3r/PrintConfig.cpp:425 src/libslic3r/PrintConfig.cpp:870 -#: src/libslic3r/PrintConfig.cpp:998 src/libslic3r/PrintConfig.cpp:1360 -#: src/libslic3r/PrintConfig.cpp:1597 src/libslic3r/PrintConfig.cpp:1646 -#: src/libslic3r/PrintConfig.cpp:1697 src/libslic3r/PrintConfig.cpp:2028 -msgid "Speed" -msgstr "Швидкість" +#: src/slic3r/GUI/GLCanvas3D.cpp:2832 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:522 +msgid "Gizmo-Rotate" +msgstr "Gizmo обертання" -#: src/slic3r/GUI/GUI_ObjectList.cpp:70 src/libslic3r/PrintConfig.cpp:415 -#: src/libslic3r/PrintConfig.cpp:522 src/libslic3r/PrintConfig.cpp:829 -#: src/libslic3r/PrintConfig.cpp:961 src/libslic3r/PrintConfig.cpp:1348 -#: src/libslic3r/PrintConfig.cpp:1687 src/libslic3r/PrintConfig.cpp:1860 -#: src/libslic3r/PrintConfig.cpp:2017 -msgid "Extrusion Width" -msgstr "Ширина екструзії" +#: src/slic3r/GUI/GLCanvas3D.cpp:3388 +msgid "Move Object" +msgstr "Перемістити об'єкт" -#: src/slic3r/GUI/GUI_ObjectList.cpp:75 src/slic3r/GUI/Plater.cpp:410 -#: src/slic3r/GUI/Tab.cpp:3309 src/slic3r/GUI/Tab.cpp:3310 -#: src/libslic3r/PrintConfig.cpp:2359 src/libslic3r/PrintConfig.cpp:2366 -#: src/libslic3r/PrintConfig.cpp:2375 src/libslic3r/PrintConfig.cpp:2384 -#: src/libslic3r/PrintConfig.cpp:2394 src/libslic3r/PrintConfig.cpp:2420 -#: src/libslic3r/PrintConfig.cpp:2427 src/libslic3r/PrintConfig.cpp:2438 -#: src/libslic3r/PrintConfig.cpp:2448 src/libslic3r/PrintConfig.cpp:2457 -#: src/libslic3r/PrintConfig.cpp:2467 src/libslic3r/PrintConfig.cpp:2476 -#: src/libslic3r/PrintConfig.cpp:2486 src/libslic3r/PrintConfig.cpp:2496 -#: src/libslic3r/PrintConfig.cpp:2504 -msgid "Supports" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:3858 src/slic3r/GUI/GLCanvas3D.cpp:4571 +msgid "Switch to Settings" +msgstr "Перейдіть до налаштувань" -#: src/slic3r/GUI/GUI_ObjectList.cpp:76 src/slic3r/GUI/Tab.cpp:3337 -#: src/slic3r/GUI/Tab.cpp:3338 src/libslic3r/PrintConfig.cpp:2512 -#: src/libslic3r/PrintConfig.cpp:2519 src/libslic3r/PrintConfig.cpp:2530 -#: src/libslic3r/PrintConfig.cpp:2540 src/libslic3r/PrintConfig.cpp:2553 -#: src/libslic3r/PrintConfig.cpp:2562 -msgid "Pad" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:3859 src/slic3r/GUI/GLCanvas3D.cpp:4571 +msgid "Print Settings Tab" +msgstr "Вкладка параметрів друку" -#: src/slic3r/GUI/GUI_ObjectList.cpp:173 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:45 -msgid "Name" -msgstr "Ім'я" +#: src/slic3r/GUI/GLCanvas3D.cpp:3860 src/slic3r/GUI/GLCanvas3D.cpp:4572 +msgid "Filament Settings Tab" +msgstr "Вкладка параметрів філаменту" -#: src/slic3r/GUI/GUI_ObjectList.cpp:201 -msgid "Right button click the icon to change the object settings" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:3860 src/slic3r/GUI/GLCanvas3D.cpp:4572 +msgid "Material Settings Tab" +msgstr "Вкладка параметрів матеріалу" -#: src/slic3r/GUI/GUI_ObjectList.cpp:209 -#, c-format -msgid "Auto-repaired (%d errors):\n" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:3861 src/slic3r/GUI/GLCanvas3D.cpp:4573 +msgid "Printer Settings Tab" +msgstr "Вкладка параметрів принтеру" -#: src/slic3r/GUI/GUI_ObjectList.cpp:212 -msgid "degenerate facets" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:3909 +msgid "Undo History" +msgstr "Скасувати історію" -#: src/slic3r/GUI/GUI_ObjectList.cpp:213 -msgid "edges fixed" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:3909 +msgid "Redo History" +msgstr "Повторити історію" -#: src/slic3r/GUI/GUI_ObjectList.cpp:214 -msgid "facets removed" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:3930 +#, c-format +msgid "Undo %1$d Action" +msgid_plural "Undo %1$d Actions" +msgstr[0] "Скасувати %1$d дію" +msgstr[1] "Скасувати %1$d дії" +msgstr[2] "Скасувати %1$d дій" -#: src/slic3r/GUI/GUI_ObjectList.cpp:215 -msgid "facets added" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:3930 +#, c-format +msgid "Redo %1$d Action" +msgid_plural "Redo %1$d Actions" +msgstr[0] "Повторити %1$d дію" +msgstr[1] "Повторити %1$d дії" +msgstr[2] "Повторити %1$d дій" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3950 src/slic3r/GUI/GLCanvas3D.cpp:4589 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:98 src/slic3r/GUI/Search.cpp:351 +msgid "Search" +msgstr "Пошук" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3964 src/slic3r/GUI/GLCanvas3D.cpp:3972 +#: src/slic3r/GUI/Search.cpp:358 +msgid "Enter a search term" +msgstr "Введіть пошуковий термін" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4003 +msgid "Arrange options" +msgstr "Параметри розташування" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4033 +msgid "Press %1%left mouse button to enter the exact value" +msgstr "Натисніть %1%ліву кнопку миші, щоб ввести точне значення" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4035 +msgid "Spacing" +msgstr "Відстань" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4042 +msgid "Enable rotations (slow)" +msgstr "Увімкнути обертання (повільно)" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4060 src/slic3r/GUI/GLCanvas3D.cpp:4481 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 src/slic3r/GUI/Plater.cpp:1648 +msgid "Arrange" +msgstr "Розташувати" -#: src/slic3r/GUI/GUI_ObjectList.cpp:216 -msgid "facets reversed" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:4455 +msgid "Add..." +msgstr "Додати..." -#: src/slic3r/GUI/GUI_ObjectList.cpp:217 -msgid "backwards edges" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:4463 src/slic3r/GUI/GUI_ObjectList.cpp:1878 +#: src/slic3r/GUI/Plater.cpp:3998 src/slic3r/GUI/Plater.cpp:4022 +#: src/slic3r/GUI/Tab.cpp:3484 +msgid "Delete" +msgstr "Видалити" -#: src/slic3r/GUI/GUI_ObjectList.cpp:231 -msgid "Right button click the icon to fix STL through Netfabb" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:4472 src/slic3r/GUI/KBShortcutsDialog.cpp:88 +#: src/slic3r/GUI/Plater.cpp:5107 +msgid "Delete all" +msgstr "Видалити все" -#: src/slic3r/GUI/GUI_ObjectList.cpp:278 src/slic3r/GUI/Tab.cpp:1430 -#: src/libslic3r/PrintConfig.cpp:454 -msgid "Extruder" -msgstr "Екструдер" +#: src/slic3r/GUI/GLCanvas3D.cpp:4481 src/slic3r/GUI/KBShortcutsDialog.cpp:121 +msgid "Arrange selection" +msgstr "Розташувати вибране" -#: src/slic3r/GUI/GUI_ObjectList.cpp:683 src/slic3r/GUI/GUI_ObjectList.cpp:963 -#: src/slic3r/GUI/GUI_ObjectList.cpp:969 src/slic3r/GUI/GUI_ObjectList.cpp:1199 -#, c-format -msgid "Quick Add Settings (%s)" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:4481 +msgid "Click right mouse button to show arrangement options" +msgstr "Клацніть правою кнопкою миші, щоб показати параметри розташування" -#: src/slic3r/GUI/GUI_ObjectList.cpp:746 -msgid "Select showing settings" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:4503 +msgid "Copy" +msgstr "Копіювати" -#: src/slic3r/GUI/GUI_ObjectList.cpp:874 -msgid "Load" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:4512 +msgid "Paste" +msgstr "Вставити" -#: src/slic3r/GUI/GUI_ObjectList.cpp:879 src/slic3r/GUI/GUI_ObjectList.cpp:911 -#: src/slic3r/GUI/GUI_ObjectList.cpp:914 -msgid "Box" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:4524 src/slic3r/GUI/Plater.cpp:3857 +#: src/slic3r/GUI/Plater.cpp:3869 src/slic3r/GUI/Plater.cpp:4007 +msgid "Add instance" +msgstr "Додати екземпляр" -#: src/slic3r/GUI/GUI_ObjectList.cpp:879 -msgid "Cylinder" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:4535 src/slic3r/GUI/Plater.cpp:4009 +msgid "Remove instance" +msgstr "Видалити екземпляр" -#: src/slic3r/GUI/GUI_ObjectList.cpp:879 -msgid "Sphere" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:4548 +msgid "Split to objects" +msgstr "Розділити на об'єкти" -#: src/slic3r/GUI/GUI_ObjectList.cpp:879 -msgid "Slab" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:4558 src/slic3r/GUI/GUI_ObjectList.cpp:1650 +msgid "Split to parts" +msgstr "Розділити на частини" -#: src/slic3r/GUI/GUI_ObjectList.cpp:890 src/slic3r/GUI/GUI_ObjectList.cpp:906 -msgid "Add part" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:4660 src/slic3r/GUI/KBShortcutsDialog.cpp:89 +#: src/slic3r/GUI/MainFrame.cpp:1125 +msgid "Undo" +msgstr "Скасувати" -#: src/slic3r/GUI/GUI_ObjectList.cpp:891 -msgid "Add modifier" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:4660 src/slic3r/GUI/GLCanvas3D.cpp:4699 +msgid "Click right mouse button to open/close History" +msgstr "Клацніть правою кнопкою миші, щоб відкрити/закрити історію" -#: src/slic3r/GUI/GUI_ObjectList.cpp:892 src/slic3r/GUI/GUI_ObjectList.cpp:910 -msgid "Add support enforcer" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:4683 +msgid "Next Undo action: %1%" +msgstr "Скасувати дію: %1%" -#: src/slic3r/GUI/GUI_ObjectList.cpp:893 src/slic3r/GUI/GUI_ObjectList.cpp:913 -msgid "Add support blocker" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:4699 src/slic3r/GUI/KBShortcutsDialog.cpp:90 +#: src/slic3r/GUI/MainFrame.cpp:1128 +msgid "Redo" +msgstr "Повторити" -#: src/slic3r/GUI/GUI_ObjectList.cpp:934 -msgid "Split to parts" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:4721 +msgid "Next Redo action: %1%" +msgstr "Повторити дію: %1%" -#: src/slic3r/GUI/GUI_ObjectList.cpp:942 -msgid "Add settings" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:6345 +msgid "Selection-Add from rectangle" +msgstr "Виділення - Додано прямокутником" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1009 -msgid "Change type" -msgstr "" +#: src/slic3r/GUI/GLCanvas3D.cpp:6364 +msgid "Selection-Remove from rectangle" +msgstr "Виділення - Видалено прямокутником" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1016 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1153 -msgid "Set as a Separated Object" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:54 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:151 src/libslic3r/PrintConfig.cpp:3690 +msgid "Cut" +msgstr "Розрізати" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1024 -msgid "Rename" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:179 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:341 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:418 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:487 +msgid "in" +msgstr "дюйм" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1034 -msgid "Fix through the Netfabb" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:185 +msgid "Keep upper part" +msgstr "Залишити верхню частину" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1041 src/slic3r/GUI/Plater.cpp:2861 -msgid "Export as STL" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:186 +msgid "Keep lower part" +msgstr "Залишити нижню частину" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1048 -msgid "Change extruder" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:187 +msgid "Rotate lower part upwards" +msgstr "Повернути нижню частину вгору" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1073 -msgid "Select new extruder for the object/part" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:192 +msgid "Perform cut" +msgstr "Виконати розріз" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1079 src/slic3r/GUI/Plater.cpp:2825 -#: src/slic3r/GUI/Plater.cpp:2843 src/slic3r/GUI/Tab.cpp:2860 -msgid "Delete" -msgstr "Видалити" +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:33 +msgid "Paint-on supports" +msgstr "Малювання підтримок" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:42 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:25 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57 +msgid "Clipping of view" +msgstr "Відсікання площиною" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:43 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:26 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58 +msgid "Reset direction" +msgstr "Скинути напрямок" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:44 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:27 +msgid "Brush size" +msgstr "Розмір пензля" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:45 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:28 +msgid "Brush shape" +msgstr "Форма пензля" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:29 +msgid "Left mouse button" +msgstr "Ліва кнопка миші" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47 +msgid "Enforce supports" +msgstr "Забезпечити підтримки" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31 +msgid "Right mouse button" +msgstr "Права кнопка миші" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49 +#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:373 +msgid "Block supports" +msgstr "Блокувати підтрики" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33 +msgid "Shift + Left mouse button" +msgstr "Shift + Ліва кнопка миші" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34 +#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:368 +#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:378 +msgid "Remove selection" +msgstr "Видалити виділене" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35 +msgid "Remove all selection" +msgstr "Видалити все, що виділено" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:36 +msgid "Circle" +msgstr "Коло" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1595 +msgid "Sphere" +msgstr "Сфера" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:129 +msgid "Autoset by angle" +msgstr "Автоматичне встановлення під кутом" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:136 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:118 +msgid "Reset selection" +msgstr "Скинути вибір" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:160 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:141 +msgid "Alt + Mouse wheel" +msgstr "Alt + Колесо миші" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:178 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:159 +msgid "Paints all facets inside, regardless of their orientation." +msgstr "Малює всі грані всередині, незалежно від їх орієнтації." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:192 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:173 +msgid "Ignores facets facing away from the camera." +msgstr "Ігнорує грані, відвернуті від камери." + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:225 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:203 +msgid "Ctrl + Mouse wheel" +msgstr "Ctrl + Колесо миші" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:233 +msgid "Autoset custom supports" +msgstr "Автоматичне встановлення власних підтримок" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:235 +msgid "Threshold:" +msgstr "Порог нависання:" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:242 +msgid "Enforce" +msgstr "Забезпечити" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:245 +msgid "Block" +msgstr "Блокувати" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:295 +msgid "Block supports by angle" +msgstr "Блокувати підтрики під кутом" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:296 +msgid "Add supports by angle" +msgstr "Додати підтримки під кутом" + +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:40 +msgid "Place on face" +msgstr "Поверхнею на стіл" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 +msgid "Hollow this object" +msgstr "Випорожнити цей об'єкт" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41 +msgid "Preview hollowed and drilled model" +msgstr "Попередній перегляд порожнистої та просвердленої моделі" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42 +msgid "Offset" +msgstr "Зміщення" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43 +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:56 +msgid "Quality" +msgstr "Якість" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44 +#: src/libslic3r/PrintConfig.cpp:3183 +msgid "Closing distance" +msgstr "Відстань закриття" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:45 +msgid "Hole diameter" +msgstr "Діаметр отвору" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:46 +msgid "Hole depth" +msgstr "Глибина отвору" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:47 +msgid "Remove selected holes" +msgstr "Видалити вибрані отвори" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:48 +msgid "Remove all holes" +msgstr "Видалити всі отвори" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:51 +msgid "Show supports" +msgstr "Показувати підтримки" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:308 +msgid "Add drainage hole" +msgstr "Додати дренажний отвір" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:424 +msgid "Delete drainage hole" +msgstr "Видалити дренажний отвір" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:624 +msgid "Hollowing parameter change" +msgstr "Зміна параметру порожнистості" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:693 +msgid "Change drainage hole diameter" +msgstr "Змініть діаметр дренажного отвору" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:785 +msgid "Hollow and drill" +msgstr "Порожнистість та свердління" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:835 +msgid "Move drainage hole" +msgstr "Перемістити дренажний отвір" + +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:64 +msgid "Move" +msgstr "Пересунути" + +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:461 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:527 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:546 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 +#: src/libslic3r/PrintConfig.cpp:3739 +msgid "Rotate" +msgstr "Обертати" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1153 -msgid "Set as a Separated Objects" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:78 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:238 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:547 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 +#: src/libslic3r/PrintConfig.cpp:3754 +msgid "Scale" +msgstr "Масштаб" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1374 -msgid "Generic" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:30 +#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:381 +msgid "Enforce seam" +msgstr "Забезпечити шов" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1516 -msgid "You can't delete the last solid part from object." -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32 +#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:383 +msgid "Block seam" +msgstr "Блокувати шов" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1533 -msgid "You can't delete the last intance from object." -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:46 +msgid "Seam painting" +msgstr "Малювання шва" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1560 src/slic3r/GUI/Plater.cpp:2219 -msgid "" -"The selected object couldn't be split because it contains only one part." -msgstr "" -"Вибраний об'єкт не можна розділити, оскільки він містить лише одну частину." +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47 +msgid "Head diameter" +msgstr "Діаметр головки" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1676 -msgid "Group manipulation" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 +msgid "Lock supports under new islands" +msgstr "Зафіксувати підтримки під новими островами" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1688 -msgid "Object manipulation" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218 +msgid "Remove selected points" +msgstr "Видалити вибрані точки" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1698 -msgid "Object Settings to modify" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 +msgid "Remove all points" +msgstr "Видалити всі точки" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1702 -msgid "Part Settings to modify" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221 +msgid "Apply changes" +msgstr "Застосувати зміни" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1711 -msgid "Part manipulation" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1222 +msgid "Discard changes" +msgstr "Відхилити зміни" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1717 -msgid "Instance manipulation" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53 +msgid "Minimal points distance" +msgstr "Мінімальна відстань точок" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2240 -msgid "Object or Instance" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54 +#: src/libslic3r/PrintConfig.cpp:3013 +msgid "Support points density" +msgstr "Щільність точок підтримки" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2240 -msgid "Part" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224 +msgid "Auto-generate points" +msgstr "Генерувати точки автоматично" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2242 -msgid "Unsupported selection" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56 +msgid "Manual editing" +msgstr "Ручне редагування" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2243 -#, c-format -msgid "You started your selection with %s Item." -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:374 +msgid "Add support point" +msgstr "Додати точку підтримки" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2244 -#, c-format -msgid "In this mode you can select only other %s Items%s" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:514 +msgid "Delete support point" +msgstr "Видалити точку підтримки" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2247 -msgid "of a current Object" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:694 +msgid "Change point head diameter" +msgstr "Змінити діаметр головки" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2252 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2325 src/slic3r/GUI/Plater.cpp:117 -msgid "Info" -msgstr "Інфо" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:762 +msgid "Support parameter change" +msgstr "Зміна параметрів підтримки" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2366 -msgid "You can't change a type of the last solid part of the object." -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:869 +msgid "SLA Support Points" +msgstr "Точки SLA-підтримки" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2373 -msgid "Select type of part" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897 +msgid "SLA gizmo turned on" +msgstr "Ввімкнути SLA гізмо" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2538 -msgid "Enter new name" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:911 +msgid "Do you want to save your manually edited support points?" +msgstr "Ви хочете зберегти відредаговані вручну точки підтримки?" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2538 -msgid "Renaming" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:912 +msgid "Save changes?" +msgstr "Зберегти зміни?" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2554 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2632 src/slic3r/GUI/Tab.cpp:3191 -#: src/slic3r/GUI/Tab.cpp:3195 -msgid "The supplied name is not valid;" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:924 +msgid "SLA gizmo turned off" +msgstr "Вимкнути SLA гізмо" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2555 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2633 src/slic3r/GUI/Tab.cpp:3192 -msgid "the following characters are not allowed:" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:955 +msgid "Move support point" +msgstr "Перемістити точку підтримки" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2653 -msgid "Set extruder for selected items" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1048 +msgid "Support points edit" +msgstr "Редагування точок підтримки" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2654 -msgid "Select extruder number for selected objects and/or parts" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1127 +msgid "Autogeneration will erase all manually edited points." +msgstr "Автогенерація видалить всі відредаговані вручну точки." -#: src/slic3r/GUI/GUI_ObjectList.cpp:2667 -msgid "Select extruder number:" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1128 +msgid "Are you sure you want to do it?" +msgstr "Ви впевнені, що хочете це зробити?" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2668 -msgid "This extruder will be set for selected items" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1129 src/slic3r/GUI/GUI.cpp:256 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:557 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:581 +#: src/slic3r/GUI/WipeTowerDialog.cpp:45 src/slic3r/GUI/WipeTowerDialog.cpp:366 +msgid "Warning" +msgstr "Застереження" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:25 -msgid "Object Manipulation" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1134 +msgid "Autogenerate support points" +msgstr "Автогенерувати точки підтримки" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:47 -msgid "Object name" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1181 +msgid "SLA gizmo keyboard shortcuts" +msgstr "Комбінації клавіш для SLA гізма" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:115 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:160 -msgid "Position" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1192 +msgid "Note: some shortcuts work in (non)editing mode only." +msgstr "Примітка: деякі скорочення працюють лише в режимі (не)редагування." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:116 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:161 -msgid "Rotation" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1210 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1213 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214 +msgid "Left click" +msgstr "Ліва кнопка миші" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:117 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:201 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:221 -#: src/libslic3r/PrintConfig.cpp:3070 -msgid "Scale" -msgstr "Масштаб" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1210 +msgid "Add point" +msgstr "Додати точку" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:162 -msgid "Scale factors" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211 +msgid "Right click" +msgstr "Клік на праву кнопку миші" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:200 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:220 -#: src/libslic3r/PrintConfig.cpp:3055 -msgid "Rotate" -msgstr "Повернути" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211 +msgid "Remove point" +msgstr "Видалити точку" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:219 -msgid "Translate" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 +msgid "Drag" +msgstr "Перетягування" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:58 -msgid "Additional Settings" -msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212 +msgid "Move point" +msgstr "Перемістити точку" -#: src/slic3r/GUI/GUI_Preview.cpp:209 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1213 +msgid "Add point to selection" +msgstr "Додати точку до виділення" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214 +msgid "Remove point from selection" +msgstr "Видалити точку з виділення" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 +msgid "Select by rectangle" +msgstr "Виділення прямокутником" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 +msgid "Deselect by rectangle" +msgstr "Скасування вибору прямокутником" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 +msgid "Select all points" +msgstr "Виділити усі точки" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 +msgid "Mouse wheel" +msgstr "Колесо миші" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 +msgid "Move clipping plane" +msgstr "Перемістити площину відсікання" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 +msgid "Reset clipping plane" +msgstr "Скинути площину відсікання" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1223 +msgid "Switch to editing mode" +msgstr "Перейти в режим редагування" + +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:521 +msgid "Gizmo-Scale" +msgstr "Gizmo масштабування" + +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:630 +msgid "Gizmo-Place on Face" +msgstr "Gizmo \"Поверхнею на стіл\"" + +#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:39 +msgid "Entering Paint-on supports" +msgstr "Увійти до режиму малювання підтримок" + +#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:40 +msgid "Entering Seam painting" +msgstr "Увійти до режиму малювання шву" + +#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:47 +msgid "Leaving Seam painting" +msgstr "Вийти з режиму малювання шву" + +#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:48 +msgid "Leaving Paint-on supports" +msgstr "Вийти з режиму малювання підтримок" + +#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:371 +msgid "Add supports" +msgstr "Додати підтримки" + +#: src/slic3r/GUI/GUI_App.cpp:239 +msgid "is based on Slic3r by Alessandro Ranellucci and the RepRap community." +msgstr "заснований на Slic3r від Alessandro Ranellucci та спільноти RepRap." + +#: src/slic3r/GUI/GUI_App.cpp:241 +msgid "" +"Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas " +"Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous others." +msgstr "" +"Розробки від Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr " +"Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik та багатьох " +"інших." + +#: src/slic3r/GUI/GUI_App.cpp:242 +msgid "Artwork model by Nora Al-Badri and Jan Nikolai Nelles" +msgstr "Модель ілюстрації виконано Nora Al-Badri та Jan Nikolai Nelles" + +#: src/slic3r/GUI/GUI_App.cpp:382 +msgid "" +"Starting with %1% 2.3, configuration directory on Linux has changed " +"(according to XDG Base Directory Specification) to \n" +"%2%.\n" +"\n" +"This directory did not exist yet (maybe you run the new version for the " +"first time).\n" +"However, an old %1% configuration directory was detected in \n" +"%3%.\n" +"\n" +"Consider moving the contents of the old directory to the new location in " +"order to access your profiles, etc.\n" +"Note that if you decide to downgrade %1% in future, it will use the old " +"location again.\n" +"\n" +"What do you want to do now?" +msgstr "" +"Починаючи з %1% 2.3, каталог конфігурації в Linux змінився (відповідно до " +"специфікації базового каталогу XDG) на\n" +"%2%.\n" +"\n" +"Цей каталог ще не існував (можливо, ви запускаєте нову версію вперше).\n" +"Однак у %3% був виявлений старий каталог конфігурації %1%.\n" +"\n" +"Подумайте про переміщення вмісту старого каталогу в нове місце, щоб отримати " +"доступ до ваших профілів тощо.\n" +"Зверніть увагу, що якщо ви вирішите знизити версію %1% у майбутньому, він " +"знову використовуватиме старе місце.\n" +"\n" +"Що ви хочете робити зараз?" + +#: src/slic3r/GUI/GUI_App.cpp:390 +#, c-format +msgid "%s - BREAKING CHANGE" +msgstr "%s - ЗЛАМАНА ЗМІНА" + +#: src/slic3r/GUI/GUI_App.cpp:392 +msgid "Quit, I will move my data now" +msgstr "Вийти, я зараз перенесу свої дані" + +#: src/slic3r/GUI/GUI_App.cpp:392 +msgid "Start the application" +msgstr "Запустити програму" + +#: src/slic3r/GUI/GUI_App.cpp:580 +#, c-format +msgid "" +"%s has encountered an error. It was likely caused by running out of memory. " +"If you are sure you have enough RAM on your system, this may also be a bug " +"and we would be glad if you reported it.\n" +"\n" +"The application will now terminate." +msgstr "" +"%s виявив помилку. Ймовірно, це було пов’язано з закінченням пам’яті. Якщо " +"ви впевнені, що у вашій системі достатньо оперативної пам'яті, це також може " +"бути помилкою, і ми будемо раді, якщо ви нам про це повідомите.\n" +"\n" +"Тепер застосування буде припинено." + +#: src/slic3r/GUI/GUI_App.cpp:583 +msgid "Fatal error" +msgstr "Критична помилка" + +#: src/slic3r/GUI/GUI_App.cpp:587 +msgid "" +"PrusaSlicer has encountered a localization error. Please report to " +"PrusaSlicer team, what language was active and in which scenario this issue " +"happened. Thank you.\n" +"\n" +"The application will now terminate." +msgstr "" +"Виникла помилка локалізації. Будь ласка, повідомте команді PrusaSlicer, яка " +"мова була активною та за якого сценарію сталася ця проблема. Дякую.\n" +"\n" +"Тепер застосування буде припинено." + +#: src/slic3r/GUI/GUI_App.cpp:590 +msgid "Critical error" +msgstr "Критична помилка" + +#: src/slic3r/GUI/GUI_App.cpp:711 +msgid "" +"Error parsing PrusaSlicer config file, it is probably corrupted. Try to " +"manually delete the file to recover from the error. Your user profiles will " +"not be affected." +msgstr "" +"Помилка під час розбору файлу конфігурації PrusaSlicer, можливо, він " +"пошкоджений. Спробуйте вручну видалити файл, щоб оговтатися від помилки. Це " +"не вплине на профілі користувачів." + +#: src/slic3r/GUI/GUI_App.cpp:717 +msgid "" +"Error parsing PrusaGCodeViewer config file, it is probably corrupted. Try to " +"manually delete the file to recover from the error." +msgstr "" +"Помилка під час розбору файлу конфігурації PrusaGCodeViewer, можливо, він " +"пошкоджений. Спробуйте вручну видалити файл, щоб оговтатися від помилки." + +#: src/slic3r/GUI/GUI_App.cpp:771 +#, c-format +msgid "" +"%s\n" +"Do you want to continue?" +msgstr "" +"%s\n" +"Бажаєте продовжити?" + +#: src/slic3r/GUI/GUI_App.cpp:773 src/slic3r/GUI/UnsavedChangesDialog.cpp:665 +msgid "Remember my choice" +msgstr "Пам'ятати мій вибір" + +#: src/slic3r/GUI/GUI_App.cpp:808 +msgid "Loading configuration" +msgstr "Завантаження конфігурації" + +#: src/slic3r/GUI/GUI_App.cpp:876 +msgid "Preparing settings tabs" +msgstr "Підготовка вкладок параметрів" + +#: src/slic3r/GUI/GUI_App.cpp:1115 +msgid "" +"You have the following presets with saved options for \"Print Host upload\"" +msgstr "" +"У вас є наступні пресети із збереженими параметрами для \"Завантаження хоста " +"друку(\"Print Host upload\")\"" + +#: src/slic3r/GUI/GUI_App.cpp:1119 +msgid "" +"But since this version of PrusaSlicer we don't show this information in " +"Printer Settings anymore.\n" +"Settings will be available in physical printers settings." +msgstr "" +"Від поточної версії PrusaSlicer ми більше не відображаємо цю інформацію в " +"параметрах принтера.\n" +"Ці параметри будуть доступні у налаштуваннях фізичних принтерів." + +#: src/slic3r/GUI/GUI_App.cpp:1121 +msgid "" +"By default new Printer devices will be named as \"Printer N\" during its " +"creation.\n" +"Note: This name can be changed later from the physical printers settings" +msgstr "" +"За замовчуванням нові друкуючі пристрої будуть названі \"Printer N\" під час " +"їх створення.\n" +"Примітка: Цю назву можна змінити пізніше в налаштуваннях фізичних принтерів" + +#: src/slic3r/GUI/GUI_App.cpp:1124 src/slic3r/GUI/PhysicalPrinterDialog.cpp:626 +msgid "Information" +msgstr "Інформація" + +#: src/slic3r/GUI/GUI_App.cpp:1137 src/slic3r/GUI/GUI_App.cpp:1148 +msgid "Recreating" +msgstr "Пере-створення" + +#: src/slic3r/GUI/GUI_App.cpp:1153 +msgid "Loading of current presets" +msgstr "Завантаження поточних пресетів" + +#: src/slic3r/GUI/GUI_App.cpp:1158 +msgid "Loading of a mode view" +msgstr "Завантаження режиму перегляду" + +#: src/slic3r/GUI/GUI_App.cpp:1234 +msgid "Choose one file (3MF/AMF):" +msgstr "Виберіть один файл (3MF/AMF):" + +#: src/slic3r/GUI/GUI_App.cpp:1246 +msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):" +msgstr "Виберіть один чи кілька файлів (STL/OBJ/AMF/PRUSA):" + +#: src/slic3r/GUI/GUI_App.cpp:1258 +msgid "Choose one file (GCODE/.GCO/.G/.ngc/NGC):" +msgstr "Виберіть один файл (GCODE/.GCO/.G/.ngc/NGC):" + +#: src/slic3r/GUI/GUI_App.cpp:1269 +msgid "Changing of an application language" +msgstr "Зміна мови застосування" + +#: src/slic3r/GUI/GUI_App.cpp:1392 +msgid "Select the language" +msgstr "Оберіть мову" + +#: src/slic3r/GUI/GUI_App.cpp:1392 +msgid "Language" +msgstr "Мова" + +#: src/slic3r/GUI/GUI_App.cpp:1541 +msgid "modified" +msgstr "модифікований" + +#: src/slic3r/GUI/GUI_App.cpp:1590 +#, c-format +msgid "Run %s" +msgstr "Запустити %s" + +#: src/slic3r/GUI/GUI_App.cpp:1594 +msgid "&Configuration Snapshots" +msgstr "Знімки конфігурації" + +#: src/slic3r/GUI/GUI_App.cpp:1594 +msgid "Inspect / activate configuration snapshots" +msgstr "Перегляньте / активізуйте знімки конфігурації" + +#: src/slic3r/GUI/GUI_App.cpp:1595 +msgid "Take Configuration &Snapshot" +msgstr "Зробіть знімок конфігурації" + +#: src/slic3r/GUI/GUI_App.cpp:1595 +msgid "Capture a configuration snapshot" +msgstr "Зробіть знімок конфігурації" + +#: src/slic3r/GUI/GUI_App.cpp:1596 +msgid "Check for updates" +msgstr "Перевірити наявність оновлень" + +#: src/slic3r/GUI/GUI_App.cpp:1596 +msgid "Check for configuration updates" +msgstr "Перевірити наявність оновлень конфігурації" + +#: src/slic3r/GUI/GUI_App.cpp:1599 +msgid "&Preferences" +msgstr "&Преференції" + +#: src/slic3r/GUI/GUI_App.cpp:1605 +msgid "Application preferences" +msgstr "Преференції застосування" + +#: src/slic3r/GUI/GUI_App.cpp:1610 src/slic3r/GUI/wxExtensions.cpp:685 +msgid "Simple" +msgstr "Простий" + +#: src/slic3r/GUI/GUI_App.cpp:1610 +msgid "Simple View Mode" +msgstr "Простий режим перегляду" + +#: src/slic3r/GUI/GUI_App.cpp:1612 src/slic3r/GUI/wxExtensions.cpp:687 +msgctxt "Mode" +msgid "Advanced" +msgstr "Розширений" + +#: src/slic3r/GUI/GUI_App.cpp:1612 +msgid "Advanced View Mode" +msgstr "Розширений режим перегляду" + +#: src/slic3r/GUI/GUI_App.cpp:1613 src/slic3r/GUI/wxExtensions.cpp:688 +msgid "Expert" +msgstr "Експерт" + +#: src/slic3r/GUI/GUI_App.cpp:1613 +msgid "Expert View Mode" +msgstr "Режим перегляду Експерт" + +#: src/slic3r/GUI/GUI_App.cpp:1618 +msgid "Mode" +msgstr "Режим" + +#: src/slic3r/GUI/GUI_App.cpp:1618 +#, c-format +msgid "%s View Mode" +msgstr "Режим перегляду %s" + +#: src/slic3r/GUI/GUI_App.cpp:1621 +msgid "&Language" +msgstr "Мова" + +#: src/slic3r/GUI/GUI_App.cpp:1624 +msgid "Flash printer &firmware" +msgstr "Прошити принтер" + +#: src/slic3r/GUI/GUI_App.cpp:1624 +msgid "Upload a firmware image into an Arduino based printer" +msgstr "Завантажте імідж прошивки на Arduino-принтер" + +#: src/slic3r/GUI/GUI_App.cpp:1640 +msgid "Taking configuration snapshot" +msgstr "Знімок конфігурації" + +#: src/slic3r/GUI/GUI_App.cpp:1640 +msgid "Snapshot name" +msgstr "Назва знімку" + +#: src/slic3r/GUI/GUI_App.cpp:1669 +msgid "Failed to activate configuration snapshot." +msgstr "Не вдалося активувати знімок конфігурації." + +#: src/slic3r/GUI/GUI_App.cpp:1719 +msgid "Language selection" +msgstr "Вибір мови" + +#: src/slic3r/GUI/GUI_App.cpp:1721 +msgid "" +"Switching the language will trigger application restart.\n" +"You will lose content of the plater." +msgstr "" +"Переключення мови спричинить перезапуск програми.\n" +"Ви втратите вміст платеру." + +#: src/slic3r/GUI/GUI_App.cpp:1723 +msgid "Do you want to proceed?" +msgstr "Ви хочете продовжити?" + +#: src/slic3r/GUI/GUI_App.cpp:1750 +msgid "&Configuration" +msgstr "&Конфігурація" + +#: src/slic3r/GUI/GUI_App.cpp:1781 +msgid "The preset(s) modifications are successfully saved" +msgstr "Модифікації пресетів успішно збережено" + +#: src/slic3r/GUI/GUI_App.cpp:1802 +msgid "The uploads are still ongoing" +msgstr "Завантаження все ще триває" + +#: src/slic3r/GUI/GUI_App.cpp:1802 +msgid "Stop them and continue anyway?" +msgstr "Зупинити їх і продовжувати в будь-якому випадку?" + +#: src/slic3r/GUI/GUI_App.cpp:1805 +msgid "Ongoing uploads" +msgstr "Триває завантаження" + +#: src/slic3r/GUI/GUI_App.cpp:2019 src/slic3r/GUI/Tab.cpp:3242 +msgid "It's impossible to print multi-part object(s) with SLA technology." +msgstr "" +"За технологією SLA неможливо надрукувати об'єкти, що складаються з декількох " +"частин." + +#: src/slic3r/GUI/GUI_App.cpp:2020 +msgid "Please check and fix your object list." +msgstr "Будь ласка, перевірте та виправте свій список об'єктів." + +#: src/slic3r/GUI/GUI_App.cpp:2021 src/slic3r/GUI/Jobs/SLAImportJob.cpp:210 +#: src/slic3r/GUI/Plater.cpp:2359 src/slic3r/GUI/Tab.cpp:3244 +msgid "Attention!" +msgstr "Увага!" + +#: src/slic3r/GUI/GUI_App.cpp:2038 +msgid "Select a gcode file:" +msgstr "Виберіть файл G-коду:" + +#: src/slic3r/GUI/GUI_Init.cpp:73 src/slic3r/GUI/GUI_Init.cpp:76 +msgid "PrusaSlicer GUI initialization failed" +msgstr "Помилка ініціалізації графічного інтерфейсу PrusaSlicer" + +#: src/slic3r/GUI/GUI_Init.cpp:76 +msgid "Fatal error, exception catched: %1%" +msgstr "Фатальна помилка, вилучений виняток: %1%" + +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 +msgid "Start at height" +msgstr "Початкова висота" + +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 +msgid "Stop at height" +msgstr "Кінцева висота" + +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:161 +msgid "Remove layer range" +msgstr "Видалити діапазон шарів" + +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:165 +msgid "Add layer range" +msgstr "Додати діапазон шарів" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:34 src/slic3r/GUI/GUI_ObjectList.cpp:92 +#: src/slic3r/GUI/GUI_ObjectList.cpp:667 src/libslic3r/PrintConfig.cpp:74 +#: src/libslic3r/PrintConfig.cpp:189 src/libslic3r/PrintConfig.cpp:231 +#: src/libslic3r/PrintConfig.cpp:240 src/libslic3r/PrintConfig.cpp:464 +#: src/libslic3r/PrintConfig.cpp:530 src/libslic3r/PrintConfig.cpp:538 +#: src/libslic3r/PrintConfig.cpp:970 src/libslic3r/PrintConfig.cpp:1219 +#: src/libslic3r/PrintConfig.cpp:1584 src/libslic3r/PrintConfig.cpp:1650 +#: src/libslic3r/PrintConfig.cpp:1835 src/libslic3r/PrintConfig.cpp:2302 +#: src/libslic3r/PrintConfig.cpp:2361 src/libslic3r/PrintConfig.cpp:2370 +msgid "Layers and Perimeters" +msgstr "Шари та периметри" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:95 +#: src/slic3r/GUI/GUI_ObjectList.cpp:670 src/slic3r/GUI/GUI_Preview.cpp:240 +#: src/slic3r/GUI/Tab.cpp:1472 src/slic3r/GUI/Tab.cpp:1474 +#: src/libslic3r/ExtrusionEntity.cpp:320 src/libslic3r/ExtrusionEntity.cpp:352 +#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:1715 +#: src/libslic3r/PrintConfig.cpp:2093 src/libslic3r/PrintConfig.cpp:2099 +#: src/libslic3r/PrintConfig.cpp:2107 src/libslic3r/PrintConfig.cpp:2119 +#: src/libslic3r/PrintConfig.cpp:2129 src/libslic3r/PrintConfig.cpp:2137 +#: src/libslic3r/PrintConfig.cpp:2152 src/libslic3r/PrintConfig.cpp:2173 +#: src/libslic3r/PrintConfig.cpp:2185 src/libslic3r/PrintConfig.cpp:2201 +#: src/libslic3r/PrintConfig.cpp:2210 src/libslic3r/PrintConfig.cpp:2219 +#: src/libslic3r/PrintConfig.cpp:2230 src/libslic3r/PrintConfig.cpp:2244 +#: src/libslic3r/PrintConfig.cpp:2252 src/libslic3r/PrintConfig.cpp:2253 +#: src/libslic3r/PrintConfig.cpp:2262 src/libslic3r/PrintConfig.cpp:2270 +#: src/libslic3r/PrintConfig.cpp:2284 +msgid "Support material" +msgstr "Підтримка" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:99 +#: src/slic3r/GUI/GUI_ObjectList.cpp:674 src/libslic3r/PrintConfig.cpp:2480 +#: src/libslic3r/PrintConfig.cpp:2488 +msgid "Wipe options" +msgstr "Параметри витирання" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:45 +msgid "Pad and Support" +msgstr "Подушка та підтримки" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:51 +msgid "Add part" +msgstr "Додати частину" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:52 +msgid "Add modifier" +msgstr "Додати модифікатор" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:53 +msgid "Add support enforcer" +msgstr "Додати примусову підтримку" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:54 +msgid "Add support blocker" +msgstr "Додати блокувальник підтримок" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:94 src/slic3r/GUI/GUI_ObjectList.cpp:669 +#: src/slic3r/GUI/GUI_Preview.cpp:236 src/slic3r/GUI/Tab.cpp:1442 +#: src/libslic3r/ExtrusionEntity.cpp:316 src/libslic3r/ExtrusionEntity.cpp:344 +#: src/libslic3r/PrintConfig.cpp:1226 src/libslic3r/PrintConfig.cpp:1232 +#: src/libslic3r/PrintConfig.cpp:1246 src/libslic3r/PrintConfig.cpp:1256 +#: src/libslic3r/PrintConfig.cpp:1264 src/libslic3r/PrintConfig.cpp:1266 +msgid "Ironing" +msgstr "Прасування" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:96 src/slic3r/GUI/GUI_ObjectList.cpp:671 +#: src/slic3r/GUI/GUI_Preview.cpp:217 src/slic3r/GUI/Tab.cpp:1498 +#: src/libslic3r/PrintConfig.cpp:291 src/libslic3r/PrintConfig.cpp:518 +#: src/libslic3r/PrintConfig.cpp:1012 src/libslic3r/PrintConfig.cpp:1192 +#: src/libslic3r/PrintConfig.cpp:1265 src/libslic3r/PrintConfig.cpp:1640 +#: src/libslic3r/PrintConfig.cpp:1916 src/libslic3r/PrintConfig.cpp:1968 +#: src/libslic3r/PrintConfig.cpp:2346 +msgid "Speed" +msgstr "Швидкість" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:97 src/slic3r/GUI/GUI_ObjectList.cpp:672 +#: src/slic3r/GUI/Tab.cpp:1534 src/slic3r/GUI/Tab.cpp:2112 +#: src/libslic3r/PrintConfig.cpp:548 src/libslic3r/PrintConfig.cpp:1146 +#: src/libslic3r/PrintConfig.cpp:1618 src/libslic3r/PrintConfig.cpp:1937 +#: src/libslic3r/PrintConfig.cpp:2165 src/libslic3r/PrintConfig.cpp:2192 +msgid "Extruders" +msgstr "Екструдери" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:673 +#: src/libslic3r/PrintConfig.cpp:507 src/libslic3r/PrintConfig.cpp:616 +#: src/libslic3r/PrintConfig.cpp:957 src/libslic3r/PrintConfig.cpp:1154 +#: src/libslic3r/PrintConfig.cpp:1627 src/libslic3r/PrintConfig.cpp:1957 +#: src/libslic3r/PrintConfig.cpp:2174 src/libslic3r/PrintConfig.cpp:2334 +msgid "Extrusion Width" +msgstr "Ширина екструзії" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:102 src/slic3r/GUI/GUI_ObjectList.cpp:677 +#: src/slic3r/GUI/Tab.cpp:1428 src/slic3r/GUI/Tab.cpp:1452 +#: src/slic3r/GUI/Tab.cpp:1555 src/slic3r/GUI/Tab.cpp:1558 +#: src/slic3r/GUI/Tab.cpp:1855 src/slic3r/GUI/Tab.cpp:2197 +#: src/slic3r/GUI/Tab.cpp:4114 src/libslic3r/PrintConfig.cpp:92 +#: src/libslic3r/PrintConfig.cpp:132 src/libslic3r/PrintConfig.cpp:279 +#: src/libslic3r/PrintConfig.cpp:1097 src/libslic3r/PrintConfig.cpp:1181 +#: src/libslic3r/PrintConfig.cpp:2504 src/libslic3r/PrintConfig.cpp:2676 +msgid "Advanced" +msgstr "Розширений" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:104 src/slic3r/GUI/GUI_ObjectList.cpp:679 +#: src/slic3r/GUI/Plater.cpp:357 src/slic3r/GUI/Tab.cpp:4048 +#: src/slic3r/GUI/Tab.cpp:4049 src/libslic3r/PrintConfig.cpp:2842 +#: src/libslic3r/PrintConfig.cpp:2849 src/libslic3r/PrintConfig.cpp:2858 +#: src/libslic3r/PrintConfig.cpp:2867 src/libslic3r/PrintConfig.cpp:2877 +#: src/libslic3r/PrintConfig.cpp:2887 src/libslic3r/PrintConfig.cpp:2924 +#: src/libslic3r/PrintConfig.cpp:2931 src/libslic3r/PrintConfig.cpp:2942 +#: src/libslic3r/PrintConfig.cpp:2952 src/libslic3r/PrintConfig.cpp:2961 +#: src/libslic3r/PrintConfig.cpp:2974 src/libslic3r/PrintConfig.cpp:2984 +#: src/libslic3r/PrintConfig.cpp:2993 src/libslic3r/PrintConfig.cpp:3003 +#: src/libslic3r/PrintConfig.cpp:3014 src/libslic3r/PrintConfig.cpp:3022 +msgid "Supports" +msgstr "Підтримки" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:105 src/slic3r/GUI/GUI_ObjectList.cpp:680 +#: src/slic3r/GUI/Plater.cpp:500 src/slic3r/GUI/Tab.cpp:4089 +#: src/slic3r/GUI/Tab.cpp:4090 src/slic3r/GUI/Tab.cpp:4161 +#: src/libslic3r/PrintConfig.cpp:3030 src/libslic3r/PrintConfig.cpp:3037 +#: src/libslic3r/PrintConfig.cpp:3051 src/libslic3r/PrintConfig.cpp:3062 +#: src/libslic3r/PrintConfig.cpp:3072 src/libslic3r/PrintConfig.cpp:3094 +#: src/libslic3r/PrintConfig.cpp:3105 src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3119 src/libslic3r/PrintConfig.cpp:3130 +#: src/libslic3r/PrintConfig.cpp:3139 src/libslic3r/PrintConfig.cpp:3148 +msgid "Pad" +msgstr "Подушка" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/Tab.cpp:4107 +#: src/slic3r/GUI/Tab.cpp:4108 src/libslic3r/SLA/Hollowing.cpp:45 +#: src/libslic3r/SLA/Hollowing.cpp:57 src/libslic3r/SLA/Hollowing.cpp:66 +#: src/libslic3r/SLA/Hollowing.cpp:75 src/libslic3r/PrintConfig.cpp:3158 +#: src/libslic3r/PrintConfig.cpp:3165 src/libslic3r/PrintConfig.cpp:3175 +#: src/libslic3r/PrintConfig.cpp:3184 +msgid "Hollowing" +msgstr "Випорожнення" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:300 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:161 +msgid "Name" +msgstr "Ім'я" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:457 +msgid "Editing" +msgstr "Редагування" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:402 +#, c-format +msgid "Auto-repaired (%d errors):" +msgstr "Авто-відновлення (%d помилок):" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:409 +msgid "degenerate facets" +msgstr "вироджені грані" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:410 +msgid "edges fixed" +msgstr "виправлено країв" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:411 +msgid "facets removed" +msgstr "вилучено граней" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:412 +msgid "facets added" +msgstr "додано граней" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:413 +msgid "facets reversed" +msgstr "змінено граней" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:414 +msgid "backwards edges" +msgstr "повернуто країв" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:422 +msgid "Right button click the icon to fix STL through Netfabb" +msgstr "Клацніть правою кнопкою миші, щоб виправити STL за допомогою Netfabb" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:459 +msgid "Right button click the icon to change the object settings" +msgstr "" +"Клацніть правою кнопкою миші на піктограмі, щоб змінити налаштування об'єкта" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:461 +msgid "Click the icon to change the object settings" +msgstr "Клацніть на піктограмі, щоб змінити налаштування об'єкта" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:465 +msgid "Right button click the icon to change the object printable property" +msgstr "" +"Клацніть правою кнопкою миші на піктограмі, щоб змінити властивість друку " +"для об'єкта" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:467 +msgid "Click the icon to change the object printable property" +msgstr "Клацніть на піктограмі, щоб змінити властивість друку для об'єкта" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:590 +msgid "Change Extruder" +msgstr "Змінити екструдер" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:605 +msgid "Rename Object" +msgstr "Перейменувати об'єкт" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:605 +msgid "Rename Sub-object" +msgstr "Перейменувати підоб'єкт" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1247 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4372 +msgid "Instances to Separated Objects" +msgstr "Змінити екземпляри на окремі об'єкти" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1262 +msgid "Volumes in Object reordered" +msgstr "Об’єкт впорядковано" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1262 +msgid "Object reordered" +msgstr "Об’єкт впорядковано" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1338 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1693 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1699 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2081 +#, c-format +msgid "Quick Add Settings (%s)" +msgstr "Швидке додання налаштувань (%s)" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1428 +msgid "Select showing settings" +msgstr "Виберіть налаштування для показу" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1477 +msgid "Add Settings for Layers" +msgstr "Додати налаштування для шарів" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1478 +msgid "Add Settings for Sub-object" +msgstr "Додати налаштування для підоб'єкту" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1479 +msgid "Add Settings for Object" +msgstr "Додати налаштування для об'єкту" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1549 +msgid "Add Settings Bundle for Height range" +msgstr "Додати пакет налаштувань для діапазону висот" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1550 +msgid "Add Settings Bundle for Sub-object" +msgstr "Додати пакет налаштувань для підоб'єкту" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1551 +msgid "Add Settings Bundle for Object" +msgstr "Додати пакет налаштувань для об'єкту" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1590 +msgid "Load" +msgstr "Завантажити" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1595 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1627 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1631 +msgid "Box" +msgstr "Коробка" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1595 +msgid "Cylinder" +msgstr "Циліндр" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1595 +msgid "Slab" +msgstr "Плита" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1663 +msgid "Height range Modifier" +msgstr "Модифікатор діапазону висот" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1672 +msgid "Add settings" +msgstr "Додати налаштування" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1750 +msgid "Change type" +msgstr "Змінити тип" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1760 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1772 +msgid "Set as a Separated Object" +msgstr "Встановити як окремий об’єкт" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1772 +msgid "Set as a Separated Objects" +msgstr "Встановити як окремі об’єкти" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1782 +msgid "Printable" +msgstr "Для друку" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1797 +msgid "Rename" +msgstr "Перейменувати" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1808 +msgid "Fix through the Netfabb" +msgstr "Виправити за допомогою NetFabb" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1818 src/slic3r/GUI/Plater.cpp:4035 +msgid "Export as STL" +msgstr "Експортувати як STL" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1825 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4567 src/slic3r/GUI/Plater.cpp:4001 +msgid "Reload the selected volumes from disk" +msgstr "Перезавантажити вибрані часті з диска" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1832 +msgid "Set extruder for selected items" +msgstr "Встановити екструдер для вибраних елементів" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1864 src/libslic3r/PrintConfig.cpp:391 +msgid "Default" +msgstr "За замовчуванням" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1884 +msgid "Scale to print volume" +msgstr "Масштабувати під область друку" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1884 +msgid "Scale the selected object to fit the print volume" +msgstr "Масштабуйте вибраний об'єкт відповідно до об'єму столу" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1913 src/slic3r/GUI/Plater.cpp:5224 +msgid "Convert from imperial units" +msgstr "Конвертувати з імперських одиниць" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1915 src/slic3r/GUI/Plater.cpp:5224 +msgid "Revert conversion from imperial units" +msgstr "Повернути конвертацію з імперських одиниць" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1944 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1952 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2630 src/libslic3r/PrintConfig.cpp:3730 +msgid "Merge" +msgstr "Об’єднати" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1944 +msgid "Merge objects to the one multipart object" +msgstr "Об'єднати об'єкти в один багаточастковий об'єкт" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1952 +msgid "Merge objects to the one single object" +msgstr "Об’єднайте об’єкти в один єдиний об’єкт" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2026 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2283 +msgid "Add Shape" +msgstr "Додати форму" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2111 +msgid "Load Part" +msgstr "Завантажити частину" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2150 +msgid "Error!" +msgstr "Помилка!" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2225 +msgid "Add Generic Subobject" +msgstr "Додати загальний підоб'єкт" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2254 +msgid "Generic" +msgstr "Загальний" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2380 +msgid "Delete Settings" +msgstr "Видалити налаштування" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2402 +msgid "Delete All Instances from Object" +msgstr "Видалити всі екземпляри з об’єкта" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2418 +msgid "Delete Height Range" +msgstr "Видалити діапазон висот" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2450 +msgid "From Object List You can't delete the last solid part from object." +msgstr "" +"Зі списку об’єктів Ви не можете видалити останню суцільну частину з об’єкта." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2454 +msgid "Delete Subobject" +msgstr "Видалити підоб'єкт" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2469 +msgid "Last instance of an object cannot be deleted." +msgstr "Не можна видалити останній екземпляр з об'єкту." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2473 +msgid "Delete Instance" +msgstr "Видалити екземпляр" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2497 src/slic3r/GUI/Plater.cpp:2865 +msgid "" +"The selected object couldn't be split because it contains only one part." +msgstr "" +"Вибраний об'єкт не можна розділити, оскільки він містить лише одну частину." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2501 +msgid "Split to Parts" +msgstr "Розділити на частини" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2637 +msgid "Merged" +msgstr "Об’єднано" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2721 +msgid "Merge all parts to the one single object" +msgstr "Об’єднати всі частини в єдиний об’єкт" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2753 +msgid "Add Layers" +msgstr "Додати шари" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2907 +msgid "Group manipulation" +msgstr "Маніпулювання групою" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2919 +msgid "Object manipulation" +msgstr "Маніпулювання об'єктом" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2932 +msgid "Object Settings to modify" +msgstr "Параметри об'єкту, які можна змінювати" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2936 +msgid "Part Settings to modify" +msgstr "Параметри частини, які можна змінювати" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2941 +msgid "Layer range Settings to modify" +msgstr "Пакет налаштувань для діапазону висот" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2947 +msgid "Part manipulation" +msgstr "Маніпулювання частиною" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2953 +msgid "Instance manipulation" +msgstr "Маніпулювання екземпляром" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2960 +msgid "Height ranges" +msgstr "Діапазони висот" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2960 +msgid "Settings for height range" +msgstr "Налаштування діапазону висот" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3144 +msgid "Delete Selected Item" +msgstr "Видалити вибраний елемент" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3332 +msgid "Delete Selected" +msgstr "Видалити вибране" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3408 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3436 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3456 +msgid "Add Height Range" +msgstr "Додати діапазон висот" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3502 +msgid "" +"Cannot insert a new layer range after the current layer range.\n" +"The next layer range is too thin to be split to two\n" +"without violating the minimum layer height." +msgstr "" +"Не вдається вставити новий діапазон шарів після поточного діапазону шарів.\n" +"Діапазон наступного шару занадто тонкий, щоб його можна було розділити на " +"два\n" +"без порушення мінімальної висоти шару." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3506 +msgid "" +"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." +msgstr "" +"Не вдається вставити новий діапазон шарів між поточним та наступним " +"діапазоном шарів.\n" +"Розрив між діапазоном поточного шару та діапазоном наступного шару\n" +"тонше мінімально допустимої висоти шару." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3511 +msgid "" +"Cannot insert a new layer range after the current layer range.\n" +"Current layer range overlaps with the next layer range." +msgstr "" +"Не вдається вставити новий діапазон шарів після поточного діапазону шарів.\n" +"Діапазон поточного шару перекривається з діапазоном наступного шару." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3570 +msgid "Edit Height Range" +msgstr "Редагування діапазону висот" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3865 +msgid "Selection-Remove from list" +msgstr "Виділення - Видалено зі списку" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3873 +msgid "Selection-Add from list" +msgstr "Виділення - Додано зі списку" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4008 +msgid "Object or Instance" +msgstr "\"Об’єкт\" або \"Екземпляр\"" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4009 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4142 +msgid "Part" +msgstr "\"Частина\"" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4009 +msgid "Layer" +msgstr "\"Шар\"" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4011 +msgid "Unsupported selection" +msgstr "Непідтримуваний вибір" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4012 +#, c-format +msgid "You started your selection with %s Item." +msgstr "Ви розпочали свій вибір з елемента %s." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4013 +#, c-format +msgid "In this mode you can select only other %s Items%s" +msgstr "В цьому режимі ви можете вибирати тільки інші %s %s" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4016 +msgid "of a current Object" +msgstr "поточного \"Об'єкта\"" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4021 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4096 src/slic3r/GUI/Plater.cpp:143 +msgid "Info" +msgstr "Інфо" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4137 +msgid "You can't change a type of the last solid part of the object." +msgstr "Ви не можете змінити тип останньої твердої частини об’єкта." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4142 +msgid "Modifier" +msgstr "Модифікатор" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4142 +msgid "Support Enforcer" +msgstr "Примусова підтримка" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4142 +msgid "Support Blocker" +msgstr "Блокувальник підтримок" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4144 +msgid "Select type of part" +msgstr "Змінити тип частини" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4149 +msgid "Change Part Type" +msgstr "Змінити тип деталі" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4394 +msgid "Enter new name" +msgstr "Введіть нову назву" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4394 +msgid "Renaming" +msgstr "Перейменування" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4410 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4537 +#: src/slic3r/GUI/SavePresetDialog.cpp:101 +#: src/slic3r/GUI/SavePresetDialog.cpp:109 +msgid "The supplied name is not valid;" +msgstr "Надане ім'я недійсне;" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4411 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4538 +#: src/slic3r/GUI/SavePresetDialog.cpp:102 +msgid "the following characters are not allowed:" +msgstr "такі символи не допускаються:" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4586 +msgid "Select extruder number:" +msgstr "Виберіть номер екструдера:" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4587 +msgid "This extruder will be set for selected items" +msgstr "Цей екструдер буде встановлений для вибраних елементів" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4612 +msgid "Change Extruders" +msgstr "Змінити екструдери" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4709 src/slic3r/GUI/Selection.cpp:1485 +msgid "Set Printable" +msgstr "Встановити \"Для друку\"" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4709 src/slic3r/GUI/Selection.cpp:1485 +msgid "Set Unprintable" +msgstr "Встановити \"Не для друку\"" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:68 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:111 +msgid "World coordinates" +msgstr "Світові координати" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:69 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:112 +msgid "Local coordinates" +msgstr "Локальні координати" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:88 +msgid "Select coordinate space, in which the transformation will be performed." +msgstr "Виберіть простір координат, в якому буде виконуватися перетворення." + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:163 src/libslic3r/GCode.cpp:537 +msgid "Object name" +msgstr "Назва об'єкту" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:223 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:505 +msgid "Position" +msgstr "Позиція" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:224 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:506 +#: src/slic3r/GUI/Mouse3DController.cpp:486 +#: src/slic3r/GUI/Mouse3DController.cpp:507 +msgid "Rotation" +msgstr "Обертання" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:271 +#, c-format +msgid "Toggle %c axis mirroring" +msgstr "Переключити дзеркальне відображення за осею %c" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:305 +msgid "Set Mirror" +msgstr "Встановити віддзеркалення" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:345 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:357 +msgid "Drop to bed" +msgstr "Поставити на стіл" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:372 +msgid "Reset rotation" +msgstr "Скинути обертання" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:394 +msgid "Reset Rotation" +msgstr "Скинути обертання" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:407 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409 +msgid "Reset scale" +msgstr "Скинути масштаб" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:423 +msgid "Inches" +msgstr "Дюймів" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:507 +msgid "Scale factors" +msgstr "Масштаб" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:561 +msgid "Translate" +msgstr "Перемістити" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:625 +msgid "" +"You cannot use non-uniform scaling mode for multiple objects/parts selection" +msgstr "" +"Не можна використовувати нерівномірний режим масштабування, коли вибрано " +"кілька об’єктів/частей" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:797 +msgid "Set Position" +msgstr "Встановити позицію" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:828 +msgid "Set Orientation" +msgstr "Встановити орієнтацію" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:893 +msgid "Set Scale" +msgstr "Встановити масштаб" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:925 +msgid "" +"The currently manipulated object is tilted (rotation angles are not " +"multiples of 90°).\n" +"Non-uniform scaling of tilted objects is only possible in the World " +"coordinate system,\n" +"once the rotation is embedded into the object coordinates." +msgstr "" +"В даний час маніпульований об'єкт нахилений (кути повороту не кратні 90 °).\n" +"Нерівномірне масштабування нахилених предметів можливе лише у світовій " +"системі координат,\n" +"як тільки обертання буде вбудовано в координати об’єкта." + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:928 +msgid "" +"This operation is irreversible.\n" +"Do you want to proceed?" +msgstr "" +"Ця операція незворотна.\n" +"Ви хочете продовжити?" + +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:62 +msgid "Additional Settings" +msgstr "Додаткові налаштування" + +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:98 +msgid "Remove parameter" +msgstr "Видалити параметр" + +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:104 +#, c-format +msgid "Delete Option %s" +msgstr "Видалити параметр %s" + +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:157 +#, c-format +msgid "Change Option %s" +msgstr "Змінити параметр %s" + +#: src/slic3r/GUI/GUI_Preview.cpp:212 msgid "View" msgstr "Вид" -#: src/slic3r/GUI/GUI_Preview.cpp:212 src/slic3r/GUI/GUI_Preview.cpp:525 -#: src/libslic3r/GCode/PreviewData.cpp:394 -msgid "Feature type" -msgstr "Тип ознаки" - -#: src/slic3r/GUI/GUI_Preview.cpp:213 src/libslic3r/PrintConfig.cpp:467 +#: src/slic3r/GUI/GUI_Preview.cpp:215 src/libslic3r/PrintConfig.cpp:560 msgid "Height" msgstr "Висота" -#: src/slic3r/GUI/GUI_Preview.cpp:214 src/libslic3r/PrintConfig.cpp:2135 +#: src/slic3r/GUI/GUI_Preview.cpp:216 src/libslic3r/PrintConfig.cpp:2466 msgid "Width" msgstr "Ширина" -#: src/slic3r/GUI/GUI_Preview.cpp:216 -msgid "Volumetric flow rate" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:217 src/slic3r/GUI/GUI_Preview.cpp:315 -#: src/slic3r/GUI/GUI_Preview.cpp:469 src/slic3r/GUI/GUI_Preview.cpp:525 -#: src/slic3r/GUI/GUI_Preview.cpp:701 src/libslic3r/GCode/PreviewData.cpp:404 -msgid "Tool" -msgstr "Інструмент" +#: src/slic3r/GUI/GUI_Preview.cpp:218 src/slic3r/GUI/Tab.cpp:1840 +msgid "Fan speed" +msgstr "Швидкість вентилятора" -#: src/slic3r/GUI/GUI_Preview.cpp:218 src/slic3r/GUI/GUI_Preview.cpp:523 -#: src/libslic3r/GCode/PreviewData.cpp:406 -msgid "Color Print" -msgstr "" +#: src/slic3r/GUI/GUI_Preview.cpp:219 +msgid "Volumetric flow rate" +msgstr "Об'ємна швидкість потоку" -#: src/slic3r/GUI/GUI_Preview.cpp:221 +#: src/slic3r/GUI/GUI_Preview.cpp:224 msgid "Show" msgstr "Показати" -#: src/slic3r/GUI/GUI_Preview.cpp:224 src/slic3r/GUI/GUI_Preview.cpp:225 +#: src/slic3r/GUI/GUI_Preview.cpp:227 src/slic3r/GUI/GUI_Preview.cpp:245 msgid "Feature types" msgstr "Типи ознак" -#: src/slic3r/GUI/GUI_Preview.cpp:227 src/libslic3r/GCode/PreviewData.cpp:163 +#: src/slic3r/GUI/GUI_Preview.cpp:230 src/libslic3r/ExtrusionEntity.cpp:310 +#: src/libslic3r/ExtrusionEntity.cpp:332 msgid "Perimeter" msgstr "Периметр" -#: src/slic3r/GUI/GUI_Preview.cpp:228 src/libslic3r/GCode/PreviewData.cpp:164 +#: src/slic3r/GUI/GUI_Preview.cpp:231 src/libslic3r/ExtrusionEntity.cpp:311 +#: src/libslic3r/ExtrusionEntity.cpp:334 msgid "External perimeter" msgstr "Зовнішній периметр" -#: src/slic3r/GUI/GUI_Preview.cpp:229 src/libslic3r/GCode/PreviewData.cpp:165 +#: src/slic3r/GUI/GUI_Preview.cpp:232 src/libslic3r/ExtrusionEntity.cpp:312 +#: src/libslic3r/ExtrusionEntity.cpp:336 msgid "Overhang perimeter" msgstr "Нависаючий периметр" -#: src/slic3r/GUI/GUI_Preview.cpp:230 src/libslic3r/GCode/PreviewData.cpp:166 +#: src/slic3r/GUI/GUI_Preview.cpp:233 src/libslic3r/ExtrusionEntity.cpp:313 +#: src/libslic3r/ExtrusionEntity.cpp:338 msgid "Internal infill" msgstr "Внутрішнє наповнення" -#: src/slic3r/GUI/GUI_Preview.cpp:231 src/libslic3r/PrintConfig.cpp:1686 -#: src/libslic3r/PrintConfig.cpp:1696 src/libslic3r/GCode/PreviewData.cpp:167 +#: src/slic3r/GUI/GUI_Preview.cpp:234 src/libslic3r/ExtrusionEntity.cpp:314 +#: src/libslic3r/ExtrusionEntity.cpp:340 src/libslic3r/PrintConfig.cpp:1956 +#: src/libslic3r/PrintConfig.cpp:1967 msgid "Solid infill" msgstr "Суцільне наповнення" -#: src/slic3r/GUI/GUI_Preview.cpp:232 src/libslic3r/PrintConfig.cpp:2016 -#: src/libslic3r/PrintConfig.cpp:2027 src/libslic3r/GCode/PreviewData.cpp:168 +#: src/slic3r/GUI/GUI_Preview.cpp:235 src/libslic3r/ExtrusionEntity.cpp:315 +#: src/libslic3r/ExtrusionEntity.cpp:342 src/libslic3r/PrintConfig.cpp:2333 +#: src/libslic3r/PrintConfig.cpp:2345 msgid "Top solid infill" msgstr "Верхнє суцільне наповнення" -#: src/slic3r/GUI/GUI_Preview.cpp:233 src/libslic3r/GCode/PreviewData.cpp:169 +#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/ExtrusionEntity.cpp:317 +#: src/libslic3r/ExtrusionEntity.cpp:346 msgid "Bridge infill" msgstr "Мостове наповнення" -#: src/slic3r/GUI/GUI_Preview.cpp:234 src/libslic3r/PrintConfig.cpp:869 -#: src/libslic3r/GCode/PreviewData.cpp:170 +#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:318 +#: src/libslic3r/ExtrusionEntity.cpp:348 src/libslic3r/PrintConfig.cpp:1011 msgid "Gap fill" msgstr "Заповнення розриву" -#: src/slic3r/GUI/GUI_Preview.cpp:235 src/slic3r/GUI/Tab.cpp:1001 -#: src/libslic3r/GCode/PreviewData.cpp:171 +#: src/slic3r/GUI/GUI_Preview.cpp:239 src/slic3r/GUI/Tab.cpp:1462 +#: src/libslic3r/ExtrusionEntity.cpp:319 src/libslic3r/ExtrusionEntity.cpp:350 msgid "Skirt" msgstr "Плінтус" -#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/PrintConfig.cpp:1903 -#: src/libslic3r/GCode/PreviewData.cpp:173 +#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:321 +#: src/libslic3r/ExtrusionEntity.cpp:354 src/libslic3r/PrintConfig.cpp:2218 msgid "Support material interface" msgstr "Інтерфейс підтримуючого матеріалу" -#: src/slic3r/GUI/GUI_Preview.cpp:238 src/slic3r/GUI/Tab.cpp:1081 -#: src/libslic3r/GCode/PreviewData.cpp:174 +#: src/slic3r/GUI/GUI_Preview.cpp:242 src/slic3r/GUI/Tab.cpp:1545 +#: src/libslic3r/ExtrusionEntity.cpp:322 src/libslic3r/ExtrusionEntity.cpp:356 msgid "Wipe tower" -msgstr "Вежа вичищування" +msgstr "Вежа витирання" -#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/PrintConfig.cpp:2049 -msgid "Travel" -msgstr "Пересування" +#: src/slic3r/GUI/GUI_Preview.cpp:1031 +msgid "Shells" +msgstr "Оболонки" -#: src/slic3r/GUI/GUI_Preview.cpp:244 -msgid "Retractions" -msgstr "Переривання" +#: src/slic3r/GUI/GUI_Preview.cpp:1032 +msgid "Tool marker" +msgstr "Маркер інструменту" -#: src/slic3r/GUI/GUI_Preview.cpp:245 -msgid "Unretractions" -msgstr "Непереривання" +#: src/slic3r/GUI/GUI_Preview.cpp:1033 +msgid "Legend/Estimated printing time" +msgstr "Легенда / Приблизний час друку" -#: src/slic3r/GUI/GUI_Preview.cpp:246 -msgid "Shells" -msgstr "Оболонки" +#: src/slic3r/GUI/ImGuiWrapper.cpp:804 src/slic3r/GUI/Search.cpp:389 +msgid "Use for search" +msgstr "Використовуйте для пошуку" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:13 -msgid "Slic3r Prusa Edition - Keyboard Shortcuts" -msgstr "" +#: src/slic3r/GUI/ImGuiWrapper.cpp:805 src/slic3r/GUI/Search.cpp:383 +msgid "Category" +msgstr "Категорія" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 -msgid "Open project STL/OBJ/AMF/3MF with config, delete bed" -msgstr "" +#: src/slic3r/GUI/ImGuiWrapper.cpp:807 src/slic3r/GUI/Search.cpp:385 +msgid "Search in English" +msgstr "Шукати англійською мовою" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:101 -msgid "Import STL/OBJ/AMF/3MF without config, keep bed" -msgstr "" +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:145 +msgid "Arranging" +msgstr "Розташування" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 -msgid "Load Config from .ini/amf/3mf/gcode" +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:175 +msgid "Could not arrange model objects! Some geometries may be invalid." msgstr "" +"Не вдалося розташувати об’єкти моделі! Деякі геометрії можуть бути невірними." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:103 src/slic3r/GUI/Plater.cpp:725 -#: src/slic3r/GUI/Plater.cpp:3673 src/libslic3r/PrintConfig.cpp:2957 -msgid "Export G-code" -msgstr "" +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:181 +msgid "Arranging canceled." +msgstr "Розташування скасовано." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 -msgid "Save project (3MF)" +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:182 +msgid "Arranging done." +msgstr "Розташування виконано." + +#: src/slic3r/GUI/Jobs/Job.cpp:75 +msgid "ERROR: not enough resources to execute a new job." +msgstr "ПОМИЛКА: недостатньо ресурсів для виконання нового завдання." + +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:41 +msgid "Searching for optimal orientation" +msgstr "Пошук оптимальної орієнтації" + +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:73 +msgid "Orientation search canceled." +msgstr "Пошук орієнтації скасовано." + +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:74 +msgid "Orientation found." +msgstr "Орієнтація знайдена." + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:35 +msgid "Choose SLA archive:" +msgstr "Виберіть SLA-архів:" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:39 +msgid "Import file" +msgstr "Імпорт файлу" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:46 +msgid "Import model and profile" +msgstr "Імпорт моделі та профілю" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:47 +msgid "Import profile only" +msgstr "Імпорт тільки профілю" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:48 +msgid "Import model only" +msgstr "Імпорт тільки моделі" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:59 +msgid "Accurate" +msgstr "Точний" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:60 +msgid "Balanced" +msgstr "Збалансований" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:61 +msgid "Quick" +msgstr "Швидко" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:135 +msgid "Importing SLA archive" +msgstr "Імпорт SLA-архіву" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:159 +msgid "Importing canceled." +msgstr "Імпорт скасовано." + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:160 +msgid "Importing done." +msgstr "Імпорт виконано." + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:208 src/slic3r/GUI/Plater.cpp:2357 +msgid "You cannot load SLA project with a multi-part object on the bed" msgstr "" +"Ви не можете завантажувати SLA-проект, що містить об'єкт, який складається з " +"кількох частин" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:105 -msgid "Load Config from .ini/amf/3mf/gcode and merge" +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:209 src/slic3r/GUI/Plater.cpp:2358 +#: src/slic3r/GUI/Tab.cpp:3243 +msgid "Please check your object list before preset changing." msgstr "" +"Будь ласка, перевірте свій список об'єктів перед тим, як змінити пресет." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:17 src/slic3r/GUI/MainFrame.cpp:894 +msgid "Keyboard Shortcuts" +msgstr "Гарячі клавіши" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:69 +msgid "New project, clear plater" +msgstr "Новий проект, очистити платер" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:70 +msgid "Open project STL/OBJ/AMF/3MF with config, clear plater" +msgstr "Відкрити проект STL / OBJ / AMF / 3MF з конфігурацією, очистити стіл" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:71 +msgid "Save project (3mf)" +msgstr "Зберегти проект (3mf)" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:72 +msgid "Save project as (3mf)" +msgstr "Зберегти проект як (3mf)" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:73 msgid "(Re)slice" -msgstr "" +msgstr "(Пере)Нарізати" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:107 -msgid "Quick slice" -msgstr "" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:75 +msgid "Import STL/OBJ/AMF/3MF without config, keep plater" +msgstr "Імпорт STL/OBJ/AMF/3MF без конфігурації зі збереженням платеру" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 src/slic3r/GUI/MainFrame.cpp:326 -msgid "Repeat last quick slice" -msgstr "Повторити останнє швидке нарізання" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:76 +msgid "Import Config from ini/amf/3mf/gcode" +msgstr "Імпорт конфігурації з INI/AMF/3MF/GCODE" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:77 +msgid "Load Config from ini/amf/3mf/gcode and merge" +msgstr "Завантажити конфігурацію з INI/AMF/3MF/GCODE та об’єднати" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:79 src/slic3r/GUI/Plater.cpp:770 +#: src/slic3r/GUI/Plater.cpp:6054 src/libslic3r/PrintConfig.cpp:3635 +msgid "Export G-code" +msgstr "Експорт G-коду" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:80 src/slic3r/GUI/Plater.cpp:6055 +msgid "Send G-code" +msgstr "Надіслання G-коду" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:81 +msgid "Export config" +msgstr "Експорт конфігурації" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:82 src/slic3r/GUI/Plater.cpp:758 +msgid "Export to SD card / Flash drive" +msgstr "Експорт на SD-карту/флешку" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:83 +msgid "Eject SD card / Flash drive" +msgstr "Від'єднати SD-карту/флешку" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:85 +msgid "Select all objects" +msgstr "Вибрати всі об'єкти" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:86 +msgid "Deselect all" +msgstr "Скасувати весь вибір" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:87 +msgid "Delete selected" +msgstr "Видалити вибране" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:91 +msgid "Copy to clipboard" +msgstr "Скопіювати в буфер обміну" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:92 +msgid "Paste from clipboard" +msgstr "Вставити з буферу обміну" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:94 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:96 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 +msgid "Reload plater from disk" +msgstr "Перезавантажити стіл з диска" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:100 msgid "Select Plater Tab" msgstr "Вибрати вкладку Plater" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 -msgid "Quick slice and Save as" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:101 msgid "Select Print Settings Tab" msgstr "Вибрати вкладку параметрів друку" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:102 msgid "Select Filament Settings Tab" msgstr "Вибрати вкладку параметрів філаменту" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:103 msgid "Select Printer Settings Tab" msgstr "Вибрати вкладку параметрів принтеру" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 msgid "Switch to 3D" -msgstr "" +msgstr "Переключити на 3D" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:105 msgid "Switch to Preview" -msgstr "" +msgstr "Переключити на Перегляд" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 +#: src/slic3r/GUI/PrintHostDialogs.cpp:165 +msgid "Print host upload queue" +msgstr "Черга завантаження хоста друку" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:107 src/slic3r/GUI/MainFrame.cpp:65 +#: src/slic3r/GUI/MainFrame.cpp:1191 +msgid "Open new instance" +msgstr "Відкрити новий екземпляр" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 +msgid "Camera view" +msgstr "Вид камери" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 +msgid "Show/Hide object/instance labels" +msgstr "Показати/сховати мітки об’єктів/екземплярів" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:116 src/slic3r/GUI/Preferences.cpp:10 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 src/slic3r/GUI/Preferences.cpp:13 msgid "Preferences" msgstr "Преференції" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 +msgid "Show keyboard shortcuts list" +msgstr "Показати список гарячих клавіш" + #: src/slic3r/GUI/KBShortcutsDialog.cpp:117 -#: src/slic3r/GUI/PrintHostDialogs.cpp:134 -msgid "Print host upload queue" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:191 +msgid "Commands" +msgstr "Команди" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 +msgid "Add Instance of the selected object" +msgstr "Додати екземпляр вибраного об’єкта" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 +msgid "Remove Instance of the selected object" +msgstr "Видалити екземпляр вибраного об’єкта" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 +msgid "" +"Press to select multiple objects\n" +"or move multiple objects with mouse" +msgstr "" +"Натисніть, щоб вибрати кілька об'єктів\n" +"або переміщуйте кілька об’єктів за допомогою миші" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:125 +msgid "Press to activate selection rectangle" +msgstr "Натисніть, щоб активувати прямокутник виділення" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +msgid "Press to activate deselection rectangle" +msgstr "Натисніть, щоб активувати прямокутник скасування вибору" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 +msgid "Arrow Up" +msgstr "Стрілка вгору" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 +msgid "Move selection 10 mm in positive Y direction" +msgstr "Перемістити виділення на 10 мм у позитивному напрямку за Y" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:128 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:208 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:244 +msgid "Arrow Down" +msgstr "Стрілка вниз" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:128 +msgid "Move selection 10 mm in negative Y direction" +msgstr "Перемістити виділення на 10 мм у негативному напрямку за Y" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:221 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:228 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +msgid "Arrow Left" +msgstr "Стрілка вліво" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 +msgid "Move selection 10 mm in negative X direction" +msgstr "Перемістити виділення на 10 мм у негативному напрямку за X" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:229 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:247 +msgid "Arrow Right" +msgstr "Стрілка вправо" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 +msgid "Move selection 10 mm in positive X direction" +msgstr "Перемістити виділення на 10 мм у позитивному напрямку за X" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:131 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 +msgid "Any arrow" +msgstr "Будь-яка стрілка" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:131 +msgid "Movement step set to 1 mm" +msgstr "Встановити крок переміщення на 1 мм" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 +msgid "Movement in camera space" +msgstr "Переміщення відносно камери" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:133 +msgid "Page Up" +msgstr "Попередня сторінка" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:133 +msgid "Rotate selection 45 degrees CCW" +msgstr "Повернути вибране на 45 градусів за годинниковою стрілкою" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 +msgid "Page Down" +msgstr "Наступна сторінка" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 +msgid "Rotate selection 45 degrees CW" +msgstr "Повернути вибране на 45 градусів проти годинникової стрілки" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 +msgid "Gizmo move" +msgstr "Gizmo переміщення" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 +msgid "Gizmo scale" +msgstr "Gizmo масштабування" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 +msgid "Gizmo rotate" +msgstr "Gizmo обертання" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +msgid "Gizmo cut" +msgstr "Gizmo розрізання" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 +msgid "Gizmo Place face on bed" +msgstr "Gizmo \"Поверхнею на стіл\"" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 +msgid "Gizmo SLA hollow" +msgstr "Gizmo SLA-порожнистість" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 +msgid "Gizmo SLA support points" +msgstr "Gizmo точки SLA-підтримок" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +msgid "Unselect gizmo or clear selection" +msgstr "Скасуйте вибір gizmo або очистіть виділення" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 +msgid "Change camera type (perspective, orthographic)" +msgstr "Зміна типу камери (перспективна, орфографічна)" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +msgid "Zoom to Bed" +msgstr "Приблизити до розміру столу" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +msgid "" +"Zoom to selected object\n" +"or all objects in scene, if none selected" +msgstr "" +"Приблизити до розміру об'єкту\n" +"або до всіх об'єктів сцени, якщо жоден не вибрано" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +msgid "Zoom in" +msgstr "Приблизити" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 +msgid "Zoom out" +msgstr "Віддалити" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +msgid "Switch between Editor/Preview" +msgstr "Перемикання між Редактором та Попереднім переглядом" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +msgid "Collapse/Expand the sidebar" +msgstr "Згорнути/Розгорнути бічну панель" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +msgid "Show/Hide 3Dconnexion devices settings dialog, if enabled" +msgstr "" +"Показати/сховати діалогове вікно налаштувань пристроїв 3Dconnexion, якщо " +"такі існують" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 +msgid "Show/Hide 3Dconnexion devices settings dialog" +msgstr "Показати/сховати діалогове вікно налаштувань пристроїв 3Dconnexion" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 src/slic3r/GUI/MainFrame.cpp:331 +#: src/slic3r/GUI/MainFrame.cpp:343 +msgid "Plater" +msgstr "Платер" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +msgid "All gizmos: Rotate - left mouse button; Pan - right mouse button" +msgstr "" +"Всі gizmos: Обертати — ліва кнопка миші; Панорамування — права кнопка миші" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 +msgid "Gizmo move: Press to snap by 1mm" +msgstr "Gizmo переміщення: Натисніть, щоб зафіксувати переміщення через 1 мм" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 +msgid "Gizmo scale: Press to snap by 5%" +msgstr "Gizmo масштабування: Натисніть, щоб зафіксувати обертання на 5%" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 +msgid "Gizmo scale: Scale selection to fit print volume" +msgstr "Gizmo масштабування: Масштабуйте вибране відповідно до об'єму столу" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 +msgid "Gizmo scale: Press to activate one direction scaling" +msgstr "" +"Gizmo масштабування: Натисніть, щоб активувати масштабування в одному " +"напрямку" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:175 +msgid "Gizmo scale: Press to scale selected objects around their own center" +msgstr "" +"Gizmo масштабування: Натисніть, щоб масштабувати вибрані об'єкти навколо їх " +"власного центру" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 +msgid "Gizmo rotate: Press to rotate selected objects around their own center" +msgstr "" +"Gizmo обертання: Натисніть, щоб обертати вибрані об'єкти навколо їх власного " +"центру" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +msgid "Gizmos" +msgstr "Всі gizmos" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +msgid "" +"The following shortcuts are applicable when the specified gizmo is active" +msgstr "Наступні гарячі клавіші застосовуються, коли активне вказане gizmo" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:183 src/slic3r/GUI/MainFrame.cpp:1244 +msgid "Open a G-code file" +msgstr "Відкрити файл G-кода" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 src/slic3r/GUI/MainFrame.cpp:1142 +#: src/slic3r/GUI/MainFrame.cpp:1146 src/slic3r/GUI/MainFrame.cpp:1249 +#: src/slic3r/GUI/MainFrame.cpp:1253 +msgid "Reload the plater from disk" +msgstr "Перезавантажити стіл з диска" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:200 +msgid "Vertical slider - Move active thumb Up" +msgstr "Вертикальний повзунок - Перемістити активний повзунок вгору" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:201 +msgid "Vertical slider - Move active thumb Down" +msgstr "Вертикальний повзунок - Перемістити активний повзунок вниз" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:202 +msgid "Horizontal slider - Move active thumb Left" +msgstr "Горизонтальний повзунок - Перемістити активний повзунок вліво" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:203 +msgid "Horizontal slider - Move active thumb Right" +msgstr "Горизонтальний повзунок - Перемістити активний повзунок вправо" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 +msgid "On/Off one layer mode of the vertical slider" +msgstr "Увімкнути/Вимкнути одношаровий режим вертикального повзунка" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 +msgid "Show/Hide Legend and Estimated printing time" +msgstr "Показати / Сховати легенду та приблизний час друку" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 +msgid "Upper layer" +msgstr "Верхній шар" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:208 +msgid "Lower layer" +msgstr "Нижній шар" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:209 +msgid "Upper Layer" +msgstr "Верхній шар" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:210 +msgid "Lower Layer" +msgstr "Нижній шар" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:211 +msgid "Show/Hide Legend & Estimated printing time" +msgstr "Показати / Сховати легенду та приблизний час друку" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 src/slic3r/GUI/Plater.cpp:4200 +#: src/slic3r/GUI/Tab.cpp:2602 +msgid "Preview" +msgstr "Попередній перегляд" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 +msgid "Move active thumb Up" +msgstr "Перемістити активний повзунок вгору" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 +msgid "Move active thumb Down" +msgstr "Перемістити активний повзунок вниз" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:221 +msgid "Set upper thumb as active" +msgstr "Встановити активним верхній повзунок" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 +msgid "Set lower thumb as active" +msgstr "Встановити активним нижній повзунок" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 +msgid "Add color change marker for current layer" +msgstr "Додати маркер зміни кольору для поточного шару" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:231 +msgid "Delete color change marker for current layer" +msgstr "Видалити маркер зміни кольору для поточного шару" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 +msgid "Move current slider thumb Up" +msgstr "Перемістити активний повзунок вгору" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 +msgid "Move current slider thumb Down" +msgstr "Перемістити активний повзунок вниз" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:228 +msgid "Set upper thumb to current slider thumb" +msgstr "Встановити верхній повзунок на поточну позицію" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:229 +msgid "Set lower thumb to current slider thumb" +msgstr "Встановити нижній повзунок на поточну позицію" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:233 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:234 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:249 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:250 +msgid "" +"Press to speed up 5 times while moving thumb\n" +"with arrow keys or mouse wheel" msgstr "" +"Натисніть, щоб мати 5-кратне прискорення під час руху повзунка\n" +"за допомогою клавіш зі стрілками або колеса миші" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:237 +msgid "Vertical Slider" +msgstr "Вертикальний повзунок" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:237 +msgid "" +"The following shortcuts are applicable in G-code preview when the vertical " +"slider is active" +msgstr "" +"Наведені нижче гарячі клавіші застосовуються у перегляді G-коду, коли " +"вертикальний повзунок активний" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:241 +msgid "Move active thumb Left" +msgstr "Перемістити активний повзунок вліво" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 +msgid "Move active thumb Right" +msgstr "Перемістити активний повзунок вправо" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:243 +msgid "Set left thumb as active" +msgstr "Встановити активним лівий повзунок" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:244 +msgid "Set right thumb as active" +msgstr "Встановити активним правий повзунок" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 -msgid "Camera view " -msgstr "" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:246 +msgid "Move active slider thumb Left" +msgstr "Перемістити активний повзунок вліво" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 -msgid "Add Instance to selected object " -msgstr "" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:247 +msgid "Move active slider thumb Right" +msgstr "Перемістити активний повзунок вправо" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 -msgid "Remove Instance from selected object" -msgstr "" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 +msgid "Horizontal Slider" +msgstr "Горизонтальний повзунок" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 -msgid "Show keyboard shortcuts list" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:253 +msgid "" +"The following shortcuts are applicable in G-code preview when the horizontal " +"slider is active" msgstr "" +"Наведені нижче гарячі клавіші застосовуються у перегляді G-коду, коли " +"горизонтальний повзунок активний" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 -msgid "Select multiple object/Move multiple object" -msgstr "" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:276 +msgid "Keyboard shortcuts" +msgstr "Гарячі клавіши" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 -msgid "Main Shortcuts" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:65 src/slic3r/GUI/MainFrame.cpp:79 +#: src/slic3r/GUI/MainFrame.cpp:1191 +msgid "Open a new PrusaSlicer instance" +msgstr "Відкрити новий екземпляр PrusaSlicer" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 -msgid "Arrange" -msgstr "Організувати" +#: src/slic3r/GUI/MainFrame.cpp:68 src/slic3r/GUI/MainFrame.cpp:81 +msgid "G-code preview" +msgstr "Перегляд G-коду" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:131 -msgid "Select All objects" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:68 src/slic3r/GUI/MainFrame.cpp:1091 +msgid "Open G-code viewer" +msgstr "Відкрити переглядач G-коду" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 -msgid "Delete selected" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:79 src/slic3r/GUI/MainFrame.cpp:1260 +msgid "Open PrusaSlicer" +msgstr "Відкрити PrusaSlicer" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:133 -msgid "Delete All" -msgstr "Видалити все" +#: src/slic3r/GUI/MainFrame.cpp:81 +msgid "Open new G-code viewer" +msgstr "Відкрити новий переглядач G-коду" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 -msgid "Gizmo move" +#: src/slic3r/GUI/MainFrame.cpp:153 +msgid "" +"Remember to check for updates at https://github.com/prusa3d/PrusaSlicer/" +"releases" msgstr "" +"Не забудьте перевірити наявність оновлень на https://github.com/prusa3d/" +"PrusaSlicer/releases" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 -msgid "Gizmo scale" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:510 +msgid "based on Slic3r" +msgstr "на основі Slic3r" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 -msgid "Gizmo rotate" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:866 +msgid "Prusa 3D &Drivers" +msgstr "Драйвери Prusa3D" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 -msgid "Gizmo cut" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:866 +msgid "Open the Prusa3D drivers download page in your browser" +msgstr "Відкрити сторінку завантаження драйверів Prusa3D у своєму браузері" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 -msgid "Gizmo Place face on bed" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:868 +msgid "Software &Releases" +msgstr "Релізи ПЗ" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 -msgid "Gizmo SLA support points" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:868 +msgid "Open the software releases page in your browser" +msgstr "Відкрити сторінку релізів PrusaEdition у своєму браузері" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 -#, no-c-format -msgid "" -"Press to snap by 5% in Gizmo scale\n" -"or by 1mm in Gizmo move" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:874 +#, c-format +msgid "%s &Website" +msgstr "Веб-сайт %s" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 -msgid "" -"Press to scale or rotate selected objects\n" -"around their own center" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:875 +#, c-format +msgid "Open the %s website in your browser" +msgstr "Відкрити сторінку %s у своєму браузері" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 -msgid "Zoom to Bed" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:881 +msgid "System &Info" +msgstr "Інформація про систему" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 -msgid "Zoom to all objects in scene, if none selected" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:881 +msgid "Show system information" +msgstr "Показати інформацію про систему" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 -msgid "Zoom to selected object" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:883 +msgid "Show &Configuration Folder" +msgstr "Показати папку конфігурації" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 -msgid "Zoom in" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:883 +msgid "Show user configuration folder (datadir)" +msgstr "Показати папку користувацької конфігурації (datadir)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 -msgid "Zoom out" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:885 +msgid "Report an I&ssue" +msgstr "Повідомити про проблему" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 -msgid "Unselect gizmo, keep object selection" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:885 +#, c-format +msgid "Report an issue on %s" +msgstr "Повідомити про проблему на %s" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 -msgid "Plater Shortcuts" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:888 src/slic3r/GUI/MainFrame.cpp:891 +#, c-format +msgid "&About %s" +msgstr "О %s" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:175 -msgid "Arrow Up" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:888 src/slic3r/GUI/MainFrame.cpp:891 +msgid "Show about dialog" +msgstr "Показати діалог Про Slic3r" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 -msgid "Upper Layer" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:894 +msgid "Show the list of the keyboard shortcuts" +msgstr "Показати список гарячих клавіш" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 -msgid "Arrow Down" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:908 +msgid "Iso" +msgstr "Iso" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 -msgid "Lower Layer" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:908 +msgid "Iso View" +msgstr "Вид Iso" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 -msgid "Preview Shortcuts" -msgstr "" +#. TRN To be shown in the main menu View->Top +#. TRN To be shown in Print Settings "Top solid layers" +#: src/slic3r/GUI/MainFrame.cpp:912 src/libslic3r/PrintConfig.cpp:2360 +#: src/libslic3r/PrintConfig.cpp:2369 +msgid "Top" +msgstr "Зверху" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:175 -msgid "Move current slider thump Up" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:912 +msgid "Top View" +msgstr "Вид зверху" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 -msgid "Move current slider thump Down" -msgstr "" +#. TRN To be shown in the main menu View->Bottom +#. TRN To be shown in Print Settings "Bottom solid layers" +#. TRN To be shown in Print Settings "Top solid layers" +#: src/slic3r/GUI/MainFrame.cpp:915 src/libslic3r/PrintConfig.cpp:230 +#: src/libslic3r/PrintConfig.cpp:239 +msgid "Bottom" +msgstr "Знизу" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:177 -msgid "Arrow Left" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:915 +msgid "Bottom View" +msgstr "Вид знизу" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:177 -msgid "Set upper thumb to current slider thumb" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:917 +msgid "Front" +msgstr "Спереду" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:178 -msgid "Arrow Right" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:917 +msgid "Front View" +msgstr "Вид спереду" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:178 -msgid "Set lower thumb to current slider thumb" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:919 src/libslic3r/PrintConfig.cpp:1845 +msgid "Rear" +msgstr "Ззаду" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 -msgid "Add color change marker for current layer" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:919 +msgid "Rear View" +msgstr "Вид ззаду" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:180 -msgid "Delete color change marker for current layer" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:921 +msgid "Left" +msgstr "З лівого боку" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 -msgid "Layers Slider Shortcuts" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:921 +msgid "Left View" +msgstr "Вид з лівого боку" -#: src/slic3r/GUI/MainFrame.cpp:54 -msgid "" -" - Remember to check for updates at http://github.com/prusa3d/slic3r/releases" -msgstr " - Пам'ятайте оновлювати з http://github.com/prusa3d/slic3r/releases" +#: src/slic3r/GUI/MainFrame.cpp:923 +msgid "Right" +msgstr "З правого боку" -#: src/slic3r/GUI/MainFrame.cpp:160 -msgid "Plater" -msgstr "Платер" +#: src/slic3r/GUI/MainFrame.cpp:923 +msgid "Right View" +msgstr "Вид з правого боку" + +#: src/slic3r/GUI/MainFrame.cpp:936 +msgid "&New Project" +msgstr "Новий проект" -#: src/slic3r/GUI/MainFrame.cpp:273 +#: src/slic3r/GUI/MainFrame.cpp:936 +msgid "Start a new project" +msgstr "Почати новий проект" + +#: src/slic3r/GUI/MainFrame.cpp:939 msgid "&Open Project" -msgstr "" +msgstr "Відкрити проект" -#: src/slic3r/GUI/MainFrame.cpp:273 +#: src/slic3r/GUI/MainFrame.cpp:939 msgid "Open a project file" +msgstr "Відкрити файл проекту" + +#: src/slic3r/GUI/MainFrame.cpp:944 +msgid "Recent projects" +msgstr "Останні проекти" + +#: src/slic3r/GUI/MainFrame.cpp:953 +msgid "" +"The selected project is no longer available.\n" +"Do you want to remove it from the recent projects list?" msgstr "" +"Вибраний проект більше не доступний.\n" +"Видалити його зі списку останніх проектів?" + +#: src/slic3r/GUI/MainFrame.cpp:953 src/slic3r/GUI/MainFrame.cpp:1343 +#: src/slic3r/GUI/PrintHostDialogs.cpp:263 +msgid "Error" +msgstr "Помилка" -#: src/slic3r/GUI/MainFrame.cpp:275 +#: src/slic3r/GUI/MainFrame.cpp:978 msgid "&Save Project" -msgstr "" +msgstr "Зберегти проект" -#: src/slic3r/GUI/MainFrame.cpp:275 +#: src/slic3r/GUI/MainFrame.cpp:978 msgid "Save current project file" -msgstr "" +msgstr "Зберегти файл поточного проекту" -#: src/slic3r/GUI/MainFrame.cpp:277 +#: src/slic3r/GUI/MainFrame.cpp:982 src/slic3r/GUI/MainFrame.cpp:984 msgid "Save Project &as" -msgstr "" +msgstr "Зберегти проект як" -#: src/slic3r/GUI/MainFrame.cpp:277 +#: src/slic3r/GUI/MainFrame.cpp:982 src/slic3r/GUI/MainFrame.cpp:984 msgid "Save current project file as" -msgstr "" +msgstr "Зберегти файл поточного проекту як" -#: src/slic3r/GUI/MainFrame.cpp:283 +#: src/slic3r/GUI/MainFrame.cpp:992 msgid "Import STL/OBJ/AM&F/3MF" -msgstr "" +msgstr "Імпорт STL/OBJ/AMF/3MF" -#: src/slic3r/GUI/MainFrame.cpp:283 +#: src/slic3r/GUI/MainFrame.cpp:992 msgid "Load a model" -msgstr "" +msgstr "Завантажити модель" + +#: src/slic3r/GUI/MainFrame.cpp:996 +msgid "Import STL (imperial units)" +msgstr "Імпорт SТL (в імперських одиницях)" + +#: src/slic3r/GUI/MainFrame.cpp:996 +msgid "Load an model saved with imperial units" +msgstr "Завантажити модель, збережену в імперських одиницях" -#: src/slic3r/GUI/MainFrame.cpp:286 +#: src/slic3r/GUI/MainFrame.cpp:1000 +msgid "Import SL1 archive" +msgstr "Імпорт SL1-архіву" + +#: src/slic3r/GUI/MainFrame.cpp:1000 +msgid "Load an SL1 archive" +msgstr "Завантажити SL1-архів" + +#: src/slic3r/GUI/MainFrame.cpp:1005 msgid "Import &Config" -msgstr "" +msgstr "Імпорт конфігурації" -#: src/slic3r/GUI/MainFrame.cpp:286 +#: src/slic3r/GUI/MainFrame.cpp:1005 msgid "Load exported configuration file" msgstr "Завантажити експортований файл конфігурації" -#: src/slic3r/GUI/MainFrame.cpp:288 +#: src/slic3r/GUI/MainFrame.cpp:1008 msgid "Import Config from &project" -msgstr "" +msgstr "Імпорт конфігурації з проекту" -#: src/slic3r/GUI/MainFrame.cpp:288 +#: src/slic3r/GUI/MainFrame.cpp:1008 msgid "Load configuration from project file" -msgstr "" +msgstr "Завантажити конфігурацію з файлу проекту" -#: src/slic3r/GUI/MainFrame.cpp:291 +#: src/slic3r/GUI/MainFrame.cpp:1012 msgid "Import Config &Bundle" -msgstr "" +msgstr "Імпорт пакету конфігурацій" -#: src/slic3r/GUI/MainFrame.cpp:291 +#: src/slic3r/GUI/MainFrame.cpp:1012 msgid "Load presets from a bundle" msgstr "Завантажити налаштування з пакету" -#: src/slic3r/GUI/MainFrame.cpp:293 +#: src/slic3r/GUI/MainFrame.cpp:1015 msgid "&Import" -msgstr "" +msgstr "Імпорт" -#: src/slic3r/GUI/MainFrame.cpp:296 +#: src/slic3r/GUI/MainFrame.cpp:1018 src/slic3r/GUI/MainFrame.cpp:1305 msgid "Export &G-code" -msgstr "" +msgstr "Експортувати G-код" -#: src/slic3r/GUI/MainFrame.cpp:296 +#: src/slic3r/GUI/MainFrame.cpp:1018 msgid "Export current plate as G-code" msgstr "Експорт поточної пластини як G-код" -#: src/slic3r/GUI/MainFrame.cpp:299 +#: src/slic3r/GUI/MainFrame.cpp:1022 src/slic3r/GUI/MainFrame.cpp:1306 +msgid "S&end G-code" +msgstr "Надіслати G-код" + +#: src/slic3r/GUI/MainFrame.cpp:1022 +msgid "Send to print current plate as G-code" +msgstr "Надіслати на принтер поточний стіл як G-код" + +#: src/slic3r/GUI/MainFrame.cpp:1026 +msgid "Export G-code to SD card / Flash drive" +msgstr "Експорт G-коду на SD-карту / Флешку" + +#: src/slic3r/GUI/MainFrame.cpp:1026 +msgid "Export current plate as G-code to SD card / Flash drive" +msgstr "Експорт поточного столу як G-код на SD-карту / Флешку" + +#: src/slic3r/GUI/MainFrame.cpp:1030 msgid "Export plate as &STL" -msgstr "" +msgstr "Експорт столу як STL" -#: src/slic3r/GUI/MainFrame.cpp:299 +#: src/slic3r/GUI/MainFrame.cpp:1030 msgid "Export current plate as STL" msgstr "Експорт поточної пластини як STL" -#: src/slic3r/GUI/MainFrame.cpp:301 +#: src/slic3r/GUI/MainFrame.cpp:1033 +msgid "Export plate as STL &including supports" +msgstr "Експорт столу як STL, включаючи підтримку" + +#: src/slic3r/GUI/MainFrame.cpp:1033 +msgid "Export current plate as STL including supports" +msgstr "Експорт поточного столу як STL, включаючи підтримку" + +#: src/slic3r/GUI/MainFrame.cpp:1036 msgid "Export plate as &AMF" -msgstr "" +msgstr "Експорт столу як AMF" -#: src/slic3r/GUI/MainFrame.cpp:301 +#: src/slic3r/GUI/MainFrame.cpp:1036 msgid "Export current plate as AMF" msgstr "Експорт поточної пластини як AMF" -#: src/slic3r/GUI/MainFrame.cpp:304 +#: src/slic3r/GUI/MainFrame.cpp:1040 src/slic3r/GUI/MainFrame.cpp:1257 +msgid "Export &toolpaths as OBJ" +msgstr "Експорт шляхів інструментів як OBJ" + +#: src/slic3r/GUI/MainFrame.cpp:1040 src/slic3r/GUI/MainFrame.cpp:1257 +msgid "Export toolpaths as OBJ" +msgstr "Експорт шляхів інструментів як OBJ" + +#: src/slic3r/GUI/MainFrame.cpp:1044 msgid "Export &Config" -msgstr "" +msgstr "Експортувати конфігурацію" -#: src/slic3r/GUI/MainFrame.cpp:304 +#: src/slic3r/GUI/MainFrame.cpp:1044 msgid "Export current configuration to file" msgstr "Експортувати поточну конфігурацію в файл" -#: src/slic3r/GUI/MainFrame.cpp:306 +#: src/slic3r/GUI/MainFrame.cpp:1047 msgid "Export Config &Bundle" -msgstr "" +msgstr "Експортувати пакет конфігурації" -#: src/slic3r/GUI/MainFrame.cpp:306 +#: src/slic3r/GUI/MainFrame.cpp:1047 msgid "Export all presets to file" msgstr "Експортувати всі налаштування у файл" -#: src/slic3r/GUI/MainFrame.cpp:308 +#: src/slic3r/GUI/MainFrame.cpp:1050 +msgid "Export Config Bundle With Physical Printers" +msgstr "Експортувати пакет конфігурації, включаючи фізичні принтери" + +#: src/slic3r/GUI/MainFrame.cpp:1050 +msgid "Export all presets including physical printers to file" +msgstr "Експортуйте всі пресети, включаючи фізичні принтери, у файл" + +#: src/slic3r/GUI/MainFrame.cpp:1053 msgid "&Export" +msgstr "Експорт" + +#: src/slic3r/GUI/MainFrame.cpp:1055 +msgid "Ejec&t SD card / Flash drive" +msgstr "Від'єднати SD-карту/флешку" + +#: src/slic3r/GUI/MainFrame.cpp:1055 +msgid "Eject SD card / Flash drive after the G-code was exported to it." msgstr "" +"Від'єднати SD-карту / Флешку після того, як на неї був експортований G-код." -#: src/slic3r/GUI/MainFrame.cpp:314 +#: src/slic3r/GUI/MainFrame.cpp:1063 msgid "Quick Slice" -msgstr "" +msgstr "Швидке нарізання" -#: src/slic3r/GUI/MainFrame.cpp:314 +#: src/slic3r/GUI/MainFrame.cpp:1063 msgid "Slice a file into a G-code" msgstr "Нарізати файл у G-код" -#: src/slic3r/GUI/MainFrame.cpp:320 +#: src/slic3r/GUI/MainFrame.cpp:1069 msgid "Quick Slice and Save As" -msgstr "" +msgstr "Швидко нарізати та зберегти як" -#: src/slic3r/GUI/MainFrame.cpp:320 +#: src/slic3r/GUI/MainFrame.cpp:1069 msgid "Slice a file into a G-code, save as" msgstr "Нарізати файл у G-код, зберегти як" -#: src/slic3r/GUI/MainFrame.cpp:326 +#: src/slic3r/GUI/MainFrame.cpp:1075 msgid "Repeat Last Quick Slice" -msgstr "" +msgstr "Повторити останнє швидке нарізання" -#: src/slic3r/GUI/MainFrame.cpp:334 -msgid "(Re)Slice &Now" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:1075 +msgid "Repeat last quick slice" +msgstr "Повторити останнє швидке нарізання" + +#: src/slic3r/GUI/MainFrame.cpp:1083 +msgid "(Re)Slice No&w" +msgstr "(Пере)Нарізати зараз" -#: src/slic3r/GUI/MainFrame.cpp:334 +#: src/slic3r/GUI/MainFrame.cpp:1083 msgid "Start new slicing process" msgstr "Почати новий процес нарізання" -#: src/slic3r/GUI/MainFrame.cpp:337 +#: src/slic3r/GUI/MainFrame.cpp:1087 msgid "&Repair STL file" -msgstr "" +msgstr "Відновити STL-файл" -#: src/slic3r/GUI/MainFrame.cpp:337 +#: src/slic3r/GUI/MainFrame.cpp:1087 msgid "Automatically repair an STL file" msgstr "Автоматично відновити як STL-файл" -#: src/slic3r/GUI/MainFrame.cpp:340 +#: src/slic3r/GUI/MainFrame.cpp:1091 +msgid "&G-code preview" +msgstr "Перегляд G-коду" + +#: src/slic3r/GUI/MainFrame.cpp:1094 src/slic3r/GUI/MainFrame.cpp:1264 msgid "&Quit" msgstr "Вихід" -#: src/slic3r/GUI/MainFrame.cpp:340 -msgid "Quit Slic3r" -msgstr "Вийти зі Slic3r" +#: src/slic3r/GUI/MainFrame.cpp:1094 src/slic3r/GUI/MainFrame.cpp:1264 +#, c-format +msgid "Quit %s" +msgstr "Вийти з %s" -#: src/slic3r/GUI/MainFrame.cpp:374 +#: src/slic3r/GUI/MainFrame.cpp:1109 msgid "&Select all" msgstr "Вибрати все" -#: src/slic3r/GUI/MainFrame.cpp:374 +#: src/slic3r/GUI/MainFrame.cpp:1110 msgid "Selects all objects" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:377 -msgid "&Delete selected" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:377 -msgid "Deletes the current selection" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:379 -msgid "Delete &all" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:379 -msgid "Deletes all objects" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:392 -msgid "&Plater Tab" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:392 -msgid "Show the plater" -msgstr "Показати plater" - -#: src/slic3r/GUI/MainFrame.cpp:399 -msgid "P&rint Settings Tab" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:399 -msgid "Show the print settings" -msgstr "Показати параметри друку" - -#: src/slic3r/GUI/MainFrame.cpp:401 -msgid "&Filament Settings Tab" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:401 -msgid "Show the filament settings" -msgstr "Показати параметри філаменту" - -#: src/slic3r/GUI/MainFrame.cpp:403 -msgid "Print&er Settings Tab" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:403 -msgid "Show the printer settings" -msgstr "Показати параметри принтеру" +msgstr "Видалити всі об'єкти" -#: src/slic3r/GUI/MainFrame.cpp:407 -msgid "3&D" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:407 -msgid "Show the 3D editing view" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:409 -msgid "Pre&view" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:409 -msgid "Show the 3D slices preview" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:430 -msgid "Print &Host Upload Queue" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:430 -msgid "Display the Print Host Upload Queue window" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:439 -msgid "Iso" -msgstr "Iso" +#: src/slic3r/GUI/MainFrame.cpp:1112 +msgid "D&eselect all" +msgstr "Скасувати вибір усіх" -#: src/slic3r/GUI/MainFrame.cpp:439 -msgid "Iso View" -msgstr "Вид Iso" - -#: src/slic3r/GUI/MainFrame.cpp:441 -msgid "Top" -msgstr "Зверху" +#: src/slic3r/GUI/MainFrame.cpp:1113 +msgid "Deselects all objects" +msgstr "Скасовує вибір усіх об’єктів" -#: src/libslic3r/PrintConfig.cpp:2041 -msgctxt "Layers" -msgid "Top" -msgstr "Верхні" +#: src/slic3r/GUI/MainFrame.cpp:1116 +msgid "&Delete selected" +msgstr "Видалити вибране" -#: src/slic3r/GUI/MainFrame.cpp:441 -msgid "Top View" -msgstr "Вид зверху" +#: src/slic3r/GUI/MainFrame.cpp:1117 +msgid "Deletes the current selection" +msgstr "Видаляє поточний вибір" -#: src/slic3r/GUI/MainFrame.cpp:442 -msgid "Bottom" -msgstr "Знизу" +#: src/slic3r/GUI/MainFrame.cpp:1119 +msgid "Delete &all" +msgstr "Видалити все" -#: src/libslic3r/PrintConfig.cpp:148 -msgctxt "Layers" -msgid "Bottom" -msgstr "Нижні" +#: src/slic3r/GUI/MainFrame.cpp:1120 +msgid "Deletes all objects" +msgstr "Видалити всі об'єкти" -#: src/slic3r/GUI/MainFrame.cpp:442 -msgid "Bottom View" -msgstr "Вид знизу" +#: src/slic3r/GUI/MainFrame.cpp:1124 +msgid "&Undo" +msgstr "Відмінити" -#: src/slic3r/GUI/MainFrame.cpp:443 -msgid "Front" -msgstr "Спереду" +#: src/slic3r/GUI/MainFrame.cpp:1127 +msgid "&Redo" +msgstr "Повторити" -#: src/slic3r/GUI/MainFrame.cpp:443 -msgid "Front View" -msgstr "Вид спереду" +#: src/slic3r/GUI/MainFrame.cpp:1132 +msgid "&Copy" +msgstr "Копіювати" -#: src/slic3r/GUI/MainFrame.cpp:444 src/libslic3r/PrintConfig.cpp:1561 -msgid "Rear" -msgstr "Ззаду" +#: src/slic3r/GUI/MainFrame.cpp:1133 +msgid "Copy selection to clipboard" +msgstr "Скопіювати вибране в буфер обміну" -#: src/slic3r/GUI/MainFrame.cpp:444 -msgid "Rear View" -msgstr "Вид ззаду" +#: src/slic3r/GUI/MainFrame.cpp:1135 +msgid "&Paste" +msgstr "Вставити" -#: src/slic3r/GUI/MainFrame.cpp:445 -msgid "Left" -msgstr "З лівого боку" +#: src/slic3r/GUI/MainFrame.cpp:1136 +msgid "Paste clipboard" +msgstr "Вставити буфер обміну" -#: src/slic3r/GUI/MainFrame.cpp:445 -msgid "Left View" -msgstr "Вид з лівого боку" +#: src/slic3r/GUI/MainFrame.cpp:1141 src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1248 src/slic3r/GUI/MainFrame.cpp:1252 +msgid "Re&load from disk" +msgstr "Перезавантажити з диска" -#: src/slic3r/GUI/MainFrame.cpp:446 -msgid "Right" -msgstr "З правого боку" +#: src/slic3r/GUI/MainFrame.cpp:1151 +msgid "Searc&h" +msgstr "Пошук" -#: src/slic3r/GUI/MainFrame.cpp:446 -msgid "Right View" -msgstr "Вид з правого боку" +#: src/slic3r/GUI/MainFrame.cpp:1152 +msgid "Search in settings" +msgstr "Шукайте в налаштуваннях" -#: src/slic3r/GUI/MainFrame.cpp:460 -msgid "Prusa 3D &Drivers" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:1160 +msgid "&Plater Tab" +msgstr "Вкладка Платер" -#: src/slic3r/GUI/MainFrame.cpp:460 -msgid "Open the Prusa3D drivers download page in your browser" -msgstr "Відкрити сторінку завантаження драйверів Prusa3D у своєму браузері" +#: src/slic3r/GUI/MainFrame.cpp:1160 +msgid "Show the plater" +msgstr "Показати plater" -#: src/slic3r/GUI/MainFrame.cpp:462 -msgid "Prusa Edition &Releases" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:1165 +msgid "P&rint Settings Tab" +msgstr "Вкладка параметрів друку" -#: src/slic3r/GUI/MainFrame.cpp:462 -msgid "Open the Prusa Edition releases page in your browser" -msgstr "Відкрити сторінку релізів Prusa Edition у своєму браузері" +#: src/slic3r/GUI/MainFrame.cpp:1165 +msgid "Show the print settings" +msgstr "Показати параметри друку" -#: src/slic3r/GUI/MainFrame.cpp:468 -msgid "Slic3r &Website" -msgstr "Веб-сайт Slic3r" +#: src/slic3r/GUI/MainFrame.cpp:1168 src/slic3r/GUI/MainFrame.cpp:1308 +msgid "&Filament Settings Tab" +msgstr "Вкладка параметрів філаменту" -#: src/slic3r/GUI/MainFrame.cpp:468 -msgid "Open the Slic3r website in your browser" -msgstr "Відкрити сторінку Slic3r у своєму браузері" +#: src/slic3r/GUI/MainFrame.cpp:1168 +msgid "Show the filament settings" +msgstr "Показати параметри філаменту" -#: src/slic3r/GUI/MainFrame.cpp:470 -msgid "Slic3r &Manual" -msgstr "Посібник до Slic3r" +#: src/slic3r/GUI/MainFrame.cpp:1172 +msgid "Print&er Settings Tab" +msgstr "Вкладка параметрів принтеру" -#: src/slic3r/GUI/MainFrame.cpp:470 -msgid "Open the Slic3r manual in your browser" -msgstr "Відкрити сторінку посібнику до Slic3r у своєму браузері" +#: src/slic3r/GUI/MainFrame.cpp:1172 +msgid "Show the printer settings" +msgstr "Показати параметри принтеру" -#: src/slic3r/GUI/MainFrame.cpp:473 -msgid "System &Info" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:1178 +msgid "3&D" +msgstr "3&D" -#: src/slic3r/GUI/MainFrame.cpp:473 -msgid "Show system information" -msgstr "Показати інформацію про систему" +#: src/slic3r/GUI/MainFrame.cpp:1178 +msgid "Show the 3D editing view" +msgstr "Показати режим 3D-редагування" -#: src/slic3r/GUI/MainFrame.cpp:475 -msgid "Show &Configuration Folder" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:1181 +msgid "Pre&view" +msgstr "Попередній перегляд" -#: src/slic3r/GUI/MainFrame.cpp:475 -msgid "Show user configuration folder (datadir)" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:1181 +msgid "Show the 3D slices preview" +msgstr "Показати попередній перегляд 3D нарізки" -#: src/slic3r/GUI/MainFrame.cpp:477 -msgid "Report an I&ssue" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:1187 +msgid "Print &Host Upload Queue" +msgstr "Черга завантаження хоста друку" -#: src/slic3r/GUI/MainFrame.cpp:477 -msgid "Report an issue on the Slic3r Prusa Edition" -msgstr "Повідомити про проблему на Slic3r Prusa Edition" +#: src/slic3r/GUI/MainFrame.cpp:1187 +msgid "Display the Print Host Upload Queue window" +msgstr "Показати вікна черги завантаження хоста друку" -#: src/slic3r/GUI/MainFrame.cpp:479 -msgid "&About Slic3r" -msgstr "&Про Slic3r" +#: src/slic3r/GUI/MainFrame.cpp:1201 +msgid "Show &labels" +msgstr "Показувати мітки" -#: src/slic3r/GUI/MainFrame.cpp:479 -msgid "Show about dialog" -msgstr "Показати діалог Про Slic3r" +#: src/slic3r/GUI/MainFrame.cpp:1201 +msgid "Show object/instance labels in 3D scene" +msgstr "Показувати мітки об’єктів/екземплярів у 3D-сцені" -#: src/slic3r/GUI/MainFrame.cpp:482 -msgid "Keyboard Shortcuts" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:1204 +msgid "&Collapse sidebar" +msgstr "Згорнути бічну панель" -#: src/slic3r/GUI/MainFrame.cpp:482 -msgid "Show the list of the keyboard shortcuts" -msgstr "" +#: src/slic3r/GUI/MainFrame.cpp:1204 src/slic3r/GUI/Plater.cpp:2247 +msgid "Collapse sidebar" +msgstr "Згорнути бічну панель" -#: src/slic3r/GUI/MainFrame.cpp:490 +#: src/slic3r/GUI/MainFrame.cpp:1216 src/slic3r/GUI/MainFrame.cpp:1279 msgid "&File" msgstr "Файл" -#: src/slic3r/GUI/MainFrame.cpp:491 +#: src/slic3r/GUI/MainFrame.cpp:1217 msgid "&Edit" -msgstr "" +msgstr "&Редагування" -#: src/slic3r/GUI/MainFrame.cpp:492 +#: src/slic3r/GUI/MainFrame.cpp:1218 msgid "&Window" msgstr "Вікно" -#: src/slic3r/GUI/MainFrame.cpp:493 +#: src/slic3r/GUI/MainFrame.cpp:1219 src/slic3r/GUI/MainFrame.cpp:1280 msgid "&View" msgstr "Вид" -#: src/slic3r/GUI/MainFrame.cpp:496 +#: src/slic3r/GUI/MainFrame.cpp:1222 src/slic3r/GUI/MainFrame.cpp:1283 msgid "&Help" msgstr "Допомога" -#: src/slic3r/GUI/MainFrame.cpp:524 +#: src/slic3r/GUI/MainFrame.cpp:1244 +msgid "&Open G-code" +msgstr "Відкрити G-код" + +#: src/slic3r/GUI/MainFrame.cpp:1260 +msgid "Open &PrusaSlicer" +msgstr "Відкрити PrusaSlicer" + +#: src/slic3r/GUI/MainFrame.cpp:1305 +msgid "E&xport" +msgstr "Експорт" + +#: src/slic3r/GUI/MainFrame.cpp:1306 +msgid "S&end to print" +msgstr "Надіслати на принтер" + +#: src/slic3r/GUI/MainFrame.cpp:1308 +msgid "Mate&rial Settings Tab" +msgstr "Вкладка параметрів матеріалу" + +#: src/slic3r/GUI/MainFrame.cpp:1331 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "Вибрати файл для нарізання (STL/OBJ/AMF/3MF/PRUSA):" -#: src/slic3r/GUI/MainFrame.cpp:538 +#: src/slic3r/GUI/MainFrame.cpp:1342 msgid "No previously sliced file." msgstr "Немає попередньо нарізаного файлу." -#: src/slic3r/GUI/MainFrame.cpp:539 src/slic3r/GUI/PrintHostDialogs.cpp:219 -msgid "Error" -msgstr "Помилка" - -#: src/slic3r/GUI/MainFrame.cpp:544 +#: src/slic3r/GUI/MainFrame.cpp:1348 msgid "Previously sliced file (" msgstr "Попередньо нарізаний файл (" -#: src/slic3r/GUI/MainFrame.cpp:544 +#: src/slic3r/GUI/MainFrame.cpp:1348 msgid ") not found." msgstr ") не знайдено." -#: src/slic3r/GUI/MainFrame.cpp:545 +#: src/slic3r/GUI/MainFrame.cpp:1349 msgid "File Not Found" msgstr "Файл не знайдено" -#: src/slic3r/GUI/MainFrame.cpp:580 src/slic3r/GUI/Tab.cpp:3152 -msgid "Save " -msgstr "Зберегти " +#: src/slic3r/GUI/MainFrame.cpp:1384 +#, c-format +msgid "Save %s file as:" +msgstr "Зберегти файл %s як:" -#: src/slic3r/GUI/MainFrame.cpp:580 +#: src/slic3r/GUI/MainFrame.cpp:1384 msgid "SVG" -msgstr "" +msgstr "SVG" -#: src/slic3r/GUI/MainFrame.cpp:580 +#: src/slic3r/GUI/MainFrame.cpp:1384 msgid "G-code" msgstr "G-код" -#: src/slic3r/GUI/MainFrame.cpp:580 -msgid " file as:" -msgstr " файл як:" - -#: src/slic3r/GUI/MainFrame.cpp:595 +#: src/slic3r/GUI/MainFrame.cpp:1396 msgid "Save zip file as:" -msgstr "" +msgstr "Зберегти zip-файл як:" -#: src/slic3r/GUI/MainFrame.cpp:607 src/slic3r/GUI/Plater.cpp:2352 -#: src/slic3r/GUI/Plater.cpp:3467 src/slic3r/GUI/Tab.cpp:1110 -#: src/slic3r/GUI/Tab.cpp:3348 +#: src/slic3r/GUI/MainFrame.cpp:1405 src/slic3r/GUI/Plater.cpp:3009 +#: src/slic3r/GUI/Plater.cpp:5581 src/slic3r/GUI/Tab.cpp:1575 +#: src/slic3r/GUI/Tab.cpp:4115 msgid "Slicing" -msgstr "" +msgstr "Нарізання" -#: src/slic3r/GUI/MainFrame.cpp:607 -msgid "Processing " -msgstr "Обробка " +#. TRN "Processing input_file_basename" +#: src/slic3r/GUI/MainFrame.cpp:1407 +#, c-format +msgid "Processing %s" +msgstr "Обробка %s" -#: src/slic3r/GUI/MainFrame.cpp:630 -msgid " was successfully sliced." -msgstr " був успішно нарізаний." +#: src/slic3r/GUI/MainFrame.cpp:1430 +msgid "%1% was successfully sliced." +msgstr "%1% був успішно нарізаний." -#: src/slic3r/GUI/MainFrame.cpp:632 +#: src/slic3r/GUI/MainFrame.cpp:1432 msgid "Slicing Done!" msgstr "Нарізання завершено!" -#: src/slic3r/GUI/MainFrame.cpp:647 +#: src/slic3r/GUI/MainFrame.cpp:1447 msgid "Select the STL file to repair:" msgstr "Вибрати STL-файл для відновлення:" -#: src/slic3r/GUI/MainFrame.cpp:661 +#: src/slic3r/GUI/MainFrame.cpp:1457 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "Зберегти OBJ-файл (менш схильний координувати помилки, ніж STL) як:" -#: src/slic3r/GUI/MainFrame.cpp:676 +#: src/slic3r/GUI/MainFrame.cpp:1469 msgid "Your file was repaired." msgstr "Ваш файл було відновлено." -#: src/slic3r/GUI/MainFrame.cpp:676 src/libslic3r/PrintConfig.cpp:3051 +#: src/slic3r/GUI/MainFrame.cpp:1469 src/libslic3r/PrintConfig.cpp:3735 msgid "Repair" msgstr "Відновити" -#: src/slic3r/GUI/MainFrame.cpp:690 +#: src/slic3r/GUI/MainFrame.cpp:1483 msgid "Save configuration as:" msgstr "Зберегти конфігурацію як:" -#: src/slic3r/GUI/MainFrame.cpp:710 src/slic3r/GUI/MainFrame.cpp:774 +#: src/slic3r/GUI/MainFrame.cpp:1502 src/slic3r/GUI/MainFrame.cpp:1564 msgid "Select configuration to load:" msgstr "Вибрати конфігурацію для завантаження:" -#: src/slic3r/GUI/MainFrame.cpp:747 +#: src/slic3r/GUI/MainFrame.cpp:1538 msgid "Save presets bundle as:" msgstr "Зберегти набір налаштувань як:" -#: src/slic3r/GUI/MainFrame.cpp:798 +#: src/slic3r/GUI/MainFrame.cpp:1585 #, c-format msgid "%d presets successfully imported." msgstr "%d налаштувань успішно імпортовано." +#: src/slic3r/GUI/Mouse3DController.cpp:461 +msgid "3Dconnexion settings" +msgstr "Параметри 3Dconnexion" + +#: src/slic3r/GUI/Mouse3DController.cpp:472 +msgid "Device:" +msgstr "Пристрій:" + +#: src/slic3r/GUI/Mouse3DController.cpp:477 +msgid "Speed:" +msgstr "Швидкість:" + +#: src/slic3r/GUI/Mouse3DController.cpp:480 +#: src/slic3r/GUI/Mouse3DController.cpp:501 +msgid "Translation" +msgstr "Переміщення" + +#: src/slic3r/GUI/Mouse3DController.cpp:492 +#: src/slic3r/GUI/Mouse3DController.cpp:501 +msgid "Zoom" +msgstr "Масштабування" + +#: src/slic3r/GUI/Mouse3DController.cpp:498 +msgid "Deadzone:" +msgstr "Мертва зона:" + +#: src/slic3r/GUI/Mouse3DController.cpp:513 +msgid "Options:" +msgstr "Параметри:" + +#: src/slic3r/GUI/Mouse3DController.cpp:516 +msgid "Swap Y/Z axes" +msgstr "Поміняти місцями осі Y/Z" + +#: src/slic3r/GUI/MsgDialog.cpp:70 +#, c-format +msgid "%s error" +msgstr "помилка %s" + #: src/slic3r/GUI/MsgDialog.cpp:71 -msgid "Slic3r error" +#, c-format +msgid "%s has encountered an error" +msgstr "%s виявив помилку" + +#: src/slic3r/GUI/NotificationManager.hpp:471 +msgid "3D Mouse disconnected." +msgstr "3D миша відключена." + +#: src/slic3r/GUI/NotificationManager.hpp:474 +msgid "Configuration update is available." +msgstr "Доступне оновлення конфігурації." + +#: src/slic3r/GUI/NotificationManager.hpp:474 +msgid "See more." +msgstr "Див. докладніше." + +#: src/slic3r/GUI/NotificationManager.hpp:476 +msgid "New version is available." +msgstr "Доступна нова версія." + +#: src/slic3r/GUI/NotificationManager.hpp:476 +msgid "See Releases page." +msgstr "Див. Сторінку випусків." + +#: src/slic3r/GUI/NotificationManager.hpp:479 +msgid "" +"You have just added a G-code for color change, but its value is empty.\n" +"To export the G-code correctly, check the \"Color Change G-code\" in " +"\"Printer Settings > Custom G-code\"" +msgstr "" +"Ви щойно додали G-код для зміни кольору, але його значення порожнє.\n" +"Щоб правильно експортувати G-код, перевірте значення параметру «G-коду зміни " +"кольору» в «Параметри принтера > Користувацький G-код»" + +#: src/slic3r/GUI/NotificationManager.cpp:490 +#: src/slic3r/GUI/NotificationManager.cpp:500 +msgid "More" +msgstr "Більше" + +#: src/slic3r/GUI/NotificationManager.cpp:864 +#: src/slic3r/GUI/NotificationManager.cpp:1141 +msgid "Export G-Code." +msgstr "Експортувати G-код." + +#: src/slic3r/GUI/NotificationManager.cpp:908 +msgid "Open Folder." +msgstr "Відкрити папку." + +#: src/slic3r/GUI/NotificationManager.cpp:946 +msgid "Eject drive" +msgstr "Від'єднати диск" + +#: src/slic3r/GUI/NotificationManager.cpp:1060 +#: src/slic3r/GUI/NotificationManager.cpp:1076 +#: src/slic3r/GUI/NotificationManager.cpp:1087 +msgid "ERROR:" +msgstr "ПОМИЛКА:" + +#: src/slic3r/GUI/NotificationManager.cpp:1065 +#: src/slic3r/GUI/NotificationManager.cpp:1080 +#: src/slic3r/GUI/NotificationManager.cpp:1095 +msgid "WARNING:" +msgstr "ЗАСТЕРЕЖЕННЯ:" + +#: src/slic3r/GUI/NotificationManager.cpp:1144 +msgid "Slicing finished." +msgstr "Нарізання завершено." + +#: src/slic3r/GUI/NotificationManager.cpp:1186 +msgid "Exporting finished." +msgstr "Експорт завершено." + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:58 +msgid "Instances" +msgstr "Екземпляри" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:62 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:225 +#, c-format +msgid "Instance %d" +msgstr "Екземпляр %d" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 src/slic3r/GUI/Tab.cpp:3962 +#: src/slic3r/GUI/Tab.cpp:4044 +msgid "Layers" +msgstr "Шари" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:96 +msgid "Range" +msgstr "Діапазон" + +#: src/slic3r/GUI/OpenGLManager.cpp:259 +#, c-format +msgid "" +"PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n" +"while OpenGL version %s, render %s, vendor %s was detected." msgstr "" +"PrusaSlicer вимагає, щоб графічний драйвер, що підтримує OpenGL 2.0, " +"працював правильно,\n" +"але було виявлено OpenGL версії %s, відтворення %s, постачальника %s." -#: src/slic3r/GUI/MsgDialog.cpp:71 -msgid "Slic3r has encountered an error" +#: src/slic3r/GUI/OpenGLManager.cpp:262 +msgid "You may need to update your graphics card driver." +msgstr "Можливо, вам доведеться оновити драйвер відеокарти." + +#: src/slic3r/GUI/OpenGLManager.cpp:265 +msgid "" +"As a workaround, you may run PrusaSlicer with a software rendered 3D " +"graphics by running prusa-slicer.exe with the --sw_renderer parameter." +msgstr "" +"Як спосіб вирішення, ви можете запустити PrusaSlicer з програмним " +"забезпеченням, що рендерить 3D-графіку, за допомогою старту prusa-slicer.exe " +"з параметром --sw_renderer." + +#: src/slic3r/GUI/OpenGLManager.cpp:267 +msgid "Unsupported OpenGL version" +msgstr "Непідтримувана версія OpenGL" + +#: src/slic3r/GUI/OpenGLManager.cpp:275 +#, c-format +msgid "" +"Unable to load the following shaders:\n" +"%s" +msgstr "" +"Не вдається завантажити такі шейдери:\n" +"%s" + +#: src/slic3r/GUI/OpenGLManager.cpp:276 +msgid "Error loading shaders" +msgstr "Помилка завантаження шейдерів" + +#: src/slic3r/GUI/OptionsGroup.cpp:335 +msgctxt "Layers" +msgid "Top" +msgstr "Верхні" + +#: src/slic3r/GUI/OptionsGroup.cpp:335 +msgctxt "Layers" +msgid "Bottom" +msgstr "Нижні" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:51 +msgid "Delete this preset from this printer device" +msgstr "Видаліть цей пресет з цього принтера" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:81 +msgid "This printer will be shown in the presets list as" +msgstr "Цей принтер буде відображатися у списку пресетів як" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:155 +msgid "Physical Printer" +msgstr "Фізичний принтер" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:161 +msgid "Type here the name of your printer device" +msgstr "Введіть тут назву вашого принтера" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:172 +msgid "Descriptive name for the printer" +msgstr "Описова назва принтера" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:176 +msgid "Add preset for this printer device" +msgstr "Додати пресет для цього пристрою принтера" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:205 src/slic3r/GUI/Tab.cpp:2064 +msgid "Print Host upload" +msgstr "Завантаження хоста друку" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:260 +msgid "Connection to printers connected via the print host failed." +msgstr "Помилка підключення до принтерів, підключених через хост друку." + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:302 +msgid "Test" +msgstr "Перевірити" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:307 +msgid "Could not get a valid Printer Host reference" +msgstr "Не вдалося отримати дійсне посилання на хост принтера" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:319 +msgid "Success!" +msgstr "Успіх!" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:329 +msgid "Refresh Printers" +msgstr "Оновити принтери" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:356 +msgid "" +"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" +"signed certificate." +msgstr "" +"Файл HTTPS CA не є обов'язковим. Це потрібно, лише якщо ви використовуєте " +"HTTPS із самопідписаним сертифікатом." + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:366 +msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" +msgstr "Файли сертифікатів (*.crt, *.pem)|*.crt;*.pem|Усі файли|*.*" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:367 +msgid "Open CA certificate file" +msgstr "Відкрити файл CA сертифікату" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:395 +#: src/libslic3r/PrintConfig.cpp:124 +msgid "HTTPS CA File" +msgstr "Файл CA сертифікату" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:396 +#, c-format +msgid "" +"On this system, %s uses HTTPS certificates from the system Certificate Store " +"or Keychain." +msgstr "" +"На цій системі, %s використовує HTTPS-сертифікати з системного сховища " +"сертифікатів або Keychain." + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:397 +msgid "" +"To use a custom CA file, please import your CA file into Certificate Store / " +"Keychain." +msgstr "" +"Щоб використовувати власний CA файл, будь-ласка, імпортуйте його у сховища " +"сертифікатів / Keychain." + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:543 +msgid "The supplied name is empty. It can't be saved." +msgstr "Надане ім'я порожнє. Не вдається зберегти." + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:547 +msgid "You should to change a name of your printer device. It can't be saved." +msgstr "Вам слід змінити назву принтера. Задану назву неможливо зберегти." + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:555 +msgid "Printer with name \"%1%\" already exists." +msgstr "Принтер з ім'ям \"%1%\" вже існує." + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:556 +msgid "Replace?" +msgstr "Замінити?" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:579 +msgid "" +"Following printer preset(s) is duplicated:%1%The above preset for printer " +"\"%2%\" will be used just once." msgstr "" +"Наступні пресети принтера повторюються:%1%Вищезазначений пресет принтера " +"\"%2%\" буде використано лише один раз." + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:625 +msgid "It's not possible to delete the last related preset for the printer." +msgstr "Неможливо видалити останній пресет для принтера." -#: src/slic3r/GUI/Plater.cpp:137 +#: src/slic3r/GUI/Plater.cpp:163 msgid "Volume" msgstr "Обсяг" -#: src/slic3r/GUI/Plater.cpp:138 +#: src/slic3r/GUI/Plater.cpp:164 msgid "Facets" msgstr "Грані" -#: src/slic3r/GUI/Plater.cpp:139 +#: src/slic3r/GUI/Plater.cpp:165 msgid "Materials" msgstr "Матеріали" -#: src/slic3r/GUI/Plater.cpp:142 +#: src/slic3r/GUI/Plater.cpp:168 msgid "Manifold" msgstr "Різноманіття" -#: src/slic3r/GUI/Plater.cpp:188 +#: src/slic3r/GUI/Plater.cpp:218 msgid "Sliced Info" msgstr "Інформація з нарізання" -#: src/slic3r/GUI/Plater.cpp:207 src/slic3r/GUI/Plater.cpp:998 +#: src/slic3r/GUI/Plater.cpp:237 src/slic3r/GUI/Plater.cpp:1151 msgid "Used Filament (m)" msgstr "Використано філаметну (м)" -#: src/slic3r/GUI/Plater.cpp:208 +#: src/slic3r/GUI/Plater.cpp:238 src/slic3r/GUI/Plater.cpp:1163 msgid "Used Filament (mm³)" msgstr "Використано філаметну (мм³)" -#: src/slic3r/GUI/Plater.cpp:209 +#: src/slic3r/GUI/Plater.cpp:239 src/slic3r/GUI/Plater.cpp:1170 msgid "Used Filament (g)" msgstr "Використано філаметну (г)" -#: src/slic3r/GUI/Plater.cpp:210 +#: src/slic3r/GUI/Plater.cpp:240 msgid "Used Material (unit)" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:211 src/slic3r/GUI/Plater.cpp:1013 -#: src/libslic3r/PrintConfig.cpp:716 -msgid "Cost" -msgstr "Вартість" +msgstr "Використано матеріалу (одиниць)" -#: src/slic3r/GUI/Plater.cpp:212 src/slic3r/GUI/Plater.cpp:985 -#: src/slic3r/GUI/Plater.cpp:1027 -msgid "Estimated printing time" -msgstr "Приблизний час друку" +#: src/slic3r/GUI/Plater.cpp:241 +msgid "Cost (money)" +msgstr "Вартість (г.о.)" -#: src/slic3r/GUI/Plater.cpp:213 +#: src/slic3r/GUI/Plater.cpp:243 msgid "Number of tool changes" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:290 -msgid "Click to edit preset" -msgstr "" +msgstr "Кількість змін інструменту" -#: src/slic3r/GUI/Plater.cpp:413 +#: src/slic3r/GUI/Plater.cpp:360 msgid "Select what kind of support do you need" -msgstr "" +msgstr "Виберіть необхідну вам підтримку" -#: src/slic3r/GUI/Plater.cpp:415 src/libslic3r/PrintConfig.cpp:1814 -#: src/libslic3r/PrintConfig.cpp:2419 +#: src/slic3r/GUI/Plater.cpp:362 src/libslic3r/PrintConfig.cpp:2128 +#: src/libslic3r/PrintConfig.cpp:2923 msgid "Support on build plate only" -msgstr "Підтримка тільки на збірній пластині" +msgstr "Підтримки тільки на столі" + +#: src/slic3r/GUI/Plater.cpp:363 src/slic3r/GUI/Plater.cpp:489 +msgid "For support enforcers only" +msgstr "Тільки примусові підтримки" -#: src/slic3r/GUI/Plater.cpp:416 +#: src/slic3r/GUI/Plater.cpp:364 msgid "Everywhere" -msgstr "" +msgstr "Всюди" -#: src/slic3r/GUI/Plater.cpp:438 src/slic3r/GUI/Tab.cpp:1007 +#: src/slic3r/GUI/Plater.cpp:396 src/slic3r/GUI/Tab.cpp:1469 msgid "Brim" msgstr "Край" -#: src/slic3r/GUI/Plater.cpp:440 +#: src/slic3r/GUI/Plater.cpp:398 msgid "" "This flag enables the brim that will be printed around each object on the " "first layer." msgstr "" +"Цей прапорець дозволяє позначити край, який буде надруковано навколо кожного " +"об'єкта на першому шарі." -#: src/slic3r/GUI/Plater.cpp:448 +#: src/slic3r/GUI/Plater.cpp:406 msgid "Purging volumes" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:673 -msgid "Print settings" -msgstr "Параметри друку" +msgstr "Обсяги очищення" -#: src/slic3r/GUI/Plater.cpp:674 src/slic3r/GUI/Tab.cpp:1421 -#: src/slic3r/GUI/Tab.cpp:1422 -msgid "Filament" -msgstr "Філамент" +#: src/slic3r/GUI/Plater.cpp:503 +msgid "Select what kind of pad do you need" +msgstr "Виберіть необхідну вам подушку" -#: src/slic3r/GUI/Plater.cpp:675 src/slic3r/GUI/Preset.cpp:1252 -msgid "SLA print" -msgstr "" +#: src/slic3r/GUI/Plater.cpp:505 +msgid "Below object" +msgstr "Під об’єктем" -#: src/slic3r/GUI/Plater.cpp:676 src/slic3r/GUI/Preset.cpp:1253 -msgid "SLA material" -msgstr "" +#: src/slic3r/GUI/Plater.cpp:506 +msgid "Around object" +msgstr "Навколо об'єкта" -#: src/slic3r/GUI/Plater.cpp:677 -msgid "Printer" -msgstr "Принтер" +#: src/slic3r/GUI/Plater.cpp:695 +msgid "SLA print settings" +msgstr "Параметри SLA-друку" -#: src/slic3r/GUI/Plater.cpp:707 src/slic3r/GUI/Plater.cpp:3674 +#: src/slic3r/GUI/Plater.cpp:756 src/slic3r/GUI/Plater.cpp:6055 msgid "Send to printer" msgstr "Надіслати на принтер" -#: src/slic3r/GUI/Plater.cpp:727 src/slic3r/GUI/Plater.cpp:2352 -#: src/slic3r/GUI/Plater.cpp:3470 +#: src/slic3r/GUI/Plater.cpp:771 src/slic3r/GUI/Plater.cpp:3009 +#: src/slic3r/GUI/Plater.cpp:5584 msgid "Slice now" msgstr "Нарізати зараз" -#: src/slic3r/GUI/Plater.cpp:860 +#: src/slic3r/GUI/Plater.cpp:926 msgid "Hold Shift to Slice & Export G-code" -msgstr "" +msgstr "Утримуйте Shift, щоб нарізати та експортувати G-код" -#: src/slic3r/GUI/Plater.cpp:931 +#: src/slic3r/GUI/Plater.cpp:1071 #, c-format msgid "%d (%d shells)" msgstr "%d (%d оболонок)" -#: src/slic3r/GUI/Plater.cpp:936 +#: src/slic3r/GUI/Plater.cpp:1076 #, c-format msgid "Auto-repaired (%d errors)" -msgstr "Автоматичне відновлення (%d помилок)" +msgstr "Авто-відновлення (%d помилок)" -#: src/slic3r/GUI/Plater.cpp:939 +#: src/slic3r/GUI/Plater.cpp:1079 #, c-format msgid "" "%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d " @@ -2355,93 +5569,214 @@ msgstr "" "вироджено %d грані, виправлено %d країв, вилучено %d грані, додано %d грані, " "змінено %d грані, повернуто %d країв" -#: src/slic3r/GUI/Plater.cpp:949 +#: src/slic3r/GUI/Plater.cpp:1089 msgid "Yes" msgstr "Так" -#: src/slic3r/GUI/Plater.cpp:972 +#: src/slic3r/GUI/Plater.cpp:1110 msgid "Used Material (ml)" -msgstr "" +msgstr "Використано матеріалу (мл)" -#: src/slic3r/GUI/Plater.cpp:975 +#: src/slic3r/GUI/Plater.cpp:1113 msgid "object(s)" -msgstr "" +msgstr "об'єкт(и)" -#: src/slic3r/GUI/Plater.cpp:975 +#: src/slic3r/GUI/Plater.cpp:1113 msgid "supports and pad" -msgstr "" +msgstr "підтримки та подушка" + +#: src/slic3r/GUI/Plater.cpp:1151 +msgid "Used Filament (in)" +msgstr "Використано філаметну (дюйми)" -#: src/slic3r/GUI/Plater.cpp:1000 src/slic3r/GUI/Plater.cpp:1015 +#: src/slic3r/GUI/Plater.cpp:1153 src/slic3r/GUI/Plater.cpp:1206 msgid "objects" -msgstr "" +msgstr "об'єкти" -#: src/slic3r/GUI/Plater.cpp:1000 src/slic3r/GUI/Plater.cpp:1015 +#: src/slic3r/GUI/Plater.cpp:1153 src/slic3r/GUI/Plater.cpp:1206 msgid "wipe tower" -msgstr "" +msgstr "вежа витирання" + +#: src/slic3r/GUI/Plater.cpp:1163 +msgid "Used Filament (in³)" +msgstr "Використано філаметну (дюйми³)" + +#: src/slic3r/GUI/Plater.cpp:1189 +msgid "Filament at extruder %1%" +msgstr "Філамент екструдеру %1%" + +#: src/slic3r/GUI/Plater.cpp:1195 +msgid "(including spool)" +msgstr "(включаючи котушку)" + +#: src/slic3r/GUI/Plater.cpp:1204 src/libslic3r/PrintConfig.cpp:822 +#: src/libslic3r/PrintConfig.cpp:2738 src/libslic3r/PrintConfig.cpp:2739 +msgid "Cost" +msgstr "Вартість" -#: src/slic3r/GUI/Plater.cpp:1030 +#: src/slic3r/GUI/Plater.cpp:1222 msgid "normal mode" -msgstr "" +msgstr "нормальний режим" + +#: src/slic3r/GUI/Plater.cpp:1232 +msgid "stealth mode" +msgstr "тихий режим" + +#: src/slic3r/GUI/Plater.cpp:1403 src/slic3r/GUI/Plater.cpp:4923 +#, c-format +msgid "%s - Drop project file" +msgstr "%s - Перетягнути файл проекту" + +#: src/slic3r/GUI/Plater.cpp:1410 src/slic3r/GUI/Plater.cpp:4930 +msgid "Open as project" +msgstr "Відкрити як проект" + +#: src/slic3r/GUI/Plater.cpp:1411 src/slic3r/GUI/Plater.cpp:4931 +msgid "Import geometry only" +msgstr "Імпорт тільки геометрії" -#: src/slic3r/GUI/Plater.cpp:1034 -msgid "silent mode" +#: src/slic3r/GUI/Plater.cpp:1412 src/slic3r/GUI/Plater.cpp:4932 +msgid "Import config only" +msgstr "Імпорт тільки конфігурації" + +#: src/slic3r/GUI/Plater.cpp:1415 src/slic3r/GUI/Plater.cpp:4935 +msgid "Select an action to apply to the file" +msgstr "Виберіть дію, яку потрібно застосувати до файлу" + +#: src/slic3r/GUI/Plater.cpp:1416 src/slic3r/GUI/Plater.cpp:4936 +msgid "Action" +msgstr "Дія" + +#: src/slic3r/GUI/Plater.cpp:1424 src/slic3r/GUI/Plater.cpp:4944 +msgid "Don't show again" +msgstr "Не показувати знову" + +#: src/slic3r/GUI/Plater.cpp:1469 src/slic3r/GUI/Plater.cpp:4981 +msgid "You can open only one .gcode file at a time." +msgstr "Одночасно можна відкрити лише один файл .gcode." + +#: src/slic3r/GUI/Plater.cpp:1470 src/slic3r/GUI/Plater.cpp:4982 +msgid "Drag and drop G-code file" +msgstr "Перетягування файлу G-коду" + +#: src/slic3r/GUI/Plater.cpp:1524 src/slic3r/GUI/Plater.cpp:4796 +#: src/slic3r/GUI/Plater.cpp:5036 +msgid "Import Object" +msgstr "Імпорт об'єкту" + +#: src/slic3r/GUI/Plater.cpp:1546 src/slic3r/GUI/Plater.cpp:5058 +msgid "Load File" +msgstr "Завантажити файл" + +#: src/slic3r/GUI/Plater.cpp:1551 src/slic3r/GUI/Plater.cpp:5063 +msgid "Load Files" +msgstr "Завантажити файли" + +#: src/slic3r/GUI/Plater.cpp:1654 +msgid "Fill bed" +msgstr "Заповнити стіл" + +#: src/slic3r/GUI/Plater.cpp:1660 +msgid "Optimize Rotation" +msgstr "Оптимізувати обертання" + +#: src/slic3r/GUI/Plater.cpp:1666 +msgid "Import SLA archive" +msgstr "Імпорт SLА-архіву" + +#: src/slic3r/GUI/Plater.cpp:2129 +#, c-format +msgid "" +"Successfully unmounted. The device %s(%s) can now be safely removed from the " +"computer." msgstr "" +"Успішно від'єднано. Пристрій %s(%s) тепер можна безпечно вилучити з " +"комп’ютера." + +#: src/slic3r/GUI/Plater.cpp:2134 +#, c-format +msgid "Ejecting of device %s(%s) has failed." +msgstr "Не вдалося від'єднати пристрій %s (%s)." + +#: src/slic3r/GUI/Plater.cpp:2153 +msgid "New Project" +msgstr "Новий проект" -#: src/slic3r/GUI/Plater.cpp:1544 +#: src/slic3r/GUI/Plater.cpp:2246 +msgid "Expand sidebar" +msgstr "Розгорнути бічну панель" + +#: src/slic3r/GUI/Plater.cpp:2319 msgid "Loading" -msgstr "" +msgstr "Завантаження" -#: src/slic3r/GUI/Plater.cpp:1554 +#: src/slic3r/GUI/Plater.cpp:2329 +msgid "Loading file" +msgstr "Завантаження файлу" + +#: src/slic3r/GUI/Plater.cpp:2415 #, c-format -msgid "Processing input file %s\n" +msgid "" +"Some object(s) in file %s looks like saved in inches.\n" +"Should I consider them as a saved in inches and convert them?" msgstr "" +"Схоже на те, що деякі об’єкти у файлі %s збережені в дюймах.\n" +"Чи слід розглядати їх як збережені в дюймах і конвертувати?" -#: src/slic3r/GUI/Plater.cpp:1612 +#: src/slic3r/GUI/Plater.cpp:2417 +msgid "The object appears to be saved in inches" +msgstr "Здається, об’єкт був збережений у дюймах" + +#: src/slic3r/GUI/Plater.cpp:2425 msgid "" -"This file contains several objects positioned at multiple heights. Instead " -"of considering them as multiple objects, should I consider\n" -"this file as a single object having multiple parts?\n" +"This file contains several objects positioned at multiple heights.\n" +"Instead of considering them as multiple objects, should I consider\n" +"this file as a single object having multiple parts?" msgstr "" -"Цей файл містить кілька об'єктів, розташованих на декількох висотах. Замість " -"того, щоб розглядати їх як кілька об'єктів, чи потрібно розглянути\n" -"цей файл як єдиний об'єкт, що має декілька частин?\n" +"Цей файл містить кілька об'єктів, розташованих на декількох висотах. \n" +"Замість того, щоб розглядати їх як кілька об'єктів, чи потрібно розглянути\n" +"цей файл як єдиний об'єкт, що має декілька частин?" -#: src/slic3r/GUI/Plater.cpp:1615 src/slic3r/GUI/Plater.cpp:1707 +#: src/slic3r/GUI/Plater.cpp:2428 src/slic3r/GUI/Plater.cpp:2481 msgid "Multi-part object detected" msgstr "Виявлено об'єкт, що складається з кількох частин" -#: src/slic3r/GUI/Plater.cpp:1650 +#: src/slic3r/GUI/Plater.cpp:2435 msgid "" -"This file cannot be loaded in simple mode. Do you want to switch to expert " -"mode?\n" +"This file cannot be loaded in a simple mode. Do you want to switch to an " +"advanced mode?" msgstr "" +"Цей файл не можна завантажити у простому режимі. Ви хочете перейти в " +"розширений режим?" -#: src/slic3r/GUI/Plater.cpp:1651 +#: src/slic3r/GUI/Plater.cpp:2436 msgid "Detected advanced data" -msgstr "" +msgstr "Виявлено розширені дані" -#: src/slic3r/GUI/Plater.cpp:1684 +#: src/slic3r/GUI/Plater.cpp:2458 #, c-format msgid "" "You can't to add the object(s) from %s because of one or some of them " "is(are) multi-part" msgstr "" +"Ви не можете додати об’єкт(и) із %s через те, що один або деякі з них " +"складається з декількох частин" -#: src/slic3r/GUI/Plater.cpp:1704 +#: src/slic3r/GUI/Plater.cpp:2478 msgid "" "Multiple objects were loaded for a multi-material printer.\n" "Instead of considering them as multiple objects, should I consider\n" -"these files to represent a single object having multiple parts?\n" +"these files to represent a single object having multiple parts?" msgstr "" "До мульти-матеріального принтеру завантажено кілька об'єктів.\n" "Замість того, щоб розглядати їх як кілька об'єктів, чи потрібно розглянути\n" -"ці файл як єдиний об'єкт, що має декілька частин?\n" +"ці файл як єдиний об'єкт, що має декілька частин?" -#: src/slic3r/GUI/Plater.cpp:1720 +#: src/slic3r/GUI/Plater.cpp:2494 msgid "Loaded" -msgstr "" +msgstr "Завантажено" -#: src/slic3r/GUI/Plater.cpp:1812 +#: src/slic3r/GUI/Plater.cpp:2596 msgid "" "Your object appears to be too large, so it was automatically scaled down to " "fit your print bed." @@ -2449,51 +5784,35 @@ msgstr "" "Ваш об'єкт видався занадто великим, тому він автоматично зменшився " "відповідно до вашої полотна друку." -#: src/slic3r/GUI/Plater.cpp:1813 +#: src/slic3r/GUI/Plater.cpp:2597 msgid "Object too large?" msgstr "Об'єкт занадто великий?" -#: src/slic3r/GUI/Plater.cpp:1863 +#: src/slic3r/GUI/Plater.cpp:2659 msgid "Export STL file:" -msgstr "" +msgstr "Експорт STL-файлу:" -#: src/slic3r/GUI/Plater.cpp:1870 +#: src/slic3r/GUI/Plater.cpp:2666 msgid "Export AMF file:" -msgstr "" +msgstr "Експортувати AMF-файл:" -#: src/slic3r/GUI/Plater.cpp:1876 +#: src/slic3r/GUI/Plater.cpp:2672 msgid "Save file as:" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2042 -msgid "Arranging canceled" -msgstr "" +msgstr "Зберегти файл як:" -#: src/slic3r/GUI/Plater.cpp:2045 -msgid "Arranging" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2079 -msgid "Could not arrange model objects! Some geometries may be invalid." -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2083 -msgid "Arranging done." -msgstr "" +#: src/slic3r/GUI/Plater.cpp:2678 +msgid "Export OBJ file:" +msgstr "Експорт OBJ-файлу:" -#: src/slic3r/GUI/Plater.cpp:2124 -msgid "Orientation search canceled" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2129 -msgid "Searching for optimal orientation" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2190 -msgid "Orientation found." -msgstr "" +#: src/slic3r/GUI/Plater.cpp:2774 +msgid "Delete Object" +msgstr "Видалити об'єкт" -#: src/slic3r/GUI/Plater.cpp:2211 +#: src/slic3r/GUI/Plater.cpp:2785 +msgid "Reset Project" +msgstr "Скинути проект" + +#: src/slic3r/GUI/Plater.cpp:2857 msgid "" "The selected object can't be split because it contains more than one volume/" "material." @@ -2501,187 +5820,300 @@ msgstr "" "Вибраний об'єкт не можна розділити, оскільки містить більше одного об'єму/" "матеріалу." -#: src/slic3r/GUI/Plater.cpp:2337 +#: src/slic3r/GUI/Plater.cpp:2868 +msgid "Split to Objects" +msgstr "Розділити на об'єкти" + +#: src/slic3r/GUI/Plater.cpp:2993 src/slic3r/GUI/Plater.cpp:3723 msgid "Invalid data" -msgstr "" +msgstr "Некоректні дані" -#: src/slic3r/GUI/Plater.cpp:2346 +#: src/slic3r/GUI/Plater.cpp:3003 msgid "Ready to slice" -msgstr "" +msgstr "Готово до нарізки" -#: src/slic3r/GUI/Plater.cpp:2379 src/slic3r/GUI/PrintHostDialogs.cpp:220 +#: src/slic3r/GUI/Plater.cpp:3041 src/slic3r/GUI/PrintHostDialogs.cpp:264 msgid "Cancelling" -msgstr "" +msgstr "Скасування" -#: src/slic3r/GUI/Plater.cpp:2396 +#: src/slic3r/GUI/Plater.cpp:3060 msgid "Another export job is currently running." msgstr "На даний час виконується інший експорт." -#: src/slic3r/GUI/Plater.cpp:2656 -msgid "Export failed" -msgstr "Експортувати не вдалося" +#: src/slic3r/GUI/Plater.cpp:3177 +msgid "Please select the file to reload" +msgstr "Будь ласка, виберіть файл для перезавантаження" -#: src/slic3r/GUI/Plater.cpp:2661 src/slic3r/GUI/PrintHostDialogs.cpp:221 -msgid "Cancelled" +#: src/slic3r/GUI/Plater.cpp:3212 +msgid "It is not allowed to change the file to reload" +msgstr "Не дозволяється змінювати файл для перезавантаження" + +#: src/slic3r/GUI/Plater.cpp:3212 +msgid "Do you want to retry" +msgstr "Повторити спробу" + +#: src/slic3r/GUI/Plater.cpp:3230 +msgid "Reload from:" +msgstr "Перезавантажити з:" + +#: src/slic3r/GUI/Plater.cpp:3323 +msgid "Unable to reload:" +msgstr "Не вдається перезавантажити:" + +#: src/slic3r/GUI/Plater.cpp:3328 +msgid "Error during reload" +msgstr "Помилка під час перезавантаження" + +#: src/slic3r/GUI/Plater.cpp:3347 +msgid "Reload all from disk" +msgstr "Перезавантажити все з диска" + +#: src/slic3r/GUI/Plater.cpp:3374 +msgid "" +"ERROR: Please close all manipulators available from the left toolbar before " +"fixing the mesh." msgstr "" +"ПОМИЛКА: Будь ласка, закрийте всі маніпулятори, доступні на лівій панелі " +"інструментів, перш ніж фіксувати сітку." + +#: src/slic3r/GUI/Plater.cpp:3380 +msgid "Fix through NetFabb" +msgstr "Виправити за допомогою NetFabb" + +#: src/slic3r/GUI/Plater.cpp:3397 +msgid "Custom supports and seams were removed after repairing the mesh." +msgstr "Користувацькі підтримки та шви були видалені після ремонту сітки." -#: src/slic3r/GUI/Plater.cpp:2747 src/slic3r/GUI/Plater.cpp:2759 -#: src/slic3r/GUI/Plater.cpp:2831 -msgid "Increase copies" -msgstr "Збільшити копії" +#: src/slic3r/GUI/Plater.cpp:3680 +msgid "There are active warnings concerning sliced models:" +msgstr "Існують активні попередження щодо нарізаних моделей:" -#: src/slic3r/GUI/Plater.cpp:2825 src/slic3r/GUI/Plater.cpp:2843 +#: src/slic3r/GUI/Plater.cpp:3691 +msgid "generated warnings" +msgstr "згенеровані попередження" + +#: src/slic3r/GUI/Plater.cpp:3731 src/slic3r/GUI/PrintHostDialogs.cpp:265 +msgid "Cancelled" +msgstr "Скасовано" + +#: src/slic3r/GUI/Plater.cpp:3998 src/slic3r/GUI/Plater.cpp:4022 msgid "Remove the selected object" msgstr "Видалити вибраний об'єкт" -#: src/slic3r/GUI/Plater.cpp:2831 -msgid "Place one more copy of the selected object" -msgstr "Розташувати ще одну копію обраного об'єкта" +#: src/slic3r/GUI/Plater.cpp:4007 +msgid "Add one more instance of the selected object" +msgstr "Додати ще один екземпляр вибраного об’єкта" -#: src/slic3r/GUI/Plater.cpp:2833 -msgid "Decrease copies" -msgstr "Зменшити копії" +#: src/slic3r/GUI/Plater.cpp:4009 +msgid "Remove one instance of the selected object" +msgstr "Видалити один екземпляр вибраного об’єкта" -#: src/slic3r/GUI/Plater.cpp:2833 -msgid "Remove one copy of the selected object" -msgstr "Вилучіть одну копію обраного об'єкта" +#: src/slic3r/GUI/Plater.cpp:4011 +msgid "Set number of instances" +msgstr "Встановити кількість екземплярів" -#: src/slic3r/GUI/Plater.cpp:2835 -msgid "Set number of copies" -msgstr "" +#: src/slic3r/GUI/Plater.cpp:4011 +msgid "Change the number of instances of the selected object" +msgstr "Змінити кількість екземплярів виділеного об'єкта" -#: src/slic3r/GUI/Plater.cpp:2835 -msgid "Change the number of copies of the selected object" -msgstr "Змінити кількість копій обраного об'єкта" +#: src/slic3r/GUI/Plater.cpp:4013 +msgid "Fill bed with instances" +msgstr "Заповнити стіл екземплярами" -#: src/slic3r/GUI/Plater.cpp:2858 -msgid "Reload from Disk" -msgstr "Перезавантажити з диска" +#: src/slic3r/GUI/Plater.cpp:4013 +msgid "Fill the remaining area of bed with instances of the selected object" +msgstr "Заповнити залишок столу екземплярами обраного об'єкта" -#: src/slic3r/GUI/Plater.cpp:2858 -msgid "Reload the selected file from Disk" -msgstr "Перезавантажити вибраний файл із диска" +#: src/slic3r/GUI/Plater.cpp:4032 +msgid "Reload the selected object from disk" +msgstr "Перезавантажити вибраний об'єкт із диска" -#: src/slic3r/GUI/Plater.cpp:2861 +#: src/slic3r/GUI/Plater.cpp:4035 msgid "Export the selected object as STL file" -msgstr "" +msgstr "Експорт вибраного об'єкту як STL-файл" -#: src/slic3r/GUI/Plater.cpp:2873 +#: src/slic3r/GUI/Plater.cpp:4065 msgid "Along X axis" -msgstr "" +msgstr "Уздовж осі X" -#: src/slic3r/GUI/Plater.cpp:2873 +#: src/slic3r/GUI/Plater.cpp:4065 msgid "Mirror the selected object along the X axis" msgstr "Віддзеркалити виділений об'єкт уздовж осі Х" -#: src/slic3r/GUI/Plater.cpp:2875 +#: src/slic3r/GUI/Plater.cpp:4067 msgid "Along Y axis" -msgstr "" +msgstr "Уздовж осі Y" -#: src/slic3r/GUI/Plater.cpp:2875 +#: src/slic3r/GUI/Plater.cpp:4067 msgid "Mirror the selected object along the Y axis" msgstr "Віддзеркалити виділений об'єкт уздовж осі Y" -#: src/slic3r/GUI/Plater.cpp:2877 +#: src/slic3r/GUI/Plater.cpp:4069 msgid "Along Z axis" -msgstr "" +msgstr "Уздовж осі Z" -#: src/slic3r/GUI/Plater.cpp:2877 +#: src/slic3r/GUI/Plater.cpp:4069 msgid "Mirror the selected object along the Z axis" msgstr "Віддзеркалити виділений об'єкт уздовж осі Z" -#: src/slic3r/GUI/Plater.cpp:2880 +#: src/slic3r/GUI/Plater.cpp:4072 msgid "Mirror" msgstr "Віддзеркалити" -#: src/slic3r/GUI/Plater.cpp:2880 +#: src/slic3r/GUI/Plater.cpp:4072 msgid "Mirror the selected object" msgstr "Віддзеркалити виділений об'єкт" -#: src/slic3r/GUI/Plater.cpp:2898 +#: src/slic3r/GUI/Plater.cpp:4084 msgid "To objects" -msgstr "" +msgstr "На об'єкти" -#: src/slic3r/GUI/Plater.cpp:2898 src/slic3r/GUI/Plater.cpp:2920 +#: src/slic3r/GUI/Plater.cpp:4084 src/slic3r/GUI/Plater.cpp:4104 msgid "Split the selected object into individual objects" -msgstr "" +msgstr "Розділити вибраний об'єкт на окремі об'єкти" -#: src/slic3r/GUI/Plater.cpp:2900 +#: src/slic3r/GUI/Plater.cpp:4086 msgid "To parts" -msgstr "" +msgstr "На частини" -#: src/slic3r/GUI/Plater.cpp:2900 src/slic3r/GUI/Plater.cpp:2940 +#: src/slic3r/GUI/Plater.cpp:4086 src/slic3r/GUI/Plater.cpp:4122 msgid "Split the selected object into individual sub-parts" -msgstr "" +msgstr "Розділити вибраний об'єкт на окремі частини" -#: src/slic3r/GUI/Plater.cpp:2903 src/slic3r/GUI/Plater.cpp:2920 -#: src/slic3r/GUI/Plater.cpp:2940 src/libslic3r/PrintConfig.cpp:3075 +#: src/slic3r/GUI/Plater.cpp:4089 src/slic3r/GUI/Plater.cpp:4104 +#: src/slic3r/GUI/Plater.cpp:4122 src/libslic3r/PrintConfig.cpp:3759 msgid "Split" msgstr "Розділити" -#: src/slic3r/GUI/Plater.cpp:2903 +#: src/slic3r/GUI/Plater.cpp:4089 msgid "Split the selected object" -msgstr "" +msgstr "Розділити вибраний об'єкт" -#: src/slic3r/GUI/Plater.cpp:2926 +#: src/slic3r/GUI/Plater.cpp:4111 msgid "Optimize orientation" -msgstr "" +msgstr "Оптимізувати орієнтацію" -#: src/slic3r/GUI/Plater.cpp:2926 +#: src/slic3r/GUI/Plater.cpp:4112 msgid "Optimize the rotation of the object for better print results." +msgstr "Оптимізуйте обертання об’єкта для кращих результатів друку." + +#: src/slic3r/GUI/Plater.cpp:4192 +msgid "3D editor view" +msgstr "Перегляд у 3D-редакторі" + +#: src/slic3r/GUI/Plater.cpp:4564 +msgid "" +"%1% printer was active at the time the target Undo / Redo snapshot was " +"taken. Switching to %1% printer requires reloading of %1% presets." msgstr "" +"На момент створення Undo/Redo знімка був активний принтер %1%. Для " +"переключення на принтер %1% потрібно перезавантажити пресет %1%." + +#: src/slic3r/GUI/Plater.cpp:4768 +msgid "Load Project" +msgstr "Завантажити проект" + +#: src/slic3r/GUI/Plater.cpp:4800 +msgid "Import Objects" +msgstr "Імпорт об'єктів" + +#: src/slic3r/GUI/Plater.cpp:4868 +msgid "The selected file" +msgstr "Вибраний файл" + +#: src/slic3r/GUI/Plater.cpp:4868 +msgid "does not contain valid gcode." +msgstr "не містить дійсного G-коду." + +#: src/slic3r/GUI/Plater.cpp:4869 +msgid "Error while loading .gcode file" +msgstr "Помилка під час завантаження GCODE-файлу" + +#: src/slic3r/GUI/Plater.cpp:5107 +msgid "All objects will be removed, continue?" +msgstr "Усі об’єкти буде видалено, продовжити?" + +#: src/slic3r/GUI/Plater.cpp:5115 +msgid "Delete Selected Objects" +msgstr "Видалити вибрані об'єкти" + +#: src/slic3r/GUI/Plater.cpp:5123 +msgid "Increase Instances" +msgstr "Збільшити кількість копій" + +#: src/slic3r/GUI/Plater.cpp:5157 +msgid "Decrease Instances" +msgstr "Зменшити кількість копій" + +#: src/slic3r/GUI/Plater.cpp:5188 +msgid "Enter the number of copies:" +msgstr "Введіть кількість копій об'єкта:" + +#: src/slic3r/GUI/Plater.cpp:5189 +msgid "Copies of the selected object" +msgstr "Кількість копій обраного об'єкта" + +#: src/slic3r/GUI/Plater.cpp:5193 +#, c-format +msgid "Set numbers of copies to %d" +msgstr "Встановити кількість копій на %d" + +#: src/slic3r/GUI/Plater.cpp:5259 +msgid "Cut by Plane" +msgstr "Вирізати площиною" -#: src/slic3r/GUI/Plater.cpp:3342 +#: src/slic3r/GUI/Plater.cpp:5316 msgid "Save G-code file as:" -msgstr "" +msgstr "Зберегти G-код файл як:" -#: src/slic3r/GUI/Plater.cpp:3342 +#: src/slic3r/GUI/Plater.cpp:5316 msgid "Save SL1 file as:" -msgstr "" +msgstr "Зберегти SL1-файл як:" -#: src/slic3r/GUI/Plater.cpp:3397 +#: src/slic3r/GUI/Plater.cpp:5463 #, c-format msgid "STL file exported to %s" -msgstr "" +msgstr "STL-файл експортовано в %s" -#: src/slic3r/GUI/Plater.cpp:3413 +#: src/slic3r/GUI/Plater.cpp:5480 #, c-format msgid "AMF file exported to %s" -msgstr "" +msgstr "AMF-файл експортовано в %s" -#: src/slic3r/GUI/Plater.cpp:3416 +#: src/slic3r/GUI/Plater.cpp:5483 #, c-format msgid "Error exporting AMF file %s" -msgstr "" +msgstr "Помилка експортування AMF-файлу %s" -#: src/slic3r/GUI/Plater.cpp:3442 +#: src/slic3r/GUI/Plater.cpp:5512 #, c-format msgid "3MF file exported to %s" -msgstr "" +msgstr "3MF-файл експортовано в %s" -#: src/slic3r/GUI/Plater.cpp:3445 +#: src/slic3r/GUI/Plater.cpp:5517 #, c-format msgid "Error exporting 3MF file %s" -msgstr "" +msgstr "Помилка експортування 3MF-файлу %s" -#: src/slic3r/GUI/Plater.cpp:3673 +#: src/slic3r/GUI/Plater.cpp:6054 msgid "Export" -msgstr "" +msgstr "Експорт" -#: src/slic3r/GUI/Plater.cpp:3674 -msgid "Send G-code" -msgstr "" +#: src/slic3r/GUI/Plater.cpp:6149 +msgid "Paste From Clipboard" +msgstr "Вставити з буферу обміну" -#: src/slic3r/GUI/Preferences.cpp:17 src/slic3r/GUI/Tab.cpp:1762 -#: src/slic3r/GUI/Tab.cpp:1963 +#: src/slic3r/GUI/Preferences.cpp:56 src/slic3r/GUI/Tab.cpp:2098 +#: src/slic3r/GUI/Tab.cpp:2285 src/slic3r/GUI/Tab.cpp:2393 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1080 msgid "General" msgstr "Загальне" -#: src/slic3r/GUI/Preferences.cpp:34 +#: src/slic3r/GUI/Preferences.cpp:69 msgid "Remember output directory" msgstr "Пам'ятати вихідний каталог" -#: src/slic3r/GUI/Preferences.cpp:36 +#: src/slic3r/GUI/Preferences.cpp:71 msgid "" "If this is enabled, Slic3r will prompt the last output directory instead of " "the one containing the input files." @@ -2689,22 +6121,22 @@ msgstr "" "Якщо вибрано, Slic3r запропонує останню вихідну директорію замість тої, що " "вказана у вхідному файлі." -#: src/slic3r/GUI/Preferences.cpp:42 +#: src/slic3r/GUI/Preferences.cpp:77 msgid "Auto-center parts" msgstr "Автоцентрувати частини" -#: src/slic3r/GUI/Preferences.cpp:44 +#: src/slic3r/GUI/Preferences.cpp:79 msgid "" "If this is enabled, Slic3r will auto-center objects around the print bed " "center." msgstr "" "Якщо вибрано, Slic3r автоматично орієнтує об'єкти навколо центру друку." -#: src/slic3r/GUI/Preferences.cpp:50 +#: src/slic3r/GUI/Preferences.cpp:85 msgid "Background processing" msgstr "Фонова обробка" -#: src/slic3r/GUI/Preferences.cpp:52 +#: src/slic3r/GUI/Preferences.cpp:87 msgid "" "If this is enabled, Slic3r will pre-process objects as soon as they're " "loaded in order to save time when exporting G-code." @@ -2712,11 +6144,58 @@ msgstr "" "Якщо вибрано, Slic3r буде попередньо обробляти об'єкти, як тільки вони " "будуть завантажені, щоб заощадити час при експорті G-коду." -#: src/slic3r/GUI/Preferences.cpp:74 +#: src/slic3r/GUI/Preferences.cpp:96 +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 "" +"Якщо увімкнено, PrusaSlicer перевірить наявність нових версій в Інтернеті. " +"Коли нова версія стає доступною, під час наступного запуску програми " +"з'явиться сповіщення (ніколи під час використання програми). Це лише " +"механізми сповіщення, автоматична установка не виконується." + +#: src/slic3r/GUI/Preferences.cpp:102 +msgid "Export sources full pathnames to 3mf and amf" +msgstr "Експортувати повні назви шляхів до 3MF та amf" + +#: src/slic3r/GUI/Preferences.cpp:104 +msgid "" +"If enabled, allows the Reload from disk command to automatically find and " +"load the files when invoked." +msgstr "" +"Якщо увімкнено, дозволяє команді Перезавантажити з диска автоматично " +"знаходити і завантажувати файли під час виклику." + +#: src/slic3r/GUI/Preferences.cpp:114 +msgid "If enabled, sets PrusaSlicer as default application to open .3mf files." +msgstr "" +"Якщо увімкнено, встановлює PrusaSlicer як типову програму для відкриття 3MF-" +"файлів." + +#: src/slic3r/GUI/Preferences.cpp:121 +msgid "If enabled, sets PrusaSlicer as default application to open .stl files." +msgstr "" +"Якщо ввімкнено, програма PrusaSlicer за промовчанням відкриває STL-файли." + +#: src/slic3r/GUI/Preferences.cpp:131 +msgid "" +"If enabled, Slic3r 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 "" +"Якщо цей параметр увімкнено, Slic3r завантажує оновлення вбудованих пресетів " +"системи у фоновому режимі. Ці оновлення завантажуються в окреме тимчасове " +"місце розташування. Коли нова версія пресетів стає доступною, вона " +"пропонується під час запуску додатка." + +#: src/slic3r/GUI/Preferences.cpp:136 msgid "Suppress \" - default - \" presets" msgstr "Заборонити налаштування \"- за замовчуванням -\"" -#: src/slic3r/GUI/Preferences.cpp:76 +#: src/slic3r/GUI/Preferences.cpp:138 msgid "" "Suppress \" - default - \" presets in the Print / Filament / Printer " "selections once there are any other valid presets available." @@ -2724,806 +6203,1205 @@ msgstr "" "Заборонити налаштування \"- за замовчуванням -\" у параметрах Друк / " "Філамент / Принтер, якщо доступні інші діючі налаштування." -#: src/slic3r/GUI/Preferences.cpp:82 +#: src/slic3r/GUI/Preferences.cpp:144 msgid "Show incompatible print and filament presets" msgstr "Показувати несумісні налаштування друку та філаменту" -#: src/slic3r/GUI/Preferences.cpp:84 +#: src/slic3r/GUI/Preferences.cpp:146 msgid "" "When checked, the print and filament presets are shown in the preset editor " "even if they are marked as incompatible with the active printer" msgstr "" -"Якщо вибрано, налаштування друку та філаменту відображаються у списку " -"налаштувань, навіть якщо вони позначені як несумісні з активним принтером" +"Якщо вибрано, пресети для друку та філаменту відображаються у списку " +"пресетів, навіть якщо вони позначені як несумісні з активним принтером" -#: src/slic3r/GUI/Preferences.cpp:91 -msgid "Use legacy OpenGL 1.1 rendering" -msgstr "Використовувати застарілий OpenGL 1.1 рендеринг" +#: src/slic3r/GUI/Preferences.cpp:152 +msgid "Show drop project dialog" +msgstr "Показати діалогове вікно при перетягуванні проекту" -#: src/slic3r/GUI/Preferences.cpp:93 +#: src/slic3r/GUI/Preferences.cpp:154 msgid "" -"If you have rendering issues caused by a buggy OpenGL 2.0 driver, you may " -"try to check this checkbox. This will disable the layer height editing and " -"anti aliasing, so it is likely better to upgrade your graphics driver." +"When checked, whenever dragging and dropping a project file on the " +"application, shows a dialog asking to select the action to take on the file " +"to load." msgstr "" -"Якщо у вас виникають проблеми з візуалізацією, спричинені помилковим " -"драйвером OpenGL 2.0, спробуйте вибрати цю опцію. Це призведе до вимкнення " -"редагування висоти шару та згладжування, тому краще оновити графічний " -"драйвер." +"Якщо вибрано, при перетягуванні файлу проекту у програмі відображається " +"діалогове вікно із запитом вибрати дію щодо файлу, який потрібно завантажити." -#: src/slic3r/GUI/Preferences.cpp:101 -msgid "Use Retina resolution for the 3D scene" +#: src/slic3r/GUI/Preferences.cpp:161 src/slic3r/GUI/Preferences.cpp:165 +msgid "Allow just a single PrusaSlicer instance" +msgstr "Дозволити лише один екземпляр PrusaSlicer" + +#: src/slic3r/GUI/Preferences.cpp:163 +msgid "" +"On OSX there is always only one instance of app running by default. However " +"it is allowed to run multiple instances of same app from the command line. " +"In such case this settings will allow only one instance." +msgstr "" +"На OSX завжди є лише один екземпляр програми, який працює за замовчуванням. " +"Однак дозволяється запускати кілька екземплярів одного додатка з командного " +"рядка. У такому випадку ці налаштування дозволять лише один екземпляр." + +#: src/slic3r/GUI/Preferences.cpp:167 +msgid "" +"If this is enabled, when starting PrusaSlicer and another instance of the " +"same PrusaSlicer is already running, that instance will be reactivated " +"instead." +msgstr "" +"Якщо увімкнено, то під час запуску нового екземпляра PrusaSlicer при " +"наявності вже запущеного того самого PrusaSlicer, буде тільки повторно " +"активовано старий екземпляр." + +#: src/slic3r/GUI/Preferences.cpp:173 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:671 +msgid "Ask for unsaved changes when closing application" +msgstr "Питати про незбережені зміни при закритті програми" + +#: src/slic3r/GUI/Preferences.cpp:175 +msgid "When closing the application, always ask for unsaved changes" +msgstr "Завжди питати про незбережені зміни при закритті програми" + +#: src/slic3r/GUI/Preferences.cpp:180 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:672 +msgid "Ask for unsaved changes when selecting new preset" +msgstr "Питати про незбережені зміни при виборі нового пресету" + +#: src/slic3r/GUI/Preferences.cpp:182 +msgid "Always ask for unsaved changes when selecting new preset" +msgstr "Завжди запитуйте про незбережені зміни при виборі нового пресету" + +#: src/slic3r/GUI/Preferences.cpp:190 +msgid "Associate .gcode files to PrusaSlicer G-code Viewer" +msgstr "Зв’язати gcode-файли з PrusaSlicer Переглядачем G-коду" + +#: src/slic3r/GUI/Preferences.cpp:192 +msgid "" +"If enabled, sets PrusaSlicer G-code Viewer as default application to open ." +"gcode files." msgstr "" +"Якщо увімкнено, встановлює \"PrusaSlicer Переглядач G-коду\" як програму за " +"замовчуванням для відкриття GCODE-файлів." + +#: src/slic3r/GUI/Preferences.cpp:201 +msgid "Use Retina resolution for the 3D scene" +msgstr "Використовувати роздільну здатність Retina для 3D сцени" -#: src/slic3r/GUI/Preferences.cpp:103 +#: src/slic3r/GUI/Preferences.cpp:203 msgid "" "If enabled, the 3D scene will be rendered in Retina resolution. If you are " "experiencing 3D performance problems, disabling this option may help." msgstr "" +"Якщо увімкнено, 3D-сцена відображатиметься з роздільною здатністю Retina. " +"Якщо у вас виникають проблеми з продуктивністю 3D, вимкнення цієї опції може " +"допомогти." -#: src/slic3r/GUI/Preferences.cpp:126 -msgid "You need to restart Slic3r to make the changes effective." -msgstr "З метою ефективності зміни, Вам потрібно буде перезапустити Slic3r." +#: src/slic3r/GUI/Preferences.cpp:211 src/slic3r/GUI/Preferences.cpp:213 +msgid "Show splash screen" +msgstr "Показувати заставку" -#: src/slic3r/GUI/Preset.cpp:207 -msgid "modified" -msgstr "модифікований" +#: src/slic3r/GUI/Preferences.cpp:220 +msgid "Enable support for legacy 3DConnexion devices" +msgstr "Увімкнути підтримку застарілих пристроїв 3DConnexion" -#: src/slic3r/GUI/Preset.cpp:918 src/slic3r/GUI/Preset.cpp:958 -#: src/slic3r/GUI/Preset.cpp:1011 src/slic3r/GUI/Preset.cpp:1043 -#: src/slic3r/GUI/PresetBundle.cpp:1484 src/slic3r/GUI/PresetBundle.cpp:1537 -msgid "System presets" -msgstr "Системні налаштування" +#: src/slic3r/GUI/Preferences.cpp:222 +msgid "" +"If enabled, the legacy 3DConnexion devices settings dialog is available by " +"pressing CTRL+M" +msgstr "" +"Якщо увімкнено, діалогове вікно налаштувань пристроїв 3DConnexion доступне, " +"натиснувши CTRL+M" -#: src/slic3r/GUI/Preset.cpp:962 src/slic3r/GUI/Preset.cpp:1047 -#: src/slic3r/GUI/PresetBundle.cpp:1542 -msgid "User presets" -msgstr "Налаштування користувача" +#: src/slic3r/GUI/Preferences.cpp:232 +msgid "Camera" +msgstr "Камера" + +#: src/slic3r/GUI/Preferences.cpp:237 +msgid "Use perspective camera" +msgstr "Використовувати перспективну камеру" -#: src/slic3r/GUI/Preset.cpp:991 src/slic3r/GUI/Tab.cpp:247 -msgid "Add a new printer" +#: src/slic3r/GUI/Preferences.cpp:239 +msgid "" +"If enabled, use perspective camera. If not enabled, use orthographic camera." msgstr "" +"Якщо увімкнено, використовуватиметься перспективна камера. Якщо вимкнено, " +"використовуватиметься ортографічна камера." -#: src/slic3r/GUI/Preset.cpp:1251 -msgid "filament" +#: src/slic3r/GUI/Preferences.cpp:244 +msgid "Use free camera" +msgstr "Використовувати вільну камеру" + +#: src/slic3r/GUI/Preferences.cpp:246 +msgid "If enabled, use free camera. If not enabled, use constrained camera." msgstr "" +"Якщо увімкнено, використовуватиметься вільна камера. Якщо вимкнено, " +"використовуватиметься камера з обмеженими можливостями." -#: src/slic3r/GUI/PresetHints.cpp:28 -#, c-format +#: src/slic3r/GUI/Preferences.cpp:251 +msgid "Reverse direction of zoom with mouse wheel" +msgstr "Зворотний напрямок масштабування за допомогою колеса миші" + +#: src/slic3r/GUI/Preferences.cpp:253 +msgid "If enabled, reverses the direction of zoom with mouse wheel" +msgstr "Якщо увімкнено, змінює напрямок масштабування за допомогою колеса миші" + +#: src/slic3r/GUI/Preferences.cpp:261 +msgid "GUI" +msgstr "Графічний інтерфейс" + +#: src/slic3r/GUI/Preferences.cpp:276 +msgid "Sequential slider applied only to top layer" +msgstr "Послідовний повзунок застосовується лише до верхнього шару" + +#: src/slic3r/GUI/Preferences.cpp:278 msgid "" -"If estimated layer time is below ~%ds, fan will run at %d%% and print speed " -"will be reduced so that no less than %ds are spent on that layer (however, " -"speed will never be reduced below %dmm/s)." +"If enabled, changes made using the sequential slider, in preview, apply only " +"to gcode top layer. If disabled, changes made using the sequential slider, " +"in preview, apply to the whole gcode." msgstr "" -"Якщо запланований час друку шару нижче ~%dс, вентилятор буде працювати на%d" -"%%, і швидкість друку буде зменшена, так що на цей шар витрачається не менше " -"%dс (однак швидкість ніколи не зменшиться нижче %d mm/s) ." +"Якщо увімкнено, зміни, внесені за допомогою послідовного повзунка, у " +"попередньому перегляді застосовуються лише до верхнього шару G-коду. Якщо " +"вимкнено, зміни, внесені за допомогою послідовного повзунка, у попередньому " +"перегляді застосовуються до цілого G-коду." -#: src/slic3r/GUI/PresetHints.cpp:32 -#, c-format +#: src/slic3r/GUI/Preferences.cpp:285 +msgid "Show sidebar collapse/expand button" +msgstr "Показувати кнопку згортання/розгортання бічної панелі" + +#: src/slic3r/GUI/Preferences.cpp:287 msgid "" -"\n" -"If estimated layer time is greater, but still below ~%ds, fan will run at a " -"proportionally decreasing speed between %d%% and %d%%." +"If enabled, the button for the collapse sidebar will be appeared in top " +"right corner of the 3D Scene" msgstr "" -"\n" -"Якщо запланований час друку шару більше, але все ще нижче ~%dс, вентилятор " -"буде працювати з пропорційно зменшуваною швидкістю між %d%% та %d%%." +"Якщо увімкнено, у верхньому правому куті 3D-сцени з’явиться кнопка згортання " +"бічної панелі" + +#: src/slic3r/GUI/Preferences.cpp:292 +msgid "Suppress to open hyperlink in browser" +msgstr "Заборонити відкриття гіперпосилань у браузері" -#: src/slic3r/GUI/PresetHints.cpp:36 +#: src/slic3r/GUI/Preferences.cpp:294 msgid "" -"\n" -"During the other layers, fan " +"If enabled, the descriptions of configuration parameters in settings tabs " +"wouldn't work as hyperlinks. If disabled, the descriptions of configuration " +"parameters in settings tabs will work as hyperlinks." msgstr "" -"\n" -"Під час друку інших шарів вентилятор " +"Якщо увімкнено, описи параметрів конфігурації на вкладках параметрів не " +"працюватимуть як гіперпосилання. Якщо вимкнено, описи параметрів " +"конфігурації на вкладках параметрів працюватимуть як гіперпосилання." -#: src/slic3r/GUI/PresetHints.cpp:38 -msgid "Fan " -msgstr "Вентилятор " +#: src/slic3r/GUI/Preferences.cpp:300 +msgid "Use custom size for toolbar icons" +msgstr "" +"Використовуйте користувацький розмір для піктограм на панелі інструментів" -#: src/slic3r/GUI/PresetHints.cpp:43 -#, c-format -msgid "will always run at %d%% " -msgstr "буде завжди працювати на %d%% " +#: src/slic3r/GUI/Preferences.cpp:302 +msgid "If enabled, you can change size of toolbar icons manually." +msgstr "" +"Якщо увімкнено, ви можете змінювати розмір піктограм на панелі інструментів " +"вручну." + +#: src/slic3r/GUI/Preferences.cpp:320 +msgid "Render" +msgstr "Візуалізувати" -#: src/slic3r/GUI/PresetHints.cpp:46 +#: src/slic3r/GUI/Preferences.cpp:325 +msgid "Use environment map" +msgstr "Використовуйте карту середовища" + +#: src/slic3r/GUI/Preferences.cpp:327 +msgid "If enabled, renders object using the environment map." +msgstr "Якщо увімкнено, візуалізує об’єкт за допомогою карти середовища." + +#: src/slic3r/GUI/Preferences.cpp:352 #, c-format -msgid "except for the first %d layers" -msgstr "за винятком перших %d шарів" +msgid "You need to restart %s to make the changes effective." +msgstr "З метою ефективності зміни, Вам потрібно буде перезапустити %s." + +#: src/slic3r/GUI/Preferences.cpp:427 +msgid "Icon size in a respect to the default size" +msgstr "Розмір піктограми відносно розміру за промовчанням" + +#: src/slic3r/GUI/Preferences.cpp:442 +msgid "Select toolbar icon size in respect to the default one." +msgstr "" +"Виберіть розмір піктограми панелі інструментів щодо розміру за замовчуванням." + +#: src/slic3r/GUI/Preferences.cpp:473 +msgid "Old regular layout with the tab bar" +msgstr "Старий звичайний макет із панеллю вкладок" + +#: src/slic3r/GUI/Preferences.cpp:474 +msgid "New layout, access via settings button in the top menu" +msgstr "Нове розташування, доступ через кнопку налаштувань у верхньому меню" + +#: src/slic3r/GUI/Preferences.cpp:475 +msgid "Settings in non-modal window" +msgstr "Налаштування у немодальному вікні" + +#: src/slic3r/GUI/Preferences.cpp:484 +msgid "Layout Options" +msgstr "Параметри розташування" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:197 +#: src/slic3r/GUI/PresetComboBoxes.cpp:235 +#: src/slic3r/GUI/PresetComboBoxes.cpp:761 +#: src/slic3r/GUI/PresetComboBoxes.cpp:811 +#: src/slic3r/GUI/PresetComboBoxes.cpp:925 +#: src/slic3r/GUI/PresetComboBoxes.cpp:969 +msgid "System presets" +msgstr "Системні налаштування" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:239 +#: src/slic3r/GUI/PresetComboBoxes.cpp:815 +#: src/slic3r/GUI/PresetComboBoxes.cpp:973 +msgid "User presets" +msgstr "Налаштування користувача" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:250 +msgid "Incompatible presets" +msgstr "Несумісні пресети" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:285 +msgid "Are you sure you want to delete \"%1%\" printer?" +msgstr "Ви впевнені, що хочете видалити принтер \"%1%\"?" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:287 +msgid "Delete Physical Printer" +msgstr "Видалити фізичний принтер" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:624 +msgid "Click to edit preset" +msgstr "Клацніть, щоб змінити пресет" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:680 +#: src/slic3r/GUI/PresetComboBoxes.cpp:710 +msgid "Add/Remove presets" +msgstr "Додати/Видалити пресети" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:685 +#: src/slic3r/GUI/PresetComboBoxes.cpp:715 src/slic3r/GUI/Tab.cpp:2990 +msgid "Add physical printer" +msgstr "Додати фізичний принтер" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:699 +msgid "Edit preset" +msgstr "Редагувати пресет" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:703 src/slic3r/GUI/Tab.cpp:2990 +msgid "Edit physical printer" +msgstr "Редагувати фізичний принтер" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:706 +msgid "Delete physical printer" +msgstr "Видалити фізичний принтер" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:826 +#: src/slic3r/GUI/PresetComboBoxes.cpp:987 +msgid "Physical printers" +msgstr "Фізичний принтер" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:850 +msgid "Add/Remove filaments" +msgstr "Додати/Видалити філаменти" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:852 +msgid "Add/Remove materials" +msgstr "Додати/Видалити матеріали" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:854 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1011 +msgid "Add/Remove printers" +msgstr "Додати/Видалити прінтери" + +#: src/slic3r/GUI/PresetHints.cpp:32 +msgid "" +"If estimated layer time is below ~%1%s, fan will run at %2%%% and print " +"speed will be reduced so that no less than %3%s are spent on that layer " +"(however, speed will never be reduced below %4%mm/s)." +msgstr "" +"Якщо передбачуваний час шару менше ~%1%s, вентилятор працюватиме на %2%%% і " +"швидкість друку буде зменшена, так що на цей шар буде витрачено не менше " +"%3%s (однак швидкість ніколи не зменшиться нижче %4%мм/с)." + +#: src/slic3r/GUI/PresetHints.cpp:39 +msgid "" +"If estimated layer time is greater, but still below ~%1%s, fan will run at a " +"proportionally decreasing speed between %2%%% and %3%%%." +msgstr "" +"Якщо передбачуваний час шару більше, але все ще менше ~%1%s, вентилятор " +"працюватиме із пропорційно зменшуваною швидкістю між %2%%% і %3%%%." -#: src/slic3r/GUI/PresetHints.cpp:50 -msgid "except for the first layer" -msgstr "за винятком першого шару" +#: src/slic3r/GUI/PresetHints.cpp:49 +msgid "Fan speed will be ramped from zero at layer %1% to %2%%% at layer %3%." +msgstr "" +"Швидкість вентилятора буде збільшена з нуля на шарі %1% до %2%%% на шарі %3%." + +#: src/slic3r/GUI/PresetHints.cpp:51 +msgid "During the other layers, fan will always run at %1%%%" +msgstr "Під час інших шарів вентилятор завжди працюватиме на %1%%%" + +#: src/slic3r/GUI/PresetHints.cpp:51 +msgid "Fan will always run at %1%%%" +msgstr "Вентилятор завжди працюватиме на %1%%%" + +#: src/slic3r/GUI/PresetHints.cpp:53 +msgid "except for the first %1% layers." +msgstr "за винятком перших %1% шарів." -#: src/slic3r/GUI/PresetHints.cpp:52 -msgid "will be turned off." -msgstr "буде вимкнено." +#: src/slic3r/GUI/PresetHints.cpp:55 +msgid "except for the first layer." +msgstr "за винятком першого шару." -#: src/slic3r/GUI/PresetHints.cpp:153 +#: src/slic3r/GUI/PresetHints.cpp:58 +msgid "During the other layers, fan will be turned off." +msgstr "Під час інших шарів вентилятор буде вимкнено." + +#: src/slic3r/GUI/PresetHints.cpp:58 +msgid "Fan will be turned off." +msgstr "Вентилятор буде вимкнено." + +#: src/slic3r/GUI/PresetHints.cpp:159 msgid "external perimeters" msgstr "зовнішні периметри" -#: src/slic3r/GUI/PresetHints.cpp:162 +#: src/slic3r/GUI/PresetHints.cpp:168 msgid "perimeters" msgstr "периметри" -#: src/slic3r/GUI/PresetHints.cpp:171 +#: src/slic3r/GUI/PresetHints.cpp:177 msgid "infill" msgstr "наповнення" -#: src/slic3r/GUI/PresetHints.cpp:181 +#: src/slic3r/GUI/PresetHints.cpp:187 msgid "solid infill" msgstr "суцільне наповнення" -#: src/slic3r/GUI/PresetHints.cpp:189 +#: src/slic3r/GUI/PresetHints.cpp:195 msgid "top solid infill" msgstr "верхній суцільне наповнення" -#: src/slic3r/GUI/PresetHints.cpp:200 +#: src/slic3r/GUI/PresetHints.cpp:206 msgid "support" msgstr "підтримка" -#: src/slic3r/GUI/PresetHints.cpp:210 +#: src/slic3r/GUI/PresetHints.cpp:216 msgid "support interface" msgstr "інтерфейс підтримки" -#: src/slic3r/GUI/PresetHints.cpp:216 +#: src/slic3r/GUI/PresetHints.cpp:222 msgid "First layer volumetric" msgstr "Об'єм першого шару" -#: src/slic3r/GUI/PresetHints.cpp:216 +#: src/slic3r/GUI/PresetHints.cpp:222 msgid "Bridging volumetric" msgstr "Об'єм мостів" -#: src/slic3r/GUI/PresetHints.cpp:216 +#: src/slic3r/GUI/PresetHints.cpp:222 msgid "Volumetric" msgstr "Об'ємний" -#: src/slic3r/GUI/PresetHints.cpp:217 -msgid " flow rate is maximized " -msgstr " швидкість потоку максимізується " +#: src/slic3r/GUI/PresetHints.cpp:223 +msgid "flow rate is maximized" +msgstr "швидкість потоку максимізується" -#: src/slic3r/GUI/PresetHints.cpp:220 +#: src/slic3r/GUI/PresetHints.cpp:226 msgid "by the print profile maximum" msgstr "за профілем друку максимум" -#: src/slic3r/GUI/PresetHints.cpp:221 -msgid "when printing " -msgstr "коли друкуємо " - -#: src/slic3r/GUI/PresetHints.cpp:222 -msgid " with a volumetric rate " -msgstr " з об'ємною швидкістю " - -#: src/slic3r/GUI/PresetHints.cpp:226 -#, c-format -msgid "%3.2f mm³/s" -msgstr "%3.2f мм³/с" +#: src/slic3r/GUI/PresetHints.cpp:227 +msgid "when printing" +msgstr "коли друкуємо" #: src/slic3r/GUI/PresetHints.cpp:228 +msgid "with a volumetric rate" +msgstr "з об'ємною швидкістю" + +#: src/slic3r/GUI/PresetHints.cpp:232 #, c-format -msgid " at filament speed %3.2f mm/s." -msgstr " при швидкості філаменту %3.2f мм/с." +msgid "%3.2f mm³/s at filament speed %3.2f mm/s." +msgstr "%3.2f мм³/с при швидкості філаменту %3.2f мм/с." -#: src/slic3r/GUI/PresetHints.cpp:247 +#: src/slic3r/GUI/PresetHints.cpp:250 msgid "" "Recommended object thin wall thickness: Not available due to invalid layer " "height." msgstr "" -"Рекомендований об'єкт товщиною тонкої стінки: Недоступний через невірне " -"значення висоти шару." +"Рекомендована товщина стінки об'єкту: Недоступний через невірне значення " +"висоти шару." -#: src/slic3r/GUI/PresetHints.cpp:264 +#: src/slic3r/GUI/PresetHints.cpp:266 #, c-format -msgid "Recommended object thin wall thickness for layer height %.2f and " -msgstr "Рекомендована товщина стінки для висоти шару %.2f та " +msgid "Recommended object thin wall thickness for layer height %.2f and" +msgstr "Рекомендована товщина стінки об'єкту для висоти шару %.2f та" -#: src/slic3r/GUI/PresetHints.cpp:271 +#: src/slic3r/GUI/PresetHints.cpp:273 #, c-format -msgid "%d lines: %.2lf mm" -msgstr "%d рядків: %.2lf мм" +msgid "%d lines: %.2f mm" +msgstr "%d рядків: %.2f мм" -#: src/slic3r/GUI/PrintHostDialogs.cpp:32 -msgid "Send G-Code to printer host" +#: src/slic3r/GUI/PresetHints.cpp:277 +msgid "" +"Recommended object thin wall thickness: Not available due to excessively " +"small extrusion width." msgstr "" +"Рекомендована товщина стінки об'єкту: Недоступний через надмірно малу ширину " +"екструзії." -#: src/slic3r/GUI/PrintHostDialogs.cpp:32 -msgid "Upload to Printer Host with the following filename:" +#: src/slic3r/GUI/PresetHints.cpp:306 +msgid "" +"Top / bottom shell thickness hint: Not available due to invalid layer height." msgstr "" +"Підказка щодо товщини верхньої/нижньої оболонки: Недоступна через " +"неправильну висоту шару." + +#: src/slic3r/GUI/PresetHints.cpp:319 +msgid "Top shell is %1% mm thick for layer height %2% mm." +msgstr "Верхня оболонка має товщину %1% мм для висоти шару %2% мм." + +#: src/slic3r/GUI/PresetHints.cpp:322 +msgid "Minimum top shell thickness is %1% mm." +msgstr "Мінімальна товщина верхньої оболонки становить %1% мм." + +#: src/slic3r/GUI/PresetHints.cpp:325 +msgid "Top is open." +msgstr "Верх відкритий." + +#: src/slic3r/GUI/PresetHints.cpp:338 +msgid "Bottom shell is %1% mm thick for layer height %2% mm." +msgstr "Нижня оболонка має товщину %1% мм для висоти шару %2% мм." + +#: src/slic3r/GUI/PresetHints.cpp:341 +msgid "Minimum bottom shell thickness is %1% mm." +msgstr "Мінімальна товщина нижньої оболонки становить %1% мм." + +#: src/slic3r/GUI/PresetHints.cpp:344 +msgid "Bottom is open." +msgstr "Внизу відкрито." + +#: src/slic3r/GUI/PrintHostDialogs.cpp:35 +msgid "Send G-Code to printer host" +msgstr "Надіслання G-коду на хост друку" -#: src/slic3r/GUI/PrintHostDialogs.cpp:34 +#: src/slic3r/GUI/PrintHostDialogs.cpp:35 +msgid "Upload to Printer Host with the following filename:" +msgstr "Завантажити на хост принтера з таким ім’ям файлу:" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:37 msgid "Start printing after upload" -msgstr "" +msgstr "Почати друк після заведення" -#: src/slic3r/GUI/PrintHostDialogs.cpp:41 +#: src/slic3r/GUI/PrintHostDialogs.cpp:45 msgid "Use forward slashes ( / ) as a directory separator if needed." -msgstr "" +msgstr "За потреби використовуйте скісні риски (/) як роздільник каталогів." + +#: src/slic3r/GUI/PrintHostDialogs.cpp:58 +msgid "Group" +msgstr "Group" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:176 +msgid "ID" +msgstr "ID" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:177 +msgid "Progress" +msgstr "Прогрес" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:178 +msgid "Status" +msgstr "Статус" -#: src/slic3r/GUI/PrintHostDialogs.cpp:157 +#: src/slic3r/GUI/PrintHostDialogs.cpp:179 +msgid "Host" +msgstr "Хост" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:180 +msgid "Filename" +msgstr "Ім'я файлу" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:181 +msgid "Error Message" +msgstr "Повідомлення про помилку" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:184 msgid "Cancel selected" -msgstr "" +msgstr "Скасувати вибране" -#: src/slic3r/GUI/PrintHostDialogs.cpp:159 +#: src/slic3r/GUI/PrintHostDialogs.cpp:186 msgid "Show error message" -msgstr "" +msgstr "Показати повідомлення про помилку" -#: src/slic3r/GUI/PrintHostDialogs.cpp:198 -#: src/slic3r/GUI/PrintHostDialogs.cpp:217 +#: src/slic3r/GUI/PrintHostDialogs.cpp:228 +#: src/slic3r/GUI/PrintHostDialogs.cpp:261 msgid "Enqueued" -msgstr "" +msgstr "У черзі" -#: src/slic3r/GUI/PrintHostDialogs.cpp:218 +#: src/slic3r/GUI/PrintHostDialogs.cpp:262 msgid "Uploading" +msgstr "Завантаження" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:266 +msgid "Completed" +msgstr "Завершено" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:304 +msgid "Error uploading to print host:" +msgstr "Помилка завантаження на хост друку:" + +#: src/slic3r/GUI/RammingChart.cpp:23 +msgid "NO RAMMING AT ALL" +msgstr "ВЗАГАЛІ БЕЗ раммінгу" + +#: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/WipeTowerDialog.cpp:83 +#: src/libslic3r/PrintConfig.cpp:706 src/libslic3r/PrintConfig.cpp:750 +#: src/libslic3r/PrintConfig.cpp:765 src/libslic3r/PrintConfig.cpp:2636 +#: src/libslic3r/PrintConfig.cpp:2645 src/libslic3r/PrintConfig.cpp:2755 +#: src/libslic3r/PrintConfig.cpp:2763 src/libslic3r/PrintConfig.cpp:2771 +#: src/libslic3r/PrintConfig.cpp:2778 src/libslic3r/PrintConfig.cpp:2786 +#: src/libslic3r/PrintConfig.cpp:2794 +msgid "s" +msgstr "с" + +#: src/slic3r/GUI/RammingChart.cpp:81 +msgid "Volumetric speed" +msgstr "Об'ємна швидкість" + +#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:663 +#: src/libslic3r/PrintConfig.cpp:1458 +msgid "mm³/s" +msgstr "мм³/с" + +#: src/slic3r/GUI/SavePresetDialog.cpp:57 +#, c-format +msgid "Save %s as:" +msgstr "Зберегти %s як:" + +#: src/slic3r/GUI/SavePresetDialog.cpp:110 +msgid "the following suffix is not allowed:" +msgstr "такий суфікс не допускається:" + +#: src/slic3r/GUI/SavePresetDialog.cpp:116 +msgid "The supplied name is not available." +msgstr "Надане ім'я недоступне." + +#: src/slic3r/GUI/SavePresetDialog.cpp:122 +msgid "Cannot overwrite a system profile." +msgstr "Неможливо замінити системний профіль." + +#: src/slic3r/GUI/SavePresetDialog.cpp:127 +msgid "Cannot overwrite an external profile." +msgstr "Неможливо замінити сторонній профіль." + +#: src/slic3r/GUI/SavePresetDialog.cpp:134 +msgid "Preset with name \"%1%\" already exists." +msgstr "Пресет з ім'ям \"%1%\" вже існує." + +#: src/slic3r/GUI/SavePresetDialog.cpp:136 +msgid "" +"Preset with name \"%1%\" already exists and is incompatible with selected " +"printer." +msgstr "Пресет з ім'ям \"%1%\" вже існує і несумісний з вибраним принтером." + +#: src/slic3r/GUI/SavePresetDialog.cpp:137 +msgid "Note: This preset will be replaced after saving" +msgstr "Примітка: Цей пресет буде замінено після збереження" + +#: src/slic3r/GUI/SavePresetDialog.cpp:142 +msgid "The name cannot be empty." +msgstr "Ім'я не може бути порожнім." + +#: src/slic3r/GUI/SavePresetDialog.cpp:147 +msgid "The name cannot start with space character." +msgstr "Ім'я не може починатися з пробілу." + +#: src/slic3r/GUI/SavePresetDialog.cpp:152 +msgid "The name cannot end with space character." +msgstr "Ім'я не може закінчуватися пробілом." + +#: src/slic3r/GUI/SavePresetDialog.cpp:186 +#: src/slic3r/GUI/SavePresetDialog.cpp:192 +msgid "Save preset" +msgstr "Зберегти налаштування" + +#: src/slic3r/GUI/SavePresetDialog.cpp:215 +msgctxt "PresetName" +msgid "Copy" +msgstr "Копія" + +#: src/slic3r/GUI/SavePresetDialog.cpp:273 +msgid "" +"You have selected physical printer \"%1%\" \n" +"with related printer preset \"%2%\"" msgstr "" +"Ви вибрали фізичний принтер \"%1%\"\n" +"із пов'язаним пресетом \"%2%\"" + +#: src/slic3r/GUI/SavePresetDialog.cpp:306 +msgid "What would you like to do with \"%1%\" preset after saving?" +msgstr "Що ви хочете зробити із пресетом \"%1%\" після збереження?" + +#: src/slic3r/GUI/SavePresetDialog.cpp:309 +msgid "Change \"%1%\" to \"%2%\" for this physical printer \"%3%\"" +msgstr "Для цього фізичного принтера \"%3%\" змінити \"%1%\" на \"%2%\"" + +#: src/slic3r/GUI/SavePresetDialog.cpp:310 +msgid "Add \"%1%\" as a next preset for the the physical printer \"%2%\"" +msgstr "Додати \"%1%\" як наступний пресет для фізичного принтера \"%2%\"" + +#: src/slic3r/GUI/SavePresetDialog.cpp:311 +msgid "Just switch to \"%1%\" preset" +msgstr "Просто переключитися до пресету \"%1%\"" + +#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2421 +msgid "Stealth" +msgstr "Тихий" + +#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2415 +msgid "Normal" +msgstr "Нормальний" + +#: src/slic3r/GUI/Selection.cpp:172 +msgid "Selection-Add" +msgstr "Виділення - Додано" + +#: src/slic3r/GUI/Selection.cpp:213 +msgid "Selection-Remove" +msgstr "Виділення - Видалено" + +#: src/slic3r/GUI/Selection.cpp:245 +msgid "Selection-Add Object" +msgstr "Виділення - Додано об'єкт" + +#: src/slic3r/GUI/Selection.cpp:264 +msgid "Selection-Remove Object" +msgstr "Виділення - Видалено об'єкт" + +#: src/slic3r/GUI/Selection.cpp:282 +msgid "Selection-Add Instance" +msgstr "Виділення - Додано екземпляр" -#: src/slic3r/GUI/PrintHostDialogs.cpp:222 -msgid "Completed" -msgstr "" +#: src/slic3r/GUI/Selection.cpp:301 +msgid "Selection-Remove Instance" +msgstr "Виділення - Видалено екземпляр" -#: src/slic3r/GUI/PrintHostDialogs.cpp:260 -msgid "Error uploading to print host:" -msgstr "" +#: src/slic3r/GUI/Selection.cpp:402 +msgid "Selection-Add All" +msgstr "Виділення - Додано все" -#: src/slic3r/GUI/RammingChart.cpp:23 -msgid "NO RAMMING AT ALL" -msgstr "" +#: src/slic3r/GUI/Selection.cpp:428 +msgid "Selection-Remove All" +msgstr "Виділення - Видалено все" -#: src/slic3r/GUI/RammingChart.cpp:76 -msgid "Time" -msgstr "" +#: src/slic3r/GUI/Selection.cpp:960 +msgid "Scale To Fit" +msgstr "Масштабувати під область друку" -#: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/RammingChart.cpp:81 -#: src/slic3r/GUI/WipeTowerDialog.cpp:82 src/libslic3r/PrintConfig.cpp:611 -#: src/libslic3r/PrintConfig.cpp:655 src/libslic3r/PrintConfig.cpp:670 -#: src/libslic3r/PrintConfig.cpp:2241 src/libslic3r/PrintConfig.cpp:2250 -#: src/libslic3r/PrintConfig.cpp:2308 src/libslic3r/PrintConfig.cpp:2315 -msgid "s" -msgstr "" +#: src/slic3r/GUI/Selection.cpp:1487 +msgid "Set Printable Instance" +msgstr "Встановити екземпляр \"Для друку\"" -#: src/slic3r/GUI/RammingChart.cpp:81 -msgid "Volumetric speed" -msgstr "" +#: src/slic3r/GUI/Selection.cpp:1487 +msgid "Set Unprintable Instance" +msgstr "Встановити екземпляр \"Не для друку\"" -#: src/slic3r/GUI/SysInfoDialog.cpp:44 -msgid "Slic3r Prusa Edition - System Information" -msgstr "" +#: src/slic3r/GUI/SysInfoDialog.cpp:82 +msgid "System Information" +msgstr "Інформація про систему" -#: src/slic3r/GUI/Tab.cpp:50 src/libslic3r/PrintConfig.cpp:228 +#: src/slic3r/GUI/SysInfoDialog.cpp:158 +msgid "Copy to Clipboard" +msgstr "Скопіювати в буфер обміну" + +#: src/slic3r/GUI/Tab.cpp:109 src/libslic3r/PrintConfig.cpp:321 msgid "Compatible printers" msgstr "Сумісні принтери" -#: src/slic3r/GUI/Tab.cpp:51 +#: src/slic3r/GUI/Tab.cpp:110 msgid "Select the printers this profile is compatible with." msgstr "Оберіть принтери, сумісні з цим профілем." -#: src/slic3r/GUI/Tab.cpp:56 src/libslic3r/PrintConfig.cpp:243 +#: src/slic3r/GUI/Tab.cpp:115 src/libslic3r/PrintConfig.cpp:336 msgid "Compatible print profiles" -msgstr "" +msgstr "Сумісні пресети друку" -#: src/slic3r/GUI/Tab.cpp:57 +#: src/slic3r/GUI/Tab.cpp:116 msgid "Select the print profiles this profile is compatible with." -msgstr "" +msgstr "Оберіть профілі друку, з якими цей профіль сумісний." -#: src/slic3r/GUI/Tab.cpp:132 -msgid "Save current " -msgstr "Зберегти поточний " +#. TRN "Save current Settings" +#: src/slic3r/GUI/Tab.cpp:211 +#, c-format +msgid "Save current %s" +msgstr "Зберегти поточний %s" -#: src/slic3r/GUI/Tab.cpp:133 +#: src/slic3r/GUI/Tab.cpp:212 msgid "Delete this preset" msgstr "Видалити це налаштування" -#: src/slic3r/GUI/Tab.cpp:145 +#: src/slic3r/GUI/Tab.cpp:216 msgid "" "Hover the cursor over buttons to find more information \n" "or click this button." msgstr "" +"Наведіть курсор на кнопки, щоб знайти додаткову інформацію\n" +"або натисніть цю кнопку." -#: src/slic3r/GUI/Tab.cpp:858 -msgid "It's a default preset." -msgstr "" +#: src/slic3r/GUI/Tab.cpp:220 +msgid "Search in settings [%1%]" +msgstr "Шукайте в налаштуваннях [%1%]" + +#: src/slic3r/GUI/Tab.cpp:1237 +msgid "Detach from system preset" +msgstr "Від'єднати від системного пресету" -#: src/slic3r/GUI/Tab.cpp:859 -msgid "It's a system preset." +#: src/slic3r/GUI/Tab.cpp:1250 +msgid "" +"A copy of the current system preset will be created, which will be detached " +"from the system preset." msgstr "" +"Буде створено копію поточного системного пресету, який буде від'єднано від " +"системного пресету." -#: src/slic3r/GUI/Tab.cpp:860 -msgid "Current preset is inherited from " +#: src/slic3r/GUI/Tab.cpp:1251 +msgid "" +"The current custom preset will be detached from the parent system preset." msgstr "" +"Поточний власний пресет буде від'єднаний від батьківського системного " +"пресету." -#: src/slic3r/GUI/Tab.cpp:865 -msgid "It can't be deleted or modified. " +#: src/slic3r/GUI/Tab.cpp:1254 +msgid "Modifications to the current profile will be saved." +msgstr "Зміни до поточного профілю буде збережено." + +#: src/slic3r/GUI/Tab.cpp:1257 +msgid "" +"This action is not revertable.\n" +"Do you want to proceed?" msgstr "" +"Цю дію не можна повернути.\n" +"Ви хочете продовжити?" + +#: src/slic3r/GUI/Tab.cpp:1259 +msgid "Detach preset" +msgstr "Від'єднати пресет" + +#: src/slic3r/GUI/Tab.cpp:1285 +msgid "This is a default preset." +msgstr "Цей пресет є пресетом за-замовчуванням." + +#: src/slic3r/GUI/Tab.cpp:1287 +msgid "This is a system preset." +msgstr "Цей пресет є системним пресетом." + +#: src/slic3r/GUI/Tab.cpp:1289 +msgid "Current preset is inherited from the default preset." +msgstr "Поточний пресет успадковується від пресету за замовчуванням." + +#: src/slic3r/GUI/Tab.cpp:1293 +msgid "Current preset is inherited from" +msgstr "Поточний пресет успадковується від" -#: src/slic3r/GUI/Tab.cpp:866 +#: src/slic3r/GUI/Tab.cpp:1297 +msgid "It can't be deleted or modified." +msgstr "Його не можна видалити або змінити." + +#: src/slic3r/GUI/Tab.cpp:1298 msgid "" -"Any modifications should be saved as a new preset inherited from this one. " +"Any modifications should be saved as a new preset inherited from this one." msgstr "" +"Будь-які модифікації слід зберігати як новий пресет, успадкований від цього." -#: src/slic3r/GUI/Tab.cpp:867 +#: src/slic3r/GUI/Tab.cpp:1299 msgid "To do that please specify a new name for the preset." -msgstr "" +msgstr "Для цього вкажіть нову назву пресету." -#: src/slic3r/GUI/Tab.cpp:871 +#: src/slic3r/GUI/Tab.cpp:1303 msgid "Additional information:" -msgstr "" +msgstr "Додаткова інформація:" -#: src/slic3r/GUI/Tab.cpp:877 +#: src/slic3r/GUI/Tab.cpp:1309 msgid "printer model" -msgstr "" +msgstr "модель принтеру" -#: src/slic3r/GUI/Tab.cpp:885 +#: src/slic3r/GUI/Tab.cpp:1317 msgid "default print profile" -msgstr "" +msgstr "профіль друку за замовчанням" -#: src/slic3r/GUI/Tab.cpp:888 +#: src/slic3r/GUI/Tab.cpp:1320 msgid "default filament profile" -msgstr "" +msgstr "профіль філаметну за замовчанням" -#: src/slic3r/GUI/Tab.cpp:902 +#: src/slic3r/GUI/Tab.cpp:1334 msgid "default SLA material profile" -msgstr "" +msgstr "профіль SLA-матеріалу за замовчанням" -#: src/slic3r/GUI/Tab.cpp:906 +#: src/slic3r/GUI/Tab.cpp:1338 msgid "default SLA print profile" -msgstr "" +msgstr "профіль SLA-друку за замовчанням" + +#: src/slic3r/GUI/Tab.cpp:1346 +msgid "full profile name" +msgstr "повне ім'я профілю" -#: src/slic3r/GUI/Tab.cpp:948 src/slic3r/GUI/Tab.cpp:3303 +#: src/slic3r/GUI/Tab.cpp:1347 +msgid "symbolic profile name" +msgstr "символічне ім'я профілю" + +#: src/slic3r/GUI/Tab.cpp:1385 src/slic3r/GUI/Tab.cpp:4042 msgid "Layers and perimeters" msgstr "Шари та периметри" -#: src/slic3r/GUI/Tab.cpp:949 src/libslic3r/PrintConfig.cpp:55 -msgid "Layer height" -msgstr "Висота шару" - -#: src/slic3r/GUI/Tab.cpp:953 +#: src/slic3r/GUI/Tab.cpp:1391 msgid "Vertical shells" msgstr "Вертикальні оболонки" -#: src/slic3r/GUI/Tab.cpp:964 +#: src/slic3r/GUI/Tab.cpp:1403 msgid "Horizontal shells" msgstr "Горизонтальні оболонки" -#: src/slic3r/GUI/Tab.cpp:965 src/libslic3r/PrintConfig.cpp:1709 +#: src/slic3r/GUI/Tab.cpp:1404 src/libslic3r/PrintConfig.cpp:1980 msgid "Solid layers" msgstr "Суцільні шари" -#: src/slic3r/GUI/Tab.cpp:970 +#: src/slic3r/GUI/Tab.cpp:1409 +msgid "Minimum shell thickness" +msgstr "Мінімальна товщина оболонки" + +#: src/slic3r/GUI/Tab.cpp:1420 msgid "Quality (slower slicing)" msgstr "Якість (повільне нарізання)" -#: src/slic3r/GUI/Tab.cpp:988 +#: src/slic3r/GUI/Tab.cpp:1448 msgid "Reducing printing time" msgstr "Зниження часу друку" -#: src/slic3r/GUI/Tab.cpp:1000 +#: src/slic3r/GUI/Tab.cpp:1460 msgid "Skirt and brim" msgstr "Плінтус та край" -#: src/slic3r/GUI/Tab.cpp:1017 +#: src/slic3r/GUI/Tab.cpp:1480 msgid "Raft" msgstr "Пліт" -#: src/slic3r/GUI/Tab.cpp:1021 +#: src/slic3r/GUI/Tab.cpp:1484 msgid "Options for support material and raft" msgstr "Варіанти для опорного матеріалу та плоту" -#: src/slic3r/GUI/Tab.cpp:1036 +#: src/slic3r/GUI/Tab.cpp:1499 msgid "Speed for print moves" msgstr "Швидкість друкарських рухів" -#: src/slic3r/GUI/Tab.cpp:1048 +#: src/slic3r/GUI/Tab.cpp:1512 msgid "Speed for non-print moves" msgstr "Швидкість недрукарських рухів" -#: src/slic3r/GUI/Tab.cpp:1051 +#: src/slic3r/GUI/Tab.cpp:1515 msgid "Modifiers" msgstr "Модифікатори" -#: src/slic3r/GUI/Tab.cpp:1054 +#: src/slic3r/GUI/Tab.cpp:1518 msgid "Acceleration control (advanced)" msgstr "Контроль прискорення (розширений)" -#: src/slic3r/GUI/Tab.cpp:1061 +#: src/slic3r/GUI/Tab.cpp:1525 msgid "Autospeed (advanced)" msgstr "Автоматична швидкість (розширена)" -#: src/slic3r/GUI/Tab.cpp:1069 +#: src/slic3r/GUI/Tab.cpp:1533 msgid "Multiple Extruders" msgstr "Кілька екструдерів" -#: src/slic3r/GUI/Tab.cpp:1077 +#: src/slic3r/GUI/Tab.cpp:1541 msgid "Ooze prevention" -msgstr "Профілактика просочування" +msgstr "Запобігання просочування" -#: src/slic3r/GUI/Tab.cpp:1094 +#: src/slic3r/GUI/Tab.cpp:1559 msgid "Extrusion width" msgstr "Ширина екструзії" -#: src/slic3r/GUI/Tab.cpp:1104 +#: src/slic3r/GUI/Tab.cpp:1569 msgid "Overlap" msgstr "Перекриття" -#: src/slic3r/GUI/Tab.cpp:1107 +#: src/slic3r/GUI/Tab.cpp:1572 msgid "Flow" msgstr "Потік" -#: src/slic3r/GUI/Tab.cpp:1116 +#: src/slic3r/GUI/Tab.cpp:1581 msgid "Other" msgstr "Інше" -#: src/slic3r/GUI/Tab.cpp:1119 src/slic3r/GUI/Tab.cpp:3351 +#: src/slic3r/GUI/Tab.cpp:1584 src/slic3r/GUI/Tab.cpp:4118 msgid "Output options" msgstr "Параметри виводу" -#: src/slic3r/GUI/Tab.cpp:1120 +#: src/slic3r/GUI/Tab.cpp:1585 msgid "Sequential printing" msgstr "Послідовне друкування" -#: src/slic3r/GUI/Tab.cpp:1122 -msgid "Extruder clearance (mm)" -msgstr "Розмір екструдера (мм)" +#: src/slic3r/GUI/Tab.cpp:1587 +msgid "Extruder clearance" +msgstr "Область зіткнення екструдера" -#: src/slic3r/GUI/Tab.cpp:1131 src/slic3r/GUI/Tab.cpp:3352 +#: src/slic3r/GUI/Tab.cpp:1592 src/slic3r/GUI/Tab.cpp:4119 msgid "Output file" msgstr "Вихідний файл" -#: src/slic3r/GUI/Tab.cpp:1138 src/libslic3r/PrintConfig.cpp:1382 +#: src/slic3r/GUI/Tab.cpp:1599 src/libslic3r/PrintConfig.cpp:1662 msgid "Post-processing scripts" msgstr "Скрипти пост-обробки" -#: src/slic3r/GUI/Tab.cpp:1144 src/slic3r/GUI/Tab.cpp:1145 -#: src/slic3r/GUI/Tab.cpp:1527 src/slic3r/GUI/Tab.cpp:1528 -#: src/slic3r/GUI/Tab.cpp:1935 src/slic3r/GUI/Tab.cpp:1936 -#: src/slic3r/GUI/Tab.cpp:2027 src/slic3r/GUI/Tab.cpp:2028 -#: src/slic3r/GUI/Tab.cpp:3240 src/slic3r/GUI/Tab.cpp:3241 +#: src/slic3r/GUI/Tab.cpp:1605 src/slic3r/GUI/Tab.cpp:1606 +#: src/slic3r/GUI/Tab.cpp:1927 src/slic3r/GUI/Tab.cpp:1928 +#: src/slic3r/GUI/Tab.cpp:2266 src/slic3r/GUI/Tab.cpp:2267 +#: src/slic3r/GUI/Tab.cpp:2342 src/slic3r/GUI/Tab.cpp:2343 +#: src/slic3r/GUI/Tab.cpp:3985 src/slic3r/GUI/Tab.cpp:3986 msgid "Notes" msgstr "Примітки" -#: src/slic3r/GUI/Tab.cpp:1151 src/slic3r/GUI/Tab.cpp:1535 -#: src/slic3r/GUI/Tab.cpp:1942 src/slic3r/GUI/Tab.cpp:2034 -#: src/slic3r/GUI/Tab.cpp:3248 src/slic3r/GUI/Tab.cpp:3357 +#: src/slic3r/GUI/Tab.cpp:1612 src/slic3r/GUI/Tab.cpp:1935 +#: src/slic3r/GUI/Tab.cpp:2273 src/slic3r/GUI/Tab.cpp:2349 +#: src/slic3r/GUI/Tab.cpp:3993 src/slic3r/GUI/Tab.cpp:4124 msgid "Dependencies" msgstr "Залежності" -#: src/slic3r/GUI/Tab.cpp:1152 src/slic3r/GUI/Tab.cpp:1536 -#: src/slic3r/GUI/Tab.cpp:1943 src/slic3r/GUI/Tab.cpp:2035 -#: src/slic3r/GUI/Tab.cpp:3249 src/slic3r/GUI/Tab.cpp:3358 +#: src/slic3r/GUI/Tab.cpp:1613 src/slic3r/GUI/Tab.cpp:1936 +#: src/slic3r/GUI/Tab.cpp:2274 src/slic3r/GUI/Tab.cpp:2350 +#: src/slic3r/GUI/Tab.cpp:3994 src/slic3r/GUI/Tab.cpp:4125 msgid "Profile dependencies" msgstr "Залежності профілю" -#: src/slic3r/GUI/Tab.cpp:1198 -#, no-c-format -msgid "" -"The Spiral Vase mode requires:\n" -"- one perimeter\n" -"- no top solid layers\n" -"- 0% fill density\n" -"- no support material\n" -"- no ensure_vertical_shell_thickness\n" -"\n" -"Shall I adjust those settings in order to enable Spiral Vase?" -msgstr "" -"Режим спіральної вази вимагає:\n" -"- один периметр\n" -"- немає верхніх щільних шарів\n" -"- 0% щільність заповнення\n" -"- немає підтримуючого матеріалу\n" -"- не забезпечує товщини вертикальної оболонки\n" -"\n" -"Чи потрібно змінити ці налаштування, щоб увімкнути режим Спіральної вази?" - -#: src/slic3r/GUI/Tab.cpp:1205 -msgid "Spiral Vase" -msgstr "Спіральна ваза" - -#: src/slic3r/GUI/Tab.cpp:1228 -msgid "" -"The Wipe Tower currently supports the non-soluble supports only\n" -"if they are printed with the current extruder without triggering a tool " -"change.\n" -"(both support_material_extruder and support_material_interface_extruder need " -"to be set to 0).\n" -"\n" -"Shall I adjust those settings in order to enable the Wipe Tower?" -msgstr "" -"Вичіщуюча веж в даний час підтримує лише нерозчинну підтримку\n" -"якщо вони друкуються з поточним екструдером, не запускаючи зміну " -"інструменту.\n" -"(обидва значення support_material_extruder і " -"support_material_interface_extruder повинні бути встановлені на 0).\n" -"\n" -"Чи потрібно коригувати ці налаштування, щоб увімкнути вичіщуючу веж?" - -#: src/slic3r/GUI/Tab.cpp:1232 src/slic3r/GUI/Tab.cpp:1249 -msgid "Wipe Tower" -msgstr "Вичіщуюча веж" - -#: src/slic3r/GUI/Tab.cpp:1246 -msgid "" -"For the Wipe Tower to work with the soluble supports, the support layers\n" -"need to be synchronized with the object layers.\n" -"\n" -"Shall I synchronize support layers in order to enable the Wipe Tower?" -msgstr "" -"Для того, щоб Вичіщуюча веж працювала з розчинними підтримками, шари " -"підтримки\n" -"повинні бути синхронізовані з шаром об'єкта.\n" -"\n" -"Чи потрібно синхронізувати шари підтримки, щоб увімкнути вичіщуючу веж?" - -#: src/slic3r/GUI/Tab.cpp:1264 -msgid "" -"Supports work better, if the following feature is enabled:\n" -"- Detect bridging perimeters\n" -"\n" -"Shall I adjust those settings for supports?" -msgstr "" -"Підтримка працює краще, якщо ввімкнено таку функцію:\n" -"- Виявлення висячих периметрів(перемичок)\n" -"\n" -"Чи потрібно змінити ці налаштування для підтримки?" - -#: src/slic3r/GUI/Tab.cpp:1267 -msgid "Support Generator" -msgstr "Створення підтримки" - -#: src/slic3r/GUI/Tab.cpp:1309 -msgid "The " -msgstr "Шаблон наповнення " +#: src/slic3r/GUI/Tab.cpp:1693 +msgid "Filament Overrides" +msgstr "Переписування глобальних змінних" -#: src/slic3r/GUI/Tab.cpp:1309 -#, no-c-format -msgid "" -" infill pattern is not supposed to work at 100%% density.\n" -"\n" -"Shall I switch to rectilinear fill pattern?" -msgstr "" -" не підтримується на 100% щільності.\n" -"\n" -"Чи потрібно змінити його на Rectilinear шаблон заповнення?" +#: src/slic3r/GUI/Tab.cpp:1815 +msgid "Temperature" +msgstr "Температура" -#: src/slic3r/GUI/Tab.cpp:1429 -msgid "Temperature " -msgstr "Температура " +#: src/slic3r/GUI/Tab.cpp:1816 +msgid "Nozzle" +msgstr "Сопло" -#: src/slic3r/GUI/Tab.cpp:1435 +#: src/slic3r/GUI/Tab.cpp:1821 msgid "Bed" -msgstr "Полотно" +msgstr "Стіл" -#: src/slic3r/GUI/Tab.cpp:1440 +#: src/slic3r/GUI/Tab.cpp:1826 msgid "Cooling" msgstr "Охолодження" -#: src/slic3r/GUI/Tab.cpp:1441 src/libslic3r/PrintConfig.cpp:1285 -#: src/libslic3r/PrintConfig.cpp:2097 +#: src/slic3r/GUI/Tab.cpp:1828 src/libslic3r/PrintConfig.cpp:1565 +#: src/libslic3r/PrintConfig.cpp:2428 msgid "Enable" msgstr "Увімкнути" -#: src/slic3r/GUI/Tab.cpp:1452 +#: src/slic3r/GUI/Tab.cpp:1839 msgid "Fan settings" msgstr "Налаштування вентилятора" -#: src/slic3r/GUI/Tab.cpp:1453 -msgid "Fan speed" -msgstr "Швидкість вентилятора" - -#: src/slic3r/GUI/Tab.cpp:1461 +#: src/slic3r/GUI/Tab.cpp:1850 msgid "Cooling thresholds" msgstr "Пороги охолодження" -#: src/slic3r/GUI/Tab.cpp:1467 +#: src/slic3r/GUI/Tab.cpp:1856 msgid "Filament properties" msgstr "Властивості філаменту" -#: src/slic3r/GUI/Tab.cpp:1471 +#: src/slic3r/GUI/Tab.cpp:1863 msgid "Print speed override" msgstr "Перевизначення швидкості друку" -#: src/slic3r/GUI/Tab.cpp:1481 +#: src/slic3r/GUI/Tab.cpp:1873 +msgid "Wipe tower parameters" +msgstr "Параметри вежі витирання" + +#: src/slic3r/GUI/Tab.cpp:1876 msgid "Toolchange parameters with single extruder MM printers" -msgstr "" +msgstr "Параметри зміни інструменту в одно-екструдерному ММ-принтері" -#: src/slic3r/GUI/Tab.cpp:1496 +#: src/slic3r/GUI/Tab.cpp:1889 msgid "Ramming settings" -msgstr "" +msgstr "Налаштування раммінгу" -#: src/slic3r/GUI/Tab.cpp:1514 src/slic3r/GUI/Tab.cpp:1898 +#: src/slic3r/GUI/Tab.cpp:1912 src/slic3r/GUI/Tab.cpp:2205 +#: src/libslic3r/PrintConfig.cpp:2063 msgid "Custom G-code" msgstr "Користувацький G-код" -#: src/slic3r/GUI/Tab.cpp:1515 src/slic3r/GUI/Tab.cpp:1899 -#: src/libslic3r/PrintConfig.cpp:1735 src/libslic3r/PrintConfig.cpp:1750 +#: src/slic3r/GUI/Tab.cpp:1913 src/slic3r/GUI/Tab.cpp:2206 +#: src/libslic3r/PrintConfig.cpp:2013 src/libslic3r/PrintConfig.cpp:2028 msgid "Start G-code" msgstr "Початок G-коду" -#: src/slic3r/GUI/Tab.cpp:1521 src/slic3r/GUI/Tab.cpp:1905 -#: src/libslic3r/PrintConfig.cpp:358 src/libslic3r/PrintConfig.cpp:368 +#: src/slic3r/GUI/Tab.cpp:1920 src/slic3r/GUI/Tab.cpp:2213 +#: src/libslic3r/PrintConfig.cpp:441 src/libslic3r/PrintConfig.cpp:451 msgid "End G-code" msgstr "Закінчення G-коду" -#: src/slic3r/GUI/Tab.cpp:1632 src/slic3r/GUI/Tab.cpp:1689 -msgid " Browse " -msgstr " Переглянути " - -#: src/slic3r/GUI/Tab.cpp:1651 src/slic3r/GUI/Tab.cpp:1838 -msgid "Test" -msgstr "Перевірити" - -#: src/slic3r/GUI/Tab.cpp:1662 -msgid "Could not get a valid Printer Host reference" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:1668 src/slic3r/GUI/Tab.cpp:1851 -msgid "Success!" -msgstr "Успіх!" - -#: src/slic3r/GUI/Tab.cpp:1683 -msgid "" -"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" -"signed certificate." -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:1696 -msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:1697 -msgid "Open CA certificate file" -msgstr "" +#: src/slic3r/GUI/Tab.cpp:1970 +msgid "Volumetric flow hints not available" +msgstr "Підказки об'ємного потоку відсутні" -#: src/slic3r/GUI/Tab.cpp:1725 +#: src/slic3r/GUI/Tab.cpp:2066 msgid "" -"HTTPS CA File:\n" -"\tOn this system, Slic3r 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 "" - -#: src/slic3r/GUI/Tab.cpp:1763 src/slic3r/GUI/Tab.cpp:1964 +"Note: All parameters from this group are moved to the Physical Printer " +"settings (see changelog).\n" +"\n" +"A new Physical Printer profile is created by clicking on the \"cog\" icon " +"right of the Printer profiles combo box, by selecting the \"Add physical " +"printer\" item in the Printer combo box. The Physical Printer profile editor " +"opens also when clicking on the \"cog\" icon in the Printer settings tab. " +"The Physical Printer profiles are being stored into PrusaSlicer/" +"physical_printer directory." +msgstr "" +"Примітка: Усі параметри з цієї групи переміщено до налаштувань фізичного " +"принтера (див. Журнал змін).\n" +"\n" +"Новий профіль фізичного принтера створюється натисканням на піктограму " +"\"гвинтик\" праворуч від списку \"Профілі принтера\", вибором пункту " +"\"Додати фізичний принтер\" у списку принтера. Редактор профілю фізичного " +"принтера відкривається також при натисканні на піктограму \"гвинтик\" на " +"вкладці \"Параметри принтеру\". Профілі фізичного принтера зберігаються в " +"каталозі \"PrusaSlicer/physical_printer\"." + +#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:2286 msgid "Size and coordinates" msgstr "Розмір і координати" -#: src/slic3r/GUI/Tab.cpp:1767 src/slic3r/GUI/Tab.cpp:1968 -#: src/slic3r/GUI/Tab.cpp:2911 -msgid " Set " -msgstr " Встановити " - -#: src/slic3r/GUI/Tab.cpp:1790 +#: src/slic3r/GUI/Tab.cpp:2108 src/slic3r/GUI/UnsavedChangesDialog.cpp:1080 msgid "Capabilities" msgstr "Можливості" -#: src/slic3r/GUI/Tab.cpp:1795 +#: src/slic3r/GUI/Tab.cpp:2113 msgid "Number of extruders of the printer." msgstr "Кількість екструдерів у принтері." -#: src/slic3r/GUI/Tab.cpp:1823 -msgid "USB/Serial connection" -msgstr "USB/послідовне з'єднання" - -#: src/slic3r/GUI/Tab.cpp:1824 src/libslic3r/PrintConfig.cpp:1590 -msgid "Serial port" -msgstr "Послідовний порт" - -#: src/slic3r/GUI/Tab.cpp:1829 -msgid "Rescan serial ports" -msgstr "Сканувати ще раз послідовні порти" - -#: src/slic3r/GUI/Tab.cpp:1851 -msgid "Connection to printer works correctly." -msgstr "Підключення до принтера працює коректно." - -#: src/slic3r/GUI/Tab.cpp:1854 -msgid "Connection failed." -msgstr "Підключення не вдалося." - -#: src/slic3r/GUI/Tab.cpp:1867 src/slic3r/GUI/Tab.cpp:2022 -msgid "Print Host upload" +#: src/slic3r/GUI/Tab.cpp:2141 +msgid "" +"Single Extruder Multi Material is selected, \n" +"and all extruders must have the same diameter.\n" +"Do you want to change the diameter for all extruders to first extruder " +"nozzle diameter value?" msgstr "" +"Вибрано мульти-матеріальний (ММ) друк з одним екструдером,\n" +"і всі екструдери повинні мати однаковий діаметр.\n" +"Хочете змінити діаметр для всіх екструдерів на значення діаметра сопла " +"першого екструдера?" + +#: src/slic3r/GUI/Tab.cpp:2144 src/slic3r/GUI/Tab.cpp:2552 +#: src/libslic3r/PrintConfig.cpp:1534 +msgid "Nozzle diameter" +msgstr "Діаметр сопла" -#: src/slic3r/GUI/Tab.cpp:1911 src/libslic3r/PrintConfig.cpp:128 +#: src/slic3r/GUI/Tab.cpp:2220 src/libslic3r/PrintConfig.cpp:209 msgid "Before layer change G-code" msgstr "G-код перед зміною шару" -#: src/slic3r/GUI/Tab.cpp:1917 src/libslic3r/PrintConfig.cpp:1030 +#: src/slic3r/GUI/Tab.cpp:2227 src/libslic3r/PrintConfig.cpp:1273 msgid "After layer change G-code" msgstr "G-код після зміни шару" -#: src/slic3r/GUI/Tab.cpp:1923 src/libslic3r/PrintConfig.cpp:2005 +#: src/slic3r/GUI/Tab.cpp:2234 src/libslic3r/PrintConfig.cpp:2321 msgid "Tool change G-code" msgstr "G-код зміни інструменту" -#: src/slic3r/GUI/Tab.cpp:1929 +#: src/slic3r/GUI/Tab.cpp:2241 msgid "Between objects G-code (for sequential printing)" msgstr "G-код між об'єктами (для послідовного друку)" -#: src/slic3r/GUI/Tab.cpp:1990 +#: src/slic3r/GUI/Tab.cpp:2248 +msgid "Color Change G-code" +msgstr "G-код зміни кольору" + +#: src/slic3r/GUI/Tab.cpp:2254 src/libslic3r/PrintConfig.cpp:2054 +msgid "Pause Print G-code" +msgstr "G-код для паузи друку" + +#: src/slic3r/GUI/Tab.cpp:2260 +msgid "Template Custom G-code" +msgstr "Шаблон власного G-коду" + +#: src/slic3r/GUI/Tab.cpp:2293 msgid "Display" -msgstr "" +msgstr "Дисплей" -#: src/slic3r/GUI/Tab.cpp:2001 +#: src/slic3r/GUI/Tab.cpp:2308 msgid "Tilt" -msgstr "" +msgstr "Нахил" -#: src/slic3r/GUI/Tab.cpp:2002 +#: src/slic3r/GUI/Tab.cpp:2309 msgid "Tilt time" -msgstr "" +msgstr "Час нахилу" -#: src/slic3r/GUI/Tab.cpp:2008 src/slic3r/GUI/Tab.cpp:3223 +#: src/slic3r/GUI/Tab.cpp:2315 src/slic3r/GUI/Tab.cpp:3969 msgid "Corrections" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:2074 src/slic3r/GUI/Tab.cpp:2136 -#: src/libslic3r/PrintConfig.cpp:1076 src/libslic3r/PrintConfig.cpp:1086 -#: src/libslic3r/PrintConfig.cpp:1096 src/libslic3r/PrintConfig.cpp:1109 -#: src/libslic3r/PrintConfig.cpp:1120 src/libslic3r/PrintConfig.cpp:1131 -#: src/libslic3r/PrintConfig.cpp:1142 -msgid "Machine limits" -msgstr "" +msgstr "Поправки" -#: src/slic3r/GUI/Tab.cpp:2088 -msgid "Values in this column are for Full Power mode" -msgstr "" +#: src/slic3r/GUI/Tab.cpp:2332 src/slic3r/GUI/Tab.cpp:3965 +msgid "Exposure" +msgstr "Експозиція" -#: src/slic3r/GUI/Tab.cpp:2089 -msgid "Full Power" -msgstr "" +#: src/slic3r/GUI/Tab.cpp:2391 src/slic3r/GUI/Tab.cpp:2485 +#: src/libslic3r/PrintConfig.cpp:1302 src/libslic3r/PrintConfig.cpp:1337 +#: src/libslic3r/PrintConfig.cpp:1354 src/libslic3r/PrintConfig.cpp:1371 +#: src/libslic3r/PrintConfig.cpp:1387 src/libslic3r/PrintConfig.cpp:1397 +#: src/libslic3r/PrintConfig.cpp:1407 src/libslic3r/PrintConfig.cpp:1417 +msgid "Machine limits" +msgstr "Механічних обмеження" -#: src/slic3r/GUI/Tab.cpp:2094 -msgid "Values in this column are for Silent mode" -msgstr "" +#: src/slic3r/GUI/Tab.cpp:2414 +msgid "Values in this column are for Normal mode" +msgstr "Значення в цьому стовпці для нормального режиму" -#: src/slic3r/GUI/Tab.cpp:2095 -msgid "Silent" -msgstr "" +#: src/slic3r/GUI/Tab.cpp:2420 +msgid "Values in this column are for Stealth mode" +msgstr "Значення в цьому стовпці для тихого режиму" -#: src/slic3r/GUI/Tab.cpp:2103 +#: src/slic3r/GUI/Tab.cpp:2429 msgid "Maximum feedrates" -msgstr "" +msgstr "Максимальна швидкість подачі" -#: src/slic3r/GUI/Tab.cpp:2108 +#: src/slic3r/GUI/Tab.cpp:2434 msgid "Maximum accelerations" -msgstr "" +msgstr "Максимальні прискорення" -#: src/slic3r/GUI/Tab.cpp:2115 +#: src/slic3r/GUI/Tab.cpp:2441 msgid "Jerk limits" -msgstr "" +msgstr "Обмеження ривку" -#: src/slic3r/GUI/Tab.cpp:2120 +#: src/slic3r/GUI/Tab.cpp:2446 msgid "Minimum feedrates" -msgstr "" +msgstr "Мінімальна швидкість подачі" -#: src/slic3r/GUI/Tab.cpp:2158 src/slic3r/GUI/Tab.cpp:2166 +#: src/slic3r/GUI/Tab.cpp:2510 src/slic3r/GUI/Tab.cpp:2518 msgid "Single extruder MM setup" -msgstr "" +msgstr "Налаштування MM екструдера" -#: src/slic3r/GUI/Tab.cpp:2167 +#: src/slic3r/GUI/Tab.cpp:2519 msgid "Single extruder multimaterial parameters" -msgstr "" +msgstr "Параметри екструдеру в багато-екструдерному принтері" -#: src/slic3r/GUI/Tab.cpp:2181 src/libslic3r/GCode/PreviewData.cpp:475 -#, c-format -msgid "Extruder %d" -msgstr "Екструдер %d" +#: src/slic3r/GUI/Tab.cpp:2550 +msgid "" +"This is a single extruder multimaterial printer, diameters of all extruders " +"will be set to the new value. Do you want to proceed?" +msgstr "" +"Це одно-екструдерний багато-матеріальний принтер, діаметри всіх екструдерів " +"будуть встановлені на нове значення. Ви хочете продовжити?" -#: src/slic3r/GUI/Tab.cpp:2188 +#: src/slic3r/GUI/Tab.cpp:2574 msgid "Layer height limits" msgstr "Межі висоти шару" -#: src/slic3r/GUI/Tab.cpp:2193 +#: src/slic3r/GUI/Tab.cpp:2579 msgid "Position (for multi-extruder printers)" msgstr "Позиція (для мульти-екструдерних принтерів)" -#: src/slic3r/GUI/Tab.cpp:2196 -msgid "Retraction" -msgstr "Переривання" - -#: src/slic3r/GUI/Tab.cpp:2199 +#: src/slic3r/GUI/Tab.cpp:2585 msgid "Only lift Z" msgstr "Межі підняття Z" -#: src/slic3r/GUI/Tab.cpp:2212 +#: src/slic3r/GUI/Tab.cpp:2598 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" @@ -3531,11 +7409,11 @@ msgstr "" "Переривання при відключенні інструмента (додаткові налаштування для " "налагодження мульти-екструдерів)" -#: src/slic3r/GUI/Tab.cpp:2216 -msgid "Preview" -msgstr "Попередній перегляд" +#: src/slic3r/GUI/Tab.cpp:2605 +msgid "Reset to Filament Color" +msgstr "Скинути до кольору філаменту" -#: src/slic3r/GUI/Tab.cpp:2352 +#: src/slic3r/GUI/Tab.cpp:2783 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -3546,281 +7424,468 @@ msgstr "" "\n" "Відключити його для увімкнення програмного переривання?" -#: src/slic3r/GUI/Tab.cpp:2354 +#: src/slic3r/GUI/Tab.cpp:2785 msgid "Firmware Retraction" msgstr "Програмне переривання" -#: src/slic3r/GUI/Tab.cpp:2681 -#, c-format -msgid "Default preset (%s)" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:2682 -#, c-format -msgid "Preset (%s)" -msgstr "" +#: src/slic3r/GUI/Tab.cpp:3376 +msgid "Detached" +msgstr "Від'єднаний" -#: src/slic3r/GUI/Tab.cpp:2699 -msgid "has the following unsaved changes:" -msgstr "" +#: src/slic3r/GUI/Tab.cpp:3439 +msgid "remove" +msgstr "видалити" -#: src/slic3r/GUI/Tab.cpp:2702 -msgid "is not compatible with printer" -msgstr "" +#: src/slic3r/GUI/Tab.cpp:3439 +msgid "delete" +msgstr "видалити" -#: src/slic3r/GUI/Tab.cpp:2703 -msgid "is not compatible with print profile" -msgstr "" +#: src/slic3r/GUI/Tab.cpp:3448 +msgid "It's a last preset for this physical printer." +msgstr "Це останній пресет для цього фізичного принтера." -#: src/slic3r/GUI/Tab.cpp:2705 -msgid "and it has the following unsaved changes:" +#: src/slic3r/GUI/Tab.cpp:3453 +msgid "" +"Are you sure you want to delete \"%1%\" preset from the physical printer " +"\"%2%\"?" msgstr "" +"Ви впевнені, що хочете видалити пресет \"%1%\" із фізичного принтера \"%2%\"?" -#: src/slic3r/GUI/Tab.cpp:2708 -msgid "Discard changes and continue anyway?" +#: src/slic3r/GUI/Tab.cpp:3465 +msgid "" +"The physical printer(s) below is based on the preset, you are going to " +"delete." msgstr "" +"Наведений(і) нижче фізичний(і) принтер(и) базується на пресеті, які ви " +"збираєтеся видалити." -#: src/slic3r/GUI/Tab.cpp:2709 -msgid "Unsaved Changes" -msgstr "Незбережені зміни" - -#: src/slic3r/GUI/Tab.cpp:2721 -msgid "Please check your object list before preset changing." +#: src/slic3r/GUI/Tab.cpp:3469 +msgid "" +"Note, that selected preset will be deleted from this/those printer(s) too." msgstr "" +"Зверніть увагу, що вибраний пресет буде також видалено з цього/цих " +"принтеру(ів)." -#: src/slic3r/GUI/Tab.cpp:2801 -msgid "Copy" +#: src/slic3r/GUI/Tab.cpp:3473 +msgid "" +"The physical printer(s) below is based only on the preset, you are going to " +"delete." msgstr "" +"Наведений(і) нижче фізичний(і) принтер(и) базується тільки на пресеті, які " +"ви збираєтеся видалити." -#: src/slic3r/GUI/Tab.cpp:2823 -msgid "The supplied name is empty. It can't be saved." -msgstr "Надане ім'я порожнє. Не вдається зберегти." - -#: src/slic3r/GUI/Tab.cpp:2828 -msgid "Cannot overwrite a system profile." +#: src/slic3r/GUI/Tab.cpp:3477 +msgid "" +"Note, that this/those printer(s) will be deleted after deleting of the " +"selected preset." msgstr "" +"Зауважте, що цей/ці принтер(и) буде видалено після видалення вибраного " +"пресету." -#: src/slic3r/GUI/Tab.cpp:2832 -msgid "Cannot overwrite an external profile." -msgstr "" +#: src/slic3r/GUI/Tab.cpp:3481 +msgid "Are you sure you want to %1% the selected preset?" +msgstr "Ви впевнені, що хочете %1% вибраний пресет?" -#: src/slic3r/GUI/Tab.cpp:2858 -msgid "remove" -msgstr "перемістити" +#. TRN Remove/Delete +#: src/slic3r/GUI/Tab.cpp:3486 +msgid "%1% Preset" +msgstr "%1% пресет" -#: src/slic3r/GUI/Tab.cpp:2858 -msgid "delete" -msgstr "видалити" +#: src/slic3r/GUI/Tab.cpp:3567 src/slic3r/GUI/Tab.cpp:3639 +msgid "Set" +msgstr "Встановити" -#: src/slic3r/GUI/Tab.cpp:2859 -msgid "Are you sure you want to " -msgstr "Ви впевнені, що хочете " +#: src/slic3r/GUI/Tab.cpp:3703 +msgid "" +"Machine limits will be emitted to G-code and used to estimate print time." +msgstr "" +"Механічних обмеження публікуватимуться в G-код і використовуватимуться для " +"розрахунку часу друку." -#: src/slic3r/GUI/Tab.cpp:2859 -msgid " the selected preset?" -msgstr " вибране налаштування?" +#: src/slic3r/GUI/Tab.cpp:3706 +msgid "" +"Machine limits will NOT be emitted to G-code, however they will be used to " +"estimate print time, which may therefore not be accurate as the printer may " +"apply a different set of machine limits." +msgstr "" +"Механічних обмеження НЕ публікуватимуться в G-код, однак вони будуть " +"використовуватися для оцінки часу друку, що, отже, може бути неточним, " +"оскільки принтер може застосовувати інший набір механічних обмежень." -#: src/slic3r/GUI/Tab.cpp:2860 -msgid "Remove" -msgstr "Перемістити" +#: src/slic3r/GUI/Tab.cpp:3710 +msgid "" +"Machine limits are not set, therefore the print time estimate may not be " +"accurate." +msgstr "" +"Механічних обмеження не встановлені, тому оцінка часу друку може бути " +"неточною." -#: src/slic3r/GUI/Tab.cpp:2861 -msgid " Preset" -msgstr " Налаштування" +#: src/slic3r/GUI/Tab.cpp:3732 +msgid "LOCKED LOCK" +msgstr "ЗАКРИТИЙ ЗАМОК" -#: src/slic3r/GUI/Tab.cpp:2989 +#. TRN Description for "LOCKED LOCK" +#: src/slic3r/GUI/Tab.cpp:3734 msgid "" -"LOCKED LOCK;indicates that the settings are the same as the system values " +"indicates that the settings are the same as the system (or default) values " "for the current option group" msgstr "" +"вказує на те, що параметри збігаються із системними (або за замовчуванням) " +"значеннями для поточної групи опцій" -#: src/slic3r/GUI/Tab.cpp:2992 +#: src/slic3r/GUI/Tab.cpp:3736 +msgid "UNLOCKED LOCK" +msgstr "ВІДКРИТИЙ ЗАМОК" + +#. TRN Description for "UNLOCKED LOCK" +#: src/slic3r/GUI/Tab.cpp:3738 msgid "" -"UNLOCKED LOCK;indicates that some settings were changed and are not equal to " -"the system values for the current option group.\n" +"indicates that some settings were changed and are not equal to the system " +"(or default) values for the current option group.\n" "Click the UNLOCKED LOCK icon to reset all settings for current option group " -"to the system values." +"to the system (or default) values." msgstr "" +"вказує на те, що деякі параметри були змінені і не дорівнюють системним (або " +"за замовчуванням) значенням для поточної групи опцій.\n" +"Клацніть, щоб скинути всі налаштування для поточної групи опцій до системних " +"значень (або за замовчуванням)." + +#: src/slic3r/GUI/Tab.cpp:3743 +msgid "WHITE BULLET" +msgstr "БІЛА КУЛЯ" -#: src/slic3r/GUI/Tab.cpp:2998 +#. TRN Description for "WHITE BULLET" +#: src/slic3r/GUI/Tab.cpp:3745 msgid "" -"WHITE BULLET;for the left button: \tindicates a non-system preset,\n" -"for the right button: \tindicates that the settings hasn't been modified." +"for the left button: indicates a non-system (or non-default) preset,\n" +"for the right button: indicates that the settings hasn't been modified." msgstr "" +"для лівої кнопки: вказує на несистемний (або не за замовчуванням) пресет,\n" +"для правої кнопки: вказує на те, що параметри не були змінені." -#: src/slic3r/GUI/Tab.cpp:3002 +#: src/slic3r/GUI/Tab.cpp:3748 +msgid "BACK ARROW" +msgstr "СТРІЛКА НАЗАД" + +#. TRN Description for "BACK ARROW" +#: src/slic3r/GUI/Tab.cpp:3750 msgid "" -"BACK ARROW;indicates that the settings were changed and are not equal to the " -"last saved preset for the current option group.\n" +"indicates that the settings were changed and are not equal to the last saved " +"preset for the current option group.\n" "Click the BACK ARROW icon to reset all settings for the current option group " "to the last saved preset." msgstr "" +"вказує на те, що параметри були змінені і не дорівнюють останньому " +"збереженому пресету для поточної групи параметрів.\n" +"Клацніть, щоб скинути всі параметри для поточної групи параметрів до " +"останнього збереженого пресету." -#: src/slic3r/GUI/Tab.cpp:3028 +#: src/slic3r/GUI/Tab.cpp:3760 msgid "" -"LOCKED LOCK icon indicates that the settings are the same as the system " -"values for the current option group" +"LOCKED LOCK icon indicates that the settings are the same as the system (or " +"default) values for the current option group" msgstr "" +"Значок \"ЗАКРИТИЙ ЗАМОК\" вказує на те, що параметри збігаються із " +"системними (або за замовчуванням) значеннями для поточної групи опцій" -#: src/slic3r/GUI/Tab.cpp:3030 +#: src/slic3r/GUI/Tab.cpp:3762 msgid "" "UNLOCKED LOCK icon indicates that some settings were changed and are not " -"equal to the system values for the current option group.\n" -"Click to reset all settings for current option group to the system values." +"equal to the system (or default) values for the current option group.\n" +"Click to reset all settings for current option group to the system (or " +"default) values." msgstr "" +"Значок \"ВІДКРИТИЙ ЗАМОК\" вказує на те, що деякі параметри були змінені і " +"не дорівнюють системним (або за замовчуванням) значенням для поточної групи " +"опцій.\n" +"Клацніть, щоб скинути всі налаштування для поточної групи опцій до системних " +"значень (або за замовчуванням)." -#: src/slic3r/GUI/Tab.cpp:3033 -msgid "WHITE BULLET icon indicates a non system preset." +#: src/slic3r/GUI/Tab.cpp:3765 +msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "" +"Значок \"БІЛА КУЛЯ\" вказує на несистемний (або не за замовчуванням) пресет." -#: src/slic3r/GUI/Tab.cpp:3036 +#: src/slic3r/GUI/Tab.cpp:3768 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." msgstr "" +"Значок \"БІЛА КУЛЯ\" вказує на те, що параметри збігаються тими, які є в " +"останньому збереженому пресеті для поточної групи опцій." -#: src/slic3r/GUI/Tab.cpp:3038 +#: src/slic3r/GUI/Tab.cpp:3770 msgid "" "BACK ARROW icon indicates that the settings were changed and are not equal " "to the last saved preset for the current option group.\n" "Click to reset all settings for the current option group to the last saved " "preset." msgstr "" +"Значок \"СТРІЛКА НАЗАД\" вказує на те, що параметри були змінені і не " +"дорівнюють останньому збереженому пресету для поточної групи параметрів.\n" +"Клацніть, щоб скинути всі параметри для поточної групи параметрів до " +"останнього збереженого пресету." -#: src/slic3r/GUI/Tab.cpp:3044 +#: src/slic3r/GUI/Tab.cpp:3776 msgid "" -"LOCKED LOCK icon indicates that the value is the same as the system value." +"LOCKED LOCK icon indicates that the value is the same as the system (or " +"default) value." msgstr "" +"Значок \"ЗАКРИТИЙ ЗАМОК\" вказує на те, що значення збігається із системним " +"(або за замовчуванням)." -#: src/slic3r/GUI/Tab.cpp:3045 +#: src/slic3r/GUI/Tab.cpp:3777 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " -"the system value.\n" -"Click to reset current value to the system value." +"the system (or default) value.\n" +"Click to reset current value to the system (or default) value." msgstr "" +"Значок \"ВІДКРИТИЙ ЗАМОК\" вказує на те, що значення було змінено і не " +"дорівнює системному (або за замовчуванням) значенню.\n" +"Клацніть, щоб скинути поточне значення до системного (або за замовчуванням)." -#: src/slic3r/GUI/Tab.cpp:3051 +#: src/slic3r/GUI/Tab.cpp:3783 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." msgstr "" +"Значок \"БІЛА КУЛЯ\" вказує на те, що значення збігається з значенням " +"збереженого пресету." -#: src/slic3r/GUI/Tab.cpp:3052 +#: src/slic3r/GUI/Tab.cpp:3784 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" "Click to reset current value to the last saved preset." msgstr "" +"Значок \"СТРІЛКА НАЗАД\" вказує на те, що значення було змінено і не " +"дорівнює останньому збереженому пресету.\n" +"Клацніть, щоб скинути поточне значення до останнього збереженого пресету." -#: src/slic3r/GUI/Tab.cpp:3152 -msgid " as:" -msgstr " як:" +#: src/slic3r/GUI/Tab.cpp:3928 src/slic3r/GUI/Tab.cpp:3930 +msgid "Material" +msgstr "Матеріал" -#: src/slic3r/GUI/Tab.cpp:3196 -msgid "the following postfix are not allowed:" -msgstr "" +#: src/slic3r/GUI/Tab.cpp:4052 +msgid "Support head" +msgstr "Головка підтримки" -#: src/slic3r/GUI/Tab.cpp:3200 -msgid "The supplied name is not available." -msgstr "Надане ім'я недійсне." +#: src/slic3r/GUI/Tab.cpp:4057 +msgid "Support pillar" +msgstr "Стовп підтримки" -#: src/slic3r/GUI/Tab.cpp:3213 -msgid "Material" -msgstr "" +#: src/slic3r/GUI/Tab.cpp:4080 +msgid "Connection of the support sticks and junctions" +msgstr "З'єднання опорних стовпів і стиків" -#: src/slic3r/GUI/Tab.cpp:3215 src/slic3r/GUI/Tab.cpp:3305 -msgid "Layers" -msgstr "Шари" +#: src/slic3r/GUI/Tab.cpp:4085 +msgid "Automatic generation" +msgstr "Автоматичне згенерування" -#: src/slic3r/GUI/Tab.cpp:3219 -msgid "Exposure" +#: src/slic3r/GUI/Tab.cpp:4159 +msgid "" +"\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" +"To enable \"%1%\", please switch off \"%2%\"" msgstr "" +"\"%1%\" вимкнено, оскільки в категорії \"%3%\" увімкнено \"%2%\".\n" +"Щоб увімкнути \"%1%\", вимкніть \"%2%\"" -#: src/slic3r/GUI/Tab.cpp:3313 -msgid "Support head" -msgstr "" +#: src/slic3r/GUI/Tab.cpp:4161 src/libslic3r/PrintConfig.cpp:3002 +msgid "Object elevation" +msgstr "Підняття об’єкта" + +#: src/slic3r/GUI/Tab.cpp:4161 src/libslic3r/PrintConfig.cpp:3104 +msgid "Pad around object" +msgstr "Подушка навколо об’єкта" + +#: src/slic3r/GUI/Tab.hpp:370 src/slic3r/GUI/Tab.hpp:492 +msgid "Print Settings" +msgstr "Параметри друку" + +#: src/slic3r/GUI/Tab.hpp:401 +msgid "Filament Settings" +msgstr "Параметри філаменту" + +#: src/slic3r/GUI/Tab.hpp:442 +msgid "Printer Settings" +msgstr "Параметри принтеру" + +#: src/slic3r/GUI/Tab.hpp:476 +msgid "Material Settings" +msgstr "Параметри матеріалу" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:149 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:158 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:857 +msgid "Undef" +msgstr "Невизначений" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:537 +msgid "PrusaSlicer is closing: Unsaved Changes" +msgstr "PrusaSlicer закривається: Незбережені зміни" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:554 +msgid "Switching Presets: Unsaved Changes" +msgstr "Перемикання пресетів: незбережені зміни" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:620 +msgid "Old Value" +msgstr "Старе значення" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:621 +msgid "New Value" +msgstr "Нове значення" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:652 +msgid "Transfer" +msgstr "Перенести" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:653 +msgid "Discard" +msgstr "Відхилити" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:654 +msgid "Save" +msgstr "Зберегти" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:674 +msgid "PrusaSlicer will remember your action." +msgstr "PrusaSlicer запам'ятає ваші дії." -#: src/slic3r/GUI/Tab.cpp:3318 -msgid "Support pillar" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:676 +msgid "" +"You will not be asked about the unsaved changes the next time you close " +"PrusaSlicer." msgstr "" +"Наступного разу, коли ви закриватимете PrusaSlicer, вас не питатимуть про " +"незбережені зміни." -#: src/slic3r/GUI/Tab.cpp:3328 -msgid "Connection of the support sticks and junctions" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:677 +msgid "" +"You will not be asked about the unsaved changes the next time you switch a " +"preset." msgstr "" +"Наступного разу, коли ви переключите пресет, вас не питатимуть про " +"незбережені зміни." -#: src/slic3r/GUI/Tab.cpp:3333 -msgid "Automatic generation" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:678 +msgid "" +"Visit \"Preferences\" and check \"%1%\"\n" +"to be asked about unsaved changes again." msgstr "" +"Відвідайте \"Преференції\" та встановіть прапорець \"%1%\"\n" +"щоб знову запитати про незбережені зміни." -#: src/slic3r/GUI/Tab.cpp:3395 -msgid "Head penetration should not be greater than the head width." -msgstr "" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:680 +msgid "PrusaSlicer: Don't ask me again" +msgstr "PrusaSlicer: Не питай мене більше" -#: src/slic3r/GUI/Tab.cpp:3396 -msgid "Invalid Head penetration" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:747 +msgid "" +"Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" +"Деякі поля занадто довгі, щоб вміститися у чарунку. Клацніть правою кнопкою " +"миші, щоб відкрити повний текст." -#: src/slic3r/GUI/Tab.cpp:3408 -msgid "Pinhead diameter should be smaller than the pillar diameter." -msgstr "" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:749 +msgid "All settings changes will be discarded." +msgstr "Усі зміни параметрів буде відхилено." -#: src/slic3r/GUI/Tab.cpp:3409 -msgid "Invalid pinhead diameter" -msgstr "" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:752 +msgid "Save the selected options." +msgstr "Зберегти вибрані параметри." -#: src/slic3r/GUI/Tab.hpp:307 src/slic3r/GUI/Tab.hpp:395 -msgid "Print Settings" -msgstr "Параметри друку" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:752 +msgid "Transfer the selected settings to the newly selected preset." +msgstr "Перенести вибрані параметри до нещодавно вибраного пресету." -#: src/slic3r/GUI/Tab.hpp:325 -msgid "Filament Settings" -msgstr "Параметри філаменту" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:756 +msgid "Save the selected options to preset \"%1%\"." +msgstr "Зберегти вибрані параметри до пресету \"%1%\"." -#: src/slic3r/GUI/Tab.hpp:358 -msgid "Printer Settings" -msgstr "Параметри принтеру" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:757 +msgid "Transfer the selected options to the newly selected preset \"%1%\"." +msgstr "Перенести вибрані параметри до нещодавно вибраного пресету \"%1%\"." -#: src/slic3r/GUI/Tab.hpp:381 -msgid "Material Settings" -msgstr "" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1019 +msgid "The following presets were modified:" +msgstr "Наступні пресети були змінені :" -#: src/slic3r/GUI/Tab.hpp:407 -msgid "Save preset" -msgstr "Зберегти налаштування" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1024 +msgid "Preset \"%1%\" has the following unsaved changes:" +msgstr "Пресет \"%1%\" має такі незбережені зміни:" -#: src/slic3r/GUI/UpdateDialogs.cpp:29 -msgid "Update available" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1028 +msgid "" +"Preset \"%1%\" is not compatible with the new printer profile and it has the " +"following unsaved changes:" msgstr "" +"Пресет \"%1%\" несумісний з новим профілем принтера, і він має такі " +"незбережені зміни:" -#: src/slic3r/GUI/UpdateDialogs.cpp:29 -msgid "New version of Slic3r PE is available" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1029 +msgid "" +"Preset \"%1%\" is not compatible with the new print profile and it has the " +"following unsaved changes:" msgstr "" +"Пресет \"%1%\" несумісний з новим профілем друку, і він має такі незбережені " +"зміни:" -#: src/slic3r/GUI/UpdateDialogs.cpp:36 -msgid "To download, follow the link below." -msgstr "" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1075 +msgid "Extruders count" +msgstr "Кількість екструдерів" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1197 +msgid "Old value" +msgstr "Нове значення" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1198 +msgid "New value" +msgstr "Нове значення" + +#: src/slic3r/GUI/UpdateDialogs.cpp:38 +msgid "Update available" +msgstr "Доступне оновлення" + +#: src/slic3r/GUI/UpdateDialogs.cpp:38 +#, c-format +msgid "New version of %s is available" +msgstr "Доступна нова версія %s" -#: src/slic3r/GUI/UpdateDialogs.cpp:44 +#: src/slic3r/GUI/UpdateDialogs.cpp:43 msgid "Current version:" -msgstr "" +msgstr "Поточна версія:" -#: src/slic3r/GUI/UpdateDialogs.cpp:46 +#: src/slic3r/GUI/UpdateDialogs.cpp:45 msgid "New version:" -msgstr "" +msgstr "Нова версія:" + +#: src/slic3r/GUI/UpdateDialogs.cpp:53 +msgid "Changelog && Download" +msgstr "Журнал змін і завантаження" + +#: src/slic3r/GUI/UpdateDialogs.cpp:60 src/slic3r/GUI/UpdateDialogs.cpp:125 +#: src/slic3r/GUI/UpdateDialogs.cpp:183 +msgid "Open changelog page" +msgstr "Відкрийте сторінку журналу змін" + +#: src/slic3r/GUI/UpdateDialogs.cpp:65 +msgid "Open download page" +msgstr "Відкрити сторінку завантаження" -#: src/slic3r/GUI/UpdateDialogs.cpp:54 +#: src/slic3r/GUI/UpdateDialogs.cpp:71 msgid "Don't notify about new releases any more" -msgstr "" +msgstr "Більше не сповіщати про нові випуски" -#: src/slic3r/GUI/UpdateDialogs.cpp:72 src/slic3r/GUI/UpdateDialogs.cpp:164 +#: src/slic3r/GUI/UpdateDialogs.cpp:89 src/slic3r/GUI/UpdateDialogs.cpp:266 msgid "Configuration update" -msgstr "" +msgstr "Оновлення конфігурації" -#: src/slic3r/GUI/UpdateDialogs.cpp:72 +#: src/slic3r/GUI/UpdateDialogs.cpp:89 msgid "Configuration update is available" -msgstr "" +msgstr "Доступне оновлення конфігурації" -#: src/slic3r/GUI/UpdateDialogs.cpp:75 +#: src/slic3r/GUI/UpdateDialogs.cpp:92 msgid "" "Would you like to install it?\n" "\n" @@ -3829,48 +7894,91 @@ msgid "" "\n" "Updated configuration bundles:" msgstr "" +"Ви хотіли б його встановити?\n" +"\n" +"Зверніть увагу, що спочатку буде створено повний знімок конфігурації. Потім " +"його можна відновити в будь-який час, у випадку проблем з новою версією.\n" +"\n" +"Оновлені пакети конфігурації:" -#: src/slic3r/GUI/UpdateDialogs.cpp:111 -msgid "Slic3r incompatibility" -msgstr "" +#: src/slic3r/GUI/UpdateDialogs.cpp:113 src/slic3r/GUI/UpdateDialogs.cpp:173 +msgid "Comment:" +msgstr "Коментар:" -#: src/slic3r/GUI/UpdateDialogs.cpp:111 -msgid "Slic3r configuration is incompatible" -msgstr "" +#: src/slic3r/GUI/UpdateDialogs.cpp:148 src/slic3r/GUI/UpdateDialogs.cpp:210 +#, c-format +msgid "%s incompatibility" +msgstr "Несумісність з %s" -#: src/slic3r/GUI/UpdateDialogs.cpp:114 +#: src/slic3r/GUI/UpdateDialogs.cpp:148 +msgid "You must install a configuration update." +msgstr "Потрібно встановити оновлення конфігурації." + +#: src/slic3r/GUI/UpdateDialogs.cpp:151 +#, c-format msgid "" -"This version of Slic3r PE is not compatible with currently installed " -"configuration bundles.\n" -"This probably happened as a result of running an older Slic3r PE after using " -"a newer one.\n" +"%s will now start updates. Otherwise it won't be able to start.\n" +"\n" +"Note that a full configuration snapshot will be created first. It can then " +"be restored at any time should there be a problem with the new version.\n" "\n" -"You may either exit Slic3r and try again with a newer version, or you may re-" -"run the initial configuration. Doing so will create a backup snapshot of the " -"existing configuration before installing files compatible with this Slic3r.\n" +"Updated configuration bundles:" msgstr "" +"Зараз %s розпочне оновлення. Інакше він не зможе запуститися.\n" +"\n" +"Зверніть увагу, що спочатку буде створено повний знімок конфігурації. Потім " +"його можна буде відновити в будь-який час, якщо виникне проблема з новою " +"версією.\n" +"\n" +"Оновлені пакети конфігурації:" -#: src/slic3r/GUI/UpdateDialogs.cpp:123 +#: src/slic3r/GUI/UpdateDialogs.cpp:191 src/slic3r/GUI/UpdateDialogs.cpp:246 #, c-format -msgid "This Slic3r PE version: %s" -msgstr "" +msgid "Exit %s" +msgstr "Вихід %s" -#: src/slic3r/GUI/UpdateDialogs.cpp:128 -msgid "Incompatible bundles:" -msgstr "" +#: src/slic3r/GUI/UpdateDialogs.cpp:211 +#, c-format +msgid "%s configuration is incompatible" +msgstr "конфігурація %s є несумісна" -#: src/slic3r/GUI/UpdateDialogs.cpp:144 -msgid "Exit Slic3r" +#: src/slic3r/GUI/UpdateDialogs.cpp:216 +#, c-format +msgid "" +"This version of %s is not compatible with currently installed configuration " +"bundles.\n" +"This probably happened as a result of running an older %s after using a " +"newer one.\n" +"\n" +"You may either exit %s and try again with a newer version, or you may re-run " +"the initial configuration. Doing so will create a backup snapshot of the " +"existing configuration before installing files compatible with this %s." msgstr "" +"Ця версія %s не сумісна з встановленими на сьогодні пакетами конфігурації.\n" +"Можливо, це сталося в результаті запуску старішого %s після використання " +"нового.\n" +"\n" +"Ви можете вийти зі %s і спробувати ще раз із новою версією, або повторно " +"запустити початкову конфігурацію. Це створить резервний знімок існуючої " +"конфігурації перед встановленням файлів, сумісних із цим %s." -#: src/slic3r/GUI/UpdateDialogs.cpp:147 +#: src/slic3r/GUI/UpdateDialogs.cpp:225 +#, c-format +msgid "This %s version: %s" +msgstr "%s версії %s" + +#: src/slic3r/GUI/UpdateDialogs.cpp:230 +msgid "Incompatible bundles:" +msgstr "Несумісні комплекти:" + +#: src/slic3r/GUI/UpdateDialogs.cpp:249 msgid "Re-configure" -msgstr "" +msgstr "Пере-налаштувати" -#: src/slic3r/GUI/UpdateDialogs.cpp:168 +#: src/slic3r/GUI/UpdateDialogs.cpp:270 #, c-format msgid "" -"Slic3r PE now uses an updated configuration structure.\n" +"%s now uses an updated configuration structure.\n" "\n" "So called 'System presets' have been introduced, which hold the built-in " "default settings for various printers. These System presets cannot be " @@ -3882,16 +7990,40 @@ msgid "" "Please proceed with the %s that follows to set up the new presets and to " "choose whether to enable automatic preset updates." msgstr "" +"%s тепер використовує оновлену структуру конфігурації.\n" +"\n" +"Були введені так звані \"системні пресети\", які містять вбудовані " +"налаштування за замовчуванням для різних принтерів. Ці системні пресети не " +"можуть бути змінені, натомість користувачі тепер можуть створювати власні " +"пресети, успадковуючи налаштування з одного із системних пресетів.\n" +"Спадковий пресет може успадкувати певне значення від свого батька або " +"замінити його своїм власним значенням.\n" +"\n" +"Будь ласка, перейдіть до %s, щоб налаштувати нові пресети та вибрати, чи " +"вмикати їх автоматичне оновлення." -#: src/slic3r/GUI/UpdateDialogs.cpp:184 +#: src/slic3r/GUI/UpdateDialogs.cpp:287 msgid "For more information please visit our wiki page:" -msgstr "" +msgstr "Для отримання додаткової інформації відвідайте нашу wiki-сторінку:" -#: src/slic3r/GUI/WipeTowerDialog.cpp:14 +#: src/slic3r/GUI/UpdateDialogs.cpp:304 +msgid "Configuration updates" +msgstr "Оновлення конфігурацій" + +#: src/slic3r/GUI/UpdateDialogs.cpp:304 +msgid "No updates available" +msgstr "Немає оновлень" + +#: src/slic3r/GUI/UpdateDialogs.cpp:309 +#, c-format +msgid "%s has no configuration updates available." +msgstr "%s не має оновлень конфігурації." + +#: src/slic3r/GUI/WipeTowerDialog.cpp:15 msgid "Ramming customization" -msgstr "" +msgstr "Налаштування раммінгу" -#: src/slic3r/GUI/WipeTowerDialog.cpp:40 +#: src/slic3r/GUI/WipeTowerDialog.cpp:41 msgid "" "Ramming denotes the rapid extrusion just before a tool change in a single-" "extruder MM printer. Its purpose is to properly shape the end of the " @@ -3903,576 +8035,835 @@ msgid "" "This is an expert-level setting, incorrect adjustment will likely lead to " "jams, extruder wheel grinding into filament etc." msgstr "" +"Раммінг означає швидке екструдування безпосередньо перед заміною інструменту " +"в одно-екструдерному принтері ММ. Його мета полягає у правильній формі кінця " +"виведеного філаменту, щоб вона не заважала вставці нового філаменту і може " +"бути знову встановлений пізніше. Ця фаза є важливою, і різні матеріали " +"можуть вимагати різної швидкості екструзії для отримання гарної форми. З " +"цієї причини швидкість екструдування під час раммінгу регулюється.\n" +"\n" +"Це налаштування на рівні експерта, неправильне регулювання, ймовірно, " +"призведе до заклинювання, подрібнення екструдерного колеса до філаменту тощо." -#: src/slic3r/GUI/WipeTowerDialog.cpp:82 +#: src/slic3r/GUI/WipeTowerDialog.cpp:83 msgid "Total ramming time" -msgstr "" +msgstr "Загальний час швидкої екструзії" -#: src/slic3r/GUI/WipeTowerDialog.cpp:84 +#: src/slic3r/GUI/WipeTowerDialog.cpp:85 msgid "Total rammed volume" -msgstr "" +msgstr "Загальний обсяг швидкої екструзії" -#: src/slic3r/GUI/WipeTowerDialog.cpp:88 +#: src/slic3r/GUI/WipeTowerDialog.cpp:89 msgid "Ramming line width" -msgstr "" +msgstr "Ширина ліній раммінгу" -#: src/slic3r/GUI/WipeTowerDialog.cpp:90 +#: src/slic3r/GUI/WipeTowerDialog.cpp:91 msgid "Ramming line spacing" -msgstr "" +msgstr "Проміжки між лініями раммінгу" -#: src/slic3r/GUI/WipeTowerDialog.cpp:141 +#: src/slic3r/GUI/WipeTowerDialog.cpp:142 msgid "Wipe tower - Purging volume adjustment" -msgstr "" +msgstr "Вежа витирання - Регулювання об'єму продувки" -#: src/slic3r/GUI/WipeTowerDialog.cpp:225 +#: src/slic3r/GUI/WipeTowerDialog.cpp:254 msgid "" "Here you can adjust required purging volume (mm³) for any given pair of " "tools." msgstr "" +"Тут ви можете відрегулювати необхідний об'єм витирання (мм³) для будь-якої " +"пари інструментів." -#: src/slic3r/GUI/WipeTowerDialog.cpp:226 +#: src/slic3r/GUI/WipeTowerDialog.cpp:255 msgid "Extruder changed to" -msgstr "" +msgstr "Екструдер змінено на" -#: src/slic3r/GUI/WipeTowerDialog.cpp:234 +#: src/slic3r/GUI/WipeTowerDialog.cpp:263 msgid "unloaded" -msgstr "" +msgstr "виведено" -#: src/slic3r/GUI/WipeTowerDialog.cpp:235 +#: src/slic3r/GUI/WipeTowerDialog.cpp:264 msgid "loaded" -msgstr "" +msgstr "заведено" -#: src/slic3r/GUI/WipeTowerDialog.cpp:240 +#: src/slic3r/GUI/WipeTowerDialog.cpp:276 msgid "Tool #" -msgstr "" +msgstr "Інструмент №" -#: src/slic3r/GUI/WipeTowerDialog.cpp:247 +#: src/slic3r/GUI/WipeTowerDialog.cpp:285 msgid "" "Total purging volume is calculated by summing two values below, depending on " "which tools are loaded/unloaded." msgstr "" +"Загальний об'єм витирання обчислюється шляхом підсумовування двох значень " +"нижче, залежно від того, який інструмент заведено/виведено." -#: src/slic3r/GUI/WipeTowerDialog.cpp:248 +#: src/slic3r/GUI/WipeTowerDialog.cpp:286 msgid "Volume to purge (mm³) when the filament is being" -msgstr "" +msgstr "Об'єм для витирання (мм³) при наявності філаменту" -#: src/slic3r/GUI/WipeTowerDialog.cpp:262 +#: src/slic3r/GUI/WipeTowerDialog.cpp:300 msgid "From" -msgstr "" +msgstr "Від" -#: src/slic3r/GUI/WipeTowerDialog.cpp:327 +#: src/slic3r/GUI/WipeTowerDialog.cpp:365 msgid "" "Switching to simple settings will discard changes done in the advanced " "mode!\n" "\n" "Do you want to proceed?" msgstr "" +"Перехід в простий режим налаштувань призведе до скасування змін, здійснених " +"у розширеному режимі!\n" +"\n" +"Хочете продовжити?" -#: src/slic3r/GUI/WipeTowerDialog.cpp:339 +#: src/slic3r/GUI/WipeTowerDialog.cpp:377 msgid "Show simplified settings" -msgstr "" +msgstr "Показати спрощені налаштування" -#: src/slic3r/GUI/WipeTowerDialog.cpp:339 +#: src/slic3r/GUI/WipeTowerDialog.cpp:377 msgid "Show advanced settings" -msgstr "" +msgstr "Показати розширені налаштування" -#: src/slic3r/GUI/wxExtensions.cpp:2398 +#: src/slic3r/GUI/wxExtensions.cpp:627 #, c-format msgid "Switch to the %s mode" msgstr "Перейти до режиму %s" -#: src/slic3r/GUI/wxExtensions.cpp:2399 +#: src/slic3r/GUI/wxExtensions.cpp:628 #, c-format msgid "Current mode is %s" msgstr "Поточний режим - %s" -#: src/slic3r/Utils/Duet.cpp:51 -msgid "Connection to Duet works correctly." -msgstr "" - -#: src/slic3r/Utils/Duet.cpp:56 -msgid "Could not connect to Duet" -msgstr "" - -#: src/slic3r/Utils/Duet.cpp:84 src/slic3r/Utils/Duet.cpp:154 -msgid "Unknown error occured" -msgstr "" - -#: src/slic3r/Utils/Duet.cpp:148 -msgid "Wrong password" -msgstr "" - -#: src/slic3r/Utils/Duet.cpp:151 -msgid "Could not get resources to create a new connection" -msgstr "" - -#: src/slic3r/Utils/OctoPrint.cpp:69 +#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:68 #, c-format msgid "Mismatched type of print host: %s" -msgstr "" +msgstr "Несумісний тип хосту друку: %s" -#: src/slic3r/Utils/OctoPrint.cpp:84 -msgid "Connection to OctoPrint works correctly." +#: src/slic3r/Utils/AstroBox.cpp:84 +msgid "Connection to AstroBox works correctly." msgstr "Підключення до OctoPrint працює правильно." -#: src/slic3r/Utils/OctoPrint.cpp:90 -msgid "Could not connect to OctoPrint" -msgstr "" +#: src/slic3r/Utils/AstroBox.cpp:90 +msgid "Could not connect to AstroBox" +msgstr "Не можливо підключитися до AstroBox" -#: src/slic3r/Utils/OctoPrint.cpp:90 -msgid "Note: OctoPrint version at least 1.1.0 is required." -msgstr "" +#: src/slic3r/Utils/AstroBox.cpp:92 +msgid "Note: AstroBox version at least 1.1.0 is required." +msgstr "Примітка: Потрібна версія AstroBox принаймні 1.1.0." -#: src/slic3r/Utils/OctoPrint.cpp:195 -msgid "Connection to Prusa SLA works correctly." -msgstr "" +#: src/slic3r/Utils/Duet.cpp:47 +msgid "Connection to Duet works correctly." +msgstr "Підключення до Duet працює правильно." -#: src/slic3r/Utils/OctoPrint.cpp:200 -msgid "Could not connect to Prusa SLA" -msgstr "" +#: src/slic3r/Utils/Duet.cpp:53 +msgid "Could not connect to Duet" +msgstr "Не можливо підключитися до Duet" -#: src/slic3r/Utils/PresetUpdater.cpp:583 -#, c-format -msgid "requires min. %s and max. %s" -msgstr "" +#: src/slic3r/Utils/Duet.cpp:88 src/slic3r/Utils/Duet.cpp:151 +#: src/slic3r/Utils/FlashAir.cpp:122 src/slic3r/Utils/FlashAir.cpp:143 +#: src/slic3r/Utils/FlashAir.cpp:159 +msgid "Unknown error occured" +msgstr "Сталася невідома помилка" -#: src/slic3r/Utils/PresetUpdater.cpp:588 -#, c-format -msgid "requires min. %s" -msgstr "" +#: src/slic3r/Utils/Duet.cpp:145 +msgid "Wrong password" +msgstr "Неправильний пароль" -#: src/slic3r/Utils/PresetUpdater.cpp:590 -#, c-format -msgid "requires max. %s" -msgstr "" +#: src/slic3r/Utils/Duet.cpp:148 +msgid "Could not get resources to create a new connection" +msgstr "Не вдалося отримати ресурси для створення нового з’єднання" #: src/slic3r/Utils/FixModelByWin10.cpp:219 #: src/slic3r/Utils/FixModelByWin10.cpp:359 msgid "Exporting source model" -msgstr "" +msgstr "Експортування вихідної моделі" #: src/slic3r/Utils/FixModelByWin10.cpp:235 msgid "Failed loading the input model." -msgstr "" +msgstr "Помилка завантаження вхідної моделі." #: src/slic3r/Utils/FixModelByWin10.cpp:242 msgid "Repairing model by the Netfabb service" -msgstr "" +msgstr "Відновлення моделі службою Netfabb" #: src/slic3r/Utils/FixModelByWin10.cpp:248 msgid "Mesh repair failed." -msgstr "" +msgstr "Не вдалося відновити сітку." #: src/slic3r/Utils/FixModelByWin10.cpp:251 #: src/slic3r/Utils/FixModelByWin10.cpp:378 msgid "Loading repaired model" -msgstr "" +msgstr "Завантаження відремонтованої моделі" #: src/slic3r/Utils/FixModelByWin10.cpp:263 #: src/slic3r/Utils/FixModelByWin10.cpp:270 #: src/slic3r/Utils/FixModelByWin10.cpp:302 msgid "Saving mesh into the 3MF container failed." -msgstr "" +msgstr "Не вдалося зберегти сітку в контейнері 3MF." #: src/slic3r/Utils/FixModelByWin10.cpp:340 msgid "Model fixing" -msgstr "" +msgstr "Ремонт моделі" #: src/slic3r/Utils/FixModelByWin10.cpp:341 -msgid "Exporting model..." -msgstr "" +msgid "Exporting model" +msgstr "Експортування моделі" #: src/slic3r/Utils/FixModelByWin10.cpp:368 msgid "Export of a temporary 3mf file failed" -msgstr "" +msgstr "Не вдалося експортувати тимчасовий 3MF-файл" #: src/slic3r/Utils/FixModelByWin10.cpp:383 msgid "Import of the repaired 3mf file failed" -msgstr "" +msgstr "Не вдалося імпортувати відновлений 3MF-файл" #: src/slic3r/Utils/FixModelByWin10.cpp:385 msgid "Repaired 3MF file does not contain any object" -msgstr "" +msgstr "Відновлений 3MF-файл не містить жодного об'єкта" #: src/slic3r/Utils/FixModelByWin10.cpp:387 msgid "Repaired 3MF file contains more than one object" -msgstr "" +msgstr "Відновлений 3MF-файл містить більше одного об'єкта" #: src/slic3r/Utils/FixModelByWin10.cpp:389 msgid "Repaired 3MF file does not contain any volume" -msgstr "" +msgstr "Відновлений 3MF-файл не містить жодної часті" #: src/slic3r/Utils/FixModelByWin10.cpp:391 msgid "Repaired 3MF file contains more than one volume" -msgstr "" +msgstr "Відновлений 3MF-файл містить більше однієї часті" #: src/slic3r/Utils/FixModelByWin10.cpp:400 msgid "Model repair finished" -msgstr "" +msgstr "Ремонт моделі завершено" #: src/slic3r/Utils/FixModelByWin10.cpp:406 msgid "Model repair canceled" -msgstr "" +msgstr "Ремонт моделі скасовано" #: src/slic3r/Utils/FixModelByWin10.cpp:423 msgid "Model repaired successfully" -msgstr "" +msgstr "Модель успішно відремонтована" #: src/slic3r/Utils/FixModelByWin10.cpp:423 #: src/slic3r/Utils/FixModelByWin10.cpp:426 msgid "Model Repair by the Netfabb service" -msgstr "" +msgstr "Ремонт моделі сервісом Netfabb" #: src/slic3r/Utils/FixModelByWin10.cpp:426 -msgid "Model repair failed: \n" +msgid "Model repair failed:" +msgstr "Не вдалося відремонтувати модель:" + +#: src/slic3r/Utils/FlashAir.cpp:58 +msgid "Upload not enabled on FlashAir card." +msgstr "Завантаження не ввімкнено на картці FlashAir." + +#: src/slic3r/Utils/FlashAir.cpp:68 +msgid "Connection to FlashAir works correctly and upload is enabled." +msgstr "Підключення до FlashAir працює правильно, і завантаження ввімкнено." + +#: src/slic3r/Utils/FlashAir.cpp:74 +msgid "Could not connect to FlashAir" +msgstr "Не можливо підключитися до FlashAir" + +#: src/slic3r/Utils/FlashAir.cpp:76 +msgid "" +"Note: FlashAir with firmware 2.00.02 or newer and activated upload function " +"is required." msgstr "" +"Примітка: Потрібна FlashAir із прошивкою 2.00.02 або новішою та активованою " +"функцією завантаження." -#: src/libslic3r/Zipper.cpp:35 -msgid "undefined error" +#: src/slic3r/Utils/OctoPrint.cpp:83 +msgid "Connection to OctoPrint works correctly." +msgstr "Підключення до OctoPrint працює правильно." + +#: src/slic3r/Utils/OctoPrint.cpp:89 +msgid "Could not connect to OctoPrint" +msgstr "Не можливо підключитися до OctoPrint" + +#: src/slic3r/Utils/OctoPrint.cpp:91 +msgid "Note: OctoPrint version at least 1.1.0 is required." +msgstr "Зауважте: Необхідна версія OctoPrint - принаймні 1.1.0." + +#: src/slic3r/Utils/OctoPrint.cpp:185 +msgid "Connection to Prusa SL1 works correctly." +msgstr "Підключення до Prusa SL1 працює правильно." + +#: src/slic3r/Utils/OctoPrint.cpp:191 +msgid "Could not connect to Prusa SLA" +msgstr "Не можливо підключитися до Prusa SLA" + +#: src/slic3r/Utils/PresetUpdater.cpp:727 +#, c-format +msgid "requires min. %s and max. %s" +msgstr "вимагається мін. %s та макс. %s" + +#: src/slic3r/Utils/PresetUpdater.cpp:731 +#, c-format +msgid "requires min. %s" +msgstr "вимагається мін. %s" + +#: src/slic3r/Utils/PresetUpdater.cpp:734 +#, c-format +msgid "requires max. %s" +msgstr "вимагається макс. %s" + +#: src/slic3r/Utils/Http.cpp:73 +msgid "" +"Could not detect system SSL certificate store. PrusaSlicer will be unable to " +"establish secure network connections." msgstr "" +"Не вдалося виявити системе сховище SSL сертифікатів. PrusaSlicer не зможе " +"встановити безпечні мережеві з'єднання." -#: src/libslic3r/Zipper.cpp:37 -msgid "too many files" +#: src/slic3r/Utils/Http.cpp:78 +msgid "PrusaSlicer detected system SSL certificate store in: %1%" +msgstr "PrusaSlicer виявив системне сховище сертифікатів SSL у: %1%" + +#: src/slic3r/Utils/Http.cpp:82 +msgid "" +"To specify the system certificate store manually, please set the %1% " +"environment variable to the correct CA bundle and restart the application." msgstr "" +"Щоб вказати системне сховище сертифікатів вручну, встановіть змінну " +"середовища %1% на правильний пакет CA і перезапустіть програму." -#: src/libslic3r/Zipper.cpp:39 -msgid "file too large" +#: src/slic3r/Utils/Http.cpp:91 +msgid "" +"CURL init has failed. PrusaSlicer will be unable to establish network " +"connections. See logs for additional details." msgstr "" +"Curl init зазнав невдачі. PrusaSlicer не зможе встановити мережні " +"підключення. Додаткові відомості див." -#: src/libslic3r/Zipper.cpp:41 -msgid "unsupported method" +#: src/slic3r/Utils/Process.cpp:151 +msgid "Open G-code file:" +msgstr "Відкрити файл G-кода:" + +#: src/libslic3r/GCode.cpp:518 +msgid "There is an object with no extrusions on the first layer." +msgstr "Виявлено об'єкт без екструзії на першому шарі." + +#: src/libslic3r/GCode.cpp:536 +msgid "Empty layers detected, the output would not be printable." +msgstr "Виявлено порожні шари, вихідні дані не можна надрукувати." + +#: src/libslic3r/GCode.cpp:537 +msgid "Print z" +msgstr "Друк на висоті" + +#: src/libslic3r/GCode.cpp:538 +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/Zipper.cpp:43 -msgid "unsupported encryption" +#: src/libslic3r/GCode.cpp:1261 +msgid "" +"Your print is very close to the priming regions. Make sure there is no " +"collision." msgstr "" +"Ваша модель для друку розташована дуже близький до основних областей. " +"Переконайтесь, що немає зіткнення." -#: src/libslic3r/Zipper.cpp:45 -msgid "unsupported feature" +#: src/libslic3r/ExtrusionEntity.cpp:324 src/libslic3r/ExtrusionEntity.cpp:360 +msgid "Mixed" +msgstr "Змішаний" + +#: src/libslic3r/Flow.cpp:61 +msgid "" +"Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible." msgstr "" +"Не вдається розрахувати ширину екструзії для %1%: Змінна \"%2%\" недоступна." + +#: src/libslic3r/Format/3mf.cpp:1668 +msgid "" +"The selected 3mf file has been saved with a newer version of %1% and is not " +"compatible." +msgstr "Вибраний 3MF-файл було збережено з новою версією %1% і не сумісний." + +#: src/libslic3r/Format/AMF.cpp:958 +msgid "" +"The selected amf file has been saved with a newer version of %1% and is not " +"compatible." +msgstr "Вибраний АMF-файл було збережено з новою версією %1% і не сумісний." + +#: src/libslic3r/miniz_extension.cpp:91 +msgid "undefined error" +msgstr "невизначена помилка" + +#: src/libslic3r/miniz_extension.cpp:93 +msgid "too many files" +msgstr "забагато файлів" + +#: src/libslic3r/miniz_extension.cpp:95 +msgid "file too large" +msgstr "файл занадто великий" + +#: src/libslic3r/miniz_extension.cpp:97 +msgid "unsupported method" +msgstr "непідтримуваний метод" + +#: src/libslic3r/miniz_extension.cpp:99 +msgid "unsupported encryption" +msgstr "непідтримуване шифрування" + +#: src/libslic3r/miniz_extension.cpp:101 +msgid "unsupported feature" +msgstr "непідтримувана функція" -#: src/libslic3r/Zipper.cpp:47 +#: src/libslic3r/miniz_extension.cpp:103 msgid "failed finding central directory" -msgstr "" +msgstr "не вдалося знайти центральний каталог" -#: src/libslic3r/Zipper.cpp:49 +#: src/libslic3r/miniz_extension.cpp:105 msgid "not a ZIP archive" -msgstr "" +msgstr "не ZIP-архів" -#: src/libslic3r/Zipper.cpp:51 +#: src/libslic3r/miniz_extension.cpp:107 msgid "invalid header or archive is corrupted" -msgstr "" +msgstr "недійсний заголовок або архів пошкоджено" -#: src/libslic3r/Zipper.cpp:53 +#: src/libslic3r/miniz_extension.cpp:109 msgid "unsupported multidisk archive" -msgstr "" +msgstr "непідтримуваний багатодисковий архів" -#: src/libslic3r/Zipper.cpp:55 +#: src/libslic3r/miniz_extension.cpp:111 msgid "decompression failed or archive is corrupted" -msgstr "" +msgstr "не вдалося розпакувати або архів пошкоджено" -#: src/libslic3r/Zipper.cpp:57 +#: src/libslic3r/miniz_extension.cpp:113 msgid "compression failed" -msgstr "" +msgstr "помилка компресії" -#: src/libslic3r/Zipper.cpp:59 +#: src/libslic3r/miniz_extension.cpp:115 msgid "unexpected decompressed size" -msgstr "" +msgstr "несподіваний розпакований розмір" -#: src/libslic3r/Zipper.cpp:61 +#: src/libslic3r/miniz_extension.cpp:117 msgid "CRC-32 check failed" -msgstr "" +msgstr "Помилка перевірки CRC-32" -#: src/libslic3r/Zipper.cpp:63 +#: src/libslic3r/miniz_extension.cpp:119 msgid "unsupported central directory size" -msgstr "" +msgstr "непідтримуваний розмір центрального каталогу" -#: src/libslic3r/Zipper.cpp:65 +#: src/libslic3r/miniz_extension.cpp:121 msgid "allocation failed" -msgstr "" +msgstr "розміщення не вдався" -#: src/libslic3r/Zipper.cpp:67 +#: src/libslic3r/miniz_extension.cpp:123 msgid "file open failed" -msgstr "" +msgstr "не вдалося відкрити файл" -#: src/libslic3r/Zipper.cpp:69 +#: src/libslic3r/miniz_extension.cpp:125 msgid "file create failed" -msgstr "" +msgstr "не вдалося створити файл" -#: src/libslic3r/Zipper.cpp:71 +#: src/libslic3r/miniz_extension.cpp:127 msgid "file write failed" -msgstr "" +msgstr "не вдалося записати файл" -#: src/libslic3r/Zipper.cpp:73 +#: src/libslic3r/miniz_extension.cpp:129 msgid "file read failed" -msgstr "" +msgstr "не вдалося прочитати файл" -#: src/libslic3r/Zipper.cpp:75 +#: src/libslic3r/miniz_extension.cpp:131 msgid "file close failed" -msgstr "" +msgstr "не вдалося закрити файл" -#: src/libslic3r/Zipper.cpp:77 +#: src/libslic3r/miniz_extension.cpp:133 msgid "file seek failed" -msgstr "" +msgstr "пошук файлу не вдався" -#: src/libslic3r/Zipper.cpp:79 +#: src/libslic3r/miniz_extension.cpp:135 msgid "file stat failed" -msgstr "" +msgstr "не вдалося відкрити STAT-файл" -#: src/libslic3r/Zipper.cpp:81 +#: src/libslic3r/miniz_extension.cpp:137 msgid "invalid parameter" -msgstr "" - -#: src/libslic3r/Zipper.cpp:83 -msgid "invalid filename" -msgstr "" - -#: src/libslic3r/Zipper.cpp:85 -msgid "buffer too small" -msgstr "" - -#: src/libslic3r/Zipper.cpp:87 -msgid "internal error" -msgstr "" - -#: src/libslic3r/Zipper.cpp:89 -msgid "file not found" -msgstr "" - -#: src/libslic3r/Zipper.cpp:91 -msgid "archive is too large" -msgstr "" - -#: src/libslic3r/Zipper.cpp:93 -msgid "validation failed" -msgstr "" - -#: src/libslic3r/Zipper.cpp:95 -msgid "write calledback failed" -msgstr "" +msgstr "некоректний параметр" -#: src/libslic3r/Zipper.cpp:105 -msgid "Error with zip archive" -msgstr "" - -#: src/libslic3r/SLA/SLASupportTree.cpp:2153 -msgid "Starting" -msgstr "" - -#: src/libslic3r/SLA/SLASupportTree.cpp:2154 -msgid "Filtering" -msgstr "" - -#: src/libslic3r/SLA/SLASupportTree.cpp:2155 -msgid "Generate pinheads" -msgstr "" +#: src/libslic3r/miniz_extension.cpp:139 +msgid "invalid filename" +msgstr "некоректне ім'я файлу" -#: src/libslic3r/SLA/SLASupportTree.cpp:2156 -msgid "Classification" -msgstr "" +#: src/libslic3r/miniz_extension.cpp:141 +msgid "buffer too small" +msgstr "занадто малий буфер" -#: src/libslic3r/SLA/SLASupportTree.cpp:2157 -msgid "Routing to ground" -msgstr "" +#: src/libslic3r/miniz_extension.cpp:143 +msgid "internal error" +msgstr "внутрішня помилка" -#: src/libslic3r/SLA/SLASupportTree.cpp:2158 -msgid "Routing supports to model surface" -msgstr "" +#: src/libslic3r/miniz_extension.cpp:145 +msgid "file not found" +msgstr "файл не знайдено" -#: src/libslic3r/SLA/SLASupportTree.cpp:2159 -msgid "Cascading pillars" -msgstr "" +#: src/libslic3r/miniz_extension.cpp:147 +msgid "archive is too large" +msgstr "архів завеликий" -#: src/libslic3r/SLA/SLASupportTree.cpp:2160 -msgid "Processing small holes" -msgstr "" +#: src/libslic3r/miniz_extension.cpp:149 +msgid "validation failed" +msgstr "не вдалося перевірити" -#: src/libslic3r/SLA/SLASupportTree.cpp:2161 -msgid "Done" -msgstr "" +#: src/libslic3r/miniz_extension.cpp:151 +msgid "write calledback failed" +msgstr "помилка запису зворотного виклику" -#: src/libslic3r/SLA/SLASupportTree.cpp:2162 -msgid "Abort" -msgstr "" +#: src/libslic3r/Preset.cpp:1299 +msgid "filament" +msgstr "філамент" -#: src/libslic3r/Print.cpp:1136 +#: src/libslic3r/Print.cpp:1251 msgid "All objects are outside of the print volume." -msgstr "" +msgstr "Усі об'єкти знаходяться поза просторем друку." -#: src/libslic3r/Print.cpp:1165 +#: src/libslic3r/Print.cpp:1254 +msgid "The supplied settings will cause an empty print." +msgstr "Надані параметри спричинять порожній друк." + +#: src/libslic3r/Print.cpp:1258 msgid "Some objects are too close; your extruder will collide with them." msgstr "" +"Деякі предмети розташовано занадто близько; ваш екструдер зіткнеться з ними." -#: src/libslic3r/Print.cpp:1180 +#: src/libslic3r/Print.cpp:1260 msgid "" "Some objects are too tall and cannot be printed without extruder collisions." msgstr "" +"Деякі предмети занадто високі, і їх неможливо надрукувати без зіткнення " +"екструдера." -#: src/libslic3r/Print.cpp:1190 -msgid "The Spiral Vase option can only be used when printing a single object." +#: src/libslic3r/Print.cpp:1269 +msgid "" +"Only a single object may be printed at a time in Spiral Vase mode. Either " +"remove all but the last object, or enable sequential mode by " +"\"complete_objects\"." msgstr "" +"Одночасно в режимі спіральної вази можна друкувати лише один об’єкт. Або " +"видаліть усі, крім останнього об'єкта, або ввімкніть послідовний режим за " +"допомогою \"повних об'єктів\" (\"complete_objects\")." -#: src/libslic3r/Print.cpp:1192 +#: src/libslic3r/Print.cpp:1277 msgid "" "The Spiral Vase option can only be used when printing single material " "objects." msgstr "" +"Варіант спіральної вази можна використовувати лише під час друку одно-" +"матеріальних об’єктів." -#: src/libslic3r/Print.cpp:1198 +#: src/libslic3r/Print.cpp:1290 msgid "" -"All extruders must have the same diameter for single extruder multimaterial " -"printer." +"The wipe tower is only supported if all extruders have the same nozzle " +"diameter and use filaments of the same diameter." msgstr "" +"Вежа витирання підтримується лише в тому випадку, якщо всі екструдери мають " +"однаковий діаметр сопла і використовують філаменти одинакового діаметру." -#: src/libslic3r/Print.cpp:1203 +#: src/libslic3r/Print.cpp:1296 msgid "" -"The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter " -"and Repetier G-code flavors." +"The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter, " +"RepRapFirmware and Repetier G-code flavors." msgstr "" +"Наразі вежа витирання підтримується лише для G-кодів, сумісних з Marlin, " +"RepRap/Sprinter, RepRapFirmware та Repetier ." -#: src/libslic3r/Print.cpp:1205 +#: src/libslic3r/Print.cpp:1298 msgid "" "The Wipe Tower is currently only supported with the relative extruder " "addressing (use_relative_e_distances=1)." msgstr "" +"Наразі вежа витирання підтримує лише відносну адресацію екструдерів " +"(use_relative_e_distances = 1)." + +#: src/libslic3r/Print.cpp:1300 +msgid "Ooze prevention is currently not supported with the wipe tower enabled." +msgstr "" +"Наразі запобігання просочування не підтримується з увімкненою вежею " +"витирання." + +#: src/libslic3r/Print.cpp:1302 +msgid "" +"The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)." +msgstr "Наразі вежа витирання не підтримує об'ємне E (use_volumetric_e = 0)." + +#: src/libslic3r/Print.cpp:1304 +msgid "" +"The Wipe Tower is currently not supported for multimaterial sequential " +"prints." +msgstr "" +"Наразі вежа витирання не підтримується для багато-матеріального послідовного " +"друку." -#: src/libslic3r/Print.cpp:1226 +#: src/libslic3r/Print.cpp:1325 msgid "" "The Wipe Tower is only supported for multiple objects if they have equal " -"layer heigths" +"layer heights" msgstr "" +"Вежа витирання для кількох об’єктів підтримується лише у випадку, коли вони " +"мають однакову висоту шару" -#: src/libslic3r/Print.cpp:1228 +#: src/libslic3r/Print.cpp:1327 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "over an equal number of raft layers" msgstr "" +"Вежа витирання для кількох об’єктів підтримується лише у випадку, коли вони " +"надруковані на рівній кількості шарів плоту" -#: src/libslic3r/Print.cpp:1230 +#: src/libslic3r/Print.cpp:1329 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "with the same support_material_contact_distance" msgstr "" +"Вежа витирання для кількох об’єктів підтримується лише у випадку, коли вони " +"надруковані з однаковою відстанню support_material_contact_distance" -#: src/libslic3r/Print.cpp:1232 +#: src/libslic3r/Print.cpp:1331 msgid "" "The Wipe Tower is only supported for multiple objects if they are sliced " "equally." msgstr "" +"Вежа витирання для кількох об’єктів підтримується лише у випадку, коли вони " +"нарізані однаково." -#: src/libslic3r/Print.cpp:1261 +#: src/libslic3r/Print.cpp:1373 msgid "" -"The Wipe tower is only supported if all objects have the same layer height " -"profile" +"The Wipe tower is only supported if all objects have the same variable layer " +"height" msgstr "" +"Вежа витирання підтримується лише в тому випадку, якщо всі об’єкти мають " +"однакову висоту змінного шару" -#: src/libslic3r/Print.cpp:1271 -msgid "The supplied settings will cause an empty print." -msgstr "" - -#: src/libslic3r/Print.cpp:1288 +#: src/libslic3r/Print.cpp:1399 msgid "" "One or more object were assigned an extruder that the printer does not have." msgstr "" +"Одному або декільком об’єктам було призначено екструдер, якого принтер не " +"має." + +#: src/libslic3r/Print.cpp:1408 +msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm" +msgstr "%1%=%2% мм є занадто низьким для друку на висоті шару %3% мм" -#: src/libslic3r/Print.cpp:1297 +#: src/libslic3r/Print.cpp:1411 +msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm" +msgstr "%1% = %2% мм є надмірно для друку з діаметром сопла %3% мм" + +#: src/libslic3r/Print.cpp:1422 msgid "" "Printing with multiple extruders of differing nozzle diameters. If support " "is to be printed with the current extruder (support_material_extruder == 0 " "or support_material_interface_extruder == 0), all nozzles have to be of the " "same diameter." msgstr "" +"Друк за допомогою декількох екструдерів різного діаметру сопла. Якщо " +"підтримки слід друкувати поточним екструдерем (support_material_extruder == " +"0 або support_material_interface_extruder == 0), усі сопла повинні мати " +"однаковий діаметр." -#: src/libslic3r/Print.cpp:1305 +#: src/libslic3r/Print.cpp:1430 msgid "" "For the Wipe Tower to work with the soluble supports, the support layers " "need to be synchronized with the object layers." msgstr "" +"Для того, щоб вежа витирання працювала з розчинними підтримками, шари " +"підтримки повинні бути синхронізовані з шарами об'єкта." -#: src/libslic3r/Print.cpp:1309 +#: src/libslic3r/Print.cpp:1434 msgid "" "The Wipe Tower currently supports the non-soluble supports only if they are " "printed with the current extruder without triggering a tool change. (both " "support_material_extruder and support_material_interface_extruder need to be " "set to 0)." msgstr "" +"Вежа витирання в даний момент підтримує лише нерозчинні підтримки, якщо вони " +"друкуються з поточним екструдером, не запускаючи зміну інструменту. (Обидва " +"значення support_material_extruder і support_material_interface_extruder " +"повинні бути встановлені на 0)." + +#: src/libslic3r/Print.cpp:1456 +msgid "First layer height can't be greater than nozzle diameter" +msgstr "Висота першого шару не може перевищувати діаметр сопла" + +#: src/libslic3r/Print.cpp:1461 +msgid "Layer height can't be greater than nozzle diameter" +msgstr "Висота шару не може перевищувати діаметр сопла" + +#: src/libslic3r/Print.cpp:1620 +msgid "Infilling layers" +msgstr "Шари наповнення" + +#: src/libslic3r/Print.cpp:1646 +msgid "Generating skirt" +msgstr "Генерування спідниці" + +#: src/libslic3r/Print.cpp:1655 +msgid "Generating brim" +msgstr "Генерування краю" -#: src/libslic3r/Print.cpp:1316 -msgid "first_layer_height" +#: src/libslic3r/Print.cpp:1678 +msgid "Exporting G-code" +msgstr "Експортування G-коду" + +#: src/libslic3r/Print.cpp:1682 +msgid "Generating G-code" +msgstr "Генерування G-коду" + +#: src/libslic3r/SLA/Pad.cpp:532 +msgid "Pad brim size is too small for the current configuration." +msgstr "Розмір краю подушки замалий для поточної конфігурації." + +#: src/libslic3r/SLAPrint.cpp:630 +msgid "" +"Cannot proceed without support points! Add support points or disable support " +"generation." msgstr "" +"Не можливо продовжувати без точок підтримки! Додайте точки підтримки або " +"вимкніть генерацію підтримки." -#: src/libslic3r/Print.cpp:1331 -msgid "First layer height can't be greater than nozzle diameter" +#: src/libslic3r/SLAPrint.cpp:642 +msgid "" +"Elevation is too low for object. Use the \"Pad around object\" feature to " +"print the object without elevation." msgstr "" +"Підняття занадто мале для об'єкта. Використовуйте функцію \"Подушка навколо " +"об'єкта\" для друку об'єкта без підняття." -#: src/libslic3r/Print.cpp:1335 -msgid "Layer height can't be greater than nozzle diameter" +#: src/libslic3r/SLAPrint.cpp:648 +msgid "" +"The endings of the support pillars will be deployed on the gap between the " +"object and the pad. 'Support base safety distance' has to be greater than " +"the 'Pad object gap' parameter to avoid this." msgstr "" +"Кінці стовпів підтримок будуть розміщені на зазорі між об'єктом і подушкою. " +"\"Безпечна відстань між основами підтримки\" повинна бути більшою за " +"параметр \"Розрив Подушка-Об'єкт\", щоб уникнути цього." + +#: src/libslic3r/SLAPrint.cpp:663 +msgid "Exposition time is out of printer profile bounds." +msgstr "Час експозиції виходить за межі профілю принтера." + +#: src/libslic3r/SLAPrint.cpp:670 +msgid "Initial exposition time is out of printer profile bounds." +msgstr "Початковий час експозиції виходить за межі профілю принтера." + +#: src/libslic3r/SLAPrint.cpp:786 +msgid "Slicing done" +msgstr "Нарізання завершено" + +#: src/libslic3r/SLAPrintSteps.cpp:44 +msgid "Hollowing model" +msgstr "Випорожнення моделі" -#: src/libslic3r/SLAPrint.cpp:55 +#: src/libslic3r/SLAPrintSteps.cpp:45 +msgid "Drilling holes into model." +msgstr "Свердління отворів в моделі." + +#: src/libslic3r/SLAPrintSteps.cpp:46 msgid "Slicing model" -msgstr "" +msgstr "Нарізання моделі" -#: src/libslic3r/SLAPrint.cpp:56 src/libslic3r/SLAPrint.cpp:801 +#: src/libslic3r/SLAPrintSteps.cpp:47 src/libslic3r/SLAPrintSteps.cpp:359 msgid "Generating support points" -msgstr "" +msgstr "Генерування точок підтримки" -#: src/libslic3r/SLAPrint.cpp:57 +#: src/libslic3r/SLAPrintSteps.cpp:48 msgid "Generating support tree" -msgstr "" +msgstr "Генерування дерева підтримки" -#: src/libslic3r/SLAPrint.cpp:58 +#: src/libslic3r/SLAPrintSteps.cpp:49 msgid "Generating pad" -msgstr "" +msgstr "Генерування подушки" -#: src/libslic3r/SLAPrint.cpp:59 +#: src/libslic3r/SLAPrintSteps.cpp:50 msgid "Slicing supports" -msgstr "" +msgstr "Нарізання підтримок" -#: src/libslic3r/SLAPrint.cpp:71 +#: src/libslic3r/SLAPrintSteps.cpp:65 msgid "Merging slices and calculating statistics" -msgstr "" +msgstr "Об'єднання шарів друку та обчислення статистики" -#: src/libslic3r/SLAPrint.cpp:72 +#: src/libslic3r/SLAPrintSteps.cpp:66 msgid "Rasterizing layers" -msgstr "" +msgstr "Растеризуючі шари" -#: src/libslic3r/SLAPrint.cpp:605 -msgid "" -"Cannot proceed without support points! Add support points or disable support " -"generation." -msgstr "" +#: src/libslic3r/SLAPrintSteps.cpp:192 +msgid "Too many overlapping holes." +msgstr "Забагато отворів, що перекриваються." -#: src/libslic3r/SLAPrint.cpp:617 -msgid "Elevation is too low for object." +#: src/libslic3r/SLAPrintSteps.cpp:201 +msgid "" +"Drilling holes into the mesh failed. This is usually caused by broken model. " +"Try to fix it first." msgstr "" +"Не вдалося висвердлити отвори. Зазвичай це викликано зламаною моделлю. " +"Спершу спробуйте її виправити." -#: src/libslic3r/SLAPrint.cpp:699 -msgid "Slicing had to be stopped due to an internal error." +#: src/libslic3r/SLAPrintSteps.cpp:247 +msgid "" +"Slicing had to be stopped due to an internal error: Inconsistent slice index." msgstr "" +"Нарізання довелося зупинити через внутрішню помилку: Невідповідний індекс " +"зрізу." -#: src/libslic3r/SLAPrint.cpp:849 src/libslic3r/SLAPrint.cpp:859 -#: src/libslic3r/SLAPrint.cpp:907 +#: src/libslic3r/SLAPrintSteps.cpp:411 src/libslic3r/SLAPrintSteps.cpp:420 +#: src/libslic3r/SLAPrintSteps.cpp:459 msgid "Visualizing supports" +msgstr "Візуалізація підтримки" + +#: src/libslic3r/SLAPrintSteps.cpp:451 +msgid "No pad can be generated for this model with the current configuration" msgstr "" +"Для цієї моделі з поточною конфігурацією неможливо створити жодну подушку" -#: src/libslic3r/SLAPrint.cpp:1449 -msgid "Slicing done" +#: src/libslic3r/SLAPrintSteps.cpp:619 +msgid "" +"There are unprintable objects. Try to adjust support settings to make the " +"objects printable." msgstr "" +"Є об’єкти, що не друкуються. Спробуйте налаштувати параметри підтримки, щоб " +"зробити об’єкти для друку." -#: src/libslic3r/PrintBase.cpp:65 +#: src/libslic3r/PrintBase.cpp:72 msgid "Failed processing of the output_filename_format template." -msgstr "" +msgstr "Помилка обробки шаблону output_filename_format." -#: src/libslic3r/PrintConfig.cpp:42 src/libslic3r/PrintConfig.cpp:43 +#: src/libslic3r/PrintConfig.cpp:43 src/libslic3r/PrintConfig.cpp:44 msgid "Printer technology" -msgstr "" +msgstr "Технологія друку" -#: src/libslic3r/PrintConfig.cpp:50 +#: src/libslic3r/PrintConfig.cpp:51 msgid "Bed shape" -msgstr "Форма полотна" +msgstr "Форма столу" + +#: src/libslic3r/PrintConfig.cpp:56 +msgid "Bed custom texture" +msgstr "Власна текстура столу" + +#: src/libslic3r/PrintConfig.cpp:61 +msgid "Bed custom model" +msgstr "Власна модель столу" + +#: src/libslic3r/PrintConfig.cpp:66 +msgid "G-code thumbnails" +msgstr "Ескізи G-коду" + +#: src/libslic3r/PrintConfig.cpp:67 +msgid "" +"Picture sizes to be stored into a .gcode and .sl1 files, in the following " +"format: \"XxY, XxY, ...\"" +msgstr "" +"Розміри зображень, які слід зберігати у файлах .gcode та .sl1, у такому " +"форматі: \"XxY, XxY, ...\"" -#: src/libslic3r/PrintConfig.cpp:57 +#: src/libslic3r/PrintConfig.cpp:75 msgid "" "This setting controls the height (and thus the total number) of the slices/" "layers. Thinner layers give better accuracy but take more time to print." @@ -4480,52 +8871,118 @@ msgstr "" "Цей параметр визначає висоту (і, таким чином, загальну кількість) шарів. " "Тонкі шари забезпечують більшу точність, але для друку потрібно більше часу." -#: src/libslic3r/PrintConfig.cpp:64 +#: src/libslic3r/PrintConfig.cpp:82 msgid "Max print height" -msgstr "" +msgstr "Максимальна висота друку" -#: src/libslic3r/PrintConfig.cpp:65 +#: src/libslic3r/PrintConfig.cpp:83 msgid "" "Set this to the maximum height that can be reached by your extruder while " "printing." msgstr "" +"Встановіть це значення на максимальну висоту, якої може досягти ваш " +"екструдер під час друку." -#: src/libslic3r/PrintConfig.cpp:71 +#: src/libslic3r/PrintConfig.cpp:91 msgid "Slice gap closing radius" -msgstr "" +msgstr "Радіус закриття зазору зрізу" -#: src/libslic3r/PrintConfig.cpp:73 +#: src/libslic3r/PrintConfig.cpp:93 msgid "" "Cracks smaller than 2x gap closing radius are being filled during the " "triangle mesh slicing. The gap closing operation may reduce the final print " "resolution, therefore it is advisable to keep the value reasonably low." msgstr "" +"Тріщини з радіусом, меншим ніж 2 закриття зазору, заповнюються під час " +"нарізування трикутної сітки. Операція заповнення проміжку може зменшити " +"остаточну роздільну здатність друку, тому доцільно підтримувати значення на " +"досить низькому рівні." -#: src/libslic3r/PrintConfig.cpp:81 +#: src/libslic3r/PrintConfig.cpp:101 msgid "Hostname, IP or URL" -msgstr "" +msgstr "Ім'я хоста, IP або URL" -#: src/libslic3r/PrintConfig.cpp:82 +#: src/libslic3r/PrintConfig.cpp:102 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " -"the hostname, IP address or URL of the printer host instance." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:88 +"the hostname, IP address or URL of the printer host instance. Print host " +"behind HAProxy with basic auth enabled can be accessed by putting the user " +"name and password into the URL in the following format: https://username:" +"password@your-octopi-address/" +msgstr "" +"Slic3r може завантажувати файли G-коду на хост принтера. Це поле повинно " +"містити ім’я хосту, IP-адресу або URL-адресу екземпляра хосту принтера. Хост " +"друку, що стоїть за HAProxy з увімкненою базовою автентифікацією, можна " +"отримати, ввівши ім’я користувача та пароль у URL-адресу у такому форматі: " +"https://username:password@your-octopi-address/" + +#: src/libslic3r/PrintConfig.cpp:110 msgid "API Key / Password" -msgstr "" +msgstr "Ключ API / Пароль" -#: src/libslic3r/PrintConfig.cpp:89 +#: src/libslic3r/PrintConfig.cpp:111 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " "the API Key or the password required for authentication." msgstr "" +"Slic3r може завантажувати файли G-коду на хост принтера. Це поле повинно " +"містити ключ API або пароль, необхідний для автентифікації." -#: src/libslic3r/PrintConfig.cpp:111 +#: src/libslic3r/PrintConfig.cpp:118 +msgid "Name of the printer" +msgstr "Назва принтера" + +#: src/libslic3r/PrintConfig.cpp:125 +msgid "" +"Custom CA certificate file can be specified for HTTPS OctoPrint connections, " +"in crt/pem format. If left blank, the default OS CA certificate repository " +"is used." +msgstr "" +"Настроюваний файл сертифіката CA можна вказати для з'єднань HTTPS OctoPrint " +"у форматі crt/pem. Якщо залишити це поле порожнім, буде використано типове " +"сховище сертифікатів OS CA." + +#: src/libslic3r/PrintConfig.cpp:131 +msgid "Elephant foot compensation" +msgstr "Зрівноваження Стопи слона" + +#: src/libslic3r/PrintConfig.cpp:133 +msgid "" +"The first layer will be shrunk in the XY plane by the configured value to " +"compensate for the 1st layer squish aka an Elephant Foot effect." +msgstr "" +"Перший шар буде зменшено в площині XY завдяки налаштованому значенню, щоб " +"компенсувати ефект Ноги Слона для 1-го шару." + +#: src/libslic3r/PrintConfig.cpp:149 +msgid "Password" +msgstr "Пароль" + +#: src/libslic3r/PrintConfig.cpp:155 +msgid "Printer preset name" +msgstr "Назва пресету принтера" + +#: src/libslic3r/PrintConfig.cpp:156 +msgid "Related printer preset name" +msgstr "Назва пов’язаного пресету принтера" + +#: src/libslic3r/PrintConfig.cpp:161 +msgid "Authorization Type" +msgstr "Тип авторизації" + +#: src/libslic3r/PrintConfig.cpp:166 +msgid "API key" +msgstr "Ключ API" + +#: src/libslic3r/PrintConfig.cpp:167 +msgid "HTTP digest" +msgstr "Дайджест HTTP" + +#: src/libslic3r/PrintConfig.cpp:180 msgid "Avoid crossing perimeters" msgstr "Уникати перетинання периметрів" -#: src/libslic3r/PrintConfig.cpp:112 +#: src/libslic3r/PrintConfig.cpp:181 msgid "" "Optimize travel moves in order to minimize the crossing of perimeters. This " "is mostly useful with Bowden extruders which suffer from oozing. This " @@ -4535,37 +8992,57 @@ msgstr "" "основному це корисно для екструдерів Bowden, які страждають від протікання. " "Ця функція уповільнює як друк, так і генерацію G-коду." -#: src/libslic3r/PrintConfig.cpp:119 src/libslic3r/PrintConfig.cpp:1976 +#: src/libslic3r/PrintConfig.cpp:188 +msgid "Avoid crossing perimeters - Max detour length" +msgstr "Уникати перетинання периметрів - Макс. довжина обходу" + +#: src/libslic3r/PrintConfig.cpp:190 +msgid "" +"The maximum detour length for avoid crossing perimeters. If the detour is " +"longer than this value, avoid crossing perimeters is not applied for this " +"travel path. Detour length could be specified either as an absolute value or " +"as percentage (for example 50%) of a direct travel path." +msgstr "" +"Максимальна довжина обходу, щоб уникнути перетину периметрів. Якщо обхід " +"довший за це значення, уникнення перетину периметрів для цього шляху не " +"застосовується. Довжина обходу може бути вказана або як абсолютне значення, " +"або як відсоток (наприклад, 50%) від прямого шляху проходу." + +#: src/libslic3r/PrintConfig.cpp:193 +msgid "mm or % (zero to disable)" +msgstr "мм або % (0, щоб вимкнути)" + +#: src/libslic3r/PrintConfig.cpp:199 src/libslic3r/PrintConfig.cpp:2291 msgid "Other layers" msgstr "Інші шари" -#: src/libslic3r/PrintConfig.cpp:120 +#: src/libslic3r/PrintConfig.cpp:200 msgid "" "Bed temperature for layers after the first one. Set this to zero to disable " "bed temperature control commands in the output." msgstr "" -"Температура полотна для останніх шарів після першого. Установіть 0, щоб " -"відключити команди керування температурою полотна на виході." +"Температура столу для останніх шарів після першого. Установіть 0, щоб " +"відключити команди керування температурою столу на виході." -#: src/libslic3r/PrintConfig.cpp:122 +#: src/libslic3r/PrintConfig.cpp:203 msgid "Bed temperature" -msgstr "Температура полотна" +msgstr "Температура столу" -#: src/libslic3r/PrintConfig.cpp:129 +#: src/libslic3r/PrintConfig.cpp:210 msgid "" "This custom code is inserted at every layer change, right before the Z move. " "Note that you can use placeholder variables for all Slic3r settings as well " "as [layer_num] and [layer_z]." msgstr "" "Цей користувацький код вставляється при кожній зміні шару перед початком " -"переміщення Z. Зауважте, що ви можете використовувати змінні-заповнювачі для " +"переміщення Z. Зауважте, що ви можете використовувати шаблонні змінні для " "всіх параметрів Slic3r, а також [layer_num] і [layer_z]." -#: src/libslic3r/PrintConfig.cpp:139 +#: src/libslic3r/PrintConfig.cpp:220 msgid "Between objects G-code" msgstr "G-код між об'єктами" -#: src/libslic3r/PrintConfig.cpp:140 +#: src/libslic3r/PrintConfig.cpp:221 msgid "" "This code is inserted between objects when using sequential printing. By " "default extruder and bed temperature are reset using non-wait command; " @@ -4578,23 +9055,35 @@ msgstr "" "замовчуванням екструдер і температура полотна скидаються за допомогою " "команди non-wait; однак, якщо в цьому користувальному коді виявляються M104, " "M109, M140 або M190, Slic3r не додаватиме команди температури. Зверніть " -"увагу, що ви можете використовувати змінні-заповнювачі для всіх параметрів " +"увагу, що ви можете використовувати шаблонні змінні для всіх параметрів " "Slic3r, то ж ви можете вставити команду \"M109 S [first_layer_temperature]\" " "де завгодно." -#: src/libslic3r/PrintConfig.cpp:150 +#: src/libslic3r/PrintConfig.cpp:232 msgid "Number of solid layers to generate on bottom surfaces." msgstr "Кількість суцільних шарів, генерованих на нижніх поверхнях." -#: src/libslic3r/PrintConfig.cpp:151 +#: src/libslic3r/PrintConfig.cpp:233 msgid "Bottom solid layers" msgstr "Нижні суцільні шари" -#: src/libslic3r/PrintConfig.cpp:156 +#: src/libslic3r/PrintConfig.cpp:241 +msgid "" +"The number of bottom solid layers is increased above bottom_solid_layers if " +"necessary to satisfy minimum thickness of bottom shell." +msgstr "" +"Кількість твердих шарів знизу збільшується над нижчими твердими шарами, якщо " +"це необхідно для задоволення мінімальної товщини донної оболонки." + +#: src/libslic3r/PrintConfig.cpp:243 +msgid "Minimum bottom shell thickness" +msgstr "Мінімальна товщина нижньої оболонки" + +#: src/libslic3r/PrintConfig.cpp:249 msgid "Bridge" msgstr "Міст" -#: src/libslic3r/PrintConfig.cpp:157 +#: src/libslic3r/PrintConfig.cpp:250 msgid "" "This is the acceleration your printer will use for bridges. Set zero to " "disable acceleration control for bridges." @@ -4602,18 +9091,18 @@ msgstr "" "Це прискорення, яке ваш принтер використовуватиме для мостів. Встановити 0, " "щоб відключити управління прискоренням для мостів." -#: src/libslic3r/PrintConfig.cpp:159 src/libslic3r/PrintConfig.cpp:302 -#: src/libslic3r/PrintConfig.cpp:814 src/libslic3r/PrintConfig.cpp:935 -#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:1133 -#: src/libslic3r/PrintConfig.cpp:1144 src/libslic3r/PrintConfig.cpp:1333 +#: src/libslic3r/PrintConfig.cpp:252 src/libslic3r/PrintConfig.cpp:395 +#: src/libslic3r/PrintConfig.cpp:940 src/libslic3r/PrintConfig.cpp:1079 +#: src/libslic3r/PrintConfig.cpp:1360 src/libslic3r/PrintConfig.cpp:1409 +#: src/libslic3r/PrintConfig.cpp:1419 src/libslic3r/PrintConfig.cpp:1612 msgid "mm/s²" msgstr "мм/с²" -#: src/libslic3r/PrintConfig.cpp:165 +#: src/libslic3r/PrintConfig.cpp:258 msgid "Bridging angle" msgstr "Кут моста" -#: src/libslic3r/PrintConfig.cpp:167 +#: src/libslic3r/PrintConfig.cpp:260 msgid "" "Bridging angle override. If left to zero, the bridging angle will be " "calculated automatically. Otherwise the provided angle will be used for all " @@ -4623,33 +9112,35 @@ msgstr "" "автоматично. Інакше передбачений кут буде використаний для всіх мостів. " "Використовуйте 180° для нульового кута." -#: src/libslic3r/PrintConfig.cpp:170 src/libslic3r/PrintConfig.cpp:732 -#: src/libslic3r/PrintConfig.cpp:1569 src/libslic3r/PrintConfig.cpp:1579 -#: src/libslic3r/PrintConfig.cpp:1807 src/libslic3r/PrintConfig.cpp:1961 -#: src/libslic3r/PrintConfig.cpp:2459 +#: src/libslic3r/PrintConfig.cpp:263 src/libslic3r/PrintConfig.cpp:852 +#: src/libslic3r/PrintConfig.cpp:1853 src/libslic3r/PrintConfig.cpp:1863 +#: src/libslic3r/PrintConfig.cpp:2121 src/libslic3r/PrintConfig.cpp:2276 +#: src/libslic3r/PrintConfig.cpp:2475 src/libslic3r/PrintConfig.cpp:2976 +#: src/libslic3r/PrintConfig.cpp:3097 msgid "°" msgstr "°" -#: src/libslic3r/PrintConfig.cpp:176 +#: src/libslic3r/PrintConfig.cpp:269 msgid "Bridges fan speed" msgstr "Швидкість вентилятора для мостів" -#: src/libslic3r/PrintConfig.cpp:177 +#: src/libslic3r/PrintConfig.cpp:270 msgid "This fan speed is enforced during all bridges and overhangs." msgstr "Ця швидкість вентилятора виконується для всіх мостів і виступів." -#: src/libslic3r/PrintConfig.cpp:178 src/libslic3r/PrintConfig.cpp:744 -#: src/libslic3r/PrintConfig.cpp:1153 src/libslic3r/PrintConfig.cpp:1216 -#: src/libslic3r/PrintConfig.cpp:1461 src/libslic3r/PrintConfig.cpp:2258 -#: src/libslic3r/PrintConfig.cpp:2498 +#: src/libslic3r/PrintConfig.cpp:271 src/libslic3r/PrintConfig.cpp:864 +#: src/libslic3r/PrintConfig.cpp:1248 src/libslic3r/PrintConfig.cpp:1427 +#: src/libslic3r/PrintConfig.cpp:1490 src/libslic3r/PrintConfig.cpp:1745 +#: src/libslic3r/PrintConfig.cpp:2653 src/libslic3r/PrintConfig.cpp:2890 +#: src/libslic3r/PrintConfig.cpp:3016 msgid "%" msgstr "%" -#: src/libslic3r/PrintConfig.cpp:185 +#: src/libslic3r/PrintConfig.cpp:278 msgid "Bridge flow ratio" msgstr "Співвідношення мостового потоку" -#: src/libslic3r/PrintConfig.cpp:187 +#: src/libslic3r/PrintConfig.cpp:280 msgid "" "This factor affects the amount of plastic for bridging. You can decrease it " "slightly to pull the extrudates and prevent sagging, although default " @@ -4661,32 +9152,33 @@ msgstr "" "стандартні налаштування зазвичай добрі, тому ви маете по-експериментувати з " "охолодженням (використовуйте вентилятор), перш ніж їх налаштувати." -#: src/libslic3r/PrintConfig.cpp:197 +#: src/libslic3r/PrintConfig.cpp:290 msgid "Bridges" msgstr "Мости" -#: src/libslic3r/PrintConfig.cpp:199 +#: src/libslic3r/PrintConfig.cpp:292 msgid "Speed for printing bridges." msgstr "Швидкість друку мостів." -#: src/libslic3r/PrintConfig.cpp:200 src/libslic3r/PrintConfig.cpp:576 -#: src/libslic3r/PrintConfig.cpp:584 src/libslic3r/PrintConfig.cpp:593 -#: src/libslic3r/PrintConfig.cpp:601 src/libslic3r/PrintConfig.cpp:628 -#: src/libslic3r/PrintConfig.cpp:647 src/libslic3r/PrintConfig.cpp:873 -#: src/libslic3r/PrintConfig.cpp:1000 src/libslic3r/PrintConfig.cpp:1078 -#: src/libslic3r/PrintConfig.cpp:1098 src/libslic3r/PrintConfig.cpp:1111 -#: src/libslic3r/PrintConfig.cpp:1122 src/libslic3r/PrintConfig.cpp:1175 -#: src/libslic3r/PrintConfig.cpp:1234 src/libslic3r/PrintConfig.cpp:1362 -#: src/libslic3r/PrintConfig.cpp:1536 src/libslic3r/PrintConfig.cpp:1545 -#: src/libslic3r/PrintConfig.cpp:1940 src/libslic3r/PrintConfig.cpp:2051 +#: src/libslic3r/PrintConfig.cpp:293 src/libslic3r/PrintConfig.cpp:671 +#: src/libslic3r/PrintConfig.cpp:679 src/libslic3r/PrintConfig.cpp:688 +#: src/libslic3r/PrintConfig.cpp:696 src/libslic3r/PrintConfig.cpp:723 +#: src/libslic3r/PrintConfig.cpp:742 src/libslic3r/PrintConfig.cpp:1015 +#: src/libslic3r/PrintConfig.cpp:1194 src/libslic3r/PrintConfig.cpp:1267 +#: src/libslic3r/PrintConfig.cpp:1343 src/libslic3r/PrintConfig.cpp:1377 +#: src/libslic3r/PrintConfig.cpp:1389 src/libslic3r/PrintConfig.cpp:1399 +#: src/libslic3r/PrintConfig.cpp:1449 src/libslic3r/PrintConfig.cpp:1508 +#: src/libslic3r/PrintConfig.cpp:1642 src/libslic3r/PrintConfig.cpp:1820 +#: src/libslic3r/PrintConfig.cpp:1829 src/libslic3r/PrintConfig.cpp:2255 +#: src/libslic3r/PrintConfig.cpp:2382 msgid "mm/s" msgstr "мм/с" -#: src/libslic3r/PrintConfig.cpp:207 +#: src/libslic3r/PrintConfig.cpp:300 msgid "Brim width" msgstr "Ширина краю" -#: src/libslic3r/PrintConfig.cpp:208 +#: src/libslic3r/PrintConfig.cpp:301 msgid "" "Horizontal width of the brim that will be printed around each object on the " "first layer." @@ -4694,33 +9186,33 @@ msgstr "" "Горизонтальна ширина краю, яка буде надрукована навколо кожного об'єкта на " "першому шарі." -#: src/libslic3r/PrintConfig.cpp:215 +#: src/libslic3r/PrintConfig.cpp:308 msgid "Clip multi-part objects" msgstr "Обрізати об'єкти, що складаються з кількох частин" -#: src/libslic3r/PrintConfig.cpp:216 +#: src/libslic3r/PrintConfig.cpp:309 msgid "" -"When printing multi-material objects, this settings will make slic3r to clip " +"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 "" -"Під час друку багатоматеріальних об'єктів ці налаштування змушують slic3r " -"обрізати частини, що перекриваються один одною (друга частина буде обрізана " -"першою, третя - першою та другою, тощо)." +"Під час друку багато-матеріальних об'єктів ці налаштування дозволять Slic3r " +"відсікати накладені частини об'єкта одна за одною (друга частина буде " +"відсічена першою, третя частина буде відсічена першою та другою тощо)." -#: src/libslic3r/PrintConfig.cpp:223 +#: src/libslic3r/PrintConfig.cpp:316 msgid "Colorprint height" -msgstr "" +msgstr "Висота кольорового друку" -#: src/libslic3r/PrintConfig.cpp:224 -msgid "Heights at which a filament change is to occur. " -msgstr "" +#: src/libslic3r/PrintConfig.cpp:317 +msgid "Heights at which a filament change is to occur." +msgstr "Висоти, на яких має відбуватися зміна філаменту." -#: src/libslic3r/PrintConfig.cpp:234 +#: src/libslic3r/PrintConfig.cpp:327 msgid "Compatible printers condition" -msgstr "Стан сумісних принтерів" +msgstr "Умови сумісності принтерів" -#: src/libslic3r/PrintConfig.cpp:235 +#: src/libslic3r/PrintConfig.cpp:328 msgid "" "A boolean expression using the configuration values of an active printer " "profile. If this expression evaluates to true, this profile is considered " @@ -4730,22 +9222,25 @@ msgstr "" "принтера. Якщо цей вираз оцінюється як Правда, цей профіль вважається " "сумісним з активним профілем принтера." -#: src/libslic3r/PrintConfig.cpp:249 +#: src/libslic3r/PrintConfig.cpp:342 msgid "Compatible print profiles condition" -msgstr "" +msgstr "Умови сумісності пресетів друку" -#: src/libslic3r/PrintConfig.cpp:250 +#: src/libslic3r/PrintConfig.cpp:343 msgid "" "A boolean expression using the configuration values of an active print " "profile. If this expression evaluates to true, this profile is considered " "compatible with the active print profile." msgstr "" +"Логічний вираз, що використовує значення конфігурації активного профілю " +"друку. Якщо цей вираз оцінюється як Правда, цей профіль вважається сумісним " +"з активним профілем друку." -#: src/libslic3r/PrintConfig.cpp:267 +#: src/libslic3r/PrintConfig.cpp:360 msgid "Complete individual objects" msgstr "Закінчити окремі об'єкти" -#: src/libslic3r/PrintConfig.cpp:268 +#: src/libslic3r/PrintConfig.cpp:361 msgid "" "When printing multiple objects or copies, this feature will complete each " "object before moving onto next one (and starting it from its bottom layer). " @@ -4757,11 +9252,11 @@ msgstr "" "шару). Ця функція корисна для уникнення ризику зіпсованих відбитків. Slic3r " "має попередити та запобігти зіткненню екструдера, але будьте обережні." -#: src/libslic3r/PrintConfig.cpp:276 +#: src/libslic3r/PrintConfig.cpp:369 msgid "Enable auto cooling" msgstr "Увімкнути автоматичне охолодження" -#: src/libslic3r/PrintConfig.cpp:277 +#: src/libslic3r/PrintConfig.cpp:370 msgid "" "This flag enables the automatic cooling logic that adjusts print speed and " "fan speed according to layer printing time." @@ -4769,23 +9264,26 @@ msgstr "" "Цей прапорець дозволяє автоматичну логіку охолодження, яка регулює швидкість " "друку та швидкість вентиляції відповідно до часу друку шару." -#: src/libslic3r/PrintConfig.cpp:282 +#: src/libslic3r/PrintConfig.cpp:375 msgid "Cooling tube position" -msgstr "" +msgstr "Позиція охолоджувальної трубки" -#: src/libslic3r/PrintConfig.cpp:283 -msgid "Distance of the center-point of the cooling tube from the extruder tip " +#: src/libslic3r/PrintConfig.cpp:376 +msgid "Distance of the center-point of the cooling tube from the extruder tip." msgstr "" +"Відстань центральної точки охолоджувальної трубки від наконечника екструдера." -#: src/libslic3r/PrintConfig.cpp:290 +#: src/libslic3r/PrintConfig.cpp:383 msgid "Cooling tube length" -msgstr "" +msgstr "Довжина охолоджувальної трубки" -#: src/libslic3r/PrintConfig.cpp:291 -msgid "Length of the cooling tube to limit space for cooling moves inside it " +#: src/libslic3r/PrintConfig.cpp:384 +msgid "Length of the cooling tube to limit space for cooling moves inside it." msgstr "" +"Довжина охолоджувальної трубки для обмеження простору для охолоджуючих рухів " +"всередині неї." -#: src/libslic3r/PrintConfig.cpp:299 +#: src/libslic3r/PrintConfig.cpp:392 msgid "" "This is the acceleration your printer will be reset to after the role-" "specific acceleration values are used (perimeter/infill). Set zero to " @@ -4795,34 +9293,38 @@ msgstr "" "використані конкретні визначені прискорення (периметру / заповнення). " "Встановити 0, щоб запобігти скиданням прискорення взагалі." -#: src/libslic3r/PrintConfig.cpp:308 +#: src/libslic3r/PrintConfig.cpp:401 msgid "Default filament profile" -msgstr "" +msgstr "Профіль філаметну за замовчанням" -#: src/libslic3r/PrintConfig.cpp:309 +#: src/libslic3r/PrintConfig.cpp:402 msgid "" "Default filament profile associated with the current printer profile. On " "selection of the current printer profile, this filament profile will be " "activated." msgstr "" +"Профіль філаметну за замовчанням, пов'язаний з поточним профілем принтера. " +"При виборі поточного профілю принтера цей профіль філаметну буде активовано." -#: src/libslic3r/PrintConfig.cpp:315 +#: src/libslic3r/PrintConfig.cpp:408 msgid "Default print profile" -msgstr "" +msgstr "Профіль друку за замовчанням" -#: src/libslic3r/PrintConfig.cpp:316 src/libslic3r/PrintConfig.cpp:2337 -#: src/libslic3r/PrintConfig.cpp:2348 +#: src/libslic3r/PrintConfig.cpp:409 src/libslic3r/PrintConfig.cpp:2820 +#: src/libslic3r/PrintConfig.cpp:2831 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " "activated." msgstr "" +"Профіль друку за промовчанням, пов'язаний із поточним профілем принтера. При " +"виборі поточного профілю принтера цей профіль друку буде активовано." -#: src/libslic3r/PrintConfig.cpp:322 +#: src/libslic3r/PrintConfig.cpp:415 msgid "Disable fan for the first" msgstr "Вимкнути вентилятор для першого(их)" -#: src/libslic3r/PrintConfig.cpp:323 +#: src/libslic3r/PrintConfig.cpp:416 msgid "" "You can set this to a positive value to disable fan at all during the first " "layers, so that it does not make adhesion worse." @@ -4831,18 +9333,11 @@ msgstr "" "протягом друку декількох перших шарів, щоб це не призвело до гіршого " "зчеплення." -#: src/libslic3r/PrintConfig.cpp:325 src/libslic3r/PrintConfig.cpp:945 -#: src/libslic3r/PrintConfig.cpp:1434 src/libslic3r/PrintConfig.cpp:1619 -#: src/libslic3r/PrintConfig.cpp:1680 src/libslic3r/PrintConfig.cpp:1843 -#: src/libslic3r/PrintConfig.cpp:1888 -msgid "layers" -msgstr "шару(ів)" - -#: src/libslic3r/PrintConfig.cpp:332 +#: src/libslic3r/PrintConfig.cpp:425 msgid "Don't support bridges" msgstr "Не підтримувати мости" -#: src/libslic3r/PrintConfig.cpp:334 +#: src/libslic3r/PrintConfig.cpp:427 msgid "" "Experimental option for preventing support material from being generated " "under bridged areas." @@ -4850,51 +9345,42 @@ msgstr "" "Експериментальний варіант для запобігання утворенню допоміжного матеріалу в " "областях під мостами." -#: src/libslic3r/PrintConfig.cpp:340 +#: src/libslic3r/PrintConfig.cpp:433 msgid "Distance between copies" msgstr "Відстань між копіями" -#: src/libslic3r/PrintConfig.cpp:341 +#: src/libslic3r/PrintConfig.cpp:434 msgid "Distance used for the auto-arrange feature of the plater." msgstr "Відстань використовується для автоматичного розташування платеру." -#: src/libslic3r/PrintConfig.cpp:348 -msgid "Elephant foot compensation" -msgstr "Зрівноваження Стопи слона" - -#: src/libslic3r/PrintConfig.cpp:350 -msgid "" -"The first layer will be shrunk in the XY plane by the configured value to " -"compensate for the 1st layer squish aka an Elephant Foot effect." -msgstr "" -"Перший шар буде зменшено в площині XY завдяки налаштованому значенню, щоб " -"компенсувати ефект Ноги Слона для 1-го шару." - -#: src/libslic3r/PrintConfig.cpp:359 +#: src/libslic3r/PrintConfig.cpp:442 msgid "" "This end procedure is inserted at the end of the output file. Note that you " -"can use placeholder variables for all Slic3r settings." +"can use placeholder variables for all PrusaSlicer settings." msgstr "" -"Ця кінцева процедура вставляється в кінці вихідного файлу. Зауважте, що ви " -"можете використовувати заповнювачі змінних для всіх параметрів Slic3r." +"Ця процедура завершення вставляється в кінець вихідного файлу. Зверніть " +"увагу, що ви можете використовувати шаблонні змінні для всіх налаштувань " +"PrusaSlicer." -#: src/libslic3r/PrintConfig.cpp:369 +#: src/libslic3r/PrintConfig.cpp:452 msgid "" "This end procedure is inserted at the end of the output file, before the " -"printer end gcode. Note that you can use placeholder variables for all " -"Slic3r settings. If you have multiple extruders, the gcode is processed in " -"extruder order." -msgstr "" -"Ця кінцева процедура вставляється в кінці вихідного файлу перед кінцевим " -"кодом принтера. Зауважте, що ви можете використовувати заповнювачі змінних " -"для всіх параметрів Slic3r. Якщо у вас є кілька екструдерів, G-code " -"обробляється в порядку екструдерів." - -#: src/libslic3r/PrintConfig.cpp:379 +"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 "" +"Ця процедура завершення вставляється в кінець вихідного файлу, перед " +"кінцевим кодом принтера (і перед будь-якою заміною інструменту з цього " +"філаменту у разі багатоматеріальних принтерів). Зверніть увагу, що ви можете " +"використовувати шаблонні змінні для всіх налаштувань PrusaSlicer. Якщо у вас " +"кілька екструдерів, G-код обробляється в порядку екструдера." + +#: src/libslic3r/PrintConfig.cpp:463 msgid "Ensure vertical shell thickness" -msgstr "Перевірте товщину вертикальної оболонки" +msgstr "Забезпечення товщини вертикальної оболонки" -#: src/libslic3r/PrintConfig.cpp:381 +#: src/libslic3r/PrintConfig.cpp:465 msgid "" "Add solid infill near sloping surfaces to guarantee the vertical shell " "thickness (top+bottom solid layers)." @@ -4902,52 +9388,64 @@ msgstr "" "Додайте суцільні наповнювачі біля нахилених поверхонь, щоб гарантувати " "товщину вертикальної оболонки (верхній і нижній суцільні шари)." -#: src/libslic3r/PrintConfig.cpp:387 +#: src/libslic3r/PrintConfig.cpp:471 msgid "Top fill pattern" -msgstr "" +msgstr "Верхній шаблон наповнення" -#: src/libslic3r/PrintConfig.cpp:389 +#: src/libslic3r/PrintConfig.cpp:473 msgid "" "Fill pattern for top infill. This only affects the top visible layer, and " "not its adjacent solid shells." msgstr "" +"Шаблон для верхнього наповнення. Це впливає лише на зовнішній видимий шар, а " +"не на сусідні суцільні оболонки." -#: src/libslic3r/PrintConfig.cpp:397 src/libslic3r/PrintConfig.cpp:795 -#: src/libslic3r/PrintConfig.cpp:1921 +#: src/libslic3r/PrintConfig.cpp:483 src/libslic3r/PrintConfig.cpp:918 +#: src/libslic3r/PrintConfig.cpp:2236 msgid "Rectilinear" -msgstr "" +msgstr "Прямолінійний" -#: src/libslic3r/PrintConfig.cpp:398 src/libslic3r/PrintConfig.cpp:801 +#: src/libslic3r/PrintConfig.cpp:484 +msgid "Monotonic" +msgstr "Монотонне" + +#: src/libslic3r/PrintConfig.cpp:485 src/libslic3r/PrintConfig.cpp:919 +msgid "Aligned Rectilinear" +msgstr "Вирівняний прямолінійний" + +#: src/libslic3r/PrintConfig.cpp:486 src/libslic3r/PrintConfig.cpp:925 msgid "Concentric" -msgstr "" +msgstr "Концентричний" -#: src/libslic3r/PrintConfig.cpp:399 src/libslic3r/PrintConfig.cpp:805 +#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:929 msgid "Hilbert Curve" -msgstr "" +msgstr "Крива Гільберта" -#: src/libslic3r/PrintConfig.cpp:400 src/libslic3r/PrintConfig.cpp:806 +#: src/libslic3r/PrintConfig.cpp:488 src/libslic3r/PrintConfig.cpp:930 msgid "Archimedean Chords" -msgstr "" +msgstr "Архімедові акорди" -#: src/libslic3r/PrintConfig.cpp:401 src/libslic3r/PrintConfig.cpp:807 +#: src/libslic3r/PrintConfig.cpp:489 src/libslic3r/PrintConfig.cpp:931 msgid "Octagram Spiral" -msgstr "" +msgstr "Спіраль октаграм" -#: src/libslic3r/PrintConfig.cpp:408 +#: src/libslic3r/PrintConfig.cpp:495 msgid "Bottom fill pattern" -msgstr "" +msgstr "Нижній шаблон наповнення" -#: src/libslic3r/PrintConfig.cpp:409 +#: src/libslic3r/PrintConfig.cpp:497 msgid "" "Fill pattern for bottom infill. This only affects the bottom external " "visible layer, and not its adjacent solid shells." msgstr "" +"Шаблон для нижнього наповнення. Це впливає лише на зовнішній видимий шар, а " +"не на сусідні суцільні оболонки." -#: src/libslic3r/PrintConfig.cpp:414 src/libslic3r/PrintConfig.cpp:424 +#: src/libslic3r/PrintConfig.cpp:506 src/libslic3r/PrintConfig.cpp:517 msgid "External perimeters" msgstr "Зовнішні периметри" -#: src/libslic3r/PrintConfig.cpp:416 +#: src/libslic3r/PrintConfig.cpp:508 msgid "" "Set this to a non-zero value to set a manual extrusion width for external " "perimeters. If left zero, default extrusion width will be used if set, " @@ -4960,14 +9458,16 @@ msgstr "" "сопла. Якщо він виражений у відсотках (наприклад, 200%), він буде " "обчислюватися за висотою шару." -#: src/libslic3r/PrintConfig.cpp:419 src/libslic3r/PrintConfig.cpp:834 -#: src/libslic3r/PrintConfig.cpp:966 src/libslic3r/PrintConfig.cpp:1353 -#: src/libslic3r/PrintConfig.cpp:1691 src/libslic3r/PrintConfig.cpp:1864 -#: src/libslic3r/PrintConfig.cpp:2022 -msgid "mm or % (leave 0 for default)" -msgstr "мм або % (залиште 0 за замовчанням)" +#: src/libslic3r/PrintConfig.cpp:511 src/libslic3r/PrintConfig.cpp:621 +#: src/libslic3r/PrintConfig.cpp:962 src/libslic3r/PrintConfig.cpp:975 +#: src/libslic3r/PrintConfig.cpp:1104 src/libslic3r/PrintConfig.cpp:1159 +#: src/libslic3r/PrintConfig.cpp:1185 src/libslic3r/PrintConfig.cpp:1632 +#: src/libslic3r/PrintConfig.cpp:1961 src/libslic3r/PrintConfig.cpp:2110 +#: src/libslic3r/PrintConfig.cpp:2178 src/libslic3r/PrintConfig.cpp:2339 +msgid "mm or %" +msgstr "мм або %" -#: src/libslic3r/PrintConfig.cpp:426 +#: src/libslic3r/PrintConfig.cpp:519 msgid "" "This separate setting will affect the speed of external perimeters (the " "visible ones). If expressed as percentage (for example: 80%) it will be " @@ -4978,17 +9478,17 @@ msgstr "" "налаштування швидкості периметра вище. Встановити 0 для автоматичного " "використання." -#: src/libslic3r/PrintConfig.cpp:429 src/libslic3r/PrintConfig.cpp:855 -#: src/libslic3r/PrintConfig.cpp:1650 src/libslic3r/PrintConfig.cpp:1701 -#: src/libslic3r/PrintConfig.cpp:1907 src/libslic3r/PrintConfig.cpp:2034 +#: src/libslic3r/PrintConfig.cpp:522 src/libslic3r/PrintConfig.cpp:984 +#: src/libslic3r/PrintConfig.cpp:1920 src/libslic3r/PrintConfig.cpp:1972 +#: src/libslic3r/PrintConfig.cpp:2222 src/libslic3r/PrintConfig.cpp:2352 msgid "mm/s or %" msgstr "мм/с або %" -#: src/libslic3r/PrintConfig.cpp:436 +#: src/libslic3r/PrintConfig.cpp:529 msgid "External perimeters first" msgstr "Спочатку зовнішні периметри" -#: src/libslic3r/PrintConfig.cpp:438 +#: src/libslic3r/PrintConfig.cpp:531 msgid "" "Print contour perimeters from the outermost one to the innermost one instead " "of the default inverse order." @@ -4996,12 +9496,11 @@ msgstr "" "Друкувати контури периметра від найзовнішнього до найвнутрішнього, замість " "інверсного порядку за замовчанням." -#: src/libslic3r/PrintConfig.cpp:444 +#: src/libslic3r/PrintConfig.cpp:537 msgid "Extra perimeters if needed" msgstr "Додаткові периметри, якщо необхідно" -#: src/libslic3r/PrintConfig.cpp:446 -#, no-c-format +#: src/libslic3r/PrintConfig.cpp:539 msgid "" "Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r " "keeps adding perimeters, until more than 70% of the loop immediately above " @@ -5011,7 +9510,7 @@ msgstr "" "Slic3r продовжує додавати периметри, поки підтримується більше 70% петель " "безпосередньо вище." -#: src/libslic3r/PrintConfig.cpp:456 +#: src/libslic3r/PrintConfig.cpp:549 msgid "" "The extruder to use (unless more specific extruder settings are specified). " "This value overrides perimeter and infill extruders, but not the support " @@ -5021,7 +9520,7 @@ msgstr "" "екструдера). Це значення перевизначає екструдери периметра та наповнювача, " "але не екструдери підтримки." -#: src/libslic3r/PrintConfig.cpp:468 +#: src/libslic3r/PrintConfig.cpp:561 msgid "" "Set this to the vertical distance between your nozzle tip and (usually) the " "X carriage rods. In other words, this is the height of the clearance " @@ -5033,11 +9532,7 @@ msgstr "" "навколо вашого екструдера, і це являє собою максимальну глибину, яку " "екструдер може розглядати до зіткнення з іншими друкованими предметами." -#: src/libslic3r/PrintConfig.cpp:478 -msgid "Radius" -msgstr "Радіус" - -#: src/libslic3r/PrintConfig.cpp:479 +#: src/libslic3r/PrintConfig.cpp:572 msgid "" "Set this to the clearance radius around your extruder. If the extruder is " "not centered, choose the largest value for safety. This setting is used to " @@ -5048,20 +9543,20 @@ msgstr "" "параметр використовується для перевірки зіткнень та відображення графічного " "попереднього перегляду в панелі." -#: src/libslic3r/PrintConfig.cpp:489 +#: src/libslic3r/PrintConfig.cpp:582 msgid "Extruder Color" msgstr "Колір екструдера" -#: src/libslic3r/PrintConfig.cpp:490 src/libslic3r/PrintConfig.cpp:550 +#: src/libslic3r/PrintConfig.cpp:583 src/libslic3r/PrintConfig.cpp:645 msgid "This is only used in the Slic3r interface as a visual help." msgstr "" "Ця опція використовується лише у інтерфейсі Slic3r як візуальна допомога." -#: src/libslic3r/PrintConfig.cpp:496 +#: src/libslic3r/PrintConfig.cpp:589 msgid "Extruder offset" msgstr "Зміщення екструдеру" -#: src/libslic3r/PrintConfig.cpp:497 +#: src/libslic3r/PrintConfig.cpp:590 msgid "" "If your firmware doesn't handle the extruder displacement you need the G-" "code to take it into account. This option lets you specify the displacement " @@ -5073,11 +9568,11 @@ msgstr "" "відносно першого. Він очікує позитивних координат (вони будуть віднімані від " "координати XY)." -#: src/libslic3r/PrintConfig.cpp:506 +#: src/libslic3r/PrintConfig.cpp:599 msgid "Extrusion axis" msgstr "Ось екструзії" -#: src/libslic3r/PrintConfig.cpp:507 +#: src/libslic3r/PrintConfig.cpp:600 msgid "" "Use this option to set the axis letter associated to your printer's extruder " "(usually E but some printers use A)." @@ -5085,11 +9580,11 @@ msgstr "" "Використовуйте цю опцію, щоб встановити букву осей, пов'язану з екструдером " "принтера (зазвичай E, але деякі принтери використовують A)." -#: src/libslic3r/PrintConfig.cpp:512 +#: src/libslic3r/PrintConfig.cpp:605 msgid "Extrusion multiplier" msgstr "Коефіцієнт екструзії" -#: src/libslic3r/PrintConfig.cpp:513 +#: src/libslic3r/PrintConfig.cpp:606 msgid "" "This factor changes the amount of flow proportionally. You may need to tweak " "this setting to get nice surface finish and correct single wall widths. " @@ -5099,14 +9594,14 @@ msgstr "" "Цей фактор пропорційно змінює величину потоку. Вам може знадобитися " "налаштувати цей параметр, щоб отримати хорошу обробку поверхні та правильно " "визначити ширину однієї стіни. Звичайні значення - від 0,9 до 1,1. Якщо ви " -"вважаєте, що його потрібно більше змінити, перевірте діаметр нитки та E " +"вважаєте, що його потрібно більше змінити, перевірте діаметр філаменту та E " "кроки прошивки ." -#: src/libslic3r/PrintConfig.cpp:521 +#: src/libslic3r/PrintConfig.cpp:615 msgid "Default extrusion width" msgstr "Ширина екструзії за замовчанням" -#: src/libslic3r/PrintConfig.cpp:523 +#: src/libslic3r/PrintConfig.cpp:617 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 " @@ -5120,15 +9615,11 @@ msgstr "" "наповнювача тощо). Якщо значення виражене у відсотках (наприклад: 230%), " "воно буде обчислюватися за висотою шару." -#: src/libslic3r/PrintConfig.cpp:527 -msgid "mm or % (leave 0 for auto)" -msgstr "мм або % (залиште 0 для автообчислення)" - -#: src/libslic3r/PrintConfig.cpp:532 +#: src/libslic3r/PrintConfig.cpp:628 msgid "Keep fan always on" msgstr "Тримайте вентилятор завжди" -#: src/libslic3r/PrintConfig.cpp:533 +#: src/libslic3r/PrintConfig.cpp:629 msgid "" "If this is enabled, fan will never be disabled and will be kept running at " "least at its minimum speed. Useful for PLA, harmful for ABS." @@ -5137,11 +9628,11 @@ msgstr "" "триматися, як мінімум, на мінімальній швидкості. Корисно для PLA, шкідливо " "для ABS." -#: src/libslic3r/PrintConfig.cpp:538 +#: src/libslic3r/PrintConfig.cpp:634 msgid "Enable fan if layer print time is below" msgstr "Увімкнути вентилятор, якщо час друку шару нижче" -#: src/libslic3r/PrintConfig.cpp:539 +#: src/libslic3r/PrintConfig.cpp:635 msgid "" "If layer print time is estimated below this number of seconds, fan will be " "enabled and its speed will be calculated by interpolating the minimum and " @@ -5151,27 +9642,27 @@ msgstr "" "активований, а його швидкість буде розрахована шляхом інтерполяції " "мінімальної та максимальної швидкості." -#: src/libslic3r/PrintConfig.cpp:541 src/libslic3r/PrintConfig.cpp:1637 +#: src/libslic3r/PrintConfig.cpp:637 src/libslic3r/PrintConfig.cpp:1908 msgid "approximate seconds" msgstr "приблизні секунди" -#: src/libslic3r/PrintConfig.cpp:549 +#: src/libslic3r/PrintConfig.cpp:644 msgid "Color" msgstr "Колір" -#: src/libslic3r/PrintConfig.cpp:555 +#: src/libslic3r/PrintConfig.cpp:650 msgid "Filament notes" msgstr "Примітки до філаменту" -#: src/libslic3r/PrintConfig.cpp:556 +#: src/libslic3r/PrintConfig.cpp:651 msgid "You can put your notes regarding the filament here." msgstr "Тут ви можете помістити свої нотатки щодо філаменту." -#: src/libslic3r/PrintConfig.cpp:564 src/libslic3r/PrintConfig.cpp:1181 +#: src/libslic3r/PrintConfig.cpp:659 src/libslic3r/PrintConfig.cpp:1455 msgid "Max volumetric speed" msgstr "Максимальна об'ємна швидкість" -#: src/libslic3r/PrintConfig.cpp:565 +#: src/libslic3r/PrintConfig.cpp:660 msgid "" "Maximum volumetric speed allowed for this filament. Limits the maximum " "volumetric speed of a print to the minimum of print and filament volumetric " @@ -5181,79 +9672,86 @@ msgstr "" "максимальну об'ємну швидкість друку до мінімуму об'ємної швидкості друку та " "філаметну. Встановити 0 для відсутності обмежень." -#: src/libslic3r/PrintConfig.cpp:568 src/libslic3r/PrintConfig.cpp:1184 -msgid "mm³/s" -msgstr "мм³/с" - -#: src/libslic3r/PrintConfig.cpp:574 +#: src/libslic3r/PrintConfig.cpp:669 msgid "Loading speed" -msgstr "" +msgstr "Швидкість заведення" -#: src/libslic3r/PrintConfig.cpp:575 -msgid "Speed used for loading the filament on the wipe tower. " +#: src/libslic3r/PrintConfig.cpp:670 +msgid "Speed used for loading the filament on the wipe tower." msgstr "" +"Швидкість, що використовується для заведення філаменту на вежі витирання." -#: src/libslic3r/PrintConfig.cpp:582 +#: src/libslic3r/PrintConfig.cpp:677 msgid "Loading speed at the start" -msgstr "" +msgstr "Швидкість заведення на старті" -#: src/libslic3r/PrintConfig.cpp:583 -msgid "Speed used at the very beginning of loading phase. " -msgstr "" +#: src/libslic3r/PrintConfig.cpp:678 +msgid "Speed used at the very beginning of loading phase." +msgstr "Швидкість, що використовується на самому початку фази заведення." -#: src/libslic3r/PrintConfig.cpp:590 +#: src/libslic3r/PrintConfig.cpp:685 msgid "Unloading speed" -msgstr "" +msgstr "Швидкість виведення" -#: src/libslic3r/PrintConfig.cpp:591 +#: src/libslic3r/PrintConfig.cpp:686 msgid "" "Speed used for unloading the filament on the wipe tower (does not affect " -"initial part of unloading just after ramming). " +"initial part of unloading just after ramming)." msgstr "" +"Швидкість, яка використовується для виведення філаменту на вежі витирання " +"(не впливає на початкову частину виведення безпосередньо після раммінгу)." -#: src/libslic3r/PrintConfig.cpp:599 +#: src/libslic3r/PrintConfig.cpp:694 msgid "Unloading speed at the start" -msgstr "" +msgstr "Швидкість виведення на старті" -#: src/libslic3r/PrintConfig.cpp:600 +#: src/libslic3r/PrintConfig.cpp:695 msgid "" -"Speed used for unloading the tip of the filament immediately after ramming. " +"Speed used for unloading the tip of the filament immediately after ramming." msgstr "" +"Швидкість, яка використовується для виведення кінчику філаменту " +"безпосередньо після раммінгу." -#: src/libslic3r/PrintConfig.cpp:607 +#: src/libslic3r/PrintConfig.cpp:702 msgid "Delay after unloading" -msgstr "" +msgstr "Затримка після виведення" -#: src/libslic3r/PrintConfig.cpp:608 +#: src/libslic3r/PrintConfig.cpp:703 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. " +"original dimensions." msgstr "" +"Час очікування після виведення філаменту. Може допомогти отримати надійну " +"заміну інструменту для гнучких матеріалів, яким може знадобитися більше " +"часу, щоб зменшитись до початкових розмірів." -#: src/libslic3r/PrintConfig.cpp:617 +#: src/libslic3r/PrintConfig.cpp:712 msgid "Number of cooling moves" -msgstr "" +msgstr "Кількість охолоджуючих рухів" -#: src/libslic3r/PrintConfig.cpp:618 +#: src/libslic3r/PrintConfig.cpp:713 msgid "" "Filament is cooled by being moved back and forth in the cooling tubes. " -"Specify desired number of these moves " +"Specify desired number of these moves." msgstr "" +"Філамент охолоджується шляхом переміщення вперед-назад у охолоджувальних " +"трубках. Вкажіть бажану кількість цих рухів." -#: src/libslic3r/PrintConfig.cpp:626 +#: src/libslic3r/PrintConfig.cpp:721 msgid "Speed of the first cooling move" -msgstr "" +msgstr "Швидкість першого охолоджуючого руху" -#: src/libslic3r/PrintConfig.cpp:627 -msgid "Cooling moves are gradually accelerating beginning at this speed. " +#: src/libslic3r/PrintConfig.cpp:722 +msgid "Cooling moves are gradually accelerating beginning at this speed." msgstr "" +"Охолоджувальні рухи поступово прискорюються, починаючи з цієї швидкості." -#: src/libslic3r/PrintConfig.cpp:634 +#: src/libslic3r/PrintConfig.cpp:729 msgid "Minimal purge on wipe tower" -msgstr "" +msgstr "Мінімальний екструдований об'єм на очисній вежі" -#: src/libslic3r/PrintConfig.cpp:635 +#: src/libslic3r/PrintConfig.cpp:730 msgid "" "After a tool change, the exact position of the newly loaded filament inside " "the nozzle may not be known, and the filament pressure is likely not yet " @@ -5261,66 +9759,80 @@ msgid "" "object, Slic3r will always prime this amount of material into the wipe tower " "to produce successive infill or sacrificial object extrusions reliably." msgstr "" +"Після зміни інструменту точне положення знову заведеного філаменту всередину " +"сопла може бути невідоме, а тиск філаменту, скоріше за все, ще не " +"стабільний. Перш ніж прочищати друкувальну головку до заповнення або " +"очищувальної вежі, Slic3r завжди продавлює цю кількість матеріалу до " +"очищувальної вежі, щоб отримати послідовне заповнення." -#: src/libslic3r/PrintConfig.cpp:639 +#: src/libslic3r/PrintConfig.cpp:734 msgid "mm³" -msgstr "" +msgstr "мм³" -#: src/libslic3r/PrintConfig.cpp:645 +#: src/libslic3r/PrintConfig.cpp:740 msgid "Speed of the last cooling move" -msgstr "" +msgstr "Швидкість останнього охолоджуючого руху" -#: src/libslic3r/PrintConfig.cpp:646 -msgid "Cooling moves are gradually accelerating towards this speed. " -msgstr "" +#: src/libslic3r/PrintConfig.cpp:741 +msgid "Cooling moves are gradually accelerating towards this speed." +msgstr "Охолоджувальні рухи поступово прискорюються до цієї швидкості." -#: src/libslic3r/PrintConfig.cpp:653 +#: src/libslic3r/PrintConfig.cpp:748 msgid "Filament load time" -msgstr "" +msgstr "Час заведення філаменту" -#: src/libslic3r/PrintConfig.cpp:654 +#: src/libslic3r/PrintConfig.cpp:749 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to load a new " "filament during a tool change (when executing the T code). This time is " "added to the total print time by the G-code time estimator." msgstr "" +"Час для прошивки принтера (або Multi Material Unit 2.0), щоб завести новий " +"філамент під час заміни інструменту (під час виконання коду Т). Цей час " +"додається до загального часу друку за допомогою оцінювача часу G-коду." -#: src/libslic3r/PrintConfig.cpp:661 +#: src/libslic3r/PrintConfig.cpp:756 msgid "Ramming parameters" -msgstr "" +msgstr "Параметри раммінгу" -#: src/libslic3r/PrintConfig.cpp:662 +#: src/libslic3r/PrintConfig.cpp:757 msgid "" "This string is edited by RammingDialog and contains ramming specific " -"parameters " +"parameters." msgstr "" +"Цей рядок відредаговано у діалогу налаштувань раммінгу та містить певні " +"параметри раммінгу." -#: src/libslic3r/PrintConfig.cpp:668 +#: src/libslic3r/PrintConfig.cpp:763 msgid "Filament unload time" -msgstr "" +msgstr "Час виведення філаменту" -#: src/libslic3r/PrintConfig.cpp:669 +#: src/libslic3r/PrintConfig.cpp:764 msgid "" "Time for the printer firmware (or the Multi Material Unit 2.0) to unload a " "filament during a tool change (when executing the T code). This time is " "added to the total print time by the G-code time estimator." msgstr "" +"Час для прошивки принтера (або Multi Material Unit 2.0), щоб вивести " +"філамент під час заміни інструменту (під час виконання коду Т). Цей час " +"додається до загального часу друку за допомогою оцінювача часу G-коду." -#: src/libslic3r/PrintConfig.cpp:677 +#: src/libslic3r/PrintConfig.cpp:772 msgid "" "Enter your filament diameter here. Good precision is required, so use a " "caliper and do multiple measurements along the filament, then compute the " "average." msgstr "" "Введіть тут діаметр свого філаменту. Необхідна висока точність, тому " -"використовуйте суматор і виконайте декілька вимірювань вздовж нитки, потім " -"обчисліть середнє значення." +"використовуйте суматор і виконайте декілька вимірювань вздовж філаменту, " +"потім обчисліть середнє значення." -#: src/libslic3r/PrintConfig.cpp:684 +#: src/libslic3r/PrintConfig.cpp:779 src/libslic3r/PrintConfig.cpp:2731 +#: src/libslic3r/PrintConfig.cpp:2732 msgid "Density" msgstr "Щільність" -#: src/libslic3r/PrintConfig.cpp:685 +#: src/libslic3r/PrintConfig.cpp:780 msgid "" "Enter your filament density here. This is only for statistical information. " "A decent way is to weigh a known length of filament and compute the ratio of " @@ -5328,31 +9840,31 @@ msgid "" "displacement." msgstr "" "Введіть тут щільність свого філаменту. Це тільки для статистичної " -"інформації. Пристойним способом є зважування відомої довжини нитки та " +"інформації. Пристойним способом є зважування відомої довжини філаменту та " "обчислення співвідношення довжини до обсягу. Краще обчислити об'єм " "безпосередньо через зміщення." -#: src/libslic3r/PrintConfig.cpp:688 +#: src/libslic3r/PrintConfig.cpp:783 msgid "g/cm³" msgstr "г/см³" -#: src/libslic3r/PrintConfig.cpp:693 +#: src/libslic3r/PrintConfig.cpp:788 msgid "Filament type" msgstr "Тип філаменту" -#: src/libslic3r/PrintConfig.cpp:694 +#: src/libslic3r/PrintConfig.cpp:789 msgid "The filament material type for use in custom G-codes." -msgstr "" +msgstr "Тип матеріалу філаменту для використання в користувацьких G-кодах." -#: src/libslic3r/PrintConfig.cpp:710 +#: src/libslic3r/PrintConfig.cpp:816 msgid "Soluble material" msgstr "Розчинний матеріал" -#: src/libslic3r/PrintConfig.cpp:711 +#: src/libslic3r/PrintConfig.cpp:817 msgid "Soluble material is most likely used for a soluble support." msgstr "Розчинний матеріал переважно використовується для розчинної підтримки." -#: src/libslic3r/PrintConfig.cpp:717 +#: src/libslic3r/PrintConfig.cpp:823 msgid "" "Enter your filament cost per kg here. This is only for statistical " "information." @@ -5360,15 +9872,39 @@ msgstr "" "Введіть тут свою вартість філаменту на кг. Це тільки для статистичної " "інформації." -#: src/libslic3r/PrintConfig.cpp:718 +#: src/libslic3r/PrintConfig.cpp:824 msgid "money/kg" msgstr "грошових одиниць/кг" -#: src/libslic3r/PrintConfig.cpp:727 +#: src/libslic3r/PrintConfig.cpp:829 +msgid "Spool weight" +msgstr "Вага котушки" + +#: src/libslic3r/PrintConfig.cpp:830 +msgid "" +"Enter weight of the empty filament spool. One may weigh a partially consumed " +"filament spool before printing and one may compare the measured weight with " +"the calculated weight of the filament with the spool to find out whether the " +"amount of filament on the spool is sufficient to finish the print." +msgstr "" +"Введіть вагу порожньої котушки філаменту. Перед друком можна зважити " +"частково витрачену котушку філаменту, а можна порівняти виміряну вагу з " +"розрахунковою вагою філаменту з котушкою, щоб з’ясувати, чи достатньо " +"кількості філаменту на котушці для закінчення друку." + +#: src/libslic3r/PrintConfig.cpp:834 +msgid "g" +msgstr "г" + +#: src/libslic3r/PrintConfig.cpp:843 src/libslic3r/PrintConfig.cpp:2815 +msgid "(Unknown)" +msgstr "(Невідомий)" + +#: src/libslic3r/PrintConfig.cpp:847 msgid "Fill angle" msgstr "Кут наповнення" -#: src/libslic3r/PrintConfig.cpp:729 +#: src/libslic3r/PrintConfig.cpp:849 msgid "" "Default base angle for infill orientation. Cross-hatching will be applied to " "this. Bridges will be infilled using the best direction Slic3r can detect, " @@ -5378,60 +9914,68 @@ msgstr "" "застосовуватися крос-штрих. Мости будуть заповнені, використовуючи найкращий " "напрям, який може виявити Slic3r, тому цей параметр на них не впливає." -#: src/libslic3r/PrintConfig.cpp:741 +#: src/libslic3r/PrintConfig.cpp:861 msgid "Fill density" msgstr "Щільність заповнення" -#: src/libslic3r/PrintConfig.cpp:743 +#: src/libslic3r/PrintConfig.cpp:863 msgid "Density of internal infill, expressed in the range 0% - 100%." msgstr "Щільність внутрішнього заповнення, виражена в діапазоні 0% - 100%." -#: src/libslic3r/PrintConfig.cpp:778 +#: src/libslic3r/PrintConfig.cpp:898 msgid "Fill pattern" msgstr "Шаблон заповнення" -#: src/libslic3r/PrintConfig.cpp:780 +#: src/libslic3r/PrintConfig.cpp:900 msgid "Fill pattern for general low-density infill." msgstr "Шаблон заповнення для загального низько-швидкісного наповнення." -#: src/libslic3r/PrintConfig.cpp:796 +#: src/libslic3r/PrintConfig.cpp:920 msgid "Grid" -msgstr "" +msgstr "Сітка" -#: src/libslic3r/PrintConfig.cpp:797 +#: src/libslic3r/PrintConfig.cpp:921 msgid "Triangles" -msgstr "" +msgstr "Трикутники" -#: src/libslic3r/PrintConfig.cpp:798 +#: src/libslic3r/PrintConfig.cpp:922 msgid "Stars" -msgstr "" +msgstr "Зірки" -#: src/libslic3r/PrintConfig.cpp:799 +#: src/libslic3r/PrintConfig.cpp:923 msgid "Cubic" -msgstr "" +msgstr "Кубічний" -#: src/libslic3r/PrintConfig.cpp:800 +#: src/libslic3r/PrintConfig.cpp:924 msgid "Line" -msgstr "" +msgstr "Лінії" -#: src/libslic3r/PrintConfig.cpp:802 src/libslic3r/PrintConfig.cpp:1923 +#: src/libslic3r/PrintConfig.cpp:926 src/libslic3r/PrintConfig.cpp:2238 msgid "Honeycomb" -msgstr "" +msgstr "Стільниковий" -#: src/libslic3r/PrintConfig.cpp:803 +#: src/libslic3r/PrintConfig.cpp:927 msgid "3D Honeycomb" -msgstr "" +msgstr "3D стільник" -#: src/libslic3r/PrintConfig.cpp:804 +#: src/libslic3r/PrintConfig.cpp:928 msgid "Gyroid" -msgstr "" +msgstr "Гіроїд" -#: src/libslic3r/PrintConfig.cpp:811 src/libslic3r/PrintConfig.cpp:820 -#: src/libslic3r/PrintConfig.cpp:828 src/libslic3r/PrintConfig.cpp:861 +#: src/libslic3r/PrintConfig.cpp:932 +msgid "Adaptive Cubic" +msgstr "Адаптивний кубічний" + +#: src/libslic3r/PrintConfig.cpp:933 +msgid "Support Cubic" +msgstr "Кубічна підтримка" + +#: src/libslic3r/PrintConfig.cpp:937 src/libslic3r/PrintConfig.cpp:946 +#: src/libslic3r/PrintConfig.cpp:956 src/libslic3r/PrintConfig.cpp:990 msgid "First layer" msgstr "Перший шар" -#: src/libslic3r/PrintConfig.cpp:812 +#: src/libslic3r/PrintConfig.cpp:938 msgid "" "This is the acceleration your printer will use for first layer. Set zero to " "disable acceleration control for first layer." @@ -5439,7 +9983,11 @@ msgstr "" "Це прискорення, яке ваш принтер використовуватиме для першого шару. " "Встановити 0, щоб вимкнути керування прискоренням для першого шару." -#: src/libslic3r/PrintConfig.cpp:821 +#: src/libslic3r/PrintConfig.cpp:947 +msgid "First layer bed temperature" +msgstr "Температура столу на першому шарі" + +#: src/libslic3r/PrintConfig.cpp:948 msgid "" "Heated build plate temperature for the first layer. Set this to zero to " "disable bed temperature control commands in the output." @@ -5447,7 +9995,7 @@ msgstr "" "Температура підігрітої збірної пластини для першого шару. Установіть 0, щоб " "відключити команди керування температурою полотна на виході." -#: src/libslic3r/PrintConfig.cpp:830 +#: src/libslic3r/PrintConfig.cpp:958 msgid "" "Set this to a non-zero value to set a manual extrusion width for first " "layer. You can use this to force fatter extrudates for better adhesion. If " @@ -5460,11 +10008,7 @@ msgstr "" "(наприклад, 120%), вона буде обчислена за висотою першого шару. Якщо " "встановлено на 0 - використовуватиме стандартну ширину екструзії." -#: src/libslic3r/PrintConfig.cpp:840 -msgid "First layer height" -msgstr "Висота першого шару" - -#: src/libslic3r/PrintConfig.cpp:842 +#: src/libslic3r/PrintConfig.cpp:971 msgid "" "When printing with very low layer heights, you might still want to print a " "thicker bottom layer to improve adhesion and tolerance for non perfect build " @@ -5476,16 +10020,11 @@ msgstr "" "до невідповідних збірних пластин. Можна виразити як абсолютне значення або " "як відсоток (наприклад: 150%) по висоті шару за замовчуванням." -#: src/libslic3r/PrintConfig.cpp:846 src/libslic3r/PrintConfig.cpp:991 -#: src/libslic3r/PrintConfig.cpp:1796 -msgid "mm or %" -msgstr "мм або %" - -#: src/libslic3r/PrintConfig.cpp:851 +#: src/libslic3r/PrintConfig.cpp:980 msgid "First layer speed" msgstr "Швидкість першого шару" -#: src/libslic3r/PrintConfig.cpp:852 +#: src/libslic3r/PrintConfig.cpp:981 msgid "" "If expressed as absolute value in mm/s, this speed will be applied to all " "the print moves of the first layer, regardless of their type. If expressed " @@ -5496,17 +10035,39 @@ msgstr "" "вона виражена у відсотках (наприклад: 40%), вона буде масштабувати швидкість " "за замовчуванням." -#: src/libslic3r/PrintConfig.cpp:862 +#: src/libslic3r/PrintConfig.cpp:991 +msgid "First layer nozzle temperature" +msgstr "Температура сопла на першому шарі" + +#: src/libslic3r/PrintConfig.cpp:992 msgid "" -"Extruder temperature for first layer. If you want to control temperature " +"Nozzle temperature for the first layer. If you want to control temperature " "manually during print, set this to zero to disable temperature control " -"commands in the output file." +"commands in the output G-code." +msgstr "" +"Температура сопла для першого шару. Якщо ви хочете контролювати температуру " +"вручну під час друку, встановіть її на нуль, щоб вимкнути команди контролю " +"температури у вихідному G-коді." + +#: src/libslic3r/PrintConfig.cpp:1000 +msgid "Full fan speed at layer" +msgstr "Повна швидкість вентилятора на шарі" + +#: src/libslic3r/PrintConfig.cpp:1001 +msgid "" +"Fan speed will be ramped up linearly from zero at layer " +"\"disable_fan_first_layers\" to maximum at layer \"full_fan_speed_layer\". " +"\"full_fan_speed_layer\" will be ignored if lower than " +"\"disable_fan_first_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"disable_fan_first_layers\" + 1." msgstr "" -"Температура екструдеру для першого шару. Якщо ви хочете контролювати " -"температуру вручну під час друку, встановіть 0, щоб вимкнути команди " -"керування температурою у вихідному файлі." +"Швидкість вентилятора буде збільшена лінійно з нуля на шарі " +"\"disable_fan_first_layers\" до максимальної на шарі \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" буде проігноровано, якщо нижче " +"\"disable_fan_first_layers\", і в цьому випадку вентилятор буде працювати з " +"максимально дозволеною швидкістю на рівні \"disable_fan_first_layers\" + 1." -#: src/libslic3r/PrintConfig.cpp:871 +#: src/libslic3r/PrintConfig.cpp:1013 msgid "" "Speed for filling small gaps using short zigzag moves. Keep this reasonably " "low to avoid too much shaking and resonance issues. Set zero to disable gaps " @@ -5517,11 +10078,11 @@ msgstr "" "надмірних потрясінь та резонансних проблем. Встановити 0, щоб вимкнути " "заповнення розривів." -#: src/libslic3r/PrintConfig.cpp:879 +#: src/libslic3r/PrintConfig.cpp:1021 msgid "Verbose G-code" msgstr "Докладний G-код" -#: src/libslic3r/PrintConfig.cpp:880 +#: src/libslic3r/PrintConfig.cpp:1022 msgid "" "Enable this to get a commented G-code file, with each line explained by a " "descriptive text. If you print from SD card, the additional weight of the " @@ -5531,38 +10092,57 @@ msgstr "" "пояснюється описовим текстом. Якщо ви друкуєте з SD-карти, додаткова вага " "файлу може призвести до уповільнення прошивки." -#: src/libslic3r/PrintConfig.cpp:887 +#: src/libslic3r/PrintConfig.cpp:1029 msgid "G-code flavor" msgstr "Особливість G-коду" -#: src/libslic3r/PrintConfig.cpp:888 +#: src/libslic3r/PrintConfig.cpp:1030 msgid "" "Some G/M-code commands, including temperature control and others, are not " "universal. Set this option to your printer's firmware to get a compatible " -"output. The \"No extrusion\" flavor prevents Slic3r from exporting any " +"output. The \"No extrusion\" flavor prevents PrusaSlicer from exporting any " "extrusion value at all." msgstr "" -"Деякі команди G/M-коду, включаючи контроль температури тощо, не є " -"універсальними. Установіть цей параметр на прошивку принтера, щоб отримати " -"сумісний вихід. \"Відсутність екструзії\" не дозволяє Slic3r експортувати " -"будь-яке значення екструзії." +"Деякі команди G/M-коду, включаючи контроль температури та інші, не є " +"універсальними. Встановіть для цього параметра мікропрограму принтера, щоб " +"отримати сумісний вихід. Наявність вибору \"Без екструзії\" захищаюсь " +"PrusaSlicer від експорту взагалі будь-яких екструзійних значень." -#: src/libslic3r/PrintConfig.cpp:911 +#: src/libslic3r/PrintConfig.cpp:1055 msgid "No extrusion" +msgstr "Без екструзії" + +#: src/libslic3r/PrintConfig.cpp:1060 +msgid "Label objects" +msgstr "Маркувати об'єкти" + +#: src/libslic3r/PrintConfig.cpp:1061 +msgid "" +"Enable this to add comments into the G-Code labeling print moves with what " +"object they belong to, which is useful for the Octoprint CancelObject " +"plugin. This settings is NOT compatible with Single Extruder Multi Material " +"setup and Wipe into Object / Wipe into Infill." msgstr "" +"Увімкніть це, щоб додати коментарі до ходів друку міток G-Code із об’єктом, " +"до якого вони належать, що корисно для плагіна Octoprint CancelObject. Ці " +"налаштування НЕ сумісні з параметрами \"Мульти-матеріальний (ММ) друк з " +"одним екструдером\" та \"Витирати в об'єкт\" / \"Витирати в заповнення\"." -#: src/libslic3r/PrintConfig.cpp:924 +#: src/libslic3r/PrintConfig.cpp:1068 msgid "High extruder current on filament swap" -msgstr "" +msgstr "Звищення струму екструдера на заміні філамента" -#: src/libslic3r/PrintConfig.cpp:925 +#: src/libslic3r/PrintConfig.cpp:1069 msgid "" "It may be beneficial to increase the extruder motor current during the " "filament exchange sequence to allow for rapid ramming feed rates and to " "overcome resistance when loading a filament with an ugly shaped tip." msgstr "" +"Може бути корисно збільшити струм двигуна екструдера під час заміни " +"філаменту, щоб забезпечити швидкий раммінг та подолати опір при заведенні " +"філаменту з кінчиком потворної форми." -#: src/libslic3r/PrintConfig.cpp:933 +#: src/libslic3r/PrintConfig.cpp:1077 msgid "" "This is the acceleration your printer will use for infill. Set zero to " "disable acceleration control for infill." @@ -5570,11 +10150,11 @@ msgstr "" "Це прискорення, яке ваш принтер використовуватиме для наповнення. Встановити " "0, щоб вимкнути регулятор прискорення для заповнення." -#: src/libslic3r/PrintConfig.cpp:941 +#: src/libslic3r/PrintConfig.cpp:1085 msgid "Combine infill every" msgstr "Об'єднати наповнення кожні" -#: src/libslic3r/PrintConfig.cpp:943 +#: src/libslic3r/PrintConfig.cpp:1087 msgid "" "This feature allows to combine infill and speed up your print by extruding " "thicker infill layers while preserving thin perimeters, thus accuracy." @@ -5582,19 +10162,83 @@ msgstr "" "Ця функція дозволяє поєднувати наповнення та прискорити друк, екструдуючи " "більш товсті шари наповнення, зберігаючи тонкі периметри, а отже, і точністю." -#: src/libslic3r/PrintConfig.cpp:946 +#: src/libslic3r/PrintConfig.cpp:1090 msgid "Combine infill every n layers" msgstr "Об'єднати наповнення кожні n шарів" -#: src/libslic3r/PrintConfig.cpp:952 +#: src/libslic3r/PrintConfig.cpp:1096 +msgid "Length of the infill anchor" +msgstr "Довжина якоря заповнення" + +#: src/libslic3r/PrintConfig.cpp:1098 +msgid "" +"Connect an infill line to an internal perimeter with a short segment of an " +"additional perimeter. If expressed as percentage (example: 15%) it is " +"calculated over infill extrusion width. PrusaSlicer tries to connect two " +"close infill lines to a short perimeter segment. If no such perimeter " +"segment shorter than infill_anchor_max is found, the infill line is " +"connected to a perimeter segment at just one side and the length of the " +"perimeter segment taken is limited to this parameter, but no longer than " +"anchor_length_max. Set this parameter to zero to disable anchoring " +"perimeters connected to a single infill line." +msgstr "" +"З'єднати лінію заповнення з внутрішнім периметром за допомогою короткого " +"відрізку додаткового периметра. Якщо це значення виражається у відсотках " +"(приклад: 15%), воно розраховується за шириною екструзії заповнення. " +"PrusaSlicer намагається з'єднати дві тісні лінії заповнення з коротким " +"периметром. Якщо такого відрізка периметра, коротшого за infill_anchor_max, " +"не знайдено, лінія заповнення з'єднується з відрізком периметра лише з " +"одного боку, і довжина прийнятого відрізка периметра обмежена цим " +"параметром, але не довше anchor_length_max. Встановіть для цього параметра " +"нуль, щоб вимкнути периметри закріплення, підключені до однієї лінії " +"заповнення." + +#: src/libslic3r/PrintConfig.cpp:1113 +msgid "0 (no open anchors)" +msgstr "0 (без відкритих якорів)" + +#: src/libslic3r/PrintConfig.cpp:1118 src/libslic3r/PrintConfig.cpp:1140 +msgid "1000 (unlimited)" +msgstr "1000 (необмежено)" + +#: src/libslic3r/PrintConfig.cpp:1123 +msgid "Maximum length of the infill anchor" +msgstr "Максимальна довжина якоря заповнення" + +#: src/libslic3r/PrintConfig.cpp:1125 +msgid "" +"Connect an infill line to an internal perimeter with a short segment of an " +"additional perimeter. If expressed as percentage (example: 15%) it is " +"calculated over infill extrusion width. PrusaSlicer tries to connect two " +"close infill lines to a short perimeter segment. If no such perimeter " +"segment shorter than this parameter is found, the infill line is connected " +"to a perimeter segment at just one side and the length of the perimeter " +"segment taken is limited to infill_anchor, but no longer than this " +"parameter. Set this parameter to zero to disable anchoring." +msgstr "" +"З'єднати лінію заповнення з внутрішнім периметром за допомогою короткого " +"відрізку додаткового периметра. Якщо це значення виражається у відсотках " +"(приклад: 15%), воно розраховується за шириною екструзії заповнення. " +"PrusaSlicer намагається з'єднати дві найближчі лінії заповнення з коротким " +"периметром. Якщо такого відрізка периметра, коротшого за цей параметр, не " +"знайдено, лінія заповнення з'єднується з відрізком периметра лише з одного " +"боку, і довжина прийнятого відрізка периметра обмежена параметром " +"infill_anchor, але не довше за цей параметр. Встановіть для цього параметра " +"нуль, щоб вимкнути закріплення." + +#: src/libslic3r/PrintConfig.cpp:1135 +msgid "0 (not anchored)" +msgstr "0 (не закріплено)" + +#: src/libslic3r/PrintConfig.cpp:1145 msgid "Infill extruder" msgstr "Наповнювач екструдера" -#: src/libslic3r/PrintConfig.cpp:954 +#: src/libslic3r/PrintConfig.cpp:1147 msgid "The extruder to use when printing infill." msgstr "Екструдер, використовуваний під час друку наповнення." -#: src/libslic3r/PrintConfig.cpp:962 +#: src/libslic3r/PrintConfig.cpp:1155 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill. If " "left zero, default extrusion width will be used if set, otherwise 1.125 x " @@ -5609,11 +10253,11 @@ msgstr "" "прискорити наповнення та зміцнити свої деталі. Якщо він виражений у " "відсотках (наприклад, 90%), він буде обчислюватися за висотою шару." -#: src/libslic3r/PrintConfig.cpp:971 +#: src/libslic3r/PrintConfig.cpp:1165 msgid "Infill before perimeters" msgstr "Заповнення перед периметрами" -#: src/libslic3r/PrintConfig.cpp:972 +#: src/libslic3r/PrintConfig.cpp:1166 msgid "" "This option will switch the print order of perimeters and infill, making the " "latter first." @@ -5621,11 +10265,11 @@ msgstr "" "За допомогою цього параметра можна буде змінити порядок друку периметрів та " "наповнювачів, зробивши останнє першим." -#: src/libslic3r/PrintConfig.cpp:977 +#: src/libslic3r/PrintConfig.cpp:1171 msgid "Only infill where needed" msgstr "Заповнити тільки там, де потрібно" -#: src/libslic3r/PrintConfig.cpp:979 +#: src/libslic3r/PrintConfig.cpp:1173 msgid "" "This option will limit infill to the areas actually needed for supporting " "ceilings (it will act as internal support material). If enabled, slows down " @@ -5635,11 +10279,11 @@ msgstr "" "стель (це буде діяти як внутрішній матеріал підтримки). Якщо це ввімкнено, " "сповільнюється генерація G-коду через декілька перевірок." -#: src/libslic3r/PrintConfig.cpp:986 +#: src/libslic3r/PrintConfig.cpp:1180 msgid "Infill/perimeters overlap" msgstr "Перекриття наповнення/периметрів" -#: src/libslic3r/PrintConfig.cpp:988 +#: src/libslic3r/PrintConfig.cpp:1182 msgid "" "This setting applies an additional overlap between infill and perimeters for " "better bonding. Theoretically this shouldn't be needed, but backlash might " @@ -5651,25 +10295,25 @@ msgstr "" "може спричинити розриви. Якщо він виражений у відсотках (приклад: 15%), його " "розраховують за шириною екструзії по периметру." -#: src/libslic3r/PrintConfig.cpp:999 +#: src/libslic3r/PrintConfig.cpp:1193 msgid "Speed for printing the internal fill. Set to zero for auto." msgstr "" "Швидкість друку внутрішнього заповнення. Встановити 0 для автоматичного " "обчислення." -#: src/libslic3r/PrintConfig.cpp:1007 +#: src/libslic3r/PrintConfig.cpp:1201 msgid "Inherits profile" -msgstr "" +msgstr "Успадковує профіль" -#: src/libslic3r/PrintConfig.cpp:1008 +#: src/libslic3r/PrintConfig.cpp:1202 msgid "Name of the profile, from which this profile inherits." -msgstr "" +msgstr "Ім'я профілю, від якого цей профіль успадковується." -#: src/libslic3r/PrintConfig.cpp:1021 +#: src/libslic3r/PrintConfig.cpp:1215 msgid "Interface shells" msgstr "Інтерфейсні оболонки" -#: src/libslic3r/PrintConfig.cpp:1022 +#: src/libslic3r/PrintConfig.cpp:1216 msgid "" "Force the generation of solid shells between adjacent materials/volumes. " "Useful for multi-extruder prints with translucent materials or manual " @@ -5679,7 +10323,50 @@ msgstr "" "Корисно для друку з багатьма екструдерами з напівпрозорими матеріалами або " "ручним розчинним матеріалом для підтримки." -#: src/libslic3r/PrintConfig.cpp:1031 +#: src/libslic3r/PrintConfig.cpp:1224 +msgid "Enable ironing" +msgstr "Увімкнути прасування" + +#: src/libslic3r/PrintConfig.cpp:1225 +msgid "" +"Enable ironing of the top layers with the hot print head for smooth surface" +msgstr "" +"Для гладкої поверхні увімкніть прасування верхніх шарів гарячою друкуючою " +"головкою" + +#: src/libslic3r/PrintConfig.cpp:1231 src/libslic3r/PrintConfig.cpp:1233 +msgid "Ironing Type" +msgstr "Тип прасування" + +#: src/libslic3r/PrintConfig.cpp:1238 +msgid "All top surfaces" +msgstr "Всі верхні поверхні" + +#: src/libslic3r/PrintConfig.cpp:1239 +msgid "Topmost surface only" +msgstr "Тільки верхня поверхня" + +#: src/libslic3r/PrintConfig.cpp:1240 +msgid "All solid surfaces" +msgstr "Всі тверді поверхні" + +#: src/libslic3r/PrintConfig.cpp:1245 +msgid "Flow rate" +msgstr "Швидкість потоку" + +#: src/libslic3r/PrintConfig.cpp:1247 +msgid "Percent of a flow rate relative to object's normal layer height." +msgstr "Відсоток швидкість потоку відносно нормальної висоти шару об'єкта." + +#: src/libslic3r/PrintConfig.cpp:1255 +msgid "Spacing between ironing passes" +msgstr "Відстань між лініями прасування" + +#: src/libslic3r/PrintConfig.cpp:1257 +msgid "Distance between ironing lines" +msgstr "Відстань між прасувальними лініями" + +#: src/libslic3r/PrintConfig.cpp:1274 msgid "" "This custom code is inserted at every layer change, right after the Z move " "and before the extruder moves to the first layer point. Note that you can " @@ -5688,79 +10375,194 @@ msgid "" msgstr "" "Цей користувацький код вставляється при кожній зміні шару відразу після " "переміщення Z і перед тим, як екструдер переміститься до точки першого шару. " -"Зауважте, що ви можете використовувати змінні-заповнювачі для всіх " -"параметрів Slic3r, а також [layer_num] і [layer_z]." +"Зауважте, що ви можете використовувати шаблонні змінні для всіх параметрів " +"Slic3r, а також [layer_num] і [layer_z]." -#: src/libslic3r/PrintConfig.cpp:1042 +#: src/libslic3r/PrintConfig.cpp:1285 msgid "Supports remaining times" -msgstr "" +msgstr "Підтримує час, що залишився" -#: src/libslic3r/PrintConfig.cpp:1043 +#: src/libslic3r/PrintConfig.cpp:1286 msgid "" "Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute " "intervals into the G-code to let the firmware show accurate remaining time. " "As of now only the Prusa i3 MK3 firmware recognizes M73. Also the i3 MK3 " "firmware supports M73 Qxx Sxx for the silent mode." msgstr "" +"Публікувати M73 P[відсоток друку] R[час, що залишився у хвилинах] з " +"інтервалом у 1 хвилину в G-код, щоб прошивка показувала точний час, що " +"залишився. На сьогоднішній день лише прошивка Prusa i3 MK3 розпізнає M73. " +"Також прошивка i3 MK3 підтримує M73 Qxx Sxx для тихого режиму." -#: src/libslic3r/PrintConfig.cpp:1051 -msgid "Supports silent mode" -msgstr "" +#: src/libslic3r/PrintConfig.cpp:1294 +msgid "Supports stealth mode" +msgstr "Підтримує тихий режим" -#: src/libslic3r/PrintConfig.cpp:1052 -msgid "Set silent mode for the G-code flavor" -msgstr "" +#: src/libslic3r/PrintConfig.cpp:1295 +msgid "The firmware supports stealth mode" +msgstr "Прошивка підтримує тихий режим" -#: src/libslic3r/PrintConfig.cpp:1075 -msgid "Maximum feedrate %1%" -msgstr "" +#: src/libslic3r/PrintConfig.cpp:1300 +msgid "How to apply limits" +msgstr "Як застосовувати обмеження" -#: src/libslic3r/PrintConfig.cpp:1077 -msgid "Maximum feedrate of the %1% axis" -msgstr "" +#: src/libslic3r/PrintConfig.cpp:1301 +msgid "Purpose of Machine Limits" +msgstr "Призначення механічних обмежень" -#: src/libslic3r/PrintConfig.cpp:1085 -msgid "Maximum acceleration %1%" -msgstr "" +#: src/libslic3r/PrintConfig.cpp:1303 +msgid "How to apply the Machine Limits" +msgstr "Призначення механічних обмежень" -#: src/libslic3r/PrintConfig.cpp:1087 -msgid "Maximum acceleration of the %1% axis" -msgstr "" +#: src/libslic3r/PrintConfig.cpp:1308 +msgid "Emit to G-code" +msgstr "Публікувати в G-код" -#: src/libslic3r/PrintConfig.cpp:1095 -msgid "Maximum jerk %1%" -msgstr "" +#: src/libslic3r/PrintConfig.cpp:1309 +msgid "Use for time estimate" +msgstr "Для оцінки часу" -#: src/libslic3r/PrintConfig.cpp:1097 -msgid "Maximum jerk of the %1% axis" -msgstr "" +#: src/libslic3r/PrintConfig.cpp:1310 +msgid "Ignore" +msgstr "Ігнорувати" + +#: src/libslic3r/PrintConfig.cpp:1333 +msgid "Maximum feedrate X" +msgstr "Максимальна швидкість подачі за X" + +#: src/libslic3r/PrintConfig.cpp:1334 +msgid "Maximum feedrate Y" +msgstr "Максимальна швидкість подачі за Y" -#: src/libslic3r/PrintConfig.cpp:1108 src/libslic3r/PrintConfig.cpp:1110 +#: src/libslic3r/PrintConfig.cpp:1335 +msgid "Maximum feedrate Z" +msgstr "Максимальна швидкість подачі за Y" + +#: src/libslic3r/PrintConfig.cpp:1336 +msgid "Maximum feedrate E" +msgstr "Максимальна швидкість подачі за Е" + +#: src/libslic3r/PrintConfig.cpp:1339 +msgid "Maximum feedrate of the X axis" +msgstr "Максимальна швидкість подачі за віссю X" + +#: src/libslic3r/PrintConfig.cpp:1340 +msgid "Maximum feedrate of the Y axis" +msgstr "Максимальна швидкість подачі за віссю Y" + +#: src/libslic3r/PrintConfig.cpp:1341 +msgid "Maximum feedrate of the Z axis" +msgstr "Максимальна швидкість подачі за віссю Z" + +#: src/libslic3r/PrintConfig.cpp:1342 +msgid "Maximum feedrate of the E axis" +msgstr "Максимальна швидкість подачі за віссю Е" + +#: src/libslic3r/PrintConfig.cpp:1350 +msgid "Maximum acceleration X" +msgstr "Максимальне прискорення X" + +#: src/libslic3r/PrintConfig.cpp:1351 +msgid "Maximum acceleration Y" +msgstr "Максимальне прискорення Y" + +#: src/libslic3r/PrintConfig.cpp:1352 +msgid "Maximum acceleration Z" +msgstr "Максимальне прискорення Z" + +#: src/libslic3r/PrintConfig.cpp:1353 +msgid "Maximum acceleration E" +msgstr "Максимальне прискорення E" + +#: src/libslic3r/PrintConfig.cpp:1356 +msgid "Maximum acceleration of the X axis" +msgstr "Максимальне прискорення за віссю X" + +#: src/libslic3r/PrintConfig.cpp:1357 +msgid "Maximum acceleration of the Y axis" +msgstr "Максимальне прискорення за віссю Y" + +#: src/libslic3r/PrintConfig.cpp:1358 +msgid "Maximum acceleration of the Z axis" +msgstr "Максимальне прискорення за віссю Z" + +#: src/libslic3r/PrintConfig.cpp:1359 +msgid "Maximum acceleration of the E axis" +msgstr "Максимальне прискорення за віссю E" + +#: src/libslic3r/PrintConfig.cpp:1367 +msgid "Maximum jerk X" +msgstr "Максимальний ривок за X" + +#: src/libslic3r/PrintConfig.cpp:1368 +msgid "Maximum jerk Y" +msgstr "Максимальний ривок за Y" + +#: src/libslic3r/PrintConfig.cpp:1369 +msgid "Maximum jerk Z" +msgstr "Максимальний ривок за Z" + +#: src/libslic3r/PrintConfig.cpp:1370 +msgid "Maximum jerk E" +msgstr "Максимальний ривок за E" + +#: src/libslic3r/PrintConfig.cpp:1373 +msgid "Maximum jerk of the X axis" +msgstr "Максимальний ривок за віссю X" + +#: src/libslic3r/PrintConfig.cpp:1374 +msgid "Maximum jerk of the Y axis" +msgstr "Максимальний ривок за віссю Y" + +#: src/libslic3r/PrintConfig.cpp:1375 +msgid "Maximum jerk of the Z axis" +msgstr "Максимальний ривок за віссю Z" + +#: src/libslic3r/PrintConfig.cpp:1376 +msgid "Maximum jerk of the E axis" +msgstr "Максимальний ривок за віссю E" + +#: src/libslic3r/PrintConfig.cpp:1386 msgid "Minimum feedrate when extruding" -msgstr "" +msgstr "Мінімальне прискорення при екструзії" + +#: src/libslic3r/PrintConfig.cpp:1388 +msgid "Minimum feedrate when extruding (M205 S)" +msgstr "Мінімальне прискорення при екструзії (M205 S)" -#: src/libslic3r/PrintConfig.cpp:1119 src/libslic3r/PrintConfig.cpp:1121 +#: src/libslic3r/PrintConfig.cpp:1396 msgid "Minimum travel feedrate" -msgstr "" +msgstr "Мінімальна швидкість подачі" -#: src/libslic3r/PrintConfig.cpp:1130 src/libslic3r/PrintConfig.cpp:1132 +#: src/libslic3r/PrintConfig.cpp:1398 +msgid "Minimum travel feedrate (M205 T)" +msgstr "Мінімальна швидкість подачі (M205 T)" + +#: src/libslic3r/PrintConfig.cpp:1406 msgid "Maximum acceleration when extruding" -msgstr "" +msgstr "Максимальне прискорення при екструзії" -#: src/libslic3r/PrintConfig.cpp:1141 src/libslic3r/PrintConfig.cpp:1143 +#: src/libslic3r/PrintConfig.cpp:1408 +msgid "Maximum acceleration when extruding (M204 S)" +msgstr "Максимальне прискорення при екструзії (M204 S)" + +#: src/libslic3r/PrintConfig.cpp:1416 msgid "Maximum acceleration when retracting" -msgstr "" +msgstr "Максимальне прискорення при втягуванні" + +#: src/libslic3r/PrintConfig.cpp:1418 +msgid "Maximum acceleration when retracting (M204 T)" +msgstr "Максимальне прискорення при втягуванні (M204 T)" -#: src/libslic3r/PrintConfig.cpp:1151 src/libslic3r/PrintConfig.cpp:1160 +#: src/libslic3r/PrintConfig.cpp:1425 src/libslic3r/PrintConfig.cpp:1434 msgid "Max" msgstr "Максимально" -#: src/libslic3r/PrintConfig.cpp:1152 +#: src/libslic3r/PrintConfig.cpp:1426 msgid "This setting represents the maximum speed of your fan." msgstr "Цей параметр відображає максимальну швидкість вашого вентилятора." -#: src/libslic3r/PrintConfig.cpp:1161 -#, no-c-format +#: src/libslic3r/PrintConfig.cpp:1435 msgid "" "This is the highest printable layer height for this extruder, used to cap " "the variable layer height and support layer height. Maximum recommended " @@ -5773,11 +10575,11 @@ msgstr "" "для досягнення розумної міжшарової адгезії. Якщо встановлено 0, висота шару " "обмежена 75% діаметра сопла." -#: src/libslic3r/PrintConfig.cpp:1171 +#: src/libslic3r/PrintConfig.cpp:1445 msgid "Max print speed" msgstr "Максимальна швидкість друку" -#: src/libslic3r/PrintConfig.cpp:1172 +#: src/libslic3r/PrintConfig.cpp:1446 msgid "" "When setting other speed settings to 0 Slic3r will autocalculate the optimal " "speed in order to keep constant extruder pressure. This experimental setting " @@ -5788,7 +10590,7 @@ msgstr "" "екструдера. Цей експериментальний параметр використовується для встановлення " "максимальної швидкості друку, яку ви хочете дозволити." -#: src/libslic3r/PrintConfig.cpp:1182 +#: src/libslic3r/PrintConfig.cpp:1456 msgid "" "This experimental setting is used to set the maximum volumetric speed your " "extruder supports." @@ -5796,11 +10598,11 @@ msgstr "" "Цей експериментальний параметр використовується для встановлення " "максимальної об'ємної швидкості, яку підтримує екструдер." -#: src/libslic3r/PrintConfig.cpp:1191 +#: src/libslic3r/PrintConfig.cpp:1465 msgid "Max volumetric slope positive" msgstr "Максимальний об'ємний нахил позитивний" -#: src/libslic3r/PrintConfig.cpp:1192 src/libslic3r/PrintConfig.cpp:1203 +#: src/libslic3r/PrintConfig.cpp:1466 src/libslic3r/PrintConfig.cpp:1477 msgid "" "This experimental setting is used to limit the speed of change in extrusion " "rate. A value of 1.8 mm³/s² ensures, that a change from the extrusion rate " @@ -5813,25 +10615,25 @@ msgstr "" "швидкість подачі 20 мм/с) до 5,4 мм³/с (подача 60 мм/с) займе принаймні 2 " "секунди." -#: src/libslic3r/PrintConfig.cpp:1196 src/libslic3r/PrintConfig.cpp:1207 +#: src/libslic3r/PrintConfig.cpp:1470 src/libslic3r/PrintConfig.cpp:1481 msgid "mm³/s²" msgstr "мм³/с²" -#: src/libslic3r/PrintConfig.cpp:1202 +#: src/libslic3r/PrintConfig.cpp:1476 msgid "Max volumetric slope negative" msgstr "Максимальний об'ємний схил негативний" -#: src/libslic3r/PrintConfig.cpp:1214 src/libslic3r/PrintConfig.cpp:1223 +#: src/libslic3r/PrintConfig.cpp:1488 src/libslic3r/PrintConfig.cpp:1497 msgid "Min" msgstr "Мінімально" -#: src/libslic3r/PrintConfig.cpp:1215 +#: src/libslic3r/PrintConfig.cpp:1489 msgid "This setting represents the minimum PWM your fan needs to work." msgstr "" "Цей параметр відповідає мінімальній ШІМ, на якій повинен працювати ваш " "вентилятор." -#: src/libslic3r/PrintConfig.cpp:1224 +#: src/libslic3r/PrintConfig.cpp:1498 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 " @@ -5841,19 +10643,19 @@ msgstr "" "роздільну здатність для висоти змінного шару. Типові значення - від 0,05 мм " "до 0,1 мм." -#: src/libslic3r/PrintConfig.cpp:1232 +#: src/libslic3r/PrintConfig.cpp:1506 msgid "Min print speed" msgstr "Мінімальна швидкість друку" -#: src/libslic3r/PrintConfig.cpp:1233 +#: src/libslic3r/PrintConfig.cpp:1507 msgid "Slic3r will not scale speed down below this speed." msgstr "Slic3r не буде масштабувати швидкість нижче цієї швидкості." -#: src/libslic3r/PrintConfig.cpp:1240 +#: src/libslic3r/PrintConfig.cpp:1514 msgid "Minimal filament extrusion length" -msgstr "" +msgstr "Мінімальна довжина екструзії філаменту" -#: src/libslic3r/PrintConfig.cpp:1241 +#: src/libslic3r/PrintConfig.cpp:1515 msgid "" "Generate no less than the number of skirt loops required to consume the " "specified amount of filament on the bottom layer. For multi-extruder " @@ -5863,11 +10665,11 @@ msgstr "" "зазначеної кількості філаменту на нижньому шарі. Для машин із декількома " "екструдерами цей мінімум застосовується до кожного екструдера." -#: src/libslic3r/PrintConfig.cpp:1250 +#: src/libslic3r/PrintConfig.cpp:1524 msgid "Configuration notes" msgstr "Примітки до конфігурації" -#: src/libslic3r/PrintConfig.cpp:1251 +#: src/libslic3r/PrintConfig.cpp:1525 msgid "" "You can put here your personal notes. This text will be added to the G-code " "header comments." @@ -5875,30 +10677,28 @@ msgstr "" "Ви можете додати тут свої особисті примітки. Цей текст буде додано до " "коментарів заголовка G-коду." -#: src/libslic3r/PrintConfig.cpp:1260 -msgid "Nozzle diameter" -msgstr "Діаметр сопла" - -#: src/libslic3r/PrintConfig.cpp:1261 +#: src/libslic3r/PrintConfig.cpp:1535 msgid "" "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" msgstr "Це діаметр сопла вашого екструдера (наприклад: 0.5, 0.35 тощо)" -#: src/libslic3r/PrintConfig.cpp:1266 +#: src/libslic3r/PrintConfig.cpp:1540 msgid "Host Type" -msgstr "" +msgstr "Тип хосту" -#: src/libslic3r/PrintConfig.cpp:1267 +#: src/libslic3r/PrintConfig.cpp:1541 msgid "" "Slic3r can upload G-code files to a printer host. This field must contain " "the kind of the host." msgstr "" +"Slic3r може завантажувати файли G-коду на хост принтера. Це поле повинно " +"містити тип хоста." -#: src/libslic3r/PrintConfig.cpp:1278 +#: src/libslic3r/PrintConfig.cpp:1558 msgid "Only retract when crossing perimeters" msgstr "Перервати тільки у разі перетину периметрів" -#: src/libslic3r/PrintConfig.cpp:1279 +#: src/libslic3r/PrintConfig.cpp:1559 msgid "" "Disables retraction when the travel path does not exceed the upper layer's " "perimeters (and thus any ooze will be probably invisible)." @@ -5906,7 +10706,7 @@ msgstr "" "Вимикає переривання, коли шлях не перевищує периметри верхніх шарів (і, " "таким чином, будь-який розрядник буде, мабуть, невидимим)." -#: src/libslic3r/PrintConfig.cpp:1286 +#: src/libslic3r/PrintConfig.cpp:1566 msgid "" "This option will drop the temperature of the inactive extruders to prevent " "oozing. It will enable a tall skirt automatically and move extruders outside " @@ -5916,11 +10716,11 @@ msgstr "" "протіканню. Це дозволить автоматично ввімкнути високий плінтус та " "перемістить екструдери за межі такого плінтуса у разі зміни температури." -#: src/libslic3r/PrintConfig.cpp:1293 +#: src/libslic3r/PrintConfig.cpp:1573 msgid "Output filename format" msgstr "Формат вихідного файлу" -#: src/libslic3r/PrintConfig.cpp:1294 +#: src/libslic3r/PrintConfig.cpp:1574 msgid "" "You can use all configuration options as variables inside this template. For " "example: [layer_height], [fill_density] etc. You can also use [timestamp], " @@ -5932,11 +10732,11 @@ msgstr "" "можете використовувати [timestamp], [year], [month], [day], [hour], " "[minute], [second], [version], [input_filename] ], [input_filename_base]." -#: src/libslic3r/PrintConfig.cpp:1303 +#: src/libslic3r/PrintConfig.cpp:1583 msgid "Detect bridging perimeters" msgstr "Виявлення висячих периметрів" -#: src/libslic3r/PrintConfig.cpp:1305 +#: src/libslic3r/PrintConfig.cpp:1585 msgid "" "Experimental option to adjust flow for overhangs (bridge flow will be used), " "to apply bridge speed to them and enable fan." @@ -5945,56 +10745,59 @@ msgstr "" "використано мостовий потік), щоб застосувати до них швидкість мосту та " "увімкнути вентилятор." -#: src/libslic3r/PrintConfig.cpp:1311 +#: src/libslic3r/PrintConfig.cpp:1591 msgid "Filament parking position" -msgstr "" +msgstr "Позиція паркування філаменту" -#: src/libslic3r/PrintConfig.cpp:1312 +#: src/libslic3r/PrintConfig.cpp:1592 msgid "" "Distance of the extruder tip from the position where the filament is parked " -"when unloaded. This should match the value in printer firmware. " +"when unloaded. This should match the value in printer firmware." msgstr "" +"Відстань наконечника екструдера від місця паркування філаменту при " +"виведенні. Це має відповідати значенню в мікропрограмі принтера." -#: src/libslic3r/PrintConfig.cpp:1320 +#: src/libslic3r/PrintConfig.cpp:1600 msgid "Extra loading distance" -msgstr "" +msgstr "Додаткова відстань заведення" -#: src/libslic3r/PrintConfig.cpp:1321 +#: src/libslic3r/PrintConfig.cpp:1601 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. " +"than unloading." msgstr "" +"Якщо встановлено на нуль, відстань, на яку філамент переміщується з " +"положення стоянки під час заведення, є точно такою ж, як і при переміщенні " +"назад під час виведення. Якщо позитивне, воно заводеться далі, якщо " +"негативне, рух заведення коротший, ніж виведення." -#: src/libslic3r/PrintConfig.cpp:1329 src/libslic3r/PrintConfig.cpp:1347 -#: src/libslic3r/PrintConfig.cpp:1359 src/libslic3r/PrintConfig.cpp:1369 +#: src/libslic3r/PrintConfig.cpp:1609 src/libslic3r/PrintConfig.cpp:1626 +#: src/libslic3r/PrintConfig.cpp:1639 src/libslic3r/PrintConfig.cpp:1649 msgid "Perimeters" msgstr "Периметри" -#: src/libslic3r/PrintConfig.cpp:1330 +#: src/libslic3r/PrintConfig.cpp:1610 msgid "" -"This is the acceleration your printer will use for perimeters. A high value " -"like 9000 usually gives good results if your hardware is up to the job. Set " -"zero to disable acceleration control for perimeters." +"This is the acceleration your printer will use for perimeters. Set zero to " +"disable acceleration control for perimeters." msgstr "" -"Це прискорення, яке ваш принтер використовуватиме для периметрів. Висока " -"значення, таке як 9000, зазвичай дає хороші результати, якщо ваше апаратне " -"забезпечення відповідає завданню. Встановити 0, щоб вимкнути регулятор " -"прискорення для периметрів." +"Це прискорення, яке ваш принтер використовуватиме для периметрів. Встановити " +"0, щоб відключити управління прискоренням для периметрів." -#: src/libslic3r/PrintConfig.cpp:1338 +#: src/libslic3r/PrintConfig.cpp:1617 msgid "Perimeter extruder" msgstr "Екструдер периметру" -#: src/libslic3r/PrintConfig.cpp:1340 +#: src/libslic3r/PrintConfig.cpp:1619 msgid "" "The extruder to use when printing perimeters and brim. First extruder is 1." msgstr "" "Екструдер, що використовується при друці периметрів і краю. Перший екструдер " "- 1." -#: src/libslic3r/PrintConfig.cpp:1349 +#: src/libslic3r/PrintConfig.cpp:1628 msgid "" "Set this to a non-zero value to set a manual extrusion width for perimeters. " "You may want to use thinner extrudates to get more accurate surfaces. If " @@ -6009,14 +10812,14 @@ msgstr "" "діаметр сопла. Якщо він виражений у відсотках (наприклад, 200%), він буде " "обчислюватися за висотою шару." -#: src/libslic3r/PrintConfig.cpp:1361 +#: src/libslic3r/PrintConfig.cpp:1641 msgid "" "Speed for perimeters (contours, aka vertical shells). Set to zero for auto." msgstr "" "Швидкість для периметрів (контури, вертикальні оболонки). Встановити 0 для " "автоматичного використання." -#: src/libslic3r/PrintConfig.cpp:1371 +#: src/libslic3r/PrintConfig.cpp:1651 msgid "" "This option sets the number of perimeters to generate for each layer. Note " "that Slic3r may increase this number automatically when it detects sloping " @@ -6028,11 +10831,11 @@ msgstr "" "які отримують вигоду від більшої кількості периметрів, якщо опція «Додаткові " "периметри» увімкнена." -#: src/libslic3r/PrintConfig.cpp:1375 +#: src/libslic3r/PrintConfig.cpp:1655 msgid "(minimum)" msgstr "(мінімум)" -#: src/libslic3r/PrintConfig.cpp:1383 +#: src/libslic3r/PrintConfig.cpp:1663 msgid "" "If you want to process the output G-code through custom scripts, just list " "their absolute paths here. Separate multiple scripts with a semicolon. " @@ -6046,45 +10849,47 @@ msgstr "" "аргумент, і вони можуть отримати доступ до параметрів конфігурації Slic3r, " "прочитавши змінні середовища." -#: src/libslic3r/PrintConfig.cpp:1395 +#: src/libslic3r/PrintConfig.cpp:1675 msgid "Printer type" -msgstr "" +msgstr "Тип принтеру" -#: src/libslic3r/PrintConfig.cpp:1396 +#: src/libslic3r/PrintConfig.cpp:1676 msgid "Type of the printer." -msgstr "" +msgstr "Тип принтеру." -#: src/libslic3r/PrintConfig.cpp:1401 +#: src/libslic3r/PrintConfig.cpp:1681 msgid "Printer notes" msgstr "Примітки принтера" -#: src/libslic3r/PrintConfig.cpp:1402 +#: src/libslic3r/PrintConfig.cpp:1682 msgid "You can put your notes regarding the printer here." msgstr "Тут ви можете помістити свої нотатки щодо принтера." -#: src/libslic3r/PrintConfig.cpp:1410 +#: src/libslic3r/PrintConfig.cpp:1690 msgid "Printer vendor" -msgstr "" +msgstr "Виробник принтера" -#: src/libslic3r/PrintConfig.cpp:1411 +#: src/libslic3r/PrintConfig.cpp:1691 msgid "Name of the printer vendor." -msgstr "" +msgstr "Назва виробника принтера." -#: src/libslic3r/PrintConfig.cpp:1416 +#: src/libslic3r/PrintConfig.cpp:1696 msgid "Printer variant" -msgstr "" +msgstr "Варіант принтера" -#: src/libslic3r/PrintConfig.cpp:1417 +#: src/libslic3r/PrintConfig.cpp:1697 msgid "" "Name of the printer variant. For example, the printer variants may be " "differentiated by a nozzle diameter." msgstr "" +"Назва варіанту принтера. Наприклад, варіанти принтера можуть відрізнятися за " +"діаметром сопла." -#: src/libslic3r/PrintConfig.cpp:1430 +#: src/libslic3r/PrintConfig.cpp:1714 msgid "Raft layers" msgstr "Плоскі шари" -#: src/libslic3r/PrintConfig.cpp:1432 +#: src/libslic3r/PrintConfig.cpp:1716 msgid "" "The object will be raised by this number of layers, and support material " "will be generated under it." @@ -6092,11 +10897,11 @@ msgstr "" "Об'єкт буде піднятий цією кількістю шарів, і під ним буде згенерований " "матеріал підтримки." -#: src/libslic3r/PrintConfig.cpp:1440 +#: src/libslic3r/PrintConfig.cpp:1724 msgid "Resolution" msgstr "Роздільна здатність" -#: src/libslic3r/PrintConfig.cpp:1441 +#: src/libslic3r/PrintConfig.cpp:1725 msgid "" "Minimum detail resolution, used to simplify the input file for speeding up " "the slicing job and reducing memory usage. High-resolution models often " @@ -6110,20 +10915,20 @@ msgstr "" "вимкнути будь-яке спрощення та використовувати повну роздільну здатність від " "введення." -#: src/libslic3r/PrintConfig.cpp:1451 +#: src/libslic3r/PrintConfig.cpp:1735 msgid "Minimum travel after retraction" msgstr "Мінімальне переміщення після переривання" -#: src/libslic3r/PrintConfig.cpp:1452 +#: src/libslic3r/PrintConfig.cpp:1736 msgid "" "Retraction is not triggered when travel moves are shorter than this length." msgstr "Переривання не спрацьовує, коли переміщення коротше за цю довжину." -#: src/libslic3r/PrintConfig.cpp:1458 +#: src/libslic3r/PrintConfig.cpp:1742 msgid "Retract amount before wipe" msgstr "Кількість переривань перед чищенням" -#: src/libslic3r/PrintConfig.cpp:1459 +#: src/libslic3r/PrintConfig.cpp:1743 msgid "" "With bowden extruders, it may be wise to do some amount of quick retract " "before doing the wipe movement." @@ -6131,25 +10936,25 @@ msgstr "" "Завдяки екструдерам з бандами, має зміст зробити певну кількість переривань " "перед рухами очищення." -#: src/libslic3r/PrintConfig.cpp:1466 +#: src/libslic3r/PrintConfig.cpp:1750 msgid "Retract on layer change" msgstr "Переривання на зміну шарів" -#: src/libslic3r/PrintConfig.cpp:1467 +#: src/libslic3r/PrintConfig.cpp:1751 msgid "This flag enforces a retraction whenever a Z move is done." msgstr "" "Цей прапор забезпечує переривання кожного разу, коли виконується переміщення " "Z." -#: src/libslic3r/PrintConfig.cpp:1472 src/libslic3r/PrintConfig.cpp:1480 +#: src/libslic3r/PrintConfig.cpp:1756 src/libslic3r/PrintConfig.cpp:1764 msgid "Length" msgstr "Довжина" -#: src/libslic3r/PrintConfig.cpp:1473 +#: src/libslic3r/PrintConfig.cpp:1757 msgid "Retraction Length" msgstr "Довжина переривання" -#: src/libslic3r/PrintConfig.cpp:1474 +#: src/libslic3r/PrintConfig.cpp:1758 msgid "" "When retraction is triggered, filament is pulled back by the specified " "amount (the length is measured on raw filament, before it enters the " @@ -6159,15 +10964,15 @@ msgstr "" "кількості (довжина вимірюється на сирого філаменту перед тим, як вона " "надходить у екструдер)." -#: src/libslic3r/PrintConfig.cpp:1476 src/libslic3r/PrintConfig.cpp:1485 +#: src/libslic3r/PrintConfig.cpp:1760 src/libslic3r/PrintConfig.cpp:1769 msgid "mm (zero to disable)" msgstr "мм (0, щоб вимкнути)" -#: src/libslic3r/PrintConfig.cpp:1481 +#: src/libslic3r/PrintConfig.cpp:1765 msgid "Retraction Length (Toolchange)" msgstr "Довжина переривання (зміна інструмента)" -#: src/libslic3r/PrintConfig.cpp:1482 +#: src/libslic3r/PrintConfig.cpp:1766 msgid "" "When retraction is triggered before changing tool, filament is pulled back " "by the specified amount (the length is measured on raw filament, before it " @@ -6177,11 +10982,11 @@ msgstr "" "назад до вказаної кількості (довжина вимірюється на сирого філаменту перед " "тим, як вона надходить у екструдер)." -#: src/libslic3r/PrintConfig.cpp:1490 +#: src/libslic3r/PrintConfig.cpp:1774 msgid "Lift Z" msgstr "Підняти Z" -#: src/libslic3r/PrintConfig.cpp:1491 +#: src/libslic3r/PrintConfig.cpp:1775 msgid "" "If you set this to a positive value, Z is quickly raised every time a " "retraction is triggered. When using multiple extruders, only the setting for " @@ -6191,15 +10996,15 @@ msgstr "" "коли спрацьовує переривання. При використанні декількох екструдерів буде " "розглянуто налаштування лише першого екструдера." -#: src/libslic3r/PrintConfig.cpp:1498 +#: src/libslic3r/PrintConfig.cpp:1782 msgid "Above Z" msgstr "Вище Z" -#: src/libslic3r/PrintConfig.cpp:1499 +#: src/libslic3r/PrintConfig.cpp:1783 msgid "Only lift Z above" msgstr "Тільки піднімати Z" -#: src/libslic3r/PrintConfig.cpp:1500 +#: src/libslic3r/PrintConfig.cpp:1784 msgid "" "If you set this to a positive value, Z lift will only take place above the " "specified absolute Z. You can tune this setting for skipping lift on the " @@ -6209,15 +11014,15 @@ msgstr "" "вказаним абсолютним Z. Ви можете налаштувати цей параметр так, що підняття " "буде пропускатися на перших шарах." -#: src/libslic3r/PrintConfig.cpp:1507 +#: src/libslic3r/PrintConfig.cpp:1791 msgid "Below Z" msgstr "Нижче Z" -#: src/libslic3r/PrintConfig.cpp:1508 +#: src/libslic3r/PrintConfig.cpp:1792 msgid "Only lift Z below" msgstr "Тільки опускати Z" -#: src/libslic3r/PrintConfig.cpp:1509 +#: src/libslic3r/PrintConfig.cpp:1793 msgid "" "If you set this to a positive value, Z lift will only take place below the " "specified absolute Z. You can tune this setting for limiting lift to the " @@ -6227,11 +11032,11 @@ msgstr "" "вказаного абсолютного Z. Ви можете налаштувати цей параметр так, що підняття " "буде обмежене на перших шарах." -#: src/libslic3r/PrintConfig.cpp:1517 src/libslic3r/PrintConfig.cpp:1525 +#: src/libslic3r/PrintConfig.cpp:1801 src/libslic3r/PrintConfig.cpp:1809 msgid "Extra length on restart" msgstr "Додаткова довжина при перезапуску" -#: src/libslic3r/PrintConfig.cpp:1518 +#: src/libslic3r/PrintConfig.cpp:1802 msgid "" "When the retraction is compensated after the travel move, the extruder will " "push this additional amount of filament. This setting is rarely needed." @@ -6239,7 +11044,7 @@ msgstr "" "Коли переривання компенсується після руху переміщення, екструдер буде " "проштовхувати цю додаткову кількість філамента. Цей параметр рідко потрібний." -#: src/libslic3r/PrintConfig.cpp:1526 +#: src/libslic3r/PrintConfig.cpp:1810 msgid "" "When the retraction is compensated after changing tool, the extruder will " "push this additional amount of filament." @@ -6247,19 +11052,19 @@ msgstr "" "Коли переривання компенсується після зміни інструмента, екструдер буде " "проштовхувати цю додаткову кількість філамента." -#: src/libslic3r/PrintConfig.cpp:1533 src/libslic3r/PrintConfig.cpp:1534 +#: src/libslic3r/PrintConfig.cpp:1817 src/libslic3r/PrintConfig.cpp:1818 msgid "Retraction Speed" msgstr "Швидкість переривання" -#: src/libslic3r/PrintConfig.cpp:1535 +#: src/libslic3r/PrintConfig.cpp:1819 msgid "The speed for retractions (it only applies to the extruder motor)." msgstr "Швидкість переривання (це стосується лише двигуна екструдера)." -#: src/libslic3r/PrintConfig.cpp:1541 src/libslic3r/PrintConfig.cpp:1542 +#: src/libslic3r/PrintConfig.cpp:1825 src/libslic3r/PrintConfig.cpp:1826 msgid "Deretraction Speed" msgstr "Швидкість після-переривання" -#: src/libslic3r/PrintConfig.cpp:1543 +#: src/libslic3r/PrintConfig.cpp:1827 msgid "" "The speed for loading of a filament into extruder after retraction (it only " "applies to the extruder motor). If left to zero, the retraction speed is " @@ -6269,67 +11074,55 @@ msgstr "" "лише двигуна екструдера ). Якщо залишити 0, використовується швидкість " "переривання ." -#: src/libslic3r/PrintConfig.cpp:1550 +#: src/libslic3r/PrintConfig.cpp:1834 msgid "Seam position" msgstr "Позиція шва" -#: src/libslic3r/PrintConfig.cpp:1552 +#: src/libslic3r/PrintConfig.cpp:1836 msgid "Position of perimeters starting points." msgstr "Позиція стартових точок периметра." -#: src/libslic3r/PrintConfig.cpp:1558 +#: src/libslic3r/PrintConfig.cpp:1842 msgid "Random" -msgstr "" +msgstr "Випадкова" -#: src/libslic3r/PrintConfig.cpp:1559 +#: src/libslic3r/PrintConfig.cpp:1843 msgid "Nearest" -msgstr "" +msgstr "Найближча" -#: src/libslic3r/PrintConfig.cpp:1560 +#: src/libslic3r/PrintConfig.cpp:1844 msgid "Aligned" -msgstr "" +msgstr "Вирівняно" -#: src/libslic3r/PrintConfig.cpp:1568 +#: src/libslic3r/PrintConfig.cpp:1852 msgid "Direction" msgstr "Напрямок" -#: src/libslic3r/PrintConfig.cpp:1570 +#: src/libslic3r/PrintConfig.cpp:1854 msgid "Preferred direction of the seam" msgstr "Бажаний напрямок шва" -#: src/libslic3r/PrintConfig.cpp:1571 +#: src/libslic3r/PrintConfig.cpp:1855 msgid "Seam preferred direction" msgstr "Бажаний напрямок шва" -#: src/libslic3r/PrintConfig.cpp:1578 +#: src/libslic3r/PrintConfig.cpp:1862 msgid "Jitter" msgstr "Джиттер" -#: src/libslic3r/PrintConfig.cpp:1580 +#: src/libslic3r/PrintConfig.cpp:1864 msgid "Seam preferred direction jitter" msgstr "Бажаний напрямок шва джитера" -#: src/libslic3r/PrintConfig.cpp:1581 +#: src/libslic3r/PrintConfig.cpp:1865 msgid "Preferred direction of the seam - jitter" msgstr "Бажаний напрямок шва - джитера" -#: src/libslic3r/PrintConfig.cpp:1591 -msgid "USB/serial port for printer connection." -msgstr "USB / послідовний порт для підключення принтера." - -#: src/libslic3r/PrintConfig.cpp:1598 -msgid "Serial port speed" -msgstr "Швидкість послідовного порту" - -#: src/libslic3r/PrintConfig.cpp:1599 -msgid "Speed (baud) of USB/serial port for printer connection." -msgstr "Швидкість (бод) USB / послідовного порту для підключення принтера." - -#: src/libslic3r/PrintConfig.cpp:1608 +#: src/libslic3r/PrintConfig.cpp:1872 msgid "Distance from object" msgstr "Відстань від об'єкту" -#: src/libslic3r/PrintConfig.cpp:1609 +#: src/libslic3r/PrintConfig.cpp:1873 msgid "" "Distance between skirt and object(s). Set this to zero to attach the skirt " "to the object(s) and get a brim for better adhesion." @@ -6337,11 +11130,11 @@ msgstr "" "Відстань між плінтусом та об'єктом (-ами). Установіть 0, щоб прикріпити " "плінтус до об'єкта (-ів) і отримати край для кращої адгезії." -#: src/libslic3r/PrintConfig.cpp:1616 +#: src/libslic3r/PrintConfig.cpp:1880 msgid "Skirt height" msgstr "Висота плінтусу" -#: src/libslic3r/PrintConfig.cpp:1617 +#: src/libslic3r/PrintConfig.cpp:1881 msgid "" "Height of skirt expressed in layers. Set this to a tall value to use skirt " "as a shield against drafts." @@ -6349,15 +11142,29 @@ msgstr "" "Висота плінтусу виражена в шарах. Встановіть це значення на високе, щоб " "використовувати плінтус як щит проти протягів." -#: src/libslic3r/PrintConfig.cpp:1624 +#: src/libslic3r/PrintConfig.cpp:1888 +msgid "Draft shield" +msgstr "Чорновий щит" + +#: src/libslic3r/PrintConfig.cpp:1889 +msgid "" +"If enabled, the skirt will be as tall as a highest printed object. This is " +"useful to protect an ABS or ASA print from warping and detaching from print " +"bed due to wind draft." +msgstr "" +"Якщо увімкнено, спідниця буде такою ж високою, як найвищий друкований " +"предмет. Це корисно, щоб захистити друк ABS або ASA від деформації та " +"від'єднання від друкарського столу через протяг." + +#: src/libslic3r/PrintConfig.cpp:1895 msgid "Loops (minimum)" msgstr "Петлі (мінімум)" -#: src/libslic3r/PrintConfig.cpp:1625 +#: src/libslic3r/PrintConfig.cpp:1896 msgid "Skirt Loops" msgstr "Петлі плінтусу" -#: src/libslic3r/PrintConfig.cpp:1626 +#: src/libslic3r/PrintConfig.cpp:1897 msgid "" "Number of loops for the skirt. If the Minimum Extrusion Length option is " "set, the number of loops might be greater than the one configured here. Set " @@ -6367,11 +11174,11 @@ msgstr "" "довжина екструзії\", кількість петель може бути більшою, ніж налаштована " "тут. Установіть 0, щоб повністю вимкнути плінтус." -#: src/libslic3r/PrintConfig.cpp:1634 +#: src/libslic3r/PrintConfig.cpp:1905 msgid "Slow down if layer print time is below" msgstr "Уповільнення, якщо час друку шару нижче" -#: src/libslic3r/PrintConfig.cpp:1635 +#: src/libslic3r/PrintConfig.cpp:1906 msgid "" "If layer print time is estimated below this number of seconds, print moves " "speed will be scaled down to extend duration to this value." @@ -6379,11 +11186,11 @@ msgstr "" "Якщо час друку шару оцінюється нижче цієї кількості секунд, швидкість друку " "рухів зменшуватиметься, щоб збільшити тривалість до цього значення." -#: src/libslic3r/PrintConfig.cpp:1645 +#: src/libslic3r/PrintConfig.cpp:1915 msgid "Small perimeters" msgstr "Маленькі периметри" -#: src/libslic3r/PrintConfig.cpp:1647 +#: src/libslic3r/PrintConfig.cpp:1917 msgid "" "This separate setting will affect the speed of perimeters having radius <= " "6.5mm (usually holes). If expressed as percentage (for example: 80%) it will " @@ -6394,11 +11201,11 @@ msgstr "" "вона буде розрахована за наведеним вище параметром швидкості. Встановити 0 " "для автоматичного використання." -#: src/libslic3r/PrintConfig.cpp:1657 +#: src/libslic3r/PrintConfig.cpp:1927 msgid "Solid infill threshold area" msgstr "Порогова площа суцільного наповнення" -#: src/libslic3r/PrintConfig.cpp:1659 +#: src/libslic3r/PrintConfig.cpp:1929 msgid "" "Force solid infill for regions having a smaller area than the specified " "threshold." @@ -6406,23 +11213,23 @@ msgstr "" "Встановити суцільне заповнення для регіонів, що мають площу, меншу " "зазначеного порогу." -#: src/libslic3r/PrintConfig.cpp:1660 +#: src/libslic3r/PrintConfig.cpp:1930 msgid "mm²" msgstr "мм²" -#: src/libslic3r/PrintConfig.cpp:1666 +#: src/libslic3r/PrintConfig.cpp:1936 msgid "Solid infill extruder" msgstr "Екструдер суцільних наповнень" -#: src/libslic3r/PrintConfig.cpp:1668 +#: src/libslic3r/PrintConfig.cpp:1938 msgid "The extruder to use when printing solid infill." msgstr "Екструдер для друку суцільних наповнень." -#: src/libslic3r/PrintConfig.cpp:1674 +#: src/libslic3r/PrintConfig.cpp:1944 msgid "Solid infill every" msgstr "Суцільне наповнення кожні" -#: src/libslic3r/PrintConfig.cpp:1676 +#: src/libslic3r/PrintConfig.cpp:1946 msgid "" "This feature allows to force a solid layer every given number of layers. " "Zero to disable. You can set this to any value (for example 9999); Slic3r " @@ -6434,7 +11241,7 @@ msgstr "" "Slic3r автоматично вибере максимально можливу кількість шарів для " "комбінування відповідно до діаметра сопла та висоти шару." -#: src/libslic3r/PrintConfig.cpp:1688 +#: src/libslic3r/PrintConfig.cpp:1958 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "solid surfaces. If left zero, default extrusion width will be used if set, " @@ -6447,7 +11254,7 @@ msgstr "" "діаметр сопла. Якщо він виражений у відсотках (наприклад, 90%), він буде " "обчислюватися за висотою шару." -#: src/libslic3r/PrintConfig.cpp:1698 +#: src/libslic3r/PrintConfig.cpp:1969 msgid "" "Speed for printing solid regions (top/bottom/internal horizontal shells). " "This can be expressed as a percentage (for example: 80%) over the default " @@ -6458,35 +11265,39 @@ msgstr "" "швидкості заповнення за замовчуванням. Встановити 0 для автоматичного " "використання." -#: src/libslic3r/PrintConfig.cpp:1710 +#: src/libslic3r/PrintConfig.cpp:1981 msgid "Number of solid layers to generate on top and bottom surfaces." msgstr "" "Кількість суцільних шарів для генерування на верхній і нижній поверхні." -#: src/libslic3r/PrintConfig.cpp:1716 +#: src/libslic3r/PrintConfig.cpp:1987 src/libslic3r/PrintConfig.cpp:1988 +msgid "Minimum thickness of a top / bottom shell" +msgstr "Мінімальна товщина верхньої / нижньої оболонки" + +#: src/libslic3r/PrintConfig.cpp:1994 msgid "Spiral vase" msgstr "Спіральна ваза" -#: src/libslic3r/PrintConfig.cpp:1717 +#: src/libslic3r/PrintConfig.cpp:1995 msgid "" "This feature will raise Z gradually while printing a single-walled object in " "order to remove any visible seam. This option requires a single perimeter, " "no infill, no top solid layers and no support material. You can still set " "any number of bottom solid layers as well as skirt/brim loops. It won't work " -"when printing more than an object." +"when printing more than one single object." msgstr "" "Ця функція буде поступово підвищувати Z протягом друку одного-стінного " "об'єкта для уникнення будь-якого видимого шву. Цей параметр вимагає " "одношарового периметру, відсутнє наповнення, відсутність верхніх суцільних " "шарів і відсутність матеріалу підтримки. Ви все ще можете встановити будь-" -"яку кількість нижніх суцільних шарів, а також петель плінтусу/краю. Це не " -"спрацює при друку більше, ніж одного об'єкта." +"яку кількість нижніх твердих шарів, а також спідниці краю. Це не спрацює при " +"друку більше, ніж одного об'єкта." -#: src/libslic3r/PrintConfig.cpp:1725 +#: src/libslic3r/PrintConfig.cpp:2003 msgid "Temperature variation" msgstr "Варіація температури" -#: src/libslic3r/PrintConfig.cpp:1726 +#: src/libslic3r/PrintConfig.cpp:2004 msgid "" "Temperature difference to be applied when an extruder is not active. Enables " "a full-height \"sacrificial\" skirt on which the nozzles are periodically " @@ -6495,88 +11306,127 @@ msgstr "" "Відмітка температури, яка застосовується, коли екструдер не активний. Вмикає " "\"жертовний\" плінтус на повній висоті, на які періодично очищуються сопла." -#: src/libslic3r/PrintConfig.cpp:1736 +#: src/libslic3r/PrintConfig.cpp:2014 msgid "" "This start procedure is inserted at the beginning, after bed has reached the " "target temperature and extruder just started heating, and before extruder " -"has finished heating. If Slic3r detects M104 or M190 in your custom codes, " -"such commands will not be prepended automatically so you're free to " +"has finished heating. If PrusaSlicer detects M104 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 Slic3r settings, so you can put a " -"\"M109 S[first_layer_temperature]\" command wherever you want." -msgstr "" -"Ця початкова процедура вставляється на початку, після того, як полотно " -"досягне цільової температури, а екструдер тільки починає нагріватися, і " -"перед тим, як екструдер закінчить нагрівання. Якщо Slic3r виявляє M104 або " -"M190 у ваших користувацьких кодах, такі команди не будуть додаватися " -"автоматично, щоб ви могли вільно налаштовувати порядок команд нагріву та " -"інших спеціальних дій. Зверніть увагу, що ви можете використовувати змінні-" -"заповнювачі для всіх параметрів Slic3r, щоб ви могли поставити команду " -"\"M109 S [first_layer_temperature]\" де завгодно." +"you can use placeholder variables for all PrusaSlicer settings, so you can " +"put a \"M109 S[first_layer_temperature]\" command wherever you want." +msgstr "" +"Ця процедура початку вставляється на початку, після того, як стіл досягне " +"цільової температури, а екструдер тільки починає нагріватися, і перед тим, " +"як екструдер закінчить нагрівання. Якщо Slic3r виявляє M104 або M190 у ваших " +"користувацьких кодах, такі команди не будуть додаватися автоматично, щоб ви " +"могли вільно налаштовувати порядок команд нагріву та інших спеціальних дій. " +"Зверніть увагу, що ви можете використовувати шаблонні змінні для всіх " +"параметрів Slic3r, щоб ви могли поставити команду \"M109 S " +"[first_layer_temperature]\" де завгодно." -#: src/libslic3r/PrintConfig.cpp:1751 +#: src/libslic3r/PrintConfig.cpp:2029 msgid "" "This start procedure is inserted at the beginning, after any printer start " -"gcode. This is used to override settings for a specific filament. If Slic3r " -"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 Slic3r settings, so you can put a \"M109 " +"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 "" -"Ця початкова процедура вставляється на початку, після того, як будь-який " -"принтер запускає G-code. Це використовується для перевизначення параметрів " -"для певної нитки. Якщо Slic3r виявляє M104, M109, M140 або M190 у ваших " -"користувацьких кодах, такі команди не будуть автоматично додаватися, тому ви " -"можете налаштувати порядок команд нагріву та інших спеціальних дій. Зверніть " -"увагу, що ви можете використовувати змінні-заповнювачі для всіх параметрів " -"Slic3r, щоб ви могли поставити команду \"M109 S [first_layer_temperature]\" " -"де завгодно. Якщо у вас є кілька екструдерів, G-code обробляється в порядку " -"екструдерів." +"Ця процедура початку вставляється на початку, після будь-якого стартового G-" +"коду принтера (і після будь-якої зміни інструменту на цей філамент, у разі " +"багато-матеріальних принтерів). Вона використовується для заміни налаштувань " +"для певного філаменту. Якщо PrusaSlicer виявить M104, M109, M140 або M190 у " +"ваших користувацьких кодах, такі команди не додаватимуться автоматично, тому " +"ви можете налаштувати порядок команд нагрівання та інші спеціальні дії. " +"Зверніть увагу, що ви можете використовувати шаблонні змінні для всіх " +"налаштувань PrusaSlicer, тому ви можете поставити команду \"M109 S " +"[first_layer_temperature]\" де завгодно. Якщо у вас кілька екструдерів, G-" +"код обробляється в порядку екструдера." + +#: src/libslic3r/PrintConfig.cpp:2045 +msgid "Color change G-code" +msgstr "G-код зміни кольору" + +#: src/libslic3r/PrintConfig.cpp:2046 +msgid "This G-code will be used as a code for the color change" +msgstr "Цей G-код буде використовуватися як код для зміни кольору" + +#: src/libslic3r/PrintConfig.cpp:2055 +msgid "This G-code will be used as a code for the pause print" +msgstr "Цей G-код буде використовуватися як код для паузи друку" + +#: src/libslic3r/PrintConfig.cpp:2064 +msgid "This G-code will be used as a custom code" +msgstr "Цей G-код буде використовуватися як власний код" -#: src/libslic3r/PrintConfig.cpp:1766 +#: src/libslic3r/PrintConfig.cpp:2072 msgid "Single Extruder Multi Material" -msgstr "Одиночний екструдер кількох матеріалів" +msgstr "Мульти-матеріальний (ММ) друк з одним екструдером" -#: src/libslic3r/PrintConfig.cpp:1767 +#: src/libslic3r/PrintConfig.cpp:2073 msgid "The printer multiplexes filaments into a single hot end." -msgstr "Принтер мультиплексує нитки в єдиний гарячий кінець." +msgstr "Принтер змішує філаменту в єдиний гарячий кінець." -#: src/libslic3r/PrintConfig.cpp:1772 +#: src/libslic3r/PrintConfig.cpp:2078 msgid "Prime all printing extruders" -msgstr "" +msgstr "Підготовка всіх друкуючих екструдерів" -#: src/libslic3r/PrintConfig.cpp:1773 +#: src/libslic3r/PrintConfig.cpp:2079 msgid "" "If enabled, all printing extruders will be primed at the front edge of the " "print bed at the start of the print." msgstr "" +"Якщо увімкнено, усі друкуючі екструдери будуть отестовані на передньому краї " +"друкарського столу перед початком друку." -#: src/libslic3r/PrintConfig.cpp:1778 +#: src/libslic3r/PrintConfig.cpp:2084 +msgid "No sparse layers (EXPERIMENTAL)" +msgstr "Немає розріджених шарів (ЕКСПЕРИМЕНТАЛЬНИЙ)" + +#: src/libslic3r/PrintConfig.cpp:2085 +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 "" +"Якщо увімкнено, вежа витирання не друкується на шарах без змін інструментів. " +"На шарах із зміною інструменту екструдер рухатиметься вниз, щоб надрукувати " +"вежу витирання. Користувач несе відповідальність за те, щоб не було " +"зіткнення з друком." + +#: src/libslic3r/PrintConfig.cpp:2092 msgid "Generate support material" msgstr "Створити підтримуючий матеріал" -#: src/libslic3r/PrintConfig.cpp:1780 +#: src/libslic3r/PrintConfig.cpp:2094 msgid "Enable support material generation." msgstr "Увімкнути генерацію матеріалів підтримки." -#: src/libslic3r/PrintConfig.cpp:1784 +#: src/libslic3r/PrintConfig.cpp:2098 msgid "Auto generated supports" -msgstr "" +msgstr "Автоматично згенеровані підтримки" -#: src/libslic3r/PrintConfig.cpp:1786 +#: src/libslic3r/PrintConfig.cpp:2100 msgid "" "If checked, supports will be generated automatically based on the overhang " "threshold value. If unchecked, supports will be generated inside the " "\"Support Enforcer\" volumes only." msgstr "" +"Якщо увімкнено, підтримка буде генеруватися автоматично на основі порогового " +"значення звису. Якщо вимкнено, підтримка буде генеруватися лише для " +"\"Примусових підтримок\"." -#: src/libslic3r/PrintConfig.cpp:1792 +#: src/libslic3r/PrintConfig.cpp:2106 msgid "XY separation between an object and its support" msgstr "Розподіл XY між об'єктом та його підтримкою" -#: src/libslic3r/PrintConfig.cpp:1794 +#: src/libslic3r/PrintConfig.cpp:2108 msgid "" "XY separation between an object and its support. If expressed as percentage " "(for example 50%), it will be calculated over external perimeter width." @@ -6584,11 +11434,11 @@ msgstr "" "Розподіл XY між об'єктом та його підтримкою. Якщо вона виражена у відсотках " "(наприклад, 50%), вона буде розрахована за зовнішньою шириною периметру." -#: src/libslic3r/PrintConfig.cpp:1804 +#: src/libslic3r/PrintConfig.cpp:2118 msgid "Pattern angle" msgstr "Кут шаблону" -#: src/libslic3r/PrintConfig.cpp:1806 +#: src/libslic3r/PrintConfig.cpp:2120 msgid "" "Use this setting to rotate the support material pattern on the horizontal " "plane." @@ -6596,7 +11446,7 @@ msgstr "" "Використовуйте цей параметр, щоб повернути шаблон підтримуючого матеріалу на " "горизонтальній площині." -#: src/libslic3r/PrintConfig.cpp:1816 src/libslic3r/PrintConfig.cpp:2421 +#: src/libslic3r/PrintConfig.cpp:2130 src/libslic3r/PrintConfig.cpp:2925 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." @@ -6604,11 +11454,11 @@ msgstr "" "Створити підтримку лише, для того, що лежить на збірній пластині. Не " "створювати підтримку на друк." -#: src/libslic3r/PrintConfig.cpp:1822 +#: src/libslic3r/PrintConfig.cpp:2136 msgid "Contact Z distance" msgstr "Контактна відстань по осі Z" -#: src/libslic3r/PrintConfig.cpp:1824 +#: src/libslic3r/PrintConfig.cpp:2138 msgid "" "The vertical distance between object and support material interface. Setting " "this to 0 will also prevent Slic3r from using bridge flow and speed for the " @@ -6618,19 +11468,19 @@ msgstr "" "Встановлення значення 0 також захистить Slic3r від використання потоку " "мостів та швидкості для першого шару об'єктну." -#: src/libslic3r/PrintConfig.cpp:1831 -msgid "soluble" -msgstr "розчинний" +#: src/libslic3r/PrintConfig.cpp:2145 +msgid "0 (soluble)" +msgstr "0 (розчинний)" -#: src/libslic3r/PrintConfig.cpp:1832 -msgid "detachable" -msgstr "відривний" +#: src/libslic3r/PrintConfig.cpp:2146 +msgid "0.2 (detachable)" +msgstr "0,2 (відривний)" -#: src/libslic3r/PrintConfig.cpp:1837 +#: src/libslic3r/PrintConfig.cpp:2151 msgid "Enforce support for the first" msgstr "Забезпечити підтримку першого(их)" -#: src/libslic3r/PrintConfig.cpp:1839 +#: src/libslic3r/PrintConfig.cpp:2153 msgid "" "Generate support material for the specified number of layers counting from " "bottom, regardless of whether normal support material is enabled or not and " @@ -6643,15 +11493,15 @@ msgstr "" "більшої адгезії об'єктів, що мають дуже тонкий або поганий слід на збірній " "пластині." -#: src/libslic3r/PrintConfig.cpp:1844 +#: src/libslic3r/PrintConfig.cpp:2158 msgid "Enforce support for the first n layers" msgstr "Забезпечити підтримку перших n шарів" -#: src/libslic3r/PrintConfig.cpp:1850 +#: src/libslic3r/PrintConfig.cpp:2164 msgid "Support material/raft/skirt extruder" msgstr "Підтримуючий матеріал / пліт / плінтус екструдеру" -#: src/libslic3r/PrintConfig.cpp:1852 +#: src/libslic3r/PrintConfig.cpp:2166 msgid "" "The extruder to use when printing support material, raft and skirt (1+, 0 to " "use the current extruder to minimize tool changes)." @@ -6659,7 +11509,7 @@ msgstr "" "Екструдер для друку підтримуючого матеріалу, плоту та плінтусу (1+, 0 для " "використання поточного екструдера, щоб мінімізувати зміни інструменту)." -#: src/libslic3r/PrintConfig.cpp:1861 +#: src/libslic3r/PrintConfig.cpp:2175 msgid "" "Set this to a non-zero value to set a manual extrusion width for support " "material. If left zero, default extrusion width will be used if set, " @@ -6672,21 +11522,21 @@ msgstr "" "Якщо він виражений у відсотках (наприклад, 90%), він буде обчислюватися за " "висотою шару." -#: src/libslic3r/PrintConfig.cpp:1869 +#: src/libslic3r/PrintConfig.cpp:2184 msgid "Interface loops" msgstr "Інтерфейсні петлі" -#: src/libslic3r/PrintConfig.cpp:1871 +#: src/libslic3r/PrintConfig.cpp:2186 msgid "" "Cover the top contact layer of the supports with loops. Disabled by default." msgstr "" "Закрити петлями верхній контактний шар підтримки. За замовчанням вимкнено." -#: src/libslic3r/PrintConfig.cpp:1876 +#: src/libslic3r/PrintConfig.cpp:2191 msgid "Support material/raft interface extruder" msgstr "Екструдер інтерфейсу підтримуючого матеріалу / плоту" -#: src/libslic3r/PrintConfig.cpp:1878 +#: src/libslic3r/PrintConfig.cpp:2193 msgid "" "The extruder to use when printing support material interface (1+, 0 to use " "the current extruder to minimize tool changes). This affects raft too." @@ -6695,11 +11545,11 @@ msgstr "" "(1+, 0 для використання поточного екструдера, щоб звести до мінімуму зміни " "інструменту). Це також впливає на плот." -#: src/libslic3r/PrintConfig.cpp:1885 +#: src/libslic3r/PrintConfig.cpp:2200 msgid "Interface layers" msgstr "Інтерфейсні шари" -#: src/libslic3r/PrintConfig.cpp:1887 +#: src/libslic3r/PrintConfig.cpp:2202 msgid "" "Number of interface layers to insert between the object(s) and support " "material." @@ -6707,17 +11557,17 @@ msgstr "" "Кількість шарів інтерфейсу для вставки між об'єктом(ами) та підтримуючим " "матеріалом." -#: src/libslic3r/PrintConfig.cpp:1894 +#: src/libslic3r/PrintConfig.cpp:2209 msgid "Interface pattern spacing" msgstr "Відстань між шаблонами інтерфейсу" -#: src/libslic3r/PrintConfig.cpp:1896 +#: src/libslic3r/PrintConfig.cpp:2211 msgid "Spacing between interface lines. Set zero to get a solid interface." msgstr "" "Відстань між інтерфейсними лініями. Встановити 0, щоб отримати надійний " "інтерфейс." -#: src/libslic3r/PrintConfig.cpp:1905 +#: src/libslic3r/PrintConfig.cpp:2220 msgid "" "Speed for printing support material interface layers. If expressed as " "percentage (for example 50%) it will be calculated over support material " @@ -6727,35 +11577,35 @@ msgstr "" "виражена у відсотках (наприклад, 50%), вона буде розрахована за швидкістю " "матеріалу підтримки." -#: src/libslic3r/PrintConfig.cpp:1914 +#: src/libslic3r/PrintConfig.cpp:2229 msgid "Pattern" msgstr "Шаблон" -#: src/libslic3r/PrintConfig.cpp:1916 +#: src/libslic3r/PrintConfig.cpp:2231 msgid "Pattern used to generate support material." msgstr "Шаблон, що використовується для створення матеріалу підтримки." -#: src/libslic3r/PrintConfig.cpp:1922 +#: src/libslic3r/PrintConfig.cpp:2237 msgid "Rectilinear grid" -msgstr "" +msgstr "Прямолінійна сітка" -#: src/libslic3r/PrintConfig.cpp:1928 +#: src/libslic3r/PrintConfig.cpp:2243 msgid "Pattern spacing" msgstr "Відстань між шаблонами" -#: src/libslic3r/PrintConfig.cpp:1930 +#: src/libslic3r/PrintConfig.cpp:2245 msgid "Spacing between support material lines." msgstr "Відстань між лініями підтримуючого матеріалу." -#: src/libslic3r/PrintConfig.cpp:1939 +#: src/libslic3r/PrintConfig.cpp:2254 msgid "Speed for printing support material." msgstr "Швидкість друку підтримуючого матеріалу." -#: src/libslic3r/PrintConfig.cpp:1946 +#: src/libslic3r/PrintConfig.cpp:2261 msgid "Synchronize with object layers" msgstr "Синхронізувати з шарами об'єкту" -#: src/libslic3r/PrintConfig.cpp:1948 +#: src/libslic3r/PrintConfig.cpp:2263 msgid "" "Synchronize support layers with the object print layers. This is useful with " "multi-material printers, where the extruder switch is expensive." @@ -6764,11 +11614,11 @@ msgstr "" "використовувати з багато-матеріальними принтерами, де перемикання " "екструдерів -затратна процедура." -#: src/libslic3r/PrintConfig.cpp:1954 +#: src/libslic3r/PrintConfig.cpp:2269 msgid "Overhang threshold" msgstr "Порог нависання" -#: src/libslic3r/PrintConfig.cpp:1956 +#: src/libslic3r/PrintConfig.cpp:2271 msgid "" "Support material will not be generated for overhangs whose slope angle (90° " "= vertical) is above the given threshold. In other words, this value " @@ -6782,11 +11632,11 @@ msgstr "" "площини), який ви можете надрукувати без підтримуючого матеріалу. Встановити " "0 для автоматичного визначення (рекомендовано)." -#: src/libslic3r/PrintConfig.cpp:1968 +#: src/libslic3r/PrintConfig.cpp:2283 msgid "With sheath around the support" msgstr "З оболонкою навколо підтримки" -#: src/libslic3r/PrintConfig.cpp:1970 +#: src/libslic3r/PrintConfig.cpp:2285 msgid "" "Add a sheath (a single perimeter line) around the base support. This makes " "the support more reliable, but also more difficult to remove." @@ -6794,23 +11644,23 @@ msgstr "" "Додати оболонку (одну лінію периметра) навколо базової підтримки. Це робить " "підтримку більш надійною, але її важче видалити." -#: src/libslic3r/PrintConfig.cpp:1977 +#: src/libslic3r/PrintConfig.cpp:2292 msgid "" -"Extruder temperature for layers after the first one. Set this to zero to " -"disable temperature control commands in the output." +"Nozzle temperature for layers after the first one. Set this to zero to " +"disable temperature control commands in the output G-code." msgstr "" -"Температура екструдеру для шарів після першого. Установіть 0, щоб вимкнути " -"команди керування температурою на виході." +"Температура сопла для шарів після першого. Встановіть значення нуля, щоб " +"вимкнути команди регулювання температури у вихідному G-коді." -#: src/libslic3r/PrintConfig.cpp:1979 -msgid "Temperature" -msgstr "Температура" +#: src/libslic3r/PrintConfig.cpp:2295 +msgid "Nozzle temperature" +msgstr "Температура сопла" -#: src/libslic3r/PrintConfig.cpp:1985 +#: src/libslic3r/PrintConfig.cpp:2301 msgid "Detect thin walls" -msgstr "Виявлення тонких стін" +msgstr "Виявлення тонких стінок" -#: src/libslic3r/PrintConfig.cpp:1987 +#: src/libslic3r/PrintConfig.cpp:2303 msgid "" "Detect single-width walls (parts where two extrusions don't fit and we need " "to collapse them into a single trace)." @@ -6818,11 +11668,11 @@ msgstr "" "Визначення одношарової стінки (частини, де два екструзії не підходять, і нам " "потрібно згорнути їх у єдиний слід)." -#: src/libslic3r/PrintConfig.cpp:1993 +#: src/libslic3r/PrintConfig.cpp:2309 msgid "Threads" msgstr "Нитки" -#: src/libslic3r/PrintConfig.cpp:1994 +#: src/libslic3r/PrintConfig.cpp:2310 msgid "" "Threads are used to parallelize long-running tasks. Optimal threads number " "is slightly above the number of available cores/processors." @@ -6830,17 +11680,23 @@ msgstr "" "Нитки використовуються для паралелізації довготривалих завдань. Оптимальна " "кількість ниток трохи перевищує кількість доступних ядер / процесорів." -#: src/libslic3r/PrintConfig.cpp:2006 +#: src/libslic3r/PrintConfig.cpp:2322 msgid "" -"This custom code is inserted right before every extruder change. Note that " -"you can use placeholder variables for all Slic3r settings as well as " -"[previous_extruder] and [next_extruder]." +"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 "" -"Цей спеціальний код вставляється безпосередньо перед кожною зміненою " -"екструдера. Зверніть увагу, що ви можете використовувати змінні-заповнювачі " -"для всіх параметрів Slic3r, а також [previous_extruder] і [next_extruder]." +"Цей користувацький код вставляється перед кожною заміною інструменту. Можна " +"використовувати шаблонні змінні для всіх налаштувань PrusaSlicer, таких як " +"{previous_extruder} та {next_extruder}. Коли включається команда зміни " +"інструмента, яка змінюється на правильний екструдер (наприклад, " +"T{next_extruder}), PrusaSlicer не видасть жодної такої команди. Отже, можна " +"створювати сценарії до поведінки як до, так і після заміни інструменту." -#: src/libslic3r/PrintConfig.cpp:2018 +#: src/libslic3r/PrintConfig.cpp:2335 msgid "" "Set this to a non-zero value to set a manual extrusion width for infill for " "top surfaces. You may want to use thinner extrudates to fill all narrow " @@ -6856,7 +11712,7 @@ msgstr "" "виражена у відсотках (наприклад, 90%), вона буде обчислюватися за висотою " "шару." -#: src/libslic3r/PrintConfig.cpp:2029 +#: src/libslic3r/PrintConfig.cpp:2347 msgid "" "Speed for printing top solid layers (it only applies to the uppermost " "external layers and not to their internal solid layers). You may want to " @@ -6870,23 +11726,37 @@ msgstr "" "відсотком (наприклад, 80%) звищення швидкості щільного наповнення . " "Встановити 0 для автоматичного обчислення." -#: src/libslic3r/PrintConfig.cpp:2043 +#: src/libslic3r/PrintConfig.cpp:2362 msgid "Number of solid layers to generate on top surfaces." msgstr "Кількість суцільних шарів, генерованих на верхніх поверхнях." -#: src/libslic3r/PrintConfig.cpp:2044 +#: src/libslic3r/PrintConfig.cpp:2363 msgid "Top solid layers" msgstr "Верхні суцільні шари" -#: src/libslic3r/PrintConfig.cpp:2050 +#: src/libslic3r/PrintConfig.cpp:2371 +msgid "" +"The number of top solid layers is increased above top_solid_layers if " +"necessary to satisfy minimum thickness of top shell. This is useful to " +"prevent pillowing effect when printing with variable layer height." +msgstr "" +"Кількість верхніх твердих шарів збільшується над top_solid_layers, якщо це " +"необхідно для задоволення мінімальної товщини верхньої оболонки. Це корисно " +"для запобігання ефекту подушки під час друку зі змінною висотою шару." + +#: src/libslic3r/PrintConfig.cpp:2374 +msgid "Minimum top shell thickness" +msgstr "Мінімальна товщина верхньої оболонки" + +#: src/libslic3r/PrintConfig.cpp:2381 msgid "Speed for travel moves (jumps between distant extrusion points)." msgstr "Швидкість рухів пересування (стрибки між далекими точками екструзії)." -#: src/libslic3r/PrintConfig.cpp:2058 +#: src/libslic3r/PrintConfig.cpp:2389 msgid "Use firmware retraction" msgstr "Використовувати відмову прошивки" -#: src/libslic3r/PrintConfig.cpp:2059 +#: src/libslic3r/PrintConfig.cpp:2390 msgid "" "This experimental setting uses G10 and G11 commands to have the firmware " "handle the retraction. This is only supported in recent Marlin." @@ -6894,11 +11764,11 @@ msgstr "" "Цей експериментальний параметр використовує команди G10 і G11 для обробки " "відмови прошивки. Останнім часом це підтримується лише Marlin-ом." -#: src/libslic3r/PrintConfig.cpp:2065 +#: src/libslic3r/PrintConfig.cpp:2396 msgid "Use relative E distances" msgstr "Використовувати відносні E відстані" -#: src/libslic3r/PrintConfig.cpp:2066 +#: src/libslic3r/PrintConfig.cpp:2397 msgid "" "If your firmware requires relative E values, check this, otherwise leave it " "unchecked. Most firmwares use absolute values." @@ -6906,11 +11776,11 @@ msgstr "" "Якщо ваша прошивка потребує відносне значення E, зазначте це, інакше залиште " "його незазначеним. Більшість прошивок використовують абсолютні значення." -#: src/libslic3r/PrintConfig.cpp:2072 +#: src/libslic3r/PrintConfig.cpp:2403 msgid "Use volumetric E" msgstr "Використовувати об'ємний Е" -#: src/libslic3r/PrintConfig.cpp:2073 +#: src/libslic3r/PrintConfig.cpp:2404 msgid "" "This experimental setting uses outputs the E values in cubic millimeters " "instead of linear millimeters. If your firmware doesn't already know " @@ -6923,14 +11793,14 @@ msgstr "" "міліметрах замість лінійних міліметрів. Якщо ваша прошивку ще не знає " "діаметр ниток, ви можете встановити такі команди, як \"M200 D " "[filament_diameter_0] T0\" у вашому старті G-коду, щоб включити об'ємний " -"режим і використовувати діаметр нитки, пов'язаний з вибраною ниткою в " -"Slic3r. Останнім часом це підтримується лише Marlin-ом." +"режим і використовувати діаметр філаменту, пов'язаний з вибраним філаментем " +"у Slic3r. Останнім часом це підтримується лише Marlin-ом." -#: src/libslic3r/PrintConfig.cpp:2083 +#: src/libslic3r/PrintConfig.cpp:2414 msgid "Enable variable layer height feature" msgstr "Увімкнути функцію шарів змінної висоти" -#: src/libslic3r/PrintConfig.cpp:2084 +#: src/libslic3r/PrintConfig.cpp:2415 msgid "" "Some printers or printer setups may have difficulties printing with a " "variable layer height. Enabled by default." @@ -6938,11 +11808,11 @@ msgstr "" "Деякі принтери або налаштування принтера можуть мати труднощі з друкуванням " "шарів змінної висоти. Увімкнено за умовчанням." -#: src/libslic3r/PrintConfig.cpp:2090 +#: src/libslic3r/PrintConfig.cpp:2421 msgid "Wipe while retracting" -msgstr "Вичіщувати при відмові" +msgstr "Витирання протягом ретракту" -#: src/libslic3r/PrintConfig.cpp:2091 +#: src/libslic3r/PrintConfig.cpp:2422 msgid "" "This flag will move the nozzle while retracting to minimize the possible " "blob on leaky extruders." @@ -6950,7 +11820,7 @@ msgstr "" "Цей прапорець перемістить сопло під час відмови, щоб мінімізувати можливість " "утворення краплі на витікаючих екструдерах." -#: src/libslic3r/PrintConfig.cpp:2098 +#: src/libslic3r/PrintConfig.cpp:2429 msgid "" "Multi material printers may need to prime or purge extruders on tool " "changes. Extrude the excess material into the wipe tower." @@ -6959,94 +11829,101 @@ msgstr "" "екструдерів при зміні інструмента. Екструдуйте надлишок матеріалу до " "вичищуючої вежі." -#: src/libslic3r/PrintConfig.cpp:2104 +#: src/libslic3r/PrintConfig.cpp:2435 msgid "Purging volumes - load/unload volumes" -msgstr "" +msgstr "Обсяги витирання - обсяги заведення/виведення" -#: src/libslic3r/PrintConfig.cpp:2105 +#: src/libslic3r/PrintConfig.cpp:2436 msgid "" "This vector saves required volumes to change from/to each tool used on the " "wipe tower. These values are used to simplify creation of the full purging " -"volumes below. " +"volumes below." msgstr "" +"Цей вектор економить необхідні обсяги для зміни від / до кожного " +"інструменту, що використовується на вежі витирання. Ці значення " +"використовуються для спрощення створення повних обсягів продувки нижче." -#: src/libslic3r/PrintConfig.cpp:2111 +#: src/libslic3r/PrintConfig.cpp:2442 msgid "Purging volumes - matrix" -msgstr "" +msgstr "Таблиця обсягів очищення" -#: src/libslic3r/PrintConfig.cpp:2112 +#: src/libslic3r/PrintConfig.cpp:2443 msgid "" "This matrix describes volumes (in cubic milimetres) required to purge the " -"new filament on the wipe tower for any given pair of tools. " +"new filament on the wipe tower for any given pair of tools." msgstr "" +"Ця матриця описує обсяги (у кубічних міліметрах), необхідні для витирання " +"нового філаменту на вежі витирання для будь-якої пари інструментів." -#: src/libslic3r/PrintConfig.cpp:2121 +#: src/libslic3r/PrintConfig.cpp:2452 msgid "Position X" msgstr "Позиція X" -#: src/libslic3r/PrintConfig.cpp:2122 +#: src/libslic3r/PrintConfig.cpp:2453 msgid "X coordinate of the left front corner of a wipe tower" msgstr "X координата лівого переднього кута вичищуючої вежі" -#: src/libslic3r/PrintConfig.cpp:2128 +#: src/libslic3r/PrintConfig.cpp:2459 msgid "Position Y" msgstr "Позиція Y" -#: src/libslic3r/PrintConfig.cpp:2129 +#: src/libslic3r/PrintConfig.cpp:2460 msgid "Y coordinate of the left front corner of a wipe tower" msgstr "Y координата лівого переднього кута вичищуючої вежі" -#: src/libslic3r/PrintConfig.cpp:2136 +#: src/libslic3r/PrintConfig.cpp:2467 msgid "Width of a wipe tower" msgstr "Ширина вичищуючої вежі" -#: src/libslic3r/PrintConfig.cpp:2142 +#: src/libslic3r/PrintConfig.cpp:2473 msgid "Wipe tower rotation angle" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:2143 -msgid "Wipe tower rotation angle with respect to x-axis " -msgstr "" +msgstr "Кут повороту вежі витирання" -#: src/libslic3r/PrintConfig.cpp:2144 src/libslic3r/PrintConfig.cpp:2565 -msgid "degrees" -msgstr "" +#: src/libslic3r/PrintConfig.cpp:2474 +msgid "Wipe tower rotation angle with respect to x-axis." +msgstr "Кут повороту вежі витирання за віссю Х." -#: src/libslic3r/PrintConfig.cpp:2150 +#: src/libslic3r/PrintConfig.cpp:2481 msgid "Wipe into this object's infill" -msgstr "" +msgstr "Витирати до наповнення цього об'єкту" -#: src/libslic3r/PrintConfig.cpp:2151 +#: src/libslic3r/PrintConfig.cpp:2482 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 "" +"Очищення після заміни інструменту виконується всередині заповнювачів цього " +"об’єкта. Це зменшує кількість відходів, але може призвести до збільшення " +"часу друку через додаткові переміщення." -#: src/libslic3r/PrintConfig.cpp:2158 +#: src/libslic3r/PrintConfig.cpp:2489 msgid "Wipe into this object" -msgstr "" +msgstr "Витирати до цього об'єкту" -#: src/libslic3r/PrintConfig.cpp:2159 +#: src/libslic3r/PrintConfig.cpp:2490 msgid "" "Object will be used to purge the nozzle after a toolchange to save material " "that would otherwise end up in the wipe tower and decrease print time. " "Colours of the objects will be mixed as a result." msgstr "" +"Об'єкт буде використаний для продувки сопла після заміни інструменту, щоб " +"заощадити матеріал, який інакше потрапив би до вежі витирання, і зменшити " +"час друку. В результаті кольори предметів будуть змішані." -#: src/libslic3r/PrintConfig.cpp:2165 +#: src/libslic3r/PrintConfig.cpp:2496 msgid "Maximal bridging distance" -msgstr "" +msgstr "Максимальна мостова відстань" -#: src/libslic3r/PrintConfig.cpp:2166 -msgid "Maximal distance between supports on sparse infill sections. " -msgstr "" +#: src/libslic3r/PrintConfig.cpp:2497 +msgid "Maximal distance between supports on sparse infill sections." +msgstr "Максимальна відстань між підтримками на рідкісних ділянках заповнення." -#: src/libslic3r/PrintConfig.cpp:2172 +#: src/libslic3r/PrintConfig.cpp:2503 msgid "XY Size Compensation" msgstr "Зрівноваження розміру за XY" -#: src/libslic3r/PrintConfig.cpp:2174 +#: src/libslic3r/PrintConfig.cpp:2505 msgid "" "The object will be grown/shrunk in the XY plane by the configured value " "(negative = inwards, positive = outwards). This might be useful for fine-" @@ -7056,11 +11933,11 @@ msgstr "" "(негативний - внутрішній, позитивний - ззовнішній). Це може бути корисним " "для точного налаштування розмірів отворів." -#: src/libslic3r/PrintConfig.cpp:2182 +#: src/libslic3r/PrintConfig.cpp:2513 msgid "Z offset" msgstr "Зміщення Z" -#: src/libslic3r/PrintConfig.cpp:2183 +#: src/libslic3r/PrintConfig.cpp:2514 msgid "" "This value will be added (or subtracted) from all the Z coordinates in the " "output G-code. It is used to compensate for bad Z endstop position: for " @@ -7072,615 +11949,1382 @@ msgstr "" "наприклад, якщо ваш кінцевий нуль фактично залишає сопло на 0,3 мм від " "полотна друку, встановіть його на значення -0,3 (або виправте ваш endstop)." -#: src/libslic3r/PrintConfig.cpp:2200 +#: src/libslic3r/PrintConfig.cpp:2581 msgid "Display width" -msgstr "" +msgstr "Ширина дисплея" -#: src/libslic3r/PrintConfig.cpp:2201 +#: src/libslic3r/PrintConfig.cpp:2582 msgid "Width of the display" -msgstr "" +msgstr "Ширина дисплея" -#: src/libslic3r/PrintConfig.cpp:2206 +#: src/libslic3r/PrintConfig.cpp:2587 msgid "Display height" -msgstr "" +msgstr "Висота дисплея" -#: src/libslic3r/PrintConfig.cpp:2207 +#: src/libslic3r/PrintConfig.cpp:2588 msgid "Height of the display" -msgstr "" +msgstr "Висота дисплею" -#: src/libslic3r/PrintConfig.cpp:2212 +#: src/libslic3r/PrintConfig.cpp:2593 msgid "Number of pixels in" -msgstr "" +msgstr "Кількість пікселів за віссю" -#: src/libslic3r/PrintConfig.cpp:2214 +#: src/libslic3r/PrintConfig.cpp:2595 msgid "Number of pixels in X" -msgstr "" +msgstr "Кількість пікселів за віссю X" -#: src/libslic3r/PrintConfig.cpp:2220 +#: src/libslic3r/PrintConfig.cpp:2601 msgid "Number of pixels in Y" -msgstr "" +msgstr "Кількість пікселів за віссю Y" + +#: src/libslic3r/PrintConfig.cpp:2606 +msgid "Display horizontal mirroring" +msgstr "Горизонтальне віддзеркалення дисплея" + +#: src/libslic3r/PrintConfig.cpp:2607 +msgid "Mirror horizontally" +msgstr "Віддзеркалити горизонтально" + +#: src/libslic3r/PrintConfig.cpp:2608 +msgid "Enable horizontal mirroring of output images" +msgstr "Увімкнути горизонтальне віддзеркалення вихідних зображень" + +#: src/libslic3r/PrintConfig.cpp:2613 +msgid "Display vertical mirroring" +msgstr "Вертикальне віддзеркалення дисплея" + +#: src/libslic3r/PrintConfig.cpp:2614 +msgid "Mirror vertically" +msgstr "Віддзеркалити вертикально" + +#: src/libslic3r/PrintConfig.cpp:2615 +msgid "Enable vertical mirroring of output images" +msgstr "Увімкнути вертикальне віддзеркалення вихідних зображень" -#: src/libslic3r/PrintConfig.cpp:2225 +#: src/libslic3r/PrintConfig.cpp:2620 msgid "Display orientation" -msgstr "" +msgstr "Орієнтація дисплея" -#: src/libslic3r/PrintConfig.cpp:2226 +#: src/libslic3r/PrintConfig.cpp:2621 msgid "" "Set the actual LCD display orientation inside the SLA printer. Portrait mode " "will flip the meaning of display width and height parameters and the output " "images will be rotated by 90 degrees." msgstr "" +"Встановіть фактичну орієнтацію LCD-дисплея всередині SLA принтера. " +"Портретний режим переверне значення параметрів ширини та висоти дисплея, а " +"вихідні зображення повернуть на 90 градусів." -#: src/libslic3r/PrintConfig.cpp:2232 +#: src/libslic3r/PrintConfig.cpp:2627 msgid "Landscape" -msgstr "" +msgstr "Альбомна" -#: src/libslic3r/PrintConfig.cpp:2233 +#: src/libslic3r/PrintConfig.cpp:2628 msgid "Portrait" -msgstr "" +msgstr "Книжкова" -#: src/libslic3r/PrintConfig.cpp:2238 +#: src/libslic3r/PrintConfig.cpp:2633 msgid "Fast" -msgstr "" +msgstr "Швидкий" -#: src/libslic3r/PrintConfig.cpp:2239 +#: src/libslic3r/PrintConfig.cpp:2634 msgid "Fast tilt" -msgstr "" +msgstr "Швидкий нахил" -#: src/libslic3r/PrintConfig.cpp:2240 +#: src/libslic3r/PrintConfig.cpp:2635 msgid "Time of the fast tilt" -msgstr "" +msgstr "Час швидкого нахилу" -#: src/libslic3r/PrintConfig.cpp:2247 +#: src/libslic3r/PrintConfig.cpp:2642 msgid "Slow" -msgstr "" +msgstr "Повільний" -#: src/libslic3r/PrintConfig.cpp:2248 +#: src/libslic3r/PrintConfig.cpp:2643 msgid "Slow tilt" -msgstr "" +msgstr "Повільний нахил" -#: src/libslic3r/PrintConfig.cpp:2249 +#: src/libslic3r/PrintConfig.cpp:2644 msgid "Time of the slow tilt" -msgstr "" +msgstr "Час повільного нахилу" -#: src/libslic3r/PrintConfig.cpp:2256 +#: src/libslic3r/PrintConfig.cpp:2651 msgid "Area fill" -msgstr "" +msgstr "Заповнена область" -#: src/libslic3r/PrintConfig.cpp:2257 +#: src/libslic3r/PrintConfig.cpp:2652 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" "then a slow tilt will be used, otherwise - a fast tilt" msgstr "" +"Відсоток площі столу.\n" +"Якщо область друку перевищує вказане значення,\n" +"тоді буде використовуватися повільний нахил, інакше - швидкий нахил" -#: src/libslic3r/PrintConfig.cpp:2264 src/libslic3r/PrintConfig.cpp:2265 -#: src/libslic3r/PrintConfig.cpp:2266 +#: src/libslic3r/PrintConfig.cpp:2659 src/libslic3r/PrintConfig.cpp:2660 +#: src/libslic3r/PrintConfig.cpp:2661 msgid "Printer scaling correction" -msgstr "" +msgstr "Корекція масштабування принтера" -#: src/libslic3r/PrintConfig.cpp:2272 src/libslic3r/PrintConfig.cpp:2273 +#: src/libslic3r/PrintConfig.cpp:2667 src/libslic3r/PrintConfig.cpp:2668 msgid "Printer absolute correction" -msgstr "" +msgstr "Абсолютна корекція принтера" -#: src/libslic3r/PrintConfig.cpp:2274 +#: src/libslic3r/PrintConfig.cpp:2669 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." +msgstr "Надує або спустить нарізані 2D-полігони відповідно до знака корекції." + +#: src/libslic3r/PrintConfig.cpp:2675 +msgid "Elephant foot minimum width" +msgstr "Мінімальна ширина слонової стопи" + +#: src/libslic3r/PrintConfig.cpp:2677 +msgid "" +"Minimum width of features to maintain when doing elephant foot compensation." msgstr "" +"Мінімальна ширина частей, яку слід підтримувати, виконуючи компенсацію стопи " +"слона." -#: src/libslic3r/PrintConfig.cpp:2280 src/libslic3r/PrintConfig.cpp:2281 +#: src/libslic3r/PrintConfig.cpp:2684 src/libslic3r/PrintConfig.cpp:2685 msgid "Printer gamma correction" -msgstr "" +msgstr "Гамма - корекція принтера" -#: src/libslic3r/PrintConfig.cpp:2282 -msgid "This will apply a gamm correction to the rasterized 2D polygons." +#: src/libslic3r/PrintConfig.cpp:2686 +msgid "" +"This will apply a gamma correction to the rasterized 2D polygons. A gamma " +"value of zero means thresholding with the threshold in the middle. This " +"behaviour eliminates antialiasing without losing holes in polygons." msgstr "" +"Це застосує гамма-корекцію до растеризованих 2D-полігонів. Нульове значення " +"гамми означає порогове значення з порогом посередині. Така поведінка усуває " +"згладжування, не втрачаючи дірок у полігонах." + +#: src/libslic3r/PrintConfig.cpp:2698 src/libslic3r/PrintConfig.cpp:2699 +msgid "SLA material type" +msgstr "Тип SLA-матеріалу" -#: src/libslic3r/PrintConfig.cpp:2291 src/libslic3r/PrintConfig.cpp:2292 +#: src/libslic3r/PrintConfig.cpp:2710 src/libslic3r/PrintConfig.cpp:2711 msgid "Initial layer height" -msgstr "" +msgstr "Висота першого шару" + +#: src/libslic3r/PrintConfig.cpp:2717 src/libslic3r/PrintConfig.cpp:2718 +msgid "Bottle volume" +msgstr "Об’єм пляшки" + +#: src/libslic3r/PrintConfig.cpp:2719 +msgid "ml" +msgstr "мл" + +#: src/libslic3r/PrintConfig.cpp:2724 src/libslic3r/PrintConfig.cpp:2725 +msgid "Bottle weight" +msgstr "Вага пляшки" + +#: src/libslic3r/PrintConfig.cpp:2726 +msgid "kg" +msgstr "кг" -#: src/libslic3r/PrintConfig.cpp:2298 +#: src/libslic3r/PrintConfig.cpp:2733 +msgid "g/ml" +msgstr "г/мл" + +#: src/libslic3r/PrintConfig.cpp:2740 +msgid "money/bottle" +msgstr "грошових одиниць/пляшку" + +#: src/libslic3r/PrintConfig.cpp:2745 msgid "Faded layers" -msgstr "" +msgstr "Шари початкового контакту" -#: src/libslic3r/PrintConfig.cpp:2299 +#: src/libslic3r/PrintConfig.cpp:2746 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" msgstr "" +"Кількість шарів, необхідних для часу експозиції, зменшується від початкового " +"часу експозиції до часу експозиції" + +#: src/libslic3r/PrintConfig.cpp:2753 src/libslic3r/PrintConfig.cpp:2754 +msgid "Minimum exposure time" +msgstr "Мінімальний час експозиції" -#: src/libslic3r/PrintConfig.cpp:2306 src/libslic3r/PrintConfig.cpp:2307 +#: src/libslic3r/PrintConfig.cpp:2761 src/libslic3r/PrintConfig.cpp:2762 +msgid "Maximum exposure time" +msgstr "Максимальний час експозиції" + +#: src/libslic3r/PrintConfig.cpp:2769 src/libslic3r/PrintConfig.cpp:2770 msgid "Exposure time" -msgstr "" +msgstr "Час експозиції" + +#: src/libslic3r/PrintConfig.cpp:2776 src/libslic3r/PrintConfig.cpp:2777 +msgid "Minimum initial exposure time" +msgstr "Мінімальний час початкової експозиції" + +#: src/libslic3r/PrintConfig.cpp:2784 src/libslic3r/PrintConfig.cpp:2785 +msgid "Maximum initial exposure time" +msgstr "Максимальний час початкової експозиції" -#: src/libslic3r/PrintConfig.cpp:2313 src/libslic3r/PrintConfig.cpp:2314 +#: src/libslic3r/PrintConfig.cpp:2792 src/libslic3r/PrintConfig.cpp:2793 msgid "Initial exposure time" -msgstr "" +msgstr "Час початкової експозиції" -#: src/libslic3r/PrintConfig.cpp:2320 src/libslic3r/PrintConfig.cpp:2321 +#: src/libslic3r/PrintConfig.cpp:2799 src/libslic3r/PrintConfig.cpp:2800 msgid "Correction for expansion" -msgstr "" +msgstr "Поправка на розширення" -#: src/libslic3r/PrintConfig.cpp:2327 +#: src/libslic3r/PrintConfig.cpp:2806 msgid "SLA print material notes" -msgstr "" +msgstr "Примітки до друкованих SLA-матеріалів" -#: src/libslic3r/PrintConfig.cpp:2328 +#: src/libslic3r/PrintConfig.cpp:2807 msgid "You can put your notes regarding the SLA print material here." -msgstr "" +msgstr "Тут ви можете помістити свої нотатки щодо SLA-матеріалу." -#: src/libslic3r/PrintConfig.cpp:2336 src/libslic3r/PrintConfig.cpp:2347 +#: src/libslic3r/PrintConfig.cpp:2819 src/libslic3r/PrintConfig.cpp:2830 msgid "Default SLA material profile" -msgstr "" +msgstr "Профіль SLA-матеріалу за замовчанням" -#: src/libslic3r/PrintConfig.cpp:2358 +#: src/libslic3r/PrintConfig.cpp:2841 msgid "Generate supports" -msgstr "" +msgstr "Генерувати підтримки" -#: src/libslic3r/PrintConfig.cpp:2360 +#: src/libslic3r/PrintConfig.cpp:2843 msgid "Generate supports for the models" -msgstr "" +msgstr "Генерувати підтримки для моделей" -#: src/libslic3r/PrintConfig.cpp:2365 -msgid "Support head front diameter" -msgstr "" +#: src/libslic3r/PrintConfig.cpp:2848 +msgid "Pinhead front diameter" +msgstr "Діаметр головки стовпа" -#: src/libslic3r/PrintConfig.cpp:2367 +#: src/libslic3r/PrintConfig.cpp:2850 msgid "Diameter of the pointing side of the head" -msgstr "" +msgstr "Діаметр носику головки" -#: src/libslic3r/PrintConfig.cpp:2374 -msgid "Support head penetration" -msgstr "" +#: src/libslic3r/PrintConfig.cpp:2857 +msgid "Head penetration" +msgstr "Проникнення головки" -#: src/libslic3r/PrintConfig.cpp:2376 +#: src/libslic3r/PrintConfig.cpp:2859 msgid "How much the pinhead has to penetrate the model surface" -msgstr "" +msgstr "На скільки носики повинні проникати в поверхню моделі" -#: src/libslic3r/PrintConfig.cpp:2383 -msgid "Support head width" -msgstr "" +#: src/libslic3r/PrintConfig.cpp:2866 +msgid "Pinhead width" +msgstr "Ширина головки стовпа" -#: src/libslic3r/PrintConfig.cpp:2385 +#: src/libslic3r/PrintConfig.cpp:2868 msgid "Width from the back sphere center to the front sphere center" -msgstr "" +msgstr "Ширина від центру задньої кулі до передньої кулі" -#: src/libslic3r/PrintConfig.cpp:2393 -msgid "Support pillar diameter" -msgstr "" +#: src/libslic3r/PrintConfig.cpp:2876 +msgid "Pillar diameter" +msgstr "Діаметр стовпів" -#: src/libslic3r/PrintConfig.cpp:2395 +#: src/libslic3r/PrintConfig.cpp:2878 msgid "Diameter in mm of the support pillars" +msgstr "Діаметр стовпів підтримки у мм" + +#: src/libslic3r/PrintConfig.cpp:2886 +msgid "Small pillar diameter percent" +msgstr "Процентний діаметр малих стовпів" + +#: src/libslic3r/PrintConfig.cpp:2888 +msgid "" +"The percentage of smaller pillars compared to the normal pillar diameter " +"which are used in problematic areas where a normal pilla cannot fit." msgstr "" +"Відсоток менших стовпів порівняно з нормальним діаметром стовпа, які " +"використовуються в проблемних зонах, де нормальний стовп не може поміститися." -#: src/libslic3r/PrintConfig.cpp:2403 -msgid "Support pillar connection mode" +#: src/libslic3r/PrintConfig.cpp:2897 +msgid "Max bridges on a pillar" +msgstr "Макс. мостів на стовпі" + +#: src/libslic3r/PrintConfig.cpp:2899 +msgid "" +"Maximum number of bridges that can be placed on a pillar. Bridges hold " +"support point pinheads and connect to pillars as small branches." msgstr "" +"Максимальна кількість мостів, які можна розмістити на тримаючому стовпі. " +"Мости утримують верхівки опор і з'єднуються зі стовпами як гілочки." -#: src/libslic3r/PrintConfig.cpp:2404 +#: src/libslic3r/PrintConfig.cpp:2907 +msgid "Pillar connection mode" +msgstr "Режим з'єднання стовпів" + +#: src/libslic3r/PrintConfig.cpp:2908 msgid "" -"Controls the bridge type between two neigboring pillars. Can be zig-zag, " +"Controls the bridge type between two neighboring pillars. Can be zig-zag, " "cross (double zig-zag) or dynamic which will automatically switch between " "the first two depending on the distance of the two pillars." msgstr "" +"Керує типом мосту між двома сусідніми стовпами. Може бути зигзагоподібним, " +"поперечним (подвійний зигзагоподібний) або динамічним, який автоматично " +"перемикається між першими двома залежно від відстані двох стовпів." -#: src/libslic3r/PrintConfig.cpp:2412 +#: src/libslic3r/PrintConfig.cpp:2916 msgid "Zig-Zag" -msgstr "" +msgstr "Зіг-Заг" -#: src/libslic3r/PrintConfig.cpp:2413 +#: src/libslic3r/PrintConfig.cpp:2917 msgid "Cross" -msgstr "" +msgstr "Перехресний" -#: src/libslic3r/PrintConfig.cpp:2414 +#: src/libslic3r/PrintConfig.cpp:2918 msgid "Dynamic" -msgstr "" +msgstr "Динамічний" -#: src/libslic3r/PrintConfig.cpp:2426 +#: src/libslic3r/PrintConfig.cpp:2930 msgid "Pillar widening factor" -msgstr "" +msgstr "Коефіцієнт розширення стовпа" -#: src/libslic3r/PrintConfig.cpp:2428 +#: src/libslic3r/PrintConfig.cpp:2932 msgid "" "Merging bridges or pillars into another pillars can increase the radius. " "Zero means no increase, one means full increase." msgstr "" +"Злиття мостів або стовпів в інші стовпи може збільшити радіус. Нуль означає " +"відсутність збільшення, один означає повне збільшення." -#: src/libslic3r/PrintConfig.cpp:2437 +#: src/libslic3r/PrintConfig.cpp:2941 msgid "Support base diameter" -msgstr "" +msgstr "Діаметр основи підтримки" -#: src/libslic3r/PrintConfig.cpp:2439 +#: src/libslic3r/PrintConfig.cpp:2943 msgid "Diameter in mm of the pillar base" -msgstr "" +msgstr "Діаметр основи стовпа у мм" -#: src/libslic3r/PrintConfig.cpp:2447 +#: src/libslic3r/PrintConfig.cpp:2951 msgid "Support base height" -msgstr "" +msgstr "Висота основи підтримки" -#: src/libslic3r/PrintConfig.cpp:2449 +#: src/libslic3r/PrintConfig.cpp:2953 msgid "The height of the pillar base cone" +msgstr "Висота конуса основи стовпа" + +#: src/libslic3r/PrintConfig.cpp:2960 +msgid "Support base safety distance" +msgstr "Безпечна відстань між основами підтримки" + +#: src/libslic3r/PrintConfig.cpp:2963 +msgid "" +"The minimum distance of the pillar base from the model in mm. Makes sense in " +"zero elevation mode where a gap according to this parameter is inserted " +"between the model and the pad." msgstr "" +"Мінімальна відстань основи стовпа від моделі в мм. Має сенс у режимі " +"нульового підняття, коли між моделлю та майданчиком вставляється зазор " +"відповідно до цього параметра." -#: src/libslic3r/PrintConfig.cpp:2456 +#: src/libslic3r/PrintConfig.cpp:2973 msgid "Critical angle" -msgstr "" +msgstr "Критичний кут" -#: src/libslic3r/PrintConfig.cpp:2458 +#: src/libslic3r/PrintConfig.cpp:2975 msgid "The default angle for connecting support sticks and junctions." -msgstr "" +msgstr "Кут за замовчуванням для з'єднання опорних палочок і з'єднань." -#: src/libslic3r/PrintConfig.cpp:2466 +#: src/libslic3r/PrintConfig.cpp:2983 msgid "Max bridge length" -msgstr "" +msgstr "Максимальна довжина мосту" -#: src/libslic3r/PrintConfig.cpp:2468 +#: src/libslic3r/PrintConfig.cpp:2985 msgid "The max length of a bridge" -msgstr "" +msgstr "Максимальна довжина мосту" -#: src/libslic3r/PrintConfig.cpp:2475 +#: src/libslic3r/PrintConfig.cpp:2992 msgid "Max pillar linking distance" -msgstr "" +msgstr "Макс. відстань між стовпами" -#: src/libslic3r/PrintConfig.cpp:2477 +#: src/libslic3r/PrintConfig.cpp:2994 msgid "" "The max distance of two pillars to get linked with each other. A zero value " "will prohibit pillar cascading." msgstr "" +"Максимальна відстань двох стовпів для з'єднання між собою. Нульове значення " +"забороняє каскадування стовпів." -#: src/libslic3r/PrintConfig.cpp:2485 -msgid "Object elevation" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:2487 -msgid "How much the supports should lift up the supported object." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:2495 -msgid "Support points density" +#: src/libslic3r/PrintConfig.cpp:3004 +msgid "" +"How much the supports should lift up the supported object. If \"Pad around " +"object\" is enabled, this value is ignored." msgstr "" +"Скільки опор повинно піднімати підтримуваний об’єкт. Якщо ввімкнено функцію " +"\"Подушка навколо об’єкта\", це значення ігнорується." -#: src/libslic3r/PrintConfig.cpp:2497 +#: src/libslic3r/PrintConfig.cpp:3015 msgid "This is a relative measure of support points density." -msgstr "" +msgstr "Відносний показних щільності точок підтримки." -#: src/libslic3r/PrintConfig.cpp:2503 +#: src/libslic3r/PrintConfig.cpp:3021 msgid "Minimal distance of the support points" -msgstr "" +msgstr "Мінімальна відстань опорних точок" -#: src/libslic3r/PrintConfig.cpp:2505 +#: src/libslic3r/PrintConfig.cpp:3023 msgid "No support points will be placed closer than this threshold." -msgstr "" +msgstr "Жодні точки підтримки не будуть розміщені ближче цього порогу." -#: src/libslic3r/PrintConfig.cpp:2511 +#: src/libslic3r/PrintConfig.cpp:3029 msgid "Use pad" -msgstr "" +msgstr "Використовувати полушку" -#: src/libslic3r/PrintConfig.cpp:2513 +#: src/libslic3r/PrintConfig.cpp:3031 msgid "Add a pad underneath the supported model" -msgstr "" +msgstr "Додати подушечку під підтримувану модель" -#: src/libslic3r/PrintConfig.cpp:2518 +#: src/libslic3r/PrintConfig.cpp:3036 msgid "Pad wall thickness" -msgstr "" +msgstr "Товщина стінки подушки" -#: src/libslic3r/PrintConfig.cpp:2520 +#: src/libslic3r/PrintConfig.cpp:3038 msgid "The thickness of the pad and its optional cavity walls." -msgstr "" +msgstr "Товщина подушки та її додаткових стінок порожнини." -#: src/libslic3r/PrintConfig.cpp:2528 +#: src/libslic3r/PrintConfig.cpp:3046 msgid "Pad wall height" -msgstr "" +msgstr "Висота стінки подушки" -#: src/libslic3r/PrintConfig.cpp:2529 -msgid "Defines the cavity depth. Set to zero to disable the cavity." +#: src/libslic3r/PrintConfig.cpp:3047 +msgid "" +"Defines the pad cavity depth. Set to zero to disable the cavity. Be careful " +"when enabling this feature, as some resins may produce an extreme suction " +"effect inside the cavity, which makes peeling the print off the vat foil " +"difficult." msgstr "" +"Визначає глибину порожнини подушечки. Встановіть нуль, щоб вимкнути " +"порожнину. Будьте обережні, включаючи цю функцію, оскільки деякі смоли " +"можуть мати надзвичайний ефект всмоктування всередині порожнини, що " +"ускладнює відшарування відбитка з фольги." + +#: src/libslic3r/PrintConfig.cpp:3060 +msgid "Pad brim size" +msgstr "Розмір краю подушки" + +#: src/libslic3r/PrintConfig.cpp:3061 +msgid "How far should the pad extend around the contained geometry" +msgstr "Як далеко повинна розширюватися подушка навколо вміщуваної геометрії" -#: src/libslic3r/PrintConfig.cpp:2539 +#: src/libslic3r/PrintConfig.cpp:3071 msgid "Max merge distance" -msgstr "" +msgstr "Макс. відстань об'єднання" -#: src/libslic3r/PrintConfig.cpp:2541 +#: src/libslic3r/PrintConfig.cpp:3073 msgid "" "Some objects can get along with a few smaller pads instead of a single big " "one. This parameter defines how far the center of two smaller pads should " "be. If theyare closer, they will get merged into one pad." msgstr "" +"Деякі предмети можуть уживатися з кількома меншими подушками замість однієї " +"великої. Цей параметр визначає, наскільки далеко повинен бути центр двох " +"менших подушок. Якщо вони стануть ближче, вони об’єднаються в одну велику." -#: src/libslic3r/PrintConfig.cpp:2552 -msgid "Pad edge radius" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:2561 +#: src/libslic3r/PrintConfig.cpp:3093 msgid "Pad wall slope" -msgstr "" +msgstr "Нахил стінки подушки" -#: src/libslic3r/PrintConfig.cpp:2563 +#: src/libslic3r/PrintConfig.cpp:3095 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." msgstr "" +"Нахил стінки подушки відносно площини столу. 90 градусів означає прямі стіни." + +#: src/libslic3r/PrintConfig.cpp:3106 +msgid "Create pad around object and ignore the support elevation" +msgstr "Створити подушку навколо об’єкта та ігнорувати підняття підтримки" -#: src/libslic3r/PrintConfig.cpp:2924 -msgid "Export SVG" +#: src/libslic3r/PrintConfig.cpp:3111 +msgid "Pad around object everywhere" +msgstr "Подушка скрізь навколо об’єкта" + +#: src/libslic3r/PrintConfig.cpp:3113 +msgid "Force pad around object everywhere" +msgstr "Створити подушку навколо об’єкта" + +#: src/libslic3r/PrintConfig.cpp:3118 +msgid "Pad object gap" +msgstr "Розрив Подушка-Об'єкт" + +#: src/libslic3r/PrintConfig.cpp:3120 +msgid "" +"The gap between the object bottom and the generated pad in zero elevation " +"mode." msgstr "" +"Розрив між дном об’єкта та генерованою подушкою в режимі нульового підняття." -#: src/libslic3r/PrintConfig.cpp:2925 -msgid "Export the model(s) as OBJ." +#: src/libslic3r/PrintConfig.cpp:3129 +msgid "Pad object connector stride" +msgstr "Крок з'єднувача Подушка-Об'єкт" + +#: src/libslic3r/PrintConfig.cpp:3131 +msgid "" +"Distance between two connector sticks which connect the object and the " +"generated pad." msgstr "" +"Відстань між двома з'єднувальними паличками, які з'єднують об'єкт та " +"генеровану подушку." -#: src/libslic3r/PrintConfig.cpp:2936 -msgid "Export SLA" +#: src/libslic3r/PrintConfig.cpp:3138 +msgid "Pad object connector width" +msgstr "Ширина з'єднувача Подушка-Об'єкт" + +#: src/libslic3r/PrintConfig.cpp:3140 +msgid "" +"Width of the connector sticks which connect the object and the generated pad." msgstr "" +"Ширина з'єднувальної паличками, що з'єднує об'єкт та генеровану подушку." -#: src/libslic3r/PrintConfig.cpp:2937 -msgid "Slice the model and export SLA printing layers as PNG." +#: src/libslic3r/PrintConfig.cpp:3147 +msgid "Pad object connector penetration" +msgstr "Глибина проникнення з'єднувача Подушка-Об'єкт" + +#: src/libslic3r/PrintConfig.cpp:3150 +msgid "How much should the tiny connectors penetrate into the model body." +msgstr "На скільки крихітні з'єднувачі повинні проникати в тіло моделі." + +#: src/libslic3r/PrintConfig.cpp:3157 +msgid "Enable hollowing" +msgstr "Увімкнути формування порожнин" + +#: src/libslic3r/PrintConfig.cpp:3159 +msgid "Hollow out a model to have an empty interior" +msgstr "Випорожнити модель, щоб мати порожній інтер’єр" + +#: src/libslic3r/PrintConfig.cpp:3164 +msgid "Wall thickness" +msgstr "Товщина стінки" + +#: src/libslic3r/PrintConfig.cpp:3166 +msgid "Minimum wall thickness of a hollowed model." +msgstr "Мінімальна товщина стінки порожнистої моделі." + +#: src/libslic3r/PrintConfig.cpp:3174 +msgid "Accuracy" +msgstr "Точність" + +#: src/libslic3r/PrintConfig.cpp:3176 +msgid "" +"Performance vs accuracy of calculation. Lower values may produce unwanted " +"artifacts." msgstr "" +"Продуктивність проти точності розрахунку. Менші значення можуть спричинити " +"небажані артефакти." -#: src/libslic3r/PrintConfig.cpp:2942 -msgid "Export 3MF" +#: src/libslic3r/PrintConfig.cpp:3186 +msgid "" +"Hollowing is done in two steps: first, an imaginary interior is calculated " +"deeper (offset plus the closing distance) in the object and then it's " +"inflated back to the specified offset. A greater closing distance makes the " +"interior more rounded. At zero, the interior will resemble the exterior the " +"most." msgstr "" +"Випорожнення виконується у два етапи: спочатку уявний інтер’єр обчислюється " +"глибше (зміщення плюс відстань закриття) в об’єкті, а потім він завищується " +"назад до заданого зміщення. Більша відстань до закриття робить інтер’єр " +"більш округлим. При нулі інтер’єр найбільше буде нагадувати екстер’єр." -#: src/libslic3r/PrintConfig.cpp:2943 +#: src/libslic3r/PrintConfig.cpp:3602 +msgid "Export OBJ" +msgstr "Експорт OBJ" + +#: src/libslic3r/PrintConfig.cpp:3603 +msgid "Export the model(s) as OBJ." +msgstr "Експорт моделі як OBJ." + +#: src/libslic3r/PrintConfig.cpp:3614 +msgid "Export SLA" +msgstr "Експорт SLA" + +#: src/libslic3r/PrintConfig.cpp:3615 +msgid "Slice the model and export SLA printing layers as PNG." +msgstr "Нарізати модель та експортувати шари SLA-друку до PNG." + +#: src/libslic3r/PrintConfig.cpp:3620 +msgid "Export 3MF" +msgstr "Експортувати 3MF" + +#: src/libslic3r/PrintConfig.cpp:3621 msgid "Export the model(s) as 3MF." -msgstr "" +msgstr "Експорт моделі як 3MF." -#: src/libslic3r/PrintConfig.cpp:2947 +#: src/libslic3r/PrintConfig.cpp:3625 msgid "Export AMF" -msgstr "" +msgstr "Експортувати AMF" -#: src/libslic3r/PrintConfig.cpp:2948 +#: src/libslic3r/PrintConfig.cpp:3626 msgid "Export the model(s) as AMF." -msgstr "" +msgstr "Експорт моделі як АMF." -#: src/libslic3r/PrintConfig.cpp:2952 +#: src/libslic3r/PrintConfig.cpp:3630 msgid "Export STL" -msgstr "" +msgstr "Експорт STL" -#: src/libslic3r/PrintConfig.cpp:2953 +#: src/libslic3r/PrintConfig.cpp:3631 msgid "Export the model(s) as STL." -msgstr "" +msgstr "Експорт моделі як STL." -#: src/libslic3r/PrintConfig.cpp:2958 +#: src/libslic3r/PrintConfig.cpp:3636 msgid "Slice the model and export toolpaths as G-code." -msgstr "" +msgstr "Нарізати та експортувати G-код." -#: src/libslic3r/PrintConfig.cpp:2963 +#: src/libslic3r/PrintConfig.cpp:3641 +msgid "G-code viewer" +msgstr "Переглядач G-коду" + +#: src/libslic3r/PrintConfig.cpp:3642 +msgid "Visualize an already sliced and saved G-code" +msgstr "Візуалізувати вже нарізаний та збережений G-код" + +#: src/libslic3r/PrintConfig.cpp:3647 msgid "Slice" -msgstr "" +msgstr "Нарізати" -#: src/libslic3r/PrintConfig.cpp:2964 +#: src/libslic3r/PrintConfig.cpp:3648 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." msgstr "" +"Нарізати модель як FFF або SLA на основі значення printer_technology, " +"зазначеного у конфігурації." -#: src/libslic3r/PrintConfig.cpp:2969 +#: src/libslic3r/PrintConfig.cpp:3653 msgid "Help" msgstr "Допомога" -#: src/libslic3r/PrintConfig.cpp:2970 +#: src/libslic3r/PrintConfig.cpp:3654 msgid "Show this help." -msgstr "" +msgstr "Показати цю підказку." -#: src/libslic3r/PrintConfig.cpp:2975 +#: src/libslic3r/PrintConfig.cpp:3659 msgid "Help (FFF options)" -msgstr "" +msgstr "Допомога (FFF параметри)" -#: src/libslic3r/PrintConfig.cpp:2976 +#: src/libslic3r/PrintConfig.cpp:3660 msgid "Show the full list of print/G-code configuration options." -msgstr "" +msgstr "Показати повний список параметрів конфігурації друку / G-коду." -#: src/libslic3r/PrintConfig.cpp:2980 +#: src/libslic3r/PrintConfig.cpp:3664 msgid "Help (SLA options)" -msgstr "" +msgstr "Допомога (SLA параметри)" -#: src/libslic3r/PrintConfig.cpp:2981 +#: src/libslic3r/PrintConfig.cpp:3665 msgid "Show the full list of SLA print configuration options." -msgstr "" +msgstr "Показати повний перелік параметрів конфігурації SLA-друку." -#: src/libslic3r/PrintConfig.cpp:2985 +#: src/libslic3r/PrintConfig.cpp:3669 msgid "Output Model Info" -msgstr "" +msgstr "Інформація про вихідну модель" -#: src/libslic3r/PrintConfig.cpp:2986 +#: src/libslic3r/PrintConfig.cpp:3670 msgid "Write information about the model to the console." -msgstr "" +msgstr "Писати інформацію про модель на консолі." -#: src/libslic3r/PrintConfig.cpp:2990 +#: src/libslic3r/PrintConfig.cpp:3674 msgid "Save config file" -msgstr "" +msgstr "Зберегти файл конфігурації" -#: src/libslic3r/PrintConfig.cpp:2991 +#: src/libslic3r/PrintConfig.cpp:3675 msgid "Save configuration to the specified file." -msgstr "" +msgstr "Зберегти конфігурацію у вказаному файлі." -#: src/libslic3r/PrintConfig.cpp:3001 +#: src/libslic3r/PrintConfig.cpp:3685 msgid "Align XY" -msgstr "" +msgstr "Вирівняти XY" -#: src/libslic3r/PrintConfig.cpp:3002 +#: src/libslic3r/PrintConfig.cpp:3686 msgid "Align the model to the given point." -msgstr "" +msgstr "Вирівняйте модель за заданою точкою." -#: src/libslic3r/PrintConfig.cpp:3007 +#: src/libslic3r/PrintConfig.cpp:3691 msgid "Cut model at the given Z." msgstr "Розрізати модель за заданим Z." -#: src/libslic3r/PrintConfig.cpp:3028 +#: src/libslic3r/PrintConfig.cpp:3712 msgid "Center" -msgstr "" +msgstr "Центр" -#: src/libslic3r/PrintConfig.cpp:3029 +#: src/libslic3r/PrintConfig.cpp:3713 msgid "Center the print around the given center." -msgstr "" +msgstr "Відцентруйте друк навколо заданого центру." -#: src/libslic3r/PrintConfig.cpp:3033 +#: src/libslic3r/PrintConfig.cpp:3717 msgid "Don't arrange" -msgstr "" +msgstr "Не впорядковувати" -#: src/libslic3r/PrintConfig.cpp:3034 +#: src/libslic3r/PrintConfig.cpp:3718 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." msgstr "" +"Не переставляйте дані моделі перед об’єднанням та зберігайте їх початкові " +"координати XY." -#: src/libslic3r/PrintConfig.cpp:3037 +#: src/libslic3r/PrintConfig.cpp:3721 msgid "Duplicate" -msgstr "" +msgstr "Дублювати" -#: src/libslic3r/PrintConfig.cpp:3038 +#: src/libslic3r/PrintConfig.cpp:3722 msgid "Multiply copies by this factor." -msgstr "" +msgstr "Збільшить кількість копій на цей коефіцієнт." -#: src/libslic3r/PrintConfig.cpp:3042 +#: src/libslic3r/PrintConfig.cpp:3726 msgid "Duplicate by grid" -msgstr "" +msgstr "Дублювати за сіткою" -#: src/libslic3r/PrintConfig.cpp:3043 +#: src/libslic3r/PrintConfig.cpp:3727 msgid "Multiply copies by creating a grid." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3046 -msgid "Merge" -msgstr "" +msgstr "Збільшить кількість копій, створивши сітку." -#: src/libslic3r/PrintConfig.cpp:3047 +#: src/libslic3r/PrintConfig.cpp:3731 msgid "" "Arrange the supplied models in a plate and merge them in a single model in " "order to perform actions once." msgstr "" +"Розташувати поставлені моделі на платформі та об’єднати їх в одну модель, " +"щоб виконати дії один раз." -#: src/libslic3r/PrintConfig.cpp:3052 +#: src/libslic3r/PrintConfig.cpp:3736 msgid "" "Try to repair any non-manifold meshes (this option is implicitly added " "whenever we need to slice the model to perform the requested action)." msgstr "" +"Спробуйте відновити будь-які нерізноманітні сітки (ця опція неявно додається " +"кожного разу, коли нам потрібно нарізати модель для виконання запитуваної " +"дії)." -#: src/libslic3r/PrintConfig.cpp:3056 +#: src/libslic3r/PrintConfig.cpp:3740 msgid "Rotation angle around the Z axis in degrees." -msgstr "" +msgstr "Кут обертання навколо осі Z у градусах." -#: src/libslic3r/PrintConfig.cpp:3060 +#: src/libslic3r/PrintConfig.cpp:3744 msgid "Rotate around X" -msgstr "" +msgstr "Обертати навколо осі X" -#: src/libslic3r/PrintConfig.cpp:3061 +#: src/libslic3r/PrintConfig.cpp:3745 msgid "Rotation angle around the X axis in degrees." -msgstr "" +msgstr "Кут обертання навколо осі Х у градусах." -#: src/libslic3r/PrintConfig.cpp:3065 +#: src/libslic3r/PrintConfig.cpp:3749 msgid "Rotate around Y" -msgstr "" +msgstr "Обертати навколо осі Y" -#: src/libslic3r/PrintConfig.cpp:3066 +#: src/libslic3r/PrintConfig.cpp:3750 msgid "Rotation angle around the Y axis in degrees." -msgstr "" +msgstr "Кут обертання навколо осі Y у градусах." -#: src/libslic3r/PrintConfig.cpp:3071 +#: src/libslic3r/PrintConfig.cpp:3755 msgid "Scaling factor or percentage." -msgstr "" +msgstr "Коефіцієнт масштабування або відсоток." -#: src/libslic3r/PrintConfig.cpp:3076 +#: src/libslic3r/PrintConfig.cpp:3760 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." msgstr "" +"Визначити непоєднані частини у даній моделі (моделях) та розділити їх на " +"окремі об’єкти." -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3763 msgid "Scale to Fit" -msgstr "" +msgstr "Масштабувати під область друку" -#: src/libslic3r/PrintConfig.cpp:3080 +#: src/libslic3r/PrintConfig.cpp:3764 msgid "Scale to fit the given volume." -msgstr "" +msgstr "Масштабувати під задану область друку." -#: src/libslic3r/PrintConfig.cpp:3089 +#: src/libslic3r/PrintConfig.cpp:3773 msgid "Ignore non-existent config files" -msgstr "" +msgstr "Ігнорувати неіснуючі конфігураційні файли" -#: src/libslic3r/PrintConfig.cpp:3090 +#: src/libslic3r/PrintConfig.cpp:3774 msgid "Do not fail if a file supplied to --load does not exist." -msgstr "" +msgstr "Не відмовляти, якщо файл, який подається до --load, не існує." -#: src/libslic3r/PrintConfig.cpp:3093 +#: src/libslic3r/PrintConfig.cpp:3777 msgid "Load config file" -msgstr "" +msgstr "Завантажити файл конфігурації" -#: src/libslic3r/PrintConfig.cpp:3094 +#: src/libslic3r/PrintConfig.cpp:3778 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." msgstr "" +"Завантажити конфігурацію із зазначеного файлу. Його можна використовувати " +"більше одного разу для завантаження опцій з декількох файлів." -#: src/libslic3r/PrintConfig.cpp:3097 +#: src/libslic3r/PrintConfig.cpp:3781 msgid "Output File" -msgstr "" +msgstr "Вихідний файл" -#: src/libslic3r/PrintConfig.cpp:3098 +#: src/libslic3r/PrintConfig.cpp:3782 msgid "" "The file where the output will be written (if not specified, it will be " "based on the input file)." msgstr "" +"Файл, в який буде записано вихідні дані (якщо не вказано, він базуватиметься " +"на вхідному файлі)." -#: src/libslic3r/PrintConfig.cpp:3108 -msgid "Data directory" +#: src/libslic3r/PrintConfig.cpp:3786 +msgid "Single instance mode" +msgstr "Режим одного екземпляру PrusaSlicer" + +#: src/libslic3r/PrintConfig.cpp:3787 +msgid "" +"If enabled, the command line arguments are sent to an existing instance of " +"GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides " +"the \"single_instance\" configuration value from application preferences." msgstr "" +"Якщо увімкнено, аргументи командного рядка надсилаються до існуючого " +"екземпляра графічного інтерфейсу PrusaSlicer, або ж активується існуюче " +"вікно PrusaSlicer. Замінює значення конфігурації \"single_instance\" у " +"налаштуваннях програми." + +#: src/libslic3r/PrintConfig.cpp:3798 +msgid "Data directory" +msgstr "Каталог даних" -#: src/libslic3r/PrintConfig.cpp:3109 +#: src/libslic3r/PrintConfig.cpp:3799 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " "storage." msgstr "" +"Завантажити та зберегти налаштування у вказаному каталозі. Це корисно для " +"ведення різних профілів або включення конфігурацій із мережевого сховища." -#: src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3802 msgid "Logging level" -msgstr "" +msgstr "Рівень журналізації" -#: src/libslic3r/PrintConfig.cpp:3113 +#: src/libslic3r/PrintConfig.cpp:3803 msgid "" -"Messages with severity lower or eqal to the loglevel will be printed out. 0:" -"trace, 1:debug, 2:info, 3:warning, 4:error, 5:fatal" +"Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" +"trace\n" +"For example. loglevel=2 logs fatal, error and warning level messages." msgstr "" +"Встановлює чутливість журналювання. 0:fatal, 1:помилка, 2:попередження, 3:" +"info, 4:налагодження, 5:trace\n" +"Наприклад. loglevel=2 журнали фатальних, помилок і повідомлень рівня " +"попередження." -#: src/libslic3r/GCode/PreviewData.cpp:176 -msgid "Mixed" +#: src/libslic3r/PrintConfig.cpp:3809 +msgid "Render with a software renderer" +msgstr "Візуалізувати за допомогою програмного засобу візуалізації" + +#: src/libslic3r/PrintConfig.cpp:3810 +msgid "" +"Render with a software renderer. The bundled MESA software renderer is " +"loaded instead of the default OpenGL driver." msgstr "" +"Візуалізувати за допомогою програмного засобу візуалізації. Комплектний " +"візуалізатор програмного забезпечення MESA завантажується замість драйвера " +"OpenGL за замовчуванням." -#: src/libslic3r/GCode/PreviewData.cpp:396 -msgid "Height (mm)" -msgstr "Висота (мм)" +#: src/libslic3r/Zipper.cpp:27 +msgid "Error with zip archive" +msgstr "Помилка ZIP-архіву" -#: src/libslic3r/GCode/PreviewData.cpp:398 -msgid "Width (mm)" -msgstr "Ширина (мм)" +#: src/libslic3r/PrintObject.cpp:112 +msgid "Processing triangulated mesh" +msgstr "Обробка триангульованої сітки" -#: src/libslic3r/GCode/PreviewData.cpp:400 -msgid "Speed (mm/s)" -msgstr "Швидкість (мм/с)" +#: src/libslic3r/PrintObject.cpp:157 +msgid "Generating perimeters" +msgstr "Створення периметрів" -#: src/libslic3r/GCode/PreviewData.cpp:402 -msgid "Volumetric flow rate (mm3/s)" -msgstr "" +#: src/libslic3r/PrintObject.cpp:260 +msgid "Preparing infill" +msgstr "Підготовка заповнення" -#: src/libslic3r/GCode/PreviewData.cpp:491 -msgid "Default print color" -msgstr "" +#: src/libslic3r/PrintObject.cpp:421 +msgid "Generating support material" +msgstr "Створення підтримок" -#: src/libslic3r/GCode/PreviewData.cpp:495 -#, c-format -msgid "up to %.2f mm" -msgstr "" +#~ msgid "About Slic3r" +#~ msgstr "Про Slic3r" -#: src/libslic3r/GCode/PreviewData.cpp:499 -#, c-format -msgid "above %.2f mm" -msgstr "" +#~ msgid "Choose a file to import bed shape from (STL/OBJ/AMF/3MF/PRUSA):" +#~ msgstr "Виберіть файл, щоб імпортувати форму полотна з (STL/OBJ/AMF/PRUSA):" -#: src/libslic3r/GCode/PreviewData.cpp:504 -#, c-format -msgid "%.2f - %.2f mm" -msgstr "" +#~ msgid "Error! " +#~ msgstr "Помилка! " + +#~ msgid "slic3r version" +#~ msgstr "версія slic3r" + +#~ msgid "min slic3r version" +#~ msgstr "мінімальна версія slic3r" + +#~ msgid "max slic3r version" +#~ msgstr "максимальна версія slic3r" + +#~ msgid "Welcome to the Slic3r %s" +#~ msgstr "Ласкаво просимо до Slic3r %s" + +#~ msgid "Cut object:" +#~ msgstr "Розрізати об'єкт:" + +#~ msgid "Left mouse click - add point" +#~ msgstr "Ліва кнопка миші - додати точку" + +#~ msgid "Right mouse click - remove point" +#~ msgstr "Права кнопка миші - видалити точку" + +#~ msgid "SLA Support Points [L]" +#~ msgstr "Точки SLA підтримки [L]" + +#~ msgid "Array of language names and identifiers should have the same size." +#~ msgstr "Масив імен мов та їх ідентифікаторів має бути однакового розміру." + +#~ msgid "Slic3r View Mode" +#~ msgstr "Режим перегляду Slic3r'у" + +#~ msgid "Change Application &Language" +#~ msgstr "Змінити &мову застосування" + +#~ msgid "Application will be restarted after language change." +#~ msgstr "Застосування буде перезапущене після зміни мови." + +#~ msgid "You have unsaved changes " +#~ msgstr "У вас є незбережені зміни " + +#~ msgid ". Discard changes and continue anyway?" +#~ msgstr ". Відхилити зміни і продовжити в будь-якому випадку?" + +#~ msgid "Unsaved Presets" +#~ msgstr "Незбереженні налаштування" + +#~ msgid "Unretractions" +#~ msgstr "Непереривання" + +#~ msgid "Delete All" +#~ msgstr "Видалити все" + +#~ msgid "" +#~ " - Remember to check for updates at http://github.com/prusa3d/slic3r/" +#~ "releases" +#~ msgstr "" +#~ " - Пам'ятайте оновлювати з http://github.com/prusa3d/slic3r/releases" + +#~ msgid "Quit Slic3r" +#~ msgstr "Вийти зі Slic3r" + +#~ msgid "Open the Prusa Edition releases page in your browser" +#~ msgstr "Відкрити сторінку релізів Prusa Edition у своєму браузері" + +#~ msgid "Slic3r &Website" +#~ msgstr "Веб-сайт Slic3r" + +#~ msgid "Open the Slic3r website in your browser" +#~ msgstr "Відкрити сторінку Slic3r у своєму браузері" + +#~ msgid "Slic3r &Manual" +#~ msgstr "Посібник до Slic3r" + +#~ msgid "Open the Slic3r manual in your browser" +#~ msgstr "Відкрити сторінку посібнику до Slic3r у своєму браузері" + +#~ msgid "Report an issue on the Slic3r Prusa Edition" +#~ msgstr "Повідомити про проблему на Slic3r Prusa Edition" + +#~ msgid "&About Slic3r" +#~ msgstr "&Про Slic3r" + +#~ msgid "Save " +#~ msgstr "Зберегти " + +#~ msgid " file as:" +#~ msgstr " файл як:" + +#~ msgid "Processing " +#~ msgstr "Обробка " + +#~ msgid " was successfully sliced." +#~ msgstr " був успішно нарізаний." + +#~ msgid "" +#~ "This file contains several objects positioned at multiple heights. " +#~ "Instead of considering them as multiple objects, should I consider\n" +#~ "this file as a single object having multiple parts?\n" +#~ msgstr "" +#~ "Цей файл містить кілька об'єктів, розташованих на декількох висотах. " +#~ "Замість того, щоб розглядати їх як кілька об'єктів, чи потрібно " +#~ "розглянути\n" +#~ "цей файл як єдиний об'єкт, що має декілька частин?\n" + +#~ msgid "" +#~ "Multiple objects were loaded for a multi-material printer.\n" +#~ "Instead of considering them as multiple objects, should I consider\n" +#~ "these files to represent a single object having multiple parts?\n" +#~ msgstr "" +#~ "До мульти-матеріального принтеру завантажено кілька об'єктів.\n" +#~ "Замість того, щоб розглядати їх як кілька об'єктів, чи потрібно " +#~ "розглянути\n" +#~ "ці файл як єдиний об'єкт, що має декілька частин?\n" + +#~ msgid "Export failed" +#~ msgstr "Експортувати не вдалося" + +#~ msgid "Increase copies" +#~ msgstr "Збільшити копії" + +#~ msgid "Place one more copy of the selected object" +#~ msgstr "Розташувати ще одну копію обраного об'єкта" + +#~ msgid "Decrease copies" +#~ msgstr "Зменшити копії" + +#~ msgid "Remove one copy of the selected object" +#~ msgstr "Вилучіть одну копію обраного об'єкта" + +#~ msgid "Change the number of copies of the selected object" +#~ msgstr "Змінити кількість копій обраного об'єкта" + +#~ msgid "Reload from Disk" +#~ msgstr "Перезавантажити з диска" + +#~ msgid "Reload the selected file from Disk" +#~ msgstr "Перезавантажити вибраний файл із диска" + +#~ msgid "Use legacy OpenGL 1.1 rendering" +#~ msgstr "Використовувати застарілий OpenGL 1.1 рендеринг" + +#~ msgid "" +#~ "If you have rendering issues caused by a buggy OpenGL 2.0 driver, you may " +#~ "try to check this checkbox. This will disable the layer height editing " +#~ "and anti aliasing, so it is likely better to upgrade your graphics driver." +#~ msgstr "" +#~ "Якщо у вас виникають проблеми з візуалізацією, спричинені помилковим " +#~ "драйвером OpenGL 2.0, спробуйте вибрати цю опцію. Це призведе до " +#~ "вимкнення редагування висоти шару та згладжування, тому краще оновити " +#~ "графічний драйвер." + +#~ msgid "You need to restart Slic3r to make the changes effective." +#~ msgstr "З метою ефективності зміни, Вам потрібно буде перезапустити Slic3r." + +#~ msgid "" +#~ "If estimated layer time is below ~%ds, fan will run at %d%% and print " +#~ "speed will be reduced so that no less than %ds are spent on that layer " +#~ "(however, speed will never be reduced below %dmm/s)." +#~ msgstr "" +#~ "Якщо запланований час друку шару нижче ~%dс, вентилятор буде працювати на" +#~ "%d%%, і швидкість друку буде зменшена, так що на цей шар витрачається не " +#~ "менше %dс (однак швидкість ніколи не зменшиться нижче %d mm/s) ." + +#~ msgid "" +#~ "\n" +#~ "If estimated layer time is greater, but still below ~%ds, fan will run at " +#~ "a proportionally decreasing speed between %d%% and %d%%." +#~ msgstr "" +#~ "\n" +#~ "Якщо запланований час друку шару більше, але все ще нижче ~%dс, " +#~ "вентилятор буде працювати з пропорційно зменшуваною швидкістю між %d%% та " +#~ "%d%%." + +#~ msgid "" +#~ "\n" +#~ "During the other layers, fan " +#~ msgstr "" +#~ "\n" +#~ "Під час друку інших шарів вентилятор " + +#~ msgid "Fan " +#~ msgstr "Вентилятор " + +#~ msgid "will always run at %d%% " +#~ msgstr "буде завжди працювати на %d%% " + +#~ msgid "except for the first %d layers" +#~ msgstr "за винятком перших %d шарів" + +#~ msgid "except for the first layer" +#~ msgstr "за винятком першого шару" + +#~ msgid "will be turned off." +#~ msgstr "буде вимкнено." + +#~ msgid " flow rate is maximized " +#~ msgstr " швидкість потоку максимізується " + +#~ msgid "when printing " +#~ msgstr "коли друкуємо " + +#~ msgid " with a volumetric rate " +#~ msgstr " з об'ємною швидкістю " + +#~ msgid "%3.2f mm³/s" +#~ msgstr "%3.2f мм³/с" + +#~ msgid " at filament speed %3.2f mm/s." +#~ msgstr " при швидкості філаменту %3.2f мм/с." + +#~ msgid "Recommended object thin wall thickness for layer height %.2f and " +#~ msgstr "Рекомендована товщина стінки для висоти шару %.2f та " + +#~ msgid "%d lines: %.2lf mm" +#~ msgstr "%d рядків: %.2lf мм" + +#~ msgid "Save current " +#~ msgstr "Зберегти поточний " + +#~ msgid "Extruder clearance (mm)" +#~ msgstr "Розмір екструдера (мм)" + +#~ msgid "" +#~ "The Spiral Vase mode requires:\n" +#~ "- one perimeter\n" +#~ "- no top solid layers\n" +#~ "- 0% fill density\n" +#~ "- no support material\n" +#~ "- no ensure_vertical_shell_thickness\n" +#~ "\n" +#~ "Shall I adjust those settings in order to enable Spiral Vase?" +#~ msgstr "" +#~ "Режим спіральної вази вимагає:\n" +#~ "- один периметр\n" +#~ "- немає верхніх щільних шарів\n" +#~ "- 0% щільність заповнення\n" +#~ "- немає підтримуючого матеріалу\n" +#~ "- не забезпечує товщини вертикальної оболонки\n" +#~ "\n" +#~ "Чи потрібно змінити ці налаштування, щоб увімкнути режим Спіральної вази?" + +#~ msgid "" +#~ "The Wipe Tower currently supports the non-soluble supports only\n" +#~ "if they are printed with the current extruder without triggering a tool " +#~ "change.\n" +#~ "(both support_material_extruder and support_material_interface_extruder " +#~ "need to be set to 0).\n" +#~ "\n" +#~ "Shall I adjust those settings in order to enable the Wipe Tower?" +#~ msgstr "" +#~ "Вичіщуюча веж в даний час підтримує лише нерозчинну підтримку\n" +#~ "якщо вони друкуються з поточним екструдером, не запускаючи зміну " +#~ "інструменту.\n" +#~ "(обидва значення support_material_extruder і " +#~ "support_material_interface_extruder повинні бути встановлені на 0).\n" +#~ "\n" +#~ "Чи потрібно коригувати ці налаштування, щоб увімкнути вичіщуючу веж?" + +#~ msgid "" +#~ "For the Wipe Tower to work with the soluble supports, the support layers\n" +#~ "need to be synchronized with the object layers.\n" +#~ "\n" +#~ "Shall I synchronize support layers in order to enable the Wipe Tower?" +#~ msgstr "" +#~ "Для того, щоб Вичіщуюча веж працювала з розчинними підтримками, шари " +#~ "підтримки\n" +#~ "повинні бути синхронізовані з шаром об'єкта.\n" +#~ "\n" +#~ "Чи потрібно синхронізувати шари підтримки, щоб увімкнути вичіщуючу веж?" + +#~ msgid "" +#~ "Supports work better, if the following feature is enabled:\n" +#~ "- Detect bridging perimeters\n" +#~ "\n" +#~ "Shall I adjust those settings for supports?" +#~ msgstr "" +#~ "Підтримка працює краще, якщо ввімкнено таку функцію:\n" +#~ "- Виявлення висячих периметрів(перемичок)\n" +#~ "\n" +#~ "Чи потрібно змінити ці налаштування для підтримки?" + +#~ msgid "The " +#~ msgstr "Шаблон наповнення " + +#~ msgid "" +#~ " infill pattern is not supposed to work at 100%% density.\n" +#~ "\n" +#~ "Shall I switch to rectilinear fill pattern?" +#~ msgstr "" +#~ " не підтримується на 100% щільності.\n" +#~ "\n" +#~ "Чи потрібно змінити його на Rectilinear шаблон заповнення?" + +#~ msgid "Temperature " +#~ msgstr "Температура " + +#~ msgid " Browse " +#~ msgstr " Переглянути " + +#~ msgid " Set " +#~ msgstr " Встановити " + +#~ msgid "USB/Serial connection" +#~ msgstr "USB/послідовне з'єднання" + +#~ msgid "Serial port" +#~ msgstr "Послідовний порт" + +#~ msgid "Rescan serial ports" +#~ msgstr "Сканувати ще раз послідовні порти" + +#~ msgid "Connection to printer works correctly." +#~ msgstr "Підключення до принтера працює коректно." + +#~ msgid "Connection failed." +#~ msgstr "Підключення не вдалося." + +#~ msgid "Unsaved Changes" +#~ msgstr "Незбережені зміни" + +#~ msgid "Are you sure you want to " +#~ msgstr "Ви впевнені, що хочете " + +#~ msgid " the selected preset?" +#~ msgstr " вибране налаштування?" + +#~ msgid " Preset" +#~ msgstr " Налаштування" + +#~ msgid " as:" +#~ msgstr " як:" + +#~ 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 "" +#~ "Під час друку багатоматеріальних об'єктів ці налаштування змушують slic3r " +#~ "обрізати частини, що перекриваються один одною (друга частина буде " +#~ "обрізана першою, третя - першою та другою, тощо)." + +#~ msgid "" +#~ "This end procedure is inserted at the end of the output file. Note that " +#~ "you can use placeholder variables for all Slic3r settings." +#~ msgstr "" +#~ "Ця кінцева процедура вставляється в кінці вихідного файлу. Зауважте, що " +#~ "ви можете використовувати заповнювачі змінних для всіх параметрів Slic3r." + +#~ msgid "" +#~ "This end procedure is inserted at the end of the output file, before the " +#~ "printer end gcode. Note that you can use placeholder variables for all " +#~ "Slic3r settings. If you have multiple extruders, the gcode is processed " +#~ "in extruder order." +#~ msgstr "" +#~ "Ця кінцева процедура вставляється в кінці вихідного файлу перед кінцевим " +#~ "кодом принтера. Зауважте, що ви можете використовувати заповнювачі " +#~ "змінних для всіх параметрів Slic3r. Якщо у вас є кілька екструдерів, G-" +#~ "code обробляється в порядку екструдерів." + +#~ msgid "mm or % (leave 0 for default)" +#~ msgstr "мм або % (залиште 0 за замовчанням)" + +#~ msgid "mm or % (leave 0 for auto)" +#~ msgstr "мм або % (залиште 0 для автообчислення)" + +#~ msgid "" +#~ "Extruder temperature for first layer. If you want to control temperature " +#~ "manually during print, set this to zero to disable temperature control " +#~ "commands in the output file." +#~ msgstr "" +#~ "Температура екструдеру для першого шару. Якщо ви хочете контролювати " +#~ "температуру вручну під час друку, встановіть 0, щоб вимкнути команди " +#~ "керування температурою у вихідному файлі." + +#~ msgid "" +#~ "Some G/M-code commands, including temperature control and others, are not " +#~ "universal. Set this option to your printer's firmware to get a compatible " +#~ "output. The \"No extrusion\" flavor prevents Slic3r from exporting any " +#~ "extrusion value at all." +#~ msgstr "" +#~ "Деякі команди G/M-коду, включаючи контроль температури тощо, не є " +#~ "універсальними. Установіть цей параметр на прошивку принтера, щоб " +#~ "отримати сумісний вихід. \"Відсутність екструзії\" не дозволяє Slic3r " +#~ "експортувати будь-яке значення екструзії." + +#~ msgid "" +#~ "This is the acceleration your printer will use for perimeters. A high " +#~ "value like 9000 usually gives good results if your hardware is up to the " +#~ "job. Set zero to disable acceleration control for perimeters." +#~ msgstr "" +#~ "Це прискорення, яке ваш принтер використовуватиме для периметрів. Висока " +#~ "значення, таке як 9000, зазвичай дає хороші результати, якщо ваше " +#~ "апаратне забезпечення відповідає завданню. Встановити 0, щоб вимкнути " +#~ "регулятор прискорення для периметрів." + +#~ msgid "USB/serial port for printer connection." +#~ msgstr "USB / послідовний порт для підключення принтера." + +#~ msgid "Serial port speed" +#~ msgstr "Швидкість послідовного порту" + +#~ msgid "Speed (baud) of USB/serial port for printer connection." +#~ msgstr "Швидкість (бод) USB / послідовного порту для підключення принтера." + +#~ msgid "" +#~ "This feature will raise Z gradually while printing a single-walled object " +#~ "in order to remove any visible seam. This option requires a single " +#~ "perimeter, no infill, no top solid layers and no support material. You " +#~ "can still set any number of bottom solid layers as well as skirt/brim " +#~ "loops. It won't work when printing more than an object." +#~ msgstr "" +#~ "Ця функція буде поступово підвищувати Z протягом друку одного-стінного " +#~ "об'єкта для уникнення будь-якого видимого шву. Цей параметр вимагає " +#~ "одношарового периметру, відсутнє наповнення, відсутність верхніх " +#~ "суцільних шарів і відсутність матеріалу підтримки. Ви все ще можете " +#~ "встановити будь-яку кількість нижніх суцільних шарів, а також петель " +#~ "плінтусу/краю. Це не спрацює при друку більше, ніж одного об'єкта." + +#~ msgid "" +#~ "This start procedure is inserted at the beginning, after bed has reached " +#~ "the target temperature and extruder just started heating, and before " +#~ "extruder has finished heating. If Slic3r detects M104 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 Slic3r settings, so " +#~ "you can put a \"M109 S[first_layer_temperature]\" command wherever you " +#~ "want." +#~ msgstr "" +#~ "Ця початкова процедура вставляється на початку, після того, як полотно " +#~ "досягне цільової температури, а екструдер тільки починає нагріватися, і " +#~ "перед тим, як екструдер закінчить нагрівання. Якщо Slic3r виявляє M104 " +#~ "або M190 у ваших користувацьких кодах, такі команди не будуть додаватися " +#~ "автоматично, щоб ви могли вільно налаштовувати порядок команд нагріву та " +#~ "інших спеціальних дій. Зверніть увагу, що ви можете використовувати " +#~ "змінні-заповнювачі для всіх параметрів Slic3r, щоб ви могли поставити " +#~ "команду \"M109 S [first_layer_temperature]\" де завгодно." + +#~ msgid "" +#~ "This start procedure is inserted at the beginning, after any printer " +#~ "start gcode. This is used to override settings for a specific filament. " +#~ "If Slic3r 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 Slic3r 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 "" +#~ "Ця початкова процедура вставляється на початку, після того, як будь-який " +#~ "принтер запускає G-code. Це використовується для перевизначення " +#~ "параметрів для певної нитки. Якщо Slic3r виявляє M104, M109, M140 або " +#~ "M190 у ваших користувацьких кодах, такі команди не будуть автоматично " +#~ "додаватися, тому ви можете налаштувати порядок команд нагріву та інших " +#~ "спеціальних дій. Зверніть увагу, що ви можете використовувати змінні-" +#~ "заповнювачі для всіх параметрів Slic3r, щоб ви могли поставити команду " +#~ "\"M109 S [first_layer_temperature]\" де завгодно. Якщо у вас є кілька " +#~ "екструдерів, G-code обробляється в порядку екструдерів." + +#~ msgid "soluble" +#~ msgstr "розчинний" + +#~ msgid "detachable" +#~ msgstr "відривний" + +#~ msgid "" +#~ "Extruder temperature for layers after the first one. Set this to zero to " +#~ "disable temperature control commands in the output." +#~ msgstr "" +#~ "Температура екструдеру для шарів після першого. Установіть 0, щоб " +#~ "вимкнути команди керування температурою на виході." + +#~ msgid "" +#~ "This custom code is inserted right before every extruder change. Note " +#~ "that you can use placeholder variables for all Slic3r settings as well as " +#~ "[previous_extruder] and [next_extruder]." +#~ msgstr "" +#~ "Цей спеціальний код вставляється безпосередньо перед кожною зміненою " +#~ "екструдера. Зверніть увагу, що ви можете використовувати змінні-" +#~ "заповнювачі для всіх параметрів Slic3r, а також [previous_extruder] і " +#~ "[next_extruder]." diff --git a/resources/profiles/Anycubic.ini b/resources/profiles/Anycubic.ini index c36f50ec8e7..399495d2302 100644 --- a/resources/profiles/Anycubic.ini +++ b/resources/profiles/Anycubic.ini @@ -20,7 +20,7 @@ variants = 0.4 technology = FFF family = KOSSEL bed_model = AKLP_Bed.stl -bed_texture = AK.png +bed_texture = AK.svg default_materials = Generic PLA @AKOSSEL; Generic PETG @AKOSSEL; Generic ABS @AKOSSEL [printer_model:AK] @@ -29,7 +29,7 @@ variants = 0.4 technology = FFF family = KOSSEL bed_model = AK_Bed.stl -bed_texture = AK.png +bed_texture = AK.svg default_materials = Generic PLA @AKOSSEL; Generic PETG @AKOSSEL; Generic ABS @AKOSSEL [printer_model:MEGA0] diff --git a/resources/profiles/Anycubic/AK.svg b/resources/profiles/Anycubic/AK.svg new file mode 100644 index 00000000000..485e8592b5a --- /dev/null +++ b/resources/profiles/Anycubic/AK.svg @@ -0,0 +1,344 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/profiles/Anycubic/AKLP_Bed.stl b/resources/profiles/Anycubic/AKLP_Bed.stl index 07abce367f7..67734ab3353 100644 Binary files a/resources/profiles/Anycubic/AKLP_Bed.stl and b/resources/profiles/Anycubic/AKLP_Bed.stl differ diff --git a/resources/profiles/Anycubic/AK_Bed.stl b/resources/profiles/Anycubic/AK_Bed.stl index 31daa1150eb..7f8d018787b 100644 Binary files a/resources/profiles/Anycubic/AK_Bed.stl and b/resources/profiles/Anycubic/AK_Bed.stl differ diff --git a/resources/profiles/Creality.idx b/resources/profiles/Creality.idx index a96a348d985..78d67e4ede0 100644 --- a/resources/profiles/Creality.idx +++ b/resources/profiles/Creality.idx @@ -1,4 +1,5 @@ min_slic3r_version = 2.3.0-rc2 +0.0.13 Optimized start and end g-code. General improvements. 0.0.12 Added Ender-3V2 and filament profiles. min_slic3r_version = 2.3.0-beta2 0.0.11 Updated machine limits for Ender 5 and Ender 5 Plus. diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index c983e7b88df..4c78de412a2 100644 --- a/resources/profiles/Creality.ini +++ b/resources/profiles/Creality.ini @@ -5,7 +5,7 @@ name = Creality # Configuration version of this file. Config file will only be installed, if the config_version differs. # This means, the server may force the PrusaSlicer configuration to be downgraded. -config_version = 0.0.12 +config_version = 0.0.13 # Where to get the updates from? config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Creality/ # changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1% @@ -21,16 +21,16 @@ technology = FFF family = ENDER bed_model = ender3_bed.stl bed_texture = ender3.svg -default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY [printer_model:ENDER3V2] -name = Creality Ender-3V2 +name = Creality Ender-3 V2 variants = 0.4 technology = FFF family = ENDER bed_model = ender3_bed.stl bed_texture = ender3.svg -default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY [printer_model:ENDER3BLTOUCH] name = Creality Ender-3 BLTouch @@ -39,7 +39,7 @@ technology = FFF family = ENDER bed_model = ender3_bed.stl bed_texture = ender3.svg -default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY [printer_model:ENDER5] name = Creality Ender-5 @@ -48,7 +48,7 @@ technology = FFF family = ENDER bed_model = ender3_bed.stl bed_texture = ender3.svg -default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY [printer_model:ENDER5PLUS] name = Creality Ender-5 Plus @@ -57,7 +57,7 @@ technology = FFF family = ENDER bed_model = ender5plus_bed.stl bed_texture = ender5plus.svg -default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY [printer_model:ENDER2] name = Creality Ender-2 @@ -66,7 +66,16 @@ technology = FFF family = ENDER bed_model = ender2_bed.stl bed_texture = ender2.svg -default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY + +#[printer_model:CR6SE] +#name = Creality CR-6 SE +#variants = 0.4 +#technology = FFF +#family = CR +#bed_model = cr6se_bed.stl +#bed_texture = cr6se.svg +#default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY [printer_model:CR10MINI] name = Creality CR-10 Mini @@ -75,7 +84,7 @@ technology = FFF family = CR bed_model = cr10mini_bed.stl bed_texture = cr10mini.svg -default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY [printer_model:CR10] name = Creality CR-10 @@ -84,7 +93,7 @@ technology = FFF family = CR bed_model = cr10_bed.stl bed_texture = cr10.svg -default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY [printer_model:CR10V2] name = Creality CR-10 V2 @@ -93,7 +102,7 @@ technology = FFF family = CR bed_model = cr10v2_bed.stl bed_texture = cr10.svg -default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY [printer_model:CR10V3] name = Creality CR-10 V3 @@ -102,7 +111,7 @@ technology = FFF family = CR bed_model = cr10v2_bed.stl bed_texture = cr10.svg -default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY [printer_model:CR10S] name = Creality CR-10 S @@ -111,7 +120,7 @@ technology = FFF family = CR bed_model = cr10_bed.stl bed_texture = cr10.svg -default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY [printer_model:CR10SPRO] name = Creality CR-10 S Pro @@ -120,7 +129,7 @@ technology = FFF family = CR bed_model = cr10v2_bed.stl bed_texture = cr10.svg -default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY [printer_model:CR10SPROV2] name = Creality CR-10 S Pro V2 @@ -129,7 +138,7 @@ technology = FFF family = CR bed_model = cr10v2_bed.stl bed_texture = cr10.svg -default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY [printer_model:CR10S4] name = Creality CR-10 S4 @@ -138,7 +147,7 @@ technology = FFF family = CR bed_model = cr10s4_bed.stl bed_texture = cr10s4.svg -default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY [printer_model:CR10S5] name = Creality CR-10 S5 @@ -147,7 +156,7 @@ technology = FFF family = CR bed_model = cr10s5_bed.stl bed_texture = cr10s5.svg -default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY [printer_model:CR20] name = Creality CR-20 @@ -156,7 +165,7 @@ technology = FFF family = CR bed_model = ender3_bed.stl bed_texture = cr20.svg -default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY [printer_model:CR20PRO] name = Creality CR-20 Pro @@ -165,7 +174,7 @@ technology = FFF family = CR bed_model = ender3_bed.stl bed_texture = cr20.svg -default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA (Galaxy) @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 123-3D Jupiter PLA @CREALITY # All presets starting with asterisk, for example *common*, are intermediate and they will # not make it into the user interface. @@ -349,7 +358,14 @@ compatible_printers_condition = printer_model=~/(ENDER|CR).*/ and nozzle_diamete inherits = *0.28mm* compatible_printers_condition = printer_model=~/(ENDER|CR).*/ and nozzle_diameter[0]==0.4 -# Common filament preset +# When submitting new filaments please print the following temperature tower at 0.1mm layer height: +# https://www.thingiverse.com/thing:2615842 +# Pay particular attention to bridging, overhangs and retractions. +# Also print the following bed adhesion test at 0.1 layer height as well: +# https://www.prusaprinters.org/prints/4634-bed-adhesion-warp-test +# At least for PLA, please keep bed temp at 60, as many Creality printers do not have any ABL +# So having some leeway to get good bed adhesion is not a luxury for many users + [filament:*common*] cooling = 0 compatible_printers = @@ -588,10 +604,10 @@ filament_colour = #FFE200 [filament:Das Filament PLA @CREALITY] inherits = *PLA* filament_vendor = Das Filament -temperature = 215 -bed_temperature = 50 +temperature = 210 +bed_temperature = 60 first_layer_temperature = 215 -first_layer_bed_temperature = 50 +first_layer_bed_temperature = 60 filament_cost = 20.56 filament_density = 1.24 @@ -695,21 +711,24 @@ retract_length = 5 retract_speed = 60 deretract_speed = 40 retract_before_wipe = 70% -start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 ; home all\nG1 Z2 F240\nG1 X2 Y10 F3000\nG1 Z0.28 F240\nG92 E0\nG1 Y190 E15 F1500 ; intro line\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E15 F1200 ; intro line\nG92 E0 -end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600{endif} ; Move print head up\nG1 X5 Y170 F{travel_speed*60} ; present print\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+min(max_layer_z+70, max_print_height-10)} F600{endif} ; Move print head further up\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors +start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set extruder temp for auto bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nG4 S10 ; wait for partial warmup\nG28 ; home all\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set extruder temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; intro line\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; intro line\nG92 E0 +end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600 ; Move print head up{endif}\nG1 X5 Y{print_bed_max[1]*0.8} F{travel_speed*60} ; present print\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+min(max_layer_z+70, max_print_height-10)} F600 ; Move print head further up{endif}\n{if max_layer_z < max_print_height*0.6}G1 Z{max_print_height*0.6} F600 ; Move print head further up{endif}\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors -[printer:Creality Ender-3V2] +[printer:Creality Ender-3 V2] inherits = Creality Ender-3 +renamed_from = "Creality Ender-3V2" printer_model = ENDER3V2 -printer_variant = 0.4 bed_shape = 0x0,220x0,220x220,0x220 +# Intended for printers with a smaller bed, like the Ender-3 series [printer:*fastabl*] -start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S150 ; set extruder temp for auto bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nG28 ; home all\nG29 ; auto bed levelling\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set extruder temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG1 Z0.28 F240\nG92 E0\nG1 Y190 E15 F1500 ; intro line\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E15 F1200 ; intro line\nG92 E0 +start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set extruder temp for auto bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nG4 S10 ; wait for partial warmup\nG28 ; home all\nG29 ; auto bed levelling\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set extruder temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; intro line\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; intro line\nG92 E0 +# Intended for printers with a larger bed, like the CR-10 series [printer:*slowabl*] -start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S150 ; set extruder temp for auto bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nG28 ; home all\nG29 ; auto bed levelling\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set extruder temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG1 Z0.28 F240\nG92 E0\nG1 Y190 E15 F1500 ; intro line\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E15 F1200 ; intro line\nG92 E0 +start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set extruder temp for auto bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nG28 ; home all\nG29 ; auto bed levelling\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set extruder temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; intro line\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; intro line\nG92 E0 +# Intended for printers where the Z-axis lowers the print bed during printing, like the Ender-5 series [printer:*invertedz*] end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600{endif} ; Move print bed down\nG1 X50 Y50 F{travel_speed*60} ; present print\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+max_print_height-10} F600{endif} ; Move print bed down further down\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors @@ -747,8 +766,12 @@ bed_shape = 0x0,150x0,150x150,0x150 printer_model = ENDER2 printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER2\nPRINTER_HAS_BOWDEN max_print_height = 200 -start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 ; home all\nG1 Z2 F240\nG1 X2 Y10 F3000\nG1 Z0.28 F240\nG92 E0\nG1 X15 Y135 E15 F1500 ; intro line\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E15 F1200 ; intro line\nG92 E0 -end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600{endif} ; Move print head up\nG1 X5 Y140 F{travel_speed*60} ; present print\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+min(max_layer_z+30, max_print_height-10)} F600{endif} ; Move print head further up\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors + +#[printer:Creality CR-6 SE] +#inherits = Creality Ender-3; *fastabl* +#bed_shape = 5x0,230x0,230x235,5x235 +#printer_model = CR6SE +#printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_CR6SE\nPRINTER_HAS_BOWDEN [printer:Creality CR-10 Mini] inherits = Creality Ender-3 diff --git a/resources/profiles/Creality/CR6SE_thumbnail.png b/resources/profiles/Creality/CR6SE_thumbnail.png new file mode 100644 index 00000000000..9dd9d3324ff Binary files /dev/null and b/resources/profiles/Creality/CR6SE_thumbnail.png differ diff --git a/resources/profiles/Creality/cr6se.svg b/resources/profiles/Creality/cr6se.svg new file mode 100644 index 00000000000..d9eb920bc39 --- /dev/null +++ b/resources/profiles/Creality/cr6se.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/profiles/Creality/cr6se_bed.stl b/resources/profiles/Creality/cr6se_bed.stl new file mode 100644 index 00000000000..31bf786ed2f --- /dev/null +++ b/resources/profiles/Creality/cr6se_bed.stl @@ -0,0 +1,2774 @@ +solid OpenSCAD_Model + facet normal 0 0 -1 + outer loop + vertex 119.605 -127.498 -3 + vertex 119.502 -127.498 -3 + vertex 119.814 -127.484 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 119.814 -127.484 -3 + vertex 119.502 -127.498 -3 + vertex 120.021 -127.454 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex 119.502 127.498 -3 + vertex -122.5 124.5 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 120.021 -127.454 -3 + vertex 119.502 -127.498 -3 + vertex 120.226 -127.411 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 120.226 -127.411 -3 + vertex 119.502 -127.498 -3 + vertex 120.427 -127.353 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 120.427 -127.353 -3 + vertex 119.502 -127.498 -3 + vertex 120.624 -127.282 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 120.624 -127.282 -3 + vertex 119.502 -127.498 -3 + vertex 120.815 -127.196 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 120.815 -127.196 -3 + vertex 119.502 -127.498 -3 + vertex 121 -127.098 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 121 -127.098 -3 + vertex 119.502 -127.498 -3 + vertex 121.178 -126.987 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 121.178 -126.987 -3 + vertex 119.502 -127.498 -3 + vertex 121.347 -126.864 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 121.347 -126.864 -3 + vertex 119.502 -127.498 -3 + vertex 121.507 -126.729 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 121.507 -126.729 -3 + vertex 119.502 -127.498 -3 + vertex 121.658 -126.584 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 121.658 -126.584 -3 + vertex 119.502 -127.498 -3 + vertex 121.798 -126.428 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 121.798 -126.428 -3 + vertex 119.502 -127.498 -3 + vertex 121.927 -126.263 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 121.927 -126.263 -3 + vertex 119.502 -127.498 -3 + vertex 122.044 -126.09 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 122.044 -126.09 -3 + vertex 119.502 -127.498 -3 + vertex 122.149 -125.908 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 122.149 -125.908 -3 + vertex 119.502 -127.498 -3 + vertex 122.241 -125.72 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 122.241 -125.72 -3 + vertex 119.502 -127.498 -3 + vertex 122.319 -125.526 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 122.319 -125.526 -3 + vertex 119.502 -127.498 -3 + vertex 122.384 -125.327 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 122.384 -125.327 -3 + vertex 119.502 -127.498 -3 + vertex 122.434 -125.124 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 122.434 -125.124 -3 + vertex 119.502 -127.498 -3 + vertex 122.471 -124.918 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 122.471 -124.918 -3 + vertex 119.502 -127.498 -3 + vertex 122.493 -124.709 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 122.493 -124.709 -3 + vertex 119.502 -127.498 -3 + vertex 122.5 -124.5 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex 119.5 127.5 -3 + vertex 119.502 127.498 -3 + vertex -119.502 127.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 119.502 127.498 -3 + vertex 122.471 124.918 -3 + vertex 122.493 124.709 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 122.384 125.327 -3 + vertex 122.434 125.124 -3 + vertex 119.502 127.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 122.241 125.72 -3 + vertex 119.502 127.498 -3 + vertex 122.149 125.908 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 122.241 125.72 -3 + vertex 122.319 125.526 -3 + vertex 119.502 127.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 119.502 127.498 -3 + vertex 121.507 126.729 -3 + vertex 121.658 126.584 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 121.927 126.263 -3 + vertex 119.502 127.498 -3 + vertex 121.798 126.428 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 121.927 126.263 -3 + vertex 122.044 126.09 -3 + vertex 119.502 127.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 121.798 126.428 -3 + vertex 119.502 127.498 -3 + vertex 121.658 126.584 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 119.502 127.498 -3 + vertex 120.427 127.353 -3 + vertex 120.624 127.282 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 121.347 126.864 -3 + vertex 119.502 127.498 -3 + vertex 121.178 126.987 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 121.347 126.864 -3 + vertex 121.507 126.729 -3 + vertex 119.502 127.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 121.178 126.987 -3 + vertex 119.502 127.498 -3 + vertex 121 127.098 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 121 127.098 -3 + vertex 119.502 127.498 -3 + vertex 120.815 127.196 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 120.815 127.196 -3 + vertex 119.502 127.498 -3 + vertex 120.624 127.282 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 122.149 125.908 -3 + vertex 119.502 127.498 -3 + vertex 122.044 126.09 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 120.226 127.411 -3 + vertex 119.502 127.498 -3 + vertex 120.021 127.454 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 120.226 127.411 -3 + vertex 120.427 127.353 -3 + vertex 119.502 127.498 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 122.319 125.526 -3 + vertex 122.384 125.327 -3 + vertex 119.502 127.498 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 119.814 127.484 -3 + vertex 120.021 127.454 -3 + vertex 119.502 127.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 119.502 127.498 -3 + vertex 122.434 125.124 -3 + vertex 122.471 124.918 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 119.502 127.498 -3 + vertex 119.605 127.498 -3 + vertex 119.814 127.484 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 122.5 124.5 -3 + vertex 119.502 127.498 -3 + vertex 122.493 124.709 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex -119.5 127.5 -3 + vertex 119.5 127.5 -3 + vertex -119.502 127.498 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex 119.502 127.498 -3 + vertex 122.5 124.5 -3 + vertex -122.5 124.5 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex -122.493 124.709 -3 + vertex -119.502 127.498 -3 + vertex -122.5 124.5 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -122.5 124.5 -3 + vertex 122.5 124.5 -3 + vertex 122.5 -124.5 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -119.814 127.484 -3 + vertex -119.605 127.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -120.021 127.454 -3 + vertex -119.814 127.484 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -120.226 127.411 -3 + vertex -120.021 127.454 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -120.427 127.353 -3 + vertex -120.226 127.411 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -120.624 127.282 -3 + vertex -120.427 127.353 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -120.815 127.196 -3 + vertex -120.624 127.282 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -121 127.098 -3 + vertex -120.815 127.196 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -121.178 126.987 -3 + vertex -121 127.098 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -121.347 126.864 -3 + vertex -121.178 126.987 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -121.507 126.729 -3 + vertex -121.347 126.864 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -121.658 126.584 -3 + vertex -121.507 126.729 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -121.798 126.428 -3 + vertex -121.658 126.584 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -121.927 126.263 -3 + vertex -121.798 126.428 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -122.044 126.09 -3 + vertex -121.927 126.263 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -122.149 125.908 -3 + vertex -122.044 126.09 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -122.241 125.72 -3 + vertex -122.149 125.908 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -122.319 125.526 -3 + vertex -122.241 125.72 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -122.384 125.327 -3 + vertex -122.319 125.526 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -122.434 125.124 -3 + vertex -122.384 125.327 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -122.471 124.918 -3 + vertex -122.434 125.124 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 127.498 -3 + vertex -122.493 124.709 -3 + vertex -122.471 124.918 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -122.5 -124.5 -3 + vertex -122.5 124.5 -3 + vertex 122.5 -124.5 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 119.502 -127.498 -3 + vertex -122.5 -124.5 -3 + vertex 122.5 -124.5 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 119.502 -127.498 -3 + vertex -119.502 -127.498 -3 + vertex -122.5 -124.5 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 -127.498 -3 + vertex -122.471 -124.918 -3 + vertex -122.493 -124.709 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -122.384 -125.327 -3 + vertex -122.434 -125.124 -3 + vertex -119.502 -127.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -122.241 -125.72 -3 + vertex -119.502 -127.498 -3 + vertex -122.149 -125.908 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -122.241 -125.72 -3 + vertex -122.319 -125.526 -3 + vertex -119.502 -127.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 -127.498 -3 + vertex -121.507 -126.729 -3 + vertex -121.658 -126.584 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -121.927 -126.263 -3 + vertex -119.502 -127.498 -3 + vertex -121.798 -126.428 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -121.927 -126.263 -3 + vertex -122.044 -126.09 -3 + vertex -119.502 -127.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -121.798 -126.428 -3 + vertex -119.502 -127.498 -3 + vertex -121.658 -126.584 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 -127.498 -3 + vertex -120.427 -127.353 -3 + vertex -120.624 -127.282 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -121.347 -126.864 -3 + vertex -119.502 -127.498 -3 + vertex -121.178 -126.987 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -121.347 -126.864 -3 + vertex -121.507 -126.729 -3 + vertex -119.502 -127.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -121.178 -126.987 -3 + vertex -119.502 -127.498 -3 + vertex -121 -127.098 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -121 -127.098 -3 + vertex -119.502 -127.498 -3 + vertex -120.815 -127.196 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -120.815 -127.196 -3 + vertex -119.502 -127.498 -3 + vertex -120.624 -127.282 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -122.149 -125.908 -3 + vertex -119.502 -127.498 -3 + vertex -122.044 -126.09 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -120.226 -127.411 -3 + vertex -119.502 -127.498 -3 + vertex -120.021 -127.454 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -120.226 -127.411 -3 + vertex -120.427 -127.353 -3 + vertex -119.502 -127.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -122.319 -125.526 -3 + vertex -122.384 -125.327 -3 + vertex -119.502 -127.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.814 -127.484 -3 + vertex -120.021 -127.454 -3 + vertex -119.502 -127.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 -127.498 -3 + vertex -122.434 -125.124 -3 + vertex -122.471 -124.918 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 -127.498 -3 + vertex -119.605 -127.498 -3 + vertex -119.814 -127.484 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 119.502 -127.498 -3 + vertex 119.5 -127.5 -3 + vertex -119.502 -127.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.502 -127.498 -3 + vertex 119.5 -127.5 -3 + vertex -119.5 -127.5 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -122.5 -124.5 -3 + vertex -119.502 -127.498 -3 + vertex -122.493 -124.709 -3 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 119.814 -127.484 0 + vertex 119.502 -127.498 0 + vertex 119.605 -127.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 120.021 -127.454 0 + vertex 119.502 -127.498 0 + vertex 119.814 -127.484 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -122.5 124.5 0 + vertex 119.502 127.498 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 120.226 -127.411 0 + vertex 119.502 -127.498 0 + vertex 120.021 -127.454 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 120.427 -127.353 0 + vertex 119.502 -127.498 0 + vertex 120.226 -127.411 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 120.624 -127.282 0 + vertex 119.502 -127.498 0 + vertex 120.427 -127.353 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 120.815 -127.196 0 + vertex 119.502 -127.498 0 + vertex 120.624 -127.282 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 121 -127.098 0 + vertex 119.502 -127.498 0 + vertex 120.815 -127.196 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 121.178 -126.987 0 + vertex 119.502 -127.498 0 + vertex 121 -127.098 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 121.347 -126.864 0 + vertex 119.502 -127.498 0 + vertex 121.178 -126.987 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 121.507 -126.729 0 + vertex 119.502 -127.498 0 + vertex 121.347 -126.864 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 121.658 -126.584 0 + vertex 119.502 -127.498 0 + vertex 121.507 -126.729 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 121.798 -126.428 0 + vertex 119.502 -127.498 0 + vertex 121.658 -126.584 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 121.927 -126.263 0 + vertex 119.502 -127.498 0 + vertex 121.798 -126.428 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 122.044 -126.09 0 + vertex 119.502 -127.498 0 + vertex 121.927 -126.263 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 122.149 -125.908 0 + vertex 119.502 -127.498 0 + vertex 122.044 -126.09 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 122.241 -125.72 0 + vertex 119.502 -127.498 0 + vertex 122.149 -125.908 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 122.319 -125.526 0 + vertex 119.502 -127.498 0 + vertex 122.241 -125.72 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 122.384 -125.327 0 + vertex 119.502 -127.498 0 + vertex 122.319 -125.526 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 122.434 -125.124 0 + vertex 119.502 -127.498 0 + vertex 122.384 -125.327 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 122.471 -124.918 0 + vertex 119.502 -127.498 0 + vertex 122.434 -125.124 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 122.493 -124.709 0 + vertex 119.502 -127.498 0 + vertex 122.471 -124.918 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 122.5 -124.5 0 + vertex 119.502 -127.498 0 + vertex 122.493 -124.709 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -119.502 127.498 0 + vertex 119.502 127.498 0 + vertex 119.5 127.5 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 122.493 124.709 0 + vertex 122.471 124.918 0 + vertex 119.502 127.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 119.502 127.498 0 + vertex 122.434 125.124 0 + vertex 122.384 125.327 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 122.149 125.908 0 + vertex 119.502 127.498 0 + vertex 122.241 125.72 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 119.502 127.498 0 + vertex 122.319 125.526 0 + vertex 122.241 125.72 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 121.658 126.584 0 + vertex 121.507 126.729 0 + vertex 119.502 127.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 121.798 126.428 0 + vertex 119.502 127.498 0 + vertex 121.927 126.263 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 119.502 127.498 0 + vertex 122.044 126.09 0 + vertex 121.927 126.263 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 121.658 126.584 0 + vertex 119.502 127.498 0 + vertex 121.798 126.428 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 120.624 127.282 0 + vertex 120.427 127.353 0 + vertex 119.502 127.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 121.178 126.987 0 + vertex 119.502 127.498 0 + vertex 121.347 126.864 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 119.502 127.498 0 + vertex 121.507 126.729 0 + vertex 121.347 126.864 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 121 127.098 0 + vertex 119.502 127.498 0 + vertex 121.178 126.987 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 120.815 127.196 0 + vertex 119.502 127.498 0 + vertex 121 127.098 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 120.624 127.282 0 + vertex 119.502 127.498 0 + vertex 120.815 127.196 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 122.044 126.09 0 + vertex 119.502 127.498 0 + vertex 122.149 125.908 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 120.021 127.454 0 + vertex 119.502 127.498 0 + vertex 120.226 127.411 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 119.502 127.498 0 + vertex 120.427 127.353 0 + vertex 120.226 127.411 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 119.502 127.498 0 + vertex 122.384 125.327 0 + vertex 122.319 125.526 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 119.502 127.498 0 + vertex 120.021 127.454 0 + vertex 119.814 127.484 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 122.471 124.918 0 + vertex 122.434 125.124 0 + vertex 119.502 127.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 119.814 127.484 0 + vertex 119.605 127.498 0 + vertex 119.502 127.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 122.493 124.709 0 + vertex 119.502 127.498 0 + vertex 122.5 124.5 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -119.502 127.498 0 + vertex 119.5 127.5 0 + vertex -119.5 127.5 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -122.5 124.5 0 + vertex 122.5 124.5 0 + vertex 119.502 127.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -122.5 124.5 0 + vertex -119.502 127.498 0 + vertex -122.493 124.709 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex 122.5 -124.5 0 + vertex 122.5 124.5 0 + vertex -122.5 124.5 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -119.605 127.498 0 + vertex -119.814 127.484 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -119.814 127.484 0 + vertex -120.021 127.454 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -120.021 127.454 0 + vertex -120.226 127.411 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -120.226 127.411 0 + vertex -120.427 127.353 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -120.427 127.353 0 + vertex -120.624 127.282 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -120.624 127.282 0 + vertex -120.815 127.196 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -120.815 127.196 0 + vertex -121 127.098 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -121 127.098 0 + vertex -121.178 126.987 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -121.178 126.987 0 + vertex -121.347 126.864 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -121.347 126.864 0 + vertex -121.507 126.729 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -121.507 126.729 0 + vertex -121.658 126.584 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -121.658 126.584 0 + vertex -121.798 126.428 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -121.798 126.428 0 + vertex -121.927 126.263 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -121.927 126.263 0 + vertex -122.044 126.09 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -122.044 126.09 0 + vertex -122.149 125.908 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -122.149 125.908 0 + vertex -122.241 125.72 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -122.241 125.72 0 + vertex -122.319 125.526 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -122.319 125.526 0 + vertex -122.384 125.327 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -122.384 125.327 0 + vertex -122.434 125.124 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -122.434 125.124 0 + vertex -122.471 124.918 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -122.471 124.918 0 + vertex -122.493 124.709 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 122.5 -124.5 0 + vertex -122.5 124.5 0 + vertex -122.5 -124.5 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 122.5 -124.5 0 + vertex -122.5 -124.5 0 + vertex 119.502 -127.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -122.5 -124.5 0 + vertex -119.502 -127.498 0 + vertex 119.502 -127.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -122.493 -124.709 0 + vertex -122.471 -124.918 0 + vertex -119.502 -127.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -119.502 -127.498 0 + vertex -122.434 -125.124 0 + vertex -122.384 -125.327 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -122.149 -125.908 0 + vertex -119.502 -127.498 0 + vertex -122.241 -125.72 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -119.502 -127.498 0 + vertex -122.319 -125.526 0 + vertex -122.241 -125.72 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -121.658 -126.584 0 + vertex -121.507 -126.729 0 + vertex -119.502 -127.498 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -121.798 -126.428 0 + vertex -119.502 -127.498 0 + vertex -121.927 -126.263 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -119.502 -127.498 0 + vertex -122.044 -126.09 0 + vertex -121.927 -126.263 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -121.658 -126.584 0 + vertex -119.502 -127.498 0 + vertex -121.798 -126.428 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -120.624 -127.282 0 + vertex -120.427 -127.353 0 + vertex -119.502 -127.498 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -121.178 -126.987 0 + vertex -119.502 -127.498 0 + vertex -121.347 -126.864 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -119.502 -127.498 0 + vertex -121.507 -126.729 0 + vertex -121.347 -126.864 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -121 -127.098 0 + vertex -119.502 -127.498 0 + vertex -121.178 -126.987 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -120.815 -127.196 0 + vertex -119.502 -127.498 0 + vertex -121 -127.098 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -120.624 -127.282 0 + vertex -119.502 -127.498 0 + vertex -120.815 -127.196 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -122.044 -126.09 0 + vertex -119.502 -127.498 0 + vertex -122.149 -125.908 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -120.021 -127.454 0 + vertex -119.502 -127.498 0 + vertex -120.226 -127.411 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -119.502 -127.498 0 + vertex -120.427 -127.353 0 + vertex -120.226 -127.411 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -119.502 -127.498 0 + vertex -122.384 -125.327 0 + vertex -122.319 -125.526 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -119.502 -127.498 0 + vertex -120.021 -127.454 0 + vertex -119.814 -127.484 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -122.471 -124.918 0 + vertex -122.434 -125.124 0 + vertex -119.502 -127.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -119.814 -127.484 0 + vertex -119.605 -127.498 0 + vertex -119.502 -127.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -119.502 -127.498 0 + vertex 119.5 -127.5 0 + vertex 119.502 -127.498 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex -119.5 -127.5 0 + vertex 119.5 -127.5 0 + vertex -119.502 -127.498 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -122.493 -124.709 0 + vertex -119.502 -127.498 0 + vertex -122.5 -124.5 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 119.605 -127.498 -3 + vertex 119.502 -127.498 0 + vertex 119.502 -127.498 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 119.605 -127.498 -3 + vertex 119.605 -127.498 0 + vertex 119.502 -127.498 0 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 119.814 -127.484 -3 + vertex 119.605 -127.498 0 + vertex 119.605 -127.498 -3 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 119.814 -127.484 -3 + vertex 119.814 -127.484 0 + vertex 119.605 -127.498 0 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 120.021 -127.454 -3 + vertex 119.814 -127.484 0 + vertex 119.814 -127.484 -3 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 120.021 -127.454 -3 + vertex 120.021 -127.454 0 + vertex 119.814 -127.484 0 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 120.226 -127.411 -3 + vertex 120.021 -127.454 0 + vertex 120.021 -127.454 -3 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 120.226 -127.411 -3 + vertex 120.226 -127.411 0 + vertex 120.021 -127.454 0 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 120.427 -127.353 -3 + vertex 120.226 -127.411 0 + vertex 120.226 -127.411 -3 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 120.427 -127.353 -3 + vertex 120.427 -127.353 0 + vertex 120.226 -127.411 0 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 120.624 -127.282 -3 + vertex 120.427 -127.353 0 + vertex 120.427 -127.353 -3 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 120.624 -127.282 -3 + vertex 120.624 -127.282 0 + vertex 120.427 -127.353 0 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 120.815 -127.196 -3 + vertex 120.624 -127.282 0 + vertex 120.624 -127.282 -3 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 120.815 -127.196 -3 + vertex 120.815 -127.196 0 + vertex 120.624 -127.282 0 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 121 -127.098 -3 + vertex 120.815 -127.196 0 + vertex 120.815 -127.196 -3 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 121 -127.098 -3 + vertex 121 -127.098 0 + vertex 120.815 -127.196 0 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 121.178 -126.987 -3 + vertex 121 -127.098 0 + vertex 121 -127.098 -3 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 121.178 -126.987 -3 + vertex 121.178 -126.987 0 + vertex 121 -127.098 0 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 121.347 -126.864 -3 + vertex 121.178 -126.987 0 + vertex 121.178 -126.987 -3 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 121.347 -126.864 -3 + vertex 121.347 -126.864 0 + vertex 121.178 -126.987 0 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 121.507 -126.729 -3 + vertex 121.347 -126.864 0 + vertex 121.347 -126.864 -3 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 121.507 -126.729 -3 + vertex 121.507 -126.729 0 + vertex 121.347 -126.864 0 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 121.658 -126.584 -3 + vertex 121.507 -126.729 0 + vertex 121.507 -126.729 -3 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 121.658 -126.584 -3 + vertex 121.658 -126.584 0 + vertex 121.507 -126.729 0 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 121.798 -126.428 -3 + vertex 121.658 -126.584 0 + vertex 121.658 -126.584 -3 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 121.798 -126.428 -3 + vertex 121.798 -126.428 0 + vertex 121.658 -126.584 0 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 121.927 -126.263 -3 + vertex 121.798 -126.428 0 + vertex 121.798 -126.428 -3 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 121.927 -126.263 -3 + vertex 121.927 -126.263 0 + vertex 121.798 -126.428 0 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 122.044 -126.09 -3 + vertex 121.927 -126.263 0 + vertex 121.927 -126.263 -3 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 122.044 -126.09 -3 + vertex 122.044 -126.09 0 + vertex 121.927 -126.263 0 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 122.149 -125.908 -3 + vertex 122.044 -126.09 0 + vertex 122.044 -126.09 -3 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 122.149 -125.908 -3 + vertex 122.149 -125.908 0 + vertex 122.044 -126.09 0 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 122.241 -125.72 -3 + vertex 122.149 -125.908 0 + vertex 122.149 -125.908 -3 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 122.241 -125.72 -3 + vertex 122.241 -125.72 0 + vertex 122.149 -125.908 0 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 122.319 -125.526 -3 + vertex 122.241 -125.72 0 + vertex 122.241 -125.72 -3 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 122.319 -125.526 -3 + vertex 122.319 -125.526 0 + vertex 122.241 -125.72 0 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 122.384 -125.327 -3 + vertex 122.319 -125.526 0 + vertex 122.319 -125.526 -3 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 122.384 -125.327 -3 + vertex 122.384 -125.327 0 + vertex 122.319 -125.526 0 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 122.434 -125.124 -3 + vertex 122.384 -125.327 0 + vertex 122.384 -125.327 -3 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 122.434 -125.124 -3 + vertex 122.434 -125.124 0 + vertex 122.384 -125.327 0 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 122.471 -124.918 -3 + vertex 122.434 -125.124 0 + vertex 122.434 -125.124 -3 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 122.471 -124.918 -3 + vertex 122.471 -124.918 0 + vertex 122.434 -125.124 0 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 122.493 -124.709 -3 + vertex 122.471 -124.918 0 + vertex 122.471 -124.918 -3 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 122.493 -124.709 -3 + vertex 122.493 -124.709 0 + vertex 122.471 -124.918 0 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 122.5 -124.5 -3 + vertex 122.493 -124.709 0 + vertex 122.493 -124.709 -3 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 122.5 -124.5 -3 + vertex 122.5 -124.5 0 + vertex 122.493 -124.709 0 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 122.5 124.5 -3 + vertex 122.5 -124.5 0 + vertex 122.5 -124.5 -3 + endloop + endfacet + facet normal 1 0 -0 + outer loop + vertex 122.5 124.5 -3 + vertex 122.5 124.5 0 + vertex 122.5 -124.5 0 + endloop + endfacet + facet normal 0.99944 0.0334741 0 + outer loop + vertex 122.493 124.709 -3 + vertex 122.5 124.5 0 + vertex 122.5 124.5 -3 + endloop + endfacet + facet normal 0.99944 0.0334741 -0 + outer loop + vertex 122.493 124.709 -3 + vertex 122.493 124.709 0 + vertex 122.5 124.5 0 + endloop + endfacet + facet normal 0.994505 0.104685 0 + outer loop + vertex 122.471 124.918 -3 + vertex 122.493 124.709 0 + vertex 122.493 124.709 -3 + endloop + endfacet + facet normal 0.994505 0.104685 -0 + outer loop + vertex 122.471 124.918 -3 + vertex 122.471 124.918 0 + vertex 122.493 124.709 0 + endloop + endfacet + facet normal 0.98425 0.176783 0 + outer loop + vertex 122.434 125.124 -3 + vertex 122.471 124.918 0 + vertex 122.471 124.918 -3 + endloop + endfacet + facet normal 0.98425 0.176783 -0 + outer loop + vertex 122.434 125.124 -3 + vertex 122.434 125.124 0 + vertex 122.471 124.918 0 + endloop + endfacet + facet normal 0.970981 0.239158 0 + outer loop + vertex 122.384 125.327 -3 + vertex 122.434 125.124 0 + vertex 122.434 125.124 -3 + endloop + endfacet + facet normal 0.970981 0.239158 -0 + outer loop + vertex 122.384 125.327 -3 + vertex 122.384 125.327 0 + vertex 122.434 125.124 0 + endloop + endfacet + facet normal 0.950577 0.31049 0 + outer loop + vertex 122.319 125.526 -3 + vertex 122.384 125.327 0 + vertex 122.384 125.327 -3 + endloop + endfacet + facet normal 0.950577 0.31049 -0 + outer loop + vertex 122.319 125.526 -3 + vertex 122.319 125.526 0 + vertex 122.384 125.327 0 + endloop + endfacet + facet normal 0.927816 0.373039 0 + outer loop + vertex 122.241 125.72 -3 + vertex 122.319 125.526 0 + vertex 122.319 125.526 -3 + endloop + endfacet + facet normal 0.927816 0.373039 -0 + outer loop + vertex 122.241 125.72 -3 + vertex 122.241 125.72 0 + vertex 122.319 125.526 0 + endloop + endfacet + facet normal 0.898217 0.439553 0 + outer loop + vertex 122.149 125.908 -3 + vertex 122.241 125.72 0 + vertex 122.241 125.72 -3 + endloop + endfacet + facet normal 0.898217 0.439553 -0 + outer loop + vertex 122.149 125.908 -3 + vertex 122.149 125.908 0 + vertex 122.241 125.72 0 + endloop + endfacet + facet normal 0.866186 0.499722 0 + outer loop + vertex 122.044 126.09 -3 + vertex 122.149 125.908 0 + vertex 122.149 125.908 -3 + endloop + endfacet + facet normal 0.866186 0.499722 -0 + outer loop + vertex 122.044 126.09 -3 + vertex 122.044 126.09 0 + vertex 122.149 125.908 0 + endloop + endfacet + facet normal 0.828349 0.560213 0 + outer loop + vertex 121.927 126.263 -3 + vertex 122.044 126.09 0 + vertex 122.044 126.09 -3 + endloop + endfacet + facet normal 0.828349 0.560213 -0 + outer loop + vertex 121.927 126.263 -3 + vertex 121.927 126.263 0 + vertex 122.044 126.09 0 + endloop + endfacet + facet normal 0.787807 0.615922 0 + outer loop + vertex 121.798 126.428 -3 + vertex 121.927 126.263 0 + vertex 121.927 126.263 -3 + endloop + endfacet + facet normal 0.787807 0.615922 -0 + outer loop + vertex 121.798 126.428 -3 + vertex 121.798 126.428 0 + vertex 121.927 126.263 0 + endloop + endfacet + facet normal 0.744242 0.66791 0 + outer loop + vertex 121.658 126.584 -3 + vertex 121.798 126.428 0 + vertex 121.798 126.428 -3 + endloop + endfacet + facet normal 0.744242 0.66791 -0 + outer loop + vertex 121.658 126.584 -3 + vertex 121.658 126.584 0 + vertex 121.798 126.428 0 + endloop + endfacet + facet normal 0.692631 0.721292 0 + outer loop + vertex 121.507 126.729 -3 + vertex 121.658 126.584 0 + vertex 121.658 126.584 -3 + endloop + endfacet + facet normal 0.692631 0.721292 -0 + outer loop + vertex 121.507 126.729 -3 + vertex 121.507 126.729 0 + vertex 121.658 126.584 0 + endloop + endfacet + facet normal 0.644871 0.764291 0 + outer loop + vertex 121.347 126.864 -3 + vertex 121.507 126.729 0 + vertex 121.507 126.729 -3 + endloop + endfacet + facet normal 0.644871 0.764291 -0 + outer loop + vertex 121.347 126.864 -3 + vertex 121.347 126.864 0 + vertex 121.507 126.729 0 + endloop + endfacet + facet normal 0.588456 0.808529 0 + outer loop + vertex 121.178 126.987 -3 + vertex 121.347 126.864 0 + vertex 121.347 126.864 -3 + endloop + endfacet + facet normal 0.588456 0.808529 -0 + outer loop + vertex 121.178 126.987 -3 + vertex 121.178 126.987 0 + vertex 121.347 126.864 0 + endloop + endfacet + facet normal 0.529142 0.848533 0 + outer loop + vertex 121 127.098 -3 + vertex 121.178 126.987 0 + vertex 121.178 126.987 -3 + endloop + endfacet + facet normal 0.529142 0.848533 -0 + outer loop + vertex 121 127.098 -3 + vertex 121 127.098 0 + vertex 121.178 126.987 0 + endloop + endfacet + facet normal 0.468107 0.883672 0 + outer loop + vertex 120.815 127.196 -3 + vertex 121 127.098 0 + vertex 121 127.098 -3 + endloop + endfacet + facet normal 0.468107 0.883672 -0 + outer loop + vertex 120.815 127.196 -3 + vertex 120.815 127.196 0 + vertex 121 127.098 0 + endloop + endfacet + facet normal 0.410563 0.911832 0 + outer loop + vertex 120.624 127.282 -3 + vertex 120.815 127.196 0 + vertex 120.815 127.196 -3 + endloop + endfacet + facet normal 0.410563 0.911832 -0 + outer loop + vertex 120.624 127.282 -3 + vertex 120.624 127.282 0 + vertex 120.815 127.196 0 + endloop + endfacet + facet normal 0.339058 0.940766 0 + outer loop + vertex 120.427 127.353 -3 + vertex 120.624 127.282 0 + vertex 120.624 127.282 -3 + endloop + endfacet + facet normal 0.339058 0.940766 -0 + outer loop + vertex 120.427 127.353 -3 + vertex 120.427 127.353 0 + vertex 120.624 127.282 0 + endloop + endfacet + facet normal 0.277246 0.960799 0 + outer loop + vertex 120.226 127.411 -3 + vertex 120.427 127.353 0 + vertex 120.427 127.353 -3 + endloop + endfacet + facet normal 0.277246 0.960799 -0 + outer loop + vertex 120.226 127.411 -3 + vertex 120.226 127.411 0 + vertex 120.427 127.353 0 + endloop + endfacet + facet normal 0.205289 0.978701 0 + outer loop + vertex 120.021 127.454 -3 + vertex 120.226 127.411 0 + vertex 120.226 127.411 -3 + endloop + endfacet + facet normal 0.205289 0.978701 -0 + outer loop + vertex 120.021 127.454 -3 + vertex 120.021 127.454 0 + vertex 120.226 127.411 0 + endloop + endfacet + facet normal 0.143429 0.989661 0 + outer loop + vertex 119.814 127.484 -3 + vertex 120.021 127.454 0 + vertex 120.021 127.454 -3 + endloop + endfacet + facet normal 0.143429 0.989661 -0 + outer loop + vertex 119.814 127.484 -3 + vertex 119.814 127.484 0 + vertex 120.021 127.454 0 + endloop + endfacet + facet normal 0.0668359 0.997764 0 + outer loop + vertex 119.605 127.498 -3 + vertex 119.814 127.484 0 + vertex 119.814 127.484 -3 + endloop + endfacet + facet normal 0.0668359 0.997764 -0 + outer loop + vertex 119.605 127.498 -3 + vertex 119.605 127.498 0 + vertex 119.814 127.484 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 119.502 127.498 -3 + vertex 119.605 127.498 0 + vertex 119.605 127.498 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 119.502 127.498 -3 + vertex 119.502 127.498 0 + vertex 119.605 127.498 0 + endloop + endfacet + facet normal 0.707107 0.707107 0 + outer loop + vertex 119.5 127.5 -3 + vertex 119.502 127.498 0 + vertex 119.502 127.498 -3 + endloop + endfacet + facet normal 0.707107 0.707107 -0 + outer loop + vertex 119.5 127.5 -3 + vertex 119.5 127.5 0 + vertex 119.502 127.498 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -119.5 127.5 -3 + vertex 119.5 127.5 0 + vertex 119.5 127.5 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -119.5 127.5 -3 + vertex -119.5 127.5 0 + vertex 119.5 127.5 0 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -119.502 127.498 -3 + vertex -119.5 127.5 0 + vertex -119.5 127.5 -3 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -119.502 127.498 -3 + vertex -119.502 127.498 0 + vertex -119.5 127.5 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -119.605 127.498 -3 + vertex -119.502 127.498 0 + vertex -119.502 127.498 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -119.605 127.498 -3 + vertex -119.605 127.498 0 + vertex -119.502 127.498 0 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -119.814 127.484 -3 + vertex -119.605 127.498 0 + vertex -119.605 127.498 -3 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -119.814 127.484 -3 + vertex -119.814 127.484 0 + vertex -119.605 127.498 0 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -120.021 127.454 -3 + vertex -119.814 127.484 0 + vertex -119.814 127.484 -3 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -120.021 127.454 -3 + vertex -120.021 127.454 0 + vertex -119.814 127.484 0 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -120.226 127.411 -3 + vertex -120.021 127.454 0 + vertex -120.021 127.454 -3 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -120.226 127.411 -3 + vertex -120.226 127.411 0 + vertex -120.021 127.454 0 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -120.427 127.353 -3 + vertex -120.226 127.411 0 + vertex -120.226 127.411 -3 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -120.427 127.353 -3 + vertex -120.427 127.353 0 + vertex -120.226 127.411 0 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -120.624 127.282 -3 + vertex -120.427 127.353 0 + vertex -120.427 127.353 -3 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -120.624 127.282 -3 + vertex -120.624 127.282 0 + vertex -120.427 127.353 0 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -120.815 127.196 -3 + vertex -120.624 127.282 0 + vertex -120.624 127.282 -3 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -120.815 127.196 -3 + vertex -120.815 127.196 0 + vertex -120.624 127.282 0 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -121 127.098 -3 + vertex -120.815 127.196 0 + vertex -120.815 127.196 -3 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -121 127.098 -3 + vertex -121 127.098 0 + vertex -120.815 127.196 0 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -121.178 126.987 -3 + vertex -121 127.098 0 + vertex -121 127.098 -3 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -121.178 126.987 -3 + vertex -121.178 126.987 0 + vertex -121 127.098 0 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -121.347 126.864 -3 + vertex -121.178 126.987 0 + vertex -121.178 126.987 -3 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -121.347 126.864 -3 + vertex -121.347 126.864 0 + vertex -121.178 126.987 0 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -121.507 126.729 -3 + vertex -121.347 126.864 0 + vertex -121.347 126.864 -3 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -121.507 126.729 -3 + vertex -121.507 126.729 0 + vertex -121.347 126.864 0 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -121.658 126.584 -3 + vertex -121.507 126.729 0 + vertex -121.507 126.729 -3 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -121.658 126.584 -3 + vertex -121.658 126.584 0 + vertex -121.507 126.729 0 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -121.798 126.428 -3 + vertex -121.658 126.584 0 + vertex -121.658 126.584 -3 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -121.798 126.428 -3 + vertex -121.798 126.428 0 + vertex -121.658 126.584 0 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -121.927 126.263 -3 + vertex -121.798 126.428 0 + vertex -121.798 126.428 -3 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -121.927 126.263 -3 + vertex -121.927 126.263 0 + vertex -121.798 126.428 0 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -122.044 126.09 -3 + vertex -121.927 126.263 0 + vertex -121.927 126.263 -3 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -122.044 126.09 -3 + vertex -122.044 126.09 0 + vertex -121.927 126.263 0 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -122.149 125.908 -3 + vertex -122.044 126.09 0 + vertex -122.044 126.09 -3 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -122.149 125.908 -3 + vertex -122.149 125.908 0 + vertex -122.044 126.09 0 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -122.241 125.72 -3 + vertex -122.149 125.908 0 + vertex -122.149 125.908 -3 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -122.241 125.72 -3 + vertex -122.241 125.72 0 + vertex -122.149 125.908 0 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -122.319 125.526 -3 + vertex -122.241 125.72 0 + vertex -122.241 125.72 -3 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -122.319 125.526 -3 + vertex -122.319 125.526 0 + vertex -122.241 125.72 0 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -122.384 125.327 -3 + vertex -122.319 125.526 0 + vertex -122.319 125.526 -3 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -122.384 125.327 -3 + vertex -122.384 125.327 0 + vertex -122.319 125.526 0 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -122.434 125.124 -3 + vertex -122.384 125.327 0 + vertex -122.384 125.327 -3 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -122.434 125.124 -3 + vertex -122.434 125.124 0 + vertex -122.384 125.327 0 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -122.471 124.918 -3 + vertex -122.434 125.124 0 + vertex -122.434 125.124 -3 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -122.471 124.918 -3 + vertex -122.471 124.918 0 + vertex -122.434 125.124 0 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -122.493 124.709 -3 + vertex -122.471 124.918 0 + vertex -122.471 124.918 -3 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -122.493 124.709 -3 + vertex -122.493 124.709 0 + vertex -122.471 124.918 0 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -122.5 124.5 -3 + vertex -122.493 124.709 0 + vertex -122.493 124.709 -3 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -122.5 124.5 -3 + vertex -122.5 124.5 0 + vertex -122.493 124.709 0 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -122.5 -124.5 -3 + vertex -122.5 124.5 0 + vertex -122.5 124.5 -3 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -122.5 -124.5 -3 + vertex -122.5 -124.5 0 + vertex -122.5 124.5 0 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -122.493 -124.709 -3 + vertex -122.5 -124.5 0 + vertex -122.5 -124.5 -3 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -122.493 -124.709 -3 + vertex -122.493 -124.709 0 + vertex -122.5 -124.5 0 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -122.471 -124.918 -3 + vertex -122.493 -124.709 0 + vertex -122.493 -124.709 -3 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -122.471 -124.918 -3 + vertex -122.471 -124.918 0 + vertex -122.493 -124.709 0 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -122.434 -125.124 -3 + vertex -122.471 -124.918 0 + vertex -122.471 -124.918 -3 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -122.434 -125.124 -3 + vertex -122.434 -125.124 0 + vertex -122.471 -124.918 0 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -122.384 -125.327 -3 + vertex -122.434 -125.124 0 + vertex -122.434 -125.124 -3 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -122.384 -125.327 -3 + vertex -122.384 -125.327 0 + vertex -122.434 -125.124 0 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -122.319 -125.526 -3 + vertex -122.384 -125.327 0 + vertex -122.384 -125.327 -3 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -122.319 -125.526 -3 + vertex -122.319 -125.526 0 + vertex -122.384 -125.327 0 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -122.241 -125.72 -3 + vertex -122.319 -125.526 0 + vertex -122.319 -125.526 -3 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -122.241 -125.72 -3 + vertex -122.241 -125.72 0 + vertex -122.319 -125.526 0 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -122.149 -125.908 -3 + vertex -122.241 -125.72 0 + vertex -122.241 -125.72 -3 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -122.149 -125.908 -3 + vertex -122.149 -125.908 0 + vertex -122.241 -125.72 0 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -122.044 -126.09 -3 + vertex -122.149 -125.908 0 + vertex -122.149 -125.908 -3 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -122.044 -126.09 -3 + vertex -122.044 -126.09 0 + vertex -122.149 -125.908 0 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -121.927 -126.263 -3 + vertex -122.044 -126.09 0 + vertex -122.044 -126.09 -3 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -121.927 -126.263 -3 + vertex -121.927 -126.263 0 + vertex -122.044 -126.09 0 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -121.798 -126.428 -3 + vertex -121.927 -126.263 0 + vertex -121.927 -126.263 -3 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -121.798 -126.428 -3 + vertex -121.798 -126.428 0 + vertex -121.927 -126.263 0 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -121.658 -126.584 -3 + vertex -121.798 -126.428 0 + vertex -121.798 -126.428 -3 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -121.658 -126.584 -3 + vertex -121.658 -126.584 0 + vertex -121.798 -126.428 0 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -121.507 -126.729 -3 + vertex -121.658 -126.584 0 + vertex -121.658 -126.584 -3 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -121.507 -126.729 -3 + vertex -121.507 -126.729 0 + vertex -121.658 -126.584 0 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -121.347 -126.864 -3 + vertex -121.507 -126.729 0 + vertex -121.507 -126.729 -3 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -121.347 -126.864 -3 + vertex -121.347 -126.864 0 + vertex -121.507 -126.729 0 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -121.178 -126.987 -3 + vertex -121.347 -126.864 0 + vertex -121.347 -126.864 -3 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -121.178 -126.987 -3 + vertex -121.178 -126.987 0 + vertex -121.347 -126.864 0 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -121 -127.098 -3 + vertex -121.178 -126.987 0 + vertex -121.178 -126.987 -3 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -121 -127.098 -3 + vertex -121 -127.098 0 + vertex -121.178 -126.987 0 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -120.815 -127.196 -3 + vertex -121 -127.098 0 + vertex -121 -127.098 -3 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -120.815 -127.196 -3 + vertex -120.815 -127.196 0 + vertex -121 -127.098 0 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -120.624 -127.282 -3 + vertex -120.815 -127.196 0 + vertex -120.815 -127.196 -3 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -120.624 -127.282 -3 + vertex -120.624 -127.282 0 + vertex -120.815 -127.196 0 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -120.427 -127.353 -3 + vertex -120.624 -127.282 0 + vertex -120.624 -127.282 -3 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -120.427 -127.353 -3 + vertex -120.427 -127.353 0 + vertex -120.624 -127.282 0 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -120.226 -127.411 -3 + vertex -120.427 -127.353 0 + vertex -120.427 -127.353 -3 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -120.226 -127.411 -3 + vertex -120.226 -127.411 0 + vertex -120.427 -127.353 0 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -120.021 -127.454 -3 + vertex -120.226 -127.411 0 + vertex -120.226 -127.411 -3 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -120.021 -127.454 -3 + vertex -120.021 -127.454 0 + vertex -120.226 -127.411 0 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -119.814 -127.484 -3 + vertex -120.021 -127.454 0 + vertex -120.021 -127.454 -3 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -119.814 -127.484 -3 + vertex -119.814 -127.484 0 + vertex -120.021 -127.454 0 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -119.605 -127.498 -3 + vertex -119.814 -127.484 0 + vertex -119.814 -127.484 -3 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -119.605 -127.498 -3 + vertex -119.605 -127.498 0 + vertex -119.814 -127.484 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -119.502 -127.498 -3 + vertex -119.605 -127.498 0 + vertex -119.605 -127.498 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -119.502 -127.498 -3 + vertex -119.502 -127.498 0 + vertex -119.605 -127.498 0 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -119.5 -127.5 -3 + vertex -119.502 -127.498 0 + vertex -119.502 -127.498 -3 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -119.5 -127.5 -3 + vertex -119.5 -127.5 0 + vertex -119.502 -127.498 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 119.5 -127.5 -3 + vertex -119.5 -127.5 0 + vertex -119.5 -127.5 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 119.5 -127.5 -3 + vertex 119.5 -127.5 0 + vertex -119.5 -127.5 0 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 119.502 -127.498 -3 + vertex 119.5 -127.5 0 + vertex 119.5 -127.5 -3 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 119.502 -127.498 -3 + vertex 119.502 -127.498 0 + vertex 119.5 -127.5 0 + endloop + endfacet +endsolid OpenSCAD_Model diff --git a/resources/shaders/gouraud.fs b/resources/shaders/gouraud.fs index 40182a14baa..6dbd0e6fe1d 100644 --- a/resources/shaders/gouraud.fs +++ b/resources/shaders/gouraud.fs @@ -32,22 +32,22 @@ varying vec3 delta_box_max; varying float world_normal_z; varying vec3 eye_normal; -vec3 slope_color() -{ - return (world_normal_z > slope.normal_z - EPSILON) ? GREEN : RED; -} - void main() { if (any(lessThan(clipping_planes_dots, ZERO))) discard; - vec3 color = slope.actived ? slope_color() : uniform_color.rgb; + vec3 color = uniform_color.rgb; + float alpha = uniform_color.a; + if (slope.actived && world_normal_z < slope.normal_z - EPSILON) { + color = vec3(0.7f, 0.7f, 1.f); + alpha = 1.f; + } // if the fragment is outside the print volume -> use darker color color = (any(lessThan(delta_box_min, ZERO)) || any(greaterThan(delta_box_max, ZERO))) ? mix(color, ZERO, 0.3333) : color; #ifdef ENABLE_ENVIRONMENT_MAP if (use_environment_tex) - gl_FragColor = vec4(0.45 * texture2D(environment_tex, normalize(eye_normal).xy * 0.5 + 0.5).xyz + 0.8 * color * intensity.x, uniform_color.a); + gl_FragColor = vec4(0.45 * texture2D(environment_tex, normalize(eye_normal).xy * 0.5 + 0.5).xyz + 0.8 * color * intensity.x, alpha); else #endif - gl_FragColor = vec4(vec3(intensity.y) + color * intensity.x, uniform_color.a); + gl_FragColor = vec4(vec3(intensity.y) + color * intensity.x, alpha); } diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index acd8d465c50..293cbcd79a4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -140,6 +140,11 @@ target_link_libraries(PrusaSlicer libslic3r_gui) else () target_link_libraries(PrusaSlicer -ldl) endif () + if (WIN32) + include_directories(detours) + find_library(PSAPI_LIB NAMES Psapi) + target_link_libraries(PrusaSlicer ${PSAPI_LIB}) + endif () endif () # On Windows, a shim application is required to produce a console / non console version of the Slic3r application. diff --git a/src/PrusaSlicer.cpp b/src/PrusaSlicer.cpp index 60f3a13218b..a68c5cd0f17 100644 --- a/src/PrusaSlicer.cpp +++ b/src/PrusaSlicer.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include "unix/fhs.hpp" // Generated by CMake from ../platform/unix/fhs.hpp.in @@ -47,6 +48,7 @@ #include "libslic3r/Format/SL1.hpp" #include "libslic3r/Utils.hpp" #include "libslic3r/Thread.hpp" +#include "libslic3r/LibraryCheck.hpp" #include "PrusaSlicer.hpp" @@ -56,6 +58,12 @@ using namespace Slic3r; +static PrinterTechnology get_printer_technology(const DynamicConfig &config) +{ + const ConfigOptionEnum *opt = config.option>("printer_technology"); + return (opt == nullptr) ? ptUnknown : opt->value; +} + int CLI::run(int argc, char **argv) { // Mark the main thread for the debugger and for runtime checks. @@ -94,7 +102,7 @@ int CLI::run(int argc, char **argv) m_extra_config.apply(m_config, true); m_extra_config.normalize_fdm(); - PrinterTechnology printer_technology = Slic3r::printer_technology(m_config); + PrinterTechnology printer_technology = get_printer_technology(m_config); bool start_gui = m_actions.empty() && // cutting transformations are setting an "export" action. @@ -129,7 +137,7 @@ int CLI::run(int argc, char **argv) return 1; } config.normalize_fdm(); - PrinterTechnology other_printer_technology = Slic3r::printer_technology(config); + PrinterTechnology other_printer_technology = get_printer_technology(config); if (printer_technology == ptUnknown) { printer_technology = other_printer_technology; } else if (printer_technology != other_printer_technology && other_printer_technology != ptUnknown) { @@ -166,7 +174,7 @@ int CLI::run(int argc, char **argv) // When loading an AMF or 3MF, config is imported as well, including the printer technology. DynamicPrintConfig config; model = Model::read_from_file(file, &config, true); - PrinterTechnology other_printer_technology = Slic3r::printer_technology(config); + PrinterTechnology other_printer_technology = get_printer_technology(config); if (printer_technology == ptUnknown) { printer_technology = other_printer_technology; } @@ -196,6 +204,10 @@ int CLI::run(int argc, char **argv) // Normalizing after importing the 3MFs / AMFs m_print_config.normalize_fdm(); + if (printer_technology == ptUnknown) + printer_technology = std::find(m_actions.begin(), m_actions.end(), "export_sla") == m_actions.end() ? ptFFF : ptSLA; + m_print_config.option>("printer_technology", true)->value = printer_technology; + // Initialize full print configs for both the FFF and SLA technologies. FullPrintConfig fff_print_config; SLAFullPrintConfig sla_print_config; @@ -204,9 +216,8 @@ int CLI::run(int argc, char **argv) if (printer_technology == ptFFF) { fff_print_config.apply(m_print_config, true); m_print_config.apply(fff_print_config, true); - } else if (printer_technology == ptSLA) { - // The default value has to be different from the one in fff mode. - sla_print_config.printer_technology.value = ptSLA; + } else { + assert(printer_technology == ptSLA); sla_print_config.output_filename_format.value = "[input_filename_base].sl1"; // The default bed shape should reflect the default display parameters @@ -219,10 +230,12 @@ int CLI::run(int argc, char **argv) m_print_config.apply(sla_print_config, true); } - std::string validity = m_print_config.validate(); - if (!validity.empty()) { - boost::nowide::cerr << "error: " << validity << std::endl; - return 1; + { + std::string validity = m_print_config.validate(); + if (! validity.empty()) { + boost::nowide::cerr << "Error: The composite configation is not valid: " << validity << std::endl; + return 1; + } } // Loop through transform options. @@ -480,12 +493,6 @@ int CLI::run(int argc, char **argv) if (printer_technology == ptFFF) { for (auto* mo : model.objects) fff_print.auto_assign_extruders(mo); - } else { - // The default for "output_filename_format" is good for FDM: "[input_filename_base].gcode" - // Replace it with a reasonable SLA default. - std::string &format = m_print_config.opt_string("output_filename_format", true); - if (format == static_cast(m_print_config.def()->get("output_filename_format")->default_value.get())->value) - format = "[input_filename_base].SL1"; } print->apply(model, m_print_config); std::string err = print->validate(); @@ -560,6 +567,7 @@ int CLI::run(int argc, char **argv) } } + if (start_gui) { #ifdef SLIC3R_GUI Slic3r::GUI::GUI_InitParams params; @@ -594,7 +602,21 @@ bool CLI::setup(int argc, char **argv) } } - boost::filesystem::path path_to_binary = boost::filesystem::system_complete(argv[0]); +#ifdef WIN32 + // Notify user if blacklisted library is already loaded (Nahimic) + // If there are cases of no reports with blacklisted lib - this check should be performed later. + // Some libraries are loaded when we load libraries during startup. + if (LibraryCheck::get_instance().perform_check()) { + std::wstring text = L"Following libraries has been detected inside of the PrusaSlicer process." + L" We suggest stopping or uninstalling these services if you experience crashes or unexpected behaviour while using PrusaSlicer.\n\n"; + text += LibraryCheck::get_instance().get_blacklisted_string(); + MessageBoxW(NULL, text.c_str(), L"Warning"/*L"Incopatible library found"*/, MB_OK); + } +#endif + + // See Invoking prusa-slicer from $PATH environment variable crashes #5542 + // boost::filesystem::path path_to_binary = boost::filesystem::system_complete(argv[0]); + boost::filesystem::path path_to_binary = boost::dll::program_location(); // Path from the Slic3r binary to its resources. #ifdef __APPLE__ @@ -644,6 +666,7 @@ bool CLI::setup(int argc, char **argv) set_logging_level(opt_loglevel->value); } + //FIXME Validating at this stage most likely does not make sense, as the config is not fully initialized yet. std::string validity = m_config.validate(); // Initialize with defaults. @@ -653,6 +676,7 @@ bool CLI::setup(int argc, char **argv) set_data_dir(m_config.opt_string("datadir")); + //FIXME Validating at this stage most likely does not make sense, as the config is not fully initialized yet. if (!validity.empty()) { boost::nowide::cerr << "error: " << validity << std::endl; return false; diff --git a/src/PrusaSlicer_app_msvc.cpp b/src/PrusaSlicer_app_msvc.cpp index 5f12c91479e..7710d9eb7e9 100644 --- a/src/PrusaSlicer_app_msvc.cpp +++ b/src/PrusaSlicer_app_msvc.cpp @@ -208,7 +208,6 @@ extern "C" { } extern "C" { - #ifdef SLIC3R_WRAPPER_NOCONSOLE int APIENTRY wWinMain(HINSTANCE /* hInstance */, HINSTANCE /* hPrevInstance */, PWSTR /* lpCmdLine */, int /* nCmdShow */) { diff --git a/src/admesh/normals.cpp b/src/admesh/normals.cpp index 16bb3daab55..a470d081de2 100644 --- a/src/admesh/normals.cpp +++ b/src/admesh/normals.cpp @@ -133,16 +133,16 @@ void stl_fix_normal_directions(stl_file *stl) // Initialize list that keeps track of already fixed facets. std::vector norm_sw(stl->stats.number_of_facets, 0); // Initialize list that keeps track of reversed facets. - std::vector reversed_ids(stl->stats.number_of_facets, 0); + std::vector reversed_ids; + reversed_ids.reserve(stl->stats.number_of_facets); int facet_num = 0; - int reversed_count = 0; // If normal vector is not within tolerance and backwards: // Arbitrarily starts at face 0. If this one is wrong, we're screwed. Thankfully, the chances // of it being wrong randomly are low if most of the triangles are right: if (check_normal_vector(stl, 0, 0)) { reverse_facet(stl, 0); - reversed_ids[reversed_count ++] = 0; + reversed_ids.emplace_back(0); } // Say that we've fixed this facet: @@ -159,13 +159,13 @@ void stl_fix_normal_directions(stl_file *stl) if (stl->neighbors_start[facet_num].neighbor[j] != -1) { if (norm_sw[stl->neighbors_start[facet_num].neighbor[j]] == 1) { // trying to modify a facet already marked as fixed, revert all changes made until now and exit (fixes: #716, #574, #413, #269, #262, #259, #230, #228, #206) - for (int id = reversed_count - 1; id >= 0; -- id) + for (int id = int(reversed_ids.size()) - 1; id >= 0; -- id) reverse_facet(stl, reversed_ids[id]); force_exit = true; break; } reverse_facet(stl, stl->neighbors_start[facet_num].neighbor[j]); - reversed_ids[reversed_count ++] = stl->neighbors_start[facet_num].neighbor[j]; + reversed_ids.emplace_back(stl->neighbors_start[facet_num].neighbor[j]); } } // If this edge of the facet is connected: @@ -188,6 +188,7 @@ void stl_fix_normal_directions(stl_file *stl) // Get next facet to fix from top of list. if (head->next != tail) { facet_num = head->next->facet_num; + assert(facet_num < stl->stats.number_of_facets); if (norm_sw[facet_num] != 1) { // If facet is in list mutiple times norm_sw[facet_num] = 1; // Record this one as being fixed. ++ checked; @@ -207,7 +208,7 @@ void stl_fix_normal_directions(stl_file *stl) facet_num = i; if (check_normal_vector(stl, i, 0)) { reverse_facet(stl, i); - reversed_ids[reversed_count++] = i; + reversed_ids.emplace_back(i); } norm_sw[facet_num] = 1; ++ checked; diff --git a/src/avrdude/CMakeLists.txt b/src/avrdude/CMakeLists.txt index fc01b7d8dd1..091afc6f98c 100644 --- a/src/avrdude/CMakeLists.txt +++ b/src/avrdude/CMakeLists.txt @@ -77,22 +77,16 @@ elseif (MINGW) ) endif() -add_executable(avrdude-conf-gen conf-generate.cpp) +include(bin2h) -# Config file embedding -add_custom_command( - DEPENDS avrdude-conf-gen ${CMAKE_CURRENT_SOURCE_DIR}/avrdude-slic3r.conf - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/avrdude-slic3r.conf.h - COMMAND $ avrdude-slic3r.conf avrdude_slic3r_conf ${CMAKE_CURRENT_BINARY_DIR}/avrdude-slic3r.conf.h - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} -) - -add_custom_target(gen_conf_h - DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/avrdude-slic3r.conf.h +bin2h( + SOURCE_FILE ${CMAKE_CURRENT_SOURCE_DIR}/avrdude-slic3r.conf + VARIABLE_NAME avrdude_slic3r_conf + HEADER_FILE ${CMAKE_CURRENT_BINARY_DIR}/avrdude-slic3r.conf.h + ADD_WARNING_TEXT ) add_library(avrdude STATIC ${AVRDUDE_SOURCES}) -add_dependencies(avrdude gen_conf_h) add_executable(avrdude-slic3r main-standalone.cpp) target_link_libraries(avrdude-slic3r avrdude) diff --git a/src/avrdude/config.c b/src/avrdude/config.c index b82fb29cb7b..c0ee9c25b9d 100644 --- a/src/avrdude/config.c +++ b/src/avrdude/config.c @@ -363,7 +363,7 @@ int read_config_builtin() // Note: Can't use yy_scan_buffer, it's buggy (?), leads to fread from a null FILE* // and so unfortunatelly we have to use the copying variant here - YY_BUFFER_STATE buffer = yy_scan_bytes((const char *)avrdude_slic3r_conf, avrdude_slic3r_conf_size); + YY_BUFFER_STATE buffer = yy_scan_bytes((const char *)avrdude_slic3r_conf, avrdude_slic3r_conf_SIZE); if (buffer == NULL) { avrdude_message(MSG_INFO, "%s: read_config_builtin: Failed to initialize parsing buffer\n", progname); return -1; diff --git a/src/build-utils/CMakeLists.txt b/src/build-utils/CMakeLists.txt index d47e5b97ffd..464fd9c8f4f 100644 --- a/src/build-utils/CMakeLists.txt +++ b/src/build-utils/CMakeLists.txt @@ -1,6 +1,11 @@ option(SLIC3R_ENC_CHECK "Verify encoding of source files" 1) +if (IS_CROSS_COMPILE) + # Force disable due to cross compilation. This fact is already printed on cli for users + set(SLIC3R_ENC_CHECK OFF CACHE BOOL "" FORCE) +endif () + if (SLIC3R_ENC_CHECK) add_executable(encoding-check encoding-check.cpp) diff --git a/src/hidapi/win/hid.c b/src/hidapi/win/hid.c index 4a71e255200..881aedf5b8e 100644 --- a/src/hidapi/win/hid.c +++ b/src/hidapi/win/hid.c @@ -130,7 +130,7 @@ extern "C" { static HMODULE lib_handle = NULL; static BOOLEAN initialized = FALSE; #endif /* HIDAPI_USE_DDK */ - + struct hid_device_ { HANDLE device_handle; BOOL blocking; @@ -200,6 +200,7 @@ static void register_error(hid_device *dev, const char *op) } #ifndef HIDAPI_USE_DDK + static int lookup_functions() { lib_handle = LoadLibraryA("hid.dll"); diff --git a/src/libslic3r/AABBTreeIndirect.hpp b/src/libslic3r/AABBTreeIndirect.hpp index 87d1ee9dba4..70096b557bc 100644 --- a/src/libslic3r/AABBTreeIndirect.hpp +++ b/src/libslic3r/AABBTreeIndirect.hpp @@ -653,7 +653,7 @@ inline bool intersect_ray_all_hits( std::vector &hits) { auto ray_intersector = detail::RayIntersectorHits { - vertices, faces, tree, + vertices, faces, {tree}, origin, dir, VectorType(dir.cwiseInverse()) }; if (! tree.empty()) { diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index 7c940338220..79b9a025a65 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -266,14 +266,14 @@ void AppConfig::save() else c << "# " << Slic3r::header_gcodeviewer_generated() << std::endl; // Make sure the "no" category is written first. - for (const std::pair &kvp : m_storage[""]) + for (const auto& kvp : m_storage[""]) c << kvp.first << " = " << kvp.second << std::endl; // Write the other categories. - for (const auto category : m_storage) { + for (const auto& category : m_storage) { if (category.first.empty()) continue; c << std::endl << "[" << category.first << "]" << std::endl; - for (const std::pair &kvp : category.second) + for (const auto& kvp : category.second) c << kvp.first << " = " << kvp.second << std::endl; } // Write vendor sections @@ -395,7 +395,7 @@ std::vector AppConfig::get_mouse_device_names() const static constexpr const char *prefix = "mouse_device:"; static const size_t prefix_len = strlen(prefix); std::vector out; - for (const std::pair>& key_value_pair : m_storage) + for (const auto& key_value_pair : m_storage) if (boost::starts_with(key_value_pair.first, prefix) && key_value_pair.first.size() > prefix_len) out.emplace_back(key_value_pair.first.substr(prefix_len)); return out; diff --git a/src/libslic3r/Brim.cpp b/src/libslic3r/Brim.cpp new file mode 100644 index 00000000000..78a6bad7085 --- /dev/null +++ b/src/libslic3r/Brim.cpp @@ -0,0 +1,532 @@ +#include "clipper/clipper_z.hpp" + +#include "ClipperUtils.hpp" +#include "EdgeGrid.hpp" +#include "Layer.hpp" +#include "Print.hpp" +#include "ShortestPath.hpp" +#include "libslic3r.h" + +#include +#include +#include +#include + +#ifndef NDEBUG + // #define BRIM_DEBUG_TO_SVG +#endif + +namespace Slic3r { + +static void append_and_translate(ExPolygons &dst, const ExPolygons &src, const PrintInstance &instance) { + size_t dst_idx = dst.size(); + expolygons_append(dst, src); + for (; dst_idx < dst.size(); ++dst_idx) + dst[dst_idx].translate(instance.shift.x(), instance.shift.y()); +} + +static void append_and_translate(Polygons &dst, const Polygons &src, const PrintInstance &instance) { + size_t dst_idx = dst.size(); + polygons_append(dst, src); + for (; dst_idx < dst.size(); ++dst_idx) + dst[dst_idx].translate(instance.shift.x(), instance.shift.y()); +} + +static float max_brim_width(const ConstPrintObjectPtrsAdaptor &objects) +{ + assert(!objects.empty()); + return float(std::accumulate(objects.begin(), objects.end(), 0., + [](double partial_result, const PrintObject *object) { + return std::max(partial_result, object->config().brim_type == btNoBrim ? 0. : object->config().brim_width.value); + })); +} + +static ConstPrintObjectPtrs get_top_level_objects_with_brim(const Print &print) +{ + Polygons islands; + ConstPrintObjectPtrs island_to_object; + for (const PrintObject *object : print.objects()) { + Polygons islands_object; + islands_object.reserve(object->layers().front()->lslices.size()); + for (const ExPolygon &ex_poly : object->layers().front()->lslices) + islands_object.emplace_back(ex_poly.contour); + + islands.reserve(islands.size() + object->instances().size() * islands_object.size()); + for (const PrintInstance &instance : object->instances()) + for (Polygon &poly : islands_object) { + islands.emplace_back(poly); + islands.back().translate(instance.shift); + island_to_object.emplace_back(object); + } + } + assert(islands.size() == island_to_object.size()); + + ClipperLib_Z::Paths islands_clip; + islands_clip.reserve(islands.size()); + for (const Polygon &poly : islands) { + islands_clip.emplace_back(); + ClipperLib_Z::Path &island_clip = islands_clip.back(); + island_clip.reserve(poly.points.size()); + int island_idx = int(&poly - &islands.front()); + // The Z coordinate carries index of the island used to get the pointer to the object. + for (const Point &pt : poly.points) + island_clip.emplace_back(pt.x(), pt.y(), island_idx + 1); + } + + // Init Clipper + ClipperLib_Z::Clipper clipper; + // Assign the maximum Z from four points. This values is valid index of the island + clipper.ZFillFunction([](const ClipperLib_Z::IntPoint &e1bot, const ClipperLib_Z::IntPoint &e1top, const ClipperLib_Z::IntPoint &e2bot, + const ClipperLib_Z::IntPoint &e2top, ClipperLib_Z::IntPoint &pt) { + pt.Z = std::max(std::max(e1bot.Z, e1top.Z), std::max(e2bot.Z, e2top.Z)); + }); + // Add islands + clipper.AddPaths(islands_clip, ClipperLib_Z::ptSubject, true); + // Execute union operation to construct polytree + ClipperLib_Z::PolyTree islands_polytree; + clipper.Execute(ClipperLib_Z::ctUnion, islands_polytree, ClipperLib_Z::pftEvenOdd, ClipperLib_Z::pftEvenOdd); + + std::unordered_set processed_objects_idx; + ConstPrintObjectPtrs top_level_objects_with_brim; + for (int i = 0; i < islands_polytree.ChildCount(); ++i) { + for (const ClipperLib_Z::IntPoint &point : islands_polytree.Childs[i]->Contour) { + if (point.Z != 0 && processed_objects_idx.find(island_to_object[point.Z - 1]->id().id) == processed_objects_idx.end()) { + top_level_objects_with_brim.emplace_back(island_to_object[point.Z - 1]); + processed_objects_idx.insert(island_to_object[point.Z - 1]->id().id); + } + } + } + return top_level_objects_with_brim; +} + +static Polygons top_level_outer_brim_islands(const ConstPrintObjectPtrs &top_level_objects_with_brim) +{ + Polygons islands; + for (const PrintObject *object : top_level_objects_with_brim) { + //FIXME how about the brim type? + float brim_offset = float(scale_(object->config().brim_offset.value)); + Polygons islands_object; + for (const ExPolygon &ex_poly : object->layers().front()->lslices) { + Polygons contour_offset = offset(ex_poly.contour, brim_offset); + for (Polygon &poly : contour_offset) + poly.douglas_peucker(SCALED_RESOLUTION); + + polygons_append(islands_object, std::move(contour_offset)); + } + + for (const PrintInstance &instance : object->instances()) + append_and_translate(islands, islands_object, instance); + } + return islands; +} + +static ExPolygons top_level_outer_brim_area(const Print &print, const ConstPrintObjectPtrs &top_level_objects_with_brim, const float no_brim_offset) +{ + std::unordered_set top_level_objects_idx; + top_level_objects_idx.reserve(top_level_objects_with_brim.size()); + for (const PrintObject *object : top_level_objects_with_brim) + top_level_objects_idx.insert(object->id().id); + + ExPolygons brim_area; + Polygons no_brim_area; + for (const PrintObject *object : print.objects()) { + const BrimType brim_type = object->config().brim_type.value; + const float brim_offset = scale_(object->config().brim_offset.value); + const float brim_width = scale_(object->config().brim_width.value); + const bool is_top_outer_brim = top_level_objects_idx.find(object->id().id) != top_level_objects_idx.end(); + + ExPolygons brim_area_object; + Polygons no_brim_area_object; + for (const ExPolygon &ex_poly : object->layers().front()->lslices) { + if ((brim_type == BrimType::btOuterOnly || brim_type == BrimType::btOuterAndInner) && is_top_outer_brim) + append(brim_area_object, diff_ex(offset_ex(ex_poly.contour, brim_width + brim_offset), offset_ex(ex_poly.contour, brim_offset))); + + if (brim_type == BrimType::btOuterOnly || brim_type == BrimType::btNoBrim) + append(no_brim_area_object, offset(ex_poly.holes, -no_brim_offset)); + + if (brim_type != BrimType::btNoBrim) + append(no_brim_area_object, offset(ex_poly.contour, brim_offset)); + + no_brim_area_object.emplace_back(ex_poly.contour); + } + + for (const PrintInstance &instance : object->instances()) { + append_and_translate(brim_area, brim_area_object, instance); + append_and_translate(no_brim_area, no_brim_area_object, instance); + } + } + + return diff_ex(to_polygons(std::move(brim_area)), no_brim_area); +} + +static ExPolygons inner_brim_area(const Print &print, const ConstPrintObjectPtrs &top_level_objects_with_brim, const float no_brim_offset) +{ + std::unordered_set top_level_objects_idx; + top_level_objects_idx.reserve(top_level_objects_with_brim.size()); + for (const PrintObject *object : top_level_objects_with_brim) + top_level_objects_idx.insert(object->id().id); + + ExPolygons brim_area; + ExPolygons no_brim_area; + Polygons holes; + for (const PrintObject *object : print.objects()) { + const BrimType brim_type = object->config().brim_type.value; + const float brim_offset = scale_(object->config().brim_offset.value); + const float brim_width = scale_(object->config().brim_width.value); + const bool top_outer_brim = top_level_objects_idx.find(object->id().id) != top_level_objects_idx.end(); + + ExPolygons brim_area_object; + ExPolygons no_brim_area_object; + Polygons holes_object; + for (const ExPolygon &ex_poly : object->layers().front()->lslices) { + if (brim_type == BrimType::btOuterOnly || brim_type == BrimType::btOuterAndInner) { + if (top_outer_brim) + no_brim_area_object.emplace_back(ex_poly); + else + append(brim_area_object, diff_ex(offset_ex(ex_poly.contour, brim_width + brim_offset), offset_ex(ex_poly.contour, brim_offset))); + } + + if (brim_type == BrimType::btInnerOnly || brim_type == BrimType::btOuterAndInner) + append(brim_area_object, diff_ex(offset_ex(ex_poly.holes, -brim_offset), offset_ex(ex_poly.holes, -brim_width - brim_offset))); + + if (brim_type == BrimType::btInnerOnly || brim_type == BrimType::btNoBrim) + append(no_brim_area_object, offset_ex(ex_poly.contour, no_brim_offset)); + + if (brim_type == BrimType::btOuterOnly || brim_type == BrimType::btNoBrim) + append(no_brim_area_object, offset_ex(ex_poly.holes, -no_brim_offset)); + + append(holes_object, ex_poly.holes); + } + append(no_brim_area_object, offset_ex(object->layers().front()->lslices, brim_offset)); + + for (const PrintInstance &instance : object->instances()) { + append_and_translate(brim_area, brim_area_object, instance); + append_and_translate(no_brim_area, no_brim_area_object, instance); + append_and_translate(holes, holes_object, instance); + } + } + + return diff_ex(intersection_ex(to_polygons(std::move(brim_area)), holes), no_brim_area); +} + +// Flip orientation of open polylines to minimize travel distance. +static void optimize_polylines_by_reversing(Polylines *polylines) +{ + for (size_t poly_idx = 1; poly_idx < polylines->size(); ++poly_idx) { + const Polyline &prev = (*polylines)[poly_idx - 1]; + Polyline & next = (*polylines)[poly_idx]; + + if (!next.is_closed()) { + double dist_to_start = (next.first_point() - prev.last_point()).cast().norm(); + double dist_to_end = (next.last_point() - prev.last_point()).cast().norm(); + + if (dist_to_end < dist_to_start) + next.reverse(); + } + } +} + +static Polylines connect_brim_lines(Polylines &&polylines, const Polygons &brim_area, float max_connection_length) +{ + if (polylines.empty()) + return Polylines(); + + BoundingBox bbox = get_extents(polylines); + bbox.merge(get_extents(brim_area)); + + EdgeGrid::Grid grid(bbox.inflated(SCALED_EPSILON)); + grid.create(brim_area, polylines, coord_t(scale_(10.))); + + struct Visitor + { + explicit Visitor(const EdgeGrid::Grid &grid) : grid(grid) {} + + bool operator()(coord_t iy, coord_t ix) + { + // Called with a row and colum of the grid cell, which is intersected by a line. + auto cell_data_range = grid.cell_data_range(iy, ix); + this->intersect = false; + for (auto it_contour_and_segment = cell_data_range.first; it_contour_and_segment != cell_data_range.second; ++it_contour_and_segment) { + // End points of the line segment and their vector. + auto segment = grid.segment(*it_contour_and_segment); + if (Geometry::segments_intersect(segment.first, segment.second, brim_line.a, brim_line.b)) { + this->intersect = true; + return false; + } + } + // Continue traversing the grid along the edge. + return true; + } + + const EdgeGrid::Grid &grid; + Line brim_line; + bool intersect; + + } visitor(grid); + + // Connect successive polylines if they are open, their ends are closer than max_connection_length. + // Remove empty polylines. + { + // Skip initial empty lines. + size_t poly_idx = 0; + for (; poly_idx < polylines.size() && polylines[poly_idx].empty(); ++ poly_idx) ; + size_t end = ++ poly_idx; + double max_connection_length2 = Slic3r::sqr(max_connection_length); + for (; poly_idx < polylines.size(); ++poly_idx) { + Polyline &next = polylines[poly_idx]; + if (! next.empty()) { + Polyline &prev = polylines[end - 1]; + bool connect = false; + if (! prev.is_closed() && ! next.is_closed()) { + double dist2 = (prev.last_point() - next.first_point()).cast().squaredNorm(); + if (dist2 <= max_connection_length2) { + visitor.brim_line.a = prev.last_point(); + visitor.brim_line.b = next.first_point(); + // Shrink the connection line to avoid collisions with the brim centerlines. + visitor.brim_line.extend(-SCALED_EPSILON); + grid.visit_cells_intersecting_line(visitor.brim_line.a, visitor.brim_line.b, visitor); + connect = ! visitor.intersect; + } + } + if (connect) { + append(prev.points, std::move(next.points)); + } else { + if (end < poly_idx) + polylines[end] = std::move(next); + ++ end; + } + } + } + if (end < polylines.size()) + polylines.erase(polylines.begin() + end, polylines.end()); + } + + return polylines; +} + +static void make_inner_brim(const Print &print, const ConstPrintObjectPtrs &top_level_objects_with_brim, ExtrusionEntityCollection &brim) +{ + Flow flow = print.brim_flow(); + ExPolygons islands_ex = inner_brim_area(print, top_level_objects_with_brim, flow.scaled_spacing()); + Polygons loops; + islands_ex = offset_ex(islands_ex, -0.5f * float(flow.scaled_spacing()), jtSquare); + for (size_t i = 0; !islands_ex.empty(); ++i) { + for (ExPolygon &poly_ex : islands_ex) + poly_ex.douglas_peucker(SCALED_RESOLUTION); + polygons_append(loops, to_polygons(islands_ex)); + islands_ex = offset_ex(islands_ex, -float(flow.scaled_spacing()), jtSquare); + } + + loops = union_pt_chained_outside_in(loops, false); + std::reverse(loops.begin(), loops.end()); + extrusion_entities_append_loops(brim.entities, std::move(loops), erSkirt, float(flow.mm3_per_mm()), + float(flow.width), float(print.skirt_first_layer_height())); +} + +// Produce brim lines around those objects, that have the brim enabled. +// Collect islands_area to be merged into the final 1st layer convex hull. +ExtrusionEntityCollection make_brim(const Print &print, PrintTryCancel try_cancel, Polygons &islands_area) +{ + Flow flow = print.brim_flow(); + ConstPrintObjectPtrs top_level_objects_with_brim = get_top_level_objects_with_brim(print); + Polygons islands = top_level_outer_brim_islands(top_level_objects_with_brim); + ExPolygons islands_area_ex = top_level_outer_brim_area(print, top_level_objects_with_brim, flow.scaled_spacing()); + islands_area = to_polygons(islands_area_ex); + + Polygons loops; + size_t num_loops = size_t(floor(max_brim_width(print.objects()) / flow.spacing())); + for (size_t i = 0; i < num_loops; ++i) { + try_cancel(); + islands = offset(islands, float(flow.scaled_spacing()), jtSquare); + for (Polygon &poly : islands) + poly.douglas_peucker(SCALED_RESOLUTION); + polygons_append(loops, offset(islands, -0.5f * float(flow.scaled_spacing()))); + } + loops = union_pt_chained_outside_in(loops, false); + + std::vector loops_pl_by_levels; + { + Polylines loops_pl = to_polylines(loops); + loops_pl_by_levels.assign(loops_pl.size(), Polylines()); + tbb::parallel_for(tbb::blocked_range(0, loops_pl.size()), + [&loops_pl_by_levels, &loops_pl, &islands_area](const tbb::blocked_range &range) { + for (size_t i = range.begin(); i < range.end(); ++i) { + loops_pl_by_levels[i] = chain_polylines(intersection_pl({ std::move(loops_pl[i]) }, islands_area)); + } + }); + } + + // output + ExtrusionEntityCollection brim; + + // Reduce down to the ordered list of polylines. + Polylines all_loops; + for (Polylines &polylines : loops_pl_by_levels) + append(all_loops, std::move(polylines)); + loops_pl_by_levels.clear(); + + // Flip orientation of open polylines to minimize travel distance. + optimize_polylines_by_reversing(&all_loops); + +#ifdef BRIM_DEBUG_TO_SVG + static int irun = 0; + ++ irun; + + { + SVG svg(debug_out_path("brim-%d.svg", irun).c_str(), get_extents(all_loops)); + svg.draw(union_ex(islands), "blue"); + svg.draw(islands_area_ex, "green"); + svg.draw(all_loops, "black", coord_t(scale_(0.1))); + } +#endif // BRIM_DEBUG_TO_SVG + + all_loops = connect_brim_lines(std::move(all_loops), offset(islands_area_ex,SCALED_EPSILON), flow.scaled_spacing() * 2); + +#ifdef BRIM_DEBUG_TO_SVG + { + SVG svg(debug_out_path("brim-connected-%d.svg", irun).c_str(), get_extents(all_loops)); + svg.draw(union_ex(islands), "blue"); + svg.draw(islands_area_ex, "green"); + svg.draw(all_loops, "black", coord_t(scale_(0.1))); + } +#endif // BRIM_DEBUG_TO_SVG + + const bool could_brim_intersects_skirt = std::any_of(print.objects().begin(), print.objects().end(), [&print](PrintObject *object) { + const BrimType &bt = object->config().brim_type; + return (bt == btOuterOnly || bt == btOuterAndInner) && print.config().skirt_distance.value < object->config().brim_width; + }); + // If there is a possibility that brim intersects skirt, go through loops and split those extrusions + // The result is either the original Polygon or a list of Polylines + if (! print.skirt().empty() && could_brim_intersects_skirt) + { + // Find the bounding polygons of the skirt + const Polygons skirt_inners = offset(dynamic_cast(print.skirt().entities.back())->polygon(), + -float(scale_(print.skirt_flow().spacing()))/2.f, + ClipperLib::jtRound, + float(scale_(0.1))); + const Polygons skirt_outers = offset(dynamic_cast(print.skirt().entities.front())->polygon(), + float(scale_(print.skirt_flow().spacing()))/2.f, + ClipperLib::jtRound, + float(scale_(0.1))); + + // First calculate the trimming region. + ClipperLib_Z::Paths trimming; + { + ClipperLib_Z::Paths input_subject; + ClipperLib_Z::Paths input_clip; + for (const Polygon &poly : skirt_outers) { + input_subject.emplace_back(); + ClipperLib_Z::Path &out = input_subject.back(); + out.reserve(poly.points.size()); + for (const Point &pt : poly.points) + out.emplace_back(pt.x(), pt.y(), 0); + } + for (const Polygon &poly : skirt_inners) { + input_clip.emplace_back(); + ClipperLib_Z::Path &out = input_clip.back(); + out.reserve(poly.points.size()); + for (const Point &pt : poly.points) + out.emplace_back(pt.x(), pt.y(), 0); + } + // init Clipper + ClipperLib_Z::Clipper clipper; + // add polygons + clipper.AddPaths(input_subject, ClipperLib_Z::ptSubject, true); + clipper.AddPaths(input_clip, ClipperLib_Z::ptClip, true); + // perform operation + clipper.Execute(ClipperLib_Z::ctDifference, trimming, ClipperLib_Z::pftEvenOdd, ClipperLib_Z::pftEvenOdd); + } + + // Second, trim the extrusion loops with the trimming regions. + ClipperLib_Z::Paths loops_trimmed; + { + // Produce ClipperLib_Z::Paths from polylines (not necessarily closed). + ClipperLib_Z::Paths input_clip; + for (const Polyline &loop_pl : all_loops) { + input_clip.emplace_back(); + ClipperLib_Z::Path& out = input_clip.back(); + out.reserve(loop_pl.points.size()); + int64_t loop_idx = &loop_pl - &all_loops.front(); + for (const Point& pt : loop_pl.points) + // The Z coordinate carries index of the source loop. + out.emplace_back(pt.x(), pt.y(), loop_idx + 1); + } + // init Clipper + ClipperLib_Z::Clipper clipper; + clipper.ZFillFunction([](const ClipperLib_Z::IntPoint& e1bot, const ClipperLib_Z::IntPoint& e1top, const ClipperLib_Z::IntPoint& e2bot, const ClipperLib_Z::IntPoint& e2top, ClipperLib_Z::IntPoint& pt) { + // Assign a valid input loop identifier. Such an identifier is strictly positive, the next line is safe even in case one side of a segment + // hat the Z coordinate not set to the contour coordinate. + pt.Z = std::max(std::max(e1bot.Z, e1top.Z), std::max(e2bot.Z, e2top.Z)); + }); + // add polygons + clipper.AddPaths(input_clip, ClipperLib_Z::ptSubject, false); + clipper.AddPaths(trimming, ClipperLib_Z::ptClip, true); + // perform operation + ClipperLib_Z::PolyTree loops_trimmed_tree; + clipper.Execute(ClipperLib_Z::ctDifference, loops_trimmed_tree, ClipperLib_Z::pftEvenOdd, ClipperLib_Z::pftEvenOdd); + ClipperLib_Z::PolyTreeToPaths(loops_trimmed_tree, loops_trimmed); + } + + // Third, produce the extrusions, sorted by the source loop indices. + { + std::vector> loops_trimmed_order; + loops_trimmed_order.reserve(loops_trimmed.size()); + for (const ClipperLib_Z::Path &path : loops_trimmed) { + size_t input_idx = 0; + for (const ClipperLib_Z::IntPoint &pt : path) + if (pt.Z > 0) { + input_idx = (size_t)pt.Z; + break; + } + assert(input_idx != 0); + loops_trimmed_order.emplace_back(&path, input_idx); + } + std::stable_sort(loops_trimmed_order.begin(), loops_trimmed_order.end(), + [](const std::pair &l, const std::pair &r) { + return l.second < r.second; + }); + + Point last_pt(0, 0); + for (size_t i = 0; i < loops_trimmed_order.size();) { + // Find all pieces that the initial loop was split into. + size_t j = i + 1; + for (; j < loops_trimmed_order.size() && loops_trimmed_order[i].second == loops_trimmed_order[j].second; ++ j) ; + const ClipperLib_Z::Path &first_path = *loops_trimmed_order[i].first; + if (i + 1 == j && first_path.size() > 3 && first_path.front().X == first_path.back().X && first_path.front().Y == first_path.back().Y) { + auto *loop = new ExtrusionLoop(); + brim.entities.emplace_back(loop); + loop->paths.emplace_back(erSkirt, float(flow.mm3_per_mm()), float(flow.width), float(print.skirt_first_layer_height())); + Points &points = loop->paths.front().polyline.points; + points.reserve(first_path.size()); + for (const ClipperLib_Z::IntPoint &pt : first_path) + points.emplace_back(coord_t(pt.X), coord_t(pt.Y)); + i = j; + } else { + //FIXME The path chaining here may not be optimal. + ExtrusionEntityCollection this_loop_trimmed; + this_loop_trimmed.entities.reserve(j - i); + for (; i < j; ++ i) { + this_loop_trimmed.entities.emplace_back(new ExtrusionPath(erSkirt, float(flow.mm3_per_mm()), float(flow.width), float(print.skirt_first_layer_height()))); + const ClipperLib_Z::Path &path = *loops_trimmed_order[i].first; + Points &points = static_cast(this_loop_trimmed.entities.back())->polyline.points; + points.reserve(path.size()); + for (const ClipperLib_Z::IntPoint &pt : path) + points.emplace_back(coord_t(pt.X), coord_t(pt.Y)); + } + chain_and_reorder_extrusion_entities(this_loop_trimmed.entities, &last_pt); + brim.entities.reserve(brim.entities.size() + this_loop_trimmed.entities.size()); + append(brim.entities, std::move(this_loop_trimmed.entities)); + this_loop_trimmed.entities.clear(); + } + last_pt = brim.last_point(); + } + } + } else { + extrusion_entities_append_loops_and_paths(brim.entities, std::move(all_loops), erSkirt, float(flow.mm3_per_mm()), float(flow.width), float(print.skirt_first_layer_height())); + } + + make_inner_brim(print, top_level_objects_with_brim, brim); + return brim; +} + +} // namespace Slic3r diff --git a/src/libslic3r/Brim.hpp b/src/libslic3r/Brim.hpp new file mode 100644 index 00000000000..18bff2960cf --- /dev/null +++ b/src/libslic3r/Brim.hpp @@ -0,0 +1,14 @@ +#ifndef slic3r_Brim_hpp_ +#define slic3r_Brim_hpp_ + +namespace Slic3r { + +class Print; + +// Produce brim lines around those objects, that have the brim enabled. +// Collect islands_area to be merged into the final 1st layer convex hull. +ExtrusionEntityCollection make_brim(const Print &print, PrintTryCancel try_cancel, Polygons &islands_area); + +} // Slic3r + +#endif // slic3r_Brim_hpp_ diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index 11e37afc6b7..b9f87058cc0 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -21,6 +21,8 @@ add_library(libslic3r STATIC BoundingBox.hpp BridgeDetector.cpp BridgeDetector.hpp + Brim.cpp + Brim.hpp ClipperUtils.cpp ClipperUtils.hpp Config.cpp @@ -120,6 +122,8 @@ add_library(libslic3r STATIC "${CMAKE_CURRENT_BINARY_DIR}/libslic3r_version.h" Line.cpp Line.hpp + LibraryCheck.cpp + LibraryCheck.hpp Model.cpp Model.hpp ModelArrange.hpp diff --git a/src/libslic3r/Config.hpp b/src/libslic3r/Config.hpp index 8cdacd59f33..5e4b2ed6a08 100644 --- a/src/libslic3r/Config.hpp +++ b/src/libslic3r/Config.hpp @@ -1163,8 +1163,8 @@ class ConfigOptionPoint3 : public ConfigOptionSingle { UNUSED(append); char dummy; - return sscanf(str.data(), " %lf , %lf , %lf %c", &this->value(0), &this->value(1), &this->value(2), &dummy) == 2 || - sscanf(str.data(), " %lf x %lf x %lf %c", &this->value(0), &this->value(1), &this->value(2), &dummy) == 2; + return sscanf(str.data(), " %lf , %lf , %lf %c", &this->value(0), &this->value(1), &this->value(2), &dummy) == 3 || + sscanf(str.data(), " %lf x %lf x %lf %c", &this->value(0), &this->value(1), &this->value(2), &dummy) == 3; } private: @@ -1344,7 +1344,7 @@ class ConfigOptionEnum : public ConfigOptionSingle static bool has(T value) { - for (const std::pair &kvp : ConfigOptionEnum::get_enum_values()) + for (const auto &kvp : ConfigOptionEnum::get_enum_values()) if (kvp.second == value) return true; return false; @@ -1358,11 +1358,11 @@ class ConfigOptionEnum : public ConfigOptionSingle // Initialize the map. const t_config_enum_values &enum_keys_map = ConfigOptionEnum::get_enum_values(); int cnt = 0; - for (const std::pair &kvp : enum_keys_map) + for (const auto& kvp : enum_keys_map) cnt = std::max(cnt, kvp.second); cnt += 1; names.assign(cnt, ""); - for (const std::pair &kvp : enum_keys_map) + for (const auto& kvp : enum_keys_map) names[kvp.second] = kvp.first; } return names; @@ -1946,8 +1946,9 @@ class DynamicConfig : public virtual ConfigBase int& opt_int(const t_config_option_key &opt_key, unsigned int idx) { return this->option(opt_key)->get_at(idx); } int opt_int(const t_config_option_key &opt_key, unsigned int idx) const { return dynamic_cast(this->option(opt_key))->get_at(idx); } + // In ConfigManipulation::toggle_print_fff_options, it is called on option with type ConfigOptionEnumGeneric* and also ConfigOptionEnum*. template - ENUM opt_enum(const t_config_option_key &opt_key) const { return (ENUM)dynamic_cast(this->option(opt_key))->value; } + ENUM opt_enum(const t_config_option_key &opt_key) const { return this->option>(opt_key)->value; } bool opt_bool(const t_config_option_key &opt_key) const { return this->option(opt_key)->value != 0; } bool opt_bool(const t_config_option_key &opt_key, unsigned int idx) const { return this->option(opt_key)->get_at(idx) != 0; } diff --git a/src/libslic3r/EdgeGrid.cpp b/src/libslic3r/EdgeGrid.cpp index e7307fda470..5e541ab69c1 100644 --- a/src/libslic3r/EdgeGrid.cpp +++ b/src/libslic3r/EdgeGrid.cpp @@ -25,11 +25,6 @@ namespace Slic3r { -EdgeGrid::Grid::Grid() : - m_rows(0), m_cols(0) -{ -} - EdgeGrid::Grid::~Grid() { m_contours.clear(); @@ -39,76 +34,82 @@ EdgeGrid::Grid::~Grid() void EdgeGrid::Grid::create(const Polygons &polygons, coord_t resolution) { - // Count the contours. - size_t ncontours = 0; - for (size_t j = 0; j < polygons.size(); ++ j) - if (! polygons[j].points.empty()) - ++ ncontours; - // Collect the contours. - m_contours.assign(ncontours, nullptr); - ncontours = 0; - for (size_t j = 0; j < polygons.size(); ++ j) - if (! polygons[j].points.empty()) - m_contours[ncontours ++] = &polygons[j].points; + m_contours.reserve(std::count_if(polygons.begin(), polygons.end(), [](const Polygon &p) { return ! p.empty(); })); + for (const Polygon &polygon : polygons) + if (! polygon.empty()) + m_contours.emplace_back(polygon.points, false); create_from_m_contours(resolution); } void EdgeGrid::Grid::create(const std::vector &polygons, coord_t resolution) { - // Count the contours. - size_t ncontours = 0; - for (size_t j = 0; j < polygons.size(); ++ j) - if (! polygons[j]->points.empty()) - ++ ncontours; - // Collect the contours. - m_contours.assign(ncontours, nullptr); - ncontours = 0; - for (size_t j = 0; j < polygons.size(); ++ j) - if (! polygons[j]->points.empty()) - m_contours[ncontours ++] = &polygons[j]->points; + m_contours.reserve(std::count_if(polygons.begin(), polygons.end(), [](const Polygon *p) { return ! p->empty(); })); + for (const Polygon *polygon : polygons) + if (! polygon->empty()) + m_contours.emplace_back(polygon->points, false); create_from_m_contours(resolution); } -void EdgeGrid::Grid::create(const std::vector &polygons, coord_t resolution) +void EdgeGrid::Grid::create(const std::vector &polygons, coord_t resolution, bool open_polylines) { - // Count the contours. - size_t ncontours = 0; - for (size_t j = 0; j < polygons.size(); ++ j) - if (! polygons[j].empty()) - ++ ncontours; + // Collect the contours. + m_contours.reserve(std::count_if(polygons.begin(), polygons.end(), [](const Points &p) { return p.size() > 1; })); + for (const Points &points : polygons) + if (points.size() > 1) { + const Point *begin = points.data(); + const Point *end = points.data() + points.size(); + bool open = open_polylines; + if (open_polylines) { + if (*begin == end[-1]) { + open = false; + -- end; + } + } else + assert(*begin != end[-1]); + m_contours.emplace_back(begin, end, open); + } + create_from_m_contours(resolution); +} + +void EdgeGrid::Grid::create(const Polygons &polygons, const Polylines &polylines, coord_t resolution) +{ // Collect the contours. - m_contours.assign(ncontours, nullptr); - ncontours = 0; - for (size_t j = 0; j < polygons.size(); ++ j) - if (! polygons[j].empty()) - m_contours[ncontours ++] = &polygons[j]; + m_contours.reserve( + std::count_if(polygons.begin(), polygons.end(), [](const Polygon &p) { return p.size() > 1; }) + + std::count_if(polylines.begin(), polylines.end(), [](const Polyline &p) { return p.size() > 1; })); + + for (const Polyline &polyline : polylines) + if (polyline.size() > 1) { + const Point *begin = polyline.points.data(); + const Point *end = polyline.points.data() + polyline.size(); + bool open = true; + if (*begin == end[-1]) { + open = false; + -- end; + } + m_contours.emplace_back(begin, end, open); + } + + for (const Polygon &polygon : polygons) + if (polygon.size() > 1) + m_contours.emplace_back(polygon.points, false); create_from_m_contours(resolution); } void EdgeGrid::Grid::create(const ExPolygon &expoly, coord_t resolution) { - // Count the contours. - size_t ncontours = 0; - if (! expoly.contour.points.empty()) - ++ ncontours; - for (size_t j = 0; j < expoly.holes.size(); ++ j) - if (! expoly.holes[j].points.empty()) - ++ ncontours; - - // Collect the contours. - m_contours.assign(ncontours, nullptr); - ncontours = 0; - if (! expoly.contour.points.empty()) - m_contours[ncontours++] = &expoly.contour.points; - for (size_t j = 0; j < expoly.holes.size(); ++ j) - if (! expoly.holes[j].points.empty()) - m_contours[ncontours++] = &expoly.holes[j].points; + m_contours.reserve((expoly.contour.empty() ? 0 : 1) + std::count_if(expoly.holes.begin(), expoly.holes.end(), [](const Polygon &p) { return ! p.empty(); })); + if (! expoly.contour.empty()) + m_contours.emplace_back(expoly.contour.points, false); + for (const Polygon &hole : expoly.holes) + if (! hole.empty()) + m_contours.emplace_back(hole.points, false); create_from_m_contours(resolution); } @@ -117,25 +118,20 @@ void EdgeGrid::Grid::create(const ExPolygons &expolygons, coord_t resolution) { // Count the contours. size_t ncontours = 0; - for (size_t i = 0; i < expolygons.size(); ++ i) { - const ExPolygon &expoly = expolygons[i]; - if (! expoly.contour.points.empty()) + for (const ExPolygon &expoly : expolygons) { + if (! expoly.contour.empty()) ++ ncontours; - for (size_t j = 0; j < expoly.holes.size(); ++ j) - if (! expoly.holes[j].points.empty()) - ++ ncontours; + ncontours += std::count_if(expoly.holes.begin(), expoly.holes.end(), [](const Polygon &p) { return ! p.empty(); }); } // Collect the contours. - m_contours.assign(ncontours, nullptr); - ncontours = 0; - for (size_t i = 0; i < expolygons.size(); ++ i) { - const ExPolygon &expoly = expolygons[i]; - if (! expoly.contour.points.empty()) - m_contours[ncontours++] = &expoly.contour.points; - for (size_t j = 0; j < expoly.holes.size(); ++ j) - if (! expoly.holes[j].points.empty()) - m_contours[ncontours++] = &expoly.holes[j].points; + m_contours.reserve(ncontours); + for (const ExPolygon &expoly : expolygons) { + if (! expoly.contour.empty()) + m_contours.emplace_back(expoly.contour.points, false); + for (const Polygon &hole : expoly.holes) + if (! hole.empty()) + m_contours.emplace_back(hole.points, false); } create_from_m_contours(resolution); @@ -151,11 +147,13 @@ void EdgeGrid::Grid::create_from_m_contours(coord_t resolution) { assert(resolution > 0); // 1) Measure the bounding box. - for (size_t i = 0; i < m_contours.size(); ++ i) { - const Slic3r::Points &pts = *m_contours[i]; - for (size_t j = 0; j < pts.size(); ++ j) - m_bbox.merge(pts[j]); + for (const Contour &contour : m_contours) { + assert(contour.num_segments() > 0); + assert(*contour.begin() != contour.end()[-1]); + for (const Slic3r::Point &pt : contour) + m_bbox.merge(pt); } + coord_t eps = 16; m_bbox.min(0) -= eps; m_bbox.min(1) -= eps; @@ -170,11 +168,11 @@ void EdgeGrid::Grid::create_from_m_contours(coord_t resolution) // 3) First round of contour rasterization, count the edges per grid cell. for (size_t i = 0; i < m_contours.size(); ++ i) { - const Slic3r::Points &pts = *m_contours[i]; - for (size_t j = 0; j < pts.size(); ++ j) { + const Contour &contour = m_contours[i]; + for (size_t j = 0; j < contour.num_segments(); ++ j) { // End points of the line segment. - Slic3r::Point p1(pts[j]); - Slic3r::Point p2 = pts[(j + 1 == pts.size()) ? 0 : j + 1]; + Slic3r::Point p1(contour.segment_start(j)); + Slic3r::Point p2(contour.segment_end(j)); p1(0) -= m_bbox.min(0); p1(1) -= m_bbox.min(1); p2(0) -= m_bbox.min(0); @@ -333,9 +331,9 @@ void EdgeGrid::Grid::create_from_m_contours(coord_t resolution) assert(visitor.i == 0); for (; visitor.i < m_contours.size(); ++ visitor.i) { - const Slic3r::Points &pts = *m_contours[visitor.i]; - for (visitor.j = 0; visitor.j < pts.size(); ++ visitor.j) - this->visit_cells_intersecting_line(pts[visitor.j], pts[(visitor.j + 1 == pts.size()) ? 0 : visitor.j + 1], visitor); + const Contour &contour = m_contours[visitor.i]; + for (visitor.j = 0; visitor.j < contour.num_segments(); ++ visitor.j) + this->visit_cells_intersecting_line(contour.segment_start(visitor.j), contour.segment_end(visitor.j), visitor); } } @@ -701,11 +699,12 @@ void EdgeGrid::Grid::calculate_sdf() const Cell &cell = m_cells[r * m_cols + c]; // For each segment in the cell: for (size_t i = cell.begin; i != cell.end; ++ i) { - const Slic3r::Points &pts = *m_contours[m_cell_data[i].first]; + const Contour &contour = m_contours[m_cell_data[i].first]; + assert(contour.closed()); size_t ipt = m_cell_data[i].second; // End points of the line segment. - const Slic3r::Point &p1 = pts[ipt]; - const Slic3r::Point &p2 = pts[(ipt + 1 == pts.size()) ? 0 : ipt + 1]; + const Slic3r::Point &p1 = contour.segment_start(ipt); + const Slic3r::Point &p2 = contour.segment_end(ipt); // Segment vector const Slic3r::Point v_seg = p2 - p1; // l2 of v_seg @@ -729,7 +728,7 @@ void EdgeGrid::Grid::calculate_sdf() double dabs = sqrt(int64_t(v_pt(0)) * int64_t(v_pt(0)) + int64_t(v_pt(1)) * int64_t(v_pt(1))); if (dabs < d_min) { // Previous point. - const Slic3r::Point &p0 = pts[(ipt == 0) ? (pts.size() - 1) : ipt - 1]; + const Slic3r::Point &p0 = contour.segment_prev(ipt); Slic3r::Point v_seg_prev = p1 - p0; int64_t t2_pt = int64_t(v_seg_prev(0)) * int64_t(v_pt(0)) + int64_t(v_seg_prev(1)) * int64_t(v_pt(1)); if (t2_pt > 0) { @@ -1049,7 +1048,7 @@ float EdgeGrid::Grid::signed_distance_bilinear(const Point &pt) const return f; } -EdgeGrid::Grid::ClosestPointResult EdgeGrid::Grid::closest_point(const Point &pt, coord_t search_radius) const +EdgeGrid::Grid::ClosestPointResult EdgeGrid::Grid::closest_point_signed_distance(const Point &pt, coord_t search_radius) const { BoundingBox bbox; bbox.min = bbox.max = Point(pt(0) - m_bbox.min(0), pt(1) - m_bbox.min(1)); @@ -1088,12 +1087,13 @@ EdgeGrid::Grid::ClosestPointResult EdgeGrid::Grid::closest_point(const Point &pt for (int c = bbox.min(0); c <= bbox.max(0); ++ c) { const Cell &cell = m_cells[r * m_cols + c]; for (size_t i = cell.begin; i < cell.end; ++ i) { - const size_t contour_idx = m_cell_data[i].first; - const Slic3r::Points &pts = *m_contours[contour_idx]; + const size_t contour_idx = m_cell_data[i].first; + const Contour &contour = m_contours[contour_idx]; + assert(contour.closed()); size_t ipt = m_cell_data[i].second; // End points of the line segment. - const Slic3r::Point &p1 = pts[ipt]; - const Slic3r::Point &p2 = pts[(ipt + 1 == pts.size()) ? 0 : ipt + 1]; + const Slic3r::Point &p1 = contour.segment_start(ipt); + const Slic3r::Point &p2 = contour.segment_end(ipt); const Slic3r::Point v_seg = p2 - p1; const Slic3r::Point v_pt = pt - p1; // dot(p2-p1, pt-p1) @@ -1105,7 +1105,7 @@ EdgeGrid::Grid::ClosestPointResult EdgeGrid::Grid::closest_point(const Point &pt double dabs = sqrt(int64_t(v_pt(0)) * int64_t(v_pt(0)) + int64_t(v_pt(1)) * int64_t(v_pt(1))); if (dabs < d_min) { // Previous point. - const Slic3r::Point &p0 = pts[(ipt == 0) ? (pts.size() - 1) : ipt - 1]; + const Slic3r::Point &p0 = contour.segment_prev(ipt); Slic3r::Point v_seg_prev = p1 - p0; int64_t t2_pt = int64_t(v_seg_prev(0)) * int64_t(v_pt(0)) + int64_t(v_seg_prev(1)) * int64_t(v_pt(1)); if (t2_pt > 0) { @@ -1161,9 +1161,9 @@ EdgeGrid::Grid::ClosestPointResult EdgeGrid::Grid::closest_point(const Point &pt assert(result.t >= 0. && result.t <= 1.); #ifndef NDEBUG { - const Slic3r::Points &pts = *m_contours[result.contour_idx]; - const Slic3r::Point &p1 = pts[result.start_point_idx]; - const Slic3r::Point &p2 = pts[(result.start_point_idx + 1 == pts.size()) ? 0 : result.start_point_idx + 1]; + const Contour &contour = m_contours[result.contour_idx]; + const Slic3r::Point &p1 = contour.segment_start(result.start_point_idx); + const Slic3r::Point &p2 = contour.segment_end(result.start_point_idx); Vec2d vfoot; if (result.t == 0) vfoot = p1.cast() - pt.cast(); @@ -1217,11 +1217,12 @@ bool EdgeGrid::Grid::signed_distance_edges(const Point &pt, coord_t search_radiu for (int c = bbox.min(0); c <= bbox.max(0); ++ c) { const Cell &cell = m_cells[r * m_cols + c]; for (size_t i = cell.begin; i < cell.end; ++ i) { - const Slic3r::Points &pts = *m_contours[m_cell_data[i].first]; + const Contour &contour = m_contours[m_cell_data[i].first]; + assert(contour.closed()); size_t ipt = m_cell_data[i].second; // End points of the line segment. - const Slic3r::Point &p1 = pts[ipt]; - const Slic3r::Point &p2 = pts[(ipt + 1 == pts.size()) ? 0 : ipt + 1]; + const Slic3r::Point &p1 = contour.segment_start(ipt); + const Slic3r::Point &p2 = contour.segment_end(ipt); Slic3r::Point v_seg = p2 - p1; Slic3r::Point v_pt = pt - p1; // dot(p2-p1, pt-p1) @@ -1233,7 +1234,7 @@ bool EdgeGrid::Grid::signed_distance_edges(const Point &pt, coord_t search_radiu double dabs = sqrt(int64_t(v_pt(0)) * int64_t(v_pt(0)) + int64_t(v_pt(1)) * int64_t(v_pt(1))); if (dabs < d_min) { // Previous point. - const Slic3r::Point &p0 = pts[(ipt == 0) ? (pts.size() - 1) : ipt - 1]; + const Slic3r::Point &p0 = contour.segment_prev(ipt); Slic3r::Point v_seg_prev = p1 - p0; int64_t t2_pt = int64_t(v_seg_prev(0)) * int64_t(v_pt(0)) + int64_t(v_seg_prev(1)) * int64_t(v_pt(1)); if (t2_pt > 0) { @@ -1423,26 +1424,26 @@ std::vector> const Cell &cell = m_cells[r * m_cols + c]; // For each pair of segments in the cell: for (size_t i = cell.begin; i != cell.end; ++ i) { - const Slic3r::Points &ipts = *m_contours[m_cell_data[i].first]; + const Contour &icontour = m_contours[m_cell_data[i].first]; size_t ipt = m_cell_data[i].second; // End points of the line segment and their vector. - const Slic3r::Point &ip1 = ipts[ipt]; - const Slic3r::Point &ip2 = ipts[(ipt + 1 == ipts.size()) ? 0 : ipt + 1]; + const Slic3r::Point &ip1 = icontour.segment_start(ipt); + const Slic3r::Point &ip2 = icontour.segment_end(ipt); for (size_t j = i + 1; j != cell.end; ++ j) { - const Slic3r::Points &jpts = *m_contours[m_cell_data[j].first]; - size_t jpt = m_cell_data[j].second; + const Contour &jcontour = m_contours[m_cell_data[j].first]; + size_t jpt = m_cell_data[j].second; // End points of the line segment and their vector. - const Slic3r::Point &jp1 = jpts[jpt]; - const Slic3r::Point &jp2 = jpts[(jpt + 1 == jpts.size()) ? 0 : jpt + 1]; - if (&ipts == &jpts && (&ip1 == &jp2 || &jp1 == &ip2)) + const Slic3r::Point &jp1 = jcontour.segment_start(jpt); + const Slic3r::Point &jp2 = jcontour.segment_end(jpt); + if (&icontour == &jcontour && (&ip1 == &jp2 || &jp1 == &ip2)) // Segments of the same contour share a common vertex. continue; if (Geometry::segments_intersect(ip1, ip2, jp1, jp2)) { // The two segments intersect. Add them to the output. - int jfirst = (&jpts < &ipts) || (&jpts == &ipts && jpt < ipt); + int jfirst = (&jcontour < &icontour) || (&jcontour == &icontour && jpt < ipt); out.emplace_back(jfirst ? - std::make_pair(std::make_pair(&ipts, ipt), std::make_pair(&jpts, jpt)) : - std::make_pair(std::make_pair(&ipts, ipt), std::make_pair(&jpts, jpt))); + std::make_pair(std::make_pair(&icontour, ipt), std::make_pair(&jcontour, jpt)) : + std::make_pair(std::make_pair(&icontour, ipt), std::make_pair(&jcontour, jpt))); } } } @@ -1460,18 +1461,18 @@ bool EdgeGrid::Grid::has_intersecting_edges() const const Cell &cell = m_cells[r * m_cols + c]; // For each pair of segments in the cell: for (size_t i = cell.begin; i != cell.end; ++ i) { - const Slic3r::Points &ipts = *m_contours[m_cell_data[i].first]; + const Contour &icontour = m_contours[m_cell_data[i].first]; size_t ipt = m_cell_data[i].second; // End points of the line segment and their vector. - const Slic3r::Point &ip1 = ipts[ipt]; - const Slic3r::Point &ip2 = ipts[(ipt + 1 == ipts.size()) ? 0 : ipt + 1]; + const Slic3r::Point &ip1 = icontour.segment_start(ipt); + const Slic3r::Point &ip2 = icontour.segment_end(ipt); for (size_t j = i + 1; j != cell.end; ++ j) { - const Slic3r::Points &jpts = *m_contours[m_cell_data[j].first]; + const Contour &jcontour = m_contours[m_cell_data[j].first]; size_t jpt = m_cell_data[j].second; // End points of the line segment and their vector. - const Slic3r::Point &jp1 = jpts[jpt]; - const Slic3r::Point &jp2 = jpts[(jpt + 1 == jpts.size()) ? 0 : jpt + 1]; - if (! (&ipts == &jpts && (&ip1 == &jp2 || &jp1 == &ip2)) && + const Slic3r::Point &jp1 = jcontour.segment_start(jpt); + const Slic3r::Point &jp2 = jcontour.segment_end(jpt); + if (! (&icontour == &jcontour && (&ip1 == &jp2 || &jp1 == &ip2)) && Geometry::segments_intersect(ip1, ip2, jp1, jp2)) return true; } @@ -1483,8 +1484,8 @@ bool EdgeGrid::Grid::has_intersecting_edges() const void EdgeGrid::save_png(const EdgeGrid::Grid &grid, const BoundingBox &bbox, coord_t resolution, const char *path, size_t scale) { - unsigned int w = (bbox.max(0) - bbox.min(0) + resolution - 1) / resolution; - unsigned int h = (bbox.max(1) - bbox.min(1) + resolution - 1) / resolution; + coord_t w = (bbox.max(0) - bbox.min(0) + resolution - 1) / resolution; + coord_t h = (bbox.max(1) - bbox.min(1) + resolution - 1) / resolution; std::vector pixels(w * h * 3, 0); @@ -1606,22 +1607,27 @@ void export_intersections_to_svg(const std::string &filename, const Polygons &po SVG svg(filename.c_str(), bbox); svg.draw(union_ex(polygons), "gray", 0.25f); svg.draw_outline(polygons, "black"); - std::set intersecting_contours; + std::set intersecting_contours; for (const std::pair &ie : intersections) { intersecting_contours.insert(ie.first.first); intersecting_contours.insert(ie.second.first); } // Highlight the contours with intersections. coord_t line_width = coord_t(scale_(0.01)); - for (const Points *ic : intersecting_contours) { - svg.draw_outline(Polygon(*ic), "green"); - svg.draw_outline(Polygon(*ic), "black", line_width); + for (const EdgeGrid::Contour *ic : intersecting_contours) { + if (ic->open()) + svg.draw(Polyline(Points(ic->begin(), ic->end())), "green"); + else { + Polygon polygon(Points(ic->begin(), ic->end())); + svg.draw_outline(polygon, "green"); + svg.draw_outline(polygon, "black", line_width); + } } // Paint the intersections. for (const std::pair &intersecting_edges : intersections) { auto edge = [](const EdgeGrid::Grid::ContourEdge &e) { - return Line(e.first->at(e.second), - e.first->at((e.second + 1 == e.first->size()) ? 0 : e.second + 1)); + return Line(e.first->segment_start(e.second), + e.first->segment_end(e.second)); }; svg.draw(edge(intersecting_edges.first), "red", line_width); svg.draw(edge(intersecting_edges.second), "red", line_width); diff --git a/src/libslic3r/EdgeGrid.hpp b/src/libslic3r/EdgeGrid.hpp index c3bc869d4ae..42d8d92c2f8 100644 --- a/src/libslic3r/EdgeGrid.hpp +++ b/src/libslic3r/EdgeGrid.hpp @@ -12,22 +12,90 @@ namespace Slic3r { namespace EdgeGrid { + +class Contour { +public: + Contour() = default; + Contour(const Slic3r::Point *begin, const Slic3r::Point *end, bool open) : m_begin(begin), m_end(end), m_open(open) {} + Contour(const Slic3r::Point *data, size_t size, bool open) : Contour(data, data + size, open) {} + Contour(const std::vector &pts, bool open) : Contour(pts.data(), pts.size(), open) {} + + const Slic3r::Point *begin() const { return m_begin; } + const Slic3r::Point *end() const { return m_end; } + bool open() const { return m_open; } + bool closed() const { return ! m_open; } + + // Start point of a segment idx. + const Slic3r::Point& segment_start(size_t idx) const { + assert(idx < this->num_segments()); + return m_begin[idx]; + } + + // End point of a segment idx. + const Slic3r::Point& segment_end(size_t idx) const { + assert(idx < this->num_segments()); + const Slic3r::Point *ptr = m_begin + idx + 1; + return ptr == m_end ? *m_begin : *ptr; + } + + // Start point of a segment preceding idx. + const Slic3r::Point& segment_prev(size_t idx) const { + assert(idx < this->num_segments()); + assert(idx > 0 || ! m_open); + return idx == 0 ? m_end[-1] : m_begin[idx - 1]; + } + + // Index of a segment preceding idx. + const size_t segment_idx_prev(size_t idx) const { + assert(idx < this->num_segments()); + assert(idx > 0 || ! m_open); + return (idx == 0 ? this->size() : idx) - 1; + } + + // Index of a segment preceding idx. + const size_t segment_idx_next(size_t idx) const { + assert(idx < this->num_segments()); + ++ idx; + return m_begin + idx == m_end ? 0 : idx; + } + + size_t num_segments() const { return this->size() - (m_open ? 1 : 0); } + +private: + size_t size() const { return m_end - m_begin; } + + const Slic3r::Point *m_begin { nullptr }; + const Slic3r::Point *m_end { nullptr }; + bool m_open { false }; +}; + class Grid { public: - Grid(); + Grid() = default; + Grid(const BoundingBox &bbox) : m_bbox(bbox) {} ~Grid(); void set_bbox(const BoundingBox &bbox) { m_bbox = bbox; } + // Fill in the grid with open polylines or closed contours. + // If open flag is indicated, then polylines_or_polygons are considered to be open by default. + // Only if the first point of a polyline is equal to the last point of a polyline, + // then the polyline is considered to be closed and the last repeated point is removed when + // inserted into the EdgeGrid. + // Most of the Grid functions expect all the contours to be closed, you have been warned! + void create(const std::vector &polylines_or_polygons, coord_t resolution, bool open); + void create(const Polygons &polygons, const Polylines &polylines, coord_t resolution); + + // Fill in the grid with closed contours. void create(const Polygons &polygons, coord_t resolution); void create(const std::vector &polygons, coord_t resolution); - void create(const std::vector &polygons, coord_t resolution); + void create(const std::vector &polygons, coord_t resolution) { this->create(polygons, resolution, false); } void create(const ExPolygon &expoly, coord_t resolution); void create(const ExPolygons &expolygons, coord_t resolution); void create(const ExPolygonCollection &expolygons, coord_t resolution); - const std::vector& contours() const { return m_contours; } + const std::vector& contours() const { return m_contours; } #if 0 // Test, whether the edges inside the grid intersect with the polygons provided. @@ -44,12 +112,14 @@ class Grid // Fill in a rough m_signed_distance_field from the edge grid. // The rough SDF is used by signed_distance() for distances outside of the search_radius. + // Only call this function for closed contours! void calculate_sdf(); // Return an estimate of the signed distance based on m_signed_distance_field grid. float signed_distance_bilinear(const Point &pt) const; // Calculate a signed distance to the contours in search_radius from the point. + // Only call this function for closed contours! struct ClosestPointResult { size_t contour_idx = size_t(-1); size_t start_point_idx = size_t(-1); @@ -60,12 +130,14 @@ class Grid bool valid() const { return contour_idx != size_t(-1); } }; - ClosestPointResult closest_point(const Point &pt, coord_t search_radius) const; + ClosestPointResult closest_point_signed_distance(const Point &pt, coord_t search_radius) const; + // Only call this function for closed contours! bool signed_distance_edges(const Point &pt, coord_t search_radius, coordf_t &result_min_dist, bool *pon_segment = nullptr) const; // Calculate a signed distance to the contours in search_radius from the point. If no edge is found in search_radius, // return an interpolated value from m_signed_distance_field, if it exists. + // Only call this function for closed contours! bool signed_distance(const Point &pt, coord_t search_radius, coordf_t &result_min_dist) const; const BoundingBox& bbox() const { return m_bbox; } @@ -76,8 +148,8 @@ class Grid // For supports: Contours enclosing the rasterized edges. Polygons contours_simplified(coord_t offset, bool fill_holes) const; - typedef std::pair ContourPoint; - typedef std::pair ContourEdge; + typedef std::pair ContourPoint; + typedef std::pair ContourEdge; std::vector> intersecting_edges() const; bool has_intersecting_edges() const; @@ -88,10 +160,10 @@ class Grid assert(m_bbox.contains(p2)); p1 -= m_bbox.min; p2 -= m_bbox.min; - assert(p1.x() >= 0 && p1.x() < m_cols * m_resolution); - assert(p1.y() >= 0 && p1.y() < m_rows * m_resolution); - assert(p2.x() >= 0 && p2.x() < m_cols * m_resolution); - assert(p2.y() >= 0 && p2.y() < m_rows * m_resolution); + assert(p1.x() >= 0 && size_t(p1.x()) < m_cols * m_resolution); + assert(p1.y() >= 0 && size_t(p1.y()) < m_rows * m_resolution); + assert(p2.x() >= 0 && size_t(p2.x()) < m_cols * m_resolution); + assert(p2.y() >= 0 && size_t(p2.y()) < m_rows * m_resolution); // Get the cells of the end points. coord_t ix = p1(0) / m_resolution; coord_t iy = p1(1) / m_resolution; @@ -245,28 +317,26 @@ class Grid return; } - std::pair>::const_iterator, std::vector>::const_iterator> cell_data_range(coord_t row, coord_t col) const + std::pair>::const_iterator, std::vector>::const_iterator> cell_data_range(coord_t row, coord_t col) const { - assert(row >= 0); - assert(row < m_rows); - assert(col >= 0); - assert(col < m_cols); + assert(row >= 0 && size_t(row) < m_rows); + assert(col >= 0 && size_t(col) < m_cols); const EdgeGrid::Grid::Cell &cell = m_cells[row * m_cols + col]; return std::make_pair(m_cell_data.begin() + cell.begin, m_cell_data.begin() + cell.end); } std::pair segment(const std::pair &contour_and_segment_idx) const { - const Slic3r::Points &ipts = *m_contours[contour_and_segment_idx.first]; - size_t ipt = contour_and_segment_idx.second; - return std::pair(ipts[ipt], ipts[ipt + 1 == ipts.size() ? 0 : ipt + 1]); + const Contour &contour = m_contours[contour_and_segment_idx.first]; + size_t iseg = contour_and_segment_idx.second; + return std::pair(contour.segment_start(iseg), contour.segment_end(iseg)); } Line line(const std::pair &contour_and_segment_idx) const { - const Slic3r::Points &ipts = *m_contours[contour_and_segment_idx.first]; - size_t ipt = contour_and_segment_idx.second; - return Line(ipts[ipt], ipts[ipt + 1 == ipts.size() ? 0 : ipt + 1]); + const Contour &contour = m_contours[contour_and_segment_idx.first]; + size_t iseg = contour_and_segment_idx.second; + return Line(contour.segment_start(iseg), contour.segment_end(iseg)); } protected: @@ -297,13 +367,13 @@ class Grid BoundingBox m_bbox; // Grid dimensions. coord_t m_resolution; - size_t m_rows; - size_t m_cols; + size_t m_rows = 0; + size_t m_cols = 0; // Referencing the source contours. // This format allows one to work with any Slic3r fixed point contour format // (Polygon, ExPolygon, ExPolygonCollection etc). - std::vector m_contours; + std::vector m_contours; // Referencing a contour and a line segment of m_contours. std::vector > m_cell_data; diff --git a/src/libslic3r/ElephantFootCompensation.cpp b/src/libslic3r/ElephantFootCompensation.cpp index 1e50ade5abe..9610582f776 100644 --- a/src/libslic3r/ElephantFootCompensation.cpp +++ b/src/libslic3r/ElephantFootCompensation.cpp @@ -104,7 +104,7 @@ std::vector contour_distance(const EdgeGrid::Grid &grid, const size_t idx double param_hi; double param_end = resampled_point_parameters.back().curve_parameter; { - const Slic3r::Points &ipts = *grid.contours()[it_contour_and_segment->first]; + const EdgeGrid::Contour &contour = grid.contours()[it_contour_and_segment->first]; size_t ipt = it_contour_and_segment->second; ResampledPoint key(ipt, false, 0.); auto lower = [](const ResampledPoint& l, const ResampledPoint r) { return l.idx_src < r.idx_src || (l.idx_src == r.idx_src && int(l.interpolated) > int(r.interpolated)); }; @@ -112,7 +112,7 @@ std::vector contour_distance(const EdgeGrid::Grid &grid, const size_t idx assert(it != resampled_point_parameters.end() && it->idx_src == ipt && ! it->interpolated); double t2 = cross2(dir, vptpt2) / denom; assert(t2 > - EPSILON && t2 < 1. + EPSILON); - if (++ ipt == ipts.size()) + if (contour.begin() + (++ ipt) == contour.end()) param_hi = t2 * dir2.norm(); else param_hi = it->curve_parameter + t2 * dir2.norm(); @@ -251,7 +251,7 @@ std::vector contour_distance2(const EdgeGrid::Grid &grid, const size_t id #endif struct Visitor { Visitor(const EdgeGrid::Grid &grid, const size_t idx_contour, const std::vector &resampled_point_parameters, double dist_same_contour_accept, double dist_same_contour_reject) : - grid(grid), idx_contour(idx_contour), contour(*grid.contours()[idx_contour]), resampled_point_parameters(resampled_point_parameters), dist_same_contour_accept(dist_same_contour_accept), dist_same_contour_reject(dist_same_contour_reject) {} + grid(grid), idx_contour(idx_contour), contour(grid.contours()[idx_contour]), resampled_point_parameters(resampled_point_parameters), dist_same_contour_accept(dist_same_contour_accept), dist_same_contour_reject(dist_same_contour_reject) {} void init(const Points &contour, const Point &apoint) { this->idx_point = &apoint - contour.data(); @@ -283,15 +283,15 @@ std::vector contour_distance2(const EdgeGrid::Grid &grid, const size_t id double param_lo = resampled_point_parameters[this->idx_point].curve_parameter; double param_hi; double param_end = resampled_point_parameters.back().curve_parameter; - const Slic3r::Points &ipts = *grid.contours()[it_contour_and_segment->first]; - const size_t ipt = it_contour_and_segment->second; + const EdgeGrid::Contour &contour = grid.contours()[it_contour_and_segment->first]; + const size_t ipt = it_contour_and_segment->second; { ResampledPoint key(ipt, false, 0.); auto lower = [](const ResampledPoint& l, const ResampledPoint r) { return l.idx_src < r.idx_src || (l.idx_src == r.idx_src && int(l.interpolated) > int(r.interpolated)); }; auto it = std::lower_bound(resampled_point_parameters.begin(), resampled_point_parameters.end(), key, lower); assert(it != resampled_point_parameters.end() && it->idx_src == ipt && ! it->interpolated); param_hi = t * sqrt(l2); - if (ipt + 1 < ipts.size()) + if (contour.begin() + ipt + 1 < contour.end()) param_hi += it->curve_parameter; } if (param_lo > param_hi) @@ -307,9 +307,9 @@ std::vector contour_distance2(const EdgeGrid::Grid &grid, const size_t id // Bulge is estimated by 0.6 of the circle circumference drawn around the bisector. // Test whether the contour is convex or concave. bool inside = - (t == 0.) ? this->inside_corner(ipts, ipt, this->point) : - (t == 1.) ? this->inside_corner(ipts, ipt + 1 == ipts.size() ? 0 : ipt + 1, this->point) : - this->left_of_segment(ipts, ipt, this->point); + (t == 0.) ? this->inside_corner(contour, ipt, this->point) : + (t == 1.) ? this->inside_corner(contour, contour.segment_idx_next(ipt), this->point) : + this->left_of_segment(contour, ipt, this->point); accept = inside && dist_along_contour > 0.6 * M_PI * dist; } } @@ -329,7 +329,7 @@ std::vector contour_distance2(const EdgeGrid::Grid &grid, const size_t id const EdgeGrid::Grid &grid; const size_t idx_contour; - const Points &contour; + const EdgeGrid::Contour &contour; const std::vector &resampled_point_parameters; const double dist_same_contour_accept; const double dist_same_contour_reject; @@ -358,24 +358,28 @@ std::vector contour_distance2(const EdgeGrid::Grid &grid, const size_t id return Vec2d(- v.y(), v.x()); } - static bool inside_corner(const Slic3r::Points &contour, size_t i, const Point &pt_oposite) { - const Vec2d pt = pt_oposite.cast(); - size_t iprev = prev_idx_modulo(i, contour); - size_t inext = next_idx_modulo(i, contour); - Vec2d v1 = (contour[i] - contour[iprev]).cast(); - Vec2d v2 = (contour[inext] - contour[i]).cast(); - bool left_of_v1 = cross2(v1, pt - contour[iprev].cast()) > 0.; - bool left_of_v2 = cross2(v2, pt - contour[i ].cast()) > 0.; - return cross2(v1, v2) > 0 ? - left_of_v1 && left_of_v2 : // convex corner - left_of_v1 || left_of_v2; // concave corner - } - static bool left_of_segment(const Slic3r::Points &contour, size_t i, const Point &pt_oposite) { - const Vec2d pt = pt_oposite.cast(); - size_t inext = next_idx_modulo(i, contour); - Vec2d v = (contour[inext] - contour[i]).cast(); - return cross2(v, pt - contour[i].cast()) > 0.; - } + static bool inside_corner(const EdgeGrid::Contour &contour, size_t i, const Point &pt_oposite) + { + const Vec2d pt = pt_oposite.cast(); + const Point &pt_prev = contour.segment_prev(i); + const Point &pt_this = contour.segment_start(i); + const Point &pt_next = contour.segment_end(i); + Vec2d v1 = (pt_this - pt_prev).cast(); + Vec2d v2 = (pt_next - pt_this).cast(); + bool left_of_v1 = cross2(v1, pt - pt_prev.cast()) > 0.; + bool left_of_v2 = cross2(v2, pt - pt_this.cast()) > 0.; + return cross2(v1, v2) > 0 ? left_of_v1 && left_of_v2 : // convex corner + left_of_v1 || left_of_v2; // concave corner + } + + static bool left_of_segment(const EdgeGrid::Contour &contour, size_t i, const Point &pt_oposite) + { + const Vec2d pt = pt_oposite.cast(); + const Point &pt_this = contour.segment_start(i); + const Point &pt_next = contour.segment_end(i); + Vec2d v = (pt_next - pt_this).cast(); + return cross2(v, pt - pt_this.cast()) > 0.; + } } visitor(grid, idx_contour, resampled_point_parameters, 0.5 * compensation * M_PI, search_radius); out.reserve(contour.size()); diff --git a/src/libslic3r/ExPolygon.cpp b/src/libslic3r/ExPolygon.cpp index 02cc126a38b..12bfa3b3535 100644 --- a/src/libslic3r/ExPolygon.cpp +++ b/src/libslic3r/ExPolygon.cpp @@ -80,6 +80,13 @@ bool ExPolygon::is_valid() const return true; } +void ExPolygon::douglas_peucker(double tolerance) +{ + this->contour.douglas_peucker(tolerance); + for (Polygon &poly : this->holes) + poly.douglas_peucker(tolerance); +} + bool ExPolygon::contains(const Line &line) const { return this->contains(Polyline(line.a, line.b)); @@ -132,8 +139,7 @@ ExPolygon::has_boundary_point(const Point &point) const return false; } -bool -ExPolygon::overlaps(const ExPolygon &other) const +bool ExPolygon::overlaps(const ExPolygon &other) const { #if 0 BoundingBox bbox = get_extents(other); @@ -150,6 +156,7 @@ ExPolygon::overlaps(const ExPolygon &other) const #endif if (! pl_out.empty()) return true; + //FIXME ExPolygon::overlaps() shall be commutative, it is not! return ! other.contour.points.empty() && this->contains_b(other.contour.points.front()); } diff --git a/src/libslic3r/ExPolygon.hpp b/src/libslic3r/ExPolygon.hpp index b4651abc231..20d0ffa7dad 100644 --- a/src/libslic3r/ExPolygon.hpp +++ b/src/libslic3r/ExPolygon.hpp @@ -49,6 +49,7 @@ class ExPolygon double area() const; bool empty() const { return contour.points.empty(); } bool is_valid() const; + void douglas_peucker(double tolerance); // Contains the line / polyline / polylines etc COMPLETELY. bool contains(const Line &line) const; @@ -249,6 +250,24 @@ inline Polygons to_polygons(ExPolygons &&src) return polygons; } +inline ExPolygons to_expolygons(const Polygons &polys) +{ + ExPolygons ex_polys; + ex_polys.assign(polys.size(), ExPolygon()); + for (size_t idx = 0; idx < polys.size(); ++idx) + ex_polys[idx].contour = polys[idx]; + return ex_polys; +} + +inline ExPolygons to_expolygons(Polygons &&polys) +{ + ExPolygons ex_polys; + ex_polys.assign(polys.size(), ExPolygon()); + for (size_t idx = 0; idx < polys.size(); ++idx) + ex_polys[idx].contour = std::move(polys[idx]); + return ex_polys; +} + inline void polygons_append(Polygons &dst, const ExPolygon &src) { dst.reserve(dst.size() + src.holes.size() + 1); diff --git a/src/libslic3r/ExtrusionEntity.hpp b/src/libslic3r/ExtrusionEntity.hpp index 6b0153b2ead..9b972f211e5 100644 --- a/src/libslic3r/ExtrusionEntity.hpp +++ b/src/libslic3r/ExtrusionEntity.hpp @@ -343,6 +343,25 @@ inline void extrusion_entities_append_loops(ExtrusionEntitiesPtr &dst, Polygons loops.clear(); } +inline void extrusion_entities_append_loops_and_paths(ExtrusionEntitiesPtr &dst, Polylines &&polylines, ExtrusionRole role, double mm3_per_mm, float width, float height) +{ + dst.reserve(dst.size() + polylines.size()); + for (Polyline &polyline : polylines) { + if (polyline.is_valid()) { + if (polyline.is_closed()) { + ExtrusionPath extrusion_path(role, mm3_per_mm, width, height); + extrusion_path.polyline = std::move(polyline); + dst.emplace_back(new ExtrusionLoop(std::move(extrusion_path))); + } else { + ExtrusionPath *extrusion_path = new ExtrusionPath(role, mm3_per_mm, width, height); + extrusion_path->polyline = std::move(polyline); + dst.emplace_back(extrusion_path); + } + } + } + polylines.clear(); +} + } #endif diff --git a/src/libslic3r/Fill/Fill.cpp b/src/libslic3r/Fill/Fill.cpp index 6dbfa18fae3..18e03e0058c 100644 --- a/src/libslic3r/Fill/Fill.cpp +++ b/src/libslic3r/Fill/Fill.cpp @@ -512,7 +512,6 @@ void Layer::make_ironing() }; std::vector by_extruder; - bool extruder_dont_care = this->object()->config().wipe_into_objects; double default_layer_height = this->object()->config().layer_height; for (LayerRegion *layerm : m_regions) diff --git a/src/libslic3r/Fill/FillAdaptive.cpp b/src/libslic3r/Fill/FillAdaptive.cpp index 520124533d5..d8c05887ece 100644 --- a/src/libslic3r/Fill/FillAdaptive.cpp +++ b/src/libslic3r/Fill/FillAdaptive.cpp @@ -160,66 +160,66 @@ bool triangle_AABB_intersects(const Vector &a, const Vector &b, const Vector &c, return true; } -static double dist2_to_triangle(const Vec3d &a, const Vec3d &b, const Vec3d &c, const Vec3d &p) -{ - double out = std::numeric_limits::max(); - const Vec3d v1 = b - a; - auto l1 = v1.squaredNorm(); - const Vec3d v2 = c - b; - auto l2 = v2.squaredNorm(); - const Vec3d v3 = a - c; - auto l3 = v3.squaredNorm(); - - // Is the triangle valid? - if (l1 > 0. && l2 > 0. && l3 > 0.) - { - // 1) Project point into the plane of the triangle. - const Vec3d n = v1.cross(v2); - double d = (p - a).dot(n); - const Vec3d foot_pt = p - n * d / n.squaredNorm(); - - // 2) Maximum projection of n. - int proj_axis; - n.array().cwiseAbs().maxCoeff(&proj_axis); - - // 3) Test whether the foot_pt is inside the triangle. - { - auto inside_triangle = [](const Vec2d& v1, const Vec2d& v2, const Vec2d& v3, const Vec2d& pt) { - const double d1 = cross2(v1, pt); - const double d2 = cross2(v2, pt); - const double d3 = cross2(v3, pt); - // Testing both CCW and CW orientations. - return (d1 >= 0. && d2 >= 0. && d3 >= 0.) || (d1 <= 0. && d2 <= 0. && d3 <= 0.); - }; - bool inside; - switch (proj_axis) { - case 0: - inside = inside_triangle({v1.y(), v1.z()}, {v2.y(), v2.z()}, {v3.y(), v3.z()}, {foot_pt.y(), foot_pt.z()}); break; - case 1: - inside = inside_triangle({v1.z(), v1.x()}, {v2.z(), v2.x()}, {v3.z(), v3.x()}, {foot_pt.z(), foot_pt.x()}); break; - default: - assert(proj_axis == 2); - inside = inside_triangle({v1.x(), v1.y()}, {v2.x(), v2.y()}, {v3.x(), v3.y()}, {foot_pt.x(), foot_pt.y()}); break; - } - if (inside) - return (p - foot_pt).squaredNorm(); - } - - // 4) Find minimum distance to triangle vertices and edges. - out = std::min((p - a).squaredNorm(), std::min((p - b).squaredNorm(), (p - c).squaredNorm())); - auto t = (p - a).dot(v1); - if (t > 0. && t < l1) - out = std::min(out, (a + v1 * (t / l1) - p).squaredNorm()); - t = (p - b).dot(v2); - if (t > 0. && t < l2) - out = std::min(out, (b + v2 * (t / l2) - p).squaredNorm()); - t = (p - c).dot(v3); - if (t > 0. && t < l3) - out = std::min(out, (c + v3 * (t / l3) - p).squaredNorm()); - } - - return out; -} +// static double dist2_to_triangle(const Vec3d &a, const Vec3d &b, const Vec3d &c, const Vec3d &p) +// { +// double out = std::numeric_limits::max(); +// const Vec3d v1 = b - a; +// auto l1 = v1.squaredNorm(); +// const Vec3d v2 = c - b; +// auto l2 = v2.squaredNorm(); +// const Vec3d v3 = a - c; +// auto l3 = v3.squaredNorm(); + +// // Is the triangle valid? +// if (l1 > 0. && l2 > 0. && l3 > 0.) +// { +// // 1) Project point into the plane of the triangle. +// const Vec3d n = v1.cross(v2); +// double d = (p - a).dot(n); +// const Vec3d foot_pt = p - n * d / n.squaredNorm(); + +// // 2) Maximum projection of n. +// int proj_axis; +// n.array().cwiseAbs().maxCoeff(&proj_axis); + +// // 3) Test whether the foot_pt is inside the triangle. +// { +// auto inside_triangle = [](const Vec2d& v1, const Vec2d& v2, const Vec2d& v3, const Vec2d& pt) { +// const double d1 = cross2(v1, pt); +// const double d2 = cross2(v2, pt); +// const double d3 = cross2(v3, pt); +// // Testing both CCW and CW orientations. +// return (d1 >= 0. && d2 >= 0. && d3 >= 0.) || (d1 <= 0. && d2 <= 0. && d3 <= 0.); +// }; +// bool inside; +// switch (proj_axis) { +// case 0: +// inside = inside_triangle({v1.y(), v1.z()}, {v2.y(), v2.z()}, {v3.y(), v3.z()}, {foot_pt.y(), foot_pt.z()}); break; +// case 1: +// inside = inside_triangle({v1.z(), v1.x()}, {v2.z(), v2.x()}, {v3.z(), v3.x()}, {foot_pt.z(), foot_pt.x()}); break; +// default: +// assert(proj_axis == 2); +// inside = inside_triangle({v1.x(), v1.y()}, {v2.x(), v2.y()}, {v3.x(), v3.y()}, {foot_pt.x(), foot_pt.y()}); break; +// } +// if (inside) +// return (p - foot_pt).squaredNorm(); +// } + +// // 4) Find minimum distance to triangle vertices and edges. +// out = std::min((p - a).squaredNorm(), std::min((p - b).squaredNorm(), (p - c).squaredNorm())); +// auto t = (p - a).dot(v1); +// if (t > 0. && t < l1) +// out = std::min(out, (a + v1 * (t / l1) - p).squaredNorm()); +// t = (p - b).dot(v2); +// if (t > 0. && t < l2) +// out = std::min(out, (b + v2 * (t / l2) - p).squaredNorm()); +// t = (p - c).dot(v3); +// if (t > 0. && t < l3) +// out = std::min(out, (c + v3 * (t / l3) - p).squaredNorm()); +// } + +// return out; +// } // Ordering of children cubes. static const std::array child_centers { @@ -690,7 +690,8 @@ static void add_hook( // Trim the hook start by the infill line it will connect to. Point hook_start; - bool intersection_found = intersection.intersect_line->intersection( + + [[maybe_unused]] bool intersection_found = intersection.intersect_line->intersection( create_offset_line(*intersection.closest_line, intersection, scaled_offset), &hook_start); assert(intersection_found); @@ -703,7 +704,7 @@ static void add_hook( Vector hook_vector = ((hook_length + 1.16 * scaled_trim_distance) * hook_vector_norm).cast(); Line hook_forward(hook_start, hook_start + hook_vector); - auto filter_itself = [&intersection, &lines_src](const auto &item) { return item.second != intersection.intersect_line - lines_src.data(); }; + auto filter_itself = [&intersection, &lines_src](const auto &item) { return item.second != (long unsigned int)(intersection.intersect_line - lines_src.data()); }; std::vector> hook_intersections; rtree.query(bgi::intersects(mk_rtree_seg(hook_forward)) && bgi::satisfies(filter_itself), std::back_inserter(hook_intersections)); @@ -1178,7 +1179,8 @@ static Polylines connect_lines_using_hooks(Polylines &&lines, const ExPolygon &b rtree.query( bgi::intersects(mk_rtree_seg(first_i_point, nearest_i_point)) && bgi::satisfies([&first_i, &nearest_i, &lines_src](const auto &item) - { return item.second != first_i.intersect_line - lines_src.data() && item.second != nearest_i.intersect_line - lines_src.data(); }), + { return item.second != (long unsigned int)(first_i.intersect_line - lines_src.data()) + && item.second != (long unsigned int)(nearest_i.intersect_line - lines_src.data()); }), std::back_inserter(closest)); could_connect = closest.empty(); #if 0 @@ -1252,7 +1254,7 @@ static Polylines connect_lines_using_hooks(Polylines &&lines, const ExPolygon &b } #ifdef ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT ++ iStep; -#endif ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT +#endif // ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT first_i.used = true; } } @@ -1410,15 +1412,15 @@ void Filler::_fill_surface_single( #endif /* ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT */ } -static double bbox_max_radius(const BoundingBoxf3 &bbox, const Vec3d ¢er) -{ - const auto p = (bbox.min - center); - const auto s = bbox.size(); - double r2max = 0.; - for (int i = 0; i < 8; ++ i) - r2max = std::max(r2max, (p + Vec3d(s.x() * double(i & 1), s.y() * double(i & 2), s.z() * double(i & 4))).squaredNorm()); - return sqrt(r2max); -} +//static double bbox_max_radius(const BoundingBoxf3 &bbox, const Vec3d ¢er) +//{ +// const auto p = (bbox.min - center); +// const auto s = bbox.size(); +// double r2max = 0.; +// for (int i = 0; i < 8; ++ i) +// r2max = std::max(r2max, (p + Vec3d(s.x() * double(i & 1), s.y() * double(i & 2), s.z() * double(i & 4))).squaredNorm()); +// return sqrt(r2max); +//} static std::vector make_cubes_properties(double max_cube_edge_length, double line_spacing) { @@ -1513,8 +1515,10 @@ void Octree::insert_triangle(const Vec3d &a, const Vec3d &b, const Vec3d &c, Cub assert(current_cube); assert(depth > 0); + --depth; + // Squared radius of a sphere around the child cube. - const double r2_cube = Slic3r::sqr(0.5 * this->cubes_properties[-- depth].height + EPSILON); + // const double r2_cube = Slic3r::sqr(0.5 * this->cubes_properties[depth].height + EPSILON); for (size_t i = 0; i < 8; ++ i) { const Vec3d &child_center_dir = child_centers[i]; @@ -1532,6 +1536,7 @@ void Octree::insert_triangle(const Vec3d &a, const Vec3d &b, const Vec3d &c, Cub } Vec3d child_center = current_cube->center + (child_center_dir * (this->cubes_properties[depth].edge_length / 2.)); //if (dist2_to_triangle(a, b, c, child_center) < r2_cube) { + // dist2_to_triangle and r2_cube are commented out too. if (triangle_AABB_intersects(a, b, c, bbox)) { if (! current_cube->children[i]) current_cube->children[i] = this->pool.construct(child_center); diff --git a/src/libslic3r/Fill/FillAdaptive.hpp b/src/libslic3r/Fill/FillAdaptive.hpp index 330cb8a46ae..0578cc3e1b8 100644 --- a/src/libslic3r/Fill/FillAdaptive.hpp +++ b/src/libslic3r/Fill/FillAdaptive.hpp @@ -59,7 +59,7 @@ class Filler : public Slic3r::Fill ~Filler() override {} protected: - Fill* clone() const override { return new Filler(*this); }; + Fill* clone() const override { return new Filler(*this); } void _fill_surface_single( const FillParams ¶ms, unsigned int thickness_layers, @@ -73,7 +73,7 @@ class Filler : public Slic3r::Fill bool no_sort() const override { return false; } }; -}; // namespace FillAdaptive +} // namespace FillAdaptive } // namespace Slic3r #endif // slic3r_FillAdaptive_hpp_ diff --git a/src/libslic3r/Fill/FillBase.cpp b/src/libslic3r/Fill/FillBase.cpp index 20d32f3e28c..6ebc6023c46 100644 --- a/src/libslic3r/Fill/FillBase.cpp +++ b/src/libslic3r/Fill/FillBase.cpp @@ -1129,7 +1129,7 @@ void Fill::connect_infill(Polylines &&infill_ordered, const std::vectorsecond / 2]; const Point &pt = (it->second & 1) ? infill_line.points.back() : infill_line.points.front(); -#ifndef NDEBUG - { - const Vec2d pt1 = ipt.cast(); - const Vec2d pt2 = (idx_point + 1 == contour_src.size() ? contour_src.points.front() : contour_src.points[idx_point + 1]).cast(); - const Vec2d ptx = lerp(pt1, pt2, it->first.t); - assert(std::abs(pt.x() - pt.x()) < SCALED_EPSILON); - assert(std::abs(pt.y() - pt.y()) < SCALED_EPSILON); - } -#endif // NDEBUG +//#ifndef NDEBUG +// { +// const Vec2d pt1 = ipt.cast(); +// const Vec2d pt2 = (idx_point + 1 == contour_src.size() ? contour_src.points.front() : contour_src.points[idx_point + 1]).cast(); +// const Vec2d ptx = lerp(pt1, pt2, it->first.t); +// assert(std::abs(ptx.x() - pt.x()) < SCALED_EPSILON); +// assert(std::abs(ptx.y() - pt.y()) < SCALED_EPSILON); +// } +//#endif // NDEBUG size_t idx_tjoint_pt = 0; if (idx_point + 1 < contour_src.size() || pt != contour_dst.front()) { if (pt != contour_dst.back()) @@ -1261,8 +1261,6 @@ void Fill::connect_infill(Polylines &&infill_ordered, const std::vector connections_sorted; connections_sorted.reserve(infill_ordered.size() * 2 - 2); for (size_t idx_chain = 1; idx_chain < infill_ordered.size(); ++ idx_chain) { - const Polyline &pl1 = infill_ordered[idx_chain - 1]; - const Polyline &pl2 = infill_ordered[idx_chain]; const ContourIntersectionPoint *cp1 = &map_infill_end_point_to_boundary[(idx_chain - 1) * 2 + 1]; const ContourIntersectionPoint *cp2 = &map_infill_end_point_to_boundary[idx_chain * 2]; if (cp1->contour_idx != boundary_idx_unconnected && cp1->contour_idx == cp2->contour_idx) { @@ -1396,7 +1394,6 @@ void Fill::connect_infill(Polylines &&infill_ordered, const std::vector &contour_params = boundary_params[contour_point.contour_idx]; - const size_t contour_pt_idx = contour_point.point_idx; double lprev = contour_point.could_connect_prev() ? path_length_along_contour_ccw(contour_point.prev_on_contour, &contour_point, contour_params.back()) : diff --git a/src/libslic3r/Fill/FillPlanePath.cpp b/src/libslic3r/Fill/FillPlanePath.cpp index a7a33b13d79..7beaf2f08e9 100644 --- a/src/libslic3r/Fill/FillPlanePath.cpp +++ b/src/libslic3r/Fill/FillPlanePath.cpp @@ -101,9 +101,9 @@ Pointfs FillArchimedeanChords::_generate(coord_t min_x, coord_t min_y, coord_t m // static inline Point hilbert_n_to_xy(const size_t n) { - static const int next_state[16] = { 4,0,0,12, 0,4,4,8, 12,8,8,4, 8,12,12,0 }; - static const int digit_to_x[16] = { 0,1,1,0, 0,0,1,1, 1,0,0,1, 1,1,0,0 }; - static const int digit_to_y[16] = { 0,0,1,1, 0,1,1,0, 1,1,0,0, 1,0,0,1 }; + static constexpr const int next_state[16] { 4,0,0,12, 0,4,4,8, 12,8,8,4, 8,12,12,0 }; + static constexpr const int digit_to_x[16] { 0,1,1,0, 0,0,1,1, 1,0,0,1, 1,1,0,0 }; + static constexpr const int digit_to_y[16] { 0,0,1,1, 0,1,1,0, 1,1,0,0, 1,0,0,1 }; // Number of 2 bit digits. size_t ndigits = 0; diff --git a/src/libslic3r/Fill/FillRectilinear.cpp b/src/libslic3r/Fill/FillRectilinear.cpp index f8393cf36e6..d6e400837e4 100644 --- a/src/libslic3r/Fill/FillRectilinear.cpp +++ b/src/libslic3r/Fill/FillRectilinear.cpp @@ -515,8 +515,7 @@ static inline bool intersection_on_prev_next_vertical_line_valid( const SegmentedIntersectionLine &vline_other = segs[side == SegmentIntersection::Side::Right ? (iVerticalLine + 1) : (iVerticalLine - 1)]; const SegmentIntersection &it_other = vline_other.intersections[iIntersectionOther]; assert(it_other.is_inner()); - assert(iIntersectionOther > 0); - assert(iIntersectionOther + 1 < vline_other.intersections.size()); + assert(iIntersectionOther > 0 && size_t(iIntersectionOther + 1) < vline_other.intersections.size()); // Is iIntersectionOther at the boundary of a vertical segment? const SegmentIntersection &it_other2 = vline_other.intersections[it_other.is_low() ? iIntersectionOther - 1 : iIntersectionOther + 1]; if (it_other2.is_inner()) @@ -1176,8 +1175,7 @@ static void pinch_contours_insert_phony_outer_intersections(std::vectortype == SegmentIntersection::OUTER_LOW); ++ it; } else { - auto lo = it; - assert(lo->type == SegmentIntersection::INNER_LOW); + assert(it->type == SegmentIntersection::INNER_LOW); auto hi = ++ it; assert(hi->type == SegmentIntersection::INNER_HIGH); auto lo2 = ++ it; @@ -1186,11 +1184,11 @@ static void pinch_contours_insert_phony_outer_intersections(std::vectorvertical_up(); int dn = lo2->vertical_down(); -#ifndef _NDEBUG + assert(up == -1 || up > 0); assert(dn == -1 || dn >= 0); assert((up == -1 && dn == -1) || (dn + 1 == up)); -#endif // _NDEBUG + bool pinched = dn + 1 != up; if (pinched) { // hi is not connected with its inner contour to lo2. @@ -1267,10 +1265,6 @@ static const SegmentIntersection& end_of_vertical_run_raw(const SegmentIntersect } return *it; } -static SegmentIntersection& end_of_vertical_run_raw(SegmentIntersection &start) -{ - return const_cast(end_of_vertical_run_raw(std::as_const(start))); -} // Find the last INNER_HIGH intersection starting with INNER_LOW, that is followed by OUTER_HIGH intersection, traversing vertical up contours if enabled. // Such intersection shall always exist. @@ -1383,7 +1377,7 @@ static void traverse_graph_generate_polylines( bool try_connect = false; if (going_up) { assert(! it->consumed_vertical_up); - assert(i_intersection + 1 < vline.intersections.size()); + assert(size_t(i_intersection + 1) < vline.intersections.size()); // Step back to the beginning of the vertical segment to mark it as consumed. if (it->is_inner()) { assert(i_intersection > 0); @@ -1395,7 +1389,7 @@ static void traverse_graph_generate_polylines( it->consumed_vertical_up = true; ++ it; ++ i_intersection; - assert(i_intersection < vline.intersections.size()); + assert(size_t(i_intersection) < vline.intersections.size()); } while (it->type != SegmentIntersection::OUTER_HIGH); if ((it - 1)->is_inner()) { // Step back. @@ -1815,7 +1809,7 @@ static std::vector generate_montonous_regions(std::vector ®ions, con map_intersection_to_region_end.emplace_back(&segs[region.right.vline].intersections[region.right.low], ®ion); } auto intersections_lower = [](const MapType &l, const MapType &r){ return l.first < r.first ; }; - auto intersections_equal = [](const MapType &l, const MapType &r){ return l.first == r.first ; }; - std::sort(map_intersection_to_region_start.begin(), map_intersection_to_region_start.end(), intersections_lower); + std::sort(map_intersection_to_region_start.begin(), map_intersection_to_region_start.end(), intersections_lower); std::sort(map_intersection_to_region_end.begin(), map_intersection_to_region_end.end(), intersections_lower); // Scatter links to neighboring regions. @@ -2185,15 +2178,15 @@ static std::vector chain_monotonic_regions( float best_path_length = std::numeric_limits::max(); struct NextCandidate { - MonotonicRegion *region; + MonotonicRegion *region = nullptr; AntPath *link; AntPath *link_flipped; float probability; - bool dir; + bool dir = false; }; std::vector next_candidates; - auto validate_unprocessed = + [[maybe_unused]]auto validate_unprocessed = #ifdef NDEBUG []() { return true; }; #else @@ -2222,7 +2215,7 @@ static std::vector chain_monotonic_regions( } else { // Some left neihgbor should not be processed yet. assert(left_neighbors_unprocessed[i] > 1); - size_t num_predecessors_unprocessed = 0; + int32_t num_predecessors_unprocessed = 0; bool has_left_last_on_path = false; for (const MonotonicRegion* left : region.left_neighbors) { size_t iprev = left - regions.data(); @@ -2290,8 +2283,7 @@ static std::vector chain_monotonic_regions( NextCandidate next_candidate; next_candidate.probability = 0; for (MonotonicRegion *next : region.right_neighbors) { - int &unprocessed = left_neighbors_unprocessed[next - regions.data()]; - assert(unprocessed > 1); + assert(left_neighbors_unprocessed[next - regions.data()] > 1); if (left_neighbors_unprocessed[next - regions.data()] == 2) { // Dependencies of the successive blocks are satisfied. AntPath &path1 = path_matrix(region, dir, *next, false); @@ -2325,6 +2317,7 @@ static std::vector chain_monotonic_regions( queue.pop_back(); } // Extend the path. + assert(next_candidate.region); MonotonicRegion *next_region = next_candidate.region; bool next_dir = next_candidate.dir; total_length += next_region->length(next_dir) + path_matrix(*path_end.region, path_end.flipped, *next_region, next_dir).length; @@ -2844,8 +2837,6 @@ bool FillRectilinear::fill_surface_by_multilines(const Surface *surface, FillPar coord_t line_spacing = coord_t(scale_(this->spacing) / params.density); std::pair rotate_vector = this->_infill_direction(surface); for (const SweepParams &sweep : sweep_params) { - size_t n_fill_lines_initial = fill_lines.size(); - // Rotate polygons so that we can work with vertical lines here double angle = rotate_vector.first + sweep.angle_base; ExPolygonWithOffset poly_with_offset(poly_with_offset_base, - angle); diff --git a/src/libslic3r/Fill/FillRectilinear.hpp b/src/libslic3r/Fill/FillRectilinear.hpp index 0686fa166a5..692fba2bd1f 100644 --- a/src/libslic3r/Fill/FillRectilinear.hpp +++ b/src/libslic3r/Fill/FillRectilinear.hpp @@ -12,7 +12,7 @@ class Surface; class FillRectilinear : public Fill { public: - Fill* clone() const override { return new FillRectilinear(*this); }; + Fill* clone() const override { return new FillRectilinear(*this); } ~FillRectilinear() override = default; Polylines fill_surface(const Surface *surface, const FillParams ¶ms) override; @@ -32,18 +32,18 @@ class FillRectilinear : public Fill class FillAlignedRectilinear : public FillRectilinear { public: - Fill* clone() const override { return new FillAlignedRectilinear(*this); }; + Fill* clone() const override { return new FillAlignedRectilinear(*this); } ~FillAlignedRectilinear() override = default; protected: // Always generate infill at the same angle. - virtual float _layer_angle(size_t idx) const { return 0.f; } + virtual float _layer_angle(size_t idx) const override { return 0.f; } }; class FillMonotonic : public FillRectilinear { public: - Fill* clone() const override { return new FillMonotonic(*this); }; + Fill* clone() const override { return new FillMonotonic(*this); } ~FillMonotonic() override = default; Polylines fill_surface(const Surface *surface, const FillParams ¶ms) override; bool no_sort() const override { return true; } @@ -52,7 +52,7 @@ class FillMonotonic : public FillRectilinear class FillGrid : public FillRectilinear { public: - Fill* clone() const override { return new FillGrid(*this); }; + Fill* clone() const override { return new FillGrid(*this); } ~FillGrid() override = default; Polylines fill_surface(const Surface *surface, const FillParams ¶ms) override; @@ -64,7 +64,7 @@ class FillGrid : public FillRectilinear class FillTriangles : public FillRectilinear { public: - Fill* clone() const override { return new FillTriangles(*this); }; + Fill* clone() const override { return new FillTriangles(*this); } ~FillTriangles() override = default; Polylines fill_surface(const Surface *surface, const FillParams ¶ms) override; @@ -76,7 +76,7 @@ class FillTriangles : public FillRectilinear class FillStars : public FillRectilinear { public: - Fill* clone() const override { return new FillStars(*this); }; + Fill* clone() const override { return new FillStars(*this); } ~FillStars() override = default; Polylines fill_surface(const Surface *surface, const FillParams ¶ms) override; @@ -88,7 +88,7 @@ class FillStars : public FillRectilinear class FillCubic : public FillRectilinear { public: - Fill* clone() const override { return new FillCubic(*this); }; + Fill* clone() const override { return new FillCubic(*this); } ~FillCubic() override = default; Polylines fill_surface(const Surface *surface, const FillParams ¶ms) override; @@ -98,6 +98,6 @@ class FillCubic : public FillRectilinear }; -}; // namespace Slic3r +} // namespace Slic3r #endif // slic3r_FillRectilinear_hpp_ diff --git a/src/libslic3r/Format/3mf.cpp b/src/libslic3r/Format/3mf.cpp index d021f0f6d2e..c9f11086442 100644 --- a/src/libslic3r/Format/3mf.cpp +++ b/src/libslic3r/Format/3mf.cpp @@ -21,6 +21,8 @@ #include #include #include +#include +#include #include #include @@ -31,6 +33,12 @@ namespace pt = boost::property_tree; #include #include "miniz_extension.hpp" +// Slightly faster than sprintf("%.9g"), but there is an issue with the karma floating point formatter, +// https://github.com/boostorg/spirit/pull/586 +// where the exported string is one digit shorter than it should be to guarantee lossless round trip. +// The code is left here for the ocasion boost guys improve. +#define EXPORT_3MF_USE_SPIRIT_KARMA_FP 0 + // VERSION NUMBERS // 0 : .3mf, files saved by older slic3r or other applications. No version definition in them. // 1 : Introduction of 3mf versioning. No other change in data saved into 3mf files. @@ -116,7 +124,6 @@ const char* VALID_OBJECT_TYPES[] = "model" }; -const unsigned int INVALID_OBJECT_TYPES_COUNT = 4; const char* INVALID_OBJECT_TYPES[] = { "solidsupport", @@ -137,8 +144,7 @@ const char* get_attribute_value_charptr(const char** attributes, unsigned int at if ((attributes == nullptr) || (attributes_size == 0) || (attributes_size % 2 != 0) || (attribute_key == nullptr)) return nullptr; - for (unsigned int a = 0; a < attributes_size; a += 2) - { + for (unsigned int a = 0; a < attributes_size; a += 2) { if (::strcmp(attributes[a], attribute_key) == 0) return attributes[a + 1]; } @@ -191,10 +197,8 @@ Slic3r::Transform3d get_transform_from_3mf_specs_string(const std::string& mat_s unsigned int i = 0; // matrices are stored into 3mf files as 4x3 // we need to transpose them - for (unsigned int c = 0; c < 4; ++c) - { - for (unsigned int r = 0; r < 3; ++r) - { + for (unsigned int c = 0; c < 4; ++c) { + for (unsigned int r = 0; r < 3; ++r) { ret(r, c) = ::atof(mat_elements_str[i++].c_str()); } } @@ -226,8 +230,7 @@ bool is_valid_object_type(const std::string& type) if (type.empty()) return true; - for (unsigned int i = 0; i < VALID_OBJECT_TYPES_COUNT; ++i) - { + for (unsigned int i = 0; i < VALID_OBJECT_TYPES_COUNT; ++i) { if (::strcmp(type.c_str(), VALID_OBJECT_TYPES[i]) == 0) return true; } @@ -255,9 +258,7 @@ namespace Slic3r { void log_errors() { for (const std::string& error : m_errors) - { - printf("%s\n", error.c_str()); - } + BOOST_LOG_TRIVIAL(error) << error; } }; @@ -290,13 +291,9 @@ namespace Slic3r { std::vector custom_supports; std::vector custom_seam; - bool empty() - { - return vertices.empty() || triangles.empty(); - } + bool empty() { return vertices.empty() || triangles.empty(); } - void reset() - { + void reset() { vertices.clear(); triangles.clear(); custom_supports.clear(); @@ -314,13 +311,9 @@ namespace Slic3r { ModelObject* object; ComponentsList components; - CurrentObject() - { - reset(); - } + CurrentObject() { reset(); } - void reset() - { + void reset() { id = -1; model_object_idx = -1; geometry.reset(); @@ -398,6 +391,10 @@ namespace Slic3r { bool m_check_version; XML_Parser m_xml_parser; + // Error code returned by the application side of the parser. In that case the expat may not reliably deliver the error state + // after returning from XML_Parse() function, thus we keep the error state here. + bool m_parse_error { false }; + std::string m_parse_error_message; Model* m_model; float m_unit_factor; CurrentObject m_curr_object; @@ -423,7 +420,16 @@ namespace Slic3r { private: void _destroy_xml_parser(); - void _stop_xml_parser(); + void _stop_xml_parser(const std::string& msg = std::string()); + + bool parse_error() const { return m_parse_error; } + const char* parse_error_message() const { + return m_parse_error ? + // The error was signalled by the user code, not the expat parser. + (m_parse_error_message.empty() ? "Invalid 3MF format" : m_parse_error_message.c_str()) : + // The error was signalled by the expat parser. + XML_ErrorString(XML_GetErrorCode(m_xml_parser)); + } bool _load_model_from_file(const std::string& filename, Model& model, DynamicPrintConfig& config); bool _extract_model_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat); @@ -556,17 +562,20 @@ namespace Slic3r { void _3MF_Importer::_destroy_xml_parser() { - if (m_xml_parser != nullptr) - { + if (m_xml_parser != nullptr) { XML_ParserFree(m_xml_parser); m_xml_parser = nullptr; } } - void _3MF_Importer::_stop_xml_parser() + void _3MF_Importer::_stop_xml_parser(const std::string &msg) { - if (m_xml_parser != nullptr) - XML_StopParser(m_xml_parser, false); + assert(! m_parse_error); + assert(m_parse_error_message.empty()); + assert(m_xml_parser != nullptr); + m_parse_error = true; + m_parse_error_message = msg; + XML_StopParser(m_xml_parser, false); } bool _3MF_Importer::_load_model_from_file(const std::string& filename, Model& model, DynamicPrintConfig& config) @@ -586,20 +595,16 @@ namespace Slic3r { m_name = boost::filesystem::path(filename).filename().stem().string(); // we first loop the entries to read from the archive the .model file only, in order to extract the version from it - for (mz_uint i = 0; i < num_entries; ++i) - { - if (mz_zip_reader_file_stat(&archive, i, &stat)) - { + for (mz_uint i = 0; i < num_entries; ++i) { + if (mz_zip_reader_file_stat(&archive, i, &stat)) { std::string name(stat.m_filename); std::replace(name.begin(), name.end(), '\\', '/'); - if (boost::algorithm::istarts_with(name, MODEL_FOLDER) && boost::algorithm::iends_with(name, MODEL_EXTENSION)) - { + if (boost::algorithm::istarts_with(name, MODEL_FOLDER) && boost::algorithm::iends_with(name, MODEL_EXTENSION)) { try { // valid model name -> extract model - if (!_extract_model_from_archive(archive, stat)) - { + if (!_extract_model_from_archive(archive, stat)) { close_zip_reader(&archive); add_error("Archive does not contain a valid model"); return false; @@ -616,48 +621,38 @@ namespace Slic3r { } // we then loop again the entries to read other files stored in the archive - for (mz_uint i = 0; i < num_entries; ++i) - { - if (mz_zip_reader_file_stat(&archive, i, &stat)) - { + for (mz_uint i = 0; i < num_entries; ++i) { + if (mz_zip_reader_file_stat(&archive, i, &stat)) { std::string name(stat.m_filename); std::replace(name.begin(), name.end(), '\\', '/'); - if (boost::algorithm::iequals(name, LAYER_HEIGHTS_PROFILE_FILE)) - { + if (boost::algorithm::iequals(name, LAYER_HEIGHTS_PROFILE_FILE)) { // extract slic3r layer heights profile file _extract_layer_heights_profile_config_from_archive(archive, stat); } - if (boost::algorithm::iequals(name, LAYER_CONFIG_RANGES_FILE)) - { + else if (boost::algorithm::iequals(name, LAYER_CONFIG_RANGES_FILE)) { // extract slic3r layer config ranges file _extract_layer_config_ranges_from_archive(archive, stat); } - else if (boost::algorithm::iequals(name, SLA_SUPPORT_POINTS_FILE)) - { + else if (boost::algorithm::iequals(name, SLA_SUPPORT_POINTS_FILE)) { // extract sla support points file _extract_sla_support_points_from_archive(archive, stat); } - else if (boost::algorithm::iequals(name, SLA_DRAIN_HOLES_FILE)) - { + else if (boost::algorithm::iequals(name, SLA_DRAIN_HOLES_FILE)) { // extract sla support points file _extract_sla_drain_holes_from_archive(archive, stat); } - else if (boost::algorithm::iequals(name, PRINT_CONFIG_FILE)) - { + else if (boost::algorithm::iequals(name, PRINT_CONFIG_FILE)) { // extract slic3r print config file _extract_print_config_from_archive(archive, stat, config, filename); } - if (boost::algorithm::iequals(name, CUSTOM_GCODE_PER_PRINT_Z_FILE)) - { + else if (boost::algorithm::iequals(name, CUSTOM_GCODE_PER_PRINT_Z_FILE)) { // extract slic3r layer config ranges file _extract_custom_gcode_per_print_z_from_archive(archive, stat); } - else if (boost::algorithm::iequals(name, MODEL_CONFIG_FILE)) - { + else if (boost::algorithm::iequals(name, MODEL_CONFIG_FILE)) { // extract slic3r model config file - if (!_extract_model_config_from_archive(archive, stat, model)) - { + if (!_extract_model_config_from_archive(archive, stat, model)) { close_zip_reader(&archive); add_error("Archive does not contain a valid model config"); return false; @@ -668,15 +663,57 @@ namespace Slic3r { close_zip_reader(&archive); - for (const IdToModelObjectMap::value_type& object : m_objects) - { - ModelObject *model_object = m_model->objects[object.second]; - ObjectMetadata::VolumeMetadataList volumes; - ObjectMetadata::VolumeMetadataList* volumes_ptr = nullptr; +#if ENABLE_RELOAD_FROM_DISK_FOR_3MF + if (m_version == 0) { + // if the 3mf was not produced by PrusaSlicer and there is more than one instance, + // split the object in as many objects as instances + size_t curr_models_count = m_model->objects.size(); + size_t i = 0; + while (i < curr_models_count) { + ModelObject* model_object = m_model->objects[i]; + if (model_object->instances.size() > 1) { + // select the geometry associated with the original model object + const Geometry* geometry = nullptr; + for (const IdToModelObjectMap::value_type& object : m_objects) { + if (object.second == int(i)) { + IdToGeometryMap::const_iterator obj_geometry = m_geometries.find(object.first); + if (obj_geometry == m_geometries.end()) { + add_error("Unable to find object geometry"); + return false; + } + geometry = &obj_geometry->second; + break; + } + } + if (geometry == nullptr) { + add_error("Unable to find object geometry"); + return false; + } + + // use the geometry to create the volumes in the new model objects + ObjectMetadata::VolumeMetadataList volumes(1, { 0, (unsigned int)geometry->triangles.size() / 3 - 1 }); + + // for each instance after the 1st, create a new model object containing only that instance + // and copy into it the geometry + while (model_object->instances.size() > 1) { + ModelObject* new_model_object = m_model->add_object(*model_object); + new_model_object->clear_instances(); + new_model_object->add_instance(*model_object->instances.back()); + model_object->delete_last_instance(); + if (!_generate_volumes(*new_model_object, *geometry, volumes)) + return false; + } + } + ++i; + } + } +#endif // ENABLE_RELOAD_FROM_DISK_FOR_3MF + + for (const IdToModelObjectMap::value_type& object : m_objects) { + ModelObject* model_object = m_model->objects[object.second]; IdToGeometryMap::const_iterator obj_geometry = m_geometries.find(object.first); - if (obj_geometry == m_geometries.end()) - { + if (obj_geometry == m_geometries.end()) { add_error("Unable to find object geometry"); return false; } @@ -697,20 +734,21 @@ namespace Slic3r { model_object->sla_support_points = std::move(obj_sla_support_points->second); model_object->sla_points_status = sla::PointsStatus::UserModified; } - + IdToSlaDrainHolesMap::iterator obj_drain_holes = m_sla_drain_holes.find(object.second + 1); if (obj_drain_holes != m_sla_drain_holes.end() && !obj_drain_holes->second.empty()) { model_object->sla_drain_holes = std::move(obj_drain_holes->second); } + ObjectMetadata::VolumeMetadataList volumes; + ObjectMetadata::VolumeMetadataList* volumes_ptr = nullptr; + IdToMetadataMap::iterator obj_metadata = m_objects_metadata.find(object.first); - if (obj_metadata != m_objects_metadata.end()) - { + if (obj_metadata != m_objects_metadata.end()) { // config data has been found, this model was saved using slic3r pe // apply object's name and config data - for (const Metadata& metadata : obj_metadata->second.metadata) - { + for (const Metadata& metadata : obj_metadata->second.metadata) { if (metadata.key == "name") model_object->name = metadata.value; else @@ -720,8 +758,7 @@ namespace Slic3r { // select object's detected volumes volumes_ptr = &obj_metadata->second.volumes; } - else - { + else { // config data not found, this model was not saved using slic3r pe // add the entire geometry as the single volume to generate @@ -735,6 +772,24 @@ namespace Slic3r { return false; } +#if ENABLE_RELOAD_FROM_DISK_FOR_3MF + int object_idx = 0; + for (ModelObject* o : model.objects) { + int volume_idx = 0; + for (ModelVolume* v : o->volumes) { + if (v->source.input_file.empty() && v->type() == ModelVolumeType::MODEL_PART) { + v->source.input_file = filename; + if (v->source.volume_idx == -1) + v->source.volume_idx = volume_idx; + if (v->source.object_idx == -1) + v->source.object_idx = object_idx; + } + ++volume_idx; + } + ++object_idx; + } +#endif // ENABLE_RELOAD_FROM_DISK_FOR_3MF + // // fixes the min z of the model if negative // model.adjust_min_z(); @@ -743,8 +798,7 @@ namespace Slic3r { bool _3MF_Importer::_extract_model_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat) { - if (stat.m_uncomp_size == 0) - { + if (stat.m_uncomp_size == 0) { add_error("Found invalid size"); return false; } @@ -752,8 +806,7 @@ namespace Slic3r { _destroy_xml_parser(); m_xml_parser = XML_ParserCreate(nullptr); - if (m_xml_parser == nullptr) - { + if (m_xml_parser == nullptr) { add_error("Unable to create parser"); return false; } @@ -765,12 +818,13 @@ namespace Slic3r { struct CallbackData { XML_Parser& parser; + _3MF_Importer& importer; const mz_zip_archive_file_stat& stat; - CallbackData(XML_Parser& parser, const mz_zip_archive_file_stat& stat) : parser(parser), stat(stat) {} + CallbackData(XML_Parser& parser, _3MF_Importer& importer, const mz_zip_archive_file_stat& stat) : parser(parser), importer(importer), stat(stat) {} }; - CallbackData data(m_xml_parser, stat); + CallbackData data(m_xml_parser, *this, stat); mz_bool res = 0; @@ -778,10 +832,9 @@ namespace Slic3r { { res = mz_zip_reader_extract_file_to_callback(&archive, stat.m_filename, [](void* pOpaque, mz_uint64 file_ofs, const void* pBuf, size_t n)->size_t { CallbackData* data = (CallbackData*)pOpaque; - if (!XML_Parse(data->parser, (const char*)pBuf, (int)n, (file_ofs + n == data->stat.m_uncomp_size) ? 1 : 0)) - { + if (!XML_Parse(data->parser, (const char*)pBuf, (int)n, (file_ofs + n == data->stat.m_uncomp_size) ? 1 : 0) || data->importer.parse_error()) { char error_buf[1024]; - ::sprintf(error_buf, "Error (%s) while parsing '%s' at line %d", XML_ErrorString(XML_GetErrorCode(data->parser)), data->stat.m_filename, (int)XML_GetCurrentLineNumber(data->parser)); + ::sprintf(error_buf, "Error (%s) while parsing '%s' at line %d", data->importer.parse_error_message(), data->stat.m_filename, (int)XML_GetCurrentLineNumber(data->parser)); throw Slic3r::FileIOError(error_buf); } @@ -799,8 +852,7 @@ namespace Slic3r { return false; } - if (res == 0) - { + if (res == 0) { add_error("Error while extracting model data from zip archive"); return false; } @@ -810,12 +862,10 @@ namespace Slic3r { void _3MF_Importer::_extract_print_config_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat, DynamicPrintConfig& config, const std::string& archive_filename) { - if (stat.m_uncomp_size > 0) - { + if (stat.m_uncomp_size > 0) { std::string buffer((size_t)stat.m_uncomp_size, 0); mz_bool res = mz_zip_reader_extract_file_to_mem(&archive, stat.m_filename, (void*)buffer.data(), (size_t)stat.m_uncomp_size, 0); - if (res == 0) - { + if (res == 0) { add_error("Error while reading config data to buffer"); return; } @@ -825,12 +875,10 @@ namespace Slic3r { void _3MF_Importer::_extract_layer_heights_profile_config_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat) { - if (stat.m_uncomp_size > 0) - { + if (stat.m_uncomp_size > 0) { std::string buffer((size_t)stat.m_uncomp_size, 0); mz_bool res = mz_zip_reader_extract_file_to_mem(&archive, stat.m_filename, (void*)buffer.data(), (size_t)stat.m_uncomp_size, 0); - if (res == 0) - { + if (res == 0) { add_error("Error while reading layer heights profile data to buffer"); return; } @@ -841,42 +889,36 @@ namespace Slic3r { std::vector objects; boost::split(objects, buffer, boost::is_any_of("\n"), boost::token_compress_off); - for (const std::string& object : objects) - { + for (const std::string& object : objects) { std::vector object_data; boost::split(object_data, object, boost::is_any_of("|"), boost::token_compress_off); - if (object_data.size() != 2) - { + if (object_data.size() != 2) { add_error("Error while reading object data"); continue; } std::vector object_data_id; boost::split(object_data_id, object_data[0], boost::is_any_of("="), boost::token_compress_off); - if (object_data_id.size() != 2) - { + if (object_data_id.size() != 2) { add_error("Error while reading object id"); continue; } int object_id = std::atoi(object_data_id[1].c_str()); - if (object_id == 0) - { + if (object_id == 0) { add_error("Found invalid object id"); continue; } IdToLayerHeightsProfileMap::iterator object_item = m_layer_heights_profiles.find(object_id); - if (object_item != m_layer_heights_profiles.end()) - { + if (object_item != m_layer_heights_profiles.end()) { add_error("Found duplicated layer heights profile"); continue; } std::vector object_data_profile; boost::split(object_data_profile, object_data[1], boost::is_any_of(";"), boost::token_compress_off); - if ((object_data_profile.size() <= 4) || (object_data_profile.size() % 2 != 0)) - { + if (object_data_profile.size() <= 4 || object_data_profile.size() % 2 != 0) { add_error("Found invalid layer heights profile"); continue; } @@ -884,20 +926,18 @@ namespace Slic3r { std::vector profile; profile.reserve(object_data_profile.size()); - for (const std::string& value : object_data_profile) - { + for (const std::string& value : object_data_profile) { profile.push_back((coordf_t)std::atof(value.c_str())); } - m_layer_heights_profiles.insert(IdToLayerHeightsProfileMap::value_type(object_id, profile)); + m_layer_heights_profiles.insert({ object_id, profile }); } } } void _3MF_Importer::_extract_layer_config_ranges_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat) { - if (stat.m_uncomp_size > 0) - { + if (stat.m_uncomp_size > 0) { std::string buffer((size_t)stat.m_uncomp_size, 0); mz_bool res = mz_zip_reader_extract_file_to_mem(&archive, stat.m_filename, (void*)buffer.data(), (size_t)stat.m_uncomp_size, 0); if (res == 0) { @@ -909,8 +949,7 @@ namespace Slic3r { pt::ptree objects_tree; pt::read_xml(iss, objects_tree); - for (const auto& object : objects_tree.get_child("objects")) - { + for (const auto& object : objects_tree.get_child("objects")) { pt::ptree object_tree = object.second; int obj_idx = object_tree.get(".id", -1); if (obj_idx <= 0) { @@ -926,8 +965,7 @@ namespace Slic3r { t_layer_config_ranges config_ranges; - for (const auto& range : object_tree) - { + for (const auto& range : object_tree) { if (range.first != "range") continue; pt::ptree range_tree = range.second; @@ -937,8 +975,7 @@ namespace Slic3r { // get Z range information DynamicPrintConfig config; - for (const auto& option : range_tree) - { + for (const auto& option : range_tree) { if (option.first != "option") continue; std::string opt_key = option.second.get(".opt_key"); @@ -951,19 +988,17 @@ namespace Slic3r { } if (!config_ranges.empty()) - m_layer_config_ranges.insert(IdToLayerConfigRangesMap::value_type(obj_idx, std::move(config_ranges))); + m_layer_config_ranges.insert({ obj_idx, std::move(config_ranges) }); } } } void _3MF_Importer::_extract_sla_support_points_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat) { - if (stat.m_uncomp_size > 0) - { + if (stat.m_uncomp_size > 0) { std::string buffer((size_t)stat.m_uncomp_size, 0); mz_bool res = mz_zip_reader_extract_file_to_mem(&archive, stat.m_filename, (void*)buffer.data(), (size_t)stat.m_uncomp_size, 0); - if (res == 0) - { + if (res == 0) { add_error("Error while reading sla support points data to buffer"); return; } @@ -983,35 +1018,30 @@ namespace Slic3r { objects.erase(objects.begin()); // pop the header } - for (const std::string& object : objects) - { + for (const std::string& object : objects) { std::vector object_data; boost::split(object_data, object, boost::is_any_of("|"), boost::token_compress_off); - if (object_data.size() != 2) - { + if (object_data.size() != 2) { add_error("Error while reading object data"); continue; } std::vector object_data_id; boost::split(object_data_id, object_data[0], boost::is_any_of("="), boost::token_compress_off); - if (object_data_id.size() != 2) - { + if (object_data_id.size() != 2) { add_error("Error while reading object id"); continue; } int object_id = std::atoi(object_data_id[1].c_str()); - if (object_id == 0) - { + if (object_id == 0) { add_error("Found invalid object id"); continue; } IdToSlaSupportPointsMap::iterator object_item = m_sla_support_points.find(object_id); - if (object_item != m_sla_support_points.end()) - { + if (object_item != m_sla_support_points.end()) { add_error("Found duplicated SLA support points"); continue; } @@ -1040,19 +1070,17 @@ namespace Slic3r { } if (!sla_support_points.empty()) - m_sla_support_points.insert(IdToSlaSupportPointsMap::value_type(object_id, sla_support_points)); + m_sla_support_points.insert({ object_id, sla_support_points }); } } } void _3MF_Importer::_extract_sla_drain_holes_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat) { - if (stat.m_uncomp_size > 0) - { + if (stat.m_uncomp_size > 0) { std::string buffer(size_t(stat.m_uncomp_size), 0); mz_bool res = mz_zip_reader_extract_file_to_mem(&archive, stat.m_filename, (void*)buffer.data(), (size_t)stat.m_uncomp_size, 0); - if (res == 0) - { + if (res == 0) { add_error("Error while reading sla support points data to buffer"); return; } @@ -1072,35 +1100,30 @@ namespace Slic3r { objects.erase(objects.begin()); // pop the header } - for (const std::string& object : objects) - { + for (const std::string& object : objects) { std::vector object_data; boost::split(object_data, object, boost::is_any_of("|"), boost::token_compress_off); - if (object_data.size() != 2) - { + if (object_data.size() != 2) { add_error("Error while reading object data"); continue; } std::vector object_data_id; boost::split(object_data_id, object_data[0], boost::is_any_of("="), boost::token_compress_off); - if (object_data_id.size() != 2) - { + if (object_data_id.size() != 2) { add_error("Error while reading object id"); continue; } int object_id = std::atoi(object_data_id[1].c_str()); - if (object_id == 0) - { + if (object_id == 0) { add_error("Found invalid object id"); continue; } IdToSlaDrainHolesMap::iterator object_item = m_sla_drain_holes.find(object_id); - if (object_item != m_sla_drain_holes.end()) - { + if (object_item != m_sla_drain_holes.end()) { add_error("Found duplicated SLA drain holes"); continue; } @@ -1132,17 +1155,14 @@ namespace Slic3r { } if (!sla_drain_holes.empty()) - m_sla_drain_holes.insert(IdToSlaDrainHolesMap::value_type(object_id, sla_drain_holes)); + m_sla_drain_holes.insert({ object_id, sla_drain_holes }); } } } - - bool _3MF_Importer::_extract_model_config_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat, Model& model) { - if (stat.m_uncomp_size == 0) - { + if (stat.m_uncomp_size == 0) { add_error("Found invalid size"); return false; } @@ -1150,8 +1170,7 @@ namespace Slic3r { _destroy_xml_parser(); m_xml_parser = XML_ParserCreate(nullptr); - if (m_xml_parser == nullptr) - { + if (m_xml_parser == nullptr) { add_error("Unable to create parser"); return false; } @@ -1160,21 +1179,18 @@ namespace Slic3r { XML_SetElementHandler(m_xml_parser, _3MF_Importer::_handle_start_config_xml_element, _3MF_Importer::_handle_end_config_xml_element); void* parser_buffer = XML_GetBuffer(m_xml_parser, (int)stat.m_uncomp_size); - if (parser_buffer == nullptr) - { + if (parser_buffer == nullptr) { add_error("Unable to create buffer"); return false; } mz_bool res = mz_zip_reader_extract_file_to_mem(&archive, stat.m_filename, parser_buffer, (size_t)stat.m_uncomp_size, 0); - if (res == 0) - { + if (res == 0) { add_error("Error while reading config data to buffer"); return false; } - if (!XML_ParseBuffer(m_xml_parser, (int)stat.m_uncomp_size, 1)) - { + if (!XML_ParseBuffer(m_xml_parser, (int)stat.m_uncomp_size, 1)) { char error_buf[1024]; ::sprintf(error_buf, "Error (%s) while parsing xml file at line %d", XML_ErrorString(XML_GetErrorCode(m_xml_parser)), (int)XML_GetCurrentLineNumber(m_xml_parser)); add_error(error_buf); @@ -1186,8 +1202,7 @@ namespace Slic3r { void _3MF_Importer::_extract_custom_gcode_per_print_z_from_archive(::mz_zip_archive &archive, const mz_zip_archive_file_stat &stat) { - if (stat.m_uncomp_size > 0) - { + if (stat.m_uncomp_size > 0) { std::string buffer((size_t)stat.m_uncomp_size, 0); mz_bool res = mz_zip_reader_extract_file_to_mem(&archive, stat.m_filename, (void*)buffer.data(), (size_t)stat.m_uncomp_size, 0); if (res == 0) { @@ -1205,10 +1220,8 @@ namespace Slic3r { m_model->custom_gcode_per_print_z.gcodes.clear(); - for (const auto& code : code_tree) - { - if (code.first == "mode") - { + for (const auto& code : code_tree) { + if (code.first == "mode") { pt::ptree tree = code.second; std::string mode = tree.get(".value"); m_model->custom_gcode_per_print_z.mode = mode == CustomGCode::SingleExtruderMode ? CustomGCode::Mode::SingleExtruder : @@ -1225,8 +1238,8 @@ namespace Slic3r { CustomGCode::Type type; std::string extra; - if (tree.find("type") == tree.not_found()) - { + pt::ptree attr_tree = tree.find("")->second; + if (attr_tree.find("type") == attr_tree.not_found()) { // It means that data was saved in old version (2.2.0 and older) of PrusaSlicer // read old data ... std::string gcode = tree.get (".gcode"); @@ -1237,8 +1250,7 @@ namespace Slic3r { extra = type == CustomGCode::PausePrint ? color : type == CustomGCode::Custom ? gcode : ""; } - else - { + else { type = static_cast(tree.get(".type")); extra = tree.get(".extra"); } @@ -1379,25 +1391,17 @@ namespace Slic3r { bool _3MF_Importer::_handle_end_model() { // deletes all non-built or non-instanced objects - for (const IdToModelObjectMap::value_type& object : m_objects) - { + for (const IdToModelObjectMap::value_type& object : m_objects) { ModelObject *model_object = m_model->objects[object.second]; - if ((model_object != nullptr) && (model_object->instances.size() == 0)) + if (model_object != nullptr && model_object->instances.size() == 0) m_model->delete_object(model_object); } // applies instances' matrices - for (Instance& instance : m_instances) - { - if (instance.instance != nullptr) - { - ModelObject* object = instance.instance->get_object(); - if (object != nullptr) - { - // apply the transform to the instance - _apply_transform(*instance.instance, instance.transform); - } - } + for (Instance& instance : m_instances) { + if (instance.instance != nullptr && instance.instance->get_object() != nullptr) + // apply the transform to the instance + _apply_transform(*instance.instance, instance.transform); } return true; @@ -1420,13 +1424,11 @@ namespace Slic3r { // reset current data m_curr_object.reset(); - if (is_valid_object_type(get_attribute_value_string(attributes, num_attributes, TYPE_ATTR))) - { + if (is_valid_object_type(get_attribute_value_string(attributes, num_attributes, TYPE_ATTR))) { // create new object (it may be removed later if no instances are generated from it) m_curr_object.model_object_idx = (int)m_model->objects.size(); m_curr_object.object = m_model->add_object(); - if (m_curr_object.object == nullptr) - { + if (m_curr_object.object == nullptr) { add_error("Unable to create object"); return false; } @@ -1444,16 +1446,13 @@ namespace Slic3r { bool _3MF_Importer::_handle_end_object() { - if (m_curr_object.object != nullptr) - { - if (m_curr_object.geometry.empty()) - { + if (m_curr_object.object != nullptr) { + if (m_curr_object.geometry.empty()) { // no geometry defined // remove the object from the model m_model->delete_object(m_curr_object.object); - if (m_curr_object.components.empty()) - { + if (m_curr_object.components.empty()) { // no components defined -> invalid object, delete it IdToModelObjectMap::iterator object_item = m_objects.find(m_curr_object.id); if (object_item != m_objects.end()) @@ -1465,21 +1464,18 @@ namespace Slic3r { } else // adds components to aliases - m_objects_aliases.insert(IdToAliasesMap::value_type(m_curr_object.id, m_curr_object.components)); + m_objects_aliases.insert({ m_curr_object.id, m_curr_object.components }); } - else - { + else { // geometry defined, store it for later use - m_geometries.insert(IdToGeometryMap::value_type(m_curr_object.id, std::move(m_curr_object.geometry))); + m_geometries.insert({ m_curr_object.id, std::move(m_curr_object.geometry) }); // stores the object for later use - if (m_objects.find(m_curr_object.id) == m_objects.end()) - { - m_objects.insert(IdToModelObjectMap::value_type(m_curr_object.id, m_curr_object.model_object_idx)); - m_objects_aliases.insert(IdToAliasesMap::value_type(m_curr_object.id, ComponentsList(1, Component(m_curr_object.id)))); // aliases itself + if (m_objects.find(m_curr_object.id) == m_objects.end()) { + m_objects.insert({ m_curr_object.id, m_curr_object.model_object_idx }); + m_objects_aliases.insert({ m_curr_object.id, { 1, Component(m_curr_object.id) } }); // aliases itself } - else - { + else { add_error("Found object with duplicate id"); return false; } @@ -1589,11 +1585,9 @@ namespace Slic3r { Transform3d transform = get_transform_from_3mf_specs_string(get_attribute_value_string(attributes, num_attributes, TRANSFORM_ATTR)); IdToModelObjectMap::iterator object_item = m_objects.find(object_id); - if (object_item == m_objects.end()) - { + if (object_item == m_objects.end()) { IdToAliasesMap::iterator alias_item = m_objects_aliases.find(object_id); - if (alias_item == m_objects_aliases.end()) - { + if (alias_item == m_objects_aliases.end()) { add_error("Found component with invalid object id"); return false; } @@ -1657,12 +1651,9 @@ namespace Slic3r { bool _3MF_Importer::_handle_end_metadata() { - if (m_curr_metadata_name == SLIC3RPE_3MF_VERSION) - { + if (m_curr_metadata_name == SLIC3RPE_3MF_VERSION) { m_version = (unsigned int)atoi(m_curr_characters.c_str()); - - if (m_check_version && (m_version > VERSION_3MF_COMPATIBLE)) - { + if (m_check_version && (m_version > VERSION_3MF_COMPATIBLE)) { // std::string msg = _(L("The selected 3mf file has been saved with a newer version of " + std::string(SLIC3R_APP_NAME) + " and is not compatible.")); // throw version_error(msg.c_str()); const std::string msg = (boost::format(_(L("The selected 3mf file has been saved with a newer version of %1% and is not compatible."))) % std::string(SLIC3R_APP_NAME)).str(); @@ -1678,34 +1669,28 @@ namespace Slic3r { static const unsigned int MAX_RECURSIONS = 10; // escape from circular aliasing - if (recur_counter > MAX_RECURSIONS) - { + if (recur_counter > MAX_RECURSIONS) { add_error("Too many recursions"); return false; } IdToAliasesMap::iterator it = m_objects_aliases.find(object_id); - if (it == m_objects_aliases.end()) - { + if (it == m_objects_aliases.end()) { add_error("Found item with invalid object id"); return false; } - if ((it->second.size() == 1) && (it->second[0].object_id == object_id)) - { + if (it->second.size() == 1 && it->second[0].object_id == object_id) { // aliasing to itself IdToModelObjectMap::iterator object_item = m_objects.find(object_id); - if ((object_item == m_objects.end()) || (object_item->second == -1)) - { + if (object_item == m_objects.end() || object_item->second == -1) { add_error("Found invalid object"); return false; } - else - { + else { ModelInstance* instance = m_model->objects[object_item->second]->add_instance(); - if (instance == nullptr) - { + if (instance == nullptr) { add_error("Unable to add object instance"); return false; } @@ -1714,11 +1699,9 @@ namespace Slic3r { m_instances.emplace_back(instance, transform); } } - else - { + else { // recursively process nested components - for (const Component& component : it->second) - { + for (const Component& component : it->second) { if (!_create_object_instance(component.object_id, transform * component.transform, printable, recur_counter + 1)) return false; } @@ -1753,8 +1736,7 @@ namespace Slic3r { { int object_id = get_attribute_value_int(attributes, num_attributes, ID_ATTR); IdToMetadataMap::iterator object_item = m_objects_metadata.find(object_id); - if (object_item != m_objects_metadata.end()) - { + if (object_item != m_objects_metadata.end()) { add_error("Found duplicated object id"); return false; } @@ -1762,7 +1744,7 @@ namespace Slic3r { // Added because of github #3435, currently not used by PrusaSlicer // int instances_count_id = get_attribute_value_int(attributes, num_attributes, INSTANCESCOUNT_ATTR); - m_objects_metadata.insert(IdToMetadataMap::value_type(object_id, ObjectMetadata())); + m_objects_metadata.insert({ object_id, ObjectMetadata() }); m_curr_config.object_id = object_id; return true; } @@ -1776,8 +1758,7 @@ namespace Slic3r { bool _3MF_Importer::_handle_start_config_volume(const char** attributes, unsigned int num_attributes) { IdToMetadataMap::iterator object = m_objects_metadata.find(m_curr_config.object_id); - if (object == m_objects_metadata.end()) - { + if (object == m_objects_metadata.end()) { add_error("Cannot assign volume to a valid object"); return false; } @@ -1800,8 +1781,7 @@ namespace Slic3r { bool _3MF_Importer::_handle_start_config_metadata(const char** attributes, unsigned int num_attributes) { IdToMetadataMap::iterator object = m_objects_metadata.find(m_curr_config.object_id); - if (object == m_objects_metadata.end()) - { + if (object == m_objects_metadata.end()) { add_error("Cannot assign metadata to valid object id"); return false; } @@ -1812,13 +1792,11 @@ namespace Slic3r { if (type == OBJECT_TYPE) object->second.metadata.emplace_back(key, value); - else if (type == VOLUME_TYPE) - { + else if (type == VOLUME_TYPE) { if (size_t(m_curr_config.volume_id) < object->second.volumes.size()) object->second.volumes[m_curr_config.volume_id].metadata.emplace_back(key, value); } - else - { + else { add_error("Found invalid metadata type"); return false; } @@ -1834,18 +1812,15 @@ namespace Slic3r { bool _3MF_Importer::_generate_volumes(ModelObject& object, const Geometry& geometry, const ObjectMetadata::VolumeMetadataList& volumes) { - if (!object.volumes.empty()) - { + if (!object.volumes.empty()) { add_error("Found invalid volumes count"); return false; } unsigned int geo_tri_count = (unsigned int)geometry.triangles.size() / 3; - for (const ObjectMetadata::VolumeMetadata& volume_data : volumes) - { - if ((geo_tri_count <= volume_data.first_triangle_id) || (geo_tri_count <= volume_data.last_triangle_id) || (volume_data.last_triangle_id < volume_data.first_triangle_id)) - { + for (const ObjectMetadata::VolumeMetadata& volume_data : volumes) { + if (geo_tri_count <= volume_data.first_triangle_id || geo_tri_count <= volume_data.last_triangle_id || volume_data.last_triangle_id < volume_data.first_triangle_id) { add_error("Found invalid triangle id"); return false; } @@ -1853,10 +1828,8 @@ namespace Slic3r { Transform3d volume_matrix_to_object = Transform3d::Identity(); bool has_transform = false; // extract the volume transformation from the volume's metadata, if present - for (const Metadata& metadata : volume_data.metadata) - { - if (metadata.key == MATRIX_KEY) - { + for (const Metadata& metadata : volume_data.metadata) { + if (metadata.key == MATRIX_KEY) { volume_matrix_to_object = Slic3r::Geometry::transform3d_from_string(metadata.value); has_transform = ! volume_matrix_to_object.isApprox(Transform3d::Identity(), 1e-10); break; @@ -1874,13 +1847,15 @@ namespace Slic3r { unsigned int src_start_id = volume_data.first_triangle_id * 3; - for (unsigned int i = 0; i < triangles_count; ++i) - { + for (unsigned int i = 0; i < triangles_count; ++i) { unsigned int ii = i * 3; stl_facet& facet = stl.facet_start[i]; - for (unsigned int v = 0; v < 3; ++v) - { + for (unsigned int v = 0; v < 3; ++v) { unsigned int tri_id = geometry.triangles[src_start_id + ii + v] * 3; + if (tri_id + 2 >= geometry.vertices.size()) { + add_error("Malformed triangle mesh"); + return false; + } facet.vertex[v] = Vec3f(geometry.vertices[tri_id + 0], geometry.vertices[tri_id + 1], geometry.vertices[tri_id + 2]); } } @@ -1888,6 +1863,18 @@ namespace Slic3r { stl_get_size(&stl); triangle_mesh.repair(); +#if ENABLE_RELOAD_FROM_DISK_FOR_3MF + if (m_version == 0) { + // if the 3mf was not produced by PrusaSlicer and there is only one instance, + // bake the transformation into the geometry to allow the reload from disk command + // to work properly + if (object.instances.size() == 1) { + triangle_mesh.transform(object.instances.front()->get_transformation().get_matrix()); + object.instances.front()->set_transformation(Slic3r::Geometry::Transformation()); + } + } +#endif // ENABLE_RELOAD_FROM_DISK_FOR_3MF + ModelVolume* volume = object.add_volume(std::move(triangle_mesh)); // stores the volume matrix taken from the metadata, if present if (has_transform) @@ -1907,8 +1894,7 @@ namespace Slic3r { // apply the remaining volume's metadata - for (const Metadata& metadata : volume_data.metadata) - { + for (const Metadata& metadata : volume_data.metadata) { if (metadata.key == NAME_KEY) volume->name = metadata.value; else if ((metadata.key == MODIFIER_KEY) && (metadata.value == "1")) @@ -2029,8 +2015,8 @@ namespace Slic3r { bool _add_thumbnail_file_to_archive(mz_zip_archive& archive, const ThumbnailData& thumbnail_data); bool _add_relationships_file_to_archive(mz_zip_archive& archive); bool _add_model_file_to_archive(const std::string& filename, mz_zip_archive& archive, const Model& model, IdToObjectDataMap& objects_data); - bool _add_object_to_model_stream(std::stringstream& stream, unsigned int& object_id, ModelObject& object, BuildItemsList& build_items, VolumeToOffsetsMap& volumes_offsets); - bool _add_mesh_to_object_stream(std::stringstream& stream, ModelObject& object, VolumeToOffsetsMap& volumes_offsets); + bool _add_object_to_model_stream(mz_zip_writer_staged_context &context, unsigned int& object_id, ModelObject& object, BuildItemsList& build_items, VolumeToOffsetsMap& volumes_offsets); + bool _add_mesh_to_object_stream(mz_zip_writer_staged_context &context, ModelObject& object, VolumeToOffsetsMap& volumes_offsets); bool _add_build_to_model_stream(std::stringstream& stream, const BuildItemsList& build_items); bool _add_layer_height_profile_file_to_archive(mz_zip_archive& archive, Model& model); bool _add_layer_config_ranges_file_to_archive(mz_zip_archive& archive, Model& model); @@ -2060,18 +2046,15 @@ namespace Slic3r { // Adds content types file ("[Content_Types].xml";). // The content of this file is the same for each PrusaSlicer 3mf. - if (!_add_content_types_file_to_archive(archive)) - { + if (!_add_content_types_file_to_archive(archive)) { close_zip_writer(&archive); boost::filesystem::remove(filename); return false; } - if ((thumbnail_data != nullptr) && thumbnail_data->is_valid()) - { + if (thumbnail_data != nullptr && thumbnail_data->is_valid()) { // Adds the file Metadata/thumbnail.png. - if (!_add_thumbnail_file_to_archive(archive, *thumbnail_data)) - { + if (!_add_thumbnail_file_to_archive(archive, *thumbnail_data)) { close_zip_writer(&archive); boost::filesystem::remove(filename); return false; @@ -2081,8 +2064,7 @@ namespace Slic3r { // Adds relationships file ("_rels/.rels"). // The content of this file is the same for each PrusaSlicer 3mf. // The relationshis file contains a reference to the geometry file "3D/3dmodel.model", the name was chosen to be compatible with CURA. - if (!_add_relationships_file_to_archive(archive)) - { + if (!_add_relationships_file_to_archive(archive)) { close_zip_writer(&archive); boost::filesystem::remove(filename); return false; @@ -2091,8 +2073,7 @@ namespace Slic3r { // Adds model file ("3D/3dmodel.model"). // This is the one and only file that contains all the geometry (vertices and triangles) of all ModelVolumes. IdToObjectDataMap objects_data; - if (!_add_model_file_to_archive(filename, archive, model, objects_data)) - { + if (!_add_model_file_to_archive(filename, archive, model, objects_data)) { close_zip_writer(&archive); boost::filesystem::remove(filename); return false; @@ -2101,8 +2082,7 @@ namespace Slic3r { // Adds layer height profile file ("Metadata/Slic3r_PE_layer_heights_profile.txt"). // All layer height profiles of all ModelObjects are stored here, indexed by 1 based index of the ModelObject in Model. // The index differes from the index of an object ID of an object instance of a 3MF file! - if (!_add_layer_height_profile_file_to_archive(archive, model)) - { + if (!_add_layer_height_profile_file_to_archive(archive, model)) { close_zip_writer(&archive); boost::filesystem::remove(filename); return false; @@ -2111,8 +2091,7 @@ namespace Slic3r { // Adds layer config ranges file ("Metadata/Slic3r_PE_layer_config_ranges.txt"). // All layer height profiles of all ModelObjects are stored here, indexed by 1 based index of the ModelObject in Model. // The index differes from the index of an object ID of an object instance of a 3MF file! - if (!_add_layer_config_ranges_file_to_archive(archive, model)) - { + if (!_add_layer_config_ranges_file_to_archive(archive, model)) { close_zip_writer(&archive); boost::filesystem::remove(filename); return false; @@ -2121,15 +2100,13 @@ namespace Slic3r { // Adds sla support points file ("Metadata/Slic3r_PE_sla_support_points.txt"). // All sla support points of all ModelObjects are stored here, indexed by 1 based index of the ModelObject in Model. // The index differes from the index of an object ID of an object instance of a 3MF file! - if (!_add_sla_support_points_file_to_archive(archive, model)) - { + if (!_add_sla_support_points_file_to_archive(archive, model)) { close_zip_writer(&archive); boost::filesystem::remove(filename); return false; } - if (!_add_sla_drain_holes_file_to_archive(archive, model)) - { + if (!_add_sla_drain_holes_file_to_archive(archive, model)) { close_zip_writer(&archive); boost::filesystem::remove(filename); return false; @@ -2138,8 +2115,7 @@ namespace Slic3r { // Adds custom gcode per height file ("Metadata/Prusa_Slicer_custom_gcode_per_print_z.xml"). // All custom gcode per height of whole Model are stored here - if (!_add_custom_gcode_per_print_z_file_to_archive(archive, model, config)) - { + if (!_add_custom_gcode_per_print_z_file_to_archive(archive, model, config)) { close_zip_writer(&archive); boost::filesystem::remove(filename); return false; @@ -2147,10 +2123,8 @@ namespace Slic3r { // Adds slic3r print config file ("Metadata/Slic3r_PE.config"). // This file contains the content of FullPrintConfing / SLAFullPrintConfig. - if (config != nullptr) - { - if (!_add_print_config_file_to_archive(archive, *config)) - { + if (config != nullptr) { + if (!_add_print_config_file_to_archive(archive, *config)) { close_zip_writer(&archive); boost::filesystem::remove(filename); return false; @@ -2161,15 +2135,13 @@ namespace Slic3r { // This file contains all the attributes of all ModelObjects and their ModelVolumes (names, parameter overrides). // As there is just a single Indexed Triangle Set data stored per ModelObject, offsets of volumes into their respective Indexed Triangle Set data // is stored here as well. - if (!_add_model_config_file_to_archive(archive, model, objects_data)) - { + if (!_add_model_config_file_to_archive(archive, model, objects_data)) { close_zip_writer(&archive); boost::filesystem::remove(filename); return false; } - if (!mz_zip_writer_finalize_archive(&archive)) - { + if (!mz_zip_writer_finalize_archive(&archive)) { close_zip_writer(&archive); boost::filesystem::remove(filename); add_error("Unable to finalize the archive"); @@ -2186,15 +2158,14 @@ namespace Slic3r { std::stringstream stream; stream << "\n"; stream << "\n"; - stream << " \n"; - stream << " \n"; - stream << " \n"; + stream << " \n"; + stream << " \n"; + stream << " \n"; stream << ""; std::string out = stream.str(); - if (!mz_zip_writer_add_mem(&archive, CONTENT_TYPES_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) - { + if (!mz_zip_writer_add_mem(&archive, CONTENT_TYPES_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) { add_error("Unable to add content types file to archive"); return false; } @@ -2208,8 +2179,7 @@ namespace Slic3r { size_t png_size = 0; void* png_data = tdefl_write_image_to_png_file_in_memory_ex((const void*)thumbnail_data.pixels.data(), thumbnail_data.width, thumbnail_data.height, 4, &png_size, MZ_DEFAULT_LEVEL, 1); - if (png_data != nullptr) - { + if (png_data != nullptr) { res = mz_zip_writer_add_mem(&archive, THUMBNAIL_FILE.c_str(), (const void*)png_data, png_size, MZ_DEFAULT_COMPRESSION); mz_free(png_data); } @@ -2225,14 +2195,13 @@ namespace Slic3r { std::stringstream stream; stream << "\n"; stream << "\n"; - stream << " \n"; - stream << " \n"; + stream << " \n"; + stream << " \n"; stream << ""; std::string out = stream.str(); - if (!mz_zip_writer_add_mem(&archive, RELATIONSHIPS_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) - { + if (!mz_zip_writer_add_mem(&archive, RELATIONSHIPS_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) { add_error("Unable to add relationships file to archive"); return false; } @@ -2240,31 +2209,55 @@ namespace Slic3r { return true; } - bool _3MF_Exporter::_add_model_file_to_archive(const std::string& filename, mz_zip_archive& archive, const Model& model, IdToObjectDataMap& objects_data) + static void reset_stream(std::stringstream &stream) { - std::stringstream stream; + stream.str(""); + stream.clear(); // https://en.cppreference.com/w/cpp/types/numeric_limits/max_digits10 // Conversion of a floating-point value to text and back is exact as long as at least max_digits10 were used (9 for float, 17 for double). // It is guaranteed to produce the same floating-point value, even though the intermediate text representation is not exact. // The default value of std::stream precision is 6 digits only! - stream << std::setprecision(std::numeric_limits::max_digits10); - stream << "\n"; - stream << "<" << MODEL_TAG << " unit=\"millimeter\" xml:lang=\"en-US\" xmlns=\"http://schemas.microsoft.com/3dmanufacturing/core/2015/02\" xmlns:slic3rpe=\"http://schemas.slic3r.org/3mf/2017/06\">\n"; - stream << " <" << METADATA_TAG << " name=\"" << SLIC3RPE_3MF_VERSION << "\">" << VERSION_3MF << "\n"; - std::string name = xml_escape(boost::filesystem::path(filename).stem().string()); - stream << " <" << METADATA_TAG << " name=\"Title\">" << name << "\n"; - stream << " <" << METADATA_TAG << " name=\"Designer\">" << "\n"; - stream << " <" << METADATA_TAG << " name=\"Description\">" << name << "\n"; - stream << " <" << METADATA_TAG << " name=\"Copyright\">" << "\n"; - stream << " <" << METADATA_TAG << " name=\"LicenseTerms\">" << "\n"; - stream << " <" << METADATA_TAG << " name=\"Rating\">" << "\n"; - std::string date = Slic3r::Utils::utc_timestamp(Slic3r::Utils::get_current_time_utc()); - // keep only the date part of the string - date = date.substr(0, 10); - stream << " <" << METADATA_TAG << " name=\"CreationDate\">" << date << "\n"; - stream << " <" << METADATA_TAG << " name=\"ModificationDate\">" << date << "\n"; - stream << " <" << METADATA_TAG << " name=\"Application\">" << SLIC3R_APP_KEY << "-" << SLIC3R_VERSION << "\n"; - stream << " <" << RESOURCES_TAG << ">\n"; + stream << std::setprecision(std::numeric_limits::max_digits10); + } + + bool _3MF_Exporter::_add_model_file_to_archive(const std::string& filename, mz_zip_archive& archive, const Model& model, IdToObjectDataMap& objects_data) + { + mz_zip_writer_staged_context context; + if (!mz_zip_writer_add_staged_open(&archive, &context, MODEL_FILE.c_str(), + // Maximum expected and allowed 3MF file size is 16GiB. + // This switches the ZIP file to a 64bit mode, which adds a tiny bit of overhead to file records. + (uint64_t(1) << 30) * 16, + nullptr, nullptr, 0, MZ_DEFAULT_COMPRESSION, nullptr, 0, nullptr, 0)) { + add_error("Unable to add model file to archive"); + return false; + } + + { + std::stringstream stream; + reset_stream(stream); + stream << "\n"; + stream << "<" << MODEL_TAG << " unit=\"millimeter\" xml:lang=\"en-US\" xmlns=\"http://schemas.microsoft.com/3dmanufacturing/core/2015/02\" xmlns:slic3rpe=\"http://schemas.slic3r.org/3mf/2017/06\">\n"; + stream << " <" << METADATA_TAG << " name=\"" << SLIC3RPE_3MF_VERSION << "\">" << VERSION_3MF << "\n"; + std::string name = xml_escape(boost::filesystem::path(filename).stem().string()); + stream << " <" << METADATA_TAG << " name=\"Title\">" << name << "\n"; + stream << " <" << METADATA_TAG << " name=\"Designer\">" << "\n"; + stream << " <" << METADATA_TAG << " name=\"Description\">" << name << "\n"; + stream << " <" << METADATA_TAG << " name=\"Copyright\">" << "\n"; + stream << " <" << METADATA_TAG << " name=\"LicenseTerms\">" << "\n"; + stream << " <" << METADATA_TAG << " name=\"Rating\">" << "\n"; + std::string date = Slic3r::Utils::utc_timestamp(Slic3r::Utils::get_current_time_utc()); + // keep only the date part of the string + date = date.substr(0, 10); + stream << " <" << METADATA_TAG << " name=\"CreationDate\">" << date << "\n"; + stream << " <" << METADATA_TAG << " name=\"ModificationDate\">" << date << "\n"; + stream << " <" << METADATA_TAG << " name=\"Application\">" << SLIC3R_APP_KEY << "-" << SLIC3R_VERSION << "\n"; + stream << " <" << RESOURCES_TAG << ">\n"; + std::string buf = stream.str(); + if (! buf.empty() && ! mz_zip_writer_add_staged_data(&context, buf.data(), buf.size())) { + add_error("Unable to add model file to archive"); + return false; + } + } // Instance transformations, indexed by the 3MF object ID (which is a linear serialization of all instances of all ModelObjects). BuildItemsList build_items; @@ -2273,51 +2266,55 @@ namespace Slic3r { // all the object instances of all ModelObjects are stored and indexed in a 1 based linear fashion. // Therefore the list of object_ids here may not be continuous. unsigned int object_id = 1; - for (ModelObject* obj : model.objects) - { + for (ModelObject* obj : model.objects) { if (obj == nullptr) continue; // Index of an object in the 3MF file corresponding to the 1st instance of a ModelObject. unsigned int curr_id = object_id; - IdToObjectDataMap::iterator object_it = objects_data.insert(IdToObjectDataMap::value_type(curr_id, ObjectData(obj))).first; + IdToObjectDataMap::iterator object_it = objects_data.insert({ curr_id, ObjectData(obj) }).first; // Store geometry of all ModelVolumes contained in a single ModelObject into a single 3MF indexed triangle set object. // object_it->second.volumes_offsets will contain the offsets of the ModelVolumes in that single indexed triangle set. // object_id will be increased to point to the 1st instance of the next ModelObject. - if (!_add_object_to_model_stream(stream, object_id, *obj, build_items, object_it->second.volumes_offsets)) - { + if (!_add_object_to_model_stream(context, object_id, *obj, build_items, object_it->second.volumes_offsets)) { add_error("Unable to add object to archive"); + mz_zip_writer_add_staged_finish(&context); return false; } } - stream << " \n"; - - // Store the transformations of all the ModelInstances of all ModelObjects, indexed in a linear fashion. - if (!_add_build_to_model_stream(stream, build_items)) { - add_error("Unable to add build to archive"); - return false; - } + std::stringstream stream; + reset_stream(stream); + stream << " \n"; - stream << "\n"; + // Store the transformations of all the ModelInstances of all ModelObjects, indexed in a linear fashion. + if (!_add_build_to_model_stream(stream, build_items)) { + add_error("Unable to add build to archive"); + mz_zip_writer_add_staged_finish(&context); + return false; + } - std::string out = stream.str(); + stream << "\n"; + + std::string buf = stream.str(); - if (!mz_zip_writer_add_mem(&archive, MODEL_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) - { - add_error("Unable to add model file to archive"); - return false; + if ((! buf.empty() && ! mz_zip_writer_add_staged_data(&context, buf.data(), buf.size())) || + ! mz_zip_writer_add_staged_finish(&context)) { + add_error("Unable to add model file to archive"); + return false; + } } return true; } - bool _3MF_Exporter::_add_object_to_model_stream(std::stringstream& stream, unsigned int& object_id, ModelObject& object, BuildItemsList& build_items, VolumeToOffsetsMap& volumes_offsets) + bool _3MF_Exporter::_add_object_to_model_stream(mz_zip_writer_staged_context &context, unsigned int& object_id, ModelObject& object, BuildItemsList& build_items, VolumeToOffsetsMap& volumes_offsets) { + std::stringstream stream; + reset_stream(stream); unsigned int id = 0; - for (const ModelInstance* instance : object.instances) - { + for (const ModelInstance* instance : object.instances) { assert(instance != nullptr); if (instance == nullptr) continue; @@ -2325,18 +2322,18 @@ namespace Slic3r { unsigned int instance_id = object_id + id; stream << " <" << OBJECT_TAG << " id=\"" << instance_id << "\" type=\"model\">\n"; - if (id == 0) - { - if (!_add_mesh_to_object_stream(stream, object, volumes_offsets)) - { + if (id == 0) { + std::string buf = stream.str(); + reset_stream(stream); + if ((! buf.empty() && ! mz_zip_writer_add_staged_data(&context, buf.data(), buf.size())) || + ! _add_mesh_to_object_stream(context, object, volumes_offsets)) { add_error("Unable to add mesh to archive"); return false; } } - else - { + else { stream << " <" << COMPONENTS_TAG << ">\n"; - stream << " <" << COMPONENT_TAG << " objectid=\"" << object_id << "\" />\n"; + stream << " <" << COMPONENT_TAG << " objectid=\"" << object_id << "\"/>\n"; stream << " \n"; } @@ -2351,17 +2348,82 @@ namespace Slic3r { } object_id += id; - return true; + std::string buf = stream.str(); + return buf.empty() || mz_zip_writer_add_staged_data(&context, buf.data(), buf.size()); } - bool _3MF_Exporter::_add_mesh_to_object_stream(std::stringstream& stream, ModelObject& object, VolumeToOffsetsMap& volumes_offsets) +#if EXPORT_3MF_USE_SPIRIT_KARMA_FP + template + struct coordinate_policy_fixed : boost::spirit::karma::real_policies + { + static int floatfield(Num n) { return fmtflags::fixed; } + // Number of decimal digits to maintain float accuracy when storing into a text file and parsing back. + static unsigned precision(Num /* n */) { return std::numeric_limits::max_digits10 + 1; } + // No trailing zeros, thus for fmtflags::fixed usually much less than max_digits10 decimal numbers will be produced. + static bool trailing_zeros(Num /* n */) { return false; } + }; + template + struct coordinate_policy_scientific : coordinate_policy_fixed { - stream << " <" << MESH_TAG << ">\n"; - stream << " <" << VERTICES_TAG << ">\n"; + static int floatfield(Num n) { return fmtflags::scientific; } + }; + // Define a new generator type based on the new coordinate policy. + using coordinate_type_fixed = boost::spirit::karma::real_generator>; + using coordinate_type_scientific = boost::spirit::karma::real_generator>; +#endif // EXPORT_3MF_USE_SPIRIT_KARMA_FP + + bool _3MF_Exporter::_add_mesh_to_object_stream(mz_zip_writer_staged_context &context, ModelObject& object, VolumeToOffsetsMap& volumes_offsets) + { + std::string output_buffer; + output_buffer += " <"; + output_buffer += MESH_TAG; + output_buffer += ">\n <"; + output_buffer += VERTICES_TAG; + output_buffer += ">\n"; + + auto flush = [this, &output_buffer, &context](bool force = false) { + if ((force && ! output_buffer.empty()) || output_buffer.size() >= 65536 * 16) { + if (! mz_zip_writer_add_staged_data(&context, output_buffer.data(), output_buffer.size())) { + add_error("Error during writing or compression"); + return false; + } + output_buffer.clear(); + } + return true; + }; + + auto format_coordinate = [](float f, char *buf) -> char* { +#if EXPORT_3MF_USE_SPIRIT_KARMA_FP + // Slightly faster than sprintf("%.9g"), but there is an issue with the karma floating point formatter, + // https://github.com/boostorg/spirit/pull/586 + // where the exported string is one digit shorter than it should be to guarantee lossless round trip. + // The code is left here for the ocasion boost guys improve. + coordinate_type_fixed const coordinate_fixed = coordinate_type_fixed(); + coordinate_type_scientific const coordinate_scientific = coordinate_type_scientific(); + // Format "f" in a fixed format. + char *ptr = buf; + boost::spirit::karma::generate(ptr, coordinate_fixed, f); + // Format "f" in a scientific format. + char *ptr2 = ptr; + boost::spirit::karma::generate(ptr2, coordinate_scientific, f); + // Return end of the shorter string. + auto len2 = ptr2 - ptr; + if (ptr - buf > len2) { + // Move the shorter scientific form to the front. + memcpy(buf, ptr, len2); + ptr = buf + len2; + } + // Return pointer to the end. + return ptr; +#else + // Round-trippable float, shortest possible. + return buf + sprintf(buf, "%.9g", f); +#endif + }; + char buf[256]; unsigned int vertices_count = 0; - for (ModelVolume* volume : object.volumes) - { + for (ModelVolume* volume : object.volumes) { if (volume == nullptr) continue; @@ -2370,11 +2432,10 @@ namespace Slic3r { if (!volume->mesh().has_shared_vertices()) throw Slic3r::FileIOError("store_3mf() requires shared vertices"); - volumes_offsets.insert(VolumeToOffsetsMap::value_type(volume, Offsets(vertices_count))).first; + volumes_offsets.insert({ volume, Offsets(vertices_count) }).first; const indexed_triangle_set &its = volume->mesh().its; - if (its.vertices.empty()) - { + if (its.vertices.empty()) { add_error("Found invalid mesh"); return false; } @@ -2383,22 +2444,31 @@ namespace Slic3r { const Transform3d& matrix = volume->get_matrix(); - for (size_t i = 0; i < its.vertices.size(); ++i) - { - stream << " <" << VERTEX_TAG << " "; + for (size_t i = 0; i < its.vertices.size(); ++i) { Vec3f v = (matrix * its.vertices[i].cast()).cast(); - stream << "x=\"" << v(0) << "\" "; - stream << "y=\"" << v(1) << "\" "; - stream << "z=\"" << v(2) << "\" />\n"; + char *ptr = buf; + boost::spirit::karma::generate(ptr, boost::spirit::lit(" <") << VERTEX_TAG << " x=\""); + ptr = format_coordinate(v.x(), ptr); + boost::spirit::karma::generate(ptr, "\" y=\""); + ptr = format_coordinate(v.y(), ptr); + boost::spirit::karma::generate(ptr, "\" z=\""); + ptr = format_coordinate(v.z(), ptr); + boost::spirit::karma::generate(ptr, "\"/>\n"); + *ptr = '\0'; + output_buffer += buf; + if (! flush()) + return false; } } - stream << " \n"; - stream << " <" << TRIANGLES_TAG << ">\n"; + output_buffer += " \n <"; + output_buffer += TRIANGLES_TAG; + output_buffer += ">\n"; unsigned int triangles_count = 0; - for (ModelVolume* volume : object.volumes) - { + for (ModelVolume* volume : object.volumes) { if (volume == nullptr) continue; @@ -2412,55 +2482,75 @@ namespace Slic3r { triangles_count += (int)its.indices.size(); volume_it->second.last_triangle_id = triangles_count - 1; - for (int i = 0; i < int(its.indices.size()); ++ i) - { - stream << " <" << TRIANGLE_TAG << " "; - for (int j = 0; j < 3; ++j) + for (int i = 0; i < int(its.indices.size()); ++ i) { { - stream << "v" << j + 1 << "=\"" << its.indices[i][j] + volume_it->second.first_vertex_id << "\" "; + const Vec3i &idx = its.indices[i]; + char *ptr = buf; + boost::spirit::karma::generate(ptr, boost::spirit::lit(" <") << TRIANGLE_TAG << + " v1=\"" << boost::spirit::int_ << + "\" v2=\"" << boost::spirit::int_ << + "\" v3=\"" << boost::spirit::int_ << "\"", + idx[0] + volume_it->second.first_vertex_id, + idx[1] + volume_it->second.first_vertex_id, + idx[2] + volume_it->second.first_vertex_id); + *ptr = '\0'; + output_buffer += buf; } std::string custom_supports_data_string = volume->supported_facets.get_triangle_as_string(i); - if (! custom_supports_data_string.empty()) - stream << CUSTOM_SUPPORTS_ATTR << "=\"" << custom_supports_data_string << "\" "; + if (! custom_supports_data_string.empty()) { + output_buffer += " "; + output_buffer += CUSTOM_SUPPORTS_ATTR; + output_buffer += "=\""; + output_buffer += custom_supports_data_string; + output_buffer += "\""; + } std::string custom_seam_data_string = volume->seam_facets.get_triangle_as_string(i); - if (! custom_seam_data_string.empty()) - stream << CUSTOM_SEAM_ATTR << "=\"" << custom_seam_data_string << "\" "; + if (! custom_seam_data_string.empty()) { + output_buffer += " "; + output_buffer += CUSTOM_SEAM_ATTR; + output_buffer += "=\""; + output_buffer += custom_seam_data_string; + output_buffer += "\""; + } + + output_buffer += "/>\n"; - stream << "/>\n"; + if (! flush()) + return false; } } - stream << " \n"; - stream << " \n"; + output_buffer += " \n \n"; - return true; + // Force flush. + return flush(true); } bool _3MF_Exporter::_add_build_to_model_stream(std::stringstream& stream, const BuildItemsList& build_items) { - if (build_items.size() == 0) - { + if (build_items.size() == 0) { add_error("No build item found"); return false; } stream << " <" << BUILD_TAG << ">\n"; - for (const BuildItem& item : build_items) - { + for (const BuildItem& item : build_items) { stream << " <" << ITEM_TAG << " " << OBJECTID_ATTR << "=\"" << item.id << "\" " << TRANSFORM_ATTR << "=\""; - for (unsigned c = 0; c < 4; ++c) - { - for (unsigned r = 0; r < 3; ++r) - { + for (unsigned c = 0; c < 4; ++c) { + for (unsigned r = 0; r < 3; ++r) { stream << item.transform(r, c); - if ((r != 2) || (c != 3)) + if (r != 2 || c != 3) stream << " "; } } - stream << "\" " << PRINTABLE_ATTR << "=\"" << item.printable << "\" />\n"; + stream << "\" " << PRINTABLE_ATTR << "=\"" << item.printable << "\"/>\n"; } stream << " \n"; @@ -2474,18 +2564,15 @@ namespace Slic3r { char buffer[1024]; unsigned int count = 0; - for (const ModelObject* object : model.objects) - { + for (const ModelObject* object : model.objects) { ++count; const std::vector& layer_height_profile = object->layer_height_profile.get(); - if ((layer_height_profile.size() >= 4) && ((layer_height_profile.size() % 2) == 0)) - { + if (layer_height_profile.size() >= 4 && layer_height_profile.size() % 2 == 0) { sprintf(buffer, "object_id=%d|", count); out += buffer; // Store the layer height profile as a single semicolon separated list. - for (size_t i = 0; i < layer_height_profile.size(); ++i) - { + for (size_t i = 0; i < layer_height_profile.size(); ++i) { sprintf(buffer, (i == 0) ? "%f" : ";%f", layer_height_profile[i]); out += buffer; } @@ -2494,10 +2581,8 @@ namespace Slic3r { } } - if (!out.empty()) - { - if (!mz_zip_writer_add_mem(&archive, LAYER_HEIGHTS_PROFILE_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) - { + if (!out.empty()) { + if (!mz_zip_writer_add_mem(&archive, LAYER_HEIGHTS_PROFILE_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) { add_error("Unable to add layer heights profile file to archive"); return false; } @@ -2512,8 +2597,7 @@ namespace Slic3r { pt::ptree tree; unsigned int object_cnt = 0; - for (const ModelObject* object : model.objects) - { + for (const ModelObject* object : model.objects) { object_cnt++; const t_layer_config_ranges& ranges = object->layer_config_ranges; if (!ranges.empty()) @@ -2523,8 +2607,7 @@ namespace Slic3r { obj_tree.put(".id", object_cnt); // Store the layer config ranges. - for (const auto& range : ranges) - { + for (const auto& range : ranges) { pt::ptree& range_tree = obj_tree.add("range", ""); // store minX and maxZ @@ -2533,8 +2616,7 @@ namespace Slic3r { // store range configuration const ModelConfig& config = range.second; - for (const std::string& opt_key : config.keys()) - { + for (const std::string& opt_key : config.keys()) { pt::ptree& opt_tree = range_tree.add("option", config.opt_serialize(opt_key)); opt_tree.put(".opt_key", opt_key); } @@ -2542,8 +2624,7 @@ namespace Slic3r { } } - if (!tree.empty()) - { + if (!tree.empty()) { std::ostringstream oss; pt::write_xml(oss, tree); out = oss.str(); @@ -2558,10 +2639,8 @@ namespace Slic3r { boost::replace_all(out, "><", ">\n<"); } - if (!out.empty()) - { - if (!mz_zip_writer_add_mem(&archive, LAYER_CONFIG_RANGES_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) - { + if (!out.empty()) { + if (!mz_zip_writer_add_mem(&archive, LAYER_CONFIG_RANGES_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) { add_error("Unable to add layer heights profile file to archive"); return false; } @@ -2576,18 +2655,15 @@ namespace Slic3r { char buffer[1024]; unsigned int count = 0; - for (const ModelObject* object : model.objects) - { + for (const ModelObject* object : model.objects) { ++count; const std::vector& sla_support_points = object->sla_support_points; - if (!sla_support_points.empty()) - { + if (!sla_support_points.empty()) { sprintf(buffer, "object_id=%d|", count); out += buffer; // Store the layer height profile as a single space separated list. - for (size_t i = 0; i < sla_support_points.size(); ++i) - { + for (size_t i = 0; i < sla_support_points.size(); ++i) { sprintf(buffer, (i==0 ? "%f %f %f %f %f" : " %f %f %f %f %f"), sla_support_points[i].pos(0), sla_support_points[i].pos(1), sla_support_points[i].pos(2), sla_support_points[i].head_front_radius, (float)sla_support_points[i].is_new_island); out += buffer; } @@ -2595,13 +2671,11 @@ namespace Slic3r { } } - if (!out.empty()) - { + if (!out.empty()) { // Adds version header at the beginning: out = std::string("support_points_format_version=") + std::to_string(support_points_format_version) + std::string("\n") + out; - if (!mz_zip_writer_add_mem(&archive, SLA_SUPPORT_POINTS_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) - { + if (!mz_zip_writer_add_mem(&archive, SLA_SUPPORT_POINTS_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) { add_error("Unable to add sla support points file to archive"); return false; } @@ -2615,8 +2689,7 @@ namespace Slic3r { std::string out; unsigned int count = 0; - for (const ModelObject* object : model.objects) - { + for (const ModelObject* object : model.objects) { ++count; sla::DrainHoles drain_holes = object->sla_drain_holes; @@ -2629,9 +2702,7 @@ namespace Slic3r { hole.height += 1.f; } - - if (!drain_holes.empty()) - { + if (!drain_holes.empty()) { out += string_printf(fmt, count); // Store the layer height profile as a single space separated list. @@ -2650,13 +2721,11 @@ namespace Slic3r { } } - if (!out.empty()) - { + if (!out.empty()) { // Adds version header at the beginning: out = std::string("drain_holes_format_version=") + std::to_string(drain_holes_format_version) + std::string("\n") + out; - if (!mz_zip_writer_add_mem(&archive, SLA_DRAIN_HOLES_FILE.c_str(), static_cast(out.data()), out.length(), mz_uint(MZ_DEFAULT_COMPRESSION))) - { + if (!mz_zip_writer_add_mem(&archive, SLA_DRAIN_HOLES_FILE.c_str(), static_cast(out.data()), out.length(), mz_uint(MZ_DEFAULT_COMPRESSION))) { add_error("Unable to add sla support points file to archive"); return false; } @@ -2674,10 +2743,8 @@ namespace Slic3r { if (key != "compatible_printers") out += "; " + key + " = " + config.opt_serialize(key) + "\n"; - if (!out.empty()) - { - if (!mz_zip_writer_add_mem(&archive, PRINT_CONFIG_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) - { + if (!out.empty()) { + if (!mz_zip_writer_add_mem(&archive, PRINT_CONFIG_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) { add_error("Unable to add print config file to archive"); return false; } @@ -2695,11 +2762,9 @@ namespace Slic3r { stream << "\n"; stream << "<" << CONFIG_TAG << ">\n"; - for (const IdToObjectDataMap::value_type& obj_metadata : objects_data) - { + for (const IdToObjectDataMap::value_type& obj_metadata : objects_data) { const ModelObject* obj = obj_metadata.second.object; - if (obj != nullptr) - { + if (obj != nullptr) { // Output of instances count added because of github #3435, currently not used by PrusaSlicer stream << " <" << OBJECT_TAG << " " << ID_ATTR << "=\"" << obj_metadata.first << "\" " << INSTANCESCOUNT_ATTR << "=\"" << obj->instances.size() << "\">\n"; @@ -2708,19 +2773,15 @@ namespace Slic3r { stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << OBJECT_TYPE << "\" " << KEY_ATTR << "=\"name\" " << VALUE_ATTR << "=\"" << xml_escape(obj->name) << "\"/>\n"; // stores object's config data - for (const std::string& key : obj->config.keys()) - { + for (const std::string& key : obj->config.keys()) { stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << OBJECT_TYPE << "\" " << KEY_ATTR << "=\"" << key << "\" " << VALUE_ATTR << "=\"" << obj->config.opt_serialize(key) << "\"/>\n"; } - for (const ModelVolume* volume : obj_metadata.second.object->volumes) - { - if (volume != nullptr) - { + for (const ModelVolume* volume : obj_metadata.second.object->volumes) { + if (volume != nullptr) { const VolumeToOffsetsMap& offsets = obj_metadata.second.volumes_offsets; VolumeToOffsetsMap::const_iterator it = offsets.find(volume); - if (it != offsets.end()) - { + if (it != offsets.end()) { // stores volume's offsets stream << " <" << VOLUME_TAG << " "; stream << FIRST_TRIANGLE_ID_ATTR << "=\"" << it->second.first_triangle_id << "\" "; @@ -2740,12 +2801,10 @@ namespace Slic3r { // stores volume's local matrix stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << VOLUME_TYPE << "\" " << KEY_ATTR << "=\"" << MATRIX_KEY << "\" " << VALUE_ATTR << "=\""; Transform3d matrix = volume->get_matrix() * volume->source.transform.get_matrix(); - for (int r = 0; r < 4; ++r) - { - for (int c = 0; c < 4; ++c) - { + for (int r = 0; r < 4; ++r) { + for (int c = 0; c < 4; ++c) { stream << matrix(r, c); - if ((r != 3) || (c != 3)) + if (r != 3 || c != 3) stream << " "; } } @@ -2762,15 +2821,13 @@ namespace Slic3r { stream << prefix << SOURCE_OFFSET_X_KEY << "\" " << VALUE_ATTR << "=\"" << volume->source.mesh_offset(0) << "\"/>\n"; stream << prefix << SOURCE_OFFSET_Y_KEY << "\" " << VALUE_ATTR << "=\"" << volume->source.mesh_offset(1) << "\"/>\n"; stream << prefix << SOURCE_OFFSET_Z_KEY << "\" " << VALUE_ATTR << "=\"" << volume->source.mesh_offset(2) << "\"/>\n"; - stream << prefix << SOURCE_OFFSET_Z_KEY << "\" " << VALUE_ATTR << "=\"" << volume->source.mesh_offset(2) << "\"/>\n"; } if (volume->source.is_converted_from_inches) stream << prefix << SOURCE_IN_INCHES << "\" " << VALUE_ATTR << "=\"1\"/>\n"; } // stores volume's config data - for (const std::string& key : volume->config.keys()) - { + for (const std::string& key : volume->config.keys()) { stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << VOLUME_TYPE << "\" " << KEY_ATTR << "=\"" << key << "\" " << VALUE_ATTR << "=\"" << volume->config.opt_serialize(key) << "\"/>\n"; } @@ -2787,8 +2844,7 @@ namespace Slic3r { std::string out = stream.str(); - if (!mz_zip_writer_add_mem(&archive, MODEL_CONFIG_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) - { + if (!mz_zip_writer_add_mem(&archive, MODEL_CONFIG_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) { add_error("Unable to add model config file to archive"); return false; } @@ -2800,13 +2856,11 @@ bool _3MF_Exporter::_add_custom_gcode_per_print_z_file_to_archive( mz_zip_archiv { std::string out = ""; - if (!model.custom_gcode_per_print_z.gcodes.empty()) - { + if (!model.custom_gcode_per_print_z.gcodes.empty()) { pt::ptree tree; pt::ptree& main_tree = tree.add("custom_gcodes_per_print_z", ""); - for (const CustomGCode::Item& code : model.custom_gcode_per_print_z.gcodes) - { + for (const CustomGCode::Item& code : model.custom_gcode_per_print_z.gcodes) { pt::ptree& code_tree = main_tree.add("code", ""); // store data of custom_gcode_per_print_z @@ -2830,8 +2884,7 @@ bool _3MF_Exporter::_add_custom_gcode_per_print_z_file_to_archive( mz_zip_archiv model.custom_gcode_per_print_z.mode == CustomGCode::Mode::MultiAsSingle ? CustomGCode::MultiAsSingleMode : CustomGCode::MultiExtruderMode); - if (!tree.empty()) - { + if (!tree.empty()) { std::ostringstream oss; boost::property_tree::write_xml(oss, tree); out = oss.str(); @@ -2841,10 +2894,8 @@ bool _3MF_Exporter::_add_custom_gcode_per_print_z_file_to_archive( mz_zip_archiv } } - if (!out.empty()) - { - if (!mz_zip_writer_add_mem(&archive, CUSTOM_GCODE_PER_PRINT_Z_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) - { + if (!out.empty()) { + if (!mz_zip_writer_add_mem(&archive, CUSTOM_GCODE_PER_PRINT_Z_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) { add_error("Unable to add custom Gcodes per print_z file to archive"); return false; } @@ -2854,26 +2905,26 @@ bool _3MF_Exporter::_add_custom_gcode_per_print_z_file_to_archive( mz_zip_archiv } bool load_3mf(const char* path, DynamicPrintConfig* config, Model* model, bool check_version) - { - if ((path == nullptr) || (config == nullptr) || (model == nullptr)) - return false; +{ + if (path == nullptr || config == nullptr || model == nullptr) + return false; - _3MF_Importer importer; - bool res = importer.load_model_from_file(path, *model, *config, check_version); - importer.log_errors(); - return res; - } + _3MF_Importer importer; + bool res = importer.load_model_from_file(path, *model, *config, check_version); + importer.log_errors(); + return res; +} bool store_3mf(const char* path, Model* model, const DynamicPrintConfig* config, bool fullpath_sources, const ThumbnailData* thumbnail_data) - { - if ((path == nullptr) || (model == nullptr)) - return false; +{ + if (path == nullptr || model == nullptr) + return false; - _3MF_Exporter exporter; - bool res = exporter.save_model_to_file(path, *model, config, fullpath_sources, thumbnail_data); - if (!res) - exporter.log_errors(); + _3MF_Exporter exporter; + bool res = exporter.save_model_to_file(path, *model, config, fullpath_sources, thumbnail_data); + if (!res) + exporter.log_errors(); - return res; - } + return res; +} } // namespace Slic3r diff --git a/src/libslic3r/Format/AMF.cpp b/src/libslic3r/Format/AMF.cpp index 07095d10b9f..9b71990eac0 100644 --- a/src/libslic3r/Format/AMF.cpp +++ b/src/libslic3r/Format/AMF.cpp @@ -24,6 +24,7 @@ namespace pt = boost::property_tree; #include #include +#include #include #include "miniz_extension.hpp" @@ -63,23 +64,31 @@ namespace Slic3r struct AMFParserContext { AMFParserContext(XML_Parser parser, DynamicPrintConfig* config, Model* model) : - m_version(0), m_parser(parser), m_model(*model), - m_object(nullptr), - m_volume(nullptr), - m_material(nullptr), - m_instance(nullptr), m_config(config) { m_path.reserve(12); } - void stop() + void stop(const std::string &msg = std::string()) { + assert(! m_error); + assert(m_error_message.empty()); + m_error = true; + m_error_message = msg; XML_StopParser(m_parser, 0); } + bool error() const { return m_error; } + const char* error_message() const { + return m_error ? + // The error was signalled by the user code, not the expat parser. + (m_error_message.empty() ? "Invalid AMF format" : m_error_message.c_str()) : + // The error was signalled by the expat parser. + XML_ErrorString(XML_GetErrorCode(m_parser)); + } + void startElement(const char *name, const char **atts); void endElement(const char *name); void endDocument(); @@ -217,33 +226,37 @@ struct AMFParserContext }; // Version of the amf file - unsigned int m_version; + unsigned int m_version { 0 }; // Current Expat XML parser instance. XML_Parser m_parser; + // Error code returned by the application side of the parser. In that case the expat may not reliably deliver the error state + // after returning from XML_Parse() function, thus we keep the error state here. + bool m_error { false }; + std::string m_error_message; // Model to receive objects extracted from an AMF file. Model &m_model; // Current parsing path in the XML file. std::vector m_path; // Current object allocated for an amf/object XML subtree. - ModelObject *m_object; + ModelObject *m_object { nullptr }; // Map from obect name to object idx & instances. std::map m_object_instances_map; // Vertices parsed for the current m_object. std::vector m_object_vertices; // Current volume allocated for an amf/object/mesh/volume subtree. - ModelVolume *m_volume; + ModelVolume *m_volume { nullptr }; // Faces collected for the current m_volume. std::vector m_volume_facets; // Transformation matrix of a volume mesh from its coordinate system to Object's coordinate system. Transform3d m_volume_transform; // Current material allocated for an amf/metadata subtree. - ModelMaterial *m_material; + ModelMaterial *m_material { nullptr }; // Current instance allocated for an amf/constellation/instance subtree. - Instance *m_instance; + Instance *m_instance { nullptr }; // Generic string buffer for vertices, face indices, metadata etc. std::string m_value[5]; // Pointer to config to update if config data are stored inside the amf file - DynamicPrintConfig *m_config; + DynamicPrintConfig *m_config { nullptr }; private: AMFParserContext& operator=(AMFParserContext&); @@ -591,9 +604,9 @@ void AMFParserContext::endElement(const char * /* name */) // Faces of the current volume: case NODE_TYPE_TRIANGLE: assert(m_object && m_volume); - m_volume_facets.push_back(atoi(m_value[0].c_str())); - m_volume_facets.push_back(atoi(m_value[1].c_str())); - m_volume_facets.push_back(atoi(m_value[2].c_str())); + m_volume_facets.emplace_back(atoi(m_value[0].c_str())); + m_volume_facets.emplace_back(atoi(m_value[1].c_str())); + m_volume_facets.emplace_back(atoi(m_value[2].c_str())); m_value[0].clear(); m_value[1].clear(); m_value[2].clear(); @@ -616,6 +629,10 @@ void AMFParserContext::endElement(const char * /* name */) for (unsigned int v = 0; v < 3; ++v) { unsigned int tri_id = m_volume_facets[i++] * 3; + if (tri_id < 0 || tri_id + 2 >= m_object_vertices.size()) { + this->stop("Malformed triangle mesh"); + return; + } facet.vertex[v] = Vec3f(m_object_vertices[tri_id + 0], m_object_vertices[tri_id + 1], m_object_vertices[tri_id + 2]); } } @@ -811,7 +828,7 @@ void AMFParserContext::endDocument() { for (const auto &object : m_object_instances_map) { if (object.second.idx == -1) { - printf("Undefined object %s referenced in constellation\n", object.first.c_str()); + BOOST_LOG_TRIVIAL(error) << "Undefined object " << object.first.c_str() << " referenced in constellation"; continue; } for (const Instance &instance : object.second.instances) @@ -834,13 +851,13 @@ bool load_amf_file(const char *path, DynamicPrintConfig *config, Model *model) XML_Parser parser = XML_ParserCreate(nullptr); // encoding if (!parser) { - printf("Couldn't allocate memory for parser\n"); + BOOST_LOG_TRIVIAL(error) << "Couldn't allocate memory for parser"; return false; } FILE *pFile = boost::nowide::fopen(path, "rt"); if (pFile == nullptr) { - printf("Cannot open file %s\n", path); + BOOST_LOG_TRIVIAL(error) << "Cannot open file " << path; return false; } @@ -854,14 +871,12 @@ bool load_amf_file(const char *path, DynamicPrintConfig *config, Model *model) for (;;) { int len = (int)fread(buff, 1, 8192, pFile); if (ferror(pFile)) { - printf("AMF parser: Read error\n"); + BOOST_LOG_TRIVIAL(error) << "AMF parser: Read error"; break; } int done = feof(pFile); - if (XML_Parse(parser, buff, len, done) == XML_STATUS_ERROR) { - printf("AMF parser: Parse error at line %d:\n%s\n", - (int)XML_GetCurrentLineNumber(parser), - XML_ErrorString(XML_GetErrorCode(parser))); + if (XML_Parse(parser, buff, len, done) == XML_STATUS_ERROR || ctx.error()) { + BOOST_LOG_TRIVIAL(error) << "AMF parser: Parse error at line " << int(XML_GetCurrentLineNumber(parser)) << ": " << ctx.error_message(); break; } if (done) { @@ -892,14 +907,14 @@ bool extract_model_from_archive(mz_zip_archive& archive, const mz_zip_archive_fi { if (stat.m_uncomp_size == 0) { - printf("Found invalid size\n"); + BOOST_LOG_TRIVIAL(error) << "Found invalid size"; close_zip_reader(&archive); return false; } XML_Parser parser = XML_ParserCreate(nullptr); // encoding if (!parser) { - printf("Couldn't allocate memory for parser\n"); + BOOST_LOG_TRIVIAL(error) << "Couldn't allocate memory for parser"; close_zip_reader(&archive); return false; } @@ -912,12 +927,13 @@ bool extract_model_from_archive(mz_zip_archive& archive, const mz_zip_archive_fi struct CallbackData { XML_Parser& parser; + AMFParserContext& ctx; const mz_zip_archive_file_stat& stat; - CallbackData(XML_Parser& parser, const mz_zip_archive_file_stat& stat) : parser(parser), stat(stat) {} + CallbackData(XML_Parser& parser, AMFParserContext& ctx, const mz_zip_archive_file_stat& stat) : parser(parser), ctx(ctx), stat(stat) {} }; - CallbackData data(parser, stat); + CallbackData data(parser, ctx, stat); mz_bool res = 0; @@ -925,10 +941,10 @@ bool extract_model_from_archive(mz_zip_archive& archive, const mz_zip_archive_fi { res = mz_zip_reader_extract_file_to_callback(&archive, stat.m_filename, [](void* pOpaque, mz_uint64 file_ofs, const void* pBuf, size_t n)->size_t { CallbackData* data = (CallbackData*)pOpaque; - if (!XML_Parse(data->parser, (const char*)pBuf, (int)n, (file_ofs + n == data->stat.m_uncomp_size) ? 1 : 0)) + if (!XML_Parse(data->parser, (const char*)pBuf, (int)n, (file_ofs + n == data->stat.m_uncomp_size) ? 1 : 0) || data->ctx.error()) { char error_buf[1024]; - ::sprintf(error_buf, "Error (%s) while parsing '%s' at line %d", XML_ErrorString(XML_GetErrorCode(data->parser)), data->stat.m_filename, (int)XML_GetCurrentLineNumber(data->parser)); + ::sprintf(error_buf, "Error (%s) while parsing '%s' at line %d", data->ctx.error_message(), data->stat.m_filename, (int)XML_GetCurrentLineNumber(data->parser)); throw Slic3r::FileIOError(error_buf); } @@ -937,14 +953,14 @@ bool extract_model_from_archive(mz_zip_archive& archive, const mz_zip_archive_fi } catch (std::exception& e) { - printf("%s\n", e.what()); + BOOST_LOG_TRIVIAL(error) << "Error reading AMF file: " << e.what(); close_zip_reader(&archive); return false; } if (res == 0) { - printf("Error while extracting model data from zip archive"); + BOOST_LOG_TRIVIAL(error) << "Error while extracting model data from zip archive"; close_zip_reader(&archive); return false; } @@ -973,7 +989,7 @@ bool load_amf_archive(const char* path, DynamicPrintConfig* config, Model* model if (!open_zip_reader(&archive, path)) { - printf("Unable to init zip reader\n"); + BOOST_LOG_TRIVIAL(error) << "Unable to init zip reader"; return false; } @@ -992,7 +1008,7 @@ bool load_amf_archive(const char* path, DynamicPrintConfig* config, Model* model if (!extract_model_from_archive(archive, stat, config, model, check_version)) { close_zip_reader(&archive); - printf("Archive does not contain a valid model"); + BOOST_LOG_TRIVIAL(error) << "Archive does not contain a valid model"; return false; } } @@ -1231,7 +1247,7 @@ bool store_amf(const char* path, Model* model, const DynamicPrintConfig* config, if (!object->instances.empty()) { for (ModelInstance *instance : object->instances) { char buf[512]; - sprintf(buf, + ::sprintf(buf, " \n" " %lf\n" " %lf\n" diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index cc9dfce30f9..f076a74ca0d 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -851,7 +851,7 @@ namespace DoExport { double extruded_volume = extruder.extruded_volume() + (has_wipe_tower ? wipe_tower_data.used_filament[extruder.id()] * 2.4052f : 0.f); // assumes 1.75mm filament diameter double filament_weight = extruded_volume * extruder.filament_density() * 0.001; double filament_cost = filament_weight * extruder.filament_cost() * 0.001; - auto append = [&extruder, &extruders](std::pair &dst, const char *tmpl, double value) { + auto append = [&extruder](std::pair &dst, const char *tmpl, double value) { while (dst.second < extruder.id()) { // Fill in the non-printing extruders with zeros. dst.first += (dst.second > 0) ? ", 0" : "0"; @@ -1790,7 +1790,7 @@ void GCode::process_layer( // Just a reminder: A spiral vase mode is allowed for a single object, single material print only. m_enable_loop_clipping = true; if (m_spiral_vase && layers.size() == 1 && support_layer == nullptr) { - bool enable = (layer.id() > 0 || print.config().brim_width.value == 0.) && (layer.id() >= (size_t)print.config().skirt_height.value && ! print.has_infinite_skirt()); + bool enable = (layer.id() > 0 || !print.has_brim()) && (layer.id() >= (size_t)print.config().skirt_height.value && ! print.has_infinite_skirt()); if (enable) { for (const LayerRegion *layer_region : layer.regions()) if (size_t(layer_region->region()->config().bottom_solid_layers.value) > layer.id() || @@ -2591,10 +2591,10 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description, throw Slic3r::InvalidArgument("Invalid speed"); } } - if (this->on_first_layer()) - speed = m_config.get_abs_value("first_layer_speed", speed); if (m_volumetric_speed != 0. && speed == 0) speed = m_volumetric_speed / path.mm3_per_mm; + if (this->on_first_layer()) + speed = m_config.get_abs_value("first_layer_speed", speed); if (m_config.max_volumetric_speed.value > 0) { // cap speed with max_volumetric_speed anyway (even if user is not using autospeed) speed = std::min( diff --git a/src/libslic3r/GCode.hpp b/src/libslic3r/GCode.hpp index 458eae80a91..1dbb153dda4 100644 --- a/src/libslic3r/GCode.hpp +++ b/src/libslic3r/GCode.hpp @@ -33,7 +33,7 @@ class GCode; namespace { struct Item; } struct PrintInstance; -using PrintObjectPtrs = std::vector; +class ConstPrintObjectPtrsAdaptor; class OozePrevention { public: diff --git a/src/libslic3r/GCode/AvoidCrossingPerimeters.cpp b/src/libslic3r/GCode/AvoidCrossingPerimeters.cpp index f1d89537242..853dc722be2 100644 --- a/src/libslic3r/GCode/AvoidCrossingPerimeters.cpp +++ b/src/libslic3r/GCode/AvoidCrossingPerimeters.cpp @@ -596,7 +596,7 @@ static std::vector contour_distance(const EdgeGrid::Grid &grid, { struct Visitor { Visitor(const EdgeGrid::Grid &grid, const size_t contour_idx, const std::vector &polygon_distances, double dist_same_contour_accept, double dist_same_contour_reject) : - grid(grid), idx_contour(contour_idx), contour(*grid.contours()[contour_idx]), boundary_parameters(polygon_distances), dist_same_contour_accept(dist_same_contour_accept), dist_same_contour_reject(dist_same_contour_reject) {} + grid(grid), idx_contour(contour_idx), contour(grid.contours()[contour_idx]), boundary_parameters(polygon_distances), dist_same_contour_accept(dist_same_contour_accept), dist_same_contour_reject(dist_same_contour_reject) {} void init(const Points &contour, const Point &apoint) { @@ -630,12 +630,12 @@ static std::vector contour_distance(const EdgeGrid::Grid &grid, // Complex case: The closest segment originates from the same contour as the starting point. // Reject the closest point if its distance along the contour is reasonable compared to the current contour bisector // (this->pt, foot). - const Slic3r::Points &ipts = *grid.contours()[it_contour_and_segment->first]; - double param_lo = boundary_parameters[this->idx_point]; - double param_hi = t * sqrt(l2); - double param_end = boundary_parameters.back(); + const EdgeGrid::Contour &contour = grid.contours()[it_contour_and_segment->first]; + double param_lo = boundary_parameters[this->idx_point]; + double param_hi = t * sqrt(l2); + double param_end = boundary_parameters.back(); const size_t ipt = it_contour_and_segment->second; - if (ipt + 1 < ipts.size()) + if (contour.begin() + ipt + 1 < contour.end()) param_hi += boundary_parameters[ipt > 0 ? ipt - 1 : 0]; if (param_lo > param_hi) std::swap(param_lo, param_hi); @@ -649,9 +649,9 @@ static std::vector contour_distance(const EdgeGrid::Grid &grid, // longer than the bisector. That is, the path shall not bulge away from the bisector too much. // Bulge is estimated by 0.6 of the circle circumference drawn around the bisector. // Test whether the contour is convex or concave. - bool inside = (t == 0.) ? this->inside_corner(ipts, ipt, this->point) : - (t == 1.) ? this->inside_corner(ipts, ipt + 1 == ipts.size() ? 0 : ipt + 1, this->point) : - this->left_of_segment(ipts, ipt, this->point); + bool inside = (t == 0.) ? this->inside_corner(contour, ipt, this->point) : + (t == 1.) ? this->inside_corner(contour, contour.segment_idx_next(ipt), this->point) : + this->left_of_segment(contour, ipt, this->point); accept = inside && dist_along_contour > 0.6 * M_PI * dist; } } @@ -668,7 +668,7 @@ static std::vector contour_distance(const EdgeGrid::Grid &grid, const EdgeGrid::Grid &grid; const size_t idx_contour; - const Points &contour; + const EdgeGrid::Contour &contour; const std::vector &boundary_parameters; const double dist_same_contour_accept; @@ -691,25 +691,27 @@ static std::vector contour_distance(const EdgeGrid::Grid &grid, return Vec2d(-v1.y() - v2.y(), v1.x() + v2.x()); } - static bool inside_corner(const Slic3r::Points &contour, size_t i, const Point &pt_oposite) + static bool inside_corner(const EdgeGrid::Contour &contour, size_t i, const Point &pt_oposite) { const Vec2d pt = pt_oposite.cast(); - size_t iprev = prev_idx_modulo(i, contour); - size_t inext = next_idx_modulo(i, contour); - Vec2d v1 = (contour[i] - contour[iprev]).cast(); - Vec2d v2 = (contour[inext] - contour[i]).cast(); - bool left_of_v1 = cross2(v1, pt - contour[iprev].cast()) > 0.; - bool left_of_v2 = cross2(v2, pt - contour[i].cast()) > 0.; + const Point &pt_prev = contour.segment_prev(i); + const Point &pt_this = contour.segment_start(i); + const Point &pt_next = contour.segment_end(i); + Vec2d v1 = (pt_this - pt_prev).cast(); + Vec2d v2 = (pt_next - pt_this).cast(); + bool left_of_v1 = cross2(v1, pt - pt_prev.cast()) > 0.; + bool left_of_v2 = cross2(v2, pt - pt_this.cast()) > 0.; return cross2(v1, v2) > 0 ? left_of_v1 && left_of_v2 : // convex corner left_of_v1 || left_of_v2; // concave corner } - static bool left_of_segment(const Slic3r::Points &contour, size_t i, const Point &pt_oposite) + static bool left_of_segment(const EdgeGrid::Contour &contour, size_t i, const Point &pt_oposite) { - const Vec2d pt = pt_oposite.cast(); - size_t inext = next_idx_modulo(i, contour); - Vec2d v = (contour[inext] - contour[i]).cast(); - return cross2(v, pt - contour[i].cast()) > 0.; + const Vec2d pt = pt_oposite.cast(); + const Point &pt_this = contour.segment_start(i); + const Point &pt_next = contour.segment_end(i); + Vec2d v = (pt_next - pt_this).cast(); + return cross2(v, pt - pt_this.cast()) > 0.; } } visitor(grid, contour_idx, poly_distances, 0.5 * compensation * M_PI, search_radius); diff --git a/src/libslic3r/GCode/CoolingBuffer.cpp b/src/libslic3r/GCode/CoolingBuffer.cpp index 07ab197f27f..3c9c62fc5eb 100644 --- a/src/libslic3r/GCode/CoolingBuffer.cpp +++ b/src/libslic3r/GCode/CoolingBuffer.cpp @@ -683,6 +683,13 @@ std::string CoolingBuffer::apply_layer_cooldown( int min_fan_speed = EXTRUDER_CONFIG(min_fan_speed); int fan_speed_new = EXTRUDER_CONFIG(fan_always_on) ? min_fan_speed : 0; int disable_fan_first_layers = EXTRUDER_CONFIG(disable_fan_first_layers); + // Is the fan speed ramp enabled? + int full_fan_speed_layer = EXTRUDER_CONFIG(full_fan_speed_layer); + if (disable_fan_first_layers <= 0 && full_fan_speed_layer > 0) { + // When ramping up fan speed from disable_fan_first_layers to full_fan_speed_layer, force disable_fan_first_layers above zero, + // so there will be a zero fan speed at least at the 1st layer. + disable_fan_first_layers = 1; + } if (int(layer_id) >= disable_fan_first_layers) { int max_fan_speed = EXTRUDER_CONFIG(max_fan_speed); float slowdown_below_layer_time = float(EXTRUDER_CONFIG(slowdown_below_layer_time)); @@ -699,11 +706,6 @@ std::string CoolingBuffer::apply_layer_cooldown( } } bridge_fan_speed = EXTRUDER_CONFIG(bridge_fan_speed); - // Is the fan speed ramp enabled? - int full_fan_speed_layer = EXTRUDER_CONFIG(full_fan_speed_layer); - // When ramping up fan speed from disable_fan_first_layers to full_fan_speed_layer, force disable_fan_first_layers above zero, - // so there will be a zero fan speed at least at the 1st layer. - disable_fan_first_layers = std::max(disable_fan_first_layers, 1); if (int(layer_id) >= disable_fan_first_layers && int(layer_id) + 1 < full_fan_speed_layer) { // Ramp up the fan speed from disable_fan_first_layers to full_fan_speed_layer. float factor = float(int(layer_id + 1) - disable_fan_first_layers) / float(full_fan_speed_layer - disable_fan_first_layers); diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp index d553d727a36..52861afba0a 100644 --- a/src/libslic3r/GCode/GCodeProcessor.cpp +++ b/src/libslic3r/GCode/GCodeProcessor.cpp @@ -50,11 +50,6 @@ const std::string GCodeProcessor::Width_Tag = "WIDTH:"; const std::string GCodeProcessor::Mm3_Per_Mm_Tag = "MM3_PER_MM:"; #endif // ENABLE_GCODE_VIEWER_DATA_CHECKING -static bool is_valid_extrusion_role(int value) -{ - return (static_cast(erNone) <= value) && (value <= static_cast(erMixed)); -} - static void set_option_value(ConfigOptionFloats& option, size_t id, float value) { if (id < option.values.size()) @@ -2343,7 +2338,7 @@ void GCodeProcessor::process_T(const GCodeReader::GCodeLine& line) void GCodeProcessor::process_T(const std::string_view command) { if (command.length() > 1) { - int eid; + int eid = 0; if (! parse_number(command.substr(1), eid) || eid < 0 || eid > 255) { // T-1 is a valid gcode line for RepRap Firmwares (used to deselects all tools) see https://github.com/prusa3d/PrusaSlicer/issues/5677 if ((m_flavor != gcfRepRapFirmware && m_flavor != gcfRepRapSprinter) || eid != -1) diff --git a/src/libslic3r/GCode/SeamPlacer.cpp b/src/libslic3r/GCode/SeamPlacer.cpp index 1acc160f0f8..1778e06892a 100644 --- a/src/libslic3r/GCode/SeamPlacer.cpp +++ b/src/libslic3r/GCode/SeamPlacer.cpp @@ -664,7 +664,7 @@ static std::vector find_enforcer_centers(const Polygon& polygon, if (polygon.size() < 2 || enforcers_idxs.empty()) return out; - auto get_center_idx = [&polygon, &lengths](size_t start_idx, size_t end_idx) -> size_t { + auto get_center_idx = [&lengths](size_t start_idx, size_t end_idx) -> size_t { assert(end_idx >= start_idx); if (start_idx == end_idx) return start_idx; diff --git a/src/libslic3r/GCode/ToolOrdering.cpp b/src/libslic3r/GCode/ToolOrdering.cpp index 74f061e4eaf..fae4028deb6 100644 --- a/src/libslic3r/GCode/ToolOrdering.cpp +++ b/src/libslic3r/GCode/ToolOrdering.cpp @@ -600,7 +600,7 @@ float WipingExtrusions::mark_wiping_extrusions(const Print& print, unsigned int return std::max(0.f, volume_to_wipe); // Soluble filament cannot be wiped in a random infill, neither the filament after it // we will sort objects so that dedicated for wiping are at the beginning: - PrintObjectPtrs object_list = print.objects(); + ConstPrintObjectPtrs object_list = print.objects().vector(); std::sort(object_list.begin(), object_list.end(), [](const PrintObject* a, const PrintObject* b) { return a->config().wipe_into_objects; }); // We will now iterate through diff --git a/src/libslic3r/GCode/WipeTower.cpp b/src/libslic3r/GCode/WipeTower.cpp index 0f72dc415d7..e39b8191914 100644 --- a/src/libslic3r/GCode/WipeTower.cpp +++ b/src/libslic3r/GCode/WipeTower.cpp @@ -405,7 +405,7 @@ class WipeTowerWriter WipeTowerWriter& append(const std::string& text) { m_gcode += text; return *this; } - std::vector wipe_path() const + const std::vector& wipe_path() const { return m_wipe_path; } diff --git a/src/libslic3r/Geometry.hpp b/src/libslic3r/Geometry.hpp index f8d3b0a5c9f..85f181b92fd 100644 --- a/src/libslic3r/Geometry.hpp +++ b/src/libslic3r/Geometry.hpp @@ -213,7 +213,7 @@ inline bool liang_barsky_line_clipping_interval( double t0 = 0.0; double t1 = 1.0; // Traverse through left, right, bottom, top edges. - auto clip_side = [&x0, &v, &bbox, &t0, &t1](double p, double q) -> bool { + auto clip_side = [&t0, &t1](double p, double q) -> bool { if (p == 0) { if (q < 0) // Line parallel to the bounding box edge is fully outside of the bounding box. diff --git a/src/libslic3r/LayerRegion.cpp b/src/libslic3r/LayerRegion.cpp index 5ce56896d86..3763f2498b4 100644 --- a/src/libslic3r/LayerRegion.cpp +++ b/src/libslic3r/LayerRegion.cpp @@ -59,7 +59,7 @@ void LayerRegion::make_perimeters(const SurfaceCollection &slices, SurfaceCollec const PrintRegionConfig ®ion_config = this->region()->config(); // This needs to be in sync with PrintObject::_slice() slicing_mode_normal_below_layer! bool spiral_vase = print_config.spiral_vase && - (this->layer()->id() >= region_config.bottom_solid_layers.value && + (this->layer()->id() >= size_t(region_config.bottom_solid_layers.value) && this->layer()->print_z >= region_config.bottom_solid_min_thickness - EPSILON); PerimeterGenerator g( @@ -290,7 +290,7 @@ void LayerRegion::process_external_surfaces(const Layer *lower_layer, const Poly surfaces_append(bottom, union_ex(grown, true), bridges[idx_last]); } - fill_boundaries = std::move(to_polygons(fill_boundaries_ex)); + fill_boundaries = to_polygons(fill_boundaries_ex); BOOST_LOG_TRIVIAL(trace) << "Processing external surface, detecting bridges - done"; } @@ -327,7 +327,7 @@ void LayerRegion::process_external_surfaces(const Layer *lower_layer, const Poly surfaces_append( new_surfaces, // Don't use a safety offset as fill_boundaries were already united using the safety offset. - std::move(intersection_ex(polys, fill_boundaries, false)), + intersection_ex(polys, fill_boundaries, false), s1); } } @@ -424,7 +424,7 @@ void LayerRegion::elephant_foot_compensation_step(const float elephant_foot_comp Polygons slices_polygons = to_polygons(slices_expolygons); Polygons tmp = intersection(slices_polygons, trimming_polygons, false); append(tmp, diff(slices_polygons, offset(offset_ex(slices_expolygons, -elephant_foot_compensation_perimeter_step), elephant_foot_compensation_perimeter_step))); - this->slices.set(std::move(union_ex(tmp)), stInternal); + this->slices.set(union_ex(tmp), stInternal); } void LayerRegion::export_region_slices_to_svg(const char *path) const diff --git a/src/libslic3r/LibraryCheck.cpp b/src/libslic3r/LibraryCheck.cpp new file mode 100644 index 00000000000..1c7cbe54a4b --- /dev/null +++ b/src/libslic3r/LibraryCheck.cpp @@ -0,0 +1,103 @@ +#include "LibraryCheck.hpp" + +#include +#include + +#ifdef WIN32 +#include +# endif //WIN32 + +namespace Slic3r { + +#ifdef WIN32 + +//only dll name with .dll suffix - currently case sensitive +const std::vector LibraryCheck::blacklist({ L"NahimicOSD.dll" }); + +bool LibraryCheck::get_blacklisted(std::vector& names) +{ + if (m_found.empty()) + return false; + for (const auto& lib : m_found) + names.emplace_back(lib); + return true; + +} + +std::wstring LibraryCheck::get_blacklisted_string() +{ + std::wstring ret; + if (m_found.empty()) + return ret; + //ret = L"These libraries has been detected inside of the PrusaSlicer process.\n" + // L"We suggest stopping or uninstalling these services if you experience crashes while using PrusaSlicer.\n\n"; + for (const auto& lib : m_found) + { + ret += lib; + ret += L"\n"; + } + return ret; +} + +bool LibraryCheck::perform_check() +{ + + DWORD processID = GetCurrentProcessId(); + HMODULE hMods[1024]; + HANDLE hProcess; + DWORD cbNeeded; + unsigned int i; + + // Get a handle to the process. + hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | + PROCESS_VM_READ, + FALSE, processID); + if (NULL == hProcess) + return false; + // Get a list of all the modules in this process. + if (EnumProcessModulesEx(hProcess, hMods, sizeof(hMods), &cbNeeded, LIST_MODULES_ALL)) + { + //printf("Total Dlls: %d\n", cbNeeded / sizeof(HMODULE)); + for (i = 0; i < (cbNeeded / sizeof(HMODULE)); i++) + { + TCHAR szModName[MAX_PATH]; + // Get the full path to the module's file. + if (GetModuleFileNameEx(hProcess, hMods[i], szModName, + sizeof(szModName) / sizeof(TCHAR))) + { + // Add to list if blacklisted + if(LibraryCheck::is_blacklisted(szModName)) { + //wprintf(L"Contains library: %s\n", szModName); + if (std::find(m_found.begin(), m_found.end(), szModName) == m_found.end()) + m_found.emplace_back(szModName); + } + //wprintf(L"%s\n", szModName); + } + } + } + + CloseHandle(hProcess); + //printf("\n"); + return !m_found.empty(); + +} + +bool LibraryCheck::is_blacklisted(std::wstring dllpath) +{ + std::wstring dllname = boost::filesystem::path(dllpath).filename().wstring(); + //std::transform(dllname.begin(), dllname.end(), dllname.begin(), std::tolower); + if (std::find(LibraryCheck::blacklist.begin(), LibraryCheck::blacklist.end(), dllname) != LibraryCheck::blacklist.end()) { + //std::wprintf(L"%s is blacklisted\n", dllname.c_str()); + return true; + } + //std::wprintf(L"%s is NOT blacklisted\n", dllname.c_str()); + return false; +} +bool LibraryCheck::is_blacklisted(std::string dllpath) +{ + return LibraryCheck::is_blacklisted(boost::nowide::widen(dllpath)); +} + +#endif //WIN32 + +} // namespace Slic3r diff --git a/src/libslic3r/LibraryCheck.hpp b/src/libslic3r/LibraryCheck.hpp new file mode 100644 index 00000000000..663bf019e2f --- /dev/null +++ b/src/libslic3r/LibraryCheck.hpp @@ -0,0 +1,45 @@ +#ifndef slic3r_LibraryCheck_hpp_ +#define slic3r_LibraryCheck_hpp_ + +#ifdef WIN32 +#include +#include +#include +#endif //WIN32 + +namespace Slic3r { + +#ifdef WIN32 +class LibraryCheck +{ +public: + static LibraryCheck& get_instance() + { + static LibraryCheck instance; + + return instance; + } +private: + LibraryCheck() {} + + std::vector m_found; +public: + LibraryCheck(LibraryCheck const&) = delete; + void operator=(LibraryCheck const&) = delete; + // returns all found blacklisted dlls + bool get_blacklisted(std::vector& names); + std::wstring get_blacklisted_string(); + // returns true if enumerating found blacklisted dll + bool perform_check(); + + static bool is_blacklisted(std::string dllpath); + static bool is_blacklisted(std::wstring dllpath); +private: + static const std::vector blacklist; +}; + +#endif //WIN32 + +} // namespace Slic3r + +#endif //slic3r_LibraryCheck_hpp_ \ No newline at end of file diff --git a/src/libslic3r/MarchingSquares.hpp b/src/libslic3r/MarchingSquares.hpp index d5f07fbde6d..8370c8cef9a 100644 --- a/src/libslic3r/MarchingSquares.hpp +++ b/src/libslic3r/MarchingSquares.hpp @@ -297,7 +297,7 @@ template class Grid { case SquareTag::full: case SquareTag::none: { Coord crd{tl(cell) + Coord{m_cellsize.r / 2, m_cellsize.c / 2}}; - return {{crd, Dir::none, m_rst}, crd}; + return {{crd, Dir::none, m_rst}, {crd}}; } } diff --git a/src/libslic3r/PerimeterGenerator.cpp b/src/libslic3r/PerimeterGenerator.cpp index b209e85b8e3..688b253f79a 100644 --- a/src/libslic3r/PerimeterGenerator.cpp +++ b/src/libslic3r/PerimeterGenerator.cpp @@ -5,6 +5,7 @@ #include #include +#include namespace Slic3r { @@ -168,7 +169,7 @@ static ExtrusionEntityCollection traverse_loops(const PerimeterGenerator &perime (float)perimeter_generator.layer_height); // get overhang paths by checking what parts of this loop fall - // outside the grown lower slices (thus where the distance between + // outside the grown lower slices (thus where the distance between // the loop centerline and original lower slices is >= half nozzle diameter extrusion_paths_append( paths, @@ -233,8 +234,130 @@ static ExtrusionEntityCollection traverse_loops(const PerimeterGenerator &perime return out; } +/* +enum class FuzzyShape { + Triangle, + Sawtooth, + Random +}; +*/ + +static void fuzzy_polygon(Polygon &poly, /* FuzzyShape shape, */ double fuzzy_skin_thickness, double fuzzy_skin_point_dist) +{ +#if 0 + Point last = poly.points.at(poly.points.size() - 1); + Point last_processed = last; + + double max_length = scale_(2); + double min_length = scale_(1); + + if (poly.length() < scale_(5)) + return; + + deepness *= 3; + + bool triangle_or_sawtooth = shape == FuzzyShape::Sawtooth; + double length_sum = 0; + Points::iterator it = poly.points.begin(); + while (it != poly.points.end()) { + Point &pt = *it; + + Line line(last, pt); + double length = line.length(); + + // split long line + if (length > max_length) { + auto parts = int(ceil(length / max_length)); + if (parts == 2) { + Point point_to_insert(line.midpoint()); + it = poly.points.insert(it, point_to_insert); + } + else { + Vector part_vector = line.vector() / parts; + + Points points_to_insert; + Point point_to_insert(last); + while (--parts) { + point_to_insert += part_vector; + Point point_to_insert_2(point_to_insert); + points_to_insert.push_back(point_to_insert_2); + } + + it = poly.points.insert(it, points_to_insert.begin(), points_to_insert.end()); + } + continue; + } + + length_sum += length; + + // join short lines + if (length_sum < min_length) { + last = pt; + it = poly.points.erase(it); + continue; + } + + line = Line(last_processed, pt); + last = pt; + last_processed = pt; + + if (shape == FuzzyShape::Random) { + triangle_or_sawtooth = !(rand() % 2); + } + + Point point_to_insert(triangle_or_sawtooth ? pt : line.midpoint()); + + int scale = (rand() % deepness) + 1; + + Vec2d normal = line.normal().cast(); + normal /= line.length() / scale_(1.) / ((double)scale / 20.); + + it = poly.points.insert(it, point_to_insert + normal.cast()) + 2; + + length_sum = 0; + } + +#else + const double min_dist_between_points = fuzzy_skin_point_dist * 3. / 4.; // hardcoded: the point distance may vary between 3/4 and 5/4 the supplied value + const double range_random_point_dist = fuzzy_skin_point_dist / 2.; + double dist_left_over = double(rand()) * (min_dist_between_points / 2) / double(RAND_MAX); // the distance to be traversed on the line before making the first new point + Point* p0 = &poly.points.back(); + Points out; + out.reserve(poly.points.size()); + for (Point &p1 : poly.points) + { // 'a' is the (next) new point between p0 and p1 + Vec2d p0p1 = (p1 - *p0).cast(); + double p0p1_size = p0p1.norm(); + // so that p0p1_size - dist_last_point evaulates to dist_left_over - p0p1_size + double dist_last_point = dist_left_over + p0p1_size * 2.; + for (double p0pa_dist = dist_left_over; p0pa_dist < p0p1_size; + p0pa_dist += min_dist_between_points + double(rand()) * range_random_point_dist / double(RAND_MAX)) + { + double r = double(rand()) * (fuzzy_skin_thickness * 2.) / double(RAND_MAX) - fuzzy_skin_thickness; + out.emplace_back(*p0 + (p0p1 * (p0pa_dist / p0p1_size) + perp(p0p1).cast().normalized() * r).cast()); + dist_last_point = p0pa_dist; + } + dist_left_over = p0p1_size - dist_last_point; + p0 = &p1; + } + while (out.size() < 3) { + size_t point_idx = poly.size() - 2; + out.emplace_back(poly[point_idx]); + if (point_idx == 0) + break; + -- point_idx; + } + if (out.size() >= 3) + poly.points = std::move(out); +#endif +} + void PerimeterGenerator::process() { + // nasty hack! initialize random generator + auto time_us = std::chrono::duration_cast(std::chrono::time_point_cast(std::chrono::high_resolution_clock::now()).time_since_epoch()).count(); + srand(this->layer_id * time_us); + // other perimeters m_mm3_per_mm = this->perimeter_flow.mm3_per_mm(); coord_t perimeter_width = this->perimeter_flow.scaled_width(); @@ -275,6 +398,32 @@ void PerimeterGenerator::process() m_lower_slices_polygons = offset(*this->lower_slices, float(scale_(+nozzle_diameter/2))); } + // fuzzy skin configuration + double fuzzy_skin_thickness = scale_(this->object_config->fuzzy_skin_thickness); + double fuzzy_skin_point_dist = scale_(this->object_config->fuzzy_skin_point_dist); + //FuzzyShape fuzzy_skin_shape; + if (this->object_config->fuzzy_skin_perimeter_mode != FuzzySkinPerimeterMode::None) { + /* + switch (this->object_config->fuzzy_skin_shape) { + case FuzzySkinShape::Triangle1: + case FuzzySkinShape::Triangle2: + case FuzzySkinShape::Triangle3: + fuzzy_skin_shape = FuzzyShape::Triangle; + break; + case FuzzySkinShape::Sawtooth1: + case FuzzySkinShape::Sawtooth2: + case FuzzySkinShape::Sawtooth3: + fuzzy_skin_shape = FuzzyShape::Sawtooth; + break; + case FuzzySkinShape::Random1: + case FuzzySkinShape::Random2: + case FuzzySkinShape::Random3: + fuzzy_skin_shape = FuzzyShape::Random; + break; + } + */ + } + // we need to process each island separately because we might have different // extra perimeters for each one for (const Surface &surface : this->slices->surfaces) { @@ -355,13 +504,35 @@ void PerimeterGenerator::process() // If i > loop_number, we were looking just for gaps. break; } - for (const ExPolygon &expolygon : offsets) { + for (ExPolygon &expolygon : offsets) { // Outer contour may overlap with an inner contour, // inner contour may overlap with another inner contour, // outer contour may overlap with itself. //FIXME evaluate the overlaps, annotate each point with an overlap depth, - // compensate for the depth of intersection. - contours[i].emplace_back(PerimeterGeneratorLoop(expolygon.contour, i, true)); + + bool skip_polygon = false; + + if (this->object_config->fuzzy_skin_perimeter_mode != FuzzySkinPerimeterMode::None) { + if (i == 0 && (this->object_config->fuzzy_skin_perimeter_mode != FuzzySkinPerimeterMode::ExternalSkipFirst || this->layer_id > 0)) { + if ( + this->object_config->fuzzy_skin_perimeter_mode == FuzzySkinPerimeterMode::External || + this->object_config->fuzzy_skin_perimeter_mode == FuzzySkinPerimeterMode::ExternalSkipFirst + ) { + ExPolygon expolygon_fuzzy(expolygon); + fuzzy_polygon(expolygon_fuzzy.contour, /* fuzzy_skin_shape, */ fuzzy_skin_thickness, fuzzy_skin_point_dist); + // compensate for the depth of intersection. + contours[i].emplace_back(PerimeterGeneratorLoop(expolygon_fuzzy.contour, i, true)); + skip_polygon = true; + } else + fuzzy_polygon(expolygon.contour, /* fuzzy_skin_shape, */ fuzzy_skin_thickness, fuzzy_skin_point_dist); + } + } + + if (!skip_polygon) { + // compensate for the depth of intersection. + contours[i].emplace_back(PerimeterGeneratorLoop(expolygon.contour, i, true)); + } + if (! expolygon.holes.empty()) { holes[i].reserve(holes[i].size() + expolygon.holes.size()); for (const Polygon &hole : expolygon.holes) @@ -436,7 +607,7 @@ void PerimeterGenerator::process() // we continue inwards after having finished the brim // TODO: add test for perimeter order if (this->config->external_perimeters_first || - (this->layer_id == 0 && this->print_config->brim_width.value > 0)) + (this->layer_id == 0 && this->object_config->brim_width.value > 0)) entities.reverse(); // append perimeters for this slice as a collection if (! entities.empty()) diff --git a/src/libslic3r/Point.hpp b/src/libslic3r/Point.hpp index a6525af4ea9..d11af8b58cb 100644 --- a/src/libslic3r/Point.hpp +++ b/src/libslic3r/Point.hpp @@ -417,7 +417,7 @@ namespace boost { namespace polygon { typedef coord_t coordinate_type; static inline coordinate_type get(const Slic3r::Point& point, orientation_2d orient) { - return (coordinate_type)point((orient == HORIZONTAL) ? 0 : 1); + return static_cast(point((orient == HORIZONTAL) ? 0 : 1)); } }; diff --git a/src/libslic3r/Polygon.cpp b/src/libslic3r/Polygon.cpp index f74df1c9a2a..7c588c67cc2 100644 --- a/src/libslic3r/Polygon.cpp +++ b/src/libslic3r/Polygon.cpp @@ -96,6 +96,14 @@ bool Polygon::make_clockwise() return false; } +void Polygon::douglas_peucker(double tolerance) +{ + this->points.push_back(this->points.front()); + Points p = MultiPoint::_douglas_peucker(this->points, tolerance); + p.pop_back(); + this->points = std::move(p); +} + // Does an unoriented polygon contain a point? // Tested by counting intersections along a horizontal line. bool Polygon::contains(const Point &point) const diff --git a/src/libslic3r/Polygon.hpp b/src/libslic3r/Polygon.hpp index b550ae7d7ad..aa72b4244d8 100644 --- a/src/libslic3r/Polygon.hpp +++ b/src/libslic3r/Polygon.hpp @@ -55,6 +55,7 @@ class Polygon : public MultiPoint bool make_counter_clockwise(); bool make_clockwise(); bool is_valid() const { return this->points.size() >= 3; } + void douglas_peucker(double tolerance); // Does an unoriented polygon contain a point? // Tested by counting intersections along a horizontal line. diff --git a/src/libslic3r/Polyline.hpp b/src/libslic3r/Polyline.hpp index ef1da9afb92..9c70522bfbf 100644 --- a/src/libslic3r/Polyline.hpp +++ b/src/libslic3r/Polyline.hpp @@ -75,6 +75,7 @@ class Polyline : public MultiPoint { template void simplify_by_visibility(const T &area); void split_at(const Point &point, Polyline* p1, Polyline* p2) const; bool is_straight() const; + bool is_closed() const { return this->points.front() == this->points.back(); } }; // Don't use this class in production code, it is used exclusively by the Perl binding for unit tests! diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index c2ff343bbcd..9b98e87cb93 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -15,7 +15,7 @@ // !!! If you needed to translate some string, // !!! please use _L(string) // !!! _() - is a standard wxWidgets macro to translate -// !!! L() is used only for marking localizable string +// !!! L() is used only for marking localizable string // !!! It will be used in "xgettext" to create a Locating Message Catalog. #define L(s) s #endif /* L */ @@ -386,7 +386,7 @@ void Preset::set_visible_from_appconfig(const AppConfig &app_config) } else if (type == TYPE_FILAMENT || type == TYPE_SLA_MATERIAL) { const std::string §ion_name = (type == TYPE_FILAMENT) ? AppConfig::SECTION_FILAMENTS : AppConfig::SECTION_MATERIALS; 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. const std::map &installed = app_config.get_section(section_name); auto has = [&installed](const std::string &name) { @@ -403,14 +403,15 @@ void Preset::set_visible_from_appconfig(const AppConfig &app_config) const std::vector& Preset::print_options() { static std::vector s_opts { - "layer_height", "first_layer_height", "perimeters", "spiral_vase", "slice_closing_radius", + "layer_height", "first_layer_height", "perimeters", "spiral_vase", "slice_closing_radius", "top_solid_layers", "top_solid_min_thickness", "bottom_solid_layers", "bottom_solid_min_thickness", "extra_perimeters", "ensure_vertical_shell_thickness", "avoid_crossing_perimeters", "thin_walls", "overhangs", "seam_position", "external_perimeters_first", "fill_density", "fill_pattern", "top_fill_pattern", "bottom_fill_pattern", "infill_every_layers", "infill_only_where_needed", "solid_infill_every_layers", "fill_angle", "bridge_angle", - "solid_infill_below_area", "only_retract_when_crossing_perimeters", "infill_first", + "solid_infill_below_area", "only_retract_when_crossing_perimeters", "infill_first", "ironing", "ironing_type", "ironing_flowrate", "ironing_speed", "ironing_spacing", "max_print_speed", "max_volumetric_speed", "avoid_crossing_perimeters_max_detour", + "fuzzy_skin_perimeter_mode", /* "fuzzy_skin_shape", */ "fuzzy_skin_thickness", "fuzzy_skin_point_dist", #ifdef HAS_PRESSURE_EQUALIZER "max_volumetric_extrusion_rate_slope_positive", "max_volumetric_extrusion_rate_slope_negative", #endif /* HAS_PRESSURE_EQUALIZER */ @@ -418,10 +419,10 @@ const std::vector& Preset::print_options() "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_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", - "raft_layers", "raft_overhangs", "raft_contact_distance", "raft_xy_size_compensation", "raft_size_adjust", - "support_material_pattern", "support_material_with_sheath", - "support_material_spacing", "support_material_synchronize_layers", "support_material_angle", "support_material_interface_layers", + "min_skirt_length", "brim_width", "brim_offset", "brim_type", "support_material", "support_material_auto", "support_material_threshold", "support_material_enforce_layers", + "raft_overhangs", "raft_contact_distance", "raft_xy_size_compensation", "raft_size_adjust", + "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_interface_spacing", "support_material_interface_contact_loops", "support_material_contact_distance", "support_material_buildplate_only", "dont_support_bridges", "notes", "complete_objects", "extruder_clearance_radius", "extruder_clearance_height", "gcode_comments", "gcode_label_objects", "output_filename_format", "post_process", "perimeter_extruder", @@ -485,7 +486,7 @@ const std::vector& Preset::printer_options() "between_objects_gcode", "printer_vendor", "printer_model", "printer_variant", "printer_notes", "cooling_tube_retraction", "cooling_tube_length", "high_current_on_filament_swap", "parking_pos_retraction", "extra_loading_move", "max_print_height", "default_print_profile", "inherits", - "remaining_times", "silent_mode", + "remaining_times", "silent_mode", "machine_limits_usage", "thumbnails" }; s_opts.insert(s_opts.end(), Preset::machine_limits_options().begin(), Preset::machine_limits_options().end()); @@ -616,10 +617,6 @@ PresetCollection::PresetCollection(Preset::Type type, const std::vector m_num_default_presets) { @@ -650,7 +647,7 @@ void PresetCollection::add_default_preset(const std::vector &keys, // Throws an exception on error. void PresetCollection::load_presets(const std::string &dir_path, const std::string &subdir) { - // Don't use boost::filesystem::canonical() on Windows, it is broken in regard to reparse points, + // Don't use boost::filesystem::canonical() on Windows, it is broken in regard to reparse points, // see https://github.com/prusa3d/PrusaSlicer/issues/732 boost::filesystem::path dir = boost::filesystem::absolute(boost::filesystem::path(dir_path) / subdir).make_preferred(); m_dir_path = dir.string(); @@ -974,7 +971,7 @@ const Preset* PresetCollection::get_selected_preset_parent() const // Resolve the "renamed_from" field. assert(! inherits.empty()); auto it = this->find_preset_renamed(inherits); - if (it != m_presets.end()) + if (it != m_presets.end()) preset = &(*it); } return (preset == nullptr/* || preset->is_default*/ || preset->is_external) ? nullptr : preset; @@ -989,17 +986,17 @@ const Preset* PresetCollection::get_preset_parent(const Preset& child) const const Preset* preset = this->find_preset(inherits, false); if (preset == nullptr) { auto it = this->find_preset_renamed(inherits); - if (it != m_presets.end()) + if (it != m_presets.end()) preset = &(*it); } - return + return // not found - (preset == nullptr/* || preset->is_default */|| + (preset == nullptr/* || preset->is_default */|| // this should not happen, user profile should not derive from an external profile preset->is_external || // this should not happen, however people are creative, see GH #4996 - preset == &child) ? - nullptr : + preset == &child) ? + nullptr : preset; } @@ -1026,7 +1023,7 @@ const std::string& PresetCollection::get_preset_name_by_alias(const std::string& // Continue over all profile names with the same alias. it != m_map_alias_to_profile_name.end() && it->first == alias; ++ it) if (auto it_preset = this->find_preset_internal(it->second); - it_preset != m_presets.end() && it_preset->name == it->second && + it_preset != m_presets.end() && it_preset->name == it->second && it_preset->is_visible && (it_preset->is_compatible || size_t(it_preset - m_presets.begin()) == m_idx_selected)) return it_preset->name; return alias; @@ -1096,7 +1093,7 @@ size_t PresetCollection::update_compatible_internal(const PresetWithVendorProfil some_compatible |= preset_edited.is_compatible; if (active_print != nullptr) preset_edited.is_compatible &= is_compatible_with_print(this_preset_with_vendor_profile, *active_print, active_printer); - if (! preset_edited.is_compatible && selected && + if (! preset_edited.is_compatible && selected && (unselect_if_incompatible == PresetSelectCompatibleType::Always || (unselect_if_incompatible == PresetSelectCompatibleType::OnlyIfWasCompatible && was_compatible))) m_idx_selected = size_t(-1); if (selected) @@ -1278,6 +1275,18 @@ std::vector PresetCollection::merge_presets(PresetCollection &&othe return duplicates; } +void PresetCollection::update_vendor_ptrs_after_copy(const VendorMap &new_vendors) +{ + for (Preset &preset : m_presets) + if (preset.vendor != nullptr) { + assert(! preset.is_default && ! preset.is_external); + // Re-assign a pointer to the vendor structure in the new PresetBundle. + auto it = new_vendors.find(preset.vendor->id); + assert(it != new_vendors.end()); + preset.vendor = &it->second; + } +} + void PresetCollection::update_map_alias_to_profile_name() { m_map_alias_to_profile_name.clear(); @@ -1425,13 +1434,13 @@ const std::set& PhysicalPrinter::get_preset_names() const return preset_names; } -bool PhysicalPrinter::has_empty_config() const +bool PhysicalPrinter::has_empty_config() const { - return config.opt_string("print_host" ).empty() && - config.opt_string("printhost_apikey" ).empty() && - config.opt_string("printhost_cafile" ).empty() && + return config.opt_string("print_host" ).empty() && + config.opt_string("printhost_apikey" ).empty() && + config.opt_string("printhost_cafile" ).empty() && config.opt_string("printhost_port" ).empty() && - config.opt_string("printhost_user" ).empty() && + config.opt_string("printhost_user" ).empty() && config.opt_string("printhost_password").empty(); } @@ -1443,7 +1452,7 @@ void PhysicalPrinter::update_preset_names_in_config() name += el + ";"; name.pop_back(); config.set_key_value("preset_name", new ConfigOptionString(name)); - } + } } void PhysicalPrinter::save(const std::string& file_name_from, const std::string& file_name_to) @@ -1492,7 +1501,7 @@ bool PhysicalPrinter::delete_preset(const std::string& preset_name) return preset_names.erase(preset_name) > 0; } -PhysicalPrinter::PhysicalPrinter(const std::string& name, const DynamicPrintConfig& default_config) : +PhysicalPrinter::PhysicalPrinter(const std::string& name, const DynamicPrintConfig& default_config) : name(name), config(default_config) { update_from_config(config); @@ -1549,7 +1558,7 @@ PhysicalPrinterCollection::PhysicalPrinterCollection( const std::vector PhysicalPrinterCollection::get_printers_with_preset(con for (auto printer : m_printers) { if (printer.preset_names.size() == 1) - continue; + continue; if (printer.preset_names.find(preset_name) != printer.preset_names.end()) printers.emplace_back(printer.name); } @@ -1879,7 +1888,7 @@ void PhysicalPrinterCollection::unselect_printer() bool PhysicalPrinterCollection::is_selected(PhysicalPrinterCollection::ConstIterator it, const std::string& preset_name) const { - return m_idx_selected == size_t(it - m_printers.begin()) && + return m_idx_selected == size_t(it - m_printers.begin()) && m_selected_preset == preset_name; } diff --git a/src/libslic3r/Preset.hpp b/src/libslic3r/Preset.hpp index b6d44d58ff5..d81717f0e00 100644 --- a/src/libslic3r/Preset.hpp +++ b/src/libslic3r/Preset.hpp @@ -115,13 +115,11 @@ class Preset TYPE_COUNT, }; - Preset(Type type, const std::string &name, bool is_default = false) : type(type), is_default(is_default), name(name) {} - Type type = TYPE_INVALID; // The preset represents a "default" set of properties, // pulled from the default values of the PrintConfig (see PrintConfigDef for their definitions). - bool is_default; + bool is_default = false; // External preset points to a configuration, which has been loaded but not imported // into the Slic3r default configuration location. bool is_external = false; @@ -233,6 +231,9 @@ class Preset static std::string remove_invalid_keys(DynamicPrintConfig &config, const DynamicPrintConfig &default_config); protected: + Preset(Type type, const std::string &name, bool is_default = false) : type(type), is_default(is_default), name(name) {} + Preset() = default; + friend class PresetCollection; friend class PresetBundle; }; @@ -256,7 +257,6 @@ class PresetCollection public: // Initialize the PresetCollection with the "- default -" preset. PresetCollection(Preset::Type type, const std::vector &keys, const Slic3r::StaticPrintConfig &defaults, const std::string &default_name = "- default -"); - ~PresetCollection(); typedef std::deque::iterator Iterator; typedef std::deque::const_iterator ConstIterator; @@ -460,6 +460,15 @@ class PresetCollection size_t num_default_presets() { return m_num_default_presets; } protected: + PresetCollection() = default; + // Copy constructor and copy operators are not to be used from outside PresetBundle, + // as the Profile::vendor points to an instance of VendorProfile stored at parent PresetBundle! + PresetCollection(const PresetCollection &other) = default; + PresetCollection& operator=(const PresetCollection &other) = default; + // After copying a collection with the default operators above, call this function + // to adjust Profile::vendor pointers. + void update_vendor_ptrs_after_copy(const VendorMap &vendors); + // Select a preset, if it exists. If it does not exist, select an invalid (-1) index. // This is a temporary state, which shall be fixed immediately by the following step. bool select_preset_by_name_strict(const std::string &name); @@ -474,10 +483,6 @@ class PresetCollection void update_map_system_profile_renamed(); private: - PresetCollection(); - PresetCollection(const PresetCollection &other); - PresetCollection& operator=(const PresetCollection &other); - // Find a preset position in the sorted list of presets. // The "-- default -- " preset is always the first, so it needs // to be handled differently. @@ -507,9 +512,9 @@ class PresetCollection { return const_cast(this)->find_preset_renamed(name); } size_t update_compatible_internal(const PresetWithVendorProfile &active_printer, const PresetWithVendorProfile *active_print, PresetSelectCompatibleType unselect_if_incompatible); - +public: static std::vector dirty_options(const Preset *edited, const Preset *reference, const bool is_printer_type = false); - +private: // Type of this PresetCollection: TYPE_PRINT, TYPE_FILAMENT or TYPE_PRINTER. Preset::Type m_type; // List of presets, starting with the "- default -" preset. @@ -531,7 +536,7 @@ class PresetCollection // Path to the directory to store the config files into. std::string m_dir_path; - // to access select_preset_by_name_strict() + // to access select_preset_by_name_strict() and the default & copy constructors. friend class PresetBundle; }; @@ -542,9 +547,17 @@ class PrinterPresetCollection : public PresetCollection public: PrinterPresetCollection(Preset::Type type, const std::vector &keys, const Slic3r::StaticPrintConfig &defaults, const std::string &default_name = "- default -") : PresetCollection(type, keys, defaults, default_name) {} + const Preset& default_preset_for(const DynamicPrintConfig &config) const override; const Preset* find_by_model_id(const std::string &model_id) const; + +private: + PrinterPresetCollection() = default; + PrinterPresetCollection(const PrinterPresetCollection &other) = default; + PrinterPresetCollection& operator=(const PrinterPresetCollection &other) = default; + + friend class PresetBundle; }; namespace PresetUtils { @@ -634,7 +647,6 @@ class PhysicalPrinterCollection { public: PhysicalPrinterCollection(const std::vector& keys); - ~PhysicalPrinterCollection() {} typedef std::deque::iterator Iterator; typedef std::deque::const_iterator ConstIterator; @@ -725,7 +737,9 @@ class PhysicalPrinterCollection const DynamicPrintConfig& default_config() const { return m_default_config; } private: - PhysicalPrinterCollection& operator=(const PhysicalPrinterCollection& other); + friend class PresetBundle; + PhysicalPrinterCollection() = default; + PhysicalPrinterCollection& operator=(const PhysicalPrinterCollection& other) = default; // Find a physical printer position in the sorted list of printers. // The name of a printer should be unique and case insensitive diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index b31ee666445..7d08c93592e 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -105,8 +105,33 @@ PresetBundle::PresetBundle() : this->project_config.apply_only(FullPrintConfig::defaults(), s_project_options); } -PresetBundle::~PresetBundle() +PresetBundle::PresetBundle(const PresetBundle &rhs) { + *this = rhs; +} + +PresetBundle& PresetBundle::operator=(const PresetBundle &rhs) +{ + prints = rhs.prints; + sla_prints = rhs.sla_prints; + filaments = rhs.filaments; + sla_materials = rhs.sla_materials; + printers = rhs.printers; + physical_printers = rhs.physical_printers; + + filament_presets = rhs.filament_presets; + project_config = rhs.project_config; + vendors = rhs.vendors; + obsolete_presets = rhs.obsolete_presets; + + // Adjust Preset::vendor pointers to point to the copied vendors map. + prints .update_vendor_ptrs_after_copy(this->vendors); + sla_prints .update_vendor_ptrs_after_copy(this->vendors); + filaments .update_vendor_ptrs_after_copy(this->vendors); + sla_materials.update_vendor_ptrs_after_copy(this->vendors); + printers .update_vendor_ptrs_after_copy(this->vendors); + + return *this; } void PresetBundle::reset(bool delete_files) @@ -800,10 +825,9 @@ void PresetBundle::load_config_file_config(const std::string &name_or_path, bool compatible_printers_condition = compatible_printers_condition_values[1]; compatible_prints_condition = compatible_prints_condition_values.front(); Preset *loaded = nullptr; - if (is_external) { - auto [aloaded, modified] = this->filaments.load_external_preset(name_or_path, name, old_filament_profile_names->values.front(), config); - loaded = aloaded; - } else { + if (is_external) + loaded = this->filaments.load_external_preset(name_or_path, name, old_filament_profile_names->values.front(), config).first; + else { // called from Config Wizard. loaded= &this->filaments.load_preset(this->filaments.path_from_name(name), name, config); loaded->save(); @@ -891,7 +915,7 @@ void PresetBundle::load_config_file_config_bundle(const std::string &path, const std::string bundle_name = std::string(" - ") + boost::filesystem::path(path).filename().string(); // 2) Extract active configs from the config bundle, copy them and activate them in this bundle. - auto load_one = [this, &path, &bundle_name](PresetCollection &collection_dst, PresetCollection &collection_src, const std::string &preset_name_src, bool activate) -> std::string { + auto load_one = [&path, &bundle_name](PresetCollection &collection_dst, PresetCollection &collection_src, const std::string &preset_name_src, bool activate) -> std::string { Preset *preset_src = collection_src.find_preset(preset_name_src, false); Preset *preset_dst = collection_dst.find_preset(preset_name_src, false); assert(preset_src != nullptr); @@ -928,7 +952,11 @@ void PresetBundle::load_config_file_config_bundle(const std::string &path, const if (opt_compatible->type() == coStrings) static_cast(opt_compatible)->values.clear(); } - collection_dst.load_preset(path, preset_name_dst, std::move(preset_src->config), activate).is_external = true; + (collection_dst.type() == Preset::TYPE_FILAMENT ? + collection_dst.load_preset(path, preset_name_dst, preset_src->config, activate) : + // Only move the source config for non filament profiles, as single filament profile may be referenced multiple times. + collection_dst.load_preset(path, preset_name_dst, std::move(preset_src->config), activate)) + .is_external = true; return preset_name_dst; }; load_one(this->prints, tmp_bundle.prints, tmp_bundle.prints .get_selected_preset_name(), true); @@ -1141,33 +1169,26 @@ size_t PresetBundle::load_configbundle(const std::string &path, unsigned int fla for (const auto §ion : tree) { PresetCollection *presets = nullptr; - std::vector *loaded = nullptr; std::string preset_name; PhysicalPrinterCollection *ph_printers = nullptr; std::string ph_printer_name; if (boost::starts_with(section.first, "print:")) { presets = &this->prints; - loaded = &loaded_prints; preset_name = section.first.substr(6); } else if (boost::starts_with(section.first, "filament:")) { presets = &this->filaments; - loaded = &loaded_filaments; preset_name = section.first.substr(9); } else if (boost::starts_with(section.first, "sla_print:")) { presets = &this->sla_prints; - loaded = &loaded_sla_prints; preset_name = section.first.substr(10); } else if (boost::starts_with(section.first, "sla_material:")) { presets = &this->sla_materials; - loaded = &loaded_sla_materials; preset_name = section.first.substr(13); } else if (boost::starts_with(section.first, "printer:")) { presets = &this->printers; - loaded = &loaded_printers; preset_name = section.first.substr(8); } else if (boost::starts_with(section.first, "physical_printer:")) { ph_printers = &this->physical_printers; - loaded = &loaded_physical_printers; ph_printer_name = section.first.substr(17); } else if (section.first == "presets") { // Load the names of the active presets. @@ -1463,11 +1484,15 @@ void PresetBundle::update_compatible(PresetSelectCompatibleType select_other_pri int operator()(const Preset &preset) const { - return (! m_prefered_alias.empty() && m_prefered_alias == preset.alias) ? - // Matching an alias, always take this preset with priority. - std::numeric_limits::max() : - // Otherwise take the prefered profile, or the first compatible. - preset.name == m_prefered_name; + return + preset.is_default || preset.is_external ? + // Don't match any properties of the "-- default --" profile or the external profiles when switching printer profile. + 0 : + ! m_prefered_alias.empty() && m_prefered_alias == preset.alias ? + // Matching an alias, always take this preset with priority. + std::numeric_limits::max() : + // Otherwise take the prefered profile, or the first compatible. + preset.name == m_prefered_name; } private: @@ -1479,11 +1504,14 @@ void PresetBundle::update_compatible(PresetSelectCompatibleType select_other_pri class PreferedPrintProfileMatch : public PreferedProfileMatch { public: - PreferedPrintProfileMatch(const Preset &preset, const std::string &prefered_name) : - PreferedProfileMatch(preset.alias, prefered_name), m_prefered_layer_height(preset.config.opt_float("layer_height")) {} + PreferedPrintProfileMatch(const Preset *preset, const std::string &prefered_name) : + PreferedProfileMatch(preset ? preset->alias : std::string(), prefered_name), m_prefered_layer_height(preset ? preset->config.opt_float("layer_height") : 0) {} int operator()(const Preset &preset) const { + // Don't match any properties of the "-- default --" profile or the external profiles when switching printer profile. + if (preset.is_default || preset.is_external) + return 0; int match_quality = PreferedProfileMatch::operator()(preset); if (match_quality < std::numeric_limits::max()) { match_quality += 1; @@ -1507,6 +1535,9 @@ void PresetBundle::update_compatible(PresetSelectCompatibleType select_other_pri int operator()(const Preset &preset) const { + // Don't match any properties of the "-- default --" profile or the external profiles when switching printer profile. + if (preset.is_default || preset.is_external) + return 0; int match_quality = PreferedProfileMatch::operator()(preset); if (match_quality < std::numeric_limits::max()) { match_quality += 1; @@ -1524,14 +1555,17 @@ void PresetBundle::update_compatible(PresetSelectCompatibleType select_other_pri class PreferedFilamentsProfileMatch { public: - PreferedFilamentsProfileMatch(const Preset &preset, const std::vector &prefered_names) : - m_prefered_alias(preset.alias), - m_prefered_filament_type(preset.config.opt_string("filament_type", 0)), + PreferedFilamentsProfileMatch(const Preset *preset, const std::vector &prefered_names) : + m_prefered_alias(preset ? preset->alias : std::string()), + m_prefered_filament_type(preset ? preset->config.opt_string("filament_type", 0) : std::string()), m_prefered_names(prefered_names) {} int operator()(const Preset &preset) const { + // Don't match any properties of the "-- default --" profile or the external profiles when switching printer profile. + if (preset.is_default || preset.is_external) + return 0; if (! m_prefered_alias.empty() && m_prefered_alias == preset.alias) // Matching an alias, always take this preset with priority. return std::numeric_limits::max(); @@ -1554,7 +1588,7 @@ void PresetBundle::update_compatible(PresetSelectCompatibleType select_other_pri assert(printer_preset.config.has("default_filament_profile")); const std::vector &prefered_filament_profiles = printer_preset.config.option("default_filament_profile")->values; this->prints.update_compatible(printer_preset_with_vendor_profile, nullptr, select_other_print_if_incompatible, - PreferedPrintProfileMatch(this->prints.get_edited_preset(), printer_preset.config.opt_string("default_print_profile"))); + PreferedPrintProfileMatch(this->prints.get_selected_idx() == size_t(-1) ? nullptr : &this->prints.get_edited_preset(), printer_preset.config.opt_string("default_print_profile"))); const PresetWithVendorProfile print_preset_with_vendor_profile = this->prints.get_edited_preset_with_vendor_profile(); // Remember whether the filament profiles were compatible before updating the filament compatibility. std::vector filament_preset_was_compatible(this->filament_presets.size(), false); @@ -1564,7 +1598,7 @@ void PresetBundle::update_compatible(PresetSelectCompatibleType select_other_pri } // First select a first compatible profile for the preset editor. this->filaments.update_compatible(printer_preset_with_vendor_profile, &print_preset_with_vendor_profile, select_other_filament_if_incompatible, - PreferedFilamentsProfileMatch(this->filaments.get_edited_preset(), prefered_filament_profiles)); + PreferedFilamentsProfileMatch(this->filaments.get_selected_idx() == size_t(-1) ? nullptr : &this->filaments.get_edited_preset(), prefered_filament_profiles)); if (select_other_filament_if_incompatible != PresetSelectCompatibleType::Never) { // Verify validity of the current filament presets. const std::string prefered_filament_profile = prefered_filament_profiles.empty() ? std::string() : prefered_filament_profiles.front(); @@ -1591,10 +1625,10 @@ void PresetBundle::update_compatible(PresetSelectCompatibleType select_other_pri assert(printer_preset.config.has("default_sla_print_profile")); assert(printer_preset.config.has("default_sla_material_profile")); this->sla_prints.update_compatible(printer_preset_with_vendor_profile, nullptr, select_other_print_if_incompatible, - PreferedPrintProfileMatch(this->sla_prints.get_edited_preset(), printer_preset.config.opt_string("default_sla_print_profile"))); + PreferedPrintProfileMatch(this->sla_prints.get_selected_idx() == size_t(-1) ? nullptr : &this->sla_prints.get_edited_preset(), printer_preset.config.opt_string("default_sla_print_profile"))); const PresetWithVendorProfile sla_print_preset_with_vendor_profile = this->sla_prints.get_edited_preset_with_vendor_profile(); this->sla_materials.update_compatible(printer_preset_with_vendor_profile, &sla_print_preset_with_vendor_profile, select_other_filament_if_incompatible, - PreferedProfileMatch(this->sla_materials.get_edited_preset().alias, printer_preset.config.opt_string("default_sla_material_profile"))); + PreferedProfileMatch(this->sla_materials.get_selected_idx() == size_t(-1) ? std::string() : this->sla_materials.get_edited_preset().alias, printer_preset.config.opt_string("default_sla_material_profile"))); break; } default: break; diff --git a/src/libslic3r/PresetBundle.hpp b/src/libslic3r/PresetBundle.hpp index 5d7cc84ba2d..5902d420886 100644 --- a/src/libslic3r/PresetBundle.hpp +++ b/src/libslic3r/PresetBundle.hpp @@ -15,7 +15,8 @@ class PresetBundle { public: PresetBundle(); - ~PresetBundle(); + PresetBundle(const PresetBundle &rhs); + PresetBundle& operator=(const PresetBundle &rhs); // Remove all the presets but the "-- default --". // Optionally remove all the files referenced by the presets from the user profile directory. @@ -25,8 +26,7 @@ class PresetBundle // Load ini files of all types (print, filament, printer) from Slic3r::data_dir() / presets. // Load selections (current print, current filaments, current printer) from config.ini - // This is done just once on application start up. - void load_presets(AppConfig &config, const std::string &preferred_model_id = ""); + void load_presets(AppConfig &config, const std::string &preferred_model_id = std::string()); // Export selections (current print, current filaments, current printer) into config.ini void export_selections(AppConfig &config); diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 693c4e5beee..b96768904d8 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -1,8 +1,7 @@ -#include "clipper/clipper_z.hpp" - #include "Exception.hpp" #include "Print.hpp" #include "BoundingBox.hpp" +#include "Brim.hpp" #include "ClipperUtils.hpp" #include "Extruder.hpp" #include "Flow.hpp" @@ -15,8 +14,6 @@ #include "GCode/WipeTower.hpp" #include "Utils.hpp" -//#include "PrintExport.hpp" - #include #include @@ -174,7 +171,10 @@ bool Print::invalidate_state_by_config_options(const std::vector print_objects_old = std::move(m_objects); + PrintObjectPtrs print_objects_old = std::move(m_objects); m_objects.clear(); m_objects.reserve(print_objects_old.size()); for (PrintObject *print_object : print_objects_old) { @@ -945,7 +945,7 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_ // 4) Generate PrintObjects from ModelObjects and their instances. { - std::vector print_objects_new; + PrintObjectPtrs print_objects_new; print_objects_new.reserve(std::max(m_objects.size(), m_model.objects.size())); bool new_objects = false; // Walk over all new model objects and check, whether there are matching PrintObjects. @@ -1188,6 +1188,12 @@ bool Print::has_skirt() const return (m_config.skirt_height > 0 && m_config.skirts > 0) || this->has_infinite_skirt(); } +bool Print::has_brim() const +{ + return std::any_of(m_objects.begin(), m_objects.end(), + [](PrintObject *object) { return object->config().brim_type != btNoBrim && object->config().brim_width.value > 0.; }); +} + static inline bool sequential_print_horizontal_clearance_valid(const Print &print) { Polygons convex_hulls_other; @@ -1399,9 +1405,13 @@ std::string Print::validate() const return L("One or more object were assigned an extruder that the printer does not have."); #endif - auto validate_extrusion_width = [min_nozzle_diameter, max_nozzle_diameter](const ConfigBase &config, const char *opt_key, double layer_height, std::string &err_msg) -> bool { - double extrusion_width_min = config.get_abs_value(opt_key, min_nozzle_diameter); - double extrusion_width_max = config.get_abs_value(opt_key, max_nozzle_diameter); + auto validate_extrusion_width = [/*min_nozzle_diameter,*/ max_nozzle_diameter](const ConfigBase &config, const char *opt_key, double layer_height, std::string &err_msg) -> bool { + // This may change in the future, if we switch to "extrusion width wrt. nozzle diameter" + // instead of currently used logic "extrusion width wrt. layer height", see GH issues #1923 #2829. +// double extrusion_width_min = config.get_abs_value(opt_key, min_nozzle_diameter); +// double extrusion_width_max = config.get_abs_value(opt_key, max_nozzle_diameter); + double extrusion_width_min = config.get_abs_value(opt_key, layer_height); + double extrusion_width_max = config.get_abs_value(opt_key, layer_height); if (extrusion_width_min == 0) { // Default "auto-generated" extrusion width is always valid. } else if (extrusion_width_min <= layer_height) { @@ -1651,9 +1661,12 @@ void Print::process() if (this->set_started(psBrim)) { m_brim.clear(); m_first_layer_convex_hull.points.clear(); - if (m_config.brim_width > 0) { + if (this->has_brim()) { this->set_status(88, L("Generating brim")); - this->_make_brim(); + Polygons islands_area; + m_brim = make_brim(*this, this->make_try_cancel(), islands_area); + for (Polygon &poly : union_(this->first_layer_islands(), islands_area)) + append(m_first_layer_convex_hull.points, std::move(poly.points)); } // Brim depends on skirt (brim lines are trimmed by the skirt lines), therefore if // the skirt gets invalidated, brim gets invalidated as well and the following line is called. @@ -1827,164 +1840,6 @@ void Print::_make_skirt() append(m_skirt_convex_hull, std::move(poly.points)); } -void Print::_make_brim() -{ - // Brim is only printed on first layer and uses perimeter extruder. - Polygons islands = this->first_layer_islands(); - Polygons loops; - Flow flow = this->brim_flow(); - size_t num_loops = size_t(floor(m_config.brim_width.value / flow.spacing())); - for (size_t i = 0; i < num_loops; ++ i) { - this->throw_if_canceled(); - islands = offset(islands, float(flow.scaled_spacing()), jtSquare); - for (Polygon &poly : islands) { - // poly.simplify(SCALED_RESOLUTION); - poly.points.push_back(poly.points.front()); - Points p = MultiPoint::_douglas_peucker(poly.points, SCALED_RESOLUTION); - p.pop_back(); - poly.points = std::move(p); - } - if (i + 1 == num_loops) { - // Remember the outer edge of the last brim line extruded as m_first_layer_convex_hull. - for (Polygon &poly : islands) - append(m_first_layer_convex_hull.points, poly.points); - } - polygons_append(loops, offset(islands, -0.5f * float(flow.scaled_spacing()))); - } - loops = union_pt_chained_outside_in(loops, false); - - // If there is a possibility that brim intersects skirt, go through loops and split those extrusions - // The result is either the original Polygon or a list of Polylines - if (! m_skirt.empty() && m_config.skirt_distance.value < m_config.brim_width) - { - // Find the bounding polygons of the skirt - const Polygons skirt_inners = offset(dynamic_cast(m_skirt.entities.back())->polygon(), - -float(scale_(this->skirt_flow().spacing()))/2.f, - ClipperLib::jtRound, - float(scale_(0.1))); - const Polygons skirt_outers = offset(dynamic_cast(m_skirt.entities.front())->polygon(), - float(scale_(this->skirt_flow().spacing()))/2.f, - ClipperLib::jtRound, - float(scale_(0.1))); - - // First calculate the trimming region. - ClipperLib_Z::Paths trimming; - { - ClipperLib_Z::Paths input_subject; - ClipperLib_Z::Paths input_clip; - for (const Polygon &poly : skirt_outers) { - input_subject.emplace_back(); - ClipperLib_Z::Path &out = input_subject.back(); - out.reserve(poly.points.size()); - for (const Point &pt : poly.points) - out.emplace_back(pt.x(), pt.y(), 0); - } - for (const Polygon &poly : skirt_inners) { - input_clip.emplace_back(); - ClipperLib_Z::Path &out = input_clip.back(); - out.reserve(poly.points.size()); - for (const Point &pt : poly.points) - out.emplace_back(pt.x(), pt.y(), 0); - } - // init Clipper - ClipperLib_Z::Clipper clipper; - // add polygons - clipper.AddPaths(input_subject, ClipperLib_Z::ptSubject, true); - clipper.AddPaths(input_clip, ClipperLib_Z::ptClip, true); - // perform operation - clipper.Execute(ClipperLib_Z::ctDifference, trimming, ClipperLib_Z::pftEvenOdd, ClipperLib_Z::pftEvenOdd); - } - - // Second, trim the extrusion loops with the trimming regions. - ClipperLib_Z::Paths loops_trimmed; - { - // Produce a closed polyline (repeat the first point at the end). - ClipperLib_Z::Paths input_clip; - for (const Polygon &loop : loops) { - input_clip.emplace_back(); - ClipperLib_Z::Path& out = input_clip.back(); - out.reserve(loop.points.size()); - int64_t loop_idx = &loop - &loops.front(); - for (const Point& pt : loop.points) - // The Z coordinate carries index of the source loop. - out.emplace_back(pt.x(), pt.y(), loop_idx + 1); - out.emplace_back(out.front()); - } - // init Clipper - ClipperLib_Z::Clipper clipper; - clipper.ZFillFunction([](const ClipperLib_Z::IntPoint& e1bot, const ClipperLib_Z::IntPoint& e1top, const ClipperLib_Z::IntPoint& e2bot, const ClipperLib_Z::IntPoint& e2top, ClipperLib_Z::IntPoint& pt) { - // Assign a valid input loop identifier. Such an identifier is strictly positive, the next line is safe even in case one side of a segment - // hat the Z coordinate not set to the contour coordinate. - pt.Z = std::max(std::max(e1bot.Z, e1top.Z), std::max(e2bot.Z, e2top.Z)); - }); - // add polygons - clipper.AddPaths(input_clip, ClipperLib_Z::ptSubject, false); - clipper.AddPaths(trimming, ClipperLib_Z::ptClip, true); - // perform operation - ClipperLib_Z::PolyTree loops_trimmed_tree; - clipper.Execute(ClipperLib_Z::ctDifference, loops_trimmed_tree, ClipperLib_Z::pftEvenOdd, ClipperLib_Z::pftEvenOdd); - ClipperLib_Z::PolyTreeToPaths(loops_trimmed_tree, loops_trimmed); - } - - // Third, produce the extrusions, sorted by the source loop indices. - { - std::vector> loops_trimmed_order; - loops_trimmed_order.reserve(loops_trimmed.size()); - for (const ClipperLib_Z::Path &path : loops_trimmed) { - size_t input_idx = 0; - for (const ClipperLib_Z::IntPoint &pt : path) - if (pt.Z > 0) { - input_idx = (size_t)pt.Z; - break; - } - assert(input_idx != 0); - loops_trimmed_order.emplace_back(&path, input_idx); - } - std::stable_sort(loops_trimmed_order.begin(), loops_trimmed_order.end(), - [](const std::pair &l, const std::pair &r) { - return l.second < r.second; - }); - - Point last_pt(0, 0); - for (size_t i = 0; i < loops_trimmed_order.size();) { - // Find all pieces that the initial loop was split into. - size_t j = i + 1; - for (; j < loops_trimmed_order.size() && loops_trimmed_order[i].second == loops_trimmed_order[j].second; ++ j) ; - const ClipperLib_Z::Path &first_path = *loops_trimmed_order[i].first; - if (i + 1 == j && first_path.size() > 3 && first_path.front().X == first_path.back().X && first_path.front().Y == first_path.back().Y) { - auto *loop = new ExtrusionLoop(); - m_brim.entities.emplace_back(loop); - loop->paths.emplace_back(erSkirt, float(flow.mm3_per_mm()), float(flow.width), float(this->skirt_first_layer_height())); - Points &points = loop->paths.front().polyline.points; - points.reserve(first_path.size()); - for (const ClipperLib_Z::IntPoint &pt : first_path) - points.emplace_back(coord_t(pt.X), coord_t(pt.Y)); - i = j; - } else { - //FIXME The path chaining here may not be optimal. - ExtrusionEntityCollection this_loop_trimmed; - this_loop_trimmed.entities.reserve(j - i); - for (; i < j; ++ i) { - this_loop_trimmed.entities.emplace_back(new ExtrusionPath(erSkirt, float(flow.mm3_per_mm()), float(flow.width), float(this->skirt_first_layer_height()))); - const ClipperLib_Z::Path &path = *loops_trimmed_order[i].first; - Points &points = static_cast(this_loop_trimmed.entities.back())->polyline.points; - points.reserve(path.size()); - for (const ClipperLib_Z::IntPoint &pt : path) - points.emplace_back(coord_t(pt.X), coord_t(pt.Y)); - } - chain_and_reorder_extrusion_entities(this_loop_trimmed.entities, &last_pt); - m_brim.entities.reserve(m_brim.entities.size() + this_loop_trimmed.entities.size()); - append(m_brim.entities, std::move(this_loop_trimmed.entities)); - this_loop_trimmed.entities.clear(); - } - last_pt = m_brim.last_point(); - } - } - } else { - extrusion_entities_append_loops(m_brim.entities, std::move(loops), erSkirt, float(flow.mm3_per_mm()), float(flow.width), float(this->skirt_first_layer_height())); - } -} - Polygons Print::first_layer_islands() const { Polygons islands; @@ -2100,8 +1955,8 @@ void Print::_make_wipe_tower() if (idx_begin != size_t(-1)) { // Find the position in m_objects.first()->support_layers to insert these new support layers. double wipe_tower_new_layer_print_z_first = m_wipe_tower_data.tool_ordering.layer_tools()[idx_begin].print_z; - SupportLayerPtrs::const_iterator it_layer = m_objects.front()->support_layers().begin(); - SupportLayerPtrs::const_iterator it_end = m_objects.front()->support_layers().end(); + auto it_layer = m_objects.front()->support_layers().begin(); + auto it_end = m_objects.front()->support_layers().end(); for (; it_layer != it_end && (*it_layer)->print_z - EPSILON < wipe_tower_new_layer_print_z_first; ++ it_layer); // Find the stopper of the sequence of wipe tower layers, which do not have a counterpart in an object or a support layer. for (size_t i = idx_begin; i < idx_end; ++ i) { diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index 281ce35bc05..819cbab8ca8 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -73,7 +73,7 @@ class PrintRegion // Collect 0-based extruder indices used to print this region's object. void collect_object_printing_extruders(std::vector &object_extruders) const; - static void collect_object_printing_extruders(const PrintConfig &print_config, const PrintRegionConfig ®ion_config, std::vector &object_extruders); + static void collect_object_printing_extruders(const PrintConfig &print_config, const PrintRegionConfig ®ion_config, const bool has_brim, std::vector &object_extruders); // Methods modifying the PrintRegion's state: public: @@ -95,9 +95,39 @@ class PrintRegion ~PrintRegion() = default; }; +template +class ConstVectorOfPtrsAdaptor { +public: + // Returning a non-const pointer to const pointers to T. + T * const * begin() const { return m_data->data(); } + T * const * end() const { return m_data->data() + m_data->size(); } + const T* front() const { return m_data->front(); } + const T* back() const { return m_data->front(); } + size_t size() const { return m_data->size(); } + bool empty() const { return m_data->empty(); } + const T* operator[](size_t i) const { return (*m_data)[i]; } + const T* at(size_t i) const { return m_data->at(i); } + std::vector vector() const { return std::vector(this->begin(), this->end()); } +protected: + ConstVectorOfPtrsAdaptor(const std::vector *data) : m_data(data) {} +private: + const std::vector *m_data; +}; + +typedef std::vector LayerPtrs; +typedef std::vector ConstLayerPtrs; +class ConstLayerPtrsAdaptor : public ConstVectorOfPtrsAdaptor { + friend PrintObject; + ConstLayerPtrsAdaptor(const LayerPtrs *data) : ConstVectorOfPtrsAdaptor(data) {} +}; + +typedef std::vector SupportLayerPtrs; +typedef std::vector ConstSupportLayerPtrs; +class ConstSupportLayerPtrsAdaptor : public ConstVectorOfPtrsAdaptor { + friend PrintObject; + ConstSupportLayerPtrsAdaptor(const SupportLayerPtrs *data) : ConstVectorOfPtrsAdaptor(data) {} +}; -typedef std::vector LayerPtrs; -typedef std::vector SupportLayerPtrs; class BoundingBoxf3; // TODO: for temporary constructor parameter // Single instance of a PrintObject. @@ -125,12 +155,16 @@ class PrintObject : public PrintObjectBaseWithState>> region_volumes; // Size of an object: XYZ in scaled coordinates. The size might not be quite snug in XY plane. - const Vec3crd& size() const { return m_size; } - const PrintObjectConfig& config() const { return m_config; } - const LayerPtrs& layers() const { return m_layers; } - const SupportLayerPtrs& support_layers() const { return m_support_layers; } - const Transform3d& trafo() const { return m_trafo; } - const PrintInstances& instances() const { return m_instances; } + const Vec3crd& size() const { return m_size; } + const PrintObjectConfig& config() const { return m_config; } + ConstLayerPtrsAdaptor layers() const { return ConstLayerPtrsAdaptor(&m_layers); } + ConstSupportLayerPtrsAdaptor support_layers() const { return ConstSupportLayerPtrsAdaptor(&m_support_layers); } + const Transform3d& trafo() const { return m_trafo; } + const PrintInstances& instances() const { return m_instances; } + + // Whoever will get a non-const pointer to PrintObject will be able to modify its layers. + LayerPtrs& layers() { return m_layers; } + SupportLayerPtrs& support_layers() { return m_support_layers; } // Bounding box is used to align the object infill patterns, and to calculate attractor for the rear seam. // The bounding box may not be quite snug. @@ -171,7 +205,7 @@ class PrintObject : public PrintObjectBaseWithState PrintObjectPtrs; -typedef std::vector PrintRegionPtrs; +typedef std::vector PrintObjectPtrs; +typedef std::vector ConstPrintObjectPtrs; +class ConstPrintObjectPtrsAdaptor : public ConstVectorOfPtrsAdaptor { + friend Print; + ConstPrintObjectPtrsAdaptor(const PrintObjectPtrs *data) : ConstVectorOfPtrsAdaptor(data) {} +}; + +typedef std::vector PrintRegionPtrs; +typedef std::vector ConstPrintRegionPtrs; +class ConstPrintRegionPtrsAdaptor : public ConstVectorOfPtrsAdaptor { + friend Print; + ConstPrintRegionPtrsAdaptor(const PrintRegionPtrs *data) : ConstVectorOfPtrsAdaptor(data) {} +}; // The complete print tray with possibly multiple objects. class Print : public PrintBaseWithState { private: // Prevents erroneous use by other classes. typedef PrintBaseWithState Inherited; + // Bool indicates if supports of PrintObject are top-level contour. + typedef std::pair PrintObjectInfo; public: Print() = default; @@ -385,6 +432,7 @@ class Print : public PrintBaseWithState bool has_infinite_skirt() const; bool has_skirt() const; + bool has_brim() const; // Returns an empty string if valid, otherwise returns an error message. std::string validate() const override; @@ -403,9 +451,8 @@ class Print : public PrintBaseWithState const PrintConfig& config() const { return m_config; } const PrintObjectConfig& default_object_config() const { return m_default_object_config; } const PrintRegionConfig& default_region_config() const { return m_default_region_config; } - //FIXME returning const vector to non-const PrintObject*, caller could modify PrintObjects! - const PrintObjectPtrs& objects() const { return m_objects; } - PrintObject* get_object(size_t idx) { return m_objects[idx]; } + ConstPrintObjectPtrsAdaptor objects() const { return ConstPrintObjectPtrsAdaptor(&m_objects); } + PrintObject* get_object(size_t idx) { return const_cast(m_objects[idx]); } const PrintObject* get_object(size_t idx) const { return m_objects[idx]; } // PrintObject by its ObjectID, to be used to uniquely bind slicing warnings to their source PrintObjects // in the notification center. @@ -414,11 +461,15 @@ class Print : public PrintBaseWithState [object_id](const PrintObject *obj) { return obj->id() == object_id; }); return (it == m_objects.end()) ? nullptr : *it; } - const PrintRegionPtrs& regions() const { return m_regions; } + ConstPrintRegionPtrsAdaptor regions() const { return ConstPrintRegionPtrsAdaptor(&m_regions); } // How many of PrintObject::copies() over all print objects are there? // If zero, then the print is empty and the print shall not be executed. unsigned int num_object_instances() const; + // For Perl bindings. + PrintObjectPtrs& objects_mutable() { return m_objects; } + PrintRegionPtrs& regions_mutable() { return m_regions; } + const ExtrusionEntityCollection& skirt() const { return m_skirt; } const ExtrusionEntityCollection& brim() const { return m_brim; } // Convex hull of the 1st layer extrusions, for bed leveling and placing the initial purge line. @@ -461,7 +512,6 @@ class Print : public PrintBaseWithState bool invalidate_state_by_config_options(const std::vector &opt_keys); void _make_skirt(); - void _make_brim(); void _make_wipe_tower(); void finalize_first_layer_convex_hull(); diff --git a/src/libslic3r/PrintBase.cpp b/src/libslic3r/PrintBase.cpp index fb5e102c1ad..721741d4a89 100644 --- a/src/libslic3r/PrintBase.cpp +++ b/src/libslic3r/PrintBase.cpp @@ -13,6 +13,11 @@ namespace Slic3r { +void PrintTryCancel::operator()() +{ + m_print->throw_if_canceled(); +} + size_t PrintStateBase::g_last_timestamp = 0; // Update "scale", "input_filename", "input_filename_base" placeholders from the current m_objects. diff --git a/src/libslic3r/PrintBase.hpp b/src/libslic3r/PrintBase.hpp index bfbabd06b56..8fca43319a0 100644 --- a/src/libslic3r/PrintBase.hpp +++ b/src/libslic3r/PrintBase.hpp @@ -324,6 +324,20 @@ class PrintObjectBase : public ObjectBase ModelObject *m_model_object; }; +// Wrapper around the private PrintBase.throw_if_canceled(), so that a cancellation object could be passed +// to a non-friend of PrintBase by a PrintBase derived object. +class PrintTryCancel +{ +public: + // calls print.throw_if_canceled(). + void operator()(); +private: + friend PrintBase; + PrintTryCancel() = delete; + PrintTryCancel(const PrintBase *print) : m_print(print) {} + const PrintBase *m_print; +}; + /** * @brief Printing involves slicing and export of device dependent instructions. * @@ -472,6 +486,8 @@ class PrintBase : public ObjectBase // If the background processing stop was requested, throw CanceledException. // To be called by the worker thread and its sub-threads (mostly launched on the TBB thread pool) regularly. void throw_if_canceled() const { if (m_cancel_status) throw CanceledException(); } + // Wrapper around this->throw_if_canceled(), so that throw_if_canceled() may be passed to a function without making throw_if_canceled() public. + PrintTryCancel make_try_cancel() const { return PrintTryCancel(this); } // To be called by this->output_filename() with the format string pulled from the configuration layer. std::string output_filename(const std::string &format, const std::string &default_ext, const std::string &filename_base, const DynamicConfig *config_override = nullptr) const; @@ -495,6 +511,8 @@ class PrintBase : public ObjectBase // The mutex will be used to guard the worker thread against entering a stage // while the data influencing the stage is modified. mutable tbb::mutex m_state_mutex; + + friend PrintTryCancel; }; template diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 242a5aec52b..6c0b648da94 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -298,12 +298,37 @@ void PrintConfigDef::init_fff_params() def = this->add("brim_width", coFloat); def->label = L("Brim width"); + def->category = L("Skirt and brim"); def->tooltip = L("Horizontal width of the brim that will be printed around each object on the first layer."); def->sidetext = L("mm"); def->min = 0; def->mode = comSimple; def->set_default_value(new ConfigOptionFloat(0)); + def = this->add("brim_type", coEnum); + def->label = L("Brim type"); + def->category = L("Skirt and brim"); + def->tooltip = L("The places where the brim will be printed around each object on the first layer."); + def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); + def->enum_values.emplace_back("no_brim"); + def->enum_values.emplace_back("outer_only"); + def->enum_values.emplace_back("inner_only"); + def->enum_values.emplace_back("outer_and_inner"); + def->enum_labels.emplace_back(L("No brim")); + def->enum_labels.emplace_back(L("Outer brim only")); + def->enum_labels.emplace_back(L("Inner brim only")); + def->enum_labels.emplace_back(L("Outer and inner brim")); + def->mode = comSimple; + def->set_default_value(new ConfigOptionEnum(btOuterOnly)); + + def = this->add("brim_offset", coFloat); + def->label = L("Brim offset"); + def->category = L("Skirt and brim"); + def->tooltip = L("The offset of the brim from the printed object."); + def->sidetext = L("mm"); + def->mode = comSimple; + def->set_default_value(new ConfigOptionFloat(0)); + def = this->add("clip_multipart_objects", coBool); def->label = L("Clip multi-part objects"); def->tooltip = L("When printing multi-material objects, this settings will make Slic3r " @@ -1007,6 +1032,70 @@ void PrintConfigDef::init_fff_params() def->mode = comExpert; def->set_default_value(new ConfigOptionInts { 0 }); + def = this->add("fuzzy_skin_perimeter_mode", coEnum); + def->label = L("Fuzzy skin perimeter mode"); + def->category = L("Fuzzy Skin"); + def->tooltip = L("Fuzzy skin perimeter mode."); + + def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); + def->enum_values.push_back("none"); + def->enum_values.push_back("external_only"); + def->enum_values.push_back("external_only_skip_first_layer"); + def->enum_values.push_back("all"); + def->enum_labels.push_back(L("None")); + def->enum_labels.push_back(L("External")); + def->enum_labels.push_back(L("External (skip first layer)")); + def->enum_labels.push_back(L("All perimeters")); + def->mode = comSimple; + def->set_default_value(new ConfigOptionEnum(FuzzySkinPerimeterMode::None)); + +/* + def = this->add("fuzzy_skin_shape", coEnum); + def->label = L("Fuzzy skin shape"); + def->category = L("Fuzzy Skin"); + def->tooltip = L("Fuzzy skin shape."); + + def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); + def->enum_values.push_back("triangle1"); + def->enum_values.push_back("triangle2"); + def->enum_values.push_back("triangle3"); + def->enum_values.push_back("sawtooth1"); + def->enum_values.push_back("sawtooth2"); + def->enum_values.push_back("sawtooth3"); + def->enum_values.push_back("random1"); + def->enum_values.push_back("random2"); + def->enum_values.push_back("random3"); + def->enum_labels.push_back(L("Triangle (1)")); + def->enum_labels.push_back(L("Triangle (2)")); + def->enum_labels.push_back(L("Triangle (3)")); + def->enum_labels.push_back(L("Sawtooth (1)")); + def->enum_labels.push_back(L("Sawtooth (2)")); + def->enum_labels.push_back(L("Sawtooth (3)")); + def->enum_labels.push_back(L("Random (1)")); + def->enum_labels.push_back(L("Random (2)")); + def->enum_labels.push_back(L("Random (3)")); + def->mode = comSimple; + def->set_default_value(new ConfigOptionEnum(FuzzySkinShape::Triangle1)); +*/ + + def = this->add("fuzzy_skin_thickness", coFloat); + def->label = L("Fuzzy skin thickness"); + def->category = L("Fuzzy Skin"); + def->tooltip = ""; + def->sidetext = L("mm"); + def->min = 0; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionFloat(0.3)); + + def = this->add("fuzzy_skin_point_dist", coFloat); + def->label = L("Fuzzy skin point distance"); + def->category = L("Fuzzy Skin"); + def->tooltip = ""; + def->sidetext = L("mm"); + def->min = 0; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionFloat(0.8)); + def = this->add("gap_fill_speed", coFloat); def->label = L("Gap fill"); def->category = L("Speed"); @@ -3341,15 +3430,20 @@ DynamicPrintConfig* DynamicPrintConfig::new_from_defaults_keys(const std::vector double min_object_distance(const ConfigBase &cfg) { + const ConfigOptionEnum *opt_printer_technology = cfg.option>("printer_technology"); + auto printer_technology = opt_printer_technology ? opt_printer_technology->value : ptUnknown; + double ret = 0.; - - if (printer_technology(cfg) == ptSLA) ret = 6.; + + if (printer_technology == ptSLA) + ret = 6.; else { auto ecr_opt = cfg.option("extruder_clearance_radius"); auto dd_opt = cfg.option("duplicate_distance"); auto co_opt = cfg.option("complete_objects"); - if (!ecr_opt || !dd_opt || !co_opt) ret = 0.; + if (!ecr_opt || !dd_opt || !co_opt) + ret = 0.; else { // min object distance is max(duplicate_distance, clearance_radius) ret = (co_opt->value && ecr_opt->value > dd_opt->value) ? @@ -3360,21 +3454,6 @@ double min_object_distance(const ConfigBase &cfg) return ret; } -PrinterTechnology printer_technology(const ConfigBase &cfg) -{ - const ConfigOptionEnum *opt = cfg.option>("printer_technology"); - - if (opt) return opt->value; - - const ConfigOptionBool *export_opt = cfg.option("export_sla"); - if (export_opt && export_opt->getBool()) return ptSLA; - - export_opt = cfg.option("export_gcode"); - if (export_opt && export_opt->getBool()) return ptFFF; - - return ptUnknown; -} - void DynamicPrintConfig::normalize_fdm() { if (this->has("extruder")) { diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index de804e5a5fc..3ae70facca5 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -43,6 +43,27 @@ enum AuthorizationType { atKeyPassword, atUserPassword }; +enum class FuzzySkinPerimeterMode { + None, + External, + ExternalSkipFirst, + All +}; + +/* +enum class FuzzySkinShape { + Triangle1, + Triangle2, + Triangle3, + Sawtooth1, + Sawtooth2, + Sawtooth3, + Random1, + Random2, + Random3 +}; +*/ + enum InfillPattern : int { ipRectilinear, ipMonotonic, ipAlignedRectilinear, ipGrid, ipTriangles, ipStars, ipCubic, ipLine, ipConcentric, ipHoneycomb, ip3DHoneycomb, ipGyroid, ipHilbertCurve, ipArchimedeanChords, ipOctagramSpiral, ipAdaptiveCubic, ipSupportCubic, ipCount, @@ -82,6 +103,13 @@ enum SLAPillarConnectionMode { slapcmDynamic }; +enum BrimType { + btNoBrim, + btOuterOnly, + btInnerOnly, + btOuterAndInner, +}; + enum RaftSizeAdjust { rsaSmall, rsaNormal, @@ -147,6 +175,35 @@ template<> inline const t_config_enum_values& ConfigOptionEnum inline const t_config_enum_values& ConfigOptionEnum::get_enum_values() { + static t_config_enum_values keys_map; + if (keys_map.empty()) { + keys_map["none"] = int(FuzzySkinPerimeterMode::None); + keys_map["external_only"] = int(FuzzySkinPerimeterMode::External); + keys_map["external_only_skip_first_layer"] = int(FuzzySkinPerimeterMode::ExternalSkipFirst); + keys_map["all"] = int(FuzzySkinPerimeterMode::All); + } + return keys_map; +} + +/* +template<> inline const t_config_enum_values& ConfigOptionEnum::get_enum_values() { + static t_config_enum_values keys_map; + if (keys_map.empty()) { + keys_map["triangle1"] = int(FuzzySkinShape::Triangle1); + keys_map["triangle2"] = int(FuzzySkinShape::Triangle2); + keys_map["triangle3"] = int(FuzzySkinShape::Triangle3); + keys_map["sawtooth1"] = int(FuzzySkinShape::Sawtooth1); + keys_map["sawtooth2"] = int(FuzzySkinShape::Sawtooth2); + keys_map["sawtooth3"] = int(FuzzySkinShape::Sawtooth3); + keys_map["random1"] = int(FuzzySkinShape::Random1); + keys_map["random2"] = int(FuzzySkinShape::Random2); + keys_map["random3"] = int(FuzzySkinShape::Random3); + } + return keys_map; +} +*/ + template<> inline const t_config_enum_values& ConfigOptionEnum::get_enum_values() { static t_config_enum_values keys_map; if (keys_map.empty()) { @@ -221,6 +278,17 @@ template<> inline const t_config_enum_values& ConfigOptionEnum inline const t_config_enum_values& ConfigOptionEnum::get_enum_values() { + static const t_config_enum_values keys_map = { + {"no_brim", btNoBrim}, + {"outer_only", btOuterOnly}, + {"inner_only", btInnerOnly}, + {"outer_and_inner", btOuterAndInner} + }; + + return keys_map; +} + template<> inline const t_config_enum_values& ConfigOptionEnum::get_enum_values() { static const t_config_enum_values keys_map = { { "small", rsaSmall }, @@ -231,6 +299,8 @@ template<> inline const t_config_enum_values& ConfigOptionEnum:: return keys_map; } + + // Defines each and every confiuration option of Slic3r, including the properties of the GUI dialogs. // Does not store the actual values, but defines default values. class PrintConfigDef : public ConfigDef @@ -263,7 +333,7 @@ extern const PrintConfigDef print_config_def; class StaticPrintConfig; -PrinterTechnology printer_technology(const ConfigBase &cfg); +// Minimum object distance for arrangement, based on printer technology. double min_object_distance(const ConfigBase &cfg); // Slic3r dynamic configuration, used to override the configuration @@ -444,11 +514,18 @@ class PrintObjectConfig : public StaticPrintConfig { STATIC_PRINT_CONFIG_CACHE(PrintObjectConfig) public: + ConfigOptionFloat brim_offset; + ConfigOptionEnum brim_type; + ConfigOptionFloat brim_width; ConfigOptionBool clip_multipart_objects; ConfigOptionBool dont_support_bridges; ConfigOptionFloat elefant_foot_compensation; ConfigOptionFloatOrPercent extrusion_width; ConfigOptionFloatOrPercent first_layer_height; + ConfigOptionEnum fuzzy_skin_perimeter_mode; +// ConfigOptionEnum fuzzy_skin_shape; + ConfigOptionFloat fuzzy_skin_thickness; + ConfigOptionFloat fuzzy_skin_point_dist; ConfigOptionBool infill_only_where_needed; // Force the generation of solid shells between adjacent materials/volumes. ConfigOptionBool interface_shells; @@ -493,11 +570,18 @@ class PrintObjectConfig : public StaticPrintConfig protected: void initialize(StaticCacheBase &cache, const char *base_ptr) { + OPT_PTR(brim_offset); + OPT_PTR(brim_type); + OPT_PTR(brim_width); OPT_PTR(clip_multipart_objects); OPT_PTR(dont_support_bridges); OPT_PTR(elefant_foot_compensation); OPT_PTR(extrusion_width); OPT_PTR(first_layer_height); + OPT_PTR(fuzzy_skin_perimeter_mode); +// OPT_PTR(fuzzy_skin_shape); + OPT_PTR(fuzzy_skin_thickness); + OPT_PTR(fuzzy_skin_point_dist); OPT_PTR(infill_only_where_needed); OPT_PTR(interface_shells); OPT_PTR(layer_height); @@ -858,7 +942,6 @@ class PrintConfig : public MachineEnvelopeConfig, public GCodeConfig ConfigOptionInts bed_temperature; ConfigOptionFloat bridge_acceleration; ConfigOptionInts bridge_fan_speed; - ConfigOptionFloat brim_width; ConfigOptionBool complete_objects; ConfigOptionFloats colorprint_heights; ConfigOptionBools cooling; @@ -933,7 +1016,6 @@ class PrintConfig : public MachineEnvelopeConfig, public GCodeConfig OPT_PTR(bed_temperature); OPT_PTR(bridge_acceleration); OPT_PTR(bridge_fan_speed); - OPT_PTR(brim_width); OPT_PTR(complete_objects); OPT_PTR(colorprint_heights); OPT_PTR(cooling); @@ -1065,7 +1147,7 @@ class SLAPrintObjectConfig : public StaticPrintConfig // The percentage of smaller pillars compared to the normal pillar diameter // which are used in problematic areas where a normal pilla cannot fit. ConfigOptionPercent support_small_pillar_diameter_percent; - + // How much bridge (supporting another pinhead) can be placed on a pillar. ConfigOptionInt support_max_bridges_on_pillar; @@ -1117,7 +1199,7 @@ class SLAPrintObjectConfig : public StaticPrintConfig // The height of the pad from the bottom to the top not considering the pit ConfigOptionFloat pad_wall_height /*= 5*/; - + // How far should the pad extend around the contained geometry ConfigOptionFloat pad_brim_size; @@ -1141,7 +1223,7 @@ class SLAPrintObjectConfig : public StaticPrintConfig // Disable the elevation (ignore its value) and use the zero elevation mode ConfigOptionBool pad_around_object; - + ConfigOptionBool pad_around_object_everywhere; // This is the gap between the object bottom and the generated pad @@ -1155,7 +1237,7 @@ class SLAPrintObjectConfig : public StaticPrintConfig // How much should the tiny connectors penetrate into the model body ConfigOptionFloat pad_object_connector_penetration; - + // ///////////////////////////////////////////////////////////////////////// // Model hollowing parameters: // - Models can be hollowed out as part of the SLA print process @@ -1164,17 +1246,17 @@ class SLAPrintObjectConfig : public StaticPrintConfig // - Additional holes will be drilled into the hollow model to allow for // - resin removal. // ///////////////////////////////////////////////////////////////////////// - + ConfigOptionBool hollowing_enable; - - // The minimum thickness of the model walls to maintain. Note that the + + // The minimum thickness of the model walls to maintain. Note that the // resulting walls may be thicker due to smoothing out fine cavities where // resin could stuck. ConfigOptionFloat hollowing_min_thickness; - + // Indirectly controls the voxel size (resolution) used by openvdb ConfigOptionFloat hollowing_quality; - + // Indirectly controls the minimum size of created cavities. ConfigOptionFloat hollowing_closing_distance; @@ -1396,13 +1478,13 @@ Points get_bed_shape(const SLAPrinterConfig &cfg); // ModelConfig is a wrapper around DynamicPrintConfig with an addition of a timestamp. // Each change of ModelConfig is tracked by assigning a new timestamp from a global counter. // The counter is used for faster synchronization of the background slicing thread -// with the front end by skipping synchronization of equal config dictionaries. -// The global counter is also used for avoiding unnecessary serialization of config +// with the front end by skipping synchronization of equal config dictionaries. +// The global counter is also used for avoiding unnecessary serialization of config // dictionaries when taking an Undo snapshot. // // The global counter is NOT thread safe, therefore it is recommended to use ModelConfig from // the main thread only. -// +// // As there is a global counter and it is being increased with each change to any ModelConfig, // if two ModelConfig dictionaries differ, they should differ with their timestamp as well. // Therefore copying the ModelConfig including its timestamp is safe as there is no harm diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 56df4787612..a4f243c51b4 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -501,7 +501,7 @@ SupportLayer* PrintObject::add_support_layer(int id, coordf_t height, coordf_t p return m_support_layers.back(); } -SupportLayerPtrs::const_iterator PrintObject::insert_support_layer(SupportLayerPtrs::const_iterator pos, size_t id, coordf_t height, coordf_t print_z, coordf_t slice_z) +SupportLayerPtrs::iterator PrintObject::insert_support_layer(SupportLayerPtrs::iterator pos, size_t id, coordf_t height, coordf_t print_z, coordf_t slice_z) { return m_support_layers.insert(pos, new SupportLayer(id, this, height, print_z, slice_z)); } @@ -521,6 +521,10 @@ bool PrintObject::invalidate_state_by_config_options(const std::vectorfill_surfaces by trimming the layerm->slices by the cummulative layerm->fill_surfaces. tbb::parallel_for( tbb::blocked_range(0, m_layers.size()), - [this, idx_region, interface_shells](const tbb::blocked_range& range) { + [this, idx_region](const tbb::blocked_range& range) { for (size_t idx_layer = range.begin(); idx_layer < range.end(); ++ idx_layer) { m_print->throw_if_canceled(); LayerRegion *layerm = m_layers[idx_layer]->m_regions[idx_region]; @@ -1602,6 +1606,12 @@ PrintRegionConfig PrintObject::region_config_from_model_volume(const PrintRegion clamp_exturder_to_default(config.infill_extruder, num_extruders); clamp_exturder_to_default(config.perimeter_extruder, num_extruders); clamp_exturder_to_default(config.solid_infill_extruder, num_extruders); + if (config.fill_density.value < 0.00011f) + // Switch of infill for very low infill rates, also avoid division by zero in infill generator for these very low rates. + // See GH issue #5910. + config.fill_density.value = 0; + else + config.fill_density.value = std::min(config.fill_density.value, 100.); return config; } @@ -1629,6 +1639,7 @@ SlicingParameters PrintObject::slicing_parameters(const DynamicPrintConfig& full PrintRegion::collect_object_printing_extruders( print_config, region_config_from_model_volume(default_region_config, nullptr, *model_volume, num_extruders), + object_config.brim_type != btNoBrim && object_config.brim_width > 0., object_extruders); for (const std::pair &range_and_config : model_object.layer_config_ranges) if (range_and_config.second.has("perimeter_extruder") || @@ -1637,6 +1648,7 @@ SlicingParameters PrintObject::slicing_parameters(const DynamicPrintConfig& full PrintRegion::collect_object_printing_extruders( print_config, region_config_from_model_volume(default_region_config, &range_and_config.second.get(), *model_volume, num_extruders), + object_config.brim_type != btNoBrim && object_config.brim_width > 0., object_extruders); } sort_remove_duplicates(object_extruders); @@ -1722,7 +1734,7 @@ void PrintObject::_slice(const std::vector &layer_height_profile) } // Make sure all layers contain layer region objects for all regions. for (size_t region_id = 0; region_id < this->region_volumes.size(); ++ region_id) - layer->add_region(this->print()->regions()[region_id]); + layer->add_region(this->print()->get_region(region_id)); prev = layer; } } @@ -2148,6 +2160,16 @@ std::vector PrintObject::slice_support_volumes(const ModelVolumeType return this->slice_volumes(zs, SlicingMode::Regular, volumes); } +//FIXME The admesh repair function may break the face connectivity, rather refresh it here as the slicing code relies on it. +static void fix_mesh_connectivity(TriangleMesh &mesh) +{ + auto nr_degenerated = mesh.stl.stats.degenerate_facets; + stl_check_facets_exact(&mesh.stl); + if (nr_degenerated != mesh.stl.stats.degenerate_facets) + // stl_check_facets_exact() removed some newly degenerated faces. Some faces could become degenerate after some mesh transformation. + stl_generate_shared_vertices(&mesh.stl, mesh.its); +} + std::vector PrintObject::slice_volumes( const std::vector &z, SlicingMode mode, size_t slicing_mode_normal_below_layer, SlicingMode mode_below, @@ -2160,10 +2182,8 @@ std::vector PrintObject::slice_volumes( TriangleMesh mesh(volumes.front()->mesh()); mesh.transform(volumes.front()->get_matrix(), true); assert(mesh.repaired); - if (volumes.size() == 1 && mesh.repaired) { - //FIXME The admesh repair function may break the face connectivity, rather refresh it here as the slicing code relies on it. - stl_check_facets_exact(&mesh.stl); - } + if (volumes.size() == 1 && mesh.repaired) + fix_mesh_connectivity(mesh); for (size_t idx_volume = 1; idx_volume < volumes.size(); ++ idx_volume) { const ModelVolume &model_volume = *volumes[idx_volume]; TriangleMesh vol_mesh(model_volume.mesh()); @@ -2196,10 +2216,8 @@ std::vector PrintObject::slice_volume(const std::vector &z, S //FIXME better to split the mesh into separate shells, perform slicing over each shell separately and then to use a Boolean operation to merge them. TriangleMesh mesh(volume.mesh()); mesh.transform(volume.get_matrix(), true); - if (mesh.repaired) { - //FIXME The admesh repair function may break the face connectivity, rather refresh it here as the slicing code relies on it. - stl_check_facets_exact(&mesh.stl); - } + if (mesh.repaired) + fix_mesh_connectivity(mesh); if (mesh.stl.stats.number_of_facets > 0) { mesh.transform(m_trafo, true); // apply XY shift diff --git a/src/libslic3r/PrintRegion.cpp b/src/libslic3r/PrintRegion.cpp index 2a75cd621d9..79eb647f665 100644 --- a/src/libslic3r/PrintRegion.cpp +++ b/src/libslic3r/PrintRegion.cpp @@ -66,7 +66,7 @@ coordf_t PrintRegion::bridging_height_avg(const PrintConfig &print_config) const return this->nozzle_dmr_avg(print_config) * sqrt(m_config.bridge_flow_ratio.value); } -void PrintRegion::collect_object_printing_extruders(const PrintConfig &print_config, const PrintRegionConfig ®ion_config, std::vector &object_extruders) +void PrintRegion::collect_object_printing_extruders(const PrintConfig &print_config, const PrintRegionConfig ®ion_config, const bool has_brim, std::vector &object_extruders) { // These checks reflect the same logic used in the GUI for enabling/disabling extruder selection fields. auto num_extruders = (int)print_config.nozzle_diameter.size(); @@ -74,7 +74,7 @@ void PrintRegion::collect_object_printing_extruders(const PrintConfig &print_con int i = std::max(0, extruder_id - 1); object_extruders.emplace_back((i >= num_extruders) ? 0 : i); }; - if (region_config.perimeters.value > 0 || print_config.brim_width.value > 0) + if (region_config.perimeters.value > 0 || has_brim) emplace_extruder(region_config.perimeter_extruder); if (region_config.fill_density.value > 0) emplace_extruder(region_config.infill_extruder); @@ -92,7 +92,7 @@ void PrintRegion::collect_object_printing_extruders(std::vector &o assert(this->config().infill_extruder <= num_extruders); assert(this->config().solid_infill_extruder <= num_extruders); #endif - collect_object_printing_extruders(print()->config(), this->config(), object_extruders); + collect_object_printing_extruders(print()->config(), this->config(), print()->has_brim(), object_extruders); } } diff --git a/src/libslic3r/SLA/Concurrency.hpp b/src/libslic3r/SLA/Concurrency.hpp index 300024c76dd..b692914aca9 100644 --- a/src/libslic3r/SLA/Concurrency.hpp +++ b/src/libslic3r/SLA/Concurrency.hpp @@ -41,7 +41,7 @@ template<> struct _ccr static void for_each(It from, It to, Fn &&fn, size_t granularity = 1) { tbb::parallel_for(tbb::blocked_range{from, to, granularity}, - [&fn, from](const auto &range) { + [&fn](const auto &range) { loop_(range, std::forward(fn)); }); } diff --git a/src/libslic3r/SLA/IndexedMesh.cpp b/src/libslic3r/SLA/IndexedMesh.cpp index efcf09873eb..485fa98ed83 100644 --- a/src/libslic3r/SLA/IndexedMesh.cpp +++ b/src/libslic3r/SLA/IndexedMesh.cpp @@ -55,8 +55,6 @@ class IndexedMesh::AABBImpl { } }; -static const constexpr double MESH_EPS = 1e-6; - IndexedMesh::IndexedMesh(const TriangleMesh& tmesh) : m_aabb(new AABBImpl()), m_tm(&tmesh) { diff --git a/src/libslic3r/SLA/Rotfinder.cpp b/src/libslic3r/SLA/Rotfinder.cpp index 9378977663b..702690c196d 100644 --- a/src/libslic3r/SLA/Rotfinder.cpp +++ b/src/libslic3r/SLA/Rotfinder.cpp @@ -165,7 +165,7 @@ XYRotation from_transform3d(const Transform3d &tr) template std::array find_min_score(Fn &&fn, It from, It to, StopCond &&stopfn) { - std::array ret; + std::array ret = {}; double score = std::numeric_limits::max(); diff --git a/src/libslic3r/SLA/SupportPointGenerator.cpp b/src/libslic3r/SLA/SupportPointGenerator.cpp index 8f720339abc..7a4c2906850 100644 --- a/src/libslic3r/SLA/SupportPointGenerator.cpp +++ b/src/libslic3r/SLA/SupportPointGenerator.cpp @@ -304,8 +304,6 @@ void SupportPointGenerator::add_support_points(SupportPointGenerator::Structure float tp = m_config.tear_pressure(); float current = s.supports_force_total(); - static constexpr float DANGL_DAMPING = .5f; - static constexpr float SLOPE_DAMPING = .1f; if (s.islands_below.empty()) { // completely new island - needs support no doubt diff --git a/src/libslic3r/SLA/SupportPointGenerator.hpp b/src/libslic3r/SLA/SupportPointGenerator.hpp index ebb8cc373f8..d7588e3ba3c 100644 --- a/src/libslic3r/SLA/SupportPointGenerator.hpp +++ b/src/libslic3r/SLA/SupportPointGenerator.hpp @@ -84,6 +84,7 @@ class SupportPointGenerator { float overhangs_area = 0.f; bool overlaps(const Structure &rhs) const { + //FIXME ExPolygon::overlaps() shall be commutative, it is not! return this->bbox.overlap(rhs.bbox) && (this->polygon->overlaps(*rhs.polygon) || rhs.polygon->overlaps(*this->polygon)); } float overlap_area(const Structure &rhs) const { diff --git a/src/libslic3r/SLAPrint.hpp b/src/libslic3r/SLAPrint.hpp index f69ed7b8e94..742670e2cb9 100644 --- a/src/libslic3r/SLAPrint.hpp +++ b/src/libslic3r/SLAPrint.hpp @@ -424,7 +424,7 @@ class SLAPrint : public PrintBaseWithState void clear() override; bool empty() const override { return m_objects.empty(); } // List of existing PrintObject IDs, to remove notifications for non-existent IDs. - std::vector print_object_ids() const; + std::vector print_object_ids() const override; ApplyStatus apply(const Model &model, DynamicPrintConfig config) override; void set_task(const TaskParams ¶ms) override; void process() override; diff --git a/src/libslic3r/ShortestPath.cpp b/src/libslic3r/ShortestPath.cpp index 3d5903df130..60f8feaa636 100644 --- a/src/libslic3r/ShortestPath.cpp +++ b/src/libslic3r/ShortestPath.cpp @@ -21,7 +21,7 @@ template std::vector> chain_segments_closest_point(std::vector &end_points, KDTreeType &kdtree, CouldReverseFunc &could_reverse_func, EndPointType &first_point) { assert((end_points.size() & 1) == 0); - size_t num_segments = end_points.size() / 2; + size_t num_segments = end_points.size() / 2; assert(num_segments >= 2); for (EndPointType &ep : end_points) ep.chain_id = 0; @@ -1423,7 +1423,7 @@ static inline void do_crossover(const std::vector &edges_in, std::vect const std::pair &span2, bool reversed2, bool flipped2, const std::pair &span3, bool reversed3, bool flipped3) { auto it_edges_out = edges_out.begin(); - auto copy_span = [&edges_in, &edges_out, &it_edges_out](std::pair span, bool reversed, bool flipped) { + auto copy_span = [&edges_in, &it_edges_out](std::pair span, bool reversed, bool flipped) { assert(span.first < span.second); auto it = it_edges_out; if (reversed) @@ -1466,7 +1466,7 @@ static inline void do_crossover(const std::vector &edges_in, std::vect const std::pair &span3, bool reversed3, bool flipped3, const std::pair &span4, bool reversed4, bool flipped4) { auto it_edges_out = edges_out.begin(); - auto copy_span = [&edges_in, &edges_out, &it_edges_out](std::pair span, bool reversed, bool flipped) { + auto copy_span = [&edges_in, &it_edges_out](std::pair span, bool reversed, bool flipped) { assert(span.first < span.second); auto it = it_edges_out; if (reversed) @@ -1527,6 +1527,11 @@ static inline void do_crossover(const std::vector &edges_in, std::vect assert(edges_in.size() == edges_out.size()); } +// Worst time complexity: O(min(n, 100) * (n * log n + n^2) +// Expected time complexity: O(min(n, 100) * (n * log n + k * n) +// where n is the number of edges and k is the number of connection_lengths candidates after the first one +// is found that improves the total cost. +//FIXME there are likley better heuristics to lower the time complexity. static inline void reorder_by_two_exchanges_with_segment_flipping(std::vector &edges) { if (edges.size() < 2) @@ -1536,7 +1541,8 @@ static inline void reorder_by_two_exchanges_with_segment_flipping(std::vector edges_tmp(edges); std::vector> connection_lengths(edges.size() - 1, std::pair(0., 0)); std::vector connection_tried(edges.size(), false); - for (size_t iter = 0; iter < edges.size(); ++ iter) { + const size_t max_iterations = std::min(edges.size(), size_t(100)); + for (size_t iter = 0; iter < max_iterations; ++ iter) { // Initialize connection costs and connection lengths. for (size_t i = 1; i < edges.size(); ++ i) { const FlipEdge &e1 = edges[i - 1]; @@ -1553,9 +1559,8 @@ static inline void reorder_by_two_exchanges_with_segment_flipping(std::vector::max(); size_t crossover2_pos_final = std::numeric_limits::max(); size_t crossover_flip_final = 0; - for (const std::pair &first_crossover_candidate : connection_lengths) { - double longest_connection_length = first_crossover_candidate.first; - size_t longest_connection_idx = first_crossover_candidate.second; + for (const std::pair& first_crossover_candidate : connection_lengths) { + size_t longest_connection_idx = first_crossover_candidate.second; connection_tried[longest_connection_idx] = true; // Find the second crossover connection with the lowest total chain cost. size_t crossover_pos_min = std::numeric_limits::max(); @@ -1601,6 +1606,8 @@ static inline void reorder_by_two_exchanges_with_segment_flipping(std::vector &edges) { if (edges.size() < 3) { @@ -1630,12 +1637,10 @@ static inline void reorder_by_three_exchanges_with_segment_flipping(std::vector< size_t crossover2_pos_final = std::numeric_limits::max(); size_t crossover3_pos_final = std::numeric_limits::max(); size_t crossover_flip_final = 0; - for (const std::pair &first_crossover_candidate : connection_lengths) { - double longest_connection_length = first_crossover_candidate.first; - size_t longest_connection_idx = first_crossover_candidate.second; - connection_tried[longest_connection_idx] = true; + for (const std::pair &first_crossover_candidate : connection_lengths) { + size_t longest_connection_idx = first_crossover_candidate.second; + connection_tried[longest_connection_idx] = true; // Find the second crossover connection with the lowest total chain cost. - size_t crossover_pos_min = std::numeric_limits::max(); double crossover_cost_min = connections.back().cost; for (size_t j = 1; j < connections.size(); ++ j) if (! connection_tried[j]) { @@ -1683,6 +1688,7 @@ static inline void reorder_by_three_exchanges_with_segment_flipping(std::vector< } } } +#endif typedef Eigen::Matrix Matrixd; @@ -1754,6 +1760,8 @@ static inline std::pair minimum_crossover_cost( return std::make_pair(cost_min, flip_min); } +#if 0 +// Currently not used, too slow. static inline void reorder_by_three_exchanges_with_segment_flipping2(std::vector &edges) { if (edges.size() < 3) { @@ -1789,12 +1797,10 @@ static inline void reorder_by_three_exchanges_with_segment_flipping2(std::vector #else /* NDEBUG */ Matrixd segment_end_point_distance_matrix = Matrixd::Constant(4 * 4, 4 * 4, std::numeric_limits::max()); #endif /* NDEBUG */ - for (const std::pair &first_crossover_candidate : connection_lengths) { - double longest_connection_length = first_crossover_candidate.first; - size_t longest_connection_idx = first_crossover_candidate.second; - connection_tried[longest_connection_idx] = true; - // Find the second crossover connection with the lowest total chain cost. - size_t crossover_pos_min = std::numeric_limits::max(); + for (const std::pair &first_crossover_candidate : connection_lengths) { + size_t longest_connection_idx = first_crossover_candidate.second; + connection_tried[longest_connection_idx] = true; + // Find the second crossover connection with the lowest total chain cost. double crossover_cost_min = connections.back().cost; for (size_t j = 1; j < connections.size(); ++ j) if (! connection_tried[j]) { @@ -1850,8 +1856,11 @@ static inline void reorder_by_three_exchanges_with_segment_flipping2(std::vector } } } +#endif // Flip the sequences of polylines to lower the total length of connecting lines. +// Used by the infill generator if the infill is not connected with perimeter lines +// and to order the brim lines. static inline void improve_ordering_by_two_exchanges_with_segment_flipping(Polylines &polylines, bool fixed_start) { #ifndef NDEBUG @@ -1903,6 +1912,7 @@ static inline void improve_ordering_by_two_exchanges_with_segment_flipping(Polyl #endif /* NDEBUG */ } +// Used to optimize order of infill lines and brim lines. Polylines chain_polylines(Polylines &&polylines, const Point *start_near) { #ifdef DEBUG_SVG_OUTPUT diff --git a/src/libslic3r/SupportMaterial.cpp b/src/libslic3r/SupportMaterial.cpp index 0098570da25..52439f5e951 100644 --- a/src/libslic3r/SupportMaterial.cpp +++ b/src/libslic3r/SupportMaterial.cpp @@ -388,7 +388,7 @@ void PrintObjectSupportMaterial::generate(PrintObject &object) BOOST_LOG_TRIVIAL(info) << "Support generator - Generating tool paths"; // Generate the actual toolpaths and save them into each layer. - this->generate_toolpaths(object, raft_layers, bottom_contacts, top_contacts, intermediate_layers, interface_layers); + this->generate_toolpaths(object.support_layers(), raft_layers, bottom_contacts, top_contacts, intermediate_layers, interface_layers); #ifdef SLIC3R_DEBUG { @@ -1591,7 +1591,7 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::bottom_conta }); Polygons &layer_support_area = layer_support_areas[layer_id]; - task_group.run([this, &projection, &projection_raw, &layer, &layer_support_area, layer_id] { + task_group.run([this, &projection, &projection_raw, &layer, &layer_support_area] { // Remove the areas that touched from the projection that will continue on next, lower, top surfaces. // Polygons trimming = union_(to_polygons(layer.slices), touching, true); Polygons trimming = offset(layer.lslices, float(SCALED_EPSILON)); @@ -1671,69 +1671,81 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::bottom_conta // If no vec item with Z value >= of an internal threshold of fn_higher_equal is found, return vec.size() // If the initial idx is size_t(-1), then use binary search. // Otherwise search linearly upwards. -template -size_t idx_higher_or_equal(const std::vector &vec, size_t idx, FN_HIGHER_EQUAL fn_higher_equal) +template +size_t idx_higher_or_equal(IT begin, IT end, size_t idx, FN_HIGHER_EQUAL fn_higher_equal) { - if (vec.empty()) { + auto size = int(end - begin); + if (size == 0) { idx = 0; } else if (idx == size_t(-1)) { // First of the batch of layers per thread pool invocation. Use binary search. int idx_low = 0; - int idx_high = std::max(0, int(vec.size()) - 1); + int idx_high = std::max(0, size - 1); while (idx_low + 1 < idx_high) { int idx_mid = (idx_low + idx_high) / 2; - if (fn_higher_equal(vec[idx_mid])) + if (fn_higher_equal(begin[idx_mid])) idx_high = idx_mid; else idx_low = idx_mid; } - idx = fn_higher_equal(vec[idx_low]) ? idx_low : - (fn_higher_equal(vec[idx_high]) ? idx_high : vec.size()); + idx = fn_higher_equal(begin[idx_low]) ? idx_low : + (fn_higher_equal(begin[idx_high]) ? idx_high : size); } else { // For the other layers of this batch of layers, search incrementally, which is cheaper than the binary search. - while (idx < vec.size() && ! fn_higher_equal(vec[idx])) + while (int(idx) < size && ! fn_higher_equal(begin[idx])) ++ idx; } return idx; } +template +size_t idx_higher_or_equal(const std::vector& vec, size_t idx, FN_HIGHER_EQUAL fn_higher_equal) +{ + return idx_higher_or_equal(vec.begin(), vec.end(), idx, fn_higher_equal); +} // FN_LOWER_EQUAL: the provided object pointer has a Z value <= of an internal threshold. // Find the first item with Z value <= of an internal threshold of fn_lower_equal. // If no vec item with Z value <= of an internal threshold of fn_lower_equal is found, return -1. // If the initial idx is < -1, then use binary search. // Otherwise search linearly downwards. -template -int idx_lower_or_equal(const std::vector &vec, int idx, FN_LOWER_EQUAL fn_lower_equal) +template +int idx_lower_or_equal(IT begin, IT end, int idx, FN_LOWER_EQUAL fn_lower_equal) { - if (vec.empty()) { + auto size = int(end - begin); + if (size == 0) { idx = -1; } else if (idx < -1) { // First of the batch of layers per thread pool invocation. Use binary search. int idx_low = 0; - int idx_high = std::max(0, int(vec.size()) - 1); + int idx_high = std::max(0, size - 1); while (idx_low + 1 < idx_high) { int idx_mid = (idx_low + idx_high) / 2; - if (fn_lower_equal(vec[idx_mid])) + if (fn_lower_equal(begin[idx_mid])) idx_low = idx_mid; else idx_high = idx_mid; } - idx = fn_lower_equal(vec[idx_high]) ? idx_high : - (fn_lower_equal(vec[idx_low ]) ? idx_low : -1); + idx = fn_lower_equal(begin[idx_high]) ? idx_high : + (fn_lower_equal(begin[idx_low ]) ? idx_low : -1); } else { // For the other layers of this batch of layers, search incrementally, which is cheaper than the binary search. - while (idx >= 0 && ! fn_lower_equal(vec[idx])) + while (idx >= 0 && ! fn_lower_equal(begin[idx])) -- idx; } return idx; } +template +int idx_lower_or_equal(const std::vector &vec, int idx, FN_LOWER_EQUAL fn_lower_equal) +{ + return idx_lower_or_equal(vec.begin(), vec.end(), idx, fn_lower_equal); +} // Trim the top_contacts layers with the bottom_contacts layers if they overlap, so there would not be enough vertical space for both of them. void PrintObjectSupportMaterial::trim_top_contacts_by_bottom_contacts( const PrintObject &object, const MyLayersPtr &bottom_contacts, MyLayersPtr &top_contacts) const { tbb::parallel_for(tbb::blocked_range(0, int(top_contacts.size())), - [this, &object, &bottom_contacts, &top_contacts](const tbb::blocked_range& range) { + [&bottom_contacts, &top_contacts](const tbb::blocked_range& range) { int idx_bottom_overlapping_first = -2; // For all top contact layers, counting downwards due to the way idx_higher_or_equal caches the last index to avoid repeated binary search. for (int idx_top = range.end() - 1; idx_top >= range.begin(); -- idx_top) { @@ -1962,7 +1974,7 @@ void PrintObjectSupportMaterial::generate_base_layers( BOOST_LOG_TRIVIAL(debug) << "PrintObjectSupportMaterial::generate_base_layers() in parallel - start"; tbb::parallel_for( tbb::blocked_range(0, intermediate_layers.size()), - [this, &object, &bottom_contacts, &top_contacts, &intermediate_layers, &layer_support_areas](const tbb::blocked_range& range) { + [&object, &bottom_contacts, &top_contacts, &intermediate_layers, &layer_support_areas](const tbb::blocked_range& range) { // index -2 means not initialized yet, -1 means intialized and decremented to 0 and then -1. int idx_top_contact_above = -2; int idx_bottom_contact_overlapping = -2; @@ -1981,7 +1993,7 @@ void PrintObjectSupportMaterial::generate_base_layers( Polygons polygons_new; // Use the precomputed layer_support_areas. - idx_object_layer_above = std::max(0, idx_lower_or_equal(object.layers(), idx_object_layer_above, + idx_object_layer_above = std::max(0, idx_lower_or_equal(object.layers().begin(), object.layers().end(), idx_object_layer_above, [&layer_intermediate](const Layer *layer){ return layer->print_z <= layer_intermediate.print_z + EPSILON; })); polygons_new = layer_support_areas[idx_object_layer_above]; @@ -2117,7 +2129,7 @@ void PrintObjectSupportMaterial::trim_support_layers_by_object( // Find the overlapping object layers including the extra above / below gap. coordf_t z_threshold = support_layer.print_z - support_layer.height - gap_extra_below + EPSILON; idx_object_layer_overlapping = idx_higher_or_equal( - object.layers(), idx_object_layer_overlapping, + object.layers().begin(), object.layers().end(), idx_object_layer_overlapping, [z_threshold](const Layer *layer){ return layer->print_z >= z_threshold; }); // Collect all the object layers intersecting with this layer. Polygons polygons_trimming; @@ -2327,32 +2339,6 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::generate_int return interface_layers; } -static inline void fill_expolygons_generate_paths( - ExtrusionEntitiesPtr &dst, - const ExPolygons &expolygons, - Fill *filler, - float density, - ExtrusionRole role, - const Flow &flow) -{ - FillParams fill_params; - fill_params.density = density; - fill_params.dont_adjust = true; - for (const ExPolygon &expoly : expolygons) { - Surface surface(stInternal, expoly); - Polylines polylines; - try { - polylines = filler->fill_surface(&surface, fill_params); - } catch (InfillFailedException &) { - } - extrusion_entities_append_paths( - dst, - std::move(polylines), - role, - flow.mm3_per_mm(), flow.width, flow.height); - } -} - static inline void fill_expolygons_generate_paths( ExtrusionEntitiesPtr &dst, ExPolygons &&expolygons, @@ -2942,7 +2928,7 @@ void modulate_extrusion_by_overlapping_layers( } void PrintObjectSupportMaterial::generate_toolpaths( - const PrintObject &object, + SupportLayerPtrs &support_layers, const MyLayersPtr &raft_layers, const MyLayersPtr &bottom_contacts, const MyLayersPtr &top_contacts, @@ -3011,13 +2997,13 @@ void PrintObjectSupportMaterial::generate_toolpaths( // Insert the raft base layers. size_t n_raft_layers = size_t(std::max(0, int(m_slicing_params.raft_layers()) - 1)); tbb::parallel_for(tbb::blocked_range(0, n_raft_layers), - [this, &object, &raft_layers, + [this, &support_layers, &raft_layers, infill_pattern, &bbox_object, support_density, interface_density, raft_angle_1st_layer, raft_angle_base, raft_angle_interface, link_max_length_factor, with_sheath] (const tbb::blocked_range& range) { for (size_t support_layer_id = range.begin(); support_layer_id < range.end(); ++ support_layer_id) { assert(support_layer_id < raft_layers.size()); - SupportLayer &support_layer = *object.support_layers()[support_layer_id]; + SupportLayer &support_layer = *support_layers[support_layer_id]; assert(support_layer.support_fills.entities.empty()); MyLayer &raft_layer = *raft_layers[support_layer_id]; @@ -3113,10 +3099,10 @@ void PrintObjectSupportMaterial::generate_toolpaths( MyLayerExtruded interface_layer; std::vector overlaps; }; - std::vector layer_caches(object.support_layers().size(), LayerCache()); + std::vector layer_caches(support_layers.size(), LayerCache()); - tbb::parallel_for(tbb::blocked_range(n_raft_layers, object.support_layers().size()), - [this, &object, &bottom_contacts, &top_contacts, &intermediate_layers, &interface_layers, &layer_caches, &loop_interface_processor, + tbb::parallel_for(tbb::blocked_range(n_raft_layers, support_layers.size()), + [this, &support_layers, &bottom_contacts, &top_contacts, &intermediate_layers, &interface_layers, &layer_caches, &loop_interface_processor, infill_pattern, &bbox_object, support_density, interface_density, interface_angle, &angles, link_max_length_factor, with_sheath] (const tbb::blocked_range& range) { // Indices of the 1st layer in their respective container at the support layer height. @@ -3130,7 +3116,7 @@ void PrintObjectSupportMaterial::generate_toolpaths( filler_support->set_bounding_box(bbox_object); for (size_t support_layer_id = range.begin(); support_layer_id < range.end(); ++ support_layer_id) { - SupportLayer &support_layer = *object.support_layers()[support_layer_id]; + SupportLayer &support_layer = *support_layers[support_layer_id]; LayerCache &layer_cache = layer_caches[support_layer_id]; // Find polygons with the same print_z. @@ -3328,11 +3314,11 @@ void PrintObjectSupportMaterial::generate_toolpaths( }); // Now modulate the support layer height in parallel. - tbb::parallel_for(tbb::blocked_range(n_raft_layers, object.support_layers().size()), - [this, &object, &layer_caches] + tbb::parallel_for(tbb::blocked_range(n_raft_layers, support_layers.size()), + [this, &support_layers, &layer_caches] (const tbb::blocked_range& range) { for (size_t support_layer_id = range.begin(); support_layer_id < range.end(); ++ support_layer_id) { - SupportLayer &support_layer = *object.support_layers()[support_layer_id]; + SupportLayer &support_layer = *support_layers[support_layer_id]; LayerCache &layer_cache = layer_caches[support_layer_id]; for (LayerCacheItem &layer_cache_item : layer_cache.overlaps) { modulate_extrusion_by_overlapping_layers(layer_cache_item.layer_extruded->extrusions, *layer_cache_item.layer_extruded->layer, layer_cache_item.overlapping); diff --git a/src/libslic3r/SupportMaterial.hpp b/src/libslic3r/SupportMaterial.hpp index 2e1a05946f9..e579fd66fbe 100644 --- a/src/libslic3r/SupportMaterial.hpp +++ b/src/libslic3r/SupportMaterial.hpp @@ -224,7 +224,7 @@ class PrintObjectSupportMaterial // Produce the actual G-code. void generate_toolpaths( - const PrintObject &object, + SupportLayerPtrs &support_layers, const MyLayersPtr &raft_layers, const MyLayersPtr &bottom_contacts, const MyLayersPtr &top_contacts, @@ -246,7 +246,7 @@ class PrintObjectSupportMaterial bool m_can_merge_support_regions; coordf_t m_support_layer_height_min; - coordf_t m_support_layer_height_max; + // coordf_t m_support_layer_height_max; coordf_t m_gap_xy; }; diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index ec0dac54145..0b8ac250fa9 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -107,4 +107,15 @@ #define ENABLE_VOLUMETRIC_EXTRUSION_PROCESSING (1 && ENABLE_2_3_0_RC1) + +//==================== +// 2.3.1.alpha1 techs +//==================== +#define ENABLE_2_3_1_ALPHA1 1 + +#define ENABLE_SPLITTED_VERTEX_BUFFER (1 && ENABLE_2_3_1_ALPHA1) +#define ENABLE_RELOAD_FROM_DISK_FOR_3MF (1 && ENABLE_2_3_1_ALPHA1) +#define ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS (1 && ENABLE_SPLITTED_VERTEX_BUFFER) + + #endif // _prusaslicer_technologies_h_ diff --git a/src/libslic3r/TriangleMesh.hpp b/src/libslic3r/TriangleMesh.hpp index 71cd231c3f0..9625298f4ef 100644 --- a/src/libslic3r/TriangleMesh.hpp +++ b/src/libslic3r/TriangleMesh.hpp @@ -103,7 +103,7 @@ enum FacetEdgeType { class IntersectionReference { public: - IntersectionReference() : point_id(-1), edge_id(-1) {}; + IntersectionReference() : point_id(-1), edge_id(-1) {} IntersectionReference(int point_id, int edge_id) : point_id(point_id), edge_id(edge_id) {} // Where is this intersection point located? On mesh vertex or mesh edge? // Only one of the following will be set, the other will remain set to -1. @@ -116,7 +116,7 @@ class IntersectionReference class IntersectionPoint : public Point, public IntersectionReference { public: - IntersectionPoint() {}; + IntersectionPoint() {} IntersectionPoint(int point_id, int edge_id, const Point &pt) : IntersectionReference(point_id, edge_id), Point(pt) {} IntersectionPoint(const IntersectionReference &ir, const Point &pt) : IntersectionReference(ir), Point(pt) {} // Inherits coord_t x, y diff --git a/src/libslic3r/TriangleSelector.cpp b/src/libslic3r/TriangleSelector.cpp index 3fe68819584..f29d9738890 100644 --- a/src/libslic3r/TriangleSelector.cpp +++ b/src/libslic3r/TriangleSelector.cpp @@ -425,8 +425,11 @@ void TriangleSelector::reset() m_triangles.clear(); for (const stl_vertex& vert : m_mesh->its.vertices) m_vertices.emplace_back(vert); - for (const stl_triangle_vertex_indices& ind : m_mesh->its.indices) - push_triangle(ind[0], ind[1], ind[2]); + for (size_t i=0; iits.indices.size(); ++i) { + const stl_triangle_vertex_indices& ind = m_mesh->its.indices[i]; + const Vec3f& normal = m_mesh->stl.facet_start[i].normal; + push_triangle(ind[0], ind[1], ind[2], normal); + } m_orig_size_vertices = m_vertices.size(); m_orig_size_indices = m_triangles.size(); m_invalid_triangles = 0; @@ -451,19 +454,20 @@ void TriangleSelector::set_edge_limit(float edge_limit) -void TriangleSelector::push_triangle(int a, int b, int c) +void TriangleSelector::push_triangle(int a, int b, int c, const Vec3f& normal) { for (int i : {a, b, c}) { assert(i >= 0 && i < int(m_vertices.size())); ++m_vertices[i].ref_cnt; } - m_triangles.emplace_back(a, b, c); + m_triangles.emplace_back(a, b, c, normal); } void TriangleSelector::perform_split(int facet_idx, EnforcerBlockerType old_state) { Triangle* tr = &m_triangles[facet_idx]; + const Vec3f normal = tr->normal; assert(tr->is_split()); @@ -483,8 +487,8 @@ void TriangleSelector::perform_split(int facet_idx, EnforcerBlockerType old_stat m_vertices.emplace_back((m_vertices[verts_idxs[1]].v + m_vertices[verts_idxs[2]].v)/2.); verts_idxs.insert(verts_idxs.begin()+2, m_vertices.size() - 1); - push_triangle(verts_idxs[0], verts_idxs[1], verts_idxs[2]); - push_triangle(verts_idxs[2], verts_idxs[3], verts_idxs[0]); + push_triangle(verts_idxs[0], verts_idxs[1], verts_idxs[2], normal); + push_triangle(verts_idxs[2], verts_idxs[3], verts_idxs[0], normal); } if (sides_to_split == 2) { @@ -494,9 +498,9 @@ void TriangleSelector::perform_split(int facet_idx, EnforcerBlockerType old_stat m_vertices.emplace_back((m_vertices[verts_idxs[0]].v + m_vertices[verts_idxs[3]].v)/2.); verts_idxs.insert(verts_idxs.begin()+4, m_vertices.size() - 1); - push_triangle(verts_idxs[0], verts_idxs[1], verts_idxs[4]); - push_triangle(verts_idxs[1], verts_idxs[2], verts_idxs[4]); - push_triangle(verts_idxs[2], verts_idxs[3], verts_idxs[4]); + push_triangle(verts_idxs[0], verts_idxs[1], verts_idxs[4], normal); + push_triangle(verts_idxs[1], verts_idxs[2], verts_idxs[4], normal); + push_triangle(verts_idxs[2], verts_idxs[3], verts_idxs[4], normal); } if (sides_to_split == 3) { @@ -507,10 +511,10 @@ void TriangleSelector::perform_split(int facet_idx, EnforcerBlockerType old_stat m_vertices.emplace_back((m_vertices[verts_idxs[4]].v + m_vertices[verts_idxs[0]].v)/2.); verts_idxs.insert(verts_idxs.begin()+5, m_vertices.size() - 1); - push_triangle(verts_idxs[0], verts_idxs[1], verts_idxs[5]); - push_triangle(verts_idxs[1], verts_idxs[2], verts_idxs[3]); - push_triangle(verts_idxs[3], verts_idxs[4], verts_idxs[5]); - push_triangle(verts_idxs[1], verts_idxs[3], verts_idxs[5]); + push_triangle(verts_idxs[0], verts_idxs[1], verts_idxs[5], normal); + push_triangle(verts_idxs[1], verts_idxs[2], verts_idxs[3], normal); + push_triangle(verts_idxs[3], verts_idxs[4], verts_idxs[5], normal); + push_triangle(verts_idxs[1], verts_idxs[3], verts_idxs[5], normal); } tr = &m_triangles[facet_idx]; // may have been invalidated diff --git a/src/libslic3r/TriangleSelector.hpp b/src/libslic3r/TriangleSelector.hpp index 11387c766ce..9d159007042 100644 --- a/src/libslic3r/TriangleSelector.hpp +++ b/src/libslic3r/TriangleSelector.hpp @@ -63,8 +63,9 @@ class TriangleSelector { public: // Use TriangleSelector::push_triangle to create a new triangle. // It increments/decrements reference counter on vertices. - Triangle(int a, int b, int c) + Triangle(int a, int b, int c, const Vec3f& normal_) : verts_idxs{a, b, c}, + normal{normal_}, state{EnforcerBlockerType(0)}, number_of_splits{0}, special_side_idx{0}, @@ -73,6 +74,9 @@ class TriangleSelector { // Indices into m_vertices. std::array verts_idxs; + // Triangle normal (a shader might need it). + Vec3f normal; + // Is this triangle valid or marked to be removed? bool valid{true}; @@ -158,7 +162,7 @@ class TriangleSelector { void remove_useless_children(int facet_idx); // No hidden meaning. Triangles are meant. bool is_pointer_in_triangle(int facet_idx) const; bool is_edge_inside_cursor(int facet_idx) const; - void push_triangle(int a, int b, int c); + void push_triangle(int a, int b, int c, const Vec3f& normal); void perform_split(int facet_idx, EnforcerBlockerType old_state); }; diff --git a/src/libslic3r/VoronoiOffset.cpp b/src/libslic3r/VoronoiOffset.cpp index c0541bd9f96..2108388f50f 100644 --- a/src/libslic3r/VoronoiOffset.cpp +++ b/src/libslic3r/VoronoiOffset.cpp @@ -1,18 +1,20 @@ // Polygon offsetting using Voronoi diagram prodiced by boost::polygon. #include "VoronoiOffset.hpp" +#include "libslic3r.h" #include // #define VORONOI_DEBUG_OUT +#include + #ifdef VORONOI_DEBUG_OUT #include #endif namespace Slic3r { - -using VD = Geometry::VoronoiDiagram; +namespace Voronoi { namespace detail { // Intersect a circle with a ray, return the two parameters. @@ -22,9 +24,11 @@ namespace detail { { const Vec2d d = pt - center; #ifndef NDEBUG + // Start point should be inside, end point should be outside the circle. double d0 = (pt - center).norm(); double d1 = (pt + v - center).norm(); - assert(r < std::max(d0, d1) + EPSILON); + assert(d0 < r + SCALED_EPSILON); + assert(d1 > r - SCALED_EPSILON); #endif /* NDEBUG */ const double a = v.squaredNorm(); const double b = 2. * d.dot(v); @@ -194,242 +198,1138 @@ namespace detail { return out; } + // Double vertex equal to a coord_t point after conversion to double. + template + inline bool vertex_equal_to_point(const VertexType &vertex, const Point &ipt) + { + // Convert ipt to doubles, force the 80bit FPU temporary to 64bit and then compare. + // This should work with any settings of math compiler switches and the C++ compiler + // shall understand the memcpies as type punning and it shall optimize them out. +#if 1 + using ulp_cmp_type = boost::polygon::detail::ulp_comparison; + ulp_cmp_type ulp_cmp; + static constexpr int ULPS = boost::polygon::voronoi_diagram_traits::vertex_equality_predicate_type::ULPS; + return ulp_cmp(vertex.x(), double(ipt.x()), ULPS) == ulp_cmp_type::EQUAL && + ulp_cmp(vertex.y(), double(ipt.y()), ULPS) == ulp_cmp_type::EQUAL; +#else + volatile double u = static_cast(ipt.x()); + volatile double v = vertex.x(); + if (u != v) + return false; + u = static_cast(ipt.y()); + v = vertex.y(); + return u == v; +#endif + }; + bool vertex_equal_to_point(const VD::vertex_type *vertex, const Point &ipt) + { return vertex_equal_to_point(*vertex, ipt); } + + double dist_to_site(const Lines &lines, const VD::cell_type &cell, const Vec2d &point) + { + const Line &line = lines[cell.source_index()]; + return cell.contains_point() ? + (((cell.source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line.a : line.b).cast() - point).norm() : + (Geometry::foot_pt(line.a.cast(), (line.b - line.a).cast(), point) - point).norm(); + }; + + bool on_site(const Lines &lines, const VD::cell_type &cell, const Vec2d &pt) + { + const Line &line = lines[cell.source_index()]; + auto on_contour = [&pt](const Point &ipt) { return detail::vertex_equal_to_point(pt, ipt); }; + if (cell.contains_point()) { + return on_contour(contour_point(cell, line)); + } else { + assert(! (on_contour(line.a) && on_contour(line.b))); + return on_contour(line.a) || on_contour(line.b); + } + }; + + // For a Voronoi segment starting with voronoi_point1 and ending with voronoi_point2, + // defined by a bisector of Voronoi sites pt1_site and pt2_site (line) + // find two points on the Voronoi bisector, that delimit regions with dr/dl measure + // lower / higher than threshold_dr_dl. + // + // Linear segment from voronoi_point1 to return.first and + // linear segment from return.second to voronoi_point2 have dr/dl measure + // higher than threshold_dr_dl. + // If such respective segment does not exist, then return.first resp. return.second is nan. + std::pair point_point_dr_dl_thresholds( + // Two Voronoi sites + const Point &pt1_site, const Point &pt2_site, + // End points of a Voronoi segment + const Vec2d &voronoi_point1, const Vec2d &voronoi_point2, + // Threshold of the skeleton function, where alpha is an angle of a sharp convex corner with the same dr/dl. + const double threshold_tan_alpha_half) + { + // sympy code to calculate +-x + // of a linear bisector of pt1_site, pt2_site parametrized with pt + x * v, |v| = 1 + // where dr/dl = threshold_dr_dl + // equals d|pt1_site - pt + x * v| / dx = threshold_dr_dl + // + // y = sqrt(x^2 + d^2) + // dy = diff(y, x) + // solve(dy - c, x) + // + // Project voronoi_point1/2 to line_site. + Vec2d dir_y = (pt2_site - pt1_site).cast(); + Vec2d dir_x = Vec2d(- dir_y.y(), dir_y.x()).normalized(); + Vec2d cntr = 0.5 * (pt1_site.cast() + pt2_site.cast()); + double t1 = (voronoi_point1 - cntr).dot(dir_x); + double t2 = (voronoi_point2 - cntr).dot(dir_x); + if (t1 > t2) { + t1 = -t1; + t2 = -t2; + dir_x = - dir_x; + } + auto x = 0.5 * dir_y.norm() * threshold_tan_alpha_half; + static constexpr double nan = std::numeric_limits::quiet_NaN(); + auto out = std::make_pair(Vec2d(nan, nan), Vec2d(nan, nan)); + if (t2 > -x && t1 < x) { + // Intervals overlap. + dir_x *= x; + out.first = (t1 < -x) ? cntr - dir_x : voronoi_point1; + out.second = (t2 > +x) ? cntr + dir_x : voronoi_point2; + } + return out; + } + + // For a Voronoi segment starting with voronoi_point1 and ending with voronoi_point2, + // defined by a bisector of Voronoi sites pt_site and line site (parabolic arc) + // find two points on the Voronoi parabolic arc, that delimit regions with dr/dl measure + // lower / higher than threshold_dr_dl. + // + // Parabolic arc from voronoi_point1 to return.first and + // parabolic arc from return.second to voronoi_point2 have dr/dl measure + // higher than threshold_dr_dl. + // If such respective segment does not exist, then return.first resp. return.second is nan. + std::pair point_segment_dr_dl_thresholds( + // Two Voronoi sites + const Point &pt_site, const Line &line_site, + // End points of a Voronoi segment + const Vec2d &voronoi_point1, const Vec2d &voronoi_point2, + // Threshold of the skeleton function, where alpha is an angle of a sharp convex corner with the same dr/dl. + const double threshold_tan_alpha_half) + { + // sympy code to calculate +-x + // of a parabola y = ax^2 + b + // where dr/dl = threshold_dr_dl + // + // a = 1 / (4 * b) + // y = a*x**2 + b + // dy = diff(y, x) + // solve(dy / sqrt(1 + dy**2) - c, x) + // + // Foot point of the point site on the line site. + Vec2d ft = Geometry::foot_pt(line_site, pt_site); + // Minimum distance of the bisector (parabolic arc) from the two sites, squared. + Vec2d dir_pt_ft = pt_site.cast() - ft; + double b = 0.5 * dir_pt_ft.norm(); + static constexpr double nan = std::numeric_limits::quiet_NaN(); + auto out = std::make_pair(Vec2d(nan, nan), Vec2d(nan, nan)); + { + // +x, -x are the two parameters along the line_site, where threshold_tan_alpha_half is met. + double x = 2. * b * threshold_tan_alpha_half; + // Project voronoi_point1/2 to line_site. + Vec2d dir_x = (line_site.b - line_site.a).cast().normalized(); + double t1 = (voronoi_point1 - ft).dot(dir_x); + double t2 = (voronoi_point2 - ft).dot(dir_x); + if (t1 > t2) { + t1 = -t1; + t2 = -t2; + dir_x = - dir_x; + } + if (t2 > -x && t1 < x) { + // Intervals overlap. + bool t1_valid = t1 < -x; + bool t2_valid = t2 > +x; + // Direction of the Y axis of the parabola. + Vec2d dir_y(- dir_x.y(), dir_x.x()); + // Orient the Y axis towards the point site. + if (dir_y.dot(dir_pt_ft) < 0.) + dir_y = - dir_y; + // Equation of the parabola: y = b + a * x^2 + double a = 0.25 / b; + dir_x *= x; + dir_y *= b + a * x * x; + out.first = t1_valid ? ft - dir_x + dir_y : voronoi_point1; + out.second = t2_valid ? ft + dir_x + dir_y : voronoi_point2; + } + } + return out; + } + + std::pair point_point_skeleton_thresholds( + // Two Voronoi sites + const Point &pt1_site, const Point &pt2_site, + // End points of a Voronoi segment + const Vec2d &voronoi_point1, const Vec2d &voronoi_point2, + // Threshold of the skeleton function. + const double tan_alpha_half) + { + // Project voronoi_point1/2 to line_site. + Vec2d dir_y = (pt2_site - pt1_site).cast(); + Vec2d dir_x = Vec2d(- dir_y.y(), dir_y.x()).normalized(); + Vec2d cntr = 0.5 * (pt1_site.cast() + pt2_site.cast()); + double t1 = (voronoi_point1 - cntr).dot(dir_x); + double t2 = (voronoi_point2 - cntr).dot(dir_x); + if (t1 > t2) { + t1 = -t1; + t2 = -t2; + dir_x = - dir_x; + } + auto x = 0.5 * dir_y.norm() * tan_alpha_half; + static constexpr double nan = std::numeric_limits::quiet_NaN(); + auto out = std::make_pair(Vec2d(nan, nan), Vec2d(nan, nan)); + if (t2 > -x && t1 < x) { + // Intervals overlap. + dir_x *= x; + out.first = (t1 < -x) ? cntr - dir_x : voronoi_point1; + out.second = (t2 > +x) ? cntr + dir_x : voronoi_point2; + } + return out; + } + + std::pair point_segment_skeleton_thresholds( + // Two Voronoi sites + const Point &pt_site, const Line &line_site, + // End points of a Voronoi segment + const Vec2d &voronoi_point1, const Vec2d &voronoi_point2, + // Threshold of the skeleton function. + const double threshold_cos_alpha) + { + // Foot point of the point site on the line site. + Vec2d ft = Geometry::foot_pt(line_site, pt_site); + // Minimum distance of the bisector (parabolic arc) from the two sites, squared. + Vec2d dir_pt_ft = pt_site.cast() - ft; + // Distance of Voronoi point site from the Voronoi line site. + double l = dir_pt_ft.norm(); + static constexpr double nan = std::numeric_limits::quiet_NaN(); + auto out = std::make_pair(Vec2d(nan, nan), Vec2d(nan, nan)); + // +x, -x are the two parameters along the line_site, where threshold is met. + double r = l / (1. + threshold_cos_alpha); + double x2 = r * r - Slic3r::sqr(l - r); + double x = sqrt(x2); + // Project voronoi_point1/2 to line_site. + Vec2d dir_x = (line_site.b - line_site.a).cast().normalized(); + double t1 = (voronoi_point1 - ft).dot(dir_x); + double t2 = (voronoi_point2 - ft).dot(dir_x); + if (t1 > t2) { + t1 = -t1; + t2 = -t2; + dir_x = - dir_x; + } + if (t2 > -x && t1 < x) { + // Intervals overlap. + bool t1_valid = t1 < -x; + bool t2_valid = t2 > +x; + // Direction of the Y axis of the parabola. + Vec2d dir_y(- dir_x.y(), dir_x.x()); + // Orient the Y axis towards the point site. + if (dir_y.dot(dir_pt_ft) < 0.) + dir_y = - dir_y; + // Equation of the parabola: y = b + a * x^2 + double a = 0.5 / l; + dir_x *= x; + dir_y *= 0.5 * l + a * x2; + out.first = t1_valid ? ft - dir_x + dir_y : voronoi_point1; + out.second = t2_valid ? ft + dir_x + dir_y : voronoi_point2; + } + return out; + } + } // namespace detail -Polygons voronoi_offset( - const Geometry::VoronoiDiagram &vd, - const Lines &lines, - double offset_distance, - double discretization_error) -{ #ifndef NDEBUG +namespace debug +{ // Verify that twin halfedges are stored next to the other in vd. - for (size_t i = 0; i < vd.num_edges(); i += 2) { - const VD::edge_type &e = vd.edges()[i]; - const VD::edge_type &e2 = vd.edges()[i + 1]; - assert(e.twin() == &e2); - assert(e2.twin() == &e); - assert(e.is_secondary() == e2.is_secondary()); - if (e.is_secondary()) { - assert(e.cell()->contains_point() != e2.cell()->contains_point()); - const VD::edge_type &ex = (e.cell()->contains_point() ? e : e2); - // Verify that the Point defining the cell left of ex is an end point of a segment - // defining the cell right of ex. - const Line &line0 = lines[ex.cell()->source_index()]; - const Line &line1 = lines[ex.twin()->cell()->source_index()]; - const Point &pt = (ex.cell()->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line0.a : line0.b; - assert(pt == line1.a || pt == line1.b); + bool verify_twin_halfedges_successive(const VD &vd, const Lines &lines) + { + for (size_t i = 0; i < vd.num_edges(); i += 2) { + const VD::edge_type &e = vd.edges()[i]; + const VD::edge_type &e2 = vd.edges()[i + 1]; + assert(e.twin() == &e2); + assert(e2.twin() == &e); + assert(e.is_secondary() == e2.is_secondary()); + if (e.is_secondary()) { + assert(e.cell()->contains_point() != e2.cell()->contains_point()); + const VD::edge_type &ex = (e.cell()->contains_point() ? e : e2); + // Verify that the Point defining the cell left of ex is an end point of a segment + // defining the cell right of ex. + const Line &line0 = lines[ex.cell()->source_index()]; + const Line &line1 = lines[ex.twin()->cell()->source_index()]; + const Point &pt = (ex.cell()->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line0.a : line0.b; + assert(pt == line1.a || pt == line1.b); + } + } + return true; + } + + bool verify_inside_outside_annotations(const VD &vd) + { + // Verify that "Colors" are set at all Voronoi entities. + for (const VD::vertex_type &v : vd.vertices()) { + assert(! v.is_degenerate()); + assert(vertex_category(v) != VertexCategory::Unknown); + } + for (const VD::edge_type &e : vd.edges()) + assert(edge_category(e) != EdgeCategory::Unknown); + for (const VD::cell_type &c : vd.cells()) { + // Unfortunately denegerate cells could be created, which reference a null edge. + // https://github.com/boostorg/polygon/issues/47 + assert(c.is_degenerate() || cell_category(c) != CellCategory::Unknown); + } + + // Verify consistency between markings of Voronoi cells, edges and verticies. + for (const VD::cell_type &cell : vd.cells()) { + if (cell.is_degenerate()) { + // Unfortunately denegerate cells could be created, which reference a null edge. + // https://github.com/boostorg/polygon/issues/47 + continue; + } + const VD::edge_type *first_edge = cell.incident_edge(); + const VD::edge_type *edge = first_edge; + CellCategory cc = cell_category(cell); + size_t num_vertices_on_contour = 0; + size_t num_vertices_inside = 0; + size_t num_vertices_outside = 0; + size_t num_edges_point_to_contour = 0; + size_t num_edges_point_inside = 0; + size_t num_edges_point_outside = 0; + do { + { + EdgeCategory ec = edge_category(edge); + switch (ec) { + case EdgeCategory::PointsInside: + assert(edge->vertex0() != nullptr && edge->vertex1() != nullptr); + ++ num_edges_point_inside; break; + case EdgeCategory::PointsOutside: +// assert(edge->vertex0() != nullptr); + ++ num_edges_point_outside; break; + case EdgeCategory::PointsToContour: + assert(edge->vertex1() != nullptr); + ++ num_edges_point_to_contour; break; + default: + assert(false); + } + } + { + VertexCategory vc = (edge->vertex1() == nullptr) ? VertexCategory::Outside : vertex_category(edge->vertex1()); + switch (vc) { + case VertexCategory::Inside: + ++ num_vertices_inside; break; + case VertexCategory::Outside: + ++ num_vertices_outside; break; + case VertexCategory::OnContour: + ++ num_vertices_on_contour; break; + default: + assert(false); + } + } + { + const VD::cell_type *cell_other = edge->twin()->cell(); + const CellCategory cc_other = cell_category(cell_other); + assert(cc_other != CellCategory::Unknown); + switch (cc) { + case CellCategory::Boundary: + assert(cc_other != CellCategory::Boundary || cell_other->contains_segment()); + break; + case CellCategory::Inside: + assert(cc_other == CellCategory::Inside || cc_other ==CellCategory::Boundary); + break; + case CellCategory::Outside: + assert(cc_other == CellCategory::Outside || cc_other == CellCategory::Boundary); + break; + default: + assert(false); + break; + } + } + edge = edge->next(); + } while (edge != first_edge); + + switch (cc) { + case CellCategory::Boundary: + assert(cell.contains_segment()); + assert(num_edges_point_to_contour == 2); + assert(num_vertices_on_contour == 2); + assert(num_vertices_inside > 0); + assert(num_vertices_outside > 0); + assert(num_edges_point_inside > 0); + assert(num_edges_point_outside > 0); + break; + case CellCategory::Inside: + assert(num_vertices_on_contour <= 1); + assert(num_edges_point_to_contour <= 1); + assert(num_vertices_inside > 0); + assert(num_vertices_outside == 0); + assert(num_edges_point_inside > 0); + assert(num_edges_point_outside == 0); + break; + case CellCategory::Outside: + assert(num_vertices_on_contour <= 1); + assert(num_edges_point_to_contour <= 1); + assert(num_vertices_inside == 0); + assert(num_vertices_outside > 0); + assert(num_edges_point_inside == 0); + assert(num_edges_point_outside > 0); + break; + default: + assert(false); + break; + } + } + + return true; + } + + bool verify_vertices_on_contour(const VD &vd, const Lines &lines) + { + for (const VD::edge_type &edge : vd.edges()) { + const VD::vertex_type *v = edge.vertex0(); + if (v != nullptr) { + bool on_contour = vertex_category(v) == VertexCategory::OnContour; + assert(detail::on_site(lines, *edge.cell(), vertex_point(v)) == on_contour); + assert(detail::on_site(lines, *edge.twin()->cell(), vertex_point(v)) == on_contour); + } + } + return true; + } + + bool verify_signed_distances(const VD &vd, const Lines &lines, const std::vector &signed_distances) + { + for (const VD::edge_type &edge : vd.edges()) { + const VD::vertex_type *v = edge.vertex0(); + double d = (v == nullptr) ? std::numeric_limits::max() : signed_distances[v - &vd.vertices().front()]; + if (v == nullptr || vertex_category(v) == VertexCategory::Outside) + assert(d > 0.); + else if (vertex_category(v) == VertexCategory::OnContour) + assert(d == 0.); + else + assert(d < 0.); + if (v != nullptr) { + double err = std::abs(detail::dist_to_site(lines, *edge.cell(), vertex_point(v)) - std::abs(d)); + double err2 = std::abs(detail::dist_to_site(lines, *edge.twin()->cell(), vertex_point(v)) - std::abs(d)); + assert(err < SCALED_EPSILON); + assert(err2 < SCALED_EPSILON); + } } + return true; } + + bool verify_offset_intersection_points(const VD &vd, const Lines &lines, const double offset_distance, const std::vector &offset_intersection_points) + { + const VD::edge_type *front_edge = &vd.edges().front(); + const double d = std::abs(offset_distance); + for (const VD::edge_type &edge : vd.edges()) { + const Vec2d &p = offset_intersection_points[&edge - front_edge]; + if (edge_offset_has_intersection(p)) { + double err = std::abs(detail::dist_to_site(lines, *edge.cell(), p) - d); + double err2 = std::abs(detail::dist_to_site(lines, *edge.twin()->cell(), p) - d); + assert(err < SCALED_EPSILON); + assert(err2 < SCALED_EPSILON); + } + } + return true; + } + +} #endif // NDEBUG - enum class EdgeState : unsigned char { - // Initial state, don't know. - Unknown, - // This edge will certainly not be intersected by the offset curve. - Inactive, - // This edge will certainly be intersected by the offset curve. - Active, - // This edge will possibly be intersected by the offset curve. - Possible - }; +void reset_inside_outside_annotations(VD &vd) +{ + for (const VD::vertex_type &v : vd.vertices()) + set_vertex_category(const_cast(v), VertexCategory::Unknown); + for (const VD::edge_type &e : vd.edges()) + set_edge_category(const_cast(e), EdgeCategory::Unknown); + for (const VD::cell_type &c : vd.cells()) + set_cell_category(const_cast(c), CellCategory::Unknown); +} - enum class CellState : unsigned char { - // Initial state, don't know. - Unknown, - // Inactive cell is inside for outside curves and outside for inside curves. - Inactive, - // Active cell is outside for outside curves and inside for inside curves. - Active, - // Boundary cell is intersected by the input segment, part of it is active. - Boundary - }; +void annotate_inside_outside(VD &vd, const Lines &lines) +{ + assert(debug::verify_twin_halfedges_successive(vd, lines)); + + reset_inside_outside_annotations(vd); + +#ifdef VORONOI_DEBUG_OUT + BoundingBox bbox; + { + bbox.merge(get_extents(lines)); + bbox.min -= (0.01 * bbox.size().cast()).cast(); + bbox.max += (0.01 * bbox.size().cast()).cast(); + } + static int irun = 0; + ++ irun; + dump_voronoi_to_svg(debug_out_path("voronoi-offset-initial-%d.svg", irun).c_str(), vd, Points(), lines); +#endif // VORONOI_DEBUG_OUT - // Mark edges with outward vertex pointing outside the polygons, thus there is a chance - // that such an edge will have an intersection with our desired offset curve. - bool outside = offset_distance > 0.; - std::vector edge_state(vd.num_edges(), EdgeState::Unknown); - std::vector cell_state(vd.num_cells(), CellState::Unknown); - const VD::edge_type *front_edge = &vd.edges().front(); - const VD::cell_type *front_cell = &vd.cells().front(); - auto set_edge_state_initial = [&edge_state, front_edge](const VD::edge_type *edge, EdgeState new_edge_type) { - EdgeState &edge_type = edge_state[edge - front_edge]; - assert(edge_type == EdgeState::Unknown || edge_type == new_edge_type); - assert(new_edge_type == EdgeState::Possible || new_edge_type == EdgeState::Inactive); - edge_type = new_edge_type; + // Set a VertexCategory, verify validity of the operation. + auto annotate_vertex = [](const VD::vertex_type *vertex, VertexCategory new_vertex_category) { +#ifndef NDEBUG + VertexCategory vc = vertex_category(vertex); + assert(vc == VertexCategory::Unknown || vc == new_vertex_category); + assert(new_vertex_category == VertexCategory::Inside || + new_vertex_category == VertexCategory::Outside || + new_vertex_category == VertexCategory::OnContour); +#endif // NDEBUG + set_vertex_category(const_cast(vertex), new_vertex_category); }; - auto set_edge_state_final = [&edge_state, front_edge](const size_t edge_id, EdgeState new_edge_type) { - EdgeState &edge_type = edge_state[edge_id]; - assert(edge_type == EdgeState::Possible || edge_type == new_edge_type); - assert(new_edge_type == EdgeState::Active || new_edge_type == EdgeState::Inactive); - edge_type = new_edge_type; + + // Set an EdgeCategory, verify validity of the operation. + auto annotate_edge = [](const VD::edge_type *edge, EdgeCategory new_edge_category) { +#ifndef NDEBUG + EdgeCategory ec = edge_category(edge); + assert(ec == EdgeCategory::Unknown || ec == new_edge_category); + switch (new_edge_category) { + case EdgeCategory::PointsInside: + assert(edge->vertex0() != nullptr); + assert(edge->vertex1() != nullptr); + break; + case EdgeCategory::PointsOutside: + // assert(edge->vertex0() != nullptr); + break; + case EdgeCategory::PointsToContour: + assert(edge->vertex1() != nullptr); + break; + default: + assert(false); + } +#endif // NDEBUG + set_edge_category(const_cast(edge), new_edge_category); }; - auto set_cell_state = [&cell_state, front_cell](const VD::cell_type *cell, CellState new_cell_type) -> bool { - CellState &cell_type = cell_state[cell - front_cell]; - assert(cell_type == CellState::Active || cell_type == CellState::Inactive || cell_type == CellState::Boundary || cell_type == CellState::Unknown); - assert(new_cell_type == CellState::Active || new_cell_type == CellState::Inactive || new_cell_type == CellState::Boundary); - switch (cell_type) { - case CellState::Unknown: + + // Set a CellCategory, verify validity of the operation. + // Handle marking of boundary cells (first time the cell is marked as outside, the other time as inside). + // Returns true if the current cell category was modified. + auto annotate_cell = [](const VD::cell_type *cell, CellCategory new_cell_category) -> bool { + CellCategory cc = cell_category(cell); + assert(cc == CellCategory::Inside || cc == CellCategory::Outside || cc == CellCategory::Boundary || cc == CellCategory::Unknown); + assert(new_cell_category == CellCategory::Inside || new_cell_category == CellCategory::Outside || new_cell_category == CellCategory::Boundary); + switch (cc) { + case CellCategory::Unknown: + // Old category unknown, just write the new category. break; - case CellState::Active: - if (new_cell_type == CellState::Inactive) - new_cell_type = CellState::Boundary; + case CellCategory::Outside: + if (new_cell_category == CellCategory::Inside) + new_cell_category = CellCategory::Boundary; break; - case CellState::Inactive: - if (new_cell_type == CellState::Active) - new_cell_type = CellState::Boundary; + case CellCategory::Inside: + if (new_cell_category == CellCategory::Outside) + new_cell_category = CellCategory::Boundary; break; - case CellState::Boundary: + case CellCategory::Boundary: return false; } - if (cell_type != new_cell_type) { - cell_type = new_cell_type; + if (cc != new_cell_category) { + set_cell_category(const_cast(cell), new_cell_category); return true; } return false; }; + // The next loop is supposed to annotate the "on input contour" vertices, but due to + // merging very close Voronoi vertices together by boost::polygon Voronoi generator + // the condition may not always be met. It should be safe to mark all Voronoi very close + // to the input contour as on contour. + for (const VD::edge_type &edge : vd.edges()) { + const VD::vertex_type *v = edge.vertex0(); + if (v != nullptr) { + bool on_contour = detail::on_site(lines, *edge.cell(), vertex_point(v)); +#ifndef NDEBUG + bool on_contour2 = detail::on_site(lines, *edge.twin()->cell(), vertex_point(v)); + assert(on_contour == on_contour2); +#endif // NDEBUG + if (on_contour) + annotate_vertex(v, VertexCategory::OnContour); + } + } + + // One side of a secondary edge is always on the source contour. Mark these vertices as OnContour. + // See the comment at the loop before, the condition may not always be met. + for (const VD::edge_type &edge : vd.edges()) { + if (edge.is_secondary() && edge.vertex0() != nullptr) { + assert(edge.is_linear()); + assert(edge.cell()->contains_point() != edge.twin()->cell()->contains_point()); + // The point associated with the point site shall be equal with one vertex of this Voronoi edge. + const Point &pt_on_contour = edge.cell()->contains_point() ? contour_point(*edge.cell(), lines) : contour_point(*edge.twin()->cell(), lines); + auto on_contour = [&pt_on_contour](const VD::vertex_type *v) { return detail::vertex_equal_to_point(v, pt_on_contour); }; + if (edge.vertex1() == nullptr) { + assert(on_contour(edge.vertex0())); + annotate_vertex(edge.vertex0(), VertexCategory::OnContour); + } else { + // Only one of the two vertices may lie on input contour. + const VD::vertex_type *v0 = edge.vertex0(); + const VD::vertex_type *v1 = edge.vertex1(); +#ifndef NDEBUG + VertexCategory v0_category = vertex_category(v0); + VertexCategory v1_category = vertex_category(v1); + assert(v0_category != VertexCategory::OnContour || v1_category != VertexCategory::OnContour); + assert(! (on_contour(v0) && on_contour(v1))); +#endif // NDEBUG + if (on_contour(v0)) + annotate_vertex(v0, VertexCategory::OnContour); + else { + assert(on_contour(v1)); + annotate_vertex(v1, VertexCategory::OnContour); + } + } + } + } + + assert(debug::verify_vertices_on_contour(vd, lines)); + for (const VD::edge_type &edge : vd.edges()) if (edge.vertex1() == nullptr) { // Infinite Voronoi edge separating two Point sites or a Point site and a Segment site. - // Infinite edge is always outside and it has at least one valid vertex. + // Infinite edge is always outside and it references at least one valid vertex. + assert(edge.is_infinite()); + assert(edge.is_linear()); assert(edge.vertex0() != nullptr); - set_edge_state_initial(&edge, outside ? EdgeState::Possible : EdgeState::Inactive); + const VD::cell_type *cell = edge.cell(); + const VD::cell_type *cell2 = edge.twin()->cell(); + // A Point-Segment secondary Voronoi edge touches the input contour, a Point-Point Voronoi + // edge does not. + assert(edge.is_secondary() ? (cell->contains_segment() != cell2->contains_segment()) : + (cell->contains_point() == cell2->contains_point())); + annotate_edge(&edge, EdgeCategory::PointsOutside); // Opposite edge of an infinite edge is certainly not active. - set_edge_state_initial(edge.twin(), EdgeState::Inactive); - if (edge.is_secondary()) { - // edge.vertex0() must lie on source contour. - const VD::cell_type *cell = edge.cell(); - const VD::cell_type *cell2 = edge.twin()->cell(); - if (cell->contains_segment()) - std::swap(cell, cell2); - // State of a cell containing a boundary point is known. - assert(cell->contains_point()); - set_cell_state(cell, outside ? CellState::Active : CellState::Inactive); - // State of a cell containing a boundary edge is Boundary. - assert(cell2->contains_segment()); - set_cell_state(cell2, CellState::Boundary); - } + annotate_edge(edge.twin(), edge.is_secondary() ? EdgeCategory::PointsToContour : EdgeCategory::PointsOutside); + annotate_vertex(edge.vertex0(), edge.is_secondary() ? VertexCategory::OnContour : VertexCategory::Outside); + // edge.vertex1() is null, it is implicitely outside. + if (cell->contains_segment()) + std::swap(cell, cell2); + // State of a cell containing a boundary point is certainly outside. + assert(cell->contains_point()); + annotate_cell(cell, CellCategory::Outside); + assert(edge.is_secondary() == cell2->contains_segment()); + annotate_cell(cell2, cell2->contains_point() ? CellCategory::Outside : CellCategory::Boundary); } else if (edge.vertex0() != nullptr) { - // Finite edge. + assert(edge.is_finite()); const VD::cell_type *cell = edge.cell(); const Line *line = cell->contains_segment() ? &lines[cell->source_index()] : nullptr; if (line == nullptr) { cell = edge.twin()->cell(); line = cell->contains_segment() ? &lines[cell->source_index()] : nullptr; } + // Only one of the two vertices may lie on input contour. + assert(! edge.is_linear() || vertex_category(edge.vertex0()) != VertexCategory::OnContour || vertex_category(edge.vertex1()) != VertexCategory::OnContour); + // Now classify the Voronoi vertices and edges as inside outside, if at least one Voronoi + // site is a Segment site. + // Inside / outside classification of Point - Point Voronoi edges will be done later + // by a propagation (seed fill). if (line) { const VD::vertex_type *v1 = edge.vertex1(); const VD::cell_type *cell2 = (cell == edge.cell()) ? edge.twin()->cell() : edge.cell(); - assert(v1); - const Point *pt_on_contour = nullptr; - if (cell == edge.cell() && edge.twin()->cell()->contains_segment()) { - // Constrained bisector of two segments. + assert(v1 != nullptr); + VertexCategory v0_category = vertex_category(edge.vertex0()); + VertexCategory v1_category = vertex_category(edge.vertex1()); + bool on_contour = v0_category == VertexCategory::OnContour || v1_category == VertexCategory::OnContour; +#ifndef NDEBUG + if (! on_contour && cell == edge.cell() && edge.twin()->cell()->contains_segment()) { + // Constrained bisector of two segments. Vojtech is not quite sure whether the Voronoi generator is robust enough + // to always connect at least one secondary edge to an input contour point. Catch it here. + assert(edge.is_linear()); + // OnContour state of this edge is not known yet. + const Point *pt_on_contour = nullptr; // If the two segments share a point, then one end of the current Voronoi edge shares this point as well. - // Find pt_on_contour if it exists. + // A bisector may not necessarily connect to the source contour. Find pt_on_contour if it exists. const Line &line2 = lines[cell2->source_index()]; if (line->a == line2.b) pt_on_contour = &line->a; else if (line->b == line2.a) pt_on_contour = &line->b; - } else if (edge.is_secondary()) { - assert(edge.is_linear()); - // One end of the current Voronoi edge shares a point of a contour. - assert(edge.cell()->contains_point() != edge.twin()->cell()->contains_point()); - const Line &line2 = lines[cell2->source_index()]; - pt_on_contour = &((cell2->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line2.a : line2.b); - } - if (pt_on_contour) { - // One end of the current Voronoi edge shares a point of a contour. - // Find out which one it is. - const VD::vertex_type *v0 = edge.vertex0(); - Vec2d vec0(v0->x() - pt_on_contour->x(), v0->y() - pt_on_contour->y()); - Vec2d vec1(v1->x() - pt_on_contour->x(), v1->y() - pt_on_contour->y()); - double d0 = vec0.squaredNorm(); - double d1 = vec1.squaredNorm(); - assert(std::min(d0, d1) < SCALED_EPSILON * SCALED_EPSILON); - if (d0 < d1) { - // v0 is equal to pt. - } else { - // Skip secondary edge pointing to a contour point. - set_edge_state_initial(&edge, EdgeState::Inactive); - continue; + if (pt_on_contour) { + const VD::vertex_type *v0 = edge.vertex0(); + auto on_contour = [&pt_on_contour](const VD::vertex_type *v) { + return std::abs(v->x() - pt_on_contour->x()) < 0.5001 && + std::abs(v->y() - pt_on_contour->y()) < 0.5001; + }; + assert(! on_contour(v0) && ! on_contour(v1)); } } - Vec2d l0(line->a.cast()); - Vec2d lv((line->b - line->a).cast()); - double side = cross2(lv, Vec2d(v1->x(), v1->y()) - l0); - bool edge_active = outside ? (side < 0.) : (side > 0.); - set_edge_state_initial(&edge, edge_active ? EdgeState::Possible : EdgeState::Inactive); - assert(cell->contains_segment()); - set_cell_state(cell, - pt_on_contour ? CellState::Boundary : - edge_active ? CellState::Active : CellState::Inactive); - set_cell_state(cell2, - (pt_on_contour && cell2->contains_segment()) ? - CellState::Boundary : - edge_active ? CellState::Active : CellState::Inactive); +#endif // NDEBUG + if (on_contour && v1_category == VertexCategory::OnContour) { + // Skip secondary edge pointing to a contour point. + annotate_edge(&edge, EdgeCategory::PointsToContour); + } else { + // v0 is certainly not on the input polygons. + // Is v1 inside or outside the input polygons? + // The Voronoi vertex coordinate is in doubles, calculate orientation in doubles. + Vec2d l0(line->a.cast()); + Vec2d lv((line->b - line->a).cast()); + double side = cross2(Vec2d(v1->x(), v1->y()) - l0, lv); + // No Voronoi edge could connect two vertices of input polygons. + assert(side != 0.); + auto vc = side > 0. ? VertexCategory::Outside : VertexCategory::Inside; + annotate_vertex(v1, vc); + auto ec = vc == VertexCategory::Outside ? EdgeCategory::PointsOutside : EdgeCategory::PointsInside; + annotate_edge(&edge, ec); + // Annotate the twin edge and its vertex. As the Voronoi edge may never cross the input + // contour, the twin edge and its vertex will share the property of edge. + annotate_vertex(edge.vertex0(), on_contour ? VertexCategory::OnContour : vc); + annotate_edge(edge.twin(), on_contour ? EdgeCategory::PointsToContour : ec); + assert(cell->contains_segment()); + annotate_cell(cell, on_contour ? CellCategory::Boundary : + (vc == VertexCategory::Outside ? CellCategory::Outside : CellCategory::Inside)); + annotate_cell(cell2, (on_contour && cell2->contains_segment()) ? CellCategory::Boundary : + (vc == VertexCategory::Outside ? CellCategory::Outside : CellCategory::Inside)); + } } } - { - // Perform one round of expansion marking Voronoi edges and cells next to boundary cells as active / inactive. - std::vector cell_queue; - for (const VD::edge_type &edge : vd.edges()) - if (edge_state[&edge - front_edge] == EdgeState::Unknown) { - assert(edge.cell()->contains_point() && edge.twin()->cell()->contains_point()); - // Edge separating two point sources, not yet classified as inside / outside. - CellState cs = cell_state[edge.cell() - front_cell]; - CellState cs2 = cell_state[edge.twin()->cell() - front_cell]; - if (cs != CellState::Unknown || cs2 != CellState::Unknown) { - if (cs == CellState::Unknown) { - cs = cs2; - if (set_cell_state(edge.cell(), cs)) - cell_queue.emplace_back(edge.cell()); - } else if (set_cell_state(edge.twin()->cell(), cs)) - cell_queue.emplace_back(edge.twin()->cell()); - EdgeState es = (cs == CellState::Active) ? EdgeState::Possible : EdgeState::Inactive; - set_edge_state_initial(&edge, es); - set_edge_state_initial(edge.twin(), es); - } else { - const VD::edge_type *e = edge.twin()->rot_prev(); - do { - EdgeState es = edge_state[e->twin() - front_edge]; - if (es != EdgeState::Unknown) { - assert(es == EdgeState::Possible || es == EdgeState::Inactive); - set_edge_state_initial(&edge, es); - CellState cs = (es == EdgeState::Possible) ? CellState::Active : CellState::Inactive; - if (set_cell_state(edge.cell(), cs)) - cell_queue.emplace_back(edge.cell()); - if (set_cell_state(edge.twin()->cell(), cs)) - cell_queue.emplace_back(edge.twin()->cell()); - break; - } - e = e->rot_prev(); - } while (e != edge.twin()); + + assert(debug::verify_vertices_on_contour(vd, lines)); + + // Now most Voronoi vertices, edges and cells are annotated, with the exception of some + // edges separating two Point sites, their cells and vertices. + // Perform one round of expansion marking Voronoi edges and cells next to boundary cells. + std::vector cell_queue; + for (const VD::edge_type &edge : vd.edges()) { + assert((edge_category(edge) == EdgeCategory::Unknown) == (edge_category(edge.twin()) == EdgeCategory::Unknown)); + if (edge_category(edge) == EdgeCategory::Unknown) { + assert(edge.is_finite()); + const VD::cell_type &cell = *edge.cell(); + const VD::cell_type &cell2 = *edge.twin()->cell(); + assert(cell.contains_point() && cell2.contains_point()); + CellCategory cc = cell_category(cell); + CellCategory cc2 = cell_category(cell2); + assert(cc != CellCategory::Boundary && cc2 != CellCategory::Boundary); + CellCategory cc_new = cc; + if (cc_new == CellCategory::Unknown) + cc_new = cc2; + else + assert(cc2 == CellCategory::Unknown || cc == cc2); + if (cc_new == CellCategory::Unknown) { + VertexCategory vc = vertex_category(edge.vertex0()); + assert(vc != VertexCategory::OnContour); + if (vc != VertexCategory::Unknown) + cc_new = (vc == VertexCategory::Outside) ? CellCategory::Outside : CellCategory::Inside; + } + if (cc_new != CellCategory::Unknown) { + VertexCategory vc = (cc_new == CellCategory::Outside) ? VertexCategory::Outside : VertexCategory::Inside; + annotate_vertex(edge.vertex0(), vc); + annotate_vertex(edge.vertex1(), vc); + auto ec_new = (cc_new == CellCategory::Outside) ? EdgeCategory::PointsOutside : EdgeCategory::PointsInside; + annotate_edge(&edge, ec_new); + annotate_edge(edge.twin(), ec_new); + if (cc != cc_new) { + annotate_cell(&cell, cc_new); + cell_queue.emplace_back(&cell); + } + if (cc2 != cc_new) { + annotate_cell(&cell2, cc_new); + cell_queue.emplace_back(&cell2); } } - // Do a final seed fill over Voronoi cells and unmarked Voronoi edges. - while (! cell_queue.empty()) { - const VD::cell_type *cell = cell_queue.back(); - const CellState cs = cell_state[cell - front_cell]; - cell_queue.pop_back(); - const VD::edge_type *first_edge = cell->incident_edge(); - const VD::edge_type *edge = cell->incident_edge(); - EdgeState es = (cs == CellState::Active) ? EdgeState::Possible : EdgeState::Inactive; + } + } + + assert(debug::verify_vertices_on_contour(vd, lines)); + + // Do a final seed fill over Voronoi cells and unmarked Voronoi edges. + while (! cell_queue.empty()) { + const VD::cell_type *cell = cell_queue.back(); + const CellCategory cc = cell_category(cell); + assert(cc == CellCategory::Outside || cc == CellCategory::Inside); + cell_queue.pop_back(); + const VD::edge_type *first_edge = cell->incident_edge(); + const VD::edge_type *edge = first_edge; + const auto ec_new = (cc == CellCategory::Outside) ? EdgeCategory::PointsOutside : EdgeCategory::PointsInside; + do { + EdgeCategory ec = edge_category(edge); + if (ec == EdgeCategory::Unknown) { + assert(edge->cell()->contains_point() && edge->twin()->cell()->contains_point()); + annotate_edge(edge, ec_new); + annotate_edge(edge->twin(), ec_new); + const VD::cell_type *cell2 = edge->twin()->cell(); + CellCategory cc2 = cell_category(cell2); + assert(cc2 == CellCategory::Unknown || cc2 == cc); + if (cc2 != cc) { + annotate_cell(cell2, cc); + cell_queue.emplace_back(cell2); + } + } else { + assert(edge->vertex0() == nullptr || vertex_category(edge->vertex0()) != VertexCategory::Unknown); + assert(edge->vertex1() == nullptr || vertex_category(edge->vertex1()) != VertexCategory::Unknown); + assert(edge_category(edge->twin()) != EdgeCategory::Unknown); + assert(cell_category(edge->cell()) != CellCategory::Unknown); + assert(cell_category(edge->twin()->cell()) != CellCategory::Unknown); + } + edge = edge->next(); + } while (edge != first_edge); + } + + assert(debug::verify_vertices_on_contour(vd, lines)); + assert(debug::verify_inside_outside_annotations(vd)); +} + +std::vector signed_vertex_distances(const VD &vd, const Lines &lines) +{ + // vd shall be annotated. + assert(debug::verify_inside_outside_annotations(vd)); + + std::vector out(vd.vertices().size(), 0.); + const VD::vertex_type *first_vertex = &vd.vertices().front(); + for (const VD::vertex_type &vertex : vd.vertices()) { + const VertexCategory vc = vertex_category(vertex); + double dist; + if (vc == VertexCategory::OnContour) { + dist = 0.; + } else { + const VD::edge_type *first_edge = vertex.incident_edge(); + const VD::edge_type *edge = first_edge; + const VD::cell_type *point_cell = nullptr; do { - if (set_cell_state(edge->twin()->cell(), cs)) { - set_edge_state_initial(edge, es); - set_edge_state_initial(edge->twin(), es); - cell_queue.emplace_back(edge->twin()->cell()); + if (edge->cell()->contains_point()) { + point_cell = edge->cell(); + break; } - edge = edge->next(); + edge = edge->rot_next(); } while (edge != first_edge); + if (point_cell == 0) { + // Project vertex onto a contour segment. + const Line &line = lines[edge->cell()->source_index()]; + dist = Geometry::ray_point_distance( + line.a.cast(), (line.b - line.a).cast(), vertex_point(vertex)); + } else { + // Distance to a contour point. + dist = (contour_point(*point_cell, lines).cast() - vertex_point(vertex)).norm(); + } + if (vc == VertexCategory::Inside) + dist = - dist; } + out[&vertex - first_vertex] = dist; } + assert(debug::verify_signed_distances(vd, lines, out)); + + return out; +} + +std::vector edge_offset_contour_intersections( + const VD &vd, + const Lines &lines, + const std::vector &vertex_distances, + double offset_distance) +{ + // vd shall be annotated. + assert(debug::verify_inside_outside_annotations(vd)); + + bool outside = offset_distance > 0; if (! outside) offset_distance = - offset_distance; + assert(offset_distance > 0.); + + const VD::vertex_type *first_vertex = &vd.vertices().front(); + const VD::edge_type *first_edge = &vd.edges().front(); + static constexpr double nan = std::numeric_limits::quiet_NaN(); + // By default none edge has an intersection with the offset curve. + std::vector out(vd.num_edges(), Vec2d(nan, 0.)); + + for (const VD::edge_type &edge : vd.edges()) { + size_t edge_idx = &edge - first_edge; + if (edge_offset_has_intersection(out[edge_idx]) || out[edge_idx].y() != 0.) + // This edge was already classified. + continue; + + const VD::vertex_type *v0 = edge.vertex0(); + const VD::vertex_type *v1 = edge.vertex1(); + if (v0 == nullptr) { + assert(vertex_category(v1) == VertexCategory::OnContour || vertex_category(v1) == VertexCategory::Outside); + continue; + } + + double d0 = (v0 == nullptr) ? std::numeric_limits::max() : vertex_distances[v0 - first_vertex]; + double d1 = (v1 == nullptr) ? std::numeric_limits::max() : vertex_distances[v1 - first_vertex]; + assert(d0 * d1 >= 0.); + if (! outside) { + d0 = - d0; + d1 = - d1; + } +#ifndef NDEBUG + { + double err = std::abs(detail::dist_to_site(lines, *edge.cell(), vertex_point(v0)) - std::abs(d0)); + double err2 = std::abs(detail::dist_to_site(lines, *edge.twin()->cell(), vertex_point(v0)) - std::abs(d0)); + assert(err < SCALED_EPSILON); + assert(err2 < SCALED_EPSILON); + if (v1 != nullptr) { + double err3 = std::abs(detail::dist_to_site(lines, *edge.cell(), vertex_point(v1)) - std::abs(d1)); + double err4 = std::abs(detail::dist_to_site(lines, *edge.twin()->cell(), vertex_point(v1)) - std::abs(d1)); + assert(err3 < SCALED_EPSILON); + assert(err4 < SCALED_EPSILON); + } + } +#endif // NDEBUG + double dmin, dmax; + if (d0 < d1) + dmin = d0, dmax = d1; + else + dmax = d0, dmin = d1; + // Offset distance may be lower than dmin, but never higher than dmax. + // Don't intersect an edge at dmax + // 1) To avoid zero edge length, zero area offset contours. + // 2) To ensure that the offset contours that cross a Voronoi vertex are traced consistently + // at one side of the offset curve only. + if (offset_distance >= dmax) + continue; + + // Edge candidate, intersection points were not calculated yet. + assert(v0 != nullptr); + const VD::cell_type *cell = edge.cell(); + const VD::cell_type *cell2 = edge.twin()->cell(); + const Line &line0 = lines[cell->source_index()]; + const Line &line1 = lines[cell2->source_index()]; + size_t edge_idx2 = edge.twin() - first_edge; + if (v1 == nullptr) { + assert(edge.is_infinite()); + assert(edge.is_linear()); + // Unconstrained edges have always montonous distance. + assert(d0 != d1); + if (offset_distance > dmin) { + // There is certainly an intersection with the offset curve. + if (cell->contains_point() && cell2->contains_point()) { + assert(! edge.is_secondary()); + const Point &pt0 = contour_point(*cell, line0); + const Point &pt1 = contour_point(*cell2, line1); + // pt is inside the circle (pt0, offset_distance), (pt + dir) is certainly outside the same circle. + Vec2d dir = Vec2d(double(pt0.y() - pt1.y()), double(pt1.x() - pt0.x())) * (2. * offset_distance); + Vec2d pt(v0->x(), v0->y()); + double t = detail::first_circle_segment_intersection_parameter(Vec2d(pt0.x(), pt0.y()), offset_distance, pt, dir); + assert(t > 0.); + out[edge_idx] = pt + t * dir; + } else { + // Infinite edges could not be created by two segment sites. + assert(cell->contains_point() != cell2->contains_point()); + // Linear edge goes through the endpoint of a segment. + assert(edge.is_secondary()); + const Point &ipt = cell->contains_segment() ? contour_point(*cell2, line1) : contour_point(*cell, line0); + #ifndef NDEBUG + if (cell->contains_segment()) { + const Point &pt1 = contour_point(*cell2, line1); + assert(pt1 == line0.a || pt1 == line0.b); + } else { + const Point &pt0 = contour_point(*cell, line0); + assert(pt0 == line1.a || pt0 == line1.b); + } + assert((vertex_point(v0) - ipt.cast()).norm() < SCALED_EPSILON); + #endif /* NDEBUG */ + // Infinite edge starts at an input contour, therefore there is always an intersection with an offset curve. + const Line &line = cell->contains_segment() ? line0 : line1; + assert(line.a == ipt || line.b == ipt); + out[edge_idx] = ipt.cast() + offset_distance * Vec2d(line.b.y() - line.a.y(), line.a.x() - line.b.x()).normalized(); + } + } else if (offset_distance == dmin) + out[edge_idx] = vertex_point(v0); + // The other edge of an unconstrained edge starting with null vertex shall never be intersected. Mark it as visited. + out[edge_idx2].y() = 1.; + } else { + assert(edge.is_finite()); + bool done = false; + // Bisector of two line segments, distance along the bisector is linear. + bool bisector = cell->contains_segment() && cell2->contains_segment(); + assert(edge.is_finite()); + // or a secondary line, again the distance along the secondary line is linear and starts at the contour (zero distance). + if (bisector || edge.is_secondary()) { + assert(edge.is_linear()); +#ifndef NDEBUG + if (edge.is_secondary()) { + assert(cell->contains_point() != cell2->contains_point()); + // One of the vertices is on the input contour. + assert((vertex_category(edge.vertex0()) == VertexCategory::OnContour) != + (vertex_category(edge.vertex1()) == VertexCategory::OnContour)); + assert(dmin == 0.); + } +#endif // NDEBUG + if (! bisector || (dmin != dmax && offset_distance >= dmin)) { + double t = (offset_distance - dmin) / (dmax - dmin); + t = clamp(0., 1., t); + if (d1 < d0) { + out[edge_idx2] = Slic3r::lerp(vertex_point(v1), vertex_point(v0), t); + // mark visited + out[edge_idx].y() = 1.; + } else { + out[edge_idx] = Slic3r::lerp(vertex_point(v0), vertex_point(v1), t); + // mark visited + out[edge_idx2].y() = 1.; + } + done = true; + } + } else { + // Point - Segment or Point - Point edge, distance along this Voronoi edge may not be monotonous: + // The distance function along the Voronoi edge may either have one maximum at one vertex and one minimum at the other vertex, + // or it may have two maxima at the vertices and a minimum somewhere along the Voronoi edge, and this Voronoi edge + // may be intersected twice by an offset curve. + // + // Tracing an offset curve accross Voronoi regions with linear edges of montonously increasing or decrasing distance + // to a Voronoi region is stable in a sense, that if the distance of Voronoi vertices is calculated correctly, there will + // be maximum one intersection of an offset curve found at each Voronoi edge and tracing these intersections shall + // produce a set of closed curves. + // + // Having a non-monotonous distance function between the Voronoi edge end points may lead to splitting of offset curves + // at these Voronoi edges. If a Voronoi edge is classified as having no intersection at all while it has some, + // the extracted offset curve will contain self intersections at this Voronoi edge. + // + // If on the other side the two intersection points are found by a numerical error even though none should be found, then + // it may happen that it would not be possible to connect these two points into a closed loop, which is likely worse + // than the issue above. + // + // While it is likely not possible to avoid all the numerical issues, one shall strive for the highest numerical robustness. + assert(cell->contains_point() || cell2->contains_point()); + size_t num_intersections = 0; + bool point_vs_segment = cell->contains_point() != cell2->contains_point(); + const Point &pt0 = cell->contains_point() ? contour_point(*cell, line0) : contour_point(*cell2, line1); + // Project p0 to line segment . + Vec2d p0(v0->x(), v0->y()); + Vec2d p1(v1->x(), v1->y()); + Vec2d px(pt0.x(), pt0.y()); + const Point *pt1 = nullptr; + Vec2d dir; + if (point_vs_segment) { + const Line &line = cell->contains_segment() ? line0 : line1; + dir = (line.b - line.a).cast(); + } else { + pt1 = &contour_point(*cell2, line1); + // Perpendicular to the (pt1 - pt0) direction. + dir = Vec2d(double(pt0.y() - pt1->y()), double(pt1->x() - pt0.x())); + } + double s0 = (p0 - px).dot(dir); + double s1 = (p1 - px).dot(dir); + if (offset_distance >= dmin) { + // This Voronoi edge is intersected by the offset curve just once. + // There may be numerical issues if dmin is close to the minimum of the non-monotonous distance function. + num_intersections = 1; + } else { + // This Voronoi edge may not be intersected by the offset curve, or it may split the offset curve + // into two loops. First classify this edge robustly with regard to the Point-Segment bisector or Point-Point bisector. + double dmin_new; + bool found = false; + if (point_vs_segment) { + if (s0 * s1 <= 0.) { + // One end of the Voronoi edge is on one side of the Point-Segment bisector, the other end of the Voronoi + // edge is on the other side of the bisector, therefore with a high probability we should find a minimum + // of the distance to a nearest site somewhere inside this Voronoi edge (at the intersection of the bisector + // and the Voronoi edge. + const Line &line = cell->contains_segment() ? line0 : line1; + dmin_new = 0.5 * (Geometry::foot_pt(line.a.cast(), dir, px) - px).norm(); + found = true; + } + } else { + // Point-Point Voronoi sites. + if (s0 * s1 <= 0.) { + // This Voronoi edge intersects connection line of the two Point sites. + dmin_new = 0.5 * (pt1->cast() - px).norm(); + found = true; + } + } + if (found) { + assert(dmin_new < dmax + SCALED_EPSILON); + assert(dmin_new < dmin + SCALED_EPSILON); + if (dmin_new <= offset_distance) { + // 1) offset_distance > dmin_new -> two new distinct intersection points are found. + // 2) offset_distance == dmin_new -> one duplicate point is found. + // If 2) is ignored, then two tangentially touching offset curves are created. + // If not ignored, then the two offset curves merge at this double point. + // We should merge the contours while pushing the the two copies of the tangent point away a bit. + dmin = dmin_new; + num_intersections = (offset_distance > dmin) + 1; + } + } + } + if (num_intersections > 0) { + detail::Intersections intersections; + if (point_vs_segment) { + assert(cell->contains_point() || cell2->contains_point()); + intersections = detail::line_point_equal_distance_points(cell->contains_segment() ? line0 : line1, pt0, offset_distance); + } else { + intersections = detail::point_point_equal_distance_points(pt0, *pt1, offset_distance); + } + // The functions above perform complex calculations in doubles, therefore the results may not be quite accurate and + // the number of intersections found may not be in accord to the number of intersections expected from evaluating simpler expressions. + // Adjust the result to the number of intersection points expected. + if (num_intersections == 2) { + switch (intersections.count) { + case 0: + // No intersection found even though one or two were expected to be found. + // Not trying to find the intersection means that we may produce offset curves, that intersect at this Voronoi edge. + //FIXME We are fine with that for now, but we may try to create artificial split points in further revisions. + break; + case 1: + // Tangential point found. + //FIXME We are fine with that for now, but we may try to create artificial split points in further revisions. + break; + default: + { + // Two intersection points found. Sort them. + assert(intersections.count == 2); + double q0 = (intersections.pts[0] - px).dot(dir); + double q1 = (intersections.pts[1] - px).dot(dir); + // Both Voronoi edge end points and offset contour intersection points should be separated by the bisector. + assert(q0 * q1 <= 0.); + assert(s0 * s1 <= 0.); + // Sort the intersection points by dir. + if ((q0 < q1) != (s0 < s1)) + std::swap(intersections.pts[0], intersections.pts[1]); + } + } + } else { + assert(num_intersections == 1); + switch (intersections.count) { + case 0: + // No intersection found. This should not happen. + // Create one artificial intersection point by repeating the dmin point, which is supposed to be + // close to the minimum. + intersections.pts[0] = (dmin == d0) ? p0 : p1; + intersections.count = 1; + break; + case 1: + // One intersection found. This is a tangential point. Use it. + break; + default: + // Two intersections found. + // Now decide which of the point fall on this Voronoi edge. + assert(intersections.count == 2); + double q0 = (intersections.pts[0] - px).dot(dir); + double q1 = (intersections.pts[1] - px).dot(dir); + // Offset contour intersection points should be separated by the bisector. + assert(q0 * q1 <= 0); + double s = (dmax == d0) ? s0 : s1; + bool take_2nd = (s > 0.) ? q1 > q0 : q1 < q0; + if (take_2nd) + intersections.pts[0] = intersections.pts[1]; + -- intersections.count; + } + } + assert(intersections.count > 0); + if (intersections.count == 2) { + out[edge_idx] = intersections.pts[1]; + out[edge_idx2] = intersections.pts[0]; + done = true; + } else if (intersections.count == 1) { + if (d1 < d0) + std::swap(edge_idx, edge_idx2); + out[edge_idx] = intersections.pts[0]; + out[edge_idx2].y() = 1.; + done = true; + } + } + } + if (! done) + out[edge_idx].y() = out[edge_idx2].y() = 1.; + } + } + + assert(debug::verify_offset_intersection_points(vd, lines, offset_distance, out)); + + return out; +} +Polygons offset( + const Geometry::VoronoiDiagram &vd, + const Lines &lines, + const std::vector &signed_vertex_distances, + double offset_distance, + double discretization_error) +{ #ifdef VORONOI_DEBUG_OUT BoundingBox bbox; { @@ -442,10 +1342,10 @@ Polygons voronoi_offset( { Lines helper_lines; for (const VD::edge_type &edge : vd.edges()) - if (edge_state[&edge - front_edge] == EdgeState::Possible) { + if (edge_category(edge) == (offset_distance > 0 ? EdgeCategory::PointsOutside : EdgeCategory::PointsInside) && + edge.vertex0() != nullptr) { const VD::vertex_type *v0 = edge.vertex0(); const VD::vertex_type *v1 = edge.vertex1(); - assert(v0 != nullptr); Vec2d pt1(v0->x(), v0->y()); Vec2d pt2; if (v1 == nullptr) { @@ -490,292 +1390,39 @@ Polygons voronoi_offset( } #endif // VORONOI_DEBUG_OUT - std::vector edge_offset_point(vd.num_edges(), Vec2d()); - const double offset_distance2 = offset_distance * offset_distance; - for (const VD::edge_type &edge : vd.edges()) { - assert(edge_state[&edge - front_edge] != EdgeState::Unknown); - size_t edge_idx = &edge - front_edge; - if (edge_state[edge_idx] == EdgeState::Possible) { - // Edge candidate, intersection points were not calculated yet. - const VD::vertex_type *v0 = edge.vertex0(); - const VD::vertex_type *v1 = edge.vertex1(); - assert(v0 != nullptr); - const VD::cell_type *cell = edge.cell(); - const VD::cell_type *cell2 = edge.twin()->cell(); - const Line &line0 = lines[cell->source_index()]; - const Line &line1 = lines[cell2->source_index()]; - size_t edge_idx2 = edge.twin() - front_edge; - if (v1 == nullptr) { - assert(edge.is_infinite()); - assert(edge.is_linear()); - assert(edge_state[edge_idx2] == EdgeState::Inactive); - if (cell->contains_point() && cell2->contains_point()) { - assert(! edge.is_secondary()); - const Point &pt0 = (cell->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line0.a : line0.b; - const Point &pt1 = (cell2->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line1.a : line1.b; - double dmin2 = (Vec2d(v0->x(), v0->y()) - pt0.cast()).squaredNorm(); - assert(dmin2 >= SCALED_EPSILON * SCALED_EPSILON); - if (dmin2 <= offset_distance2) { - // There shall be an intersection of this unconstrained edge with the offset curve. - // Direction vector of this unconstrained Voronoi edge. - Vec2d dir(double(pt0.y() - pt1.y()), double(pt1.x() - pt0.x())); - Vec2d pt(v0->x(), v0->y()); - double t = detail::first_circle_segment_intersection_parameter(Vec2d(pt0.x(), pt0.y()), offset_distance, pt, dir); - edge_offset_point[edge_idx] = pt + t * dir; - set_edge_state_final(edge_idx, EdgeState::Active); - } else - set_edge_state_final(edge_idx, EdgeState::Inactive); - } else { - // Infinite edges could not be created by two segment sites. - assert(cell->contains_point() != cell2->contains_point()); - // Linear edge goes through the endpoint of a segment. - assert(edge.is_secondary()); - const Point &ipt = cell->contains_segment() ? - ((cell2->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line1.a : line1.b) : - ((cell->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line0.a : line0.b); - #ifndef NDEBUG - if (cell->contains_segment()) { - const Point &pt1 = (cell2->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line1.a : line1.b; - assert((pt1.x() == line0.a.x() && pt1.y() == line0.a.y()) || - (pt1.x() == line0.b.x() && pt1.y() == line0.b.y())); - } else { - const Point &pt0 = (cell->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line0.a : line0.b; - assert((pt0.x() == line1.a.x() && pt0.y() == line1.a.y()) || - (pt0.x() == line1.b.x() && pt0.y() == line1.b.y())); - } - assert((Vec2d(v0->x(), v0->y()) - ipt.cast()).norm() < SCALED_EPSILON); - #endif /* NDEBUG */ - // Infinite edge starts at an input contour, therefore there is always an intersection with an offset curve. - const Line &line = cell->contains_segment() ? line0 : line1; - assert(line.a == ipt || line.b == ipt); - edge_offset_point[edge_idx] = ipt.cast() + offset_distance * Vec2d(line.b.y() - line.a.y(), line.a.x() - line.b.x()).normalized(); - set_edge_state_final(edge_idx, EdgeState::Active); - } - // The other edge of an unconstrained edge starting with null vertex shall never be intersected. - set_edge_state_final(edge_idx2, EdgeState::Inactive); - } else if (edge.is_secondary()) { - assert(edge.is_linear()); - assert(cell->contains_point() != cell2->contains_point()); - const Line &line0 = lines[edge.cell()->source_index()]; - const Line &line1 = lines[edge.twin()->cell()->source_index()]; - const Point &pt = cell->contains_point() ? - ((cell->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line0.a : line0.b) : - ((cell2->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line1.a : line1.b); - const Line &line = cell->contains_segment() ? line0 : line1; - assert(pt == line.a || pt == line.b); - assert((pt.cast() - Vec2d(v0->x(), v0->y())).norm() < SCALED_EPSILON); - Vec2d dir(v1->x() - v0->x(), v1->y() - v0->y()); - double l2 = dir.squaredNorm(); - if (offset_distance2 <= l2) { - edge_offset_point[edge_idx] = pt.cast() + (offset_distance / sqrt(l2)) * dir; - set_edge_state_final(edge_idx, EdgeState::Active); - } else { - set_edge_state_final(edge_idx, EdgeState::Inactive); - } - set_edge_state_final(edge_idx2, EdgeState::Inactive); - } else { - // Finite edge has valid points at both sides. - bool done = false; - if (cell->contains_segment() && cell2->contains_segment()) { - // This edge is a bisector of two line segments. Project v0, v1 onto one of the line segments. - Vec2d pt(line0.a.cast()); - Vec2d dir(line0.b.cast() - pt); - Vec2d vec0 = Vec2d(v0->x(), v0->y()) - pt; - Vec2d vec1 = Vec2d(v1->x(), v1->y()) - pt; - double l2 = dir.squaredNorm(); - assert(l2 > 0.); - double dmin = (dir * (vec0.dot(dir) / l2) - vec0).squaredNorm(); - double dmax = (dir * (vec1.dot(dir) / l2) - vec1).squaredNorm(); - bool flip = dmin > dmax; - if (flip) - std::swap(dmin, dmax); - if (offset_distance2 >= dmin && offset_distance2 <= dmax) { - // Intersect. Maximum one intersection will be found. - // This edge is a bisector of two line segments. Distance to the input polygon increases/decreases monotonically. - dmin = sqrt(dmin); - dmax = sqrt(dmax); - assert(offset_distance > dmin - EPSILON && offset_distance < dmax + EPSILON); - double ddif = dmax - dmin; - if (ddif == 0.) { - // line, line2 are exactly parallel. This is a singular case, the offset curve should miss it. - } else { - if (flip) { - std::swap(edge_idx, edge_idx2); - std::swap(v0, v1); - } - double t = clamp(0., 1., (offset_distance - dmin) / ddif); - edge_offset_point[edge_idx] = Vec2d(lerp(v0->x(), v1->x(), t), lerp(v0->y(), v1->y(), t)); - set_edge_state_final(edge_idx, EdgeState::Active); - set_edge_state_final(edge_idx2, EdgeState::Inactive); - done = true; - } - } - } else { - assert(cell->contains_point() || cell2->contains_point()); - bool point_vs_segment = cell->contains_point() != cell2->contains_point(); - const Point &pt0 = cell->contains_point() ? - ((cell->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line0.a : line0.b) : - ((cell2->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line1.a : line1.b); - // Project p0 to line segment . - Vec2d p0(v0->x(), v0->y()); - Vec2d p1(v1->x(), v1->y()); - Vec2d px(pt0.x(), pt0.y()); - double d0 = (p0 - px).squaredNorm(); - double d1 = (p1 - px).squaredNorm(); - double dmin = std::min(d0, d1); - double dmax = std::max(d0, d1); - bool has_intersection = false; - bool possibly_two_points = false; - if (offset_distance2 <= dmax) { - if (offset_distance2 >= dmin) { - has_intersection = true; - } else { - double dmin_new = dmin; - if (point_vs_segment) { - // Project on the source segment. - const Line &line = cell->contains_segment() ? line0 : line1; - const Vec2d pt_line = line.a.cast(); - const Vec2d v_line = (line.b - line.a).cast(); - double t0 = (p0 - pt_line).dot(v_line); - double t1 = (p1 - pt_line).dot(v_line); - double tx = (px - pt_line).dot(v_line); - if ((tx >= t0 && tx <= t1) || (tx >= t1 && tx <= t0)) { - // Projection of the Point site falls between the projections of the Voronoi edge end points - // onto the Line site. - Vec2d ft = pt_line + (tx / v_line.squaredNorm()) * v_line; - dmin_new = (ft - px).squaredNorm() * 0.25; - } - } else { - // Point-Point Voronoi sites. Project point site onto the current Voronoi edge. - Vec2d v = p1 - p0; - auto l2 = v.squaredNorm(); - assert(l2 > 0); - auto t = v.dot(px - p0); - if (t >= 0. && t <= l2) { - // Projection falls onto the Voronoi edge. Calculate foot point and distance. - Vec2d ft = p0 + (t / l2) * v; - dmin_new = (ft - px).squaredNorm(); - } - } - assert(dmin_new < dmax + SCALED_EPSILON); - assert(dmin_new < dmin + SCALED_EPSILON); - if (dmin_new < dmin) { - dmin = dmin_new; - has_intersection = possibly_two_points = offset_distance2 >= dmin; - } - } - } - if (has_intersection) { - detail::Intersections intersections; - if (point_vs_segment) { - assert(cell->contains_point() || cell2->contains_point()); - intersections = detail::line_point_equal_distance_points(cell->contains_segment() ? line0 : line1, pt0, offset_distance); - } else { - const Point &pt1 = (cell2->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line1.a : line1.b; - intersections = detail::point_point_equal_distance_points(pt0, pt1, offset_distance); - } - // If the span of distances of start / end point / foot point to the point site indicate an intersection, - // we should find one. - assert(intersections.count > 0); - if (intersections.count == 2) { - // Now decide which points fall on this Voronoi edge. - // Tangential points (single intersection) are ignored. - if (possibly_two_points) { - Vec2d v = p1 - p0; - double l2 = v.squaredNorm(); - double t0 = v.dot(intersections.pts[0] - p0); - double t1 = v.dot(intersections.pts[1] - p0); - if (t0 > t1) { - std::swap(t0, t1); - std::swap(intersections.pts[0], intersections.pts[1]); - } - // Remove points outside of the line range. - if (t0 < 0. || t0 > l2) { - if (t1 < 0. || t1 > l2) - intersections.count = 0; - else { - -- intersections.count; - t0 = t1; - intersections.pts[0] = intersections.pts[1]; - } - } else if (t1 < 0. || t1 > l2) - -- intersections.count; - } else { - // Take the point furthest from the end points of the Voronoi edge or a Voronoi parabolic arc. - double d0 = std::max((intersections.pts[0] - p0).squaredNorm(), (intersections.pts[0] - p1).squaredNorm()); - double d1 = std::max((intersections.pts[1] - p0).squaredNorm(), (intersections.pts[1] - p1).squaredNorm()); - if (d0 > d1) - intersections.pts[0] = intersections.pts[1]; - -- intersections.count; - } - assert(intersections.count > 0); - if (intersections.count == 2) { - set_edge_state_final(edge_idx, EdgeState::Active); - set_edge_state_final(edge_idx2, EdgeState::Active); - edge_offset_point[edge_idx] = intersections.pts[1]; - edge_offset_point[edge_idx2] = intersections.pts[0]; - done = true; - } else if (intersections.count == 1) { - if (d1 < d0) - std::swap(edge_idx, edge_idx2); - set_edge_state_final(edge_idx, EdgeState::Active); - set_edge_state_final(edge_idx2, EdgeState::Inactive); - edge_offset_point[edge_idx] = intersections.pts[0]; - done = true; - } - } - } - } - if (! done) { - set_edge_state_final(edge_idx, EdgeState::Inactive); - set_edge_state_final(edge_idx2, EdgeState::Inactive); - } - } - } - } - -#ifndef NDEBUG - for (const VD::edge_type &edge : vd.edges()) { - assert(edge_state[&edge - front_edge] == EdgeState::Inactive || edge_state[&edge - front_edge] == EdgeState::Active); - // None of a new edge candidate may start with null vertex. - assert(edge_state[&edge - front_edge] == EdgeState::Inactive || edge.vertex0() != nullptr); - assert(edge_state[edge.twin() - front_edge] == EdgeState::Inactive || edge.twin()->vertex0() != nullptr); - } -#endif // NDEBUG + std::vector edge_points = edge_offset_contour_intersections(vd, lines, signed_vertex_distances, offset_distance); + const VD::edge_type *front_edge = &vd.edges().front(); #ifdef VORONOI_DEBUG_OUT + Lines helper_lines; { - Lines helper_lines; for (const VD::edge_type &edge : vd.edges()) - if (edge_state[&edge - front_edge] == EdgeState::Active) - helper_lines.emplace_back(Line(Point(edge.vertex0()->x(), edge.vertex0()->y()), Point(edge_offset_point[&edge - front_edge].cast()))); + if (edge_offset_has_intersection(edge_points[&edge - front_edge])) + helper_lines.emplace_back(Line(Point(edge.vertex0()->x(), edge.vertex0()->y()), Point(edge_points[&edge - front_edge].cast()))); dump_voronoi_to_svg(debug_out_path("voronoi-offset-candidates2-%d.svg", irun).c_str(), vd, Points(), lines, Polygons(), helper_lines); } #endif // VORONOI_DEBUG_OUT - auto next_offset_edge = [&edge_state, front_edge](const VD::edge_type *start_edge) -> const VD::edge_type* { + auto next_offset_edge = [&edge_points, front_edge](const VD::edge_type *start_edge) -> const VD::edge_type* { for (const VD::edge_type *edge = start_edge->next(); edge != start_edge; edge = edge->next()) - if (edge_state[edge->twin() - front_edge] == EdgeState::Active) + if (edge_offset_has_intersection(edge_points[edge->twin() - front_edge])) return edge->twin(); // assert(false); return nullptr; }; -#ifndef NDEBUG - auto dist_to_site = [&lines](const VD::cell_type &cell, const Vec2d &point) { - const Line &line = lines[cell.source_index()]; - return cell.contains_point() ? - (((cell.source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line.a : line.b).cast() - point).norm() : - (Geometry::foot_pt(line.a.cast(), (line.b - line.a).cast(), point) - point).norm(); - }; -#endif /* NDEBUG */ + const bool inside_offset = offset_distance < 0.; + if (inside_offset) + offset_distance = - offset_distance; - // Track the offset curves. - Polygons out; + // Track the offset curves. + Polygons out; double angle_step = 2. * acos((offset_distance - discretization_error) / offset_distance); double cos_threshold = cos(angle_step); - for (size_t seed_edge_idx = 0; seed_edge_idx < vd.num_edges(); ++ seed_edge_idx) - if (edge_state[seed_edge_idx] == EdgeState::Active) { + static constexpr double nan = std::numeric_limits::quiet_NaN(); + for (size_t seed_edge_idx = 0; seed_edge_idx < vd.num_edges(); ++ seed_edge_idx) { + Vec2d last_pt = edge_points[seed_edge_idx]; + if (edge_offset_has_intersection(last_pt)) { const VD::edge_type *start_edge = &vd.edges()[seed_edge_idx]; const VD::edge_type *edge = start_edge; Polygon poly; @@ -784,21 +1431,23 @@ Polygons voronoi_offset( const VD::edge_type *next_edge = next_offset_edge(edge); #ifdef VORONOI_DEBUG_OUT if (next_edge == nullptr) { - Lines helper_lines; - dump_voronoi_to_svg(debug_out_path("voronoi-offset-open-loop-%d.svg", irun).c_str(), vd, Points(), lines, Polygons(), to_lines(poly)); + Lines hl = helper_lines; + append(hl, to_lines(Polyline(poly.points))); + dump_voronoi_to_svg(debug_out_path("voronoi-offset-open-loop-%d.svg", irun).c_str(), vd, Points(), lines, Polygons(), hl); } #endif // VORONOI_DEBUG_OUT assert(next_edge); //std::cout << "offset-output: "; print_edge(edge); std::cout << " to "; print_edge(next_edge); std::cout << "\n"; // Interpolate a circular segment or insert a linear segment between edge and next_edge. const VD::cell_type *cell = edge->cell(); - edge_state[next_edge - front_edge] = EdgeState::Inactive; - Vec2d p1 = edge_offset_point[edge - front_edge]; - Vec2d p2 = edge_offset_point[next_edge - front_edge]; + // Mark the edge / offset curve intersection point as consumed. + Vec2d p1 = last_pt; + Vec2d p2 = edge_points[next_edge - front_edge]; + edge_points[next_edge - front_edge].x() = nan; #ifndef NDEBUG { - double err = dist_to_site(*cell, p1) - offset_distance; - double err2 = dist_to_site(*cell, p2) - offset_distance; + double err = detail::dist_to_site(lines, *cell, p1) - offset_distance; + double err2 = detail::dist_to_site(lines, *cell, p2) - offset_distance; #ifdef VORONOI_DEBUG_OUT if (std::max(err, err2) >= SCALED_EPSILON) { Lines helper_lines; @@ -845,11 +1494,142 @@ Polygons voronoi_offset( poly.points.emplace_back(pt_last); } edge = next_edge; + last_pt = p2; } while (edge != start_edge); - out.emplace_back(std::move(poly)); + + while (! poly.empty() && poly.points.front() == poly.points.back()) + poly.points.pop_back(); + if (poly.size() >= 3) + out.emplace_back(std::move(poly)); } + } return out; } +Polygons offset( + const VD &vd, + const Lines &lines, + double offset_distance, + double discretization_error) +{ + annotate_inside_outside(const_cast(vd), lines); + std::vector dist = signed_vertex_distances(vd, lines); + return offset(vd, lines, dist, offset_distance, discretization_error); +} + +// Produce a list of start positions of a skeleton segment at a halfedge. +// If the whole Voronoi edge is part of the skeleton, then zero start positions are assigned +// to both ends of the edge. Position "1" shall never be assigned to a halfedge. +// +// Skeleton edges must be inside a closed polygon, therefore these edges are finite. +// A Voronoi Edge-Edge bisector is either completely part of a skeleton, or not at all. +// An infinite Voronoi Edge-Point (parabola) or Point-Point (line) bisector is split into +// a center part close to the Voronoi sites (not skeleton) and the ends (skeleton), +// though either part could be clipped by the Voronoi segment. +// +// Further filtering of the skeleton may be necessary. +std::vector skeleton_edges_rough( + const VD &vd, + const Lines &lines, + // Angle threshold at a sharp convex corner, which is marked for a gap fill. + const double threshold_alpha) +{ + // vd shall be annotated. + assert(debug::verify_inside_outside_annotations(vd)); + + const VD::edge_type *first_edge = &vd.edges().front(); + static constexpr double nan = std::numeric_limits::quiet_NaN(); + // By default no edge is annotated as being part of the skeleton. + std::vector out(vd.num_edges(), Vec2d(nan, nan)); + // Threshold at a sharp corner, derived from a dot product of the sharp corner edges. + const double threshold_cos_alpha = cos(threshold_alpha); + // For sharp corners, dr/dl = sin(alpha/2). Substituting the dr/dl threshold with tan(alpha/2) threshold + // in Voronoi point - point and Voronoi point - line site functions. + const double threshold_tan_alpha_half = tan(0.5 * threshold_alpha); + + for (const VD::edge_type &edge : vd.edges()) { + size_t edge_idx = &edge - first_edge; + if ( + // Ignore secondary and unbounded edges, they shall never be part of the skeleton. + edge.is_secondary() || edge.is_infinite() || + // Skip the twin edge of an edge, that has already been processed. + &edge > edge.twin() || + // Ignore outer edges. + (edge_category(edge) != EdgeCategory::PointsInside && edge_category(edge.twin()) != EdgeCategory::PointsInside)) + continue; + const VD::vertex_type *v0 = edge.vertex0(); + const VD::vertex_type *v1 = edge.vertex1(); + const VD::cell_type *cell = edge.cell(); + const VD::cell_type *cell2 = edge.twin()->cell(); + const Line &line0 = lines[cell->source_index()]; + const Line &line1 = lines[cell2->source_index()]; + size_t edge_idx2 = edge.twin() - first_edge; + if (cell->contains_segment() && cell2->contains_segment()) { + // Bisector of two line segments, distance along the bisector is linear, + // dr/dl is constant. + // using trigonometric identity sin^2(a) = (1-cos(2a))/2 + Vec2d lv0 = (line0.b - line0.a).cast(); + Vec2d lv1 = (line1.b - line1.a).cast(); + double d = lv0.dot(lv1); + if (d < 0.) { + double cos_alpha = - d / (lv0.norm() * lv1.norm()); + if (cos_alpha > threshold_cos_alpha) { + // The whole bisector is a skeleton segment. + out[edge_idx] = vertex_point(v0); + out[edge_idx2] = vertex_point(v1); + } + } + } else { + // An infinite Voronoi Edge-Point (parabola) or Point-Point (line) bisector, clipped to a finite Voronoi segment. + // The infinite bisector has a distance (skeleton radius) minimum, which is also a minimum + // of the skeleton function dr / dt. + assert(cell->contains_point() || cell2->contains_point()); + if (cell->contains_point() != cell2->contains_point()) { + // Point - Segment + const Point &pt0 = cell->contains_point() ? contour_point(*cell, line0) : contour_point(*cell2, line1); + const Line &line = cell->contains_segment() ? line0 : line1; + std::tie(out[edge_idx], out[edge_idx2]) = detail::point_segment_dr_dl_thresholds( + pt0, line, vertex_point(v0), vertex_point(v1), threshold_tan_alpha_half); + } else { + // Point - Point + const Point &pt0 = contour_point(*cell, line0); + const Point &pt1 = contour_point(*cell2, line1); + std::tie(out[edge_idx], out[edge_idx2]) = detail::point_point_dr_dl_thresholds( + pt0, pt1, vertex_point(v0), vertex_point(v1), threshold_tan_alpha_half); + } + } + } + +#ifdef VORONOI_DEBUG_OUT + { + static int irun = 0; + ++ irun; + Lines helper_lines; + for (const VD::edge_type &edge : vd.edges()) + if (&edge < edge.twin() && edge.is_finite()) { + const Vec2d &skeleton_pt = out[&edge - first_edge]; + const Vec2d &skeleton_pt2 = out[edge.twin() - first_edge]; + bool has_skeleton_pt = ! std::isnan(skeleton_pt.x()); + bool has_skeleton_pt2 = ! std::isnan(skeleton_pt2.x()); + const Vec2d &vertex_pt = vertex_point(edge.vertex0()); + const Vec2d &vertex_pt2 = vertex_point(edge.vertex1()); + if (has_skeleton_pt && has_skeleton_pt2) { + // Complete edge is part of the skeleton. + helper_lines.emplace_back(Line(Point(vertex_pt.x(), vertex_pt.y()), Point(vertex_pt2.x(), vertex_pt2.y()))); + } else { + if (has_skeleton_pt) + helper_lines.emplace_back(Line(Point(vertex_pt2.x(), vertex_pt2.y()), Point(skeleton_pt.x(), skeleton_pt.y()))); + if (has_skeleton_pt2) + helper_lines.emplace_back(Line(Point(vertex_pt.x(), vertex_pt.y()), Point(skeleton_pt2.x(), skeleton_pt2.y()))); + } + } + dump_voronoi_to_svg(debug_out_path("voronoi-skeleton-edges-%d.svg", irun).c_str(), vd, Points(), lines, Polygons(), helper_lines); + } +#endif // VORONOI_DEBUG_OUT + + return out; +} + +} // namespace Voronoi } // namespace Slic3r diff --git a/src/libslic3r/VoronoiOffset.hpp b/src/libslic3r/VoronoiOffset.hpp index a21b44f93e5..17b590ed71a 100644 --- a/src/libslic3r/VoronoiOffset.hpp +++ b/src/libslic3r/VoronoiOffset.hpp @@ -9,16 +9,136 @@ namespace Slic3r { +namespace Voronoi { + +using VD = Slic3r::Geometry::VoronoiDiagram; + +inline const Point& contour_point(const VD::cell_type &cell, const Line &line) + { return ((cell.source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line.a : line.b); } +inline Point& contour_point(const VD::cell_type &cell, Line &line) + { return ((cell.source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line.a : line.b); } + +inline const Point& contour_point(const VD::cell_type &cell, const Lines &lines) + { return contour_point(cell, lines[cell.source_index()]); } +inline Point& contour_point(const VD::cell_type &cell, Lines &lines) + { return contour_point(cell, lines[cell.source_index()]); } + +inline Vec2d vertex_point(const VD::vertex_type &v) { return Vec2d(v.x(), v.y()); } +inline Vec2d vertex_point(const VD::vertex_type *v) { return Vec2d(v->x(), v->y()); } + +// "Color" stored inside the boost::polygon Voronoi vertex. +enum class VertexCategory : unsigned char +{ + // Voronoi vertex is on the input contour. + // VD::vertex_type stores coordinates in double, though the coordinates shall match exactly + // with the coordinates of the input contour when converted to int32_t. + OnContour, + // Vertex is inside the CCW input contour, holes are respected. + Inside, + // Vertex is outside the CCW input contour, holes are respected. + Outside, + // Not known yet. + Unknown, +}; + +// "Color" stored inside the boost::polygon Voronoi edge. +// The Voronoi edge as represented by boost::polygon Voronoi module is really a half-edge, +// the half-edges are classified based on the target vertex (VD::vertex_type::vertex1()) +enum class EdgeCategory : unsigned char +{ + // This half-edge points onto the contour, this VD::edge_type::vertex1().color() is OnContour. + PointsToContour, + // This half-edge points inside, this VD::edge_type::vertex1().color() is Inside. + PointsInside, + // This half-edge points outside, this VD::edge_type::vertex1().color() is Outside. + PointsOutside, + // Not known yet. + Unknown +}; + +// "Color" stored inside the boost::polygon Voronoi cell. +enum class CellCategory : unsigned char +{ + // This Voronoi cell is split by an input segment to two halves, one is inside, the other is outside. + Boundary, + // This Voronoi cell is completely inside. + Inside, + // This Voronoi cell is completely outside. + Outside, + // Not known yet. + Unknown +}; + +inline VertexCategory vertex_category(const VD::vertex_type &v) + { return static_cast(v.color()); } +inline VertexCategory vertex_category(const VD::vertex_type *v) + { return static_cast(v->color()); } +inline void set_vertex_category(VD::vertex_type &v, VertexCategory c) + { v.color(static_cast(c)); } +inline void set_vertex_category(VD::vertex_type *v, VertexCategory c) + { v->color(static_cast(c)); } + +inline EdgeCategory edge_category(const VD::edge_type &e) + { return static_cast(e.color()); } +inline EdgeCategory edge_category(const VD::edge_type *e) + { return static_cast(e->color()); } +inline void set_edge_category(VD::edge_type &e, EdgeCategory c) + { e.color(static_cast(c)); } +inline void set_edge_category(VD::edge_type *e, EdgeCategory c) + { e->color(static_cast(c)); } + +inline CellCategory cell_category(const VD::cell_type &v) + { return static_cast(v.color()); } +inline CellCategory cell_category(const VD::cell_type *v) + { return static_cast(v->color()); } +inline void set_cell_category(const VD::cell_type &v, CellCategory c) + { v.color(static_cast(c)); } +inline void set_cell_category(const VD::cell_type *v, CellCategory c) + { v->color(static_cast(c)); } + +// Mark the "Color" of VD vertices, edges and cells as Unknown. +void reset_inside_outside_annotations(VD &vd); + +// Assign "Color" to VD vertices, edges and cells signifying whether the entity is inside or outside +// the input polygons defined by Lines. +void annotate_inside_outside(VD &vd, const Lines &lines); + +// Returns a signed distance to Voronoi vertices from the input polygons. +// (negative distances inside, positive distances outside). +std::vector signed_vertex_distances(const VD &vd, const Lines &lines); + +static inline bool edge_offset_no_intersection(const Vec2d &intersection_point) + { return std::isnan(intersection_point.x()); } +static inline bool edge_offset_has_intersection(const Vec2d &intersection_point) + { return ! edge_offset_no_intersection(intersection_point); } +std::vector edge_offset_contour_intersections( + const VD &vd, const Lines &lines, const std::vector &distances, + double offset_distance); + +std::vector skeleton_edges_rough( + const VD &vd, + const Lines &lines, + const double threshold_alpha); + +Polygons offset( + const Geometry::VoronoiDiagram &vd, + const Lines &lines, + const std::vector &signed_vertex_distances, + double offset_distance, + double discretization_error); + // Offset a polygon or a set of polygons possibly with holes by traversing a Voronoi diagram. // The input polygons are stored in lines and lines are referenced by vd. // Outer curve will be extracted for a positive offset_distance, // inner curve will be extracted for a negative offset_distance. // Circular arches will be discretized to achieve discretization_error. -Polygons voronoi_offset( - const Geometry::VoronoiDiagram &vd, - const Lines &lines, - double offset_distance, - double discretization_error); +Polygons offset( + const VD &vd, + const Lines &lines, + double offset_distance, + double discretization_error); + +} // namespace Voronoi } // namespace Slic3r diff --git a/src/libslic3r/VoronoiVisualUtils.hpp b/src/libslic3r/VoronoiVisualUtils.hpp index fa6a3424181..177f27293a2 100644 --- a/src/libslic3r/VoronoiVisualUtils.hpp +++ b/src/libslic3r/VoronoiVisualUtils.hpp @@ -5,6 +5,8 @@ #include #include +#include "VoronoiOffset.hpp" + namespace boost { namespace polygon { // The following code for the visualization of the boost Voronoi diagram is based on: @@ -70,6 +72,7 @@ class voronoi_visual_utils { get_point_projection((*discretization)[0], segment); CT projection_end = sqr_segment_length * get_point_projection((*discretization)[1], segment); + assert(projection_start != projection_end); // Compute parabola parameters in the transformed space. // Parabola has next representation: @@ -99,13 +102,16 @@ class voronoi_visual_utils { // furthest from the current line segment. CT mid_x = (new_y - cur_y) / (new_x - cur_x) * rot_y + rot_x; CT mid_y = parabola_y(mid_x, rot_x, rot_y); + assert(mid_x != cur_x || mid_y != cur_y); + assert(mid_x != new_x || mid_y != new_y); // Compute maximum distance between the given parabolic arc // and line segment that discretize it. CT dist = (new_y - cur_y) * (mid_x - cur_x) - (new_x - cur_x) * (mid_y - cur_y); - dist = dist * dist / ((new_y - cur_y) * (new_y - cur_y) + - (new_x - cur_x) * (new_x - cur_x)); + CT div = (new_y - cur_y) * (new_y - cur_y) + (new_x - cur_x) * (new_x - cur_x); + assert(div != 0); + dist = dist * dist / div; if (dist <= max_dist_transformed) { // Distance between parabola and line segment is less than max_dist. point_stack.pop(); @@ -236,50 +242,39 @@ namespace Voronoi { namespace Internal { inline void clip_infinite_edge(const Points &points, const std::vector &segments, const edge_type& edge, coordinate_type bbox_max_size, std::vector* clipped_edge) { + assert(edge.is_infinite()); + assert((edge.vertex0() == nullptr) != (edge.vertex1() == nullptr)); + const cell_type& cell1 = *edge.cell(); const cell_type& cell2 = *edge.twin()->cell(); - point_type origin, direction; // Infinite edges could not be created by two segment sites. + assert(cell1.contains_point() || cell2.contains_point()); if (! cell1.contains_point() && ! cell2.contains_point()) { printf("Error! clip_infinite_edge - infinite edge separates two segment cells\n"); return; } + point_type direction; if (cell1.contains_point() && cell2.contains_point()) { + assert(! edge.is_secondary()); point_type p1 = retrieve_point(points, segments, cell1); point_type p2 = retrieve_point(points, segments, cell2); - origin.x((p1.x() + p2.x()) * 0.5); - origin.y((p1.y() + p2.y()) * 0.5); + if (edge.vertex0() == nullptr) + std::swap(p1, p2); direction.x(p1.y() - p2.y()); direction.y(p2.x() - p1.x()); } else { - origin = cell1.contains_segment() ? retrieve_point(points, segments, cell2) : retrieve_point(points, segments, cell1); + assert(edge.is_secondary()); segment_type segment = cell1.contains_segment() ? segments[cell1.source_index()] : segments[cell2.source_index()]; - coordinate_type dx = high(segment).x() - low(segment).x(); - coordinate_type dy = high(segment).y() - low(segment).y(); - if ((low(segment) == origin) ^ cell1.contains_point()) { - direction.x(dy); - direction.y(-dx); - } else { - direction.x(-dy); - direction.y(dx); - } + direction.x(high(segment).y() - low(segment).y()); + direction.y(low(segment).x() - high(segment).x()); } coordinate_type koef = bbox_max_size / (std::max)(fabs(direction.x()), fabs(direction.y())); - if (edge.vertex0() == NULL) { - clipped_edge->push_back(point_type( - origin.x() - direction.x() * koef, - origin.y() - direction.y() * koef)); - } else { - clipped_edge->push_back( - point_type(edge.vertex0()->x(), edge.vertex0()->y())); - } - if (edge.vertex1() == NULL) { - clipped_edge->push_back(point_type( - origin.x() + direction.x() * koef, - origin.y() + direction.y() * koef)); + if (edge.vertex0() == nullptr) { + clipped_edge->push_back(point_type(edge.vertex1()->x() + direction.x() * koef, edge.vertex1()->y() + direction.y() * koef)); + clipped_edge->push_back(point_type(edge.vertex1()->x(), edge.vertex1()->y())); } else { - clipped_edge->push_back( - point_type(edge.vertex1()->x(), edge.vertex1()->y())); + clipped_edge->push_back(point_type(edge.vertex0()->x(), edge.vertex0()->y())); + clipped_edge->push_back(point_type(edge.vertex0()->x() + direction.x() * koef, edge.vertex0()->y() + direction.y() * koef)); } } @@ -307,11 +302,16 @@ static inline void dump_voronoi_to_svg( const Lines &helper_lines = Lines(), double scale = 0) { + const bool internalEdgesOnly = false; + BoundingBox bbox; bbox.merge(get_extents(points)); bbox.merge(get_extents(lines)); bbox.merge(get_extents(offset_curves)); bbox.merge(get_extents(helper_lines)); + for (boost::polygon::voronoi_diagram::const_vertex_iterator it = vd.vertices().begin(); it != vd.vertices().end(); ++it) + if (! internalEdgesOnly || it->color() != Voronoi::Internal::EXTERNAL_COLOR) + bbox.merge(Point(it->x(), it->y())); bbox.min -= (0.01 * bbox.size().cast()).cast(); bbox.max += (0.01 * bbox.size().cast()).cast(); @@ -321,15 +321,17 @@ static inline void dump_voronoi_to_svg( 0.01 * std::min(bbox.size().x(), bbox.size().y()); else - scale /= SCALING_FACTOR; + scale *= SCALING_FACTOR; const std::string inputSegmentPointColor = "lightseagreen"; - const coord_t inputSegmentPointRadius = coord_t(0.09 * scale); + const coord_t inputSegmentPointRadius = std::max(1, coord_t(0.09 * scale)); const std::string inputSegmentColor = "lightseagreen"; const coord_t inputSegmentLineWidth = coord_t(0.03 * scale); const std::string voronoiPointColor = "black"; - const coord_t voronoiPointRadius = coord_t(0.06 * scale); + const std::string voronoiPointColorOutside = "red"; + const std::string voronoiPointColorInside = "blue"; + const coord_t voronoiPointRadius = std::max(1, coord_t(0.06 * scale)); const std::string voronoiLineColorPrimary = "black"; const std::string voronoiLineColorSecondary = "green"; const std::string voronoiArcColor = "red"; @@ -341,7 +343,6 @@ static inline void dump_voronoi_to_svg( const std::string helperLineColor = "orange"; const coord_t helperLineWidth = coord_t(0.04 * scale); - const bool internalEdgesOnly = false; const bool primaryEdgesOnly = false; ::Slic3r::SVG svg(path, bbox); @@ -360,9 +361,11 @@ static inline void dump_voronoi_to_svg( Voronoi::Internal::point_type(double(it->b(0)), double(it->b(1))))); // Color exterior edges. - for (boost::polygon::voronoi_diagram::const_edge_iterator it = vd.edges().begin(); it != vd.edges().end(); ++it) - if (!it->is_finite()) - Voronoi::Internal::color_exterior(&(*it)); + if (internalEdgesOnly) { + for (boost::polygon::voronoi_diagram::const_edge_iterator it = vd.edges().begin(); it != vd.edges().end(); ++it) + if (!it->is_finite()) + Voronoi::Internal::color_exterior(&(*it)); + } // Draw the end points of the input polygon. for (Lines::const_iterator it = lines.begin(); it != lines.end(); ++it) { @@ -376,8 +379,19 @@ static inline void dump_voronoi_to_svg( #if 1 // Draw voronoi vertices. for (boost::polygon::voronoi_diagram::const_vertex_iterator it = vd.vertices().begin(); it != vd.vertices().end(); ++it) - if (! internalEdgesOnly || it->color() != Voronoi::Internal::EXTERNAL_COLOR) - svg.draw(Point(coord_t(it->x()), coord_t(it->y())), voronoiPointColor, voronoiPointRadius); + if (! internalEdgesOnly || it->color() != Voronoi::Internal::EXTERNAL_COLOR) { + const std::string *color = nullptr; + switch (Voronoi::vertex_category(*it)) { + case Voronoi::VertexCategory::OnContour: color = &voronoiPointColor; break; + case Voronoi::VertexCategory::Outside: color = &voronoiPointColorOutside; break; + case Voronoi::VertexCategory::Inside: color = &voronoiPointColorInside; break; + default: color = &voronoiPointColor; // assert(false); + } + Point pt(coord_t(it->x()), coord_t(it->y())); + if (it->x() * pt.x() >= 0. && it->y() * pt.y() >= 0.) + // Conversion to coord_t is valid. + svg.draw(Point(coord_t(it->x()), coord_t(it->y())), *color, voronoiPointRadius); + } for (boost::polygon::voronoi_diagram::const_edge_iterator it = vd.edges().begin(); it != vd.edges().end(); ++it) { if (primaryEdgesOnly && !it->is_primary()) @@ -401,8 +415,32 @@ static inline void dump_voronoi_to_svg( } else if (! it->is_primary()) color = voronoiLineColorSecondary; } - for (std::size_t i = 0; i + 1 < samples.size(); ++i) - svg.draw(Line(Point(coord_t(samples[i].x()), coord_t(samples[i].y())), Point(coord_t(samples[i+1].x()), coord_t(samples[i+1].y()))), color, voronoiLineWidth); + for (std::size_t i = 0; i + 1 < samples.size(); ++ i) { + Vec2d a(samples[i].x(), samples[i].y()); + Vec2d b(samples[i+1].x(), samples[i+1].y()); + // Convert to coord_t. + Point ia = a.cast(); + Point ib = b.cast(); + // Is the conversion possible? Do the resulting points fit into int32_t? + auto in_range = [](const Point &ip, const Vec2d &p) { return p.x() * ip.x() >= 0. && p.y() * ip.y() >= 0.; }; + bool a_in_range = in_range(ia, a); + bool b_in_range = in_range(ib, b); + if (! a_in_range || ! b_in_range) { + if (! a_in_range && ! b_in_range) + // None fits, ignore. + continue; + // One fit, the other does not. Try to clip. + Vec2d v = b - a; + v.normalize(); + v *= bbox.size().cast().norm(); + auto p = a_in_range ? Vec2d(a + v) : Vec2d(b - v); + Point ip = p.cast(); + if (! in_range(ip, p)) + continue; + (a_in_range ? ib : ia) = ip; + } + svg.draw(Line(ia, ib), color, voronoiLineWidth); + } } #endif diff --git a/src/libslic3r/libslic3r.h b/src/libslic3r/libslic3r.h index 2ef258a4cc8..efdecbac8fc 100644 --- a/src/libslic3r/libslic3r.h +++ b/src/libslic3r/libslic3r.h @@ -228,6 +228,16 @@ ForwardIt binary_find_by_predicate(ForwardIt first, ForwardIt last, LowerThanKey return first != last && equal_to_key(*first) ? first : last; } +template inline bool contains(const ContainerType &c, const ValueType &v) + { return std::find(c.begin(), c.end(), v) != c.end(); } +template inline bool contains(const std::initializer_list &il, const T &v) + { return std::find(il.begin(), il.end(), v) != il.end(); } + +template inline bool one_of(const ValueType &v, const ContainerType &c) + { return contains(c, v); } +template inline bool one_of(const T& v, const std::initializer_list& il) + { return contains(il, v); } + template static inline T sqr(T x) { diff --git a/src/miniz/README-Prusa.txt b/src/miniz/README-Prusa.txt new file mode 100644 index 00000000000..83b72cda3a4 --- /dev/null +++ b/src/miniz/README-Prusa.txt @@ -0,0 +1,35 @@ +This library is based on miniz 2.1.0 - amalgamated version. + +---------------------------------------------------------------- + +PrusaResearch (Vojtech) homebrewed the following: + +mz_zip_writer_add_staged_open(), mz_zip_writer_add_staged_data() and mz_zip_writer_add_staged_finish() +were derived from mz_zip_writer_add_read_buf_callback() by splitting it and passing a new +mz_zip_writer_staged_context between them. + +---------------------------------------------------------------- + +Merged with https://github.com/richgel999/miniz/pull/147 +to support writing a zipped file using a callback without +knowing the size of the file up front. + +Vojtech made the following comments to the pull request above: + +The pull request looks good to me in general. We need such a functionality at https://github.com/prusa3d/PrusaSlicer so we are going to merge it into our project. Namely, we are exporting potentially huge model files, which are XML encoded, thus the compression ration is quite high and keeping the XML encoded model file in memory is not really practical. + +I am a bit uneasy about two things though: + +mz_zip_writer_create_zip64_extra_data() call at the start of the file block stores uncompressed and compressed size. Naturally the uncompressed size will be over estimated, while the compressed size will be zero (as it was before). I suppose it does not make any difference, as usually the decompressors do not read this block, but they rely on the copy of this block in the central directory at the end of the ZIP file. I used https://en.wikipedia.org/wiki/ZIP_(file_format) as a source and there is no definition of the ZIP64 extra data block, though the "Data descriptor" section says: +If the bit at offset 3 (0x08) of the general-purpose flags field is set, then the CRC-32 and file sizes are not known when the header is written. The fields in the local header are filled with zero, and the CRC-32 and size are appended in a 12-byte structure (optionally preceded by a 4-byte signature) immediately after the compressed data: + +Thus I suppose it is all right if the file size at the start of the file block is not correct. + +There are weird conditions in the original code as if (uncomp_size <= 3), if (uncomp_size == 0). I am not quite sure what will happen if one called your modified mz_zip_writer_add_read_buf_callback() with maximum size >= 4, but the callback provided less than 4 bytes. This is not a problem in our application, but in general it could be an issue. + +Is it an issue if the maximum size mandates a 64bit format, while the callback provides less than 4GB of data? I suppose there will only be a tiny bit of performance and file size penalty, but the code will work and the exported ZIP file will be valid. + +Are you using your modification in a production code? How well is your modification tested? + +---------------------------------------------------------------- + diff --git a/src/miniz/miniz.c b/src/miniz/miniz.c index 9ded4c75ab7..08126f441a5 100644 --- a/src/miniz/miniz.c +++ b/src/miniz/miniz.c @@ -5904,13 +5904,6 @@ mz_bool mz_zip_writer_add_mem(mz_zip_archive *pZip, const char *pArchive_name, c return mz_zip_writer_add_mem_ex(pZip, pArchive_name, pBuf, buf_size, NULL, 0, level_and_flags, 0, 0); } -typedef struct -{ - mz_zip_archive *m_pZip; - mz_uint64 m_cur_archive_file_ofs; - mz_uint64 m_comp_size; -} mz_zip_writer_add_state; - static mz_bool mz_zip_writer_add_put_buf_callback(const void *pBuf, int len, void *pUser) { mz_zip_writer_add_state *pState = (mz_zip_writer_add_state *)pUser; @@ -5923,7 +5916,6 @@ static mz_bool mz_zip_writer_add_put_buf_callback(const void *pBuf, int len, voi } #define MZ_ZIP64_MAX_LOCAL_EXTRA_FIELD_SIZE (sizeof(mz_uint16) * 2 + sizeof(mz_uint64) * 2) -#define MZ_ZIP64_MAX_CENTRAL_EXTRA_FIELD_SIZE (sizeof(mz_uint16) * 2 + sizeof(mz_uint64) * 3) static mz_uint32 mz_zip_writer_create_zip64_extra_data(mz_uint8 *pBuf, mz_uint64 *pUncomp_size, mz_uint64 *pComp_size, mz_uint64 *pLocal_header_ofs) { mz_uint8 *pDst = pBuf; @@ -6370,13 +6362,13 @@ mz_bool mz_zip_writer_add_mem_ex_v2(mz_zip_archive *pZip, const char *pArchive_n return MZ_TRUE; } -mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, const char *pArchive_name, mz_file_read_func read_callback, void* callback_opaque, mz_uint64 size_to_add, const MZ_TIME_T *pFile_time, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags, +mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, const char *pArchive_name, mz_file_read_func read_callback, void* callback_opaque, mz_uint64 max_size, const MZ_TIME_T *pFile_time, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags, const char *user_extra_data, mz_uint user_extra_data_len, const char *user_extra_data_central, mz_uint user_extra_data_central_len) { mz_uint16 gen_flags = MZ_ZIP_LDH_BIT_FLAG_HAS_LOCATOR; mz_uint uncomp_crc32 = MZ_CRC32_INIT, level, num_alignment_padding_bytes; mz_uint16 method = 0, dos_time = 0, dos_date = 0, ext_attributes = 0; - mz_uint64 local_dir_header_ofs, cur_archive_file_ofs = pZip->m_archive_size, uncomp_size = size_to_add, comp_size = 0; + mz_uint64 local_dir_header_ofs, cur_archive_file_ofs = pZip->m_archive_size, uncomp_size = 0, comp_size = 0; size_t archive_name_size; mz_uint8 local_dir_header[MZ_ZIP_LOCAL_DIR_HEADER_SIZE]; mz_uint8 *pExtra_data = NULL; @@ -6398,7 +6390,7 @@ mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, const char *pA pState = pZip->m_pState; - if ((!pState->m_zip64) && (uncomp_size > MZ_UINT32_MAX)) + if ((!pState->m_zip64) && (max_size > MZ_UINT32_MAX)) { /* Source file is too large for non-zip64 */ /*return mz_zip_set_error(pZip, MZ_ZIP_ARCHIVE_TOO_LARGE); */ @@ -6455,7 +6447,7 @@ mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, const char *pA } #endif - if (uncomp_size <= 3) + if (max_size <= 3) level = 0; if (!mz_zip_writer_write_zeros(pZip, cur_archive_file_ofs, num_alignment_padding_bytes)) @@ -6471,7 +6463,7 @@ mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, const char *pA MZ_ASSERT((cur_archive_file_ofs & (pZip->m_file_offset_alignment - 1)) == 0); } - if (uncomp_size && level) + if (max_size && level) { method = MZ_DEFLATED; } @@ -6479,11 +6471,11 @@ mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, const char *pA MZ_CLEAR_OBJ(local_dir_header); if (pState->m_zip64) { - if (uncomp_size >= MZ_UINT32_MAX || local_dir_header_ofs >= MZ_UINT32_MAX) + if (max_size >= MZ_UINT32_MAX || local_dir_header_ofs >= MZ_UINT32_MAX) { pExtra_data = extra_data; - extra_size = mz_zip_writer_create_zip64_extra_data(extra_data, (uncomp_size >= MZ_UINT32_MAX) ? &uncomp_size : NULL, - (uncomp_size >= MZ_UINT32_MAX) ? &comp_size : NULL, (local_dir_header_ofs >= MZ_UINT32_MAX) ? &local_dir_header_ofs : NULL); + extra_size = mz_zip_writer_create_zip64_extra_data(extra_data, (max_size >= MZ_UINT32_MAX) ? &uncomp_size : NULL, + (max_size >= MZ_UINT32_MAX) ? &comp_size : NULL, (local_dir_header_ofs >= MZ_UINT32_MAX) ? &local_dir_header_ofs : NULL); } if (!mz_zip_writer_create_local_dir_header(pZip, local_dir_header, (mz_uint16)archive_name_size, (mz_uint16)(extra_size + user_extra_data_len), 0, 0, 0, method, gen_flags, dos_time, dos_date)) @@ -6534,9 +6526,8 @@ mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, const char *pA cur_archive_file_ofs += user_extra_data_len; } - if (uncomp_size) + if (max_size) { - mz_uint64 uncomp_remaining = uncomp_size; void *pRead_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, MZ_ZIP_MAX_IO_BUF_SIZE); if (!pRead_buf) { @@ -6545,19 +6536,27 @@ mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, const char *pA if (!level) { - while (uncomp_remaining) + while (1) { - mz_uint n = (mz_uint)MZ_MIN((mz_uint64)MZ_ZIP_MAX_IO_BUF_SIZE, uncomp_remaining); - if ((read_callback(callback_opaque, file_ofs, pRead_buf, n) != n) || (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pRead_buf, n) != n)) + size_t n = read_callback(callback_opaque, file_ofs, pRead_buf, MZ_ZIP_MAX_IO_BUF_SIZE); + if (n == 0) + break; + + if ((n > MZ_ZIP_MAX_IO_BUF_SIZE) || (file_ofs + n > max_size)) { pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); return mz_zip_set_error(pZip, MZ_ZIP_FILE_READ_FAILED); } - file_ofs += n; + if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pRead_buf, n) != n) + { + pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); + return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); + } + file_ofs += n; uncomp_crc32 = (mz_uint32)mz_crc32(uncomp_crc32, (const mz_uint8 *)pRead_buf, n); - uncomp_remaining -= n; cur_archive_file_ofs += n; } + uncomp_size = file_ofs; comp_size = uncomp_size; } else @@ -6584,24 +6583,26 @@ mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, const char *pA for (;;) { - size_t in_buf_size = (mz_uint32)MZ_MIN(uncomp_remaining, (mz_uint64)MZ_ZIP_MAX_IO_BUF_SIZE); tdefl_status status; tdefl_flush flush = TDEFL_NO_FLUSH; - if (read_callback(callback_opaque, file_ofs, pRead_buf, in_buf_size)!= in_buf_size) + size_t n = read_callback(callback_opaque, file_ofs, pRead_buf, MZ_ZIP_MAX_IO_BUF_SIZE); + if ((n > MZ_ZIP_MAX_IO_BUF_SIZE) || (file_ofs + n > max_size)) { mz_zip_set_error(pZip, MZ_ZIP_FILE_READ_FAILED); break; } - file_ofs += in_buf_size; - uncomp_crc32 = (mz_uint32)mz_crc32(uncomp_crc32, (const mz_uint8 *)pRead_buf, in_buf_size); - uncomp_remaining -= in_buf_size; + file_ofs += n; + uncomp_crc32 = (mz_uint32)mz_crc32(uncomp_crc32, (const mz_uint8 *)pRead_buf, n); if (pZip->m_pNeeds_keepalive != NULL && pZip->m_pNeeds_keepalive(pZip->m_pIO_opaque)) flush = TDEFL_FULL_FLUSH; - status = tdefl_compress_buffer(pComp, pRead_buf, in_buf_size, uncomp_remaining ? flush : TDEFL_FINISH); + if (n == 0) + flush = TDEFL_FINISH; + + status = tdefl_compress_buffer(pComp, pRead_buf, n, flush); if (status == TDEFL_STATUS_DONE) { result = MZ_TRUE; @@ -6622,6 +6623,7 @@ mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, const char *pA return MZ_FALSE; } + uncomp_size = file_ofs; comp_size = state.m_comp_size; cur_archive_file_ofs = state.m_cur_archive_file_ofs; } @@ -6673,6 +6675,277 @@ mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, const char *pA return MZ_TRUE; } +mz_bool mz_zip_writer_add_staged_open(mz_zip_archive* pZip, mz_zip_writer_staged_context* pContext, const char* pArchive_name, mz_uint64 max_size, const MZ_TIME_T* pFile_time, const void* pComment, mz_uint16 comment_size, mz_uint level_and_flags, + const char* user_extra_data, mz_uint user_extra_data_len, const char* user_extra_data_central, mz_uint user_extra_data_central_len) +{ + mz_uint level, num_alignment_padding_bytes; + mz_uint8 local_dir_header[MZ_ZIP_LOCAL_DIR_HEADER_SIZE]; + mz_zip_internal_state* pState; + + memset(pContext, 0, sizeof(mz_zip_writer_staged_context)); + pContext->pZip = pZip; + pContext->gen_flags = MZ_ZIP_LDH_BIT_FLAG_HAS_LOCATOR; + pContext->uncomp_crc32 = MZ_CRC32_INIT; + pContext->method = MZ_DEFLATED; + pContext->cur_archive_file_ofs = pZip->m_archive_size; + pContext->max_size = max_size; + pContext->pArchive_name = pArchive_name; + pContext->pComment = pComment; + pContext->comment_size = comment_size; + pContext->user_extra_data_central = user_extra_data_central; + pContext->user_extra_data_central_len = user_extra_data_central_len; + + if (!(level_and_flags & MZ_ZIP_FLAG_ASCII_FILENAME)) + pContext->gen_flags |= MZ_ZIP_GENERAL_PURPOSE_BIT_FLAG_UTF8; + + if ((int)level_and_flags < 0) + level_and_flags = MZ_DEFAULT_LEVEL; + level = level_and_flags & 0xF; + + /* Sanity checks */ + if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING) || (!pArchive_name) || ((comment_size) && (!pComment)) || (level == 0) || (level > MZ_UBER_COMPRESSION) || (max_size < 4)) + return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); + + pState = pZip->m_pState; + + if ((!pState->m_zip64) && (max_size > MZ_UINT32_MAX)) + { + /* Source file is too large for non-zip64 */ + /*return mz_zip_set_error(pZip, MZ_ZIP_ARCHIVE_TOO_LARGE); */ + pState->m_zip64 = MZ_TRUE; + } + + /* We could support this, but why? */ + if (level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA) + return mz_zip_set_error(pZip, MZ_ZIP_INVALID_PARAMETER); + + if (!mz_zip_writer_validate_archive_name(pArchive_name)) + return mz_zip_set_error(pZip, MZ_ZIP_INVALID_FILENAME); + + if (pState->m_zip64) + { + if (pZip->m_total_files == MZ_UINT32_MAX) + return mz_zip_set_error(pZip, MZ_ZIP_TOO_MANY_FILES); + } + else + { + if (pZip->m_total_files == MZ_UINT16_MAX) + { + pState->m_zip64 = MZ_TRUE; + /*return mz_zip_set_error(pZip, MZ_ZIP_TOO_MANY_FILES); */ + } + } + + pContext->archive_name_size = strlen(pArchive_name); + if (pContext->archive_name_size > MZ_UINT16_MAX) + return mz_zip_set_error(pZip, MZ_ZIP_INVALID_FILENAME); + + num_alignment_padding_bytes = mz_zip_writer_compute_padding_needed_for_file_alignment(pZip); + + /* miniz doesn't support central dirs >= MZ_UINT32_MAX bytes yet */ + if (((mz_uint64)pState->m_central_dir.m_size + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + pContext->archive_name_size + MZ_ZIP64_MAX_CENTRAL_EXTRA_FIELD_SIZE + comment_size) >= MZ_UINT32_MAX) + return mz_zip_set_error(pZip, MZ_ZIP_UNSUPPORTED_CDIR_SIZE); + + if (!pState->m_zip64) + { + /* Bail early if the archive would obviously become too large */ + if ((pZip->m_archive_size + num_alignment_padding_bytes + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + pContext->archive_name_size + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + + pContext->archive_name_size + comment_size + user_extra_data_len + pState->m_central_dir.m_size + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE + 1024 + + MZ_ZIP_DATA_DESCRIPTER_SIZE32 + user_extra_data_central_len) > 0xFFFFFFFF) + { + pState->m_zip64 = MZ_TRUE; + /*return mz_zip_set_error(pZip, MZ_ZIP_ARCHIVE_TOO_LARGE); */ + } + } + +#ifndef MINIZ_NO_TIME + if (pFile_time) + { + mz_zip_time_t_to_dos_time(*pFile_time, &pContext->dos_time, &pContext->dos_date); + } +#endif + + if (!mz_zip_writer_write_zeros(pZip, pContext->cur_archive_file_ofs, num_alignment_padding_bytes)) + { + return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); + } + + pContext->cur_archive_file_ofs += num_alignment_padding_bytes; + pContext->local_dir_header_ofs = pContext->cur_archive_file_ofs; + + if (pZip->m_file_offset_alignment) + { + MZ_ASSERT((pContext->cur_archive_file_ofs & (pZip->m_file_offset_alignment - 1)) == 0); + } + + MZ_CLEAR_OBJ(local_dir_header); + if (pState->m_zip64) + { + if (max_size >= MZ_UINT32_MAX || pContext->local_dir_header_ofs >= MZ_UINT32_MAX) + { + pContext->pExtra_data = pContext->extra_data; + pContext->extra_size = mz_zip_writer_create_zip64_extra_data(pContext->extra_data, (max_size >= MZ_UINT32_MAX) ? &pContext->uncomp_size : NULL, + (max_size >= MZ_UINT32_MAX) ? &pContext->comp_size : NULL, (pContext->local_dir_header_ofs >= MZ_UINT32_MAX) ? &pContext->local_dir_header_ofs : NULL); + } + + if (!mz_zip_writer_create_local_dir_header(pZip, local_dir_header, (mz_uint16)pContext->archive_name_size, (mz_uint16)(pContext->extra_size + user_extra_data_len), 0, 0, 0, pContext->method, pContext->gen_flags, pContext->dos_time, pContext->dos_date)) + return mz_zip_set_error(pZip, MZ_ZIP_INTERNAL_ERROR); + + if (pZip->m_pWrite(pZip->m_pIO_opaque, pContext->cur_archive_file_ofs, local_dir_header, sizeof(local_dir_header)) != sizeof(local_dir_header)) + return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); + + pContext->cur_archive_file_ofs += sizeof(local_dir_header); + + if (pZip->m_pWrite(pZip->m_pIO_opaque, pContext->cur_archive_file_ofs, pArchive_name, pContext->archive_name_size) != pContext->archive_name_size) + { + return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); + } + + pContext->cur_archive_file_ofs += pContext->archive_name_size; + + if (pZip->m_pWrite(pZip->m_pIO_opaque, pContext->cur_archive_file_ofs, pContext->extra_data, pContext->extra_size) != pContext->extra_size) + return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); + + pContext->cur_archive_file_ofs += pContext->extra_size; + } + else + { + if ((pContext->comp_size > MZ_UINT32_MAX) || (pContext->cur_archive_file_ofs > MZ_UINT32_MAX)) + return mz_zip_set_error(pZip, MZ_ZIP_ARCHIVE_TOO_LARGE); + if (!mz_zip_writer_create_local_dir_header(pZip, local_dir_header, (mz_uint16)pContext->archive_name_size, (mz_uint16)user_extra_data_len, 0, 0, 0, pContext->method, pContext->gen_flags, pContext->dos_time, pContext->dos_date)) + return mz_zip_set_error(pZip, MZ_ZIP_INTERNAL_ERROR); + + if (pZip->m_pWrite(pZip->m_pIO_opaque, pContext->cur_archive_file_ofs, local_dir_header, sizeof(local_dir_header)) != sizeof(local_dir_header)) + return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); + + pContext->cur_archive_file_ofs += sizeof(local_dir_header); + + if (pZip->m_pWrite(pZip->m_pIO_opaque, pContext->cur_archive_file_ofs, pArchive_name, pContext->archive_name_size) != pContext->archive_name_size) + { + return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); + } + + pContext->cur_archive_file_ofs += pContext->archive_name_size; + } + + if (user_extra_data_len > 0) + { + if (pZip->m_pWrite(pZip->m_pIO_opaque, pContext->cur_archive_file_ofs, user_extra_data, user_extra_data_len) != user_extra_data_len) + return mz_zip_set_error(pZip, MZ_ZIP_FILE_WRITE_FAILED); + + pContext->cur_archive_file_ofs += user_extra_data_len; + } + + assert(max_size); + assert(level); + + pContext->pCompressor = (tdefl_compressor*)pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, sizeof(tdefl_compressor)); + if (!pContext->pCompressor) + { + return mz_zip_set_error(pZip, MZ_ZIP_ALLOC_FAILED); + } + + pContext->add_state.m_pZip = pZip; + pContext->add_state.m_cur_archive_file_ofs = pContext->cur_archive_file_ofs; + pContext->add_state.m_comp_size = 0; + + if (tdefl_init(pContext->pCompressor, mz_zip_writer_add_put_buf_callback, &pContext->add_state, tdefl_create_comp_flags_from_zip_params(level, -15, MZ_DEFAULT_STRATEGY)) != TDEFL_STATUS_OKAY) + { + pZip->m_pFree(pZip->m_pAlloc_opaque, pContext->pCompressor); + return mz_zip_set_error(pZip, MZ_ZIP_INTERNAL_ERROR); + } + + return MZ_TRUE; +} + +mz_bool mz_zip_writer_add_staged_data(mz_zip_writer_staged_context *pContext, const char *pRead_buf, size_t n) +{ + tdefl_flush flush = TDEFL_NO_FLUSH; + + if (pContext->file_ofs + n > pContext->max_size) + { + mz_zip_set_error(pContext->pZip, MZ_ZIP_FILE_READ_FAILED); + pContext->pZip->m_pFree(pContext->pZip->m_pAlloc_opaque, pContext->pCompressor); + pContext->pCompressor = NULL; + return MZ_FALSE; + } + + pContext->file_ofs += n; + pContext->uncomp_crc32 = (mz_uint32)mz_crc32(pContext->uncomp_crc32, (const mz_uint8 *)pRead_buf, n); + + if (pContext->pZip->m_pNeeds_keepalive != NULL && pContext->pZip->m_pNeeds_keepalive(pContext->pZip->m_pIO_opaque)) + flush = TDEFL_FULL_FLUSH; + + { + tdefl_status status = tdefl_compress_buffer(pContext->pCompressor, pRead_buf, n, (n == 0) ? TDEFL_FINISH : flush); + if (status == TDEFL_STATUS_DONE || status == TDEFL_STATUS_OKAY) + return MZ_TRUE; + } + + mz_zip_set_error(pContext->pZip, MZ_ZIP_COMPRESSION_FAILED); + pContext->pZip->m_pFree(pContext->pZip->m_pAlloc_opaque, pContext->pCompressor); + pContext->pCompressor = NULL; + return MZ_FALSE; +} + +mz_bool mz_zip_writer_add_staged_finish(mz_zip_writer_staged_context *pContext) +{ + if (! mz_zip_writer_add_staged_data(pContext, NULL, 0) || + // Either never opened, or already finished. + ! pContext->pCompressor) + return MZ_FALSE; + + pContext->pZip->m_pFree(pContext->pZip->m_pAlloc_opaque, pContext->pCompressor); + pContext->pCompressor = NULL; + + pContext->uncomp_size = pContext->file_ofs; + pContext->comp_size = pContext->add_state.m_comp_size; + pContext->cur_archive_file_ofs = pContext->add_state.m_cur_archive_file_ofs; + + { + mz_uint8 local_dir_footer[MZ_ZIP_DATA_DESCRIPTER_SIZE64]; + mz_uint32 local_dir_footer_size = MZ_ZIP_DATA_DESCRIPTER_SIZE32; + + MZ_WRITE_LE32(local_dir_footer + 0, MZ_ZIP_DATA_DESCRIPTOR_ID); + MZ_WRITE_LE32(local_dir_footer + 4, pContext->uncomp_crc32); + if (pContext->pExtra_data == NULL) + { + if (pContext->comp_size > MZ_UINT32_MAX) + return mz_zip_set_error(pContext->pZip, MZ_ZIP_ARCHIVE_TOO_LARGE); + + MZ_WRITE_LE32(local_dir_footer + 8, pContext->comp_size); + MZ_WRITE_LE32(local_dir_footer + 12, pContext->uncomp_size); + } + else + { + MZ_WRITE_LE64(local_dir_footer + 8, pContext->comp_size); + MZ_WRITE_LE64(local_dir_footer + 16, pContext->uncomp_size); + local_dir_footer_size = MZ_ZIP_DATA_DESCRIPTER_SIZE64; + } + + if (pContext->pZip->m_pWrite(pContext->pZip->m_pIO_opaque, pContext->cur_archive_file_ofs, local_dir_footer, local_dir_footer_size) != local_dir_footer_size) + return MZ_FALSE; + + pContext->cur_archive_file_ofs += local_dir_footer_size; + } + + if (pContext->pExtra_data != NULL) + { + pContext->extra_size = mz_zip_writer_create_zip64_extra_data(pContext->extra_data, (pContext->uncomp_size >= MZ_UINT32_MAX) ? &pContext->uncomp_size : NULL, + (pContext->uncomp_size >= MZ_UINT32_MAX) ? &pContext->comp_size : NULL, (pContext->local_dir_header_ofs >= MZ_UINT32_MAX) ? &pContext->local_dir_header_ofs : NULL); + } + + if (!mz_zip_writer_add_to_central_dir(pContext->pZip, pContext->pArchive_name, (mz_uint16)pContext->archive_name_size, pContext->pExtra_data, (mz_uint16)pContext->extra_size, pContext->pComment, pContext->comment_size, + pContext->uncomp_size, pContext->comp_size, pContext->uncomp_crc32, pContext->method, pContext->gen_flags, pContext->dos_time, pContext->dos_date, pContext->local_dir_header_ofs, pContext->ext_attributes, + pContext->user_extra_data_central, pContext->user_extra_data_central_len)) + return MZ_FALSE; + + pContext->pZip->m_total_files++; + pContext->pZip->m_archive_size = pContext->cur_archive_file_ofs; + + return MZ_TRUE; +} + #ifndef MINIZ_NO_STDIO static size_t mz_file_read_func_stdio(void *pOpaque, mz_uint64 file_ofs, void *pBuf, size_t n) diff --git a/src/miniz/miniz.h b/src/miniz/miniz.h index 7db62811e51..8fe0461adba 100644 --- a/src/miniz/miniz.h +++ b/src/miniz/miniz.h @@ -1282,7 +1282,7 @@ mz_bool mz_zip_writer_add_mem_ex_v2(mz_zip_archive *pZip, const char *pArchive_n /* Adds the contents of a file to an archive. This function also records the disk file's modified time into the archive. */ /* File data is supplied via a read callback function. User mz_zip_writer_add_(c)file to add a file directly.*/ -mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, const char *pArchive_name, mz_file_read_func read_callback, void* callback_opaque, mz_uint64 size_to_add, +mz_bool mz_zip_writer_add_read_buf_callback(mz_zip_archive *pZip, const char *pArchive_name, mz_file_read_func read_callback, void* callback_opaque, mz_uint64 max_size, const MZ_TIME_T *pFile_time, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags, const char *user_extra_data_local, mz_uint user_extra_data_local_len, const char *user_extra_data_central, mz_uint user_extra_data_central_len); @@ -1297,6 +1297,60 @@ mz_bool mz_zip_writer_add_cfile(mz_zip_archive *pZip, const char *pArchive_name, const char *user_extra_data_central, mz_uint user_extra_data_central_len); #endif +#define MZ_ZIP64_MAX_CENTRAL_EXTRA_FIELD_SIZE (sizeof(mz_uint16) * 2 + sizeof(mz_uint64) * 3) + +typedef struct +{ + mz_zip_archive* m_pZip; + mz_uint64 m_cur_archive_file_ofs; + mz_uint64 m_comp_size; +} mz_zip_writer_add_state; + +typedef struct mz_zip_writer_staged_context +{ + mz_zip_archive *pZip; + + mz_uint16 gen_flags; + mz_uint uncomp_crc32; + mz_uint16 method; + mz_uint16 dos_time; + mz_uint16 dos_date; + mz_uint16 ext_attributes; + mz_uint64 local_dir_header_ofs; + mz_uint64 cur_archive_file_ofs; + size_t archive_name_size; + mz_uint64 uncomp_size; + mz_uint64 comp_size; + mz_uint64 max_size; + mz_uint8 *pExtra_data; + mz_uint32 extra_size; + mz_uint8 extra_data[MZ_ZIP64_MAX_CENTRAL_EXTRA_FIELD_SIZE]; + + /* + * Compressor context + */ + mz_zip_writer_add_state add_state; + tdefl_compressor *pCompressor; + mz_uint64 file_ofs; + + /* + * The following data is passed to the "finish" stage, the referenced pointers must still be valid! + */ + const char* pArchive_name; + const void* pComment; + mz_uint16 comment_size; + const char* user_extra_data_central; + mz_uint user_extra_data_central_len; +} mz_zip_writer_staged_context; + +/* Adds a file to an archive piecewise. Minimum size of the raw data is 4 bytes. */ +/* Don't call mz_zip_writer_add_staged_finish() if mz_zip_writer_add_staged_open() or mz_zip_writer_add_staged_data() fails. */ +mz_bool mz_zip_writer_add_staged_open(mz_zip_archive* pZip, mz_zip_writer_staged_context* pContext, const char* pArchive_name, + mz_uint64 max_size, const MZ_TIME_T* pFile_time, const void* pComment, mz_uint16 comment_size, mz_uint level_and_flags, + const char* user_extra_data, mz_uint user_extra_data_len, const char* user_extra_data_central, mz_uint user_extra_data_central_len); +mz_bool mz_zip_writer_add_staged_data(mz_zip_writer_staged_context* pContext, const char* pRead_buf, size_t n); +mz_bool mz_zip_writer_add_staged_finish(mz_zip_writer_staged_context* pContext); + /* Adds a file to an archive by fully cloning the data from another archive. */ /* This function fully clones the source file's compressed data (no recompression), along with its full filename, extra data (it may add or modify the zip64 local header extra data field), and the optional descriptor following the compressed data. */ mz_bool mz_zip_writer_add_from_zip_reader(mz_zip_archive *pZip, mz_zip_archive *pSource_zip, mz_uint src_file_index); diff --git a/src/platform/osx/Info.plist.in b/src/platform/osx/Info.plist.in index e922b23f564..46858bb2933 100644 --- a/src/platform/osx/Info.plist.in +++ b/src/platform/osx/Info.plist.in @@ -23,98 +23,103 @@ CFBundleVersion @SLIC3R_BUILD_ID@ CFBundleDocumentTypes - - - CFBundleTypeExtensions - - stl - STL - - CFBundleTypeIconFile - stl.icns - CFBundleTypeName + + + CFBundleTypeExtensions + + stl STL - CFBundleTypeRole - Viewer - LISsAppleDefaultForType - - LSHandlerRank - Alternate - - - CFBundleTypeExtensions - - obj - OBJ - - CFBundleTypeIconFile - PrusaSlicer.icns - CFBundleTypeName - STL - CFBundleTypeRole - Viewer - LISsAppleDefaultForType - - LSHandlerRank - Alternate - - - CFBundleTypeExtensions - - amf - AMF - - CFBundleTypeIconFile - PrusaSlicer.icns - CFBundleTypeName + + CFBundleTypeIconFile + stl.icns + CFBundleTypeName + STL + CFBundleTypeRole + Viewer + LISsAppleDefaultForType + + LSHandlerRank + Alternate + + + CFBundleTypeExtensions + + obj + OBJ + + CFBundleTypeIconFile + PrusaSlicer.icns + CFBundleTypeName + STL + CFBundleTypeRole + Viewer + LISsAppleDefaultForType + + LSHandlerRank + Alternate + + + CFBundleTypeExtensions + + amf AMF - CFBundleTypeRole - Viewer - LISsAppleDefaultForType - - LSHandlerRank - Alternate - - - CFBundleTypeExtensions - - 3mf - 3MF - - CFBundleTypeIconFile - PrusaSlicer.icns - CFBundleTypeName + + CFBundleTypeIconFile + PrusaSlicer.icns + CFBundleTypeName + AMF + CFBundleTypeRole + Viewer + LISsAppleDefaultForType + + LSHandlerRank + Alternate + + + CFBundleTypeExtensions + + 3mf 3MF - CFBundleTypeRole - Viewer - LISsAppleDefaultForType - - LSHandlerRank - Alternate - - - CFBundleTypeExtensions - - gcode - GCODE - - CFBundleTypeIconFile - gcode.icns - CFBundleTypeName + + CFBundleTypeIconFile + PrusaSlicer.icns + CFBundleTypeName + 3MF + CFBundleTypeRole + Viewer + LISsAppleDefaultForType + + LSHandlerRank + Alternate + + + CFBundleTypeExtensions + + gcode GCODE - CFBundleTypeRole - Viewer - LISsAppleDefaultForType - - LSHandlerRank - Alternate - - - LSMinimumSystemVersion - 10.9 - NSPrincipalClass - NSApplication - NSHighResolutionCapable - + + CFBundleTypeIconFile + gcode.icns + CFBundleTypeName + GCODE + CFBundleTypeRole + Viewer + LISsAppleDefaultForType + + LSHandlerRank + Alternate + + + LSMinimumSystemVersion + 10.10 + NSPrincipalClass + NSApplication + NSHighResolutionCapable + + LSEnvironment + + ASAN_OPTIONS + detect_container_overflow=0 + diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index e040de727ac..505c8f0f21d 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -158,6 +158,8 @@ set(SLIC3R_GUI_SOURCES GUI/PrintHostDialogs.hpp GUI/Jobs/Job.hpp GUI/Jobs/Job.cpp + GUI/Jobs/PlaterJob.hpp + GUI/Jobs/PlaterJob.cpp GUI/Jobs/ArrangeJob.hpp GUI/Jobs/ArrangeJob.cpp GUI/Jobs/RotoptimizeJob.hpp diff --git a/src/slic3r/Config/Snapshot.cpp b/src/slic3r/Config/Snapshot.cpp index 900172d3eb6..ecfc32b58fb 100644 --- a/src/slic3r/Config/Snapshot.cpp +++ b/src/slic3r/Config/Snapshot.cpp @@ -251,7 +251,7 @@ bool Snapshot::equal_to_active(const AppConfig &app_config) const return false; matched.insert(vc.name); } - for (const std::pair>> &v : app_config.vendors()) + for (const auto &v : app_config.vendors()) if (matched.find(v.first) == matched.end() && ! v.second.empty()) // There are more vendors currently installed than enabled in the snapshot. return false; @@ -402,7 +402,7 @@ const Snapshot& SnapshotDB::take_snapshot(const AppConfig &app_config, Snapshot: snapshot.filaments.emplace_back(app_config.get("presets", name)); } // Vendor specific config bundles and installed printers. - for (const std::pair>> &vendor : app_config.vendors()) { + for (const auto &vendor : app_config.vendors()) { Snapshot::VendorConfig cfg; cfg.name = vendor.first; cfg.models_variants_installed = vendor.second; diff --git a/src/slic3r/GUI/BitmapCache.cpp b/src/slic3r/GUI/BitmapCache.cpp index c553f372898..0a6f3e4f9f6 100644 --- a/src/slic3r/GUI/BitmapCache.cpp +++ b/src/slic3r/GUI/BitmapCache.cpp @@ -338,7 +338,7 @@ wxBitmap* BitmapCache::load_svg(const std::string &bitmap_name, unsigned target_ } //we make scaled solid bitmaps only for the cases, when its will be used with scaled SVG icon in one output bitmap -wxBitmap BitmapCache::mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency, bool suppress_scaling/* = false*/) +wxBitmap BitmapCache::mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency, bool suppress_scaling/* = false*/, size_t border_width /*= 0*/, bool dark_mode/* = false*/) { double scale = suppress_scaling ? 1.0f : m_scale; width *= scale; @@ -354,6 +354,30 @@ wxBitmap BitmapCache::mksolid(size_t width, size_t height, unsigned char r, unsi *imgdata ++ = b; *imgalpha ++ = transparency; } + + // Add border, make white/light spools easier to see + if (border_width > 0) { + + // Restrict to width of image + if (border_width > height) border_width = height - 1; + if (border_width > width) border_width = width - 1; + + auto px_data = (uint8_t*)image.GetData(); + auto a_data = (uint8_t*)image.GetAlpha(); + + for (size_t x = 0; x < width; ++x) { + for (size_t y = 0; y < height; ++y) { + if (x < border_width || y < border_width || + x >= (width - border_width) || y >= (height - border_width)) { + const size_t idx = (x + y * width); + const size_t idx_rgb = (x + y * width) * 3; + px_data[idx_rgb] = px_data[idx_rgb + 1] = px_data[idx_rgb + 2] = dark_mode ? 245u : 110u; + a_data[idx] = 255u; + } + } + } + } + return wxImage_to_wxBitmap_with_alpha(std::move(image), scale); } diff --git a/src/slic3r/GUI/BitmapCache.hpp b/src/slic3r/GUI/BitmapCache.hpp index 429b7dfd922..8147de99630 100644 --- a/src/slic3r/GUI/BitmapCache.hpp +++ b/src/slic3r/GUI/BitmapCache.hpp @@ -35,8 +35,8 @@ class BitmapCache // Load svg from resources/icons. bitmap_key is given without the .svg suffix. SVG will be rasterized to provided height/width. wxBitmap* load_svg(const std::string &bitmap_key, unsigned width = 0, unsigned height = 0, const bool grayscale = false, const bool dark_mode = false); - wxBitmap mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency, bool suppress_scaling = false); - wxBitmap mksolid(size_t width, size_t height, const unsigned char rgb[3], bool suppress_scaling = false) { return mksolid(width, height, rgb[0], rgb[1], rgb[2], wxALPHA_OPAQUE, suppress_scaling); } + wxBitmap mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency, bool suppress_scaling = false, size_t border_width = 0, bool dark_mode = false); + wxBitmap mksolid(size_t width, size_t height, const unsigned char rgb[3], bool suppress_scaling = false, size_t border_width = 0, bool dark_mode = false) { return mksolid(width, height, rgb[0], rgb[1], rgb[2], wxALPHA_OPAQUE, suppress_scaling, border_width, dark_mode); } wxBitmap mkclear(size_t width, size_t height) { return mksolid(width, height, 0, 0, 0, wxALPHA_TRANSPARENT); } static bool parse_color(const std::string& scolor, unsigned char* rgb_out); diff --git a/src/slic3r/GUI/BonjourDialog.cpp b/src/slic3r/GUI/BonjourDialog.cpp index 8ee01c94931..65d5524c2db 100644 --- a/src/slic3r/GUI/BonjourDialog.cpp +++ b/src/slic3r/GUI/BonjourDialog.cpp @@ -108,8 +108,7 @@ bool BonjourDialog::show_and_lookup() timer->SetOwner(this); timer_state = 1; timer->Start(1000); - wxTimerEvent evt_dummy; - on_timer(evt_dummy); + on_timer_process(); // The background thread needs to queue messages for this dialog // and for that it needs a valid pointer to it (mandated by the wxWidgets API). @@ -120,7 +119,7 @@ bool BonjourDialog::show_and_lookup() // Note: More can be done here when we support discovery of hosts other than Octoprint and SL1 Bonjour::TxtKeys txt_keys { "version", "model" }; - bonjour = std::move(Bonjour("octoprint") + bonjour = Bonjour("octoprint") .set_txt_keys(std::move(txt_keys)) .set_retries(3) .set_timeout(4) @@ -140,8 +139,7 @@ bool BonjourDialog::show_and_lookup() wxQueueEvent(dialog, evt); } }) - .lookup() - ); + .lookup(); bool res = ShowModal() == wxID_OK && list->GetFirstSelected() >= 0; { @@ -214,18 +212,27 @@ void BonjourDialog::on_reply(BonjourReplyEvent &e) } void BonjourDialog::on_timer(wxTimerEvent &) +{ + on_timer_process(); +} + +// This is here so the function can be bound to wxEVT_TIMER and also called +// explicitly (wxTimerEvent should not be created by user code). +void BonjourDialog::on_timer_process() { const auto search_str = _utf8(L("Searching for devices")); - if (timer_state > 0) { - const std::string dots(timer_state, '.'); + if (timer_state > 0) { + const std::string dots(timer_state, '.'); label->SetLabel(GUI::from_u8((boost::format("%1% %2%") % search_str % dots).str())); - timer_state = (timer_state) % 3 + 1; - } else { + timer_state = (timer_state) % 3 + 1; + } else { label->SetLabel(GUI::from_u8((boost::format("%1%: %2%") % search_str % (_utf8(L("Finished"))+".")).str())); - timer->Stop(); - } + timer->Stop(); + } } + + } diff --git a/src/slic3r/GUI/BonjourDialog.hpp b/src/slic3r/GUI/BonjourDialog.hpp index a9a33d5229b..def0838d7e0 100644 --- a/src/slic3r/GUI/BonjourDialog.hpp +++ b/src/slic3r/GUI/BonjourDialog.hpp @@ -43,6 +43,7 @@ class BonjourDialog: public wxDialog void on_reply(BonjourReplyEvent &); void on_timer(wxTimerEvent &); + void on_timer_process(); }; diff --git a/src/slic3r/GUI/Camera.cpp b/src/slic3r/GUI/Camera.cpp index 1e589f1a15e..ade1d404370 100644 --- a/src/slic3r/GUI/Camera.cpp +++ b/src/slic3r/GUI/Camera.cpp @@ -10,15 +10,6 @@ #include -// phi / theta angles to orient the camera. -static const float VIEW_DEFAULT[2] = { 45.0f, 45.0f }; -static const float VIEW_LEFT[2] = { 90.0f, 90.0f }; -static const float VIEW_RIGHT[2] = { -90.0f, 90.0f }; -static const float VIEW_TOP[2] = { 0.0f, 0.0f }; -static const float VIEW_BOTTOM[2] = { 0.0f, 180.0f }; -static const float VIEW_FRONT[2] = { 0.0f, 90.0f }; -static const float VIEW_REAR[2] = { 180.0f, 90.0f }; - namespace Slic3r { namespace GUI { diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index 31a08e1c2b2..c3ca156ed10 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -267,7 +267,9 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config) for (auto el : { "skirt_distance", "draft_shield", "min_skirt_length" }) toggle_field(el, have_skirt); - bool have_brim = config->opt_float("brim_width") > 0; + bool have_brim = config->opt_enum("brim_type") != btNoBrim; + for (auto el : { "brim_width", "brim_offset" }) + toggle_field(el, have_brim); // perimeter_extruder uses the same logic as in Print::extruders() toggle_field("perimeter_extruder", have_perimeters || have_brim); diff --git a/src/slic3r/GUI/ConfigSnapshotDialog.cpp b/src/slic3r/GUI/ConfigSnapshotDialog.cpp index 487604b1c0e..9f996d378bd 100644 --- a/src/slic3r/GUI/ConfigSnapshotDialog.cpp +++ b/src/slic3r/GUI/ConfigSnapshotDialog.cpp @@ -68,7 +68,7 @@ static wxString generate_html_row(const Config::Snapshot &snapshot, bool row_eve if (vc.version.max_slic3r_version != Semver::inf()) text += ", " + _(L("max PrusaSlicer version")) + ": " + vc.version.max_slic3r_version.to_string(); text += "
"; - for (const std::pair> &model : vc.models_variants_installed) { + for (const auto& model : vc.models_variants_installed) { text += _(L("model")) + ": " + model.first + ", " + _(L("variants")) + ": "; for (const std::string &variant : model.second) { if (&variant != &*model.second.begin()) diff --git a/src/slic3r/GUI/ConfigWizard.cpp b/src/slic3r/GUI/ConfigWizard.cpp index 5af48ee368b..047a0046f40 100644 --- a/src/slic3r/GUI/ConfigWizard.cpp +++ b/src/slic3r/GUI/ConfigWizard.cpp @@ -734,7 +734,7 @@ void PageMaterials::set_compatible_printers_html_window(const std::vector%s", boost::nowide::widen(printer_names[i])); if (i % 3 == 2) { @@ -830,7 +830,7 @@ void PageMaterials::update_lists(int sel_printer, int sel_type, int sel_vendor) } } if (sel_printers[0] != 0) { - for (size_t i = 0; i < sel_printers_count; i++) { + for (int i = 0; i < sel_printers_count; i++) { const std::string& printer_name = list_printer->get_data(sel_printers[i]); const Preset* printer = nullptr; for (const Preset* it : materials->printers) { @@ -881,7 +881,7 @@ void PageMaterials::update_lists(int sel_printer, int sel_type, int sel_vendor) if (sel_printers_count != 0 && sel_type != wxNOT_FOUND) { const std::string& type = list_type->get_data(sel_type); // find printer preset - for (size_t i = 0; i < sel_printers_count; i++) { + for (int i = 0; i < sel_printers_count; i++) { const std::string& printer_name = list_printer->get_data(sel_printers[i]); const Preset* printer = nullptr; for (const Preset* it : materials->printers) { @@ -917,7 +917,7 @@ void PageMaterials::update_lists(int sel_printer, int sel_type, int sel_vendor) const std::string& vendor = list_vendor->get_data(sel_vendor); // finst printer preset std::vector to_list; - for (size_t i = 0; i < sel_printers_count; i++) { + for (int i = 0; i < sel_printers_count; i++) { const std::string& printer_name = list_printer->get_data(sel_printers[i]); const Preset* printer = nullptr; for (const Preset* it : materials->printers) { @@ -986,7 +986,7 @@ void PageMaterials::sort_list_data(StringList* list, bool add_All_item, bool mat const ConfigOptionDef* def = print_config_def.get("filament_type"); std::vectorenum_values = def->enum_values; - int end_of_sorted = 0; + size_t end_of_sorted = 0; for (size_t vals = 0; vals < enum_values.size(); vals++) { for (size_t profs = end_of_sorted; profs < other_profiles.size(); profs++) { @@ -1044,13 +1044,11 @@ void PageMaterials::sort_list_data(PresetList* list, const std::vectorClear(); - //for (const auto& item : prusa_profiles) - for (int i = 0; i < prusa_profiles.size(); ++i) { + for (size_t i = 0; i < prusa_profiles.size(); ++i) { list->append(std::string(prusa_profiles[i].name) + (prusa_profiles[i].omnipresent ? "" : " *"), &const_cast(prusa_profiles[i].name.get())); list->Check(i, prusa_profiles[i].checked); } - //for (const auto& item : other_profiles) - for (int i = 0; i < other_profiles.size(); ++i) { + for (size_t i = 0; i < other_profiles.size(); ++i) { list->append(std::string(other_profiles[i].name) + (other_profiles[i].omnipresent ? "" : " *"), &const_cast(other_profiles[i].name.get())); list->Check(i + prusa_profiles.size(), other_profiles[i].checked); } @@ -1874,7 +1872,7 @@ void ConfigWizard::priv::load_vendors() std::map section_new; if (app_config->has_section(section_name)) { const std::map §ion_old = app_config->get_section(section_name); - for (const std::pair &material_name_and_installed : section_old) + for (const auto& 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; @@ -2250,7 +2248,7 @@ bool ConfigWizard::priv::check_and_install_missing_materials(Technology technolo 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 &preset : appconfig_presets) { + for (const auto& 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))) { diff --git a/src/slic3r/GUI/DoubleSlider.cpp b/src/slic3r/GUI/DoubleSlider.cpp index 8a2257274ed..fddb63e3e4b 100644 --- a/src/slic3r/GUI/DoubleSlider.cpp +++ b/src/slic3r/GUI/DoubleSlider.cpp @@ -160,6 +160,26 @@ void Control::msw_rescale() GetParent()->Layout(); } +void Control::sys_color_changed() +{ + m_bmp_add_tick_on .msw_rescale(); + m_bmp_add_tick_off.msw_rescale(); + m_bmp_del_tick_on .msw_rescale(); + m_bmp_del_tick_off.msw_rescale(); + m_tick_icon_dim = m_bmp_add_tick_on.GetBmpWidth(); + + m_bmp_one_layer_lock_on .msw_rescale(); + m_bmp_one_layer_lock_off .msw_rescale(); + m_bmp_one_layer_unlock_on .msw_rescale(); + m_bmp_one_layer_unlock_off.msw_rescale(); + m_lock_icon_dim = m_bmp_one_layer_lock_on.GetBmpWidth(); + + m_bmp_revert.msw_rescale(); + m_revert_icon_dim = m_bmp_revert.GetBmpWidth(); + m_bmp_cog.msw_rescale(); + m_cog_icon_dim = m_bmp_cog.GetBmpWidth(); +} + int Control::GetActiveValue() const { return m_selection == ssLower ? @@ -297,7 +317,7 @@ double Control::get_double_value(const SelectedSlider& selection) { if (m_values.empty() || m_lower_value<0) return 0.0; - if (m_values.size() <= m_higher_value) { + if (m_values.size() <= size_t(m_higher_value)) { correct_higher_value(); return m_values.back(); } @@ -601,7 +621,7 @@ static std::string short_and_splitted_time(const std::string& time) ::sprintf(buffer, "%dh%dm%ds", hours, minutes, seconds); else if (hours > 10 && minutes > 10 && seconds > 10) ::sprintf(buffer, "%dh\n%dm\n%ds", hours, minutes, seconds); - else if (minutes < 10 && seconds > 10 || minutes > 10 && seconds < 10) + else if ((minutes < 10 && seconds > 10) || (minutes > 10 && seconds < 10)) ::sprintf(buffer, "%dh\n%dm%ds", hours, minutes, seconds); else ::sprintf(buffer, "%dh%dm\n%ds", hours, minutes, seconds); @@ -619,15 +639,15 @@ static std::string short_and_splitted_time(const std::string& time) wxString Control::get_label(int tick, LabelType label_type/* = ltHeightWithLayer*/) const { - const int value = tick; + const size_t value = tick; if (m_label_koef == 1.0 && m_values.empty()) - return wxString::Format("%d", value); + return wxString::Format("%lu", static_cast(value)); if (value >= m_values.size()) return "ErrVal"; if (m_draw_mode == dmSequentialGCodeView) - return wxString::Format("%d", static_cast(m_values[value])); + return wxString::Format("%lu", static_cast(m_values[value])); else { if (label_type == ltEstimatedTime) { return (value < m_layers_times.size()) ? short_and_splitted_time(get_time_dhms(m_layers_times[value])) : ""; @@ -742,7 +762,7 @@ void Control::draw_ticks_pair(wxDC& dc, wxCoord pos, wxCoord mid, int tick_len) dc.DrawLine(mid - (mid_space + tick_len), pos, mid - mid_space, pos); is_horizontal() ? dc.DrawLine(pos, mid + (mid_space + tick_len), pos, mid + mid_space) : dc.DrawLine(mid + (mid_space + tick_len), pos, mid + mid_space, pos); -}; +} void Control::draw_ticks(wxDC& dc) { @@ -753,8 +773,8 @@ void Control::draw_ticks(wxDC& dc) int height, width; get_size(&width, &height); const wxCoord mid = is_horizontal() ? 0.5*height : 0.5*width; - for (auto tick : m_ticks.ticks) { - if (tick.tick >= m_values.size()) { + for (const TickCode& tick : m_ticks.ticks) { + if (size_t(tick.tick) >= m_values.size()) { // The case when OnPaint is called before m_ticks.ticks data are updated (specific for the vase mode) break; } @@ -907,7 +927,6 @@ void Control::Ruler::update(wxWindow* win, const std::vector& values, do auto end_it = count == 1 ? values.end() : values.begin() + lround(values.size() / count); while (pow < 3) { - int tick = 0; for (int istep : {1, 2, 5}) { double val = (double)istep * std::pow(10,pow); auto val_it = std::lower_bound(values.begin(), end_it, val - epsilon()); @@ -950,7 +969,7 @@ void Control::draw_ruler(wxDC& dc) dc.SetTextForeground(GREY_PEN.GetColour()); if (m_ruler.long_step < 0) - for (int tick = 1; tick < m_values.size(); tick++) { + for (size_t tick = 1; tick < m_values.size(); tick++) { wxCoord pos = get_position_from_value(tick); draw_ticks_pair(dc, pos, mid, 5); draw_tick_text(dc, wxPoint(mid, pos), tick); @@ -966,7 +985,7 @@ void Control::draw_ruler(wxDC& dc) } }; - double short_tick; + double short_tick = std::nan(""); int tick = 0; double value = 0.0; int sequence = 0; @@ -983,6 +1002,7 @@ void Control::draw_ruler(wxDC& dc) if (m_values[tick] < value) break; // short ticks from the last tick to the end of current sequence + assert(! std::isnan(short_tick)); draw_short_ticks(dc, short_tick, tick); sequence++; } @@ -1869,7 +1889,7 @@ void Control::show_cog_icon_context_menu() []() { return true; }, [this]() { return m_extra_style & wxSL_VALUE_LABEL; }, GUI::wxGetApp().plater()); append_submenu(&menu, ruler_mode_menu, wxID_ANY, _L("Ruler mode"), _L("Set ruler mode"), "", - [this]() { return true; }, this); + []() { return true; }, this); } if (m_mode == MultiAsSingle && m_draw_mode == dmRegular) diff --git a/src/slic3r/GUI/DoubleSlider.hpp b/src/slic3r/GUI/DoubleSlider.hpp index 56baef6cf20..0d90367c0aa 100644 --- a/src/slic3r/GUI/DoubleSlider.hpp +++ b/src/slic3r/GUI/DoubleSlider.hpp @@ -192,6 +192,7 @@ class Control : public wxControl ~Control() {} void msw_rescale(); + void sys_color_changed(); int GetMinValue() const { return m_min_value; } int GetMaxValue() const { return m_max_value; } diff --git a/src/slic3r/GUI/ExtraRenderers.cpp b/src/slic3r/GUI/ExtraRenderers.cpp index 27e2c122457..584896dd592 100644 --- a/src/slic3r/GUI/ExtraRenderers.cpp +++ b/src/slic3r/GUI/ExtraRenderers.cpp @@ -49,8 +49,7 @@ BitmapTextRenderer::~BitmapTextRenderer() { #ifdef SUPPORTS_MARKUP #ifdef wxHAS_GENERIC_DATAVIEWCTRL - if (m_markupText) - delete m_markupText; + delete m_markupText; #endif //wxHAS_GENERIC_DATAVIEWCTRL #endif // SUPPORTS_MARKUP } diff --git a/src/slic3r/GUI/Field.cpp b/src/slic3r/GUI/Field.cpp index ed99866b372..bbe565bb407 100644 --- a/src/slic3r/GUI/Field.cpp +++ b/src/slic3r/GUI/Field.cpp @@ -92,8 +92,8 @@ void Field::PostInitialize() { case coPercents: case coFloats: - case coStrings: - case coBools: + case coStrings: + case coBools: case coInts: { auto tag_pos = m_opt_id.find("#"); if (tag_pos != std::string::npos) @@ -111,7 +111,7 @@ void Field::PostInitialize() BUILD(); // For the mode, when settings are in non-modal dialog, neither dialog nor tabpanel doesn't receive wxEVT_KEY_UP event, when some field is selected. - // So, like a workaround check wxEVT_KEY_UP event for the Filed and switch between tabs if Ctrl+(1-4) was pressed + // So, like a workaround check wxEVT_KEY_UP event for the Filed and switch between tabs if Ctrl+(1-4) was pressed if (getWindow()) getWindow()->Bind(wxEVT_KEY_UP, [](wxKeyEvent& evt) { if ((evt.GetModifiers() & wxMOD_CONTROL) != 0) { @@ -135,7 +135,7 @@ void Field::PostInitialize() // tab panel should be focused for correct navigation between tabs wxGetApp().tab_panel()->SetFocus(); } - + evt.Skip(); }); } @@ -148,7 +148,7 @@ int Field::def_width_thinner() { return 4; } void Field::on_kill_focus() { // call the registered function if it is available - if (m_on_kill_focus!=nullptr) + if (m_on_kill_focus!=nullptr) m_on_kill_focus(m_opt_id); } @@ -157,7 +157,7 @@ void Field::on_set_focus(wxEvent& event) // to allow the default behavior event.Skip(); // call the registered function if it is available - if (m_on_set_focus!=nullptr) + if (m_on_set_focus!=nullptr) m_on_set_focus(m_opt_id); } @@ -196,7 +196,7 @@ wxString Field::get_tooltip_text(const wxString& default_string) if (tooltip.length() > 0) tooltip_text = tooltip + "\n" + _(L("default value")) + "\t: " + (boost::iends_with(opt_id, "_gcode") ? "\n" : "") + default_string + - (boost::iends_with(opt_id, "_gcode") ? "" : "\n") + + (boost::iends_with(opt_id, "_gcode") ? "" : "\n") + _(L("parameter name")) + "\t: " + opt_id; return tooltip_text; @@ -220,7 +220,7 @@ void Field::get_value_by_opt_type(wxString& str, const bool check_value/* = true case coPercents: case coFloats: case coFloat:{ - if (m_opt.type == coPercent && !str.IsEmpty() && str.Last() == '%') + if (m_opt.type == coPercent && !str.IsEmpty() && str.Last() == '%') str.RemoveLast(); else if (!str.IsEmpty() && str.Last() == '%') { @@ -332,7 +332,7 @@ void Field::get_value_by_opt_type(wxString& str, const bool check_value/* = true set_value(stVal, false); // it's no needed but can be helpful, when inputted value contained "," instead of "." } } - + m_value = std::string(str.ToUTF8().data()); break; } @@ -359,8 +359,8 @@ void Field::get_value_by_opt_type(wxString& str, const bool check_value/* = true out_of_range_val = true; break; } - } - } + } + } invalid_val = true; break; } @@ -413,7 +413,7 @@ void TextCtrl::BUILD() { if (m_opt.height >= 0) size.SetHeight(m_opt.height*m_em_unit); if (m_opt.width >= 0) size.SetWidth(m_opt.width*m_em_unit); - wxString text_value = wxString(""); + wxString text_value = wxString(""); switch (m_opt.type) { case coFloatOrPercent: @@ -428,21 +428,21 @@ void TextCtrl::BUILD() { text_value = wxString::Format(_T("%i"), int(m_opt.default_value->getFloat())); text_value += "%"; break; - } + } case coPercents: case coFloats: case coFloat: { double val = m_opt.type == coFloats ? m_opt.get_default_value()->get_at(m_opt_idx) : - m_opt.type == coFloat ? + m_opt.type == coFloat ? m_opt.default_value->getFloat() : m_opt.get_default_value()->get_at(m_opt_idx); text_value = double_to_string(val); m_last_meaningful_value = text_value; break; } - case coString: + case coString: text_value = m_opt.get_default_value()->value; break; case coStrings: @@ -456,7 +456,7 @@ void TextCtrl::BUILD() { text_value = get_thumbnails_string(m_opt.get_default_value()->values); break; default: - break; + break; } const long style = m_opt.multiline ? wxTE_MULTILINE : wxTE_PROCESS_ENTER/*0*/; @@ -490,7 +490,7 @@ void TextCtrl::BUILD() { } temp->Bind(wxEVT_SET_FOCUS, ([this](wxEvent& e) { on_set_focus(e); }), temp->GetId()); - + temp->Bind(wxEVT_LEFT_DOWN, ([temp](wxEvent& event) { //! to allow the default handling @@ -508,7 +508,7 @@ void TextCtrl::BUILD() { { e.Skip(); #ifdef __WXOSX__ - // OSX issue: For some unknown reason wxEVT_KILL_FOCUS is emitted twice in a row in some cases + // OSX issue: For some unknown reason wxEVT_KILL_FOCUS is emitted twice in a row in some cases // (like when information dialog is shown during an update of the option value) // Thus, suppress its second call if (bKilledFocus) @@ -539,7 +539,7 @@ void TextCtrl::BUILD() { */ // recast as a wxWindow to fit the calling convention window = dynamic_cast(temp); -} +} bool TextCtrl::value_was_changed() { @@ -559,7 +559,7 @@ bool TextCtrl::value_was_changed() case coPercents: case coFloats: case coFloat: { - if (m_opt.nullable && std::isnan(boost::any_cast(m_value)) && + if (m_opt.nullable && std::isnan(boost::any_cast(m_value)) && std::isnan(boost::any_cast(val))) return false; return boost::any_cast(m_value) != boost::any_cast(val); @@ -597,9 +597,9 @@ void TextCtrl::set_value(const boost::any& value, bool change_event/* = false*/) if (!change_event) { wxString ret_str = static_cast(window)->GetValue(); - /* Update m_value to correct work of next value_was_changed(). - * But after checking of entered value, don't fix the "incorrect" value and don't show a warning message, - * just clear m_value in this case. + /* Update m_value to correct work of next value_was_changed(). + * But after checking of entered value, don't fix the "incorrect" value and don't show a warning message, + * just clear m_value in this case. */ get_value_by_opt_type(ret_str, false); } @@ -631,7 +631,7 @@ void TextCtrl::msw_rescale() Field::msw_rescale(); auto size = wxSize(def_width() * m_em_unit, wxDefaultCoord); - if (m_opt.height >= 0) + if (m_opt.height >= 0) size.SetHeight(m_opt.height*m_em_unit); else if (parent_is_custom_ctrl && opt_height > 0) size.SetHeight(lround(opt_height*m_em_unit)); @@ -665,15 +665,15 @@ void CheckBox::BUILD() { if (m_opt.height >= 0) size.SetHeight(m_opt.height*m_em_unit); if (m_opt.width >= 0) size.SetWidth(m_opt.width*m_em_unit); - bool check_value = m_opt.type == coBool ? - m_opt.default_value->getBool() : m_opt.type == coBools ? - m_opt.get_default_value()->get_at(m_opt_idx) : + bool check_value = m_opt.type == coBool ? + m_opt.default_value->getBool() : m_opt.type == coBools ? + m_opt.get_default_value()->get_at(m_opt_idx) : false; m_last_meaningful_value = static_cast(check_value); - // Set Label as a string of at least one space simbol to correct system scaling of a CheckBox - auto temp = new wxCheckBox(m_parent, wxID_ANY, wxString(" "), wxDefaultPosition, size); + // Set Label as a string of at least one space simbol to correct system scaling of a CheckBox + auto temp = new wxCheckBox(m_parent, wxID_ANY, wxString(" "), wxDefaultPosition, size); temp->SetFont(Slic3r::GUI::wxGetApp().normal_font()); if (!wxOSX) temp->SetBackgroundStyle(wxBG_STYLE_PAINT); temp->SetValue(check_value); @@ -684,7 +684,7 @@ void CheckBox::BUILD() { on_change_field(); }), temp->GetId()); - temp->SetToolTip(get_tooltip_text(check_value ? "true" : "false")); + temp->SetToolTip(get_tooltip_text(check_value ? "true" : "false")); // recast as a wxWindow to fit the calling convention window = dynamic_cast(temp); @@ -770,14 +770,14 @@ void SpinCtrl::BUILD() { break; } - const int min_val = m_opt.min == INT_MIN + const int min_val = m_opt.min == INT_MIN #ifdef __WXOSX__ - // We will forcibly set the input value for SpinControl, since the value + // We will forcibly set the input value for SpinControl, since the value // inserted from the keyboard is not updated under OSX. // So, we can't set min control value bigger then 0. - // Otherwise, it couldn't be possible to input from keyboard value + // Otherwise, it couldn't be possible to input from keyboard value // less then min_val. - || m_opt.min > 0 + || m_opt.min > 0 #endif ? 0 : m_opt.min; const int max_val = m_opt.max < 2147483647 ? m_opt.max : 2147483647; @@ -813,8 +813,8 @@ void SpinCtrl::BUILD() { propagate_value(); })); - temp->Bind(wxEVT_SPINCTRL, ([this](wxCommandEvent e) { propagate_value(); }), temp->GetId()); - + temp->Bind(wxEVT_SPINCTRL, ([this](wxCommandEvent e) { propagate_value(); }), temp->GetId()); + temp->Bind(wxEVT_TEXT_ENTER, ([this](wxCommandEvent e) { e.Skip(); @@ -835,7 +835,7 @@ void SpinCtrl::BUILD() { tmp_value = parsed && value >= INT_MIN && value <= INT_MAX ? (int)value : UNDEF_VALUE; #ifdef __WXOSX__ - // Forcibly set the input value for SpinControl, since the value + // Forcibly set the input value for SpinControl, since the value // inserted from the keyboard or clipboard is not updated under OSX if (tmp_value != UNDEF_VALUE) { wxSpinCtrl* spin = static_cast(window); @@ -847,7 +847,7 @@ void SpinCtrl::BUILD() { } #endif }), temp->GetId()); - + temp->SetToolTip(get_tooltip_text(text_value)); // recast as a wxWindow to fit the calling convention @@ -888,6 +888,7 @@ void SpinCtrl::msw_rescale() } #ifdef __WXOSX__ +static_assert(wxMAJOR_VERSION >= 3, "Use of wxBitmapComboBox on Settings Tabs requires wxWidgets 3.0 and newer"); using choice_ctrl = wxBitmapComboBox; #else using choice_ctrl = wxComboBox; @@ -898,7 +899,7 @@ void Choice::BUILD() { if (m_opt.height >= 0) size.SetHeight(m_opt.height*m_em_unit); if (m_opt.width >= 0) size.SetWidth(m_opt.width*m_em_unit); - choice_ctrl* temp; + choice_ctrl* temp; if (!m_opt.gui_type.empty() && m_opt.gui_type.compare("select_open") != 0) { m_is_editable = true; temp = new choice_ctrl(m_parent, wxID_ANY, wxString(""), wxDefaultPosition, size); @@ -942,22 +943,6 @@ void Choice::BUILD() { set_selection(); } -#ifdef __WXOSX__ -//#ifndef __WXGTK__ - /* Workaround for a correct rendering of the control without Bitmap (under MSW and OSX): - * - * 1. We should create small Bitmap to fill Bitmaps RefData, - * ! in this case wxBitmap.IsOK() return true. - * 2. But then set width to 0 value for no using of bitmap left and right spacing - * 3. Set this empty bitmap to the at list one item and BitmapCombobox will be recreated correct - * - * Note: Set bitmap height to the Font size because of OSX rendering. - */ - wxBitmap empty_bmp(1, temp->GetFont().GetPixelSize().y + 2); - empty_bmp.SetWidth(0); - temp->SetItemBitmap(0, empty_bmp); -#endif - temp->Bind(wxEVT_MOUSEWHEEL, [this](wxMouseEvent& e) { if (m_suppress_scroll && !m_is_dropped) e.StopPropagation(); @@ -1043,7 +1028,7 @@ void Choice::set_selection() } if (!text_value.IsEmpty()) { - int idx = 0; + size_t idx = 0; for (auto el : m_opt.enum_values) { if (el == text_value) break; @@ -1066,10 +1051,10 @@ void Choice::set_value(const std::string& value, bool change_event) //! Redunda } choice_ctrl* field = dynamic_cast(window); - idx == m_opt.enum_values.size() ? + idx == m_opt.enum_values.size() ? field->SetValue(value) : field->SetSelection(idx); - + m_disable_change_event = false; } @@ -1087,7 +1072,7 @@ void Choice::set_value(const boost::any& value, bool change_event) case coString: case coStrings: { wxString text_value; - if (m_opt.type == coInt) + if (m_opt.type == coInt) text_value = wxString::Format(_T("%i"), int(boost::any_cast(value))); else text_value = boost::any_cast(value); @@ -1115,7 +1100,7 @@ void Choice::set_value(const boost::any& value, bool change_event) { if (!m_opt.enum_values.empty()) { std::string key; - t_config_enum_values map_names = ConfigOptionEnum::get_enum_values(); + t_config_enum_values map_names = ConfigOptionEnum::get_enum_values(); for (auto it : map_names) { if (val == it.second) { key = it.first; @@ -1190,7 +1175,7 @@ boost::any& Choice::get_value() { choice_ctrl* field = dynamic_cast(window); - wxString ret_str = field->GetValue(); + wxString ret_str = field->GetValue(); // options from right panel std::vector right_panel_options{ "support", "pad", "scale_unit" }; @@ -1200,7 +1185,7 @@ boost::any& Choice::get_value() if (m_opt.type == coEnum) { - int ret_enum = field->GetSelection(); + int ret_enum = field->GetSelection(); if (m_opt_id == "top_fill_pattern" || m_opt_id == "bottom_fill_pattern" || m_opt_id == "fill_pattern") { if (!m_opt.enum_values.empty()) { @@ -1215,6 +1200,10 @@ boost::any& Choice::get_value() } else if (m_opt_id.compare("ironing_type") == 0) m_value = static_cast(ret_enum); + else if (m_opt_id.compare("fuzzy_skin_perimeter_mode") == 0) + m_value = static_cast(ret_enum); +// else if (m_opt_id.compare("fuzzy_skin_shape") == 0) +// m_value = static_cast(ret_enum); else if (m_opt_id.compare("gcode_flavor") == 0) m_value = static_cast(ret_enum); else if (m_opt_id.compare("machine_limits_usage") == 0) @@ -1231,8 +1220,11 @@ boost::any& Choice::get_value() m_value = static_cast(ret_enum); else if (m_opt_id == "printhost_authorization_type") m_value = static_cast(ret_enum); - else if (m_opt_id == "raft_size_adjust") - m_value = static_cast(ret_enum); + else if (m_opt_id == "brim_type") + m_value = static_cast(ret_enum); + else if (m_opt_id == "raft_size_adjust") + m_value = static_cast(ret_enum); + } else if (m_opt.gui_type == "f_enum_open") { const int ret_enum = field->GetSelection(); @@ -1245,7 +1237,7 @@ boost::any& Choice::get_value() else m_value = atof(m_opt.enum_values[ret_enum].c_str()); } - else + else // modifies ret_string! get_value_by_opt_type(ret_str); @@ -1263,8 +1255,8 @@ void Choice::msw_rescale() #ifdef __WXOSX__ const wxString selection = field->GetValue();// field->GetString(index); - /* To correct scaling (set new controll size) of a wxBitmapCombobox - * we need to refill control with new bitmaps. So, in our case : + /* To correct scaling (set new controll size) of a wxBitmapCombobox + * we need to refill control with new bitmaps. So, in our case : * 1. clear control * 2. add content * 3. add scaled "empty" bitmap to the at least one item @@ -1272,7 +1264,7 @@ void Choice::msw_rescale() field->Clear(); wxSize size(wxDefaultSize); size.SetWidth((m_opt.width > 0 ? m_opt.width : def_width_wider()) * m_em_unit); - + // Set rescaled min height to correct layout field->SetMinSize(wxSize(-1, int(1.5f*field->GetFont().GetPixelSize().y + 0.5f))); // Set rescaled size @@ -1291,10 +1283,6 @@ void Choice::msw_rescale() } } - wxBitmap empty_bmp(1, field->GetFont().GetPixelSize().y + 2); - empty_bmp.SetWidth(0); - field->SetItemBitmap(0, empty_bmp); - idx == m_opt.enum_values.size() ? field->SetValue(selection) : field->SetSelection(idx); @@ -1388,11 +1376,11 @@ void ColourPicker::msw_rescale() wxColourPickerCtrl* field = dynamic_cast(window); auto size = wxSize(def_width() * m_em_unit, wxDefaultCoord); - if (m_opt.height >= 0) + if (m_opt.height >= 0) size.SetHeight(m_opt.height * m_em_unit); else if (parent_is_custom_ctrl && opt_height > 0) size.SetHeight(lround(opt_height * m_em_unit)); - if (m_opt.width >= 0) size.SetWidth(m_opt.width * m_em_unit); + if (m_opt.width >= 0) size.SetWidth(m_opt.width * m_em_unit); if (parent_is_custom_ctrl) field->SetSize(size); else @@ -1419,7 +1407,7 @@ void PointCtrl::BUILD() if (parent_is_custom_ctrl && m_opt.height < 0) opt_height = (double)x_textctrl->GetSize().GetHeight() / m_em_unit; - x_textctrl->SetFont(Slic3r::GUI::wxGetApp().normal_font()); + x_textctrl->SetFont(Slic3r::GUI::wxGetApp().normal_font()); x_textctrl->SetBackgroundStyle(wxBG_STYLE_PAINT); y_textctrl->SetFont(Slic3r::GUI::wxGetApp().normal_font()); y_textctrl->SetBackgroundStyle(wxBG_STYLE_PAINT); @@ -1524,7 +1512,7 @@ boost::any& PointCtrl::get_value() else if (m_opt.min > x || x > m_opt.max || m_opt.min > y || y > m_opt.max) - { + { if (m_opt.min > x) x = m_opt.min; if (x > m_opt.max) x = m_opt.max; if (m_opt.min > y) y = m_opt.min; @@ -1590,7 +1578,7 @@ void SliderCtrl::BUILD() m_slider->SetBackgroundStyle(wxBG_STYLE_PAINT); wxSize field_size(40, -1); - m_textctrl = new wxTextCtrl(m_parent, wxID_ANY, wxString::Format("%d", m_slider->GetValue()/m_scale), + m_textctrl = new wxTextCtrl(m_parent, wxID_ANY, wxString::Format("%d", m_slider->GetValue()/m_scale), wxDefaultPosition, field_size); m_textctrl->SetFont(Slic3r::GUI::wxGetApp().normal_font()); m_textctrl->SetBackgroundStyle(wxBG_STYLE_PAINT); @@ -1640,5 +1628,3 @@ boost::any& SliderCtrl::get_value() } // GUI } // Slic3r - - diff --git a/src/slic3r/GUI/Field.hpp b/src/slic3r/GUI/Field.hpp index 5b01c92c954..1b350324129 100644 --- a/src/slic3r/GUI/Field.hpp +++ b/src/slic3r/GUI/Field.hpp @@ -113,8 +113,8 @@ class Field { void field_changed() { on_change_field(); } - Field(const ConfigOptionDef& opt, const t_config_option_key& id) : m_opt(opt), m_opt_id(id) {}; - Field(wxWindow* parent, const ConfigOptionDef& opt, const t_config_option_key& id) : m_parent(parent), m_opt(opt), m_opt_id(id) {}; + Field(const ConfigOptionDef& opt, const t_config_option_key& id) : m_opt(opt), m_opt_id(id) {} + Field(wxWindow* parent, const ConfigOptionDef& opt, const t_config_option_key& id) : m_parent(parent), m_opt(opt), m_opt_id(id) {} virtual ~Field(); /// If you don't know what you are getting back, check both methods for nullptr. @@ -315,12 +315,12 @@ class SpinCtrl : public Field { /// Propagate value from field to the OptionGroupe and Config after kill_focus/ENTER void propagate_value() ; - void set_value(const std::string& value, bool change_event = false) { + void set_value(const std::string& value, bool change_event = false) { m_disable_change_event = !change_event; dynamic_cast(window)->SetValue(value); m_disable_change_event = false; - } - void set_value(const boost::any& value, bool change_event = false) { + } + void set_value(const boost::any& value, bool change_event = false) override { m_disable_change_event = !change_event; tmp_value = boost::any_cast(value); m_value = value; @@ -395,8 +395,8 @@ class ColourPicker : public Field { boost::any& get_value() override; void msw_rescale() override; - void enable() override { dynamic_cast(window)->Enable(); }; - void disable() override{ dynamic_cast(window)->Disable(); }; + void enable() override { dynamic_cast(window)->Enable(); } + void disable() override{ dynamic_cast(window)->Disable(); } wxWindow* getWindow() override { return window; } }; @@ -456,8 +456,8 @@ class StaticText : public Field { void msw_rescale() override; - void enable() override { dynamic_cast(window)->Enable(); }; - void disable() override{ dynamic_cast(window)->Disable(); }; + void enable() override { dynamic_cast(window)->Enable(); } + void disable() override{ dynamic_cast(window)->Disable(); } wxWindow* getWindow() override { return window; } }; diff --git a/src/slic3r/GUI/FirmwareDialog.cpp b/src/slic3r/GUI/FirmwareDialog.cpp index 879e7fe34ef..6927a03302a 100644 --- a/src/slic3r/GUI/FirmwareDialog.cpp +++ b/src/slic3r/GUI/FirmwareDialog.cpp @@ -648,7 +648,7 @@ void FirmwareDialog::priv::perform_upload() } } }) - .on_message(std::move([q, extra_verbose](const char *msg, unsigned /* size */) { + .on_message([q](const char *msg, unsigned /* size */) { if (extra_verbose) { BOOST_LOG_TRIVIAL(debug) << "avrdude: " << msg; } @@ -665,19 +665,19 @@ void FirmwareDialog::priv::perform_upload() evt->SetExtraLong(AE_MESSAGE); evt->SetString(std::move(wxmsg)); wxQueueEvent(q, evt); - })) - .on_progress(std::move([q](const char * /* task */, unsigned progress) { + }) + .on_progress([q](const char * /* task */, unsigned progress) { auto evt = new wxCommandEvent(EVT_AVRDUDE, q->GetId()); evt->SetExtraLong(AE_PROGRESS); evt->SetInt(progress); wxQueueEvent(q, evt); - })) - .on_complete(std::move([this]() { + }) + .on_complete([this]() { auto evt = new wxCommandEvent(EVT_AVRDUDE, this->q->GetId()); evt->SetExtraLong(AE_EXIT); evt->SetInt(this->avrdude->exit_code()); wxQueueEvent(this->q, evt); - })) + }) .run(); } diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 0af10270e2d..48428b4eee7 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -79,6 +79,18 @@ static float round_to_nearest(float value, unsigned int decimals) return res; } +#if ENABLE_SPLITTED_VERTEX_BUFFER +void GCodeViewer::VBuffer::reset() +{ + // release gpu memory + if (!vbos.empty()) { + glsafe(::glDeleteBuffers(static_cast(vbos.size()), static_cast(vbos.data()))); + vbos.clear(); + } + sizes.clear(); + count = 0; +} +#else void GCodeViewer::VBuffer::reset() { // release gpu memory @@ -89,15 +101,27 @@ void GCodeViewer::VBuffer::reset() count = 0; } +#endif // ENABLE_SPLITTED_VERTEX_BUFFER void GCodeViewer::IBuffer::reset() { +#if ENABLE_SPLITTED_VERTEX_BUFFER + // release gpu memory + if (ibo > 0) { + glsafe(::glDeleteBuffers(1, &ibo)); + ibo = 0; + } +#else // release gpu memory if (id > 0) { glsafe(::glDeleteBuffers(1, &id)); id = 0; } +#endif // ENABLE_SPLITTED_VERTEX_BUFFER +#if ENABLE_SPLITTED_VERTEX_BUFFER + vbo = 0; +#endif // ENABLE_SPLITTED_VERTEX_BUFFER count = 0; } @@ -119,6 +143,19 @@ bool GCodeViewer::Path::matches(const GCodeProcessor::MoveVertex& move) const case EMoveType::Unretract: case EMoveType::Extrude: { // use rounding to reduce the number of generated paths +#if ENABLE_SPLITTED_VERTEX_BUFFER +#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE + return type == move.type && extruder_id == move.extruder_id && cp_color_id == move.cp_color_id && role == move.extrusion_role && + move.position[2] <= sub_paths.front().first.position[2] && feedrate == move.feedrate && fan_speed == move.fan_speed && + height == round_to_nearest(move.height, 2) && width == round_to_nearest(move.width, 2) && + matches_percent(volumetric_rate, move.volumetric_rate(), 0.05f); +#else + return type == move.type && move.position[2] <= sub_paths.front().position[2] && role == move.extrusion_role && height == round_to_nearest(move.height, 2) && + width == round_to_nearest(move.width, 2) && feedrate == move.feedrate && fan_speed == move.fan_speed && + volumetric_rate == round_to_nearest(move.volumetric_rate(), 2) && extruder_id == move.extruder_id && + cp_color_id == move.cp_color_id; +#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE +#else #if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE return type == move.type && extruder_id == move.extruder_id && cp_color_id == move.cp_color_id && role == move.extrusion_role && move.position[2] <= first.position[2] && feedrate == move.feedrate && fan_speed == move.fan_speed && @@ -130,6 +167,7 @@ bool GCodeViewer::Path::matches(const GCodeProcessor::MoveVertex& move) const volumetric_rate == round_to_nearest(move.volumetric_rate(), 2) && extruder_id == move.extruder_id && cp_color_id == move.cp_color_id; #endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE +#endif // ENABLE_SPLITTED_VERTEX_BUFFER } case EMoveType::Travel: { return type == move.type && feedrate == move.feedrate && extruder_id == move.extruder_id && cp_color_id == move.cp_color_id; @@ -156,6 +194,17 @@ void GCodeViewer::TBuffer::add_path(const GCodeProcessor::MoveVertex& move, unsi { Path::Endpoint endpoint = { b_id, i_id, s_id, move.position }; // use rounding to reduce the number of generated paths +#if ENABLE_SPLITTED_VERTEX_BUFFER +#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE + paths.push_back({ move.type, move.extrusion_role, move.delta_extruder, + round_to_nearest(move.height, 2), round_to_nearest(move.width, 2), move.feedrate, move.fan_speed, + move.volumetric_rate(), move.extruder_id, move.cp_color_id, { { endpoint, endpoint } } }); +#else + paths.push_back({ move.type, move.extrusion_role, move.delta_extruder, + round_to_nearest(move.height, 2), round_to_nearest(move.width, 2), move.feedrate, move.fan_speed, + round_to_nearest(move.volumetric_rate(), 2), move.extruder_id, move.cp_color_id, { { endpoint, endpoint } } }); +#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE +#else #if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE paths.push_back({ move.type, move.extrusion_role, endpoint, endpoint, move.delta_extruder, round_to_nearest(move.height, 2), round_to_nearest(move.width, 2), move.feedrate, move.fan_speed, @@ -165,6 +214,7 @@ void GCodeViewer::TBuffer::add_path(const GCodeProcessor::MoveVertex& move, unsi round_to_nearest(move.height, 2), round_to_nearest(move.width, 2), move.feedrate, move.fan_speed, round_to_nearest(move.volumetric_rate(), 2), move.extruder_id, move.cp_color_id }); #endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE +#endif // ENABLE_SPLITTED_VERTEX_BUFFER } GCodeViewer::Color GCodeViewer::Extrusions::Range::get_color_at(float value) const @@ -190,6 +240,23 @@ GCodeViewer::Color GCodeViewer::Extrusions::Range::get_color_at(float value) con return ret; } +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS +GCodeViewer::SequentialRangeCap::~SequentialRangeCap() { + if (ibo > 0) + glsafe(::glDeleteBuffers(1, &ibo)); +} + +void GCodeViewer::SequentialRangeCap::reset() { + if (ibo > 0) + glsafe(::glDeleteBuffers(1, &ibo)); + + buffer = nullptr; + ibo = 0; + vbo = 0; + color = { 0.0f, 0.0f, 0.0f }; +} +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + void GCodeViewer::SequentialView::Marker::init() { m_model.init_from(stilized_arrow(16, 2.0f, 4.0f, 1.0f, 8.0f)); @@ -306,10 +373,45 @@ const std::vector GCodeViewer::Range_Colors {{ { 0.581f, 0.149f, 0.087f } // reddish }}; -void GCodeViewer::load(const GCodeProcessor::Result& gcode_result, const Print& print, bool initialized) +GCodeViewer::GCodeViewer() { - init(); + // initializes non OpenGL data of TBuffers + // OpenGL data are initialized into render().init_gl_data() + for (size_t i = 0; i < m_buffers.size(); ++i) { + TBuffer& buffer = m_buffers[i]; + switch (buffer_type(i)) + { + default: { break; } + case EMoveType::Tool_change: + case EMoveType::Color_change: + case EMoveType::Pause_Print: + case EMoveType::Custom_GCode: + case EMoveType::Retract: + case EMoveType::Unretract: { + buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::Point; + buffer.vertices.format = VBuffer::EFormat::Position; + break; + } + case EMoveType::Wipe: + case EMoveType::Extrude: { + buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::Triangle; + buffer.vertices.format = VBuffer::EFormat::PositionNormal3; + break; + } + case EMoveType::Travel: { + buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::Line; + buffer.vertices.format = VBuffer::EFormat::PositionNormal1; + break; + } + } + } + + set_toolpath_move_type_visible(EMoveType::Extrude, true); +// m_sequential_view.skip_invisible_moves = true; +} +void GCodeViewer::load(const GCodeProcessor::Result& gcode_result, const Print& print, bool initialized) +{ // avoid processing if called with the same gcode_result if (m_last_result_id == gcode_result.id) return; @@ -320,6 +422,7 @@ void GCodeViewer::load(const GCodeProcessor::Result& gcode_result, const Print& reset(); load_toolpaths(gcode_result); + if (m_layers.empty()) return; @@ -460,9 +563,6 @@ void GCodeViewer::update_shells_color_by_extruder(const DynamicPrintConfig* conf void GCodeViewer::reset() { - m_initialized = false; - m_gl_data_initialized = false; - m_moves_count = 0; for (TBuffer& buffer : m_buffers) { buffer.reset(); @@ -491,8 +591,9 @@ void GCodeViewer::render() const auto init_gl_data = [this]() { // initializes opengl data of TBuffers for (size_t i = 0; i < m_buffers.size(); ++i) { - TBuffer& buffer = m_buffers[i]; - switch (buffer_type(i)) { + TBuffer& buffer = const_cast(m_buffers[i]); + switch (buffer_type(i)) + { default: { break; } case EMoveType::Tool_change: case EMoveType::Color_change: @@ -516,17 +617,17 @@ void GCodeViewer::render() const } // initializes tool marker - m_sequential_view.marker.init(); + const_cast(&m_sequential_view)->marker.init(); // initializes point sizes std::array point_sizes; ::glGetIntegerv(GL_ALIASED_POINT_SIZE_RANGE, point_sizes.data()); - m_detected_point_sizes = { static_cast(point_sizes[0]), static_cast(point_sizes[1]) }; - m_gl_data_initialized = true; + *const_cast*>(&m_detected_point_sizes) = { static_cast(point_sizes[0]), static_cast(point_sizes[1]) }; + *const_cast(&m_gl_data_initialized) = true; }; #if ENABLE_GCODE_VIEWER_STATISTICS - m_statistics.reset_opengl(); + const_cast(&m_statistics)->reset_opengl(); #endif // ENABLE_GCODE_VIEWER_STATISTICS // OpenGL data must be initialized after the glContext has been created. @@ -539,9 +640,10 @@ void GCodeViewer::render() const glsafe(::glEnable(GL_DEPTH_TEST)); render_toolpaths(); - if (m_sequential_view.current.last != m_sequential_view.endpoints.last) { - m_sequential_view.marker.set_world_position(m_sequential_view.current_position); - m_sequential_view.marker.render(); + SequentialView* sequential_view = const_cast(&m_sequential_view); + if (sequential_view->current.last != sequential_view->endpoints.last) { + sequential_view->marker.set_world_position(sequential_view->current_position); + sequential_view->marker.render(); } render_shells(); render_legend(); @@ -550,14 +652,25 @@ void GCodeViewer::render() const #endif // ENABLE_GCODE_VIEWER_STATISTICS } +#if ENABLE_SPLITTED_VERTEX_BUFFER +bool GCodeViewer::can_export_toolpaths() const +{ + return has_data() && m_buffers[buffer_id(EMoveType::Extrude)].render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle; +} +#endif // ENABLE_SPLITTED_VERTEX_BUFFER + void GCodeViewer::update_sequential_view_current(unsigned int first, unsigned int last) { auto is_visible = [this](unsigned int id) { for (const TBuffer& buffer : m_buffers) { if (buffer.visible) { for (const Path& path : buffer.paths) { +#if ENABLE_SPLITTED_VERTEX_BUFFER + if (path.sub_paths.front().first.s_id <= id && id <= path.sub_paths.back().last.s_id) +#else if (path.first.s_id <= id && id <= path.last.s_id) - return true; +#endif // ENABLE_SPLITTED_VERTEX_BUFFER + return true; } } } @@ -669,15 +782,24 @@ void GCodeViewer::export_toolpaths_to_obj(const char* filename) const wxBusyCursor busy; // the data needed is contained into the Extrude TBuffer - const TBuffer& buffer = m_buffers[buffer_id(EMoveType::Extrude)]; - if (!buffer.has_data()) + const TBuffer& t_buffer = m_buffers[buffer_id(EMoveType::Extrude)]; + if (!t_buffer.has_data()) return; +#if ENABLE_SPLITTED_VERTEX_BUFFER + if (t_buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::Triangle) + return; +#endif // ENABLE_SPLITTED_VERTEX_BUFFER + // collect color information to generate materials std::vector colors; - for (const RenderPath& path : buffer.render_paths) { + for (const RenderPath& path : t_buffer.render_paths) { colors.push_back(path.color); } +#if ENABLE_SPLITTED_VERTEX_BUFFER + std::sort(colors.begin(), colors.end()); + colors.erase(std::unique(colors.begin(), colors.end()), colors.end()); +#endif // ENABLE_SPLITTED_VERTEX_BUFFER // save materials file boost::filesystem::path mat_filename(filename); @@ -689,13 +811,13 @@ void GCodeViewer::export_toolpaths_to_obj(const char* filename) const } fprintf(fp, "# G-Code Toolpaths Materials\n"); - fprintf(fp, "# Generated by %s based on Slic3r\n", SLIC3R_BUILD_ID); + fprintf(fp, "# Generated by %s-%s based on Slic3r\n", SLIC3R_APP_NAME, SLIC3R_VERSION); unsigned int colors_count = 1; for (const Color& color : colors) { fprintf(fp, "\nnewmtl material_%d\n", colors_count++); fprintf(fp, "Ka 1 1 1\n"); - fprintf(fp, "Kd %f %f %f\n", color[0], color[1], color[2]); + fprintf(fp, "Kd %g %g %g\n", color[0], color[1], color[2]); fprintf(fp, "Ks 0 0 0\n"); } @@ -709,21 +831,108 @@ void GCodeViewer::export_toolpaths_to_obj(const char* filename) const } fprintf(fp, "# G-Code Toolpaths\n"); - fprintf(fp, "# Generated by %s based on Slic3r\n", SLIC3R_BUILD_ID); + fprintf(fp, "# Generated by %s-%s based on Slic3r\n", SLIC3R_APP_NAME, SLIC3R_VERSION); fprintf(fp, "\nmtllib ./%s\n", mat_filename.filename().string().c_str()); +#if ENABLE_SPLITTED_VERTEX_BUFFER + const size_t floats_per_vertex = t_buffer.vertices.vertex_size_floats(); + + std::vector out_vertices; + std::vector out_normals; + + struct VerticesOffset + { + unsigned int vbo; + size_t offset; + }; + std::vector vertices_offsets; + vertices_offsets.push_back({ t_buffer.vertices.vbos.front(), 0 }); + + // get vertices/normals data from vertex buffers on gpu + for (size_t i = 0; i < t_buffer.vertices.vbos.size(); ++i) { + const size_t floats_count = t_buffer.vertices.sizes[i] / sizeof(float); + VertexBuffer vertices(floats_count); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, t_buffer.vertices.vbos[i])); + glsafe(::glGetBufferSubData(GL_ARRAY_BUFFER, 0, static_cast(t_buffer.vertices.sizes[i]), static_cast(vertices.data()))); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); + const size_t vertices_count = floats_count / floats_per_vertex; + for (size_t j = 0; j < vertices_count; ++j) { + const size_t base = j * floats_per_vertex; + out_vertices.push_back({ vertices[base + 0], vertices[base + 1], vertices[base + 2] }); + out_normals.push_back({ vertices[base + 3], vertices[base + 4], vertices[base + 5] }); + } + + if (i < t_buffer.vertices.vbos.size() - 1) + vertices_offsets.push_back({ t_buffer.vertices.vbos[i + 1], vertices_offsets.back().offset + vertices_count }); + } + + // save vertices to file + fprintf(fp, "\n# vertices\n"); + for (const Vec3f& v : out_vertices) { + fprintf(fp, "v %g %g %g\n", v[0], v[1], v[2]); + } + + // save normals to file + fprintf(fp, "\n# normals\n"); + for (const Vec3f& n : out_normals) { + fprintf(fp, "vn %g %g %g\n", n[0], n[1], n[2]); + } + + size_t i = 0; + for (const Color& color : colors) { + // save material triangles to file + fprintf(fp, "\nusemtl material_%zu\n", i + 1); + fprintf(fp, "# triangles material %zu\n", i + 1); + + for (const RenderPath& render_path : t_buffer.render_paths) { + if (render_path.color != color) + continue; + + const IBuffer& ibuffer = t_buffer.indices[render_path.index_buffer_id]; + size_t vertices_offset = 0; + for (size_t j = 0; j < vertices_offsets.size(); ++j) { + const VerticesOffset& offset = vertices_offsets[j]; + if (offset.vbo == ibuffer.vbo) { + vertices_offset = offset.offset; + break; + } + } + + // get indices data from index buffer on gpu + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibuffer.ibo)); + for (size_t j = 0; j < render_path.sizes.size(); ++j) { + IndexBuffer indices(render_path.sizes[j]); + glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast(render_path.offsets[j]), + static_cast(render_path.sizes[j] * sizeof(IBufferType)), static_cast(indices.data()))); + + const size_t triangles_count = render_path.sizes[j] / 3; + for (size_t k = 0; k < triangles_count; ++k) { + const size_t base = k * 3; + const size_t v1 = 1 + static_cast(indices[base + 0]) + vertices_offset; + const size_t v2 = 1 + static_cast(indices[base + 1]) + vertices_offset; + const size_t v3 = 1 + static_cast(indices[base + 2]) + vertices_offset; + if (v1 != v2) + // do not export dummy triangles + fprintf(fp, "f %zu//%zu %zu//%zu %zu//%zu\n", v1, v1, v2, v2, v3, v3); + } + } + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + } + ++i; + } +#else // get vertices data from vertex buffer on gpu - size_t floats_per_vertex = buffer.vertices.vertex_size_floats(); - std::vector vertices = std::vector(buffer.vertices.count * floats_per_vertex); - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, buffer.vertices.id)); - glsafe(::glGetBufferSubData(GL_ARRAY_BUFFER, 0, buffer.vertices.data_size_bytes(), vertices.data())); + size_t floats_per_vertex = t_buffer.vertices.vertex_size_floats(); + VertexBuffer vertices = VertexBuffer(t_buffer.vertices.count * floats_per_vertex); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, t_buffer.vertices.id)); + glsafe(::glGetBufferSubData(GL_ARRAY_BUFFER, 0, t_buffer.vertices.data_size_bytes(), vertices.data())); glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); // get indices data from index buffer on gpu MultiIndexBuffer indices; - for (size_t i = 0; i < buffer.indices.size(); ++i) { - indices.push_back(IndexBuffer(buffer.indices[i].count)); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer.indices[i].id)); + for (size_t i = 0; i < t_buffer.indices.size(); ++i) { + indices.push_back(IndexBuffer(t_buffer.indices[i].count)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, t_buffer.indices[i].id)); glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, static_cast(indices.back().size() * sizeof(unsigned int)), indices.back().data())); glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); } @@ -777,15 +986,16 @@ void GCodeViewer::export_toolpaths_to_obj(const char* filename) const }; size_t out_vertices_count = 0; - unsigned int indices_per_segment = buffer.indices_per_segment(); - unsigned int start_vertex_offset = buffer.start_segment_vertex_offset(); - unsigned int end_vertex_offset = buffer.end_segment_vertex_offset(); + unsigned int indices_per_segment = t_buffer.indices_per_segment(); + unsigned int start_vertex_offset = t_buffer.start_segment_vertex_offset(); + unsigned int end_vertex_offset = t_buffer.end_segment_vertex_offset(); size_t i = 0; - for (const RenderPath& render_path : buffer.render_paths) { + for (const RenderPath& render_path : t_buffer.render_paths) { // get paths segments from buffer paths const IndexBuffer& ibuffer = indices[render_path.index_buffer_id]; - const Path& path = buffer.paths[render_path.path_id]; + const Path& path = t_buffer.paths[render_path.path_id]; + float half_width = 0.5f * path.width; // clamp height to avoid artifacts due to z-fighting when importing the obj file into blender and similar float half_height = std::max(0.5f * path.height, 0.005f); @@ -951,238 +1161,271 @@ void GCodeViewer::export_toolpaths_to_obj(const char* filename) const ++ i; } +#endif // ENABLE_SPLITTED_VERTEX_BUFFER fclose(fp); } -void GCodeViewer::init() -{ - if (m_initialized) - return; - - // initializes non opengl data of TBuffers - for (size_t i = 0; i < m_buffers.size(); ++i) { - TBuffer& buffer = m_buffers[i]; - switch (buffer_type(i)) - { - default: { break; } - case EMoveType::Tool_change: - case EMoveType::Color_change: - case EMoveType::Pause_Print: - case EMoveType::Custom_GCode: - case EMoveType::Retract: - case EMoveType::Unretract: - { - buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::Point; - buffer.vertices.format = VBuffer::EFormat::Position; - break; - } - case EMoveType::Wipe: - case EMoveType::Extrude: - { - buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::Triangle; - buffer.vertices.format = VBuffer::EFormat::PositionNormal3; - break; - } - case EMoveType::Travel: - { - buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::Line; - buffer.vertices.format = VBuffer::EFormat::PositionNormal1; - break; - } - } - } - - set_toolpath_move_type_visible(EMoveType::Extrude, true); -// m_sequential_view.skip_invisible_moves = true; - - m_initialized = true; -} - +#if ENABLE_SPLITTED_VERTEX_BUFFER void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) { -#if ENABLE_GCODE_VIEWER_STATISTICS - auto start_time = std::chrono::high_resolution_clock::now(); - m_statistics.results_size = SLIC3R_STDVEC_MEMSIZE(gcode_result.moves, GCodeProcessor::MoveVertex); - m_statistics.results_time = gcode_result.time; -#endif // ENABLE_GCODE_VIEWER_STATISTICS - - // vertices data - m_moves_count = gcode_result.moves.size(); - if (m_moves_count == 0) - return; - - unsigned int progress_count = 0; - static const unsigned int progress_threshold = 1000; - wxProgressDialog* progress_dialog = wxGetApp().is_gcode_viewer() ? - new wxProgressDialog(_L("Generating toolpaths"), "...", - 100, wxGetApp().plater(), wxPD_AUTO_HIDE | wxPD_APP_MODAL) : nullptr; - - m_extruders_count = gcode_result.extruders_count; - - for (size_t i = 0; i < m_moves_count; ++i) { - const GCodeProcessor::MoveVertex& move = gcode_result.moves[i]; - if (wxGetApp().is_gcode_viewer()) - // for the gcode viewer we need all moves to correctly size the printbed - m_paths_bounding_box.merge(move.position.cast()); - else { - if (move.type == EMoveType::Extrude && move.width != 0.0f && move.height != 0.0f) - m_paths_bounding_box.merge(move.position.cast()); - } - } - - // max bounding box (account for tool marker) - m_max_bounding_box = m_paths_bounding_box; - m_max_bounding_box.merge(m_paths_bounding_box.max + m_sequential_view.marker.get_bounding_box().size()[2] * Vec3d::UnitZ()); + // max index buffer size, in bytes + static const size_t IBUFFER_THRESHOLD_BYTES = 64 * 1024 * 1024; - auto log_memory_usage = [this](const std::string& label, const std::vector>& vertices, const std::vector& indices) { + auto log_memory_usage = [this](const std::string& label, const std::vector& vertices, const std::vector& indices) { int64_t vertices_size = 0; - for (size_t i = 0; i < vertices.size(); ++i) { - vertices_size += SLIC3R_STDVEC_MEMSIZE(vertices[i], float); + for (const MultiVertexBuffer& buffers : vertices) { + for (const VertexBuffer& buffer : buffers) { + vertices_size += SLIC3R_STDVEC_MEMSIZE(buffer, float); + } } int64_t indices_size = 0; - for (size_t i = 0; i < indices.size(); ++i) { - for (size_t j = 0; j < indices[i].size(); ++j) { - indices_size += SLIC3R_STDVEC_MEMSIZE(indices[i][j], unsigned int); + for (const MultiIndexBuffer& buffers : indices) { + for (const IndexBuffer& buffer : buffers) { + indices_size += SLIC3R_STDVEC_MEMSIZE(buffer, IBufferType); } } log_memory_used(label, vertices_size + indices_size); }; // format data into the buffers to be rendered as points - auto add_vertices_as_point = [](const GCodeProcessor::MoveVertex& curr, std::vector& buffer_vertices) { - for (int j = 0; j < 3; ++j) { - buffer_vertices.push_back(curr.position[j]); - } + auto add_vertices_as_point = [](const GCodeProcessor::MoveVertex& curr, VertexBuffer& vertices) { + vertices.push_back(curr.position[0]); + vertices.push_back(curr.position[1]); + vertices.push_back(curr.position[2]); }; auto add_indices_as_point = [](const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, - unsigned int index_buffer_id, IndexBuffer& buffer_indices, size_t move_id) { - buffer.add_path(curr, index_buffer_id, buffer_indices.size(), move_id); - buffer_indices.push_back(static_cast(buffer_indices.size())); + unsigned int ibuffer_id, IndexBuffer& indices, size_t move_id) { + buffer.add_path(curr, ibuffer_id, indices.size(), move_id); + indices.push_back(static_cast(indices.size())); }; // format data into the buffers to be rendered as lines - auto add_vertices_as_line = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, - TBuffer& buffer, std::vector& buffer_vertices) { - // x component of the normal to the current segment (the normal is parallel to the XY plane) - float normal_x = (curr.position - prev.position).normalized()[1]; - - auto add_vertex = [&buffer_vertices, normal_x](const GCodeProcessor::MoveVertex& vertex) { - // add position - for (int j = 0; j < 3; ++j) { - buffer_vertices.push_back(vertex.position[j]); - } - // add normal x component - buffer_vertices.push_back(normal_x); - }; + auto add_vertices_as_line = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, VertexBuffer& vertices) { + // x component of the normal to the current segment (the normal is parallel to the XY plane) + float normal_x = (curr.position - prev.position).normalized()[1]; + + auto add_vertex = [&vertices, normal_x](const GCodeProcessor::MoveVertex& vertex) { + // add position + vertices.push_back(vertex.position[0]); + vertices.push_back(vertex.position[1]); + vertices.push_back(vertex.position[2]); + // add normal x component + vertices.push_back(normal_x); + }; - // add previous vertex - add_vertex(prev); - // add current vertex - add_vertex(curr); + // add previous vertex + add_vertex(prev); + // add current vertex + add_vertex(curr); }; auto add_indices_as_line = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, - unsigned int index_buffer_id, IndexBuffer& buffer_indices, size_t move_id) { - // x component of the normal to the current segment (the normal is parallel to the XY plane) - float normal_x = (curr.position - prev.position).normalized()[1]; - + unsigned int ibuffer_id, IndexBuffer& indices, size_t move_id) { if (prev.type != curr.type || !buffer.paths.back().matches(curr)) { // add starting index - buffer_indices.push_back(static_cast(buffer_indices.size())); - buffer.add_path(curr, index_buffer_id, buffer_indices.size() - 1, move_id - 1); - buffer.paths.back().first.position = prev.position; + indices.push_back(static_cast(indices.size())); + buffer.add_path(curr, ibuffer_id, indices.size() - 1, move_id - 1); + buffer.paths.back().sub_paths.front().first.position = prev.position; } Path& last_path = buffer.paths.back(); - if (last_path.first.i_id != last_path.last.i_id) { + if (last_path.sub_paths.front().first.i_id != last_path.sub_paths.back().last.i_id) { // add previous index - buffer_indices.push_back(static_cast(buffer_indices.size())); + indices.push_back(static_cast(indices.size())); } // add current index - buffer_indices.push_back(static_cast(buffer_indices.size())); - last_path.last = { index_buffer_id, buffer_indices.size() - 1, move_id, curr.position }; + indices.push_back(static_cast(indices.size())); + last_path.sub_paths.back().last = { ibuffer_id, indices.size() - 1, move_id, curr.position }; }; // format data into the buffers to be rendered as solid - auto add_vertices_as_solid = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, - std::vector& buffer_vertices, size_t move_id) { + auto add_vertices_as_solid = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, unsigned int vbuffer_id, VertexBuffer& vertices, size_t move_id) { + auto store_vertex = [](VertexBuffer& vertices, const Vec3f& position, const Vec3f& normal) { + // append position + vertices.push_back(position[0]); + vertices.push_back(position[1]); + vertices.push_back(position[2]); + // append normal + vertices.push_back(normal[0]); + vertices.push_back(normal[1]); + vertices.push_back(normal[2]); + }; + + if (prev.type != curr.type || !buffer.paths.back().matches(curr)) { + buffer.add_path(curr, vbuffer_id, vertices.size(), move_id - 1); + buffer.paths.back().sub_paths.back().first.position = prev.position; + } + + Path& last_path = buffer.paths.back(); + + Vec3f dir = (curr.position - prev.position).normalized(); + Vec3f right = Vec3f(dir[1], -dir[0], 0.0f).normalized(); + Vec3f left = -right; + Vec3f up = right.cross(dir); + Vec3f down = -up; + float half_width = 0.5f * last_path.width; + float half_height = 0.5f * last_path.height; + Vec3f prev_pos = prev.position - half_height * up; + Vec3f curr_pos = curr.position - half_height * up; + Vec3f d_up = half_height * up; + Vec3f d_down = -half_height * up; + Vec3f d_right = half_width * right; + Vec3f d_left = -half_width * right; + + // vertices 1st endpoint + if (last_path.vertices_count() == 1 || vertices.empty()) { + // 1st segment or restart into a new vertex buffer + // =============================================== + store_vertex(vertices, prev_pos + d_up, up); + store_vertex(vertices, prev_pos + d_right, right); + store_vertex(vertices, prev_pos + d_down, down); + store_vertex(vertices, prev_pos + d_left, left); + } + else { + // any other segment + // ================= + store_vertex(vertices, prev_pos + d_right, right); + store_vertex(vertices, prev_pos + d_left, left); + } + + // vertices 2nd endpoint + store_vertex(vertices, curr_pos + d_up, up); + store_vertex(vertices, curr_pos + d_right, right); + store_vertex(vertices, curr_pos + d_down, down); + store_vertex(vertices, curr_pos + d_left, left); + + last_path.sub_paths.back().last = { vbuffer_id, vertices.size(), move_id, curr.position }; + }; +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + auto add_indices_as_solid = [&](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, const GCodeProcessor::MoveVertex* next, + TBuffer& buffer, size_t& vbuffer_size, unsigned int ibuffer_id, IndexBuffer& indices, size_t move_id) { +#else + auto add_indices_as_solid = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, + size_t& vbuffer_size, unsigned int ibuffer_id, IndexBuffer& indices, size_t move_id) { +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS static Vec3f prev_dir; static Vec3f prev_up; - static float prev_length; - auto store_vertex = [](std::vector& buffer_vertices, const Vec3f& position, const Vec3f& normal) { - // append position - for (int j = 0; j < 3; ++j) { - buffer_vertices.push_back(position[j]); - } - // append normal - for (int j = 0; j < 3; ++j) { - buffer_vertices.push_back(normal[j]); - } + static float sq_prev_length; + auto store_triangle = [](IndexBuffer& indices, IBufferType i1, IBufferType i2, IBufferType i3) { + indices.push_back(i1); + indices.push_back(i2); + indices.push_back(i3); }; - auto extract_position_at = [](const std::vector& vertices, size_t id) { - return Vec3f(vertices[id + 0], vertices[id + 1], vertices[id + 2]); + auto append_dummy_cap = [store_triangle](IndexBuffer& indices, IBufferType id) { + store_triangle(indices, id, id, id); + store_triangle(indices, id, id, id); }; - auto update_position_at = [](std::vector& vertices, size_t id, const Vec3f& position) { - vertices[id + 0] = position[0]; - vertices[id + 1] = position[1]; - vertices[id + 2] = position[2]; +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + auto convert_vertices_offset = [](size_t vbuffer_size, const std::array& v_offsets) { + std::array ret = { + static_cast(static_cast(vbuffer_size) + v_offsets[0]), + static_cast(static_cast(vbuffer_size) + v_offsets[1]), + static_cast(static_cast(vbuffer_size) + v_offsets[2]), + static_cast(static_cast(vbuffer_size) + v_offsets[3]), + static_cast(static_cast(vbuffer_size) + v_offsets[4]), + static_cast(static_cast(vbuffer_size) + v_offsets[5]), + static_cast(static_cast(vbuffer_size) + v_offsets[6]), + static_cast(static_cast(vbuffer_size) + v_offsets[7]) + }; + return ret; + }; + auto append_starting_cap_triangles = [&](IndexBuffer& indices, const std::array& v_offsets) { + store_triangle(indices, v_offsets[0], v_offsets[2], v_offsets[1]); + store_triangle(indices, v_offsets[0], v_offsets[3], v_offsets[2]); + }; + auto append_stem_triangles = [&](IndexBuffer& indices, const std::array& v_offsets) { + store_triangle(indices, v_offsets[0], v_offsets[1], v_offsets[4]); + store_triangle(indices, v_offsets[1], v_offsets[5], v_offsets[4]); + store_triangle(indices, v_offsets[1], v_offsets[2], v_offsets[5]); + store_triangle(indices, v_offsets[2], v_offsets[6], v_offsets[5]); + store_triangle(indices, v_offsets[2], v_offsets[3], v_offsets[6]); + store_triangle(indices, v_offsets[3], v_offsets[7], v_offsets[6]); + store_triangle(indices, v_offsets[3], v_offsets[0], v_offsets[7]); + store_triangle(indices, v_offsets[0], v_offsets[4], v_offsets[7]); + }; + auto append_ending_cap_triangles = [&](IndexBuffer& indices, const std::array& v_offsets) { + store_triangle(indices, v_offsets[4], v_offsets[6], v_offsets[7]); + store_triangle(indices, v_offsets[4], v_offsets[5], v_offsets[6]); + }; +#else + auto append_stem_triangles = [&](IndexBuffer& indices, size_t vbuffer_size, const std::array& v_offsets) { + std::array v_ids; + for (size_t i = 0; i < v_ids.size(); ++i) { + v_ids[i] = static_cast(static_cast(vbuffer_size) + v_offsets[i]); + } + + // triangles starting cap + store_triangle(indices, v_ids[0], v_ids[2], v_ids[1]); + store_triangle(indices, v_ids[0], v_ids[3], v_ids[2]); + + // triangles sides + store_triangle(indices, v_ids[0], v_ids[1], v_ids[4]); + store_triangle(indices, v_ids[1], v_ids[5], v_ids[4]); + store_triangle(indices, v_ids[1], v_ids[2], v_ids[5]); + store_triangle(indices, v_ids[2], v_ids[6], v_ids[5]); + store_triangle(indices, v_ids[2], v_ids[3], v_ids[6]); + store_triangle(indices, v_ids[3], v_ids[7], v_ids[6]); + store_triangle(indices, v_ids[3], v_ids[0], v_ids[7]); + store_triangle(indices, v_ids[0], v_ids[4], v_ids[7]); + + // triangles ending cap + store_triangle(indices, v_ids[4], v_ids[6], v_ids[7]); + store_triangle(indices, v_ids[4], v_ids[5], v_ids[6]); }; +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS if (prev.type != curr.type || !buffer.paths.back().matches(curr)) { - buffer.add_path(curr, 0, 0, move_id - 1); - buffer.paths.back().first.position = prev.position; + buffer.add_path(curr, ibuffer_id, indices.size(), move_id - 1); + buffer.paths.back().sub_paths.back().first.position = prev.position; } - unsigned int starting_vertices_size = static_cast(buffer_vertices.size() / buffer.vertices.vertex_size_floats()); + Path& last_path = buffer.paths.back(); Vec3f dir = (curr.position - prev.position).normalized(); - Vec3f right = (std::abs(std::abs(dir.dot(Vec3f::UnitZ())) - 1.0f) < EPSILON) ? -Vec3f::UnitY() : Vec3f(dir[1], -dir[0], 0.0f).normalized(); - Vec3f left = -right; + Vec3f right = Vec3f(dir[1], -dir[0], 0.0f).normalized(); Vec3f up = right.cross(dir); - Vec3f down = -up; - - Path& last_path = buffer.paths.back(); - - float half_width = 0.5f * last_path.width; - float half_height = 0.5f * last_path.height; - - Vec3f prev_pos = prev.position - half_height * up; - Vec3f curr_pos = curr.position - half_height * up; - - float length = (curr_pos - prev_pos).norm(); - if (last_path.vertices_count() == 1) { - // 1st segment + float sq_length = (curr.position - prev.position).squaredNorm(); + +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + const std::array first_seg_v_offsets = convert_vertices_offset(vbuffer_size, { 0, 1, 2, 3, 4, 5, 6, 7 }); + const std::array non_first_seg_v_offsets = convert_vertices_offset(vbuffer_size, { -4, 0, -2, 1, 2, 3, 4, 5 }); +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + + if (last_path.vertices_count() == 1 || vbuffer_size == 0) { + // 1st segment or restart into a new vertex buffer + // =============================================== +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + if (last_path.vertices_count() == 1) + // starting cap triangles + append_starting_cap_triangles(indices, first_seg_v_offsets); +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + // dummy triangles outer corner cap + append_dummy_cap(indices, vbuffer_size); - // vertices 1st endpoint - store_vertex(buffer_vertices, prev_pos + half_height * up, up); - store_vertex(buffer_vertices, prev_pos + half_width * right, right); - store_vertex(buffer_vertices, prev_pos + half_height * down, down); - store_vertex(buffer_vertices, prev_pos + half_width * left, left); + // stem triangles +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + append_stem_triangles(indices, first_seg_v_offsets); +#else + append_stem_triangles(indices, vbuffer_size, { 0, 1, 2, 3, 4, 5, 6, 7 }); +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS - // vertices 2nd endpoint - store_vertex(buffer_vertices, curr_pos + half_height * up, up); - store_vertex(buffer_vertices, curr_pos + half_width * right, right); - store_vertex(buffer_vertices, curr_pos + half_height * down, down); - store_vertex(buffer_vertices, curr_pos + half_width * left, left); + vbuffer_size += 8; } else { // any other segment + // ================= float displacement = 0.0f; float cos_dir = prev_dir.dot(dir); if (cos_dir > -0.9998477f) { // if the angle between adjacent segments is smaller than 179 degrees Vec3f med_dir = (prev_dir + dir).normalized(); + float half_width = 0.5f * last_path.width; displacement = half_width * ::tan(::acos(std::clamp(dir.dot(med_dir), -1.0f, 1.0f))); } - Vec3f displacement_vec = displacement * prev_dir; - bool can_displace = displacement > 0.0f && displacement < prev_length&& displacement < length; - - size_t prev_right_id = (starting_vertices_size - 3) * buffer.vertices.vertex_size_floats(); - size_t prev_left_id = (starting_vertices_size - 1) * buffer.vertices.vertex_size_floats(); - Vec3f prev_right_pos = extract_position_at(buffer_vertices, prev_right_id); - Vec3f prev_left_pos = extract_position_at(buffer_vertices, prev_left_id); + float sq_displacement = sqr(displacement); + bool can_displace = displacement > 0.0f && sq_displacement < sq_prev_length && sq_displacement < sq_length; bool is_right_turn = prev_up.dot(prev_dir.cross(dir)) <= 0.0f; // whether the angle between adjacent segments is greater than 45 degrees @@ -1191,216 +1434,103 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) bool right_displaced = false; bool left_displaced = false; - // displace the vertex (inner with respect to the corner) of the previous segment 2nd enpoint, if possible - if (can_displace) { - if (is_right_turn) { - prev_right_pos -= displacement_vec; - update_position_at(buffer_vertices, prev_right_id, prev_right_pos); - right_displaced = true; - } - else { - prev_left_pos -= displacement_vec; - update_position_at(buffer_vertices, prev_left_id, prev_left_pos); + if (!is_sharp && can_displace) { + if (is_right_turn) left_displaced = true; - } - } - - if (!is_sharp) { - // displace the vertex (outer with respect to the corner) of the previous segment 2nd enpoint, if possible - if (can_displace) { - if (is_right_turn) { - prev_left_pos += displacement_vec; - update_position_at(buffer_vertices, prev_left_id, prev_left_pos); - left_displaced = true; - } - else { - prev_right_pos += displacement_vec; - update_position_at(buffer_vertices, prev_right_id, prev_right_pos); - right_displaced = true; - } - } - - // vertices 1st endpoint (top and bottom are from previous segment 2nd endpoint) - // vertices position matches that of the previous segment 2nd endpoint, if displaced - store_vertex(buffer_vertices, right_displaced ? prev_right_pos : prev_pos + half_width * right, right); - store_vertex(buffer_vertices, left_displaced ? prev_left_pos : prev_pos + half_width * left, left); - } - else { - // vertices 1st endpoint (top and bottom are from previous segment 2nd endpoint) - // the inner corner vertex position matches that of the previous segment 2nd endpoint, if displaced - if (is_right_turn) { - store_vertex(buffer_vertices, right_displaced ? prev_right_pos : prev_pos + half_width * right, right); - store_vertex(buffer_vertices, prev_pos + half_width * left, left); - } - else { - store_vertex(buffer_vertices, prev_pos + half_width * right, right); - store_vertex(buffer_vertices, left_displaced ? prev_left_pos : prev_pos + half_width * left, left); - } - } - - // vertices 2nd endpoint - store_vertex(buffer_vertices, curr_pos + half_height * up, up); - store_vertex(buffer_vertices, curr_pos + half_width * right, right); - store_vertex(buffer_vertices, curr_pos + half_height * down, down); - store_vertex(buffer_vertices, curr_pos + half_width * left, left); - } - - last_path.last = { 0, 0, move_id, curr.position }; - prev_dir = dir; - prev_up = up; - prev_length = length; - }; - - auto add_indices_as_solid = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, - size_t& buffer_vertices_size, unsigned int index_buffer_id, IndexBuffer& buffer_indices, size_t move_id) { - static Vec3f prev_dir; - static Vec3f prev_up; - static float prev_length; - auto store_triangle = [](IndexBuffer& buffer_indices, unsigned int i1, unsigned int i2, unsigned int i3) { - buffer_indices.push_back(i1); - buffer_indices.push_back(i2); - buffer_indices.push_back(i3); - }; - auto append_dummy_cap = [store_triangle](IndexBuffer& buffer_indices, unsigned int id) { - store_triangle(buffer_indices, id, id, id); - store_triangle(buffer_indices, id, id, id); - }; - - if (prev.type != curr.type || !buffer.paths.back().matches(curr)) { - buffer.add_path(curr, index_buffer_id, buffer_indices.size(), move_id - 1); - buffer.paths.back().first.position = prev.position; - } - - unsigned int starting_vertices_size = static_cast(buffer_vertices_size); - - Vec3f dir = (curr.position - prev.position).normalized(); - Vec3f right = (std::abs(std::abs(dir.dot(Vec3f::UnitZ())) - 1.0f) < EPSILON) ? -Vec3f::UnitY() : Vec3f(dir[1], -dir[0], 0.0f).normalized(); - Vec3f up = right.cross(dir); - - Path& last_path = buffer.paths.back(); - - float half_width = 0.5f * last_path.width; - float half_height = 0.5f * last_path.height; - - Vec3f prev_pos = prev.position - half_height * up; - Vec3f curr_pos = curr.position - half_height * up; - - float length = (curr_pos - prev_pos).norm(); - if (last_path.vertices_count() == 1) { - // 1st segment - buffer_vertices_size += 8; - - // triangles starting cap - store_triangle(buffer_indices, starting_vertices_size + 0, starting_vertices_size + 2, starting_vertices_size + 1); - store_triangle(buffer_indices, starting_vertices_size + 0, starting_vertices_size + 3, starting_vertices_size + 2); - - // dummy triangles outer corner cap - append_dummy_cap(buffer_indices, starting_vertices_size); - - // triangles sides - store_triangle(buffer_indices, starting_vertices_size + 0, starting_vertices_size + 1, starting_vertices_size + 4); - store_triangle(buffer_indices, starting_vertices_size + 1, starting_vertices_size + 5, starting_vertices_size + 4); - store_triangle(buffer_indices, starting_vertices_size + 1, starting_vertices_size + 2, starting_vertices_size + 5); - store_triangle(buffer_indices, starting_vertices_size + 2, starting_vertices_size + 6, starting_vertices_size + 5); - store_triangle(buffer_indices, starting_vertices_size + 2, starting_vertices_size + 3, starting_vertices_size + 6); - store_triangle(buffer_indices, starting_vertices_size + 3, starting_vertices_size + 7, starting_vertices_size + 6); - store_triangle(buffer_indices, starting_vertices_size + 3, starting_vertices_size + 0, starting_vertices_size + 7); - store_triangle(buffer_indices, starting_vertices_size + 0, starting_vertices_size + 4, starting_vertices_size + 7); - - // triangles ending cap - store_triangle(buffer_indices, starting_vertices_size + 4, starting_vertices_size + 6, starting_vertices_size + 7); - store_triangle(buffer_indices, starting_vertices_size + 4, starting_vertices_size + 5, starting_vertices_size + 6); - } - else { - // any other segment - float displacement = 0.0f; - float cos_dir = prev_dir.dot(dir); - if (cos_dir > -0.9998477f) { - // if the angle between adjacent segments is smaller than 179 degrees - Vec3f med_dir = (prev_dir + dir).normalized(); - displacement = half_width * ::tan(::acos(std::clamp(dir.dot(med_dir), -1.0f, 1.0f))); - } - - Vec3f displacement_vec = displacement * prev_dir; - bool can_displace = displacement > 0.0f && displacement < prev_length && displacement < length; - - bool is_right_turn = prev_up.dot(prev_dir.cross(dir)) <= 0.0f; - // whether the angle between adjacent segments is greater than 45 degrees - bool is_sharp = cos_dir < 0.7071068f; - - bool right_displaced = false; - bool left_displaced = false; - - if (!is_sharp) { - if (can_displace) { - if (is_right_turn) - left_displaced = true; - else - right_displaced = true; - } + else + right_displaced = true; } - buffer_vertices_size += 6; - - // triangles starting cap - store_triangle(buffer_indices, starting_vertices_size - 4, starting_vertices_size - 2, starting_vertices_size + 0); - store_triangle(buffer_indices, starting_vertices_size - 4, starting_vertices_size + 1, starting_vertices_size - 2); - // triangles outer corner cap if (is_right_turn) { if (left_displaced) // dummy triangles - append_dummy_cap(buffer_indices, starting_vertices_size); + append_dummy_cap(indices, vbuffer_size); else { - store_triangle(buffer_indices, starting_vertices_size - 4, starting_vertices_size + 1, starting_vertices_size - 1); - store_triangle(buffer_indices, starting_vertices_size + 1, starting_vertices_size - 2, starting_vertices_size - 1); + store_triangle(indices, vbuffer_size - 4, vbuffer_size + 1, vbuffer_size - 1); + store_triangle(indices, vbuffer_size + 1, vbuffer_size - 2, vbuffer_size - 1); } } else { if (right_displaced) // dummy triangles - append_dummy_cap(buffer_indices, starting_vertices_size); + append_dummy_cap(indices, vbuffer_size); else { - store_triangle(buffer_indices, starting_vertices_size - 4, starting_vertices_size - 3, starting_vertices_size + 0); - store_triangle(buffer_indices, starting_vertices_size - 3, starting_vertices_size - 2, starting_vertices_size + 0); + store_triangle(indices, vbuffer_size - 4, vbuffer_size - 3, vbuffer_size + 0); + store_triangle(indices, vbuffer_size - 3, vbuffer_size - 2, vbuffer_size + 0); } } - // triangles sides - store_triangle(buffer_indices, starting_vertices_size - 4, starting_vertices_size + 0, starting_vertices_size + 2); - store_triangle(buffer_indices, starting_vertices_size + 0, starting_vertices_size + 3, starting_vertices_size + 2); - store_triangle(buffer_indices, starting_vertices_size + 0, starting_vertices_size - 2, starting_vertices_size + 3); - store_triangle(buffer_indices, starting_vertices_size - 2, starting_vertices_size + 4, starting_vertices_size + 3); - store_triangle(buffer_indices, starting_vertices_size - 2, starting_vertices_size + 1, starting_vertices_size + 4); - store_triangle(buffer_indices, starting_vertices_size + 1, starting_vertices_size + 5, starting_vertices_size + 4); - store_triangle(buffer_indices, starting_vertices_size + 1, starting_vertices_size - 4, starting_vertices_size + 5); - store_triangle(buffer_indices, starting_vertices_size - 4, starting_vertices_size + 2, starting_vertices_size + 5); + // stem triangles +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + append_stem_triangles(indices, non_first_seg_v_offsets); +#else + append_stem_triangles(indices, vbuffer_size, { -4, 0, -2, 1, 2, 3, 4, 5 }); +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS - // triangles ending cap - store_triangle(buffer_indices, starting_vertices_size + 2, starting_vertices_size + 4, starting_vertices_size + 5); - store_triangle(buffer_indices, starting_vertices_size + 2, starting_vertices_size + 3, starting_vertices_size + 4); + vbuffer_size += 6; } - last_path.last = { index_buffer_id, buffer_indices.size() - 1, move_id, curr.position }; +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + if (next != nullptr && (curr.type != next->type || !last_path.matches(*next))) + // ending cap triangles + append_ending_cap_triangles(indices, non_first_seg_v_offsets); +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + + last_path.sub_paths.back().last = { ibuffer_id, indices.size() - 1, move_id, curr.position }; prev_dir = dir; prev_up = up; - prev_length = length; + sq_prev_length = sq_length; }; +#if ENABLE_GCODE_VIEWER_STATISTICS + auto start_time = std::chrono::high_resolution_clock::now(); + m_statistics.results_size = SLIC3R_STDVEC_MEMSIZE(gcode_result.moves, GCodeProcessor::MoveVertex); + m_statistics.results_time = gcode_result.time; +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + m_moves_count = gcode_result.moves.size(); + if (m_moves_count == 0) + return; + + unsigned int progress_count = 0; + static const unsigned int progress_threshold = 1000; + wxProgressDialog* progress_dialog = wxGetApp().is_gcode_viewer() ? + new wxProgressDialog(_L("Generating toolpaths"), "...", + 100, wxGetApp().plater(), wxPD_AUTO_HIDE | wxPD_APP_MODAL) : nullptr; + wxBusyCursor busy; - // to reduce the peak in memory usage, we split the generation of the vertex and index buffers in two steps. - // the data are deleted as soon as they are sent to the gpu. - std::vector> vertices(m_buffers.size()); + // extract approximate paths bounding box from result + for (const GCodeProcessor::MoveVertex& move : gcode_result.moves) { + if (wxGetApp().is_gcode_viewer()) + // for the gcode viewer we need to take in account all moves to correctly size the printbed + m_paths_bounding_box.merge(move.position.cast()); + else { + if (move.type == EMoveType::Extrude && move.width != 0.0f && move.height != 0.0f) + m_paths_bounding_box.merge(move.position.cast()); + } + } + + // set approximate max bounding box (take in account also the tool marker) + m_max_bounding_box = m_paths_bounding_box; + m_max_bounding_box.merge(m_paths_bounding_box.max + m_sequential_view.marker.get_bounding_box().size()[2] * Vec3d::UnitZ()); + + std::vector vertices(m_buffers.size()); std::vector indices(m_buffers.size()); std::vector options_zs; // toolpaths data -> extract vertices from result for (size_t i = 0; i < m_moves_count; ++i) { + const GCodeProcessor::MoveVertex& curr = gcode_result.moves[i]; + // skip first vertex if (i == 0) continue; + const GCodeProcessor::MoveVertex& prev = gcode_result.moves[i - 1]; + + // update progress dialog ++progress_count; if (progress_dialog != nullptr && progress_count % progress_threshold == 0) { progress_dialog->Update(int(100.0f * float(i) / (2.0f * float(m_moves_count))), @@ -1409,71 +1539,245 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) progress_count = 0; } - const GCodeProcessor::MoveVertex& prev = gcode_result.moves[i - 1]; - const GCodeProcessor::MoveVertex& curr = gcode_result.moves[i]; - unsigned char id = buffer_id(curr.type); - TBuffer& buffer = m_buffers[id]; - std::vector& buffer_vertices = vertices[id]; + TBuffer& t_buffer = m_buffers[id]; + MultiVertexBuffer& v_multibuffer = vertices[id]; + + // ensure there is at least one vertex buffer + if (v_multibuffer.empty()) + v_multibuffer.push_back(VertexBuffer()); + + // if adding the vertices for the current segment exceeds the threshold size of the current vertex buffer + // add another vertex buffer + if (v_multibuffer.back().size() * sizeof(float) > t_buffer.vertices.max_size_bytes() - t_buffer.max_vertices_per_segment_size_bytes()) { + v_multibuffer.push_back(VertexBuffer()); + if (t_buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle) { + Path& last_path = t_buffer.paths.back(); + if (prev.type == curr.type && last_path.matches(curr)) + last_path.add_sub_path(prev, static_cast(v_multibuffer.size()) - 1, 0, i - 1); + } + } - switch (buffer.render_primitive_type) + VertexBuffer& v_buffer = v_multibuffer.back(); + + switch (t_buffer.render_primitive_type) { - case TBuffer::ERenderPrimitiveType::Point: { - add_vertices_as_point(curr, buffer_vertices); - break; + case TBuffer::ERenderPrimitiveType::Point: { add_vertices_as_point(curr, v_buffer); break; } + case TBuffer::ERenderPrimitiveType::Line: { add_vertices_as_line(prev, curr, v_buffer); break; } + case TBuffer::ERenderPrimitiveType::Triangle: { add_vertices_as_solid(prev, curr, t_buffer, static_cast(v_multibuffer.size()) - 1, v_buffer, i); break; } } - case TBuffer::ERenderPrimitiveType::Line: { - add_vertices_as_line(prev, curr, buffer, buffer_vertices); - break; + + // collect options zs for later use + if (curr.type == EMoveType::Pause_Print || curr.type == EMoveType::Custom_GCode) { + const float* const last_z = options_zs.empty() ? nullptr : &options_zs.back(); + if (last_z == nullptr || curr.position[2] < *last_z - EPSILON || *last_z + EPSILON < curr.position[2]) + options_zs.emplace_back(curr.position[2]); } - case TBuffer::ERenderPrimitiveType::Triangle: { - add_vertices_as_solid(prev, curr, buffer, buffer_vertices, i); - break; + } + + // smooth toolpaths corners for the given TBuffer using triangles + auto smooth_triangle_toolpaths_corners = [&gcode_result](const TBuffer& t_buffer, MultiVertexBuffer& v_multibuffer) { + auto extract_position_at = [](const VertexBuffer& vertices, size_t offset) { + return Vec3f(vertices[offset + 0], vertices[offset + 1], vertices[offset + 2]); + }; + auto update_position_at = [](VertexBuffer& vertices, size_t offset, const Vec3f& position) { + vertices[offset + 0] = position[0]; + vertices[offset + 1] = position[1]; + vertices[offset + 2] = position[2]; + }; + auto match_right_vertices = [&](const Path::Sub_Path& prev_sub_path, const Path::Sub_Path& next_sub_path, + size_t curr_s_id, size_t vertex_size_floats, const Vec3f& displacement_vec) { + if (&prev_sub_path == &next_sub_path) { // previous and next segment are both contained into to the same vertex buffer + VertexBuffer& vbuffer = v_multibuffer[prev_sub_path.first.b_id]; + // offset into the vertex buffer of the next segment 1st vertex + size_t next_1st_offset = (prev_sub_path.last.s_id - curr_s_id) * 6 * vertex_size_floats; + // offset into the vertex buffer of the right vertex of the previous segment + size_t prev_right_offset = prev_sub_path.last.i_id - next_1st_offset - 3 * vertex_size_floats; + // new position of the right vertices + Vec3f shared_vertex = extract_position_at(vbuffer, prev_right_offset) + displacement_vec; + // update previous segment + update_position_at(vbuffer, prev_right_offset, shared_vertex); + // offset into the vertex buffer of the right vertex of the next segment + size_t next_right_offset = next_sub_path.last.i_id - next_1st_offset; + // update next segment + update_position_at(vbuffer, next_right_offset, shared_vertex); + } + else { // previous and next segment are contained into different vertex buffers + VertexBuffer& prev_vbuffer = v_multibuffer[prev_sub_path.first.b_id]; + VertexBuffer& next_vbuffer = v_multibuffer[next_sub_path.first.b_id]; + // offset into the previous vertex buffer of the right vertex of the previous segment + size_t prev_right_offset = prev_sub_path.last.i_id - 3 * vertex_size_floats; + // new position of the right vertices + Vec3f shared_vertex = extract_position_at(prev_vbuffer, prev_right_offset) + displacement_vec; + // update previous segment + update_position_at(prev_vbuffer, prev_right_offset, shared_vertex); + // offset into the next vertex buffer of the right vertex of the next segment + size_t next_right_offset = next_sub_path.first.i_id + 1 * vertex_size_floats; + // update next segment + update_position_at(next_vbuffer, next_right_offset, shared_vertex); + } + }; + auto match_left_vertices = [&](const Path::Sub_Path& prev_sub_path, const Path::Sub_Path& next_sub_path, + size_t curr_s_id, size_t vertex_size_floats, const Vec3f& displacement_vec) { + if (&prev_sub_path == &next_sub_path) { // previous and next segment are both contained into to the same vertex buffer + VertexBuffer& vbuffer = v_multibuffer[prev_sub_path.first.b_id]; + // offset into the vertex buffer of the next segment 1st vertex + size_t next_1st_offset = (prev_sub_path.last.s_id - curr_s_id) * 6 * vertex_size_floats; + // offset into the vertex buffer of the left vertex of the previous segment + size_t prev_left_offset = prev_sub_path.last.i_id - next_1st_offset - 1 * vertex_size_floats; + // new position of the left vertices + Vec3f shared_vertex = extract_position_at(vbuffer, prev_left_offset) + displacement_vec; + // update previous segment + update_position_at(vbuffer, prev_left_offset, shared_vertex); + // offset into the vertex buffer of the left vertex of the next segment + size_t next_left_offset = next_sub_path.last.i_id - next_1st_offset + 1 * vertex_size_floats; + // update next segment + update_position_at(vbuffer, next_left_offset, shared_vertex); + } + else { // previous and next segment are contained into different vertex buffers + VertexBuffer& prev_vbuffer = v_multibuffer[prev_sub_path.first.b_id]; + VertexBuffer& next_vbuffer = v_multibuffer[next_sub_path.first.b_id]; + // offset into the previous vertex buffer of the left vertex of the previous segment + size_t prev_left_offset = prev_sub_path.last.i_id - 1 * vertex_size_floats; + // new position of the left vertices + Vec3f shared_vertex = extract_position_at(prev_vbuffer, prev_left_offset) + displacement_vec; + // update previous segment + update_position_at(prev_vbuffer, prev_left_offset, shared_vertex); + // offset into the next vertex buffer of the left vertex of the next segment + size_t next_left_offset = next_sub_path.first.i_id + 3 * vertex_size_floats; + // update next segment + update_position_at(next_vbuffer, next_left_offset, shared_vertex); + } + }; + + size_t vertex_size_floats = t_buffer.vertices.vertex_size_floats(); + for (const Path& path : t_buffer.paths) { + // the two segments of the path sharing the current vertex may belong + // to two different vertex buffers + size_t prev_sub_path_id = 0; + size_t next_sub_path_id = 0; + size_t path_vertices_count = path.vertices_count(); + float half_width = 0.5f * path.width; + for (size_t j = 1; j < path_vertices_count - 1; ++j) { + size_t curr_s_id = path.sub_paths.front().first.s_id + j; + const Vec3f& prev = gcode_result.moves[curr_s_id - 1].position; + const Vec3f& curr = gcode_result.moves[curr_s_id].position; + const Vec3f& next = gcode_result.moves[curr_s_id + 1].position; + + // select the subpaths which contains the previous/next segments + if (!path.sub_paths[prev_sub_path_id].contains(curr_s_id)) + ++prev_sub_path_id; + if (!path.sub_paths[next_sub_path_id].contains(curr_s_id + 1)) + ++next_sub_path_id; + const Path::Sub_Path& prev_sub_path = path.sub_paths[prev_sub_path_id]; + const Path::Sub_Path& next_sub_path = path.sub_paths[next_sub_path_id]; + + Vec3f prev_dir = (curr - prev).normalized(); + Vec3f prev_right = Vec3f(prev_dir[1], -prev_dir[0], 0.0f).normalized(); + Vec3f prev_up = prev_right.cross(prev_dir); + + Vec3f next_dir = (next - curr).normalized(); + + bool is_right_turn = prev_up.dot(prev_dir.cross(next_dir)) <= 0.0f; + float cos_dir = prev_dir.dot(next_dir); + // whether the angle between adjacent segments is greater than 45 degrees + bool is_sharp = cos_dir < 0.7071068f; + + float displacement = 0.0f; + if (cos_dir > -0.9998477f) { + // if the angle between adjacent segments is smaller than 179 degrees + Vec3f med_dir = (prev_dir + next_dir).normalized(); + displacement = half_width * ::tan(::acos(std::clamp(next_dir.dot(med_dir), -1.0f, 1.0f))); + } + + float sq_prev_length = (curr - prev).squaredNorm(); + float sq_next_length = (next - curr).squaredNorm(); + float sq_displacement = sqr(displacement); + bool can_displace = displacement > 0.0f && sq_displacement < sq_prev_length && sq_displacement < sq_next_length; + + if (can_displace) { + // displacement to apply to the vertices to match + Vec3f displacement_vec = displacement * prev_dir; + // matches inner corner vertices + if (is_right_turn) + match_right_vertices(prev_sub_path, next_sub_path, curr_s_id, vertex_size_floats, -displacement_vec); + else + match_left_vertices(prev_sub_path, next_sub_path, curr_s_id, vertex_size_floats, -displacement_vec); + + if (!is_sharp) { + // matches outer corner vertices + if (is_right_turn) + match_left_vertices(prev_sub_path, next_sub_path, curr_s_id, vertex_size_floats, displacement_vec); + else + match_right_vertices(prev_sub_path, next_sub_path, curr_s_id, vertex_size_floats, displacement_vec); + } + } + } } + }; + +#if ENABLE_GCODE_VIEWER_STATISTICS + auto load_vertices_time = std::chrono::high_resolution_clock::now(); + m_statistics.load_vertices = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - start_time).count(); +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + // smooth toolpaths corners for TBuffers using triangles + for (size_t i = 0; i < m_buffers.size(); ++i) { + const TBuffer& t_buffer = m_buffers[i]; + if (t_buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle) { + smooth_triangle_toolpaths_corners(t_buffer, vertices[i]); } + } - EMoveType type = buffer_type(id); - if (type == EMoveType::Pause_Print || type == EMoveType::Custom_GCode) { - const float* const last_z = options_zs.empty() ? nullptr : &options_zs.back(); - float z = static_cast(curr.position[2]); - if (last_z == nullptr || z < *last_z - EPSILON || *last_z + EPSILON < z) - options_zs.emplace_back(curr.position[2]); + for (MultiVertexBuffer& v_multibuffer : vertices) { + for (VertexBuffer& v_buffer : v_multibuffer) { + v_buffer.shrink_to_fit(); } } // move the wipe toolpaths half height up to render them on proper position - std::vector& wipe_vertices = vertices[buffer_id(EMoveType::Wipe)]; - for (size_t i = 2; i < wipe_vertices.size(); i += 3) { - wipe_vertices[i] += 0.5f * GCodeProcessor::Wipe_Height; + MultiVertexBuffer& wipe_vertices = vertices[buffer_id(EMoveType::Wipe)]; + for (VertexBuffer& v_buffer : wipe_vertices) { + for (size_t i = 2; i < v_buffer.size(); i += 3) { + v_buffer[i] += 0.5f * GCodeProcessor::Wipe_Height; + } } - log_memory_usage("Loaded G-code generated vertex buffers, ", vertices, indices); - - // toolpaths data -> send vertices data to gpu + // send vertices data to gpu for (size_t i = 0; i < m_buffers.size(); ++i) { - TBuffer& buffer = m_buffers[i]; + TBuffer& t_buffer = m_buffers[i]; - const std::vector& buffer_vertices = vertices[i]; - buffer.vertices.count = buffer_vertices.size() / buffer.vertices.vertex_size_floats(); -#if ENABLE_GCODE_VIEWER_STATISTICS - m_statistics.total_vertices_gpu_size += buffer_vertices.size() * sizeof(float); - m_statistics.max_vbuffer_gpu_size = std::max(m_statistics.max_vbuffer_gpu_size, static_cast(buffer_vertices.size() * sizeof(float))); - m_statistics.max_vertices_in_vertex_buffer = std::max(m_statistics.max_vertices_in_vertex_buffer, static_cast(buffer.vertices.count)); -#endif // ENABLE_GCODE_VIEWER_STATISTICS + const MultiVertexBuffer& v_multibuffer = vertices[i]; + for (const VertexBuffer& v_buffer : v_multibuffer) { + size_t size_elements = v_buffer.size(); + size_t size_bytes = size_elements * sizeof(float); + size_t vertices_count = size_elements / t_buffer.vertices.vertex_size_floats(); + t_buffer.vertices.count += vertices_count; - if (buffer.vertices.count > 0) { #if ENABLE_GCODE_VIEWER_STATISTICS + m_statistics.total_vertices_gpu_size += static_cast(size_bytes); + m_statistics.max_vbuffer_gpu_size = std::max(m_statistics.max_vbuffer_gpu_size, static_cast(size_bytes)); ++m_statistics.vbuffers_count; #endif // ENABLE_GCODE_VIEWER_STATISTICS - glsafe(::glGenBuffers(1, &buffer.vertices.id)); - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, buffer.vertices.id)); - glsafe(::glBufferData(GL_ARRAY_BUFFER, buffer_vertices.size() * sizeof(float), buffer_vertices.data(), GL_STATIC_DRAW)); + + GLuint id = 0; + glsafe(::glGenBuffers(1, &id)); + t_buffer.vertices.vbos.push_back(static_cast(id)); + t_buffer.vertices.sizes.push_back(size_bytes); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, id)); + glsafe(::glBufferData(GL_ARRAY_BUFFER, size_bytes, v_buffer.data(), GL_STATIC_DRAW)); glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); } } +#if ENABLE_GCODE_VIEWER_STATISTICS + auto smooth_vertices_time = std::chrono::high_resolution_clock::now(); + m_statistics.smooth_vertices = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - load_vertices_time).count(); +#endif // ENABLE_GCODE_VIEWER_STATISTICS + log_memory_usage("Loaded G-code generated vertex buffers ", vertices, indices); + // dismiss vertices data, no more needed - std::vector>().swap(vertices); + std::vector().swap(vertices); // toolpaths data -> extract indices from result // paths may have been filled while extracting vertices, @@ -1482,16 +1786,28 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) buffer.paths.clear(); } - // max index buffer size - const size_t IBUFFER_THRESHOLD = 1024 * 1024 * 32; + // variable used to keep track of the current vertex buffers index and size + using CurrVertexBuffer = std::pair; + std::vector curr_vertex_buffers(m_buffers.size(), { 0, 0 }); + + // variable used to keep track of the vertex buffers ids + using VboIndexList = std::vector; + std::vector vbo_indices(m_buffers.size()); - // variable used to keep track of the current size (in vertices) of the vertex buffer - std::vector curr_buffer_vertices_size(m_buffers.size(), 0); for (size_t i = 0; i < m_moves_count; ++i) { + const GCodeProcessor::MoveVertex& curr = gcode_result.moves[i]; + // skip first vertex if (i == 0) continue; + const GCodeProcessor::MoveVertex& prev = gcode_result.moves[i - 1]; +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + const GCodeProcessor::MoveVertex* next = nullptr; + if (i < m_moves_count - 1) + next = &gcode_result.moves[i + 1]; +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + ++progress_count; if (progress_dialog != nullptr && progress_count % progress_threshold == 0) { progress_dialog->Update(int(100.0f * float(m_moves_count + i) / (2.0f * float(m_moves_count))), @@ -1500,115 +1816,149 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) progress_count = 0; } - const GCodeProcessor::MoveVertex& prev = gcode_result.moves[i - 1]; - const GCodeProcessor::MoveVertex& curr = gcode_result.moves[i]; - unsigned char id = buffer_id(curr.type); - TBuffer& buffer = m_buffers[id]; - MultiIndexBuffer& buffer_indices = indices[id]; - if (buffer_indices.empty()) - buffer_indices.push_back(IndexBuffer()); + TBuffer& t_buffer = m_buffers[id]; + MultiIndexBuffer& i_multibuffer = indices[id]; + CurrVertexBuffer& curr_vertex_buffer = curr_vertex_buffers[id]; + VboIndexList& vbo_index_list = vbo_indices[id]; + + // ensure there is at least one index buffer + if (i_multibuffer.empty()) { + i_multibuffer.push_back(IndexBuffer()); + vbo_index_list.push_back(t_buffer.vertices.vbos[curr_vertex_buffer.first]); + } // if adding the indices for the current segment exceeds the threshold size of the current index buffer - // create another index buffer, and move the current path indices into it - if (buffer_indices.back().size() >= IBUFFER_THRESHOLD - static_cast(buffer.indices_per_segment())) { - buffer_indices.push_back(IndexBuffer()); - if (buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::Point) { - if (!(prev.type != curr.type || !buffer.paths.back().matches(curr))) { - Path& last_path = buffer.paths.back(); - size_t delta_id = last_path.last.i_id - last_path.first.i_id; + // create another index buffer +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + if (i_multibuffer.back().size() * sizeof(IBufferType) >= IBUFFER_THRESHOLD_BYTES - t_buffer.max_indices_per_segment_size_bytes()) { +#else + if (i_multibuffer.back().size() * sizeof(IBufferType) >= IBUFFER_THRESHOLD_BYTES - t_buffer.indices_per_segment_size_bytes()) { +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + i_multibuffer.push_back(IndexBuffer()); + vbo_index_list.push_back(t_buffer.vertices.vbos[curr_vertex_buffer.first]); + if (t_buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::Point) { + Path& last_path = t_buffer.paths.back(); + last_path.add_sub_path(prev, static_cast(i_multibuffer.size()) - 1, 0, i - 1); + } + } - // move indices of the last path from the previous into the new index buffer - IndexBuffer& src_buffer = buffer_indices[buffer_indices.size() - 2]; - IndexBuffer& dst_buffer = buffer_indices[buffer_indices.size() - 1]; - std::move(src_buffer.begin() + last_path.first.i_id, src_buffer.end(), std::back_inserter(dst_buffer)); - src_buffer.erase(src_buffer.begin() + last_path.first.i_id, src_buffer.end()); + // if adding the vertices for the current segment exceeds the threshold size of the current vertex buffer + // create another index buffer + if (curr_vertex_buffer.second * t_buffer.vertices.vertex_size_bytes() > t_buffer.vertices.max_size_bytes() - t_buffer.max_vertices_per_segment_size_bytes()) { + i_multibuffer.push_back(IndexBuffer()); - // updates path indices - last_path.first.b_id = buffer_indices.size() - 1; - last_path.first.i_id = 0; - last_path.last.b_id = buffer_indices.size() - 1; - last_path.last.i_id = delta_id; - } + ++curr_vertex_buffer.first; + curr_vertex_buffer.second = 0; + vbo_index_list.push_back(t_buffer.vertices.vbos[curr_vertex_buffer.first]); + + if (t_buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::Point) { + Path& last_path = t_buffer.paths.back(); + last_path.add_sub_path(prev, static_cast(i_multibuffer.size()) - 1, 0, i - 1); } } - switch (buffer.render_primitive_type) + IndexBuffer& i_buffer = i_multibuffer.back(); + + switch (t_buffer.render_primitive_type) { case TBuffer::ERenderPrimitiveType::Point: { - add_indices_as_point(curr, buffer, static_cast(buffer_indices.size()) - 1, buffer_indices.back(), i); + add_indices_as_point(curr, t_buffer, static_cast(i_multibuffer.size()) - 1, i_buffer, i); + curr_vertex_buffer.second += t_buffer.max_vertices_per_segment(); break; } case TBuffer::ERenderPrimitiveType::Line: { - add_indices_as_line(prev, curr, buffer, static_cast(buffer_indices.size()) - 1, buffer_indices.back(), i); + add_indices_as_line(prev, curr, t_buffer, static_cast(i_multibuffer.size()) - 1, i_buffer, i); + curr_vertex_buffer.second += t_buffer.max_vertices_per_segment(); break; } case TBuffer::ERenderPrimitiveType::Triangle: { - add_indices_as_solid(prev, curr, buffer, curr_buffer_vertices_size[id], static_cast(buffer_indices.size()) - 1, buffer_indices.back(), i); +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + add_indices_as_solid(prev, curr, next, t_buffer, curr_vertex_buffer.second, static_cast(i_multibuffer.size()) - 1, i_buffer, i); +#else + add_indices_as_solid(prev, curr, t_buffer, curr_vertex_buffer.second, static_cast(i_multibuffer.size()) - 1, i_buffer, i); +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS break; } } } - if (progress_dialog != nullptr) { - progress_dialog->Update(100, ""); - progress_dialog->Fit(); + for (MultiIndexBuffer& i_multibuffer : indices) { + for (IndexBuffer& i_buffer : i_multibuffer) { + i_buffer.shrink_to_fit(); + } } - log_memory_usage("Loaded G-code generated indices buffers, ", vertices, indices); - // toolpaths data -> send indices data to gpu for (size_t i = 0; i < m_buffers.size(); ++i) { - TBuffer& buffer = m_buffers[i]; + TBuffer& t_buffer = m_buffers[i]; + const MultiIndexBuffer& i_multibuffer = indices[i]; + for (const IndexBuffer& i_buffer : i_multibuffer) { + size_t size_elements = i_buffer.size(); + size_t size_bytes = size_elements * sizeof(IBufferType); + + // stores index buffer informations into TBuffer + t_buffer.indices.push_back(IBuffer()); + IBuffer& ibuf = t_buffer.indices.back(); + ibuf.count = size_elements; + ibuf.vbo = vbo_indices[i][t_buffer.indices.size() - 1]; - for (size_t j = 0; j < indices[i].size(); ++j) { - const IndexBuffer& buffer_indices = indices[i][j]; - buffer.indices.push_back(IBuffer()); - IBuffer& ibuffer = buffer.indices.back(); - ibuffer.count = buffer_indices.size(); #if ENABLE_GCODE_VIEWER_STATISTICS - m_statistics.total_indices_gpu_size += ibuffer.count * sizeof(unsigned int); - m_statistics.max_ibuffer_gpu_size = std::max(m_statistics.max_ibuffer_gpu_size, static_cast(ibuffer.count * sizeof(unsigned int))); - m_statistics.max_indices_in_index_buffer = std::max(m_statistics.max_indices_in_index_buffer, static_cast(ibuffer.count)); + m_statistics.total_indices_gpu_size += static_cast(size_bytes); + m_statistics.max_ibuffer_gpu_size = std::max(m_statistics.max_ibuffer_gpu_size, static_cast(size_bytes)); + ++m_statistics.ibuffers_count; #endif // ENABLE_GCODE_VIEWER_STATISTICS - if (ibuffer.count > 0) { -#if ENABLE_GCODE_VIEWER_STATISTICS - ++m_statistics.ibuffers_count; -#endif // ENABLE_GCODE_VIEWER_STATISTICS - glsafe(::glGenBuffers(1, &ibuffer.id)); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibuffer.id)); - glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, buffer_indices.size() * sizeof(unsigned int), buffer_indices.data(), GL_STATIC_DRAW)); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); - } + glsafe(::glGenBuffers(1, &ibuf.ibo)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibuf.ibo)); + glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, size_bytes, i_buffer.data(), GL_STATIC_DRAW)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); } } + if (progress_dialog != nullptr) { + progress_dialog->Update(100, ""); + progress_dialog->Fit(); + } + #if ENABLE_GCODE_VIEWER_STATISTICS for (const TBuffer& buffer : m_buffers) { m_statistics.paths_size += SLIC3R_STDVEC_MEMSIZE(buffer.paths, Path); } - unsigned int travel_buffer_id = buffer_id(EMoveType::Travel); - const MultiIndexBuffer& travel_buffer_indices = indices[travel_buffer_id]; - for (size_t i = 0; i < travel_buffer_indices.size(); ++i) { - m_statistics.travel_segments_count = travel_buffer_indices[i].size() / m_buffers[travel_buffer_id].indices_per_segment(); - } - unsigned int wipe_buffer_id = buffer_id(EMoveType::Wipe); - const MultiIndexBuffer& wipe_buffer_indices = indices[wipe_buffer_id]; - for (size_t i = 0; i < wipe_buffer_indices.size(); ++i) { - m_statistics.wipe_segments_count = wipe_buffer_indices[i].size() / m_buffers[wipe_buffer_id].indices_per_segment(); - } - unsigned int extrude_buffer_id = buffer_id(EMoveType::Extrude); - const MultiIndexBuffer& extrude_buffer_indices = indices[extrude_buffer_id]; - for (size_t i = 0; i < extrude_buffer_indices.size(); ++i) { - m_statistics.extrude_segments_count = extrude_buffer_indices[i].size() / m_buffers[extrude_buffer_id].indices_per_segment(); - } + + auto update_segments_count = [&](EMoveType type, int64_t& count) { + unsigned int id = buffer_id(type); + const MultiIndexBuffer& buffers = indices[id]; +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + int64_t indices_count = 0; + for (const IndexBuffer& buffer : buffers) { + indices_count += buffer.size(); + } + const TBuffer& t_buffer = m_buffers[id]; + if (t_buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle) + indices_count -= static_cast(12 * t_buffer.paths.size()); // remove the starting + ending caps = 4 triangles + + count += indices_count / t_buffer.indices_per_segment(); +#else + for (const IndexBuffer& buffer : buffers) { + count += buffer.size() / m_buffers[id].indices_per_segment(); + } +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + }; + + update_segments_count(EMoveType::Travel, m_statistics.travel_segments_count); + update_segments_count(EMoveType::Wipe, m_statistics.wipe_segments_count); + update_segments_count(EMoveType::Extrude, m_statistics.extrude_segments_count); + + m_statistics.load_indices = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - smooth_vertices_time).count(); #endif // ENABLE_GCODE_VIEWER_STATISTICS + log_memory_usage("Loaded G-code generated indices buffers ", vertices, indices); + // dismiss indices data, no more needed std::vector().swap(indices); - // layers zs / roles / extruder ids / cp color ids -> extract from result + // layers zs / roles / extruder ids -> extract from result size_t last_travel_s_id = 0; for (size_t i = 0; i < m_moves_count; ++i) { const GCodeProcessor::MoveVertex& move = gcode_result.moves[i]; @@ -1630,102 +1980,1190 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) if (i - last_travel_s_id > 1 && !m_layers.empty()) m_layers.get_endpoints().back().last = i; - last_travel_s_id = i; + last_travel_s_id = i; + } + } + + // roles -> remove duplicates + std::sort(m_roles.begin(), m_roles.end()); + m_roles.erase(std::unique(m_roles.begin(), m_roles.end()), m_roles.end()); + m_roles.shrink_to_fit(); + + // extruder ids -> remove duplicates + std::sort(m_extruder_ids.begin(), m_extruder_ids.end()); + m_extruder_ids.erase(std::unique(m_extruder_ids.begin(), m_extruder_ids.end()), m_extruder_ids.end()); + m_extruder_ids.shrink_to_fit(); + + // set layers z range + if (!m_layers.empty()) + m_layers_z_range = { 0, static_cast(m_layers.size() - 1) }; + + // change color of paths whose layer contains option points + if (!options_zs.empty()) { + TBuffer& extrude_buffer = m_buffers[buffer_id(EMoveType::Extrude)]; + for (Path& path : extrude_buffer.paths) { + float z = path.sub_paths.front().first.position[2]; + if (std::find_if(options_zs.begin(), options_zs.end(), [z](float f) { return f - EPSILON <= z && z <= f + EPSILON; }) != options_zs.end()) + path.cp_color_id = 255 - path.cp_color_id; + } + } + +#if ENABLE_GCODE_VIEWER_STATISTICS + m_statistics.load_time = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - start_time).count(); +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + if (progress_dialog != nullptr) + progress_dialog->Destroy(); +} +#else +void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) +{ +#if ENABLE_GCODE_VIEWER_STATISTICS + auto start_time = std::chrono::high_resolution_clock::now(); + m_statistics.results_size = SLIC3R_STDVEC_MEMSIZE(gcode_result.moves, GCodeProcessor::MoveVertex); + m_statistics.results_time = gcode_result.time; +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + // vertices data + m_moves_count = gcode_result.moves.size(); + if (m_moves_count == 0) + return; + + unsigned int progress_count = 0; + static const unsigned int progress_threshold = 1000; + wxProgressDialog* progress_dialog = wxGetApp().is_gcode_viewer() ? + new wxProgressDialog(_L("Generating toolpaths"), "...", + 100, wxGetApp().plater(), wxPD_AUTO_HIDE | wxPD_APP_MODAL) : nullptr; + + m_extruders_count = gcode_result.extruders_count; + + for (size_t i = 0; i < m_moves_count; ++i) { + const GCodeProcessor::MoveVertex& move = gcode_result.moves[i]; + if (wxGetApp().is_gcode_viewer()) + // for the gcode viewer we need all moves to correctly size the printbed + m_paths_bounding_box.merge(move.position.cast()); + else { + if (move.type == EMoveType::Extrude && move.width != 0.0f && move.height != 0.0f) + m_paths_bounding_box.merge(move.position.cast()); + } + } + + // max bounding box (account for tool marker) + m_max_bounding_box = m_paths_bounding_box; + m_max_bounding_box.merge(m_paths_bounding_box.max + m_sequential_view.marker.get_bounding_box().size()[2] * Vec3d::UnitZ()); + + auto log_memory_usage = [this](const std::string& label, const std::vector& vertices, const std::vector& indices) { + int64_t vertices_size = 0; + for (size_t i = 0; i < vertices.size(); ++i) { + vertices_size += SLIC3R_STDVEC_MEMSIZE(vertices[i], float); + } + int64_t indices_size = 0; + for (size_t i = 0; i < indices.size(); ++i) { + for (size_t j = 0; j < indices[i].size(); ++j) { + indices_size += SLIC3R_STDVEC_MEMSIZE(indices[i][j], unsigned int); + } + } + log_memory_used(label, vertices_size + indices_size); + }; + + // format data into the buffers to be rendered as points + auto add_vertices_as_point = [](const GCodeProcessor::MoveVertex& curr, VertexBuffer& vertices) { + vertices.push_back(curr.position[0]); + vertices.push_back(curr.position[1]); + vertices.push_back(curr.position[2]); + }; + auto add_indices_as_point = [](const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, + unsigned int index_buffer_id, IndexBuffer& indices, size_t move_id) { + buffer.add_path(curr, index_buffer_id, indices.size(), move_id); + indices.push_back(static_cast(indices.size())); + }; + + // format data into the buffers to be rendered as lines + auto add_vertices_as_line = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, + VertexBuffer& vertices) { + // x component of the normal to the current segment (the normal is parallel to the XY plane) + float normal_x = (curr.position - prev.position).normalized()[1]; + + auto add_vertex = [&vertices, normal_x](const GCodeProcessor::MoveVertex& vertex) { + // add position + vertices.push_back(vertex.position[0]); + vertices.push_back(vertex.position[1]); + vertices.push_back(vertex.position[2]); + // add normal x component + vertices.push_back(normal_x); + }; + + // add previous vertex + add_vertex(prev); + // add current vertex + add_vertex(curr); + }; + auto add_indices_as_line = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, + unsigned int index_buffer_id, IndexBuffer& indices, size_t move_id) { + if (prev.type != curr.type || !buffer.paths.back().matches(curr)) { + // add starting index + indices.push_back(static_cast(indices.size())); + buffer.add_path(curr, index_buffer_id, indices.size() - 1, move_id - 1); + buffer.paths.back().first.position = prev.position; + } + + Path& last_path = buffer.paths.back(); + if (last_path.first.i_id != last_path.last.i_id) { + // add previous index + indices.push_back(static_cast(indices.size())); + } + + // add current index + indices.push_back(static_cast(indices.size())); + last_path.last = { index_buffer_id, indices.size() - 1, move_id, curr.position }; + }; + + // format data into the buffers to be rendered as solid + auto add_vertices_as_solid = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, + VertexBuffer& vertices, size_t move_id) { + static Vec3f prev_dir; + static Vec3f prev_up; + static float prev_length; + auto store_vertex = [](VertexBuffer& vertices, const Vec3f& position, const Vec3f& normal) { + // append position + vertices.push_back(position[0]); + vertices.push_back(position[1]); + vertices.push_back(position[2]); + // append normal + vertices.push_back(normal[0]); + vertices.push_back(normal[1]); + vertices.push_back(normal[2]); + }; + auto extract_position_at = [](const VertexBuffer& vertices, size_t id) { + return Vec3f(vertices[id + 0], vertices[id + 1], vertices[id + 2]); + }; + auto update_position_at = [](VertexBuffer& vertices, size_t id, const Vec3f& position) { + vertices[id + 0] = position[0]; + vertices[id + 1] = position[1]; + vertices[id + 2] = position[2]; + }; + + if (prev.type != curr.type || !buffer.paths.back().matches(curr)) { + buffer.add_path(curr, 0, 0, move_id - 1); + buffer.paths.back().first.position = prev.position; + } + + unsigned int starting_vertices_size = static_cast(vertices.size() / buffer.vertices.vertex_size_floats()); + + Vec3f dir = (curr.position - prev.position).normalized(); + Vec3f right = (std::abs(std::abs(dir.dot(Vec3f::UnitZ())) - 1.0f) < EPSILON) ? -Vec3f::UnitY() : Vec3f(dir[1], -dir[0], 0.0f).normalized(); + Vec3f left = -right; + Vec3f up = right.cross(dir); + Vec3f down = -up; + + Path& last_path = buffer.paths.back(); + + float half_width = 0.5f * last_path.width; + float half_height = 0.5f * last_path.height; + + Vec3f prev_pos = prev.position - half_height * up; + Vec3f curr_pos = curr.position - half_height * up; + + float length = (curr_pos - prev_pos).norm(); + if (last_path.vertices_count() == 1) { + // 1st segment + + // vertices 1st endpoint + store_vertex(vertices, prev_pos + half_height * up, up); + store_vertex(vertices, prev_pos + half_width * right, right); + store_vertex(vertices, prev_pos + half_height * down, down); + store_vertex(vertices, prev_pos + half_width * left, left); + + // vertices 2nd endpoint + store_vertex(vertices, curr_pos + half_height * up, up); + store_vertex(vertices, curr_pos + half_width * right, right); + store_vertex(vertices, curr_pos + half_height * down, down); + store_vertex(vertices, curr_pos + half_width * left, left); + } + else { + // any other segment + float displacement = 0.0f; + float cos_dir = prev_dir.dot(dir); + if (cos_dir > -0.9998477f) { + // if the angle between adjacent segments is smaller than 179 degrees + Vec3f med_dir = (prev_dir + dir).normalized(); + displacement = half_width * ::tan(::acos(std::clamp(dir.dot(med_dir), -1.0f, 1.0f))); + } + + Vec3f displacement_vec = displacement * prev_dir; + bool can_displace = displacement > 0.0f && displacement < prev_length&& displacement < length; + + size_t prev_right_id = (starting_vertices_size - 3) * buffer.vertices.vertex_size_floats(); + size_t prev_left_id = (starting_vertices_size - 1) * buffer.vertices.vertex_size_floats(); + Vec3f prev_right_pos = extract_position_at(vertices, prev_right_id); + Vec3f prev_left_pos = extract_position_at(vertices, prev_left_id); + + bool is_right_turn = prev_up.dot(prev_dir.cross(dir)) <= 0.0f; + // whether the angle between adjacent segments is greater than 45 degrees + bool is_sharp = cos_dir < 0.7071068f; + + bool right_displaced = false; + bool left_displaced = false; + + // displace the vertex (inner with respect to the corner) of the previous segment 2nd enpoint, if possible + if (can_displace) { + if (is_right_turn) { + prev_right_pos -= displacement_vec; + update_position_at(vertices, prev_right_id, prev_right_pos); + right_displaced = true; + } + else { + prev_left_pos -= displacement_vec; + update_position_at(vertices, prev_left_id, prev_left_pos); + left_displaced = true; + } + } + + if (!is_sharp) { + // displace the vertex (outer with respect to the corner) of the previous segment 2nd enpoint, if possible + if (can_displace) { + if (is_right_turn) { + prev_left_pos += displacement_vec; + update_position_at(vertices, prev_left_id, prev_left_pos); + left_displaced = true; + } + else { + prev_right_pos += displacement_vec; + update_position_at(vertices, prev_right_id, prev_right_pos); + right_displaced = true; + } + } + + // vertices 1st endpoint (top and bottom are from previous segment 2nd endpoint) + // vertices position matches that of the previous segment 2nd endpoint, if displaced + store_vertex(vertices, right_displaced ? prev_right_pos : prev_pos + half_width * right, right); + store_vertex(vertices, left_displaced ? prev_left_pos : prev_pos + half_width * left, left); + } + else { + // vertices 1st endpoint (top and bottom are from previous segment 2nd endpoint) + // the inner corner vertex position matches that of the previous segment 2nd endpoint, if displaced + if (is_right_turn) { + store_vertex(vertices, right_displaced ? prev_right_pos : prev_pos + half_width * right, right); + store_vertex(vertices, prev_pos + half_width * left, left); + } + else { + store_vertex(vertices, prev_pos + half_width * right, right); + store_vertex(vertices, left_displaced ? prev_left_pos : prev_pos + half_width * left, left); + } + } + + // vertices 2nd endpoint + store_vertex(vertices, curr_pos + half_height * up, up); + store_vertex(vertices, curr_pos + half_width * right, right); + store_vertex(vertices, curr_pos + half_height * down, down); + store_vertex(vertices, curr_pos + half_width * left, left); + } + + last_path.last = { 0, 0, move_id, curr.position }; + prev_dir = dir; + prev_up = up; + prev_length = length; + }; + auto add_indices_as_solid = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, + size_t& buffer_vertices_size, unsigned int index_buffer_id, IndexBuffer& indices, size_t move_id) { + static Vec3f prev_dir; + static Vec3f prev_up; + static float prev_length; + auto store_triangle = [](IndexBuffer& indices, unsigned int i1, unsigned int i2, unsigned int i3) { + indices.push_back(i1); + indices.push_back(i2); + indices.push_back(i3); + }; + auto append_dummy_cap = [store_triangle](IndexBuffer& indices, unsigned int id) { + store_triangle(indices, id, id, id); + store_triangle(indices, id, id, id); + }; + + if (prev.type != curr.type || !buffer.paths.back().matches(curr)) { + buffer.add_path(curr, index_buffer_id, indices.size(), move_id - 1); + buffer.paths.back().first.position = prev.position; + } + + Vec3f dir = (curr.position - prev.position).normalized(); + Vec3f right = (std::abs(std::abs(dir.dot(Vec3f::UnitZ())) - 1.0f) < EPSILON) ? -Vec3f::UnitY() : Vec3f(dir[1], -dir[0], 0.0f).normalized(); + Vec3f up = right.cross(dir); + + Path& last_path = buffer.paths.back(); + + float half_width = 0.5f * last_path.width; + float half_height = 0.5f * last_path.height; + + Vec3f prev_pos = prev.position - half_height * up; + Vec3f curr_pos = curr.position - half_height * up; + + float length = (curr_pos - prev_pos).norm(); + if (last_path.vertices_count() == 1) { + // 1st segment + + // triangles starting cap + store_triangle(indices, buffer_vertices_size + 0, buffer_vertices_size + 2, buffer_vertices_size + 1); + store_triangle(indices, buffer_vertices_size + 0, buffer_vertices_size + 3, buffer_vertices_size + 2); + + // dummy triangles outer corner cap + append_dummy_cap(indices, buffer_vertices_size); + + // triangles sides + store_triangle(indices, buffer_vertices_size + 0, buffer_vertices_size + 1, buffer_vertices_size + 4); + store_triangle(indices, buffer_vertices_size + 1, buffer_vertices_size + 5, buffer_vertices_size + 4); + store_triangle(indices, buffer_vertices_size + 1, buffer_vertices_size + 2, buffer_vertices_size + 5); + store_triangle(indices, buffer_vertices_size + 2, buffer_vertices_size + 6, buffer_vertices_size + 5); + store_triangle(indices, buffer_vertices_size + 2, buffer_vertices_size + 3, buffer_vertices_size + 6); + store_triangle(indices, buffer_vertices_size + 3, buffer_vertices_size + 7, buffer_vertices_size + 6); + store_triangle(indices, buffer_vertices_size + 3, buffer_vertices_size + 0, buffer_vertices_size + 7); + store_triangle(indices, buffer_vertices_size + 0, buffer_vertices_size + 4, buffer_vertices_size + 7); + + // triangles ending cap + store_triangle(indices, buffer_vertices_size + 4, buffer_vertices_size + 6, buffer_vertices_size + 7); + store_triangle(indices, buffer_vertices_size + 4, buffer_vertices_size + 5, buffer_vertices_size + 6); + + buffer_vertices_size += 8; + } + else { + // any other segment + float displacement = 0.0f; + float cos_dir = prev_dir.dot(dir); + if (cos_dir > -0.9998477f) { + // if the angle between adjacent segments is smaller than 179 degrees + Vec3f med_dir = (prev_dir + dir).normalized(); + displacement = half_width * ::tan(::acos(std::clamp(dir.dot(med_dir), -1.0f, 1.0f))); + } + + Vec3f displacement_vec = displacement * prev_dir; + bool can_displace = displacement > 0.0f && displacement < prev_length && displacement < length; + + bool is_right_turn = prev_up.dot(prev_dir.cross(dir)) <= 0.0f; + // whether the angle between adjacent segments is greater than 45 degrees + bool is_sharp = cos_dir < 0.7071068f; + + bool right_displaced = false; + bool left_displaced = false; + + if (!is_sharp) { + if (can_displace) { + if (is_right_turn) + left_displaced = true; + else + right_displaced = true; + } + } + + // triangles starting cap + store_triangle(indices, buffer_vertices_size - 4, buffer_vertices_size - 2, buffer_vertices_size + 0); + store_triangle(indices, buffer_vertices_size - 4, buffer_vertices_size + 1, buffer_vertices_size - 2); + + // triangles outer corner cap + if (is_right_turn) { + if (left_displaced) + // dummy triangles + append_dummy_cap(indices, buffer_vertices_size); + else { + store_triangle(indices, buffer_vertices_size - 4, buffer_vertices_size + 1, buffer_vertices_size - 1); + store_triangle(indices, buffer_vertices_size + 1, buffer_vertices_size - 2, buffer_vertices_size - 1); + } + } + else { + if (right_displaced) + // dummy triangles + append_dummy_cap(indices, buffer_vertices_size); + else { + store_triangle(indices, buffer_vertices_size - 4, buffer_vertices_size - 3, buffer_vertices_size + 0); + store_triangle(indices, buffer_vertices_size - 3, buffer_vertices_size - 2, buffer_vertices_size + 0); + } + } + + // triangles sides + store_triangle(indices, buffer_vertices_size - 4, buffer_vertices_size + 0, buffer_vertices_size + 2); + store_triangle(indices, buffer_vertices_size + 0, buffer_vertices_size + 3, buffer_vertices_size + 2); + store_triangle(indices, buffer_vertices_size + 0, buffer_vertices_size - 2, buffer_vertices_size + 3); + store_triangle(indices, buffer_vertices_size - 2, buffer_vertices_size + 4, buffer_vertices_size + 3); + store_triangle(indices, buffer_vertices_size - 2, buffer_vertices_size + 1, buffer_vertices_size + 4); + store_triangle(indices, buffer_vertices_size + 1, buffer_vertices_size + 5, buffer_vertices_size + 4); + store_triangle(indices, buffer_vertices_size + 1, buffer_vertices_size - 4, buffer_vertices_size + 5); + store_triangle(indices, buffer_vertices_size - 4, buffer_vertices_size + 2, buffer_vertices_size + 5); + + // triangles ending cap + store_triangle(indices, buffer_vertices_size + 2, buffer_vertices_size + 4, buffer_vertices_size + 5); + store_triangle(indices, buffer_vertices_size + 2, buffer_vertices_size + 3, buffer_vertices_size + 4); + + buffer_vertices_size += 6; + } + + last_path.last = { index_buffer_id, indices.size() - 1, move_id, curr.position }; + prev_dir = dir; + prev_up = up; + prev_length = length; + }; + + wxBusyCursor busy; + + // to reduce the peak in memory usage, we split the generation of the vertex and index buffers in two steps. + // the data are deleted as soon as they are sent to the gpu. + std::vector vertices(m_buffers.size()); + std::vector indices(m_buffers.size()); + std::vector options_zs; + + // toolpaths data -> extract vertices from result + for (size_t i = 0; i < m_moves_count; ++i) { + // skip first vertex + if (i == 0) + continue; + + ++progress_count; + if (progress_dialog != nullptr && progress_count % progress_threshold == 0) { + progress_dialog->Update(int(100.0f * float(i) / (2.0f * float(m_moves_count))), + _L("Generating vertex buffer") + ": " + wxNumberFormatter::ToString(100.0 * double(i) / double(m_moves_count), 0, wxNumberFormatter::Style_None) + "%"); + progress_dialog->Fit(); + progress_count = 0; + } + + const GCodeProcessor::MoveVertex& prev = gcode_result.moves[i - 1]; + const GCodeProcessor::MoveVertex& curr = gcode_result.moves[i]; + + unsigned char id = buffer_id(curr.type); + TBuffer& buffer = m_buffers[id]; + VertexBuffer& buffer_vertices = vertices[id]; + + switch (buffer.render_primitive_type) + { + case TBuffer::ERenderPrimitiveType::Point: { + add_vertices_as_point(curr, buffer_vertices); + break; + } + case TBuffer::ERenderPrimitiveType::Line: { + add_vertices_as_line(prev, curr, buffer_vertices); + break; + } + case TBuffer::ERenderPrimitiveType::Triangle: { + add_vertices_as_solid(prev, curr, buffer, buffer_vertices, i); + break; + } + } + + if (curr.type == EMoveType::Pause_Print || curr.type == EMoveType::Custom_GCode) { + const float* const last_z = options_zs.empty() ? nullptr : &options_zs.back(); + if (last_z == nullptr || curr.position[2] < *last_z - EPSILON || *last_z + EPSILON < curr.position[2]) + options_zs.emplace_back(curr.position[2]); + } + } + + // move the wipe toolpaths half height up to render them on proper position + VertexBuffer& wipe_vertices = vertices[buffer_id(EMoveType::Wipe)]; + for (size_t i = 2; i < wipe_vertices.size(); i += 3) { + wipe_vertices[i] += 0.5f * GCodeProcessor::Wipe_Height; + } + + log_memory_usage("Loaded G-code generated vertex buffers, ", vertices, indices); + + // toolpaths data -> send vertices data to gpu + for (size_t i = 0; i < m_buffers.size(); ++i) { + TBuffer& buffer = m_buffers[i]; + + const VertexBuffer& buffer_vertices = vertices[i]; + buffer.vertices.count = buffer_vertices.size() / buffer.vertices.vertex_size_floats(); +#if ENABLE_GCODE_VIEWER_STATISTICS + m_statistics.total_vertices_gpu_size += buffer_vertices.size() * sizeof(float); + m_statistics.max_vbuffer_gpu_size = std::max(m_statistics.max_vbuffer_gpu_size, static_cast(buffer_vertices.size() * sizeof(float))); +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + if (buffer.vertices.count > 0) { +#if ENABLE_GCODE_VIEWER_STATISTICS + ++m_statistics.vbuffers_count; +#endif // ENABLE_GCODE_VIEWER_STATISTICS + glsafe(::glGenBuffers(1, &buffer.vertices.id)); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, buffer.vertices.id)); + glsafe(::glBufferData(GL_ARRAY_BUFFER, buffer_vertices.size() * sizeof(float), buffer_vertices.data(), GL_STATIC_DRAW)); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); + } + } + + // dismiss vertices data, no more needed + std::vector().swap(vertices); + + // toolpaths data -> extract indices from result + // paths may have been filled while extracting vertices, + // so reset them, they will be filled again while extracting indices + for (TBuffer& buffer : m_buffers) { + buffer.paths.clear(); + } + + // max index buffer size + const size_t IBUFFER_THRESHOLD = 1024 * 1024 * 32; + + // variable used to keep track of the current size (in vertices) of the vertex buffer + std::vector curr_buffer_vertices_size(m_buffers.size(), 0); + for (size_t i = 0; i < m_moves_count; ++i) { + // skip first vertex + if (i == 0) + continue; + + ++progress_count; + if (progress_dialog != nullptr && progress_count % progress_threshold == 0) { + progress_dialog->Update(int(100.0f * float(m_moves_count + i) / (2.0f * float(m_moves_count))), + _L("Generating index buffers") + ": " + wxNumberFormatter::ToString(100.0 * double(i) / double(m_moves_count), 0, wxNumberFormatter::Style_None) + "%"); + progress_dialog->Fit(); + progress_count = 0; + } + + const GCodeProcessor::MoveVertex& prev = gcode_result.moves[i - 1]; + const GCodeProcessor::MoveVertex& curr = gcode_result.moves[i]; + + unsigned char id = buffer_id(curr.type); + TBuffer& buffer = m_buffers[id]; + MultiIndexBuffer& buffer_indices = indices[id]; + if (buffer_indices.empty()) + buffer_indices.push_back(IndexBuffer()); + + // if adding the indices for the current segment exceeds the threshold size of the current index buffer + // create another index buffer, and move the current path indices into it + if (buffer_indices.back().size() >= IBUFFER_THRESHOLD - static_cast(buffer.indices_per_segment())) { + buffer_indices.push_back(IndexBuffer()); + if (buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::Point) { + if (!(prev.type != curr.type || !buffer.paths.back().matches(curr))) { + Path& last_path = buffer.paths.back(); + size_t delta_id = last_path.last.i_id - last_path.first.i_id; + + // move indices of the last path from the previous into the new index buffer + IndexBuffer& src_buffer = buffer_indices[buffer_indices.size() - 2]; + IndexBuffer& dst_buffer = buffer_indices[buffer_indices.size() - 1]; + std::move(src_buffer.begin() + last_path.first.i_id, src_buffer.end(), std::back_inserter(dst_buffer)); + src_buffer.erase(src_buffer.begin() + last_path.first.i_id, src_buffer.end()); + + // updates path indices + last_path.first.b_id = buffer_indices.size() - 1; + last_path.first.i_id = 0; + last_path.last.b_id = buffer_indices.size() - 1; + last_path.last.i_id = delta_id; + } + } + } + + switch (buffer.render_primitive_type) + { + case TBuffer::ERenderPrimitiveType::Point: { + add_indices_as_point(curr, buffer, static_cast(buffer_indices.size()) - 1, buffer_indices.back(), i); + break; + } + case TBuffer::ERenderPrimitiveType::Line: { + add_indices_as_line(prev, curr, buffer, static_cast(buffer_indices.size()) - 1, buffer_indices.back(), i); + break; + } + case TBuffer::ERenderPrimitiveType::Triangle: { + add_indices_as_solid(prev, curr, buffer, curr_buffer_vertices_size[id], static_cast(buffer_indices.size()) - 1, buffer_indices.back(), i); + break; + } + } + } + + if (progress_dialog != nullptr) { + progress_dialog->Update(100, ""); + progress_dialog->Fit(); + } + + log_memory_usage("Loaded G-code generated indices buffers, ", vertices, indices); + + // toolpaths data -> send indices data to gpu + for (size_t i = 0; i < m_buffers.size(); ++i) { + TBuffer& buffer = m_buffers[i]; + + for (size_t j = 0; j < indices[i].size(); ++j) { + const IndexBuffer& buffer_indices = indices[i][j]; + buffer.indices.push_back(IBuffer()); + IBuffer& ibuffer = buffer.indices.back(); + ibuffer.count = buffer_indices.size(); +#if ENABLE_GCODE_VIEWER_STATISTICS + m_statistics.total_indices_gpu_size += ibuffer.count * sizeof(unsigned int); + m_statistics.max_ibuffer_gpu_size = std::max(m_statistics.max_ibuffer_gpu_size, static_cast(ibuffer.count * sizeof(unsigned int))); +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + if (ibuffer.count > 0) { +#if ENABLE_GCODE_VIEWER_STATISTICS + ++m_statistics.ibuffers_count; +#endif // ENABLE_GCODE_VIEWER_STATISTICS + glsafe(::glGenBuffers(1, &ibuffer.id)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibuffer.id)); + glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, buffer_indices.size() * sizeof(unsigned int), buffer_indices.data(), GL_STATIC_DRAW)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + } + } + } + +#if ENABLE_GCODE_VIEWER_STATISTICS + for (const TBuffer& buffer : m_buffers) { + m_statistics.paths_size += SLIC3R_STDVEC_MEMSIZE(buffer.paths, Path); + } + unsigned int travel_buffer_id = buffer_id(EMoveType::Travel); + const MultiIndexBuffer& travel_buffer_indices = indices[travel_buffer_id]; + for (size_t i = 0; i < travel_buffer_indices.size(); ++i) { + m_statistics.travel_segments_count += travel_buffer_indices[i].size() / m_buffers[travel_buffer_id].indices_per_segment(); + } + unsigned int wipe_buffer_id = buffer_id(EMoveType::Wipe); + const MultiIndexBuffer& wipe_buffer_indices = indices[wipe_buffer_id]; + for (size_t i = 0; i < wipe_buffer_indices.size(); ++i) { + m_statistics.wipe_segments_count += wipe_buffer_indices[i].size() / m_buffers[wipe_buffer_id].indices_per_segment(); + } + unsigned int extrude_buffer_id = buffer_id(EMoveType::Extrude); + const MultiIndexBuffer& extrude_buffer_indices = indices[extrude_buffer_id]; + for (size_t i = 0; i < extrude_buffer_indices.size(); ++i) { + m_statistics.extrude_segments_count += extrude_buffer_indices[i].size() / m_buffers[extrude_buffer_id].indices_per_segment(); + } +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + // dismiss indices data, no more needed + std::vector().swap(indices); + + // layers zs / roles / extruder ids / cp color ids -> extract from result + size_t last_travel_s_id = 0; + for (size_t i = 0; i < m_moves_count; ++i) { + const GCodeProcessor::MoveVertex& move = gcode_result.moves[i]; + if (move.type == EMoveType::Extrude) { + // layers zs + const double* const last_z = m_layers.empty() ? nullptr : &m_layers.get_zs().back(); + double z = static_cast(move.position[2]); + if (last_z == nullptr || z < *last_z - EPSILON || *last_z + EPSILON < z) + m_layers.append(z, { last_travel_s_id, i }); + else + m_layers.get_endpoints().back().last = i; + // extruder ids + m_extruder_ids.emplace_back(move.extruder_id); + // roles + if (i > 0) + m_roles.emplace_back(move.extrusion_role); + } + else if (move.type == EMoveType::Travel) { + if (i - last_travel_s_id > 1 && !m_layers.empty()) + m_layers.get_endpoints().back().last = i; + + last_travel_s_id = i; + } + } + + // set layers z range + if (!m_layers.empty()) + m_layers_z_range = { 0, static_cast(m_layers.size() - 1) }; + + // change color of paths whose layer contains option points + if (!options_zs.empty()) { + TBuffer& extrude_buffer = m_buffers[buffer_id(EMoveType::Extrude)]; + for (Path& path : extrude_buffer.paths) { + float z = path.first.position[2]; + if (std::find_if(options_zs.begin(), options_zs.end(), [z](float f) { return f - EPSILON <= z && z <= f + EPSILON; }) != options_zs.end()) + path.cp_color_id = 255 - path.cp_color_id; + } + } + + // roles -> remove duplicates + std::sort(m_roles.begin(), m_roles.end()); + m_roles.erase(std::unique(m_roles.begin(), m_roles.end()), m_roles.end()); + m_roles.shrink_to_fit(); + + // extruder ids -> remove duplicates + std::sort(m_extruder_ids.begin(), m_extruder_ids.end()); + m_extruder_ids.erase(std::unique(m_extruder_ids.begin(), m_extruder_ids.end()), m_extruder_ids.end()); + m_extruder_ids.shrink_to_fit(); + + log_memory_usage("Loaded G-code generated extrusion paths, ", vertices, indices); + +#if ENABLE_GCODE_VIEWER_STATISTICS + m_statistics.load_time = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - start_time).count(); +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + if (progress_dialog != nullptr) + progress_dialog->Destroy(); +} +#endif // ENABLE_SPLITTED_VERTEX_BUFFER + +void GCodeViewer::load_shells(const Print& print, bool initialized) +{ + if (print.objects().empty()) + // no shells, return + return; + + // adds objects' volumes + int object_id = 0; + for (const PrintObject* obj : print.objects()) { + const ModelObject* model_obj = obj->model_object(); + + std::vector instance_ids(model_obj->instances.size()); + for (int i = 0; i < (int)model_obj->instances.size(); ++i) { + instance_ids[i] = i; + } + + m_shells.volumes.load_object(model_obj, object_id, instance_ids, "object", initialized); + + ++object_id; + } + + if (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() == ptFFF) { + // adds wipe tower's volume + double max_z = print.objects()[0]->model_object()->get_model()->bounding_box().max(2); + const PrintConfig& config = print.config(); + size_t extruders_count = config.nozzle_diameter.size(); + if ((extruders_count > 1) && config.wipe_tower && !config.complete_objects) { + const DynamicPrintConfig& print_config = wxGetApp().preset_bundle->prints.get_edited_preset().config; + double layer_height = print_config.opt_float("layer_height"); + double first_layer_height = print_config.get_abs_value("first_layer_height", layer_height); + double nozzle_diameter = print.config().nozzle_diameter.values[0]; + float depth = print.wipe_tower_data(extruders_count, first_layer_height, nozzle_diameter).depth; + float brim_width = print.wipe_tower_data(extruders_count, first_layer_height, nozzle_diameter).brim_width; + + m_shells.volumes.load_wipe_tower_preview(1000, config.wipe_tower_x, config.wipe_tower_y, config.wipe_tower_width, depth, max_z, config.wipe_tower_rotation_angle, + !print.is_step_done(psWipeTower), brim_width, initialized); + } + } + + // remove modifiers + while (true) { + GLVolumePtrs::iterator it = std::find_if(m_shells.volumes.volumes.begin(), m_shells.volumes.volumes.end(), [](GLVolume* volume) { return volume->is_modifier; }); + if (it != m_shells.volumes.volumes.end()) { + delete (*it); + m_shells.volumes.volumes.erase(it); + } + else + break; + } + + for (GLVolume* volume : m_shells.volumes.volumes) { + volume->zoom_to_volumes = false; + volume->color[3] = 0.25f; + volume->force_native_color = true; + volume->set_render_color(); + } +} + +#if ENABLE_SPLITTED_VERTEX_BUFFER +void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool keep_sequential_current_last) const +{ +#if ENABLE_GCODE_VIEWER_STATISTICS + auto start_time = std::chrono::high_resolution_clock::now(); +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + auto extrusion_color = [this](const Path& path) { + Color color; + switch (m_view_type) + { + case EViewType::FeatureType: { color = Extrusion_Role_Colors[static_cast(path.role)]; break; } + case EViewType::Height: { color = m_extrusions.ranges.height.get_color_at(path.height); break; } + case EViewType::Width: { color = m_extrusions.ranges.width.get_color_at(path.width); break; } + case EViewType::Feedrate: { color = m_extrusions.ranges.feedrate.get_color_at(path.feedrate); break; } + case EViewType::FanSpeed: { color = m_extrusions.ranges.fan_speed.get_color_at(path.fan_speed); break; } + case EViewType::VolumetricRate: { color = m_extrusions.ranges.volumetric_rate.get_color_at(path.volumetric_rate); break; } + case EViewType::Tool: { color = m_tool_colors[path.extruder_id]; break; } + case EViewType::ColorPrint: { + if (path.cp_color_id >= static_cast(m_tool_colors.size())) { + color = { 0.5f, 0.5f, 0.5f }; +// // complementary color +// color = m_tool_colors[255 - path.cp_color_id]; +// color = { 1.0f - color[0], 1.0f - color[1], 1.0f - color[2] }; + } + else + color = m_tool_colors[path.cp_color_id]; + + break; + } + default: { color = { 1.0f, 1.0f, 1.0f }; break; } + } + + return color; + }; + + auto travel_color = [](const Path& path) { + return (path.delta_extruder < 0.0f) ? Travel_Colors[2] /* Retract */ : + ((path.delta_extruder > 0.0f) ? Travel_Colors[1] /* Extrude */ : + Travel_Colors[0] /* Move */); + }; + + auto is_in_layers_range = [this](const Path& path, size_t min_id, size_t max_id) { + auto in_layers_range = [this, min_id, max_id](size_t id) { + return m_layers.get_endpoints_at(min_id).first <= id && id <= m_layers.get_endpoints_at(max_id).last; + }; + + return in_layers_range(path.sub_paths.front().first.s_id) || in_layers_range(path.sub_paths.back().last.s_id); + }; + + auto is_travel_in_layers_range = [this](size_t path_id, size_t min_id, size_t max_id) { + const TBuffer& buffer = m_buffers[buffer_id(EMoveType::Travel)]; + if (path_id >= buffer.paths.size()) + return false; + + Path path = buffer.paths[path_id]; + size_t first = path_id; + size_t last = path_id; + + // check adjacent paths + while (first > 0 && path.sub_paths.front().first.position.isApprox(buffer.paths[first - 1].sub_paths.back().last.position)) { + --first; + path.sub_paths.front().first = buffer.paths[first].sub_paths.front().first; + } + while (last < buffer.paths.size() - 1 && path.sub_paths.back().last.position.isApprox(buffer.paths[last + 1].sub_paths.front().first.position)) { + ++last; + path.sub_paths.back().last = buffer.paths[last].sub_paths.back().last; + } + + size_t min_s_id = m_layers.get_endpoints_at(min_id).first; + size_t max_s_id = m_layers.get_endpoints_at(max_id).last; + + return (min_s_id <= path.sub_paths.front().first.s_id && path.sub_paths.front().first.s_id <= max_s_id) || + (min_s_id <= path.sub_paths.back().last.s_id && path.sub_paths.back().last.s_id <= max_s_id); + }; + +#if ENABLE_GCODE_VIEWER_STATISTICS + Statistics* statistics = const_cast(&m_statistics); + statistics->render_paths_size = 0; +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + bool top_layer_only = get_app_config()->get("seq_top_layer_only") == "1"; + + SequentialView::Endpoints global_endpoints = { m_moves_count , 0 }; + SequentialView::Endpoints top_layer_endpoints = global_endpoints; + SequentialView* sequential_view = const_cast(&m_sequential_view); + if (top_layer_only || !keep_sequential_current_first) sequential_view->current.first = 0; + if (!keep_sequential_current_last) sequential_view->current.last = m_moves_count; + + // first pass: collect visible paths and update sequential view data + std::vector> paths; + for (size_t b = 0; b < m_buffers.size(); ++b) { + TBuffer& buffer = const_cast(m_buffers[b]); + // reset render paths + buffer.render_paths.clear(); + + if (!buffer.visible) + continue; + + for (size_t i = 0; i < buffer.paths.size(); ++i) { + const Path& path = buffer.paths[i]; + if (path.type == EMoveType::Travel) { + if (!is_travel_in_layers_range(i, m_layers_z_range[0], m_layers_z_range[1])) + continue; + } + else if (!is_in_layers_range(path, m_layers_z_range[0], m_layers_z_range[1])) + continue; + + if (path.type == EMoveType::Extrude && !is_visible(path)) + continue; + + // store valid path + for (size_t j = 0; j < path.sub_paths.size(); ++j) { + paths.push_back({ &buffer, path.sub_paths[j].first.b_id, static_cast(i), static_cast(j) }); + } + + global_endpoints.first = std::min(global_endpoints.first, path.sub_paths.front().first.s_id); + global_endpoints.last = std::max(global_endpoints.last, path.sub_paths.back().last.s_id); + + if (top_layer_only) { + if (path.type == EMoveType::Travel) { + if (is_travel_in_layers_range(i, m_layers_z_range[1], m_layers_z_range[1])) { + top_layer_endpoints.first = std::min(top_layer_endpoints.first, path.sub_paths.front().first.s_id); + top_layer_endpoints.last = std::max(top_layer_endpoints.last, path.sub_paths.back().last.s_id); + } + } + else if (is_in_layers_range(path, m_layers_z_range[1], m_layers_z_range[1])) { + top_layer_endpoints.first = std::min(top_layer_endpoints.first, path.sub_paths.front().first.s_id); + top_layer_endpoints.last = std::max(top_layer_endpoints.last, path.sub_paths.back().last.s_id); + } + } + } + } + + // update current sequential position + sequential_view->current.first = !top_layer_only && keep_sequential_current_first ? std::clamp(sequential_view->current.first, global_endpoints.first, global_endpoints.last) : global_endpoints.first; + sequential_view->current.last = keep_sequential_current_last ? std::clamp(sequential_view->current.last, global_endpoints.first, global_endpoints.last) : global_endpoints.last; + + // get the world position from gpu + bool found = false; + for (const TBuffer& buffer : m_buffers) { + // searches the path containing the current position + for (const Path& path : buffer.paths) { + if (path.contains(m_sequential_view.current.last)) { + int sub_path_id = path.get_id_of_sub_path_containing(m_sequential_view.current.last); + if (sub_path_id != -1) { + const Path::Sub_Path& sub_path = path.sub_paths[sub_path_id]; + unsigned int offset = static_cast(m_sequential_view.current.last - sub_path.first.s_id); + if (offset > 0) { + if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Line) + offset = 2 * offset - 1; + else if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle) { + unsigned int indices_count = buffer.indices_per_segment(); +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + offset = indices_count * (offset - 1) + (indices_count - 2); + if (sub_path_id == 0) + offset += 6; // add 2 triangles for starting cap +#else + offset = indices_count * (offset - 1) + (indices_count - 6); +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + } + } + offset += static_cast(sub_path.first.i_id); + + // gets the vertex index from the index buffer on gpu + const IBuffer& i_buffer = buffer.indices[sub_path.first.b_id]; + unsigned int index = 0; + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, i_buffer.ibo)); + glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast(offset * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&index))); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + + // gets the position from the vertices buffer on gpu + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, i_buffer.vbo)); + glsafe(::glGetBufferSubData(GL_ARRAY_BUFFER, static_cast(index * buffer.vertices.vertex_size_bytes()), static_cast(3 * sizeof(float)), static_cast(sequential_view->current_position.data()))); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); + + found = true; + break; + } + } + } + + if (found) + break; + } + + // second pass: filter paths by sequential data and collect them by color + RenderPath* render_path = nullptr; + for (const auto& [buffer, ibuffer_id, path_id, sub_path_id] : paths) { + const Path& path = buffer->paths[path_id]; + const Path::Sub_Path& sub_path = path.sub_paths[sub_path_id]; + if (m_sequential_view.current.last <= sub_path.first.s_id || sub_path.last.s_id <= m_sequential_view.current.first) + continue; + + Color color; + switch (path.type) + { + case EMoveType::Tool_change: { color = Options_Colors[static_cast(EOptionsColors::ToolChanges)]; break; } + case EMoveType::Color_change: { color = Options_Colors[static_cast(EOptionsColors::ColorChanges)]; break; } + case EMoveType::Pause_Print: { color = Options_Colors[static_cast(EOptionsColors::PausePrints)]; break; } + case EMoveType::Custom_GCode: { color = Options_Colors[static_cast(EOptionsColors::CustomGCodes)]; break; } + case EMoveType::Retract: { color = Options_Colors[static_cast(EOptionsColors::Retractions)]; break; } + case EMoveType::Unretract: { color = Options_Colors[static_cast(EOptionsColors::Unretractions)]; break; } + case EMoveType::Extrude: { + if (!top_layer_only || + m_sequential_view.current.last == global_endpoints.last || + is_in_layers_range(path, m_layers_z_range[1], m_layers_z_range[1])) + color = extrusion_color(path); + else + color = { 0.25f, 0.25f, 0.25f }; + + break; + } + case EMoveType::Travel: { + if (!top_layer_only || m_sequential_view.current.last == global_endpoints.last || is_travel_in_layers_range(path_id, m_layers_z_range[1], m_layers_z_range[1])) + color = (m_view_type == EViewType::Feedrate || m_view_type == EViewType::Tool || m_view_type == EViewType::ColorPrint) ? extrusion_color(path) : travel_color(path); + else + color = { 0.25f, 0.25f, 0.25f }; + + break; + } + case EMoveType::Wipe: { color = Wipe_Color; break; } + default: { color = { 0.0f, 0.0f, 0.0f }; break; } + } + + RenderPath key{ color, static_cast(ibuffer_id), path_id }; + if (render_path == nullptr || !RenderPathPropertyEqual()(*render_path, key)) + render_path = const_cast(&(*buffer->render_paths.emplace(key).first)); + +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + unsigned int delta_1st = 0; + if (sub_path.first.s_id < m_sequential_view.current.first && m_sequential_view.current.first <= sub_path.last.s_id) + delta_1st = static_cast(m_sequential_view.current.first - sub_path.first.s_id); +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + + unsigned int size_in_indices = 0; + switch (buffer->render_primitive_type) + { + case TBuffer::ERenderPrimitiveType::Point: { + size_in_indices = buffer->indices_per_segment(); + break; + } + case TBuffer::ERenderPrimitiveType::Line: + case TBuffer::ERenderPrimitiveType::Triangle: { + unsigned int segments_count = std::min(m_sequential_view.current.last, sub_path.last.s_id) - std::max(m_sequential_view.current.first, sub_path.first.s_id); + size_in_indices = buffer->indices_per_segment() * segments_count; + break; + } + } + +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + if (size_in_indices == 0) + continue; + + if (buffer->render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle) { + if (sub_path_id == 0 && delta_1st == 0) + size_in_indices += 6; // add 2 triangles for starting cap + if (sub_path_id == path.sub_paths.size() - 1 && path.sub_paths.back().last.s_id <= m_sequential_view.current.last) + size_in_indices += 6; // add 2 triangles for ending cap + if (delta_1st > 0) + size_in_indices -= 6; // remove 2 triangles for corner cap } - } +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS - // set layers z range - if (!m_layers.empty()) - m_layers_z_range = { 0, static_cast(m_layers.size() - 1) }; + render_path->sizes.push_back(size_in_indices); - // change color of paths whose layer contains option points - if (!options_zs.empty()) { - TBuffer& extrude_buffer = m_buffers[buffer_id(EMoveType::Extrude)]; - for (Path& path : extrude_buffer.paths) { - float z = path.first.position[2]; - if (std::find_if(options_zs.begin(), options_zs.end(), [z](float f) { return f - EPSILON <= z && z <= f + EPSILON; }) != options_zs.end()) - path.cp_color_id = 255 - path.cp_color_id; - } - } +#if !ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + unsigned int delta_1st = 0; + if (sub_path.first.s_id < m_sequential_view.current.first && m_sequential_view.current.first <= sub_path.last.s_id) + delta_1st = m_sequential_view.current.first - sub_path.first.s_id; +#endif // !ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS - // roles -> remove duplicates - std::sort(m_roles.begin(), m_roles.end()); - m_roles.erase(std::unique(m_roles.begin(), m_roles.end()), m_roles.end()); - m_roles.shrink_to_fit(); +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + if (buffer->render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle) { + delta_1st *= buffer->indices_per_segment(); + if (delta_1st > 0) { + delta_1st += 6; // skip 2 triangles for corner cap + if (sub_path_id == 0) + delta_1st += 6; // skip 2 triangles for starting cap + } + } +#else + if (buffer->render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle) + delta_1st *= buffer->indices_per_segment(); +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS - // extruder ids -> remove duplicates - std::sort(m_extruder_ids.begin(), m_extruder_ids.end()); - m_extruder_ids.erase(std::unique(m_extruder_ids.begin(), m_extruder_ids.end()), m_extruder_ids.end()); - m_extruder_ids.shrink_to_fit(); + render_path->offsets.push_back(static_cast((sub_path.first.i_id + delta_1st) * sizeof(IBufferType))); - log_memory_usage("Loaded G-code generated extrusion paths, ", vertices, indices); +#if 0 + // check sizes and offsets against index buffer size on gpu + GLint buffer_size; + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer->indices[render_path->index_buffer_id].ibo)); + glsafe(::glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &buffer_size)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + if (render_path->offsets.back() + render_path->sizes.back() * sizeof(IBufferType) > buffer_size) + BOOST_LOG_TRIVIAL(error) << "GCodeViewer::refresh_render_paths: Invalid render path data"; +#endif + } -#if ENABLE_GCODE_VIEWER_STATISTICS - m_statistics.load_time = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - start_time).count(); -#endif // ENABLE_GCODE_VIEWER_STATISTICS + // set sequential data to their final value + sequential_view->endpoints = top_layer_only ? top_layer_endpoints : global_endpoints; + sequential_view->current.first = !top_layer_only && keep_sequential_current_first ? std::clamp(sequential_view->current.first, sequential_view->endpoints.first, sequential_view->endpoints.last) : sequential_view->endpoints.first; + +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + // updates sequential range caps + std::array* sequential_range_caps = const_cast*>(&m_sequential_range_caps); + (*sequential_range_caps)[0].reset(); + (*sequential_range_caps)[1].reset(); + + if (m_sequential_view.current.first != m_sequential_view.current.last) { + for (const auto& [buffer, ibuffer_id, path_id, sub_path_id] : paths) { + if (buffer->render_primitive_type != TBuffer::ERenderPrimitiveType::Triangle) + continue; - if (progress_dialog != nullptr) - progress_dialog->Destroy(); -} + const Path& path = buffer->paths[path_id]; + const Path::Sub_Path& sub_path = path.sub_paths[sub_path_id]; + if (m_sequential_view.current.last <= sub_path.first.s_id || sub_path.last.s_id <= m_sequential_view.current.first) + continue; -void GCodeViewer::load_shells(const Print& print, bool initialized) -{ - if (print.objects().empty()) - // no shells, return - return; + // update cap for first endpoint of current range + if (m_sequential_view.current.first > sub_path.first.s_id) { + SequentialRangeCap& cap = (*sequential_range_caps)[0]; + const IBuffer& i_buffer = buffer->indices[ibuffer_id]; + cap.buffer = buffer; + cap.vbo = i_buffer.vbo; + + // calculate offset into the index buffer + unsigned int offset = sub_path.first.i_id; + offset += 6; // add 2 triangles for corner cap + offset += static_cast(m_sequential_view.current.first - sub_path.first.s_id) * buffer->indices_per_segment(); + if (sub_path_id == 0) + offset += 6; // add 2 triangles for starting cap + + // extract indices from index buffer + std::array indices{ 0, 0, 0, 0, 0, 0 }; + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, i_buffer.ibo)); + glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 0) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[0]))); + glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 7) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[1]))); + glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 1) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[2]))); + glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 13) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[4]))); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + indices[3] = indices[0]; + indices[5] = indices[1]; - // adds objects' volumes - int object_id = 0; - for (const PrintObject* obj : print.objects()) { - const ModelObject* model_obj = obj->model_object(); + // send indices to gpu + glsafe(::glGenBuffers(1, &cap.ibo)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cap.ibo)); + glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(IBufferType), indices.data(), GL_STATIC_DRAW)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); - std::vector instance_ids(model_obj->instances.size()); - for (int i = 0; i < (int)model_obj->instances.size(); ++i) { - instance_ids[i] = i; - } + // extract color from render path + size_t offset_bytes = offset * sizeof(IBufferType); + for (const RenderPath& render_path : buffer->render_paths) { + if (render_path.index_buffer_id == ibuffer_id) { + for (size_t j = 0; j < render_path.offsets.size(); ++j) { + if (render_path.contains(offset_bytes)) { + cap.color = render_path.color; + break; + } + } + } + } + } - m_shells.volumes.load_object(model_obj, object_id, instance_ids, "object", initialized); + // update cap for last endpoint of current range + if (m_sequential_view.current.last < sub_path.last.s_id) { + SequentialRangeCap& cap = (*sequential_range_caps)[1]; + const IBuffer& i_buffer = buffer->indices[ibuffer_id]; + cap.buffer = buffer; + cap.vbo = i_buffer.vbo; + + // calculate offset into the index buffer + unsigned int offset = sub_path.first.i_id; + offset += 6; // add 2 triangles for corner cap + offset += static_cast(m_sequential_view.current.last - 1 - sub_path.first.s_id) * buffer->indices_per_segment(); + if (sub_path_id == 0) + offset += 6; // add 2 triangles for starting cap + + // extract indices from index buffer + std::array indices{ 0, 0, 0, 0, 0, 0 }; + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, i_buffer.ibo)); + glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 2) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[0]))); + glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 4) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[1]))); + glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 10) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[2]))); + glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 16) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[5]))); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + indices[3] = indices[0]; + indices[4] = indices[2]; - ++object_id; - } + // send indices to gpu + glsafe(::glGenBuffers(1, &cap.ibo)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cap.ibo)); + glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, 6 * sizeof(IBufferType), indices.data(), GL_STATIC_DRAW)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); - if (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() == ptFFF) { - // adds wipe tower's volume - double max_z = print.objects()[0]->model_object()->get_model()->bounding_box().max(2); - const PrintConfig& config = print.config(); - size_t extruders_count = config.nozzle_diameter.size(); - if ((extruders_count > 1) && config.wipe_tower && !config.complete_objects) { - const DynamicPrintConfig& print_config = wxGetApp().preset_bundle->prints.get_edited_preset().config; - double layer_height = print_config.opt_float("layer_height"); - double first_layer_height = print_config.get_abs_value("first_layer_height", layer_height); - double nozzle_diameter = print.config().nozzle_diameter.values[0]; - float depth = print.wipe_tower_data(extruders_count, first_layer_height, nozzle_diameter).depth; - float brim_width = print.wipe_tower_data(extruders_count, first_layer_height, nozzle_diameter).brim_width; + // extract color from render path + size_t offset_bytes = offset * sizeof(IBufferType); + for (const RenderPath& render_path : buffer->render_paths) { + if (render_path.index_buffer_id == ibuffer_id) { + for (size_t j = 0; j < render_path.offsets.size(); ++j) { + if (render_path.contains(offset_bytes)) { + cap.color = render_path.color; + break; + } + } + } + } + } - m_shells.volumes.load_wipe_tower_preview(1000, config.wipe_tower_x, config.wipe_tower_y, config.wipe_tower_width, depth, max_z, config.wipe_tower_rotation_angle, - !print.is_step_done(psWipeTower), brim_width, initialized); + if ((*sequential_range_caps)[0].is_renderable() && (*sequential_range_caps)[1].is_renderable()) + break; } } +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS - // remove modifiers - while (true) { - GLVolumePtrs::iterator it = std::find_if(m_shells.volumes.volumes.begin(), m_shells.volumes.volumes.end(), [](GLVolume* volume) { return volume->is_modifier; }); - if (it != m_shells.volumes.volumes.end()) { - delete (*it); - m_shells.volumes.volumes.erase(it); - } - else - break; - } + wxGetApp().plater()->enable_preview_moves_slider(!paths.empty()); - for (GLVolume* volume : m_shells.volumes.volumes) { - volume->zoom_to_volumes = false; - volume->color[3] = 0.25f; - volume->force_native_color = true; - volume->set_render_color(); +#if ENABLE_GCODE_VIEWER_STATISTICS + for (const TBuffer& buffer : m_buffers) { + statistics->render_paths_size += SLIC3R_STDUNORDEREDSET_MEMSIZE(buffer.render_paths, RenderPath); + for (const RenderPath& path : buffer.render_paths) { + statistics->render_paths_size += SLIC3R_STDVEC_MEMSIZE(path.sizes, unsigned int); + statistics->render_paths_size += SLIC3R_STDVEC_MEMSIZE(path.offsets, size_t); + } } + statistics->refresh_paths_time = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - start_time).count(); +#endif // ENABLE_GCODE_VIEWER_STATISTICS } - +#else void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool keep_sequential_current_last) const { #if ENABLE_GCODE_VIEWER_STATISTICS @@ -1810,19 +3248,22 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool }; #if ENABLE_GCODE_VIEWER_STATISTICS - m_statistics.render_paths_size = 0; + Statistics* statistics = const_cast(&m_statistics); + statistics->render_paths_size = 0; #endif // ENABLE_GCODE_VIEWER_STATISTICS bool top_layer_only = get_app_config()->get("seq_top_layer_only") == "1"; SequentialView::Endpoints global_endpoints = { m_moves_count , 0 }; SequentialView::Endpoints top_layer_endpoints = global_endpoints; - if (top_layer_only || !keep_sequential_current_first) m_sequential_view.current.first = 0; - if (!keep_sequential_current_last) m_sequential_view.current.last = m_moves_count; + SequentialView* sequential_view = const_cast(&m_sequential_view); + if (top_layer_only || !keep_sequential_current_first) sequential_view->current.first = 0; + if (!keep_sequential_current_last) sequential_view->current.last = m_moves_count; // first pass: collect visible paths and update sequential view data std::vector> paths; - for (TBuffer& buffer : m_buffers) { + for (size_t b = 0; b < m_buffers.size(); ++b) { + TBuffer& buffer = const_cast(m_buffers[b]); // reset render paths buffer.render_paths.clear(); @@ -1863,8 +3304,8 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool } // update current sequential position - m_sequential_view.current.first = !top_layer_only && keep_sequential_current_first ? std::clamp(m_sequential_view.current.first, global_endpoints.first, global_endpoints.last) : global_endpoints.first; - m_sequential_view.current.last = keep_sequential_current_last ? std::clamp(m_sequential_view.current.last, global_endpoints.first, global_endpoints.last) : global_endpoints.last; + sequential_view->current.first = !top_layer_only && keep_sequential_current_first ? std::clamp(sequential_view->current.first, global_endpoints.first, global_endpoints.last) : global_endpoints.first; + sequential_view->current.last = keep_sequential_current_last ? std::clamp(sequential_view->current.last, global_endpoints.first, global_endpoints.last) : global_endpoints.last; // get the world position from gpu bool found = false; @@ -1891,7 +3332,7 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool // gets the position from the vertices buffer on gpu glsafe(::glBindBuffer(GL_ARRAY_BUFFER, buffer.vertices.id)); - glsafe(::glGetBufferSubData(GL_ARRAY_BUFFER, static_cast(index * buffer.vertices.vertex_size_bytes()), static_cast(3 * sizeof(float)), static_cast(m_sequential_view.current_position.data()))); + glsafe(::glGetBufferSubData(GL_ARRAY_BUFFER, static_cast(index * buffer.vertices.vertex_size_bytes()), static_cast(3 * sizeof(float)), static_cast(sequential_view->current_position.data()))); glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); found = true; break; @@ -1957,23 +3398,202 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool } // set sequential data to their final value - m_sequential_view.endpoints = top_layer_only ? top_layer_endpoints : global_endpoints; - m_sequential_view.current.first = !top_layer_only && keep_sequential_current_first ? std::clamp(m_sequential_view.current.first, m_sequential_view.endpoints.first, m_sequential_view.endpoints.last) : m_sequential_view.endpoints.first; + sequential_view->endpoints = top_layer_only ? top_layer_endpoints : global_endpoints; + sequential_view->current.first = !top_layer_only && keep_sequential_current_first ? std::clamp(sequential_view->current.first, sequential_view->endpoints.first, sequential_view->endpoints.last) : sequential_view->endpoints.first; wxGetApp().plater()->enable_preview_moves_slider(!paths.empty()); #if ENABLE_GCODE_VIEWER_STATISTICS for (const TBuffer& buffer : m_buffers) { - m_statistics.render_paths_size += SLIC3R_STDVEC_MEMSIZE(buffer.render_paths, RenderPath); + statistics->render_paths_size += SLIC3R_STDUNORDEREDSET_MEMSIZE(buffer.render_paths, RenderPath); for (const RenderPath& path : buffer.render_paths) { - m_statistics.render_paths_size += SLIC3R_STDVEC_MEMSIZE(path.sizes, unsigned int); - m_statistics.render_paths_size += SLIC3R_STDVEC_MEMSIZE(path.offsets, size_t); + statistics->render_paths_size += SLIC3R_STDVEC_MEMSIZE(path.sizes, unsigned int); + statistics->render_paths_size += SLIC3R_STDVEC_MEMSIZE(path.offsets, size_t); } } - m_statistics.refresh_paths_time = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - start_time).count(); + statistics->refresh_paths_time = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - start_time).count(); #endif // ENABLE_GCODE_VIEWER_STATISTICS } +#endif // ENABLE_SPLITTED_VERTEX_BUFFER + +#if ENABLE_SPLITTED_VERTEX_BUFFER +void GCodeViewer::render_toolpaths() const +{ +#if ENABLE_FIXED_SCREEN_SIZE_POINT_MARKERS + float point_size = 20.0f; +#else + float point_size = 0.8f; +#endif // ENABLE_FIXED_SCREEN_SIZE_POINT_MARKERS + std::array light_intensity = { 0.25f, 0.70f, 0.75f, 0.75f }; + const Camera& camera = wxGetApp().plater()->get_camera(); + double zoom = camera.get_zoom(); + const std::array& viewport = camera.get_viewport(); + float near_plane_height = camera.get_type() == Camera::Perspective ? static_cast(viewport[3]) / (2.0f * static_cast(2.0 * std::tan(0.5 * Geometry::deg2rad(camera.get_fov())))) : + static_cast(viewport[3]) * 0.0005; + + auto set_uniform_color = [](const std::array& color, GLShaderProgram& shader) { + std::array color4 = { color[0], color[1], color[2], 1.0f }; + shader.set_uniform("uniform_color", color4); + }; + + auto render_as_points = [zoom, point_size, near_plane_height, set_uniform_color] + (const TBuffer& buffer, unsigned int ibuffer_id, GLShaderProgram& shader) { +#if ENABLE_FIXED_SCREEN_SIZE_POINT_MARKERS + shader.set_uniform("use_fixed_screen_size", 1); +#else + shader.set_uniform("use_fixed_screen_size", 0); +#endif // ENABLE_FIXED_SCREEN_SIZE_POINT_MARKERS + shader.set_uniform("zoom", zoom); + shader.set_uniform("percent_outline_radius", 0.0f); + shader.set_uniform("percent_center_radius", 0.33f); + shader.set_uniform("point_size", point_size); + shader.set_uniform("near_plane_height", near_plane_height); + + glsafe(::glEnable(GL_VERTEX_PROGRAM_POINT_SIZE)); + glsafe(::glEnable(GL_POINT_SPRITE)); + + for (const RenderPath& path : buffer.render_paths) { + if (path.index_buffer_id == ibuffer_id) { + set_uniform_color(path.color, shader); + glsafe(::glMultiDrawElements(GL_POINTS, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_SHORT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); +#if ENABLE_GCODE_VIEWER_STATISTICS + ++const_cast(&m_statistics)->gl_multi_points_calls_count; +#endif // ENABLE_GCODE_VIEWER_STATISTICS + } + } + + glsafe(::glDisable(GL_POINT_SPRITE)); + glsafe(::glDisable(GL_VERTEX_PROGRAM_POINT_SIZE)); + }; + + auto render_as_lines = [light_intensity, set_uniform_color](const TBuffer& buffer, unsigned int ibuffer_id, GLShaderProgram& shader) { + shader.set_uniform("light_intensity", light_intensity); + for (const RenderPath& path : buffer.render_paths) { + if (path.index_buffer_id == ibuffer_id) { + set_uniform_color(path.color, shader); + glsafe(::glMultiDrawElements(GL_LINES, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_SHORT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); +#if ENABLE_GCODE_VIEWER_STATISTICS + ++const_cast(&m_statistics)->gl_multi_lines_calls_count; +#endif // ENABLE_GCODE_VIEWER_STATISTICS + } + } + }; + + auto render_as_triangles = [set_uniform_color](const TBuffer& buffer, unsigned int ibuffer_id, GLShaderProgram& shader) { + for (const RenderPath& path : buffer.render_paths) { + if (path.index_buffer_id == ibuffer_id) { + set_uniform_color(path.color, shader); + glsafe(::glMultiDrawElements(GL_TRIANGLES, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_SHORT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); +#if ENABLE_GCODE_VIEWER_STATISTICS + ++const_cast(&m_statistics)->gl_multi_triangles_calls_count; +#endif // ENABLE_GCODE_VIEWER_STATISTICS + } + } + }; + + auto line_width = [](double zoom) { + return (zoom < 5.0) ? 1.0 : (1.0 + 5.0 * (zoom - 5.0) / (100.0 - 5.0)); + }; + + glsafe(::glLineWidth(static_cast(line_width(zoom)))); + + unsigned char begin_id = buffer_id(EMoveType::Retract); + unsigned char end_id = buffer_id(EMoveType::Count); + + for (unsigned char i = begin_id; i < end_id; ++i) { + const TBuffer& buffer = m_buffers[i]; + if (!buffer.visible || !buffer.has_data()) + continue; + + GLShaderProgram* shader = wxGetApp().get_shader(buffer.shader.c_str()); + if (shader != nullptr) { + shader->start_using(); + + for (size_t j = 0; j < buffer.indices.size(); ++j) { + const IBuffer& i_buffer = buffer.indices[j]; + + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, i_buffer.vbo)); + glsafe(::glVertexPointer(buffer.vertices.position_size_floats(), GL_FLOAT, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.position_offset_size())); + glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); + bool has_normals = buffer.vertices.normal_size_floats() > 0; + if (has_normals) { + glsafe(::glNormalPointer(GL_FLOAT, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.normal_offset_size())); + glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); + } + + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, i_buffer.ibo)); + + switch (buffer.render_primitive_type) + { + case TBuffer::ERenderPrimitiveType::Point: { + render_as_points(buffer, static_cast(j), *shader); + break; + } + case TBuffer::ERenderPrimitiveType::Line: { + render_as_lines(buffer, static_cast(j), *shader); + break; + } + case TBuffer::ERenderPrimitiveType::Triangle: { + render_as_triangles(buffer, static_cast(j), *shader); + break; + } + } + + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + + if (has_normals) + glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); + + glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); + } + + shader->stop_using(); + } + } + +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + auto render_sequential_range_cap = [this, set_uniform_color](const SequentialRangeCap& cap) { + GLShaderProgram* shader = wxGetApp().get_shader(cap.buffer->shader.c_str()); + if (shader != nullptr) { + shader->start_using(); + + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, cap.vbo)); + glsafe(::glVertexPointer(cap.buffer->vertices.position_size_floats(), GL_FLOAT, cap.buffer->vertices.vertex_size_bytes(), (const void*)cap.buffer->vertices.position_offset_size())); + glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); + bool has_normals = cap.buffer->vertices.normal_size_floats() > 0; + if (has_normals) { + glsafe(::glNormalPointer(GL_FLOAT, cap.buffer->vertices.vertex_size_bytes(), (const void*)cap.buffer->vertices.normal_offset_size())); + glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); + } + set_uniform_color(cap.color, *shader); + + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cap.ibo)); + glsafe(::glDrawElements(GL_TRIANGLES, (GLsizei)cap.indices_count(), GL_UNSIGNED_SHORT, nullptr)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + +#if ENABLE_GCODE_VIEWER_STATISTICS + ++const_cast(&m_statistics)->gl_triangles_calls_count; +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + if (has_normals) + glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); + + glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); + + shader->stop_using(); + } + }; + + for (unsigned int i = 0; i < 2; ++i) { + if (m_sequential_range_caps[i].is_renderable()) + render_sequential_range_cap(m_sequential_range_caps[i]); + } +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS +} +#else void GCodeViewer::render_toolpaths() const { #if ENABLE_FIXED_SCREEN_SIZE_POINT_MARKERS @@ -2014,7 +3634,7 @@ void GCodeViewer::render_toolpaths() const if (path.index_buffer_id == index_buffer_id) { glsafe(::glMultiDrawElements(GL_POINTS, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_INT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); #if ENABLE_GCODE_VIEWER_STATISTICS - ++m_statistics.gl_multi_points_calls_count; + ++const_cast(&m_statistics)->gl_multi_points_calls_count; #endif // ENABLE_GCODE_VIEWER_STATISTICS } } @@ -2030,7 +3650,7 @@ void GCodeViewer::render_toolpaths() const set_uniform_color(path.color, shader); glsafe(::glMultiDrawElements(GL_LINES, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_INT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); #if ENABLE_GCODE_VIEWER_STATISTICS - ++m_statistics.gl_multi_lines_calls_count; + ++const_cast(&m_statistics)->gl_multi_lines_calls_count; #endif // ENABLE_GCODE_VIEWER_STATISTICS } } @@ -2042,7 +3662,7 @@ void GCodeViewer::render_toolpaths() const set_uniform_color(path.color, shader); glsafe(::glMultiDrawElements(GL_TRIANGLES, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_INT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); #if ENABLE_GCODE_VIEWER_STATISTICS - ++m_statistics.gl_multi_triangles_calls_count; + ++const_cast(&m_statistics)->gl_multi_triangles_calls_count; #endif // ENABLE_GCODE_VIEWER_STATISTICS } } @@ -2082,7 +3702,7 @@ void GCodeViewer::render_toolpaths() const { case TBuffer::ERenderPrimitiveType::Point: { - EOptionsColors color; + EOptionsColors color = EOptionsColors(0); switch (buffer_type(i)) { case EMoveType::Tool_change: { color = EOptionsColors::ToolChanges; break; } @@ -2091,6 +3711,7 @@ void GCodeViewer::render_toolpaths() const case EMoveType::Custom_GCode: { color = EOptionsColors::CustomGCodes; break; } case EMoveType::Retract: { color = EOptionsColors::Retractions; break; } case EMoveType::Unretract: { color = EOptionsColors::Unretractions; break; } + default: { assert(false); break; } } render_as_points(buffer, static_cast(j), color, *shader); break; @@ -2120,6 +3741,7 @@ void GCodeViewer::render_toolpaths() const } } } +#endif // ENABLE_SPLITTED_VERTEX_BUFFER void GCodeViewer::render_shells() const { @@ -2252,8 +3874,8 @@ void GCodeViewer::render_legend() const ImGui::PopStyleVar(); }; - auto append_range = [this, draw_list, &imgui, append_item](const Extrusions::Range& range, unsigned int decimals) { - auto append_range_item = [this, draw_list, &imgui, append_item](int i, float value, unsigned int decimals) { + auto append_range = [append_item](const Extrusions::Range& range, unsigned int decimals) { + auto append_range_item = [append_item](int i, float value, unsigned int decimals) { char buf[1024]; ::sprintf(buf, "%.*f", decimals, value); append_item(EItemType::Rect, Range_Colors[i], buf); @@ -2347,7 +3969,7 @@ void GCodeViewer::render_legend() const return _u8L("from") + " " + std::string(buf1) + " " + _u8L("to") + " " + std::string(buf2) + " " + _u8L("mm"); }; - auto role_time_and_percent = [this, time_mode](ExtrusionRole role) { + auto role_time_and_percent = [ time_mode](ExtrusionRole role) { auto it = std::find_if(time_mode.roles_times.begin(), time_mode.roles_times.end(), [role](const std::pair& item) { return role == item.first; }); return (it != time_mode.roles_times.end()) ? std::make_pair(it->second, it->second / time_mode.time) : std::make_pair(0.0f, 0.0f); }; @@ -2405,7 +4027,8 @@ void GCodeViewer::render_legend() const bool visible = is_visible(role); append_item(EItemType::Rect, Extrusion_Role_Colors[static_cast(role)], labels[i], visible, times[i], percents[i], max_percent, offsets, [this, role, visible]() { - m_extrusions.role_visibility_flags = visible ? m_extrusions.role_visibility_flags & ~(1 << role) : m_extrusions.role_visibility_flags | (1 << role); + Extrusions* extrusions = const_cast(&m_extrusions); + extrusions->role_visibility_flags = visible ? extrusions->role_visibility_flags & ~(1 << role) : extrusions->role_visibility_flags | (1 << role); // update buffers' render paths refresh_render_paths(false, false); wxGetApp().plater()->update_preview_moves_slider(); @@ -2554,7 +4177,7 @@ void GCodeViewer::render_legend() const return items; }; - auto append_color_change = [this, &imgui](const Color& color1, const Color& color2, const std::array& offsets, const Times& times) { + auto append_color_change = [&imgui](const Color& color1, const Color& color2, const std::array& offsets, const Times& times) { imgui.text(_u8L("Color change")); ImGui::SameLine(); @@ -2573,7 +4196,7 @@ void GCodeViewer::render_legend() const imgui.text(short_time(get_time_dhms(times.second - times.first))); }; - auto append_print = [this, &imgui](const Color& color, const std::array& offsets, const Times& times) { + auto append_print = [&imgui](const Color& color, const std::array& offsets, const Times& times) { imgui.text(_u8L("Print")); ImGui::SameLine(); @@ -2786,6 +4409,7 @@ void GCodeViewer::render_legend() const imgui.text(_u8L("Estimated printing time") + " [" + _u8L("Stealth mode") + "]:"); break; } + default : { assert(false); break; } } ImGui::SameLine(); imgui.text(short_time(get_time_dhms(time_mode.time))); @@ -2801,7 +4425,7 @@ void GCodeViewer::render_legend() const } if (show && m_time_statistics.modes[static_cast(mode)].roles_times.size() > 0) { if (imgui.button(label)) { - m_time_estimate_mode = mode; + *const_cast(&m_time_estimate_mode) = mode; wxGetApp().plater()->get_current_canvas3D()->set_as_dirty(); wxGetApp().plater()->get_current_canvas3D()->request_extra_frame(); } @@ -2817,6 +4441,7 @@ void GCodeViewer::render_legend() const show_mode_button(_L("Show normal mode"), PrintEstimatedTimeStatistics::ETimeMode::Normal); break; } + default : { assert(false); break; } } } @@ -2880,18 +4505,20 @@ void GCodeViewer::render_statistics() const ImGui::Separator(); add_time(std::string("Load:"), m_statistics.load_time); + add_time(std::string(" Load vertices:"), m_statistics.load_vertices); + add_time(std::string(" Smooth vertices:"), m_statistics.smooth_vertices); + add_time(std::string(" Load indices:"), m_statistics.load_indices); add_time(std::string("Refresh:"), m_statistics.refresh_time); add_time(std::string("Refresh paths:"), m_statistics.refresh_paths_time); - wxGetApp().plater()->get_current_canvas3D()->set_as_dirty(); - wxGetApp().plater()->get_current_canvas3D()->request_extra_frame(); } if (ImGui::CollapsingHeader("OpenGL calls")) { add_counter(std::string("Multi GL_POINTS:"), m_statistics.gl_multi_points_calls_count); add_counter(std::string("Multi GL_LINES:"), m_statistics.gl_multi_lines_calls_count); add_counter(std::string("Multi GL_TRIANGLES:"), m_statistics.gl_multi_triangles_calls_count); - wxGetApp().plater()->get_current_canvas3D()->set_as_dirty(); - wxGetApp().plater()->get_current_canvas3D()->request_extra_frame(); +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + add_counter(std::string("GL_TRIANGLES:"), m_statistics.gl_triangles_calls_count); +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS } if (ImGui::CollapsingHeader("CPU memory")) { @@ -2900,8 +4527,6 @@ void GCodeViewer::render_statistics() const ImGui::Separator(); add_memory(std::string("Paths:"), m_statistics.paths_size); add_memory(std::string("Render paths:"), m_statistics.render_paths_size); - wxGetApp().plater()->get_current_canvas3D()->set_as_dirty(); - wxGetApp().plater()->get_current_canvas3D()->request_extra_frame(); } if (ImGui::CollapsingHeader("GPU memory")) { @@ -2910,8 +4535,6 @@ void GCodeViewer::render_statistics() const ImGui::Separator(); add_memory(std::string("Max VBuffer:"), m_statistics.max_vbuffer_gpu_size); add_memory(std::string("Max IBuffer:"), m_statistics.max_ibuffer_gpu_size); - wxGetApp().plater()->get_current_canvas3D()->set_as_dirty(); - wxGetApp().plater()->get_current_canvas3D()->request_extra_frame(); } if (ImGui::CollapsingHeader("Other")) { @@ -2920,12 +4543,7 @@ void GCodeViewer::render_statistics() const add_counter(std::string("Extrude segments count:"), m_statistics.extrude_segments_count); ImGui::Separator(); add_counter(std::string("VBuffers count:"), m_statistics.vbuffers_count); - add_counter(std::string("IBuffers count:"), m_statistics.ibuffers_count); - ImGui::Separator(); - add_counter(std::string("Max vertices in VBuffer:"), m_statistics.max_vertices_in_vertex_buffer); - add_counter(std::string("Max indices in IBuffer:"), m_statistics.max_indices_in_index_buffer); - wxGetApp().plater()->get_current_canvas3D()->set_as_dirty(); - wxGetApp().plater()->get_current_canvas3D()->request_extra_frame(); + add_counter(std::string("IBuffers count:"), m_statistics.ibuffers_count); } imgui.end(); @@ -2947,9 +4565,15 @@ void GCodeViewer::log_memory_used(const std::string& label, int64_t additional) } int64_t layers_size = SLIC3R_STDVEC_MEMSIZE(m_layers.get_zs(), double); layers_size += SLIC3R_STDVEC_MEMSIZE(m_layers.get_endpoints(), Layers::Endpoints); +#if ENABLE_SPLITTED_VERTEX_BUFFER + BOOST_LOG_TRIVIAL(trace) << label + << "(" << format_memsize_MB(additional + paths_size + render_paths_size + layers_size) << ");" + << log_memory_info(); +#else BOOST_LOG_TRIVIAL(trace) << label << format_memsize_MB(additional + paths_size + render_paths_size + layers_size) << log_memory_info(); +#endif // ENABLE_SPLITTED_VERTEX_BUFFER } } diff --git a/src/slic3r/GUI/GCodeViewer.hpp b/src/slic3r/GUI/GCodeViewer.hpp index 31092e30d97..1d86cf55a20 100644 --- a/src/slic3r/GUI/GCodeViewer.hpp +++ b/src/slic3r/GUI/GCodeViewer.hpp @@ -19,8 +19,17 @@ namespace GUI { class GCodeViewer { +#if ENABLE_SPLITTED_VERTEX_BUFFER + using IBufferType = unsigned short; +#endif // ENABLE_SPLITTED_VERTEX_BUFFER using Color = std::array; + using VertexBuffer = std::vector; +#if ENABLE_SPLITTED_VERTEX_BUFFER + using MultiVertexBuffer = std::vector; + using IndexBuffer = std::vector; +#else using IndexBuffer = std::vector; +#endif // ENABLE_SPLITTED_VERTEX_BUFFER using MultiIndexBuffer = std::vector; static const std::vector Extrusion_Role_Colors; @@ -39,7 +48,7 @@ class GCodeViewer CustomGCodes }; - // vbo buffer containing vertices data used to rendder a specific toolpath type + // vbo buffer containing vertices data used to render a specific toolpath type struct VBuffer { enum class EFormat : unsigned char @@ -53,38 +62,48 @@ class GCodeViewer }; EFormat format{ EFormat::Position }; +#if ENABLE_SPLITTED_VERTEX_BUFFER + // vbos id + std::vector vbos; + // sizes of the buffers, in bytes, used in export to obj + std::vector sizes; +#else // vbo id unsigned int id{ 0 }; +#endif // ENABLE_SPLITTED_VERTEX_BUFFER // count of vertices, updated after data are sent to gpu size_t count{ 0 }; size_t data_size_bytes() const { return count * vertex_size_bytes(); } +#if ENABLE_SPLITTED_VERTEX_BUFFER + // We set 65536 as max count of vertices inside a vertex buffer to allow + // to use unsigned short in place of unsigned int for indices in the index buffer, to save memory + size_t max_size_bytes() const { return 65536 * vertex_size_bytes(); } +#endif // ENABLE_SPLITTED_VERTEX_BUFFER size_t vertex_size_floats() const { return position_size_floats() + normal_size_floats(); } size_t vertex_size_bytes() const { return vertex_size_floats() * sizeof(float); } size_t position_offset_floats() const { return 0; } size_t position_offset_size() const { return position_offset_floats() * sizeof(float); } - size_t position_size_floats() const - { + size_t position_size_floats() const { switch (format) { case EFormat::Position: case EFormat::PositionNormal3: { return 3; } case EFormat::PositionNormal1: { return 4; } - default: { return 0; } + default: { return 0; } } } size_t position_size_bytes() const { return position_size_floats() * sizeof(float); } - size_t normal_offset_floats() const - { + size_t normal_offset_floats() const { switch (format) { case EFormat::Position: case EFormat::PositionNormal1: { return 0; } case EFormat::PositionNormal3: { return 3; } - default: { return 0; } + default: { return 0; } } } size_t normal_offset_size() const { return normal_offset_floats() * sizeof(float); } @@ -102,11 +121,18 @@ class GCodeViewer void reset(); }; - // ibo buffer containing indices data (lines/triangles) used to render a specific toolpath type + // ibo buffer containing indices data (for lines/triangles) used to render a specific toolpath type struct IBuffer { +#if ENABLE_SPLITTED_VERTEX_BUFFER + // id of the associated vertex buffer + unsigned int vbo{ 0 }; + // ibo id + unsigned int ibo{ 0 }; +#else // ibo id unsigned int id{ 0 }; +#endif // ENABLE_SPLITTED_VERTEX_BUFFER // count of indices, updated after data are sent to gpu size_t count{ 0 }; @@ -118,19 +144,36 @@ class GCodeViewer { struct Endpoint { - // index of the index buffer + // index of the buffer in the multibuffer vector + // the buffer type may change: + // it is the vertex buffer while extracting vertices data, + // the index buffer while extracting indices data unsigned int b_id{ 0 }; - // index into the index buffer + // index into the buffer size_t i_id{ 0 }; - // sequential id (index into the vertex buffer) + // move id size_t s_id{ 0 }; Vec3f position{ Vec3f::Zero() }; }; +#if ENABLE_SPLITTED_VERTEX_BUFFER + struct Sub_Path + { + Endpoint first; + Endpoint last; + + bool contains(size_t s_id) const { + return first.s_id <= s_id && s_id <= last.s_id; + } + }; +#endif // ENABLE_SPLITTED_VERTEX_BUFFER + EMoveType type{ EMoveType::Noop }; ExtrusionRole role{ erNone }; +#if !ENABLE_SPLITTED_VERTEX_BUFFER Endpoint first; Endpoint last; +#endif // !ENABLE_SPLITTED_VERTEX_BUFFER float delta_extruder{ 0.0f }; float height{ 0.0f }; float width{ 0.0f }; @@ -139,22 +182,59 @@ class GCodeViewer float volumetric_rate{ 0.0f }; unsigned char extruder_id{ 0 }; unsigned char cp_color_id{ 0 }; +#if ENABLE_SPLITTED_VERTEX_BUFFER + std::vector sub_paths; +#endif // ENABLE_SPLITTED_VERTEX_BUFFER bool matches(const GCodeProcessor::MoveVertex& move) const; +#if ENABLE_SPLITTED_VERTEX_BUFFER + size_t vertices_count() const { + return sub_paths.empty() ? 0 : sub_paths.back().last.s_id - sub_paths.front().first.s_id + 1; + } + bool contains(size_t s_id) const { + return sub_paths.empty() ? false : sub_paths.front().first.s_id <= s_id && s_id <= sub_paths.back().last.s_id; + } + int get_id_of_sub_path_containing(size_t s_id) const { + if (sub_paths.empty()) + return -1; + else { + for (int i = 0; i < static_cast(sub_paths.size()); ++i) { + if (sub_paths[i].contains(s_id)) + return i; + } + return -1; + } + } + void add_sub_path(const GCodeProcessor::MoveVertex& move, unsigned int b_id, size_t i_id, size_t s_id) { + Endpoint endpoint = { b_id, i_id, s_id, move.position }; + sub_paths.push_back({ endpoint , endpoint }); + } +#else size_t vertices_count() const { return last.s_id - first.s_id + 1; } bool contains(size_t id) const { return first.s_id <= id && id <= last.s_id; } +#endif // ENABLE_SPLITTED_VERTEX_BUFFER }; - // Used to batch the indices needed to render paths + // Used to batch the indices needed to render the paths struct RenderPath { // Render path property Color color; + // Index of the buffer in TBuffer::indices unsigned int index_buffer_id; // Render path content unsigned int path_id; std::vector sizes; std::vector offsets; // use size_t because we need an unsigned int whose size matches pointer's size (used in the call glMultiDrawElements()) +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + bool contains(size_t offset) const { + for (size_t i = 0; i < offsets.size(); ++i) { + if (offsets[i] <= offset && offset <= offsets[i] + static_cast(sizes[i] * sizeof(IBufferType))) + return true; + } + return false; + } +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS }; struct RenderPathPropertyHash { size_t operator() (const RenderPath &p) const { @@ -195,45 +275,79 @@ class GCodeViewer std::string shader; std::vector paths; - // std::set seems to perform singificantly better, at least on Windows. + // std::set seems to perform significantly better, at least on Windows. // std::unordered_set render_paths; std::set render_paths; bool visible{ false }; void reset(); + // b_id index of buffer contained in this->indices // i_id index of first index contained in this->indices[b_id] // s_id index of first vertex contained in this->vertices void add_path(const GCodeProcessor::MoveVertex& move, unsigned int b_id, size_t i_id, size_t s_id); + +#if ENABLE_SPLITTED_VERTEX_BUFFER + unsigned int max_vertices_per_segment() const { + switch (render_primitive_type) + { + case ERenderPrimitiveType::Point: { return 1; } + case ERenderPrimitiveType::Line: { return 2; } + case ERenderPrimitiveType::Triangle: { return 8; } + default: { return 0; } + } + } + + size_t max_vertices_per_segment_size_floats() const { return vertices.vertex_size_floats() * static_cast(max_vertices_per_segment()); } + size_t max_vertices_per_segment_size_bytes() const { return max_vertices_per_segment_size_floats() * sizeof(float); } +#endif // ENABLE_SPLITTED_VERTEX_BUFFER unsigned int indices_per_segment() const { switch (render_primitive_type) { case ERenderPrimitiveType::Point: { return 1; } case ERenderPrimitiveType::Line: { return 2; } +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + case ERenderPrimitiveType::Triangle: { return 30; } // 3 indices x 10 triangles +#else case ERenderPrimitiveType::Triangle: { return 42; } // 3 indices x 14 triangles +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS default: { return 0; } } } - unsigned int start_segment_vertex_offset() const { +#if ENABLE_SPLITTED_VERTEX_BUFFER + size_t indices_per_segment_size_bytes() const { return static_cast(indices_per_segment() * sizeof(IBufferType)); } +#endif // ENABLE_SPLITTED_VERTEX_BUFFER +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + unsigned int max_indices_per_segment() const { switch (render_primitive_type) { - case ERenderPrimitiveType::Point: - case ERenderPrimitiveType::Line: - case ERenderPrimitiveType::Triangle: - default: { return 0; } + case ERenderPrimitiveType::Point: { return 1; } + case ERenderPrimitiveType::Line: { return 2; } + case ERenderPrimitiveType::Triangle: { return 36; } // 3 indices x 12 triangles + default: { return 0; } } } + size_t max_indices_per_segment_size_bytes() const { return max_indices_per_segment() * sizeof(IBufferType); } +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + +#if ENABLE_SPLITTED_VERTEX_BUFFER + bool has_data() const { + return !vertices.vbos.empty() && vertices.vbos.front() != 0 && !indices.empty() && indices.front().ibo != 0; + } +#else + unsigned int start_segment_vertex_offset() const { return 0; } unsigned int end_segment_vertex_offset() const { switch (render_primitive_type) { - case ERenderPrimitiveType::Point: { return 0; } - case ERenderPrimitiveType::Line: { return 1; } - case ERenderPrimitiveType::Triangle: { return 36; } // 1 vertex of 13th triangle - default: { return 0; } + case ERenderPrimitiveType::Point: { return 0; } + case ERenderPrimitiveType::Line: { return 1; } + case ERenderPrimitiveType::Triangle: { return 36; } // 1st vertex of 13th triangle + default: { return 0; } } } bool has_data() const { return vertices.id != 0 && !indices.empty() && indices.front().id != 0; } +#endif // ENABLE_SPLITTED_VERTEX_BUFFER }; // helper to render shells @@ -308,6 +422,12 @@ class GCodeViewer { size_t first{ 0 }; size_t last{ 0 }; + +#if ENABLE_SPLITTED_VERTEX_BUFFER + bool operator == (const Endpoints& other) const { + return first == other.first && last == other.last; + } +#endif // ENABLE_SPLITTED_VERTEX_BUFFER }; private: @@ -315,14 +435,12 @@ class GCodeViewer std::vector m_endpoints; public: - void append(double z, Endpoints endpoints) - { + void append(double z, Endpoints endpoints) { m_zs.emplace_back(z); m_endpoints.emplace_back(endpoints); } - void reset() - { + void reset() { m_zs = std::vector(); m_endpoints = std::vector(); } @@ -334,7 +452,35 @@ class GCodeViewer std::vector& get_endpoints() { return m_endpoints; } double get_z_at(unsigned int id) const { return (id < m_zs.size()) ? m_zs[id] : 0.0; } Endpoints get_endpoints_at(unsigned int id) const { return (id < m_endpoints.size()) ? m_endpoints[id] : Endpoints(); } + +#if ENABLE_SPLITTED_VERTEX_BUFFER + bool operator != (const Layers& other) const { + if (m_zs != other.m_zs) + return true; + if (!(m_endpoints == other.m_endpoints)) + return true; + + return false; + } +#endif // ENABLE_SPLITTED_VERTEX_BUFFER + }; + +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + // used to render the toolpath caps of the current sequential range + // (i.e. when sliding on the horizontal slider) + struct SequentialRangeCap + { + TBuffer* buffer{ nullptr }; + unsigned int ibo{ 0 }; + unsigned int vbo{ 0 }; + Color color; + + ~SequentialRangeCap(); + bool is_renderable() const { return buffer != nullptr; } + void reset(); + size_t indices_count() const { return 6; } }; +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS #if ENABLE_GCODE_VIEWER_STATISTICS struct Statistics @@ -342,12 +488,18 @@ class GCodeViewer // time int64_t results_time{ 0 }; int64_t load_time{ 0 }; + int64_t load_vertices{ 0 }; + int64_t smooth_vertices{ 0 }; + int64_t load_indices{ 0 }; int64_t refresh_time{ 0 }; int64_t refresh_paths_time{ 0 }; // opengl calls int64_t gl_multi_points_calls_count{ 0 }; int64_t gl_multi_lines_calls_count{ 0 }; int64_t gl_multi_triangles_calls_count{ 0 }; +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + int64_t gl_triangles_calls_count{ 0 }; +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS // memory int64_t results_size{ 0 }; int64_t total_vertices_gpu_size{ 0 }; @@ -362,8 +514,6 @@ class GCodeViewer int64_t extrude_segments_count{ 0 }; int64_t vbuffers_count{ 0 }; int64_t ibuffers_count{ 0 }; - int64_t max_vertices_in_vertex_buffer{ 0 }; - int64_t max_indices_in_index_buffer{ 0 }; void reset_all() { reset_times(); @@ -375,6 +525,9 @@ class GCodeViewer void reset_times() { results_time = 0; load_time = 0; + load_vertices = 0; + smooth_vertices = 0; + load_indices = 0; refresh_time = 0; refresh_paths_time = 0; } @@ -383,6 +536,9 @@ class GCodeViewer gl_multi_points_calls_count = 0; gl_multi_lines_calls_count = 0; gl_multi_triangles_calls_count = 0; +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + gl_triangles_calls_count = 0; +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS } void reset_sizes() { @@ -401,8 +557,6 @@ class GCodeViewer extrude_segments_count = 0; vbuffers_count = 0; ibuffers_count = 0; - max_vertices_in_vertex_buffer = 0; - max_indices_in_index_buffer = 0; } }; #endif // ENABLE_GCODE_VIEWER_STATISTICS @@ -461,11 +615,10 @@ class GCodeViewer }; private: - bool m_initialized{ false }; - mutable bool m_gl_data_initialized{ false }; + bool m_gl_data_initialized{ false }; unsigned int m_last_result_id{ 0 }; size_t m_moves_count{ 0 }; - mutable std::vector m_buffers{ static_cast(EMoveType::Extrude) }; + std::vector m_buffers{ static_cast(EMoveType::Extrude) }; // bounding box of toolpaths BoundingBoxf3 m_paths_bounding_box; // bounding box of toolpaths + marker tools @@ -476,21 +629,24 @@ class GCodeViewer std::vector m_roles; size_t m_extruders_count; std::vector m_extruder_ids; - mutable Extrusions m_extrusions; - mutable SequentialView m_sequential_view; + Extrusions m_extrusions; + SequentialView m_sequential_view; Shells m_shells; EViewType m_view_type{ EViewType::FeatureType }; bool m_legend_enabled{ true }; PrintEstimatedTimeStatistics m_time_statistics; - mutable PrintEstimatedTimeStatistics::ETimeMode m_time_estimate_mode{ PrintEstimatedTimeStatistics::ETimeMode::Normal }; + PrintEstimatedTimeStatistics::ETimeMode m_time_estimate_mode{ PrintEstimatedTimeStatistics::ETimeMode::Normal }; #if ENABLE_GCODE_VIEWER_STATISTICS - mutable Statistics m_statistics; + Statistics m_statistics; #endif // ENABLE_GCODE_VIEWER_STATISTICS - mutable std::array m_detected_point_sizes = { 0.0f, 0.0f }; + std::array m_detected_point_sizes = { 0.0f, 0.0f }; GCodeProcessor::Result::SettingsIds m_settings_ids; +#if ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS + std::array m_sequential_range_caps; +#endif // ENABLE_REDUCED_TOOLPATHS_SEGMENT_CAPS public: - GCodeViewer() = default; + GCodeViewer(); ~GCodeViewer() { reset(); } // extract rendering data from the given parameters @@ -506,10 +662,13 @@ class GCodeViewer void render() const; bool has_data() const { return !m_roles.empty(); } +#if ENABLE_SPLITTED_VERTEX_BUFFER + bool can_export_toolpaths() const; +#endif // ENABLE_SPLITTED_VERTEX_BUFFER const BoundingBoxf3& get_paths_bounding_box() const { return m_paths_bounding_box; } const BoundingBoxf3& get_max_bounding_box() const { return m_max_bounding_box; } - const std::vector& get_layers_zs() const { return m_layers.get_zs(); }; + const std::vector& get_layers_zs() const { return m_layers.get_zs(); } const SequentialView& get_sequential_view() const { return m_sequential_view; } void update_sequential_view_current(unsigned int first, unsigned int last); @@ -536,7 +695,6 @@ class GCodeViewer void export_toolpaths_to_obj(const char* filename) const; private: - void init(); void load_toolpaths(const GCodeProcessor::Result& gcode_result); void load_shells(const Print& print, bool initialized); void refresh_render_paths(bool keep_sequential_current_first, bool keep_sequential_current_last) const; diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 03d6b94ce56..b97c51d1b0a 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -631,12 +631,12 @@ void GLCanvas3D::WarningTexture::activate(WarningTexture::Warning warning, bool std::string text; bool error = false; switch (warning) { - case ObjectOutside: text = L("An object outside the print area was detected."); break; - case ToolpathOutside: text = L("A toolpath outside the print area was detected."); error = true; break; - case SlaSupportsOutside: text = L("SLA supports outside the print area were detected."); error = true; break; - case SomethingNotShown: text = L("Some objects are not visible."); break; + case ObjectOutside: text = _u8L("An object outside the print area was detected."); break; + case ToolpathOutside: text = _u8L("A toolpath outside the print area was detected."); error = true; break; + case SlaSupportsOutside: text = _u8L("SLA supports outside the print area were detected."); error = true; break; + case SomethingNotShown: text = _u8L("Some objects are not visible."); break; case ObjectClashed: - text = L( "An object outside the print area was detected.\n" + text = _u8L( "An object outside the print area was detected.\n" "Resolve the current problem to continue slicing."); error = true; break; @@ -1377,7 +1377,7 @@ void GLCanvas3D::update_instance_printable_state_for_object(const size_t obj_idx } } -void GLCanvas3D::update_instance_printable_state_for_objects(std::vector& object_idxs) +void GLCanvas3D::update_instance_printable_state_for_objects(const std::vector& object_idxs) { for (size_t obj_idx : object_idxs) update_instance_printable_state_for_object(obj_idx); @@ -3866,7 +3866,11 @@ void GLCanvas3D::update_tooltip_for_settings_item_in_main_toolbar() bool GLCanvas3D::has_toolpaths_to_export() const { +#if ENABLE_SPLITTED_VERTEX_BUFFER + return m_gcode_viewer.can_export_toolpaths(); +#else return m_gcode_viewer.has_data(); +#endif // ENABLE_SPLITTED_VERTEX_BUFFER } void GLCanvas3D::export_toolpaths_to_obj(const char* filename) const @@ -4578,9 +4582,9 @@ bool GLCanvas3D::_init_main_toolbar() "\n" + "[" + GUI::shortkey_ctrl_prefix() + "4] - " + _u8L("Printer Settings Tab") ; item.sprite_id = 10; item.enabling_callback = GLToolbarItem::Default_Enabling_Callback; - item.visibility_callback = [this]() { return (wxGetApp().app_config->get("new_settings_layout_mode") == "1" || - wxGetApp().app_config->get("dlg_settings_layout_mode") == "1"); }; - item.left.action_callback = [this]() { wxGetApp().mainframe->select_tab(); }; + item.visibility_callback = []() { return (wxGetApp().app_config->get("new_settings_layout_mode") == "1" || + wxGetApp().app_config->get("dlg_settings_layout_mode") == "1"); }; + item.left.action_callback = []() { wxGetApp().mainframe->select_tab(); }; if (!m_main_toolbar.add_item(item)) return false; @@ -5676,7 +5680,7 @@ void GLCanvas3D::_load_print_toolpaths() if (!print->is_step_done(psSkirt) || !print->is_step_done(psBrim)) return; - if (!print->has_skirt() && (print->config().brim_width.value == 0)) + if (!print->has_skirt() && !print->has_brim()) return; const float color[] = { 0.5f, 1.0f, 0.5f, 1.0f }; // greenish @@ -5688,7 +5692,7 @@ void GLCanvas3D::_load_print_toolpaths() total_layer_count = std::max(total_layer_count, print_object->total_layer_count()); } size_t skirt_height = print->has_infinite_skirt() ? total_layer_count : std::min(print->config().skirt_height.value, total_layer_count); - if ((skirt_height == 0) && (print->config().brim_width.value > 0)) + if ((skirt_height == 0) && print->has_brim()) skirt_height = 1; // Get first skirt_height layers. @@ -5818,7 +5822,7 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c int get_color_idx_for_tool_change(std::vector::const_iterator it, const int extruder) const { const int current_extruder = it->extruder == 0 ? extruder : it->extruder; - if (number_tools() == extruders_cnt + 1) // there is no one "M600" + if (number_tools() == size_t(extruders_cnt + 1)) // there is no one "M600" return std::min(extruders_cnt - 1, std::max(current_extruder - 1, 0)); auto it_n = it; @@ -5906,8 +5910,7 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c tbb::blocked_range(0, ctxt.layers.size(), grain_size), [&ctxt, &new_volume, is_selected_separate_extruder, this](const tbb::blocked_range& range) { GLVolumePtrs vols; - std::vector color_print_layer_to_glvolume; - auto volume = [&ctxt, &vols, &color_print_layer_to_glvolume, &range](size_t layer_idx, int extruder, int feature) -> GLVolume& { + auto volume = [&ctxt, &vols](size_t layer_idx, int extruder, int feature) -> GLVolume& { return *vols[ctxt.color_by_color_print()? ctxt.color_print_color_idx_by_layer_idx_and_extruder(layer_idx, extruder) : ctxt.color_by_tool() ? diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index fee13608700..d3b4e17483e 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -394,7 +394,6 @@ class GLCanvas3D class Slope { bool m_enabled{ false }; - bool m_dialog_shown{ false }; GLCanvas3D& m_canvas; GLVolumeCollection& m_volumes; static float s_window_width; @@ -565,7 +564,7 @@ class GLCanvas3D void toggle_sla_auxiliaries_visibility(bool visible, const ModelObject* mo = nullptr, int instance_idx = -1); void toggle_model_objects_visibility(bool visible, const ModelObject* mo = nullptr, int instance_idx = -1); void update_instance_printable_state_for_object(size_t obj_idx); - void update_instance_printable_state_for_objects(std::vector& object_idxs); + void update_instance_printable_state_for_objects(const std::vector& object_idxs); void set_config(const DynamicPrintConfig* config); void set_process(BackgroundSlicingProcess* process); diff --git a/src/slic3r/GUI/GUI.cpp b/src/slic3r/GUI/GUI.cpp index 1f0a1e5cf4a..afd9fc7d805 100644 --- a/src/slic3r/GUI/GUI.cpp +++ b/src/slic3r/GUI/GUI.cpp @@ -35,8 +35,8 @@ void disable_screensaver() { #if __APPLE__ CFStringRef reasonForActivity = CFSTR("Slic3r"); - IOReturn success = IOPMAssertionCreateWithName(kIOPMAssertionTypeNoDisplaySleep, - kIOPMAssertionLevelOn, reasonForActivity, &assertionID); + [[maybe_unused]]IOReturn success = IOPMAssertionCreateWithName(kIOPMAssertionTypeNoDisplaySleep, + kIOPMAssertionLevelOn, reasonForActivity, &assertionID); // ignore result: success == kIOReturnSuccess #elif _WIN32 SetThreadExecutionState(ES_DISPLAY_REQUIRED | ES_CONTINUOUS); @@ -46,7 +46,7 @@ void disable_screensaver() void enable_screensaver() { #if __APPLE__ - IOReturn success = IOPMAssertionRelease(assertionID); + IOPMAssertionRelease(assertionID); #elif _WIN32 SetThreadExecutionState(ES_CONTINUOUS); #endif @@ -71,7 +71,7 @@ void break_to_debugger() const std::string& shortkey_ctrl_prefix() { - static const std::string str = + static const std::string str = #ifdef __APPLE__ "⌘" #else @@ -83,7 +83,7 @@ const std::string& shortkey_ctrl_prefix() const std::string& shortkey_alt_prefix() { - static const std::string str = + static const std::string str = #ifdef __APPLE__ "⌥" #else @@ -132,13 +132,13 @@ void change_opt_value(DynamicPrintConfig& config, const t_config_option_key& opt ConfigOptionFloats* vec_new = new ConfigOptionFloats{ boost::any_cast(value) }; config.option(opt_key)->set_at(vec_new, opt_index, opt_index); break; - } + } case coString: config.set_key_value(opt_key, new ConfigOptionString(boost::any_cast(value))); break; case coStrings:{ if (opt_key == "compatible_prints" || opt_key == "compatible_printers") { - config.option(opt_key)->values = + config.option(opt_key)->values = boost::any_cast>(value); } else if (config.def()->get(opt_key)->gui_flags.compare("serialized") == 0) { @@ -179,13 +179,17 @@ void change_opt_value(DynamicPrintConfig& config, const t_config_option_key& opt if (opt_key == "top_fill_pattern" || opt_key == "bottom_fill_pattern" || opt_key == "fill_pattern") - config.set_key_value(opt_key, new ConfigOptionEnum(boost::any_cast(value))); + config.set_key_value(opt_key, new ConfigOptionEnum(boost::any_cast(value))); else if (opt_key.compare("ironing_type") == 0) - config.set_key_value(opt_key, new ConfigOptionEnum(boost::any_cast(value))); + config.set_key_value(opt_key, new ConfigOptionEnum(boost::any_cast(value))); + else if (opt_key.compare("fuzzy_skin_perimeter_mode") == 0) + config.set_key_value(opt_key, new ConfigOptionEnum(boost::any_cast(value))); +// else if (opt_key.compare("fuzzy_skin_shape") == 0) +// config.set_key_value(opt_key, new ConfigOptionEnum(boost::any_cast(value))); else if (opt_key.compare("gcode_flavor") == 0) - config.set_key_value(opt_key, new ConfigOptionEnum(boost::any_cast(value))); + config.set_key_value(opt_key, new ConfigOptionEnum(boost::any_cast(value))); else if (opt_key.compare("machine_limits_usage") == 0) - config.set_key_value(opt_key, new ConfigOptionEnum(boost::any_cast(value))); + config.set_key_value(opt_key, new ConfigOptionEnum(boost::any_cast(value))); else if (opt_key.compare("support_material_pattern") == 0) config.set_key_value(opt_key, new ConfigOptionEnum(boost::any_cast(value))); else if (opt_key.compare("seam_position") == 0) @@ -198,6 +202,8 @@ void change_opt_value(DynamicPrintConfig& config, const t_config_option_key& opt config.set_key_value(opt_key, new ConfigOptionEnum(boost::any_cast(value))); else if(opt_key == "printhost_authorization_type") config.set_key_value(opt_key, new ConfigOptionEnum(boost::any_cast(value))); + else if(opt_key == "brim_type") + config.set_key_value(opt_key, new ConfigOptionEnum(boost::any_cast(value))); else if (opt_key == "raft_size_adjust") config.set_key_value(opt_key, new ConfigOptionEnum(boost::any_cast(value))); } diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 1be2495ca3b..c672e0609a3 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -325,7 +325,7 @@ class SplashScreen : public wxSplashScreen size_t cur_len = 0; wxString longest_sub_string; - auto get_longest_sub_string = [longest_sub_string, input](wxString &longest_sub_str, int cur_len, size_t i) { + auto get_longest_sub_string = [input](wxString &longest_sub_str, size_t cur_len, size_t i) { if (cur_len > longest_sub_str.Len()) longest_sub_str = input.SubString(i - cur_len + 1, i); }; @@ -775,6 +775,7 @@ bool GUI_App::on_init_inner() // Slic3r::debugf "wxWidgets version %s, Wx version %s\n", wxVERSION_STRING, wxVERSION; + if (is_editor()) { std::string msg = Http::tls_global_init(); std::string ssl_cert_store = app_config->get("tls_accepted_cert_store_location"); @@ -798,6 +799,9 @@ bool GUI_App::on_init_inner() app_config->set("version", SLIC3R_VERSION); app_config->save(); + // If load_language() fails, the application closes. + load_language(wxString(), true); + wxInitAllImageHandlers(); SplashScreen* scrn = nullptr; @@ -865,9 +869,6 @@ bool GUI_App::on_init_inner() init_label_colours(); init_fonts(); - // If load_language() fails, the application closes. - load_language(wxString(), true); - // Suppress the '- default -' presets. preset_bundle->set_default_suppressed(app_config->get("no_defaults") == "1"); try { @@ -1033,6 +1034,12 @@ void GUI_App::update_label_colours_from_appconfig() } } +void GUI_App::update_label_colours() +{ + for (Tab* tab : tabs_list) + tab->update_label_colours(); +} + void GUI_App::init_fonts() { m_small_font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); @@ -1066,7 +1073,10 @@ void GUI_App::update_fonts(const MainFrame *main_frame) m_code_font.SetPointSize(m_normal_font.GetPointSize()); } -void GUI_App::set_label_clr_modified(const wxColour& clr) { +void GUI_App::set_label_clr_modified(const wxColour& clr) +{ + if (m_color_label_modified == clr) + return; m_color_label_modified = clr; auto clr_str = wxString::Format(wxT("#%02X%02X%02X"), clr.Red(), clr.Green(), clr.Blue()); std::string str = clr_str.ToStdString(); @@ -1074,7 +1084,10 @@ void GUI_App::set_label_clr_modified(const wxColour& clr) { app_config->save(); } -void GUI_App::set_label_clr_sys(const wxColour& clr) { +void GUI_App::set_label_clr_sys(const wxColour& clr) +{ + if (m_color_label_sys == clr) + return; m_color_label_sys = clr; auto clr_str = wxString::Format(wxT("#%02X%02X%02X"), clr.Red(), clr.Green(), clr.Blue()); std::string str = clr_str.ToStdString(); @@ -1229,6 +1242,7 @@ void fatal_error(wxWindow* parent) // Update the UI based on the current preferences. void GUI_App::update_ui_from_settings(bool apply_free_camera_correction) { + update_label_colours(); mainframe->update_ui_from_settings(apply_free_camera_correction); } @@ -1799,7 +1813,8 @@ bool GUI_App::check_unsaved_changes(const wxString &header) // synchronize config.ini with the current selections. preset_bundle->export_selections(*app_config); - wxMessageBox(_L("The preset(s) modifications are successfully saved")); + wxMessageBox(_L_PLURAL("The preset modifications are successfully saved", + "The presets modifications are successfully saved", dlg.get_names_and_types().size())); } } diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index 8aceb7a6979..132776dcb3d 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -167,6 +167,7 @@ class GUI_App : public wxApp static bool dark_mode(); void init_label_colours(); void update_label_colours_from_appconfig(); + void update_label_colours(); void init_fonts(); void update_fonts(const MainFrame *main_frame = nullptr); void set_label_clr_modified(const wxColour& clr); diff --git a/src/slic3r/GUI/GUI_ObjectLayers.cpp b/src/slic3r/GUI/GUI_ObjectLayers.cpp index 7d8643c7f84..8768f39ff71 100644 --- a/src/slic3r/GUI/GUI_ObjectLayers.cpp +++ b/src/slic3r/GUI/GUI_ObjectLayers.cpp @@ -132,7 +132,7 @@ wxSizer* ObjectLayers::create_layer(const t_layer_height_range& range, PlusMinus // Add control for the "Layer height" editor = new LayerRangeEditor(this, double_to_string(m_object->layer_config_ranges[range].option("layer_height")->getFloat()), etLayerHeight, set_focus_data, - [range, this](coordf_t layer_height, bool, bool) + [range](coordf_t layer_height, bool, bool) { return wxGetApp().obj_list()->edit_layer_range(range, layer_height); }); diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 3d08b26f12a..87bc1090fcc 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -13,6 +13,7 @@ #include "libslic3r/Model.hpp" #include "GLCanvas3D.hpp" #include "Selection.hpp" +#include "format.hpp" #include #include "slic3r/Utils/FixModelByWin10.hpp" @@ -97,7 +98,7 @@ ObjectList::ObjectList(wxWindow* parent) : CATEGORY_ICON[L("Extruders")] = create_scaled_bitmap("funnel"); CATEGORY_ICON[L("Extrusion Width")] = create_scaled_bitmap("funnel"); CATEGORY_ICON[L("Wipe options")] = create_scaled_bitmap("funnel"); -// CATEGORY_ICON[L("Skirt and brim")] = create_scaled_bitmap("skirt+brim"); + CATEGORY_ICON[L("Skirt and brim")] = create_scaled_bitmap("skirt+brim"); // CATEGORY_ICON[L("Speed > Acceleration")] = create_scaled_bitmap("time"); CATEGORY_ICON[L("Advanced")] = create_scaled_bitmap("wrench"); // ptSLA @@ -116,7 +117,9 @@ ObjectList::ObjectList(wxWindow* parent) : // 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() // see: https://github.com/prusa3d/PrusaSlicer/issues/3802 +#ifndef __WXOSX__ const wxPoint mouse_pos = this->get_mouse_position_in_control(); +#endif #ifndef __APPLE__ // On Windows and Linux, forces a kill focus emulation on the object manipulator fields because this event handler is called @@ -260,13 +263,27 @@ ObjectList::~ObjectList() void ObjectList::set_min_height() { - /* Temporary workaround for the correct behavior of the Scrolled sidebar panel: - * change min hight of object list to the normal min value (20 * wxGetApp().em_unit()) - * after first whole Mainframe updating/layouting - */ - const int list_min_height = 20 * wxGetApp().em_unit(); - if (this->GetMinSize().GetY() > list_min_height) - this->SetMinSize(wxSize(-1, list_min_height)); + if (m_items_count == size_t(-1)) + m_items_count = 7; + int list_min_height = lround(2.25 * (m_items_count + 1) * wxGetApp().em_unit()); // +1 is for height of control header + this->SetMinSize(wxSize(1, list_min_height)); +} + +void ObjectList::update_min_height() +{ + wxDataViewItemArray all_items; + m_objects_model->GetAllChildren(wxDataViewItem(nullptr), all_items); + size_t items_cnt = all_items.Count(); + if (items_cnt < 7) + items_cnt = 7; + else if (items_cnt >= 15) + items_cnt = 15; + + if (m_items_count == items_cnt) + return; + + m_items_count = items_cnt; + set_min_height(); } @@ -274,7 +291,7 @@ void ObjectList::create_objects_ctrl() { /* Temporary workaround for the correct behavior of the Scrolled sidebar panel: * 1. set a height of the list to some big value - * 2. change it to the normal min value (20 * wxGetApp().em_unit()) after first whole Mainframe updating/layouting + * 2. change it to the normal(meaningful) min value after first whole Mainframe updating/layouting */ SetMinSize(wxSize(-1, 3000)); @@ -399,27 +416,27 @@ wxString ObjectList::get_mesh_errors_list(const int obj_idx, const int vol_idx / return ""; // hide tooltip // Create tooltip string, if there are errors - wxString tooltip = wxString::Format(_(L("Auto-repaired (%d errors):")), errors) + "\n"; + wxString tooltip = format_wxstr(_L_PLURAL("Auto-repaired %1$d error", "Auto-repaired %1$d errors", errors), errors) + ":\n"; const stl_stats& stats = vol_idx == -1 ? (*m_objects)[obj_idx]->get_object_stl_stats() : (*m_objects)[obj_idx]->volumes[vol_idx]->mesh().stl.stats; - std::map error_msg = { - { L("degenerate facets"), stats.degenerate_facets }, - { L("edges fixed"), stats.edges_fixed }, - { L("facets removed"), stats.facets_removed }, - { L("facets added"), stats.facets_added }, - { L("facets reversed"), stats.facets_reversed }, - { L("backwards edges"), stats.backwards_edges } - }; - - for (const auto& error : error_msg) - if (error.second > 0) - tooltip += from_u8((boost::format("\t%1% %2%\n") % error.second % _utf8(error.first)).str()); + if (stats.degenerate_facets > 0) + tooltip += "\t" + format_wxstr(_L_PLURAL("%1$d degenerate facet", "%1$d degenerate facets", stats.degenerate_facets), stats.degenerate_facets) + "\n"; + if (stats.edges_fixed > 0) + tooltip += "\t" + format_wxstr(_L_PLURAL("%1$d edge fixed", "%1$d edges fixed", stats.edges_fixed), stats.edges_fixed) + "\n"; + if (stats.facets_removed > 0) + tooltip += "\t" + format_wxstr(_L_PLURAL("%1$d facet removed", "%1$d facets removed", stats.facets_removed), stats.facets_removed) + "\n"; + if (stats.facets_added > 0) + tooltip += "\t" + format_wxstr(_L_PLURAL("%1$d facet added", "%1$d facets added", stats.facets_added), stats.facets_added) + "\n"; + if (stats.facets_reversed > 0) + tooltip += "\t" + format_wxstr(_L_PLURAL("%1$d facet reversed", "%1$d facets reversed", stats.facets_reversed), stats.facets_reversed) + "\n"; + if (stats.backwards_edges > 0) + tooltip += "\t" + format_wxstr(_L_PLURAL("%1$d backwards edge", "%1$d backwards edges", stats.backwards_edges), stats.backwards_edges) + "\n"; if (is_windows10()) - tooltip += _(L("Right button click the icon to fix STL through Netfabb")); + tooltip += _L("Right button click the icon to fix STL through Netfabb"); return tooltip; } @@ -672,7 +689,7 @@ void ObjectList::msw_rescale_icons() CATEGORY_ICON[L("Extruders")] = create_scaled_bitmap("funnel"); CATEGORY_ICON[L("Extrusion Width")] = create_scaled_bitmap("funnel"); CATEGORY_ICON[L("Wipe options")] = create_scaled_bitmap("funnel"); -// CATEGORY_ICON[L("Skirt and brim")] = create_scaled_bitmap("skirt+brim"); + CATEGORY_ICON[L("Skirt and brim")] = create_scaled_bitmap("skirt+brim"); // CATEGORY_ICON[L("Speed > Acceleration")] = create_scaled_bitmap("time"); CATEGORY_ICON[L("Advanced")] = create_scaled_bitmap("wrench"); // ptSLA @@ -737,7 +754,7 @@ void ObjectList::copy_layers_to_clipboard() return; } - for (const auto layer_item : sel_layers) + for (const auto& layer_item : sel_layers) if (m_objects_model->GetItemType(layer_item) & itLayer) { auto range = m_objects_model->GetLayerRangeByItem(layer_item); auto it = ranges.find(range); @@ -763,7 +780,7 @@ void ObjectList::paste_layers_into_list() t_layer_config_ranges& ranges = object(obj_idx)->layer_config_ranges; // and create Layer item(s) according to the layer_config_ranges - for (const auto range : cache_ranges) + for (const auto& range : cache_ranges) ranges.emplace(range); layers_item = add_layer_root_item(object_item); @@ -1827,7 +1844,7 @@ void ObjectList::append_menu_item_export_stl(wxMenu* menu) const void ObjectList::append_menu_item_reload_from_disk(wxMenu* menu) const { append_menu_item(menu, wxID_ANY, _(L("Reload from disk")), _(L("Reload the selected volumes from disk")), - [this](wxCommandEvent&) { wxGetApp().plater()->reload_from_disk(); }, "", menu, + [](wxCommandEvent&) { wxGetApp().plater()->reload_from_disk(); }, "", menu, []() { return wxGetApp().plater()->can_reload_from_disk(); }, wxGetApp().plater()); } @@ -2048,9 +2065,9 @@ wxMenu* ObjectList::create_settings_popupmenu(wxMenu *parent_menu) for (auto cat : settings_menu) { append_menu_item(menu, wxID_ANY, _(cat.first), "", - [menu, this](wxCommandEvent& event) { get_settings_choice(menu->GetLabel(event.GetId())); }, + [this, menu](wxCommandEvent& event) { get_settings_choice(menu->GetLabel(event.GetId())); }, CATEGORY_ICON.find(cat.first) == CATEGORY_ICON.end() ? wxNullBitmap : CATEGORY_ICON.at(cat.first), parent_menu, - [this]() { return true; }, wxGetApp().plater()); + []() { return true; }, wxGetApp().plater()); } return menu; @@ -2069,9 +2086,9 @@ void ObjectList::create_freq_settings_popupmenu(wxMenu *menu, const bool is_obje continue; append_menu_item(menu, wxID_ANY, _(it.first), "", - [menu, this](wxCommandEvent& event) { get_freq_settings_choice(menu->GetLabel(event.GetId())); }, + [this, menu](wxCommandEvent& event) { get_freq_settings_choice(menu->GetLabel(event.GetId())); }, CATEGORY_ICON.find(it.first) == CATEGORY_ICON.end() ? wxNullBitmap : CATEGORY_ICON.at(it.first), menu, - [this]() { return true; }, wxGetApp().plater()); + []() { return true; }, wxGetApp().plater()); } #if 0 // Add "Quick" settings bundles @@ -2993,6 +3010,8 @@ void ObjectList::part_selection_changed() else if (update_and_show_layers) wxGetApp().obj_layers()->get_og()->set_name(" " + og_name + " "); + update_min_height(); + Sidebar& panel = wxGetApp().sidebar(); panel.Freeze(); @@ -3659,16 +3678,28 @@ void ObjectList::update_selections() return; sels.Add(m_objects_model->GetItemById(selection.get_object_idx())); } - if (selection.is_single_volume() || selection.is_any_modifier()) { + else if (selection.is_single_volume() || selection.is_any_modifier()) { const auto gl_vol = selection.get_volume(*selection.get_volume_idxs().begin()); if (m_objects_model->GetVolumeIdByItem(m_objects_model->GetParent(item)) == gl_vol->volume_idx()) return; } - // but if there is selected only one of several instances by context menu, // then select this instance in ObjectList - if (selection.is_single_full_instance()) + else if (selection.is_single_full_instance()) sels.Add(m_objects_model->GetItemByInstanceId(selection.get_object_idx(), selection.get_instance_idx())); + // Can be the case, when we have selected itSettings | itLayerRoot | itLayer in the ObjectList and selected object/instance in the Scene + // and then select some object/instance in 3DScene using Ctrt+left click + // see https://github.com/prusa3d/PrusaSlicer/issues/5517 + else { + // Unselect all items in ObjectList + m_last_selected_item = wxDataViewItem(nullptr); + m_prevent_list_events = true; + UnselectAll(); + m_prevent_list_events = false; + // call this function again to update selection from the canvas + update_selections(); + return; + } } else if (selection.is_single_full_object() || selection.is_multiple_full_object()) { @@ -4467,9 +4498,9 @@ void ObjectList::update_item_error_icon(const int obj_idx, const int vol_idx) co void ObjectList::msw_rescale() { + set_min_height(); + const int em = wxGetApp().em_unit(); - // update min size !!! A width of control shouldn't be a wxDefaultCoord - SetMinSize(wxSize(1, 15 * em)); GetColumn(colName )->SetWidth(20 * em); GetColumn(colPrint )->SetWidth( 3 * em); @@ -4571,7 +4602,7 @@ void ObjectList::show_multi_selection_menu() append_menu_item_change_extruder(menu); append_menu_item(menu, wxID_ANY, _(L("Reload from disk")), _(L("Reload the selected volumes from disk")), - [this](wxCommandEvent&) { wxGetApp().plater()->reload_from_disk(); }, "", menu, []() { + [](wxCommandEvent&) { wxGetApp().plater()->reload_from_disk(); }, "", menu, []() { return wxGetApp().plater()->can_reload_from_disk(); }, wxGetApp().plater()); diff --git a/src/slic3r/GUI/GUI_ObjectList.hpp b/src/slic3r/GUI/GUI_ObjectList.hpp index 52aefe0e655..15d5ecb08e1 100644 --- a/src/slic3r/GUI/GUI_ObjectList.hpp +++ b/src/slic3r/GUI/GUI_ObjectList.hpp @@ -197,6 +197,8 @@ class ObjectList : public wxDataViewCtrl SettingsBundle m_freq_settings_sla; #endif + size_t m_items_count { size_t(-1) }; + inline void ensure_current_item_visible() { if (const auto &item = this->GetCurrentItem()) @@ -208,6 +210,7 @@ class ObjectList : public wxDataViewCtrl ~ObjectList(); void set_min_height(); + void update_min_height(); std::map CATEGORY_ICON; diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.cpp b/src/slic3r/GUI/GUI_ObjectManipulation.cpp index 8a4c280961b..e9c873509e8 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.cpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.cpp @@ -45,11 +45,11 @@ static double get_volume_min_z(const GLVolume* volume) -static wxBitmapComboBox* create_word_local_combo(wxWindow *parent) +static choice_ctrl* create_word_local_combo(wxWindow *parent) { wxSize size(15 * wxGetApp().em_unit(), -1); - wxBitmapComboBox *temp = nullptr; + choice_ctrl* temp = nullptr; #ifdef __WXOSX__ /* wxBitmapComboBox with wxCB_READONLY style return NULL for GetTextCtrl(), * so ToolTip doesn't shown. @@ -59,7 +59,7 @@ static wxBitmapComboBox* create_word_local_combo(wxWindow *parent) temp->SetTextCtrlStyle(wxTE_READONLY); temp->Create(parent, wxID_ANY, wxString(""), wxDefaultPosition, size, 0, nullptr); #else - temp = new wxBitmapComboBox(parent, wxID_ANY, wxString(""), wxDefaultPosition, size, 0, nullptr, wxCB_READONLY); + temp = new choice_ctrl(parent, wxID_ANY, wxString(""), wxDefaultPosition, size, 0, nullptr, wxCB_READONLY); #endif //__WXOSX__ temp->SetFont(Slic3r::GUI::wxGetApp().normal_font()); @@ -70,27 +70,13 @@ static wxBitmapComboBox* create_word_local_combo(wxWindow *parent) temp->SetSelection(0); temp->SetValue(temp->GetString(0)); -#ifndef __WXGTK__ - /* Workaround for a correct rendering of the control without Bitmap (under MSW and OSX): - * - * 1. We should create small Bitmap to fill Bitmaps RefData, - * ! in this case wxBitmap.IsOK() return true. - * 2. But then set width to 0 value for no using of bitmap left and right spacing - * 3. Set this empty bitmap to the at list one item and BitmapCombobox will be recreated correct - * - * Note: Set bitmap height to the Font size because of OSX rendering. - */ - wxBitmap empty_bmp(1, temp->GetFont().GetPixelSize().y + 2); - empty_bmp.SetWidth(0); - temp->SetItemBitmap(0, empty_bmp); -#endif - temp->SetToolTip(_L("Select coordinate space, in which the transformation will be performed.")); return temp; } -void msw_rescale_word_local_combo(wxBitmapComboBox* combo) +void msw_rescale_word_local_combo(choice_ctrl* combo) { +#ifdef __WXOSX__ const wxString selection = combo->GetString(combo->GetSelection()); /* To correct scaling (set new controll size) of a wxBitmapCombobox @@ -111,11 +97,10 @@ void msw_rescale_word_local_combo(wxBitmapComboBox* combo) combo->Append(_L("World coordinates")); combo->Append(_L("Local coordinates")); - wxBitmap empty_bmp(1, combo->GetFont().GetPixelSize().y + 2); - empty_bmp.SetWidth(0); - combo->SetItemBitmap(0, empty_bmp); - combo->SetValue(selection); +#else + combo->SetMinSize(wxSize(15 * wxGetApp().em_unit(), -1)); +#endif } static void set_font_and_background_style(wxWindow* win, const wxFont& font) diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.hpp b/src/slic3r/GUI/GUI_ObjectManipulation.hpp index 560fbb400d0..6b275799feb 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.hpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.hpp @@ -7,7 +7,11 @@ #include "libslic3r/Point.hpp" #include +#ifdef __WXOSX__ class wxBitmapComboBox; +#else +class wxComboBox; +#endif // __WXOSX__ class wxStaticText; class LockButton; class wxStaticBitmap; @@ -16,6 +20,13 @@ class wxCheckBox; namespace Slic3r { namespace GUI { +#ifdef __WXOSX__ + static_assert(wxMAJOR_VERSION >= 3, "Use of wxBitmapComboBox on Manipulation panel requires wxWidgets 3.0 and newer"); + using choice_ctrl = wxBitmapComboBox; +#else + using choice_ctrl = wxComboBox; +#endif // __WXOSX__ + class Selection; class ObjectManipulation; @@ -125,7 +136,7 @@ class ObjectManipulation : public OG_Settings // Does the object manipulation panel work in World or Local coordinates? bool m_world_coordinates = true; LockButton* m_lock_bnt{ nullptr }; - wxBitmapComboBox* m_word_local_combo = nullptr; + choice_ctrl* m_word_local_combo { nullptr }; ScalableBitmap m_manifold_warning_bmp; wxStaticBitmap* m_fix_throught_netfab_bitmap; diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index bca27fa21c5..3a1ec46f2e0 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -36,11 +36,8 @@ View3D::View3D(wxWindow* parent, Model* model, DynamicPrintConfig* config, Backg View3D::~View3D() { - if (m_canvas != nullptr) - delete m_canvas; - - if (m_canvas_widget != nullptr) - delete m_canvas_widget; + delete m_canvas; + delete m_canvas_widget; } bool View3D::init(wxWindow* parent, Model* model, DynamicPrintConfig* config, BackgroundSlicingProcess* process) @@ -413,6 +410,12 @@ void Preview::msw_rescale() refresh_print(); } +void Preview::sys_color_changed() +{ + if (m_layers_slider != nullptr) + m_layers_slider->sys_color_changed(); +} + void Preview::jump_layers_slider(wxKeyEvent& evt) { if (m_layers_slider) m_layers_slider->OnChar(evt); @@ -493,13 +496,6 @@ void Preview::on_combochecklist_features(wxCommandEvent& evt) void Preview::on_combochecklist_options(wxCommandEvent& evt) { - auto xored = [](unsigned int flags1, unsigned int flags2, unsigned int flag) { - auto is_flag_set = [](unsigned int flags, unsigned int flag) { - return (flags & (1 << flag)) != 0; - }; - return !is_flag_set(flags1, flag) != !is_flag_set(flags2, flag); - }; - unsigned int curr_flags = m_canvas->get_gcode_options_visibility_flags(); unsigned int new_flags = Slic3r::GUI::combochecklist_get_flags(m_combochecklist_options); if (curr_flags == new_flags) @@ -510,6 +506,13 @@ void Preview::on_combochecklist_options(wxCommandEvent& evt) #if ENABLE_RENDER_PATH_REFRESH_AFTER_OPTIONS_CHANGE m_canvas->refresh_gcode_preview_render_paths(); #else + auto xored = [](unsigned int flags1, unsigned int flags2, unsigned int flag) { + auto is_flag_set = [](unsigned int flags, unsigned int flag) { + return (flags & (1 << flag)) != 0; + }; + return !is_flag_set(flags1, flag) != !is_flag_set(flags2, flag); + }; + bool skip_refresh = xored(curr_flags, new_flags, static_cast(OptionType::Shells)) || xored(curr_flags, new_flags, static_cast(OptionType::ToolMarker)); @@ -971,6 +974,7 @@ void Preview::load_print_as_sla() sort_remove_duplicates(zs); m_canvas->reset_clipping_planes_cache(); + m_canvas->set_use_clipping_planes(true); n_layers = (unsigned int)zs.size(); if (n_layers == 0) { @@ -1004,7 +1008,6 @@ void Preview::on_layers_slider_scroll_changed(wxCommandEvent& event) else if (tech == ptSLA) { m_canvas->set_clipping_plane(0, ClippingPlane(Vec3d::UnitZ(), -m_layers_slider->GetLowerValueD())); m_canvas->set_clipping_plane(1, ClippingPlane(-Vec3d::UnitZ(), m_layers_slider->GetHigherValueD())); - m_canvas->set_use_clipping_planes(m_layers_slider->GetHigherValue() != 0); m_canvas->render(); } } diff --git a/src/slic3r/GUI/GUI_Preview.hpp b/src/slic3r/GUI/GUI_Preview.hpp index 0060bfcffbb..372d44fa312 100644 --- a/src/slic3r/GUI/GUI_Preview.hpp +++ b/src/slic3r/GUI/GUI_Preview.hpp @@ -150,6 +150,7 @@ class Preview : public wxPanel void refresh_print(); void msw_rescale(); + void sys_color_changed(); void jump_layers_slider(wxKeyEvent& evt); void move_layers_slider(wxKeyEvent& evt); void edit_layers_slider(wxKeyEvent& evt); diff --git a/src/slic3r/GUI/GUI_Utils.cpp b/src/slic3r/GUI/GUI_Utils.cpp index e2a6ccb885d..adb9633eab2 100644 --- a/src/slic3r/GUI/GUI_Utils.cpp +++ b/src/slic3r/GUI/GUI_Utils.cpp @@ -17,7 +17,6 @@ #include "libslic3r/Config.hpp" - namespace Slic3r { namespace GUI { diff --git a/src/slic3r/GUI/GUI_Utils.hpp b/src/slic3r/GUI/GUI_Utils.hpp index 3235d6e9eaa..dbb200f83bc 100644 --- a/src/slic3r/GUI/GUI_Utils.hpp +++ b/src/slic3r/GUI/GUI_Utils.hpp @@ -108,6 +108,7 @@ template class DPIAware : public P // recalc_font(); +#ifndef __WXOSX__ #if wxVERSION_EQUAL_OR_GREATER_THAN(3,1,3) this->Bind(wxEVT_DPI_CHANGED, [this](wxDPIChangedEvent& evt) { m_scale_factor = (float)evt.GetNewDPI().x / (float)DPI_DEFAULT; @@ -128,6 +129,7 @@ template class DPIAware : public P rescale(evt.rect); }); #endif // wxVERSION_EQUAL_OR_GREATER_THAN +#endif // no __WXOSX__ this->Bind(wxEVT_MOVE_START, [this](wxMoveEvent& event) { diff --git a/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp b/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp index c0f33978f61..1bd917c8627 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp @@ -31,17 +31,17 @@ class GLGizmoCut : public GLGizmoBase std::string get_tooltip() const override; protected: - virtual bool on_init(); - virtual void on_load(cereal::BinaryInputArchive& ar) { ar(m_cut_z, m_keep_upper, m_keep_lower, m_rotate_lower); } - virtual void on_save(cereal::BinaryOutputArchive& ar) const { ar(m_cut_z, m_keep_upper, m_keep_lower, m_rotate_lower); } - virtual std::string on_get_name() const; - virtual void on_set_state(); - virtual bool on_is_activable() const; - virtual void on_start_dragging(); - virtual void on_update(const UpdateData& data); - virtual void on_render() const; - virtual void on_render_for_picking() const; - virtual void on_render_input_window(float x, float y, float bottom_limit); + virtual bool on_init() override; + virtual void on_load(cereal::BinaryInputArchive& ar) override{ ar(m_cut_z, m_keep_upper, m_keep_lower, m_rotate_lower); } + virtual void on_save(cereal::BinaryOutputArchive& ar) const override { ar(m_cut_z, m_keep_upper, m_keep_lower, m_rotate_lower); } + virtual std::string on_get_name() const override; + virtual void on_set_state() override; + virtual bool on_is_activable() const override; + virtual void on_start_dragging() override; + virtual void on_update(const UpdateData& data) override; + virtual void on_render() const override; + virtual void on_render_for_picking() const override; + virtual void on_render_input_window(float x, float y, float bottom_limit) override; private: void update_max_z(const Selection& selection) const; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp index 8f2703faad6..f3f87cc33e5 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp @@ -20,10 +20,8 @@ namespace GUI { void GLGizmoFdmSupports::on_shutdown() { - if (m_setting_angle) { - m_setting_angle = false; - m_parent.use_slope(false); - } + m_angle_threshold_deg = 0.f; + m_parent.use_slope(false); } @@ -52,6 +50,9 @@ bool GLGizmoFdmSupports::on_init() m_desc["remove_all"] = _L("Remove all selection"); m_desc["circle"] = _L("Circle"); m_desc["sphere"] = _L("Sphere"); + m_desc["highlight_by_angle"] = _L("Highlight by angle"); + m_desc["enforce_button"] = _L("Enforce"); + m_desc["cancel"] = _L("Cancel"); return true; } @@ -65,8 +66,7 @@ void GLGizmoFdmSupports::render_painter_gizmo() const glsafe(::glEnable(GL_BLEND)); glsafe(::glEnable(GL_DEPTH_TEST)); - if (! m_setting_angle) - render_triangles(selection); + render_triangles(selection); m_c->object_clipper()->render_cut(); render_cursor(); @@ -81,179 +81,183 @@ void GLGizmoFdmSupports::on_render_input_window(float x, float y, float bottom_l if (! m_c->selection_info()->model_object()) return; - const float approx_height = m_imgui->scaled(14.0f); + const float approx_height = m_imgui->scaled(17.0f); y = std::min(y, bottom_limit - approx_height); m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); - if (! m_setting_angle) { - m_imgui->begin(on_get_name(), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse); - - // First calculate width of all the texts that are could possibly be shown. We will decide set the dialog width based on that: - const float clipping_slider_left = std::max(m_imgui->calc_text_size(m_desc.at("clipping_of_view")).x, - m_imgui->calc_text_size(m_desc.at("reset_direction")).x) - + m_imgui->scaled(1.5f); - const float cursor_slider_left = m_imgui->calc_text_size(m_desc.at("cursor_size")).x + m_imgui->scaled(1.f); - const float cursor_type_radio_left = m_imgui->calc_text_size(m_desc.at("cursor_type")).x + m_imgui->scaled(1.f); - const float cursor_type_radio_width1 = m_imgui->calc_text_size(m_desc["circle"]).x - + m_imgui->scaled(2.5f); - const float cursor_type_radio_width2 = m_imgui->calc_text_size(m_desc["sphere"]).x - + m_imgui->scaled(2.5f); - const float button_width = m_imgui->calc_text_size(m_desc.at("remove_all")).x + m_imgui->scaled(1.f); - const float minimal_slider_width = m_imgui->scaled(4.f); - - float caption_max = 0.f; - float total_text_max = 0.; - for (const std::string& t : {"enforce", "block", "remove"}) { - caption_max = std::max(caption_max, m_imgui->calc_text_size(m_desc.at(t+"_caption")).x); - total_text_max = std::max(total_text_max, caption_max + m_imgui->calc_text_size(m_desc.at(t)).x); + m_imgui->begin(on_get_name(), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse); + + // First calculate width of all the texts that are could possibly be shown. We will decide set the dialog width based on that: + const float clipping_slider_left = std::max(m_imgui->calc_text_size(m_desc.at("clipping_of_view")).x, + m_imgui->calc_text_size(m_desc.at("reset_direction")).x) + + m_imgui->scaled(1.5f); + const float cursor_slider_left = m_imgui->calc_text_size(m_desc.at("cursor_size")).x + m_imgui->scaled(1.f); + const float autoset_slider_left = m_imgui->calc_text_size(m_desc.at("highlight_by_angle")).x + m_imgui->scaled(1.f); + const float cursor_type_radio_left = m_imgui->calc_text_size(m_desc.at("cursor_type")).x + m_imgui->scaled(1.f); + const float cursor_type_radio_width1 = m_imgui->calc_text_size(m_desc["circle"]).x + + m_imgui->scaled(2.5f); + const float cursor_type_radio_width2 = m_imgui->calc_text_size(m_desc["sphere"]).x + + m_imgui->scaled(2.5f); + const float button_width = m_imgui->calc_text_size(m_desc.at("remove_all")).x + m_imgui->scaled(1.f); + const float button_enforce_width = m_imgui->calc_text_size(m_desc.at("enforce_button")).x; + const float button_cancel_width = m_imgui->calc_text_size(m_desc.at("cancel")).x; + const float buttons_width = std::max(button_enforce_width, button_cancel_width) + m_imgui->scaled(0.5f); + const float minimal_slider_width = m_imgui->scaled(4.f); + + float caption_max = 0.f; + float total_text_max = 0.; + for (const std::string& t : {"enforce", "block", "remove"}) { + caption_max = std::max(caption_max, m_imgui->calc_text_size(m_desc.at(t+"_caption")).x); + total_text_max = std::max(total_text_max, caption_max + m_imgui->calc_text_size(m_desc.at(t)).x); + } + caption_max += m_imgui->scaled(1.f); + total_text_max += m_imgui->scaled(1.f); + + float window_width = minimal_slider_width + std::max(autoset_slider_left, std::max(cursor_slider_left, clipping_slider_left)); + window_width = std::max(window_width, total_text_max); + window_width = std::max(window_width, button_width); + window_width = std::max(window_width, cursor_type_radio_left + cursor_type_radio_width1 + cursor_type_radio_width2); + window_width = std::max(window_width, 2.f * buttons_width + m_imgui->scaled(1.f)); + + auto draw_text_with_caption = [this, &caption_max](const wxString& caption, const wxString& text) { + m_imgui->text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, caption); + ImGui::SameLine(caption_max); + m_imgui->text(text); + }; + + for (const std::string& t : {"enforce", "block", "remove"}) + draw_text_with_caption(m_desc.at(t + "_caption"), m_desc.at(t)); + + m_imgui->text(""); + ImGui::Separator(); + + m_imgui->text(m_desc["highlight_by_angle"] + ":"); + ImGui::AlignTextToFramePadding(); + std::string format_str = std::string("%.f") + I18N::translate_utf8("°", + "Degree sign to use in the respective slider in FDM supports gizmo," + "placed after the number with no whitespace in between."); + ImGui::SameLine(autoset_slider_left); + ImGui::PushItemWidth(window_width - autoset_slider_left); + if (m_imgui->slider_float("", &m_angle_threshold_deg, 0.f, 90.f, format_str.data())) { + m_parent.set_slope_normal_angle(90.f - m_angle_threshold_deg); + if (! m_parent.is_using_slope()) { + m_parent.use_slope(true); + m_parent.set_as_dirty(); } - caption_max += m_imgui->scaled(1.f); - total_text_max += m_imgui->scaled(1.f); - - float window_width = minimal_slider_width + std::max(cursor_slider_left, clipping_slider_left); - window_width = std::max(window_width, total_text_max); - window_width = std::max(window_width, button_width); - window_width = std::max(window_width, cursor_type_radio_left + cursor_type_radio_width1 + cursor_type_radio_width2); - - auto draw_text_with_caption = [this, &caption_max](const wxString& caption, const wxString& text) { - m_imgui->text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, caption); - ImGui::SameLine(caption_max); - m_imgui->text(text); - }; + } - for (const std::string& t : {"enforce", "block", "remove"}) - draw_text_with_caption(m_desc.at(t + "_caption"), m_desc.at(t)); + m_imgui->disabled_begin(m_angle_threshold_deg == 0.f); + ImGui::NewLine(); + ImGui::SameLine(window_width - 2.f*buttons_width - m_imgui->scaled(0.5f)); + if (m_imgui->button(m_desc["enforce_button"], buttons_width, 0.f)) { + select_facets_by_angle(m_angle_threshold_deg, false); + m_angle_threshold_deg = 0.f; + } + ImGui::SameLine(window_width - buttons_width); + if (m_imgui->button(m_desc["cancel"], buttons_width, 0.f)) { + m_angle_threshold_deg = 0.f; + m_parent.use_slope(false); + } + m_imgui->disabled_end(); - m_imgui->text(""); + ImGui::Separator(); - if (m_imgui->button(_L("Autoset by angle") + "...")) { - m_setting_angle = true; + if (m_imgui->button(m_desc.at("remove_all"))) { + Plater::TakeSnapshot(wxGetApp().plater(), wxString(_L("Reset selection"))); + ModelObject* mo = m_c->selection_info()->model_object(); + int idx = -1; + for (ModelVolume* mv : mo->volumes) { + if (mv->is_model_part()) { + ++idx; + m_triangle_selectors[idx]->reset(); + } } - ImGui::SameLine(); - - if (m_imgui->button(m_desc.at("remove_all"))) { - Plater::TakeSnapshot(wxGetApp().plater(), wxString(_L("Reset selection"))); - ModelObject* mo = m_c->selection_info()->model_object(); - int idx = -1; - for (ModelVolume* mv : mo->volumes) { - if (mv->is_model_part()) { - ++idx; - m_triangle_selectors[idx]->reset(); - } - } + update_model_object(); + m_parent.set_as_dirty(); + } - update_model_object(); - m_parent.set_as_dirty(); - } - const float max_tooltip_width = ImGui::GetFontSize() * 20.0f; + const float max_tooltip_width = ImGui::GetFontSize() * 20.0f; - ImGui::AlignTextToFramePadding(); - m_imgui->text(m_desc.at("cursor_size")); - ImGui::SameLine(cursor_slider_left); - ImGui::PushItemWidth(window_width - cursor_slider_left); - ImGui::SliderFloat(" ", &m_cursor_radius, CursorRadiusMin, CursorRadiusMax, "%.2f"); - if (ImGui::IsItemHovered()) { - ImGui::BeginTooltip(); - ImGui::PushTextWrapPos(max_tooltip_width); - ImGui::TextUnformatted(_L("Alt + Mouse wheel").ToUTF8().data()); - ImGui::PopTextWrapPos(); - ImGui::EndTooltip(); - } + ImGui::AlignTextToFramePadding(); + m_imgui->text(m_desc.at("cursor_size")); + ImGui::SameLine(cursor_slider_left); + ImGui::PushItemWidth(window_width - cursor_slider_left); + ImGui::SliderFloat(" ", &m_cursor_radius, CursorRadiusMin, CursorRadiusMax, "%.2f"); + if (ImGui::IsItemHovered()) { + ImGui::BeginTooltip(); + ImGui::PushTextWrapPos(max_tooltip_width); + ImGui::TextUnformatted(_L("Alt + Mouse wheel").ToUTF8().data()); + ImGui::PopTextWrapPos(); + ImGui::EndTooltip(); + } - ImGui::AlignTextToFramePadding(); - m_imgui->text(m_desc.at("cursor_type")); - ImGui::SameLine(cursor_type_radio_left + m_imgui->scaled(0.f)); - ImGui::PushItemWidth(cursor_type_radio_width1); - - bool sphere_sel = m_cursor_type == TriangleSelector::CursorType::SPHERE; - if (m_imgui->radio_button(m_desc["sphere"], sphere_sel)) - sphere_sel = true; - - if (ImGui::IsItemHovered()) { - ImGui::BeginTooltip(); - ImGui::PushTextWrapPos(max_tooltip_width); - ImGui::TextUnformatted(_L("Paints all facets inside, regardless of their orientation.").ToUTF8().data()); - ImGui::PopTextWrapPos(); - ImGui::EndTooltip(); - } + ImGui::AlignTextToFramePadding(); + m_imgui->text(m_desc.at("cursor_type")); + ImGui::SameLine(cursor_type_radio_left + m_imgui->scaled(0.f)); + ImGui::PushItemWidth(cursor_type_radio_width1); - ImGui::SameLine(cursor_type_radio_left + cursor_type_radio_width2 + m_imgui->scaled(0.f)); - ImGui::PushItemWidth(cursor_type_radio_width2); + bool sphere_sel = m_cursor_type == TriangleSelector::CursorType::SPHERE; + if (m_imgui->radio_button(m_desc["sphere"], sphere_sel)) + sphere_sel = true; - if (m_imgui->radio_button(m_desc["circle"], ! sphere_sel)) - sphere_sel = false; + if (ImGui::IsItemHovered()) { + ImGui::BeginTooltip(); + ImGui::PushTextWrapPos(max_tooltip_width); + ImGui::TextUnformatted(_L("Paints all facets inside, regardless of their orientation.").ToUTF8().data()); + ImGui::PopTextWrapPos(); + ImGui::EndTooltip(); + } - if (ImGui::IsItemHovered()) { - ImGui::BeginTooltip(); - ImGui::PushTextWrapPos(max_tooltip_width); - ImGui::TextUnformatted(_L("Ignores facets facing away from the camera.").ToUTF8().data()); - ImGui::PopTextWrapPos(); - ImGui::EndTooltip(); - } + ImGui::SameLine(cursor_type_radio_left + cursor_type_radio_width2 + m_imgui->scaled(0.f)); + ImGui::PushItemWidth(cursor_type_radio_width2); - m_cursor_type = sphere_sel - ? TriangleSelector::CursorType::SPHERE - : TriangleSelector::CursorType::CIRCLE; + if (m_imgui->radio_button(m_desc["circle"], ! sphere_sel)) + sphere_sel = false; + if (ImGui::IsItemHovered()) { + ImGui::BeginTooltip(); + ImGui::PushTextWrapPos(max_tooltip_width); + ImGui::TextUnformatted(_L("Ignores facets facing away from the camera.").ToUTF8().data()); + ImGui::PopTextWrapPos(); + ImGui::EndTooltip(); + } + m_cursor_type = sphere_sel + ? TriangleSelector::CursorType::SPHERE + : TriangleSelector::CursorType::CIRCLE; - ImGui::Separator(); - if (m_c->object_clipper()->get_position() == 0.f) { - ImGui::AlignTextToFramePadding(); - m_imgui->text(m_desc.at("clipping_of_view")); - } - else { - if (m_imgui->button(m_desc.at("reset_direction"))) { - wxGetApp().CallAfter([this](){ - m_c->object_clipper()->set_position(-1., false); - }); - } - } - ImGui::SameLine(clipping_slider_left); - ImGui::PushItemWidth(window_width - clipping_slider_left); - float clp_dist = m_c->object_clipper()->get_position(); - if (ImGui::SliderFloat(" ", &clp_dist, 0.f, 1.f, "%.2f")) - m_c->object_clipper()->set_position(clp_dist, true); - if (ImGui::IsItemHovered()) { - ImGui::BeginTooltip(); - ImGui::PushTextWrapPos(max_tooltip_width); - ImGui::TextUnformatted(_L("Ctrl + Mouse wheel").ToUTF8().data()); - ImGui::PopTextWrapPos(); - ImGui::EndTooltip(); - } - m_imgui->end(); + ImGui::Separator(); + if (m_c->object_clipper()->get_position() == 0.f) { + ImGui::AlignTextToFramePadding(); + m_imgui->text(m_desc.at("clipping_of_view")); } else { - m_imgui->begin(_L("Autoset custom supports"), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse); - ImGui::AlignTextToFramePadding(); - m_imgui->text(_L("Threshold:")); - std::string format_str = std::string("%.f") + I18N::translate_utf8("°", - "Degree sign to use in the respective slider in FDM supports gizmo," - "placed after the number with no whitespace in between."); - ImGui::SameLine(); - if (m_imgui->slider_float("", &m_angle_threshold_deg, 0.f, 90.f, format_str.data())) - m_parent.set_slope_normal_angle(90.f - m_angle_threshold_deg); - if (m_imgui->button(_L("Enforce"))) - select_facets_by_angle(m_angle_threshold_deg, false); - ImGui::SameLine(); - if (m_imgui->button(_L("Block"))) - select_facets_by_angle(m_angle_threshold_deg, true); - ImGui::SameLine(); - if (m_imgui->button(_L("Cancel"))) - m_setting_angle = false; - m_imgui->end(); - bool needs_update = !(m_setting_angle && m_parent.is_using_slope()); - if (needs_update) { - m_parent.use_slope(m_setting_angle); - m_parent.set_as_dirty(); + if (m_imgui->button(m_desc.at("reset_direction"))) { + wxGetApp().CallAfter([this](){ + m_c->object_clipper()->set_position(-1., false); + }); } } + + ImGui::SameLine(clipping_slider_left); + ImGui::PushItemWidth(window_width - clipping_slider_left); + float clp_dist = m_c->object_clipper()->get_position(); + if (ImGui::SliderFloat(" ", &clp_dist, 0.f, 1.f, "%.2f")) + m_c->object_clipper()->set_position(clp_dist, true); + if (ImGui::IsItemHovered()) { + ImGui::BeginTooltip(); + ImGui::PushTextWrapPos(max_tooltip_width); + ImGui::TextUnformatted(_L("Ctrl + Mouse wheel").ToUTF8().data()); + ImGui::PopTextWrapPos(); + ImGui::EndTooltip(); + } + m_imgui->end(); } @@ -296,7 +300,6 @@ void GLGizmoFdmSupports::select_facets_by_angle(float threshold_deg, bool block) : _L("Add supports by angle")); update_model_object(); m_parent.set_as_dirty(); - m_setting_angle = false; } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp index fc977078739..41e4cc514b7 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp @@ -30,8 +30,7 @@ class GLGizmoFdmSupports : public GLGizmoPainterBase PainterGizmoType get_painter_type() const override; void select_facets_by_angle(float threshold, bool block); - float m_angle_threshold_deg = 45.f; - bool m_setting_angle = false; + float m_angle_threshold_deg = 0.f; // This map holds all translated description texts, so they can be easily referenced during layout calculations // etc. When language changes, GUI is recreated and this class constructed again, so the change takes effect. diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp index 5a4275b7fcc..20aa9f56cce 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp @@ -33,14 +33,14 @@ class GLGizmoMove3D : public GLGizmoBase std::string get_tooltip() const override; protected: - virtual bool on_init(); - virtual std::string on_get_name() const; - virtual bool on_is_activable() const; - virtual void on_start_dragging(); - virtual void on_stop_dragging(); - virtual void on_update(const UpdateData& data); - virtual void on_render() const; - virtual void on_render_for_picking() const; + virtual bool on_init() override; + virtual std::string on_get_name() const override; + virtual bool on_is_activable() const override; + virtual void on_start_dragging() override; + virtual void on_stop_dragging() override; + virtual void on_update(const UpdateData& data) override; + virtual void on_render() const override; + virtual void on_render_for_picking() const override; private: double calc_projection(const UpdateData& data) const; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp index 819d014e812..91aef75d9a6 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp @@ -540,7 +540,9 @@ void TriangleSelectorGUI::render(ImGuiWrapper* imgui) va.push_geometry(double(m_vertices[tr.verts_idxs[i]].v[0]), double(m_vertices[tr.verts_idxs[i]].v[1]), double(m_vertices[tr.verts_idxs[i]].v[2]), - 0., 0., 1.); + double(tr.normal[0]), + double(tr.normal[1]), + double(tr.normal[2])); va.push_triangle(cnt, cnt+1, cnt+2); @@ -550,14 +552,26 @@ void TriangleSelectorGUI::render(ImGuiWrapper* imgui) m_iva_enforcers.finalize_geometry(true); m_iva_blockers.finalize_geometry(true); - if (m_iva_enforcers.has_VBOs()) { - ::glColor4f(0.f, 0.f, 1.f, 0.4f); + bool render_enf = m_iva_enforcers.has_VBOs(); + bool render_blc = m_iva_blockers.has_VBOs(); + + auto* shader = wxGetApp().get_shader("gouraud"); + if (! shader) + return; + + shader->start_using(); + ScopeGuard guard([shader]() { if (shader) shader->stop_using(); }); + shader->set_uniform("slope.actived", false); + + if (render_enf) { + std::array color = { 0.47f, 0.47f, 1.f, 1.f }; + shader->set_uniform("uniform_color", color); m_iva_enforcers.render(); } - - if (m_iva_blockers.has_VBOs()) { - ::glColor4f(1.f, 0.f, 0.f, 0.4f); + if (render_blc) { + std::array color = { 1.f, 0.44f, 0.44f, 1.f }; + shader->set_uniform("uniform_color", color); m_iva_blockers.render(); } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp index 6f8cbec603d..da415ce09aa 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp @@ -59,8 +59,8 @@ class GLGizmoPainterBase : public GLGizmoBase private: ObjectID m_old_mo_id; size_t m_old_volumes_size = 0; - virtual void on_render() const {} - virtual void on_render_for_picking() const {} + virtual void on_render() const override {} + virtual void on_render_for_picking() const override {} public: GLGizmoPainterBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp index 0d8f3f7fa79..39021640ad0 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp @@ -47,13 +47,13 @@ class GLGizmoScale3D : public GLGizmoBase std::string get_tooltip() const override; protected: - virtual bool on_init(); - virtual std::string on_get_name() const; - virtual bool on_is_activable() const; - virtual void on_start_dragging(); - virtual void on_update(const UpdateData& data); - virtual void on_render() const; - virtual void on_render_for_picking() const; + virtual bool on_init() override; + virtual std::string on_get_name() const override; + virtual bool on_is_activable() const override; + virtual void on_start_dragging() override; + virtual void on_update(const UpdateData& data) override; + virtual void on_render() const override; + virtual void on_render_for_picking() const override; private: void render_grabbers_connection(unsigned int id_1, unsigned int id_2) const; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index e626aa7f866..2f7fa4638b5 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -893,7 +893,7 @@ void GLGizmoSlaSupports::on_set_state() // Only take the snapshot when the USER opens the gizmo. Common gizmos // data are not yet available, the CallAfter will postpone taking the // snapshot until they are. No, it does not feel right. - wxGetApp().CallAfter([this]() { + wxGetApp().CallAfter([]() { Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("SLA gizmo turned on"))); }); } diff --git a/src/slic3r/GUI/Gizmos/GLGizmosCommon.hpp b/src/slic3r/GUI/Gizmos/GLGizmosCommon.hpp index aedf782e89f..61c27329766 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosCommon.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosCommon.hpp @@ -161,7 +161,7 @@ class SelectionInfo : public CommonGizmosDataBase private: ModelObject* m_model_object = nullptr; - int m_active_inst = -1; + // int m_active_inst = -1; float m_z_shift = 0.f; }; diff --git a/src/slic3r/GUI/ImGuiWrapper.cpp b/src/slic3r/GUI/ImGuiWrapper.cpp index ff8ba8f48ab..1ed4b492fd2 100644 --- a/src/slic3r/GUI/ImGuiWrapper.cpp +++ b/src/slic3r/GUI/ImGuiWrapper.cpp @@ -940,7 +940,7 @@ void ImGuiWrapper::init_font(bool compress) config.MergeMode = true; if (! m_font_cjk) { // Apple keyboard shortcuts are only contained in the CJK fonts. - ImFont *font_cjk = io.Fonts->AddFontFromFileTTF((Slic3r::resources_dir() + "/fonts/NotoSansCJK-Regular.ttc").c_str(), m_font_size, &config, ranges_keyboard_shortcuts); + [[maybe_unused]]ImFont *font_cjk = io.Fonts->AddFontFromFileTTF((Slic3r::resources_dir() + "/fonts/NotoSansCJK-Regular.ttc").c_str(), m_font_size, &config, ranges_keyboard_shortcuts); assert(font_cjk != nullptr); } #endif diff --git a/src/slic3r/GUI/InstanceCheck.cpp b/src/slic3r/GUI/InstanceCheck.cpp index 6cfa879c830..73bbeda353e 100644 --- a/src/slic3r/GUI/InstanceCheck.cpp +++ b/src/slic3r/GUI/InstanceCheck.cpp @@ -41,7 +41,7 @@ namespace instance_check_internal //if (argc < 2) // return ret; std::vector arguments { argv[0] }; - for (size_t i = 1; i < argc; ++i) { + for (int i = 1; i < argc; ++i) { const std::string token = argv[i]; // Processing of boolean command line arguments shall match DynamicConfig::read_cli(). if (token == "--single-instance") @@ -180,7 +180,7 @@ namespace instance_check_internal if ( !checker->IsAnotherRunning() ) */ { DBusMessage* msg; - DBusMessageIter args; + // DBusMessageIter args; DBusConnection* conn; DBusError err; dbus_uint32_t serial = 0; diff --git a/src/slic3r/GUI/Jobs/ArrangeJob.cpp b/src/slic3r/GUI/Jobs/ArrangeJob.cpp index 0f17e6e9f0f..32375f8291b 100644 --- a/src/slic3r/GUI/Jobs/ArrangeJob.cpp +++ b/src/slic3r/GUI/Jobs/ArrangeJob.cpp @@ -6,6 +6,10 @@ #include "slic3r/GUI/Plater.hpp" #include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/GUI.hpp" +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/GUI_ObjectManipulation.hpp" + +#include "libnest2d/common.hpp" namespace Slic3r { namespace GUI { @@ -140,6 +144,19 @@ void ArrangeJob::prepare() wxGetKeyState(WXK_SHIFT) ? prepare_selected() : prepare_all(); } +void ArrangeJob::on_exception(const std::exception_ptr &eptr) +{ + try { + if (eptr) + std::rethrow_exception(eptr); + } catch (libnest2d::GeometryException &) { + show_error(m_plater, _(L("Could not arrange model objects! " + "Some geometries may be invalid."))); + } catch (std::exception &e) { + PlaterJob::on_exception(eptr); + } +} + void ArrangeJob::process() { static const auto arrangestr = _(L("Arranging")); @@ -151,30 +168,23 @@ void ArrangeJob::process() params.allow_rotations = settings.enable_rotation; params.min_obj_distance = scaled(settings.distance); - auto count = unsigned(m_selected.size() + m_unprintable.size()); Points bedpts = get_bed_shape(*m_plater->config()); params.stopcondition = [this]() { return was_canceled(); }; - try { - params.progressind = [this, count](unsigned st) { - st += m_unprintable.size(); - if (st > 0) update_status(int(count - st), arrangestr); - }; - - arrangement::arrange(m_selected, m_unselected, bedpts, params); - - params.progressind = [this, count](unsigned st) { - if (st > 0) update_status(int(count - st), arrangestr); - }; - - arrangement::arrange(m_unprintable, {}, bedpts, params); - } catch (std::exception & /*e*/) { - GUI::show_error(m_plater, - _(L("Could not arrange model objects! " - "Some geometries may be invalid."))); - } + params.progressind = [this, count](unsigned st) { + st += m_unprintable.size(); + if (st > 0) update_status(int(count - st), arrangestr); + }; + + arrangement::arrange(m_selected, m_unselected, bedpts, params); + + params.progressind = [this, count](unsigned st) { + if (st > 0) update_status(int(count - st), arrangestr); + }; + + arrangement::arrange(m_unprintable, {}, bedpts, params); // finalize just here. update_status(int(count), @@ -206,7 +216,8 @@ void ArrangeJob::finalize() { } m_plater->update(); - + wxGetApp().obj_manipul()->set_dirty(); + Job::finalize(); } diff --git a/src/slic3r/GUI/Jobs/ArrangeJob.hpp b/src/slic3r/GUI/Jobs/ArrangeJob.hpp index 73540c230f9..38aafb52c18 100644 --- a/src/slic3r/GUI/Jobs/ArrangeJob.hpp +++ b/src/slic3r/GUI/Jobs/ArrangeJob.hpp @@ -1,17 +1,13 @@ #ifndef ARRANGEJOB_HPP #define ARRANGEJOB_HPP -#include "Job.hpp" +#include "PlaterJob.hpp" #include "libslic3r/Arrange.hpp" namespace Slic3r { namespace GUI { -class Plater; - -class ArrangeJob : public Job +class ArrangeJob : public PlaterJob { - Plater *m_plater; - using ArrangePolygon = arrangement::ArrangePolygon; using ArrangePolygons = arrangement::ArrangePolygons; @@ -30,10 +26,12 @@ class ArrangeJob : public Job protected: void prepare() override; + + void on_exception(const std::exception_ptr &) override; public: ArrangeJob(std::shared_ptr pri, Plater *plater) - : Job{std::move(pri)}, m_plater{plater} + : PlaterJob{std::move(pri), plater} {} int status_range() const override diff --git a/src/slic3r/GUI/Jobs/FillBedJob.hpp b/src/slic3r/GUI/Jobs/FillBedJob.hpp index 448ae53d48f..07290d2f235 100644 --- a/src/slic3r/GUI/Jobs/FillBedJob.hpp +++ b/src/slic3r/GUI/Jobs/FillBedJob.hpp @@ -7,9 +7,8 @@ namespace Slic3r { namespace GUI { class Plater; -class FillBedJob : public Job +class FillBedJob : public PlaterJob { - Plater *m_plater; int m_object_idx = -1; using ArrangePolygon = arrangement::ArrangePolygon; @@ -28,7 +27,7 @@ class FillBedJob : public Job public: FillBedJob(std::shared_ptr pri, Plater *plater) - : Job{std::move(pri)}, m_plater{plater} + : PlaterJob{std::move(pri), plater} {} int status_range() const override diff --git a/src/slic3r/GUI/Jobs/Job.cpp b/src/slic3r/GUI/Jobs/Job.cpp index fedb6f4acaa..1f7f58875b8 100644 --- a/src/slic3r/GUI/Jobs/Job.cpp +++ b/src/slic3r/GUI/Jobs/Job.cpp @@ -1,4 +1,5 @@ #include +#include #include "Job.hpp" #include @@ -6,10 +7,15 @@ namespace Slic3r { -void GUI::Job::run() +void GUI::Job::run(std::exception_ptr &eptr) { m_running.store(true); - process(); + try { + process(); + } catch (...) { + eptr = std::current_exception(); + } + m_running.store(false); // ensure to call the last status to finalize the job @@ -27,22 +33,29 @@ void GUI::Job::update_status(int st, const wxString &msg) GUI::Job::Job(std::shared_ptr pri) : m_progress(std::move(pri)) { - Bind(wxEVT_THREAD, [this](const wxThreadEvent &evt) { + Bind(wxEVT_THREAD, [this](const wxThreadEvent &evt) { auto msg = evt.GetString(); - if (!msg.empty()) + if (!msg.empty() && !m_worker_error) m_progress->set_status_text(msg.ToUTF8().data()); - + if (m_finalized) return; - + m_progress->set_progress(evt.GetInt()); - if (evt.GetInt() == status_range()) { + if (evt.GetInt() == status_range() || m_worker_error) { // set back the original range and cancel callback m_progress->set_range(m_range); m_progress->set_cancel_callback(); wxEndBusyCursor(); - finalize(); - + if (m_worker_error) { + m_finalized = true; + m_progress->set_status_text(""); + m_progress->set_progress(m_range); + on_exception(m_worker_error); + } + else + finalize(); + // dont do finalization again for the same process m_finalized = true; } @@ -69,7 +82,8 @@ void GUI::Job::start() wxBeginBusyCursor(); try { // Execute the job - m_thread = create_thread([this] { this->run(); }); + m_worker_error = nullptr; + m_thread = create_thread([this] { this->run(m_worker_error); }); } catch (std::exception &) { update_status(status_range(), _(L("ERROR: not enough resources to " diff --git a/src/slic3r/GUI/Jobs/Job.hpp b/src/slic3r/GUI/Jobs/Job.hpp index aea7692e7f1..cb73fe74d40 100644 --- a/src/slic3r/GUI/Jobs/Job.hpp +++ b/src/slic3r/GUI/Jobs/Job.hpp @@ -2,6 +2,7 @@ #define JOB_HPP #include +#include #include "libslic3r/libslic3r.h" @@ -32,8 +33,9 @@ class Job : public wxEvtHandler std::atomic m_running{false}, m_canceled{false}; bool m_finalized = false; std::shared_ptr m_progress; + std::exception_ptr m_worker_error = nullptr; - void run(); + void run(std::exception_ptr &); protected: // status range for a particular job @@ -49,6 +51,8 @@ class Job : public wxEvtHandler // Launched when the job is finished. It refreshes the 3Dscene by def. virtual void finalize() { m_finalized = true; } + + virtual void on_exception(const std::exception_ptr &) {} public: Job(std::shared_ptr pri); diff --git a/src/slic3r/GUI/Jobs/PlaterJob.cpp b/src/slic3r/GUI/Jobs/PlaterJob.cpp new file mode 100644 index 00000000000..cbf76406868 --- /dev/null +++ b/src/slic3r/GUI/Jobs/PlaterJob.cpp @@ -0,0 +1,17 @@ +#include "PlaterJob.hpp" +#include "slic3r/GUI/GUI.hpp" +#include "slic3r/GUI/Plater.hpp" + +namespace Slic3r { namespace GUI { + +void PlaterJob::on_exception(const std::exception_ptr &eptr) +{ + try { + if (eptr) + std::rethrow_exception(eptr); + } catch (std::exception &e) { + show_error(m_plater, _(L("An unexpected error occured: ")) + e.what()); + } +} + +}} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/Jobs/PlaterJob.hpp b/src/slic3r/GUI/Jobs/PlaterJob.hpp new file mode 100644 index 00000000000..fcf0a54b809 --- /dev/null +++ b/src/slic3r/GUI/Jobs/PlaterJob.hpp @@ -0,0 +1,24 @@ +#ifndef PLATERJOB_HPP +#define PLATERJOB_HPP + +#include "Job.hpp" + +namespace Slic3r { namespace GUI { + +class Plater; + +class PlaterJob : public Job { +protected: + Plater *m_plater; + + void on_exception(const std::exception_ptr &) override; + +public: + + PlaterJob(std::shared_ptr pri, Plater *plater): + Job{std::move(pri)}, m_plater{plater} {} +}; + +}} // namespace Slic3r::GUI + +#endif // PLATERJOB_HPP diff --git a/src/slic3r/GUI/Jobs/RotoptimizeJob.hpp b/src/slic3r/GUI/Jobs/RotoptimizeJob.hpp index 983c43c684a..06688b52d90 100644 --- a/src/slic3r/GUI/Jobs/RotoptimizeJob.hpp +++ b/src/slic3r/GUI/Jobs/RotoptimizeJob.hpp @@ -1,18 +1,15 @@ #ifndef ROTOPTIMIZEJOB_HPP #define ROTOPTIMIZEJOB_HPP -#include "Job.hpp" +#include "PlaterJob.hpp" namespace Slic3r { namespace GUI { -class Plater; - -class RotoptimizeJob : public Job +class RotoptimizeJob : public PlaterJob { - Plater *m_plater; public: RotoptimizeJob(std::shared_ptr pri, Plater *plater) - : Job{std::move(pri)}, m_plater{plater} + : PlaterJob{std::move(pri), plater} {} void process() override; diff --git a/src/slic3r/GUI/Jobs/SLAImportJob.cpp b/src/slic3r/GUI/Jobs/SLAImportJob.cpp index ec289ae344a..f9fbef8a8f7 100644 --- a/src/slic3r/GUI/Jobs/SLAImportJob.cpp +++ b/src/slic3r/GUI/Jobs/SLAImportJob.cpp @@ -124,7 +124,7 @@ class SLAImportJob::priv { }; SLAImportJob::SLAImportJob(std::shared_ptr pri, Plater *plater) - : Job{std::move(pri)}, p{std::make_unique(plater)} + : PlaterJob{std::move(pri), plater}, p{std::make_unique(plater)} {} SLAImportJob::~SLAImportJob() = default; diff --git a/src/slic3r/GUI/Jobs/SLAImportJob.hpp b/src/slic3r/GUI/Jobs/SLAImportJob.hpp index cff6cc899b3..543f4200644 100644 --- a/src/slic3r/GUI/Jobs/SLAImportJob.hpp +++ b/src/slic3r/GUI/Jobs/SLAImportJob.hpp @@ -1,13 +1,11 @@ #ifndef SLAIMPORTJOB_HPP #define SLAIMPORTJOB_HPP -#include "Job.hpp" +#include "PlaterJob.hpp" namespace Slic3r { namespace GUI { -class Plater; - -class SLAImportJob : public Job { +class SLAImportJob : public PlaterJob { class priv; std::unique_ptr p; diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 8e6b1c5ef2c..3fccb7f8438 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -37,6 +37,7 @@ #include #include "GUI_App.hpp" +#include "UnsavedChangesDialog.hpp" #ifdef _WIN32 #include @@ -63,10 +64,10 @@ class PrusaSlicerTaskBarIcon : public wxTaskBarIcon // Only allow opening a new PrusaSlicer instance on OSX if "single_instance" is disabled, // as starting new instances would interfere with the locking mechanism of "single_instance" support. append_menu_item(menu, wxID_ANY, _L("Open new instance"), _L("Open a new PrusaSlicer instance"), - [this](wxCommandEvent&) { start_new_slicer(); }, "", nullptr); + [](wxCommandEvent&) { start_new_slicer(); }, "", nullptr); } append_menu_item(menu, wxID_ANY, _L("G-code preview") + dots, _L("Open G-code viewer"), - [this](wxCommandEvent&) { start_new_gcodeviewer_open_file(); }, "", nullptr); + [](wxCommandEvent&) { start_new_gcodeviewer_open_file(); }, "", nullptr); return menu; } }; @@ -77,9 +78,9 @@ class GCodeViewerTaskBarIcon : public wxTaskBarIcon wxMenu *CreatePopupMenu() override { wxMenu *menu = new wxMenu; append_menu_item(menu, wxID_ANY, _L("Open PrusaSlicer"), _L("Open a new PrusaSlicer instance"), - [this](wxCommandEvent&) { start_new_slicer(nullptr, true); }, "", nullptr); + [](wxCommandEvent&) { start_new_slicer(nullptr, true); }, "", nullptr); append_menu_item(menu, wxID_ANY, _L("G-code preview") + dots, _L("Open new G-code viewer"), - [this](wxCommandEvent&) { start_new_gcodeviewer_open_file(); }, "", nullptr); + [](wxCommandEvent&) { start_new_gcodeviewer_open_file(); }, "", nullptr); return menu; } }; @@ -230,7 +231,7 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_S // So, redraw explicitly canvas, when application is moved //FIXME maybe this is useful for __WXGTK3__ as well? #if __APPLE__ - Bind(wxEVT_MOVE, [this](wxMoveEvent& event) { + Bind(wxEVT_MOVE, [](wxMoveEvent& event) { wxGetApp().plater()->get_current_canvas3D()->set_as_dirty(); wxGetApp().plater()->get_current_canvas3D()->request_extra_frame(); event.Skip(); @@ -1189,7 +1190,11 @@ void MainFrame::init_menubar_as_editor() windowMenu->AppendSeparator(); append_menu_item(windowMenu, wxID_ANY, _L("Open new instance") + "\tCtrl+Shift+I", _L("Open a new PrusaSlicer instance"), - [this](wxCommandEvent&) { start_new_slicer(); }, "", nullptr, [this]() {return m_plater != nullptr && wxGetApp().app_config->get("single_instance") != "1"; }, this); + [](wxCommandEvent&) { start_new_slicer(); }, "", nullptr, [this]() {return m_plater != nullptr && wxGetApp().app_config->get("single_instance") != "1"; }, this); + + windowMenu->AppendSeparator(); + append_menu_item(windowMenu, wxID_ANY, _L("Compare presets")/* + "\tCtrl+F"*/, _L("Compare presets"), + [this](wxCommandEvent&) { diff_dialog.show();}, "compare", nullptr, []() {return true; }, this); } // View menu @@ -1258,8 +1263,8 @@ void MainFrame::init_menubar_as_gcodeviewer() [this](wxCommandEvent&) { if (m_plater != nullptr) m_plater->export_toolpaths_to_obj(); }, "export_plater", nullptr, [this]() {return can_export_toolpaths(); }, this); append_menu_item(fileMenu, wxID_ANY, _L("Open &PrusaSlicer") + dots, _L("Open PrusaSlicer"), - [this](wxCommandEvent&) { start_new_slicer(); }, "", nullptr, - [this]() {return true; }, this); + [](wxCommandEvent&) { start_new_slicer(); }, "", nullptr, + []() {return true; }, this); fileMenu->AppendSeparator(); append_menu_item(fileMenu, wxID_EXIT, _L("&Quit"), wxString::Format(_L("Quit %s"), SLIC3R_APP_NAME), [this](wxCommandEvent&) { Close(false); }); diff --git a/src/slic3r/GUI/MainFrame.hpp b/src/slic3r/GUI/MainFrame.hpp index 9504376b45a..0971fdc77a7 100644 --- a/src/slic3r/GUI/MainFrame.hpp +++ b/src/slic3r/GUI/MainFrame.hpp @@ -16,6 +16,7 @@ #include "GUI_Utils.hpp" #include "Event.hpp" +#include "UnsavedChangesDialog.hpp" class wxNotebook; class wxProgressDialog; @@ -132,7 +133,7 @@ class MainFrame : public DPIFrame ESettingsLayout m_layout{ ESettingsLayout::Unknown }; protected: - virtual void on_dpi_changed(const wxRect &suggested_rect); + virtual void on_dpi_changed(const wxRect &suggested_rect) override; virtual void on_sys_color_changed() override; public: @@ -190,6 +191,7 @@ class MainFrame : public DPIFrame Plater* m_plater { nullptr }; wxNotebook* m_tabpanel { nullptr }; SettingsDialog m_settings_dialog; + DiffPresetDialog diff_dialog; wxWindow* m_plater_page{ nullptr }; wxProgressDialog* m_progress_dialog { nullptr }; PrintHostQueueDialog* m_printhost_queue_dlg; diff --git a/src/slic3r/GUI/Mouse3DController.cpp b/src/slic3r/GUI/Mouse3DController.cpp index 692ae7f1bab..9ff5688be25 100644 --- a/src/slic3r/GUI/Mouse3DController.cpp +++ b/src/slic3r/GUI/Mouse3DController.cpp @@ -397,7 +397,7 @@ void Mouse3DController::save_config(AppConfig &appconfig) const // We do not synchronize m_params_by_device with the background thread explicitely // as there should be a full memory barrier executed once the background thread is stopped. - for (const std::pair &key_value_pair : m_params_by_device) { + for (const auto &key_value_pair : m_params_by_device) { const std::string &device_name = key_value_pair.first; const Params ¶ms = key_value_pair.second; // Store current device parameters into the config diff --git a/src/slic3r/GUI/NotificationManager.cpp b/src/slic3r/GUI/NotificationManager.cpp index 98cbf1e550f..78969d7255a 100644 --- a/src/slic3r/GUI/NotificationManager.cpp +++ b/src/slic3r/GUI/NotificationManager.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include @@ -392,18 +393,18 @@ void NotificationManager::PopNotification::count_spaces() } void NotificationManager::PopNotification::init() { - std::string text = m_text1 + " " + m_hypertext; - int last_end = 0; - m_lines_count = 0; + std::string text = m_text1 + " " + m_hypertext; + size_t last_end = 0; + m_lines_count = 0; count_spaces(); - + // count lines m_endlines.clear(); while (last_end < text.length() - 1) { - int next_hard_end = text.find_first_of('\n', last_end); - if (next_hard_end > 0 && ImGui::CalcTextSize(text.substr(last_end, next_hard_end - last_end).c_str()).x < m_window_width - m_window_width_offset) { + size_t next_hard_end = text.find_first_of('\n', last_end); + if (next_hard_end != std::string::npos && ImGui::CalcTextSize(text.substr(last_end, next_hard_end - last_end).c_str()).x < m_window_width - m_window_width_offset) { //next line is ended by '/n' m_endlines.push_back(next_hard_end); last_end = next_hard_end + 1; @@ -411,9 +412,9 @@ void NotificationManager::PopNotification::init() // find next suitable endline if (ImGui::CalcTextSize(text.substr(last_end).c_str()).x >= m_window_width - m_window_width_offset) { // more than one line till end - int next_space = text.find_first_of(' ', last_end); + size_t next_space = text.find_first_of(' ', last_end); if (next_space > 0) { - int next_space_candidate = text.find_first_of(' ', next_space + 1); + size_t next_space_candidate = text.find_first_of(' ', next_space + 1); while (next_space_candidate > 0 && ImGui::CalcTextSize(text.substr(last_end, next_space_candidate - last_end).c_str()).x < m_window_width - m_window_width_offset) { next_space = next_space_candidate; next_space_candidate = text.find_first_of(' ', next_space + 1); @@ -456,7 +457,6 @@ void NotificationManager::PopNotification::set_next_window_size(ImGuiWrapper& im void NotificationManager::PopNotification::render_text(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) { ImVec2 win_size(win_size_x, win_size_y); - ImVec2 win_pos(win_pos_x, win_pos_y); float x_offset = m_left_indentation; std::string fulltext = m_text1 + m_hypertext; //+ m_text2; ImVec2 text_size = ImGui::CalcTextSize(fulltext.c_str()); @@ -594,8 +594,6 @@ void NotificationManager::PopNotification::render_close_button(ImGuiWrapper& img { ImVec2 win_size(win_size_x, win_size_y); ImVec2 win_pos(win_pos_x, win_pos_y); - ImVec4 orange_color = ImGui::GetStyleColorVec4(ImGuiCol_Button); - orange_color.w = 0.8f; ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(.0f, .0f, .0f, .0f)); ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(.0f, .0f, .0f, .0f)); Notifications_Internal::push_style_color(ImGuiCol_Text, ImVec4(1.f, 1.f, 1.f, 1.f), m_fading_out, m_current_fade_opacity); @@ -743,11 +741,11 @@ void NotificationManager::PopNotification::update(const NotificationData& n) } bool NotificationManager::PopNotification::compare_text(const std::string& text) { - std::string t1(m_text1); - std::string t2(text); - t1.erase(std::remove_if(t1.begin(), t1.end(), ::isspace), t1.end()); - t2.erase(std::remove_if(t2.begin(), t2.end(), ::isspace), t2.end()); - if (t1.compare(t2) == 0) + std::wstring wt1 = boost::nowide::widen(m_text1); + std::wstring wt2 = boost::nowide::widen(text); + wt1.erase(std::remove_if(wt1.begin(), wt1.end(), ::iswspace), wt1.end()); + wt2.erase(std::remove_if(wt2.begin(), wt2.end(), ::iswspace), wt2.end()); + if (wt1.compare(wt2) == 0) return true; return false; } @@ -831,9 +829,7 @@ void NotificationManager::SlicingCompleteLargeNotification::render_text(ImGuiWra if (!m_is_large) PopNotification::render_text(imgui, win_size_x, win_size_y, win_pos_x, win_pos_y); else { - ImVec2 win_size(win_size_x, win_size_y); - ImVec2 win_pos(win_pos_x, win_pos_y); - + ImVec2 win_size(win_size_x, win_size_y); ImVec2 text1_size = ImGui::CalcTextSize(m_text1.c_str()); float x_offset = m_left_indentation; std::string fulltext = m_text1 + m_hypertext + m_text2; @@ -889,15 +885,12 @@ void NotificationManager::ExportFinishedNotification::count_spaces() void NotificationManager::ExportFinishedNotification::render_text(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) { - ImVec2 win_size(win_size_x, win_size_y); - ImVec2 win_pos(win_pos_x, win_pos_y); float x_offset = m_left_indentation; std::string fulltext = m_text1 + m_hypertext; //+ m_text2; - ImVec2 text_size = ImGui::CalcTextSize(fulltext.c_str()); // Lines are always at least two and m_multiline is always true for ExportFinishedNotification. // First line has "Export Finished" text and than hyper text open folder. // Following lines are path to gcode. - int last_end = 0; + size_t last_end = 0; float starting_y = m_line_height / 2;//10; float shift_y = m_line_height;// -m_line_height / 20; for (size_t i = 0; i < m_lines_count; i++) { @@ -926,8 +919,6 @@ void NotificationManager::ExportFinishedNotification::render_eject_button(ImGuiW { ImVec2 win_size(win_size_x, win_size_y); ImVec2 win_pos(win_pos_x, win_pos_y); - ImVec4 orange_color = ImGui::GetStyleColorVec4(ImGuiCol_Button); - orange_color.w = 0.8f; ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(.0f, .0f, .0f, .0f)); ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(.0f, .0f, .0f, .0f)); Notifications_Internal::push_style_color(ImGuiCol_Text, ImVec4(1.f, 1.f, 1.f, 1.f), m_fading_out, m_current_fade_opacity); @@ -1003,7 +994,6 @@ void NotificationManager::ProgressBarNotification::render_text(ImGuiWrapper& img } void NotificationManager::ProgressBarNotification::render_bar(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) { - float bar_y = win_size_y / 2 - win_size_y / 6 + m_line_height; ImVec4 orange_color = ImVec4(.99f, .313f, .0f, 1.0f); float invisible_length = 0;//((float)(m_data.duration - m_remaining_time) / (float)m_data.duration * win_size_x); //invisible_length -= win_size_x / ((float)m_data.duration * 60.f) * (60 - m_countdown_frame); @@ -1141,12 +1131,17 @@ void NotificationManager::push_slicing_complete_notification(int timestamp, bool int time = 10; if (has_slicing_error_notification()) return; - if (large) { + if (large) { hypertext = _u8L("Export G-Code."); time = 0; } - NotificationData data{ NotificationType::SlicingComplete, NotificationLevel::RegularNotification, time, _u8L("Slicing finished."), hypertext, [](wxEvtHandler* evnthndlr){ - if (evnthndlr != nullptr) wxPostEvent(evnthndlr, ExportGcodeNotificationClickedEvent(EVT_EXPORT_GCODE_NOTIFICAION_CLICKED)); return true; } }; + NotificationData data{ NotificationType::SlicingComplete, NotificationLevel::RegularNotification, time, _u8L("Slicing finished."), hypertext, + [](wxEvtHandler* evnthndlr){ + if (evnthndlr != nullptr) + wxPostEvent(evnthndlr, ExportGcodeNotificationClickedEvent(EVT_EXPORT_GCODE_NOTIFICAION_CLICKED)); + return true; + } + }; push_notification_data(std::make_unique(data, m_id_provider, m_evt_handler, large), timestamp); } void NotificationManager::set_slicing_complete_print_time(const std::string &info) diff --git a/src/slic3r/GUI/NotificationManager.hpp b/src/slic3r/GUI/NotificationManager.hpp index 9252190efca..e3e50a3e377 100644 --- a/src/slic3r/GUI/NotificationManager.hpp +++ b/src/slic3r/GUI/NotificationManager.hpp @@ -339,14 +339,14 @@ class NotificationManager // Height of text // Used as basic scaling unit! float m_line_height; - std::vector m_endlines; + std::vector m_endlines; // Gray are f.e. eorrors when its uknown if they are still valid bool m_is_gray { false }; //if multiline = true, notification is showing all lines(>2) bool m_multiline { false }; // True if minimized button is rendered, helps to decide where is area for invisible close button bool m_minimize_b_visible { false }; - int m_lines_count{ 1 }; + size_t m_lines_count{ 1 }; // Target for wxWidgets events sent by clicking on the hyperlink available at some notifications. wxEvtHandler* m_evt_handler; }; @@ -366,7 +366,7 @@ class NotificationManager override; bool m_is_large; bool m_has_print_info { false }; - std::string m_print_info { std::string() }; + std::string m_print_info; }; class SlicingWarningNotification : public PopNotification @@ -471,8 +471,13 @@ class NotificationManager {NotificationType::Mouse3dDisconnected, NotificationLevel::RegularNotification, 10, _u8L("3D Mouse disconnected.") }, // {NotificationType::Mouse3dConnected, NotificationLevel::RegularNotification, 5, _u8L("3D Mouse connected.") }, // {NotificationType::NewPresetsAviable, NotificationLevel::ImportantNotification, 20, _u8L("New Presets are available."), _u8L("See here.") }, - {NotificationType::PresetUpdateAvailable, NotificationLevel::ImportantNotification, 20, _u8L("Configuration update is available."), _u8L("See more."), [](wxEvtHandler* evnthndlr){ - if (evnthndlr != nullptr) wxPostEvent(evnthndlr, PresetUpdateAvailableClickedEvent(EVT_PRESET_UPDATE_AVAILABLE_CLICKED)); return true; }}, + {NotificationType::PresetUpdateAvailable, NotificationLevel::ImportantNotification, 20, _u8L("Configuration update is available."), _u8L("See more."), + [](wxEvtHandler* evnthndlr) { + if (evnthndlr != nullptr) + wxPostEvent(evnthndlr, PresetUpdateAvailableClickedEvent(EVT_PRESET_UPDATE_AVAILABLE_CLICKED)); + return true; + } + }, {NotificationType::NewAppAvailable, NotificationLevel::ImportantNotification, 20, _u8L("New version is available."), _u8L("See Releases page."), [](wxEvtHandler* evnthndlr){ wxLaunchDefaultBrowser("https://github.com/prusa3d/PrusaSlicer/releases"); return true; }}, {NotificationType::EmptyColorChangeCode, NotificationLevel::RegularNotification, 10, diff --git a/src/slic3r/GUI/OG_CustomCtrl.cpp b/src/slic3r/GUI/OG_CustomCtrl.cpp index 07b96755da6..6433bf2d136 100644 --- a/src/slic3r/GUI/OG_CustomCtrl.cpp +++ b/src/slic3r/GUI/OG_CustomCtrl.cpp @@ -98,7 +98,7 @@ void OG_CustomCtrl::init_ctrl_lines() ctrl_lines.emplace_back(CtrlLine(height, this, line, false, opt_group->staticbox)); } else - int i = 0; + assert(false); } } @@ -360,6 +360,9 @@ void OG_CustomCtrl::correct_widgets_position(wxSizer* widget, const Line& line, void OG_CustomCtrl::msw_rescale() { +#ifdef __WXOSX__ + return; +#endif m_font = wxGetApp().normal_font(); m_em_unit = em_unit(m_parent); m_v_gap = lround(1.0 * m_em_unit); @@ -381,7 +384,6 @@ void OG_CustomCtrl::msw_rescale() void OG_CustomCtrl::sys_color_changed() { - msw_rescale(); } OG_CustomCtrl::CtrlLine::CtrlLine( wxCoord height, diff --git a/src/slic3r/GUI/ObjectDataViewModel.cpp b/src/slic3r/GUI/ObjectDataViewModel.cpp index ef65f59748f..7de37fb48c4 100644 --- a/src/slic3r/GUI/ObjectDataViewModel.cpp +++ b/src/slic3r/GUI/ObjectDataViewModel.cpp @@ -1208,7 +1208,7 @@ void ObjectDataViewModel::AddAllChildren(const wxDataViewItem& parent) ItemAdded(parent, wxDataViewItem((void*)child)); } - for (const auto item : array) + for (const auto& item : array) AddAllChildren(item); m_ctrl->Expand(parent); @@ -1362,7 +1362,7 @@ void ObjectDataViewModel::GetAllChildren(const wxDataViewItem &parent, wxDataVie } wxDataViewItemArray new_array = array; - for (const auto item : new_array) + for (const auto& item : new_array) { wxDataViewItemArray children; GetAllChildren(item, children); diff --git a/src/slic3r/GUI/OptionsGroup.cpp b/src/slic3r/GUI/OptionsGroup.cpp index 80d79b581b7..7d658e526f5 100644 --- a/src/slic3r/GUI/OptionsGroup.cpp +++ b/src/slic3r/GUI/OptionsGroup.cpp @@ -27,21 +27,21 @@ const t_field& OptionsGroup::build_field(const t_config_option_key& id, const Co // is the normal type. if (opt.gui_type == "select") { } else if (opt.gui_type == "select_open") { - m_fields.emplace(id, std::move(Choice::Create(this->ctrl_parent(), opt, id))); + m_fields.emplace(id, Choice::Create(this->ctrl_parent(), opt, id)); } else if (opt.gui_type == "color") { - m_fields.emplace(id, std::move(ColourPicker::Create(this->ctrl_parent(), opt, id))); - } else if (opt.gui_type == "f_enum_open" || + m_fields.emplace(id, ColourPicker::Create(this->ctrl_parent(), opt, id)); + } else if (opt.gui_type == "f_enum_open" || opt.gui_type == "i_enum_open" || opt.gui_type == "i_enum_closed") { - m_fields.emplace(id, std::move(Choice::Create(this->ctrl_parent(), opt, id))); + m_fields.emplace(id, Choice::Create(this->ctrl_parent(), opt, id)); } else if (opt.gui_type == "slider") { - m_fields.emplace(id, std::move(SliderCtrl::Create(this->ctrl_parent(), opt, id))); + m_fields.emplace(id, SliderCtrl::Create(this->ctrl_parent(), opt, id)); } else if (opt.gui_type == "i_spin") { // Spinctrl } else if (opt.gui_type == "legend") { // StaticText - m_fields.emplace(id, std::move(StaticText::Create(this->ctrl_parent(), opt, id))); + m_fields.emplace(id, StaticText::Create(this->ctrl_parent(), opt, id)); } else if (opt.gui_type == "one_string") { - m_fields.emplace(id, std::move(TextCtrl::Create(this->ctrl_parent(), opt, id))); - } else { + m_fields.emplace(id, TextCtrl::Create(this->ctrl_parent(), opt, id)); + } else { switch (opt.type) { case coFloatOrPercent: case coFloat: @@ -50,21 +50,21 @@ const t_field& OptionsGroup::build_field(const t_config_option_key& id, const Co case coPercents: case coString: case coStrings: - m_fields.emplace(id, std::move(TextCtrl::Create(this->ctrl_parent(), opt, id))); + m_fields.emplace(id, TextCtrl::Create(this->ctrl_parent(), opt, id)); break; case coBool: case coBools: - m_fields.emplace(id, std::move(CheckBox::Create(this->ctrl_parent(), opt, id))); + m_fields.emplace(id, CheckBox::Create(this->ctrl_parent(), opt, id)); break; case coInt: case coInts: - m_fields.emplace(id, std::move(SpinCtrl::Create(this->ctrl_parent(), opt, id))); + m_fields.emplace(id, SpinCtrl::Create(this->ctrl_parent(), opt, id)); break; case coEnum: - m_fields.emplace(id, std::move(Choice::Create(this->ctrl_parent(), opt, id))); + m_fields.emplace(id, Choice::Create(this->ctrl_parent(), opt, id)); break; case coPoints: - m_fields.emplace(id, std::move(PointCtrl::Create(this->ctrl_parent(), opt, id))); + m_fields.emplace(id, PointCtrl::Create(this->ctrl_parent(), opt, id)); break; case coNone: break; default: @@ -74,19 +74,19 @@ const t_field& OptionsGroup::build_field(const t_config_option_key& id, const Co // Grab a reference to fields for convenience const t_field& field = m_fields[id]; field->m_on_change = [this](const std::string& opt_id, const boost::any& value) { - //! This function will be called from Field. + //! This function will be called from Field. //! Call OptionGroup._on_change(...) - if (!m_disabled) + if (!m_disabled) this->on_change_OG(opt_id, value); }; field->m_on_kill_focus = [this](const std::string& opt_id) { - //! This function will be called from Field. - if (!m_disabled) + //! This function will be called from Field. + if (!m_disabled) this->on_kill_focus(opt_id); }; field->m_on_set_focus = [this](const std::string& opt_id) { - //! This function will be called from Field. - if (!m_disabled) + //! This function will be called from Field. + if (!m_disabled) this->on_set_focus(opt_id); }; field->m_parent = parent(); @@ -99,7 +99,7 @@ const t_field& OptionsGroup::build_field(const t_config_option_key& id, const Co if (!this->m_disabled) this->back_to_sys_value(opt_id); }; - + // assign function objects for callbacks, etc. return field; } @@ -178,7 +178,7 @@ void OptionsGroup::append_line(const Line& line) return; auto option_set = line.get_options(); - for (auto opt : option_set) + for (auto opt : option_set) m_options.emplace(opt.opt_id, opt); // add mode value for current line to m_options_mode @@ -232,7 +232,7 @@ void OptionsGroup::activate_line(Line& line) // if we have a single option with no label, no sidetext just add it directly to sizer if (option_set.size() == 1 && label_width == 0 && option_set.front().opt.full_width && option_set.front().opt.label.empty() && - option_set.front().opt.sidetext.size() == 0 && option_set.front().side_widget == nullptr && + option_set.front().opt.sidetext.size() == 0 && option_set.front().side_widget == nullptr && line.get_extra_widgets().size() == 0) { const auto& option = option_set.front(); @@ -250,9 +250,8 @@ void OptionsGroup::activate_line(Line& line) if (custom_ctrl) m_use_custom_ctrl_as_parent = true; - // if we have an extra column, build it - if (extra_column) - { + // if we have an extra column, build it + if (extra_column) { m_extra_column_item_ptrs.push_back(extra_column(this->ctrl_parent(), line)); grid_sizer->Add(m_extra_column_item_ptrs.back(), 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, 3); } @@ -309,8 +308,8 @@ void OptionsGroup::activate_line(Line& line) auto sizer = new wxBoxSizer(wxHORIZONTAL); if (!custom_ctrl) grid_sizer->Add(sizer, 0, wxEXPAND | (staticbox ? wxALL : wxBOTTOM | wxTOP | wxLEFT), staticbox ? 0 : 1); - // If we have a single option with no sidetext just add it directly to the grid sizer - if (option_set.size() == 1 && option_set.front().opt.sidetext.size() == 0 && + // If we have a single option with no sidetext just add it directly to the grid sizer + if (option_set.size() == 1 && option_set.front().opt.sidetext.size() == 0 && option_set.front().opt.label.empty() && option_set.front().side_widget == nullptr && line.get_extra_widgets().size() == 0) { const auto& option = option_set.front(); @@ -319,23 +318,23 @@ void OptionsGroup::activate_line(Line& line) if (!custom_ctrl) { if (is_window_field(field)) sizer->Add(field->getWindow(), option.opt.full_width ? 1 : 0, - wxBOTTOM | wxTOP | (option.opt.full_width ? wxEXPAND : wxALIGN_CENTER_VERTICAL), (wxOSX || !staticbox) ? 0 : 2); + wxBOTTOM | wxTOP | (option.opt.full_width ? int(wxEXPAND) : int(wxALIGN_CENTER_VERTICAL)), (wxOSX || !staticbox) ? 0 : 2); if (is_sizer_field(field)) - sizer->Add(field->getSizer(), 1, option.opt.full_width ? wxEXPAND : wxALIGN_CENTER_VERTICAL, 0); + sizer->Add(field->getSizer(), 1, (option.opt.full_width ? int(wxEXPAND) : int(wxALIGN_CENTER_VERTICAL)), 0); } return; } for (auto opt : option_set) { ConfigOptionDef option = opt.opt; - wxSizer* sizer_tmp = sizer; + wxSizer* sizer_tmp = sizer; // add label if any if (!option.label.empty() && !custom_ctrl) { //! To correct translation by context have to use wxGETTEXT_IN_CONTEXT macro from wxWidget 3.1.1 wxString str_label = (option.label == L_CONTEXT("Top", "Layers") || option.label == L_CONTEXT("Bottom", "Layers")) ? _CTX(option.label, "Layers") : _(option.label); - label = new wxStaticText(this->ctrl_parent(), wxID_ANY, str_label + ": ", wxDefaultPosition, //wxDefaultSize); + label = new wxStaticText(this->ctrl_parent(), wxID_ANY, str_label + ": ", wxDefaultPosition, //wxDefaultSize); wxSize(sublabel_width != -1 ? sublabel_width * wxGetApp().em_unit() : -1, -1), wxALIGN_RIGHT); label->SetBackgroundStyle(wxBG_STYLE_PAINT); label->SetFont(wxGetApp().normal_font()); @@ -380,7 +379,7 @@ void OptionsGroup::activate_line(Line& line) } // add extra sizers if any - for (auto extra_widget : line.get_extra_widgets()) + for (auto extra_widget : line.get_extra_widgets()) { if (line.get_extra_widgets().size() == 1 && !staticbox) { @@ -505,7 +504,7 @@ void OptionsGroup::clear_fields_except_of(const std::vector left_fi while (it != m_fields.end()) { if (std::find(left_fields.begin(), left_fields.end(), it->first) == left_fields.end()) it = m_fields.erase(it); - else + else it++; } } @@ -531,7 +530,7 @@ Option ConfigOptionsGroup::get_option(const std::string& opt_key, int opt_index std::pair pair(opt_key, opt_index); m_opt_map.emplace(opt_id, pair); - if (m_use_custom_ctrl) // fill group and category values just for options from Settings Tab + if (m_use_custom_ctrl) // fill group and category values just for options from Settings Tab wxGetApp().sidebar().get_searcher().add_key(opt_id, title, this->config_category()); return Option(*m_config->def()->get(opt_key), opt_id); @@ -546,7 +545,7 @@ void ConfigOptionsGroup::on_change_OG(const t_config_option_key& opt_id, const b { OptionsGroup::on_change_OG(opt_id, value); return; - } + } auto itOption = it->second; const std::string &opt_key = itOption.first; @@ -555,7 +554,7 @@ void ConfigOptionsGroup::on_change_OG(const t_config_option_key& opt_id, const b this->change_opt_value(opt_key, value, opt_index == -1 ? 0 : opt_index); } - OptionsGroup::on_change_OG(opt_id, value); + OptionsGroup::on_change_OG(opt_id, value); } void ConfigOptionsGroup::back_to_initial_value(const std::string& opt_key) @@ -583,7 +582,7 @@ void ConfigOptionsGroup::back_to_config_value(const DynamicPrintConfig& config, } else if (m_opt_map.find(opt_key) == m_opt_map.end() || // This option don't have corresponded field - opt_key == "bed_shape" || opt_key == "filament_ramming_parameters" || + opt_key == "bed_shape" || opt_key == "filament_ramming_parameters" || opt_key == "compatible_printers" || opt_key == "compatible_prints" ) { value = get_config_value(config, opt_key); this->change_opt_value(opt_key, value); @@ -766,7 +765,7 @@ boost::any ConfigOptionsGroup::config_value(const std::string& opt_key, int opt_ boost::any ConfigOptionsGroup::get_config_value(const DynamicPrintConfig& config, const std::string& opt_key, int opt_index /*= -1*/) { size_t idx = opt_index == -1 ? 0 : opt_index; - + boost::any ret; wxString text_value = wxString(""); const ConfigOptionDef* opt = config.def()->get(opt_key); @@ -870,6 +869,12 @@ boost::any ConfigOptionsGroup::get_config_value(const DynamicPrintConfig& config else if (opt_key == "ironing_type") { ret = static_cast(config.option>(opt_key)->value); } + else if (opt_key == "fuzzy_skin_perimeter_mode") { + ret = static_cast(config.option>(opt_key)->value); + } +// else if (opt_key == "fuzzy_skin_shape") { +// ret = static_cast(config.option>(opt_key)->value); +// } else if (opt_key == "gcode_flavor") { ret = static_cast(config.option>(opt_key)->value); } @@ -894,6 +899,8 @@ boost::any ConfigOptionsGroup::get_config_value(const DynamicPrintConfig& config else if (opt_key == "printhost_authorization_type") { ret = static_cast(config.option>(opt_key)->value); } + else if (opt_key == "brim_type") { + ret = static_cast(config.option>(opt_key)->value); else if (opt_key == "raft_size_adjust") { ret = static_cast(config.option>(opt_key)->value); } @@ -953,7 +960,7 @@ void ConfigOptionsGroup::change_opt_value(const t_config_option_key& opt_key, co m_modelconfig->touch(); } -ogStaticText::ogStaticText(wxWindow* parent, const wxString& text) : +ogStaticText::ogStaticText(wxWindow* parent, const wxString& text) : wxStaticText(parent, wxID_ANY, text, wxDefaultPosition, wxDefaultSize) { if (!text.IsEmpty()) { diff --git a/src/slic3r/GUI/OptionsGroup.hpp b/src/slic3r/GUI/OptionsGroup.hpp index 5bc2d45959d..f19a3e0336a 100644 --- a/src/slic3r/GUI/OptionsGroup.hpp +++ b/src/slic3r/GUI/OptionsGroup.hpp @@ -273,7 +273,6 @@ class ConfigOptionsGroup: public OptionsGroup { const DynamicPrintConfig* m_config {nullptr}; // If the config is modelconfig, then ModelConfig::touch() has to be called after value change. ModelConfig* m_modelconfig { nullptr }; - bool m_full_labels{ 0 }; t_opt_map m_opt_map; std::string m_config_category; diff --git a/src/slic3r/GUI/PhysicalPrinterDialog.cpp b/src/slic3r/GUI/PhysicalPrinterDialog.cpp index 620a3ddcade..8b16575ba85 100644 --- a/src/slic3r/GUI/PhysicalPrinterDialog.cpp +++ b/src/slic3r/GUI/PhysicalPrinterDialog.cpp @@ -275,7 +275,7 @@ void PhysicalPrinterDialog::build_printhost_settings(ConfigOptionsGroup* m_optgr m_optgroup->append_single_option_line("host_type"); - auto create_sizer_with_btn = [this](wxWindow* parent, ScalableButton** btn, const std::string& icon_name, const wxString& label) { + auto create_sizer_with_btn = [](wxWindow* parent, ScalableButton** btn, const std::string& icon_name, const wxString& label) { *btn = new ScalableButton(parent, wxID_ANY, icon_name, label, wxDefaultSize, wxDefaultPosition, wxBU_LEFT | wxBU_EXACTFIT); (*btn)->SetFont(wxGetApp().normal_font()); @@ -290,7 +290,7 @@ void PhysicalPrinterDialog::build_printhost_settings(ConfigOptionsGroup* m_optgr m_printhost_browse_btn->Bind(wxEVT_BUTTON, [=](wxCommandEvent& e) { BonjourDialog dialog(this, Preset::printer_technology(m_printer.config)); if (dialog.show_and_lookup()) { - m_optgroup->set_value("print_host", std::move(dialog.get_selected()), true); + m_optgroup->set_value("print_host", dialog.get_selected(), true); m_optgroup->get_field("print_host")->field_changed(); } }); @@ -366,7 +366,7 @@ void PhysicalPrinterDialog::build_printhost_settings(ConfigOptionsGroup* m_optgr static const auto filemasks = _L("Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*"); wxFileDialog openFileDialog(this, _L("Open CA certificate file"), "", "", filemasks, wxFD_OPEN | wxFD_FILE_MUST_EXIST); if (openFileDialog.ShowModal() != wxID_CANCEL) { - m_optgroup->set_value("printhost_cafile", std::move(openFileDialog.GetPath()), true); + m_optgroup->set_value("printhost_cafile", openFileDialog.GetPath(), true); m_optgroup->get_field("printhost_cafile")->field_changed(); } }); @@ -379,7 +379,7 @@ void PhysicalPrinterDialog::build_printhost_settings(ConfigOptionsGroup* m_optgr Line cafile_hint{ "", "" }; cafile_hint.full_width = 1; - cafile_hint.widget = [this, ca_file_hint](wxWindow* parent) { + cafile_hint.widget = [ca_file_hint](wxWindow* parent) { auto txt = new wxStaticText(parent, wxID_ANY, ca_file_hint); auto sizer = new wxBoxSizer(wxHORIZONTAL); sizer->Add(txt); @@ -420,7 +420,7 @@ void PhysicalPrinterDialog::build_printhost_settings(ConfigOptionsGroup* m_optgr { wxTextCtrl* temp = dynamic_cast(printhost_field->getWindow()); if (temp) - temp->Bind(wxEVT_TEXT, ([this, printhost_field, temp](wxEvent& e) + temp->Bind(wxEVT_TEXT, ([printhost_field, temp](wxEvent& e) { #ifndef __WXGTK__ e.Skip(); @@ -572,12 +572,17 @@ void PhysicalPrinterDialog::OnOK(wxEvent& event) if (!repeat_presets.empty()) { wxString repeatable_presets = "\n"; - for (const std::string& preset_name : repeat_presets) + int repeat_cnt = 0; + for (const std::string& preset_name : repeat_presets) { repeatable_presets += " " + from_u8(preset_name) + "\n"; + repeat_cnt++; + } repeatable_presets += "\n"; - wxString msg_text = from_u8((boost::format(_u8L("Following printer preset(s) is duplicated:%1%" - "The above preset for printer \"%2%\" will be used just once.")) % repeatable_presets % printer_name).str()); + wxString msg_text = format_wxstr(_L_PLURAL("Following printer preset is duplicated:%1%" + "The above preset for printer \"%2%\" will be used just once.", + "Following printer presets are duplicated:%1%" + "The above presets for printer \"%2%\" will be used just once.", repeat_cnt), repeatable_presets, printer_name); wxMessageDialog dialog(nullptr, msg_text, _L("Warning"), wxICON_WARNING | wxOK | wxCANCEL); if (dialog.ShowModal() == wxID_CANCEL) return; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 564e668e37b..b3be8bcbd51 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -274,7 +274,7 @@ class FreqChangedParams : public OG_Settings wxButton* get_wiping_dialog_button() { return m_wiping_dialog_button; } wxSizer* get_sizer() override; ConfigOptionsGroup* get_og(const bool is_fff); - void Show(const bool is_fff); + void Show(const bool is_fff) override; void msw_rescale(); }; @@ -595,17 +595,10 @@ struct Sidebar::priv Sidebar::priv::~priv() { - if (object_manipulation != nullptr) - delete object_manipulation; - - if (object_settings != nullptr) - delete object_settings; - - if (frequently_changed_parameters != nullptr) - delete frequently_changed_parameters; - - if (object_layers != nullptr) - delete object_layers; + delete object_manipulation; + delete object_settings; + delete frequently_changed_parameters; + delete object_layers; } void Sidebar::priv::show_preset_comboboxes() @@ -633,7 +626,11 @@ Sidebar::Sidebar(Plater *parent) : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxSize(42 * wxGetApp().em_unit(), -1)), p(new priv(parent)) { p->scrolled = new wxScrolledWindow(this); - p->scrolled->SetScrollbars(0, 100, 1, 2); +// p->scrolled->SetScrollbars(0, 100, 1, 2); // ys_DELETE_after_testing. pixelsPerUnitY = 100 from https://github.com/prusa3d/PrusaSlicer/commit/8f019e5fa992eac2c9a1e84311c990a943f80b01, + // but this cause the bad layout of the sidebar, when all infoboxes appear. + // As a result we can see the empty block at the bottom of the sidebar + // But if we set this value to 5, layout will be better + p->scrolled->SetScrollRate(0, 5); SetFont(wxGetApp().normal_font()); #ifndef __APPLE__ @@ -1068,18 +1065,29 @@ void Sidebar::show_info_sizer() const auto& stats = model_object->get_object_stl_stats();//model_object->volumes.front()->mesh.stl.stats; p->object_info->info_volume->SetLabel(wxString::Format("%.2f", stats.volume*pow(koef,3))); - p->object_info->info_facets->SetLabel(wxString::Format(_L("%d (%d shells)"), static_cast(model_object->facets_count()), stats.number_of_parts)); + p->object_info->info_facets->SetLabel(format_wxstr(_L_PLURAL("%1% (%2$d shell)", "%1% (%2$d shells)", stats.number_of_parts), + static_cast(model_object->facets_count()), stats.number_of_parts)); int errors = stats.degenerate_facets + stats.edges_fixed + stats.facets_removed + stats.facets_added + stats.facets_reversed + stats.backwards_edges; if (errors > 0) { - wxString tooltip = wxString::Format(_L("Auto-repaired (%d errors)"), errors); + wxString tooltip = format_wxstr(_L_PLURAL("Auto-repaired %1$d error", "Auto-repaired %1$d errors", errors), errors); p->object_info->info_manifold->SetLabel(tooltip); - tooltip += ":\n" + wxString::Format(_L("%d degenerate facets, %d edges fixed, %d facets removed, " - "%d facets added, %d facets reversed, %d backwards edges"), - stats.degenerate_facets, stats.edges_fixed, stats.facets_removed, - stats.facets_added, stats.facets_reversed, stats.backwards_edges); + tooltip += ":\n"; + if (stats.degenerate_facets > 0) + tooltip += format_wxstr(_L_PLURAL("%1$d degenerate facet", "%1$d degenerate facets", stats.degenerate_facets), stats.degenerate_facets) + ", "; + if (stats.edges_fixed > 0) + tooltip += format_wxstr(_L_PLURAL("%1$d edge fixed", "%1$d edges fixed", stats.edges_fixed), stats.edges_fixed) + ", "; + if (stats.facets_removed > 0) + tooltip += format_wxstr(_L_PLURAL("%1$d facet removed", "%1$d facets removed", stats.facets_removed), stats.facets_removed) + ", "; + if (stats.facets_added > 0) + tooltip += format_wxstr(_L_PLURAL("%1$d facet added", "%1$d facets added", stats.facets_added), stats.facets_added) + ", "; + if (stats.facets_reversed > 0) + tooltip += format_wxstr(_L_PLURAL("%1$d facet reversed", "%1$d facets reversed", stats.facets_reversed), stats.facets_reversed) + ", "; + if (stats.backwards_edges > 0) + tooltip += format_wxstr(_L_PLURAL("%1$d backwards edge", "%1$d backwards edges", stats.backwards_edges), stats.backwards_edges) + ", "; + tooltip.RemoveLast(2);//remove last coma p->object_info->showing_manifold_warning_icon = true; p->object_info->info_manifold->SetToolTip(tooltip); @@ -1110,7 +1118,7 @@ void Sidebar::update_sliced_info_sizer() wxString new_label = _L("Used Material (ml)") + ":"; const bool is_supports = ps.support_used_material > 0.0; if (is_supports) - new_label += format_wxstr("\n - %s\n - %s", _L("object(s)"), _L("supports and pad")); + new_label += format_wxstr("\n - %s\n - %s", _L_PLURAL("object", "objects", p->plater->model().objects.size()), _L("supports and pad")); wxString info_text = is_supports ? wxString::Format("%.2f \n%.2f \n%.2f", (ps.objects_used_material + ps.support_used_material) / 1000, @@ -1927,7 +1935,7 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) , main_frame(main_frame) , config(Slic3r::DynamicPrintConfig::new_from_defaults_keys({ "bed_shape", "bed_custom_texture", "bed_custom_model", "complete_objects", "duplicate_distance", "extruder_clearance_radius", "skirts", "skirt_distance", - "brim_width", "variable_layer_height", "nozzle_diameter", "single_extruder_multi_material", + "brim_width", "brim_offset", "brim_type", "variable_layer_height", "nozzle_diameter", "single_extruder_multi_material", "wipe_tower", "wipe_tower_x", "wipe_tower_y", "wipe_tower_width", "wipe_tower_rotation_angle", "extruder_colour", "filament_colour", "max_print_height", "printer_model", "printer_technology", // These values are necessary to construct SlicingParameters by the Canvas3D variable layer height editor. @@ -2058,7 +2066,7 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) view3D_canvas->Bind(EVT_GLCANVAS_UPDATE_BED_SHAPE, [q](SimpleEvent&) { q->set_bed_shape(); }); // Preview events: - preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_QUESTION_MARK, [this](SimpleEvent&) { wxGetApp().keyboard_shortcuts(); }); + preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_QUESTION_MARK, [](SimpleEvent&) { wxGetApp().keyboard_shortcuts(); }); preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_UPDATE_BED_SHAPE, [q](SimpleEvent&) { q->set_bed_shape(); }); if (wxGetApp().is_editor()) { preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_TAB, [this](SimpleEvent&) { select_next_view_3D(); }); @@ -2120,8 +2128,8 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) if (wxGetApp().is_editor()) { this->q->Bind(EVT_EJECT_DRIVE_NOTIFICAION_CLICKED, [this](EjectDriveNotificationClickedEvent&) { this->q->eject_drive(); }); this->q->Bind(EVT_EXPORT_GCODE_NOTIFICAION_CLICKED, [this](ExportGcodeNotificationClickedEvent&) { this->q->export_gcode(true); }); - this->q->Bind(EVT_PRESET_UPDATE_AVAILABLE_CLICKED, [this](PresetUpdateAvailableClickedEvent&) { wxGetApp().get_preset_updater()->on_update_notification_confirm(); }); - this->q->Bind(EVT_REMOVABLE_DRIVE_EJECTED, [this, q](RemovableDriveEjectEvent &evt) { + this->q->Bind(EVT_PRESET_UPDATE_AVAILABLE_CLICKED, [](PresetUpdateAvailableClickedEvent&) { wxGetApp().get_preset_updater()->on_update_notification_confirm(); }); + this->q->Bind(EVT_REMOVABLE_DRIVE_EJECTED, [this](RemovableDriveEjectEvent &evt) { if (evt.data.second) { this->show_action_buttons(this->ready_to_slice); notification_manager->close_notification_of_type(NotificationType::ExportFinished); @@ -2136,7 +2144,7 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) ); } }); - this->q->Bind(EVT_REMOVABLE_DRIVES_CHANGED, [this, q](RemovableDrivesChangedEvent &) { + this->q->Bind(EVT_REMOVABLE_DRIVES_CHANGED, [this](RemovableDrivesChangedEvent &) { this->show_action_buttons(this->ready_to_slice); // Close notification ExportingFinished but only if last export was to removable notification_manager->device_ejected(); @@ -2381,6 +2389,10 @@ std::vector Plater::priv::load_files(const std::vector& input_ CustomGCode::update_custom_gcode_per_print_z_from_config(model.custom_gcode_per_print_z, &wxGetApp().preset_bundle->project_config); // For exporting from the amf/3mf we shouldn't check printer_presets for the containing information about "Print Host upload" wxGetApp().load_current_presets(false); + // Update filament colors for the MM-printer profile in the full config + // to avoid black (default) colors for Extruders in the ObjectList, + // when for extruder colors are used filament colors + q->update_filament_colors_in_full_config(); is_project_file = true; } wxGetApp().app_config->update_config_dir(path.parent_path().string()); @@ -2412,9 +2424,11 @@ std::vector Plater::priv::load_files(const std::vector& input_ // Convert even if the object is big. convert_from_imperial_units(model, false); else if (model.looks_like_imperial_units()) { - wxMessageDialog msg_dlg(q, format_wxstr(_L( - "Some object(s) in file %s looks like saved in inches.\n" - "Should I consider them as a saved in inches and convert them?"), from_path(filename)) + "\n", + wxMessageDialog msg_dlg(q, format_wxstr(_L_PLURAL( + "The object in file %s looks like saved in inches.\n" + "Should I consider it as a saved in inches and convert it?", + "Some objects in file %s look like saved in inches.\n" + "Should I consider them as a saved in inches and convert them?", model.objects.size()), from_path(filename)) + "\n", _L("The object appears to be saved in inches"), wxICON_WARNING | wxYES | wxNO); if (msg_dlg.ShowModal() == wxID_YES) //FIXME up-scale only the small parts? @@ -2524,7 +2538,7 @@ std::vector Plater::priv::load_model_objects(const ModelObjectPtrs &mode const Vec3d bed_size = Slic3r::to_3d(bed_shape.size().cast(), 1.0) - 2.0 * Vec3d::Ones(); #ifndef AUTOPLACEMENT_ON_LOAD - bool need_arrange = false; + // bool need_arrange = false; #endif /* AUTOPLACEMENT_ON_LOAD */ bool scaled_down = false; std::vector obj_idxs; @@ -2544,7 +2558,7 @@ std::vector Plater::priv::load_model_objects(const ModelObjectPtrs &mode new_instances.emplace_back(object->add_instance()); #else /* AUTOPLACEMENT_ON_LOAD */ // if object has no defined position(s) we need to rearrange everything after loading - need_arrange = true; + // need_arrange = true; // add a default instance and center object around origin object->center_around_origin(); // also aligns object to Z = 0 ModelInstance* instance = object->add_instance(); @@ -3305,10 +3319,12 @@ void Plater::priv::reload_from_disk() new_volume->config.apply(old_volume->config); new_volume->set_type(old_volume->type()); new_volume->set_material_id(old_volume->material_id()); - new_volume->set_transformation(old_volume->get_transformation() * old_volume->source.transform); + new_volume->set_transformation(old_volume->get_transformation()); new_volume->translate(new_volume->get_transformation().get_matrix(true) * (new_volume->source.mesh_offset - old_volume->source.mesh_offset)); if (old_volume->source.is_converted_from_inches) new_volume->convert_from_imperial_units(); + new_volume->supported_facets.assign(old_volume->supported_facets); + new_volume->seam_facets.assign(old_volume->seam_facets); std::swap(old_model_object->volumes[sel_v.volume_idx], old_model_object->volumes.back()); old_model_object->delete_volume(old_model_object->volumes.size() - 1); old_model_object->ensure_on_bed(); @@ -3687,9 +3703,8 @@ bool Plater::priv::warnings_dialog() if (current_warnings.empty()) return true; std::string text = _u8L("There are active warnings concerning sliced models:") + "\n"; - bool empt = true; for (auto const& it : current_warnings) { - int next_n = it.first.message.find_first_of('\n', 0); + size_t next_n = it.first.message.find_first_of('\n', 0); text += "\n"; if (next_n != std::string::npos) text += it.first.message.substr(0, next_n); @@ -4949,7 +4964,7 @@ ProjectDropDialog::ProjectDropDialog(const std::string& filename) wxBoxSizer* bottom_sizer = new wxBoxSizer(wxHORIZONTAL); wxCheckBox* check = new wxCheckBox(this, wxID_ANY, _L("Don't show again")); - check->Bind(wxEVT_CHECKBOX, [this](wxCommandEvent& evt) { + check->Bind(wxEVT_CHECKBOX, [](wxCommandEvent& evt) { wxGetApp().app_config->set("show_drop_project_dialog", evt.IsChecked() ? "0" : "1"); }); @@ -5052,6 +5067,10 @@ bool Plater::load_files(const wxArrayString& filenames) load_files(in_paths, false, true); break; } + case LoadType::Unknown : { + assert(false); + break; + } } return true; @@ -5789,6 +5808,26 @@ void Plater::on_extruders_change(size_t num_extruders) sidebar().scrolled_panel()->Refresh(); } +bool Plater::update_filament_colors_in_full_config() +{ + // There is a case, when we use filament_color instead of extruder_color (when extruder_color == ""). + // Thus plater config option "filament_colour" should be filled with filament_presets values. + // Otherwise, on 3dScene will be used last edited filament color for all volumes with extruder_color == "". + const std::vector filament_presets = wxGetApp().preset_bundle->filament_presets; + if (filament_presets.size() == 1 || !p->config->has("filament_colour")) + return false; + + const PresetCollection& filaments = wxGetApp().preset_bundle->filaments; + std::vector filament_colors; + filament_colors.reserve(filament_presets.size()); + + for (const std::string& filament_preset : filament_presets) + filament_colors.push_back(filaments.find_preset(filament_preset, true)->config.opt_string("filament_colour", (unsigned)0)); + + p->config->option("filament_colour")->values = filament_colors; + return true; +} + void Plater::on_config_change(const DynamicPrintConfig &config) { bool update_scheduled = false; @@ -5798,22 +5837,7 @@ void Plater::on_config_change(const DynamicPrintConfig &config) { update_scheduled = true; // update should be scheduled (for update 3DScene) #2738 - /* There is a case, when we use filament_color instead of extruder_color (when extruder_color == ""). - * Thus plater config option "filament_colour" should be filled with filament_presets values. - * Otherwise, on 3dScene will be used last edited filament color for all volumes with extruder_color == "". - */ - const std::vector filament_presets = wxGetApp().preset_bundle->filament_presets; - if (filament_presets.size() > 1 && - p->config->option(opt_key)->values.size() != config.option(opt_key)->values.size()) - { - const PresetCollection& filaments = wxGetApp().preset_bundle->filaments; - std::vector filament_colors; - filament_colors.reserve(filament_presets.size()); - - for (const std::string& filament_preset : filament_presets) - filament_colors.push_back(filaments.find_preset(filament_preset, true)->config.opt_string("filament_colour", (unsigned)0)); - - p->config->option(opt_key)->values = filament_colors; + if (update_filament_colors_in_full_config()) { p->sidebar->obj_list()->update_extruder_colors(); continue; } @@ -5920,7 +5944,6 @@ void Plater::force_print_bed_update() void Plater::on_activate() { #if defined(__linux__) || defined(_WIN32) - wxWindow *focus_window = wxWindow::FindFocus(); // Activating the main frame, and no window has keyboard focus. // Set the keyboard focus to the visible Canvas3D. if (this->p->view3D->IsShown() && wxWindow::FindFocus() != this->p->view3D->get_wxglcanvas()) @@ -6106,8 +6129,10 @@ void Plater::changed_objects(const std::vector& object_idxs) // pulls the correct data, update the 3D scene. this->p->update_restart_background_process(true, false); } - else + else { p->view3D->reload_scene(false); + p->view3D->get_canvas3d()->update_instance_printable_state_for_objects(object_idxs); + } // update print this->p->schedule_background_process(); @@ -6202,6 +6227,7 @@ void Plater::msw_rescale() void Plater::sys_color_changed() { + p->preview->sys_color_changed(); p->sidebar->sys_color_changed(); // msw_rescale_menu updates just icons, so use it diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 5c7c6d7c981..5407a6e858a 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -233,6 +233,7 @@ class Plater: public wxPanel void leave_gizmos_stack(); void on_extruders_change(size_t extruders_count); + bool update_filament_colors_in_full_config(); void on_config_change(const DynamicPrintConfig &config); void force_filament_colors_update(); void force_print_bed_update(); diff --git a/src/slic3r/GUI/Preferences.cpp b/src/slic3r/GUI/Preferences.cpp index 9c9ea8c4b35..0a8a6c886e1 100644 --- a/src/slic3r/GUI/Preferences.cpp +++ b/src/slic3r/GUI/Preferences.cpp @@ -312,6 +312,7 @@ void PreferencesDialog::build() m_icon_size_sizer->ShowItems(app_config->get("use_custom_toolbar_size") == "1"); create_settings_mode_widget(); + create_settings_text_color_widget(); } #if ENABLE_ENVIRONMENT_MAP @@ -379,6 +380,10 @@ void PreferencesDialog::accept() app_config->set(it->first, it->second); app_config->save(); + + wxGetApp().set_label_clr_sys(m_sys_colour->GetColour()); + wxGetApp().set_label_clr_modified(m_mod_colour->GetColour()); + EndModal(wxID_OK); if (m_settings_layout_changed) @@ -498,6 +503,42 @@ void PreferencesDialog::create_settings_mode_widget() m_optgroup_gui->sizer->Add(sizer, 0, wxEXPAND); } +void PreferencesDialog::create_settings_text_color_widget() +{ + wxWindow* parent = m_optgroup_gui->parent(); + + wxStaticBox* stb = new wxStaticBox(parent, wxID_ANY, _L("Text color Settings")); + if (!wxOSX) stb->SetBackgroundStyle(wxBG_STYLE_PAINT); + + wxSizer* sizer = new wxStaticBoxSizer(stb, wxVERTICAL); + wxFlexGridSizer* grid_sizer = new wxFlexGridSizer(2, 10, 20); + sizer->Add(grid_sizer, 0, wxEXPAND); + + auto sys_label = new wxStaticText(parent, wxID_ANY, _L("Value is the same as the system value")); + sys_label->SetForegroundColour(wxGetApp().get_label_clr_sys()); + m_sys_colour = new wxColourPickerCtrl(parent, wxID_ANY, wxGetApp().get_label_clr_sys()); + m_sys_colour->Bind(wxEVT_COLOURPICKER_CHANGED, [this, sys_label](wxCommandEvent&) { + sys_label->SetForegroundColour(m_sys_colour->GetColour()); + sys_label->Refresh(); + }); + + grid_sizer->Add(m_sys_colour, -1, wxALIGN_CENTRE_VERTICAL); + grid_sizer->Add(sys_label, -1, wxALIGN_CENTRE_VERTICAL | wxEXPAND); + + auto mod_label = new wxStaticText(parent, wxID_ANY, _L("Value was changed and is not equal to the system value or the last saved preset")); + mod_label->SetForegroundColour(wxGetApp().get_label_clr_modified()); + m_mod_colour = new wxColourPickerCtrl(parent, wxID_ANY, wxGetApp().get_label_clr_modified()); + m_mod_colour->Bind(wxEVT_COLOURPICKER_CHANGED, [this, mod_label](wxCommandEvent&) { + mod_label->SetForegroundColour(m_mod_colour->GetColour()); + mod_label->Refresh(); + }); + + grid_sizer->Add(m_mod_colour, -1, wxALIGN_CENTRE_VERTICAL); + grid_sizer->Add(mod_label, -1, wxALIGN_CENTRE_VERTICAL | wxEXPAND); + + m_optgroup_gui->sizer->Add(sizer, 0, wxEXPAND | wxTOP, em_unit()); +} + } // GUI } // Slic3r diff --git a/src/slic3r/GUI/Preferences.hpp b/src/slic3r/GUI/Preferences.hpp index 68574fbcca3..0da04473655 100644 --- a/src/slic3r/GUI/Preferences.hpp +++ b/src/slic3r/GUI/Preferences.hpp @@ -8,6 +8,7 @@ #include class wxRadioBox; +class wxColourPickerCtrl; namespace Slic3r { namespace GUI { @@ -25,6 +26,8 @@ class PreferencesDialog : public DPIDialog #endif // ENABLE_ENVIRONMENT_MAP wxSizer* m_icon_size_sizer; wxRadioBox* m_layout_mode_box; + wxColourPickerCtrl* m_sys_colour {nullptr}; + wxColourPickerCtrl* m_mod_colour {nullptr}; bool isOSX {false}; bool m_settings_layout_changed {false}; bool m_seq_top_layer_only_changed{ false }; @@ -43,6 +46,7 @@ class PreferencesDialog : public DPIDialog void layout(); void create_icon_size_slider(); void create_settings_mode_widget(); + void create_settings_text_color_widget(); }; } // GUI diff --git a/src/slic3r/GUI/PresetComboBoxes.cpp b/src/slic3r/GUI/PresetComboBoxes.cpp index 8dd35a59158..569cb9a2936 100644 --- a/src/slic3r/GUI/PresetComboBoxes.cpp +++ b/src/slic3r/GUI/PresetComboBoxes.cpp @@ -62,12 +62,12 @@ namespace GUI { * control size calculation methods (virtual) are overridden. **/ -PresetComboBox::PresetComboBox(wxWindow* parent, Preset::Type preset_type, const wxSize& size) : +PresetComboBox::PresetComboBox(wxWindow* parent, Preset::Type preset_type, const wxSize& size, PresetBundle* preset_bundle/* = nullptr*/) : wxBitmapComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, size, 0, nullptr, wxCB_READONLY), m_type(preset_type), m_last_selected(wxNOT_FOUND), m_em_unit(em_unit(this)), - m_preset_bundle(wxGetApp().preset_bundle) + m_preset_bundle(preset_bundle ? preset_bundle : wxGetApp().preset_bundle) { SetFont(wxGetApp().normal_font()); #ifdef _WIN32 @@ -186,6 +186,12 @@ void PresetComboBox::update_selection() validate_selection(); SetSelection(m_last_selected); +#ifdef __WXMSW__ + // From the Windows 2004 the tooltip for preset combobox doesn't work after next call of SetTooltip() + // (There was an issue, when tooltip doesn't appears after changing of the preset selection) + // But this workaround seems to work: We should to kill tooltip and than set new tooltip value + SetToolTip(NULL); +#endif SetToolTip(GetString(m_last_selected)); // A workaround for a set of issues related to text fitting into gtk widgets: @@ -201,13 +207,28 @@ void PresetComboBox::update_selection() if (!cell) return; - g_object_set(G_OBJECT(cell), "ellipsize", PANGO_ELLIPSIZE_END, NULL); + g_object_set(G_OBJECT(cell), "ellipsize", PANGO_ELLIPSIZE_END, (char*)NULL); // Only the list of cells must be freed, the renderer isn't ours to free g_list_free(cells); #endif } +static std::string suffix(const Preset& preset) +{ + return (preset.is_dirty ? Preset::suffix_modified() : ""); +} + +static std::string suffix(Preset* preset) +{ + return (preset->is_dirty ? Preset::suffix_modified() : ""); +} + +wxString PresetComboBox::get_preset_name(const Preset & preset) +{ + return from_u8(preset.name/* + suffix(preset)*/); +} + void PresetComboBox::update(std::string select_preset_name) { Freeze(); @@ -226,7 +247,7 @@ void PresetComboBox::update(std::string select_preset_name) for (size_t i = presets.front().is_visible ? 0 : m_collection->num_default_presets(); i < presets.size(); ++i) { const Preset& preset = presets[i]; - if (!preset.is_visible || !preset.is_compatible) + if (!m_show_all && (!preset.is_visible || !preset.is_compatible)) continue; // marker used for disable incompatible printer models for the selected physical printer @@ -246,17 +267,17 @@ void PresetComboBox::update(std::string select_preset_name) assert(bmp); if (!is_enabled) - incomp_presets.emplace(wxString::FromUTF8((preset.name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str()), bmp); + incomp_presets.emplace(get_preset_name(preset), bmp); else if (preset.is_default || preset.is_system) { - Append(wxString::FromUTF8((preset.name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str()), *bmp); + Append(get_preset_name(preset), *bmp); validate_selection(preset.name == select_preset_name); } else { - nonsys_presets.emplace(wxString::FromUTF8((preset.name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str()), std::pair(bmp, is_enabled)); + nonsys_presets.emplace(get_preset_name(preset), std::pair(bmp, is_enabled)); if (preset.name == select_preset_name || (select_preset_name.empty() && is_enabled)) - selected = wxString::FromUTF8((preset.name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str()); + selected = get_preset_name(preset); } if (i + 1 == m_collection->num_default_presets()) set_label_marker(Append(separator(L("System presets")), wxNullBitmap)); @@ -329,11 +350,22 @@ bool PresetComboBox::del_physical_printer(const wxString& note_string/* = wxEmpt return true; } +void PresetComboBox::show_all(bool show_all) +{ + m_show_all = show_all; + update(); +} + void PresetComboBox::update() { this->update(into_u8(this->GetString(this->GetSelection()))); } +void PresetComboBox::update_from_bundle() +{ + this->update(m_collection->get_selected_preset().name); +} + void PresetComboBox::msw_rescale() { m_em_unit = em_unit(this); @@ -385,7 +417,8 @@ wxBitmap* PresetComboBox::get_bmp( std::string bitmap_key, bool wide_icons, con bitmap_key += is_system ? ",syst" : ",nsyst"; bitmap_key += ",h" + std::to_string(icon_height); - if (wxGetApp().dark_mode()) + bool dark_mode = wxGetApp().dark_mode(); + if (dark_mode) bitmap_key += ",dark"; wxBitmap* bmp = bitmap_cache().find(bitmap_key); @@ -401,10 +434,10 @@ wxBitmap* PresetComboBox::get_bmp( std::string bitmap_key, bool wide_icons, con unsigned char rgb[3]; // Paint the color bars. bitmap_cache().parse_color(filament_rgb, rgb); - bmps.emplace_back(bitmap_cache().mksolid(is_single_bar ? wide_icon_width : norm_icon_width, icon_height, rgb)); + bmps.emplace_back(bitmap_cache().mksolid(is_single_bar ? wide_icon_width : norm_icon_width, icon_height, rgb, false, 1, dark_mode)); if (!is_single_bar) { bitmap_cache().parse_color(extruder_rgb, rgb); - bmps.emplace_back(bitmap_cache().mksolid(thin_icon_width, icon_height, rgb)); + bmps.emplace_back(bitmap_cache().mksolid(thin_icon_width, icon_height, rgb, false, 1, dark_mode)); } // Paint a lock at the system presets. bmps.emplace_back(bitmap_cache().mkclear(space_icon_width, icon_height)); @@ -705,7 +738,7 @@ void PlaterPresetComboBox::show_add_menu() wxMenu* menu = new wxMenu(); append_menu_item(menu, wxID_ANY, _L("Add/Remove presets"), "", - [this](wxCommandEvent&) { + [](wxCommandEvent&) { wxTheApp->CallAfter([]() { wxGetApp().run_wizard(ConfigWizard::RR_USER, ConfigWizard::SP_PRINTERS); }); }, "edit_uni", menu, []() { return true; }, wxGetApp().plater()); @@ -735,7 +768,7 @@ void PlaterPresetComboBox::show_edit_menu() } else append_menu_item(menu, wxID_ANY, _L("Add/Remove presets"), "", - [this](wxCommandEvent&) { + [](wxCommandEvent&) { wxTheApp->CallAfter([]() { wxGetApp().run_wizard(ConfigWizard::RR_USER, ConfigWizard::SP_PRINTERS); }); }, "edit_uni", menu, []() { return true; }, wxGetApp().plater()); @@ -745,6 +778,12 @@ void PlaterPresetComboBox::show_edit_menu() wxGetApp().plater()->PopupMenu(menu); } +wxString PlaterPresetComboBox::get_preset_name(const Preset& preset) +{ + std::string name = preset.alias.empty() ? preset.name : preset.alias; + return from_u8(name + suffix(preset)); +} + // Only the compatible presets are shown. // If an incompatible preset is selected, it is shown as well. void PlaterPresetComboBox::update() @@ -759,7 +798,7 @@ void PlaterPresetComboBox::update() this->Clear(); invalidate_selection(); - const Preset* selected_filament_preset; + const Preset* selected_filament_preset = nullptr; std::string extruder_color; if (m_type == Preset::TYPE_FILAMENT) { @@ -821,17 +860,17 @@ void PlaterPresetComboBox::update() const std::string name = preset.alias.empty() ? preset.name : preset.alias; if (preset.is_default || preset.is_system) { - Append(wxString::FromUTF8((name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str()), *bmp); + Append(get_preset_name(preset), *bmp); validate_selection(is_selected); if (is_selected) - tooltip = wxString::FromUTF8(preset.name.c_str()); + tooltip = from_u8(preset.name); } else { - nonsys_presets.emplace(wxString::FromUTF8((name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str()), bmp); + nonsys_presets.emplace(get_preset_name(preset), bmp); if (is_selected) { - selected_user_preset = wxString::FromUTF8((name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str()); - tooltip = wxString::FromUTF8(preset.name.c_str()); + selected_user_preset = get_preset_name(preset); + tooltip = from_u8(preset.name); } } if (i + 1 == m_collection->num_default_presets()) @@ -854,7 +893,7 @@ void PlaterPresetComboBox::update() const PhysicalPrinterCollection& ph_printers = m_preset_bundle->physical_printers; for (PhysicalPrinterCollection::ConstIterator it = ph_printers.begin(); it != ph_printers.end(); ++it) { - for (const std::string preset_name : it->get_preset_names()) { + for (const std::string& preset_name : it->get_preset_names()) { Preset* preset = m_collection->find_preset(preset_name); if (!preset) continue; @@ -862,7 +901,7 @@ void PlaterPresetComboBox::update() wxBitmap* bmp = get_bmp(main_icon_name, wide_icons, main_icon_name); assert(bmp); - set_label_marker(Append(wxString::FromUTF8((it->get_full_name(preset_name) + (preset->is_dirty ? Preset::suffix_modified() : "")).c_str()), *bmp), LABEL_ITEM_PHYSICAL_PRINTER); + set_label_marker(Append(from_u8(it->get_full_name(preset_name) + suffix(preset)), *bmp), LABEL_ITEM_PHYSICAL_PRINTER); validate_selection(ph_printers.is_selected(it, preset_name)); } } @@ -884,12 +923,24 @@ void PlaterPresetComboBox::update() update_selection(); Thaw(); - if (!tooltip.IsEmpty()) + if (!tooltip.IsEmpty()) { +#ifdef __WXMSW__ + // From the Windows 2004 the tooltip for preset combobox doesn't work after next call of SetTooltip() + // (There was an issue, when tooltip doesn't appears after changing of the preset selection) + // But this workaround seems to work: We should to kill tooltip and than set new tooltip value + // See, https://groups.google.com/g/wx-users/c/mOEe3fgHrzk + SetToolTip(NULL); +#endif SetToolTip(tooltip); + } +#ifdef __WXMSW__ + // Use this part of code just on Windows to avoid of some layout issues on Linux + // see https://github.com/prusa3d/PrusaSlicer/issues/5163 and https://github.com/prusa3d/PrusaSlicer/issues/5505 // Update control min size after rescale (changed Display DPI under MSW) if (GetMinWidth() != 20 * m_em_unit) SetMinSize(wxSize(20 * m_em_unit, GetSize().GetHeight())); +#endif //__WXMSW__ } void PlaterPresetComboBox::msw_rescale() @@ -942,6 +993,11 @@ TabPresetComboBox::TabPresetComboBox(wxWindow* parent, Preset::Type preset_type) }); } +wxString TabPresetComboBox::get_preset_name(const Preset& preset) +{ + return from_u8(preset.name + suffix(preset)); +} + // Update the choice UI from the list of presets. // If show_incompatible, all presets are shown, otherwise only the compatible presets are shown. // If an incompatible preset is selected, it is shown as well. @@ -987,7 +1043,7 @@ void TabPresetComboBox::update() assert(bmp); if (preset.is_default || preset.is_system) { - int item_id = Append(wxString::FromUTF8((preset.name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str()), *bmp); + int item_id = Append(get_preset_name(preset), *bmp); if (!is_enabled) set_label_marker(item_id, LABEL_ITEM_DISABLED); validate_selection(i == idx_selected); @@ -995,9 +1051,9 @@ void TabPresetComboBox::update() else { std::pair pair(bmp, is_enabled); - nonsys_presets.emplace(wxString::FromUTF8((preset.name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str()), std::pair(bmp, is_enabled)); + nonsys_presets.emplace(get_preset_name(preset), std::pair(bmp, is_enabled)); if (i == idx_selected) - selected = wxString::FromUTF8((preset.name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str()); + selected = get_preset_name(preset); } if (i + 1 == m_collection->num_default_presets()) set_label_marker(Append(separator(L("System presets")), wxNullBitmap)); @@ -1022,7 +1078,7 @@ void TabPresetComboBox::update() const PhysicalPrinterCollection& ph_printers = m_preset_bundle->physical_printers; for (PhysicalPrinterCollection::ConstIterator it = ph_printers.begin(); it != ph_printers.end(); ++it) { - for (const std::string preset_name : it->get_preset_names()) { + for (const std::string& preset_name : it->get_preset_names()) { Preset* preset = m_collection->find_preset(preset_name); if (!preset) continue; @@ -1031,7 +1087,7 @@ void TabPresetComboBox::update() wxBitmap* bmp = get_bmp(main_icon_name, main_icon_name, "", true, true, false); assert(bmp); - set_label_marker(Append(wxString::FromUTF8((it->get_full_name(preset_name) + (preset->is_dirty ? Preset::suffix_modified() : "")).c_str()), *bmp), LABEL_ITEM_PHYSICAL_PRINTER); + set_label_marker(Append(from_u8(it->get_full_name(preset_name) + suffix(preset)), *bmp), LABEL_ITEM_PHYSICAL_PRINTER); validate_selection(ph_printers.is_selected(it, preset_name)); } } @@ -1078,15 +1134,15 @@ void TabPresetComboBox::update_dirty() preset_name = PhysicalPrinter::get_preset_name(preset_name); } - const Preset* preset = m_collection->find_preset(preset_name, false); + Preset* preset = m_collection->find_preset(preset_name, false); if (preset) { - std::string new_label = preset->is_dirty ? preset->name + Preset::suffix_modified() : preset->name; + std::string new_label = preset->name + suffix(preset); if (marker == LABEL_ITEM_PHYSICAL_PRINTER) new_label = ph_printer_name + PhysicalPrinter::separator() + new_label; if (old_label != new_label) - SetString(ui_id, wxString::FromUTF8(new_label.c_str())); + SetString(ui_id, from_u8(new_label)); } } #ifdef __APPLE__ diff --git a/src/slic3r/GUI/PresetComboBoxes.hpp b/src/slic3r/GUI/PresetComboBoxes.hpp index d3cc6277dbd..6f41c95f4e1 100644 --- a/src/slic3r/GUI/PresetComboBoxes.hpp +++ b/src/slic3r/GUI/PresetComboBoxes.hpp @@ -30,8 +30,9 @@ class BitmapCache; // BitmapComboBox used to presets list on Sidebar and Tabs class PresetComboBox : public wxBitmapComboBox { + bool m_show_all { false }; public: - PresetComboBox(wxWindow* parent, Preset::Type preset_type, const wxSize& size = wxDefaultSize); + PresetComboBox(wxWindow* parent, Preset::Type preset_type, const wxSize& size = wxDefaultSize, PresetBundle* preset_bundle = nullptr); ~PresetComboBox(); enum LabelItemType { @@ -58,11 +59,16 @@ class PresetComboBox : public wxBitmapComboBox bool selection_is_changed_according_to_physical_printers(); void update(std::string select_preset); + // select preset which is selected in PreseBundle + void update_from_bundle(); void edit_physical_printer(); void add_physical_printer(); bool del_physical_printer(const wxString& note_string = wxEmptyString); + virtual wxString get_preset_name(const Preset& preset); + Preset::Type get_type() { return m_type; } + void show_all(bool show_all); virtual void update(); virtual void msw_rescale(); @@ -158,6 +164,7 @@ class PlaterPresetComboBox : public PresetComboBox void show_add_menu(); void show_edit_menu(); + wxString get_preset_name(const Preset& preset) override; void update() override; void msw_rescale() override; @@ -182,6 +189,7 @@ class TabPresetComboBox : public PresetComboBox show_incompatible = show_incompatible_presets; } + wxString get_preset_name(const Preset& preset) override; void update() override; void update_dirty(); void msw_rescale() override; diff --git a/src/slic3r/GUI/PrintHostDialogs.cpp b/src/slic3r/GUI/PrintHostDialogs.cpp index 75f6d265d84..cb4c2229926 100644 --- a/src/slic3r/GUI/PrintHostDialogs.cpp +++ b/src/slic3r/GUI/PrintHostDialogs.cpp @@ -333,7 +333,7 @@ void PrintHostQueueDialog::on_cancel(Event &evt) void PrintHostQueueDialog::get_active_jobs(std::vector>& ret) { int ic = job_list->GetItemCount(); - for (size_t i = 0; i < ic; i++) + for (int i = 0; i < ic; i++) { auto item = job_list->RowToItem(i); auto data = job_list->GetItemData(item); diff --git a/src/slic3r/GUI/SavePresetDialog.cpp b/src/slic3r/GUI/SavePresetDialog.cpp index 65bd3acb90c..e659f8e02a3 100644 --- a/src/slic3r/GUI/SavePresetDialog.cpp +++ b/src/slic3r/GUI/SavePresetDialog.cpp @@ -153,6 +153,11 @@ void SavePresetDialog::Item::update() m_valid_type = NoValid; } + if (m_valid_type == Valid && m_presets->get_preset_name_by_alias(m_preset_name) != m_preset_name) { + info_line = _L("The name cannot be the same as a preset alias name."); + m_valid_type = NoValid; + } + m_valid_label->SetLabel(info_line); m_valid_label->Show(!info_line.IsEmpty()); diff --git a/src/slic3r/GUI/Search.cpp b/src/slic3r/GUI/Search.cpp index d61fc05e02f..03aa11eb69b 100644 --- a/src/slic3r/GUI/Search.cpp +++ b/src/slic3r/GUI/Search.cpp @@ -117,18 +117,13 @@ void OptionsSearcher::append_options(DynamicPrintConfig* config, Preset::Type ty } } -// Wrap a string with ColorMarkerStart and ColorMarkerEnd symbols -static wxString wrap_string(const wxString& str) -{ - return wxString::Format("%c%s%c", ImGui::ColorMarkerStart, str, ImGui::ColorMarkerEnd); -} - // Mark a string using ColorMarkerStart and ColorMarkerEnd symbols -static std::wstring mark_string(const std::wstring &str, const std::vector &matches) +static std::wstring mark_string(const std::wstring &str, const std::vector &matches, Preset::Type type, PrinterTechnology pt) { std::wstring out; + out += marker_by_type(type, pt); if (matches.empty()) - out = str; + out += str; else { out.reserve(str.size() * 2); if (matches.front() > 0) @@ -181,10 +176,11 @@ bool OptionsSearcher::search(const std::string& search, bool force/* = false*/) bool full_list = search.empty(); std::wstring sep = L" : "; - auto get_label = [this, &sep](const Option& opt) + auto get_label = [this, &sep](const Option& opt, bool marked = true) { std::wstring out; - out += marker_by_type(opt.type, printer_technology); + if (marked) + out += marker_by_type(opt.type, printer_technology); const std::wstring *prev = nullptr; for (const std::wstring * const s : { view_params.category ? &opt.category_local : nullptr, @@ -198,10 +194,11 @@ bool OptionsSearcher::search(const std::string& search, bool force/* = false*/) return out; }; - auto get_label_english = [this, &sep](const Option& opt) + auto get_label_english = [this, &sep](const Option& opt, bool marked = true) { std::wstring out; - out += marker_by_type(opt.type, printer_technology); + if (marked) + out += marker_by_type(opt.type, printer_technology); const std::wstring*prev = nullptr; for (const std::wstring * const s : { view_params.category ? &opt.category : nullptr, @@ -234,8 +231,8 @@ bool OptionsSearcher::search(const std::string& search, bool force/* = false*/) std::wstring wsearch = boost::nowide::widen(search); boost::trim_left(wsearch); - std::wstring label = get_label(opt); - std::wstring label_english = get_label_english(opt); + std::wstring label = get_label(opt, false); + std::wstring label_english = get_label_english(opt, false); int score = std::numeric_limits::min(); int score2; matches.clear(); @@ -252,8 +249,8 @@ bool OptionsSearcher::search(const std::string& search, bool force/* = false*/) matches = std::move(matches2); score = score2; } - if (score > std::numeric_limits::min()) { - label = mark_string(label, matches); + if (score > 90/*std::numeric_limits::min()*/) { + label = mark_string(label, matches, opt.type, printer_technology); label += L" [" + std::to_wstring(score) + L"]";// add score value std::string label_u8 = into_u8(label); std::string label_plain = label_u8; @@ -329,6 +326,53 @@ const Option& OptionsSearcher::get_option(const std::string& opt_key) const return options[it - options.begin()]; } +static Option create_option(const std::string& opt_key, const wxString& label, Preset::Type type, const GroupAndCategory& gc) +{ + wxString suffix; + wxString suffix_local; + if (gc.category == "Machine limits") { + suffix = opt_key.back() == '1' ? L("Stealth") : L("Normal"); + suffix_local = " " + _(suffix); + suffix = " " + suffix; + } + + wxString category = gc.category; + if (type == Preset::TYPE_PRINTER && category.Contains("Extruder ")) { + std::string opt_idx = opt_key.substr(opt_key.find("#") + 1); + category = wxString::Format("%s %d", "Extruder", atoi(opt_idx.c_str()) + 1); + } + + return Option{ boost::nowide::widen(opt_key), type, + (label + suffix).ToStdWstring(), (_(label) + suffix_local).ToStdWstring(), + gc.group.ToStdWstring(), _(gc.group).ToStdWstring(), + gc.category.ToStdWstring(), GUI::Tab::translate_category(category, type).ToStdWstring() }; +} + +Option OptionsSearcher::get_option(const std::string& opt_key, const wxString& label, Preset::Type type) const +{ + auto it = std::lower_bound(options.begin(), options.end(), Option({ boost::nowide::widen(opt_key) })); + if(it->opt_key == boost::nowide::widen(opt_key)) + return options[it - options.begin()]; + if (groups_and_categories.find(opt_key) == groups_and_categories.end()) { + size_t pos = opt_key.find('#'); + if (pos == std::string::npos) + return options[it - options.begin()]; + + std::string zero_opt_key = opt_key.substr(0, pos + 1) + "0"; + + if(groups_and_categories.find(zero_opt_key) == groups_and_categories.end()) + return options[it - options.begin()]; + + return create_option(opt_key, label, type, groups_and_categories.at(zero_opt_key)); + } + + const GroupAndCategory& gc = groups_and_categories.at(opt_key); + if (gc.group.IsEmpty() || gc.category.IsEmpty()) + return options[it - options.begin()]; + + return create_option(opt_key, label, type, gc); +} + void OptionsSearcher::add_key(const std::string& opt_key, const wxString& group, const wxString& category) { groups_and_categories[opt_key] = GroupAndCategory{group, category}; diff --git a/src/slic3r/GUI/Search.hpp b/src/slic3r/GUI/Search.hpp index f8c9dffa6aa..1f2909564db 100644 --- a/src/slic3r/GUI/Search.hpp +++ b/src/slic3r/GUI/Search.hpp @@ -117,6 +117,7 @@ class OptionsSearcher const FoundOption& operator[](const size_t pos) const noexcept { return found[pos]; } const Option& get_option(size_t pos_in_filter) const; const Option& get_option(const std::string& opt_key) const; + Option get_option(const std::string& opt_key, const wxString& label, Preset::Type type) const; const std::vector& found_options() { return found; } const GroupAndCategory& get_group_and_category (const std::string& opt_key) { return groups_and_categories[opt_key]; } diff --git a/src/slic3r/GUI/Selection.cpp b/src/slic3r/GUI/Selection.cpp index cdd3ebe855c..1cb599fc808 100644 --- a/src/slic3r/GUI/Selection.cpp +++ b/src/slic3r/GUI/Selection.cpp @@ -2092,7 +2092,7 @@ static bool is_rotation_xy_synchronized(const Vec3d &rot_xyz_from, const Vec3d & static void verify_instances_rotation_synchronized(const Model &model, const GLVolumePtrs &volumes) { - for (size_t idx_object = 0; idx_object < model.objects.size(); ++idx_object) { + for (int idx_object = 0; idx_object < int(model.objects.size()); ++idx_object) { int idx_volume_first = -1; for (int i = 0; i < (int)volumes.size(); ++i) { if (volumes[i]->object_idx() == idx_object) { diff --git a/src/slic3r/GUI/SysInfoDialog.cpp b/src/slic3r/GUI/SysInfoDialog.cpp index 8d9572b47e2..606bb9f88df 100644 --- a/src/slic3r/GUI/SysInfoDialog.cpp +++ b/src/slic3r/GUI/SysInfoDialog.cpp @@ -14,6 +14,7 @@ #include "GUI_App.hpp" #include "MainFrame.hpp" #include "wxExtensions.hpp" +#include "../libslic3r/LibraryCheck.hpp" #ifdef _WIN32 // The standard Windows includes. @@ -149,7 +150,12 @@ SysInfoDialog::SysInfoDialog() "" "" "", bgr_clr_str, text_clr_str, text_clr_str, - get_mem_info(true) + "
" + wxGetApp().get_gl_info(true, true) + "
Eigen vectorization supported: " + Eigen::SimdInstructionSetsInUse()); + get_mem_info(true) + "
" + wxGetApp().get_gl_info(true, true) + "
Eigen vectorization supported: " + Eigen::SimdInstructionSetsInUse() +#ifdef WIN32 + + "

Blacklisted loaded libraries:
" + LibraryCheck::get_instance().get_blacklisted_string().c_str() +#endif + ); + m_opengl_info_html->SetPage(text); main_sizer->Add(m_opengl_info_html, 1, wxEXPAND | wxBOTTOM, 15); } diff --git a/src/slic3r/GUI/SysInfoDialog.hpp b/src/slic3r/GUI/SysInfoDialog.hpp index 3b145964842..070db61b2d7 100644 --- a/src/slic3r/GUI/SysInfoDialog.hpp +++ b/src/slic3r/GUI/SysInfoDialog.hpp @@ -29,7 +29,6 @@ class SysInfoDialog : public DPIDialog void onCopyToClipboard(wxEvent &); void onCloseDialog(wxEvent &); }; - } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 956fb78651f..c7aeacf3375 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -121,7 +121,7 @@ Tab::Tab(wxNotebook* parent, const wxString& title, Preset::Type type) : m_config_manipulation = get_config_manipulation(); - Bind(wxEVT_SIZE, ([this](wxSizeEvent &evt) { + Bind(wxEVT_SIZE, ([](wxSizeEvent &evt) { //for (auto page : m_pages) // if (! page.get()->IsShown()) // page->layout_valid = false; @@ -196,6 +196,7 @@ void Tab::create_preset_tab() m_scaled_buttons.reserve(6); m_scaled_buttons.reserve(2); + add_scaled_button(panel, &m_btn_compare_preset, "compare"); add_scaled_button(panel, &m_btn_save_preset, "save"); add_scaled_button(panel, &m_btn_delete_preset, "cross"); if (m_type == Preset::Type::TYPE_PRINTER) @@ -207,6 +208,7 @@ void Tab::create_preset_tab() add_scaled_button(panel, &m_btn_hide_incompatible_presets, m_bmp_hide_incompatible_presets.name()); + m_btn_compare_preset->SetToolTip(_L("Compare this preset with some another")); // TRN "Save current Settings" m_btn_save_preset->SetToolTip(from_u8((boost::format(_utf8(L("Save current %s"))) % m_title).str())); m_btn_delete_preset->SetToolTip(_(L("Delete this preset"))); @@ -235,19 +237,12 @@ void Tab::create_preset_tab() m_undo_btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent) { on_roll_back_value(); })); m_undo_to_sys_btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent) { on_roll_back_value(true); })); - m_question_btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent) - { + m_question_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent) { ButtonsDescription dlg(this, m_icon_descriptions); - if (dlg.ShowModal() == wxID_OK) { - // Colors for ui "decoration" - for (Tab *tab : wxGetApp().tabs_list) { - tab->m_sys_label_clr = wxGetApp().get_label_clr_sys(); - tab->m_modified_label_clr = wxGetApp().get_label_clr_modified(); - tab->update_labels_colour(); - } - } - })); - m_search_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent) { wxGetApp().plater()->search(false); }); + if (dlg.ShowModal() == wxID_OK) + wxGetApp().update_label_colours(); + }); + m_search_btn->Bind(wxEVT_BUTTON, [](wxCommandEvent) { wxGetApp().plater()->search(false); }); // Colors for ui "decoration" m_sys_label_clr = wxGetApp().get_label_clr_sys(); @@ -278,6 +273,9 @@ void Tab::create_preset_tab() m_hsizer->Add(m_undo_btn, 0, wxALIGN_CENTER_VERTICAL); m_hsizer->AddSpacer(int(32 * scale_factor)); m_hsizer->Add(m_search_btn, 0, wxALIGN_CENTER_VERTICAL); + m_hsizer->AddSpacer(int(8*scale_factor)); + m_hsizer->Add(m_btn_compare_preset, 0, wxALIGN_CENTER_VERTICAL); + m_hsizer->AddSpacer(int(16*scale_factor)); // m_hsizer->AddStretchSpacer(32); // StretchSpacer has a strange behavior under OSX, so // There is used just additional sizer for m_mode_sizer with right alignment @@ -345,6 +343,7 @@ void Tab::create_preset_tab() m_page_view->SetScrollbars(1, 20, 1, 2); m_hsizer->Add(m_page_view, 1, wxEXPAND | wxLEFT, 5); + m_btn_compare_preset->Bind(wxEVT_BUTTON, ([this](wxCommandEvent e) { compare_preset(); })); m_btn_save_preset->Bind(wxEVT_BUTTON, ([this](wxCommandEvent e) { save_preset(); })); m_btn_delete_preset->Bind(wxEVT_BUTTON, ([this](wxCommandEvent e) { delete_preset(); })); m_btn_hide_incompatible_presets->Bind(wxEVT_BUTTON, ([this](wxCommandEvent e) { @@ -418,11 +417,6 @@ Slic3r::GUI::PageShp Tab::add_options_page(const wxString& title, const std::str } } // Initialize the page. -#ifdef __WXOSX__ - auto panel = m_tmp_panel; -#else - auto panel = this; -#endif PageShp page(new Page(m_page_view, title, icon_idx)); // page->SetBackgroundStyle(wxBG_STYLE_SYSTEM); #ifdef __WINDOWS__ @@ -489,10 +483,15 @@ void Tab::OnActivate() Refresh(); } -void Tab::update_labels_colour() +void Tab::update_label_colours() { + if (m_sys_label_clr == wxGetApp().get_label_clr_sys() && m_modified_label_clr == wxGetApp().get_label_clr_modified()) + return; + m_sys_label_clr = wxGetApp().get_label_clr_sys(); + m_modified_label_clr = wxGetApp().get_label_clr_modified(); + //update options "decoration" - for (const auto opt : m_options_list) + for (const auto& opt : m_options_list) { const wxColour *color = &m_sys_label_clr; @@ -536,11 +535,13 @@ void Tab::update_labels_colour() } cur_item = m_treectrl->GetNextVisible(cur_item); } + + decorate(); } void Tab::decorate() { - for (const auto opt : m_options_list) + for (const auto& opt : m_options_list) { Field* field = nullptr; wxColour* colored_label_clr = nullptr; @@ -611,7 +612,7 @@ void Tab::update_changed_ui() const bool deep_compare = (m_type == Slic3r::Preset::TYPE_PRINTER || m_type == Slic3r::Preset::TYPE_SLA_MATERIAL); auto dirty_options = m_presets->current_dirty_options(deep_compare); auto nonsys_options = m_presets->current_different_from_parent_options(deep_compare); - if (m_type == Slic3r::Preset::TYPE_PRINTER) { + if (m_type == Preset::TYPE_PRINTER && static_cast(this)->m_printer_technology == ptFFF) { TabPrinter* tab = static_cast(this); if (tab->m_initial_extruders_count != tab->m_extruders_count) dirty_options.emplace_back("extruders_count"); @@ -638,7 +639,7 @@ void Tab::init_options_list() if (!m_options_list.empty()) m_options_list.clear(); - for (const auto opt_key : m_config->keys()) + for (const std::string& opt_key : m_config->keys()) m_options_list.emplace(opt_key, m_opt_status_value); } @@ -655,7 +656,7 @@ void TabPrinter::init_options_list() if (!m_options_list.empty()) m_options_list.clear(); - for (const auto opt_key : m_config->keys()) + for (const std::string& opt_key : m_config->keys()) { if (opt_key == "bed_shape" || opt_key == "thumbnails") { m_options_list.emplace(opt_key, m_opt_status_value); @@ -672,7 +673,8 @@ void TabPrinter::init_options_list() default: m_options_list.emplace(opt_key, m_opt_status_value); break; } } - m_options_list.emplace("extruders_count", m_opt_status_value); + if (m_printer_technology == ptFFF) + m_options_list.emplace("extruders_count", m_opt_status_value); } void TabPrinter::msw_rescale() @@ -707,7 +709,7 @@ void TabSLAMaterial::init_options_list() if (!m_options_list.empty()) m_options_list.clear(); - for (const auto opt_key : m_config->keys()) + for (const std::string& opt_key : m_config->keys()) { if (opt_key == "compatible_prints" || opt_key == "compatible_printers") { m_options_list.emplace(opt_key, m_opt_status_value); @@ -999,9 +1001,7 @@ void Tab::sys_color_changed() m_treectrl->AssignImageList(m_icons); // Colors for ui "decoration" - m_sys_label_clr = wxGetApp().get_label_clr_sys(); - m_modified_label_clr = wxGetApp().get_label_clr_modified(); - update_labels_colour(); + update_label_colours(); // update options_groups if (m_active_page) @@ -1436,6 +1436,18 @@ void TabPrint::build() optgroup->append_single_option_line("seam_position", category_path + "seam-position"); optgroup->append_single_option_line("external_perimeters_first", category_path + "external-perimeters-first"); + optgroup = page->new_optgroup(L("Fuzzy skin (experimental)")); + Option option = optgroup->get_option("fuzzy_skin_perimeter_mode"); + option.opt.width = 30; + optgroup->append_single_option_line(option); +#if 0 + option = optgroup->get_option("fuzzy_skin_shape"); + option.opt.width = 30; + optgroup->append_single_option_line(option); +#endif + optgroup->append_single_option_line(optgroup->get_option("fuzzy_skin_thickness")); + optgroup->append_single_option_line(optgroup->get_option("fuzzy_skin_point_dist")); + page = add_options_page(L("Infill"), "infill"); category_path = "infill_42#"; optgroup = page->new_optgroup(L("Infill")); @@ -1474,7 +1486,9 @@ void TabPrint::build() optgroup->append_single_option_line("min_skirt_length", category_path + "skirt"); optgroup = page->new_optgroup(L("Brim")); + optgroup->append_single_option_line("brim_type", category_path + "brim"); optgroup->append_single_option_line("brim_width", category_path + "brim"); + optgroup->append_single_option_line("brim_offset", category_path + "brim"); page = add_options_page(L("Support material"), "support"); category_path = "support-material_1698#"; @@ -1603,7 +1617,7 @@ void TabPrint::build() optgroup = page->new_optgroup(L("Output file")); optgroup->append_single_option_line("gcode_comments"); optgroup->append_single_option_line("gcode_label_objects"); - Option option = optgroup->get_option("output_filename_format"); + option = optgroup->get_option("output_filename_format"); option.opt.full_width = true; optgroup->append_single_option_line(option); @@ -1718,7 +1732,7 @@ void TabFilament::add_filament_overrides_page() line.near_label_widget = [this, optgroup, opt_key, opt_index](wxWindow* parent) { wxCheckBox* check_box = new wxCheckBox(parent, wxID_ANY, ""); - check_box->Bind(wxEVT_CHECKBOX, [this, optgroup, opt_key, opt_index](wxCommandEvent& evt) { + check_box->Bind(wxEVT_CHECKBOX, [optgroup, opt_key, opt_index](wxCommandEvent& evt) { const bool is_checked = evt.IsChecked(); Field* field = optgroup->get_fieldc(opt_key, opt_index); if (field != nullptr) { @@ -2063,11 +2077,20 @@ bool Tab::current_preset_is_dirty() void TabPrinter::build() { m_presets = &m_preset_bundle->printers; - load_initial_data(); - m_printer_technology = m_presets->get_selected_preset().printer_technology(); - m_presets->get_selected_preset().printer_technology() == ptSLA ? build_sla() : build_fff(); + // For DiffPresetDialog we use options list which is saved in Searcher class. + // Options for the Searcher is added in the moment of pages creation. + // So, build first of all printer pages for non-selected printer technology... + std::string def_preset_name = "- default " + std::string(m_printer_technology == ptSLA ? "FFF" : "SLA") + " -"; + m_config = &m_presets->find_preset(def_preset_name)->config; + m_printer_technology == ptSLA ? build_fff() : build_sla(); + if (m_printer_technology == ptSLA) + m_extruders_count_old = 0;// revert this value + + // ... and than for selected printer technology + load_initial_data(); + m_printer_technology == ptSLA ? build_sla() : build_fff(); } void TabPrinter::build_print_host_upload_group(Page* page) @@ -2102,7 +2125,8 @@ void TabPrinter::build_fff() m_initial_extruders_count = m_extruders_count = nozzle_diameter->values.size(); wxGetApp().sidebar().update_objects_list_extruder_column(m_initial_extruders_count); - const Preset* parent_preset = m_presets->get_selected_preset_parent(); + const Preset* parent_preset = m_printer_technology == ptSLA ? nullptr // just for first build, if SLA printer preset is selected + : m_presets->get_selected_preset_parent(); m_sys_extruders_count = parent_preset == nullptr ? 0 : static_cast(parent_preset->config.option("nozzle_diameter"))->values.size(); @@ -2286,7 +2310,7 @@ void TabPrinter::build_fff() build_preset_description_line(optgroup.get()); - build_unregular_pages(); + build_unregular_pages(true); } void TabPrinter::build_sla() @@ -2392,7 +2416,9 @@ void TabPrinter::append_option_line(ConfigOptionsGroupShp optgroup, const std::s auto option = optgroup->get_option(opt_key, 0); auto line = Line{ option.opt.full_label, "" }; line.append_option(option); - if (m_use_silent_mode) + if (m_use_silent_mode + || m_printer_technology == ptSLA // just for first build, if SLA printer preset is selected + ) line.append_option(optgroup->get_option(opt_key, 1)); optgroup->append_line(line); } @@ -2467,7 +2493,7 @@ PageShp TabPrinter::build_kinematics_page() * but "Machine limits" and "Single extruder MM setup" too * (These pages can changes according to the another values of a current preset) * */ -void TabPrinter::build_unregular_pages() +void TabPrinter::build_unregular_pages(bool from_initial_build/* = false*/) { size_t n_before_extruders = 2; // Count of pages before Extruder pages bool is_marlin_flavor = m_config->option>("gcode_flavor")->value == gcfMarlin; @@ -2478,18 +2504,6 @@ void TabPrinter::build_unregular_pages() * */ Freeze(); -#ifdef __WXMSW__ - /* Workaround for correct layout of controls inside the created page: - * In some _strange_ way we should we should imitate page resizing. - */ -/* auto layout_page = [this](PageShp page) - { - const wxSize& sz = page->GetSize(); - page->SetSize(sz.x + 1, sz.y + 1); - page->SetSize(sz); - };*/ -#endif //__WXMSW__ - // Add/delete Kinematics page according to is_marlin_flavor size_t existed_page = 0; for (size_t i = n_before_extruders; i < m_pages.size(); ++i) // first make sure it's not there already @@ -2501,12 +2515,12 @@ void TabPrinter::build_unregular_pages() break; } - if (existed_page < n_before_extruders && is_marlin_flavor) { + if (existed_page < n_before_extruders && (is_marlin_flavor || from_initial_build)) { auto page = build_kinematics_page(); -#ifdef __WXMSW__ -// layout_page(page); -#endif - m_pages.insert(m_pages.begin() + n_before_extruders, page); + if (from_initial_build && !is_marlin_flavor) + page->clear(); + else + m_pages.insert(m_pages.begin() + n_before_extruders, page); } if (is_marlin_flavor) @@ -2524,7 +2538,8 @@ void TabPrinter::build_unregular_pages() } m_has_single_extruder_MM_page = false; } - if (m_extruders_count > 1 && m_config->opt_bool("single_extruder_multi_material") && !m_has_single_extruder_MM_page) { + if (from_initial_build || + (m_extruders_count > 1 && m_config->opt_bool("single_extruder_multi_material") && !m_has_single_extruder_MM_page)) { // create a page, but pretend it's an extruder page, so we can add it to m_pages ourselves auto page = add_options_page(L("Single extruder MM setup"), "printer", true); auto optgroup = page->new_optgroup(L("Single extruder multimaterial parameters")); @@ -2533,8 +2548,12 @@ void TabPrinter::build_unregular_pages() optgroup->append_single_option_line("parking_pos_retraction"); optgroup->append_single_option_line("extra_loading_move"); optgroup->append_single_option_line("high_current_on_filament_swap"); - m_pages.insert(m_pages.end() - n_after_single_extruder_MM, page); - m_has_single_extruder_MM_page = true; + if (from_initial_build) + page->clear(); + else { + m_pages.insert(m_pages.end() - n_after_single_extruder_MM, page); + m_has_single_extruder_MM_page = true; + } } // Build missed extruder pages @@ -2639,10 +2658,6 @@ void TabPrinter::build_unregular_pages() line = optgroup->create_single_option_line("extruder_colour", wxEmptyString, extruder_idx); line.append_widget(reset_to_filament_color); optgroup->append_line(line); - -#ifdef __WXMSW__ -// layout_page(page); -#endif } // # remove extra pages @@ -2653,6 +2668,10 @@ void TabPrinter::build_unregular_pages() Thaw(); m_extruders_count_old = m_extruders_count; + + if (from_initial_build && m_printer_technology == ptSLA) + return; // next part of code is no needed to execute at this moment + rebuild_page_tree(); // Reload preset pages with current configuration values @@ -2993,8 +3012,8 @@ void Tab::update_btns_enabling() // we can delete any preset from the physical printer // and any user preset const Preset& preset = m_presets->get_edited_preset(); - m_btn_delete_preset->Show(m_type == Preset::TYPE_PRINTER && m_preset_bundle->physical_printers.has_selection() || - !preset.is_default && !preset.is_system); + m_btn_delete_preset->Show((m_type == Preset::TYPE_PRINTER && m_preset_bundle->physical_printers.has_selection()) + || (!preset.is_default && !preset.is_system)); if (m_btn_edit_ph_printer) m_btn_edit_ph_printer->SetToolTip( m_preset_bundle->physical_printers.has_selection() ? @@ -3184,6 +3203,9 @@ void Tab::select_preset(std::string preset_name, bool delete_current /*=false*/, load_current_preset(); } + + if (technology_changed) + wxGetApp().mainframe->diff_dialog.update_presets(); } // If the current preset is dirty, the user is asked whether the changes may be discarded. @@ -3334,7 +3356,9 @@ bool Tab::tree_sel_change_delayed() wxCheckForInterrupt(m_treectrl); if (m_page_switch_planned) throw UIBuildCanceled(); -#endif // WIN32 +#else // WIN32 + (void)this; // silence warning +#endif }); try { @@ -3371,6 +3395,11 @@ void Tab::OnKeyDown(wxKeyEvent& event) event.Skip(); } +void Tab::compare_preset() +{ + wxGetApp().mainframe->diff_dialog.show(m_type); +} + // Save the current preset into file. // This removes the "dirty" flag of the preset, possibly creates a new preset under a new name, // and activates the new preset. @@ -3440,6 +3469,9 @@ void Tab::save_preset(std::string name /*= ""*/, bool detach) for (Preset::Type preset_type : dependent) wxGetApp().get_tab(preset_type)->update_tab_ui(); } + + // update preset comboboxes in DiffPresetDlg + wxGetApp().mainframe->diff_dialog.update_presets(m_type); } // Called for a currently selected preset. @@ -3473,19 +3505,23 @@ void Tab::delete_preset() std::vector ph_printers_only = physical_printers.get_printers_with_only_preset(current_preset.name); if (!ph_printers.empty()) { - msg += _L("The physical printer(s) below is based on the preset, you are going to delete."); + msg += _L_PLURAL("The physical printer below is based on the preset, you are going to delete.", + "The physical printers below are based on the preset, you are going to delete.", ph_printers.size()); for (const std::string& printer : ph_printers) msg += "\n \"" + from_u8(printer) + "\","; msg.RemoveLast(); - msg += "\n" + _L("Note, that selected preset will be deleted from this/those printer(s) too.")+ "\n\n"; + msg += "\n" + _L_PLURAL("Note, that selected preset will be deleted from this printer too.", + "Note, that selected preset will be deleted from these printers too.", ph_printers.size()) + "\n\n"; } if (!ph_printers_only.empty()) { - msg += _L("The physical printer(s) below is based only on the preset, you are going to delete."); + msg += _L_PLURAL("The physical printer below is based only on the preset, you are going to delete.", + "The physical printers below are based only on the preset, you are going to delete.", ph_printers_only.size()); for (const std::string& printer : ph_printers_only) msg += "\n \"" + from_u8(printer) + "\","; msg.RemoveLast(); - msg += "\n" + _L("Note, that this/those printer(s) will be deleted after deleting of the selected preset.") + "\n\n"; + msg += "\n" + _L_PLURAL("Note, that this printer will be deleted after deleting of the selected preset.", + "Note, that these printers will be deleted after deleting of the selected preset.", ph_printers_only.size()) + "\n\n"; } } @@ -3894,7 +3930,7 @@ ConfigOptionsGroupShp Page::new_optgroup(const wxString& title, int noncommon_la #else auto tab = parent()->GetParent();// GetParent(); #endif - optgroup->m_on_change = [this, tab](t_config_option_key opt_key, boost::any value) { + optgroup->m_on_change = [tab](t_config_option_key opt_key, boost::any value) { //! This function will be called from OptionGroup. //! Using of CallAfter is redundant. //! And in some cases it causes update() function to be recalled again @@ -3904,21 +3940,21 @@ ConfigOptionsGroupShp Page::new_optgroup(const wxString& title, int noncommon_la //! }); }; - optgroup->m_get_initial_config = [this, tab]() { + optgroup->m_get_initial_config = [tab]() { DynamicPrintConfig config = static_cast(tab)->m_presets->get_selected_preset().config; return config; }; - optgroup->m_get_sys_config = [this, tab]() { + optgroup->m_get_sys_config = [tab]() { DynamicPrintConfig config = static_cast(tab)->m_presets->get_selected_preset_parent()->config; return config; }; - optgroup->have_sys_config = [this, tab]() { + optgroup->have_sys_config = [tab]() { return static_cast(tab)->m_presets->get_selected_preset_parent() != nullptr; }; - optgroup->rescale_extra_column_item = [this](wxWindow* win) { + optgroup->rescale_extra_column_item = [](wxWindow* win) { auto *ctrl = dynamic_cast(win); if (ctrl == nullptr) return; diff --git a/src/slic3r/GUI/Tab.hpp b/src/slic3r/GUI/Tab.hpp index 927787933e3..d341b7360cf 100644 --- a/src/slic3r/GUI/Tab.hpp +++ b/src/slic3r/GUI/Tab.hpp @@ -112,6 +112,7 @@ class Tab: public wxPanel const wxString m_title; TabPresetComboBox* m_presets_choice; ScalableButton* m_search_btn; + ScalableButton* m_btn_compare_preset; ScalableButton* m_btn_save_preset; ScalableButton* m_btn_delete_preset; ScalableButton* m_btn_edit_ph_printer {nullptr}; @@ -290,12 +291,13 @@ class Tab: public wxPanel void OnTreeSelChange(wxTreeEvent& event); void OnKeyDown(wxKeyEvent& event); + void compare_preset(); void save_preset(std::string name = std::string(), bool detach = false); void delete_preset(); void toggle_show_hide_incompatible(); void update_show_hide_incompatible_button(); void update_ui_from_settings(); - void update_labels_colour(); + void update_label_colours(); void decorate(); void update_changed_ui(); void get_sys_and_mod_flags(const std::string& opt_key, bool& sys_page, bool& modified_page); @@ -381,7 +383,6 @@ class TabPrint : public Tab private: ogStaticText* m_recommended_thin_wall_thickness_description_line = nullptr; ogStaticText* m_top_bottom_shell_thickness_explanation = nullptr; - bool m_support_material_overhangs_queried = false; }; class TabFilament : public Tab @@ -456,7 +457,7 @@ class TabPrinter : public Tab void update_pages(); // update m_pages according to printer technology void extruders_count_changed(size_t extruders_count); PageShp build_kinematics_page(); - void build_unregular_pages(); + void build_unregular_pages(bool from_initial_build = false); void on_preset_loaded() override; void init_options_list() override; void msw_rescale() override; diff --git a/src/slic3r/GUI/UnsavedChangesDialog.cpp b/src/slic3r/GUI/UnsavedChangesDialog.cpp index b4b38b4bd2a..68b115f092f 100644 --- a/src/slic3r/GUI/UnsavedChangesDialog.cpp +++ b/src/slic3r/GUI/UnsavedChangesDialog.cpp @@ -7,6 +7,8 @@ #include #include +#include + #include "libslic3r/PrintConfig.hpp" #include "libslic3r/PresetBundle.hpp" #include "format.hpp" @@ -22,6 +24,7 @@ //#include "fts_fuzzy_match.h" #include "BitmapCache.hpp" +#include "PresetComboBoxes.hpp" using boost::optional; @@ -36,7 +39,7 @@ namespace Slic3r { namespace GUI { // ---------------------------------------------------------------------------- -// ModelNode: a node inside UnsavedChangesModel +// ModelNode: a node inside DiffModel // ---------------------------------------------------------------------------- static const std::map type_icon_names = { @@ -215,21 +218,15 @@ void ModelNode::UpdateIcons() // ---------------------------------------------------------------------------- -// UnsavedChangesModel +// DiffModel // ---------------------------------------------------------------------------- -UnsavedChangesModel::UnsavedChangesModel(wxWindow* parent) : +DiffModel::DiffModel(wxWindow* parent) : m_parent_win(parent) { } -UnsavedChangesModel::~UnsavedChangesModel() -{ - for (ModelNode* preset_node : m_preset_nodes) - delete preset_node; -} - -wxDataViewItem UnsavedChangesModel::AddPreset(Preset::Type type, wxString preset_name, PrinterTechnology pt) +wxDataViewItem DiffModel::AddPreset(Preset::Type type, wxString preset_name, PrinterTechnology pt) { // "color" strings color_string(preset_name, def_text_color()); @@ -245,7 +242,7 @@ wxDataViewItem UnsavedChangesModel::AddPreset(Preset::Type type, wxString preset return child; } -ModelNode* UnsavedChangesModel::AddOption(ModelNode* group_node, wxString option_name, wxString old_value, wxString new_value) +ModelNode* DiffModel::AddOption(ModelNode* group_node, wxString option_name, wxString old_value, wxString new_value) { group_node->Append(std::make_unique(group_node, option_name, old_value, new_value)); ModelNode* option = group_node->GetChildren().back().get(); @@ -256,7 +253,7 @@ ModelNode* UnsavedChangesModel::AddOption(ModelNode* group_node, wxString option return option; } -ModelNode* UnsavedChangesModel::AddOptionWithGroup(ModelNode* category_node, wxString group_name, wxString option_name, wxString old_value, wxString new_value) +ModelNode* DiffModel::AddOptionWithGroup(ModelNode* category_node, wxString group_name, wxString option_name, wxString old_value, wxString new_value) { category_node->Append(std::make_unique(category_node, group_name)); ModelNode* group_node = category_node->GetChildren().back().get(); @@ -265,7 +262,7 @@ ModelNode* UnsavedChangesModel::AddOptionWithGroup(ModelNode* category_node, wxS return AddOption(group_node, option_name, old_value, new_value); } -ModelNode* UnsavedChangesModel::AddOptionWithGroupAndCategory(ModelNode* preset_node, wxString category_name, wxString group_name, +ModelNode* DiffModel::AddOptionWithGroupAndCategory(ModelNode* preset_node, wxString category_name, wxString group_name, wxString option_name, wxString old_value, wxString new_value, const std::string category_icon_name) { preset_node->Append(std::make_unique(preset_node, category_name, category_icon_name)); @@ -275,7 +272,7 @@ ModelNode* UnsavedChangesModel::AddOptionWithGroupAndCategory(ModelNode* preset_ return AddOptionWithGroup(category_node, group_name, option_name, old_value, new_value); } -wxDataViewItem UnsavedChangesModel::AddOption(Preset::Type type, wxString category_name, wxString group_name, wxString option_name, +wxDataViewItem DiffModel::AddOption(Preset::Type type, wxString category_name, wxString group_name, wxString option_name, wxString old_value, wxString new_value, const std::string category_icon_name) { // "color" strings @@ -288,7 +285,7 @@ wxDataViewItem UnsavedChangesModel::AddOption(Preset::Type type, wxString catego make_string_bold(group_name); // add items - for (ModelNode* preset : m_preset_nodes) + for (std::unique_ptr& preset : m_preset_nodes) if (preset->type() == type) { for (std::unique_ptr &category : preset->GetChildren()) @@ -301,7 +298,7 @@ wxDataViewItem UnsavedChangesModel::AddOption(Preset::Type type, wxString catego return wxDataViewItem((void*)AddOptionWithGroup(category.get(), group_name, option_name, old_value, new_value)); } - return wxDataViewItem((void*)AddOptionWithGroupAndCategory(preset, category_name, group_name, option_name, old_value, new_value, category_icon_name)); + return wxDataViewItem((void*)AddOptionWithGroupAndCategory(preset.get(), category_name, group_name, option_name, old_value, new_value, category_icon_name)); } return wxDataViewItem(nullptr); @@ -336,7 +333,7 @@ static void update_parents(ModelNode* node) } } -void UnsavedChangesModel::UpdateItemEnabling(wxDataViewItem item) +void DiffModel::UpdateItemEnabling(wxDataViewItem item) { assert(item.IsOk()); ModelNode* node = static_cast(item.GetID()); @@ -346,14 +343,14 @@ void UnsavedChangesModel::UpdateItemEnabling(wxDataViewItem item) update_parents(node); } -bool UnsavedChangesModel::IsEnabledItem(const wxDataViewItem& item) +bool DiffModel::IsEnabledItem(const wxDataViewItem& item) { assert(item.IsOk()); ModelNode* node = static_cast(item.GetID()); return node->IsToggled(); } -void UnsavedChangesModel::GetValue(wxVariant& variant, const wxDataViewItem& item, unsigned int col) const +void DiffModel::GetValue(wxVariant& variant, const wxDataViewItem& item, unsigned int col) const { assert(item.IsOk()); @@ -386,11 +383,11 @@ void UnsavedChangesModel::GetValue(wxVariant& variant, const wxDataViewItem& ite #endif //__linux__ default: - wxLogError("UnsavedChangesModel::GetValue: wrong column %d", col); + wxLogError("DiffModel::GetValue: wrong column %d", col); } } -bool UnsavedChangesModel::SetValue(const wxVariant& variant, const wxDataViewItem& item, unsigned int col) +bool DiffModel::SetValue(const wxVariant& variant, const wxDataViewItem& item, unsigned int col) { assert(item.IsOk()); @@ -440,12 +437,12 @@ bool UnsavedChangesModel::SetValue(const wxVariant& variant, const wxDataViewIte return true; } #endif //__linux__ default: - wxLogError("UnsavedChangesModel::SetValue: wrong column"); + wxLogError("DiffModel::SetValue: wrong column"); } return false; } -bool UnsavedChangesModel::IsEnabled(const wxDataViewItem& item, unsigned int col) const +bool DiffModel::IsEnabled(const wxDataViewItem& item, unsigned int col) const { assert(item.IsOk()); if (col == colToggle) @@ -455,7 +452,7 @@ bool UnsavedChangesModel::IsEnabled(const wxDataViewItem& item, unsigned int col return (static_cast(item.GetID()))->IsToggled(); } -wxDataViewItem UnsavedChangesModel::GetParent(const wxDataViewItem& item) const +wxDataViewItem DiffModel::GetParent(const wxDataViewItem& item) const { // the invisible root node has no parent if (!item.IsOk()) @@ -463,14 +460,13 @@ wxDataViewItem UnsavedChangesModel::GetParent(const wxDataViewItem& item) const ModelNode* node = static_cast(item.GetID()); - // "MyMusic" also has no parent if (node->IsRoot()) return wxDataViewItem(nullptr); return wxDataViewItem((void*)node->GetParent()); } -bool UnsavedChangesModel::IsContainer(const wxDataViewItem& item) const +bool DiffModel::IsContainer(const wxDataViewItem& item) const { // the invisble root node can have children if (!item.IsOk()) @@ -480,23 +476,19 @@ bool UnsavedChangesModel::IsContainer(const wxDataViewItem& item) const return node->IsContainer(); } -unsigned int UnsavedChangesModel::GetChildren(const wxDataViewItem& parent, wxDataViewItemArray& array) const +unsigned int DiffModel::GetChildren(const wxDataViewItem& parent, wxDataViewItemArray& array) const { - ModelNode* node = (ModelNode*)parent.GetID(); - if (!node) { - for (auto preset_node : m_preset_nodes) - array.Add(wxDataViewItem((void*)preset_node)); - return m_preset_nodes.size(); - } + ModelNode* parent_node = (ModelNode*)parent.GetID(); - for (std::unique_ptr &child : node->GetChildren()) + const ModelNodePtrArray& children = parent_node ? parent_node->GetChildren() : m_preset_nodes; + for (const std::unique_ptr& child : children) array.Add(wxDataViewItem((void*)child.get())); - return node->GetChildCount(); + return array.size(); } -wxString UnsavedChangesModel::GetColumnType(unsigned int col) const +wxString DiffModel::GetColumnType(unsigned int col) const { switch (col) { @@ -520,12 +512,232 @@ static void rescale_children(ModelNode* parent) } } -void UnsavedChangesModel::Rescale() +void DiffModel::Rescale() { - for (ModelNode* node : m_preset_nodes) { + for (std::unique_ptr &node : m_preset_nodes) { node->UpdateIcons(); - rescale_children(node); + rescale_children(node.get()); + } +} + +wxDataViewItem DiffModel::Delete(const wxDataViewItem& item) +{ + auto ret_item = wxDataViewItem(nullptr); + ModelNode* node = static_cast(item.GetID()); + if (!node) // happens if item.IsOk()==false + return ret_item; + + // first remove the node from the parent's array of children; + // NOTE: m_preset_nodes is only a vector of _pointers_ + // thus removing the node from it doesn't result in freeing it + ModelNodePtrArray& children = node->GetChildren(); + // Delete all children + while (!children.empty()) + Delete(wxDataViewItem(children.back().get())); + + auto node_parent = node->GetParent(); + wxDataViewItem parent(node_parent); + + ModelNodePtrArray& parents_children = node_parent ? node_parent->GetChildren() : m_preset_nodes; + auto it = find_if(parents_children.begin(), parents_children.end(), + [node](std::unique_ptr& child) { return child.get() == node; }); + assert(it != parents_children.end()); + it = parents_children.erase(it); + + if (it != parents_children.end()) + ret_item = wxDataViewItem(it->get()); + + // set m_container to FALSE if parent has no child + if (node_parent) { +#ifndef __WXGTK__ + if (node_parent->GetChildCount() == 0) + node_parent->m_container = false; +#endif //__WXGTK__ + ret_item = parent; + } + + // notify control + ItemDeleted(parent, item); + return ret_item; +} + +void DiffModel::Clear() +{ + while (!m_preset_nodes.empty()) + Delete(wxDataViewItem(m_preset_nodes.back().get())); +} + + +static std::string get_pure_opt_key(std::string opt_key) +{ + int pos = opt_key.find("#"); + if (pos > 0) + boost::erase_tail(opt_key, opt_key.size() - pos); + return opt_key; +} + +// ---------------------------------------------------------------------------- +// DiffViewCtrl +// ---------------------------------------------------------------------------- + +DiffViewCtrl::DiffViewCtrl(wxWindow* parent, wxSize size) + : wxDataViewCtrl(parent, wxID_ANY, wxDefaultPosition, size, wxBORDER_SIMPLE | wxDV_VARIABLE_LINE_HEIGHT | wxDV_ROW_LINES), + m_em_unit(em_unit(parent)) +{ + model = new DiffModel(parent); + this->AssociateModel(model); + model->SetAssociatedControl(this); + + this->Bind(wxEVT_DATAVIEW_ITEM_CONTEXT_MENU, &DiffViewCtrl::context_menu, this); + this->Bind(wxEVT_DATAVIEW_ITEM_ACTIVATED, &DiffViewCtrl::context_menu, this); + this->Bind(wxEVT_DATAVIEW_ITEM_VALUE_CHANGED, &DiffViewCtrl::item_value_changed, this); +} + +void DiffViewCtrl::AppendBmpTextColumn(const wxString& label, unsigned model_column, int width, bool set_expander/* = false*/) +{ + m_columns_width.emplace(this->GetColumnCount(), width); +#ifdef __linux__ + wxDataViewIconTextRenderer* rd = new wxDataViewIconTextRenderer(); +#ifdef SUPPORTS_MARKUP + rd->EnableMarkup(true); +#endif + wxDataViewColumn* column = new wxDataViewColumn(label, rd, model_column, width, wxALIGN_TOP, wxDATAVIEW_COL_RESIZABLE | wxDATAVIEW_CELL_INERT); +#else + wxDataViewColumn* column = new wxDataViewColumn(label, new BitmapTextRenderer(true, wxDATAVIEW_CELL_INERT), model_column, width * m_em_unit, wxALIGN_TOP, wxDATAVIEW_COL_RESIZABLE); +#endif //__linux__ + this->AppendColumn(column); + if (set_expander) + this->SetExpanderColumn(column); + +} + +void DiffViewCtrl::AppendToggleColumn_(const wxString& label, unsigned model_column, int width) +{ + m_columns_width.emplace(this->GetColumnCount(), width); + AppendToggleColumn(label, model_column, wxDATAVIEW_CELL_ACTIVATABLE, width * m_em_unit); +} + +void DiffViewCtrl::Rescale(int em /*= 0*/) +{ + if (em > 0) { + for (auto item : m_columns_width) + GetColumn(item.first)->SetWidth(item.second * em); + m_em_unit = em; + } + + model->Rescale(); + Refresh(); +} + + +void DiffViewCtrl::Append( const std::string& opt_key, Preset::Type type, + wxString category_name, wxString group_name, wxString option_name, + wxString old_value, wxString new_value, const std::string category_icon_name) +{ + ItemData item_data = { opt_key, option_name, old_value, new_value, type }; + + wxString old_val = get_short_string(item_data.old_val); + wxString new_val = get_short_string(item_data.new_val); + if (old_val != item_data.old_val || new_val != item_data.new_val) + item_data.is_long = true; + + m_items_map.emplace(model->AddOption(type, category_name, group_name, option_name, old_val, new_val, category_icon_name), item_data); + +} + +void DiffViewCtrl::Clear() +{ + model->Clear(); + m_items_map.clear(); +} + +wxString DiffViewCtrl::get_short_string(wxString full_string) +{ + size_t max_len = 30; + if (full_string.IsEmpty() || full_string.StartsWith("#") || + (full_string.Find("\n") == wxNOT_FOUND && full_string.Length() < max_len)) + return full_string; + + m_has_long_strings = true; + + int n_pos = full_string.Find("\n"); + if (n_pos != wxNOT_FOUND && n_pos < (int)max_len) + max_len = n_pos; + + full_string.Truncate(max_len); + return full_string + dots; +} + +void DiffViewCtrl::context_menu(wxDataViewEvent& event) +{ + if (!m_has_long_strings) + return; + + wxDataViewItem item = event.GetItem(); + if (!item) { + wxPoint mouse_pos = wxGetMousePosition() - this->GetScreenPosition(); + wxDataViewColumn* col = nullptr; + this->HitTest(mouse_pos, item, col); + + if (!item) + item = this->GetSelection(); + + if (!item) + return; + } + + auto it = m_items_map.find(item); + if (it == m_items_map.end() || !it->second.is_long) + return; + FullCompareDialog(it->second.opt_name, it->second.old_val, it->second.new_val).ShowModal(); + +#ifdef __WXOSX__ + wxWindow* parent = this->GetParent(); + if (parent && parent->IsShown()) { + // if this dialog is shown it have to be Hide and show again to be placed on the very Top of windows + parent->Hide(); + parent->Show(); + } +#endif // __WXOSX__ +} + +void DiffViewCtrl::item_value_changed(wxDataViewEvent& event) +{ + if (event.GetColumn() != DiffModel::colToggle) + return; + + wxDataViewItem item = event.GetItem(); + + model->UpdateItemEnabling(item); + Refresh(); + + // update an enabling of the "save/move" buttons + m_empty_selection = selected_options().empty(); +} + +std::vector DiffViewCtrl::unselected_options(Preset::Type type) +{ + std::vector ret; + + for (auto item : m_items_map) { + if (item.second.opt_key == "extruders_count") + continue; + if (item.second.type == type && !model->IsEnabledItem(item.first)) + ret.emplace_back(get_pure_opt_key(item.second.opt_key)); } + + return ret; +} + +std::vector DiffViewCtrl::selected_options() +{ + std::vector ret; + + for (auto item : m_items_map) + if (model->IsEnabledItem(item.first)) + ret.emplace_back(get_pure_opt_key(item.second.opt_key)); + + return ret; } @@ -593,35 +805,11 @@ void UnsavedChangesDialog::build(Preset::Type type, PresetCollection* dependent_ m_action_line = new wxStaticText(this, wxID_ANY, ""); m_action_line->SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT).Bold()); - m_tree = new wxDataViewCtrl(this, wxID_ANY, wxDefaultPosition, wxSize(em * 60, em * 30), wxBORDER_SIMPLE | wxDV_VARIABLE_LINE_HEIGHT | wxDV_ROW_LINES); - m_tree_model = new UnsavedChangesModel(this); - m_tree->AssociateModel(m_tree_model); - m_tree_model->SetAssociatedControl(m_tree); - - m_tree->AppendToggleColumn(L"\u2714", UnsavedChangesModel::colToggle, wxDATAVIEW_CELL_ACTIVATABLE, (wxLinux ? 8 : 6) * em); - - auto append_bmp_text_column = [this](const wxString& label, unsigned model_column, int width, bool set_expander = false) - { -#ifdef __linux__ - wxDataViewIconTextRenderer* rd = new wxDataViewIconTextRenderer(); -#ifdef SUPPORTS_MARKUP - rd->EnableMarkup(true); -#endif - wxDataViewColumn* column = new wxDataViewColumn(label, rd, model_column, width, wxALIGN_TOP, wxDATAVIEW_COL_RESIZABLE | wxDATAVIEW_CELL_INERT); -#else - wxDataViewColumn* column = new wxDataViewColumn(label, new BitmapTextRenderer(true, wxDATAVIEW_CELL_INERT), model_column, width, wxALIGN_TOP, wxDATAVIEW_COL_RESIZABLE); -#endif //__linux__ - m_tree->AppendColumn(column); - if (set_expander) - m_tree->SetExpanderColumn(column); - }; - - append_bmp_text_column("" , UnsavedChangesModel::colIconText, 28 * em); - append_bmp_text_column(_L("Old Value"), UnsavedChangesModel::colOldValue, 12 * em); - append_bmp_text_column(_L("New Value"), UnsavedChangesModel::colNewValue, 12 * em); - - m_tree->Bind(wxEVT_DATAVIEW_ITEM_VALUE_CHANGED, &UnsavedChangesDialog::item_value_changed, this); - m_tree->Bind(wxEVT_DATAVIEW_ITEM_CONTEXT_MENU, &UnsavedChangesDialog::context_menu, this); + m_tree = new DiffViewCtrl(this, wxSize(em * 60, em * 30)); + m_tree->AppendToggleColumn_(L"\u2714" , DiffModel::colToggle, wxLinux ? 8 : 6); + m_tree->AppendBmpTextColumn("" , DiffModel::colIconText, 28); + m_tree->AppendBmpTextColumn(_L("Old Value"), DiffModel::colOldValue, 12); + m_tree->AppendBmpTextColumn(_L("New Value"), DiffModel::colNewValue, 12); // Add Buttons wxFont btn_font = this->GetFont().Scaled(1.4f); @@ -641,7 +829,7 @@ void UnsavedChangesDialog::build(Preset::Type type, PresetCollection* dependent_ close(close_act); }); if (process_enable) - (*btn)->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(!m_empty_selection); }); + (*btn)->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(m_tree->has_selection()); }); (*btn)->Bind(wxEVT_LEAVE_WINDOW, [this](wxMouseEvent& e) { show_info_line(Action::Undef); e.Skip(); }); }; @@ -698,45 +886,6 @@ void UnsavedChangesDialog::build(Preset::Type type, PresetCollection* dependent_ show_info_line(Action::Undef); } -void UnsavedChangesDialog::item_value_changed(wxDataViewEvent& event) -{ - if (event.GetColumn() != UnsavedChangesModel::colToggle) - return; - - wxDataViewItem item = event.GetItem(); - - m_tree_model->UpdateItemEnabling(item); - m_tree->Refresh(); - - // update an enabling of the "save/move" buttons - m_empty_selection = get_selected_options().empty(); -} - -void UnsavedChangesDialog::context_menu(wxDataViewEvent& event) -{ - if (!m_has_long_strings) - return; - - wxDataViewItem item = event.GetItem(); - if (!item) - { - wxPoint mouse_pos = wxGetMousePosition() - m_tree->GetScreenPosition(); - wxDataViewColumn* col = nullptr; - m_tree->HitTest(mouse_pos, item, col); - - if (!item) - item = m_tree->GetSelection(); - - if (!item) - return; - } - - auto it = m_items_map.find(item); - if (it == m_items_map.end() || !it->second.is_long) - return; - FullCompareDialog(it->second.opt_name, it->second.old_val, it->second.new_val).ShowModal(); -} - void UnsavedChangesDialog::show_info_line(Action action, std::string preset_name) { if (action == Action::Undef && !m_has_long_strings) @@ -859,27 +1008,30 @@ wxString get_string_from_enum(const std::string& opt_key, const DynamicPrintConf return from_u8(_utf8(names[static_cast(val)])); } -static int get_id_from_opt_key(std::string opt_key) +static size_t get_id_from_opt_key(std::string opt_key) { int pos = opt_key.find("#"); if (pos > 0) { boost::erase_head(opt_key, pos + 1); - return atoi(opt_key.c_str()); + return static_cast(atoi(opt_key.c_str())); } return 0; } -static std::string get_pure_opt_key(std::string opt_key) +static wxString get_full_label(std::string opt_key, const DynamicPrintConfig& config) { - int pos = opt_key.find("#"); - if (pos > 0) - boost::erase_tail(opt_key, opt_key.size() - pos); - return opt_key; + opt_key = get_pure_opt_key(opt_key); + + if (config.option(opt_key)->is_nil()) + return _L("N/A"); + + const ConfigOptionDef* opt = config.def()->get(opt_key); + return opt->full_label.empty() ? opt->label : opt->full_label; } static wxString get_string_value(std::string opt_key, const DynamicPrintConfig& config) { - int opt_idx = get_id_from_opt_key(opt_key); + size_t opt_idx = get_id_from_opt_key(opt_key); opt_key = get_pure_opt_key(opt_key); if (config.option(opt_key)->is_nil()) @@ -894,34 +1046,62 @@ static wxString get_string_value(std::string opt_key, const DynamicPrintConfig& case coInt: return from_u8((boost::format("%1%") % config.opt_int(opt_key)).str()); case coInts: { - int val = is_nullable ? - config.opt(opt_key)->get_at(opt_idx) : - config.opt(opt_key)->get_at(opt_idx); - return from_u8((boost::format("%1%") % val).str()); + if (is_nullable) { + auto values = config.opt(opt_key); + if (opt_idx < values->size()) + return from_u8((boost::format("%1%") % values->get_at(opt_idx)).str()); + } + else { + auto values = config.opt(opt_key); + if (opt_idx < values->size()) + return from_u8((boost::format("%1%") % values->get_at(opt_idx)).str()); + } + return _L("Undef"); } case coBool: return config.opt_bool(opt_key) ? "true" : "false"; case coBools: { - bool val = is_nullable ? - config.opt(opt_key)->get_at(opt_idx) : - config.opt(opt_key)->get_at(opt_idx); - return val ? "true" : "false"; + if (is_nullable) { + auto values = config.opt(opt_key); + if (opt_idx < values->size()) + return values->get_at(opt_idx) ? "true" : "false"; + } + else { + auto values = config.opt(opt_key); + if (opt_idx < values->size()) + return values->get_at(opt_idx) ? "true" : "false"; + } + return _L("Undef"); } case coPercent: return from_u8((boost::format("%1%%%") % int(config.optptr(opt_key)->getFloat())).str()); case coPercents: { - double val = is_nullable ? - config.opt(opt_key)->get_at(opt_idx) : - config.opt(opt_key)->get_at(opt_idx); - return from_u8((boost::format("%1%%%") % int(val)).str()); + if (is_nullable) { + auto values = config.opt(opt_key); + if (opt_idx < values->size()) + return from_u8((boost::format("%1%%%") % values->get_at(opt_idx)).str()); + } + else { + auto values = config.opt(opt_key); + if (opt_idx < values->size()) + return from_u8((boost::format("%1%%%") % values->get_at(opt_idx)).str()); + } + return _L("Undef"); } case coFloat: return double_to_string(config.opt_float(opt_key)); case coFloats: { - double val = is_nullable ? - config.opt(opt_key)->get_at(opt_idx) : - config.opt(opt_key)->get_at(opt_idx); - return double_to_string(val); + if (is_nullable) { + auto values = config.opt(opt_key); + if (opt_idx < values->size()) + return double_to_string(values->get_at(opt_idx)); + } + else { + auto values = config.opt(opt_key); + if (opt_idx < values->size()) + return double_to_string(values->get_at(opt_idx)); + } + return _L("Undef"); } case coString: return from_u8(config.opt_string(opt_key)); @@ -936,7 +1116,7 @@ static wxString get_string_value(std::string opt_key, const DynamicPrintConfig& out.RemoveLast(1); return out; } - if (!strings->empty()) + if (!strings->empty() && opt_idx < (int)strings->values.size()) return from_u8(strings->get_at(opt_idx)); } break; @@ -966,6 +1146,8 @@ static wxString get_string_value(std::string opt_key, const DynamicPrintConfig& return get_string_from_enum(opt_key, config); if (opt_key == "support_pillar_connection_mode") return get_string_from_enum(opt_key, config); + if (opt_key == "brim_type") + return get_string_from_enum(opt_key, config); break; } case coPoints: { @@ -985,23 +1167,6 @@ static wxString get_string_value(std::string opt_key, const DynamicPrintConfig& return out; } -wxString UnsavedChangesDialog::get_short_string(wxString full_string) -{ - int max_len = 30; - if (full_string.IsEmpty() || full_string.StartsWith("#") || - (full_string.Find("\n") == wxNOT_FOUND && full_string.Length() < max_len)) - return full_string; - - m_has_long_strings = true; - - int n_pos = full_string.Find("\n"); - if (n_pos != wxNOT_FOUND && n_pos < max_len) - max_len = n_pos; - - full_string.Truncate(max_len); - return full_string + dots; -} - void UnsavedChangesDialog::update(Preset::Type type, PresetCollection* dependent_presets, const std::string& new_selected_preset, const wxString& header) { PresetCollection* presets = dependent_presets; @@ -1063,7 +1228,7 @@ void UnsavedChangesDialog::update_tree(Preset::Type type, PresetCollection* pres const std::map& category_icon_map = wxGetApp().get_tab(type)->get_category_icon_map(); - m_tree_model->AddPreset(type, from_u8(presets->get_edited_preset().name), old_pt); + m_tree->model->AddPreset(type, from_u8(presets->get_edited_preset().name), old_pt); // Collect dirty options. const bool deep_compare = (type == Preset::TYPE_PRINTER || type == Preset::TYPE_SLA_MATERIAL); @@ -1076,9 +1241,7 @@ void UnsavedChangesDialog::update_tree(Preset::Type type, PresetCollection* pres wxString old_val = from_u8((boost::format("%1%") % old_config.opt("extruder_colour")->values.size()).str()); wxString new_val = from_u8((boost::format("%1%") % new_config.opt("extruder_colour")->values.size()).str()); - ItemData item_data = { "extruders_count", local_label, old_val, new_val, type }; - m_items_map.emplace(m_tree_model->AddOption(type, _L("General"), _L("Capabilities"), local_label, old_val, new_val, category_icon_map.at("General")), item_data); - + m_tree->Append("extruders_count", type, _L("General"), _L("Capabilities"), local_label, old_val, new_val, category_icon_map.at("General")); } for (const std::string& opt_key : dirty_options) { @@ -1090,43 +1253,12 @@ void UnsavedChangesDialog::update_tree(Preset::Type type, PresetCollection* pres continue; } - ItemData item_data = { opt_key, option.label_local, get_string_value(opt_key, old_config), get_string_value(opt_key, new_config), type }; - - wxString old_val = get_short_string(item_data.old_val); - wxString new_val = get_short_string(item_data.new_val); - if (old_val != item_data.old_val || new_val != item_data.new_val) - item_data.is_long = true; - - m_items_map.emplace(m_tree_model->AddOption(type, option.category_local, option.group_local, option.label_local, old_val, new_val, category_icon_map.at(option.category)), item_data); + m_tree->Append(opt_key, type, option.category_local, option.group_local, option.label_local, + get_string_value(opt_key, old_config), get_string_value(opt_key, new_config), category_icon_map.at(option.category)); } } } -std::vector UnsavedChangesDialog::get_unselected_options(Preset::Type type) -{ - std::vector ret; - - for (auto item : m_items_map) { - if (item.second.opt_key == "extruders_count") - continue; - if (item.second.type == type && !m_tree_model->IsEnabledItem(item.first)) - ret.emplace_back(get_pure_opt_key(item.second.opt_key)); - } - - return ret; -} - -std::vector UnsavedChangesDialog::get_selected_options() -{ - std::vector ret; - - for (auto item : m_items_map) - if (m_tree_model->IsEnabledItem(item.first)) - ret.emplace_back(get_pure_opt_key(item.second.opt_key)); - - return ret; -} - void UnsavedChangesDialog::on_dpi_changed(const wxRect& suggested_rect) { int em = em_unit(); @@ -1135,16 +1267,10 @@ void UnsavedChangesDialog::on_dpi_changed(const wxRect& suggested_rect) for (auto btn : { m_save_btn, m_transfer_btn, m_discard_btn } ) if (btn) btn->msw_rescale(); - const wxSize& size = wxSize(80 * em, 30 * em); + const wxSize& size = wxSize(70 * em, 30 * em); SetMinSize(size); - m_tree->GetColumn(UnsavedChangesModel::colToggle )->SetWidth(6 * em); - m_tree->GetColumn(UnsavedChangesModel::colIconText)->SetWidth(30 * em); - m_tree->GetColumn(UnsavedChangesModel::colOldValue)->SetWidth(20 * em); - m_tree->GetColumn(UnsavedChangesModel::colNewValue)->SetWidth(20 * em); - - m_tree_model->Rescale(); - m_tree->Refresh(); + m_tree->Rescale(em); Fit(); Refresh(); @@ -1155,8 +1281,7 @@ void UnsavedChangesDialog::on_sys_color_changed() for (auto btn : { m_save_btn, m_transfer_btn, m_discard_btn } ) btn->msw_rescale(); // msw_rescale updates just icons, so use it - m_tree_model->Rescale(); - m_tree->Refresh(); + m_tree->Rescale(); Refresh(); } @@ -1188,16 +1313,45 @@ FullCompareDialog::FullCompareDialog(const wxString& option_name, const wxString grid_sizer->Add(text, 0, wxALL, border); }; - auto add_value = [grid_sizer, border, this](wxString label, bool is_colored = false) { - wxTextCtrl* text = new wxTextCtrl(this, wxID_ANY, label, wxDefaultPosition, wxSize(300, -1), wxTE_MULTILINE | wxTE_READONLY | wxBORDER_NONE | wxTE_RICH); + add_header(_L("Old value")); + add_header(_L("New value")); + + auto get_set_from_val = [](wxString str) { + if (str.Find("\n") == wxNOT_FOUND) + str.Replace(" ", "\n"); + + std::set str_set; + + wxStringTokenizer strings(str, "\n"); + while (strings.HasMoreTokens()) + str_set.emplace(strings.GetNextToken()); + + return str_set; + }; + + std::set old_set = get_set_from_val(old_value); + std::set new_set = get_set_from_val(new_value); + std::set old_new_diff_set; + std::set new_old_diff_set; + + std::set_difference(old_set.begin(), old_set.end(), new_set.begin(), new_set.end(), std::inserter(old_new_diff_set, old_new_diff_set.begin())); + std::set_difference(new_set.begin(), new_set.end(), old_set.begin(), old_set.end(), std::inserter(new_old_diff_set, new_old_diff_set.begin())); + + auto add_value = [grid_sizer, border, this](wxString label, const std::set& diff_set, bool is_colored = false) { + wxTextCtrl* text = new wxTextCtrl(this, wxID_ANY, label, wxDefaultPosition, wxSize(400, 400), wxTE_MULTILINE | wxTE_READONLY | wxBORDER_NONE | wxTE_RICH); text->SetStyle(0, label.Len(), wxTextAttr(is_colored ? wxColour(orange) : wxNullColour, wxNullColour, this->GetFont())); + + for (const wxString& str : diff_set) { + int pos = label.First(str); + if (pos == wxNOT_FOUND) + continue; + text->SetStyle(pos, pos + (int)str.Len(), wxTextAttr(is_colored ? wxColour(orange) : wxNullColour, wxNullColour, this->GetFont().Bold())); + } + grid_sizer->Add(text, 1, wxALL | wxEXPAND, border); }; - - add_header(_L("Old value")); - add_header(_L("New value")); - add_value(old_value); - add_value(new_value, true); + add_value(old_value, old_new_diff_set); + add_value(new_value, new_old_diff_set, true); sizer->Add(grid_sizer, 1, wxEXPAND); @@ -1213,6 +1367,383 @@ FullCompareDialog::FullCompareDialog(const wxString& option_name, const wxString } +static PresetCollection* get_preset_collection(Preset::Type type, PresetBundle* preset_bundle = nullptr) { + if (!preset_bundle) + preset_bundle = wxGetApp().preset_bundle; + return type == Preset::Type::TYPE_PRINT ? &preset_bundle->prints : + type == Preset::Type::TYPE_SLA_PRINT ? &preset_bundle->sla_prints : + type == Preset::Type::TYPE_FILAMENT ? &preset_bundle->filaments : + type == Preset::Type::TYPE_SLA_MATERIAL ? &preset_bundle->sla_materials : + type == Preset::Type::TYPE_PRINTER ? &preset_bundle->printers : + nullptr; +} + +//------------------------------------------ +// DiffPresetDialog +//------------------------------------------ +static std::string get_selection(PresetComboBox* preset_combo) +{ + return into_u8(preset_combo->GetString(preset_combo->GetSelection())); +} + +DiffPresetDialog::DiffPresetDialog() + : DPIDialog(static_cast(wxGetApp().mainframe), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER), + m_pr_technology(wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology()) +{ + wxColour bgr_clr = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW); + SetBackgroundColour(bgr_clr); + +#if ENABLE_WX_3_1_3_DPI_CHANGED_EVENT && defined(__WXMSW__) + // ys_FIXME! temporary workaround for correct font scaling + // Because of from wxWidgets 3.1.3 auto rescaling is implemented for the Fonts, + // From the very beginning set dialog font to the wxSYS_DEFAULT_GUI_FONT + this->SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT)); +#endif // ENABLE_WX_3_1_3_DPI_CHANGED_EVENT + + int border = 10; + int em = em_unit(); + + assert(wxGetApp().preset_bundle); + + m_preset_bundle_left = std::make_unique(*wxGetApp().preset_bundle); + m_preset_bundle_right = std::make_unique(*wxGetApp().preset_bundle); + + m_top_info_line = new wxStaticText(this, wxID_ANY, "Select presets to compare"); + m_top_info_line->SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT).Bold()); + + m_bottom_info_line = new wxStaticText(this, wxID_ANY, ""); + m_bottom_info_line->SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT).Bold()); + + wxBoxSizer* presets_sizer = new wxBoxSizer(wxVERTICAL); + + for (auto new_type : { Preset::TYPE_PRINT, Preset::TYPE_FILAMENT, Preset::TYPE_SLA_PRINT, Preset::TYPE_SLA_MATERIAL, Preset::TYPE_PRINTER }) + { + const PresetCollection* collection = get_preset_collection(new_type); + wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL); + PresetComboBox* presets_left; + PresetComboBox* presets_right; + ScalableButton* equal_bmp = new ScalableButton(this, wxID_ANY, "equal"); + + auto add_preset_combobox = [collection, sizer, new_type, em, this](PresetComboBox** cb_, PresetBundle* preset_bundle) { + *cb_ = new PresetComboBox(this, new_type, wxSize(em * 35, -1), preset_bundle); + PresetComboBox* cb = (*cb_); + cb->set_selection_changed_function([this, new_type, preset_bundle, cb](int selection) { + if (m_view_type == Preset::TYPE_INVALID) { + std::string preset_name = cb->GetString(selection).ToUTF8().data(); + update_compatibility(Preset::remove_suffix_modified(preset_name), new_type, preset_bundle); + } + update_tree(); + }); + if (collection->get_selected_idx() != (size_t)-1) + cb->update(collection->get_selected_preset().name); + + sizer->Add(cb, 1); + cb->Show(new_type == Preset::TYPE_PRINTER); + }; + add_preset_combobox(&presets_left, m_preset_bundle_left.get()); + sizer->Add(equal_bmp, 0, wxRIGHT | wxLEFT | wxALIGN_CENTER_VERTICAL, 5); + add_preset_combobox(&presets_right, m_preset_bundle_right.get()); + presets_sizer->Add(sizer, 1, wxTOP, 5); + equal_bmp->Show(new_type == Preset::TYPE_PRINTER); + + m_preset_combos.push_back({ presets_left, equal_bmp, presets_right }); + + equal_bmp->Bind(wxEVT_BUTTON, [presets_left, presets_right, this](wxEvent&) { + std::string preset_name = get_selection(presets_left); + presets_right->update(preset_name); + if (m_view_type == Preset::TYPE_INVALID) + update_compatibility(Preset::remove_suffix_modified(preset_name), presets_right->get_type(), m_preset_bundle_right.get()); + update_tree(); + }); + } + + m_show_all_presets = new wxCheckBox(this, wxID_ANY, _L("Show all preset (including incompatible)")); + m_show_all_presets->Bind(wxEVT_CHECKBOX, [this](wxCommandEvent&) { + bool show_all = m_show_all_presets->GetValue(); + for (auto preset_combos : m_preset_combos) { + if (preset_combos.presets_left->get_type() == Preset::TYPE_PRINTER) + continue; + preset_combos.presets_left->show_all(show_all); + preset_combos.presets_right->show_all(show_all); + } + if (m_view_type == Preset::TYPE_INVALID) + update_tree(); + }); + + m_tree = new DiffViewCtrl(this, wxSize(em * 65, em * 40)); + m_tree->AppendBmpTextColumn("", DiffModel::colIconText, 35); + m_tree->AppendBmpTextColumn(_L("Left Preset Value"), DiffModel::colOldValue, 15); + m_tree->AppendBmpTextColumn(_L("Right Preset Value"),DiffModel::colNewValue, 15); + m_tree->Hide(); + + wxBoxSizer* topSizer = new wxBoxSizer(wxVERTICAL); + + topSizer->Add(m_top_info_line, 0, wxEXPAND | wxLEFT | wxTOP | wxRIGHT, 2 * border); + topSizer->Add(presets_sizer, 0, wxEXPAND | wxLEFT | wxTOP | wxRIGHT, border); + topSizer->Add(m_show_all_presets, 0, wxEXPAND | wxALL, border); + topSizer->Add(m_bottom_info_line, 0, wxEXPAND | wxALL, 2 * border); + topSizer->Add(m_tree, 1, wxEXPAND | wxALL, border); + + this->SetMinSize(wxSize(80 * em, 30 * em)); + this->SetSizer(topSizer); + topSizer->SetSizeHints(this); +} + +void DiffPresetDialog::update_controls_visibility(Preset::Type type /* = Preset::TYPE_INVALID*/) +{ + for (auto preset_combos : m_preset_combos) { + Preset::Type cb_type = preset_combos.presets_left->get_type(); + bool show = type != Preset::TYPE_INVALID ? type == cb_type : + cb_type == Preset::TYPE_PRINTER ? true : + m_pr_technology == ptFFF ? cb_type == Preset::TYPE_PRINT || cb_type == Preset::TYPE_FILAMENT : + cb_type == Preset::TYPE_SLA_PRINT || cb_type == Preset::TYPE_SLA_MATERIAL; + preset_combos.presets_left->Show(show); + preset_combos.equal_bmp->Show(show); + preset_combos.presets_right->Show(show); + + if (show) { + preset_combos.presets_left->update_from_bundle(); + preset_combos.presets_right->update_from_bundle(); + } + } + + m_show_all_presets->Show(type != Preset::TYPE_PRINTER); +} + +void DiffPresetDialog::update_bundles_from_app() +{ + *m_preset_bundle_left = *wxGetApp().preset_bundle; + *m_preset_bundle_right = *wxGetApp().preset_bundle; +} + +void DiffPresetDialog::show(Preset::Type type /* = Preset::TYPE_INVALID*/) +{ + this->SetTitle(type == Preset::TYPE_INVALID ? _L("Compare Presets") : format_wxstr(_L("Compare %1% Presets"), wxGetApp().get_tab(type)->name())); + m_view_type = type; + + update_bundles_from_app(); + update_controls_visibility(type); + if (type == Preset::TYPE_INVALID) + Fit(); + + update_tree(); + + // if this dialog is shown it have to be Hide and show again to be placed on the very Top of windows + if (IsShown()) + Hide(); + Show(); +} + +void DiffPresetDialog::update_presets(Preset::Type type) +{ + m_pr_technology = m_preset_bundle_left.get()->printers.get_edited_preset().printer_technology(); + + update_bundles_from_app(); + update_controls_visibility(type); + + if (type == Preset::TYPE_INVALID) + for (auto preset_combos : m_preset_combos) { + if (preset_combos.presets_left->get_type() == Preset::TYPE_PRINTER) { + preset_combos.presets_left->update_from_bundle (); + preset_combos.presets_right->update_from_bundle(); + break; + } + } + else + for (auto preset_combos : m_preset_combos) { + if (preset_combos.presets_left->get_type() == type) { + preset_combos.presets_left->update(); + preset_combos.presets_right->update(); + break; + } + } + + update_tree(); +} + +void DiffPresetDialog::update_tree() +{ + Search::OptionsSearcher& searcher = wxGetApp().sidebar().get_searcher(); + searcher.sort_options_by_opt_key(); + + m_tree->Clear(); + wxString bottom_info = ""; + bool show_tree = false; + + for (auto preset_combos : m_preset_combos) + { + if (!preset_combos.presets_left->IsShown()) + continue; + Preset::Type type = preset_combos.presets_left->get_type(); + + const PresetCollection* presets = get_preset_collection(type); + const Preset* left_preset = presets->find_preset(get_selection(preset_combos.presets_left)); + const Preset* right_preset = presets->find_preset(get_selection(preset_combos.presets_right)); + if (!left_preset || !right_preset) { + bottom_info = _L("One of the presets doesn't found"); + preset_combos.equal_bmp->SetBitmap_(ScalableBitmap(this, "question")); + preset_combos.equal_bmp->SetToolTip(bottom_info); + continue; + } + + const DynamicPrintConfig& left_config = left_preset->config; + const PrinterTechnology& left_pt = left_preset->printer_technology(); + const DynamicPrintConfig& right_congig = right_preset->config; + + if (left_pt != right_preset->printer_technology()) { + bottom_info = _L("Comparable printer presets has different printer technology"); + preset_combos.equal_bmp->SetBitmap_(ScalableBitmap(this, "question")); + preset_combos.equal_bmp->SetToolTip(bottom_info); + continue; + } + + // Collect dirty options. + const bool deep_compare = (type == Preset::TYPE_PRINTER || type == Preset::TYPE_SLA_MATERIAL); + auto dirty_options = type == Preset::TYPE_PRINTER && left_pt == ptFFF && + left_config.opt("extruder_colour")->values.size() < right_congig.opt("extruder_colour")->values.size() ? + presets->dirty_options(right_preset, left_preset, deep_compare) : + presets->dirty_options(left_preset, right_preset, deep_compare); + + if (dirty_options.empty()) { + bottom_info = _L("Presets are the same"); + preset_combos.equal_bmp->SetBitmap_(ScalableBitmap(this, "equal")); + preset_combos.equal_bmp->SetToolTip(bottom_info); + continue; + } + + show_tree = true; + preset_combos.equal_bmp->SetBitmap_(ScalableBitmap(this, "not_equal")); + preset_combos.equal_bmp->SetToolTip(_L("Presets are different.\n" + "Click this button to select the same as left preset for the right preset.")); + + m_tree->model->AddPreset(type, "\"" + from_u8(left_preset->name) + "\" vs \"" + from_u8(right_preset->name) + "\"", left_pt); + + const std::map& category_icon_map = wxGetApp().get_tab(type)->get_category_icon_map(); + + // process changes of extruders count + if (type == Preset::TYPE_PRINTER && left_pt == ptFFF && + left_config.opt("extruder_colour")->values.size() != right_congig.opt("extruder_colour")->values.size()) { + wxString local_label = _L("Extruders count"); + wxString left_val = from_u8((boost::format("%1%") % left_config.opt("extruder_colour")->values.size()).str()); + wxString right_val = from_u8((boost::format("%1%") % right_congig.opt("extruder_colour")->values.size()).str()); + + m_tree->Append("extruders_count", type, _L("General"), _L("Capabilities"), local_label, left_val, right_val, category_icon_map.at("General")); + } + + for (const std::string& opt_key : dirty_options) { + wxString left_val = get_string_value(opt_key, left_config); + wxString right_val = get_string_value(opt_key, right_congig); + + Search::Option option = searcher.get_option(opt_key, get_full_label(opt_key, left_config), type); + if (option.opt_key != boost::nowide::widen(opt_key)) { + // temporary solution, just for testing + m_tree->Append(opt_key, type, _L("Undef category"), _L("Undef group"), opt_key, left_val, right_val, "question"); + // When founded option isn't the correct one. + // It can be for dirty_options: "default_print_profile", "printer_model", "printer_settings_id", + // because of they don't exist in searcher + continue; + } + m_tree->Append(opt_key, type, option.category_local, option.group_local, option.label_local, + left_val, right_val, category_icon_map.at(option.category)); + } + } + + bool tree_was_shown = m_tree->IsShown(); + m_tree->Show(show_tree); + if (!show_tree) + m_bottom_info_line->SetLabel(bottom_info); + m_bottom_info_line->Show(!show_tree); + + if (tree_was_shown == m_tree->IsShown()) + Layout(); + else { + Fit(); + Refresh(); + } +} + +void DiffPresetDialog::on_dpi_changed(const wxRect&) +{ + int em = em_unit(); + + msw_buttons_rescale(this, em, { wxID_CANCEL}); + + const wxSize& size = wxSize(80 * em, 30 * em); + SetMinSize(size); + + for (auto preset_combos : m_preset_combos) { + preset_combos.presets_left->msw_rescale(); + preset_combos.equal_bmp->msw_rescale(); + preset_combos.presets_right->msw_rescale(); + } + + m_tree->Rescale(em); + + Fit(); + Refresh(); +} + +void DiffPresetDialog::on_sys_color_changed() +{ + // msw_rescale updates just icons, so use it + m_tree->Rescale(); + Refresh(); +} + +void DiffPresetDialog::update_compatibility(const std::string& preset_name, Preset::Type type, PresetBundle* preset_bundle) +{ + PresetCollection* presets = get_preset_collection(type, preset_bundle); + + bool print_tab = type == Preset::TYPE_PRINT || type == Preset::TYPE_SLA_PRINT; + bool printer_tab = type == Preset::TYPE_PRINTER; + bool technology_changed = false; + + if (printer_tab) { + const Preset& new_printer_preset = *presets->find_preset(preset_name, true); + PrinterTechnology old_printer_technology = presets->get_selected_preset().printer_technology(); + PrinterTechnology new_printer_technology = new_printer_preset.printer_technology(); + + technology_changed = old_printer_technology != new_printer_technology; + } + + // Mark the print & filament enabled if they are compatible with the currently selected preset. + // The following method should not discard changes of current print or filament presets on change of a printer profile, + // if they are compatible with the current printer. + auto update_compatible_type = [](bool technology_changed, bool on_page, bool show_incompatible_presets) { + return technology_changed ? PresetSelectCompatibleType::Always : + on_page ? PresetSelectCompatibleType::Never : + show_incompatible_presets ? PresetSelectCompatibleType::OnlyIfWasCompatible : PresetSelectCompatibleType::Always; + }; + if (print_tab || printer_tab) + preset_bundle->update_compatible( + update_compatible_type(technology_changed, print_tab, true), + update_compatible_type(technology_changed, false, true)); + + bool is_left_presets = preset_bundle == m_preset_bundle_left.get(); + PrinterTechnology pr_tech = preset_bundle->printers.get_selected_preset().printer_technology(); + + // update preset comboboxes + for (auto preset_combos : m_preset_combos) + { + PresetComboBox* cb = is_left_presets ? preset_combos.presets_left : preset_combos.presets_right; + Preset::Type presets_type = cb->get_type(); + if ((print_tab && ( + (pr_tech == ptFFF && presets_type == Preset::TYPE_FILAMENT) || + (pr_tech == ptSLA && presets_type == Preset::TYPE_SLA_MATERIAL) )) || + (printer_tab && ( + (pr_tech == ptFFF && (presets_type == Preset::TYPE_PRINT || presets_type == Preset::TYPE_FILAMENT) ) || + (pr_tech == ptSLA && (presets_type == Preset::TYPE_SLA_PRINT || presets_type == Preset::TYPE_SLA_MATERIAL) )) )) + cb->update(); + } + + if (technology_changed && + m_preset_bundle_left.get()->printers.get_selected_preset().printer_technology() == + m_preset_bundle_right.get()->printers.get_selected_preset().printer_technology()) + { + m_pr_technology = m_preset_bundle_left.get()->printers.get_edited_preset().printer_technology(); + update_controls_visibility(); + } +} } diff --git a/src/slic3r/GUI/UnsavedChangesDialog.hpp b/src/slic3r/GUI/UnsavedChangesDialog.hpp index 232802b661a..12c215e568f 100644 --- a/src/slic3r/GUI/UnsavedChangesDialog.hpp +++ b/src/slic3r/GUI/UnsavedChangesDialog.hpp @@ -7,7 +7,7 @@ #include "GUI_Utils.hpp" #include "wxExtensions.hpp" -#include "libslic3r/Preset.hpp" +#include "libslic3r/PresetBundle.hpp" class ScalableButton; class wxStaticText; @@ -16,10 +16,11 @@ namespace Slic3r { namespace GUI{ // ---------------------------------------------------------------------------- -// ModelNode: a node inside UnsavedChangesModel +// ModelNode: a node inside DiffModel // ---------------------------------------------------------------------------- class ModelNode; +class PresetComboBox; using ModelNodePtrArray = std::vector>; // On all of 3 different platforms Bitmap+Text icon column looks different @@ -42,17 +43,6 @@ class ModelNode wxString m_old_color; wxString m_new_color; - // TODO/FIXME: - // the GTK version of wxDVC (in particular wxDataViewCtrlInternal::ItemAdded) - // needs to know in advance if a node is or _will be_ a container. - // Thus implementing: - // bool IsContainer() const - // { return m_children.size()>0; } - // doesn't work with wxGTK when UnsavedChangesModel::AddToClassical is called - // AND the classical node was removed (a new node temporary without children - // would be added to the control) - bool m_container {true}; - #ifdef __linux__ wxIcon get_bitmap(const wxString& color); #else @@ -75,6 +65,17 @@ class ModelNode wxString m_old_value; wxString m_new_value; + // TODO/FIXME: + // the GTK version of wxDVC (in particular wxDataViewCtrlInternal::ItemAdded) + // needs to know in advance if a node is or _will be_ a container. + // Thus implementing: + // bool IsContainer() const + // { return m_children.size()>0; } + // doesn't work with wxGTK when DiffModel::AddToClassical is called + // AND the classical node was removed (a new node temporary without children + // would be added to the control) + bool m_container {true}; + // preset(root) node ModelNode(Preset::Type preset_type, wxWindow* parent_win, const wxString& text, const std::string& icon_name); @@ -107,13 +108,13 @@ class ModelNode // ---------------------------------------------------------------------------- -// UnsavedChangesModel +// DiffModel // ---------------------------------------------------------------------------- -class UnsavedChangesModel : public wxDataViewModel +class DiffModel : public wxDataViewModel { wxWindow* m_parent_win { nullptr }; - std::vector m_preset_nodes; + ModelNodePtrArray m_preset_nodes; wxDataViewCtrl* m_ctrl{ nullptr }; @@ -143,8 +144,8 @@ class UnsavedChangesModel : public wxDataViewModel colMax }; - UnsavedChangesModel(wxWindow* parent); - ~UnsavedChangesModel(); + DiffModel(wxWindow* parent); + ~DiffModel() {} void SetAssociatedControl(wxDataViewCtrl* ctrl) { m_ctrl = ctrl; } @@ -159,6 +160,9 @@ class UnsavedChangesModel : public wxDataViewModel wxString GetColumnType(unsigned int col) const override; void Rescale(); + wxDataViewItem Delete(const wxDataViewItem& item); + void Clear(); + wxDataViewItem GetParent(const wxDataViewItem& item) const override; unsigned int GetChildren(const wxDataViewItem& parent, wxDataViewItemArray& array) const override; @@ -173,14 +177,60 @@ class UnsavedChangesModel : public wxDataViewModel }; +// ---------------------------------------------------------------------------- +// DiffViewCtrl +// ---------------------------------------------------------------------------- + +class DiffViewCtrl : public wxDataViewCtrl +{ + bool m_has_long_strings{ false }; + bool m_empty_selection { false }; + int m_em_unit; + + struct ItemData + { + std::string opt_key; + wxString opt_name; + wxString old_val; + wxString new_val; + Preset::Type type; + bool is_long{ false }; + }; + + // tree items related to the options + std::map m_items_map; + std::map m_columns_width; + +public: + DiffViewCtrl(wxWindow* parent, wxSize size); + ~DiffViewCtrl() {} + + DiffModel* model{ nullptr }; + + void AppendBmpTextColumn(const wxString& label, unsigned model_column, int width, bool set_expander = false); + void AppendToggleColumn_(const wxString& label, unsigned model_column, int width); + void Rescale(int em = 0); + void Append(const std::string& opt_key, Preset::Type type, wxString category_name, wxString group_name, wxString option_name, + wxString old_value, wxString new_value, const std::string category_icon_name); + void Clear(); + + wxString get_short_string(wxString full_string); + bool has_selection() { return !m_empty_selection; } + void context_menu(wxDataViewEvent& event); + void item_value_changed(wxDataViewEvent& event); + void set_em_unit(int em) { m_em_unit = em; } + + std::vector unselected_options(Preset::Type type); + std::vector selected_options(); +}; + + //------------------------------------------ // UnsavedChangesDialog //------------------------------------------ class UnsavedChangesDialog : public DPIDialog { - wxDataViewCtrl* m_tree { nullptr }; - UnsavedChangesModel* m_tree_model { nullptr }; - + DiffViewCtrl* m_tree { nullptr }; ScalableButton* m_save_btn { nullptr }; ScalableButton* m_transfer_btn { nullptr }; ScalableButton* m_discard_btn { nullptr }; @@ -188,7 +238,6 @@ class UnsavedChangesDialog : public DPIDialog wxStaticText* m_info_line { nullptr }; wxCheckBox* m_remember_choice { nullptr }; - bool m_empty_selection { false }; bool m_has_long_strings { false }; int m_save_btn_id { wxID_ANY }; int m_move_btn_id { wxID_ANY }; @@ -209,19 +258,6 @@ class UnsavedChangesDialog : public DPIDialog // selected action after Dialog closing Action m_exit_action {Action::Undef}; - - struct ItemData - { - std::string opt_key; - wxString opt_name; - wxString old_val; - wxString new_val; - Preset::Type type; - bool is_long {false}; - }; - // tree items related to the options - std::map m_items_map; - // preset names which are modified in SavePresetDialog and related types std::vector> names_and_types; @@ -230,13 +266,9 @@ class UnsavedChangesDialog : public DPIDialog UnsavedChangesDialog(Preset::Type type, PresetCollection* dependent_presets, const std::string& new_selected_preset); ~UnsavedChangesDialog() {} - wxString get_short_string(wxString full_string); - void build(Preset::Type type, PresetCollection* dependent_presets, const std::string& new_selected_preset, const wxString& header = ""); void update(Preset::Type type, PresetCollection* dependent_presets, const std::string& new_selected_preset, const wxString& header); void update_tree(Preset::Type type, PresetCollection *presets); - void item_value_changed(wxDataViewEvent &event); - void context_menu(wxDataViewEvent &event); void show_info_line(Action action, std::string preset_name = ""); void update_config(Action action); void close(Action action); @@ -251,8 +283,8 @@ class UnsavedChangesDialog : public DPIDialog // short version of the previous function, for the case, when just one preset is modified std::string get_preset_name() { return names_and_types[0].first; } - std::vector get_unselected_options(Preset::Type type); - std::vector get_selected_options(); + std::vector get_unselected_options(Preset::Type type) { return m_tree->unselected_options(type); } + std::vector get_selected_options() { return m_tree->selected_options(); } protected: void on_dpi_changed(const wxRect& suggested_rect) override; @@ -270,6 +302,48 @@ class FullCompareDialog : public wxDialog ~FullCompareDialog() {} }; + +//------------------------------------------ +// DiffPresetDialog +//------------------------------------------ +class DiffPresetDialog : public DPIDialog +{ + DiffViewCtrl* m_tree { nullptr }; + wxStaticText* m_top_info_line { nullptr }; + wxStaticText* m_bottom_info_line { nullptr }; + wxCheckBox* m_show_all_presets { nullptr }; + + Preset::Type m_view_type { Preset::TYPE_INVALID }; + PrinterTechnology m_pr_technology; + std::unique_ptr m_preset_bundle_left; + std::unique_ptr m_preset_bundle_right; + + void update_tree(); + void update_bundles_from_app(); + void update_controls_visibility(Preset::Type type = Preset::TYPE_INVALID); + void update_compatibility(const std::string& preset_name, Preset::Type type, PresetBundle* preset_bundle); + + struct DiffPresets + { + PresetComboBox* presets_left { nullptr }; + ScalableButton* equal_bmp { nullptr }; + PresetComboBox* presets_right { nullptr }; + }; + + std::vector m_preset_combos; + +public: + DiffPresetDialog(); + ~DiffPresetDialog() {} + + void show(Preset::Type type = Preset::TYPE_INVALID); + void update_presets(Preset::Type type = Preset::TYPE_INVALID); + +protected: + void on_dpi_changed(const wxRect& suggested_rect) override; + void on_sys_color_changed() override; +}; + } } diff --git a/src/slic3r/GUI/fts_fuzzy_match.h b/src/slic3r/GUI/fts_fuzzy_match.h index 4dd206aac1c..379fd9c74ea 100644 --- a/src/slic3r/GUI/fts_fuzzy_match.h +++ b/src/slic3r/GUI/fts_fuzzy_match.h @@ -62,13 +62,13 @@ namespace fts { } // Public interface - static bool fuzzy_match(char_type const * pattern, char_type const * str, int & outScore) { + [[maybe_unused]] static bool fuzzy_match(char_type const * pattern, char_type const * str, int & outScore) { pos_type matches[max_matches + 1]; // with the room for the stopper matches[0] = stopper; return fuzzy_match(pattern, str, outScore, matches); } - static bool fuzzy_match(char_type const * pattern, char_type const * str, int & outScore, pos_type * matches) { + [[maybe_unused]] static bool fuzzy_match(char_type const * pattern, char_type const * str, int & outScore, pos_type * matches) { int recursionCount = 0; static constexpr int recursionLimit = 10; return fuzzy_internal::fuzzy_match_recursive(pattern, str, outScore, str, nullptr, matches, 0, recursionCount, recursionLimit); @@ -113,15 +113,16 @@ namespace fts { bool first_match = true; while (*pattern != '\0' && *str != '\0') { - int num_matched = std::tolower(*pattern) == std::tolower(*str) ? 1 : 0; - bool folded_match = false; - if (! num_matched) { + int num_matched = std::towlower(*pattern) == std::towlower(*str) ? 1 : 0; + // bool folded_match = false; + + if (! num_matched) { wchar_t tmp[4]; wchar_t *end = Slic3r::fold_to_ascii(*str, tmp); wchar_t *c = tmp; for (const wchar_t* d = pattern; c != end && *d != 0 && std::towlower(*c) == std::towlower(*d); ++c, ++d); if (c == end) { - folded_match = true; + // folded_match = true; num_matched = end - tmp; } } @@ -168,11 +169,11 @@ namespace fts { // Calculate score if (matched) { static constexpr int sequential_bonus = 15; // bonus for adjacent matches - static constexpr int separator_bonus = 30; // bonus if match occurs after a separator - static constexpr int camel_bonus = 30; // bonus if match is uppercase and prev is lower + static constexpr int separator_bonus = 10/*30*/; // bonus if match occurs after a separator + // static constexpr int camel_bonus = 30; // bonus if match is uppercase and prev is lower static constexpr int first_letter_bonus = 15; // bonus if the first letter is matched - static constexpr int leading_letter_penalty = -5; // penalty applied for every letter in str before the first match + static constexpr int leading_letter_penalty = -1/*-5*/; // penalty applied for every letter in str before the first match static constexpr int max_leading_letter_penalty = -15; // maximum penalty for leading letters static constexpr int unmatched_letter_penalty = -1; // penalty for every letter that doesn't matter diff --git a/src/slic3r/Utils/Bonjour.cpp b/src/slic3r/Utils/Bonjour.cpp index 28b3b2228a8..f121e6e87ab 100644 --- a/src/slic3r/Utils/Bonjour.cpp +++ b/src/slic3r/Utils/Bonjour.cpp @@ -226,7 +226,7 @@ struct DnsResource } dataoffset = offset; - res.data = std::move(std::vector(buffer.begin() + offset, buffer.begin() + offset + rdlength)); + res.data = std::vector(buffer.begin() + offset, buffer.begin() + offset + rdlength); offset += rdlength; return std::move(res); diff --git a/src/slic3r/Utils/FlashAir.cpp b/src/slic3r/Utils/FlashAir.cpp index 22eaddecef5..2337ac29043 100644 --- a/src/slic3r/Utils/FlashAir.cpp +++ b/src/slic3r/Utils/FlashAir.cpp @@ -50,7 +50,7 @@ bool FlashAir::test(wxString &msg) const res = false; msg = format_error(body, error, status); }) - .on_complete([&, this](std::string body, unsigned) { + .on_complete([&](std::string body, unsigned) { BOOST_LOG_TRIVIAL(debug) << boost::format("%1%: Got upload enabled: %2%") % name % body; res = boost::starts_with(body, "1"); diff --git a/src/slic3r/Utils/Http.cpp b/src/slic3r/Utils/Http.cpp index 94a8c9a56d5..2afb7ed5046 100644 --- a/src/slic3r/Utils/Http.cpp +++ b/src/slic3r/Utils/Http.cpp @@ -553,7 +553,7 @@ void Http::cancel() Http Http::get(std::string url) { - return std::move(Http{std::move(url)}); + return Http{std::move(url)}; } Http Http::post(std::string url) diff --git a/src/slic3r/Utils/OctoPrint.hpp b/src/slic3r/Utils/OctoPrint.hpp index ed1c61bd607..f1b36096c65 100644 --- a/src/slic3r/Utils/OctoPrint.hpp +++ b/src/slic3r/Utils/OctoPrint.hpp @@ -20,7 +20,7 @@ class OctoPrint : public PrintHost OctoPrint(DynamicPrintConfig *config); ~OctoPrint() override = default; - const char* get_name() const; + const char* get_name() const override; bool test(wxString &curl_msg) const override; wxString get_test_ok_msg () const override; diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index 60dfe05c78e..f0310073fdd 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -206,7 +206,7 @@ bool PresetUpdater::priv::get_file(const std::string &url, const fs::path &targe tmp_path.string()); Http::get(url) - .on_progress([this](Http::Progress, bool &cancel) { + .on_progress([](Http::Progress, bool &cancel) { if (cancel) { cancel = true; } }) .on_error([&](std::string body, std::string error, unsigned http_status) { @@ -406,7 +406,7 @@ Updates PresetUpdater::priv::get_config_updates(const Semver &old_slic3r_version BOOST_LOG_TRIVIAL(info) << "Checking for cached configuration updates..."; // Over all indices from the cache directory: - for (const auto idx : index_db) { + for (const Index& idx : index_db) { auto bundle_path = vendor_path / (idx.vendor() + ".ini"); auto bundle_path_idx = vendor_path / idx.path().filename(); @@ -679,11 +679,11 @@ void PresetUpdater::sync(PresetBundle *preset_bundle) // into the closure (but perhaps the compiler can elide this). VendorMap vendors = preset_bundle->vendors; - p->thread = std::move(std::thread([this, vendors]() { + p->thread = std::thread([this, vendors]() { this->p->prune_tmps(); this->p->sync_version(); this->p->sync_config(std::move(vendors)); - })); + }); } void PresetUpdater::slic3r_update_notify() diff --git a/src/slic3r/Utils/Repetier.cpp b/src/slic3r/Utils/Repetier.cpp index 115ea010ef9..7b66922d708 100644 --- a/src/slic3r/Utils/Repetier.cpp +++ b/src/slic3r/Utils/Repetier.cpp @@ -190,7 +190,7 @@ bool Repetier::get_groups(wxArrayString& groups) const http.on_error([&](std::string body, std::string error, unsigned status) { BOOST_LOG_TRIVIAL(error) << boost::format("%1%: Error getting version: %2%, HTTP %3%, body: `%4%`") % name % error % status % body; }) - .on_complete([&, this](std::string body, unsigned) { + .on_complete([&](std::string body, unsigned) { BOOST_LOG_TRIVIAL(debug) << boost::format("%1%: Got groups: %2%") % name % body; try { @@ -233,7 +233,7 @@ bool Repetier::get_printers(wxArrayString& printers) const BOOST_LOG_TRIVIAL(error) << boost::format("%1%: Error listing printers: %2%, HTTP %3%, body: `%4%`") % name % error % status % body; res = false; }) - .on_complete([&, this](std::string body, unsigned http_status) { + .on_complete([&](std::string body, unsigned http_status) { BOOST_LOG_TRIVIAL(debug) << boost::format("%1%: Got printers: %2%, HTTP status: %3%") % name % body % http_status; if (http_status != 200) diff --git a/src/slic3r/Utils/Repetier.hpp b/src/slic3r/Utils/Repetier.hpp index d94d7ec56ab..5141dc040bb 100644 --- a/src/slic3r/Utils/Repetier.hpp +++ b/src/slic3r/Utils/Repetier.hpp @@ -19,7 +19,7 @@ class Repetier : public PrintHost Repetier(DynamicPrintConfig *config); ~Repetier() override = default; - const char* get_name() const; + const char* get_name() const override; bool test(wxString &curl_msg) const override; wxString get_test_ok_msg () const override; diff --git a/src/slic3r/Utils/UndoRedo.cpp b/src/slic3r/Utils/UndoRedo.cpp index d82d9e31db8..697c1209dee 100644 --- a/src/slic3r/Utils/UndoRedo.cpp +++ b/src/slic3r/Utils/UndoRedo.cpp @@ -209,7 +209,7 @@ class ImmutableObjectHistory : public ObjectHistory bool is_immutable() const override { return true; } bool is_optional() const override { return m_optional; } // If it is an immutable object, return its pointer. There is a map assigning a temporary ObjectID to the immutable object pointer. - const void* immutable_object_ptr() const { return (const void*)m_shared_object.get(); } + const void* immutable_object_ptr() const override { return (const void*)m_shared_object.get(); } // Estimated size in memory, to be used to drop least recently used snapshots. size_t memsize() const override { diff --git a/tests/fff_print/test_printobject.cpp b/tests/fff_print/test_printobject.cpp index 84df95201ab..8d322f58fe2 100644 --- a/tests/fff_print/test_printobject.cpp +++ b/tests/fff_print/test_printobject.cpp @@ -18,7 +18,7 @@ SCENARIO("PrintObject: object layer heights", "[PrintObject]") { { "layer_height", 2 }, { "nozzle_diameter", 3 } }); - const std::vector &layers = print.objects().front()->layers(); + ConstLayerPtrsAdaptor layers = print.objects().front()->layers(); THEN("The output vector has 10 entries") { REQUIRE(layers.size() == 10); } @@ -37,7 +37,7 @@ SCENARIO("PrintObject: object layer heights", "[PrintObject]") { { "layer_height", 10 }, { "nozzle_diameter", 11 } }); - const std::vector &layers = print.objects().front()->layers(); + ConstLayerPtrsAdaptor layers = print.objects().front()->layers(); THEN("The output vector has 3 entries") { REQUIRE(layers.size() == 3); } @@ -55,7 +55,7 @@ SCENARIO("PrintObject: object layer heights", "[PrintObject]") { { "layer_height", 15 }, { "nozzle_diameter", 16 } }); - const std::vector &layers = print.objects().front()->layers(); + ConstLayerPtrsAdaptor layers = print.objects().front()->layers(); THEN("The output vector has 2 entries") { REQUIRE(layers.size() == 2); } diff --git a/tests/fff_print/test_support_material.cpp b/tests/fff_print/test_support_material.cpp index 01d85813236..1b85532d315 100644 --- a/tests/fff_print/test_support_material.cpp +++ b/tests/fff_print/test_support_material.cpp @@ -27,7 +27,7 @@ SCENARIO("SupportMaterial: support_layers_z and contact_distance", "[SupportMate auto check = [](Slic3r::Print &print, bool &first_support_layer_height_ok, bool &layer_height_minimum_ok, bool &layer_height_maximum_ok, bool &top_spacing_ok) { - const std::vector &support_layers = print.objects().front()->support_layers(); + ConstSupportLayerPtrsAdaptor support_layers = print.objects().front()->support_layers(); first_support_layer_height_ok = support_layers.front()->print_z == print.default_object_config().first_layer_height.value; diff --git a/tests/libslic3r/test_elephant_foot_compensation.cpp b/tests/libslic3r/test_elephant_foot_compensation.cpp index a571e8d0350..180f678c562 100644 --- a/tests/libslic3r/test_elephant_foot_compensation.cpp +++ b/tests/libslic3r/test_elephant_foot_compensation.cpp @@ -16,6 +16,7 @@ using namespace Slic3r; namespace Slic3r { ClipperLib::Path mittered_offset_path_scaled(const Points& contour, const std::vector& deltas, double miter_limit); +#if 0 static Points mittered_offset_path_scaled_points(const Points& contour, const std::vector& deltas, double miter_limit) { Points out; @@ -29,6 +30,7 @@ namespace Slic3r { } return out; } +#endif } static ExPolygon spirograph_gear_1mm() @@ -494,6 +496,7 @@ SCENARIO("Elephant foot compensation", "[ElephantFoot]") { ExPolygon input = spirograph_gear_1mm().simplify(SCALED_EPSILON).front(); ExPolygon output; std::vector deltas(input.contour.points.size(), scale_(1.)); + // mittered_offset_path_scaled_points is commented out somewhere above output.contour.points = Slic3r::mittered_offset_path_scaled_points(input.contour.points, deltas, 2.); #ifdef TESTS_EXPORT_SVGS { diff --git a/tests/libslic3r/test_marchingsquares.cpp b/tests/libslic3r/test_marchingsquares.cpp index e9e016157ec..1a4b1fb72f4 100644 --- a/tests/libslic3r/test_marchingsquares.cpp +++ b/tests/libslic3r/test_marchingsquares.cpp @@ -326,7 +326,9 @@ static void recreate_object_from_rasters(const std::string &objname, float lh) { double disp_w = 120.96; double disp_h = 68.04; +#ifndef NDEBUG size_t cntr = 0; +#endif for (ExPolygons &layer : layers) { auto rst = create_raster(res, disp_w, disp_h); diff --git a/tests/libslic3r/test_voronoi.cpp b/tests/libslic3r/test_voronoi.cpp index b847a890b46..bbcea7301fd 100644 --- a/tests/libslic3r/test_voronoi.cpp +++ b/tests/libslic3r/test_voronoi.cpp @@ -38,6 +38,26 @@ TEST_CASE("Voronoi missing edges - points 12067", "[Voronoi]") { -5, 0 } }; +#if 0 + for (Point &p : pts) { + Vec2d q = p.cast(); + p.x() = scale_(p.x()); + p.y() = scale_(p.y()); + } +#endif + +#if 0 + // Try to rotate, maybe the issue is caused by incorrect handling of vertical or horizontal edges? + double a = 0.18764587962597876897475f; + double c = cos(a); + double s = sin(a); + for (Point &p : poly.points) { + Vec2d q = p.cast(); + p.x() = coord_t(q.x() * c + q.y() * s + 0.5); + p.y() = coord_t(- q.x() * s + q.y() * c + 0.5); + } +#endif + // Construction of the Voronoi Diagram. VD vd; construct_voronoi(pts.begin(), pts.end(), &vd); @@ -133,33 +153,40 @@ TEST_CASE("Voronoi missing edges - Alessandro gapfill 12707", "[Voronoi]") { { 41427551, 0}, { 42127548, 699996 } } }; - Lines lines = to_lines(Polygon { - { 0, 10000000}, - { 700000, 1}, // it has to be 1, higher number, zero or -1 work. - { 700000, 9000000}, - { 9100000, 9000000}, - { 9100000, 0}, - {10000000, 10000000} - }); + Polygon poly { + { 0, 10000000}, + { 700000, 1}, // it has to be 1, higher number, zero or -1 work. + { 700000, 9000000}, + { 9100000, 9000000}, + { 9100000, 0}, + {10000000, 10000000} + }; + +#if 1 + // Try to rotate, maybe the issue is caused by incorrect handling of vertical or horizontal edges? + double a = 0.18764587962597876897475f; + double c = cos(a); + double s = sin(a); + for (Point &p : poly.points) { + Vec2d q = p.cast(); + p.x() = coord_t(q.x() * c + q.y() * s + 0.5); + p.y() = coord_t(- q.x() * s + q.y() * c + 0.5); + } +#endif - Polygon poly; std::mt19937 gen; std::uniform_int_distribution dist(-100, 100); - for (size_t i = 0; i < lines.size(); ++ i) { - Line &l1 = lines[i]; - Line &l2 = lines[(i + 1) % lines.size()]; - REQUIRE(l1.b.x() == l2.a.x()); - REQUIRE(l1.b.y() == l2.a.y()); #if 0 + for (Point &p : poly.points) { // Wiggle the points a bit to find out whether this fixes the voronoi diagram for this particular polygon. - l1.b.x() = (l2.a.x() += dist(gen)); - l1.b.y() = (l2.a.y() += dist(gen)); -#endif - poly.points.emplace_back(l1.a); + p.x() = (p.x() += dist(gen)); + p.y() = (p.y() += dist(gen)); } +#endif REQUIRE(intersecting_edges({ poly }).empty()); + Lines lines = to_lines(poly); VD vd; construct_voronoi(lines.begin(), lines.end(), &vd); @@ -169,6 +196,114 @@ TEST_CASE("Voronoi missing edges - Alessandro gapfill 12707", "[Voronoi]") #endif } +TEST_CASE("Voronoi weirdness", "[Voronoi]") +{ + Polygon poly2 { + { 0, 0 }, + { 70000000, 0 }, + { 70000000, 1300000 }, +// { 70000001, 14000000 } + { 70700000, 14000000 } + }; + + Polygon poly5 { + { 35058884, -25732145 }, + { 35058884, -19586070 }, + { 32753739, -20246796 }, + { 28756244, -21010725 }, + { 24657532, -21657939 }, + { 20836260, -21960233 }, + { 16115145, -22070742 }, + { 11850152, -21839761 }, + { 7646240, -21470177 }, + { 3607605, -20786940 }, + { 1280947, -20329742 }, + { -292823, -19963790 }, + { -3844469, -18809741 }, + { -7237277, -17593723 }, + { -10225900, -16143761 }, + { -13030266, -14643721 }, + { -15404294, -12977561 }, + { -17601713, -11280712 }, + { -19241930, -9435607 }, + { -20714420, -7583739 }, + { -21726144, -5664355 }, + { -22579294, -3741947 }, + { -22966684, -1786321 }, + { -23200322, 170140 }, + { -22966684, 2126602 }, + { -22579296, 4082227 }, + { -21726148, 6004637 }, + { -20714424, 7924020 }, + { -19241932, 9775888 }, + { -17601717, 11620994 }, + { -15404423, 13317749 }, + { -13030276, 14984003 }, + { -10225910, 16484042 }, + { -7237288, 17934005 }, + { -3844482, 19150025 }, + { -292841, 20304074 }, + { 1280949, 20670031 }, + { 3607587, 21127226 }, + { 7646218, 21810465 }, + { 11850128, 22180055 }, + { 16115122, 22411036 }, + { 20836263, 22300531 }, + { 24657513, 21998239 }, + { 28756227, 21351025 }, + { 32753725, 20587092 }, + { 35058893, 19926309 }, + { 35058893, 35000000 }, + { -31657232, 35000000 }, + { -31657202, -35000000 }, + { 35058881, -35000000 } + }; + + Polygon poly7 { + { 35058884, -25732145 }, + { 35058884, -19586070 }, + { -31657202, -35000000 }, + { 35058881, -35000000 } + }; + +// coord_t shift = 35058881; +// coord_t shift_ok = 17000000; + coord_t shift = 35058881; + Polygon poly { + // <-4, 0>: bug + // -5: ok + // 1 - ok + { 0 + shift, -35000000 }, + { 0 + shift, -25732145 }, + { 0 + shift, -19586070 }, + { -66716086 + shift, -35000000 } + }; + + REQUIRE(intersecting_edges({ poly }).empty()); + REQUIRE(poly.area() > 0.); + +#if 0 + // Try to rotate, maybe the issue is caused by incorrect handling of vertical or horizontal edges? + double a = 0.18764587962597876897475f; + double c = cos(a); + double s = sin(a); + for (Point &p : poly.points) { + Vec2d q = p.cast(); + p.x() = coord_t(q.x() * c + q.y() * s + 0.5); + p.y() = coord_t(- q.x() * s + q.y() * c + 0.5); + } +#endif + + VD vd; + Lines lines = to_lines(poly); + construct_voronoi(lines.begin(), lines.end(), &vd); + +#ifdef VORONOI_DEBUG_OUT + dump_voronoi_to_svg(debug_out_path("voronoi-weirdness.svg").c_str(), + vd, Points(), lines); +#endif +} + // https://svn.boost.org/trac10/ticket/12903 // division by zero reported, but this issue is most likely a non-issue, as it produces an infinity for the interval of validity // of the floating point calculation, therefore forcing a recalculation with extended accuracy. @@ -1228,7 +1363,7 @@ TEST_CASE("Voronoi offset", "[VoronoiOffset]") for (const OffsetTest &ot : { OffsetTest { scale_(0.2), 1, 1 }, OffsetTest { scale_(0.4), 1, 1 }, - OffsetTest { scale_(0.5), 1, 1 }, + OffsetTest { scale_(0.5), 1, 2 }, OffsetTest { scale_(0.505), 1, 2 }, OffsetTest { scale_(0.51), 1, 2 }, OffsetTest { scale_(0.52), 1, 1 }, @@ -1237,21 +1372,21 @@ TEST_CASE("Voronoi offset", "[VoronoiOffset]") OffsetTest { scale_(0.55), 1, 0 } }) { - Polygons offsetted_polygons_out = voronoi_offset(vd, lines, ot.distance, scale_(0.005)); - REQUIRE(offsetted_polygons_out.size() == ot.num_outer); - +#if 0 + Polygons offsetted_polygons_out = Slic3r::Voronoi::offset(vd, lines, ot.distance, scale_(0.005)); #ifdef VORONOI_DEBUG_OUT dump_voronoi_to_svg(debug_out_path("voronoi-offset-out-%lf.svg", ot.distance).c_str(), vd, Points(), lines, offsetted_polygons_out); #endif + REQUIRE(offsetted_polygons_out.size() == ot.num_outer); +#endif - Polygons offsetted_polygons_in = voronoi_offset(vd, lines, - ot.distance, scale_(0.005)); - REQUIRE(offsetted_polygons_in.size() == ot.num_inner); - + Polygons offsetted_polygons_in = Slic3r::Voronoi::offset(vd, lines, - ot.distance, scale_(0.005)); #ifdef VORONOI_DEBUG_OUT dump_voronoi_to_svg(debug_out_path("voronoi-offset-in-%lf.svg", ot.distance).c_str(), vd, Points(), lines, offsetted_polygons_in); #endif + REQUIRE(offsetted_polygons_in.size() == ot.num_inner); } } @@ -1296,21 +1431,20 @@ TEST_CASE("Voronoi offset 2", "[VoronoiOffset]") OffsetTest { scale_(0.4), 2, 2 }, OffsetTest { scale_(0.45), 2, 2 }, OffsetTest { scale_(0.48), 2, 2 }, -//FIXME Exact intersections of an Offset curve with any Voronoi vertex are not handled correctly yet. -// OffsetTest { scale_(0.5), 2, 2 }, + OffsetTest { scale_(0.5), 2, 4 }, OffsetTest { scale_(0.505), 2, 4 }, OffsetTest { scale_(0.7), 2, 0 }, OffsetTest { scale_(0.8), 1, 0 } }) { - Polygons offsetted_polygons_out = voronoi_offset(vd, lines, ot.distance, scale_(0.005)); + Polygons offsetted_polygons_out = Slic3r::Voronoi::offset(vd, lines, ot.distance, scale_(0.005)); #ifdef VORONOI_DEBUG_OUT dump_voronoi_to_svg(debug_out_path("voronoi-offset2-out-%lf.svg", ot.distance).c_str(), vd, Points(), lines, offsetted_polygons_out); #endif REQUIRE(offsetted_polygons_out.size() == ot.num_outer); - Polygons offsetted_polygons_in = voronoi_offset(vd, lines, - ot.distance, scale_(0.005)); + Polygons offsetted_polygons_in = Slic3r::Voronoi::offset(vd, lines, - ot.distance, scale_(0.005)); #ifdef VORONOI_DEBUG_OUT dump_voronoi_to_svg(debug_out_path("voronoi-offset2-in-%lf.svg", ot.distance).c_str(), vd, Points(), lines, offsetted_polygons_in); @@ -1360,14 +1494,13 @@ TEST_CASE("Voronoi offset 3", "[VoronoiOffset]") VD vd; Lines lines = to_lines(poly); - construct_voronoi(lines.begin(), lines.end(), &vd); + construct_voronoi(lines.begin(), lines.end(), &vd); for (const OffsetTest &ot : { OffsetTest { scale_(0.2), 2, 2 }, OffsetTest { scale_(0.4), 2, 2 }, OffsetTest { scale_(0.49), 2, 2 }, -//FIXME this fails -// OffsetTest { scale_(0.5), 2, 2 }, + OffsetTest { scale_(0.5), 2, 2 }, OffsetTest { scale_(0.51), 2, 2 }, OffsetTest { scale_(0.56), 2, 2 }, OffsetTest { scale_(0.6), 2, 2 }, @@ -1375,23 +1508,417 @@ TEST_CASE("Voronoi offset 3", "[VoronoiOffset]") OffsetTest { scale_(0.8), 1, 6 }, OffsetTest { scale_(0.9), 1, 6 }, OffsetTest { scale_(0.99), 1, 6 }, -//FIXME this fails -// OffsetTest { scale_(1.0), 1, 6 }, + OffsetTest { scale_(1.0), 1, 0 }, OffsetTest { scale_(1.01), 1, 0 }, }) { - Polygons offsetted_polygons_out = voronoi_offset(vd, lines, ot.distance, scale_(0.005)); + Polygons offsetted_polygons_out = Slic3r::Voronoi::offset(vd, lines, ot.distance, scale_(0.005)); #ifdef VORONOI_DEBUG_OUT - dump_voronoi_to_svg(debug_out_path("voronoi-offset2-out-%lf.svg", ot.distance).c_str(), + dump_voronoi_to_svg(debug_out_path("voronoi-offset3-out-%lf.svg", ot.distance).c_str(), vd, Points(), lines, offsetted_polygons_out); #endif REQUIRE(offsetted_polygons_out.size() == ot.num_outer); - Polygons offsetted_polygons_in = voronoi_offset(vd, lines, - ot.distance, scale_(0.005)); + Polygons offsetted_polygons_in = Slic3r::Voronoi::offset(vd, lines, - ot.distance, scale_(0.005)); #ifdef VORONOI_DEBUG_OUT - dump_voronoi_to_svg(debug_out_path("voronoi-offset2-in-%lf.svg", ot.distance).c_str(), + dump_voronoi_to_svg(debug_out_path("voronoi-offset3-in-%lf.svg", ot.distance).c_str(), vd, Points(), lines, offsetted_polygons_in); #endif REQUIRE(offsetted_polygons_in.size() == ot.num_inner); } } + +TEST_CASE("Voronoi offset with edge collapse", "[VoronoiOffset4]") +{ + Polygons poly + { + // Outer contour + { + { 434890, -64754575 }, + { 541060, -64669076 }, + { 585647, -64583538 }, + { 576999, -64484233 }, + { 485666, -64191173 }, + { 1029323, -63646261 }, + { 1416925, -63666243 }, + { 1541532, -63643075 }, + { 1541535, -63643075 }, + { 1541535, -63643074 }, + { 1552612, -63641015 }, + { 1631609, -63568270 }, + { 1678393, -63443639 }, + { 1725519, -63219942 }, + { 1770552, -62903321 }, + { 1742544, -62755934 }, + { 1758152, -62588378 }, + { 1702289, -62474826 }, + { 1638627, -62242058 }, + { 1671281, -61938568 }, + { 1792676, -61478332 }, + { 1934894, -60760597 }, + { 2160333, -60064089 }, + { 2638183, -58972890 }, + { 2933095, -58478536 }, + { 3173586, -58159527 }, + { 3557779, -57556727 }, + { 3707088, -57158174 }, + { 3758053, -56907139 }, + { 3935932, -56278649 }, + { 4077331, -56033426 }, + { 4151386, -55768739 }, + { 4293796, -55561683 }, + { 4383089, -55387391 }, + { 4614128, -55201443 }, + { 5268755, -54333831 }, + { 5547634, -53797296 }, + { 5573864, -53639250 }, + { 5736812, -53304157 }, + { 6090973, -52066302 }, + { 6148630, -51666664 }, + { 6189511, -50974991 }, + { 6244112, -50774489 }, + { 6302489, -50761556 }, + { 6511179, -50579861 }, + { 6778128, -50398667 }, + { 6896879, -50350264 }, + { 7388259, -49913262 }, + { 7630584, -49602449 }, + { 7886846, -48987881 }, + { 7871333, -48318666 }, + { 7770349, -47841179 }, + { 7570223, -47234733 }, + { 7283115, -46705503 }, + { 6842948, -46056539 }, + { 6612732, -45760004 }, + { 6150430, -44991494 }, + { 5564326, -44168114 }, + { 5193032, -43807544 }, + { 4932097, -43489047 }, + { 3857385, -42548846 }, + { 3764745, -42081468 }, + { 3539887, -41422273 }, + { 3283048, -40803856 }, + { 3005925, -40367981 }, + { 3136185, -39834533 }, + { 3333757, -38499972 }, + { 3360660, -38183895 }, + { 3353375, -38036005 }, + { 3398808, -37582504 }, + { 3604229, -37221781 }, + { 3698079, -36962934 }, + { 4000449, -36007804 }, + { 4256811, -35016707 }, + { 4405951, -34581428 }, + { 4364534, -34178439 }, + { 4124603, -33432250 }, + { 3806159, -32765167 }, + { 3359088, -32109020 }, + { 2880790, -31317192 }, + { 1548334, -30402139 }, + { -7, -30131023 }, + { -1548347, -30402139 }, + { -2880803, -31317189 }, + { -3359100, -32109018 }, + { -3806173, -32765166 }, + { -4124617, -33432248 }, + { -4364548, -34178436 }, + { -4405966, -34581423 }, + { -4256825, -35016707 }, + { -4000461, -36007800 }, + { -3698093, -36962933 }, + { -3604243, -37221781 }, + { -3398823, -37582501 }, + { -3353390, -38036003 }, + { -3360675, -38183892 }, + { -3333772, -38499972 }, + { -3136200, -39834530 }, + { -3005940, -40367980 }, + { -3283062, -40803852 }, + { -3539902, -41422273 }, + { -3764761, -42081468 }, + { -3857402, -42548846 }, + { -4932112, -43489047 }, + { -5193047, -43807544 }, + { -5564341, -44168114 }, + { -6150446, -44991494 }, + { -6612748, -45760000 }, + { -6842965, -46056536 }, + { -7283130, -46705503 }, + { -7570238, -47234733 }, + { -7770365, -47841179 }, + { -7871349, -48318666 }, + { -7886860, -48987873 }, + { -7630599, -49602451 }, + { -7388277, -49913260 }, + { -6896896, -50350264 }, + { -6778145, -50398667 }, + { -6511196, -50579862 }, + { -6302504, -50761557 }, + { -6244127, -50774488 }, + { -6189527, -50974989 }, + { -6148648, -51666664 }, + { -6090990, -52066302 }, + { -5736829, -53304157 }, + { -5573882, -53639250 }, + { -5547651, -53797296 }, + { -5268772, -54333831 }, + { -4614145, -55201443 }, + { -4383106, -55387389 }, + { -4293814, -55561683 }, + { -4151404, -55768739 }, + { -4077350, -56033423 }, + { -3935952, -56278647 }, + { -3758072, -56907137 }, + { -3707107, -57158170 }, + { -3557796, -57556727 }, + { -3173605, -58159527 }, + { -2933113, -58478536 }, + { -2638201, -58972890 }, + { -2295003, -59738435 }, + { -2160353, -60064089 }, + { -1978487, -60596626 }, + { -1792695, -61478332 }, + { -1671298, -61938574 }, + { -1638646, -62242058 }, + { -1702306, -62474826 }, + { -1758168, -62588380 }, + { -1742563, -62755934 }, + { -1770570, -62903317 }, + { -1725537, -63219946 }, + { -1678412, -63443639 }, + { -1631627, -63568270 }, + { -1553479, -63640201 }, + { -1416944, -63666243 }, + { -998854, -63645714 }, + { -485685, -64191173 }, + { -577019, -64484225 }, + { -585667, -64583538 }, + { -541079, -64669076 }, + { -434910, -64754575 }, + { -294192, -64810609 }, + { 294172, -64810609 }, + }, + // Hole 1 + { + { -842246, -45167428 }, + { -1473641, -45154392 }, + { -2181728, -45100161 }, + { -2804308, -44985842 }, + { -3100514, -44879269 }, + { -3836807, -44802155 }, + { -4035816, -44718913 }, + { -4167175, -44583299 }, + { -4496705, -44467674 }, + { -4486674, -44382045 }, + { -4343949, -44070577 }, + { -3740991, -43494686 }, + { -2701372, -43313358 }, + { -1493599, -43312838 }, + { -8, -43352868 }, + { 1414575, -43313336 }, + { 2701358, -43313358 }, + { 3095462, -43374735 }, + { 3740975, -43494686 }, + { 4343934, -44070583 }, + { 4486657, -44382044 }, + { 4496688, -44467670 }, + { 4167159, -44583300 }, + { 4035800, -44718913 }, + { 3836792, -44802155 }, + { 3100498, -44879269 }, + { 2804292, -44985842 }, + { 2181712, -45100161 }, + { 1473625, -45154389 }, + { 842231, -45167428 }, + { -8, -45232686 }, + }, + // Hole 2 + { + { 1657455, -63016679 }, + { 1723196, -63056286 }, + { 1541535, -63643074 }, + { 1541532, -63643075 }, + { 1030020, -63645562 }, + } + }; + + + VD vd; + Lines lines = to_lines(poly); + construct_voronoi(lines.begin(), lines.end(), &vd); + + for (const OffsetTest &ot : { + OffsetTest { scale_(0.2), 2, 2 }, + OffsetTest { scale_(0.4), 2, 2 }, + OffsetTest { scale_(0.49), 2, 3 }, + OffsetTest { scale_(0.51), 2, 2 }, + OffsetTest { scale_(0.56), 2, 2 }, + OffsetTest { scale_(0.6), 2, 2 }, + OffsetTest { scale_(0.7), 2, 2 }, + OffsetTest { scale_(0.8), 2, 2 }, + OffsetTest { scale_(0.9), 2, 2 }, + OffsetTest { scale_(0.99), 1, 2 }, + OffsetTest { scale_(1.0), 1, 2 }, + OffsetTest { scale_(1.01), 1, 2 }, + }) { + + Polygons offsetted_polygons_out = Slic3r::Voronoi::offset(vd, lines, ot.distance, scale_(0.005)); +#ifdef VORONOI_DEBUG_OUT + dump_voronoi_to_svg(debug_out_path("voronoi-offset3-out-%lf.svg", ot.distance).c_str(), + vd, Points(), lines, offsetted_polygons_out); +#endif + REQUIRE(offsetted_polygons_out.size() == ot.num_outer); + + Polygons offsetted_polygons_in = Slic3r::Voronoi::offset(vd, lines, - ot.distance, scale_(0.005)); +#ifdef VORONOI_DEBUG_OUT + dump_voronoi_to_svg(debug_out_path("voronoi-offset3-in-%lf.svg", ot.distance).c_str(), + vd, Points(), lines, offsetted_polygons_in); +#endif + REQUIRE(offsetted_polygons_in.size() == ot.num_inner); + } +} + +// A sample extracted from file medallion_printable_fixed-teeth.stl from https://www.thingiverse.com/thing:1347129 +// This test for offset scale_(2.9) and bigger +// triggers assert(r < std::max(d0, d1) + EPSILON) in function first_circle_segment_intersection_parameter. +TEST_CASE("Voronoi offset 5", "[VoronoiOffset5]") +{ + Polygons poly = { + Polygon { + { 0 , -16077501 }, + { 3015222 , -16142836 }, + { 3072642 , -16138163 }, + { 3094279 , -16105662 }, + { 3110660 , -15140728 }, + { 3157438 , -14105326 }, + { 3338367 , -11081394 }, + { 3443412 , -8381621 }, + { 3472489 , -6084497 }, + { 3445790 , -5962924 }, + { 3061725 , -6003484 }, + { 3030326 , -6030622 }, + { 2989343 , -6270378 }, + { 2903752 , -7368176 }, + { 2856704 , -7740619 }, + { 2795743 , -7978809 }, + { 2729231 , -8098866 }, + { 2666509 , -8131138 }, + { 2614169 , -8112308 }, + { 2561157 , -8032014 }, + { 2488290 , -7479351 }, + { 2453360 , -6911556 }, + { 2456148 , -6463146 }, + { 2546029 , -4580396 }, + { 2688181 , -2593262 }, + { 2717617 , -1700519 }, + { 2682232 , -1128411 }, + { 2631029 , -832886 }, + { 2535941 , -504483 }, + { 2399115 , -199303 }, + { 2290997 , -171213 }, + { 611824 , -132865 }, + { 6419 , -375849 }, + { -611825 , -132865 }, + { -2377355 , -185241 }, + { -2420740 , -231171 }, + { -2535942 , -504484 }, + { -2631030 , -832887 }, + { -2684831 , -1150821 }, + { -2714840 , -1586454 }, + { -2688181 , -2593262 }, + { -2546030 , -4580396 }, + { -2456149 , -6463145 }, + { -2453361 , -6911557 }, + { -2488291 , -7479352 }, + { -2561159 , -8032018 }, + { -2614171 , -8112309 }, + { -2666509 , -8131138 }, + { -2729233 , -8098868 }, + { -2795744 , -7978809 }, + { -2856706 , -7740619 }, + { -2903752 , -7368176 }, + { -2989345 , -6270378 }, + { -3030327 , -6030622 }, + { -3061726 , -6003484 }, + { -3445790 , -5962924 }, + { -3472490 , -6084498 }, + { -3468804 , -7244095 }, + { -3399287 , -9714025 }, + { -3338368 , -11081395 }, + { -3141015 , -14446051 }, + { -3094280 , -16105662 }, + { -3072643 , -16138163 }, + { -3008836 , -16143225 } + } + }; + double area = std::accumulate(poly.begin(), poly.end(), 0., [](double a, auto &poly){ return a + poly.area(); }); + REQUIRE(area > 0.); + + VD vd; + Lines lines = to_lines(poly); + construct_voronoi(lines.begin(), lines.end(), &vd); + + for (const OffsetTest &ot : { + OffsetTest { scale_(2.8), 1, 1 }, + OffsetTest { scale_(2.9), 1, 1 }, + OffsetTest { scale_(3.0), 1, 1 }, + }) { + + Polygons offsetted_polygons_out = Slic3r::Voronoi::offset(vd, lines, ot.distance, scale_(0.005)); +#ifdef VORONOI_DEBUG_OUT + dump_voronoi_to_svg(debug_out_path("voronoi-offset5-out-%lf.svg", ot.distance).c_str(), + vd, Points(), lines, offsetted_polygons_out); +#endif + REQUIRE(offsetted_polygons_out.size() == ot.num_outer); + + Polygons offsetted_polygons_in = Slic3r::Voronoi::offset(vd, lines, - ot.distance, scale_(0.005)); +#ifdef VORONOI_DEBUG_OUT + dump_voronoi_to_svg(debug_out_path("voronoi-offset5-in-%lf.svg", ot.distance).c_str(), + vd, Points(), lines, offsetted_polygons_in); +#endif + REQUIRE(offsetted_polygons_in.size() == ot.num_inner); + } +} + +TEST_CASE("Voronoi skeleton", "[VoronoiSkeleton]") +{ + coord_t mm = coord_t(scale_(1.)); + Polygons poly = { + Polygon { + { 0, 0 }, + { 1, 0 }, + { 1, 1 }, + { 2, 1 }, + { 2, 0 }, + { 3, 0 }, + { 3, 2 }, + { 0, 2 } + }, + Polygon { + { 0, - 1 - 2 }, + { 3, - 1 - 2 }, + { 3, - 1 - 0 }, + { 2, - 1 - 0 }, + { 2, - 1 - 1 }, + { 1, - 1 - 1 }, + { 1, - 1 - 0 }, + { 0, - 1 - 0 } + }, + }; + for (Polygon &p : poly) + for (Point &pt : p.points) + pt *= mm; + + double area = std::accumulate(poly.begin(), poly.end(), 0., [](double a, auto &poly){ return a + poly.area(); }); + REQUIRE(area > 0.); + + VD vd; + Lines lines = to_lines(poly); + construct_voronoi(lines.begin(), lines.end(), &vd); + Slic3r::Voronoi::annotate_inside_outside(vd, lines); + Slic3r::Voronoi::annotate_inside_outside(vd, lines); + static constexpr double threshold_alpha = M_PI / 12.; // 30 degrees + std::vector skeleton_edges = Slic3r::Voronoi::skeleton_edges_rough(vd, lines, threshold_alpha); + + REQUIRE(! skeleton_edges.empty()); +} diff --git a/xs/src/xsinit.h b/xs/src/xsinit.h index 2082dfb8839..cbb55077bab 100644 --- a/xs/src/xsinit.h +++ b/xs/src/xsinit.h @@ -75,6 +75,7 @@ #undef times #undef accept #undef wait + #undef abort // Breaks compilation with Eigen matrices embedded into Slic3r::Point. #undef malloc diff --git a/xs/xsp/Print.xsp b/xs/xsp/Print.xsp index d9872aa7e32..cc3dac22478 100644 --- a/xs/xsp/Print.xsp +++ b/xs/xsp/Print.xsp @@ -95,16 +95,16 @@ _constant() int wipe_tower_number_of_toolchanges() %code%{ RETVAL = THIS->wipe_tower_data().number_of_toolchanges; %}; PrintObjectPtrs* objects() - %code%{ RETVAL = const_cast(&THIS->objects()); %}; + %code%{ RETVAL = const_cast(&THIS->objects_mutable()); %}; Ref get_object(int idx) - %code%{ RETVAL = THIS->objects()[idx]; %}; + %code%{ RETVAL = THIS->objects_mutable()[idx]; %}; size_t object_count() %code%{ RETVAL = THIS->objects().size(); %}; PrintRegionPtrs* regions() - %code%{ RETVAL = const_cast(&THIS->regions()); %}; + %code%{ RETVAL = const_cast(&THIS->regions_mutable()); %}; Ref get_region(int idx) - %code%{ RETVAL = THIS->regions()[idx]; %}; + %code%{ RETVAL = THIS->regions_mutable()[idx]; %}; size_t region_count() %code%{ RETVAL = THIS->regions().size(); %};