diff --git a/CMakeLists.txt b/CMakeLists.txt index 1d4576c37d..85b054bf05 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.8) +cmake_minimum_required(VERSION 3.13) project(PrusaSlicer) include("version.inc") @@ -393,6 +393,7 @@ endif () find_package(PNG REQUIRED) +set(OpenGL_GL_PREFERENCE "LEGACY") find_package(OpenGL REQUIRED) # Find glew or use bundled version @@ -509,9 +510,15 @@ endif() if (WIN32) install(DIRECTORY "${SLIC3R_RESOURCES_DIR}/" DESTINATION "${CMAKE_INSTALL_PREFIX}/resources") elseif (SLIC3R_FHS) + # CMAKE_INSTALL_FULL_DATAROOTDIR: read-only architecture-independent data root (share) set(SLIC3R_FHS_RESOURCES "${CMAKE_INSTALL_FULL_DATAROOTDIR}/PrusaSlicer") install(DIRECTORY "${SLIC3R_RESOURCES_DIR}/" DESTINATION "${SLIC3R_FHS_RESOURCES}") + install(FILES src/platform/unix/PrusaSlicer.desktop DESTINATION ${SLIC3R_FHS_RESOURCES}/applications) + install(FILES src/platform/unix/PrusaGcodeviewer.desktop DESTINATION ${SLIC3R_FHS_RESOURCES}/applications) else () + install(FILES src/platform/unix/PrusaSlicer.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/resources/applications) + install(FILES src/platform/unix/PrusaGcodeviewer.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/resources/applications) install(DIRECTORY "${SLIC3R_RESOURCES_DIR}/" DESTINATION "${CMAKE_INSTALL_PREFIX}/resources") endif () + configure_file(${LIBDIR}/platform/unix/fhs.hpp.in ${LIBDIR_BIN}/platform/unix/fhs.hpp) diff --git a/deps/CGAL/CGAL.cmake b/deps/CGAL/CGAL.cmake index f0584c5b58..fa88fc29ee 100644 --- a/deps/CGAL/CGAL.cmake +++ b/deps/CGAL/CGAL.cmake @@ -15,6 +15,17 @@ include(GNUInstallDirs) # If this file is not present, it will not consider the stored absolute path ExternalProject_Add_Step(dep_CGAL dep_CGAL_relocation_fix DEPENDEES install + COMMAND ${CMAKE_COMMAND} -E remove CGALConfig-installation-dirs.cmake WORKING_DIRECTORY "${DESTDIR}/usr/local/${CMAKE_INSTALL_LIBDIR}/cmake/CGAL" ) + +# Again, for whatever reason, CGAL thinks that its version is not relevant if +# configured as a header only library. Fixing it by placing a cmake version file +# besides the installed config file. +ExternalProject_Add_Step(dep_CGAL dep_CGAL_version_fix + DEPENDEES install + + COMMAND ${CMAKE_COMMAND} -E copy cgal/CGALConfigVersion.cmake "${DESTDIR}/usr/local/${CMAKE_INSTALL_LIBDIR}/cmake/CGAL/CGALConfigVersion.cmake" + WORKING_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}" +) diff --git a/deps/CGAL/cgal/CGALConfigVersion.cmake b/deps/CGAL/cgal/CGALConfigVersion.cmake new file mode 100644 index 0000000000..f688824e8b --- /dev/null +++ b/deps/CGAL/cgal/CGALConfigVersion.cmake @@ -0,0 +1,37 @@ +# This is a basic version file for the Config-mode of find_package(). +# It is used by write_basic_package_version_file() as input file for configure_file() +# to create a version-file which can be installed along a config.cmake file. +# +# The created file sets PACKAGE_VERSION_EXACT if the current version string and +# the requested version string are exactly the same and it sets +# PACKAGE_VERSION_COMPATIBLE if the current version is >= requested version. +# The variable CVF_VERSION must be set before calling configure_file(). + +set(PACKAGE_VERSION "5.0.0") + +if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION) + set(PACKAGE_VERSION_COMPATIBLE FALSE) +else() + set(PACKAGE_VERSION_COMPATIBLE TRUE) + if(PACKAGE_FIND_VERSION STREQUAL PACKAGE_VERSION) + set(PACKAGE_VERSION_EXACT TRUE) + endif() +endif() + + +# if the installed project requested no architecture check, don't perform the check +if("FALSE") + return() +endif() + +# if the installed or the using project don't have CMAKE_SIZEOF_VOID_P set, ignore it: +if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "" OR "8" STREQUAL "") + return() +endif() + +# check that the installed version has the same 32/64bit-ness as the one which is currently searching: +if(NOT CMAKE_SIZEOF_VOID_P STREQUAL "8") + math(EXPR installedBits "8 * 8") + set(PACKAGE_VERSION "${PACKAGE_VERSION} (${installedBits}bit)") + set(PACKAGE_VERSION_UNSUITABLE TRUE) +endif() diff --git a/deps/PNG/PNG.cmake b/deps/PNG/PNG.cmake index 01bd984998..3e55991fba 100644 --- a/deps/PNG/PNG.cmake +++ b/deps/PNG/PNG.cmake @@ -1,3 +1,4 @@ + prusaslicer_add_cmake_project(PNG GIT_REPOSITORY https://github.com/glennrp/libpng.git GIT_TAG v1.6.35 @@ -5,6 +6,7 @@ prusaslicer_add_cmake_project(PNG CMAKE_ARGS -DPNG_SHARED=OFF -DPNG_STATIC=ON + -DPNG_PREFIX=prusaslicer_ -DPNG_TESTS=OFF ) diff --git a/doc/How to build - Linux et al.md b/doc/How to build - Linux et al.md index 9206ae1ed2..a8f2441be5 100644 --- a/doc/How to build - Linux et al.md +++ b/doc/How to build - Linux et al.md @@ -56,6 +56,10 @@ This is done by passing this option to CMake: Note that PrusaSlicer is tested with wxWidgets 3.0 somewhat sporadically and so there may be bugs in bleeding edge releases. +When building on ubuntu 20.04 focal fossa, the package libwxgtk3.0-gtk3-dev needs to be installed instead of libwxgtk3.0-dev and you should use: + + -DSLIC3R_WX_STABLE=1 -DSLIC3R_GTK=3 + ### Build variant By default PrusaSlicer builds the release variant. diff --git a/doc/How to build - Windows.md b/doc/How to build - Windows.md index c2dc31ce31..cd5227dafc 100644 --- a/doc/How to build - Windows.md +++ b/doc/How to build - Windows.md @@ -125,11 +125,11 @@ intermediate files, which are not handled correctly by either `b2.exe` or possib # Noob guide (step by step) Install Visual Studio Community 2019 from -visualstudio.microsoft.com/vs/ +[visualstudio.microsoft.com/vs/](https://visualstudio.microsoft.com/vs/) Select all workload options for C++ Install git for Windows from -gitforwindows.org +[gitforwindows.org](https://gitforwindows.org/) download and run the exe accepting all defaults download PrusaSlicer-master.zip from github diff --git a/resources/data/flatpak/com.prusa3d.PrusaSlicer.desktop b/resources/data/flatpak/com.prusa3d.PrusaSlicer.desktop new file mode 100755 index 0000000000..8987222984 --- /dev/null +++ b/resources/data/flatpak/com.prusa3d.PrusaSlicer.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Name=PrusaSlicer +GenericName=3D Printing Software +Icon=com.prusa3d.PrusaSlicer +Exec=prusa-slicer %F +Terminal=false +Type=Application +MimeType=model/stl;model/x-wavefront-obj;model/3mf;model/x-geomview-off;application/x-amf; +Categories=Graphics;3DGraphics;Engineering; +Keywords=3D;Printing;Slicer;slice;3D;printer;convert;gcode;stl;obj;amf;SLA +StartupNotify=false +StartupWMClass=prusa-slicer \ No newline at end of file diff --git a/resources/data/flatpak/com.prusa3d.PrusaSlicer.metainfo.xml b/resources/data/flatpak/com.prusa3d.PrusaSlicer.metainfo.xml new file mode 100755 index 0000000000..b62a57e480 --- /dev/null +++ b/resources/data/flatpak/com.prusa3d.PrusaSlicer.metainfo.xml @@ -0,0 +1,62 @@ + + + com.prusa3d.PrusaSlicer + com.prusa3d.PrusaSlicer.desktop + + prusa-slicer.desktop + + PrusaSlicer + Powerful 3D printing slicer optimized for Prusa printers + 0BSD + AGPL-3.0-only + +

+ PrusaSlicer takes 3D models (STL, OBJ, AMF) and converts them into G-code + instructions for FFF printers or PNG layers for mSLA 3D printers. It's + compatible with any modern printer based on the RepRap toolchain, including all + those based on the Marlin, Prusa, Sprinter and Repetier firmware. It also works + with Mach3, LinuxCNC and Machinekit controllers. +

+

+ PrusaSlicer is based on Slic3r by Alessandro Ranelucci and the RepRap community. +

+

+ What are some of PrusaSlicer's main features? +

+ +
+ https://www.prusa3d.com/prusaslicer/ + https://help.prusa3d.com + https://github.com/prusa3d/PrusaSlicer/issues + + + https://user-images.githubusercontent.com/590307/78981854-24d07580-7b21-11ea-9441-77923534a659.png + + + https://user-images.githubusercontent.com/590307/78981860-2863fc80-7b21-11ea-8c2d-8ff79ced2578.png + + + https://user-images.githubusercontent.com/590307/78981862-28fc9300-7b21-11ea-9b0d-d03e16b709d3.png + + + + + + +

This is final release of PrusaSlicer 2.2.0 introducing SLA hollowing and hole drilling, support for 3rd party printer vendors, 3Dconnexion support, + automatic variable layer height, macOS dark mode support, greatly improved ColorPrint feature and much, much more. + Several bugs found in the previous release candidate are fixed in this final release. See the respective change logs of the previous releases for all the + new features, improvements and bugfixes in the 2.2.0 series.

+
+
+
+
diff --git a/resources/icons/PrusaSlicer-gcodeviewer.ico b/resources/icons/PrusaSlicer-gcodeviewer.ico index 2c9272369f..1cd867e29b 100644 Binary files a/resources/icons/PrusaSlicer-gcodeviewer.ico and b/resources/icons/PrusaSlicer-gcodeviewer.ico differ diff --git a/resources/icons/PrusaSlicer-gcodeviewer_128px.png b/resources/icons/PrusaSlicer-gcodeviewer_128px.png index d8e3e438be..475ddb68ed 100644 Binary files a/resources/icons/PrusaSlicer-gcodeviewer_128px.png and b/resources/icons/PrusaSlicer-gcodeviewer_128px.png differ diff --git a/resources/icons/PrusaSlicer-gcodeviewer_192px.png b/resources/icons/PrusaSlicer-gcodeviewer_192px.png index 0e02430127..2f3b03683e 100644 Binary files a/resources/icons/PrusaSlicer-gcodeviewer_192px.png and b/resources/icons/PrusaSlicer-gcodeviewer_192px.png differ diff --git a/resources/icons/PrusaSlicer-gcodeviewer_32px.png b/resources/icons/PrusaSlicer-gcodeviewer_32px.png new file mode 100644 index 0000000000..eaba5e21d7 Binary files /dev/null and b/resources/icons/PrusaSlicer-gcodeviewer_32px.png differ diff --git a/resources/icons/dot_small.svg b/resources/icons/dot_small.svg new file mode 100644 index 0000000000..474142a57f --- /dev/null +++ b/resources/icons/dot_small.svg @@ -0,0 +1,8 @@ + + + + + + + diff --git a/resources/icons/empty.svg b/resources/icons/empty.svg new file mode 100644 index 0000000000..b8ba0a6513 --- /dev/null +++ b/resources/icons/empty.svg @@ -0,0 +1,8 @@ + + + + + + + diff --git a/resources/icons/exit.svg b/resources/icons/exit.svg new file mode 100644 index 0000000000..30091b381e --- /dev/null +++ b/resources/icons/exit.svg @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/resources/icons/fdm_supports.svg b/resources/icons/fdm_supports.svg new file mode 100644 index 0000000000..a64314f807 --- /dev/null +++ b/resources/icons/fdm_supports.svg @@ -0,0 +1,19 @@ + + + + + + + + + + diff --git a/resources/icons/splashscreen-gcodepreview.jpg b/resources/icons/splashscreen-gcodepreview.jpg new file mode 100644 index 0000000000..3bae384935 Binary files /dev/null and b/resources/icons/splashscreen-gcodepreview.jpg differ diff --git a/resources/icons/splashscreen-gcodeviewer.jpg b/resources/icons/splashscreen-gcodeviewer.jpg deleted file mode 100644 index f170f390c2..0000000000 Binary files a/resources/icons/splashscreen-gcodeviewer.jpg and /dev/null differ diff --git a/resources/icons/splashscreen_.jpg b/resources/icons/splashscreen_.jpg deleted file mode 100644 index 2b83ed3516..0000000000 Binary files a/resources/icons/splashscreen_.jpg and /dev/null differ diff --git a/resources/icons/switch_presets.svg b/resources/icons/switch_presets.svg new file mode 100644 index 0000000000..a5f3fbefbb --- /dev/null +++ b/resources/icons/switch_presets.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + diff --git a/resources/icons/white/dot_small.svg b/resources/icons/white/dot_small.svg new file mode 100644 index 0000000000..74df442086 --- /dev/null +++ b/resources/icons/white/dot_small.svg @@ -0,0 +1,8 @@ + + + + + + + diff --git a/resources/icons/white/exit.svg b/resources/icons/white/exit.svg new file mode 100644 index 0000000000..e5aebcfc22 --- /dev/null +++ b/resources/icons/white/exit.svg @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/resources/icons/white/switch_presets.svg b/resources/icons/white/switch_presets.svg new file mode 100644 index 0000000000..efcc3670cc --- /dev/null +++ b/resources/icons/white/switch_presets.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + diff --git a/resources/localization/PrusaSlicer.pot b/resources/localization/PrusaSlicer.pot index aef39c253f..a111c8fa09 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-04-16 11:29+0200\n" +"POT-Creation-Date: 2020-10-19 13:45+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,109 +18,55 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" -#: src/slic3r/GUI/AboutDialog.cpp:42 src/slic3r/GUI/AboutDialog.cpp:295 +#: src/slic3r/GUI/AboutDialog.cpp:43 src/slic3r/GUI/AboutDialog.cpp:48 +#: src/slic3r/GUI/AboutDialog.cpp:317 msgid "Portions copyright" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:130 src/slic3r/GUI/AboutDialog.cpp:259 +#: src/slic3r/GUI/AboutDialog.cpp:139 src/slic3r/GUI/AboutDialog.cpp:281 msgid "Copyright" msgstr "" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:132 +#: src/slic3r/GUI/AboutDialog.cpp:141 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:202 +#: src/slic3r/GUI/AboutDialog.cpp:212 src/slic3r/GUI/AboutDialog.cpp:215 #, possible-c-format msgid "About %s" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:234 src/slic3r/GUI/MainFrame.cpp:70 +#: src/slic3r/GUI/AboutDialog.cpp:256 src/slic3r/GUI/GUI_App.cpp:239 +#: src/slic3r/GUI/MainFrame.cpp:164 msgid "Version" msgstr "" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:261 +#: src/slic3r/GUI/AboutDialog.cpp:283 src/slic3r/GUI/GUI_App.cpp:244 msgid "is licensed under the" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:262 +#: src/slic3r/GUI/AboutDialog.cpp:284 src/slic3r/GUI/GUI_App.cpp:244 msgid "GNU Affero General Public License, version 3" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:263 +#: src/slic3r/GUI/AboutDialog.cpp:285 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:264 +#: src/slic3r/GUI/AboutDialog.cpp:286 msgid "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " "numerous others." msgstr "" -#: src/slic3r/GUI/AppConfig.cpp:110 -msgid "" -"Error parsing PrusaSlicer config file, it is probably corrupted. Try to " -"manually delete the file to recover from the error. Your user profiles will " -"not be affected." -msgstr "" - -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:101 -msgid "" -"Copying of the temporary G-code to the output G-code failed. Maybe the SD " -"card is write locked?" -msgstr "" - -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:104 -msgid "" -"Copying of the temporary G-code to the output G-code failed. There might be " -"problem with target device, please try exporting again or using different " -"device. The corrupted output G-code is at %1%.tmp." -msgstr "" - -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:107 -msgid "" -"Renaming of the G-code after copying to the selected destination folder has " -"failed. Current path is %1%.tmp. Please try exporting again." -msgstr "" - -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:110 -msgid "" -"Copying of the temporary G-code has finished but the original code at %1% " -"couldn't be opened during copy check. The output G-code is at %2%.tmp." -msgstr "" - -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:113 -msgid "" -"Copying of the temporary G-code has finished but the exported code couldn't " -"be opened during copy check. The output G-code is at %1%.tmp." -msgstr "" - -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:120 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:468 -msgid "Running post-processing scripts" -msgstr "" - -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:122 -msgid "G-code file exported to %1%" -msgstr "" - -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:126 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:172 -msgid "Slicing complete" -msgstr "" - -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:168 -msgid "Masked SLA file exported to %1%" -msgstr "" - -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:210 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:62 #, possible-c-format msgid "" "%s has encountered an error. It was likely caused by running out of memory. " @@ -128,161 +74,219 @@ msgid "" "and we would be glad if you reported it." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:470 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:144 +msgid "" +"Copying of the temporary G-code to the output G-code failed. Maybe the SD " +"card is write locked?" +msgstr "" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:147 +msgid "" +"Copying of the temporary G-code to the output G-code failed. There might be " +"problem with target device, please try exporting again or using different " +"device. The corrupted output G-code is at %1%.tmp." +msgstr "" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:150 +msgid "" +"Renaming of the G-code after copying to the selected destination folder has " +"failed. Current path is %1%.tmp. Please try exporting again." +msgstr "" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:153 +msgid "" +"Copying of the temporary G-code has finished but the original code at %1% " +"couldn't be opened during copy check. The output G-code is at %2%.tmp." +msgstr "" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:156 +msgid "" +"Copying of the temporary G-code has finished but the exported code couldn't " +"be opened during copy check. The output G-code is at %1%.tmp." +msgstr "" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:163 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:520 +msgid "Running post-processing scripts" +msgstr "" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:165 +msgid "G-code file exported to %1%" +msgstr "" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:170 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:219 +msgid "Slicing complete" +msgstr "" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:214 +msgid "Masked SLA file exported to %1%" +msgstr "" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:522 msgid "Copying of the temporary G-code to the output G-code failed" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:493 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:545 msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:66 src/slic3r/GUI/GUI_ObjectList.cpp:2073 -msgid "Shape" -msgstr "" - -#: src/slic3r/GUI/BedShapeDialog.cpp:73 -msgid "Rectangular" -msgstr "" - -#: src/slic3r/GUI/BedShapeDialog.cpp:79 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:232 src/slic3r/GUI/Plater.cpp:162 -#: src/slic3r/GUI/Tab.cpp:2319 +#: src/slic3r/GUI/BedShapeDialog.cpp:93 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:240 src/slic3r/GUI/Plater.cpp:166 +#: src/slic3r/GUI/Tab.cpp:2493 msgid "Size" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:80 -msgid "Size in X and Y of the rectangular plate." -msgstr "" - -#: src/slic3r/GUI/BedShapeDialog.cpp:88 +#: src/slic3r/GUI/BedShapeDialog.cpp:94 msgid "Origin" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:89 +#: src/slic3r/GUI/BedShapeDialog.cpp:95 src/libslic3r/PrintConfig.cpp:745 +msgid "Diameter" +msgstr "" + +#: src/slic3r/GUI/BedShapeDialog.cpp:110 +msgid "Size in X and Y of the rectangular plate." +msgstr "" + +#: src/slic3r/GUI/BedShapeDialog.cpp:121 msgid "" "Distance of the 0,0 G-code coordinate from the front left corner of the " "rectangle." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:93 -msgid "Circular" -msgstr "" - -#: src/slic3r/GUI/BedShapeDialog.cpp:96 src/slic3r/GUI/ConfigWizard.cpp:233 -#: src/slic3r/GUI/ConfigWizard.cpp:985 src/slic3r/GUI/ConfigWizard.cpp:999 +#: src/slic3r/GUI/BedShapeDialog.cpp:129 src/slic3r/GUI/ConfigWizard.cpp:236 +#: src/slic3r/GUI/ConfigWizard.cpp:1336 src/slic3r/GUI/ConfigWizard.cpp:1350 #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:87 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:142 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:333 +#: src/slic3r/GUI/GCodeViewer.cpp:2183 src/slic3r/GUI/GCodeViewer.cpp:2189 +#: src/slic3r/GUI/GCodeViewer.cpp:2197 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:91 -#: src/libslic3r/PrintConfig.cpp:122 src/libslic3r/PrintConfig.cpp:188 -#: src/libslic3r/PrintConfig.cpp:246 src/libslic3r/PrintConfig.cpp:321 -#: src/libslic3r/PrintConfig.cpp:329 src/libslic3r/PrintConfig.cpp:379 -#: src/libslic3r/PrintConfig.cpp:505 src/libslic3r/PrintConfig.cpp:516 -#: src/libslic3r/PrintConfig.cpp:534 src/libslic3r/PrintConfig.cpp:712 -#: src/libslic3r/PrintConfig.cpp:1231 src/libslic3r/PrintConfig.cpp:1292 -#: src/libslic3r/PrintConfig.cpp:1310 src/libslic3r/PrintConfig.cpp:1328 -#: src/libslic3r/PrintConfig.cpp:1384 src/libslic3r/PrintConfig.cpp:1394 -#: src/libslic3r/PrintConfig.cpp:1516 src/libslic3r/PrintConfig.cpp:1524 -#: src/libslic3r/PrintConfig.cpp:1565 src/libslic3r/PrintConfig.cpp:1573 -#: src/libslic3r/PrintConfig.cpp:1583 src/libslic3r/PrintConfig.cpp:1591 -#: src/libslic3r/PrintConfig.cpp:1599 src/libslic3r/PrintConfig.cpp:1682 -#: src/libslic3r/PrintConfig.cpp:1921 src/libslic3r/PrintConfig.cpp:1992 -#: src/libslic3r/PrintConfig.cpp:2026 src/libslic3r/PrintConfig.cpp:2154 -#: src/libslic3r/PrintConfig.cpp:2233 src/libslic3r/PrintConfig.cpp:2240 -#: src/libslic3r/PrintConfig.cpp:2247 src/libslic3r/PrintConfig.cpp:2277 -#: src/libslic3r/PrintConfig.cpp:2287 src/libslic3r/PrintConfig.cpp:2297 -#: src/libslic3r/PrintConfig.cpp:2457 src/libslic3r/PrintConfig.cpp:2491 -#: src/libslic3r/PrintConfig.cpp:2630 src/libslic3r/PrintConfig.cpp:2639 -#: src/libslic3r/PrintConfig.cpp:2648 src/libslic3r/PrintConfig.cpp:2658 -#: src/libslic3r/PrintConfig.cpp:2712 src/libslic3r/PrintConfig.cpp:2722 -#: src/libslic3r/PrintConfig.cpp:2734 src/libslic3r/PrintConfig.cpp:2754 -#: src/libslic3r/PrintConfig.cpp:2764 src/libslic3r/PrintConfig.cpp:2774 -#: src/libslic3r/PrintConfig.cpp:2792 src/libslic3r/PrintConfig.cpp:2807 -#: src/libslic3r/PrintConfig.cpp:2821 src/libslic3r/PrintConfig.cpp:2832 -#: src/libslic3r/PrintConfig.cpp:2845 src/libslic3r/PrintConfig.cpp:2890 -#: src/libslic3r/PrintConfig.cpp:2900 src/libslic3r/PrintConfig.cpp:2909 -#: src/libslic3r/PrintConfig.cpp:2919 src/libslic3r/PrintConfig.cpp:2935 -#: src/libslic3r/PrintConfig.cpp:2959 +#: src/libslic3r/PrintConfig.cpp:82 src/libslic3r/PrintConfig.cpp:93 +#: src/libslic3r/PrintConfig.cpp:124 src/libslic3r/PrintConfig.cpp:222 +#: src/libslic3r/PrintConfig.cpp:280 src/libslic3r/PrintConfig.cpp:355 +#: src/libslic3r/PrintConfig.cpp:363 src/libslic3r/PrintConfig.cpp:413 +#: src/libslic3r/PrintConfig.cpp:541 src/libslic3r/PrintConfig.cpp:552 +#: src/libslic3r/PrintConfig.cpp:570 src/libslic3r/PrintConfig.cpp:748 +#: src/libslic3r/PrintConfig.cpp:1158 src/libslic3r/PrintConfig.cpp:1339 +#: src/libslic3r/PrintConfig.cpp:1400 src/libslic3r/PrintConfig.cpp:1418 +#: src/libslic3r/PrintConfig.cpp:1436 src/libslic3r/PrintConfig.cpp:1492 +#: src/libslic3r/PrintConfig.cpp:1502 src/libslic3r/PrintConfig.cpp:1624 +#: src/libslic3r/PrintConfig.cpp:1632 src/libslic3r/PrintConfig.cpp:1673 +#: src/libslic3r/PrintConfig.cpp:1681 src/libslic3r/PrintConfig.cpp:1691 +#: src/libslic3r/PrintConfig.cpp:1699 src/libslic3r/PrintConfig.cpp:1707 +#: src/libslic3r/PrintConfig.cpp:1790 src/libslic3r/PrintConfig.cpp:2056 +#: src/libslic3r/PrintConfig.cpp:2127 src/libslic3r/PrintConfig.cpp:2161 +#: src/libslic3r/PrintConfig.cpp:2290 src/libslic3r/PrintConfig.cpp:2369 +#: src/libslic3r/PrintConfig.cpp:2376 src/libslic3r/PrintConfig.cpp:2383 +#: src/libslic3r/PrintConfig.cpp:2413 src/libslic3r/PrintConfig.cpp:2423 +#: src/libslic3r/PrintConfig.cpp:2433 src/libslic3r/PrintConfig.cpp:2593 +#: src/libslic3r/PrintConfig.cpp:2627 src/libslic3r/PrintConfig.cpp:2766 +#: src/libslic3r/PrintConfig.cpp:2775 src/libslic3r/PrintConfig.cpp:2784 +#: src/libslic3r/PrintConfig.cpp:2794 src/libslic3r/PrintConfig.cpp:2859 +#: src/libslic3r/PrintConfig.cpp:2869 src/libslic3r/PrintConfig.cpp:2881 +#: src/libslic3r/PrintConfig.cpp:2901 src/libslic3r/PrintConfig.cpp:2911 +#: src/libslic3r/PrintConfig.cpp:2921 src/libslic3r/PrintConfig.cpp:2939 +#: src/libslic3r/PrintConfig.cpp:2954 src/libslic3r/PrintConfig.cpp:2968 +#: src/libslic3r/PrintConfig.cpp:2979 src/libslic3r/PrintConfig.cpp:2992 +#: src/libslic3r/PrintConfig.cpp:3037 src/libslic3r/PrintConfig.cpp:3047 +#: src/libslic3r/PrintConfig.cpp:3056 src/libslic3r/PrintConfig.cpp:3066 +#: src/libslic3r/PrintConfig.cpp:3082 src/libslic3r/PrintConfig.cpp:3106 msgid "mm" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:97 src/libslic3r/PrintConfig.cpp:709 -msgid "Diameter" -msgstr "" - -#: src/slic3r/GUI/BedShapeDialog.cpp:98 +#: 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 "" -#: src/slic3r/GUI/BedShapeDialog.cpp:102 src/slic3r/GUI/GUI_Preview.cpp:308 -#: src/libslic3r/ExtrusionEntity.cpp:322 +#: 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:314 +#: src/libslic3r/ExtrusionEntity.cpp:327 src/libslic3r/ExtrusionEntity.cpp:362 msgid "Custom" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:106 +#: 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:2215 +msgid "Shape" +msgstr "" + +#: src/slic3r/GUI/BedShapeDialog.cpp:243 msgid "Load shape from STL..." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:159 +#: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/MainFrame.cpp:1969 msgid "Settings" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:176 +#: src/slic3r/GUI/BedShapeDialog.cpp:315 msgid "Texture" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:186 src/slic3r/GUI/BedShapeDialog.cpp:265 +#: src/slic3r/GUI/BedShapeDialog.cpp:325 src/slic3r/GUI/BedShapeDialog.cpp:405 msgid "Load..." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:194 src/slic3r/GUI/BedShapeDialog.cpp:273 -#: src/slic3r/GUI/Tab.cpp:3155 +#: src/slic3r/GUI/BedShapeDialog.cpp:333 src/slic3r/GUI/BedShapeDialog.cpp:413 +#: src/slic3r/GUI/Tab.cpp:3423 msgid "Remove" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:227 src/slic3r/GUI/BedShapeDialog.cpp:306 +#: src/slic3r/GUI/BedShapeDialog.cpp:366 src/slic3r/GUI/BedShapeDialog.cpp:446 msgid "Not found:" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:255 +#: src/slic3r/GUI/BedShapeDialog.cpp:395 msgid "Model" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:491 +#: src/slic3r/GUI/BedShapeDialog.cpp:563 msgid "Choose an STL file to import bed shape from:" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:498 src/slic3r/GUI/BedShapeDialog.cpp:547 -#: src/slic3r/GUI/BedShapeDialog.cpp:570 +#: 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:509 +#: src/slic3r/GUI/BedShapeDialog.cpp:581 msgid "Error! Invalid model" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:517 +#: src/slic3r/GUI/BedShapeDialog.cpp:589 msgid "The selected file contains no geometry." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:521 +#: src/slic3r/GUI/BedShapeDialog.cpp:593 msgid "" "The selected file contains several disjoint areas. This is not supported." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:536 +#: src/slic3r/GUI/BedShapeDialog.cpp:608 msgid "Choose a file to import bed texture from (PNG/SVG):" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:559 +#: src/slic3r/GUI/BedShapeDialog.cpp:631 msgid "Choose an STL file to import bed model from:" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.hpp:59 src/slic3r/GUI/ConfigWizard.cpp:944 +#: src/slic3r/GUI/BedShapeDialog.hpp:98 src/slic3r/GUI/ConfigWizard.cpp:1295 msgid "Bed Shape" msgstr "" @@ -328,31 +332,31 @@ msgid "" "preset" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:48 +#: src/slic3r/GUI/ConfigManipulation.cpp:47 msgid "" "Zero layer height is not valid.\n" "\n" "The layer height will be reset to 0.01." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:49 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 src/slic3r/GUI/Tab.cpp:1116 +#: src/slic3r/GUI/ConfigManipulation.cpp:48 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1371 #: src/libslic3r/PrintConfig.cpp:71 msgid "Layer height" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:60 +#: src/slic3r/GUI/ConfigManipulation.cpp:59 msgid "" "Zero first layer height is not valid.\n" "\n" "The first layer height will be reset to 0.01." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:889 +#: src/slic3r/GUI/ConfigManipulation.cpp:60 src/libslic3r/PrintConfig.cpp:931 msgid "First layer height" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:81 +#: src/slic3r/GUI/ConfigManipulation.cpp:80 #, possible-c-format msgid "" "The Spiral Vase mode requires:\n" @@ -364,15 +368,15 @@ msgid "" "- Detect thin walls disabled" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:89 +#: src/slic3r/GUI/ConfigManipulation.cpp:88 msgid "Shall I adjust those settings in order to enable Spiral Vase?" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:90 +#: src/slic3r/GUI/ConfigManipulation.cpp:89 msgid "Spiral Vase" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:115 +#: src/slic3r/GUI/ConfigManipulation.cpp:114 msgid "" "The Wipe Tower currently supports the non-soluble supports only\n" "if they are printed with the current extruder without triggering a tool " @@ -381,74 +385,74 @@ msgid "" "to be set to 0)." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:119 +#: src/slic3r/GUI/ConfigManipulation.cpp:118 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 +#: src/slic3r/GUI/ConfigManipulation.cpp:119 +#: src/slic3r/GUI/ConfigManipulation.cpp:139 msgid "Wipe Tower" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:136 +#: src/slic3r/GUI/ConfigManipulation.cpp:135 msgid "" "For the Wipe Tower to work with the soluble supports, the support layers\n" "need to be synchronized with the object layers." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:139 +#: src/slic3r/GUI/ConfigManipulation.cpp:138 msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:159 +#: src/slic3r/GUI/ConfigManipulation.cpp:158 msgid "" "Supports work better, if the following feature is enabled:\n" "- Detect bridging perimeters" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:162 +#: src/slic3r/GUI/ConfigManipulation.cpp:161 msgid "Shall I adjust those settings for supports?" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:163 +#: src/slic3r/GUI/ConfigManipulation.cpp:162 msgid "Support Generator" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:208 +#: src/slic3r/GUI/ConfigManipulation.cpp:207 msgid "The %1% infill pattern is not supposed to work at 100%% density." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:210 +#: src/slic3r/GUI/ConfigManipulation.cpp:209 msgid "Shall I switch to rectilinear fill pattern?" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:211 -#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:96 -#: src/slic3r/GUI/GUI_ObjectList.cpp:618 src/slic3r/GUI/Plater.cpp:534 -#: src/slic3r/GUI/Tab.cpp:1158 src/slic3r/GUI/Tab.cpp:1159 -#: src/libslic3r/PrintConfig.cpp:203 src/libslic3r/PrintConfig.cpp:416 -#: src/libslic3r/PrintConfig.cpp:436 src/libslic3r/PrintConfig.cpp:776 -#: src/libslic3r/PrintConfig.cpp:790 src/libslic3r/PrintConfig.cpp:827 -#: src/libslic3r/PrintConfig.cpp:981 src/libslic3r/PrintConfig.cpp:991 -#: src/libslic3r/PrintConfig.cpp:1009 src/libslic3r/PrintConfig.cpp:1028 -#: src/libslic3r/PrintConfig.cpp:1047 src/libslic3r/PrintConfig.cpp:1735 -#: src/libslic3r/PrintConfig.cpp:1752 +#: 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:393 +#: src/slic3r/GUI/Tab.cpp:1413 src/slic3r/GUI/Tab.cpp:1414 +#: src/libslic3r/PrintConfig.cpp:237 src/libslic3r/PrintConfig.cpp:450 +#: src/libslic3r/PrintConfig.cpp:472 src/libslic3r/PrintConfig.cpp:812 +#: src/libslic3r/PrintConfig.cpp:826 src/libslic3r/PrintConfig.cpp:863 +#: src/libslic3r/PrintConfig.cpp:1025 src/libslic3r/PrintConfig.cpp:1035 +#: src/libslic3r/PrintConfig.cpp:1053 src/libslic3r/PrintConfig.cpp:1072 +#: src/libslic3r/PrintConfig.cpp:1091 src/libslic3r/PrintConfig.cpp:1843 +#: src/libslic3r/PrintConfig.cpp:1860 msgid "Infill" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:318 +#: src/slic3r/GUI/ConfigManipulation.cpp:322 msgid "Head penetration should not be greater than the head width." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:320 +#: src/slic3r/GUI/ConfigManipulation.cpp:324 msgid "Invalid Head penetration" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:331 +#: src/slic3r/GUI/ConfigManipulation.cpp:335 msgid "Pinhead diameter should be smaller than the pillar diameter." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:333 +#: src/slic3r/GUI/ConfigManipulation.cpp:337 msgid "Invalid pinhead diameter" msgstr "" @@ -464,11 +468,12 @@ msgstr "" msgid "Before roll back" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24 src/libslic3r/PrintConfig.cpp:132 msgid "User" msgstr "" #: src/slic3r/GUI/ConfigSnapshotDialog.cpp:27 +#: src/slic3r/GUI/GUI_Preview.cpp:299 src/libslic3r/ExtrusionEntity.cpp:310 msgid "Unknown" msgstr "" @@ -480,7 +485,7 @@ msgstr "" msgid "PrusaSlicer version" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/slic3r/GUI/Preset.cpp:1563 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/libslic3r/Preset.cpp:1300 msgid "print" msgstr "" @@ -488,11 +493,11 @@ msgstr "" msgid "filaments" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/slic3r/GUI/Preset.cpp:1567 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/libslic3r/Preset.cpp:1304 msgid "printer" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 src/slic3r/GUI/Tab.cpp:1034 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 src/slic3r/GUI/Tab.cpp:1289 msgid "vendor" msgstr "" @@ -529,104 +534,125 @@ msgstr "" msgid "Configuration Snapshots" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:233 +#: src/slic3r/GUI/ConfigWizard.cpp:236 msgid "nozzle" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:237 +#: src/slic3r/GUI/ConfigWizard.cpp:240 msgid "Alternate nozzles:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:304 +#: src/slic3r/GUI/ConfigWizard.cpp:307 msgid "All standard" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:304 +#: src/slic3r/GUI/ConfigWizard.cpp:307 msgid "Standard" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:305 src/slic3r/GUI/ConfigWizard.cpp:588 -#: src/slic3r/GUI/Tab.cpp:3214 +#: src/slic3r/GUI/ConfigWizard.cpp:308 src/slic3r/GUI/ConfigWizard.cpp:598 +#: src/slic3r/GUI/Tab.cpp:3507 src/slic3r/GUI/UnsavedChangesDialog.cpp:921 msgid "All" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:306 src/slic3r/GUI/ConfigWizard.cpp:589 -#: src/slic3r/GUI/Plater.cpp:506 src/slic3r/GUI/Plater.cpp:646 -#: src/libslic3r/ExtrusionEntity.cpp:309 +#: src/slic3r/GUI/ConfigWizard.cpp:309 src/slic3r/GUI/ConfigWizard.cpp:599 +#: src/slic3r/GUI/Plater.cpp:365 src/slic3r/GUI/Plater.cpp:505 +#: src/libslic3r/ExtrusionEntity.cpp:312 msgid "None" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:442 +#: src/slic3r/GUI/ConfigWizard.cpp:445 #, possible-c-format msgid "Welcome to the %s Configuration Assistant" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:444 +#: src/slic3r/GUI/ConfigWizard.cpp:447 #, possible-c-format msgid "Welcome to the %s Configuration Wizard" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:446 +#: src/slic3r/GUI/ConfigWizard.cpp:449 msgid "Welcome" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:448 +#: src/slic3r/GUI/ConfigWizard.cpp:451 #, possible-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." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:453 +#: src/slic3r/GUI/ConfigWizard.cpp:456 msgid "Remove user profiles (a snapshot will be taken beforehand)" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:496 +#: src/slic3r/GUI/ConfigWizard.cpp:499 #, possible-c-format msgid "%s Family" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:580 +#: src/slic3r/GUI/ConfigWizard.cpp:587 +msgid "Printer:" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:589 msgid "Vendor:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:581 +#: src/slic3r/GUI/ConfigWizard.cpp:590 msgid "Profile:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:618 src/slic3r/GUI/ConfigWizard.cpp:646 +#: src/slic3r/GUI/ConfigWizard.cpp:662 src/slic3r/GUI/ConfigWizard.cpp:812 +#: src/slic3r/GUI/ConfigWizard.cpp:873 src/slic3r/GUI/ConfigWizard.cpp:1007 msgid "(All)" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:747 +#: src/slic3r/GUI/ConfigWizard.cpp:691 +msgid "" +"Filaments marked with * are not compatible with some installed " +"printers." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:694 +msgid "All installed printers are compatible with the selected filament." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:714 +msgid "" +"Only the following installed printers are compatible with the selected " +"filament:" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1091 msgid "Custom Printer Setup" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:747 +#: src/slic3r/GUI/ConfigWizard.cpp:1091 msgid "Custom Printer" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:749 +#: src/slic3r/GUI/ConfigWizard.cpp:1093 msgid "Define a custom printer profile" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:751 +#: src/slic3r/GUI/ConfigWizard.cpp:1095 msgid "Custom profile name:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:776 +#: src/slic3r/GUI/ConfigWizard.cpp:1120 msgid "Automatic updates" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:776 +#: src/slic3r/GUI/ConfigWizard.cpp:1120 msgid "Updates" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:784 src/slic3r/GUI/Preferences.cpp:64 +#: src/slic3r/GUI/ConfigWizard.cpp:1128 src/slic3r/GUI/Preferences.cpp:81 msgid "Check for application updates" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:788 +#: src/slic3r/GUI/ConfigWizard.cpp:1132 #, possible-c-format msgid "" "If enabled, %s checks for new application versions online. When a new " @@ -635,11 +661,11 @@ msgid "" "notification mechanisms, no automatic installation is done." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:794 src/slic3r/GUI/Preferences.cpp:80 +#: src/slic3r/GUI/ConfigWizard.cpp:1138 src/slic3r/GUI/Preferences.cpp:97 msgid "Update built-in Presets automatically" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:798 +#: src/slic3r/GUI/ConfigWizard.cpp:1142 #, possible-c-format msgid "" "If enabled, %s downloads updates of built-in system presets in the " @@ -648,30 +674,30 @@ msgid "" "startup." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:801 +#: src/slic3r/GUI/ConfigWizard.cpp:1145 msgid "" "Updates are never applied without user's consent and never overwrite user's " "customized settings." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:806 +#: src/slic3r/GUI/ConfigWizard.cpp:1150 msgid "" "Additionally a backup snapshot of the whole configuration is created before " "an update is applied." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:813 src/slic3r/GUI/GUI_ObjectList.cpp:1678 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4040 src/slic3r/GUI/Plater.cpp:3225 -#: src/slic3r/GUI/Plater.cpp:3938 src/slic3r/GUI/Plater.cpp:3967 +#: src/slic3r/GUI/ConfigWizard.cpp:1157 src/slic3r/GUI/GUI_ObjectList.cpp:1793 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4439 src/slic3r/GUI/Plater.cpp:3028 +#: src/slic3r/GUI/Plater.cpp:3852 src/slic3r/GUI/Plater.cpp:3881 msgid "Reload from disk" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:816 +#: src/slic3r/GUI/ConfigWizard.cpp:1160 msgid "" "Export full pathnames of models and parts sources into 3mf and amf files" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:820 +#: src/slic3r/GUI/ConfigWizard.cpp:1164 msgid "" "If enabled, allows the Reload from disk command to automatically find and " "load the files when invoked.\n" @@ -679,11 +705,11 @@ msgid "" "using an open file dialog." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:828 +#: src/slic3r/GUI/ConfigWizard.cpp:1172 msgid "View mode" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:830 +#: src/slic3r/GUI/ConfigWizard.cpp:1174 msgid "" "PrusaSlicer's user interfaces comes in three variants:\n" "Simple, Advanced, and Expert.\n" @@ -692,272 +718,285 @@ msgid "" "fine-tuning, they are suitable for advanced and expert users, respectively." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:835 +#: src/slic3r/GUI/ConfigWizard.cpp:1179 msgid "Simple mode" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:836 +#: src/slic3r/GUI/ConfigWizard.cpp:1180 msgid "Advanced mode" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:837 +#: src/slic3r/GUI/ConfigWizard.cpp:1181 msgid "Expert mode" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:871 +#: src/slic3r/GUI/ConfigWizard.cpp:1187 +msgid "The size of the object can be specified in inches" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1188 +msgid "Use inches" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1222 msgid "Other Vendors" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:875 +#: src/slic3r/GUI/ConfigWizard.cpp:1226 #, possible-c-format msgid "Pick another vendor supported by %s" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:906 +#: src/slic3r/GUI/ConfigWizard.cpp:1257 msgid "Firmware Type" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:906 src/slic3r/GUI/Tab.cpp:1980 +#: src/slic3r/GUI/ConfigWizard.cpp:1257 src/slic3r/GUI/Tab.cpp:2132 msgid "Firmware" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:910 +#: src/slic3r/GUI/ConfigWizard.cpp:1261 msgid "Choose the type of firmware used by your printer." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:944 +#: src/slic3r/GUI/ConfigWizard.cpp:1295 msgid "Bed Shape and Size" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:947 +#: src/slic3r/GUI/ConfigWizard.cpp:1298 msgid "Set the shape of your printer's bed." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:967 +#: src/slic3r/GUI/ConfigWizard.cpp:1318 msgid "Filament and Nozzle Diameters" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:967 +#: src/slic3r/GUI/ConfigWizard.cpp:1318 msgid "Print Diameters" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:981 +#: src/slic3r/GUI/ConfigWizard.cpp:1332 msgid "Enter the diameter of your printer's hot end nozzle." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:984 +#: src/slic3r/GUI/ConfigWizard.cpp:1335 msgid "Nozzle Diameter:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:994 +#: src/slic3r/GUI/ConfigWizard.cpp:1345 msgid "Enter the diameter of your filament." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:995 +#: src/slic3r/GUI/ConfigWizard.cpp:1346 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:998 +#: src/slic3r/GUI/ConfigWizard.cpp:1349 msgid "Filament Diameter:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1032 +#: src/slic3r/GUI/ConfigWizard.cpp:1383 msgid "Extruder and Bed Temperatures" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1032 +#: src/slic3r/GUI/ConfigWizard.cpp:1383 msgid "Temperatures" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1048 +#: src/slic3r/GUI/ConfigWizard.cpp:1399 msgid "Enter the temperature needed for extruding your filament." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1049 +#: src/slic3r/GUI/ConfigWizard.cpp:1400 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:1052 +#: src/slic3r/GUI/ConfigWizard.cpp:1403 msgid "Extrusion Temperature:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1053 src/slic3r/GUI/ConfigWizard.cpp:1067 +#: src/slic3r/GUI/ConfigWizard.cpp:1404 src/slic3r/GUI/ConfigWizard.cpp:1418 +#: src/libslic3r/PrintConfig.cpp:180 src/libslic3r/PrintConfig.cpp:912 +#: src/libslic3r/PrintConfig.cpp:956 src/libslic3r/PrintConfig.cpp:2209 msgid "°C" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1062 +#: src/slic3r/GUI/ConfigWizard.cpp:1413 msgid "" "Enter the bed temperature needed for getting your filament to stick to your " "heated bed." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1063 +#: src/slic3r/GUI/ConfigWizard.cpp:1414 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:1066 +#: src/slic3r/GUI/ConfigWizard.cpp:1417 msgid "Bed Temperature:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1515 src/slic3r/GUI/ConfigWizard.cpp:2097 +#: src/slic3r/GUI/ConfigWizard.cpp:1872 src/slic3r/GUI/ConfigWizard.cpp:2524 msgid "Filaments" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1515 src/slic3r/GUI/ConfigWizard.cpp:2099 +#: src/slic3r/GUI/ConfigWizard.cpp:1872 src/slic3r/GUI/ConfigWizard.cpp:2526 msgid "SLA Materials" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1569 +#: src/slic3r/GUI/ConfigWizard.cpp:1926 msgid "FFF Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1574 +#: src/slic3r/GUI/ConfigWizard.cpp:1931 msgid "SLA Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1810 src/slic3r/GUI/DoubleSlider.cpp:1907 -#: src/slic3r/GUI/DoubleSlider.cpp:1928 src/slic3r/GUI/GUI.cpp:246 +#: src/slic3r/GUI/ConfigWizard.cpp:2237 src/slic3r/GUI/DoubleSlider.cpp:2124 +#: src/slic3r/GUI/DoubleSlider.cpp:2144 src/slic3r/GUI/GUI.cpp:244 msgid "Notice" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1830 +#: src/slic3r/GUI/ConfigWizard.cpp:2257 msgid "The following FFF printer models have no filament selected:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1834 +#: src/slic3r/GUI/ConfigWizard.cpp:2261 msgid "Do you want to select default filaments for these FFF printer models?" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1848 +#: src/slic3r/GUI/ConfigWizard.cpp:2275 msgid "The following SLA printer models have no materials selected:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1852 +#: src/slic3r/GUI/ConfigWizard.cpp:2279 msgid "Do you want to select default SLA materials for these printer models?" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2060 +#: src/slic3r/GUI/ConfigWizard.cpp:2487 msgid "Select all standard printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2063 +#: src/slic3r/GUI/ConfigWizard.cpp:2490 msgid "< &Back" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2064 +#: src/slic3r/GUI/ConfigWizard.cpp:2491 msgid "&Next >" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2065 +#: src/slic3r/GUI/ConfigWizard.cpp:2492 msgid "&Finish" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2066 src/slic3r/GUI/FirmwareDialog.cpp:151 +#: src/slic3r/GUI/ConfigWizard.cpp:2493 src/slic3r/GUI/FirmwareDialog.cpp:151 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:245 #: src/slic3r/GUI/ProgressStatusBar.cpp:26 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:644 msgid "Cancel" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2079 +#: src/slic3r/GUI/ConfigWizard.cpp:2506 msgid "Prusa FFF Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2082 +#: src/slic3r/GUI/ConfigWizard.cpp:2509 msgid "Prusa MSLA Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2097 +#: src/slic3r/GUI/ConfigWizard.cpp:2524 msgid "Filament Profiles Selection" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2097 src/slic3r/GUI/GUI_ObjectList.cpp:3637 +#: src/slic3r/GUI/ConfigWizard.cpp:2524 src/slic3r/GUI/ConfigWizard.cpp:2526 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4016 msgid "Type:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2099 +#: src/slic3r/GUI/ConfigWizard.cpp:2526 msgid "SLA Material Profiles Selection" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2099 -msgid "Layer height:" -msgstr "" - -#: src/slic3r/GUI/ConfigWizard.cpp:2196 +#: src/slic3r/GUI/ConfigWizard.cpp:2624 msgid "Configuration Assistant" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2197 +#: src/slic3r/GUI/ConfigWizard.cpp:2625 msgid "Configuration &Assistant" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2199 +#: src/slic3r/GUI/ConfigWizard.cpp:2627 msgid "Configuration Wizard" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:2200 +#: src/slic3r/GUI/ConfigWizard.cpp:2628 msgid "Configuration &Wizard" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:81 +#: src/slic3r/GUI/DoubleSlider.cpp:110 msgid "Place bearings in slots and resume printing" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:952 +#: src/slic3r/GUI/DoubleSlider.cpp:1064 msgid "One layer mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:954 +#: src/slic3r/GUI/DoubleSlider.cpp:1066 msgid "Discard all custom changes" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:957 +#: src/slic3r/GUI/DoubleSlider.cpp:1071 src/slic3r/GUI/DoubleSlider.cpp:1852 +msgid "Jump to move" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1075 #, possible-c-format msgid "Jump to height %s or Set extruder sequence for the entire print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:959 src/slic3r/GUI/DoubleSlider.cpp:1531 -#: src/slic3r/GUI/DoubleSlider.cpp:1653 +#: src/slic3r/GUI/DoubleSlider.cpp:1077 src/slic3r/GUI/DoubleSlider.cpp:1721 +#: src/slic3r/GUI/DoubleSlider.cpp:1852 src/slic3r/GUI/DoubleSlider.cpp:1856 msgid "Jump to height" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:962 +#: src/slic3r/GUI/DoubleSlider.cpp:1083 msgid "Edit current color - Right click the colored slider segment" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:972 +#: src/slic3r/GUI/DoubleSlider.cpp:1093 msgid "Print mode" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:986 +#: src/slic3r/GUI/DoubleSlider.cpp:1107 msgid "Add extruder change - Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:988 +#: src/slic3r/GUI/DoubleSlider.cpp:1109 msgid "" "Add color change - Left click for predefined color or Shift + Left click for " "custom color selection" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:990 +#: src/slic3r/GUI/DoubleSlider.cpp:1111 msgid "Add color change - Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:991 +#: src/slic3r/GUI/DoubleSlider.cpp:1112 msgid "or press \"+\" key" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:993 +#: src/slic3r/GUI/DoubleSlider.cpp:1114 msgid "Add another code - Ctrl + Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:994 +#: src/slic3r/GUI/DoubleSlider.cpp:1115 msgid "Add another code - Right click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1000 +#: src/slic3r/GUI/DoubleSlider.cpp:1121 msgid "" "The sequential print is on.\n" "It's impossible to apply any custom G-code for objects printing " @@ -965,203 +1004,227 @@ msgid "" "This code won't be processed during G-code generation." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1009 +#: src/slic3r/GUI/DoubleSlider.cpp:1130 msgid "Color change (\"%1%\")" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1010 +#: src/slic3r/GUI/DoubleSlider.cpp:1131 msgid "Color change (\"%1%\") for Extruder %2%" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1012 +#: src/slic3r/GUI/DoubleSlider.cpp:1133 msgid "Pause print (\"%1%\")" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1014 +#: src/slic3r/GUI/DoubleSlider.cpp:1135 +msgid "Custom template (\"%1%\")" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1137 msgid "Extruder (tool) is changed to Extruder \"%1%\"" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1021 +#: src/slic3r/GUI/DoubleSlider.cpp:1144 msgid "Note" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1023 +#: src/slic3r/GUI/DoubleSlider.cpp:1146 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:1026 +#: src/slic3r/GUI/DoubleSlider.cpp:1149 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:1029 +#: src/slic3r/GUI/DoubleSlider.cpp:1152 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:1032 +#: src/slic3r/GUI/DoubleSlider.cpp:1155 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:1037 +#: src/slic3r/GUI/DoubleSlider.cpp:1160 msgid "Delete tick mark - Left click or press \"-\" key" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1039 +#: src/slic3r/GUI/DoubleSlider.cpp:1162 msgid "Edit tick mark - Ctrl + Left click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1040 +#: src/slic3r/GUI/DoubleSlider.cpp:1163 msgid "Edit tick mark - Right click" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1136 src/slic3r/GUI/DoubleSlider.cpp:1172 -#: src/slic3r/GUI/GLCanvas3D.cpp:996 src/slic3r/GUI/GUI_ObjectList.cpp:1718 -#: src/slic3r/GUI/Tab.cpp:2315 src/libslic3r/GCode/PreviewData.cpp:446 +#: src/slic3r/GUI/DoubleSlider.cpp:1263 src/slic3r/GUI/DoubleSlider.cpp:1297 +#: src/slic3r/GUI/GLCanvas3D.cpp:983 src/slic3r/GUI/GUI_ObjectList.cpp:1832 +#: src/slic3r/GUI/Tab.cpp:2489 src/libslic3r/GCode/PreviewData.cpp:450 #, possible-c-format msgid "Extruder %d" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1137 src/slic3r/GUI/GUI_ObjectList.cpp:1719 +#: src/slic3r/GUI/DoubleSlider.cpp:1264 src/slic3r/GUI/GUI_ObjectList.cpp:1833 msgid "active" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1146 +#: src/slic3r/GUI/DoubleSlider.cpp:1273 msgid "Switch code to Change extruder" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1146 src/slic3r/GUI/GUI_ObjectList.cpp:1685 +#: src/slic3r/GUI/DoubleSlider.cpp:1273 src/slic3r/GUI/GUI_ObjectList.cpp:1800 msgid "Change extruder" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1147 +#: src/slic3r/GUI/DoubleSlider.cpp:1274 msgid "Change extruder (N/A)" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1149 +#: src/slic3r/GUI/DoubleSlider.cpp:1276 msgid "Use another extruder" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1173 +#: src/slic3r/GUI/DoubleSlider.cpp:1298 msgid "used" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1181 +#: src/slic3r/GUI/DoubleSlider.cpp:1306 msgid "Switch code to Color change (%1%) for:" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1182 +#: src/slic3r/GUI/DoubleSlider.cpp:1307 msgid "Add color change (%1%) for:" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1479 +#: src/slic3r/GUI/DoubleSlider.cpp:1665 msgid "Add color change" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1489 +#: src/slic3r/GUI/DoubleSlider.cpp:1675 msgid "Add pause print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1492 +#: src/slic3r/GUI/DoubleSlider.cpp:1679 +msgid "Add custom template" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1682 msgid "Add custom G-code" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1510 +#: src/slic3r/GUI/DoubleSlider.cpp:1700 msgid "Edit color" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1511 +#: src/slic3r/GUI/DoubleSlider.cpp:1701 msgid "Edit pause print message" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1512 +#: src/slic3r/GUI/DoubleSlider.cpp:1702 msgid "Edit custom G-code" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1518 +#: src/slic3r/GUI/DoubleSlider.cpp:1708 msgid "Delete color change" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1519 +#: src/slic3r/GUI/DoubleSlider.cpp:1709 msgid "Delete tool change" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1520 +#: src/slic3r/GUI/DoubleSlider.cpp:1710 msgid "Delete pause print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1521 +#: src/slic3r/GUI/DoubleSlider.cpp:1711 msgid "Delete custom G-code" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1534 +#: src/slic3r/GUI/DoubleSlider.cpp:1728 msgid "Set extruder sequence for the entire print" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1620 +#: src/slic3r/GUI/DoubleSlider.cpp:1814 msgid "Enter custom G-code used on current layer" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1621 +#: src/slic3r/GUI/DoubleSlider.cpp:1815 msgid "Custom G-code on current layer (%1% mm)." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1636 +#: src/slic3r/GUI/DoubleSlider.cpp:1830 msgid "Enter short message shown on Printer display when a print is paused" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1637 +#: src/slic3r/GUI/DoubleSlider.cpp:1831 msgid "Message for pause print on current layer (%1% mm)." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1652 +#: src/slic3r/GUI/DoubleSlider.cpp:1851 +msgid "Enter the move you want to jump to" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1851 src/slic3r/GUI/DoubleSlider.cpp:1855 msgid "Enter the height you want to jump to" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1901 +#: src/slic3r/GUI/DoubleSlider.cpp:2118 msgid "The last color change data was saved for a single extruder printing." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1902 src/slic3r/GUI/DoubleSlider.cpp:1918 +#: src/slic3r/GUI/DoubleSlider.cpp:2119 src/slic3r/GUI/DoubleSlider.cpp:2134 msgid "The last color change data was saved for a multi extruder printing." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1904 +#: src/slic3r/GUI/DoubleSlider.cpp:2121 msgid "Your current changes will delete all saved color changes." msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1905 src/slic3r/GUI/DoubleSlider.cpp:1926 +#: src/slic3r/GUI/DoubleSlider.cpp:2122 src/slic3r/GUI/DoubleSlider.cpp:2142 msgid "Are you sure you want to continue?" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1919 +#: src/slic3r/GUI/DoubleSlider.cpp:2135 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:1922 +#: src/slic3r/GUI/DoubleSlider.cpp:2138 msgid "Do you want to delete all saved tool changes?" msgstr "" -#: src/slic3r/GUI/DoubleSlider.cpp:1924 +#: src/slic3r/GUI/DoubleSlider.cpp:2140 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:1925 +#: src/slic3r/GUI/DoubleSlider.cpp:2141 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:202 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:259 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:284 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:492 +msgid "default" +msgstr "" + #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:23 msgid "Set extruder sequence" msgstr "" @@ -1171,10 +1234,10 @@ msgid "Set extruder change for every" msgstr "" #: src/slic3r/GUI/ExtruderSequenceDialog.cpp:52 -#: src/libslic3r/PrintConfig.cpp:362 src/libslic3r/PrintConfig.cpp:994 -#: src/libslic3r/PrintConfig.cpp:1505 src/libslic3r/PrintConfig.cpp:1690 -#: src/libslic3r/PrintConfig.cpp:1757 src/libslic3r/PrintConfig.cpp:1937 -#: src/libslic3r/PrintConfig.cpp:1983 +#: src/libslic3r/PrintConfig.cpp:396 src/libslic3r/PrintConfig.cpp:1038 +#: src/libslic3r/PrintConfig.cpp:1613 src/libslic3r/PrintConfig.cpp:1798 +#: src/libslic3r/PrintConfig.cpp:1865 src/libslic3r/PrintConfig.cpp:2072 +#: src/libslic3r/PrintConfig.cpp:2118 msgid "layers" msgstr "" @@ -1190,33 +1253,34 @@ msgstr "" msgid "Add extruder to sequence" msgstr "" -#: src/slic3r/GUI/Field.cpp:136 +#: src/slic3r/GUI/Field.cpp:184 msgid "default value" msgstr "" -#: src/slic3r/GUI/Field.cpp:139 +#: src/slic3r/GUI/Field.cpp:187 msgid "parameter name" msgstr "" -#: src/slic3r/GUI/Field.cpp:150 src/slic3r/GUI/OptionsGroup.cpp:598 +#: src/slic3r/GUI/Field.cpp:198 src/slic3r/GUI/OptionsGroup.cpp:715 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:874 msgid "N/A" msgstr "" -#: src/slic3r/GUI/Field.cpp:175 +#: src/slic3r/GUI/Field.cpp:223 #, possible-c-format msgid "%s doesn't support percentage" msgstr "" -#: src/slic3r/GUI/Field.cpp:195 src/slic3r/GUI/Field.cpp:226 -#: src/slic3r/GUI/Field.cpp:1298 src/slic3r/GUI/GUI_ObjectLayers.cpp:383 +#: src/slic3r/GUI/Field.cpp:243 src/slic3r/GUI/Field.cpp:274 +#: src/slic3r/GUI/Field.cpp:1358 src/slic3r/GUI/GUI_ObjectLayers.cpp:413 msgid "Invalid numeric input." msgstr "" -#: src/slic3r/GUI/Field.cpp:204 src/slic3r/GUI/Field.cpp:1310 +#: src/slic3r/GUI/Field.cpp:252 src/slic3r/GUI/Field.cpp:1370 msgid "Input value is out of range" msgstr "" -#: src/slic3r/GUI/Field.cpp:240 +#: src/slic3r/GUI/Field.cpp:288 #, possible-c-format msgid "" "Do you mean %s%% instead of %s %s?\n" @@ -1224,7 +1288,7 @@ msgid "" "or NO if you are sure that %s %s is a correct value." msgstr "" -#: src/slic3r/GUI/Field.cpp:243 +#: src/slic3r/GUI/Field.cpp:291 msgid "Parameter validation" msgstr "" @@ -1300,8 +1364,9 @@ msgstr "" msgid "Firmware image:" msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/Tab.cpp:1716 -#: src/slic3r/GUI/Tab.cpp:1778 +#: src/slic3r/GUI/FirmwareDialog.cpp:805 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:271 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:327 msgid "Browse" msgstr "" @@ -1334,8 +1399,8 @@ msgid "Advanced: Output log" msgstr "" #: src/slic3r/GUI/FirmwareDialog.cpp:852 -#: src/slic3r/GUI/Mouse3DController.cpp:371 -#: src/slic3r/GUI/PrintHostDialogs.cpp:161 +#: src/slic3r/GUI/Mouse3DController.cpp:353 +#: src/slic3r/GUI/PrintHostDialogs.cpp:159 msgid "Close" msgstr "" @@ -1353,405 +1418,715 @@ msgstr "" msgid "Cancelling..." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:238 src/slic3r/GUI/GLCanvas3D.cpp:4962 +#: src/slic3r/GUI/GCodeViewer.cpp:223 +msgid "Tool position" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:933 +msgid "Generating toolpaths" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:1318 +msgid "Generating vertex buffer" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:1392 +msgid "Generating index buffers" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2071 +msgid "Click to hide" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2071 +msgid "Click to show" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2183 +msgid "up to" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2189 +msgid "above" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2197 +msgid "from" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2197 +msgid "to" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2225 src/slic3r/GUI/GCodeViewer.cpp:2233 +#: src/slic3r/GUI/GUI_Preview.cpp:275 src/slic3r/GUI/GUI_Preview.cpp:787 +#: src/libslic3r/GCode/PreviewData.cpp:350 +msgid "Feature type" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2225 src/slic3r/GUI/GCodeViewer.cpp:2233 +#: src/slic3r/GUI/RammingChart.cpp:76 +msgid "Time" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2233 +msgid "Percentage" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2236 src/libslic3r/GCode/PreviewData.cpp:352 +msgid "Height (mm)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2237 src/libslic3r/GCode/PreviewData.cpp:354 +msgid "Width (mm)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2238 src/libslic3r/GCode/PreviewData.cpp:356 +msgid "Speed (mm/s)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2239 src/libslic3r/GCode/PreviewData.cpp:358 +msgid "Fan Speed (%)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2240 src/libslic3r/GCode/PreviewData.cpp:360 +msgid "Volumetric flow rate (mm³/s)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2241 src/slic3r/GUI/GUI_Preview.cpp:281 +#: src/slic3r/GUI/GUI_Preview.cpp:453 src/slic3r/GUI/GUI_Preview.cpp:693 +#: src/slic3r/GUI/GUI_Preview.cpp:786 src/slic3r/GUI/GUI_Preview.cpp:1270 +#: src/libslic3r/GCode/PreviewData.cpp:362 +msgid "Tool" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2242 src/slic3r/GUI/GUI_Preview.cpp:282 +#: src/slic3r/GUI/GUI_Preview.cpp:784 src/libslic3r/GCode/PreviewData.cpp:364 +msgid "Color Print" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2277 src/slic3r/GUI/GCodeViewer.cpp:2313 +#: src/slic3r/GUI/GCodeViewer.cpp:2318 src/slic3r/GUI/GUI_ObjectList.cpp:296 +#: src/slic3r/GUI/Tab.cpp:1780 src/slic3r/GUI/wxExtensions.cpp:515 +#: src/libslic3r/PrintConfig.cpp:523 +msgid "Extruder" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2289 +msgid "Default color" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2313 +msgid "default color" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2410 src/slic3r/GUI/GCodeViewer.cpp:2438 +msgid "Color change" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2436 src/slic3r/GUI/GCodeViewer.cpp:2451 +msgid "Print" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2437 src/slic3r/GUI/GCodeViewer.cpp:2460 +#: src/slic3r/GUI/Plater.cpp:1199 +msgid "Pause" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2442 src/slic3r/GUI/GCodeViewer.cpp:2445 +msgid "Event" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2442 src/slic3r/GUI/GCodeViewer.cpp:2445 +msgid "Remaining time" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2445 +msgid "Duration" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2489 src/slic3r/GUI/GUI_Preview.cpp:335 +#: src/slic3r/GUI/GUI_Preview.cpp:1471 src/libslic3r/PrintConfig.cpp:2295 +msgid "Travel" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2492 +msgid "Movement" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2493 +msgid "Extrusion" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2494 src/slic3r/GUI/Tab.cpp:1670 +#: src/slic3r/GUI/Tab.cpp:2539 +msgid "Retraction" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2525 src/slic3r/GUI/GUI_Preview.cpp:320 +#: src/slic3r/GUI/GUI_Preview.cpp:333 +msgid "Options" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2528 src/slic3r/GUI/GUI_Preview.cpp:336 +#: src/slic3r/GUI/GUI_Preview.cpp:1472 +msgid "Retractions" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2529 src/slic3r/GUI/GUI_Preview.cpp:337 +#: src/slic3r/GUI/GUI_Preview.cpp:1473 +msgid "Deretractions" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2530 src/slic3r/GUI/GUI_Preview.cpp:1474 +msgid "Tool changes" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2531 src/slic3r/GUI/GUI_Preview.cpp:1475 +msgid "Color changes" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2532 src/slic3r/GUI/GUI_Preview.cpp:1476 +msgid "Pause prints" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2533 src/slic3r/GUI/GUI_Preview.cpp:1477 +msgid "Custom GCodes" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2552 src/slic3r/GUI/GCodeViewer.cpp:2557 +#: src/slic3r/GUI/Plater.cpp:246 src/slic3r/GUI/Plater.cpp:1125 +#: src/slic3r/GUI/Plater.cpp:1175 src/slic3r/GUI/Plater.cpp:1196 +msgid "Estimated printing time" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2552 +msgid "Normal mode" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2557 +msgid "Stealth mode" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2586 +msgid "Show stealth mode" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2591 +msgid "Show normal mode" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:231 src/slic3r/GUI/GLCanvas3D.cpp:4978 msgid "Variable layer height" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:241 +#: src/slic3r/GUI/GLCanvas3D.cpp:233 msgid "Left mouse button:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:244 +#: src/slic3r/GUI/GLCanvas3D.cpp:235 msgid "Add detail" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:247 +#: src/slic3r/GUI/GLCanvas3D.cpp:237 msgid "Right mouse button:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:250 +#: src/slic3r/GUI/GLCanvas3D.cpp:239 msgid "Remove detail" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:253 +#: src/slic3r/GUI/GLCanvas3D.cpp:241 msgid "Shift + Left mouse button:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:256 +#: src/slic3r/GUI/GLCanvas3D.cpp:243 msgid "Reset to base" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:259 +#: src/slic3r/GUI/GLCanvas3D.cpp:245 msgid "Shift + Right mouse button:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:262 +#: src/slic3r/GUI/GLCanvas3D.cpp:247 msgid "Smoothing" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:265 +#: src/slic3r/GUI/GLCanvas3D.cpp:249 msgid "Mouse wheel:" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:268 +#: src/slic3r/GUI/GLCanvas3D.cpp:251 msgid "Increase/decrease edit area" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:271 +#: src/slic3r/GUI/GLCanvas3D.cpp:254 msgid "Adaptive" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:277 +#: src/slic3r/GUI/GLCanvas3D.cpp:260 msgid "Quality / Speed" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:281 +#: src/slic3r/GUI/GLCanvas3D.cpp:263 msgid "Higher print quality versus higher print speed." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:292 +#: src/slic3r/GUI/GLCanvas3D.cpp:274 msgid "Smooth" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:298 src/libslic3r/PrintConfig.cpp:511 +#: src/slic3r/GUI/GLCanvas3D.cpp:280 src/libslic3r/PrintConfig.cpp:547 msgid "Radius" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:308 +#: src/slic3r/GUI/GLCanvas3D.cpp:290 msgid "Keep min" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:317 +#: src/slic3r/GUI/GLCanvas3D.cpp:299 msgid "Reset" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:607 +#: src/slic3r/GUI/GLCanvas3D.cpp:565 msgid "Variable layer height - Manual edit" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:693 -msgid "An object outside the print area was detected" +#: src/slic3r/GUI/GLCanvas3D.cpp:633 +msgid "An object outside the print area was detected." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:694 -msgid "A toolpath outside the print area was detected" +#: src/slic3r/GUI/GLCanvas3D.cpp:634 +msgid "A toolpath outside the print area was detected." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:695 -msgid "SLA supports outside the print area were detected" +#: src/slic3r/GUI/GLCanvas3D.cpp:635 +msgid "SLA supports outside the print area were detected." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:696 -msgid "Some objects are not visible" +#: src/slic3r/GUI/GLCanvas3D.cpp:636 +msgid "Some objects are not visible." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:698 +#: src/slic3r/GUI/GLCanvas3D.cpp:638 msgid "" -"An object outside the print area was detected\n" -"Resolve the current problem to continue slicing" +"An object outside the print area was detected.\n" +"Resolve the current problem to continue slicing." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:923 src/slic3r/GUI/GLCanvas3D.cpp:952 +#: src/slic3r/GUI/GLCanvas3D.cpp:910 src/slic3r/GUI/GLCanvas3D.cpp:939 msgid "Default print color" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:953 src/slic3r/GUI/GLCanvas3D.cpp:962 -#: src/slic3r/GUI/GLCanvas3D.cpp:1001 +#: src/slic3r/GUI/GLCanvas3D.cpp:940 src/slic3r/GUI/GLCanvas3D.cpp:949 +#: src/slic3r/GUI/GLCanvas3D.cpp:988 msgid "Pause print or custom G-code" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:974 +#: src/slic3r/GUI/GLCanvas3D.cpp:961 #, possible-c-format msgid "up to %.2f mm" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:978 +#: src/slic3r/GUI/GLCanvas3D.cpp:965 #, possible-c-format msgid "above %.2f mm" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:982 +#: src/slic3r/GUI/GLCanvas3D.cpp:969 #, possible-c-format msgid "%.2f - %.2f mm" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1014 +#: src/slic3r/GUI/GLCanvas3D.cpp:1001 #, possible-c-format msgid "Color change for Extruder %d at %.2f mm" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1332 +#: src/slic3r/GUI/GLCanvas3D.cpp:1312 msgid "Seq." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1439 +#: src/slic3r/GUI/GLCanvas3D.cpp:1418 msgid "canvas_tooltip" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1466 -msgid "Slope visualization" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:1468 -msgid "Facets' normal angle range (degrees)" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:1495 src/slic3r/GUI/GUI_ObjectList.cpp:1718 -#: src/libslic3r/PrintConfig.cpp:335 -msgid "Default" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:1880 +#: src/slic3r/GUI/GLCanvas3D.cpp:1778 msgid "Variable layer height - Reset" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1888 +#: src/slic3r/GUI/GLCanvas3D.cpp:1786 msgid "Variable layer height - Adaptive" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:1896 +#: src/slic3r/GUI/GLCanvas3D.cpp:1794 msgid "Variable layer height - Smooth all" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:2332 +#: src/slic3r/GUI/GLCanvas3D.cpp:2226 msgid "Mirror Object" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3224 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:519 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:746 +#: src/slic3r/GUI/GLCanvas3D.cpp:3165 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:520 msgid "Gizmo-Move" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3308 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:521 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:748 +#: src/slic3r/GUI/GLCanvas3D.cpp:3249 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:522 msgid "Gizmo-Rotate" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3880 +#: src/slic3r/GUI/GLCanvas3D.cpp:3810 msgid "Move Object" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4425 +#: src/slic3r/GUI/GLCanvas3D.cpp:4302 src/slic3r/GUI/GLCanvas3D.cpp:4939 +msgid "Switch to Settings" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4303 src/slic3r/GUI/GLCanvas3D.cpp:4939 +msgid "Print Settings Tab" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4304 src/slic3r/GUI/GLCanvas3D.cpp:4940 +msgid "Filament Settings Tab" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4304 src/slic3r/GUI/GLCanvas3D.cpp:4940 +msgid "Material Settings Tab" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4305 src/slic3r/GUI/GLCanvas3D.cpp:4941 +msgid "Printer Settings Tab" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4361 msgid "Undo History" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4425 +#: src/slic3r/GUI/GLCanvas3D.cpp:4361 msgid "Redo History" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4446 +#: src/slic3r/GUI/GLCanvas3D.cpp:4382 #, possible-c-format msgid "Undo %1$d Action" msgid_plural "Undo %1$d Actions" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4446 +#: src/slic3r/GUI/GLCanvas3D.cpp:4382 #, possible-c-format msgid "Redo %1$d Action" msgid_plural "Redo %1$d Actions" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4856 +#: src/slic3r/GUI/GLCanvas3D.cpp:4402 src/slic3r/GUI/GLCanvas3D.cpp:4957 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 src/slic3r/GUI/Search.cpp:426 +msgid "Search" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4416 src/slic3r/GUI/GLCanvas3D.cpp:4424 +#: src/slic3r/GUI/Search.cpp:433 +msgid "Type here to search" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4833 msgid "Add..." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4864 src/slic3r/GUI/GUI_ObjectList.cpp:1732 -#: src/slic3r/GUI/Plater.cpp:3935 src/slic3r/GUI/Plater.cpp:3957 -#: src/slic3r/GUI/Tab.cpp:3155 +#: src/slic3r/GUI/GLCanvas3D.cpp:4841 src/slic3r/GUI/GUI_ObjectList.cpp:1846 +#: src/slic3r/GUI/Plater.cpp:3849 src/slic3r/GUI/Plater.cpp:3871 +#: src/slic3r/GUI/Tab.cpp:3423 msgid "Delete" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4873 src/slic3r/GUI/KBShortcutsDialog.cpp:131 -#: src/slic3r/GUI/Plater.cpp:4705 +#: src/slic3r/GUI/GLCanvas3D.cpp:4850 src/slic3r/GUI/KBShortcutsDialog.cpp:124 +#: src/slic3r/GUI/Plater.cpp:4774 msgid "Delete all" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4882 src/slic3r/GUI/KBShortcutsDialog.cpp:160 -#: src/slic3r/GUI/Plater.cpp:2815 +#: src/slic3r/GUI/GLCanvas3D.cpp:4859 src/slic3r/GUI/KBShortcutsDialog.cpp:151 +#: src/slic3r/GUI/Plater.cpp:1549 msgid "Arrange" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4882 src/slic3r/GUI/KBShortcutsDialog.cpp:161 +#: src/slic3r/GUI/GLCanvas3D.cpp:4859 src/slic3r/GUI/KBShortcutsDialog.cpp:152 msgid "Arrange selection" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4894 +#: src/slic3r/GUI/GLCanvas3D.cpp:4871 msgid "Copy" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4903 +#: src/slic3r/GUI/GLCanvas3D.cpp:4880 msgid "Paste" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4915 src/slic3r/GUI/Plater.cpp:3794 -#: src/slic3r/GUI/Plater.cpp:3806 src/slic3r/GUI/Plater.cpp:3944 +#: src/slic3r/GUI/GLCanvas3D.cpp:4892 src/slic3r/GUI/Plater.cpp:3708 +#: src/slic3r/GUI/Plater.cpp:3720 src/slic3r/GUI/Plater.cpp:3858 msgid "Add instance" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4926 src/slic3r/GUI/Plater.cpp:3946 +#: src/slic3r/GUI/GLCanvas3D.cpp:4903 src/slic3r/GUI/Plater.cpp:3860 msgid "Remove instance" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4939 +#: src/slic3r/GUI/GLCanvas3D.cpp:4916 msgid "Split to objects" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:4949 src/slic3r/GUI/GUI_ObjectList.cpp:1501 +#: src/slic3r/GUI/GLCanvas3D.cpp:4926 src/slic3r/GUI/GUI_ObjectList.cpp:1618 msgid "Split to parts" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:5013 src/slic3r/GUI/KBShortcutsDialog.cpp:132 -#: src/slic3r/GUI/MainFrame.cpp:717 +#: src/slic3r/GUI/GLCanvas3D.cpp:5028 src/slic3r/GUI/KBShortcutsDialog.cpp:125 +#: src/slic3r/GUI/MainFrame.cpp:1187 msgid "Undo" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:5013 src/slic3r/GUI/GLCanvas3D.cpp:5052 +#: src/slic3r/GUI/GLCanvas3D.cpp:5028 src/slic3r/GUI/GLCanvas3D.cpp:5067 msgid "Click right mouse button to open/close History" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:5036 +#: src/slic3r/GUI/GLCanvas3D.cpp:5051 msgid "Next Undo action: %1%" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:5052 src/slic3r/GUI/KBShortcutsDialog.cpp:133 -#: src/slic3r/GUI/MainFrame.cpp:720 +#: src/slic3r/GUI/GLCanvas3D.cpp:5067 src/slic3r/GUI/KBShortcutsDialog.cpp:126 +#: src/slic3r/GUI/MainFrame.cpp:1190 msgid "Redo" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:5074 +#: src/slic3r/GUI/GLCanvas3D.cpp:5089 msgid "Next Redo action: %1%" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:7064 +#: src/slic3r/GUI/GLCanvas3D.cpp:7193 msgid "Selection-Add from rectangle" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:7083 +#: src/slic3r/GUI/GLCanvas3D.cpp:7212 msgid "Selection-Remove from rectangle" msgstr "" -#: src/slic3r/GUI/GLCanvas3DManager.cpp:365 -#, possible-c-format -msgid "" -"PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n" -"while OpenGL version %s, render %s, vendor %s was detected." -msgstr "" - -#: src/slic3r/GUI/GLCanvas3DManager.cpp:368 -msgid "You may need to update your graphics card driver." -msgstr "" - -#: src/slic3r/GUI/GLCanvas3DManager.cpp:371 -msgid "" -"As a workaround, you may run PrusaSlicer with a software rendered 3D " -"graphics by running prusa-slicer.exe with the --sw_renderer parameter." -msgstr "" - -#: src/slic3r/GUI/GLCanvas3DManager.cpp:373 -msgid "Unsupported OpenGL version" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:47 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:145 src/libslic3r/PrintConfig.cpp:3424 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:146 src/libslic3r/PrintConfig.cpp:3601 msgid "Cut" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:169 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:170 msgid "Keep upper part" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:170 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:171 msgid "Keep lower part" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:171 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:172 msgid "Rotate lower part upwards" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:176 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:177 msgid "Perform cut" msgstr "" +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:33 +msgid "FDM Support Editing" +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 "Cursor size" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:45 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:28 +msgid "Cursor type" +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 "" + +#: 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:1563 +msgid "Sphere" +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 "" + +#: 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 "" + +#: 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:235 +msgid "deg" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:239 +msgid "Enforce" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:242 +msgid "Block" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:292 +msgid "Block supports by angle" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:293 +msgid "Add supports by angle" +msgstr "" + #: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:41 msgid "Place on face" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:38 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 msgid "Hollow this object" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:39 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41 msgid "Preview hollowed and drilled model" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42 msgid "Offset" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43 msgid "Quality" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42 -#: src/libslic3r/PrintConfig.cpp:2951 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44 +#: src/libslic3r/PrintConfig.cpp:3098 msgid "Closing distance" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:45 msgid "Hole diameter" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:46 msgid "Hole depth" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:45 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:47 msgid "Remove selected holes" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:46 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:48 msgid "Remove all holes" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:47 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56 -msgid "Clipping of view" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:48 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57 -msgid "Reset direction" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:51 msgid "Show supports" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:307 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:308 msgid "Add drainage hole" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:428 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:424 msgid "Delete drainage hole" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:628 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:624 msgid "Hollowing parameter change" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:699 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:693 msgid "Change drainage hole diameter" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:791 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:785 msgid "Hollow and drill" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:846 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:835 msgid "Move drainage hole" msgstr "" @@ -1759,211 +2134,284 @@ msgstr "" msgid "Move" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:449 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:480 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:499 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:517 -#: src/libslic3r/PrintConfig.cpp:3473 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:210 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:224 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:506 +#: src/slic3r/GUI/Mouse3DController.cpp:288 +#: src/slic3r/GUI/Mouse3DController.cpp:309 +msgid "Rotation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:220 src/slic3r/GUI/Plater.cpp:3961 +msgid "Optimize orientation" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:221 +#: src/libslic3r/PrintConfig.cpp:3089 +msgid "Accuracy" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:233 +msgid "Least supports" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:234 +msgid "Suface quality" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:513 +#: 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:3650 msgid "Rotate" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:79 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:230 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:500 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:518 -#: src/libslic3r/PrintConfig.cpp:3488 +#: 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:3665 msgid "Scale" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -msgid "Head diameter" +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:30 +#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:381 +msgid "Enforce seam" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32 +#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:383 +msgid "Block seam" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:46 +msgid "Seam Editing" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47 -msgid "Lock supports under new islands" +msgid "Head diameter" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 -msgid "Remove selected points" +msgid "Lock supports under new islands" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 -msgid "Remove all points" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218 +msgid "Remove selected points" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 -msgid "Apply changes" +msgid "Remove all points" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 -msgid "Discard changes" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221 +msgid "Apply changes" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52 -msgid "Minimal points distance" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1222 +msgid "Discard changes" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53 -#: src/libslic3r/PrintConfig.cpp:2781 -msgid "Support points density" +msgid "Minimal points distance" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1222 -msgid "Auto-generate points" +#: src/libslic3r/PrintConfig.cpp:2928 +msgid "Support points density" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224 +msgid "Auto-generate points" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56 msgid "Manual editing" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:373 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:374 msgid "Add support point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:513 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:514 msgid "Delete support point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:693 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:694 msgid "Change point head diameter" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:761 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:762 msgid "Support parameter change" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:868 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:869 msgid "SLA Support Points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:893 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897 msgid "SLA gizmo turned on" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:909 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:911 msgid "Do you want to save your manually edited support points?" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:910 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:912 msgid "Save changes?" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:922 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:924 msgid "SLA gizmo turned off" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:953 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:955 msgid "Move support point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1046 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1048 msgid "Support points edit" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1125 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1127 msgid "Autogeneration will erase all manually edited points." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1126 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1128 msgid "Are you sure you want to do it?" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1127 src/slic3r/GUI/GUI.cpp:258 -#: src/slic3r/GUI/Tab.cpp:3085 src/slic3r/GUI/WipeTowerDialog.cpp:45 -#: src/slic3r/GUI/WipeTowerDialog.cpp:366 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1129 src/slic3r/GUI/GUI.cpp:256 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:478 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:502 +#: src/slic3r/GUI/WipeTowerDialog.cpp:45 src/slic3r/GUI/WipeTowerDialog.cpp:366 msgid "Warning" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1132 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1134 msgid "Autogenerate support points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1179 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1181 msgid "SLA gizmo keyboard shortcuts" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1190 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1192 msgid "Note: some shortcuts work in (non)editing mode only." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1208 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212 +#: 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/Gizmos/GLGizmoSlaSupports.cpp:1208 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1210 msgid "Add point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1209 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211 msgid "Right click" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1209 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211 msgid "Remove point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1210 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1213 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214 +#: 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/Gizmos/GLGizmoSlaSupports.cpp:1210 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212 msgid "Move point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1213 msgid "Add point to selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214 msgid "Remove point from selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1213 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 msgid "Select by rectangle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 msgid "Deselect by rectangle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 msgid "Select all points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 msgid "Mouse wheel" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 msgid "Move clipping plane" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 msgid "Reset clipping plane" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1223 msgid "Switch to editing mode" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:520 -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:747 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:521 msgid "Gizmo-Scale" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:662 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:639 msgid "Gizmo-Place on Face" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:234 +#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:39 +msgid "Supports gizmo turned on" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:40 +msgid "Seam gizmo turned on" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:47 +msgid "Seam gizmo turned off" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:48 +msgid "Supports gizmo turned off" +msgstr "" + +#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:371 +msgid "Add supports" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:243 +msgid "is based on Slic3r by Alessandro Ranellucci and the RepRap community." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:245 +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:246 +msgid "Artwork model by Nora Al-Badri and Jan Nikolai Nelles" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:528 #, possible-c-format msgid "" "%s has encountered an error. It was likely caused by running out of memory. " @@ -1973,228 +2421,284 @@ msgid "" "The application will now terminate." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:237 +#: src/slic3r/GUI/GUI_App.cpp:531 msgid "Fatal error" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:554 -msgid "Changing of an application language" +#: src/slic3r/GUI/GUI_App.cpp:655 src/slic3r/GUI/GUI_App.cpp:670 +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:557 src/slic3r/GUI/GUI_App.cpp:565 +#: src/slic3r/GUI/GUI_App.cpp:661 +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:718 +#, possible-c-format +msgid "" +"%s\n" +"Do you want to continue?" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:720 src/slic3r/GUI/UnsavedChangesDialog.cpp:653 +msgid "Remember my choice" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:759 +msgid "Loading configuration..." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:825 +msgid "Creating settings tabs..." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:1078 +msgid "" +"You have the following presets with saved options for \"Print Host upload\"" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:1082 +msgid "" +"But from this version of PrusaSlicer we don't show/use this information in " +"Printer Settings.\n" +"Now, this information will be exposed in physical printers settings." +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:1084 +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:1087 src/slic3r/GUI/Tab.cpp:3435 +msgid "Information" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:1102 src/slic3r/GUI/GUI_App.cpp:1115 msgid "Recreating" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:570 +#: src/slic3r/GUI/GUI_App.cpp:1120 msgid "Loading of current presets" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:575 +#: src/slic3r/GUI/GUI_App.cpp:1125 msgid "Loading of a mode view" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:654 +#: src/slic3r/GUI/GUI_App.cpp:1208 msgid "Choose one file (3MF/AMF):" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:672 +#: src/slic3r/GUI/GUI_App.cpp:1220 msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:733 +#: src/slic3r/GUI/GUI_App.cpp:1233 +msgid "Choose one file (GCODE/.GCO/.G/.ngc/NGC):" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:1245 +msgid "Changing of an application language" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:1295 msgid "Select the language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:733 +#: src/slic3r/GUI/GUI_App.cpp:1295 msgid "Language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:911 +#: src/slic3r/GUI/GUI_App.cpp:1425 +msgid "modified" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:1474 #, possible-c-format msgid "Run %s" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:914 +#: src/slic3r/GUI/GUI_App.cpp:1480 msgid "&Configuration Snapshots" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:914 +#: src/slic3r/GUI/GUI_App.cpp:1480 msgid "Inspect / activate configuration snapshots" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:915 +#: src/slic3r/GUI/GUI_App.cpp:1481 msgid "Take Configuration &Snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:915 +#: src/slic3r/GUI/GUI_App.cpp:1481 msgid "Capture a configuration snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:916 +#: src/slic3r/GUI/GUI_App.cpp:1482 msgid "Check for updates" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:916 +#: src/slic3r/GUI/GUI_App.cpp:1482 msgid "Check for configuration updates" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:918 +#: src/slic3r/GUI/GUI_App.cpp:1487 msgid "&Preferences" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:924 +#: src/slic3r/GUI/GUI_App.cpp:1493 msgid "Application preferences" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:927 src/slic3r/GUI/wxExtensions.cpp:756 +#: src/slic3r/GUI/GUI_App.cpp:1504 src/slic3r/GUI/wxExtensions.cpp:673 msgid "Simple" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:927 +#: src/slic3r/GUI/GUI_App.cpp:1504 msgid "Simple View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:929 src/slic3r/GUI/wxExtensions.cpp:758 +#: src/slic3r/GUI/GUI_App.cpp:1506 src/slic3r/GUI/wxExtensions.cpp:675 msgctxt "Mode" msgid "Advanced" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:929 +#: src/slic3r/GUI/GUI_App.cpp:1506 msgid "Advanced View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:930 src/slic3r/GUI/wxExtensions.cpp:759 +#: src/slic3r/GUI/GUI_App.cpp:1507 src/slic3r/GUI/wxExtensions.cpp:676 msgid "Expert" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:930 +#: src/slic3r/GUI/GUI_App.cpp:1507 msgid "Expert View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:935 +#: src/slic3r/GUI/GUI_App.cpp:1512 msgid "Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:935 +#: src/slic3r/GUI/GUI_App.cpp:1512 #, possible-c-format msgid "%s View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:937 +#: src/slic3r/GUI/GUI_App.cpp:1517 msgid "&Language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:939 +#: src/slic3r/GUI/GUI_App.cpp:1522 msgid "Flash printer &firmware" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:939 +#: src/slic3r/GUI/GUI_App.cpp:1522 msgid "Upload a firmware image into an Arduino based printer" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:954 +#: src/slic3r/GUI/GUI_App.cpp:1540 msgid "Taking configuration snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:954 +#: src/slic3r/GUI/GUI_App.cpp:1540 msgid "Snapshot name" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1001 +#: src/slic3r/GUI/GUI_App.cpp:1605 src/slic3r/GUI/GUI_App.cpp:1614 +msgid "Language selection" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:1608 msgid "" "Switching the language will trigger application restart.\n" "You will lose content of the plater." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1003 +#: src/slic3r/GUI/GUI_App.cpp:1610 msgid "Do you want to proceed?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1004 -msgid "Language selection" -msgstr "" - -#: src/slic3r/GUI/GUI_App.cpp:1028 +#: src/slic3r/GUI/GUI_App.cpp:1645 msgid "&Configuration" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1052 -msgid "The presets on the following tabs were modified" +#: src/slic3r/GUI/GUI_App.cpp:1676 +msgid "The preset(s) modifications are successfully saved" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1052 src/slic3r/GUI/Tab.cpp:2945 -msgid "Discard changes and continue anyway?" -msgstr "" - -#: src/slic3r/GUI/GUI_App.cpp:1055 -msgid "Unsaved Presets" -msgstr "" - -#: src/slic3r/GUI/GUI_App.cpp:1204 src/slic3r/GUI/Tab.cpp:2957 +#: src/slic3r/GUI/GUI_App.cpp:1876 src/slic3r/GUI/Tab.cpp:3187 msgid "It's impossible to print multi-part object(s) with SLA technology." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1205 +#: src/slic3r/GUI/GUI_App.cpp:1877 msgid "Please check and fix your object list." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1206 src/slic3r/GUI/Plater.cpp:2377 -#: src/slic3r/GUI/Tab.cpp:2959 +#: src/slic3r/GUI/GUI_App.cpp:1878 src/slic3r/GUI/Jobs/SLAImportJob.cpp:210 +#: src/slic3r/GUI/Plater.cpp:2256 src/slic3r/GUI/Tab.cpp:3189 msgid "Attention!" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:1223 +#: src/slic3r/GUI/GUI_App.cpp:1895 msgid "Select a gcode file:" msgstr "" -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 msgid "Start at height" msgstr "" -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 msgid "Stop at height" msgstr "" -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:158 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:161 msgid "Remove layer range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:162 +#: 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:95 -#: src/slic3r/GUI/GUI_ObjectList.cpp:617 src/libslic3r/PrintConfig.cpp:72 -#: src/libslic3r/PrintConfig.cpp:175 src/libslic3r/PrintConfig.cpp:184 -#: src/libslic3r/PrintConfig.cpp:408 src/libslic3r/PrintConfig.cpp:470 -#: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:890 -#: src/libslic3r/PrintConfig.cpp:1075 src/libslic3r/PrintConfig.cpp:1374 -#: src/libslic3r/PrintConfig.cpp:1441 src/libslic3r/PrintConfig.cpp:1622 -#: src/libslic3r/PrintConfig.cpp:2081 src/libslic3r/PrintConfig.cpp:2140 -#: src/libslic3r/PrintConfig.cpp:2149 +#: 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:209 src/libslic3r/PrintConfig.cpp:218 +#: src/libslic3r/PrintConfig.cpp:442 src/libslic3r/PrintConfig.cpp:506 +#: src/libslic3r/PrintConfig.cpp:514 src/libslic3r/PrintConfig.cpp:932 +#: src/libslic3r/PrintConfig.cpp:1119 src/libslic3r/PrintConfig.cpp:1482 +#: src/libslic3r/PrintConfig.cpp:1549 src/libslic3r/PrintConfig.cpp:1730 +#: src/libslic3r/PrintConfig.cpp:2217 src/libslic3r/PrintConfig.cpp:2276 +#: src/libslic3r/PrintConfig.cpp:2285 msgid "Layers and Perimeters" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:97 -#: src/slic3r/GUI/GUI_ObjectList.cpp:619 src/slic3r/GUI/GUI_Preview.cpp:305 -#: src/slic3r/GUI/Tab.cpp:1188 src/slic3r/GUI/Tab.cpp:1189 -#: src/libslic3r/ExtrusionEntity.cpp:319 src/libslic3r/PrintConfig.cpp:370 -#: src/libslic3r/PrintConfig.cpp:1502 src/libslic3r/PrintConfig.cpp:1873 -#: src/libslic3r/PrintConfig.cpp:1879 src/libslic3r/PrintConfig.cpp:1887 -#: src/libslic3r/PrintConfig.cpp:1899 src/libslic3r/PrintConfig.cpp:1909 -#: src/libslic3r/PrintConfig.cpp:1917 src/libslic3r/PrintConfig.cpp:1932 -#: src/libslic3r/PrintConfig.cpp:1953 src/libslic3r/PrintConfig.cpp:1965 -#: src/libslic3r/PrintConfig.cpp:1981 src/libslic3r/PrintConfig.cpp:1990 -#: src/libslic3r/PrintConfig.cpp:1999 src/libslic3r/PrintConfig.cpp:2010 -#: src/libslic3r/PrintConfig.cpp:2024 src/libslic3r/PrintConfig.cpp:2032 -#: src/libslic3r/PrintConfig.cpp:2033 src/libslic3r/PrintConfig.cpp:2042 -#: src/libslic3r/PrintConfig.cpp:2050 src/libslic3r/PrintConfig.cpp:2064 +#: 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:311 +#: src/slic3r/GUI/Tab.cpp:1449 src/slic3r/GUI/Tab.cpp:1450 +#: src/libslic3r/ExtrusionEntity.cpp:324 src/libslic3r/ExtrusionEntity.cpp:356 +#: src/libslic3r/PrintConfig.cpp:404 src/libslic3r/PrintConfig.cpp:1610 +#: src/libslic3r/PrintConfig.cpp:2008 src/libslic3r/PrintConfig.cpp:2014 +#: src/libslic3r/PrintConfig.cpp:2022 src/libslic3r/PrintConfig.cpp:2034 +#: src/libslic3r/PrintConfig.cpp:2044 src/libslic3r/PrintConfig.cpp:2052 +#: src/libslic3r/PrintConfig.cpp:2067 src/libslic3r/PrintConfig.cpp:2088 +#: src/libslic3r/PrintConfig.cpp:2100 src/libslic3r/PrintConfig.cpp:2116 +#: src/libslic3r/PrintConfig.cpp:2125 src/libslic3r/PrintConfig.cpp:2134 +#: src/libslic3r/PrintConfig.cpp:2145 src/libslic3r/PrintConfig.cpp:2159 +#: src/libslic3r/PrintConfig.cpp:2167 src/libslic3r/PrintConfig.cpp:2168 +#: src/libslic3r/PrintConfig.cpp:2177 src/libslic3r/PrintConfig.cpp:2185 +#: src/libslic3r/PrintConfig.cpp:2199 msgid "Support material" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:101 -#: src/slic3r/GUI/GUI_ObjectList.cpp:623 src/libslic3r/PrintConfig.cpp:2259 -#: src/libslic3r/PrintConfig.cpp:2267 +#: 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:2395 +#: src/libslic3r/PrintConfig.cpp:2403 msgid "Wipe options" msgstr "" @@ -2218,411 +2722,432 @@ msgstr "" msgid "Add support blocker" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:620 -#: src/slic3r/GUI/GUI_Preview.cpp:283 src/slic3r/GUI/Tab.cpp:1213 -#: src/libslic3r/PrintConfig.cpp:235 src/libslic3r/PrintConfig.cpp:458 -#: src/libslic3r/PrintConfig.cpp:919 src/libslic3r/PrintConfig.cpp:1048 -#: src/libslic3r/PrintConfig.cpp:1431 src/libslic3r/PrintConfig.cpp:1668 -#: src/libslic3r/PrintConfig.cpp:1723 src/libslic3r/PrintConfig.cpp:1775 -#: src/libslic3r/PrintConfig.cpp:2125 +#: src/slic3r/GUI/GUI_ObjectList.cpp:94 src/slic3r/GUI/GUI_ObjectList.cpp:653 +#: src/slic3r/GUI/GUI_Preview.cpp:307 src/slic3r/GUI/Tab.cpp:1420 +#: src/libslic3r/ExtrusionEntity.cpp:320 src/libslic3r/ExtrusionEntity.cpp:348 +#: src/libslic3r/PrintConfig.cpp:1126 src/libslic3r/PrintConfig.cpp:1132 +#: src/libslic3r/PrintConfig.cpp:1146 src/libslic3r/PrintConfig.cpp:1156 +msgid "Ironing" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:96 src/slic3r/GUI/GUI_ObjectList.cpp:655 +#: src/slic3r/GUI/GUI_Preview.cpp:278 src/slic3r/GUI/Tab.cpp:1474 +#: src/libslic3r/PrintConfig.cpp:269 src/libslic3r/PrintConfig.cpp:494 +#: src/libslic3r/PrintConfig.cpp:963 src/libslic3r/PrintConfig.cpp:1092 +#: src/libslic3r/PrintConfig.cpp:1165 src/libslic3r/PrintConfig.cpp:1539 +#: src/libslic3r/PrintConfig.cpp:1776 src/libslic3r/PrintConfig.cpp:1831 +#: src/libslic3r/PrintConfig.cpp:1883 src/libslic3r/PrintConfig.cpp:2261 msgid "Speed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:99 src/slic3r/GUI/GUI_ObjectList.cpp:621 -#: src/slic3r/GUI/Tab.cpp:1248 src/slic3r/GUI/Tab.cpp:1871 -#: src/libslic3r/PrintConfig.cpp:488 src/libslic3r/PrintConfig.cpp:1002 -#: src/libslic3r/PrintConfig.cpp:1409 src/libslic3r/PrintConfig.cpp:1744 -#: src/libslic3r/PrintConfig.cpp:1945 src/libslic3r/PrintConfig.cpp:1972 +#: src/slic3r/GUI/GUI_ObjectList.cpp:97 src/slic3r/GUI/GUI_ObjectList.cpp:656 +#: src/slic3r/GUI/Tab.cpp:1510 src/slic3r/GUI/Tab.cpp:2072 +#: src/libslic3r/PrintConfig.cpp:524 src/libslic3r/PrintConfig.cpp:1046 +#: src/libslic3r/PrintConfig.cpp:1517 src/libslic3r/PrintConfig.cpp:1852 +#: src/libslic3r/PrintConfig.cpp:2080 src/libslic3r/PrintConfig.cpp:2107 msgid "Extruders" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:100 src/slic3r/GUI/GUI_ObjectList.cpp:622 -#: src/libslic3r/PrintConfig.cpp:447 src/libslic3r/PrintConfig.cpp:555 -#: src/libslic3r/PrintConfig.cpp:877 src/libslic3r/PrintConfig.cpp:1010 -#: src/libslic3r/PrintConfig.cpp:1418 src/libslic3r/PrintConfig.cpp:1764 -#: src/libslic3r/PrintConfig.cpp:1954 src/libslic3r/PrintConfig.cpp:2113 +#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:657 +#: src/libslic3r/PrintConfig.cpp:483 src/libslic3r/PrintConfig.cpp:591 +#: src/libslic3r/PrintConfig.cpp:919 src/libslic3r/PrintConfig.cpp:1054 +#: src/libslic3r/PrintConfig.cpp:1526 src/libslic3r/PrintConfig.cpp:1872 +#: src/libslic3r/PrintConfig.cpp:2089 src/libslic3r/PrintConfig.cpp:2249 msgid "Extrusion Width" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:104 src/slic3r/GUI/GUI_ObjectList.cpp:626 -#: src/slic3r/GUI/Tab.cpp:1154 src/slic3r/GUI/Tab.cpp:1169 -#: src/slic3r/GUI/Tab.cpp:1269 src/slic3r/GUI/Tab.cpp:1272 -#: src/slic3r/GUI/Tab.cpp:1536 src/slic3r/GUI/Tab.cpp:2000 -#: src/slic3r/GUI/Tab.cpp:3730 src/libslic3r/PrintConfig.cpp:88 -#: src/libslic3r/PrintConfig.cpp:119 src/libslic3r/PrintConfig.cpp:223 -#: src/libslic3r/PrintConfig.cpp:1037 src/libslic3r/PrintConfig.cpp:2283 -#: src/libslic3r/PrintConfig.cpp:2455 +#: src/slic3r/GUI/GUI_ObjectList.cpp:102 src/slic3r/GUI/GUI_ObjectList.cpp:661 +#: src/slic3r/GUI/Tab.cpp:1409 src/slic3r/GUI/Tab.cpp:1430 +#: src/slic3r/GUI/Tab.cpp:1531 src/slic3r/GUI/Tab.cpp:1534 +#: src/slic3r/GUI/Tab.cpp:1816 src/slic3r/GUI/Tab.cpp:2152 +#: src/slic3r/GUI/Tab.cpp:4080 src/libslic3r/PrintConfig.cpp:90 +#: src/libslic3r/PrintConfig.cpp:121 src/libslic3r/PrintConfig.cpp:257 +#: src/libslic3r/PrintConfig.cpp:1081 src/libslic3r/PrintConfig.cpp:2419 +#: src/libslic3r/PrintConfig.cpp:2591 msgid "Advanced" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/GUI_ObjectList.cpp:628 -#: src/slic3r/GUI/Plater.cpp:502 src/slic3r/GUI/Tab.cpp:3671 -#: src/slic3r/GUI/Tab.cpp:3672 src/libslic3r/PrintConfig.cpp:2621 -#: src/libslic3r/PrintConfig.cpp:2628 src/libslic3r/PrintConfig.cpp:2637 -#: src/libslic3r/PrintConfig.cpp:2646 src/libslic3r/PrintConfig.cpp:2656 -#: src/libslic3r/PrintConfig.cpp:2692 src/libslic3r/PrintConfig.cpp:2699 -#: src/libslic3r/PrintConfig.cpp:2710 src/libslic3r/PrintConfig.cpp:2720 -#: src/libslic3r/PrintConfig.cpp:2729 src/libslic3r/PrintConfig.cpp:2742 -#: src/libslic3r/PrintConfig.cpp:2752 src/libslic3r/PrintConfig.cpp:2761 -#: src/libslic3r/PrintConfig.cpp:2771 src/libslic3r/PrintConfig.cpp:2782 -#: src/libslic3r/PrintConfig.cpp:2790 +#: src/slic3r/GUI/GUI_ObjectList.cpp:104 src/slic3r/GUI/GUI_ObjectList.cpp:663 +#: src/slic3r/GUI/Plater.cpp:361 src/slic3r/GUI/Tab.cpp:4014 +#: src/slic3r/GUI/Tab.cpp:4015 src/libslic3r/PrintConfig.cpp:2757 +#: src/libslic3r/PrintConfig.cpp:2764 src/libslic3r/PrintConfig.cpp:2773 +#: src/libslic3r/PrintConfig.cpp:2782 src/libslic3r/PrintConfig.cpp:2792 +#: src/libslic3r/PrintConfig.cpp:2802 src/libslic3r/PrintConfig.cpp:2839 +#: src/libslic3r/PrintConfig.cpp:2846 src/libslic3r/PrintConfig.cpp:2857 +#: src/libslic3r/PrintConfig.cpp:2867 src/libslic3r/PrintConfig.cpp:2876 +#: src/libslic3r/PrintConfig.cpp:2889 src/libslic3r/PrintConfig.cpp:2899 +#: src/libslic3r/PrintConfig.cpp:2908 src/libslic3r/PrintConfig.cpp:2918 +#: src/libslic3r/PrintConfig.cpp:2929 src/libslic3r/PrintConfig.cpp:2937 msgid "Supports" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:107 src/slic3r/GUI/GUI_ObjectList.cpp:629 -#: src/slic3r/GUI/Plater.cpp:642 src/slic3r/GUI/Tab.cpp:3705 -#: src/slic3r/GUI/Tab.cpp:3706 src/libslic3r/PrintConfig.cpp:2798 -#: src/libslic3r/PrintConfig.cpp:2805 src/libslic3r/PrintConfig.cpp:2819 -#: src/libslic3r/PrintConfig.cpp:2830 src/libslic3r/PrintConfig.cpp:2840 -#: src/libslic3r/PrintConfig.cpp:2862 src/libslic3r/PrintConfig.cpp:2873 -#: src/libslic3r/PrintConfig.cpp:2880 src/libslic3r/PrintConfig.cpp:2887 -#: src/libslic3r/PrintConfig.cpp:2898 src/libslic3r/PrintConfig.cpp:2907 -#: src/libslic3r/PrintConfig.cpp:2916 +#: src/slic3r/GUI/GUI_ObjectList.cpp:105 src/slic3r/GUI/GUI_ObjectList.cpp:664 +#: src/slic3r/GUI/Plater.cpp:501 src/slic3r/GUI/Tab.cpp:4055 +#: src/slic3r/GUI/Tab.cpp:4056 src/slic3r/GUI/Tab.cpp:4127 +#: src/libslic3r/PrintConfig.cpp:2945 src/libslic3r/PrintConfig.cpp:2952 +#: src/libslic3r/PrintConfig.cpp:2966 src/libslic3r/PrintConfig.cpp:2977 +#: src/libslic3r/PrintConfig.cpp:2987 src/libslic3r/PrintConfig.cpp:3009 +#: src/libslic3r/PrintConfig.cpp:3020 src/libslic3r/PrintConfig.cpp:3027 +#: src/libslic3r/PrintConfig.cpp:3034 src/libslic3r/PrintConfig.cpp:3045 +#: src/libslic3r/PrintConfig.cpp:3054 src/libslic3r/PrintConfig.cpp:3063 msgid "Pad" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:108 src/slic3r/GUI/Tab.cpp:3723 -#: src/slic3r/GUI/Tab.cpp:3724 src/libslic3r/SLA/Hollowing.cpp:46 -#: src/libslic3r/SLA/Hollowing.cpp:58 src/libslic3r/SLA/Hollowing.cpp:67 -#: src/libslic3r/SLA/Hollowing.cpp:76 src/libslic3r/PrintConfig.cpp:2926 -#: src/libslic3r/PrintConfig.cpp:2933 src/libslic3r/PrintConfig.cpp:2943 -#: src/libslic3r/PrintConfig.cpp:2952 +#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/Tab.cpp:4073 +#: src/slic3r/GUI/Tab.cpp:4074 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:3073 +#: src/libslic3r/PrintConfig.cpp:3080 src/libslic3r/PrintConfig.cpp:3090 +#: src/libslic3r/PrintConfig.cpp:3099 msgid "Hollowing" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:282 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:153 +#: src/slic3r/GUI/GUI_ObjectList.cpp:284 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:161 msgid "Name" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:290 src/slic3r/GUI/Tab.cpp:1500 -#: src/slic3r/GUI/wxExtensions.cpp:598 src/libslic3r/PrintConfig.cpp:487 -msgid "Extruder" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:294 src/slic3r/GUI/GUI_ObjectList.cpp:407 +#: src/slic3r/GUI/GUI_ObjectList.cpp:300 src/slic3r/GUI/GUI_ObjectList.cpp:441 msgid "Editing" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:352 +#: src/slic3r/GUI/GUI_ObjectList.cpp:386 #, possible-c-format msgid "Auto-repaired (%d errors):" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:359 +#: src/slic3r/GUI/GUI_ObjectList.cpp:393 msgid "degenerate facets" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:360 +#: src/slic3r/GUI/GUI_ObjectList.cpp:394 msgid "edges fixed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:361 +#: src/slic3r/GUI/GUI_ObjectList.cpp:395 msgid "facets removed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:362 +#: src/slic3r/GUI/GUI_ObjectList.cpp:396 msgid "facets added" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:363 +#: src/slic3r/GUI/GUI_ObjectList.cpp:397 msgid "facets reversed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:364 +#: src/slic3r/GUI/GUI_ObjectList.cpp:398 msgid "backwards edges" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:372 +#: src/slic3r/GUI/GUI_ObjectList.cpp:406 msgid "Right button click the icon to fix STL through Netfabb" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:409 +#: src/slic3r/GUI/GUI_ObjectList.cpp:443 msgid "Right button click the icon to change the object settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:411 +#: src/slic3r/GUI/GUI_ObjectList.cpp:445 msgid "Click the icon to change the object settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:415 +#: src/slic3r/GUI/GUI_ObjectList.cpp:449 msgid "Right button click the icon to change the object printable property" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:417 +#: src/slic3r/GUI/GUI_ObjectList.cpp:451 msgid "Click the icon to change the object printable property" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:462 src/slic3r/GUI/GUI_ObjectList.cpp:474 -#: src/slic3r/GUI/GUI_ObjectList.cpp:931 src/slic3r/GUI/GUI_ObjectList.cpp:4051 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4061 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4096 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:202 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:259 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:284 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:492 -#: src/slic3r/GUI/ObjectDataViewModel.cpp:1755 -msgid "default" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:540 +#: src/slic3r/GUI/GUI_ObjectList.cpp:574 msgid "Change Extruder" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:555 +#: src/slic3r/GUI/GUI_ObjectList.cpp:589 msgid "Rename Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:555 +#: src/slic3r/GUI/GUI_ObjectList.cpp:589 msgid "Rename Sub-object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1105 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3865 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1215 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4244 msgid "Instances to Separated Objects" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1120 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1230 msgid "Volumes in Object reordered" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1120 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1230 msgid "Object reordered" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1196 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1544 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1550 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1863 +#: 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 #, possible-c-format msgid "Quick Add Settings (%s)" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1279 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1396 msgid "Select showing settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1328 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1445 msgid "Add Settings for Layers" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1329 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1446 msgid "Add Settings for Sub-object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1330 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1447 msgid "Add Settings for Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1400 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1517 msgid "Add Settings Bundle for Height range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1401 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1518 msgid "Add Settings Bundle for Sub-object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1402 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1519 msgid "Add Settings Bundle for Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1441 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1558 msgid "Load" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1446 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1478 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1482 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1563 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1595 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1599 msgid "Box" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1446 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1563 msgid "Cylinder" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1446 -msgid "Sphere" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1446 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1563 msgid "Slab" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1514 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1631 msgid "Height range Modifier" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1523 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1640 msgid "Add settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1603 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1718 msgid "Change type" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1613 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1625 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1728 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1740 msgid "Set as a Separated Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1625 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1740 msgid "Set as a Separated Objects" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1635 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1750 msgid "Printable" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1650 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1765 msgid "Rename" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1661 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1776 msgid "Fix through the Netfabb" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1671 src/slic3r/GUI/Plater.cpp:3970 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1786 src/slic3r/GUI/Plater.cpp:3884 msgid "Export as STL" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1678 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4040 src/slic3r/GUI/Plater.cpp:3938 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1793 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4439 src/slic3r/GUI/Plater.cpp:3852 msgid "Reload the selected volumes from disk" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1685 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1800 msgid "Set extruder for selected items" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1738 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1832 src/libslic3r/PrintConfig.cpp:369 +msgid "Default" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1852 msgid "Scale to print volume" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1738 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1852 msgid "Scale the selected object to fit the print volume" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1807 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2065 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1858 src/slic3r/GUI/Plater.cpp:4886 +msgid "Convert from imperial units" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1861 src/slic3r/GUI/Plater.cpp:4886 +msgid "Revert conversion from imperial units" +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:3641 +msgid "Merge" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1868 +msgid "Merge objects to the one multipart object" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1876 +msgid "Merge objects to the one single object" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1953 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2210 msgid "Add Shape" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1893 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2038 msgid "Load Part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1932 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2077 msgid "Error!" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2007 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2152 msgid "Add Generic Subobject" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2036 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2181 msgid "Generic" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2154 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2256 +#: 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:2166 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2319 msgid "Delete Settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2190 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2341 msgid "Delete All Instances from Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2206 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2357 msgid "Delete Height Range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2237 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2389 msgid "From Object List You can't delete the last solid part from object." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2241 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2393 msgid "Delete Subobject" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2260 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2412 msgid "Delete Instance" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2284 src/slic3r/GUI/Plater.cpp:2978 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2436 src/slic3r/GUI/Plater.cpp:2771 msgid "" "The selected object couldn't be split because it contains only one part." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2288 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2440 msgid "Split to Parts" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2342 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2576 +msgid "Merged" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2660 +msgid "Merge all parts to the one single object" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2692 msgid "Add Layers" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2468 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2846 msgid "Group manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2480 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2858 msgid "Object manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2493 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2871 msgid "Object Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2497 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2875 msgid "Part Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2502 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2880 msgid "Layer range Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2508 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2886 msgid "Part manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2514 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2892 msgid "Instance manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2521 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2899 msgid "Height ranges" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2521 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2899 msgid "Settings for height range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2707 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3083 msgid "Delete Selected Item" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2844 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3221 msgid "Delete Selected" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2920 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2948 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2968 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3297 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3325 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3345 msgid "Add Height Range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3014 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3391 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:3018 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3395 msgid "" "Cannot insert a new layer range between the current and the next layer " "range.\n" @@ -2630,206 +3155,208 @@ msgid "" "is thinner than the minimum layer height allowed." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3023 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3400 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:3082 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3459 msgid "Edit Height Range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3375 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3754 msgid "Selection-Remove from list" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3383 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3762 msgid "Selection-Add from list" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3501 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3880 msgid "Object or Instance" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3502 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3635 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3881 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4014 msgid "Part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3502 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3881 msgid "Layer" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3504 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3883 msgid "Unsupported selection" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3505 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3884 #, possible-c-format msgid "You started your selection with %s Item." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3506 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3885 #, possible-c-format msgid "In this mode you can select only other %s Items%s" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3509 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3888 msgid "of a current Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3514 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3589 src/slic3r/GUI/Plater.cpp:143 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3893 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3968 src/slic3r/GUI/Plater.cpp:147 msgid "Info" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3630 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4009 msgid "You can't change a type of the last solid part of the object." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3635 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4014 msgid "Modifier" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3635 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4014 msgid "Support Enforcer" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3635 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4014 msgid "Support Blocker" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3637 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4016 msgid "Select type of part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3642 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4021 msgid "Change Part Type" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3887 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4266 msgid "Enter new name" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3887 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4266 msgid "Renaming" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3903 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4010 src/slic3r/GUI/Tab.cpp:3529 -#: src/slic3r/GUI/Tab.cpp:3533 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4282 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4409 +#: src/slic3r/GUI/SavePresetDialog.cpp:116 +#: src/slic3r/GUI/SavePresetDialog.cpp:124 msgid "The supplied name is not valid;" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3904 -#: src/slic3r/GUI/GUI_ObjectList.cpp:4011 src/slic3r/GUI/Tab.cpp:3530 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4283 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4410 +#: src/slic3r/GUI/SavePresetDialog.cpp:117 msgid "the following characters are not allowed:" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4055 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4458 msgid "Select extruder number:" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4056 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4459 msgid "This extruder will be set for selected items" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4081 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4484 msgid "Change Extruders" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4178 src/slic3r/GUI/Selection.cpp:1481 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4581 src/slic3r/GUI/Selection.cpp:1513 msgid "Set Printable" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:4178 src/slic3r/GUI/Selection.cpp:1481 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4581 src/slic3r/GUI/Selection.cpp:1513 msgid "Set Unprintable" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:105 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:68 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:111 msgid "World coordinates" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:63 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:106 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:69 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:112 msgid "Local coordinates" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:82 +#: 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:155 src/libslic3r/GCode.cpp:638 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:163 src/libslic3r/GCode.cpp:623 msgid "Object name" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:215 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:457 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:223 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:505 msgid "Position" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:458 -#: src/slic3r/GUI/Mouse3DController.cpp:295 -#: src/slic3r/GUI/Mouse3DController.cpp:318 -msgid "Rotation" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:263 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:271 #, possible-c-format msgid "Toggle %c axis mirroring" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:297 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:305 msgid "Set Mirror" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:337 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:349 +#: 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_ObjectManipulation.cpp:345 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:357 msgid "Drop to bed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:363 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:372 msgid "Reset rotation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:385 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:394 msgid "Reset Rotation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:397 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:399 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:407 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409 msgid "Reset scale" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:459 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:507 msgid "Scale factors" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:516 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:561 msgid "Translate" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 +#: 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:750 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:797 msgid "Set Position" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:781 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:828 msgid "Set Orientation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:846 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:893 msgid "Set Scale" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:875 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:925 msgid "" "The currently manipulated object is tilted (rotation angles are not " "multiples of 90°).\n" @@ -2838,1122 +3365,1312 @@ msgid "" "once the rotation is embedded into the object coordinates." msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:878 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:928 msgid "" "This operation is irreversible.\n" "Do you want to proceed?" msgstr "" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:59 +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:62 msgid "Additional Settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:95 +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:98 msgid "Remove parameter" msgstr "" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:101 +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:104 #, possible-c-format msgid "Delete Option %s" msgstr "" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:152 +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:157 #, possible-c-format msgid "Change Option %s" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:277 +#: src/slic3r/GUI/GUI_Preview.cpp:265 src/slic3r/GUI/GUI_Preview.cpp:271 msgid "View" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:280 src/slic3r/GUI/GUI_Preview.cpp:641 -#: src/libslic3r/GCode/PreviewData.cpp:346 -msgid "Feature type" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:281 src/libslic3r/PrintConfig.cpp:500 +#: src/slic3r/GUI/GUI_Preview.cpp:276 src/libslic3r/PrintConfig.cpp:536 msgid "Height" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:282 src/libslic3r/PrintConfig.cpp:2245 +#: src/slic3r/GUI/GUI_Preview.cpp:277 src/libslic3r/PrintConfig.cpp:2381 msgid "Width" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:284 src/slic3r/GUI/Tab.cpp:1523 +#: src/slic3r/GUI/GUI_Preview.cpp:279 src/slic3r/GUI/Tab.cpp:1803 msgid "Fan speed" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:285 +#: src/slic3r/GUI/GUI_Preview.cpp:280 msgid "Volumetric flow rate" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:286 src/slic3r/GUI/GUI_Preview.cpp:401 -#: src/slic3r/GUI/GUI_Preview.cpp:585 src/slic3r/GUI/GUI_Preview.cpp:640 -#: src/slic3r/GUI/GUI_Preview.cpp:901 src/libslic3r/GCode/PreviewData.cpp:358 -msgid "Tool" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:287 src/slic3r/GUI/GUI_Preview.cpp:638 -#: src/libslic3r/GCode/PreviewData.cpp:360 -msgid "Color Print" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:290 +#: src/slic3r/GUI/GUI_Preview.cpp:286 src/slic3r/GUI/GUI_Preview.cpp:288 msgid "Show" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:293 src/slic3r/GUI/GUI_Preview.cpp:294 +#: src/slic3r/GUI/GUI_Preview.cpp:293 src/slic3r/GUI/GUI_Preview.cpp:295 +#: src/slic3r/GUI/GUI_Preview.cpp:316 msgid "Feature types" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:296 src/libslic3r/ExtrusionEntity.cpp:310 +#: src/slic3r/GUI/GUI_Preview.cpp:301 src/libslic3r/ExtrusionEntity.cpp:314 +#: src/libslic3r/ExtrusionEntity.cpp:336 msgid "Perimeter" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:297 src/libslic3r/ExtrusionEntity.cpp:311 +#: src/slic3r/GUI/GUI_Preview.cpp:302 src/libslic3r/ExtrusionEntity.cpp:315 +#: src/libslic3r/ExtrusionEntity.cpp:338 msgid "External perimeter" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:298 src/libslic3r/ExtrusionEntity.cpp:312 +#: src/slic3r/GUI/GUI_Preview.cpp:303 src/libslic3r/ExtrusionEntity.cpp:316 +#: src/libslic3r/ExtrusionEntity.cpp:340 msgid "Overhang perimeter" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:299 src/libslic3r/ExtrusionEntity.cpp:313 +#: src/slic3r/GUI/GUI_Preview.cpp:304 src/libslic3r/ExtrusionEntity.cpp:317 +#: src/libslic3r/ExtrusionEntity.cpp:342 msgid "Internal infill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:300 src/libslic3r/ExtrusionEntity.cpp:314 -#: src/libslic3r/PrintConfig.cpp:1763 src/libslic3r/PrintConfig.cpp:1774 +#: src/slic3r/GUI/GUI_Preview.cpp:305 src/libslic3r/ExtrusionEntity.cpp:318 +#: src/libslic3r/ExtrusionEntity.cpp:344 src/libslic3r/PrintConfig.cpp:1871 +#: src/libslic3r/PrintConfig.cpp:1882 msgid "Solid infill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:301 src/libslic3r/ExtrusionEntity.cpp:315 -#: src/libslic3r/PrintConfig.cpp:2112 src/libslic3r/PrintConfig.cpp:2124 +#: src/slic3r/GUI/GUI_Preview.cpp:306 src/libslic3r/ExtrusionEntity.cpp:319 +#: src/libslic3r/ExtrusionEntity.cpp:346 src/libslic3r/PrintConfig.cpp:2248 +#: src/libslic3r/PrintConfig.cpp:2260 msgid "Top solid infill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:302 src/libslic3r/ExtrusionEntity.cpp:316 +#: src/slic3r/GUI/GUI_Preview.cpp:308 src/libslic3r/ExtrusionEntity.cpp:321 +#: src/libslic3r/ExtrusionEntity.cpp:350 msgid "Bridge infill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:303 src/libslic3r/ExtrusionEntity.cpp:317 -#: src/libslic3r/PrintConfig.cpp:918 +#: src/slic3r/GUI/GUI_Preview.cpp:309 src/libslic3r/ExtrusionEntity.cpp:322 +#: src/libslic3r/ExtrusionEntity.cpp:352 src/libslic3r/PrintConfig.cpp:962 msgid "Gap fill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:304 src/slic3r/GUI/Tab.cpp:1178 -#: src/libslic3r/ExtrusionEntity.cpp:318 +#: src/slic3r/GUI/GUI_Preview.cpp:310 src/slic3r/GUI/Tab.cpp:1439 +#: src/libslic3r/ExtrusionEntity.cpp:323 src/libslic3r/ExtrusionEntity.cpp:354 msgid "Skirt" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:306 src/libslic3r/ExtrusionEntity.cpp:320 -#: src/libslic3r/PrintConfig.cpp:1998 +#: src/slic3r/GUI/GUI_Preview.cpp:312 src/libslic3r/ExtrusionEntity.cpp:325 +#: src/libslic3r/ExtrusionEntity.cpp:358 src/libslic3r/PrintConfig.cpp:2133 msgid "Support material interface" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:307 src/slic3r/GUI/Tab.cpp:1259 -#: src/libslic3r/ExtrusionEntity.cpp:321 +#: src/slic3r/GUI/GUI_Preview.cpp:313 src/slic3r/GUI/Tab.cpp:1521 +#: src/libslic3r/ExtrusionEntity.cpp:326 src/libslic3r/ExtrusionEntity.cpp:360 msgid "Wipe tower" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:312 src/libslic3r/PrintConfig.cpp:2159 -msgid "Travel" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:313 -msgid "Retractions" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:314 -msgid "Unretractions" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:315 +#: src/slic3r/GUI/GUI_Preview.cpp:338 src/slic3r/GUI/GUI_Preview.cpp:1478 msgid "Shells" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:316 +#: src/slic3r/GUI/GUI_Preview.cpp:339 msgid "Legend" msgstr "" -#: src/slic3r/GUI/Job.hpp:123 +#: src/slic3r/GUI/GUI_Preview.cpp:1479 +msgid "Tool marker" +msgstr "" + +#: src/slic3r/GUI/GUI_Preview.cpp:1480 +msgid "Legend/Estimated printing time" +msgstr "" + +#: src/slic3r/GUI/ImGuiWrapper.cpp:800 src/slic3r/GUI/Search.cpp:464 +msgid "Use for search" +msgstr "" + +#: src/slic3r/GUI/ImGuiWrapper.cpp:801 src/slic3r/GUI/Search.cpp:458 +msgid "Category" +msgstr "" + +#: src/slic3r/GUI/ImGuiWrapper.cpp:803 src/slic3r/GUI/Search.cpp:460 +msgid "Search in English" +msgstr "" + +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:149 +msgid "Arranging" +msgstr "" + +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:176 +msgid "Could not arrange model objects! Some geometries may be invalid." +msgstr "" + +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:182 +msgid "Arranging canceled." +msgstr "" + +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:183 +msgid "Arranging done." +msgstr "" + +#: src/slic3r/GUI/Jobs/Job.cpp:74 msgid "ERROR: not enough resources to execute a new job." msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:41 src/slic3r/GUI/MainFrame.cpp:855 +#: 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 "" + +#: 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:56 +msgid "Quality: " +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 "" + +#: 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:2254 +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:2255 +#: src/slic3r/GUI/Tab.cpp:3188 +msgid "Please check your object list before preset changing." +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:37 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:39 src/slic3r/GUI/MainFrame.cpp:941 +#: src/slic3r/GUI/MainFrame.cpp:1332 msgid "Keyboard Shortcuts" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:105 msgid "New project, clear plater" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 msgid "Open project STL/OBJ/AMF/3MF with config, clear plater" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:107 msgid "Save project (3mf)" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 msgid "Save project as (3mf)" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:116 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 msgid "(Re)slice" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 msgid "Import STL/OBJ/AMF/3MF without config, keep plater" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 msgid "Import Config from ini/amf/3mf/gcode" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 msgid "Load Config from ini/amf/3mf/gcode and merge" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 src/slic3r/GUI/Plater.cpp:898 -#: src/slic3r/GUI/Plater.cpp:5531 src/libslic3r/PrintConfig.cpp:3375 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 src/slic3r/GUI/Plater.cpp:766 +#: src/slic3r/GUI/Plater.cpp:5706 src/libslic3r/PrintConfig.cpp:3546 msgid "Export G-code" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Plater.cpp:5532 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:116 src/slic3r/GUI/Plater.cpp:5707 msgid "Send G-code" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 msgid "Export config" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:125 src/slic3r/GUI/Plater.cpp:887 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 src/slic3r/GUI/Plater.cpp:755 msgid "Export to SD card / Flash drive" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 msgid "Eject SD card / Flash drive" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:128 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 msgid "Select all objects" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 msgid "Deselect all" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 msgid "Delete selected" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 msgid "Copy to clipboard" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:128 msgid "Paste from clipboard" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 msgid "Reload plater from disk" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 msgid "Select Plater Tab" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:133 msgid "Select Print Settings Tab" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 msgid "Select Filament Settings Tab" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 msgid "Select Printer Settings Tab" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 msgid "Switch to 3D" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 msgid "Switch to Preview" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 #: src/slic3r/GUI/PrintHostDialogs.cpp:136 msgid "Print host upload queue" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 msgid "Camera view" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 msgid "Show/Hide object/instance labels" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 -msgid "Turn On/Off facets' slope rendering" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 src/slic3r/GUI/Preferences.cpp:10 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 src/slic3r/GUI/Preferences.cpp:12 msgid "Preferences" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 msgid "Show keyboard shortcuts list" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 msgid "Commands" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 msgid "Add Instance of the selected object" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 msgid "Remove Instance of the selected object" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 msgid "" "Press to select multiple objects\n" "or move multiple objects with mouse" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 msgid "Press to activate selection rectangle" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 msgid "Press to activate deselection rectangle" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:209 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 msgid "Arrow Up" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 msgid "Move selection 10 mm in positive Y direction" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:210 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:206 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:216 msgid "Arrow Down" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 msgid "Move selection 10 mm in negative Y direction" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:221 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:229 msgid "Arrow Left" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 msgid "Move selection 10 mm in negative X direction" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 msgid "Arrow Right" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 msgid "Move selection 10 mm in positive X direction" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 msgid "Any arrow" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 msgid "Movement step set to 1 mm" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 msgid "Movement in camera space" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 msgid "Page Up" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 msgid "Rotate selection 45 degrees CCW" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 msgid "Page Down" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 msgid "Rotate selection 45 degrees CW" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:175 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 msgid "Gizmo move" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 msgid "Gizmo scale" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:177 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 msgid "Gizmo rotate" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:178 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 msgid "Gizmo cut" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 msgid "Gizmo Place face on bed" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:180 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 msgid "Gizmo SLA hollow" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:181 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 msgid "Gizmo SLA support points" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 msgid "Unselect gizmo or clear selection" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:183 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 msgid "Change camera type (perspective, orthographic)" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:175 msgid "Zoom to Bed" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 msgid "" "Zoom to selected object\n" "or all objects in scene, if none selected" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:186 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:177 msgid "Zoom in" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:178 msgid "Zoom out" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +msgid "Switch between Editor/Preview" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:180 +msgid "Collapse/Expand the sidebar" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 msgid "Show/Hide 3Dconnexion devices settings dialog" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 src/slic3r/GUI/MainFrame.cpp:311 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 src/slic3r/GUI/MainFrame.cpp:340 +#: src/slic3r/GUI/MainFrame.cpp:352 msgid "Plater" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:200 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 #, possible-c-format msgid "" "Press to snap by 5% in Gizmo scale\n" "or to snap by 1mm in Gizmo move" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:201 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:194 msgid "" "Scale selection to fit print volume\n" "in Gizmo scale" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:202 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:195 msgid "Press to activate one direction scaling in Gizmo scale" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:203 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 msgid "" "Press to scale (in Gizmo scale) or rotate (in Gizmo rotate)\n" "selected objects around their own center" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:206 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 msgid "Gizmos" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:209 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:211 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 msgid "Upper Layer" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:210 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:212 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:206 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:208 msgid "Lower Layer" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 -msgid "Show/Hide Legend" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:209 +msgid "Show/Hide Legend/Estimated printing time" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:216 src/slic3r/GUI/Plater.cpp:4129 -#: src/slic3r/GUI/Tab.cpp:2385 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:212 src/slic3r/GUI/Plater.cpp:4052 +#: src/slic3r/GUI/Tab.cpp:2559 msgid "Preview" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 msgid "Move current slider thumb Up" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:216 msgid "Move current slider thumb Down" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:221 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 msgid "Set upper thumb to current slider thumb" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 msgid "Set lower thumb to current slider thumb" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 msgid "Add color change marker for current layer" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:220 msgid "Delete color change marker for current layer" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:221 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:231 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:232 +msgid "" +"Press to speed up 5 times while moving thumb\n" +"with arrow keys or mouse wheel" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 msgid "Layers Slider" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:250 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:229 +msgid "Move current slider thumb Left" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 +msgid "Move current slider thumb Right" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:235 +msgid "Sequential Slider" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:259 msgid "Keyboard shortcuts" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:72 +#: src/slic3r/GUI/MainFrame.cpp:63 src/slic3r/GUI/MainFrame.cpp:1262 +msgid "Open new instance" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:63 src/slic3r/GUI/MainFrame.cpp:77 +#: src/slic3r/GUI/MainFrame.cpp:1262 +msgid "Open a new PrusaSlicer instance" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:66 src/slic3r/GUI/MainFrame.cpp:79 +msgid "G-code preview" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:66 src/slic3r/GUI/MainFrame.cpp:1141 +msgid "Open G-code viewer" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:77 src/slic3r/GUI/MainFrame.cpp:1398 +msgid "Open PrusaSlicer" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:79 +msgid "Open new G-code viewer" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:166 msgid "" -" - Remember to check for updates at http://github.com/prusa3d/PrusaSlicer/" +" - Remember to check for updates at https://github.com/prusa3d/PrusaSlicer/" "releases" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:281 +#: src/slic3r/GUI/MainFrame.cpp:535 src/slic3r/GUI/MainFrame.cpp:537 msgid "based on Slic3r" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:533 -msgid "&New Project" +#: src/slic3r/GUI/MainFrame.cpp:909 src/slic3r/GUI/MainFrame.cpp:1308 +msgid "Prusa 3D &Drivers" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:533 -msgid "Start a new project" +#: src/slic3r/GUI/MainFrame.cpp:909 src/slic3r/GUI/MainFrame.cpp:1308 +msgid "Open the Prusa3D drivers download page in your browser" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:536 -msgid "&Open Project" +#: src/slic3r/GUI/MainFrame.cpp:911 src/slic3r/GUI/MainFrame.cpp:1310 +msgid "Software &Releases" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:536 -msgid "Open a project file" +#: src/slic3r/GUI/MainFrame.cpp:911 src/slic3r/GUI/MainFrame.cpp:1310 +msgid "Open the software releases page in your browser" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:541 -msgid "Recent projects" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:550 -msgid "" -"The selected project is no longer available.\n" -"Do you want to remove it from the recent projects list?" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:550 src/slic3r/GUI/MainFrame.cpp:932 -#: src/slic3r/GUI/PrintHostDialogs.cpp:231 -msgid "Error" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:575 -msgid "&Save Project" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:575 -msgid "Save current project file" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:579 src/slic3r/GUI/MainFrame.cpp:581 -msgid "Save Project &as" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:579 src/slic3r/GUI/MainFrame.cpp:581 -msgid "Save current project file as" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:589 -msgid "Import STL/OBJ/AM&F/3MF" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:589 -msgid "Load a model" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:593 -msgid "Import &Config" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:593 -msgid "Load exported configuration file" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:596 -msgid "Import Config from &project" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:596 -msgid "Load configuration from project file" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:600 -msgid "Import Config &Bundle" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:600 -msgid "Load presets from a bundle" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:603 -msgid "&Import" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:606 src/slic3r/GUI/MainFrame.cpp:896 -msgid "Export &G-code" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:606 -msgid "Export current plate as G-code" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:610 src/slic3r/GUI/MainFrame.cpp:897 -msgid "S&end G-code" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:610 -msgid "Send to print current plate as G-code" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:614 -msgid "Export G-code to SD card / Flash drive" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:614 -msgid "Export current plate as G-code to SD card / Flash drive" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:618 -msgid "Export plate as &STL" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:618 -msgid "Export current plate as STL" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:621 -msgid "Export plate as STL &including supports" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:621 -msgid "Export current plate as STL including supports" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:624 -msgid "Export plate as &AMF" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:624 -msgid "Export current plate as AMF" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:628 -msgid "Export &toolpaths as OBJ" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:628 -msgid "Export toolpaths as OBJ" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:632 -msgid "Export &Config" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:632 -msgid "Export current configuration to file" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:635 -msgid "Export Config &Bundle" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:635 -msgid "Export all presets to file" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:638 -msgid "&Export" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:640 -msgid "Ejec&t SD card / Flash drive" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:640 -msgid "Eject SD card / Flash drive after the G-code was exported to it." -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:648 -msgid "Quick Slice" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:648 -msgid "Slice a file into a G-code" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:654 -msgid "Quick Slice and Save As" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:654 -msgid "Slice a file into a G-code, save as" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:660 -msgid "Repeat Last Quick Slice" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:660 -msgid "Repeat last quick slice" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:668 -msgid "(Re)Slice No&w" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:668 -msgid "Start new slicing process" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:672 -msgid "&Repair STL file" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:672 -msgid "Automatically repair an STL file" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:676 -msgid "&Quit" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:676 +#: src/slic3r/GUI/MainFrame.cpp:917 src/slic3r/GUI/MainFrame.cpp:1316 #, possible-c-format -msgid "Quit %s" +msgid "%s &Website" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:701 -msgid "&Select all" +#: src/slic3r/GUI/MainFrame.cpp:918 src/slic3r/GUI/MainFrame.cpp:1317 +#, possible-c-format +msgid "Open the %s website in your browser" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:702 -msgid "Selects all objects" +#: src/slic3r/GUI/MainFrame.cpp:924 src/slic3r/GUI/MainFrame.cpp:1323 +msgid "System &Info" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:704 -msgid "D&eselect all" +#: src/slic3r/GUI/MainFrame.cpp:924 src/slic3r/GUI/MainFrame.cpp:1323 +msgid "Show system information" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:705 -msgid "Deselects all objects" +#: src/slic3r/GUI/MainFrame.cpp:926 src/slic3r/GUI/MainFrame.cpp:1325 +msgid "Show &Configuration Folder" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:708 -msgid "&Delete selected" +#: src/slic3r/GUI/MainFrame.cpp:926 src/slic3r/GUI/MainFrame.cpp:1325 +msgid "Show user configuration folder (datadir)" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:709 -msgid "Deletes the current selection" +#: src/slic3r/GUI/MainFrame.cpp:928 src/slic3r/GUI/MainFrame.cpp:1327 +msgid "Report an I&ssue" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:711 -msgid "Delete &all" +#: src/slic3r/GUI/MainFrame.cpp:928 src/slic3r/GUI/MainFrame.cpp:1327 +#, possible-c-format +msgid "Report an issue on %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:712 -msgid "Deletes all objects" +#: src/slic3r/GUI/MainFrame.cpp:933 src/slic3r/GUI/MainFrame.cpp:937 +#: src/slic3r/GUI/MainFrame.cpp:1329 +#, possible-c-format +msgid "&About %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:716 -msgid "&Undo" +#: src/slic3r/GUI/MainFrame.cpp:933 src/slic3r/GUI/MainFrame.cpp:937 +#: src/slic3r/GUI/MainFrame.cpp:1329 +msgid "Show about dialog" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:719 -msgid "&Redo" +#: src/slic3r/GUI/MainFrame.cpp:941 src/slic3r/GUI/MainFrame.cpp:1332 +msgid "Show the list of the keyboard shortcuts" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:724 -msgid "&Copy" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:725 -msgid "Copy selection to clipboard" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:727 -msgid "&Paste" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:728 -msgid "Paste clipboard" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:732 -msgid "Re&load from disk" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:733 -msgid "Reload the plater from disk" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:742 -msgid "&Plater Tab" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:742 -msgid "Show the plater" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:750 -msgid "P&rint Settings Tab" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:750 -msgid "Show the print settings" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:753 src/slic3r/GUI/MainFrame.cpp:899 -msgid "&Filament Settings Tab" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:753 -msgid "Show the filament settings" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:757 -msgid "Print&er Settings Tab" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:757 -msgid "Show the printer settings" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:762 -msgid "3&D" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:762 -msgid "Show the 3D editing view" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:765 -msgid "Pre&view" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:765 -msgid "Show the 3D slices preview" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:784 -msgid "Print &Host Upload Queue" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:784 -msgid "Display the Print Host Upload Queue window" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:794 +#: src/slic3r/GUI/MainFrame.cpp:955 src/slic3r/GUI/MainFrame.cpp:1275 msgid "Iso" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:794 +#: src/slic3r/GUI/MainFrame.cpp:955 src/slic3r/GUI/MainFrame.cpp:1275 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:798 src/libslic3r/PrintConfig.cpp:2139 -#: src/libslic3r/PrintConfig.cpp:2148 +#: src/slic3r/GUI/MainFrame.cpp:959 src/slic3r/GUI/MainFrame.cpp:1279 +#: src/libslic3r/PrintConfig.cpp:2275 src/libslic3r/PrintConfig.cpp:2284 msgid "Top" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:798 +#: src/slic3r/GUI/MainFrame.cpp:959 src/slic3r/GUI/MainFrame.cpp:1279 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:801 src/libslic3r/PrintConfig.cpp:174 -#: src/libslic3r/PrintConfig.cpp:183 +#: src/slic3r/GUI/MainFrame.cpp:962 src/slic3r/GUI/MainFrame.cpp:1282 +#: src/libslic3r/PrintConfig.cpp:208 src/libslic3r/PrintConfig.cpp:217 msgid "Bottom" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:801 +#: src/slic3r/GUI/MainFrame.cpp:962 src/slic3r/GUI/MainFrame.cpp:1282 msgid "Bottom View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:803 +#: src/slic3r/GUI/MainFrame.cpp:964 src/slic3r/GUI/MainFrame.cpp:1284 msgid "Front" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:803 +#: src/slic3r/GUI/MainFrame.cpp:964 src/slic3r/GUI/MainFrame.cpp:1284 msgid "Front View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:805 src/libslic3r/PrintConfig.cpp:1632 +#: src/slic3r/GUI/MainFrame.cpp:966 src/slic3r/GUI/MainFrame.cpp:1286 +#: src/libslic3r/PrintConfig.cpp:1740 msgid "Rear" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:805 +#: src/slic3r/GUI/MainFrame.cpp:966 src/slic3r/GUI/MainFrame.cpp:1286 msgid "Rear View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:807 +#: src/slic3r/GUI/MainFrame.cpp:968 src/slic3r/GUI/MainFrame.cpp:1288 msgid "Left" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:807 +#: src/slic3r/GUI/MainFrame.cpp:968 src/slic3r/GUI/MainFrame.cpp:1288 msgid "Left View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:809 +#: src/slic3r/GUI/MainFrame.cpp:970 src/slic3r/GUI/MainFrame.cpp:1290 msgid "Right" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:809 +#: src/slic3r/GUI/MainFrame.cpp:970 src/slic3r/GUI/MainFrame.cpp:1290 msgid "Right View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:814 src/slic3r/GUI/MainFrame.cpp:822 +#: src/slic3r/GUI/MainFrame.cpp:986 +msgid "&New Project" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:986 +msgid "Start a new project" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:989 +msgid "&Open Project" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:989 +msgid "Open a project file" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:994 +msgid "Recent projects" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1003 +msgid "" +"The selected project is no longer available.\n" +"Do you want to remove it from the recent projects list?" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1003 src/slic3r/GUI/MainFrame.cpp:1486 +#: src/slic3r/GUI/PrintHostDialogs.cpp:231 +msgid "Error" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1028 +msgid "&Save Project" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1028 +msgid "Save current project file" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1032 src/slic3r/GUI/MainFrame.cpp:1034 +msgid "Save Project &as" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1032 src/slic3r/GUI/MainFrame.cpp:1034 +msgid "Save current project file as" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1042 +msgid "Import STL/OBJ/AM&F/3MF" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1042 +msgid "Load a model" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1046 +msgid "Import STL (imperial units)" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1046 +msgid "Load an model saved with imperial units" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1050 +msgid "Import SL1 archive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1050 +msgid "Load an SL1 output archive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1055 +msgid "Import &Config" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1055 +msgid "Load exported configuration file" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1058 +msgid "Import Config from &project" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1058 +msgid "Load configuration from project file" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1062 +msgid "Import Config &Bundle" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1062 +msgid "Load presets from a bundle" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1065 +msgid "&Import" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1068 src/slic3r/GUI/MainFrame.cpp:1448 +msgid "Export &G-code" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1068 +msgid "Export current plate as G-code" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1072 src/slic3r/GUI/MainFrame.cpp:1449 +msgid "S&end G-code" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1072 +msgid "Send to print current plate as G-code" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1076 +msgid "Export G-code to SD card / Flash drive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1076 +msgid "Export current plate as G-code to SD card / Flash drive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1080 +msgid "Export plate as &STL" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1080 +msgid "Export current plate as STL" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1083 +msgid "Export plate as STL &including supports" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1083 +msgid "Export current plate as STL including supports" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1086 +msgid "Export plate as &AMF" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1086 +msgid "Export current plate as AMF" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1090 src/slic3r/GUI/MainFrame.cpp:1395 +msgid "Export &toolpaths as OBJ" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1090 src/slic3r/GUI/MainFrame.cpp:1395 +msgid "Export toolpaths as OBJ" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1094 +msgid "Export &Config" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1094 +msgid "Export current configuration to file" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1097 +msgid "Export Config &Bundle" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1097 +msgid "Export all presets to file" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1100 +msgid "Export Config Bundle With Physical Printers" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1100 +msgid "Export all presets including physical printers to file" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1103 +msgid "&Export" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1105 +msgid "Ejec&t SD card / Flash drive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1105 +msgid "Eject SD card / Flash drive after the G-code was exported to it." +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1113 +msgid "Quick Slice" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1113 +msgid "Slice a file into a G-code" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1119 +msgid "Quick Slice and Save As" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1119 +msgid "Slice a file into a G-code, save as" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1125 +msgid "Repeat Last Quick Slice" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1125 +msgid "Repeat last quick slice" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1133 +msgid "(Re)Slice No&w" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1133 +msgid "Start new slicing process" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1137 +msgid "&Repair STL file" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1137 +msgid "Automatically repair an STL file" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1141 +msgid "&G-code preview" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1144 src/slic3r/GUI/MainFrame.cpp:1402 +msgid "&Quit" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1144 src/slic3r/GUI/MainFrame.cpp:1402 +#, possible-c-format +msgid "Quit %s" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1171 +msgid "&Select all" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1172 +msgid "Selects all objects" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1174 +msgid "D&eselect all" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1175 +msgid "Deselects all objects" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1178 +msgid "&Delete selected" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1179 +msgid "Deletes the current selection" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1181 +msgid "Delete &all" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1182 +msgid "Deletes all objects" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1186 +msgid "&Undo" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1189 +msgid "&Redo" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1194 +msgid "&Copy" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1195 +msgid "Copy selection to clipboard" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1197 +msgid "&Paste" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1198 +msgid "Paste clipboard" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1202 +msgid "Re&load from disk" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1203 +msgid "Reload the plater from disk" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1207 +msgid "Searc&h" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1208 +msgid "Find option" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1216 +msgid "&Plater Tab" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1216 +msgid "Show the plater" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1221 +msgid "P&rint Settings Tab" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1221 +msgid "Show the print settings" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1224 src/slic3r/GUI/MainFrame.cpp:1451 +msgid "&Filament Settings Tab" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1224 +msgid "Show the filament settings" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1228 +msgid "Print&er Settings Tab" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1228 +msgid "Show the printer settings" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1234 +msgid "3&D" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1234 +msgid "Show the 3D editing view" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1237 +msgid "Pre&view" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1237 +msgid "Show the 3D slices preview" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1258 +msgid "Print &Host Upload Queue" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1258 +msgid "Display the Print Host Upload Queue window" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1294 msgid "Show &labels" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:814 src/slic3r/GUI/MainFrame.cpp:822 +#: src/slic3r/GUI/MainFrame.cpp:1294 msgid "Show object/instance labels in 3D scene" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:817 -msgid "Show &slope" +#: src/slic3r/GUI/MainFrame.cpp:1297 +msgid "&Collapse sidebar" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:817 -msgid "Objects coloring using faces' slope" +#: src/slic3r/GUI/MainFrame.cpp:1297 src/slic3r/GUI/Plater.cpp:2144 +msgid "Collapse sidebar" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:820 -msgid "&Options" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:831 -msgid "Prusa 3D &Drivers" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:831 -msgid "Open the Prusa3D drivers download page in your browser" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:833 -msgid "Software &Releases" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:833 -msgid "Open the software releases page in your browser" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:839 -#, possible-c-format -msgid "%s &Website" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:840 -#, possible-c-format -msgid "Open the %s website in your browser" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:846 -msgid "System &Info" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:846 -msgid "Show system information" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:848 -msgid "Show &Configuration Folder" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:848 -msgid "Show user configuration folder (datadir)" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:850 -msgid "Report an I&ssue" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:850 -#, possible-c-format -msgid "Report an issue on %s" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:852 -#, possible-c-format -msgid "&About %s" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:852 -msgid "Show about dialog" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:855 -msgid "Show the list of the keyboard shortcuts" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:868 +#: src/slic3r/GUI/MainFrame.cpp:1347 src/slic3r/GUI/MainFrame.cpp:1357 +#: src/slic3r/GUI/MainFrame.cpp:1417 msgid "&File" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:869 +#: src/slic3r/GUI/MainFrame.cpp:1348 src/slic3r/GUI/MainFrame.cpp:1358 msgid "&Edit" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:870 +#: src/slic3r/GUI/MainFrame.cpp:1349 src/slic3r/GUI/MainFrame.cpp:1359 msgid "&Window" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:871 +#: src/slic3r/GUI/MainFrame.cpp:1350 src/slic3r/GUI/MainFrame.cpp:1360 +#: src/slic3r/GUI/MainFrame.cpp:1418 msgid "&View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:874 +#: src/slic3r/GUI/MainFrame.cpp:1353 src/slic3r/GUI/MainFrame.cpp:1363 +#: src/slic3r/GUI/MainFrame.cpp:1423 msgid "&Help" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:896 +#: src/slic3r/GUI/MainFrame.cpp:1391 +msgid "&Open G-code" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1391 +msgid "Open a G-code file" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1398 +msgid "Open &PrusaSlicer" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1448 msgid "E&xport" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:897 +#: src/slic3r/GUI/MainFrame.cpp:1449 msgid "S&end to print" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:899 +#: src/slic3r/GUI/MainFrame.cpp:1451 msgid "Mate&rial Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:920 +#: src/slic3r/GUI/MainFrame.cpp:1474 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:931 +#: src/slic3r/GUI/MainFrame.cpp:1485 msgid "No previously sliced file." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:937 +#: src/slic3r/GUI/MainFrame.cpp:1491 msgid "Previously sliced file (" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:937 +#: src/slic3r/GUI/MainFrame.cpp:1491 msgid ") not found." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:938 +#: src/slic3r/GUI/MainFrame.cpp:1492 msgid "File Not Found" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:973 +#: src/slic3r/GUI/MainFrame.cpp:1527 #, possible-c-format msgid "Save %s file as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:973 +#: src/slic3r/GUI/MainFrame.cpp:1527 msgid "SVG" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:973 +#: src/slic3r/GUI/MainFrame.cpp:1527 msgid "G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:985 +#: src/slic3r/GUI/MainFrame.cpp:1539 msgid "Save zip file as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:994 src/slic3r/GUI/Plater.cpp:3121 -#: src/slic3r/GUI/Plater.cpp:5122 src/slic3r/GUI/Tab.cpp:1289 -#: src/slic3r/GUI/Tab.cpp:3731 +#: src/slic3r/GUI/MainFrame.cpp:1548 src/slic3r/GUI/Plater.cpp:2921 +#: src/slic3r/GUI/Plater.cpp:5234 src/slic3r/GUI/Tab.cpp:1551 +#: src/slic3r/GUI/Tab.cpp:4081 msgid "Slicing" msgstr "" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:996 +#: src/slic3r/GUI/MainFrame.cpp:1550 #, possible-c-format msgid "Processing %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1019 +#: src/slic3r/GUI/MainFrame.cpp:1573 msgid " was successfully sliced." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1021 +#: src/slic3r/GUI/MainFrame.cpp:1575 msgid "Slicing Done!" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1036 +#: src/slic3r/GUI/MainFrame.cpp:1590 msgid "Select the STL file to repair:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1046 +#: src/slic3r/GUI/MainFrame.cpp:1600 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1058 +#: src/slic3r/GUI/MainFrame.cpp:1612 msgid "Your file was repaired." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1058 src/libslic3r/PrintConfig.cpp:3469 +#: src/slic3r/GUI/MainFrame.cpp:1612 src/libslic3r/PrintConfig.cpp:3646 msgid "Repair" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1072 +#: src/slic3r/GUI/MainFrame.cpp:1626 msgid "Save configuration as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1091 src/slic3r/GUI/MainFrame.cpp:1153 +#: src/slic3r/GUI/MainFrame.cpp:1645 src/slic3r/GUI/MainFrame.cpp:1707 msgid "Select configuration to load:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1127 +#: src/slic3r/GUI/MainFrame.cpp:1681 msgid "Save presets bundle as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1174 +#: src/slic3r/GUI/MainFrame.cpp:1728 #, possible-c-format msgid "%d presets successfully imported." msgstr "" @@ -3962,32 +4679,36 @@ msgstr "" msgid "3Dconnexion settings" msgstr "" -#: src/slic3r/GUI/Mouse3DController.cpp:278 +#: src/slic3r/GUI/Mouse3DController.cpp:274 msgid "Device:" msgstr "" -#: src/slic3r/GUI/Mouse3DController.cpp:285 +#: src/slic3r/GUI/Mouse3DController.cpp:279 msgid "Speed:" msgstr "" -#: src/slic3r/GUI/Mouse3DController.cpp:289 -#: src/slic3r/GUI/Mouse3DController.cpp:312 +#: src/slic3r/GUI/Mouse3DController.cpp:282 +#: src/slic3r/GUI/Mouse3DController.cpp:303 msgid "Translation" msgstr "" -#: src/slic3r/GUI/Mouse3DController.cpp:301 -#: src/slic3r/GUI/Mouse3DController.cpp:312 +#: src/slic3r/GUI/Mouse3DController.cpp:294 +#: src/slic3r/GUI/Mouse3DController.cpp:303 msgid "Zoom" msgstr "" -#: src/slic3r/GUI/Mouse3DController.cpp:308 +#: src/slic3r/GUI/Mouse3DController.cpp:300 msgid "Deadzone:" msgstr "" -#: src/slic3r/GUI/Mouse3DController.cpp:325 +#: src/slic3r/GUI/Mouse3DController.cpp:315 msgid "Options:" msgstr "" +#: src/slic3r/GUI/Mouse3DController.cpp:318 +msgid "Swap Y/Z axes" +msgstr "" + #: src/slic3r/GUI/MsgDialog.cpp:73 #, possible-c-format msgid "%s error" @@ -3998,6 +4719,60 @@ msgstr "" msgid "%s has encountered an error" msgstr "" +#: src/slic3r/GUI/NotificationManager.hpp:317 +msgid "Exporting finished." +msgstr "" + +#: src/slic3r/GUI/NotificationManager.hpp:317 +msgid "Eject drive." +msgstr "" + +#: src/slic3r/GUI/NotificationManager.hpp:318 +msgid "3D Mouse disconnected." +msgstr "" + +#: src/slic3r/GUI/NotificationManager.hpp:321 +msgid "Configuration update is available." +msgstr "" + +#: src/slic3r/GUI/NotificationManager.hpp:321 +msgid "See more." +msgstr "" + +#: src/slic3r/GUI/NotificationManager.hpp:322 +msgid "New version is available." +msgstr "" + +#: src/slic3r/GUI/NotificationManager.hpp:322 +msgid "See Releases page." +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:305 +#: src/slic3r/GUI/NotificationManager.cpp:315 +msgid "More" +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:631 +#: src/slic3r/GUI/NotificationManager.cpp:748 +msgid "Export G-Code." +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:667 +#: src/slic3r/GUI/NotificationManager.cpp:683 +#: src/slic3r/GUI/NotificationManager.cpp:694 +msgid "ERROR:" +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:672 +#: src/slic3r/GUI/NotificationManager.cpp:687 +#: src/slic3r/GUI/NotificationManager.cpp:702 +msgid "WARNING:" +msgstr "" + +#: src/slic3r/GUI/NotificationManager.cpp:751 +msgid "Slicing finished." +msgstr "" + #: src/slic3r/GUI/ObjectDataViewModel.cpp:58 msgid "Instances" msgstr "" @@ -4008,8 +4783,8 @@ msgstr "" msgid "Instance %d" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 src/slic3r/GUI/Tab.cpp:3585 -#: src/slic3r/GUI/Tab.cpp:3667 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 src/slic3r/GUI/Tab.cpp:3928 +#: src/slic3r/GUI/Tab.cpp:4010 msgid "Layers" msgstr "" @@ -4017,649 +4792,769 @@ msgstr "" msgid "Range" msgstr "" -#: src/slic3r/GUI/OptionsGroup.cpp:274 +#: src/slic3r/GUI/OpenGLManager.cpp:259 +#, possible-c-format +msgid "" +"PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n" +"while OpenGL version %s, render %s, vendor %s was detected." +msgstr "" + +#: src/slic3r/GUI/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 "" + +#: src/slic3r/GUI/OpenGLManager.cpp:267 +msgid "Unsupported OpenGL version" +msgstr "" + +#: src/slic3r/GUI/OpenGLManager.cpp:275 +#, possible-c-format +msgid "" +"Unable to load the following shaders:\n" +"%s" +msgstr "" + +#: src/slic3r/GUI/OpenGLManager.cpp:276 +msgid "Error loading shaders" +msgstr "" + +#: src/slic3r/GUI/OptionsGroup.cpp:293 msgctxt "Layers" msgid "Top" msgstr "" -#: src/slic3r/GUI/OptionsGroup.cpp:274 +#: src/slic3r/GUI/OptionsGroup.cpp:293 msgctxt "Layers" msgid "Bottom" msgstr "" -#: src/slic3r/GUI/Plater.cpp:163 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:55 +msgid "Delete this preset from this printer device" +msgstr "" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:85 +msgid "This printer will be shown in the presets list as" +msgstr "" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:159 +msgid "Physical Printer" +msgstr "" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:165 +msgid "Type here the name of your printer device" +msgstr "" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:176 +msgid "Descriptive name for the printer device" +msgstr "" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:180 +msgid "Add preset for this printer device" +msgstr "" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:209 src/slic3r/GUI/Tab.cpp:2024 +msgid "Print Host upload" +msgstr "" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:284 +msgid "Test" +msgstr "" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:289 +msgid "Could not get a valid Printer Host reference" +msgstr "" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:295 +msgid "Success!" +msgstr "" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:319 +msgid "" +"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" +"signed certificate." +msgstr "" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:329 +msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" +msgstr "" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:330 +msgid "Open CA certificate file" +msgstr "" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:358 +#: src/libslic3r/PrintConfig.cpp:113 +msgid "HTTPS CA File" +msgstr "" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:359 +#, possible-c-format +msgid "" +"On this system, %s uses HTTPS certificates from the system Certificate Store " +"or Keychain." +msgstr "" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:360 +msgid "" +"To use a custom CA file, please import your CA file into Certificate Store / " +"Keychain." +msgstr "" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:464 +msgid "The supplied name is empty. It can't be saved." +msgstr "" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:468 +msgid "You should to change a name of your printer device. It can't be saved." +msgstr "" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:476 +msgid "Printer with name \"%1%\" already exists." +msgstr "" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:477 +msgid "Replace?" +msgstr "" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:500 +msgid "" +"Next printer preset(s) is(are) duplicated:%1%Should I add it(they) just once " +"for the printer \"%2%\" and close the Editing Dialog?" +msgstr "" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:546 +msgid "It's not possible to delete last related preset for the printer." +msgstr "" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:547 +msgid "Infornation" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:167 msgid "Volume" msgstr "" -#: src/slic3r/GUI/Plater.cpp:164 +#: src/slic3r/GUI/Plater.cpp:168 msgid "Facets" msgstr "" -#: src/slic3r/GUI/Plater.cpp:165 +#: src/slic3r/GUI/Plater.cpp:169 msgid "Materials" msgstr "" -#: src/slic3r/GUI/Plater.cpp:168 +#: src/slic3r/GUI/Plater.cpp:172 msgid "Manifold" msgstr "" -#: src/slic3r/GUI/Plater.cpp:218 +#: src/slic3r/GUI/Plater.cpp:222 msgid "Sliced Info" msgstr "" -#: src/slic3r/GUI/Plater.cpp:237 src/slic3r/GUI/Plater.cpp:1236 +#: src/slic3r/GUI/Plater.cpp:241 src/slic3r/GUI/Plater.cpp:1141 msgid "Used Filament (m)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:238 +#: src/slic3r/GUI/Plater.cpp:242 src/slic3r/GUI/Plater.cpp:1153 msgid "Used Filament (mm³)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:239 +#: src/slic3r/GUI/Plater.cpp:243 msgid "Used Filament (g)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:240 +#: src/slic3r/GUI/Plater.cpp:244 msgid "Used Material (unit)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:241 +#: src/slic3r/GUI/Plater.cpp:245 msgid "Cost (money)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:242 src/slic3r/GUI/Plater.cpp:1223 -#: src/slic3r/GUI/Plater.cpp:1265 -msgid "Estimated printing time" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:243 +#: src/slic3r/GUI/Plater.cpp:247 msgid "Number of tool changes" msgstr "" -#: src/slic3r/GUI/Plater.cpp:350 -msgid "Click to edit preset" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:505 +#: src/slic3r/GUI/Plater.cpp:364 msgid "Select what kind of support do you need" msgstr "" -#: src/slic3r/GUI/Plater.cpp:507 src/libslic3r/PrintConfig.cpp:1908 -#: src/libslic3r/PrintConfig.cpp:2691 +#: src/slic3r/GUI/Plater.cpp:366 src/libslic3r/PrintConfig.cpp:2043 +#: src/libslic3r/PrintConfig.cpp:2838 msgid "Support on build plate only" msgstr "" -#: src/slic3r/GUI/Plater.cpp:508 src/slic3r/GUI/Plater.cpp:631 +#: src/slic3r/GUI/Plater.cpp:367 src/slic3r/GUI/Plater.cpp:490 msgid "For support enforcers only" msgstr "" -#: src/slic3r/GUI/Plater.cpp:509 +#: src/slic3r/GUI/Plater.cpp:368 msgid "Everywhere" msgstr "" -#: src/slic3r/GUI/Plater.cpp:541 src/slic3r/GUI/Tab.cpp:1185 +#: src/slic3r/GUI/Plater.cpp:400 src/slic3r/GUI/Tab.cpp:1446 msgid "Brim" msgstr "" -#: src/slic3r/GUI/Plater.cpp:543 +#: src/slic3r/GUI/Plater.cpp:402 msgid "" "This flag enables the brim that will be printed around each object on the " "first layer." msgstr "" -#: src/slic3r/GUI/Plater.cpp:551 +#: src/slic3r/GUI/Plater.cpp:410 msgid "Purging volumes" msgstr "" -#: src/slic3r/GUI/Plater.cpp:645 +#: src/slic3r/GUI/Plater.cpp:504 msgid "Select what kind of pad do you need" msgstr "" -#: src/slic3r/GUI/Plater.cpp:647 +#: src/slic3r/GUI/Plater.cpp:506 msgid "Below object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:648 +#: src/slic3r/GUI/Plater.cpp:507 msgid "Around object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:822 +#: src/slic3r/GUI/Plater.cpp:690 msgid "Print settings" msgstr "" -#: src/slic3r/GUI/Plater.cpp:823 src/slic3r/GUI/Tab.cpp:1491 -#: src/slic3r/GUI/Tab.cpp:1492 +#: src/slic3r/GUI/Plater.cpp:691 src/slic3r/GUI/Tab.cpp:1770 +#: src/slic3r/GUI/Tab.cpp:1771 msgid "Filament" msgstr "" -#: src/slic3r/GUI/Plater.cpp:824 +#: src/slic3r/GUI/Plater.cpp:692 msgid "SLA print settings" msgstr "" -#: src/slic3r/GUI/Plater.cpp:825 src/slic3r/GUI/Preset.cpp:1566 +#: src/slic3r/GUI/Plater.cpp:693 src/libslic3r/Preset.cpp:1303 msgid "SLA material" msgstr "" -#: src/slic3r/GUI/Plater.cpp:826 +#: src/slic3r/GUI/Plater.cpp:694 msgid "Printer" msgstr "" -#: src/slic3r/GUI/Plater.cpp:885 src/slic3r/GUI/Plater.cpp:5532 +#: src/slic3r/GUI/Plater.cpp:753 src/slic3r/GUI/Plater.cpp:5707 msgid "Send to printer" msgstr "" -#: src/slic3r/GUI/Plater.cpp:886 +#: src/slic3r/GUI/Plater.cpp:754 msgid "Remove device" msgstr "" -#: src/slic3r/GUI/Plater.cpp:899 src/slic3r/GUI/Plater.cpp:3121 -#: src/slic3r/GUI/Plater.cpp:5125 +#: src/slic3r/GUI/Plater.cpp:767 src/slic3r/GUI/Plater.cpp:2921 +#: src/slic3r/GUI/Plater.cpp:5237 msgid "Slice now" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1049 +#: src/slic3r/GUI/Plater.cpp:916 msgid "Hold Shift to Slice & Export G-code" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1159 +#: src/slic3r/GUI/Plater.cpp:1061 #, possible-c-format msgid "%d (%d shells)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1164 +#: src/slic3r/GUI/Plater.cpp:1066 #, possible-c-format msgid "Auto-repaired (%d errors)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1167 +#: src/slic3r/GUI/Plater.cpp:1069 #, 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:1177 +#: src/slic3r/GUI/Plater.cpp:1079 msgid "Yes" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1198 +#: src/slic3r/GUI/Plater.cpp:1100 msgid "Used Material (ml)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1201 +#: src/slic3r/GUI/Plater.cpp:1103 msgid "object(s)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1201 +#: src/slic3r/GUI/Plater.cpp:1103 msgid "supports and pad" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1238 src/slic3r/GUI/Plater.cpp:1252 +#: src/slic3r/GUI/Plater.cpp:1141 +msgid "Used Filament (in)" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:1143 src/slic3r/GUI/Plater.cpp:1160 msgid "objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1238 src/slic3r/GUI/Plater.cpp:1252 +#: src/slic3r/GUI/Plater.cpp:1143 src/slic3r/GUI/Plater.cpp:1160 msgid "wipe tower" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1250 src/libslic3r/PrintConfig.cpp:760 -#: src/libslic3r/PrintConfig.cpp:2517 src/libslic3r/PrintConfig.cpp:2518 +#: src/slic3r/GUI/Plater.cpp:1153 +msgid "Used Filament (in³)" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:1158 src/libslic3r/PrintConfig.cpp:796 +#: src/libslic3r/PrintConfig.cpp:2653 src/libslic3r/PrintConfig.cpp:2654 msgid "Cost" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1267 src/libslic3r/PrintConfig.cpp:582 -msgid "Color" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:1268 -msgid "Pause" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:1293 +#: src/slic3r/GUI/Plater.cpp:1177 src/slic3r/GUI/Plater.cpp:1224 msgid "normal mode" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1298 +#: src/slic3r/GUI/Plater.cpp:1187 src/slic3r/GUI/Plater.cpp:1235 msgid "stealth mode" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1402 -msgid "Load File" +#: src/slic3r/GUI/Plater.cpp:1198 src/libslic3r/PrintConfig.cpp:618 +msgid "Color" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:1405 +msgid "You can open only one .gcode file at a time." msgstr "" #: src/slic3r/GUI/Plater.cpp:1406 +msgid "Drag and drop G-code file" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:1436 +msgid "Load File" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:1440 msgid "Load Files" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2207 +#: src/slic3r/GUI/Plater.cpp:1555 +msgid "Optimize Rotation" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:1561 +msgid "Import SLA archive" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:2031 #, possible-c-format msgid "" "Unmounting successful. The device %s(%s) can now be safely removed from the " "computer." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2210 +#: src/slic3r/GUI/Plater.cpp:2034 #, possible-c-format msgid "Ejecting of device %s(%s) has failed." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2223 +#: src/slic3r/GUI/Plater.cpp:2056 msgid "New Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2337 +#: src/slic3r/GUI/Plater.cpp:2143 +msgid "Expand sidebar" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:2216 msgid "Loading" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2347 +#: src/slic3r/GUI/Plater.cpp:2226 +msgid "Loading file" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:2309 #, possible-c-format -msgid "Processing input file %s" +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 "" -#: src/slic3r/GUI/Plater.cpp:2375 -msgid "You cannot load SLA project with a multi-part object on the bed" +#: src/slic3r/GUI/Plater.cpp:2311 +msgid "Saved in inches object detected" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2376 src/slic3r/GUI/Tab.cpp:2958 -msgid "Please check your object list before preset changing." -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2421 +#: src/slic3r/GUI/Plater.cpp:2319 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:2424 src/slic3r/GUI/Plater.cpp:2477 +#: src/slic3r/GUI/Plater.cpp:2322 src/slic3r/GUI/Plater.cpp:2375 msgid "Multi-part object detected" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2431 +#: src/slic3r/GUI/Plater.cpp:2329 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:2432 +#: src/slic3r/GUI/Plater.cpp:2330 msgid "Detected advanced data" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2454 +#: src/slic3r/GUI/Plater.cpp:2352 #, 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:2474 +#: src/slic3r/GUI/Plater.cpp:2372 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:2490 +#: src/slic3r/GUI/Plater.cpp:2388 msgid "Loaded" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2592 +#: src/slic3r/GUI/Plater.cpp:2490 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:2593 +#: src/slic3r/GUI/Plater.cpp:2491 msgid "Object too large?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2655 +#: src/slic3r/GUI/Plater.cpp:2553 msgid "Export STL file:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2662 +#: src/slic3r/GUI/Plater.cpp:2560 msgid "Export AMF file:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2668 +#: src/slic3r/GUI/Plater.cpp:2566 msgid "Save file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2674 +#: src/slic3r/GUI/Plater.cpp:2572 msgid "Export OBJ file:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2773 +#: src/slic3r/GUI/Plater.cpp:2673 msgid "Delete Object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2784 +#: src/slic3r/GUI/Plater.cpp:2684 msgid "Reset Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2823 -msgid "Optimize Rotation" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2869 -msgid "Arranging" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2896 -msgid "Could not arrange model objects! Some geometries may be invalid." -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2902 -msgid "Arranging canceled." -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2903 -msgid "Arranging done." -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2919 -msgid "Searching for optimal orientation" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2952 -msgid "Orientation search canceled." -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2953 -msgid "Orientation found." -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2970 +#: src/slic3r/GUI/Plater.cpp:2763 msgid "" "The selected object can't be split because it contains more than one volume/" "material." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2981 +#: src/slic3r/GUI/Plater.cpp:2774 msgid "Split to Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3106 +#: src/slic3r/GUI/Plater.cpp:2906 src/slic3r/GUI/Plater.cpp:3583 msgid "Invalid data" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3115 +#: src/slic3r/GUI/Plater.cpp:2915 msgid "Ready to slice" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3153 src/slic3r/GUI/PrintHostDialogs.cpp:232 +#: src/slic3r/GUI/Plater.cpp:2953 src/slic3r/GUI/PrintHostDialogs.cpp:232 msgid "Cancelling" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3170 +#: src/slic3r/GUI/Plater.cpp:2972 msgid "Another export job is currently running." msgstr "" -#: src/slic3r/GUI/Plater.cpp:3286 +#: src/slic3r/GUI/Plater.cpp:3089 msgid "Please select the file to reload" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3321 +#: src/slic3r/GUI/Plater.cpp:3124 msgid "It is not allowed to change the file to reload" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3321 +#: src/slic3r/GUI/Plater.cpp:3124 msgid "Do you want to retry" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3339 +#: src/slic3r/GUI/Plater.cpp:3142 msgid "Reload from:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3428 +#: src/slic3r/GUI/Plater.cpp:3233 msgid "Unable to reload:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3433 +#: src/slic3r/GUI/Plater.cpp:3238 msgid "Error during reload" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3452 +#: src/slic3r/GUI/Plater.cpp:3257 msgid "Reload all from disk" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3473 +#: src/slic3r/GUI/Plater.cpp:3278 msgid "Fix Throught NetFabb" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3672 -msgid "Export failed" +#: src/slic3r/GUI/Plater.cpp:3543 +msgid "There are active warnings concerning sliced models:\n" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3682 src/slic3r/GUI/PrintHostDialogs.cpp:233 +#: src/slic3r/GUI/Plater.cpp:3554 +msgid "generated warnings" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3589 src/slic3r/GUI/PrintHostDialogs.cpp:233 msgid "Cancelled" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3935 src/slic3r/GUI/Plater.cpp:3957 +#: src/slic3r/GUI/Plater.cpp:3849 src/slic3r/GUI/Plater.cpp:3871 msgid "Remove the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3944 +#: src/slic3r/GUI/Plater.cpp:3858 msgid "Add one more instance of the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3946 +#: src/slic3r/GUI/Plater.cpp:3860 msgid "Remove one instance of the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3948 +#: src/slic3r/GUI/Plater.cpp:3862 msgid "Set number of instances" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3948 +#: src/slic3r/GUI/Plater.cpp:3862 msgid "Change the number of instances of the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3967 +#: src/slic3r/GUI/Plater.cpp:3881 msgid "Reload the selected object from disk" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3970 +#: src/slic3r/GUI/Plater.cpp:3884 msgid "Export the selected object as STL file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3999 +#: src/slic3r/GUI/Plater.cpp:3915 msgid "Along X axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3999 +#: src/slic3r/GUI/Plater.cpp:3915 msgid "Mirror the selected object along the X axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4001 +#: src/slic3r/GUI/Plater.cpp:3917 msgid "Along Y axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4001 +#: src/slic3r/GUI/Plater.cpp:3917 msgid "Mirror the selected object along the Y axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4003 +#: src/slic3r/GUI/Plater.cpp:3919 msgid "Along Z axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4003 +#: src/slic3r/GUI/Plater.cpp:3919 msgid "Mirror the selected object along the Z axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4006 +#: src/slic3r/GUI/Plater.cpp:3922 msgid "Mirror" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4006 +#: src/slic3r/GUI/Plater.cpp:3922 msgid "Mirror the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4018 +#: src/slic3r/GUI/Plater.cpp:3934 msgid "To objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4018 src/slic3r/GUI/Plater.cpp:4038 +#: src/slic3r/GUI/Plater.cpp:3934 src/slic3r/GUI/Plater.cpp:3954 msgid "Split the selected object into individual objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4020 +#: src/slic3r/GUI/Plater.cpp:3936 msgid "To parts" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4020 src/slic3r/GUI/Plater.cpp:4052 +#: src/slic3r/GUI/Plater.cpp:3936 src/slic3r/GUI/Plater.cpp:3972 msgid "Split the selected object into individual sub-parts" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4023 src/slic3r/GUI/Plater.cpp:4038 -#: src/slic3r/GUI/Plater.cpp:4052 src/libslic3r/PrintConfig.cpp:3493 +#: src/slic3r/GUI/Plater.cpp:3939 src/slic3r/GUI/Plater.cpp:3954 +#: src/slic3r/GUI/Plater.cpp:3972 src/libslic3r/PrintConfig.cpp:3670 msgid "Split" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4023 +#: src/slic3r/GUI/Plater.cpp:3939 msgid "Split the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4044 -msgid "Optimize orientation" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:4044 +#: src/slic3r/GUI/Plater.cpp:3962 msgid "Optimize the rotation of the object for better print results." msgstr "" -#: src/slic3r/GUI/Plater.cpp:4121 +#: src/slic3r/GUI/Plater.cpp:4044 msgid "3D editor view" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4428 +#: src/slic3r/GUI/Plater.cpp:4423 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:4604 +#: src/slic3r/GUI/Plater.cpp:4627 msgid "Load Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4632 +#: src/slic3r/GUI/Plater.cpp:4655 msgid "Import Object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4636 +#: src/slic3r/GUI/Plater.cpp:4659 msgid "Import Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4705 +#: src/slic3r/GUI/Plater.cpp:4774 msgid "All objects will be removed, continue?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4713 +#: src/slic3r/GUI/Plater.cpp:4782 msgid "Delete Selected Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4721 +#: src/slic3r/GUI/Plater.cpp:4790 msgid "Increase Instances" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4756 +#: src/slic3r/GUI/Plater.cpp:4824 msgid "Decrease Instances" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4787 +#: src/slic3r/GUI/Plater.cpp:4855 msgid "Enter the number of copies:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4788 +#: src/slic3r/GUI/Plater.cpp:4856 msgid "Copies of the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4792 +#: src/slic3r/GUI/Plater.cpp:4860 #, possible-c-format msgid "Set numbers of copies to %d" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4822 +#: src/slic3r/GUI/Plater.cpp:4921 msgid "Cut by Plane" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4873 +#: src/slic3r/GUI/Plater.cpp:4975 msgid "Save G-code file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4873 +#: src/slic3r/GUI/Plater.cpp:4975 msgid "Save SL1 file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5008 +#: src/slic3r/GUI/Plater.cpp:5118 #, possible-c-format msgid "STL file exported to %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5025 +#: src/slic3r/GUI/Plater.cpp:5135 #, possible-c-format msgid "AMF file exported to %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5028 +#: src/slic3r/GUI/Plater.cpp:5138 #, possible-c-format msgid "Error exporting AMF file %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5057 +#: src/slic3r/GUI/Plater.cpp:5167 #, possible-c-format msgid "3MF file exported to %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5062 +#: src/slic3r/GUI/Plater.cpp:5172 #, possible-c-format msgid "Error exporting 3MF file %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5531 +#: src/slic3r/GUI/Plater.cpp:5706 msgid "Export" msgstr "" -#: src/slic3r/GUI/Plater.cpp:5617 +#: src/slic3r/GUI/Plater.cpp:5803 msgid "Paste From Clipboard" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:22 src/slic3r/GUI/Tab.cpp:1857 -#: src/slic3r/GUI/Tab.cpp:2069 +#: src/slic3r/GUI/Preferences.cpp:24 src/slic3r/GUI/Tab.cpp:2058 +#: src/slic3r/GUI/Tab.cpp:2240 src/slic3r/GUI/Tab.cpp:2348 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1066 msgid "General" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:39 +#: src/slic3r/GUI/Preferences.cpp:52 msgid "Remember output directory" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:41 +#: src/slic3r/GUI/Preferences.cpp:54 msgid "" "If this is enabled, Slic3r will prompt the last output directory instead of " "the one containing the input files." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:47 +#: src/slic3r/GUI/Preferences.cpp:64 msgid "Auto-center parts" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:49 +#: src/slic3r/GUI/Preferences.cpp:66 msgid "" "If this is enabled, Slic3r will auto-center objects around the print bed " "center." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:55 +#: src/slic3r/GUI/Preferences.cpp:72 msgid "Background processing" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:57 +#: src/slic3r/GUI/Preferences.cpp:74 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." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:66 +#: src/slic3r/GUI/Preferences.cpp:83 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 " @@ -4667,17 +5562,17 @@ msgid "" "notification mechanisms, no automatic installation is done." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:72 +#: src/slic3r/GUI/Preferences.cpp:89 msgid "Export sources full pathnames to 3mf and amf" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:74 +#: src/slic3r/GUI/Preferences.cpp:91 msgid "" "If enabled, allows the Reload from disk command to automatically find and " "load the files when invoked." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:82 +#: src/slic3r/GUI/Preferences.cpp:99 msgid "" "If enabled, Slic3r downloads updates of built-in system presets in the " "background. These updates are downloaded into a separate temporary location. " @@ -4685,263 +5580,383 @@ msgid "" "startup." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:87 +#: src/slic3r/GUI/Preferences.cpp:104 msgid "Suppress \" - default - \" presets" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:89 +#: src/slic3r/GUI/Preferences.cpp:106 msgid "" "Suppress \" - default - \" presets in the Print / Filament / Printer " "selections once there are any other valid presets available." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:95 +#: src/slic3r/GUI/Preferences.cpp:112 msgid "Show incompatible print and filament presets" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:97 +#: src/slic3r/GUI/Preferences.cpp:114 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:104 +#: src/slic3r/GUI/Preferences.cpp:120 src/libslic3r/PrintConfig.cpp:3697 +msgid "Single Instance" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:123 +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 "" + +#: src/slic3r/GUI/Preferences.cpp:125 +msgid "" +"If this is enabled, when staring PrusaSlicer and another instance of same " +"PrusaSlicer is running, that instance will be reactivated instead." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:135 msgid "Use Retina resolution for the 3D scene" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:106 +#: src/slic3r/GUI/Preferences.cpp:137 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 "" -#: src/slic3r/GUI/Preferences.cpp:113 +#: src/slic3r/GUI/Preferences.cpp:154 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:659 +msgid "Ask for unsaved changes when closing application" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:156 +msgid "Always ask for unsaved changes when closing application" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:161 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:660 +msgid "Ask for unsaved changes when selecting new preset" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:163 +msgid "Always ask for unsaved changes when selecting new preset" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:169 src/slic3r/GUI/Preferences.cpp:171 +msgid "Show splash screen" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:178 msgid "Camera" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:119 +#: src/slic3r/GUI/Preferences.cpp:184 msgid "Use perspective camera" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:121 +#: src/slic3r/GUI/Preferences.cpp:186 msgid "" "If enabled, use perspective camera. If not enabled, use orthographic camera." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:126 +#: src/slic3r/GUI/Preferences.cpp:191 msgid "Use free camera" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:128 +#: src/slic3r/GUI/Preferences.cpp:193 msgid "If enabled, use free camera. If not enabled, use constrained camera." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:133 +#: src/slic3r/GUI/Preferences.cpp:200 msgid "GUI" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:143 +#: src/slic3r/GUI/Preferences.cpp:213 +msgid "Show sidebar collapse/expand button" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:215 +msgid "" +"If enabled, the button for the collapse sidebar will be appeared in top " +"right corner of the 3D Scene" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:220 msgid "Use custom size for toolbar icons" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:145 +#: src/slic3r/GUI/Preferences.cpp:222 msgid "If enabled, you can change size of toolbar icons manually." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:172 +#: src/slic3r/GUI/Preferences.cpp:230 +msgid "Sequential slider applied only to top layer" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:232 +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:255 +msgid "Render" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:261 +msgid "Use environment map" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:263 +msgid "If enabled, renders object using the environment map." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:299 #, possible-c-format msgid "You need to restart %s to make the changes effective." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:222 +#: src/slic3r/GUI/Preferences.cpp:376 msgid "Icon size in a respect to the default size" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:237 +#: src/slic3r/GUI/Preferences.cpp:391 msgid "Select toolbar icon size in respect to the default one." msgstr "" -#: src/slic3r/GUI/Preset.cpp:250 -msgid "modified" +#: src/slic3r/GUI/Preferences.cpp:422 +msgid "Old regular layout with the tab bar" msgstr "" -#: src/slic3r/GUI/Preset.cpp:1151 src/slic3r/GUI/Preset.cpp:1206 -#: src/slic3r/GUI/Preset.cpp:1284 src/slic3r/GUI/Preset.cpp:1326 -#: src/slic3r/GUI/PresetBundle.cpp:1599 src/slic3r/GUI/PresetBundle.cpp:1697 +#: src/slic3r/GUI/Preferences.cpp:423 +msgid "New layout without the tab bar on the plater" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:424 +msgid "Settings will be shown in the non-modal dialog" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:433 +msgid "Settings layout mode" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:188 +#: src/slic3r/GUI/PresetComboBoxes.cpp:226 +#: src/slic3r/GUI/PresetComboBoxes.cpp:724 +#: src/slic3r/GUI/PresetComboBoxes.cpp:774 +#: src/slic3r/GUI/PresetComboBoxes.cpp:886 +#: src/slic3r/GUI/PresetComboBoxes.cpp:930 msgid "System presets" msgstr "" -#: src/slic3r/GUI/Preset.cpp:1210 src/slic3r/GUI/Preset.cpp:1330 -#: src/slic3r/GUI/PresetBundle.cpp:1702 +#: src/slic3r/GUI/PresetComboBoxes.cpp:230 +#: src/slic3r/GUI/PresetComboBoxes.cpp:778 +#: src/slic3r/GUI/PresetComboBoxes.cpp:934 msgid "User presets" msgstr "" -#: src/slic3r/GUI/Preset.cpp:1243 +#: src/slic3r/GUI/PresetComboBoxes.cpp:241 +msgid "Incompatible presets" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:566 +msgid "Click to edit preset" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:622 +#: src/slic3r/GUI/PresetComboBoxes.cpp:669 +msgid "Add/Remove presets" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:627 +#: src/slic3r/GUI/PresetComboBoxes.cpp:674 +msgid "Add physical printer" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:641 +msgid "Edit preset" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:645 +msgid "Edit physical printer" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:652 +msgid "Delete physical printer" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:658 +msgid "Are you sure you want to delete \"%1%\" printer?" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:659 +msgid "Delete Physical Printer" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:789 +#: src/slic3r/GUI/PresetComboBoxes.cpp:948 +msgid "Physical printers" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:813 msgid "Add/Remove materials" msgstr "" -#: src/slic3r/GUI/Preset.cpp:1245 +#: src/slic3r/GUI/PresetComboBoxes.cpp:815 +#: src/slic3r/GUI/PresetComboBoxes.cpp:972 msgid "Add/Remove printers" msgstr "" -#: src/slic3r/GUI/Preset.cpp:1564 -msgid "filament" -msgstr "" - -#: src/slic3r/GUI/Preset.cpp:1565 -msgid "SLA print" -msgstr "" - -#: src/slic3r/GUI/PresetBundle.cpp:1729 -msgid "Add/Remove filaments" -msgstr "" - -#: src/slic3r/GUI/PresetHints.cpp:29 +#: src/slic3r/GUI/PresetHints.cpp:28 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 "" -#: src/slic3r/GUI/PresetHints.cpp:36 +#: src/slic3r/GUI/PresetHints.cpp:35 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 "" -#: src/slic3r/GUI/PresetHints.cpp:40 +#: src/slic3r/GUI/PresetHints.cpp:39 msgid "During the other layers, fan" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:42 +#: src/slic3r/GUI/PresetHints.cpp:41 msgid "Fan" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:48 +#: src/slic3r/GUI/PresetHints.cpp:47 msgid "will always run at %1%%%" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:51 +#: src/slic3r/GUI/PresetHints.cpp:50 msgid "except for the first %1% layers." msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:53 +#: src/slic3r/GUI/PresetHints.cpp:52 msgid "except for the first layer." msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:55 +#: src/slic3r/GUI/PresetHints.cpp:54 msgid "will be turned off." msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:156 +#: src/slic3r/GUI/PresetHints.cpp:155 msgid "external perimeters" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:165 +#: src/slic3r/GUI/PresetHints.cpp:164 msgid "perimeters" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:174 +#: src/slic3r/GUI/PresetHints.cpp:173 msgid "infill" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:184 +#: src/slic3r/GUI/PresetHints.cpp:183 msgid "solid infill" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:192 +#: src/slic3r/GUI/PresetHints.cpp:191 msgid "top solid infill" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:203 +#: src/slic3r/GUI/PresetHints.cpp:202 msgid "support" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:213 +#: src/slic3r/GUI/PresetHints.cpp:212 msgid "support interface" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:219 +#: src/slic3r/GUI/PresetHints.cpp:218 msgid "First layer volumetric" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:219 +#: src/slic3r/GUI/PresetHints.cpp:218 msgid "Bridging volumetric" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:219 +#: src/slic3r/GUI/PresetHints.cpp:218 msgid "Volumetric" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:220 +#: src/slic3r/GUI/PresetHints.cpp:219 msgid "flow rate is maximized" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:223 +#: src/slic3r/GUI/PresetHints.cpp:222 msgid "by the print profile maximum" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:224 +#: src/slic3r/GUI/PresetHints.cpp:223 msgid "when printing" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:225 +#: src/slic3r/GUI/PresetHints.cpp:224 msgid "with a volumetric rate" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:229 +#: src/slic3r/GUI/PresetHints.cpp:228 #, possible-c-format msgid "%3.2f mm³/s at filament speed %3.2f mm/s." msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:247 +#: src/slic3r/GUI/PresetHints.cpp:246 msgid "" "Recommended object thin wall thickness: Not available due to invalid layer " "height." msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:263 +#: src/slic3r/GUI/PresetHints.cpp:262 #, possible-c-format msgid "Recommended object thin wall thickness for layer height %.2f and" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:270 +#: src/slic3r/GUI/PresetHints.cpp:269 #, possible-c-format msgid "%d lines: %.2f mm" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:274 +#: src/slic3r/GUI/PresetHints.cpp:273 msgid "" "Recommended object thin wall thickness: Not available due to excessively " "small extrusion width." msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:304 +#: src/slic3r/GUI/PresetHints.cpp:302 msgid "" "Top / bottom shell thickness hint: Not available due to invalid layer height." msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:317 +#: src/slic3r/GUI/PresetHints.cpp:315 msgid "Top shell is %1% mm thick for layer height %2% mm." msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:320 +#: src/slic3r/GUI/PresetHints.cpp:318 msgid "Minimum top shell thickness is %1% mm." msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:323 +#: src/slic3r/GUI/PresetHints.cpp:321 msgid "Top is open." msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:336 +#: src/slic3r/GUI/PresetHints.cpp:334 msgid "Bottom shell is %1% mm thick for layer height %2% mm." msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:339 +#: src/slic3r/GUI/PresetHints.cpp:337 msgid "Minimum bottom shell thickness is %1% mm." msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:342 +#: src/slic3r/GUI/PresetHints.cpp:340 msgid "Bottom is open." msgstr "" @@ -4961,35 +5976,35 @@ msgstr "" msgid "Use forward slashes ( / ) as a directory separator if needed." msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:149 +#: src/slic3r/GUI/PrintHostDialogs.cpp:147 msgid "ID" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:150 +#: src/slic3r/GUI/PrintHostDialogs.cpp:148 msgid "Progress" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:151 +#: src/slic3r/GUI/PrintHostDialogs.cpp:149 msgid "Status" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:152 +#: src/slic3r/GUI/PrintHostDialogs.cpp:150 msgid "Host" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:153 +#: src/slic3r/GUI/PrintHostDialogs.cpp:151 msgid "Filename" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:154 +#: src/slic3r/GUI/PrintHostDialogs.cpp:152 msgid "Error Message" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:157 +#: src/slic3r/GUI/PrintHostDialogs.cpp:155 msgid "Cancel selected" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:159 +#: src/slic3r/GUI/PrintHostDialogs.cpp:157 msgid "Show error message" msgstr "" @@ -5014,17 +6029,13 @@ msgstr "" msgid "NO RAMMING AT ALL" msgstr "" -#: src/slic3r/GUI/RammingChart.cpp:76 -msgid "Time" -msgstr "" - #: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/WipeTowerDialog.cpp:83 -#: src/libslic3r/PrintConfig.cpp:644 src/libslic3r/PrintConfig.cpp:688 -#: src/libslic3r/PrintConfig.cpp:703 src/libslic3r/PrintConfig.cpp:2415 -#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2534 -#: src/libslic3r/PrintConfig.cpp:2542 src/libslic3r/PrintConfig.cpp:2550 -#: src/libslic3r/PrintConfig.cpp:2557 src/libslic3r/PrintConfig.cpp:2565 -#: src/libslic3r/PrintConfig.cpp:2573 +#: src/libslic3r/PrintConfig.cpp:680 src/libslic3r/PrintConfig.cpp:724 +#: src/libslic3r/PrintConfig.cpp:739 src/libslic3r/PrintConfig.cpp:2551 +#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:2670 +#: src/libslic3r/PrintConfig.cpp:2678 src/libslic3r/PrintConfig.cpp:2686 +#: src/libslic3r/PrintConfig.cpp:2693 src/libslic3r/PrintConfig.cpp:2701 +#: src/libslic3r/PrintConfig.cpp:2709 msgid "s" msgstr "" @@ -5032,441 +6043,484 @@ msgstr "" msgid "Volumetric speed" msgstr "" -#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:601 -#: src/libslic3r/PrintConfig.cpp:1250 +#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:637 +#: src/libslic3r/PrintConfig.cpp:1358 msgid "mm³/s" msgstr "" -#: src/slic3r/GUI/Selection.cpp:147 +#: src/slic3r/GUI/SavePresetDialog.cpp:72 +#, possible-c-format +msgid "Save %s as:" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:125 +msgid "the following suffix is not allowed:" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:131 +msgid "The supplied name is not available." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:137 +msgid "Cannot overwrite a system profile." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:142 +msgid "Cannot overwrite an external profile." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:148 +msgid "Preset with name \"%1%\" already exists." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:150 +msgid "And selected preset is imcopatible with selected printer." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:151 +msgid "Note: This preset will be replaced after saving" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:156 +msgid "The empty name is not available." +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:190 +#: src/slic3r/GUI/SavePresetDialog.cpp:196 +msgid "Save preset" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:219 +msgctxt "PresetName" +msgid "Copy" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:277 +msgid "" +"You have selected physical printer \"%1%\" \n" +"with related printer preset \"%2%\"" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:310 +msgid "What would you like to do with \"%1%\" preset after saving?" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:313 +msgid "Change \"%1%\" to \"%2%\" for this physical printer \"%3%\"" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:314 +msgid "Add \"%1%\" as a next preset for the the physical printer \"%2%\"" +msgstr "" + +#: src/slic3r/GUI/SavePresetDialog.cpp:315 +msgid "Just switch to \"%1%\" preset" +msgstr "" + +#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2378 +msgid "Stealth" +msgstr "" + +#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2372 +msgid "Normal" +msgstr "" + +#: src/slic3r/GUI/Selection.cpp:191 msgid "Selection-Add" msgstr "" -#: src/slic3r/GUI/Selection.cpp:188 +#: src/slic3r/GUI/Selection.cpp:232 msgid "Selection-Remove" msgstr "" -#: src/slic3r/GUI/Selection.cpp:220 +#: src/slic3r/GUI/Selection.cpp:264 msgid "Selection-Add Object" msgstr "" -#: src/slic3r/GUI/Selection.cpp:239 +#: src/slic3r/GUI/Selection.cpp:283 msgid "Selection-Remove Object" msgstr "" -#: src/slic3r/GUI/Selection.cpp:257 +#: src/slic3r/GUI/Selection.cpp:301 msgid "Selection-Add Instance" msgstr "" -#: src/slic3r/GUI/Selection.cpp:276 +#: src/slic3r/GUI/Selection.cpp:320 msgid "Selection-Remove Instance" msgstr "" -#: src/slic3r/GUI/Selection.cpp:377 +#: src/slic3r/GUI/Selection.cpp:421 msgid "Selection-Add All" msgstr "" -#: src/slic3r/GUI/Selection.cpp:403 +#: src/slic3r/GUI/Selection.cpp:447 msgid "Selection-Remove All" msgstr "" -#: src/slic3r/GUI/Selection.cpp:946 +#: src/slic3r/GUI/Selection.cpp:988 msgid "Scale To Fit" msgstr "" -#: src/slic3r/GUI/Selection.cpp:1483 +#: src/slic3r/GUI/Selection.cpp:1515 msgid "Set Printable Instance" msgstr "" -#: src/slic3r/GUI/Selection.cpp:1483 +#: src/slic3r/GUI/Selection.cpp:1515 msgid "Set Unprintable Instance" msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:78 +#: src/slic3r/GUI/SysInfoDialog.cpp:90 src/slic3r/GUI/SysInfoDialog.cpp:92 msgid "System Information" msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:158 +#: src/slic3r/GUI/SysInfoDialog.cpp:177 msgid "Copy to Clipboard" msgstr "" -#: src/slic3r/GUI/Tab.cpp:51 src/libslic3r/PrintConfig.cpp:265 +#: src/slic3r/GUI/Tab.cpp:101 src/libslic3r/PrintConfig.cpp:299 msgid "Compatible printers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:52 +#: src/slic3r/GUI/Tab.cpp:102 msgid "Select the printers this profile is compatible with." msgstr "" -#: src/slic3r/GUI/Tab.cpp:57 src/libslic3r/PrintConfig.cpp:280 +#: src/slic3r/GUI/Tab.cpp:107 src/libslic3r/PrintConfig.cpp:314 msgid "Compatible print profiles" msgstr "" -#: src/slic3r/GUI/Tab.cpp:58 +#: src/slic3r/GUI/Tab.cpp:108 msgid "Select the print profiles this profile is compatible with." msgstr "" #. TRN "Save current Settings" -#: src/slic3r/GUI/Tab.cpp:134 +#: src/slic3r/GUI/Tab.cpp:203 #, possible-c-format msgid "Save current %s" msgstr "" -#: src/slic3r/GUI/Tab.cpp:135 +#: src/slic3r/GUI/Tab.cpp:204 msgid "Delete this preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:140 +#: src/slic3r/GUI/Tab.cpp:210 msgid "" "Hover the cursor over buttons to find more information \n" "or click this button." msgstr "" -#: src/slic3r/GUI/Tab.cpp:248 -msgid "Add a new printer" +#: src/slic3r/GUI/Tab.cpp:214 +msgid "Click to start a search or use %1% shortcut" msgstr "" -#: src/slic3r/GUI/Tab.cpp:970 +#: src/slic3r/GUI/Tab.cpp:1224 msgid "Detach from system preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:982 +#: src/slic3r/GUI/Tab.cpp:1237 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:983 +#: src/slic3r/GUI/Tab.cpp:1238 msgid "" "The current custom preset will be detached from the parent system preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:986 +#: src/slic3r/GUI/Tab.cpp:1241 msgid "Modifications to the current profile will be saved." msgstr "" -#: src/slic3r/GUI/Tab.cpp:989 +#: src/slic3r/GUI/Tab.cpp:1244 msgid "" "This action is not revertable.\n" "Do you want to proceed?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:991 +#: src/slic3r/GUI/Tab.cpp:1246 msgid "Detach preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1017 +#: src/slic3r/GUI/Tab.cpp:1272 msgid "This is a default preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1019 +#: src/slic3r/GUI/Tab.cpp:1274 msgid "This is a system preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1021 +#: src/slic3r/GUI/Tab.cpp:1276 msgid "Current preset is inherited from the default preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1023 +#: src/slic3r/GUI/Tab.cpp:1278 msgid "Current preset is inherited from" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1027 +#: src/slic3r/GUI/Tab.cpp:1282 msgid "It can't be deleted or modified." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1028 +#: src/slic3r/GUI/Tab.cpp:1283 msgid "" "Any modifications should be saved as a new preset inherited from this one." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1029 +#: src/slic3r/GUI/Tab.cpp:1284 msgid "To do that please specify a new name for the preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1033 +#: src/slic3r/GUI/Tab.cpp:1288 msgid "Additional information:" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1039 +#: src/slic3r/GUI/Tab.cpp:1294 msgid "printer model" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1047 +#: src/slic3r/GUI/Tab.cpp:1302 msgid "default print profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1050 +#: src/slic3r/GUI/Tab.cpp:1305 msgid "default filament profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1064 +#: src/slic3r/GUI/Tab.cpp:1319 msgid "default SLA material profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1068 +#: src/slic3r/GUI/Tab.cpp:1323 msgid "default SLA print profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1076 +#: src/slic3r/GUI/Tab.cpp:1331 msgid "full profile name" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1077 +#: src/slic3r/GUI/Tab.cpp:1332 msgid "symbolic profile name" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1115 src/slic3r/GUI/Tab.cpp:3665 +#: src/slic3r/GUI/Tab.cpp:1370 src/slic3r/GUI/Tab.cpp:4008 msgid "Layers and perimeters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1120 +#: src/slic3r/GUI/Tab.cpp:1375 msgid "Vertical shells" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1131 +#: src/slic3r/GUI/Tab.cpp:1386 msgid "Horizontal shells" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1132 src/libslic3r/PrintConfig.cpp:1787 +#: src/slic3r/GUI/Tab.cpp:1387 src/libslic3r/PrintConfig.cpp:1895 msgid "Solid layers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1136 +#: src/slic3r/GUI/Tab.cpp:1391 msgid "Minimum shell thickness" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1147 +#: src/slic3r/GUI/Tab.cpp:1402 msgid "Quality (slower slicing)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1165 +#: src/slic3r/GUI/Tab.cpp:1426 msgid "Reducing printing time" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1177 +#: src/slic3r/GUI/Tab.cpp:1438 msgid "Skirt and brim" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1195 +#: src/slic3r/GUI/Tab.cpp:1456 msgid "Raft" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1199 +#: src/slic3r/GUI/Tab.cpp:1460 msgid "Options for support material and raft" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1214 +#: src/slic3r/GUI/Tab.cpp:1475 msgid "Speed for print moves" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1226 +#: src/slic3r/GUI/Tab.cpp:1488 msgid "Speed for non-print moves" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1229 +#: src/slic3r/GUI/Tab.cpp:1491 msgid "Modifiers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1232 +#: src/slic3r/GUI/Tab.cpp:1494 msgid "Acceleration control (advanced)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1239 +#: src/slic3r/GUI/Tab.cpp:1501 msgid "Autospeed (advanced)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1247 +#: src/slic3r/GUI/Tab.cpp:1509 msgid "Multiple Extruders" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1255 +#: src/slic3r/GUI/Tab.cpp:1517 msgid "Ooze prevention" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1273 +#: src/slic3r/GUI/Tab.cpp:1535 msgid "Extrusion width" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1283 +#: src/slic3r/GUI/Tab.cpp:1545 msgid "Overlap" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1286 +#: src/slic3r/GUI/Tab.cpp:1548 msgid "Flow" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1295 +#: src/slic3r/GUI/Tab.cpp:1557 msgid "Other" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1298 src/slic3r/GUI/Tab.cpp:3734 +#: src/slic3r/GUI/Tab.cpp:1560 src/slic3r/GUI/Tab.cpp:4084 msgid "Output options" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1299 +#: src/slic3r/GUI/Tab.cpp:1561 msgid "Sequential printing" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1301 +#: src/slic3r/GUI/Tab.cpp:1563 msgid "Extruder clearance (mm)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1306 src/slic3r/GUI/Tab.cpp:3735 +#: src/slic3r/GUI/Tab.cpp:1568 src/slic3r/GUI/Tab.cpp:4085 msgid "Output file" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1313 src/libslic3r/PrintConfig.cpp:1453 +#: src/slic3r/GUI/Tab.cpp:1575 src/libslic3r/PrintConfig.cpp:1561 msgid "Post-processing scripts" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1319 src/slic3r/GUI/Tab.cpp:1320 -#: src/slic3r/GUI/Tab.cpp:1606 src/slic3r/GUI/Tab.cpp:1607 -#: src/slic3r/GUI/Tab.cpp:2045 src/slic3r/GUI/Tab.cpp:2046 -#: src/slic3r/GUI/Tab.cpp:2127 src/slic3r/GUI/Tab.cpp:2128 -#: src/slic3r/GUI/Tab.cpp:3608 src/slic3r/GUI/Tab.cpp:3609 +#: src/slic3r/GUI/Tab.cpp:1581 src/slic3r/GUI/Tab.cpp:1582 +#: src/slic3r/GUI/Tab.cpp:1887 src/slic3r/GUI/Tab.cpp:1888 +#: src/slic3r/GUI/Tab.cpp:2221 src/slic3r/GUI/Tab.cpp:2222 +#: src/slic3r/GUI/Tab.cpp:2297 src/slic3r/GUI/Tab.cpp:2298 +#: src/slic3r/GUI/Tab.cpp:3951 src/slic3r/GUI/Tab.cpp:3952 msgid "Notes" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1326 src/slic3r/GUI/Tab.cpp:1614 -#: src/slic3r/GUI/Tab.cpp:2052 src/slic3r/GUI/Tab.cpp:2134 -#: src/slic3r/GUI/Tab.cpp:3616 src/slic3r/GUI/Tab.cpp:3740 +#: src/slic3r/GUI/Tab.cpp:1588 src/slic3r/GUI/Tab.cpp:1895 +#: src/slic3r/GUI/Tab.cpp:2228 src/slic3r/GUI/Tab.cpp:2304 +#: src/slic3r/GUI/Tab.cpp:3959 src/slic3r/GUI/Tab.cpp:4090 msgid "Dependencies" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1327 src/slic3r/GUI/Tab.cpp:1615 -#: src/slic3r/GUI/Tab.cpp:2053 src/slic3r/GUI/Tab.cpp:2135 -#: src/slic3r/GUI/Tab.cpp:3617 src/slic3r/GUI/Tab.cpp:3741 +#: src/slic3r/GUI/Tab.cpp:1589 src/slic3r/GUI/Tab.cpp:1896 +#: src/slic3r/GUI/Tab.cpp:2229 src/slic3r/GUI/Tab.cpp:2305 +#: src/slic3r/GUI/Tab.cpp:3960 src/slic3r/GUI/Tab.cpp:4091 msgid "Profile dependencies" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1389 src/slic3r/GUI/Tab.cpp:1444 +#: src/slic3r/GUI/Tab.cpp:1669 msgid "Filament Overrides" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1390 src/slic3r/GUI/Tab.cpp:1449 -#: src/slic3r/GUI/Tab.cpp:2365 -msgid "Retraction" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:1499 src/libslic3r/PrintConfig.cpp:2074 +#: src/slic3r/GUI/Tab.cpp:1779 msgid "Temperature" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1505 +#: src/slic3r/GUI/Tab.cpp:1785 msgid "Bed" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1510 +#: src/slic3r/GUI/Tab.cpp:1790 msgid "Cooling" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1511 src/libslic3r/PrintConfig.cpp:1355 -#: src/libslic3r/PrintConfig.cpp:2207 +#: src/slic3r/GUI/Tab.cpp:1791 src/libslic3r/PrintConfig.cpp:1463 +#: src/libslic3r/PrintConfig.cpp:2343 msgid "Enable" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1522 +#: src/slic3r/GUI/Tab.cpp:1802 msgid "Fan settings" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1531 +#: src/slic3r/GUI/Tab.cpp:1811 msgid "Cooling thresholds" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1537 +#: src/slic3r/GUI/Tab.cpp:1817 msgid "Filament properties" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1544 +#: src/slic3r/GUI/Tab.cpp:1824 msgid "Print speed override" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1554 +#: src/slic3r/GUI/Tab.cpp:1834 msgid "Wipe tower parameters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1557 +#: src/slic3r/GUI/Tab.cpp:1837 msgid "Toolchange parameters with single extruder MM printers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1571 +#: src/slic3r/GUI/Tab.cpp:1850 msgid "Ramming settings" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1593 src/slic3r/GUI/Tab.cpp:2008 +#: src/slic3r/GUI/Tab.cpp:1872 src/slic3r/GUI/Tab.cpp:2160 +#: src/libslic3r/PrintConfig.cpp:1978 msgid "Custom G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1594 src/slic3r/GUI/Tab.cpp:2009 -#: src/libslic3r/PrintConfig.cpp:1820 src/libslic3r/PrintConfig.cpp:1835 +#: src/slic3r/GUI/Tab.cpp:1873 src/slic3r/GUI/Tab.cpp:2161 +#: src/libslic3r/PrintConfig.cpp:1928 src/libslic3r/PrintConfig.cpp:1943 msgid "Start G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1600 src/slic3r/GUI/Tab.cpp:2015 -#: src/libslic3r/PrintConfig.cpp:385 src/libslic3r/PrintConfig.cpp:395 +#: src/slic3r/GUI/Tab.cpp:1880 src/slic3r/GUI/Tab.cpp:2168 +#: src/libslic3r/PrintConfig.cpp:419 src/libslic3r/PrintConfig.cpp:429 msgid "End G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1649 +#: src/slic3r/GUI/Tab.cpp:1930 msgid "Volumetric flow hints not available" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1735 src/slic3r/GUI/Tab.cpp:1948 -msgid "Test" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:1744 -msgid "Could not get a valid Printer Host reference" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:1750 src/slic3r/GUI/Tab.cpp:1961 -msgid "Success!" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:1770 +#: src/slic3r/GUI/Tab.cpp:2026 msgid "" -"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" -"signed certificate." +"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 or remove " +"printers\" 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 "" -#: src/slic3r/GUI/Tab.cpp:1785 -msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:1786 -msgid "Open CA certificate file" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:1813 src/libslic3r/PrintConfig.cpp:111 -msgid "HTTPS CA File" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:1814 -#, possible-c-format -msgid "" -"On this system, %s uses HTTPS certificates from the system Certificate Store " -"or Keychain." -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:1815 -msgid "" -"To use a custom CA file, please import your CA file into Certificate Store / " -"Keychain." -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:1858 src/slic3r/GUI/Tab.cpp:2070 +#: src/slic3r/GUI/Tab.cpp:2059 src/slic3r/GUI/Tab.cpp:2241 msgid "Size and coordinates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1867 +#: src/slic3r/GUI/Tab.cpp:2068 src/slic3r/GUI/UnsavedChangesDialog.cpp:1066 msgid "Capabilities" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1872 +#: src/slic3r/GUI/Tab.cpp:2073 msgid "Number of extruders of the printer." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1900 +#: src/slic3r/GUI/Tab.cpp:2101 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -5474,256 +6528,227 @@ msgid "" "nozzle diameter value?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1903 src/slic3r/GUI/Tab.cpp:2335 -#: src/libslic3r/PrintConfig.cpp:1326 +#: src/slic3r/GUI/Tab.cpp:2104 src/slic3r/GUI/Tab.cpp:2509 +#: src/libslic3r/PrintConfig.cpp:1434 msgid "Nozzle diameter" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1933 -msgid "USB/Serial connection" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:1934 src/libslic3r/PrintConfig.cpp:1661 -msgid "Serial port" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:1939 -msgid "Rescan serial ports" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:1961 -msgid "Connection to printer works correctly." -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:1964 -msgid "Connection failed." -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:1977 src/slic3r/GUI/Tab.cpp:2122 -msgid "Print Host upload" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:2021 src/libslic3r/PrintConfig.cpp:153 +#: src/slic3r/GUI/Tab.cpp:2175 src/libslic3r/PrintConfig.cpp:187 msgid "Before layer change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2027 src/libslic3r/PrintConfig.cpp:1080 +#: src/slic3r/GUI/Tab.cpp:2182 src/libslic3r/PrintConfig.cpp:1173 msgid "After layer change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2033 src/libslic3r/PrintConfig.cpp:2100 +#: src/slic3r/GUI/Tab.cpp:2189 src/libslic3r/PrintConfig.cpp:2236 msgid "Tool change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2039 +#: src/slic3r/GUI/Tab.cpp:2196 msgid "Between objects G-code (for sequential printing)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2077 +#: src/slic3r/GUI/Tab.cpp:2203 +msgid "Color Change G-code" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:2209 src/libslic3r/PrintConfig.cpp:1969 +msgid "Pause Print G-code" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:2215 +msgid "Template Custom G-code" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:2248 msgid "Display" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2092 +#: src/slic3r/GUI/Tab.cpp:2263 msgid "Tilt" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2093 +#: src/slic3r/GUI/Tab.cpp:2264 msgid "Tilt time" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:3592 +#: src/slic3r/GUI/Tab.cpp:2270 src/slic3r/GUI/Tab.cpp:3935 msgid "Corrections" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2116 src/slic3r/GUI/Tab.cpp:3588 +#: src/slic3r/GUI/Tab.cpp:2287 src/slic3r/GUI/Tab.cpp:3931 msgid "Exposure" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2183 src/slic3r/GUI/Tab.cpp:2268 -#: src/libslic3r/PrintConfig.cpp:1129 src/libslic3r/PrintConfig.cpp:1146 -#: src/libslic3r/PrintConfig.cpp:1163 src/libslic3r/PrintConfig.cpp:1179 -#: src/libslic3r/PrintConfig.cpp:1189 src/libslic3r/PrintConfig.cpp:1199 -#: src/libslic3r/PrintConfig.cpp:1209 +#: src/slic3r/GUI/Tab.cpp:2346 src/slic3r/GUI/Tab.cpp:2442 +#: src/libslic3r/PrintConfig.cpp:1202 src/libslic3r/PrintConfig.cpp:1237 +#: src/libslic3r/PrintConfig.cpp:1254 src/libslic3r/PrintConfig.cpp:1271 +#: src/libslic3r/PrintConfig.cpp:1287 src/libslic3r/PrintConfig.cpp:1297 +#: src/libslic3r/PrintConfig.cpp:1307 src/libslic3r/PrintConfig.cpp:1317 msgid "Machine limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2197 +#: src/slic3r/GUI/Tab.cpp:2371 msgid "Values in this column are for Normal mode" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2198 -msgid "Normal" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:2203 +#: src/slic3r/GUI/Tab.cpp:2377 msgid "Values in this column are for Stealth mode" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2204 -msgid "Stealth" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:2212 +#: src/slic3r/GUI/Tab.cpp:2386 msgid "Maximum feedrates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2217 +#: src/slic3r/GUI/Tab.cpp:2391 msgid "Maximum accelerations" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2224 +#: src/slic3r/GUI/Tab.cpp:2398 msgid "Jerk limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2229 +#: src/slic3r/GUI/Tab.cpp:2403 msgid "Minimum feedrates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2293 src/slic3r/GUI/Tab.cpp:2301 +#: src/slic3r/GUI/Tab.cpp:2467 src/slic3r/GUI/Tab.cpp:2475 msgid "Single extruder MM setup" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2302 +#: src/slic3r/GUI/Tab.cpp:2476 msgid "Single extruder multimaterial parameters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2333 +#: src/slic3r/GUI/Tab.cpp:2507 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:2357 +#: src/slic3r/GUI/Tab.cpp:2531 msgid "Layer height limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2362 +#: src/slic3r/GUI/Tab.cpp:2536 msgid "Position (for multi-extruder printers)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2368 +#: src/slic3r/GUI/Tab.cpp:2542 msgid "Only lift Z" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2381 +#: src/slic3r/GUI/Tab.cpp:2555 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2389 +#: src/slic3r/GUI/Tab.cpp:2564 msgid "Reset to Filament Color" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2570 +#: src/slic3r/GUI/Tab.cpp:2731 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:2572 +#: src/slic3r/GUI/Tab.cpp:2733 msgid "Firmware Retraction" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2918 -#, possible-c-format -msgid "Default preset (%s)" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:2919 -#, possible-c-format -msgid "Preset (%s)" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:2936 -msgid "has the following unsaved changes:" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:2939 -msgid "is not compatible with printer" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:2940 -msgid "is not compatible with print profile" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:2942 -msgid "and it has the following unsaved changes:" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:2946 -msgid "Unsaved Changes" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:3040 +#: src/slic3r/GUI/Tab.cpp:3323 msgid "Detached" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3040 -msgctxt "PresetName" -msgid "Copy" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:3069 -msgid "The supplied name is empty. It can't be saved." -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:3074 -msgid "Cannot overwrite a system profile." -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:3078 -msgid "Cannot overwrite an external profile." -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:3083 -msgid "Preset with name \"%1%\" already exists." -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:3084 -msgid "Replace?" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:3152 +#: src/slic3r/GUI/Tab.cpp:3386 msgid "remove" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3152 +#: src/slic3r/GUI/Tab.cpp:3386 msgid "delete" msgstr "" -#. TRN remove/delete -#: src/slic3r/GUI/Tab.cpp:3154 +#: src/slic3r/GUI/Tab.cpp:3392 +msgid "" +"Are you sure you want to delete \"%1%\" preset from the physical printer " +"\"%2%\"?" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:3404 +msgid "Next physical printer(s) has/have selected preset" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:3408 +msgid "" +"Note, that selected preset will be deleted from this/those printer(s) too." +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:3412 +msgid "Next physical printer(s) has/have one and only selected preset" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:3416 +msgid "" +"Note, that this/those printer(s) will be deleted after deleting of the " +"selected preset." +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:3420 msgid "Are you sure you want to %1% the selected preset?" msgstr "" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3157 +#: src/slic3r/GUI/Tab.cpp:3425 msgid "%1% Preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3216 src/slic3r/GUI/Tab.cpp:3286 +#: src/slic3r/GUI/Tab.cpp:3435 +msgid "It's a last for this physical printer. We can't delete it" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:3509 src/slic3r/GUI/Tab.cpp:3588 msgid "Set" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3325 +#: src/slic3r/GUI/Tab.cpp:3660 +msgid "" +"Machine limits will be emitted to G-code and used to estimate print time." +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:3663 +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:3667 +msgid "" +"Machine limits are not set, therefore the print time estimate may not be " +"accurate." +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:3689 msgid "LOCKED LOCK" msgstr "" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3327 +#: src/slic3r/GUI/Tab.cpp:3691 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:3329 +#: src/slic3r/GUI/Tab.cpp:3693 msgid "UNLOCKED LOCK" msgstr "" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3331 +#: src/slic3r/GUI/Tab.cpp:3695 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -5731,23 +6756,23 @@ msgid "" "to the system (or default) values." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3336 +#: src/slic3r/GUI/Tab.cpp:3700 msgid "WHITE BULLET" msgstr "" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:3338 +#: src/slic3r/GUI/Tab.cpp:3702 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:3341 +#: src/slic3r/GUI/Tab.cpp:3705 msgid "BACK ARROW" msgstr "" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:3343 +#: src/slic3r/GUI/Tab.cpp:3707 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -5755,13 +6780,13 @@ msgid "" "to the last saved preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3353 +#: src/slic3r/GUI/Tab.cpp:3717 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:3355 +#: src/slic3r/GUI/Tab.cpp:3719 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" @@ -5769,17 +6794,17 @@ msgid "" "default) values." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3358 +#: src/slic3r/GUI/Tab.cpp:3722 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3361 +#: src/slic3r/GUI/Tab.cpp:3725 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:3363 +#: src/slic3r/GUI/Tab.cpp:3727 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" @@ -5787,84 +6812,197 @@ msgid "" "preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3369 +#: src/slic3r/GUI/Tab.cpp:3733 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3370 +#: src/slic3r/GUI/Tab.cpp:3734 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:3376 +#: src/slic3r/GUI/Tab.cpp:3740 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3377 +#: src/slic3r/GUI/Tab.cpp:3741 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 "" -#. TRN Preset -#: src/slic3r/GUI/Tab.cpp:3490 -#, possible-c-format -msgid "Save %s as:" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:3534 -msgid "the following suffix is not allowed:" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:3538 -msgid "The supplied name is not available." -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:3551 src/slic3r/GUI/Tab.cpp:3553 +#: src/slic3r/GUI/Tab.cpp:3894 src/slic3r/GUI/Tab.cpp:3896 msgid "Material" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3675 +#: src/slic3r/GUI/Tab.cpp:4018 msgid "Support head" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3680 +#: src/slic3r/GUI/Tab.cpp:4023 msgid "Support pillar" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3696 +#: src/slic3r/GUI/Tab.cpp:4046 msgid "Connection of the support sticks and junctions" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:4051 msgid "Automatic generation" msgstr "" -#: src/slic3r/GUI/Tab.hpp:336 src/slic3r/GUI/Tab.hpp:441 +#: src/slic3r/GUI/Tab.cpp:4125 +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:4127 src/libslic3r/PrintConfig.cpp:2917 +msgid "Object elevation" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:4127 src/libslic3r/PrintConfig.cpp:3019 +msgid "Pad around object" +msgstr "" + +#: src/slic3r/GUI/Tab.hpp:378 src/slic3r/GUI/Tab.hpp:502 msgid "Print Settings" msgstr "" -#: src/slic3r/GUI/Tab.hpp:363 +#: src/slic3r/GUI/Tab.hpp:409 msgid "Filament Settings" msgstr "" -#: src/slic3r/GUI/Tab.hpp:399 +#: src/slic3r/GUI/Tab.hpp:453 msgid "Printer Settings" msgstr "" -#: src/slic3r/GUI/Tab.hpp:426 +#: src/slic3r/GUI/Tab.hpp:486 msgid "Material Settings" msgstr "" -#: src/slic3r/GUI/Tab.hpp:453 -msgid "Save preset" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:137 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:146 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:845 +msgid "Undef" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:525 +msgid "Closing PrusaSlicer: Unsaved Changes" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:542 +msgid "Switching Presets: Unsaved Changes" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:608 +msgid "Old Value" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:609 +msgid "New Value" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:640 +msgid "Transfer" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:641 +msgid "Discard" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:642 +msgid "Save" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:662 +msgid "PrusaSlicer will remember your action." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:664 +msgid "" +"You will not be asked about the unsaved changes the next time you close " +"PrusaSlicer." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:665 +msgid "" +"You will not be asked about the unsaved changes the next time you switch a " +"preset." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:666 +msgid "" +"Visit \"Preferences\" and check \"%1%\"\n" +"to be asked about unsaved changes again." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:668 +msgid "PrusaSlicer: Don't ask me again" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:735 +msgid "" +"Some fields are too long to fit. Right mouse click reveals the full text." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:737 +msgid "All modified options will be reverted." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:740 +msgid "Save the selected options." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:740 +msgid "Transfer the selected options to the newly selected presets." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:744 +msgid "Save the selected options to preset \"%1%\"." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:745 +msgid "Transfer the selected options to the newly selected preset \"%1%\"." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1004 +msgid "The following presets were modified:" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1009 +msgid "Preset \"%1%\" has the following unsaved changes:" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1013 +msgid "" +"Preset \"%1%\" is not compatible with the new printer profile and it has the " +"following unsaved changes:" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1014 +msgid "" +"Preset \"%1%\" is not compatible with the new print profile and it has the " +"following unsaved changes:" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1061 +msgid "Extruders count" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1177 +msgid "Old value" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1178 +msgid "New value" msgstr "" #: src/slic3r/GUI/UpdateDialogs.cpp:38 @@ -6101,17 +7239,17 @@ msgstr "" msgid "Show advanced settings" msgstr "" -#: src/slic3r/GUI/wxExtensions.cpp:706 +#: src/slic3r/GUI/wxExtensions.cpp:623 #, possible-c-format msgid "Switch to the %s mode" msgstr "" -#: src/slic3r/GUI/wxExtensions.cpp:707 +#: src/slic3r/GUI/wxExtensions.cpp:624 #, possible-c-format msgid "Current mode is %s" msgstr "" -#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:69 +#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:68 #, possible-c-format msgid "Mismatched type of print host: %s" msgstr "" @@ -6183,7 +7321,7 @@ msgid "Model fixing" msgstr "" #: src/slic3r/Utils/FixModelByWin10.cpp:341 -msgid "Exporting model..." +msgid "Exporting model" msgstr "" #: src/slic3r/Utils/FixModelByWin10.cpp:368 @@ -6249,188 +7387,86 @@ msgid "" "is required." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:84 +#: src/slic3r/Utils/OctoPrint.cpp:83 msgid "Connection to OctoPrint works correctly." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:90 +#: src/slic3r/Utils/OctoPrint.cpp:89 msgid "Could not connect to OctoPrint" msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:92 +#: src/slic3r/Utils/OctoPrint.cpp:91 msgid "Note: OctoPrint version at least 1.1.0 is required." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:179 +#: src/slic3r/Utils/OctoPrint.cpp:185 msgid "Connection to Prusa SL1 works correctly." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:185 +#: src/slic3r/Utils/OctoPrint.cpp:191 msgid "Could not connect to Prusa SLA" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:706 +#: src/slic3r/Utils/PresetUpdater.cpp:726 #, possible-c-format msgid "requires min. %s and max. %s" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:710 +#: src/slic3r/Utils/PresetUpdater.cpp:730 #, possible-c-format msgid "requires min. %s" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:713 +#: src/slic3r/Utils/PresetUpdater.cpp:733 #, possible-c-format msgid "requires max. %s" msgstr "" -#: src/libslic3r/SLA/Pad.cpp:691 -msgid "Pad brim size is too small for the current configuration." +#: src/slic3r/Utils/Http.cpp:73 +msgid "" +"Could not detect system SSL certificate store. PrusaSlicer will be unable to " +"establish secure network connections." msgstr "" -#: src/libslic3r/Zipper.cpp:32 -msgid "undefined error" +#: src/slic3r/Utils/Http.cpp:78 +msgid "PrusaSlicer detected system SSL certificate store in: %1%" msgstr "" -#: src/libslic3r/Zipper.cpp:34 -msgid "too many files" +#: 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 "" -#: src/libslic3r/Zipper.cpp:36 -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 "" -#: src/libslic3r/Zipper.cpp:38 -msgid "unsupported method" +#: src/slic3r/Utils/Process.cpp:151 +msgid "Open G-code file:" msgstr "" -#: src/libslic3r/Zipper.cpp:40 -msgid "unsupported encryption" +#: src/libslic3r/GCode.cpp:604 +msgid "There is an object with no extrusions on the first layer." msgstr "" -#: src/libslic3r/Zipper.cpp:42 -msgid "unsupported feature" -msgstr "" - -#: src/libslic3r/Zipper.cpp:44 -msgid "failed finding central directory" -msgstr "" - -#: src/libslic3r/Zipper.cpp:46 -msgid "not a ZIP archive" -msgstr "" - -#: src/libslic3r/Zipper.cpp:48 -msgid "invalid header or archive is corrupted" -msgstr "" - -#: src/libslic3r/Zipper.cpp:50 -msgid "unsupported multidisk archive" -msgstr "" - -#: src/libslic3r/Zipper.cpp:52 -msgid "decompression failed or archive is corrupted" -msgstr "" - -#: src/libslic3r/Zipper.cpp:54 -msgid "compression failed" -msgstr "" - -#: src/libslic3r/Zipper.cpp:56 -msgid "unexpected decompressed size" -msgstr "" - -#: src/libslic3r/Zipper.cpp:58 -msgid "CRC-32 check failed" -msgstr "" - -#: src/libslic3r/Zipper.cpp:60 -msgid "unsupported central directory size" -msgstr "" - -#: src/libslic3r/Zipper.cpp:62 -msgid "allocation failed" -msgstr "" - -#: src/libslic3r/Zipper.cpp:64 -msgid "file open failed" -msgstr "" - -#: src/libslic3r/Zipper.cpp:66 -msgid "file create failed" -msgstr "" - -#: src/libslic3r/Zipper.cpp:68 -msgid "file write failed" -msgstr "" - -#: src/libslic3r/Zipper.cpp:70 -msgid "file read failed" -msgstr "" - -#: src/libslic3r/Zipper.cpp:72 -msgid "file close failed" -msgstr "" - -#: src/libslic3r/Zipper.cpp:74 -msgid "file seek failed" -msgstr "" - -#: src/libslic3r/Zipper.cpp:76 -msgid "file stat failed" -msgstr "" - -#: src/libslic3r/Zipper.cpp:78 -msgid "invalid parameter" -msgstr "" - -#: src/libslic3r/Zipper.cpp:80 -msgid "invalid filename" -msgstr "" - -#: src/libslic3r/Zipper.cpp:82 -msgid "buffer too small" -msgstr "" - -#: src/libslic3r/Zipper.cpp:84 -msgid "internal error" -msgstr "" - -#: src/libslic3r/Zipper.cpp:86 -msgid "file not found" -msgstr "" - -#: src/libslic3r/Zipper.cpp:88 -msgid "archive is too large" -msgstr "" - -#: src/libslic3r/Zipper.cpp:90 -msgid "validation failed" -msgstr "" - -#: src/libslic3r/Zipper.cpp:92 -msgid "write calledback failed" -msgstr "" - -#: src/libslic3r/Zipper.cpp:102 -msgid "Error with zip archive" -msgstr "" - -#: src/libslic3r/GCode.cpp:637 +#: src/libslic3r/GCode.cpp:622 msgid "Empty layers detected, the output would not be printable." msgstr "" -#: src/libslic3r/GCode.cpp:638 +#: src/libslic3r/GCode.cpp:623 msgid "Print z" msgstr "" -#: src/libslic3r/GCode.cpp:639 +#: src/libslic3r/GCode.cpp:624 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/ExtrusionEntity.cpp:323 +#: src/libslic3r/ExtrusionEntity.cpp:328 src/libslic3r/ExtrusionEntity.cpp:364 msgid "Mixed" msgstr "" @@ -6439,122 +7475,254 @@ msgid "" "Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1626 +#: src/libslic3r/Format/3mf.cpp:1667 msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " "compatible." msgstr "" -#: src/libslic3r/Format/AMF.cpp:934 +#: src/libslic3r/Format/AMF.cpp:955 msgid "" "The selected amf file has been saved with a newer version of %1% and is not " "compatible." msgstr "" -#: src/libslic3r/Print.cpp:1218 +#: 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/miniz_extension.cpp:103 +msgid "failed finding central directory" +msgstr "" + +#: src/libslic3r/miniz_extension.cpp:105 +msgid "not a ZIP archive" +msgstr "" + +#: src/libslic3r/miniz_extension.cpp:107 +msgid "invalid header or archive is corrupted" +msgstr "" + +#: src/libslic3r/miniz_extension.cpp:109 +msgid "unsupported multidisk archive" +msgstr "" + +#: src/libslic3r/miniz_extension.cpp:111 +msgid "decompression failed or archive is corrupted" +msgstr "" + +#: src/libslic3r/miniz_extension.cpp:113 +msgid "compression failed" +msgstr "" + +#: src/libslic3r/miniz_extension.cpp:115 +msgid "unexpected decompressed size" +msgstr "" + +#: src/libslic3r/miniz_extension.cpp:117 +msgid "CRC-32 check failed" +msgstr "" + +#: src/libslic3r/miniz_extension.cpp:119 +msgid "unsupported central directory size" +msgstr "" + +#: src/libslic3r/miniz_extension.cpp:121 +msgid "allocation failed" +msgstr "" + +#: src/libslic3r/miniz_extension.cpp:123 +msgid "file open failed" +msgstr "" + +#: src/libslic3r/miniz_extension.cpp:125 +msgid "file create failed" +msgstr "" + +#: src/libslic3r/miniz_extension.cpp:127 +msgid "file write failed" +msgstr "" + +#: src/libslic3r/miniz_extension.cpp:129 +msgid "file read failed" +msgstr "" + +#: src/libslic3r/miniz_extension.cpp:131 +msgid "file close failed" +msgstr "" + +#: src/libslic3r/miniz_extension.cpp:133 +msgid "file seek failed" +msgstr "" + +#: src/libslic3r/miniz_extension.cpp:135 +msgid "file stat failed" +msgstr "" + +#: src/libslic3r/miniz_extension.cpp:137 +msgid "invalid parameter" +msgstr "" + +#: src/libslic3r/miniz_extension.cpp:139 +msgid "invalid filename" +msgstr "" + +#: src/libslic3r/miniz_extension.cpp:141 +msgid "buffer too small" +msgstr "" + +#: src/libslic3r/miniz_extension.cpp:143 +msgid "internal error" +msgstr "" + +#: src/libslic3r/miniz_extension.cpp:145 +msgid "file not found" +msgstr "" + +#: src/libslic3r/miniz_extension.cpp:147 +msgid "archive is too large" +msgstr "" + +#: src/libslic3r/miniz_extension.cpp:149 +msgid "validation failed" +msgstr "" + +#: src/libslic3r/miniz_extension.cpp:151 +msgid "write calledback failed" +msgstr "" + +#: src/libslic3r/Preset.cpp:1301 +msgid "filament" +msgstr "" + +#: src/libslic3r/Preset.cpp:1302 +msgid "SLA print" +msgstr "" + +#: src/libslic3r/Print.cpp:1245 msgid "All objects are outside of the print volume." msgstr "" -#: src/libslic3r/Print.cpp:1221 +#: src/libslic3r/Print.cpp:1248 msgid "The supplied settings will cause an empty print." msgstr "" -#: src/libslic3r/Print.cpp:1225 +#: src/libslic3r/Print.cpp:1252 msgid "Some objects are too close; your extruder will collide with them." msgstr "" -#: src/libslic3r/Print.cpp:1227 +#: src/libslic3r/Print.cpp:1254 msgid "" "Some objects are too tall and cannot be printed without extruder collisions." msgstr "" -#: src/libslic3r/Print.cpp:1236 +#: src/libslic3r/Print.cpp:1263 msgid "The Spiral Vase option can only be used when printing a single object." msgstr "" -#: src/libslic3r/Print.cpp:1243 +#: src/libslic3r/Print.cpp:1270 msgid "" "The Spiral Vase option can only be used when printing single material " "objects." msgstr "" -#: src/libslic3r/Print.cpp:1256 +#: src/libslic3r/Print.cpp:1283 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:1261 +#: src/libslic3r/Print.cpp:1288 msgid "" "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter " "and Repetier G-code flavors." msgstr "" -#: src/libslic3r/Print.cpp:1263 +#: src/libslic3r/Print.cpp:1290 msgid "" "The Wipe Tower is currently only supported with the relative extruder " "addressing (use_relative_e_distances=1)." msgstr "" -#: src/libslic3r/Print.cpp:1265 +#: src/libslic3r/Print.cpp:1292 msgid "Ooze prevention is currently not supported with the wipe tower enabled." msgstr "" -#: src/libslic3r/Print.cpp:1267 +#: src/libslic3r/Print.cpp:1294 msgid "" "The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)." msgstr "" -#: src/libslic3r/Print.cpp:1269 +#: src/libslic3r/Print.cpp:1296 msgid "" "The Wipe Tower is currently not supported for multimaterial sequential " "prints." msgstr "" -#: src/libslic3r/Print.cpp:1290 +#: src/libslic3r/Print.cpp:1317 msgid "" "The Wipe Tower is only supported for multiple objects if they have equal " "layer heights" msgstr "" -#: src/libslic3r/Print.cpp:1292 +#: src/libslic3r/Print.cpp:1319 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:1294 +#: src/libslic3r/Print.cpp:1321 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:1296 +#: src/libslic3r/Print.cpp:1323 msgid "" "The Wipe Tower is only supported for multiple objects if they are sliced " "equally." msgstr "" -#: src/libslic3r/Print.cpp:1338 +#: src/libslic3r/Print.cpp:1365 msgid "" "The Wipe tower is only supported if all objects have the same variable layer " "height" msgstr "" -#: src/libslic3r/Print.cpp:1364 +#: src/libslic3r/Print.cpp:1391 msgid "" "One or more object were assigned an extruder that the printer does not have." msgstr "" -#: src/libslic3r/Print.cpp:1373 +#: src/libslic3r/Print.cpp:1400 msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm" msgstr "" -#: src/libslic3r/Print.cpp:1376 +#: src/libslic3r/Print.cpp:1403 msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm" msgstr "" -#: src/libslic3r/Print.cpp:1387 +#: src/libslic3r/Print.cpp:1414 msgid "" "Printing with multiple extruders of differing nozzle diameters. If support " "is to be printed with the current extruder (support_material_extruder == 0 " @@ -6562,13 +7730,13 @@ msgid "" "same diameter." msgstr "" -#: src/libslic3r/Print.cpp:1395 +#: src/libslic3r/Print.cpp:1422 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:1399 +#: src/libslic3r/Print.cpp:1426 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 " @@ -6576,132 +7744,136 @@ msgid "" "set to 0)." msgstr "" -#: src/libslic3r/Print.cpp:1421 +#: src/libslic3r/Print.cpp:1448 msgid "First layer height can't be greater than nozzle diameter" msgstr "" -#: src/libslic3r/Print.cpp:1426 +#: src/libslic3r/Print.cpp:1453 msgid "Layer height can't be greater than nozzle diameter" msgstr "" -#: src/libslic3r/Print.cpp:1583 +#: src/libslic3r/Print.cpp:1610 msgid "Infilling layers" msgstr "" -#: src/libslic3r/Print.cpp:1605 +#: src/libslic3r/Print.cpp:1636 msgid "Generating skirt" msgstr "" -#: src/libslic3r/Print.cpp:1613 +#: src/libslic3r/Print.cpp:1645 msgid "Generating brim" msgstr "" -#: src/libslic3r/Print.cpp:1633 +#: src/libslic3r/Print.cpp:1676 msgid "Exporting G-code" msgstr "" -#: src/libslic3r/Print.cpp:1637 +#: src/libslic3r/Print.cpp:1680 msgid "Generating G-code" msgstr "" -#: src/libslic3r/SLAPrint.cpp:615 +#: src/libslic3r/SLA/Pad.cpp:532 +msgid "Pad brim size is too small for the current configuration." +msgstr "" + +#: src/libslic3r/SLAPrint.cpp:627 msgid "" "Cannot proceed without support points! Add support points or disable support " "generation." msgstr "" -#: src/libslic3r/SLAPrint.cpp:627 +#: src/libslic3r/SLAPrint.cpp:639 msgid "" "Elevation is too low for object. Use the \"Pad around object\" feature to " "print the object without elevation." msgstr "" -#: src/libslic3r/SLAPrint.cpp:633 +#: src/libslic3r/SLAPrint.cpp:645 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:648 +#: src/libslic3r/SLAPrint.cpp:660 msgid "Exposition time is out of printer profile bounds." msgstr "" -#: src/libslic3r/SLAPrint.cpp:655 +#: src/libslic3r/SLAPrint.cpp:667 msgid "Initial exposition time is out of printer profile bounds." msgstr "" -#: src/libslic3r/SLAPrint.cpp:762 +#: src/libslic3r/SLAPrint.cpp:780 msgid "Slicing done" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:43 +#: src/libslic3r/SLAPrintSteps.cpp:44 msgid "Hollowing model" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:44 +#: src/libslic3r/SLAPrintSteps.cpp:45 msgid "Drilling holes into model." msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:45 +#: src/libslic3r/SLAPrintSteps.cpp:46 msgid "Slicing model" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:46 src/libslic3r/SLAPrintSteps.cpp:356 +#: src/libslic3r/SLAPrintSteps.cpp:47 src/libslic3r/SLAPrintSteps.cpp:359 msgid "Generating support points" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:47 +#: src/libslic3r/SLAPrintSteps.cpp:48 msgid "Generating support tree" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:48 +#: src/libslic3r/SLAPrintSteps.cpp:49 msgid "Generating pad" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:49 +#: src/libslic3r/SLAPrintSteps.cpp:50 msgid "Slicing supports" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:64 +#: src/libslic3r/SLAPrintSteps.cpp:65 msgid "Merging slices and calculating statistics" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:65 +#: src/libslic3r/SLAPrintSteps.cpp:66 msgid "Rasterizing layers" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:190 -msgid "Too much overlapping holes." +#: src/libslic3r/SLAPrintSteps.cpp:192 +msgid "Too many overlapping holes." msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:199 +#: 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/SLAPrintSteps.cpp:245 +#: src/libslic3r/SLAPrintSteps.cpp:247 msgid "" "Slicing had to be stopped due to an internal error: Inconsistent slice index." msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:413 src/libslic3r/SLAPrintSteps.cpp:422 -#: src/libslic3r/SLAPrintSteps.cpp:461 +#: src/libslic3r/SLAPrintSteps.cpp:411 src/libslic3r/SLAPrintSteps.cpp:420 +#: src/libslic3r/SLAPrintSteps.cpp:459 msgid "Visualizing supports" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:453 +#: src/libslic3r/SLAPrintSteps.cpp:451 msgid "No pad can be generated for this model with the current configuration" msgstr "" -#: src/libslic3r/SLAPrintSteps.cpp:621 +#: 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:71 +#: src/libslic3r/PrintBase.cpp:72 msgid "Failed processing of the output_filename_format template." msgstr "" @@ -6741,91 +7913,107 @@ msgid "" "printing." msgstr "" -#: src/libslic3r/PrintConfig.cpp:87 +#: src/libslic3r/PrintConfig.cpp:89 msgid "Slice gap closing radius" msgstr "" -#: src/libslic3r/PrintConfig.cpp:89 +#: src/libslic3r/PrintConfig.cpp:91 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 "" -#: src/libslic3r/PrintConfig.cpp:97 +#: src/libslic3r/PrintConfig.cpp:99 msgid "Hostname, IP or URL" msgstr "" -#: src/libslic3r/PrintConfig.cpp:98 +#: src/libslic3r/PrintConfig.cpp:100 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:104 +#: src/libslic3r/PrintConfig.cpp:106 msgid "API Key / Password" msgstr "" -#: src/libslic3r/PrintConfig.cpp:105 +#: src/libslic3r/PrintConfig.cpp:107 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 "" -#: src/libslic3r/PrintConfig.cpp:112 +#: src/libslic3r/PrintConfig.cpp:114 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 "" -#: src/libslic3r/PrintConfig.cpp:118 +#: src/libslic3r/PrintConfig.cpp:120 msgid "Elephant foot compensation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:120 +#: src/libslic3r/PrintConfig.cpp:122 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 "" -#: src/libslic3r/PrintConfig.cpp:136 +#: src/libslic3r/PrintConfig.cpp:138 +msgid "Password" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:144 +msgid "Printer preset name" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:145 +msgid "Related printer preset name" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:150 +msgid "Authorization Type" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:169 msgid "Avoid crossing perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:137 +#: src/libslic3r/PrintConfig.cpp:170 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." msgstr "" -#: src/libslic3r/PrintConfig.cpp:144 src/libslic3r/PrintConfig.cpp:2071 +#: src/libslic3r/PrintConfig.cpp:177 src/libslic3r/PrintConfig.cpp:2206 msgid "Other layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:145 +#: src/libslic3r/PrintConfig.cpp:178 msgid "" "Bed temperature for layers after the first one. Set this to zero to disable " "bed temperature control commands in the output." msgstr "" -#: src/libslic3r/PrintConfig.cpp:147 +#: src/libslic3r/PrintConfig.cpp:181 msgid "Bed temperature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:154 +#: src/libslic3r/PrintConfig.cpp:188 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 "" -#: src/libslic3r/PrintConfig.cpp:164 +#: src/libslic3r/PrintConfig.cpp:198 msgid "Between objects G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:165 +#: src/libslic3r/PrintConfig.cpp:199 msgid "" "This code is inserted between objects when using sequential printing. By " "default extruder and bed temperature are reset using non-wait command; " @@ -6835,80 +8023,81 @@ msgid "" "S[first_layer_temperature]\" command wherever you want." msgstr "" -#: src/libslic3r/PrintConfig.cpp:176 +#: src/libslic3r/PrintConfig.cpp:210 msgid "Number of solid layers to generate on bottom surfaces." msgstr "" -#: src/libslic3r/PrintConfig.cpp:177 +#: src/libslic3r/PrintConfig.cpp:211 msgid "Bottom solid layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:185 +#: src/libslic3r/PrintConfig.cpp:219 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:187 +#: src/libslic3r/PrintConfig.cpp:221 msgid "Minimum bottom shell thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:193 +#: src/libslic3r/PrintConfig.cpp:227 msgid "Bridge" msgstr "" -#: src/libslic3r/PrintConfig.cpp:194 +#: src/libslic3r/PrintConfig.cpp:228 msgid "" "This is the acceleration your printer will use for bridges. Set zero to " "disable acceleration control for bridges." msgstr "" -#: src/libslic3r/PrintConfig.cpp:196 src/libslic3r/PrintConfig.cpp:339 -#: src/libslic3r/PrintConfig.cpp:862 src/libslic3r/PrintConfig.cpp:984 -#: src/libslic3r/PrintConfig.cpp:1152 src/libslic3r/PrintConfig.cpp:1201 -#: src/libslic3r/PrintConfig.cpp:1211 src/libslic3r/PrintConfig.cpp:1403 +#: src/libslic3r/PrintConfig.cpp:230 src/libslic3r/PrintConfig.cpp:373 +#: src/libslic3r/PrintConfig.cpp:902 src/libslic3r/PrintConfig.cpp:1028 +#: src/libslic3r/PrintConfig.cpp:1260 src/libslic3r/PrintConfig.cpp:1309 +#: src/libslic3r/PrintConfig.cpp:1319 src/libslic3r/PrintConfig.cpp:1511 msgid "mm/s²" msgstr "" -#: src/libslic3r/PrintConfig.cpp:202 +#: src/libslic3r/PrintConfig.cpp:236 msgid "Bridging angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:204 +#: src/libslic3r/PrintConfig.cpp:238 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." msgstr "" -#: src/libslic3r/PrintConfig.cpp:207 src/libslic3r/PrintConfig.cpp:780 -#: src/libslic3r/PrintConfig.cpp:1640 src/libslic3r/PrintConfig.cpp:1650 -#: src/libslic3r/PrintConfig.cpp:1901 src/libslic3r/PrintConfig.cpp:2056 -#: src/libslic3r/PrintConfig.cpp:2254 src/libslic3r/PrintConfig.cpp:2744 -#: src/libslic3r/PrintConfig.cpp:2865 +#: src/libslic3r/PrintConfig.cpp:241 src/libslic3r/PrintConfig.cpp:816 +#: src/libslic3r/PrintConfig.cpp:1748 src/libslic3r/PrintConfig.cpp:1758 +#: src/libslic3r/PrintConfig.cpp:2036 src/libslic3r/PrintConfig.cpp:2191 +#: src/libslic3r/PrintConfig.cpp:2390 src/libslic3r/PrintConfig.cpp:2891 +#: src/libslic3r/PrintConfig.cpp:3012 msgid "°" msgstr "" -#: src/libslic3r/PrintConfig.cpp:213 +#: src/libslic3r/PrintConfig.cpp:247 msgid "Bridges fan speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:214 +#: src/libslic3r/PrintConfig.cpp:248 msgid "This fan speed is enforced during all bridges and overhangs." msgstr "" -#: src/libslic3r/PrintConfig.cpp:215 src/libslic3r/PrintConfig.cpp:792 -#: src/libslic3r/PrintConfig.cpp:1219 src/libslic3r/PrintConfig.cpp:1282 -#: src/libslic3r/PrintConfig.cpp:1532 src/libslic3r/PrintConfig.cpp:2432 -#: src/libslic3r/PrintConfig.cpp:2784 +#: src/libslic3r/PrintConfig.cpp:249 src/libslic3r/PrintConfig.cpp:828 +#: src/libslic3r/PrintConfig.cpp:1148 src/libslic3r/PrintConfig.cpp:1327 +#: src/libslic3r/PrintConfig.cpp:1390 src/libslic3r/PrintConfig.cpp:1640 +#: src/libslic3r/PrintConfig.cpp:2568 src/libslic3r/PrintConfig.cpp:2805 +#: src/libslic3r/PrintConfig.cpp:2931 msgid "%" msgstr "" -#: src/libslic3r/PrintConfig.cpp:222 +#: src/libslic3r/PrintConfig.cpp:256 msgid "Bridge flow ratio" msgstr "" -#: src/libslic3r/PrintConfig.cpp:224 +#: src/libslic3r/PrintConfig.cpp:258 msgid "" "This factor affects the amount of plastic for bridging. You can decrease it " "slightly to pull the extrudates and prevent sagging, although default " @@ -6916,83 +8105,84 @@ msgid "" "before tweaking this." msgstr "" -#: src/libslic3r/PrintConfig.cpp:234 +#: src/libslic3r/PrintConfig.cpp:268 msgid "Bridges" msgstr "" -#: src/libslic3r/PrintConfig.cpp:236 +#: src/libslic3r/PrintConfig.cpp:270 msgid "Speed for printing bridges." msgstr "" -#: src/libslic3r/PrintConfig.cpp:237 src/libslic3r/PrintConfig.cpp:609 -#: src/libslic3r/PrintConfig.cpp:617 src/libslic3r/PrintConfig.cpp:626 -#: src/libslic3r/PrintConfig.cpp:634 src/libslic3r/PrintConfig.cpp:661 -#: src/libslic3r/PrintConfig.cpp:680 src/libslic3r/PrintConfig.cpp:922 -#: src/libslic3r/PrintConfig.cpp:1050 src/libslic3r/PrintConfig.cpp:1135 -#: src/libslic3r/PrintConfig.cpp:1169 src/libslic3r/PrintConfig.cpp:1181 -#: src/libslic3r/PrintConfig.cpp:1191 src/libslic3r/PrintConfig.cpp:1241 -#: src/libslic3r/PrintConfig.cpp:1300 src/libslic3r/PrintConfig.cpp:1433 -#: src/libslic3r/PrintConfig.cpp:1607 src/libslic3r/PrintConfig.cpp:1616 -#: src/libslic3r/PrintConfig.cpp:2035 src/libslic3r/PrintConfig.cpp:2161 +#: src/libslic3r/PrintConfig.cpp:271 src/libslic3r/PrintConfig.cpp:645 +#: src/libslic3r/PrintConfig.cpp:653 src/libslic3r/PrintConfig.cpp:662 +#: src/libslic3r/PrintConfig.cpp:670 src/libslic3r/PrintConfig.cpp:697 +#: src/libslic3r/PrintConfig.cpp:716 src/libslic3r/PrintConfig.cpp:966 +#: src/libslic3r/PrintConfig.cpp:1094 src/libslic3r/PrintConfig.cpp:1167 +#: src/libslic3r/PrintConfig.cpp:1243 src/libslic3r/PrintConfig.cpp:1277 +#: src/libslic3r/PrintConfig.cpp:1289 src/libslic3r/PrintConfig.cpp:1299 +#: src/libslic3r/PrintConfig.cpp:1349 src/libslic3r/PrintConfig.cpp:1408 +#: src/libslic3r/PrintConfig.cpp:1541 src/libslic3r/PrintConfig.cpp:1715 +#: src/libslic3r/PrintConfig.cpp:1724 src/libslic3r/PrintConfig.cpp:2170 +#: src/libslic3r/PrintConfig.cpp:2297 msgid "mm/s" msgstr "" -#: src/libslic3r/PrintConfig.cpp:244 +#: src/libslic3r/PrintConfig.cpp:278 msgid "Brim width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:245 +#: src/libslic3r/PrintConfig.cpp:279 msgid "" "Horizontal width of the brim that will be printed around each object on the " "first layer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:252 +#: src/libslic3r/PrintConfig.cpp:286 msgid "Clip multi-part objects" msgstr "" -#: src/libslic3r/PrintConfig.cpp:253 +#: src/libslic3r/PrintConfig.cpp:287 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:260 +#: src/libslic3r/PrintConfig.cpp:294 msgid "Colorprint height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:261 +#: src/libslic3r/PrintConfig.cpp:295 msgid "Heights at which a filament change is to occur." msgstr "" -#: src/libslic3r/PrintConfig.cpp:271 +#: src/libslic3r/PrintConfig.cpp:305 msgid "Compatible printers condition" msgstr "" -#: src/libslic3r/PrintConfig.cpp:272 +#: src/libslic3r/PrintConfig.cpp:306 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:286 +#: src/libslic3r/PrintConfig.cpp:320 msgid "Compatible print profiles condition" msgstr "" -#: src/libslic3r/PrintConfig.cpp:287 +#: src/libslic3r/PrintConfig.cpp:321 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:304 +#: src/libslic3r/PrintConfig.cpp:338 msgid "Complete individual objects" msgstr "" -#: src/libslic3r/PrintConfig.cpp:305 +#: src/libslic3r/PrintConfig.cpp:339 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). " @@ -7000,97 +8190,97 @@ msgid "" "warn and prevent you from extruder collisions, but beware." msgstr "" -#: src/libslic3r/PrintConfig.cpp:313 +#: src/libslic3r/PrintConfig.cpp:347 msgid "Enable auto cooling" msgstr "" -#: src/libslic3r/PrintConfig.cpp:314 +#: src/libslic3r/PrintConfig.cpp:348 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:319 +#: src/libslic3r/PrintConfig.cpp:353 msgid "Cooling tube position" msgstr "" -#: src/libslic3r/PrintConfig.cpp:320 +#: src/libslic3r/PrintConfig.cpp:354 msgid "Distance of the center-point of the cooling tube from the extruder tip." msgstr "" -#: src/libslic3r/PrintConfig.cpp:327 +#: src/libslic3r/PrintConfig.cpp:361 msgid "Cooling tube length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:328 +#: src/libslic3r/PrintConfig.cpp:362 msgid "Length of the cooling tube to limit space for cooling moves inside it." msgstr "" -#: src/libslic3r/PrintConfig.cpp:336 +#: src/libslic3r/PrintConfig.cpp:370 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:345 +#: src/libslic3r/PrintConfig.cpp:379 msgid "Default filament profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:346 +#: src/libslic3r/PrintConfig.cpp:380 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:352 +#: src/libslic3r/PrintConfig.cpp:386 msgid "Default print profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:353 src/libslic3r/PrintConfig.cpp:2599 -#: src/libslic3r/PrintConfig.cpp:2610 +#: src/libslic3r/PrintConfig.cpp:387 src/libslic3r/PrintConfig.cpp:2735 +#: src/libslic3r/PrintConfig.cpp:2746 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:359 +#: src/libslic3r/PrintConfig.cpp:393 msgid "Disable fan for the first" msgstr "" -#: src/libslic3r/PrintConfig.cpp:360 +#: src/libslic3r/PrintConfig.cpp:394 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:369 +#: src/libslic3r/PrintConfig.cpp:403 msgid "Don't support bridges" msgstr "" -#: src/libslic3r/PrintConfig.cpp:371 +#: src/libslic3r/PrintConfig.cpp:405 msgid "" "Experimental option for preventing support material from being generated " "under bridged areas." msgstr "" -#: src/libslic3r/PrintConfig.cpp:377 +#: src/libslic3r/PrintConfig.cpp:411 msgid "Distance between copies" msgstr "" -#: src/libslic3r/PrintConfig.cpp:378 +#: src/libslic3r/PrintConfig.cpp:412 msgid "Distance used for the auto-arrange feature of the plater." msgstr "" -#: src/libslic3r/PrintConfig.cpp:386 +#: src/libslic3r/PrintConfig.cpp:420 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:396 +#: src/libslic3r/PrintConfig.cpp:430 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 " @@ -7099,62 +8289,66 @@ msgid "" "in extruder order." msgstr "" -#: src/libslic3r/PrintConfig.cpp:407 +#: src/libslic3r/PrintConfig.cpp:441 msgid "Ensure vertical shell thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:409 +#: src/libslic3r/PrintConfig.cpp:443 msgid "" "Add solid infill near sloping surfaces to guarantee the vertical shell " "thickness (top+bottom solid layers)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:415 +#: src/libslic3r/PrintConfig.cpp:449 msgid "Top fill pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:417 +#: src/libslic3r/PrintConfig.cpp:451 msgid "" "Fill pattern for top infill. This only affects the top visible layer, and " "not its adjacent solid shells." msgstr "" -#: src/libslic3r/PrintConfig.cpp:425 src/libslic3r/PrintConfig.cpp:843 -#: src/libslic3r/PrintConfig.cpp:2016 +#: src/libslic3r/PrintConfig.cpp:460 src/libslic3r/PrintConfig.cpp:881 +#: src/libslic3r/PrintConfig.cpp:2151 msgid "Rectilinear" msgstr "" -#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:849 +#: src/libslic3r/PrintConfig.cpp:461 +msgid "Monotonic" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:462 src/libslic3r/PrintConfig.cpp:887 msgid "Concentric" msgstr "" -#: src/libslic3r/PrintConfig.cpp:427 src/libslic3r/PrintConfig.cpp:853 +#: src/libslic3r/PrintConfig.cpp:463 src/libslic3r/PrintConfig.cpp:891 msgid "Hilbert Curve" msgstr "" -#: src/libslic3r/PrintConfig.cpp:428 src/libslic3r/PrintConfig.cpp:854 +#: src/libslic3r/PrintConfig.cpp:464 src/libslic3r/PrintConfig.cpp:892 msgid "Archimedean Chords" msgstr "" -#: src/libslic3r/PrintConfig.cpp:429 src/libslic3r/PrintConfig.cpp:855 +#: src/libslic3r/PrintConfig.cpp:465 src/libslic3r/PrintConfig.cpp:893 msgid "Octagram Spiral" msgstr "" -#: src/libslic3r/PrintConfig.cpp:435 +#: src/libslic3r/PrintConfig.cpp:471 msgid "Bottom fill pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:437 +#: src/libslic3r/PrintConfig.cpp:473 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:446 src/libslic3r/PrintConfig.cpp:457 +#: src/libslic3r/PrintConfig.cpp:482 src/libslic3r/PrintConfig.cpp:493 msgid "External perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:448 +#: src/libslic3r/PrintConfig.cpp:484 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, " @@ -7162,43 +8356,43 @@ msgid "" "(for example 200%), it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:451 src/libslic3r/PrintConfig.cpp:560 -#: src/libslic3r/PrintConfig.cpp:882 src/libslic3r/PrintConfig.cpp:895 -#: src/libslic3r/PrintConfig.cpp:1015 src/libslic3r/PrintConfig.cpp:1041 -#: src/libslic3r/PrintConfig.cpp:1423 src/libslic3r/PrintConfig.cpp:1768 -#: src/libslic3r/PrintConfig.cpp:1890 src/libslic3r/PrintConfig.cpp:1958 -#: src/libslic3r/PrintConfig.cpp:2118 +#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:596 +#: src/libslic3r/PrintConfig.cpp:924 src/libslic3r/PrintConfig.cpp:937 +#: src/libslic3r/PrintConfig.cpp:1059 src/libslic3r/PrintConfig.cpp:1085 +#: src/libslic3r/PrintConfig.cpp:1531 src/libslic3r/PrintConfig.cpp:1876 +#: src/libslic3r/PrintConfig.cpp:2025 src/libslic3r/PrintConfig.cpp:2093 +#: src/libslic3r/PrintConfig.cpp:2254 msgid "mm or %" msgstr "" -#: src/libslic3r/PrintConfig.cpp:459 +#: src/libslic3r/PrintConfig.cpp:495 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:462 src/libslic3r/PrintConfig.cpp:904 -#: src/libslic3r/PrintConfig.cpp:1727 src/libslic3r/PrintConfig.cpp:1779 -#: src/libslic3r/PrintConfig.cpp:2002 src/libslic3r/PrintConfig.cpp:2131 +#: src/libslic3r/PrintConfig.cpp:498 src/libslic3r/PrintConfig.cpp:946 +#: src/libslic3r/PrintConfig.cpp:1835 src/libslic3r/PrintConfig.cpp:1887 +#: src/libslic3r/PrintConfig.cpp:2137 src/libslic3r/PrintConfig.cpp:2267 msgid "mm/s or %" msgstr "" -#: src/libslic3r/PrintConfig.cpp:469 +#: src/libslic3r/PrintConfig.cpp:505 msgid "External perimeters first" msgstr "" -#: src/libslic3r/PrintConfig.cpp:471 +#: src/libslic3r/PrintConfig.cpp:507 msgid "" "Print contour perimeters from the outermost one to the innermost one instead " "of the default inverse order." msgstr "" -#: src/libslic3r/PrintConfig.cpp:477 +#: src/libslic3r/PrintConfig.cpp:513 msgid "Extra perimeters if needed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:479 +#: src/libslic3r/PrintConfig.cpp:515 #, possible-c-format msgid "" "Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r " @@ -7206,14 +8400,14 @@ msgid "" "is supported." msgstr "" -#: src/libslic3r/PrintConfig.cpp:489 +#: src/libslic3r/PrintConfig.cpp:525 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:501 +#: src/libslic3r/PrintConfig.cpp:537 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 " @@ -7221,26 +8415,26 @@ msgid "" "extruder can peek before colliding with other printed objects." msgstr "" -#: src/libslic3r/PrintConfig.cpp:512 +#: src/libslic3r/PrintConfig.cpp:548 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:522 +#: src/libslic3r/PrintConfig.cpp:558 msgid "Extruder Color" msgstr "" -#: src/libslic3r/PrintConfig.cpp:523 src/libslic3r/PrintConfig.cpp:583 +#: src/libslic3r/PrintConfig.cpp:559 src/libslic3r/PrintConfig.cpp:619 msgid "This is only used in the Slic3r interface as a visual help." msgstr "" -#: src/libslic3r/PrintConfig.cpp:529 +#: src/libslic3r/PrintConfig.cpp:565 msgid "Extruder offset" msgstr "" -#: src/libslic3r/PrintConfig.cpp:530 +#: src/libslic3r/PrintConfig.cpp:566 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 " @@ -7248,21 +8442,21 @@ msgid "" "coordinates (they will be subtracted from the XY coordinate)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:539 +#: src/libslic3r/PrintConfig.cpp:575 msgid "Extrusion axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:540 +#: src/libslic3r/PrintConfig.cpp:576 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:545 +#: src/libslic3r/PrintConfig.cpp:581 msgid "Extrusion multiplier" msgstr "" -#: src/libslic3r/PrintConfig.cpp:546 +#: src/libslic3r/PrintConfig.cpp:582 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. " @@ -7270,11 +8464,11 @@ msgid "" "more, check filament diameter and your firmware E steps." msgstr "" -#: src/libslic3r/PrintConfig.cpp:554 +#: src/libslic3r/PrintConfig.cpp:590 msgid "Default extrusion width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:556 +#: src/libslic3r/PrintConfig.cpp:592 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 " @@ -7283,119 +8477,119 @@ msgid "" "height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:566 +#: src/libslic3r/PrintConfig.cpp:602 msgid "Keep fan always on" msgstr "" -#: src/libslic3r/PrintConfig.cpp:567 +#: src/libslic3r/PrintConfig.cpp:603 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:572 +#: src/libslic3r/PrintConfig.cpp:608 msgid "Enable fan if layer print time is below" msgstr "" -#: src/libslic3r/PrintConfig.cpp:573 +#: src/libslic3r/PrintConfig.cpp:609 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:575 src/libslic3r/PrintConfig.cpp:1715 +#: src/libslic3r/PrintConfig.cpp:611 src/libslic3r/PrintConfig.cpp:1823 msgid "approximate seconds" msgstr "" -#: src/libslic3r/PrintConfig.cpp:588 +#: src/libslic3r/PrintConfig.cpp:624 msgid "Filament notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:589 +#: src/libslic3r/PrintConfig.cpp:625 msgid "You can put your notes regarding the filament here." msgstr "" -#: src/libslic3r/PrintConfig.cpp:597 src/libslic3r/PrintConfig.cpp:1247 +#: src/libslic3r/PrintConfig.cpp:633 src/libslic3r/PrintConfig.cpp:1355 msgid "Max volumetric speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:598 +#: src/libslic3r/PrintConfig.cpp:634 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:607 +#: src/libslic3r/PrintConfig.cpp:643 msgid "Loading speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:608 +#: src/libslic3r/PrintConfig.cpp:644 msgid "Speed used for loading the filament on the wipe tower." msgstr "" -#: src/libslic3r/PrintConfig.cpp:615 +#: src/libslic3r/PrintConfig.cpp:651 msgid "Loading speed at the start" msgstr "" -#: src/libslic3r/PrintConfig.cpp:616 +#: src/libslic3r/PrintConfig.cpp:652 msgid "Speed used at the very beginning of loading phase." msgstr "" -#: src/libslic3r/PrintConfig.cpp:623 +#: src/libslic3r/PrintConfig.cpp:659 msgid "Unloading speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:624 +#: src/libslic3r/PrintConfig.cpp:660 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:632 +#: src/libslic3r/PrintConfig.cpp:668 msgid "Unloading speed at the start" msgstr "" -#: src/libslic3r/PrintConfig.cpp:633 +#: src/libslic3r/PrintConfig.cpp:669 msgid "" "Speed used for unloading the tip of the filament immediately after ramming." msgstr "" -#: src/libslic3r/PrintConfig.cpp:640 +#: src/libslic3r/PrintConfig.cpp:676 msgid "Delay after unloading" msgstr "" -#: src/libslic3r/PrintConfig.cpp:641 +#: src/libslic3r/PrintConfig.cpp:677 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:650 +#: src/libslic3r/PrintConfig.cpp:686 msgid "Number of cooling moves" msgstr "" -#: src/libslic3r/PrintConfig.cpp:651 +#: src/libslic3r/PrintConfig.cpp:687 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:659 +#: src/libslic3r/PrintConfig.cpp:695 msgid "Speed of the first cooling move" msgstr "" -#: src/libslic3r/PrintConfig.cpp:660 +#: src/libslic3r/PrintConfig.cpp:696 msgid "Cooling moves are gradually accelerating beginning at this speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:667 +#: src/libslic3r/PrintConfig.cpp:703 msgid "Minimal purge on wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:668 +#: src/libslic3r/PrintConfig.cpp:704 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 " @@ -7404,63 +8598,63 @@ msgid "" "to produce successive infill or sacrificial object extrusions reliably." msgstr "" -#: src/libslic3r/PrintConfig.cpp:672 +#: src/libslic3r/PrintConfig.cpp:708 msgid "mm³" msgstr "" -#: src/libslic3r/PrintConfig.cpp:678 +#: src/libslic3r/PrintConfig.cpp:714 msgid "Speed of the last cooling move" msgstr "" -#: src/libslic3r/PrintConfig.cpp:679 +#: src/libslic3r/PrintConfig.cpp:715 msgid "Cooling moves are gradually accelerating towards this speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:686 +#: src/libslic3r/PrintConfig.cpp:722 msgid "Filament load time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:687 +#: src/libslic3r/PrintConfig.cpp:723 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:694 +#: src/libslic3r/PrintConfig.cpp:730 msgid "Ramming parameters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:695 +#: src/libslic3r/PrintConfig.cpp:731 msgid "" "This string is edited by RammingDialog and contains ramming specific " "parameters." msgstr "" -#: src/libslic3r/PrintConfig.cpp:701 +#: src/libslic3r/PrintConfig.cpp:737 msgid "Filament unload time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:702 +#: src/libslic3r/PrintConfig.cpp:738 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:710 +#: src/libslic3r/PrintConfig.cpp:746 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:717 src/libslic3r/PrintConfig.cpp:2510 -#: src/libslic3r/PrintConfig.cpp:2511 +#: src/libslic3r/PrintConfig.cpp:753 src/libslic3r/PrintConfig.cpp:2646 +#: src/libslic3r/PrintConfig.cpp:2647 msgid "Density" msgstr "" -#: src/libslic3r/PrintConfig.cpp:718 +#: src/libslic3r/PrintConfig.cpp:754 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 " @@ -7468,117 +8662,129 @@ msgid "" "displacement." msgstr "" -#: src/libslic3r/PrintConfig.cpp:721 +#: src/libslic3r/PrintConfig.cpp:757 msgid "g/cm³" msgstr "" -#: src/libslic3r/PrintConfig.cpp:726 +#: src/libslic3r/PrintConfig.cpp:762 msgid "Filament type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:727 +#: src/libslic3r/PrintConfig.cpp:763 msgid "The filament material type for use in custom G-codes." msgstr "" -#: src/libslic3r/PrintConfig.cpp:754 +#: src/libslic3r/PrintConfig.cpp:790 msgid "Soluble material" msgstr "" -#: src/libslic3r/PrintConfig.cpp:755 +#: src/libslic3r/PrintConfig.cpp:791 msgid "Soluble material is most likely used for a soluble support." msgstr "" -#: src/libslic3r/PrintConfig.cpp:761 +#: src/libslic3r/PrintConfig.cpp:797 msgid "" "Enter your filament cost per kg here. This is only for statistical " "information." msgstr "" -#: src/libslic3r/PrintConfig.cpp:762 +#: src/libslic3r/PrintConfig.cpp:798 msgid "money/kg" msgstr "" -#: src/libslic3r/PrintConfig.cpp:771 src/libslic3r/PrintConfig.cpp:2594 +#: src/libslic3r/PrintConfig.cpp:807 src/libslic3r/PrintConfig.cpp:2730 msgid "(Unknown)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:775 +#: src/libslic3r/PrintConfig.cpp:811 msgid "Fill angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:777 +#: src/libslic3r/PrintConfig.cpp:813 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:789 +#: src/libslic3r/PrintConfig.cpp:825 msgid "Fill density" msgstr "" -#: src/libslic3r/PrintConfig.cpp:791 +#: src/libslic3r/PrintConfig.cpp:827 msgid "Density of internal infill, expressed in the range 0% - 100%." msgstr "" -#: src/libslic3r/PrintConfig.cpp:826 +#: src/libslic3r/PrintConfig.cpp:862 msgid "Fill pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:828 +#: src/libslic3r/PrintConfig.cpp:864 msgid "Fill pattern for general low-density infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:844 +#: src/libslic3r/PrintConfig.cpp:882 msgid "Grid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:845 +#: src/libslic3r/PrintConfig.cpp:883 msgid "Triangles" msgstr "" -#: src/libslic3r/PrintConfig.cpp:846 +#: src/libslic3r/PrintConfig.cpp:884 msgid "Stars" msgstr "" -#: src/libslic3r/PrintConfig.cpp:847 +#: src/libslic3r/PrintConfig.cpp:885 msgid "Cubic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:848 +#: src/libslic3r/PrintConfig.cpp:886 msgid "Line" msgstr "" -#: src/libslic3r/PrintConfig.cpp:850 src/libslic3r/PrintConfig.cpp:2018 +#: src/libslic3r/PrintConfig.cpp:888 src/libslic3r/PrintConfig.cpp:2153 msgid "Honeycomb" msgstr "" -#: src/libslic3r/PrintConfig.cpp:851 +#: src/libslic3r/PrintConfig.cpp:889 msgid "3D Honeycomb" msgstr "" -#: src/libslic3r/PrintConfig.cpp:852 +#: src/libslic3r/PrintConfig.cpp:890 msgid "Gyroid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:859 src/libslic3r/PrintConfig.cpp:868 -#: src/libslic3r/PrintConfig.cpp:876 src/libslic3r/PrintConfig.cpp:910 +#: src/libslic3r/PrintConfig.cpp:894 +msgid "Adaptive Cubic" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:895 +msgid "Support Cubic" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:899 src/libslic3r/PrintConfig.cpp:908 +#: src/libslic3r/PrintConfig.cpp:918 src/libslic3r/PrintConfig.cpp:952 msgid "First layer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:860 +#: src/libslic3r/PrintConfig.cpp:900 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:869 +#: src/libslic3r/PrintConfig.cpp:909 +msgid "First layer bed temperature" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:910 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:878 +#: src/libslic3r/PrintConfig.cpp:920 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 " @@ -7586,7 +8792,7 @@ msgid "" "layer height. If set to zero, it will use the default extrusion width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:891 +#: src/libslic3r/PrintConfig.cpp:933 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 " @@ -7594,47 +8800,51 @@ msgid "" "example: 150%) over the default layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:900 +#: src/libslic3r/PrintConfig.cpp:942 msgid "First layer speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:901 +#: src/libslic3r/PrintConfig.cpp:943 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:911 +#: src/libslic3r/PrintConfig.cpp:953 +msgid "First layer extruder temperature" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:954 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 "" -#: src/libslic3r/PrintConfig.cpp:920 +#: src/libslic3r/PrintConfig.cpp:964 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:928 +#: src/libslic3r/PrintConfig.cpp:972 msgid "Verbose G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:929 +#: src/libslic3r/PrintConfig.cpp:973 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:936 +#: src/libslic3r/PrintConfig.cpp:980 msgid "G-code flavor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:937 +#: src/libslic3r/PrintConfig.cpp:981 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 " @@ -7642,15 +8852,15 @@ msgid "" "extrusion value at all." msgstr "" -#: src/libslic3r/PrintConfig.cpp:960 +#: src/libslic3r/PrintConfig.cpp:1004 msgid "No extrusion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:965 +#: src/libslic3r/PrintConfig.cpp:1009 msgid "Label objects" msgstr "" -#: src/libslic3r/PrintConfig.cpp:966 +#: src/libslic3r/PrintConfig.cpp:1010 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 " @@ -7658,46 +8868,46 @@ msgid "" "setup and Wipe into Object / Wipe into Infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:973 +#: src/libslic3r/PrintConfig.cpp:1017 msgid "High extruder current on filament swap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:974 +#: src/libslic3r/PrintConfig.cpp:1018 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:982 +#: src/libslic3r/PrintConfig.cpp:1026 msgid "" "This is the acceleration your printer will use for infill. Set zero to " "disable acceleration control for infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:990 +#: src/libslic3r/PrintConfig.cpp:1034 msgid "Combine infill every" msgstr "" -#: src/libslic3r/PrintConfig.cpp:992 +#: src/libslic3r/PrintConfig.cpp:1036 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:995 +#: src/libslic3r/PrintConfig.cpp:1039 msgid "Combine infill every n layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1001 +#: src/libslic3r/PrintConfig.cpp:1045 msgid "Infill extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1003 +#: src/libslic3r/PrintConfig.cpp:1047 msgid "The extruder to use when printing infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1011 +#: src/libslic3r/PrintConfig.cpp:1055 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 " @@ -7706,32 +8916,32 @@ msgid "" "example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1021 +#: src/libslic3r/PrintConfig.cpp:1065 msgid "Infill before perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1022 +#: src/libslic3r/PrintConfig.cpp:1066 msgid "" "This option will switch the print order of perimeters and infill, making the " "latter first." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1027 +#: src/libslic3r/PrintConfig.cpp:1071 msgid "Only infill where needed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1029 +#: src/libslic3r/PrintConfig.cpp:1073 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:1036 +#: src/libslic3r/PrintConfig.cpp:1080 msgid "Infill/perimeters overlap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1038 +#: src/libslic3r/PrintConfig.cpp:1082 msgid "" "This setting applies an additional overlap between infill and perimeters for " "better bonding. Theoretically this shouldn't be needed, but backlash might " @@ -7739,30 +8949,63 @@ msgid "" "perimeter extrusion width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1049 +#: src/libslic3r/PrintConfig.cpp:1093 msgid "Speed for printing the internal fill. Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1057 +#: src/libslic3r/PrintConfig.cpp:1101 msgid "Inherits profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1058 +#: src/libslic3r/PrintConfig.cpp:1102 msgid "Name of the profile, from which this profile inherits." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1071 +#: src/libslic3r/PrintConfig.cpp:1115 msgid "Interface shells" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1072 +#: src/libslic3r/PrintConfig.cpp:1116 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:1081 +#: src/libslic3r/PrintConfig.cpp:1124 +msgid "Enable ironing" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1125 +msgid "" +"Enable ironing of the top layers with the hot print head for smooth surface" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1131 src/libslic3r/PrintConfig.cpp:1133 +msgid "Ironing Type" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1145 +msgid "Flow rate" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1147 +msgid "Percent of a flow rate relative to object's normal layer height." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1155 +msgid "Spacing between ironing passes" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1157 +msgid "Distance between ironing lines" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1164 src/libslic3r/PrintConfig.cpp:1166 +msgid "Ironing speed" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1174 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 " @@ -7770,11 +9013,11 @@ msgid "" "[layer_z]." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1092 +#: src/libslic3r/PrintConfig.cpp:1185 msgid "Supports remaining times" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1093 +#: src/libslic3r/PrintConfig.cpp:1186 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. " @@ -7782,151 +9025,163 @@ msgid "" "firmware supports M73 Qxx Sxx for the silent mode." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1101 +#: src/libslic3r/PrintConfig.cpp:1194 msgid "Supports stealth mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1102 +#: src/libslic3r/PrintConfig.cpp:1195 msgid "The firmware supports stealth mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1125 +#: src/libslic3r/PrintConfig.cpp:1200 +msgid "How to apply" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1201 +msgid "Purpose of Machine Limits" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1203 +msgid "How to apply the Machine Limits" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1233 msgid "Maximum feedrate X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1126 +#: src/libslic3r/PrintConfig.cpp:1234 msgid "Maximum feedrate Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1127 +#: src/libslic3r/PrintConfig.cpp:1235 msgid "Maximum feedrate Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1128 +#: src/libslic3r/PrintConfig.cpp:1236 msgid "Maximum feedrate E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1131 +#: src/libslic3r/PrintConfig.cpp:1239 msgid "Maximum feedrate of the X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1132 +#: src/libslic3r/PrintConfig.cpp:1240 msgid "Maximum feedrate of the Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1133 +#: src/libslic3r/PrintConfig.cpp:1241 msgid "Maximum feedrate of the Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1134 +#: src/libslic3r/PrintConfig.cpp:1242 msgid "Maximum feedrate of the E axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1142 +#: src/libslic3r/PrintConfig.cpp:1250 msgid "Maximum acceleration X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1143 +#: src/libslic3r/PrintConfig.cpp:1251 msgid "Maximum acceleration Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1144 +#: src/libslic3r/PrintConfig.cpp:1252 msgid "Maximum acceleration Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1145 +#: src/libslic3r/PrintConfig.cpp:1253 msgid "Maximum acceleration E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1148 +#: src/libslic3r/PrintConfig.cpp:1256 msgid "Maximum acceleration of the X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1149 +#: src/libslic3r/PrintConfig.cpp:1257 msgid "Maximum acceleration of the Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1150 +#: src/libslic3r/PrintConfig.cpp:1258 msgid "Maximum acceleration of the Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1151 +#: src/libslic3r/PrintConfig.cpp:1259 msgid "Maximum acceleration of the E axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1159 +#: src/libslic3r/PrintConfig.cpp:1267 msgid "Maximum jerk X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1160 +#: src/libslic3r/PrintConfig.cpp:1268 msgid "Maximum jerk Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1161 +#: src/libslic3r/PrintConfig.cpp:1269 msgid "Maximum jerk Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1162 +#: src/libslic3r/PrintConfig.cpp:1270 msgid "Maximum jerk E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1165 +#: src/libslic3r/PrintConfig.cpp:1273 msgid "Maximum jerk of the X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1166 +#: src/libslic3r/PrintConfig.cpp:1274 msgid "Maximum jerk of the Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1167 +#: src/libslic3r/PrintConfig.cpp:1275 msgid "Maximum jerk of the Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1168 +#: src/libslic3r/PrintConfig.cpp:1276 msgid "Maximum jerk of the E axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1178 +#: src/libslic3r/PrintConfig.cpp:1286 msgid "Minimum feedrate when extruding" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1180 +#: src/libslic3r/PrintConfig.cpp:1288 msgid "Minimum feedrate when extruding (M205 S)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1188 +#: src/libslic3r/PrintConfig.cpp:1296 msgid "Minimum travel feedrate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1190 +#: src/libslic3r/PrintConfig.cpp:1298 msgid "Minimum travel feedrate (M205 T)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1198 +#: src/libslic3r/PrintConfig.cpp:1306 msgid "Maximum acceleration when extruding" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1200 +#: src/libslic3r/PrintConfig.cpp:1308 msgid "Maximum acceleration when extruding (M204 S)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1208 +#: src/libslic3r/PrintConfig.cpp:1316 msgid "Maximum acceleration when retracting" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1210 +#: src/libslic3r/PrintConfig.cpp:1318 msgid "Maximum acceleration when retracting (M204 T)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1217 src/libslic3r/PrintConfig.cpp:1226 +#: src/libslic3r/PrintConfig.cpp:1325 src/libslic3r/PrintConfig.cpp:1334 msgid "Max" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1218 +#: src/libslic3r/PrintConfig.cpp:1326 msgid "This setting represents the maximum speed of your fan." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1227 +#: src/libslic3r/PrintConfig.cpp:1335 #, possible-c-format msgid "" "This is the highest printable layer height for this extruder, used to cap " @@ -7935,28 +9190,28 @@ msgid "" "adhesion. If set to 0, layer height is limited to 75% of the nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1237 +#: src/libslic3r/PrintConfig.cpp:1345 msgid "Max print speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1238 +#: src/libslic3r/PrintConfig.cpp:1346 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:1248 +#: src/libslic3r/PrintConfig.cpp:1356 msgid "" "This experimental setting is used to set the maximum volumetric speed your " "extruder supports." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1257 +#: src/libslic3r/PrintConfig.cpp:1365 msgid "Max volumetric slope positive" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1258 src/libslic3r/PrintConfig.cpp:1269 +#: src/libslic3r/PrintConfig.cpp:1366 src/libslic3r/PrintConfig.cpp:1377 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 " @@ -7964,95 +9219,95 @@ msgid "" "s) to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1262 src/libslic3r/PrintConfig.cpp:1273 +#: src/libslic3r/PrintConfig.cpp:1370 src/libslic3r/PrintConfig.cpp:1381 msgid "mm³/s²" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1268 +#: src/libslic3r/PrintConfig.cpp:1376 msgid "Max volumetric slope negative" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1280 src/libslic3r/PrintConfig.cpp:1289 +#: src/libslic3r/PrintConfig.cpp:1388 src/libslic3r/PrintConfig.cpp:1397 msgid "Min" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1281 +#: src/libslic3r/PrintConfig.cpp:1389 msgid "This setting represents the minimum PWM your fan needs to work." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1290 +#: src/libslic3r/PrintConfig.cpp:1398 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:1298 +#: src/libslic3r/PrintConfig.cpp:1406 msgid "Min print speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1299 +#: src/libslic3r/PrintConfig.cpp:1407 msgid "Slic3r will not scale speed down below this speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1306 +#: src/libslic3r/PrintConfig.cpp:1414 msgid "Minimal filament extrusion length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1307 +#: src/libslic3r/PrintConfig.cpp:1415 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:1316 +#: src/libslic3r/PrintConfig.cpp:1424 msgid "Configuration notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1317 +#: src/libslic3r/PrintConfig.cpp:1425 msgid "" "You can put here your personal notes. This text will be added to the G-code " "header comments." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1327 +#: src/libslic3r/PrintConfig.cpp:1435 msgid "" "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1332 +#: src/libslic3r/PrintConfig.cpp:1440 msgid "Host Type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1333 +#: src/libslic3r/PrintConfig.cpp:1441 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:1348 +#: src/libslic3r/PrintConfig.cpp:1456 msgid "Only retract when crossing perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1349 +#: src/libslic3r/PrintConfig.cpp:1457 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:1356 +#: src/libslic3r/PrintConfig.cpp:1464 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:1363 +#: src/libslic3r/PrintConfig.cpp:1471 msgid "Output filename format" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1364 +#: src/libslic3r/PrintConfig.cpp:1472 msgid "" "You can use all configuration options as variables inside this template. For " "example: [layer_height], [fill_density] etc. You can also use [timestamp], " @@ -8060,31 +9315,31 @@ msgid "" "[input_filename], [input_filename_base]." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1373 +#: src/libslic3r/PrintConfig.cpp:1481 msgid "Detect bridging perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1375 +#: src/libslic3r/PrintConfig.cpp:1483 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:1381 +#: src/libslic3r/PrintConfig.cpp:1489 msgid "Filament parking position" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1382 +#: src/libslic3r/PrintConfig.cpp:1490 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:1390 +#: src/libslic3r/PrintConfig.cpp:1498 msgid "Extra loading distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1391 +#: src/libslic3r/PrintConfig.cpp:1499 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 " @@ -8092,28 +9347,28 @@ msgid "" "than unloading." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1399 src/libslic3r/PrintConfig.cpp:1417 -#: src/libslic3r/PrintConfig.cpp:1430 src/libslic3r/PrintConfig.cpp:1440 +#: src/libslic3r/PrintConfig.cpp:1507 src/libslic3r/PrintConfig.cpp:1525 +#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:1548 msgid "Perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1400 +#: src/libslic3r/PrintConfig.cpp:1508 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 "" -#: src/libslic3r/PrintConfig.cpp:1408 +#: src/libslic3r/PrintConfig.cpp:1516 msgid "Perimeter extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1410 +#: src/libslic3r/PrintConfig.cpp:1518 msgid "" "The extruder to use when printing perimeters and brim. First extruder is 1." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1419 +#: src/libslic3r/PrintConfig.cpp:1527 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 " @@ -8122,12 +9377,12 @@ msgid "" "it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1432 +#: src/libslic3r/PrintConfig.cpp:1540 msgid "" "Speed for perimeters (contours, aka vertical shells). Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1442 +#: src/libslic3r/PrintConfig.cpp:1550 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 " @@ -8135,11 +9390,11 @@ msgid "" "Perimeters option is enabled." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1446 +#: src/libslic3r/PrintConfig.cpp:1554 msgid "(minimum)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1454 +#: src/libslic3r/PrintConfig.cpp:1562 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. " @@ -8148,55 +9403,55 @@ msgid "" "environment variables." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1466 +#: src/libslic3r/PrintConfig.cpp:1574 msgid "Printer type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1467 +#: src/libslic3r/PrintConfig.cpp:1575 msgid "Type of the printer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1472 +#: src/libslic3r/PrintConfig.cpp:1580 msgid "Printer notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1473 +#: src/libslic3r/PrintConfig.cpp:1581 msgid "You can put your notes regarding the printer here." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1481 +#: src/libslic3r/PrintConfig.cpp:1589 msgid "Printer vendor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1482 +#: src/libslic3r/PrintConfig.cpp:1590 msgid "Name of the printer vendor." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1487 +#: src/libslic3r/PrintConfig.cpp:1595 msgid "Printer variant" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1488 +#: src/libslic3r/PrintConfig.cpp:1596 msgid "" "Name of the printer variant. For example, the printer variants may be " "differentiated by a nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1501 +#: src/libslic3r/PrintConfig.cpp:1609 msgid "Raft layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1503 +#: src/libslic3r/PrintConfig.cpp:1611 msgid "" "The object will be raised by this number of layers, and support material " "will be generated under it." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1511 +#: src/libslic3r/PrintConfig.cpp:1619 msgid "Resolution" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1512 +#: src/libslic3r/PrintConfig.cpp:1620 msgid "" "Minimum detail resolution, used to simplify the input file for speeding up " "the slicing job and reducing memory usage. High-resolution models often " @@ -8204,289 +9459,293 @@ msgid "" "simplification and use full resolution from input." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1522 +#: src/libslic3r/PrintConfig.cpp:1630 msgid "Minimum travel after retraction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1523 +#: src/libslic3r/PrintConfig.cpp:1631 msgid "" "Retraction is not triggered when travel moves are shorter than this length." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1529 +#: src/libslic3r/PrintConfig.cpp:1637 msgid "Retract amount before wipe" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1530 +#: src/libslic3r/PrintConfig.cpp:1638 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:1537 +#: src/libslic3r/PrintConfig.cpp:1645 msgid "Retract on layer change" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1538 +#: src/libslic3r/PrintConfig.cpp:1646 msgid "This flag enforces a retraction whenever a Z move is done." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1543 src/libslic3r/PrintConfig.cpp:1551 +#: src/libslic3r/PrintConfig.cpp:1651 src/libslic3r/PrintConfig.cpp:1659 msgid "Length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1544 +#: src/libslic3r/PrintConfig.cpp:1652 msgid "Retraction Length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1545 +#: src/libslic3r/PrintConfig.cpp:1653 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:1547 src/libslic3r/PrintConfig.cpp:1556 +#: src/libslic3r/PrintConfig.cpp:1655 src/libslic3r/PrintConfig.cpp:1664 msgid "mm (zero to disable)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1552 +#: src/libslic3r/PrintConfig.cpp:1660 msgid "Retraction Length (Toolchange)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1553 +#: src/libslic3r/PrintConfig.cpp:1661 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:1561 +#: src/libslic3r/PrintConfig.cpp:1669 msgid "Lift Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1562 +#: src/libslic3r/PrintConfig.cpp:1670 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:1569 +#: src/libslic3r/PrintConfig.cpp:1677 msgid "Above Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1570 +#: src/libslic3r/PrintConfig.cpp:1678 msgid "Only lift Z above" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1571 +#: src/libslic3r/PrintConfig.cpp:1679 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:1578 +#: src/libslic3r/PrintConfig.cpp:1686 msgid "Below Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1579 +#: src/libslic3r/PrintConfig.cpp:1687 msgid "Only lift Z below" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1580 +#: src/libslic3r/PrintConfig.cpp:1688 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:1588 src/libslic3r/PrintConfig.cpp:1596 +#: src/libslic3r/PrintConfig.cpp:1696 src/libslic3r/PrintConfig.cpp:1704 msgid "Extra length on restart" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1589 +#: src/libslic3r/PrintConfig.cpp:1697 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:1597 +#: src/libslic3r/PrintConfig.cpp:1705 msgid "" "When the retraction is compensated after changing tool, the extruder will " "push this additional amount of filament." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1604 src/libslic3r/PrintConfig.cpp:1605 +#: src/libslic3r/PrintConfig.cpp:1712 src/libslic3r/PrintConfig.cpp:1713 msgid "Retraction Speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1606 +#: src/libslic3r/PrintConfig.cpp:1714 msgid "The speed for retractions (it only applies to the extruder motor)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1612 src/libslic3r/PrintConfig.cpp:1613 +#: src/libslic3r/PrintConfig.cpp:1720 src/libslic3r/PrintConfig.cpp:1721 msgid "Deretraction Speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1614 +#: src/libslic3r/PrintConfig.cpp:1722 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:1621 +#: src/libslic3r/PrintConfig.cpp:1729 msgid "Seam position" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1623 +#: src/libslic3r/PrintConfig.cpp:1731 msgid "Position of perimeters starting points." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1629 +#: src/libslic3r/PrintConfig.cpp:1737 msgid "Random" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1630 +#: src/libslic3r/PrintConfig.cpp:1738 msgid "Nearest" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1631 +#: src/libslic3r/PrintConfig.cpp:1739 msgid "Aligned" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1639 +#: src/libslic3r/PrintConfig.cpp:1747 msgid "Direction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1641 +#: src/libslic3r/PrintConfig.cpp:1749 msgid "Preferred direction of the seam" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1642 +#: src/libslic3r/PrintConfig.cpp:1750 msgid "Seam preferred direction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1649 +#: src/libslic3r/PrintConfig.cpp:1757 msgid "Jitter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1651 +#: src/libslic3r/PrintConfig.cpp:1759 msgid "Seam preferred direction jitter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1652 +#: src/libslic3r/PrintConfig.cpp:1760 msgid "Preferred direction of the seam - jitter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1662 +#: src/libslic3r/PrintConfig.cpp:1769 +msgid "Serial port" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1770 msgid "USB/serial port for printer connection." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1669 +#: src/libslic3r/PrintConfig.cpp:1777 msgid "Serial port speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1670 +#: src/libslic3r/PrintConfig.cpp:1778 msgid "Speed (baud) of USB/serial port for printer connection." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1679 +#: src/libslic3r/PrintConfig.cpp:1787 msgid "Distance from object" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1680 +#: src/libslic3r/PrintConfig.cpp:1788 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:1687 +#: src/libslic3r/PrintConfig.cpp:1795 msgid "Skirt height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1688 +#: src/libslic3r/PrintConfig.cpp:1796 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:1695 +#: src/libslic3r/PrintConfig.cpp:1803 msgid "Draft shield" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1696 +#: src/libslic3r/PrintConfig.cpp:1804 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:1702 +#: src/libslic3r/PrintConfig.cpp:1810 msgid "Loops (minimum)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1703 +#: src/libslic3r/PrintConfig.cpp:1811 msgid "Skirt Loops" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1704 +#: src/libslic3r/PrintConfig.cpp:1812 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:1712 +#: src/libslic3r/PrintConfig.cpp:1820 msgid "Slow down if layer print time is below" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1713 +#: src/libslic3r/PrintConfig.cpp:1821 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:1722 +#: src/libslic3r/PrintConfig.cpp:1830 msgid "Small perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1724 +#: src/libslic3r/PrintConfig.cpp:1832 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:1734 +#: src/libslic3r/PrintConfig.cpp:1842 msgid "Solid infill threshold area" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1736 +#: src/libslic3r/PrintConfig.cpp:1844 msgid "" "Force solid infill for regions having a smaller area than the specified " "threshold." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1737 +#: src/libslic3r/PrintConfig.cpp:1845 msgid "mm²" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1743 +#: src/libslic3r/PrintConfig.cpp:1851 msgid "Solid infill extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1745 +#: src/libslic3r/PrintConfig.cpp:1853 msgid "The extruder to use when printing solid infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1751 +#: src/libslic3r/PrintConfig.cpp:1859 msgid "Solid infill every" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1753 +#: src/libslic3r/PrintConfig.cpp:1861 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 " @@ -8494,7 +9753,7 @@ msgid "" "according to nozzle diameter and layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1765 +#: src/libslic3r/PrintConfig.cpp:1873 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, " @@ -8502,26 +9761,26 @@ msgid "" "(for example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1776 +#: src/libslic3r/PrintConfig.cpp:1884 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:1788 +#: src/libslic3r/PrintConfig.cpp:1896 msgid "Number of solid layers to generate on top and bottom surfaces." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1794 src/libslic3r/PrintConfig.cpp:1795 +#: src/libslic3r/PrintConfig.cpp:1902 src/libslic3r/PrintConfig.cpp:1903 msgid "Minimum thickness of a top / bottom shell" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1801 +#: src/libslic3r/PrintConfig.cpp:1909 msgid "Spiral vase" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1802 +#: src/libslic3r/PrintConfig.cpp:1910 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, " @@ -8530,18 +9789,18 @@ msgid "" "when printing more than an object." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1810 +#: src/libslic3r/PrintConfig.cpp:1918 msgid "Temperature variation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1811 +#: src/libslic3r/PrintConfig.cpp:1919 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:1821 +#: src/libslic3r/PrintConfig.cpp:1929 msgid "" "This start procedure is inserted at the beginning, after bed has reached the " "target temperature and extruder just started heating, and before extruder " @@ -8552,7 +9811,7 @@ msgid "" "put a \"M109 S[first_layer_temperature]\" command wherever you want." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1836 +#: src/libslic3r/PrintConfig.cpp:1944 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 " @@ -8565,29 +9824,45 @@ msgid "" "extruders, the gcode is processed in extruder order." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1852 +#: src/libslic3r/PrintConfig.cpp:1960 +msgid "Color change G-code" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1961 +msgid "This G-code will be used as a code for the color change" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1970 +msgid "This G-code will be used as a code for the pause print" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1979 +msgid "This G-code will be used as a custom code" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1987 msgid "Single Extruder Multi Material" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1853 +#: src/libslic3r/PrintConfig.cpp:1988 msgid "The printer multiplexes filaments into a single hot end." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1858 +#: src/libslic3r/PrintConfig.cpp:1993 msgid "Prime all printing extruders" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1859 +#: src/libslic3r/PrintConfig.cpp:1994 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:1864 +#: src/libslic3r/PrintConfig.cpp:1999 msgid "No sparse layers (EXPERIMENTAL)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1865 +#: src/libslic3r/PrintConfig.cpp:2000 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 " @@ -8595,75 +9870,75 @@ msgid "" "with the print." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1872 +#: src/libslic3r/PrintConfig.cpp:2007 msgid "Generate support material" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1874 +#: src/libslic3r/PrintConfig.cpp:2009 msgid "Enable support material generation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1878 +#: src/libslic3r/PrintConfig.cpp:2013 msgid "Auto generated supports" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1880 +#: src/libslic3r/PrintConfig.cpp:2015 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:1886 +#: src/libslic3r/PrintConfig.cpp:2021 msgid "XY separation between an object and its support" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1888 +#: src/libslic3r/PrintConfig.cpp:2023 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:1898 +#: src/libslic3r/PrintConfig.cpp:2033 msgid "Pattern angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1900 +#: src/libslic3r/PrintConfig.cpp:2035 msgid "" "Use this setting to rotate the support material pattern on the horizontal " "plane." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1910 src/libslic3r/PrintConfig.cpp:2693 +#: src/libslic3r/PrintConfig.cpp:2045 src/libslic3r/PrintConfig.cpp:2840 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1916 +#: src/libslic3r/PrintConfig.cpp:2051 msgid "Contact Z distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1918 +#: src/libslic3r/PrintConfig.cpp:2053 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:1925 +#: src/libslic3r/PrintConfig.cpp:2060 msgid "0 (soluble)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1926 +#: src/libslic3r/PrintConfig.cpp:2061 msgid "0.2 (detachable)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1931 +#: src/libslic3r/PrintConfig.cpp:2066 msgid "Enforce support for the first" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1933 +#: src/libslic3r/PrintConfig.cpp:2068 msgid "" "Generate support material for the specified number of layers counting from " "bottom, regardless of whether normal support material is enabled or not and " @@ -8671,21 +9946,21 @@ msgid "" "of objects having a very thin or poor footprint on the build plate." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1938 +#: src/libslic3r/PrintConfig.cpp:2073 msgid "Enforce support for the first n layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1944 +#: src/libslic3r/PrintConfig.cpp:2079 msgid "Support material/raft/skirt extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1946 +#: src/libslic3r/PrintConfig.cpp:2081 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:1955 +#: src/libslic3r/PrintConfig.cpp:2090 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, " @@ -8693,89 +9968,89 @@ msgid "" "example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1964 +#: src/libslic3r/PrintConfig.cpp:2099 msgid "Interface loops" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1966 +#: src/libslic3r/PrintConfig.cpp:2101 msgid "" "Cover the top contact layer of the supports with loops. Disabled by default." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1971 +#: src/libslic3r/PrintConfig.cpp:2106 msgid "Support material/raft interface extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1973 +#: src/libslic3r/PrintConfig.cpp:2108 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:1980 +#: src/libslic3r/PrintConfig.cpp:2115 msgid "Interface layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1982 +#: src/libslic3r/PrintConfig.cpp:2117 msgid "" "Number of interface layers to insert between the object(s) and support " "material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1989 +#: src/libslic3r/PrintConfig.cpp:2124 msgid "Interface pattern spacing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1991 +#: src/libslic3r/PrintConfig.cpp:2126 msgid "Spacing between interface lines. Set zero to get a solid interface." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2000 +#: src/libslic3r/PrintConfig.cpp:2135 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:2009 +#: src/libslic3r/PrintConfig.cpp:2144 msgid "Pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2011 +#: src/libslic3r/PrintConfig.cpp:2146 msgid "Pattern used to generate support material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2017 +#: src/libslic3r/PrintConfig.cpp:2152 msgid "Rectilinear grid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2023 +#: src/libslic3r/PrintConfig.cpp:2158 msgid "Pattern spacing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2025 +#: src/libslic3r/PrintConfig.cpp:2160 msgid "Spacing between support material lines." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2034 +#: src/libslic3r/PrintConfig.cpp:2169 msgid "Speed for printing support material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2041 +#: src/libslic3r/PrintConfig.cpp:2176 msgid "Synchronize with object layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2043 +#: src/libslic3r/PrintConfig.cpp:2178 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:2049 +#: src/libslic3r/PrintConfig.cpp:2184 msgid "Overhang threshold" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2051 +#: src/libslic3r/PrintConfig.cpp:2186 msgid "" "Support material will not be generated for overhangs whose slope angle (90° " "= vertical) is above the given threshold. In other words, this value " @@ -8784,43 +10059,47 @@ msgid "" "detection (recommended)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2063 +#: src/libslic3r/PrintConfig.cpp:2198 msgid "With sheath around the support" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2065 +#: src/libslic3r/PrintConfig.cpp:2200 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:2072 +#: src/libslic3r/PrintConfig.cpp:2207 msgid "" "Extruder temperature for layers after the first one. Set this to zero to " "disable temperature control commands in the output." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2080 +#: src/libslic3r/PrintConfig.cpp:2210 +msgid "Extruder temperature" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2216 msgid "Detect thin walls" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2082 +#: src/libslic3r/PrintConfig.cpp:2218 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:2088 +#: src/libslic3r/PrintConfig.cpp:2224 msgid "Threads" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2089 +#: src/libslic3r/PrintConfig.cpp:2225 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:2101 +#: src/libslic3r/PrintConfig.cpp:2237 msgid "" "This custom code is inserted before every toolchange. Placeholder variables " "for all PrusaSlicer settings as well as {previous_extruder} and " @@ -8830,7 +10109,7 @@ msgid "" "behaviour both before and after the toolchange." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2114 +#: src/libslic3r/PrintConfig.cpp:2250 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 " @@ -8839,7 +10118,7 @@ msgid "" "percentage (for example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2126 +#: src/libslic3r/PrintConfig.cpp:2262 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 " @@ -8848,54 +10127,54 @@ msgid "" "for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2141 +#: src/libslic3r/PrintConfig.cpp:2277 msgid "Number of solid layers to generate on top surfaces." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2142 +#: src/libslic3r/PrintConfig.cpp:2278 msgid "Top solid layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2150 +#: src/libslic3r/PrintConfig.cpp:2286 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:2153 +#: src/libslic3r/PrintConfig.cpp:2289 msgid "Minimum top shell thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2160 +#: src/libslic3r/PrintConfig.cpp:2296 msgid "Speed for travel moves (jumps between distant extrusion points)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2168 +#: src/libslic3r/PrintConfig.cpp:2304 msgid "Use firmware retraction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2169 +#: src/libslic3r/PrintConfig.cpp:2305 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:2175 +#: src/libslic3r/PrintConfig.cpp:2311 msgid "Use relative E distances" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2176 +#: src/libslic3r/PrintConfig.cpp:2312 msgid "" "If your firmware requires relative E values, check this, otherwise leave it " "unchecked. Most firmwares use absolute values." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2182 +#: src/libslic3r/PrintConfig.cpp:2318 msgid "Use volumetric E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2183 +#: src/libslic3r/PrintConfig.cpp:2319 msgid "" "This experimental setting uses outputs the E values in cubic millimeters " "instead of linear millimeters. If your firmware doesn't already know " @@ -8905,127 +10184,127 @@ msgid "" "only supported in recent Marlin." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2193 +#: src/libslic3r/PrintConfig.cpp:2329 msgid "Enable variable layer height feature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2194 +#: src/libslic3r/PrintConfig.cpp:2330 msgid "" "Some printers or printer setups may have difficulties printing with a " "variable layer height. Enabled by default." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2200 +#: src/libslic3r/PrintConfig.cpp:2336 msgid "Wipe while retracting" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2201 +#: src/libslic3r/PrintConfig.cpp:2337 msgid "" "This flag will move the nozzle while retracting to minimize the possible " "blob on leaky extruders." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2208 +#: src/libslic3r/PrintConfig.cpp:2344 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:2214 +#: src/libslic3r/PrintConfig.cpp:2350 msgid "Purging volumes - load/unload volumes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2215 +#: src/libslic3r/PrintConfig.cpp:2351 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:2221 +#: src/libslic3r/PrintConfig.cpp:2357 msgid "Purging volumes - matrix" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2222 +#: src/libslic3r/PrintConfig.cpp:2358 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:2231 +#: src/libslic3r/PrintConfig.cpp:2367 msgid "Position X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2232 +#: src/libslic3r/PrintConfig.cpp:2368 msgid "X coordinate of the left front corner of a wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2238 +#: src/libslic3r/PrintConfig.cpp:2374 msgid "Position Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2239 +#: src/libslic3r/PrintConfig.cpp:2375 msgid "Y coordinate of the left front corner of a wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2246 +#: src/libslic3r/PrintConfig.cpp:2382 msgid "Width of a wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2252 +#: src/libslic3r/PrintConfig.cpp:2388 msgid "Wipe tower rotation angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2253 +#: src/libslic3r/PrintConfig.cpp:2389 msgid "Wipe tower rotation angle with respect to x-axis." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2260 +#: src/libslic3r/PrintConfig.cpp:2396 msgid "Wipe into this object's infill" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2261 +#: src/libslic3r/PrintConfig.cpp:2397 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:2268 +#: src/libslic3r/PrintConfig.cpp:2404 msgid "Wipe into this object" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2269 +#: src/libslic3r/PrintConfig.cpp:2405 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:2275 +#: src/libslic3r/PrintConfig.cpp:2411 msgid "Maximal bridging distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2276 +#: src/libslic3r/PrintConfig.cpp:2412 msgid "Maximal distance between supports on sparse infill sections." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2282 +#: src/libslic3r/PrintConfig.cpp:2418 msgid "XY Size Compensation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2284 +#: src/libslic3r/PrintConfig.cpp:2420 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:2292 +#: src/libslic3r/PrintConfig.cpp:2428 msgid "Z offset" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2293 +#: src/libslic3r/PrintConfig.cpp:2429 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 " @@ -9033,408 +10312,414 @@ msgid "" "print bed, set this to -0.3 (or fix your endstop)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2360 +#: src/libslic3r/PrintConfig.cpp:2496 msgid "Display width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2361 +#: src/libslic3r/PrintConfig.cpp:2497 msgid "Width of the display" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2366 +#: src/libslic3r/PrintConfig.cpp:2502 msgid "Display height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2367 +#: src/libslic3r/PrintConfig.cpp:2503 msgid "Height of the display" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2372 +#: src/libslic3r/PrintConfig.cpp:2508 msgid "Number of pixels in" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2374 +#: src/libslic3r/PrintConfig.cpp:2510 msgid "Number of pixels in X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2380 +#: src/libslic3r/PrintConfig.cpp:2516 msgid "Number of pixels in Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2385 +#: src/libslic3r/PrintConfig.cpp:2521 msgid "Display horizontal mirroring" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2386 +#: src/libslic3r/PrintConfig.cpp:2522 msgid "Mirror horizontally" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2387 +#: src/libslic3r/PrintConfig.cpp:2523 msgid "Enable horizontal mirroring of output images" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2392 +#: src/libslic3r/PrintConfig.cpp:2528 msgid "Display vertical mirroring" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2393 +#: src/libslic3r/PrintConfig.cpp:2529 msgid "Mirror vertically" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2394 +#: src/libslic3r/PrintConfig.cpp:2530 msgid "Enable vertical mirroring of output images" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2399 +#: src/libslic3r/PrintConfig.cpp:2535 msgid "Display orientation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2400 +#: src/libslic3r/PrintConfig.cpp:2536 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:2406 +#: src/libslic3r/PrintConfig.cpp:2542 msgid "Landscape" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2407 +#: src/libslic3r/PrintConfig.cpp:2543 msgid "Portrait" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2412 +#: src/libslic3r/PrintConfig.cpp:2548 msgid "Fast" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2413 +#: src/libslic3r/PrintConfig.cpp:2549 msgid "Fast tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2414 +#: src/libslic3r/PrintConfig.cpp:2550 msgid "Time of the fast tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2421 +#: src/libslic3r/PrintConfig.cpp:2557 msgid "Slow" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2422 +#: src/libslic3r/PrintConfig.cpp:2558 msgid "Slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2423 +#: src/libslic3r/PrintConfig.cpp:2559 msgid "Time of the slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2430 +#: src/libslic3r/PrintConfig.cpp:2566 msgid "Area fill" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2431 +#: src/libslic3r/PrintConfig.cpp:2567 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:2438 src/libslic3r/PrintConfig.cpp:2439 -#: src/libslic3r/PrintConfig.cpp:2440 +#: src/libslic3r/PrintConfig.cpp:2574 src/libslic3r/PrintConfig.cpp:2575 +#: src/libslic3r/PrintConfig.cpp:2576 msgid "Printer scaling correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2446 src/libslic3r/PrintConfig.cpp:2447 +#: src/libslic3r/PrintConfig.cpp:2582 src/libslic3r/PrintConfig.cpp:2583 msgid "Printer absolute correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2448 +#: src/libslic3r/PrintConfig.cpp:2584 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2454 +#: src/libslic3r/PrintConfig.cpp:2590 msgid "Elephant foot minimum width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2456 +#: src/libslic3r/PrintConfig.cpp:2592 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2463 src/libslic3r/PrintConfig.cpp:2464 +#: src/libslic3r/PrintConfig.cpp:2599 src/libslic3r/PrintConfig.cpp:2600 msgid "Printer gamma correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2465 +#: src/libslic3r/PrintConfig.cpp:2601 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:2477 src/libslic3r/PrintConfig.cpp:2478 +#: src/libslic3r/PrintConfig.cpp:2613 src/libslic3r/PrintConfig.cpp:2614 msgid "SLA material type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2489 src/libslic3r/PrintConfig.cpp:2490 +#: src/libslic3r/PrintConfig.cpp:2625 src/libslic3r/PrintConfig.cpp:2626 msgid "Initial layer height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2496 src/libslic3r/PrintConfig.cpp:2497 +#: src/libslic3r/PrintConfig.cpp:2632 src/libslic3r/PrintConfig.cpp:2633 msgid "Bottle volume" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2498 +#: src/libslic3r/PrintConfig.cpp:2634 msgid "ml" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2503 src/libslic3r/PrintConfig.cpp:2504 +#: src/libslic3r/PrintConfig.cpp:2639 src/libslic3r/PrintConfig.cpp:2640 msgid "Bottle weight" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2505 +#: src/libslic3r/PrintConfig.cpp:2641 msgid "kg" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2512 +#: src/libslic3r/PrintConfig.cpp:2648 msgid "g/ml" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2519 +#: src/libslic3r/PrintConfig.cpp:2655 msgid "money/bottle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2524 +#: src/libslic3r/PrintConfig.cpp:2660 msgid "Faded layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2525 +#: src/libslic3r/PrintConfig.cpp:2661 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2532 src/libslic3r/PrintConfig.cpp:2533 +#: src/libslic3r/PrintConfig.cpp:2668 src/libslic3r/PrintConfig.cpp:2669 msgid "Minimum exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2540 src/libslic3r/PrintConfig.cpp:2541 +#: src/libslic3r/PrintConfig.cpp:2676 src/libslic3r/PrintConfig.cpp:2677 msgid "Maximum exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2548 src/libslic3r/PrintConfig.cpp:2549 +#: src/libslic3r/PrintConfig.cpp:2684 src/libslic3r/PrintConfig.cpp:2685 msgid "Exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2555 src/libslic3r/PrintConfig.cpp:2556 +#: src/libslic3r/PrintConfig.cpp:2691 src/libslic3r/PrintConfig.cpp:2692 msgid "Minimum initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2563 src/libslic3r/PrintConfig.cpp:2564 +#: src/libslic3r/PrintConfig.cpp:2699 src/libslic3r/PrintConfig.cpp:2700 msgid "Maximum initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2571 src/libslic3r/PrintConfig.cpp:2572 +#: src/libslic3r/PrintConfig.cpp:2707 src/libslic3r/PrintConfig.cpp:2708 msgid "Initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2578 src/libslic3r/PrintConfig.cpp:2579 +#: src/libslic3r/PrintConfig.cpp:2714 src/libslic3r/PrintConfig.cpp:2715 msgid "Correction for expansion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2585 +#: src/libslic3r/PrintConfig.cpp:2721 msgid "SLA print material notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2586 +#: src/libslic3r/PrintConfig.cpp:2722 msgid "You can put your notes regarding the SLA print material here." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2598 src/libslic3r/PrintConfig.cpp:2609 +#: src/libslic3r/PrintConfig.cpp:2734 src/libslic3r/PrintConfig.cpp:2745 msgid "Default SLA material profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2620 +#: src/libslic3r/PrintConfig.cpp:2756 msgid "Generate supports" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2622 +#: src/libslic3r/PrintConfig.cpp:2758 msgid "Generate supports for the models" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2627 -msgid "Support head front diameter" +#: src/libslic3r/PrintConfig.cpp:2763 +msgid "Pinhead front diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2629 +#: src/libslic3r/PrintConfig.cpp:2765 msgid "Diameter of the pointing side of the head" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2636 -msgid "Support head penetration" +#: src/libslic3r/PrintConfig.cpp:2772 +msgid "Head penetration" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2638 +#: src/libslic3r/PrintConfig.cpp:2774 msgid "How much the pinhead has to penetrate the model surface" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2645 -msgid "Support head width" +#: src/libslic3r/PrintConfig.cpp:2781 +msgid "Pinhead width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2647 +#: src/libslic3r/PrintConfig.cpp:2783 msgid "Width from the back sphere center to the front sphere center" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2655 -msgid "Support pillar diameter" +#: src/libslic3r/PrintConfig.cpp:2791 +msgid "Pillar diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2657 +#: src/libslic3r/PrintConfig.cpp:2793 msgid "Diameter in mm of the support pillars" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2665 +#: src/libslic3r/PrintConfig.cpp:2801 +msgid "Small pillar diameter percent" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2803 +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:2812 msgid "Max bridges on a pillar" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2667 +#: src/libslic3r/PrintConfig.cpp:2814 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:2675 -msgid "Support pillar connection mode" +#: src/libslic3r/PrintConfig.cpp:2822 +msgid "Pillar connection mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2676 +#: src/libslic3r/PrintConfig.cpp:2823 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:2684 +#: src/libslic3r/PrintConfig.cpp:2831 msgid "Zig-Zag" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2685 +#: src/libslic3r/PrintConfig.cpp:2832 msgid "Cross" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2686 +#: src/libslic3r/PrintConfig.cpp:2833 msgid "Dynamic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2698 +#: src/libslic3r/PrintConfig.cpp:2845 msgid "Pillar widening factor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2700 +#: src/libslic3r/PrintConfig.cpp:2847 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:2709 +#: src/libslic3r/PrintConfig.cpp:2856 msgid "Support base diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2711 +#: src/libslic3r/PrintConfig.cpp:2858 msgid "Diameter in mm of the pillar base" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2719 +#: src/libslic3r/PrintConfig.cpp:2866 msgid "Support base height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2721 +#: src/libslic3r/PrintConfig.cpp:2868 msgid "The height of the pillar base cone" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2728 +#: src/libslic3r/PrintConfig.cpp:2875 msgid "Support base safety distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2731 +#: src/libslic3r/PrintConfig.cpp:2878 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:2741 +#: src/libslic3r/PrintConfig.cpp:2888 msgid "Critical angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2743 +#: src/libslic3r/PrintConfig.cpp:2890 msgid "The default angle for connecting support sticks and junctions." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2751 +#: src/libslic3r/PrintConfig.cpp:2898 msgid "Max bridge length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2753 +#: src/libslic3r/PrintConfig.cpp:2900 msgid "The max length of a bridge" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2760 +#: src/libslic3r/PrintConfig.cpp:2907 msgid "Max pillar linking distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2762 +#: src/libslic3r/PrintConfig.cpp:2909 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:2770 -msgid "Object elevation" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:2772 +#: src/libslic3r/PrintConfig.cpp:2919 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:2783 +#: src/libslic3r/PrintConfig.cpp:2930 msgid "This is a relative measure of support points density." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2789 +#: src/libslic3r/PrintConfig.cpp:2936 msgid "Minimal distance of the support points" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2791 +#: src/libslic3r/PrintConfig.cpp:2938 msgid "No support points will be placed closer than this threshold." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2797 +#: src/libslic3r/PrintConfig.cpp:2944 msgid "Use pad" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2799 +#: src/libslic3r/PrintConfig.cpp:2946 msgid "Add a pad underneath the supported model" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2804 +#: src/libslic3r/PrintConfig.cpp:2951 msgid "Pad wall thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2806 +#: src/libslic3r/PrintConfig.cpp:2953 msgid "The thickness of the pad and its optional cavity walls." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2814 +#: src/libslic3r/PrintConfig.cpp:2961 msgid "Pad wall height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2815 +#: src/libslic3r/PrintConfig.cpp:2962 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 " @@ -9442,115 +10727,107 @@ msgid "" "difficult." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2828 +#: src/libslic3r/PrintConfig.cpp:2975 msgid "Pad brim size" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2829 +#: src/libslic3r/PrintConfig.cpp:2976 msgid "How far should the pad extend around the contained geometry" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2839 +#: src/libslic3r/PrintConfig.cpp:2986 msgid "Max merge distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2841 +#: src/libslic3r/PrintConfig.cpp:2988 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:2861 +#: src/libslic3r/PrintConfig.cpp:3008 msgid "Pad wall slope" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2863 +#: src/libslic3r/PrintConfig.cpp:3010 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2872 -msgid "Pad around object" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:2874 +#: src/libslic3r/PrintConfig.cpp:3021 msgid "Create pad around object and ignore the support elevation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2879 +#: src/libslic3r/PrintConfig.cpp:3026 msgid "Pad around object everywhere" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2881 +#: src/libslic3r/PrintConfig.cpp:3028 msgid "Force pad around object everywhere" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2886 +#: src/libslic3r/PrintConfig.cpp:3033 msgid "Pad object gap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2888 +#: src/libslic3r/PrintConfig.cpp:3035 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2897 +#: src/libslic3r/PrintConfig.cpp:3044 msgid "Pad object connector stride" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2899 +#: src/libslic3r/PrintConfig.cpp:3046 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2906 +#: src/libslic3r/PrintConfig.cpp:3053 msgid "Pad object connector width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2908 +#: src/libslic3r/PrintConfig.cpp:3055 msgid "" "Width of the connector sticks which connect the object and the generated pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2915 +#: src/libslic3r/PrintConfig.cpp:3062 msgid "Pad object connector penetration" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2918 +#: src/libslic3r/PrintConfig.cpp:3065 msgid "How much should the tiny connectors penetrate into the model body." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2925 +#: src/libslic3r/PrintConfig.cpp:3072 msgid "Enable hollowing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2927 +#: src/libslic3r/PrintConfig.cpp:3074 msgid "Hollow out a model to have an empty interior" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2932 +#: src/libslic3r/PrintConfig.cpp:3079 msgid "Wall thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2934 +#: src/libslic3r/PrintConfig.cpp:3081 msgid "Minimum wall thickness of a hollowed model." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2942 -msgid "Accuracy" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:2944 +#: src/libslic3r/PrintConfig.cpp:3091 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2954 +#: src/libslic3r/PrintConfig.cpp:3101 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 " @@ -9559,292 +10836,287 @@ msgid "" "most." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3342 +#: src/libslic3r/PrintConfig.cpp:3513 msgid "Export OBJ" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3343 +#: src/libslic3r/PrintConfig.cpp:3514 msgid "Export the model(s) as OBJ." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3354 +#: src/libslic3r/PrintConfig.cpp:3525 msgid "Export SLA" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3355 +#: src/libslic3r/PrintConfig.cpp:3526 msgid "Slice the model and export SLA printing layers as PNG." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3360 +#: src/libslic3r/PrintConfig.cpp:3531 msgid "Export 3MF" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3361 +#: src/libslic3r/PrintConfig.cpp:3532 msgid "Export the model(s) as 3MF." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3365 +#: src/libslic3r/PrintConfig.cpp:3536 msgid "Export AMF" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3366 +#: src/libslic3r/PrintConfig.cpp:3537 msgid "Export the model(s) as AMF." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3370 +#: src/libslic3r/PrintConfig.cpp:3541 msgid "Export STL" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3371 +#: src/libslic3r/PrintConfig.cpp:3542 msgid "Export the model(s) as STL." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3376 +#: src/libslic3r/PrintConfig.cpp:3547 msgid "Slice the model and export toolpaths as G-code." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3381 +#: src/libslic3r/PrintConfig.cpp:3552 +msgid "G-code viewer" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3553 +msgid "Visualize an already sliced and saved G-code" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3558 msgid "Slice" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3382 +#: src/libslic3r/PrintConfig.cpp:3559 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3387 +#: src/libslic3r/PrintConfig.cpp:3564 msgid "Help" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3388 +#: src/libslic3r/PrintConfig.cpp:3565 msgid "Show this help." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3393 +#: src/libslic3r/PrintConfig.cpp:3570 msgid "Help (FFF options)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3394 +#: src/libslic3r/PrintConfig.cpp:3571 msgid "Show the full list of print/G-code configuration options." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3398 +#: src/libslic3r/PrintConfig.cpp:3575 msgid "Help (SLA options)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3399 +#: src/libslic3r/PrintConfig.cpp:3576 msgid "Show the full list of SLA print configuration options." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3403 +#: src/libslic3r/PrintConfig.cpp:3580 msgid "Output Model Info" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3404 +#: src/libslic3r/PrintConfig.cpp:3581 msgid "Write information about the model to the console." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3408 +#: src/libslic3r/PrintConfig.cpp:3585 msgid "Save config file" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3409 +#: src/libslic3r/PrintConfig.cpp:3586 msgid "Save configuration to the specified file." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3419 +#: src/libslic3r/PrintConfig.cpp:3596 msgid "Align XY" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3420 +#: src/libslic3r/PrintConfig.cpp:3597 msgid "Align the model to the given point." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3425 +#: src/libslic3r/PrintConfig.cpp:3602 msgid "Cut model at the given Z." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3446 +#: src/libslic3r/PrintConfig.cpp:3623 msgid "Center" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3447 +#: src/libslic3r/PrintConfig.cpp:3624 msgid "Center the print around the given center." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3451 +#: src/libslic3r/PrintConfig.cpp:3628 msgid "Don't arrange" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3452 +#: src/libslic3r/PrintConfig.cpp:3629 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3455 +#: src/libslic3r/PrintConfig.cpp:3632 msgid "Duplicate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3456 +#: src/libslic3r/PrintConfig.cpp:3633 msgid "Multiply copies by this factor." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3460 +#: src/libslic3r/PrintConfig.cpp:3637 msgid "Duplicate by grid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3461 +#: src/libslic3r/PrintConfig.cpp:3638 msgid "Multiply copies by creating a grid." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3464 -msgid "Merge" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3465 +#: src/libslic3r/PrintConfig.cpp:3642 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:3470 +#: src/libslic3r/PrintConfig.cpp:3647 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:3474 +#: src/libslic3r/PrintConfig.cpp:3651 msgid "Rotation angle around the Z axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3478 +#: src/libslic3r/PrintConfig.cpp:3655 msgid "Rotate around X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3479 +#: src/libslic3r/PrintConfig.cpp:3656 msgid "Rotation angle around the X axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3483 +#: src/libslic3r/PrintConfig.cpp:3660 msgid "Rotate around Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3484 +#: src/libslic3r/PrintConfig.cpp:3661 msgid "Rotation angle around the Y axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3489 +#: src/libslic3r/PrintConfig.cpp:3666 msgid "Scaling factor or percentage." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3494 +#: src/libslic3r/PrintConfig.cpp:3671 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3497 +#: src/libslic3r/PrintConfig.cpp:3674 msgid "Scale to Fit" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3498 +#: src/libslic3r/PrintConfig.cpp:3675 msgid "Scale to fit the given volume." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3507 +#: src/libslic3r/PrintConfig.cpp:3684 msgid "Ignore non-existent config files" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3508 +#: src/libslic3r/PrintConfig.cpp:3685 msgid "Do not fail if a file supplied to --load does not exist." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3511 +#: src/libslic3r/PrintConfig.cpp:3688 msgid "Load config file" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3512 +#: src/libslic3r/PrintConfig.cpp:3689 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:3515 +#: src/libslic3r/PrintConfig.cpp:3692 msgid "Output File" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3516 +#: src/libslic3r/PrintConfig.cpp:3693 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:3526 +#: src/libslic3r/PrintConfig.cpp:3698 +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:3709 msgid "Data directory" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3527 +#: src/libslic3r/PrintConfig.cpp:3710 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:3530 +#: src/libslic3r/PrintConfig.cpp:3713 msgid "Logging level" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3531 +#: src/libslic3r/PrintConfig.cpp:3714 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:3537 +#: src/libslic3r/PrintConfig.cpp:3720 msgid "Render with a software renderer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3538 +#: src/libslic3r/PrintConfig.cpp:3721 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." msgstr "" -#: src/libslic3r/PrintObject.cpp:108 +#: src/libslic3r/Zipper.cpp:27 +msgid "Error with zip archive" +msgstr "" + +#: src/libslic3r/PrintObject.cpp:114 msgid "Processing triangulated mesh" msgstr "" -#: src/libslic3r/PrintObject.cpp:152 +#: src/libslic3r/PrintObject.cpp:158 msgid "Generating perimeters" msgstr "" -#: src/libslic3r/PrintObject.cpp:255 +#: src/libslic3r/PrintObject.cpp:261 msgid "Preparing infill" msgstr "" -#: src/libslic3r/PrintObject.cpp:395 +#: src/libslic3r/PrintObject.cpp:422 msgid "Generating support material" msgstr "" - -#: src/libslic3r/GCode/PreviewData.cpp:348 -msgid "Height (mm)" -msgstr "" - -#: src/libslic3r/GCode/PreviewData.cpp:350 -msgid "Width (mm)" -msgstr "" - -#: src/libslic3r/GCode/PreviewData.cpp:352 -msgid "Speed (mm/s)" -msgstr "" - -#: src/libslic3r/GCode/PreviewData.cpp:354 -msgid "Fan Speed (%)" -msgstr "" - -#: src/libslic3r/GCode/PreviewData.cpp:356 -msgid "Volumetric flow rate (mm³/s)" -msgstr "" diff --git a/resources/localization/list.txt b/resources/localization/list.txt index 3c2a956385..6950dc7098 100644 --- a/resources/localization/list.txt +++ b/resources/localization/list.txt @@ -1,5 +1,4 @@ src/slic3r/GUI/AboutDialog.cpp -src/slic3r/GUI/AppConfig.cpp src/slic3r/GUI/BackgroundSlicingProcess.cpp src/slic3r/GUI/BedShapeDialog.cpp src/slic3r/GUI/BedShapeDialog.hpp @@ -9,45 +8,60 @@ src/slic3r/GUI/ConfigManipulation.cpp src/slic3r/GUI/ConfigSnapshotDialog.cpp src/slic3r/GUI/ConfigWizard.cpp src/slic3r/GUI/DoubleSlider.cpp +src/slic3r/GUI/ExtraRenderers.cpp src/slic3r/GUI/ExtruderSequenceDialog.cpp src/slic3r/GUI/Field.cpp src/slic3r/GUI/FirmwareDialog.cpp +src/slic3r/GUI/GCodeViewer.cpp src/slic3r/GUI/GLCanvas3D.cpp -src/slic3r/GUI/GLCanvas3DManager.cpp src/slic3r/GUI/Gizmos/GLGizmoCut.cpp +src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp src/slic3r/GUI/Gizmos/GLGizmoMove.cpp src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp src/slic3r/GUI/Gizmos/GLGizmoScale.cpp +src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp src/slic3r/GUI/GUI.cpp src/slic3r/GUI/GUI_App.cpp +src/slic3r/GUI/GUI_Init.cpp src/slic3r/GUI/GUI_ObjectLayers.cpp src/slic3r/GUI/GUI_ObjectList.cpp src/slic3r/GUI/GUI_ObjectManipulation.cpp src/slic3r/GUI/GUI_ObjectSettings.cpp src/slic3r/GUI/GUI_Preview.cpp -src/slic3r/GUI/Job.hpp +src/slic3r/GUI/ImGuiWrapper.cpp +src/slic3r/GUI/Jobs/ArrangeJob.cpp +src/slic3r/GUI/Jobs/Job.cpp +src/slic3r/GUI/Jobs/RotoptimizeJob.cpp +src/slic3r/GUI/Jobs/SLAImportJob.cpp src/slic3r/GUI/KBShortcutsDialog.cpp src/slic3r/GUI/MainFrame.cpp src/slic3r/GUI/Mouse3DController.cpp src/slic3r/GUI/MsgDialog.cpp +src/slic3r/GUI/NotificationManager.hpp +src/slic3r/GUI/NotificationManager.cpp src/slic3r/GUI/ObjectDataViewModel.cpp +src/slic3r/GUI/OpenGLManager.cpp src/slic3r/GUI/OptionsGroup.cpp +src/slic3r/GUI/PhysicalPrinterDialog.cpp src/slic3r/GUI/Plater.cpp src/slic3r/GUI/Preferences.cpp -src/slic3r/GUI/Preset.cpp -src/slic3r/GUI/PresetBundle.cpp +src/slic3r/GUI/PresetComboBoxes.cpp src/slic3r/GUI/PresetHints.cpp src/slic3r/GUI/PrintHostDialogs.cpp src/slic3r/GUI/ProgressStatusBar.cpp src/slic3r/GUI/RammingChart.cpp +src/slic3r/GUI/SavePresetDialog.cpp +src/slic3r/GUI/Search.cpp src/slic3r/GUI/Selection.cpp src/slic3r/GUI/SysInfoDialog.cpp src/slic3r/GUI/Tab.cpp src/slic3r/GUI/Tab.hpp +src/slic3r/GUI/UnsavedChangesDialog.cpp src/slic3r/GUI/UpdateDialogs.cpp src/slic3r/GUI/WipeTowerDialog.cpp src/slic3r/GUI/wxExtensions.cpp @@ -57,18 +71,22 @@ src/slic3r/Utils/FixModelByWin10.cpp src/slic3r/Utils/FlashAir.cpp src/slic3r/Utils/OctoPrint.cpp src/slic3r/Utils/PresetUpdater.cpp -src/libslic3r/SLA/Pad.cpp -src/libslic3r/SLA/Hollowing.cpp -src/libslic3r/Zipper.cpp +src/slic3r/Utils/Http.cpp +src/slic3r/Utils/Process.cpp src/libslic3r/GCode.cpp src/libslic3r/ExtrusionEntity.cpp src/libslic3r/Flow.cpp src/libslic3r/Format/3mf.cpp src/libslic3r/Format/AMF.cpp +src/libslic3r/GCode/PreviewData.cpp +src/libslic3r/miniz_extension.cpp +src/libslic3r/Preset.cpp src/libslic3r/Print.cpp +src/libslic3r/SLA/Pad.cpp +src/libslic3r/SLA/Hollowing.cpp src/libslic3r/SLAPrint.cpp src/libslic3r/SLAPrintSteps.cpp src/libslic3r/PrintBase.cpp src/libslic3r/PrintConfig.cpp +src/libslic3r/Zipper.cpp src/libslic3r/PrintObject.cpp -src/libslic3r/GCode/PreviewData.cpp diff --git a/resources/profiles/Anycubic.idx b/resources/profiles/Anycubic.idx index 01a6c8f7e9..d55dbb5f66 100644 --- a/resources/profiles/Anycubic.idx +++ b/resources/profiles/Anycubic.idx @@ -1,2 +1,4 @@ +min_slic3r_version = 2.3.0-alpha2 +0.0.2 Added Anycubic Predator min_slic3r_version = 2.3.0-alpha0 0.0.1 Initial Version diff --git a/resources/profiles/Anycubic.ini b/resources/profiles/Anycubic.ini index a51e6b6d8e..0f231f9680 100644 --- a/resources/profiles/Anycubic.ini +++ b/resources/profiles/Anycubic.ini @@ -5,10 +5,10 @@ name = Anycubic # 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.1 +config_version = 0.0.2 # Where to get the updates from? -config_update_url = http://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Anycubic/ -# changelog_url = http://files.prusa3d.com/?latest=slicer-profiles&lng=%1% +config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Anycubic/ +# changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1% # The printer models will be shown by the Configuration Wizard in this order, # also the first model installed & the first nozzle installed will be activated after install. @@ -53,6 +53,13 @@ variants = 0.4 technology = FFF family = MEGA +[printer_model:PREDATOR] +name = Anycubic Predator +variants = 0.4; 0.6; 0.8 +technology = FFF +family = PREDATOR +default_materials = Generic PLA @PREDATOR; Generic PETG @PREDATOR; Generic ABS @PREDATOR + # All presets starting with asterisk, for example *common*, are intermediate and they will # not make it into the user interface. @@ -398,8 +405,6 @@ max_layer_height = 0.3 min_layer_height = 0.08 max_print_height = 300 nozzle_diameter = 0.4 -octoprint_apikey = -octoprint_host = printer_notes = printer_settings_id = retract_before_travel = 2 @@ -413,8 +418,6 @@ retract_lift_below = 0 retract_restart_extra = 0 retract_restart_extra_toolchange = 0 retract_speed = 60 -serial_port = -serial_speed = 250000 single_extruder_multi_material = 0 start_gcode = end_gcode = M104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+10, max_print_height)} F600{endif} ; Move print head up\nG1 X0 Y100 F3000 ; present print\nM84 ; disable motors @@ -748,8 +751,6 @@ max_layer_height = 0.3 min_layer_height = 0.1 max_print_height = 200 nozzle_diameter = 0.4 -octoprint_apikey = -octoprint_host = printer_notes = printer_settings_id = retract_before_travel = 1 @@ -763,8 +764,6 @@ retract_lift_below = 0 retract_restart_extra = 0 retract_restart_extra_toolchange = 0 retract_speed = 30 -serial_port = -serial_speed = 115200 single_extruder_multi_material = 0 start_gcode = G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nM117 Homing X/Y ...\nG28 X0 Y0 ;move X/Y to min endstops\nM117 Homing Z ...\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F240 ;move the platform down 15mm\nM117 Heating ...\nM104 S[first_layer_temperature]\n ; 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]\n ; wait for extruder temp\nM117 Start cleaning ...\nG92 E0 ;zero the extruded length\nG1 F200 E10 ;extrude 10mm of feed stock\nG92 E0 ;zero the extruded length again\nM117 Intro line ...\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\nG1 X0.1 Y20 Z[first_layer_height] F5000.0 ; Move to start position\nG1 X0.1 Y200.0 Z[first_layer_height] F1500.0 E15 ; Draw the first line\nG1 X0.4 Y200.0 Z[first_layer_height] F5000.0 ; Move to side a little\nG1 X0.4 Y20 Z0.3[first_layer_height] F1500.0 E30 ; Draw the second line\nG92 E0 ; Reset Extruder\nG1 E-1 F500 ; Retract filiment by 1 mm\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\nG1 X5 Y20 Z0.3 F240 ; Move over to prevent blob squish\nG92 E0 ; Reset Extruder\nM117 Printing...\n end_gcode = M117 Cooling down...\nM104 S0 ; turn off extruder\nM140 S0 ; turn off heatbed\nM107 ; Fan off\nM84 ; disable motors\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 ;X-20 Y-20 F240 ;move Z up a bit and retract filament even more\nG28 X0 ;move X to min endstops, so the head is out of the way\nG90 ;Absolute positionning\nG1 Y200 F3000 ;Present print\nM84 ;steppers off\nM300 P300 S4000\nM117 Finished.\n @@ -840,6 +839,7 @@ first_layer_acceleration = 1800 first_layer_extrusion_width = 0.42 first_layer_height = 0.2 gap_fill_speed = 40 +gcode_comments = 1 infill_acceleration = 1800 infill_extrusion_width = 0.45 infill_speed = 60 @@ -1066,20 +1066,19 @@ silent_mode = 0 start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM204 S[machine_max_acceleration_extruding] T[machine_max_acceleration_retracting]\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nG28 ; home all\nG1 Y0 Z1 F100 ; move print head up\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG92 E0\nG1 E38 F1000; deretract filament\nG92 E0\nG1 X60 Z0 E9 ; intro line\nG1 X100 E12.5 ; intro line\nG92 E0 use_relative_e_distances = 1 wipe = 1 -## Based on stock firmware limits -machine_max_acceleration_e = 10000 -machine_max_acceleration_extruding = 1500 -machine_max_acceleration_retracting = 1500 -machine_max_acceleration_x = 3000 -machine_max_acceleration_y = 2000 -machine_max_acceleration_z = 60 +machine_max_acceleration_e = 5000 +machine_max_acceleration_extruding = 1250 +machine_max_acceleration_retracting = 1250 +machine_max_acceleration_x = 1000 +machine_max_acceleration_y = 1000 +machine_max_acceleration_z = 200 machine_max_feedrate_e = 60 -machine_max_feedrate_x = 500 -machine_max_feedrate_y = 500 +machine_max_feedrate_x = 200 +machine_max_feedrate_y = 200 machine_max_feedrate_z = 6 machine_max_jerk_e = 5 -machine_max_jerk_x = 10 -machine_max_jerk_y = 10 +machine_max_jerk_x = 8 +machine_max_jerk_y = 8 machine_max_jerk_z = 0.4 [printer:Anycubic i3 Mega] @@ -1096,3 +1095,682 @@ printer_notes = Do not remove the following keywords! These keywords are used in machine_max_feedrate_z = 8 +## Anycubic PREDATOR +## Author: https://github.com/tillverka3d +## Initial PR: https://github.com/prusa3d/PrusaSlicer/pull/4960 + +######################################### +###### begin common print presets ####### +######################################### + +# Common print preset +[print:*common predator*] +spiral_vase = 0 +top_solid_min_thickness = 0.8 +bottom_solid_min_thickness = 0.6 +extra_perimeters = 0 +ensure_vertical_shell_thickness = 1 +avoid_crossing_perimeters = 0 +thin_walls = 0 +overhangs = 1 +seam_position = nearest +external_perimeters_first = 0 +fill_density = 20% +external_fill_pattern = rectilinear +infill_every_layers = 1 +infill_only_where_needed = 0 +solid_infill_every_layers = 0 +fill_angle = 45 +solid_infill_below_area = 20 +bridge_angle = 0 +only_retract_when_crossing_perimeters = 0 +infill_first = 0 +skirts = 1 +skirt_distance = 4 +skirt_height = 1 +min_skirt_length = 8 +brim_width = 0 +support_material = 0 +support_material_auto = 1 +support_material_threshold = 50 +support_material_enforce_layers = 0 +raft_layers = 0 +support_material_contact_distance = 0.1 +support_material_pattern = rectilinear +support_material_with_sheath = 0 +support_material_spacing = 2 +support_material_angle = 0 +support_material_interface_layers = 2 +support_material_interface_spacing = 0.2 +support_material_interface_contact_loops = 0 +support_material_buildplate_only = 0 +support_material_xy_spacing = 60% +dont_support_bridges = 1 +support_material_synchronize_layers = 0 +travel_speed = 94 +first_layer_speed = 15 +perimeter_acceleration = 300 +infill_acceleration = 200 +bridge_acceleration = 300 +first_layer_acceleration = 300 +default_acceleration = 300 +max_volumetric_speed = 15 +perimeter_extruder = 1 +infill_extruder = 1 +solid_infill_extruder = 1 +support_material_extruder = 0 +support_material_interface_extruder = 0 +ooze_prevention = 0 +standby_temperature_delta = -5 +wipe_tower = 0 +wipe_tower_x = 170 +wipe_tower_y = 140 +wipe_tower_width = 60 +wipe_tower_rotation_angle = 0 +wipe_tower_bridging = 10 +interface_shells = 0 +infill_overlap = 20% +bridge_flow_ratio = 0.8 +resolution = 0 +xy_size_compensation = 0 +elefant_foot_compensation = 0.2 +clip_multipart_objects = 1 +complete_objects = 0 +extruder_clearance_radius = 45 +extruder_clearance_height = 25 +gcode_comments = 0 +output_filename_format = {input_filename_base}_{print_preset}_{filament_type[0]}_{printer_model}_{print_time}.gcode +post_process = +notes = +max_volumetric_extrusion_rate_slope_negative = 0 +max_volumetric_extrusion_rate_slope_positive = 0 +print_settings_id = + +# Common print preset +[print:*common predator 0.4 nozzle*] +inherits = *common predator* +first_layer_height = 0.16 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_ANYCUBIC.*/ and printer_notes=~/.*PRINTER_MODEL_PREDATOR.*/ and printer_notes=~/.*PRINTER_HAS_BOWDEN.*/ and nozzle_diameter[0]==0.4 + +# Common print preset +[print:*common predator 0.6 nozzle*] +inherits = *common predator* +first_layer_height = 0.24 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_ANYCUBIC.*/ and printer_notes=~/.*PRINTER_MODEL_PREDATOR.*/ and printer_notes=~/.*PRINTER_HAS_BOWDEN.*/ and nozzle_diameter[0]==0.6 + +# Common print preset +[print:*common predator 0.8 nozzle*] +inherits = *common predator* +first_layer_height = 0.32 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_ANYCUBIC.*/ and printer_notes=~/.*PRINTER_MODEL_PREDATOR.*/ and printer_notes=~/.*PRINTER_HAS_BOWDEN.*/ and nozzle_diameter[0]==0.8 + +# Common print preset +[print:*common predator quality*] +perimeter_speed = 50 +small_perimeter_speed = 15 +external_perimeter_speed = 70% +infill_speed = 65 +solid_infill_speed = 85% +top_solid_infill_speed = 85% +support_material_speed = 30 +support_material_interface_speed = 85% +bridge_speed = 30 +gap_fill_speed = 40 +ironing_speed = 15 + +# Common print preset +[print:*common predator speed*] +perimeter_speed = 70 +small_perimeter_speed = 15 +external_perimeter_speed = 70% +infill_speed = 85 +solid_infill_speed = 85% +top_solid_infill_speed = 85% +support_material_speed = 30 +support_material_interface_speed = 85% +bridge_speed = 30 +gap_fill_speed = 40 +ironing_speed = 15 + +# Common print preset +[print:*common predator 0.4 nozzle detailed*] +inherits = *common predator 0.4 nozzle* +extrusion_width = 0.42 +first_layer_extrusion_width = 0.41 +perimeter_extrusion_width = 0.42 +external_perimeter_extrusion_width = 0.42 +infill_extrusion_width = 0.4 +solid_infill_extrusion_width = 0.4 +top_infill_extrusion_width = 0.4 +support_material_extrusion_width = 0.38 + +# Common print preset +[print:*common predator 0.4 nozzle coarse*] +inherits = *common predator 0.4 nozzle* +extrusion_width = 0.44 +first_layer_extrusion_width = 0.42 +perimeter_extrusion_width = 0.5 +external_perimeter_extrusion_width = 0.5 +infill_extrusion_width = 0.5 +solid_infill_extrusion_width = 0.5 +top_infill_extrusion_width = 0.4 +support_material_extrusion_width = 0.38 + +# Common print preset +[print:*common predator 0.6 nozzle detailed*] +inherits = *common predator 0.6 nozzle* +extrusion_width = 0.64 +first_layer_extrusion_width = 0.62 +perimeter_extrusion_width = 0.64 +external_perimeter_extrusion_width = 0.64 +infill_extrusion_width = 0.6 +solid_infill_extrusion_width = 0.6 +top_infill_extrusion_width = 0.6 +support_material_extrusion_width = 0.56 + +# Common print preset +[print:*common predator 0.6 nozzle coarse*] +inherits = *common predator 0.6 nozzle* +extrusion_width = 0.67 +first_layer_extrusion_width = 0.64 +perimeter_extrusion_width = 0.7 +external_perimeter_extrusion_width = 0.7 +infill_extrusion_width = 0.7 +solid_infill_extrusion_width = 0.7 +top_infill_extrusion_width = 0.6 +support_material_extrusion_width = 0.56 + +# Common print preset +[print:*common predator 0.8 nozzle detailed*] +inherits = *common predator 0.8 nozzle* +extrusion_width = 0.84 +first_layer_extrusion_width = 0.82 +perimeter_extrusion_width = 0.84 +external_perimeter_extrusion_width = 0.84 +infill_extrusion_width = 0.8 +solid_infill_extrusion_width = 0.8 +top_infill_extrusion_width = 0.8 +support_material_extrusion_width = 0.72 + +# Common print preset +[print:*common predator 0.8 nozzle coarse*] +inherits = *common predator 0.8 nozzle* +extrusion_width = 0.87 +first_layer_extrusion_width = 0.84 +perimeter_extrusion_width = 0.9 +external_perimeter_extrusion_width = 0.9 +infill_extrusion_width = 0.9 +solid_infill_extrusion_width = 0.9 +top_infill_extrusion_width = 0.8 +support_material_extrusion_width = 0.72 + +######################################### +####### end common print presets ######## +######################################### + +######################################### +########## begin print presets ########## +######################################### + +[print:0.08mm 0.4 nozzle DETAILED QUALITY @PREDATOR] +inherits = *common predator 0.4 nozzle detailed*; *common predator quality* +layer_height = 0.08 +max_print_speed = 50 +perimeters = 3 +fill_pattern = grid + +[print:0.16mm 0.4 nozzle DETAILED QUALITY @PREDATOR] +inherits = *common predator 0.4 nozzle detailed*; *common predator quality* +layer_height = 0.16 +max_print_speed = 60 +perimeters = 3 +fill_pattern = grid + +[print:0.16mm 0.4 nozzle COARSE QUALITY @PREDATOR] +inherits = *common predator 0.4 nozzle coarse*; *common predator quality* +layer_height = 0.16 +max_print_speed = 60 +perimeters = 3 +fill_pattern = grid + +[print:0.24mm 0.4 nozzle DETAILED QUALITY @PREDATOR] +inherits = *common predator 0.4 nozzle detailed*; *common predator quality* +layer_height = 0.24 +max_print_speed = 70 +perimeters = 3 +fill_pattern = grid + +[print:0.24mm 0.4 nozzle COARSE QUALITY @PREDATOR] +inherits = *common predator 0.4 nozzle coarse*; *common predator quality* +layer_height = 0.24 +max_print_speed = 70 +perimeters = 3 +fill_pattern = grid + +[print:0.32mm 0.4 nozzle DETAILED QUALITY @PREDATOR] +inherits = *common predator 0.4 nozzle detailed*; *common predator quality* +layer_height = 0.32 +max_print_speed = 70 +perimeters = 3 +fill_pattern = grid + +[print:0.32mm 0.4 nozzle COARSE QUALITY @PREDATOR] +inherits = *common predator 0.4 nozzle coarse*; *common predator quality* +layer_height = 0.32 +max_print_speed = 70 +perimeters = 3 +fill_pattern = grid + +[print:0.16mm 0.6 nozzle DETAILED QUALITY @PREDATOR] +inherits = *common predator 0.6 nozzle detailed*; *common predator quality* +layer_height = 0.16 +max_print_speed = 70 +perimeters = 2 +fill_pattern = gyroid + +[print:0.16mm 0.6 nozzle DETAILED SPEED @PREDATOR] +inherits = *common predator 0.6 nozzle detailed*; *common predator speed* +layer_height = 0.16 +max_print_speed = 80 +perimeters = 2 +fill_pattern = gyroid + +[print:0.16mm 0.6 nozzle COARSE QUALITY @PREDATOR] +inherits = *common predator 0.6 nozzle coarse*; *common predator quality* +layer_height = 0.16 +max_print_speed = 70 +perimeters = 2 +fill_pattern = gyroid + +[print:0.16mm 0.6 nozzle COARSE SPEED @PREDATOR] +inherits = *common predator 0.6 nozzle coarse*; *common predator speed* +layer_height = 0.16 +max_print_speed = 80 +perimeters = 2 +fill_pattern = gyroid + +[print:0.24mm 0.6 nozzle DETAILED QUALITY @PREDATOR] +inherits = *common predator 0.6 nozzle detailed*; *common predator quality* +layer_height = 0.24 +max_print_speed = 70 +perimeters = 2 +fill_pattern = gyroid + +[print:0.24mm 0.6 nozzle DETAILED SPEED @PREDATOR] +inherits = *common predator 0.6 nozzle detailed*; *common predator speed* +layer_height = 0.24 +max_print_speed = 80 +perimeters = 2 +fill_pattern = gyroid + +[print:0.24mm 0.6 nozzle COARSE QUALITY @PREDATOR] +inherits = *common predator 0.6 nozzle coarse*; *common predator quality* +layer_height = 0.24 +max_print_speed = 70 +perimeters = 2 +fill_pattern = gyroid + +[print:0.24mm 0.6 nozzle COARSE SPEED @PREDATOR] +inherits = *common predator 0.6 nozzle coarse*; *common predator speed* +layer_height = 0.24 +max_print_speed = 80 +perimeters = 2 +fill_pattern = gyroid + +[print:0.32mm 0.6 nozzle DETAILED QUALITY @PREDATOR] +inherits = *common predator 0.6 nozzle detailed*; *common predator quality* +layer_height = 0.32 +max_print_speed = 70 +perimeters = 2 +fill_pattern = gyroid + +[print:0.32mm 0.6 nozzle DETAILED SPEED @PREDATOR] +inherits = *common predator 0.6 nozzle detailed*; *common predator speed* +layer_height = 0.32 +max_print_speed = 80 +perimeters = 2 +fill_pattern = gyroid + +[print:0.32mm 0.6 nozzle COARSE QUALITY @PREDATOR] +inherits = *common predator 0.6 nozzle coarse*; *common predator quality* +layer_height = 0.32 +max_print_speed = 70 +perimeters = 2 +fill_pattern = gyroid + +[print:0.32mm 0.6 nozzle COARSE SPEED @PREDATOR] +inherits = *common predator 0.6 nozzle coarse*; *common predator speed* +layer_height = 0.32 +max_print_speed = 80 +perimeters = 2 +fill_pattern = gyroid + +[print:0.4mm 0.6 nozzle DETAILED QUALITY @PREDATOR] +inherits = *common predator 0.6 nozzle detailed*; *common predator quality* +layer_height = 0.4 +max_print_speed = 70 +perimeters = 2 +fill_pattern = gyroid + +[print:0.4mm 0.6 nozzle DETAILED SPEED @PREDATOR] +inherits = *common predator 0.6 nozzle detailed*; *common predator speed* +layer_height = 0.4 +max_print_speed = 80 +perimeters = 2 +fill_pattern = gyroid + +[print:0.4mm 0.6 nozzle COARSE QUALITY @PREDATOR] +inherits = *common predator 0.6 nozzle coarse*; *common predator quality* +layer_height = 0.4 +max_print_speed = 70 +perimeters = 2 +fill_pattern = gyroid + +[print:0.4mm 0.6 nozzle COARSE SPEED @PREDATOR] +inherits = *common predator 0.6 nozzle coarse*; *common predator speed* +layer_height = 0.4 +max_print_speed = 80 +perimeters = 2 +fill_pattern = gyroid + +[print:0.24mm 0.8 nozzle DETAILED QUALITY @PREDATOR] +inherits = *common predator 0.8 nozzle detailed*; *common predator quality* +layer_height = 0.24 +max_print_speed = 80 +perimeters = 2 +fill_pattern = gyroid + +[print:0.24mm 0.8 nozzle DETAILED SPEED @PREDATOR] +inherits = *common predator 0.8 nozzle detailed*; *common predator speed* +layer_height = 0.24 +max_print_speed = 90 +perimeters = 2 +fill_pattern = gyroid + +[print:0.24mm 0.8 nozzle COARSE QUALITY @PREDATOR] +inherits = *common predator 0.8 nozzle coarse*; *common predator quality* +layer_height = 0.24 +max_print_speed = 80 +perimeters = 2 +fill_pattern = gyroid + +[print:0.24mm 0.8 nozzle COARSE SPEED @PREDATOR] +inherits = *common predator 0.8 nozzle coarse*; *common predator speed* +layer_height = 0.24 +max_print_speed = 90 +perimeters = 2 +fill_pattern = gyroid + +[print:0.32mm 0.8 nozzle DETAILED QUALITY @PREDATOR] +inherits = *common predator 0.8 nozzle detailed*; *common predator quality* +layer_height = 0.32 +max_print_speed = 80 +perimeters = 2 +fill_pattern = gyroid + +[print:0.32mm 0.8 nozzle DETAILED SPEED @PREDATOR] +inherits = *common predator 0.8 nozzle detailed*; *common predator speed* +layer_height = 0.32 +max_print_speed = 90 +perimeters = 2 +fill_pattern = gyroid + +[print:0.32mm 0.8 nozzle COARSE QUALITY @PREDATOR] +inherits = *common predator 0.8 nozzle coarse*; *common predator quality* +layer_height = 0.32 +max_print_speed = 80 +perimeters = 2 +fill_pattern = gyroid + +[print:0.32mm 0.8 nozzle COARSE SPEED @PREDATOR] +inherits = *common predator 0.8 nozzle coarse*; *common predator speed* +layer_height = 0.32 +max_print_speed = 90 +perimeters = 2 +fill_pattern = gyroid + +[print:0.4mm 0.8 nozzle DETAILED QUALITY @PREDATOR] +inherits = *common predator 0.8 nozzle detailed*; *common predator quality* +layer_height = 0.4 +max_print_speed = 80 +perimeters = 2 +fill_pattern = gyroid + +[print:0.4mm 0.8 nozzle DETAILED SPEED @PREDATOR] +inherits = *common predator 0.8 nozzle detailed*; *common predator speed* +layer_height = 0.4 +max_print_speed = 90 +perimeters = 2 +fill_pattern = gyroid + +[print:0.4mm 0.8 nozzle COARSE QUALITY @PREDATOR] +inherits = *common predator 0.8 nozzle coarse*; *common predator quality* +layer_height = 0.4 +max_print_speed = 80 +perimeters = 2 +fill_pattern = gyroid + +[print:0.4mm 0.8 nozzle COARSE SPEED @PREDATOR] +inherits = *common predator 0.8 nozzle coarse*; *common predator speed* +layer_height = 0.4 +max_print_speed = 90 +perimeters = 2 +fill_pattern = gyroid + +[print:0.48mm 0.8 nozzle DETAILED QUALITY @PREDATOR] +inherits = *common predator 0.8 nozzle detailed*; *common predator quality* +layer_height = 0.48 +max_print_speed = 80 +perimeters = 2 +fill_pattern = gyroid + +[print:0.48mm 0.8 nozzle DETAILED SPEED @PREDATOR] +inherits = *common predator 0.8 nozzle detailed*; *common predator speed* +layer_height = 0.48 +max_print_speed = 90 +perimeters = 2 +fill_pattern = gyroid + +[print:0.48mm 0.8 nozzle COARSE QUALITY @PREDATOR] +inherits = *common predator 0.8 nozzle coarse*; *common predator quality* +layer_height = 0.48 +max_print_speed = 80 +perimeters = 2 +fill_pattern = gyroid + +[print:0.48mm 0.8 nozzle COARSE SPEED @PREDATOR] +inherits = *common predator 0.8 nozzle coarse*; *common predator speed* +layer_height = 0.48 +max_print_speed = 90 +perimeters = 2 +fill_pattern = gyroid + +######################################### +########### end print presets ########### +######################################### + +######################################### +######## begin filament presets ######### +######################################### + +# Common filament preset +[filament:*common predator*] +cooling = 0 +compatible_printers = +extrusion_multiplier = 1 +filament_cost = 0 +filament_density = 0 +filament_diameter = 1.75 +filament_notes = "" +filament_settings_id = "" +filament_soluble = 0 +min_print_speed = 15 +slowdown_below_layer_time = 20 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_ANYCUBIC.*/ and printer_notes=~/.*PRINTER_MODEL_PREDATOR.*/ + +[filament:*PLA predator*] +inherits = *common predator* +bed_temperature = 60 +fan_below_layer_time = 100 +filament_colour = #FF3232 +filament_max_volumetric_speed = 10 +filament_type = PLA +filament_density = 1.24 +filament_cost = 20 +first_layer_bed_temperature = 60 +first_layer_temperature = 200 +fan_always_on = 1 +cooling = 1 +max_fan_speed = 100 +min_fan_speed = 100 +bridge_fan_speed = 100 +disable_fan_first_layers = 1 +temperature = 200 + +[filament:*PET predator*] +inherits = *common predator* +bed_temperature = 70 +cooling = 1 +disable_fan_first_layers = 3 +fan_below_layer_time = 20 +filament_colour = #FF8000 +filament_max_volumetric_speed = 8 +filament_type = PETG +filament_density = 1.27 +filament_cost = 30 +first_layer_bed_temperature =70 +first_layer_temperature = 240 +fan_always_on = 1 +max_fan_speed = 50 +min_fan_speed = 20 +bridge_fan_speed = 100 +temperature = 240 + +[filament:*ABS predator*] +inherits = *common predator* +bed_temperature = 100 +cooling = 0 +disable_fan_first_layers = 3 +fan_below_layer_time = 20 +filament_colour = #3A80CA +filament_max_volumetric_speed = 10 +filament_type = ABS +filament_density = 1.04 +filament_cost = 20 +first_layer_bed_temperature = 100 +first_layer_temperature = 245 +fan_always_on = 0 +max_fan_speed = 0 +min_fan_speed = 0 +bridge_fan_speed = 30 +top_fan_speed = 0 +temperature = 245 + +[filament:Generic PLA @PREDATOR] +inherits = *PLA predator* +filament_vendor = Generic + +[filament:Generic PETG @PREDATOR] +inherits = *PET predator* +filament_vendor = Generic + +[filament:Generic ABS @PREDATOR] +inherits = *ABS predator* +filament_vendor = Generic + +######################################### +######### end filament presets ########## +######################################### + +######################################### +######### begin printer presets ######### +######################################### + +# Anycubic predator common printer preset +[printer:*common predator*] +printer_vendor = Anycubic +printer_model = Predator +printer_technology = FFF +printer_variant = 0.4 +thumbnails = 16x16,220x124 +bed_shape = 188.779x16.516,186.621x32.9063,183.043x49.0462,178.072x64.8128,171.745x80.0862,164.112x94.75,155.229x108.693,145.165x121.808,133.997x133.997,121.808x145.165,108.693x155.229,94.75x164.112,80.0862x171.745,64.8128x178.072,49.0462x183.043,32.9063x186.621,16.516x188.779,1.16035e-14x189.5,-16.516x188.779,-32.9063x186.621,-49.0462x183.043,-64.8128x178.072,-80.0862x171.745,-94.75x164.112,-108.693x155.229,-121.808x145.165,-133.997x133.997,-145.165x121.808,-155.229x108.693,-164.112x94.75,-171.745x80.0862,-178.072x64.8128,-183.043x49.0462,-186.621x32.9063,-188.779x16.516,-189.5x2.32071e-14,-188.779x-16.516,-186.621x-32.9063,-183.043x-49.0462,-178.072x-64.8128,-171.745x-80.0862,-164.112x-94.75,-155.229x-108.693,-145.165x-121.808,-133.997x-133.997,-121.808x-145.165,-108.693x-155.229,-94.75x-164.112,-80.0862x-171.745,-64.8128x-178.072,-49.0462x-183.043,-32.9063x-186.621,-16.516x-188.779,-3.48106e-14x-189.5,16.516x-188.779,32.9063x-186.621,49.0462x-183.043,64.8128x-178.072,80.0862x-171.745,94.75x-164.112,108.693x-155.229,121.808x-145.165,133.997x-133.997,145.165x-121.808,155.229x-108.693,164.112x-94.75,171.745x-80.0862,178.072x-64.8128,183.043x-49.0462,186.621x-32.9063,188.779x-16.516,189.5x-4.64141e-14 +max_print_height = 450 +z_offset = 0 +single_extruder_multi_material = 0 +gcode_flavor = reprap +silent_mode = 0 +remaining_times = 0 +use_relative_e_distances = 0 +use_firmware_retraction = 0 +use_volumetric_e = 0 +variable_layer_height = 1 +start_gcode = "; start_gcode | start\n\n; v11 2020-09-02_14-27 tillverka\n\n; set metric values\n\nG21\n\n; use absolute positioning\n\nG90\n\n; set extruder to absolute mode\n\nM82\n\n; start with fan off\n\nM107\n\n; set e-steps for bondtech bmg and force store in eeprom\n; mm/step for chitu\n; 1/415 for bondtech bmg\n\nM8011 S0.0024096394\nM8500\n\n; set temps\n\nM104 S[first_layer_temperature]\nM140 S[first_layer_bed_temperature]\n\n; home xy\n\nG28 X0 Y0\n\n; home z\n\nG28 Z0\n\n; move the head down to Z 94mm\n\nG1 Z94.0 F2394\n\n; set and wait for temps\n\nM109 S[first_layer_temperature]\nM190 S[first_layer_bed_temperature]\n\n; zero the extruded length\n\nG92 E0\n\n; extrude 3mm of feed stock\n\nG1 F200 E3\n\n; zero the extruded length again\n\nG92 E0\n\n; set speed\n\nG1 F{travel_speed}\n\n; print preskirt\n\nG92 E0\nG1 E3.94000 F2520.00000\n\nG1 X125.464 Y-139.310\nG1 Z0.329 F3994.000\n\nG1 F994.000\n\nG1 X125.464 Y-139.310 E4.19679\nG1 X130.218 Y-134.876 E4.70359\nG1 X132.569 Y-132.567 E4.96053\nG1 X137.099 Y-127.877 E5.46890\nG1 X139.325 Y-125.447 E5.72585\nG1 X141.507 Y-122.981 E5.98254\nG1 X145.685 Y-118.002 E6.48934\nG1 X149.741 Y-112.810 E7.00296\nG1 X153.561 Y-107.552 E7.50975\nG1 X155.440 Y-104.819 E7.76827\nG1 X158.980 Y-99.367 E8.27506\nG1 X160.702 Y-96.558 E8.53201\nG1 X163.962 Y-90.911 E9.04038\nG1 X165.535 Y-88.015 E9.29732\nG1 X168.496 Y-82.205 E9.80570\nG1 X169.915 Y-79.231 E10.06264\nG1 X171.280 Y-76.235 E10.31934\nG1 X173.819 Y-70.251 E10.82613\nG1 X176.180 Y-64.101 E11.33975\nG1 X178.297 Y-57.955 E11.84654\nG1 X179.294 Y-54.793 E12.10507\nG1 X181.085 Y-48.544 E12.61186\nG1 X181.911 Y-45.354 E12.86880\nG1 X183.378 Y-39.001 E13.37718\nG1 X184.035 Y-35.771 E13.63412\nG1 X185.168 Y-29.350 E14.14250\nG1 X185.655 Y-26.091 E14.39944\nG1 X186.084 Y-22.826 E14.65614\nG1 X186.764 Y-16.362 E15.16293\nG1 X187.223 Y-9.790 E15.67655\nG1 X187.450 Y-3.294 E16.18334\nG1 X187.479 Y0.002 E16.44028\nG1 X187.450 Y3.294 E16.69698\nG1 X187.223 Y9.810 E17.20529\nG1 X187.021 Y13.100 E17.46229\nG1 X186.454 Y19.575 E17.96909\nG1 X186.079 Y22.870 E18.22761\nG1 X185.174 Y29.307 E18.73440\nG1 X184.031 Y35.794 E19.24802\nG1 X182.679 Y42.152 E19.75481\nG1 X181.910 Y45.357 E20.01176\nG1 X180.223 Y51.655 E20.52013\nG1 X179.287 Y54.815 E20.77708\nG1 X177.272 Y61.017 E21.28545\nG1 X176.172 Y64.123 E21.54239\nG1 X175.019 Y67.207 E21.79909\nG1 X172.584 Y73.234 E22.30588\nG1 X169.905 Y79.252 E22.81950\nG1 X167.055 Y85.094 E23.32629\nG1 X165.524 Y88.035 E23.58482\nG1 X162.373 Y93.721 E24.09161\nG1 X160.700 Y96.560 E24.34855\nG1 X157.245 Y102.090 E24.85693\nG1 X155.427 Y104.838 E25.11387\nG1 X151.687 Y110.180 E25.62225\nG1 X149.727 Y112.829 E25.87919\nG1 X147.722 Y115.441 E26.13588\nG1 X143.631 Y120.493 E26.64268\nG1 X139.310 Y125.464 E27.15629\nG1 X134.876 Y130.218 E27.66309\nG1 X132.567 Y132.569 E27.92003\nG1 X127.877 Y137.099 E28.42840\nG1 X125.447 Y139.325 E28.68535\nG1 X122.981 Y141.507 E28.94204\nG1 X118.002 Y145.685 E29.44883\nG1 X112.810 Y149.741 E29.96245\nG1 X107.552 Y153.561 E30.46924\nG1 X104.819 Y155.440 E30.72777\nG1 X99.367 Y158.980 E31.23456\nG1 X96.558 Y160.702 E31.49151\nG1 X90.911 Y163.962 E31.99988\nG1 X88.015 Y165.535 E32.25682\nG1 X82.205 Y168.496 E32.76520\nG1 X79.231 Y169.915 E33.02214\nG1 X76.235 Y171.280 E33.27884\nG1 X70.251 Y173.819 E33.78563\nG1 X64.101 Y176.180 E34.29925\nG1 X57.955 Y178.297 E34.80604\nG1 X54.793 Y179.294 E35.06457\nG1 X48.544 Y181.085 E35.57136\nG1 X45.354 Y181.911 E35.82830\nG1 X39.001 Y183.378 E36.33668\nG1 X35.771 Y184.035 E36.59362\nG1 X29.350 Y185.168 E37.10200\nG1 X26.091 Y185.655 E37.35894\nG1 X22.826 Y186.084 E37.61563\nG1 X16.362 Y186.764 E38.12242\nG1 X9.790 Y187.223 E38.63605\nG1 X3.294 Y187.450 E39.14283\nG1 X-0.002 Y187.479 E39.39978\nG1 X-3.294 Y187.450 E39.65648\nG1 X-9.810 Y187.223 E40.16479\nG1 X-13.100 Y187.021 E40.42179\nG1 X-19.575 Y186.454 E40.92858\nG1 X-22.870 Y186.079 E41.18711\nG1 X-29.307 Y185.174 E41.69390\nG1 X-35.794 Y184.031 E42.20752\nG1 X-42.152 Y182.679 E42.71431\nG1 X-45.357 Y181.910 E42.97126\nG1 X-51.655 Y180.223 E43.47963\nG1 X-54.815 Y179.287 E43.73657\nG1 X-61.017 Y177.272 E44.24495\nG1 X-64.123 Y176.172 E44.50189\nG1 X-67.207 Y175.019 E44.75859\nG1 X-73.234 Y172.584 E45.26538\nG1 X-79.252 Y169.905 E45.77900\nG1 X-85.094 Y167.055 E46.28579\nG1 X-88.035 Y165.524 E46.54432\nG1 X-93.721 Y162.373 E47.05111\nG1 X-96.560 Y160.700 E47.30805\nG1 X-102.090 Y157.245 E47.81643\nG1 X-104.838 Y155.427 E48.07337\nG1 X-110.180 Y151.687 E48.58174\nG1 X-112.829 Y149.727 E48.83869\nG1 X-115.441 Y147.722 E49.09538\nG1 X-120.493 Y143.631 E49.60218\nG1 X-125.464 Y139.310 E50.11579\nG1 X-130.218 Y134.876 E50.62259\nG1 X-132.569 Y132.567 E50.87953\nG1 X-137.099 Y127.877 E51.38790\nG1 X-139.325 Y125.447 E51.64485\nG1 X-141.507 Y122.981 E51.90154\nG1 X-145.685 Y118.002 E52.40833\nG1 X-149.741 Y112.810 E52.92195\nG1 X-153.561 Y107.552 E53.42874\nG1 X-155.440 Y104.819 E53.68727\nG1 X-158.980 Y99.367 E54.19406\nG1 X-160.702 Y96.558 E54.45101\nG1 X-163.962 Y90.911 E54.95938\nG1 X-165.535 Y88.015 E55.21632\nG1 X-168.496 Y82.205 E55.72470\nG1 X-169.915 Y79.231 E55.98164\nG1 X-171.280 Y76.235 E56.23834\nG1 X-173.819 Y70.251 E56.74513\nG1 X-176.180 Y64.101 E57.25875\nG1 X-178.297 Y57.955 E57.76554\nG1 X-179.294 Y54.793 E58.02407\nG1 X-181.085 Y48.544 E58.53086\nG1 X-181.911 Y45.354 E58.78780\nG1 X-183.378 Y39.001 E59.29618\nG1 X-184.035 Y35.771 E59.55312\nG1 X-185.168 Y29.350 E60.06149\nG1 X-185.655 Y26.091 E60.31844\nG1 X-186.084 Y22.826 E60.57513\nG1 X-186.764 Y16.362 E61.08192\nG1 X-187.223 Y9.790 E61.59554\nG1 X-187.450 Y3.294 E62.10233\nG1 X-187.479 Y-0.002 E62.35928\nG1 X-187.450 Y-3.294 E62.61598\nG1 X-187.223 Y-9.810 E63.12429\nG1 X-187.021 Y-13.100 E63.38129\nG1 X-186.454 Y-19.575 E63.88808\nG1 X-186.079 Y-22.870 E64.14661\nG1 X-185.174 Y-29.307 E64.65340\nG1 X-184.031 Y-35.794 E65.16702\nG1 X-182.679 Y-42.152 E65.67381\nG1 X-181.910 Y-45.357 E65.93076\nG1 X-180.223 Y-51.655 E66.43913\nG1 X-179.287 Y-54.815 E66.69607\nG1 X-177.272 Y-61.017 E67.20445\nG1 X-176.172 Y-64.123 E67.46139\nG1 X-175.019 Y-67.207 E67.71809\nG1 X-172.584 Y-73.234 E68.22488\nG1 X-169.905 Y-79.252 E68.73850\nG1 X-167.055 Y-85.094 E69.24529\nG1 X-165.524 Y-88.035 E69.50382\nG1 X-162.373 Y-93.721 E70.01061\nG1 X-160.700 Y-96.560 E70.26755\nG1 X-157.245 Y-102.090 E70.77593\nG1 X-155.427 Y-104.838 E71.03287\nG1 X-151.687 Y-110.180 E71.54124\nG1 X-149.727 Y-112.829 E71.79819\nG1 X-147.722 Y-115.441 E72.05488\nG1 X-143.631 Y-120.493 E72.56167\nG1 X-139.310 Y-125.464 E73.07529\nG1 X-134.876 Y-130.218 E73.58209\nG1 X-132.567 Y-132.569 E73.83903\nG1 X-127.877 Y-137.099 E74.34740\nG1 X-125.447 Y-139.325 E74.60435\nG1 X-122.981 Y-141.507 E74.86104\nG1 X-118.002 Y-145.685 E75.36783\nG1 X-112.810 Y-149.741 E75.88145\nG1 X-107.552 Y-153.561 E76.38824\nG1 X-104.819 Y-155.440 E76.64677\nG1 X-99.367 Y-158.980 E77.15356\nG1 X-96.558 Y-160.702 E77.41051\nG1 X-90.911 Y-163.962 E77.91888\nG1 X-88.015 Y-165.535 E78.17582\nG1 X-82.205 Y-168.496 E78.68420\nG1 X-79.231 Y-169.915 E78.94114\nG1 X-76.235 Y-171.280 E79.19784\nG1 X-70.251 Y-173.819 E79.70463\nG1 X-64.101 Y-176.180 E80.21825\nG1 X-57.955 Y-178.297 E80.72504\nG1 X-54.793 Y-179.294 E80.98356\nG1 X-48.544 Y-181.085 E81.49036\nG1 X-45.354 Y-181.911 E81.74730\nG1 X-39.001 Y-183.378 E82.25568\nG1 X-35.771 Y-184.035 E82.51262\nG1 X-29.350 Y-185.168 E83.02099\nG1 X-26.091 Y-185.655 E83.27794\nG1 X-22.826 Y-186.084 E83.53463\nG1 X-16.362 Y-186.764 E84.04142\nG1 X-9.790 Y-187.223 E84.55504\nG1 X-3.294 Y-187.450 E85.06183\nG1 X0.006 Y-187.479 E85.31908\nG1 X6.521 Y-187.366 E85.82715\nG1 X9.810 Y-187.223 E86.08379\nG1 X13.100 Y-187.021 E86.34079\nG1 X19.575 Y-186.454 E86.84758\nG1 X22.870 Y-186.079 E87.10611\nG1 X29.307 Y-185.174 E87.61290\nG1 X35.794 Y-184.031 E88.12652\nG1 X42.152 Y-182.679 E88.63331\nG1 X45.357 Y-181.910 E88.89025\nG1 X51.655 Y-180.223 E89.39863\nG1 X54.815 Y-179.287 E89.65557\nG1 X61.017 Y-177.272 E90.16395\nG1 X64.123 Y-176.172 E90.42089\nG1 X67.207 Y-175.019 E90.67759\nG1 X73.234 Y-172.584 E91.18438\nG1 X79.252 Y-169.905 E91.69800\nG1 X85.094 Y-167.055 E92.20479\nG1 X88.035 Y-165.524 E92.46332\nG1 X93.721 Y-162.373 E92.97011\nG1 X96.560 Y-160.700 E93.22705\nG1 X102.090 Y-157.245 E93.73543\nG1 X104.838 Y-155.427 E93.99237\nG1 X110.180 Y-151.687 E94.50074\nG1 X112.829 Y-149.727 E94.75768\nG1 X115.441 Y-147.722 E95.01438\nG1 X120.493 Y-143.631 E95.52117\nG1 X122.911 Y-141.529 E95.77098\n\n; end preskirt\n; start_gcode | end" +end_gcode = "; end_gcode | start\n\n; v11 2020-09-02_14-27 tillverka\n\n; use relative positioning\n\nG91\n\n; retract the filament a bit before lifting the nozzle to release some of the pressure\n\nG1 E-1 F300\n\n; home\n\nG28\n\n; use absolute positioning\n\nG90\n\n; cooldown\n\nM104 S0\nM140 S0\n\n; end_gcode | end\n" +before_layer_gcode = +layer_gcode = +toolchange_gcode = +between_objects_gcode = +retract_length = 4 +retract_lift = 0.3 +retract_lift_above = 0 +retract_lift_below = 449 +retract_speed = 30 +deretract_speed = 0 +retract_restart_extra = 0 +retract_before_travel = 2 +retract_layer_change = 1 +wipe = 1 +retract_before_wipe = 70% +retract_length_toolchange = 10 +retract_restart_extra_toolchange = 0 +extruder_colour = #1193FF +machine_max_acceleration_e = 3000 +machine_max_acceleration_extruding = 1000 +machine_max_acceleration_retracting = 1000 +machine_max_acceleration_x = 1500 +machine_max_acceleration_y = 1500 +machine_max_acceleration_z = 1500 +machine_max_feedrate_e = 60 +machine_max_feedrate_x = 200 +machine_max_feedrate_y = 200 +machine_max_feedrate_z = 200 +machine_max_jerk_e = 5 +machine_max_jerk_x = 5 +machine_max_jerk_y = 5 +machine_max_jerk_z = 5 +machine_min_extruding_rate = 0 +machine_min_travel_rate = 0 +printer_settings_id = +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_ANYCUBIC\nPRINTER_MODEL_PREDATOR\nPRINTER_HAS_BOWDEN\n +default_filament_profile = Generic PLA @PREDATOR + +[printer:Anycubic Predator 0.4 nozzle] +inherits = *common predator* +printer_model = PREDATOR +printer_variant = 0.4 +nozzle_diameter = 0.4 +min_layer_height = 0.08 +max_layer_height = 0.32 +default_print_profile = 0.16mm 0.4 nozzle DETAILED QUALITY @PREDATOR + +[printer:Anycubic Predator 0.6 nozzle] +inherits = *common predator* +printer_model = PREDATOR +printer_variant = 0.6 +nozzle_diameter = 0.6 +min_layer_height = 0.12 +max_layer_height = 0.4 +default_print_profile = 0.24mm 0.8 nozzle DETAILED QUALITY @PREDATOR + +[printer:Anycubic Predator 0.8 nozzle] +inherits = *common predator* +printer_model = PREDATOR +printer_variant = 0.8 +nozzle_diameter = 0.8 +min_layer_height = 0.16 +max_layer_height = 0.48 +default_print_profile = 0.24mm 0.8 nozzle DETAILED QUALITY @PREDATOR + +######################################### +########## end printer presets ########## +######################################### diff --git a/resources/profiles/Anycubic/PREDATOR_thumbnail.png b/resources/profiles/Anycubic/PREDATOR_thumbnail.png new file mode 100644 index 0000000000..a68b7df302 Binary files /dev/null and b/resources/profiles/Anycubic/PREDATOR_thumbnail.png differ diff --git a/resources/profiles/BIBO.idx b/resources/profiles/BIBO.idx index f8ad05323b..8b2c163909 100644 --- a/resources/profiles/BIBO.idx +++ b/resources/profiles/BIBO.idx @@ -1,4 +1,5 @@ min_slic3r_version = 2.2.0-alpha3 +0.0.2 General print quality improvements 0.0.1 Multiple Print models were unified into a single one. 0.0.1-beta2 Bed model and textures added. Materials all use the BOBO2 identifier. deretract speed set to 0 to use retract speed. 0.0.1-beta1 Added new printer profiles for ditto printing. New retraction settings, new materials. Removed some settings which do not apply. More start gcode improvements. diff --git a/resources/profiles/BIBO.ini b/resources/profiles/BIBO.ini index 4a10de3cbc..59a8bbc74e 100644 --- a/resources/profiles/BIBO.ini +++ b/resources/profiles/BIBO.ini @@ -5,9 +5,9 @@ name = BIBO # 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.1 +config_version = 0.0.2 # Where to get the updates from? -config_update_url = http://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/BIBO/ +config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/BIBO/ # The printer models will be shown by the Configuration Wizard in this order, # also the first model installed & the first nozzle installed will be activated after install. @@ -856,4 +856,4 @@ bed_shape = -33x-93,0x-93,0x93,-33x93 #bed_texture = BIBO2.svg before_layer_gcode = ;BEFORE_LAYER_CHANGE\n;[layer_z]\nM104 S{temperature[0]} T0 ; set 1st nozzle heater to print temperature\n start_gcode = ;Start code PrusaSlicer BIBO 2 printers E2 only (i.e. T1)\nM420 S1 ; Turn on Ditto Printing\nG21 ; set units to metric\nG90 ; absolute positioning\nM107 ; start with the fan off\nM140 S{first_layer_bed_temperature[0] - 5} ; set bed temp\nM105 ; Report Temperatures\nM190 S{first_layer_bed_temperature[0]} ; wait for bed temp\nM104 S{first_layer_temperature[0]} T0 ; set 1st nozzle heater to ditto print temperature\nM104 S{first_layer_temperature[0]} T1 ; set 2nd nozzle heater to first layer temperature\nM105 ; Report Temperatures\nM109 S{first_layer_temperature[0]} T0 ; set 1st nozzle heater to ditto printing temperature\nM109 S{first_layer_temperature[0]} T1 ; Wait for 2nd nozzle heater to first layer temperature\nM105 ; Report Temperatures\nG28 X0 Y0 ; move X/Y to min endstops\nG28 Z0 ; move Z to min endstops\nG1 Z2 F400 ; move the print bed down 2mm\nT0 ; switch to tool position T0\nG90 ; absolute positioning\nG92 E0.0 ; zero the current extruder coordinate\nG28 ; Home all axis\nG1 Y0 F1200 E0 ; move Y to min endstop and reset extruder\nG92 E0.0 ; zero the current extruder coordinate\nT1 ; switch to tool position T1\nG92 E0.0 ; zero the current extruder coordinate\nM117 E2 nozzle wipe... ; Put Nozzle wipe message on screen, Attempt Nozzle Wipe (for ooze free startup)\nG1 X-15.0 Y-92.9 Z0.3 F2400.0 ; move to start-line position\nG1 X15.0 Y-92.9 Z0.3 F1000.0 E2 ; draw 1st line\nG1 X15.0 Y-92.6 Z0.3 F3000.0 ; move to side a little\nG1 X-15.0 Y-92.6 Z0.3 F1000.0 E4 ; draw 2nd line\nG1 X-15.0 Y-92.3 Z0.3 F3000.0 ; move to side a little\nG1 X15.0 Y-92.3 Z0.3 F1000.0 E6 ; draw 3rd line\nG1 X15.0 Y-92 Z0.3 F3000.0 ; move to side a little\nG1 X-15.0 Y-92 Z0.3 F1000.0 E8 ; draw 4th line\nG92 E0.0 ; reset extruder coordinate to zero before printing\nM117 BIBO Now Printing from E2... ; Put now printing message on screen -end_gcode = ;BIBO End GCode\nM107 ; turn fans off\nG91 ; Relative positioning\nG1 Z1 F100\nM140 S0 ; Disable heated bed\nM104 T0 S0 ; extruder T0 heater off\nM104 T1 S0 ; extruder T1 heater off\nG1 Z+0.5 X-20 Y-20 F300 ; move Z down then move print head a bit out of the way\nG28 X0 Y0 ; move X/Y to min endstops, so the head is out of the way\nG90 ; Absolute positioning\nG92 E0.0 ; Reset extruder position\nM84 ; Turn steppers off\nM420 S0 ; Turn off Ditto Printing function\nM117 BIBO Print complete ; Put print complete message on screen \ No newline at end of file +end_gcode = ;BIBO End GCode\nM107 ; turn fans off\nG91 ; Relative positioning\nG1 Z1 F100\nM140 S0 ; Disable heated bed\nM104 T0 S0 ; extruder T0 heater off\nM104 T1 S0 ; extruder T1 heater off\nG1 Z+0.5 X-20 Y-20 F300 ; move Z down then move print head a bit out of the way\nG28 X0 Y0 ; move X/Y to min endstops, so the head is out of the way\nG90 ; Absolute positioning\nG92 E0.0 ; Reset extruder position\nM84 ; Turn steppers off\nM420 S0 ; Turn off Ditto Printing function\nM117 BIBO Print complete ; Put print complete message on screen diff --git a/resources/profiles/Creality.idx b/resources/profiles/Creality.idx index e06e62b80e..1403e23359 100644 --- a/resources/profiles/Creality.idx +++ b/resources/profiles/Creality.idx @@ -1,5 +1,8 @@ -min_slic3r_version = 2.2.0-alpha3 +min_slic3r_version = 2.3.0-alpha2 +0.0.4 Added initial CR-10 profile, end g-code improvements. +min_slic3r_version = 2.3.0-alpha0 0.0.3 Added Ender-2, Ender-3 BLTouch, updated Ender-3 bed texture. +min_slic3r_version = 2.2.0-alpha3 0.0.2 Updated for PrusaSlicer 2.2.0-rc 0.0.2-beta Update for PrusaSlicer 2.2.0-beta 0.0.2-alpha1 Extended list of default filaments to be installed diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index 3111597870..3f78933426 100644 --- a/resources/profiles/Creality.ini +++ b/resources/profiles/Creality.ini @@ -5,10 +5,10 @@ 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.3 +config_version = 0.0.4 # Where to get the updates from? -config_update_url = http://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Creality/ -# changelog_url = http://files.prusa3d.com/?latest=slicer-profiles&lng=%1% +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% # The printer models will be shown by the Configuration Wizard in this order, # also the first model installed & the first nozzle installed will be activated after install. @@ -18,25 +18,145 @@ config_update_url = http://files.prusa3d.com/wp-content/uploads/repository/Prusa name = Creality Ender-3 variants = 0.4 technology = FFF +family = ENDER bed_model = ender3_bed.stl bed_texture = ender3.svg -default_materials = Generic PLA @ENDER3; Generic PETG @ENDER3; Generic ABS @ENDER3; Prusament PLA @ENDER3; Prusament PETG @ENDER3 +default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY [printer_model:ENDER3BLTOUCH] name = Creality Ender-3 BLTouch variants = 0.4 technology = FFF +family = ENDER bed_model = ender3_bed.stl bed_texture = ender3.svg -default_materials = Generic PLA @ENDER3; Generic PETG @ENDER3; Generic ABS @ENDER3; Prusament PLA @ENDER3; Prusament PETG @ENDER3 +default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY + +[printer_model:ENDER5] +name = Creality Ender-5 +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 + +[printer_model:ENDER5PLUS] +name = Creality Ender-5 Plus +variants = 0.4 +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 [printer_model:ENDER2] name = Creality Ender-2 variants = 0.4 technology = FFF +family = ENDER bed_model = ender2_bed.stl bed_texture = ender2.svg -default_materials = Generic PLA @ENDER3; Generic PETG @ENDER3; Generic ABS @ENDER3; Prusament PLA @ENDER3; Prusament PETG @ENDER3 +default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY + +[printer_model:CR10MINI] +name = Creality CR-10 Mini +variants = 0.4 +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 + +[printer_model:CR10] +name = Creality CR-10 +variants = 0.4 +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 + +[printer_model:CR10V2] +name = Creality CR-10 V2 +variants = 0.4 +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 + +[printer_model:CR10V3] +name = Creality CR-10 V3 +variants = 0.4 +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 + +[printer_model:CR10S] +name = Creality CR-10 S +variants = 0.4 +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 + +[printer_model:CR10SPRO] +name = Creality CR-10 S Pro +variants = 0.4 +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 + +[printer_model:CR10SPROV2] +name = Creality CR-10 S Pro V2 +variants = 0.4 +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 + +[printer_model:CR10S4] +name = Creality CR-10 S4 +variants = 0.4 +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 + +[printer_model:CR10S5] +name = Creality CR-10 S5 +variants = 0.4 +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 + +[printer_model:CR20] +name = Creality CR-20 +variants = 0.4 +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 + +[printer_model:CR20PRO] +name = Creality CR-20 Pro +variants = 0.4 +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 # All presets starting with asterisk, for example *common*, are intermediate and they will # not make it into the user interface. @@ -57,6 +177,7 @@ ensure_vertical_shell_thickness = 1 external_fill_pattern = rectilinear external_perimeters_first = 0 external_perimeter_extrusion_width = 0.45 +external_perimeter_speed = 25 extra_perimeters = 0 extruder_clearance_height = 25 extruder_clearance_radius = 45 @@ -75,6 +196,7 @@ infill_extrusion_width = 0.45 infill_first = 0 infill_only_where_needed = 0 infill_overlap = 25% +infill_speed = 50 interface_shells = 0 max_print_speed = 100 max_volumetric_extrusion_rate_slope_negative = 0 @@ -89,6 +211,7 @@ output_filename_format = {input_filename_base}_{layer_height}mm_{filament_type[0 perimeters = 2 perimeter_extruder = 1 perimeter_extrusion_width = 0.45 +perimeter_speed = 40 post_process = print_settings_id = raft_layers = 0 @@ -103,11 +226,12 @@ solid_infill_below_area = 0 solid_infill_every_layers = 0 solid_infill_extruder = 1 solid_infill_extrusion_width = 0.45 +solid_infill_speed = 40 spiral_vase = 0 standby_temperature_delta = -5 support_material = 0 support_material_extruder = 0 -support_material_extrusion_width = 0.4 +support_material_extrusion_width = 0.38 support_material_interface_extruder = 0 support_material_angle = 0 support_material_buildplate_only = 0 @@ -125,9 +249,9 @@ support_material_threshold = 45 support_material_with_sheath = 0 support_material_xy_spacing = 60% thin_walls = 0 -top_infill_extrusion_width = 0.45 -top_solid_infill_speed = 40 -travel_speed = 100 +top_infill_extrusion_width = 0.4 +top_solid_infill_speed = 30 +travel_speed = 150 wipe_tower = 0 wipe_tower_bridging = 10 wipe_tower_rotation_angle = 0 @@ -136,69 +260,63 @@ wipe_tower_x = 170 wipe_tower_y = 140 xy_size_compensation = 0 +[print:*0.10mm*] +inherits = *common* +layer_height = 0.1 +perimeters = 3 +bottom_solid_layers = 7 +top_solid_layers = 9 + [print:*0.12mm*] inherits = *common* -perimeter_speed = 40 -external_perimeter_speed = 25 -infill_speed = 50 -solid_infill_speed = 40 layer_height = 0.12 perimeters = 3 -top_infill_extrusion_width = 0.4 bottom_solid_layers = 6 top_solid_layers = 7 +[print:*0.15mm*] +inherits = *common* +layer_height = 0.15 +bottom_solid_layers = 5 +top_solid_layers = 7 + [print:*0.20mm*] inherits = *common* -perimeter_speed = 40 -external_perimeter_speed = 25 -infill_speed = 50 -solid_infill_speed = 40 layer_height = 0.20 -top_infill_extrusion_width = 0.4 bottom_solid_layers = 4 top_solid_layers = 5 [print:*0.24mm*] inherits = *common* -perimeter_speed = 40 -external_perimeter_speed = 25 -infill_speed = 50 -solid_infill_speed = 40 layer_height = 0.24 top_infill_extrusion_width = 0.45 bottom_solid_layers = 3 top_solid_layers = 4 -[print:0.12mm DETAIL @ENDER3] +[print:0.10mm HIGHDETAIL @CREALITY] +inherits = *0.10mm* +renamed_from = "0.10mm HIGHDETAIL @ENDER3" +compatible_printers_condition = printer_model=~/(ENDER|CR).*/ and nozzle_diameter[0]==0.4 + +[print:0.12mm DETAIL @CREALITY] inherits = *0.12mm* -# alias = 0.12mm DETAIL -travel_speed = 150 -infill_speed = 50 -solid_infill_speed = 40 -top_solid_infill_speed = 30 -support_material_extrusion_width = 0.38 -compatible_printers_condition = printer_model=~/ENDER.*/ and nozzle_diameter[0]==0.4 +renamed_from = "0.12mm DETAIL @ENDER3" +compatible_printers_condition = printer_model=~/(ENDER|CR).*/ and nozzle_diameter[0]==0.4 -[print:0.20mm NORMAL @ENDER3] +[print:0.15mm OPTIMAL @CREALITY] +inherits = *0.15mm* +renamed_from = "0.15mm OPTIMAL @ENDER3" +compatible_printers_condition = printer_model=~/(ENDER|CR).*/ and nozzle_diameter[0]==0.4 + +[print:0.20mm NORMAL @CREALITY] inherits = *0.20mm* -# alias = 0.20mm NORMAL -travel_speed = 150 -infill_speed = 50 -solid_infill_speed = 40 -top_solid_infill_speed = 30 -support_material_extrusion_width = 0.38 -compatible_printers_condition = printer_model=~/ENDER.*/ and nozzle_diameter[0]==0.4 +renamed_from = "0.20mm NORMAL @ENDER3" +compatible_printers_condition = printer_model=~/(ENDER|CR).*/ and nozzle_diameter[0]==0.4 -[print:0.24mm DRAFT @ENDER3] +[print:0.24mm DRAFT @CREALITY] inherits = *0.24mm* -# alias = 0.24mm DRAFT -travel_speed = 150 -infill_speed = 50 -solid_infill_speed = 40 -top_solid_infill_speed = 30 -support_material_extrusion_width = 0.38 -compatible_printers_condition = printer_model=~/ENDER.*/ and nozzle_diameter[0]==0.4 +renamed_from = "0.24mm DRAFT @ENDER3" +compatible_printers_condition = printer_model=~/(ENDER|CR).*/ and nozzle_diameter[0]==0.4 # Common filament preset [filament:*common*] @@ -217,7 +335,7 @@ compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_CREALITY.*/ [filament:*PLA*] inherits = *common* -bed_temperature = 40 +bed_temperature = 60 fan_below_layer_time = 100 filament_colour = #FF3232 filament_max_volumetric_speed = 15 @@ -245,7 +363,7 @@ filament_max_volumetric_speed = 8 filament_type = PETG filament_density = 1.27 filament_cost = 30 -first_layer_bed_temperature =70 +first_layer_bed_temperature = 70 first_layer_temperature = 240 fan_always_on = 1 max_fan_speed = 50 @@ -273,78 +391,108 @@ bridge_fan_speed = 30 top_fan_speed = 0 temperature = 245 -[filament:Generic PLA @ENDER3] +[filament:Generic PLA @CREALITY] inherits = *PLA* -# alias = Generic PLA +renamed_from = "Generic PLA @ENDER3" filament_vendor = Generic -[filament:Generic PETG @ENDER3] +[filament:Generic PETG @CREALITY] inherits = *PET* +renamed_from = "Generic PETG @ENDER3" filament_vendor = Generic -[filament:Generic ABS @ENDER3] +[filament:Generic ABS @CREALITY] inherits = *ABS* -# alias = Generic ABS -first_layer_bed_temperature = 90 +renamed_from = "Generic ABS @ENDER3" +first_layer_bed_temperature = 90 bed_temperature = 90 filament_vendor = Generic -[filament:Creality PLA @ENDER3] +[filament:Creality PLA @CREALITY] inherits = *PLA* -# alias = Creality PLA +renamed_from = "Creality PLA @ENDER3" filament_vendor = Creality temperature = 205 bed_temperature = 40 first_layer_temperature = 210 -first_layer_bed_temperature =40 +first_layer_bed_temperature = 40 -[filament:Creality PETG @ENDER3] +[filament:Creality PETG @CREALITY] inherits = *PET* -# alias = Creality PETG +renamed_from = "Creality PETG @ENDER3" filament_vendor = Creality temperature = 240 bed_temperature = 70 first_layer_temperature = 240 -first_layer_bed_temperature =70 +first_layer_bed_temperature = 70 max_fan_speed = 40 min_fan_speed = 20 -[filament:Creality ABS @ENDER3] +[filament:Creality ABS @CREALITY] inherits = *ABS* -# alias = Creality ABS +renamed_from = "Creality ABS @ENDER3" filament_vendor = Creality temperature = 240 bed_temperature = 90 first_layer_temperature = 240 -first_layer_bed_temperature =90 +first_layer_bed_temperature = 90 -[filament:Prusament PLA @ENDER3] +[filament:Prusament PLA @CREALITY] inherits = *PLA* -# alias = Prusament PLA +renamed_from = "Prusament PLA @ENDER3" filament_vendor = Prusa Polymers temperature = 215 bed_temperature = 40 first_layer_temperature = 215 -first_layer_bed_temperature =40 +first_layer_bed_temperature = 40 filament_cost = 24.99 filament_density = 1.24 -[filament:Prusament PETG @ENDER3] +[filament:Prusament PETG @CREALITY] inherits = *PET* -# alias = Prusament PETG +renamed_from = "Prusament PETG @ENDER3" filament_vendor = Prusa Polymers temperature = 245 bed_temperature = 70 first_layer_temperature = 245 -first_layer_bed_temperature =70 +first_layer_bed_temperature = 70 filament_cost = 24.99 filament_density = 1.27 +[filament:Devil Design PLA @CREALITY] +inherits = *PLA* +filament_vendor = Devil Design +temperature = 215 +bed_temperature = 60 +first_layer_temperature = 215 +first_layer_bed_temperature = 60 +filament_cost = 19.00 +filament_density = 1.24 + +[filament:Extrudr PLA NX2 @CREALITY] +inherits = *PLA* +filament_vendor = Extrudr +temperature = 200 +bed_temperature = 60 +first_layer_temperature = 205 +first_layer_bed_temperature = 60 +filament_cost = 23.63 +filament_density = 1.3 + +[filament:Real Filament PLA @CREALITY] +inherits = *PLA* +filament_vendor = Real Filament +temperature = 195 +bed_temperature = 60 +first_layer_temperature = 200 +first_layer_bed_temperature = 60 +filament_cost = 24.99 +filament_density = 1.24 + # Common printer preset [printer:*common*] printer_technology = FFF -bed_shape = 0x0,200x0,200x200,0x200 -before_layer_gcode = ;BEFORE_LAYER_CHANGE\n;[layer_z]\n\n +before_layer_gcode = ;BEFORE_LAYER_CHANGE\nG92 E0\n;[layer_z]\n\n between_objects_gcode = deretract_speed = 0 extruder_colour = #FFFF00 @@ -373,8 +521,6 @@ max_layer_height = 0.3 min_layer_height = 0.07 max_print_height = 200 nozzle_diameter = 0.4 -octoprint_apikey = -octoprint_host = printer_notes = printer_settings_id = retract_before_travel = 1 @@ -388,11 +534,7 @@ retract_lift_below = 0 retract_restart_extra = 0 retract_restart_extra_toolchange = 0 retract_speed = 35 -serial_port = -serial_speed = 250000 single_extruder_multi_material = 0 -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\nG92 E0.0\nG1 Z0.15 F240\nG1 X60.0 E9.0 F800.0 ; intro line\nG1 X100.0 E12.5 F800 ; intro line\nG92 E0.0 -end_gcode = M104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 F3000 ; home X axis\nM84 ; disable motors toolchange_gcode = use_firmware_retraction = 0 use_relative_e_distances = 1 @@ -404,14 +546,15 @@ printer_model = default_print_profile = default_filament_profile = -[printer:Creality ENDER-3] +[printer:Creality Ender-3] inherits = *common* +renamed_from = "Creality ENDER-3" printer_model = ENDER3 printer_variant = 0.4 max_layer_height = 0.25 min_layer_height = 0.1 -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_ENDER3 -bed_shape = 0x0,220x0,220x220,0x220 +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_ENDER3\nPRINTER_HAS_BOWDEN +bed_shape = 3x3,228x3,228x228,3x228 max_print_height = 250 machine_max_acceleration_e = 5000 machine_max_acceleration_extruding = 500 @@ -428,29 +571,134 @@ machine_max_jerk_x = 8 machine_max_jerk_y = 8 machine_max_jerk_z = 0.4 machine_min_extruding_rate = 0 -machine_min_travel_rate = 0 +machine_min_travel_rate = 0 nozzle_diameter = 0.4 retract_before_travel = 2 retract_length = 5 retract_speed = 60 deretract_speed = 40 retract_before_wipe = 70% -default_print_profile = 0.20mm NORMAL -default_filament_profile = Creality PLA -start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 ; home all\nG1 Z2 F240\nG1 X2 Y10 F3000\nG1 Z0.28 F240\nG92 E0.0\nG1 Y190 E15.0 F1500.0 ; intro line\nG1 X2.3 F5000\nG1 Y10 E30 F1200.0 ; intro line\nG92 E0.0 -end_gcode = M104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+10, max_print_height)} F600{endif} ; Move print head up\nG1 X0 Y200 F3000 ; present print\nM84 X Y E ; disable motors +default_print_profile = 0.15mm OPTIMAL @CREALITY +default_filament_profile = Creality PLA @CREALITY +start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 ; home all\nG1 Z2 F240\nG1 X2 Y10 F3000\nG1 Z0.28 F240\nG92 E0.0\nG1 Y190 E15.0 F1500.0 ; intro line\nG1 X2.3 F5000\nG1 Y10 E15.0 F1200.0 ; intro line\nG92 E0.0 +end_gcode = M104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+5, max_print_height)} F600{endif} ; Move print head up\nG1 X5 Y170 F3000 ; present print\n{if layer_z < max_print_height-10}G1 Z{z_offset+min(layer_z+70, max_print_height-10)} F600{endif} ; Move print head up\nM84 X Y E ; disable motors [printer:*abl*] -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 Z2 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.0\nG1 Y190 E15.0 F1500.0 ; intro line\nG1 X2.3 F5000\nG1 Y10 E30 F1200.0 ; intro line\nG92 E0.0 +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.0\nG1 Y190 E15.0 F1500.0 ; intro line\nG1 X2.3 F5000\nG1 Y10 E15.0 F1200.0 ; intro line\nG92 E0.0 -[printer:Creality ENDER-3 BLTouch] -inherits = Creality ENDER-3; *abl* +[printer:*invertedz*] +end_gcode = M104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+5, max_print_height)} F600{endif} ; Move print bed down\nG1 X50 Y50 F3000 ; present print\n{if layer_z < max_print_height-10}G1 Z{z_offset+max_print_height-10} F600{endif} ; Move print bed down\nM84 X Y E ; disable motors + +[printer:Creality Ender-3 BLTouch] +inherits = Creality Ender-3; *abl* +renamed_from = "Creality ENDER-3 BLTouch" printer_model = ENDER3BLTOUCH -[printer:Creality ENDER-2] -inherits = Creality ENDER-3 +[printer:Creality Ender-5] +inherits = Creality Ender-3; *invertedz* +retract_length = 6 +bed_shape = 5x2.5,225x2.5,225x222.5,5x222.5 +printer_model = ENDER5 +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_ENDER5\nPRINTER_HAS_BOWDEN +max_print_height = 300 + +[printer:Creality Ender-5 Plus] +inherits = Creality Ender-3; *abl*; *invertedz* +retract_length = 6 +bed_shape = 5x5,355x5,355x355,5x355 +printer_model = ENDER5PLUS +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_ENDER5PLUS\nPRINTER_HAS_BOWDEN +max_print_height = 400 + +[printer:Creality Ender-2] +inherits = Creality Ender-3 +renamed_from = "Creality ENDER-2" 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.0\nG1 X15 Y135 E15.0 F1500.0 ; intro line\nG1 X2.3 F5000\nG1 Y10 E30 F1200.0 ; intro line\nG92 E0.0 -end_gcode = M104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+10, max_print_height)} F600{endif} ; Move print head up\nG1 X0 Y140 F3000 ; present print\nM84 X Y E ; disable motors +start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 ; home all\nG1 Z2 F240\nG1 X2 Y10 F3000\nG1 Z0.28 F240\nG92 E0.0\nG1 X15 Y135 E15.0 F1500.0 ; intro line\nG1 X2.3 F5000\nG1 Y10 E15.0 F1200.0 ; intro line\nG92 E0.0 +end_gcode = M104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+5, max_print_height)} F600{endif} ; Move print head up\nG1 X5 Y140 F3000 ; present print\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)} F600{endif} ; Move print head up\nM84 X Y E ; disable motors + +[printer:Creality CR-10 Mini] +inherits = Creality Ender-3 +retract_length = 6 +bed_shape = 2.5x5,2.5x225,302.5x225,302.5x5 +printer_model = CR10MINI +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_CR10MINI\nPRINTER_HAS_BOWDEN +max_print_height = 300 + +[printer:Creality CR-10] +inherits = Creality Ender-3 +retract_length = 6 +bed_shape = 5x5,305x5,305x305,5x305 +printer_model = CR10 +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_CR10\nPRINTER_HAS_BOWDEN +max_print_height = 400 + +[printer:Creality CR-10 V2] +inherits = Creality Ender-3 +retract_length = 6 +bed_shape = 5x5,305x5,305x305,5x305 +printer_model = CR10V2 +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_CR10V2\nPRINTER_HAS_BOWDEN +max_print_height = 400 + +[printer:Creality CR-10 V3] +inherits = Creality Ender-3 +retract_length = 1 +bed_shape = 5x5,305x5,305x305,5x305 +printer_model = CR10V3 +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_CR10V3 +max_print_height = 400 + +[printer:Creality CR-10 S] +inherits = Creality Ender-3 +retract_length = 6 +bed_shape = 5x5,305x5,305x305,5x305 +printer_model = CR10S +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_CR10S\nPRINTER_HAS_BOWDEN +max_print_height = 400 + +[printer:Creality CR-10 S Pro] +inherits = Creality Ender-3; *abl* +retract_length = 6 +bed_shape = 0x0,300x0,300x300,0x300 +printer_model = CR10SPRO +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_CR10SPRO\nPRINTER_HAS_BOWDEN +max_print_height = 400 + +[printer:Creality CR-10 S Pro V2] +inherits = Creality Ender-3; *abl* +retract_length = 6 +bed_shape = 5x5,305x5,305x305,5x305 +printer_model = CR10SPROV2 +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_CR10SPROV2\nPRINTER_HAS_BOWDEN +max_print_height = 400 + +[printer:Creality CR-10 S4] +inherits = Creality Ender-3 +retract_length = 6 +bed_shape = 5x5,405x5,405x405,5x405 +printer_model = CR10S4 +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_CR10S4\nPRINTER_HAS_BOWDEN +max_print_height = 400 + +[printer:Creality CR-10 S5] +inherits = Creality Ender-3 +retract_length = 6 +bed_shape = 5x5,505x5,505x505,5x505 +printer_model = CR10S5 +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_CR10S5\nPRINTER_HAS_BOWDEN +max_print_height = 500 + +[printer:Creality CR-20] +inherits = Creality Ender-3 +printer_model = CR20 +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_CR20\nPRINTER_HAS_BOWDEN + +[printer:Creality CR-20 Pro] +inherits = Creality Ender-3; *abl* +retract_length = 4 +printer_model = CR20PRO +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_CR20PRO\nPRINTER_HAS_BOWDEN diff --git a/resources/profiles/Creality/CR10MINI_thumbnail.png b/resources/profiles/Creality/CR10MINI_thumbnail.png new file mode 100644 index 0000000000..e0f37fc4f8 Binary files /dev/null and b/resources/profiles/Creality/CR10MINI_thumbnail.png differ diff --git a/resources/profiles/Creality/CR10S4_thumbnail.png b/resources/profiles/Creality/CR10S4_thumbnail.png new file mode 100644 index 0000000000..7a9f460c55 Binary files /dev/null and b/resources/profiles/Creality/CR10S4_thumbnail.png differ diff --git a/resources/profiles/Creality/CR10S5_thumbnail.png b/resources/profiles/Creality/CR10S5_thumbnail.png new file mode 100644 index 0000000000..7a9f460c55 Binary files /dev/null and b/resources/profiles/Creality/CR10S5_thumbnail.png differ diff --git a/resources/profiles/Creality/CR10SPROV2_thumbnail.png b/resources/profiles/Creality/CR10SPROV2_thumbnail.png new file mode 100644 index 0000000000..f71146f1a1 Binary files /dev/null and b/resources/profiles/Creality/CR10SPROV2_thumbnail.png differ diff --git a/resources/profiles/Creality/CR10SPRO_thumbnail.png b/resources/profiles/Creality/CR10SPRO_thumbnail.png new file mode 100644 index 0000000000..72340a8878 Binary files /dev/null and b/resources/profiles/Creality/CR10SPRO_thumbnail.png differ diff --git a/resources/profiles/Creality/CR10S_thumbnail.png b/resources/profiles/Creality/CR10S_thumbnail.png new file mode 100644 index 0000000000..cf6dd04ffa Binary files /dev/null and b/resources/profiles/Creality/CR10S_thumbnail.png differ diff --git a/resources/profiles/Creality/CR10V2_thumbnail.png b/resources/profiles/Creality/CR10V2_thumbnail.png new file mode 100644 index 0000000000..c201c7e4c2 Binary files /dev/null and b/resources/profiles/Creality/CR10V2_thumbnail.png differ diff --git a/resources/profiles/Creality/CR10V3_thumbnail.png b/resources/profiles/Creality/CR10V3_thumbnail.png new file mode 100644 index 0000000000..30f30c07b0 Binary files /dev/null and b/resources/profiles/Creality/CR10V3_thumbnail.png differ diff --git a/resources/profiles/Creality/CR10_thumbnail.png b/resources/profiles/Creality/CR10_thumbnail.png new file mode 100644 index 0000000000..7a3927ee32 Binary files /dev/null and b/resources/profiles/Creality/CR10_thumbnail.png differ diff --git a/resources/profiles/Creality/CR20PRO_thumbnail.png b/resources/profiles/Creality/CR20PRO_thumbnail.png new file mode 100644 index 0000000000..9a006981eb Binary files /dev/null and b/resources/profiles/Creality/CR20PRO_thumbnail.png differ diff --git a/resources/profiles/Creality/CR20_thumbnail.png b/resources/profiles/Creality/CR20_thumbnail.png new file mode 100644 index 0000000000..052659fa5c Binary files /dev/null and b/resources/profiles/Creality/CR20_thumbnail.png differ diff --git a/resources/profiles/Creality/ENDER5PLUS_thumbnail.png b/resources/profiles/Creality/ENDER5PLUS_thumbnail.png new file mode 100644 index 0000000000..98bcaaf7d8 Binary files /dev/null and b/resources/profiles/Creality/ENDER5PLUS_thumbnail.png differ diff --git a/resources/profiles/Creality/ENDER5_thumbnail.png b/resources/profiles/Creality/ENDER5_thumbnail.png new file mode 100644 index 0000000000..eb9d117dbd Binary files /dev/null and b/resources/profiles/Creality/ENDER5_thumbnail.png differ diff --git a/resources/profiles/Creality/cr10.svg b/resources/profiles/Creality/cr10.svg new file mode 100644 index 0000000000..67cb4bd374 --- /dev/null +++ b/resources/profiles/Creality/cr10.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/profiles/Creality/cr10_bed.stl b/resources/profiles/Creality/cr10_bed.stl new file mode 100644 index 0000000000..8329461848 --- /dev/null +++ b/resources/profiles/Creality/cr10_bed.stl @@ -0,0 +1,2774 @@ +solid OpenSCAD_Model + facet normal 0 0 -1 + outer loop + vertex 152.105 -154.998 -3 + vertex 152.002 -154.998 -3 + vertex 152.314 -154.984 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.314 -154.984 -3 + vertex 152.002 -154.998 -3 + vertex 152.521 -154.954 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 155 -152 -3 + vertex 152.002 -154.998 -3 + vertex 152.002 154.998 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.521 -154.954 -3 + vertex 152.002 -154.998 -3 + vertex 152.726 -154.911 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.726 -154.911 -3 + vertex 152.002 -154.998 -3 + vertex 152.927 -154.853 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.927 -154.853 -3 + vertex 152.002 -154.998 -3 + vertex 153.124 -154.782 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 153.124 -154.782 -3 + vertex 152.002 -154.998 -3 + vertex 153.315 -154.696 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 153.315 -154.696 -3 + vertex 152.002 -154.998 -3 + vertex 153.5 -154.598 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 153.5 -154.598 -3 + vertex 152.002 -154.998 -3 + vertex 153.678 -154.487 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 153.678 -154.487 -3 + vertex 152.002 -154.998 -3 + vertex 153.847 -154.364 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 153.847 -154.364 -3 + vertex 152.002 -154.998 -3 + vertex 154.007 -154.229 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.007 -154.229 -3 + vertex 152.002 -154.998 -3 + vertex 154.158 -154.084 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.158 -154.084 -3 + vertex 152.002 -154.998 -3 + vertex 154.298 -153.928 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.298 -153.928 -3 + vertex 152.002 -154.998 -3 + vertex 154.427 -153.763 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.427 -153.763 -3 + vertex 152.002 -154.998 -3 + vertex 154.544 -153.59 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.544 -153.59 -3 + vertex 152.002 -154.998 -3 + vertex 154.649 -153.408 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.649 -153.408 -3 + vertex 152.002 -154.998 -3 + vertex 154.741 -153.22 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.741 -153.22 -3 + vertex 152.002 -154.998 -3 + vertex 154.819 -153.026 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.819 -153.026 -3 + vertex 152.002 -154.998 -3 + vertex 154.884 -152.827 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.884 -152.827 -3 + vertex 152.002 -154.998 -3 + vertex 154.934 -152.624 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.934 -152.624 -3 + vertex 152.002 -154.998 -3 + vertex 154.971 -152.418 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.971 -152.418 -3 + vertex 152.002 -154.998 -3 + vertex 154.993 -152.209 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.993 -152.209 -3 + vertex 152.002 -154.998 -3 + vertex 155 -152 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 155 -152 -3 + vertex 152.002 154.998 -3 + vertex 155 152 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 154.998 -3 + vertex 154.971 152.418 -3 + vertex 154.993 152.209 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 154.884 152.827 -3 + vertex 154.934 152.624 -3 + vertex 152.002 154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 154.741 153.22 -3 + vertex 152.002 154.998 -3 + vertex 154.649 153.408 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 154.741 153.22 -3 + vertex 154.819 153.026 -3 + vertex 152.002 154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 154.998 -3 + vertex 154.007 154.229 -3 + vertex 154.158 154.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 154.427 153.763 -3 + vertex 152.002 154.998 -3 + vertex 154.298 153.928 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 154.427 153.763 -3 + vertex 154.544 153.59 -3 + vertex 152.002 154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 154.298 153.928 -3 + vertex 152.002 154.998 -3 + vertex 154.158 154.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 154.998 -3 + vertex 152.927 154.853 -3 + vertex 153.124 154.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 153.847 154.364 -3 + vertex 152.002 154.998 -3 + vertex 153.678 154.487 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 153.847 154.364 -3 + vertex 154.007 154.229 -3 + vertex 152.002 154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 153.678 154.487 -3 + vertex 152.002 154.998 -3 + vertex 153.5 154.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 153.5 154.598 -3 + vertex 152.002 154.998 -3 + vertex 153.315 154.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 153.315 154.696 -3 + vertex 152.002 154.998 -3 + vertex 153.124 154.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 154.649 153.408 -3 + vertex 152.002 154.998 -3 + vertex 154.544 153.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.726 154.911 -3 + vertex 152.002 154.998 -3 + vertex 152.521 154.954 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 152.726 154.911 -3 + vertex 152.927 154.853 -3 + vertex 152.002 154.998 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 154.819 153.026 -3 + vertex 154.884 152.827 -3 + vertex 152.002 154.998 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 152.314 154.984 -3 + vertex 152.521 154.954 -3 + vertex 152.002 154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 154.998 -3 + vertex 154.934 152.624 -3 + vertex 154.971 152.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 154.998 -3 + vertex 152.105 154.998 -3 + vertex 152.314 154.984 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 155 152 -3 + vertex 152.002 154.998 -3 + vertex 154.993 152.209 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex -152 155 -3 + vertex 152 155 -3 + vertex -152.002 154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex 152 155 -3 + vertex 152.002 154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 -154.998 -3 + vertex -152.002 154.998 -3 + vertex 152.002 154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -155 -152 -3 + vertex -155 152 -3 + vertex -152.002 -154.998 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -152.314 154.984 -3 + vertex -152.105 154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -152.521 154.954 -3 + vertex -152.314 154.984 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -152.726 154.911 -3 + vertex -152.521 154.954 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -152.927 154.853 -3 + vertex -152.726 154.911 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -153.124 154.782 -3 + vertex -152.927 154.853 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -153.315 154.696 -3 + vertex -153.124 154.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -153.5 154.598 -3 + vertex -153.315 154.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -153.678 154.487 -3 + vertex -153.5 154.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -153.847 154.364 -3 + vertex -153.678 154.487 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -154.007 154.229 -3 + vertex -153.847 154.364 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -154.158 154.084 -3 + vertex -154.007 154.229 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -154.298 153.928 -3 + vertex -154.158 154.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -154.427 153.763 -3 + vertex -154.298 153.928 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -154.544 153.59 -3 + vertex -154.427 153.763 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -154.649 153.408 -3 + vertex -154.544 153.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -154.741 153.22 -3 + vertex -154.649 153.408 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -154.819 153.026 -3 + vertex -154.741 153.22 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -154.884 152.827 -3 + vertex -154.819 153.026 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -154.934 152.624 -3 + vertex -154.884 152.827 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -154.971 152.418 -3 + vertex -154.934 152.624 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -154.993 152.209 -3 + vertex -154.971 152.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -155 152 -3 + vertex -154.993 152.209 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -154.998 -3 + vertex -155 152 -3 + vertex -152.002 154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 -154.998 -3 + vertex -152.002 -154.998 -3 + vertex -152.002 154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -154.998 -3 + vertex -154.971 -152.418 -3 + vertex -154.993 -152.209 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.884 -152.827 -3 + vertex -154.934 -152.624 -3 + vertex -152.002 -154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.741 -153.22 -3 + vertex -152.002 -154.998 -3 + vertex -154.649 -153.408 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.741 -153.22 -3 + vertex -154.819 -153.026 -3 + vertex -152.002 -154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -154.998 -3 + vertex -154.007 -154.229 -3 + vertex -154.158 -154.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.427 -153.763 -3 + vertex -152.002 -154.998 -3 + vertex -154.298 -153.928 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.427 -153.763 -3 + vertex -154.544 -153.59 -3 + vertex -152.002 -154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.298 -153.928 -3 + vertex -152.002 -154.998 -3 + vertex -154.158 -154.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -154.998 -3 + vertex -152.927 -154.853 -3 + vertex -153.124 -154.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -153.847 -154.364 -3 + vertex -152.002 -154.998 -3 + vertex -153.678 -154.487 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -153.847 -154.364 -3 + vertex -154.007 -154.229 -3 + vertex -152.002 -154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -153.678 -154.487 -3 + vertex -152.002 -154.998 -3 + vertex -153.5 -154.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -153.5 -154.598 -3 + vertex -152.002 -154.998 -3 + vertex -153.315 -154.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -153.315 -154.696 -3 + vertex -152.002 -154.998 -3 + vertex -153.124 -154.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.649 -153.408 -3 + vertex -152.002 -154.998 -3 + vertex -154.544 -153.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.726 -154.911 -3 + vertex -152.002 -154.998 -3 + vertex -152.521 -154.954 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.726 -154.911 -3 + vertex -152.927 -154.853 -3 + vertex -152.002 -154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.819 -153.026 -3 + vertex -154.884 -152.827 -3 + vertex -152.002 -154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.314 -154.984 -3 + vertex -152.521 -154.954 -3 + vertex -152.002 -154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -154.998 -3 + vertex -154.934 -152.624 -3 + vertex -154.971 -152.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -154.998 -3 + vertex -152.105 -154.998 -3 + vertex -152.314 -154.984 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.002 -154.998 -3 + vertex 152 -155 -3 + vertex -152.002 -154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -154.998 -3 + vertex 152 -155 -3 + vertex -152 -155 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -155 -152 -3 + vertex -152.002 -154.998 -3 + vertex -154.993 -152.209 -3 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.314 -154.984 0 + vertex 152.002 -154.998 0 + vertex 152.105 -154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.521 -154.954 0 + vertex 152.002 -154.998 0 + vertex 152.314 -154.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 154.998 0 + vertex 152.002 -154.998 0 + vertex 155 -152 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.726 -154.911 0 + vertex 152.002 -154.998 0 + vertex 152.521 -154.954 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.927 -154.853 0 + vertex 152.002 -154.998 0 + vertex 152.726 -154.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.124 -154.782 0 + vertex 152.002 -154.998 0 + vertex 152.927 -154.853 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.315 -154.696 0 + vertex 152.002 -154.998 0 + vertex 153.124 -154.782 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.5 -154.598 0 + vertex 152.002 -154.998 0 + vertex 153.315 -154.696 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.678 -154.487 0 + vertex 152.002 -154.998 0 + vertex 153.5 -154.598 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.847 -154.364 0 + vertex 152.002 -154.998 0 + vertex 153.678 -154.487 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.007 -154.229 0 + vertex 152.002 -154.998 0 + vertex 153.847 -154.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.158 -154.084 0 + vertex 152.002 -154.998 0 + vertex 154.007 -154.229 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.298 -153.928 0 + vertex 152.002 -154.998 0 + vertex 154.158 -154.084 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.427 -153.763 0 + vertex 152.002 -154.998 0 + vertex 154.298 -153.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.544 -153.59 0 + vertex 152.002 -154.998 0 + vertex 154.427 -153.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.649 -153.408 0 + vertex 152.002 -154.998 0 + vertex 154.544 -153.59 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.741 -153.22 0 + vertex 152.002 -154.998 0 + vertex 154.649 -153.408 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.819 -153.026 0 + vertex 152.002 -154.998 0 + vertex 154.741 -153.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.884 -152.827 0 + vertex 152.002 -154.998 0 + vertex 154.819 -153.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.934 -152.624 0 + vertex 152.002 -154.998 0 + vertex 154.884 -152.827 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.971 -152.418 0 + vertex 152.002 -154.998 0 + vertex 154.934 -152.624 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.993 -152.209 0 + vertex 152.002 -154.998 0 + vertex 154.971 -152.418 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 155 -152 0 + vertex 152.002 -154.998 0 + vertex 154.993 -152.209 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 155 152 0 + vertex 152.002 154.998 0 + vertex 155 -152 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.993 152.209 0 + vertex 154.971 152.418 0 + vertex 152.002 154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 154.998 0 + vertex 154.934 152.624 0 + vertex 154.884 152.827 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.649 153.408 0 + vertex 152.002 154.998 0 + vertex 154.741 153.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 154.998 0 + vertex 154.819 153.026 0 + vertex 154.741 153.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.158 154.084 0 + vertex 154.007 154.229 0 + vertex 152.002 154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.298 153.928 0 + vertex 152.002 154.998 0 + vertex 154.427 153.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 154.998 0 + vertex 154.544 153.59 0 + vertex 154.427 153.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.158 154.084 0 + vertex 152.002 154.998 0 + vertex 154.298 153.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.124 154.782 0 + vertex 152.927 154.853 0 + vertex 152.002 154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.678 154.487 0 + vertex 152.002 154.998 0 + vertex 153.847 154.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 154.998 0 + vertex 154.007 154.229 0 + vertex 153.847 154.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.5 154.598 0 + vertex 152.002 154.998 0 + vertex 153.678 154.487 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.315 154.696 0 + vertex 152.002 154.998 0 + vertex 153.5 154.598 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.124 154.782 0 + vertex 152.002 154.998 0 + vertex 153.315 154.696 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.544 153.59 0 + vertex 152.002 154.998 0 + vertex 154.649 153.408 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.521 154.954 0 + vertex 152.002 154.998 0 + vertex 152.726 154.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 154.998 0 + vertex 152.927 154.853 0 + vertex 152.726 154.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 154.998 0 + vertex 154.884 152.827 0 + vertex 154.819 153.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 154.998 0 + vertex 152.521 154.954 0 + vertex 152.314 154.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.971 152.418 0 + vertex 154.934 152.624 0 + vertex 152.002 154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.314 154.984 0 + vertex 152.105 154.998 0 + vertex 152.002 154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.993 152.209 0 + vertex 152.002 154.998 0 + vertex 155 152 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 154.998 0 + vertex 152 155 0 + vertex -152 155 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 154.998 0 + vertex 152 155 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 154.998 0 + vertex -152.002 154.998 0 + vertex 152.002 -154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -154.998 0 + vertex -155 152 0 + vertex -155 -152 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.105 154.998 0 + vertex -152.314 154.984 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.314 154.984 0 + vertex -152.521 154.954 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.521 154.954 0 + vertex -152.726 154.911 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.726 154.911 0 + vertex -152.927 154.853 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.927 154.853 0 + vertex -153.124 154.782 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -153.124 154.782 0 + vertex -153.315 154.696 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -153.315 154.696 0 + vertex -153.5 154.598 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -153.5 154.598 0 + vertex -153.678 154.487 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -153.678 154.487 0 + vertex -153.847 154.364 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -153.847 154.364 0 + vertex -154.007 154.229 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.007 154.229 0 + vertex -154.158 154.084 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.158 154.084 0 + vertex -154.298 153.928 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.298 153.928 0 + vertex -154.427 153.763 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.427 153.763 0 + vertex -154.544 153.59 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.544 153.59 0 + vertex -154.649 153.408 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.649 153.408 0 + vertex -154.741 153.22 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.741 153.22 0 + vertex -154.819 153.026 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.819 153.026 0 + vertex -154.884 152.827 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.884 152.827 0 + vertex -154.934 152.624 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.934 152.624 0 + vertex -154.971 152.418 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.971 152.418 0 + vertex -154.993 152.209 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.993 152.209 0 + vertex -155 152 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 154.998 0 + vertex -155 152 0 + vertex -152.002 -154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 154.998 0 + vertex -152.002 -154.998 0 + vertex 152.002 -154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -154.993 -152.209 0 + vertex -154.971 -152.418 0 + vertex -152.002 -154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -154.998 0 + vertex -154.934 -152.624 0 + vertex -154.884 -152.827 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -154.649 -153.408 0 + vertex -152.002 -154.998 0 + vertex -154.741 -153.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -154.998 0 + vertex -154.819 -153.026 0 + vertex -154.741 -153.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -154.158 -154.084 0 + vertex -154.007 -154.229 0 + vertex -152.002 -154.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -154.298 -153.928 0 + vertex -152.002 -154.998 0 + vertex -154.427 -153.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -154.998 0 + vertex -154.544 -153.59 0 + vertex -154.427 -153.763 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -154.158 -154.084 0 + vertex -152.002 -154.998 0 + vertex -154.298 -153.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -153.124 -154.782 0 + vertex -152.927 -154.853 0 + vertex -152.002 -154.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -153.678 -154.487 0 + vertex -152.002 -154.998 0 + vertex -153.847 -154.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -154.998 0 + vertex -154.007 -154.229 0 + vertex -153.847 -154.364 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -153.5 -154.598 0 + vertex -152.002 -154.998 0 + vertex -153.678 -154.487 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -153.315 -154.696 0 + vertex -152.002 -154.998 0 + vertex -153.5 -154.598 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -153.124 -154.782 0 + vertex -152.002 -154.998 0 + vertex -153.315 -154.696 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -154.544 -153.59 0 + vertex -152.002 -154.998 0 + vertex -154.649 -153.408 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -152.521 -154.954 0 + vertex -152.002 -154.998 0 + vertex -152.726 -154.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -154.998 0 + vertex -152.927 -154.853 0 + vertex -152.726 -154.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -154.998 0 + vertex -154.884 -152.827 0 + vertex -154.819 -153.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -154.998 0 + vertex -152.521 -154.954 0 + vertex -152.314 -154.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -154.971 -152.418 0 + vertex -154.934 -152.624 0 + vertex -152.002 -154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.314 -154.984 0 + vertex -152.105 -154.998 0 + vertex -152.002 -154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.002 -154.998 0 + vertex 152 -155 0 + vertex 152.002 -154.998 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex -152 -155 0 + vertex 152 -155 0 + vertex -152.002 -154.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -154.993 -152.209 0 + vertex -152.002 -154.998 0 + vertex -155 -152 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 152.105 -154.998 -3 + vertex 152.002 -154.998 0 + vertex 152.002 -154.998 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 152.105 -154.998 -3 + vertex 152.105 -154.998 0 + vertex 152.002 -154.998 0 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 152.314 -154.984 -3 + vertex 152.105 -154.998 0 + vertex 152.105 -154.998 -3 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 152.314 -154.984 -3 + vertex 152.314 -154.984 0 + vertex 152.105 -154.998 0 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 152.521 -154.954 -3 + vertex 152.314 -154.984 0 + vertex 152.314 -154.984 -3 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 152.521 -154.954 -3 + vertex 152.521 -154.954 0 + vertex 152.314 -154.984 0 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 152.726 -154.911 -3 + vertex 152.521 -154.954 0 + vertex 152.521 -154.954 -3 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 152.726 -154.911 -3 + vertex 152.726 -154.911 0 + vertex 152.521 -154.954 0 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 152.927 -154.853 -3 + vertex 152.726 -154.911 0 + vertex 152.726 -154.911 -3 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 152.927 -154.853 -3 + vertex 152.927 -154.853 0 + vertex 152.726 -154.911 0 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 153.124 -154.782 -3 + vertex 152.927 -154.853 0 + vertex 152.927 -154.853 -3 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 153.124 -154.782 -3 + vertex 153.124 -154.782 0 + vertex 152.927 -154.853 0 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 153.315 -154.696 -3 + vertex 153.124 -154.782 0 + vertex 153.124 -154.782 -3 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 153.315 -154.696 -3 + vertex 153.315 -154.696 0 + vertex 153.124 -154.782 0 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 153.5 -154.598 -3 + vertex 153.315 -154.696 0 + vertex 153.315 -154.696 -3 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 153.5 -154.598 -3 + vertex 153.5 -154.598 0 + vertex 153.315 -154.696 0 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 153.678 -154.487 -3 + vertex 153.5 -154.598 0 + vertex 153.5 -154.598 -3 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 153.678 -154.487 -3 + vertex 153.678 -154.487 0 + vertex 153.5 -154.598 0 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 153.847 -154.364 -3 + vertex 153.678 -154.487 0 + vertex 153.678 -154.487 -3 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 153.847 -154.364 -3 + vertex 153.847 -154.364 0 + vertex 153.678 -154.487 0 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 154.007 -154.229 -3 + vertex 153.847 -154.364 0 + vertex 153.847 -154.364 -3 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 154.007 -154.229 -3 + vertex 154.007 -154.229 0 + vertex 153.847 -154.364 0 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 154.158 -154.084 -3 + vertex 154.007 -154.229 0 + vertex 154.007 -154.229 -3 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 154.158 -154.084 -3 + vertex 154.158 -154.084 0 + vertex 154.007 -154.229 0 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 154.298 -153.928 -3 + vertex 154.158 -154.084 0 + vertex 154.158 -154.084 -3 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 154.298 -153.928 -3 + vertex 154.298 -153.928 0 + vertex 154.158 -154.084 0 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 154.427 -153.763 -3 + vertex 154.298 -153.928 0 + vertex 154.298 -153.928 -3 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 154.427 -153.763 -3 + vertex 154.427 -153.763 0 + vertex 154.298 -153.928 0 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 154.544 -153.59 -3 + vertex 154.427 -153.763 0 + vertex 154.427 -153.763 -3 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 154.544 -153.59 -3 + vertex 154.544 -153.59 0 + vertex 154.427 -153.763 0 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 154.649 -153.408 -3 + vertex 154.544 -153.59 0 + vertex 154.544 -153.59 -3 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 154.649 -153.408 -3 + vertex 154.649 -153.408 0 + vertex 154.544 -153.59 0 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 154.741 -153.22 -3 + vertex 154.649 -153.408 0 + vertex 154.649 -153.408 -3 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 154.741 -153.22 -3 + vertex 154.741 -153.22 0 + vertex 154.649 -153.408 0 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 154.819 -153.026 -3 + vertex 154.741 -153.22 0 + vertex 154.741 -153.22 -3 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 154.819 -153.026 -3 + vertex 154.819 -153.026 0 + vertex 154.741 -153.22 0 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 154.884 -152.827 -3 + vertex 154.819 -153.026 0 + vertex 154.819 -153.026 -3 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 154.884 -152.827 -3 + vertex 154.884 -152.827 0 + vertex 154.819 -153.026 0 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 154.934 -152.624 -3 + vertex 154.884 -152.827 0 + vertex 154.884 -152.827 -3 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 154.934 -152.624 -3 + vertex 154.934 -152.624 0 + vertex 154.884 -152.827 0 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 154.971 -152.418 -3 + vertex 154.934 -152.624 0 + vertex 154.934 -152.624 -3 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 154.971 -152.418 -3 + vertex 154.971 -152.418 0 + vertex 154.934 -152.624 0 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 154.993 -152.209 -3 + vertex 154.971 -152.418 0 + vertex 154.971 -152.418 -3 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 154.993 -152.209 -3 + vertex 154.993 -152.209 0 + vertex 154.971 -152.418 0 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 155 -152 -3 + vertex 154.993 -152.209 0 + vertex 154.993 -152.209 -3 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 155 -152 -3 + vertex 155 -152 0 + vertex 154.993 -152.209 0 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 155 152 -3 + vertex 155 -152 0 + vertex 155 -152 -3 + endloop + endfacet + facet normal 1 0 -0 + outer loop + vertex 155 152 -3 + vertex 155 152 0 + vertex 155 -152 0 + endloop + endfacet + facet normal 0.99944 0.0334741 0 + outer loop + vertex 154.993 152.209 -3 + vertex 155 152 0 + vertex 155 152 -3 + endloop + endfacet + facet normal 0.99944 0.0334741 -0 + outer loop + vertex 154.993 152.209 -3 + vertex 154.993 152.209 0 + vertex 155 152 0 + endloop + endfacet + facet normal 0.994505 0.104685 0 + outer loop + vertex 154.971 152.418 -3 + vertex 154.993 152.209 0 + vertex 154.993 152.209 -3 + endloop + endfacet + facet normal 0.994505 0.104685 -0 + outer loop + vertex 154.971 152.418 -3 + vertex 154.971 152.418 0 + vertex 154.993 152.209 0 + endloop + endfacet + facet normal 0.98425 0.176783 0 + outer loop + vertex 154.934 152.624 -3 + vertex 154.971 152.418 0 + vertex 154.971 152.418 -3 + endloop + endfacet + facet normal 0.98425 0.176783 -0 + outer loop + vertex 154.934 152.624 -3 + vertex 154.934 152.624 0 + vertex 154.971 152.418 0 + endloop + endfacet + facet normal 0.970981 0.239158 0 + outer loop + vertex 154.884 152.827 -3 + vertex 154.934 152.624 0 + vertex 154.934 152.624 -3 + endloop + endfacet + facet normal 0.970981 0.239158 -0 + outer loop + vertex 154.884 152.827 -3 + vertex 154.884 152.827 0 + vertex 154.934 152.624 0 + endloop + endfacet + facet normal 0.950577 0.31049 0 + outer loop + vertex 154.819 153.026 -3 + vertex 154.884 152.827 0 + vertex 154.884 152.827 -3 + endloop + endfacet + facet normal 0.950577 0.31049 -0 + outer loop + vertex 154.819 153.026 -3 + vertex 154.819 153.026 0 + vertex 154.884 152.827 0 + endloop + endfacet + facet normal 0.927816 0.373039 0 + outer loop + vertex 154.741 153.22 -3 + vertex 154.819 153.026 0 + vertex 154.819 153.026 -3 + endloop + endfacet + facet normal 0.927816 0.373039 -0 + outer loop + vertex 154.741 153.22 -3 + vertex 154.741 153.22 0 + vertex 154.819 153.026 0 + endloop + endfacet + facet normal 0.898217 0.439553 0 + outer loop + vertex 154.649 153.408 -3 + vertex 154.741 153.22 0 + vertex 154.741 153.22 -3 + endloop + endfacet + facet normal 0.898217 0.439553 -0 + outer loop + vertex 154.649 153.408 -3 + vertex 154.649 153.408 0 + vertex 154.741 153.22 0 + endloop + endfacet + facet normal 0.866186 0.499722 0 + outer loop + vertex 154.544 153.59 -3 + vertex 154.649 153.408 0 + vertex 154.649 153.408 -3 + endloop + endfacet + facet normal 0.866186 0.499722 -0 + outer loop + vertex 154.544 153.59 -3 + vertex 154.544 153.59 0 + vertex 154.649 153.408 0 + endloop + endfacet + facet normal 0.828349 0.560213 0 + outer loop + vertex 154.427 153.763 -3 + vertex 154.544 153.59 0 + vertex 154.544 153.59 -3 + endloop + endfacet + facet normal 0.828349 0.560213 -0 + outer loop + vertex 154.427 153.763 -3 + vertex 154.427 153.763 0 + vertex 154.544 153.59 0 + endloop + endfacet + facet normal 0.787807 0.615922 0 + outer loop + vertex 154.298 153.928 -3 + vertex 154.427 153.763 0 + vertex 154.427 153.763 -3 + endloop + endfacet + facet normal 0.787807 0.615922 -0 + outer loop + vertex 154.298 153.928 -3 + vertex 154.298 153.928 0 + vertex 154.427 153.763 0 + endloop + endfacet + facet normal 0.744242 0.66791 0 + outer loop + vertex 154.158 154.084 -3 + vertex 154.298 153.928 0 + vertex 154.298 153.928 -3 + endloop + endfacet + facet normal 0.744242 0.66791 -0 + outer loop + vertex 154.158 154.084 -3 + vertex 154.158 154.084 0 + vertex 154.298 153.928 0 + endloop + endfacet + facet normal 0.692631 0.721292 0 + outer loop + vertex 154.007 154.229 -3 + vertex 154.158 154.084 0 + vertex 154.158 154.084 -3 + endloop + endfacet + facet normal 0.692631 0.721292 -0 + outer loop + vertex 154.007 154.229 -3 + vertex 154.007 154.229 0 + vertex 154.158 154.084 0 + endloop + endfacet + facet normal 0.644871 0.764291 0 + outer loop + vertex 153.847 154.364 -3 + vertex 154.007 154.229 0 + vertex 154.007 154.229 -3 + endloop + endfacet + facet normal 0.644871 0.764291 -0 + outer loop + vertex 153.847 154.364 -3 + vertex 153.847 154.364 0 + vertex 154.007 154.229 0 + endloop + endfacet + facet normal 0.588456 0.808529 0 + outer loop + vertex 153.678 154.487 -3 + vertex 153.847 154.364 0 + vertex 153.847 154.364 -3 + endloop + endfacet + facet normal 0.588456 0.808529 -0 + outer loop + vertex 153.678 154.487 -3 + vertex 153.678 154.487 0 + vertex 153.847 154.364 0 + endloop + endfacet + facet normal 0.529142 0.848533 0 + outer loop + vertex 153.5 154.598 -3 + vertex 153.678 154.487 0 + vertex 153.678 154.487 -3 + endloop + endfacet + facet normal 0.529142 0.848533 -0 + outer loop + vertex 153.5 154.598 -3 + vertex 153.5 154.598 0 + vertex 153.678 154.487 0 + endloop + endfacet + facet normal 0.468107 0.883672 0 + outer loop + vertex 153.315 154.696 -3 + vertex 153.5 154.598 0 + vertex 153.5 154.598 -3 + endloop + endfacet + facet normal 0.468107 0.883672 -0 + outer loop + vertex 153.315 154.696 -3 + vertex 153.315 154.696 0 + vertex 153.5 154.598 0 + endloop + endfacet + facet normal 0.410563 0.911832 0 + outer loop + vertex 153.124 154.782 -3 + vertex 153.315 154.696 0 + vertex 153.315 154.696 -3 + endloop + endfacet + facet normal 0.410563 0.911832 -0 + outer loop + vertex 153.124 154.782 -3 + vertex 153.124 154.782 0 + vertex 153.315 154.696 0 + endloop + endfacet + facet normal 0.339058 0.940766 0 + outer loop + vertex 152.927 154.853 -3 + vertex 153.124 154.782 0 + vertex 153.124 154.782 -3 + endloop + endfacet + facet normal 0.339058 0.940766 -0 + outer loop + vertex 152.927 154.853 -3 + vertex 152.927 154.853 0 + vertex 153.124 154.782 0 + endloop + endfacet + facet normal 0.277246 0.960799 0 + outer loop + vertex 152.726 154.911 -3 + vertex 152.927 154.853 0 + vertex 152.927 154.853 -3 + endloop + endfacet + facet normal 0.277246 0.960799 -0 + outer loop + vertex 152.726 154.911 -3 + vertex 152.726 154.911 0 + vertex 152.927 154.853 0 + endloop + endfacet + facet normal 0.205289 0.978701 0 + outer loop + vertex 152.521 154.954 -3 + vertex 152.726 154.911 0 + vertex 152.726 154.911 -3 + endloop + endfacet + facet normal 0.205289 0.978701 -0 + outer loop + vertex 152.521 154.954 -3 + vertex 152.521 154.954 0 + vertex 152.726 154.911 0 + endloop + endfacet + facet normal 0.143429 0.989661 0 + outer loop + vertex 152.314 154.984 -3 + vertex 152.521 154.954 0 + vertex 152.521 154.954 -3 + endloop + endfacet + facet normal 0.143429 0.989661 -0 + outer loop + vertex 152.314 154.984 -3 + vertex 152.314 154.984 0 + vertex 152.521 154.954 0 + endloop + endfacet + facet normal 0.0668359 0.997764 0 + outer loop + vertex 152.105 154.998 -3 + vertex 152.314 154.984 0 + vertex 152.314 154.984 -3 + endloop + endfacet + facet normal 0.0668359 0.997764 -0 + outer loop + vertex 152.105 154.998 -3 + vertex 152.105 154.998 0 + vertex 152.314 154.984 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 152.002 154.998 -3 + vertex 152.105 154.998 0 + vertex 152.105 154.998 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 152.002 154.998 -3 + vertex 152.002 154.998 0 + vertex 152.105 154.998 0 + endloop + endfacet + facet normal 0.707107 0.707107 0 + outer loop + vertex 152 155 -3 + vertex 152.002 154.998 0 + vertex 152.002 154.998 -3 + endloop + endfacet + facet normal 0.707107 0.707107 -0 + outer loop + vertex 152 155 -3 + vertex 152 155 0 + vertex 152.002 154.998 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -152 155 -3 + vertex 152 155 0 + vertex 152 155 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -152 155 -3 + vertex -152 155 0 + vertex 152 155 0 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -152.002 154.998 -3 + vertex -152 155 0 + vertex -152 155 -3 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -152.002 154.998 -3 + vertex -152.002 154.998 0 + vertex -152 155 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -152.105 154.998 -3 + vertex -152.002 154.998 0 + vertex -152.002 154.998 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -152.105 154.998 -3 + vertex -152.105 154.998 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -152.314 154.984 -3 + vertex -152.105 154.998 0 + vertex -152.105 154.998 -3 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -152.314 154.984 -3 + vertex -152.314 154.984 0 + vertex -152.105 154.998 0 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -152.521 154.954 -3 + vertex -152.314 154.984 0 + vertex -152.314 154.984 -3 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -152.521 154.954 -3 + vertex -152.521 154.954 0 + vertex -152.314 154.984 0 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -152.726 154.911 -3 + vertex -152.521 154.954 0 + vertex -152.521 154.954 -3 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -152.726 154.911 -3 + vertex -152.726 154.911 0 + vertex -152.521 154.954 0 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -152.927 154.853 -3 + vertex -152.726 154.911 0 + vertex -152.726 154.911 -3 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -152.927 154.853 -3 + vertex -152.927 154.853 0 + vertex -152.726 154.911 0 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -153.124 154.782 -3 + vertex -152.927 154.853 0 + vertex -152.927 154.853 -3 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -153.124 154.782 -3 + vertex -153.124 154.782 0 + vertex -152.927 154.853 0 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -153.315 154.696 -3 + vertex -153.124 154.782 0 + vertex -153.124 154.782 -3 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -153.315 154.696 -3 + vertex -153.315 154.696 0 + vertex -153.124 154.782 0 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -153.5 154.598 -3 + vertex -153.315 154.696 0 + vertex -153.315 154.696 -3 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -153.5 154.598 -3 + vertex -153.5 154.598 0 + vertex -153.315 154.696 0 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -153.678 154.487 -3 + vertex -153.5 154.598 0 + vertex -153.5 154.598 -3 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -153.678 154.487 -3 + vertex -153.678 154.487 0 + vertex -153.5 154.598 0 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -153.847 154.364 -3 + vertex -153.678 154.487 0 + vertex -153.678 154.487 -3 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -153.847 154.364 -3 + vertex -153.847 154.364 0 + vertex -153.678 154.487 0 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -154.007 154.229 -3 + vertex -153.847 154.364 0 + vertex -153.847 154.364 -3 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -154.007 154.229 -3 + vertex -154.007 154.229 0 + vertex -153.847 154.364 0 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -154.158 154.084 -3 + vertex -154.007 154.229 0 + vertex -154.007 154.229 -3 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -154.158 154.084 -3 + vertex -154.158 154.084 0 + vertex -154.007 154.229 0 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -154.298 153.928 -3 + vertex -154.158 154.084 0 + vertex -154.158 154.084 -3 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -154.298 153.928 -3 + vertex -154.298 153.928 0 + vertex -154.158 154.084 0 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -154.427 153.763 -3 + vertex -154.298 153.928 0 + vertex -154.298 153.928 -3 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -154.427 153.763 -3 + vertex -154.427 153.763 0 + vertex -154.298 153.928 0 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -154.544 153.59 -3 + vertex -154.427 153.763 0 + vertex -154.427 153.763 -3 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -154.544 153.59 -3 + vertex -154.544 153.59 0 + vertex -154.427 153.763 0 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -154.649 153.408 -3 + vertex -154.544 153.59 0 + vertex -154.544 153.59 -3 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -154.649 153.408 -3 + vertex -154.649 153.408 0 + vertex -154.544 153.59 0 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -154.741 153.22 -3 + vertex -154.649 153.408 0 + vertex -154.649 153.408 -3 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -154.741 153.22 -3 + vertex -154.741 153.22 0 + vertex -154.649 153.408 0 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -154.819 153.026 -3 + vertex -154.741 153.22 0 + vertex -154.741 153.22 -3 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -154.819 153.026 -3 + vertex -154.819 153.026 0 + vertex -154.741 153.22 0 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -154.884 152.827 -3 + vertex -154.819 153.026 0 + vertex -154.819 153.026 -3 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -154.884 152.827 -3 + vertex -154.884 152.827 0 + vertex -154.819 153.026 0 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -154.934 152.624 -3 + vertex -154.884 152.827 0 + vertex -154.884 152.827 -3 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -154.934 152.624 -3 + vertex -154.934 152.624 0 + vertex -154.884 152.827 0 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -154.971 152.418 -3 + vertex -154.934 152.624 0 + vertex -154.934 152.624 -3 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -154.971 152.418 -3 + vertex -154.971 152.418 0 + vertex -154.934 152.624 0 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -154.993 152.209 -3 + vertex -154.971 152.418 0 + vertex -154.971 152.418 -3 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -154.993 152.209 -3 + vertex -154.993 152.209 0 + vertex -154.971 152.418 0 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -155 152 -3 + vertex -154.993 152.209 0 + vertex -154.993 152.209 -3 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -155 152 -3 + vertex -155 152 0 + vertex -154.993 152.209 0 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -155 -152 -3 + vertex -155 152 0 + vertex -155 152 -3 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -155 -152 -3 + vertex -155 -152 0 + vertex -155 152 0 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -154.993 -152.209 -3 + vertex -155 -152 0 + vertex -155 -152 -3 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -154.993 -152.209 -3 + vertex -154.993 -152.209 0 + vertex -155 -152 0 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -154.971 -152.418 -3 + vertex -154.993 -152.209 0 + vertex -154.993 -152.209 -3 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -154.971 -152.418 -3 + vertex -154.971 -152.418 0 + vertex -154.993 -152.209 0 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -154.934 -152.624 -3 + vertex -154.971 -152.418 0 + vertex -154.971 -152.418 -3 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -154.934 -152.624 -3 + vertex -154.934 -152.624 0 + vertex -154.971 -152.418 0 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -154.884 -152.827 -3 + vertex -154.934 -152.624 0 + vertex -154.934 -152.624 -3 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -154.884 -152.827 -3 + vertex -154.884 -152.827 0 + vertex -154.934 -152.624 0 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -154.819 -153.026 -3 + vertex -154.884 -152.827 0 + vertex -154.884 -152.827 -3 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -154.819 -153.026 -3 + vertex -154.819 -153.026 0 + vertex -154.884 -152.827 0 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -154.741 -153.22 -3 + vertex -154.819 -153.026 0 + vertex -154.819 -153.026 -3 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -154.741 -153.22 -3 + vertex -154.741 -153.22 0 + vertex -154.819 -153.026 0 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -154.649 -153.408 -3 + vertex -154.741 -153.22 0 + vertex -154.741 -153.22 -3 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -154.649 -153.408 -3 + vertex -154.649 -153.408 0 + vertex -154.741 -153.22 0 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -154.544 -153.59 -3 + vertex -154.649 -153.408 0 + vertex -154.649 -153.408 -3 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -154.544 -153.59 -3 + vertex -154.544 -153.59 0 + vertex -154.649 -153.408 0 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -154.427 -153.763 -3 + vertex -154.544 -153.59 0 + vertex -154.544 -153.59 -3 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -154.427 -153.763 -3 + vertex -154.427 -153.763 0 + vertex -154.544 -153.59 0 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -154.298 -153.928 -3 + vertex -154.427 -153.763 0 + vertex -154.427 -153.763 -3 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -154.298 -153.928 -3 + vertex -154.298 -153.928 0 + vertex -154.427 -153.763 0 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -154.158 -154.084 -3 + vertex -154.298 -153.928 0 + vertex -154.298 -153.928 -3 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -154.158 -154.084 -3 + vertex -154.158 -154.084 0 + vertex -154.298 -153.928 0 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -154.007 -154.229 -3 + vertex -154.158 -154.084 0 + vertex -154.158 -154.084 -3 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -154.007 -154.229 -3 + vertex -154.007 -154.229 0 + vertex -154.158 -154.084 0 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -153.847 -154.364 -3 + vertex -154.007 -154.229 0 + vertex -154.007 -154.229 -3 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -153.847 -154.364 -3 + vertex -153.847 -154.364 0 + vertex -154.007 -154.229 0 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -153.678 -154.487 -3 + vertex -153.847 -154.364 0 + vertex -153.847 -154.364 -3 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -153.678 -154.487 -3 + vertex -153.678 -154.487 0 + vertex -153.847 -154.364 0 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -153.5 -154.598 -3 + vertex -153.678 -154.487 0 + vertex -153.678 -154.487 -3 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -153.5 -154.598 -3 + vertex -153.5 -154.598 0 + vertex -153.678 -154.487 0 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -153.315 -154.696 -3 + vertex -153.5 -154.598 0 + vertex -153.5 -154.598 -3 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -153.315 -154.696 -3 + vertex -153.315 -154.696 0 + vertex -153.5 -154.598 0 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -153.124 -154.782 -3 + vertex -153.315 -154.696 0 + vertex -153.315 -154.696 -3 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -153.124 -154.782 -3 + vertex -153.124 -154.782 0 + vertex -153.315 -154.696 0 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -152.927 -154.853 -3 + vertex -153.124 -154.782 0 + vertex -153.124 -154.782 -3 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -152.927 -154.853 -3 + vertex -152.927 -154.853 0 + vertex -153.124 -154.782 0 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -152.726 -154.911 -3 + vertex -152.927 -154.853 0 + vertex -152.927 -154.853 -3 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -152.726 -154.911 -3 + vertex -152.726 -154.911 0 + vertex -152.927 -154.853 0 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -152.521 -154.954 -3 + vertex -152.726 -154.911 0 + vertex -152.726 -154.911 -3 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -152.521 -154.954 -3 + vertex -152.521 -154.954 0 + vertex -152.726 -154.911 0 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -152.314 -154.984 -3 + vertex -152.521 -154.954 0 + vertex -152.521 -154.954 -3 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -152.314 -154.984 -3 + vertex -152.314 -154.984 0 + vertex -152.521 -154.954 0 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -152.105 -154.998 -3 + vertex -152.314 -154.984 0 + vertex -152.314 -154.984 -3 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -152.105 -154.998 -3 + vertex -152.105 -154.998 0 + vertex -152.314 -154.984 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -152.002 -154.998 -3 + vertex -152.105 -154.998 0 + vertex -152.105 -154.998 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -152.002 -154.998 -3 + vertex -152.002 -154.998 0 + vertex -152.105 -154.998 0 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -152 -155 -3 + vertex -152.002 -154.998 0 + vertex -152.002 -154.998 -3 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -152 -155 -3 + vertex -152 -155 0 + vertex -152.002 -154.998 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 152 -155 -3 + vertex -152 -155 0 + vertex -152 -155 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 152 -155 -3 + vertex 152 -155 0 + vertex -152 -155 0 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 152.002 -154.998 -3 + vertex 152 -155 0 + vertex 152 -155 -3 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 152.002 -154.998 -3 + vertex 152.002 -154.998 0 + vertex 152 -155 0 + endloop + endfacet +endsolid OpenSCAD_Model diff --git a/resources/profiles/Creality/cr10mini.svg b/resources/profiles/Creality/cr10mini.svg new file mode 100644 index 0000000000..177c6df49f --- /dev/null +++ b/resources/profiles/Creality/cr10mini.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/profiles/Creality/cr10mini_bed.stl b/resources/profiles/Creality/cr10mini_bed.stl new file mode 100644 index 0000000000..5dc5d65fcd --- /dev/null +++ b/resources/profiles/Creality/cr10mini_bed.stl @@ -0,0 +1,2774 @@ +solid OpenSCAD_Model + facet normal 0 0 -1 + outer loop + vertex 149.605 -117.498 -3 + vertex 149.502 -117.498 -3 + vertex 149.814 -117.484 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 149.814 -117.484 -3 + vertex 149.502 -117.498 -3 + vertex 150.021 -117.454 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.5 -114.5 -3 + vertex 149.502 -117.498 -3 + vertex 149.502 117.498 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 150.021 -117.454 -3 + vertex 149.502 -117.498 -3 + vertex 150.226 -117.411 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 150.226 -117.411 -3 + vertex 149.502 -117.498 -3 + vertex 150.427 -117.353 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 150.427 -117.353 -3 + vertex 149.502 -117.498 -3 + vertex 150.624 -117.282 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 150.624 -117.282 -3 + vertex 149.502 -117.498 -3 + vertex 150.815 -117.196 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 150.815 -117.196 -3 + vertex 149.502 -117.498 -3 + vertex 151 -117.098 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 151 -117.098 -3 + vertex 149.502 -117.498 -3 + vertex 151.178 -116.987 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 151.178 -116.987 -3 + vertex 149.502 -117.498 -3 + vertex 151.347 -116.864 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 151.347 -116.864 -3 + vertex 149.502 -117.498 -3 + vertex 151.507 -116.729 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 151.507 -116.729 -3 + vertex 149.502 -117.498 -3 + vertex 151.658 -116.584 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 151.658 -116.584 -3 + vertex 149.502 -117.498 -3 + vertex 151.798 -116.428 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 151.798 -116.428 -3 + vertex 149.502 -117.498 -3 + vertex 151.927 -116.263 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 151.927 -116.263 -3 + vertex 149.502 -117.498 -3 + vertex 152.044 -116.09 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.044 -116.09 -3 + vertex 149.502 -117.498 -3 + vertex 152.149 -115.908 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.149 -115.908 -3 + vertex 149.502 -117.498 -3 + vertex 152.241 -115.72 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.241 -115.72 -3 + vertex 149.502 -117.498 -3 + vertex 152.319 -115.526 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.319 -115.526 -3 + vertex 149.502 -117.498 -3 + vertex 152.384 -115.327 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.384 -115.327 -3 + vertex 149.502 -117.498 -3 + vertex 152.434 -115.124 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.434 -115.124 -3 + vertex 149.502 -117.498 -3 + vertex 152.471 -114.918 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.471 -114.918 -3 + vertex 149.502 -117.498 -3 + vertex 152.493 -114.709 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.493 -114.709 -3 + vertex 149.502 -117.498 -3 + vertex 152.5 -114.5 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.5 -114.5 -3 + vertex 149.502 117.498 -3 + vertex 152.5 114.5 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 149.502 117.498 -3 + vertex 152.471 114.918 -3 + vertex 152.493 114.709 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 152.384 115.327 -3 + vertex 152.434 115.124 -3 + vertex 149.502 117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.241 115.72 -3 + vertex 149.502 117.498 -3 + vertex 152.149 115.908 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 152.241 115.72 -3 + vertex 152.319 115.526 -3 + vertex 149.502 117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 149.502 117.498 -3 + vertex 151.507 116.729 -3 + vertex 151.658 116.584 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 151.927 116.263 -3 + vertex 149.502 117.498 -3 + vertex 151.798 116.428 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 151.927 116.263 -3 + vertex 152.044 116.09 -3 + vertex 149.502 117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 151.798 116.428 -3 + vertex 149.502 117.498 -3 + vertex 151.658 116.584 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 149.502 117.498 -3 + vertex 150.427 117.353 -3 + vertex 150.624 117.282 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 151.347 116.864 -3 + vertex 149.502 117.498 -3 + vertex 151.178 116.987 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 151.347 116.864 -3 + vertex 151.507 116.729 -3 + vertex 149.502 117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 151.178 116.987 -3 + vertex 149.502 117.498 -3 + vertex 151 117.098 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 151 117.098 -3 + vertex 149.502 117.498 -3 + vertex 150.815 117.196 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 150.815 117.196 -3 + vertex 149.502 117.498 -3 + vertex 150.624 117.282 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.149 115.908 -3 + vertex 149.502 117.498 -3 + vertex 152.044 116.09 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 150.226 117.411 -3 + vertex 149.502 117.498 -3 + vertex 150.021 117.454 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 150.226 117.411 -3 + vertex 150.427 117.353 -3 + vertex 149.502 117.498 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 152.319 115.526 -3 + vertex 152.384 115.327 -3 + vertex 149.502 117.498 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 149.814 117.484 -3 + vertex 150.021 117.454 -3 + vertex 149.502 117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 149.502 117.498 -3 + vertex 152.434 115.124 -3 + vertex 152.471 114.918 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 149.502 117.498 -3 + vertex 149.605 117.498 -3 + vertex 149.814 117.484 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.5 114.5 -3 + vertex 149.502 117.498 -3 + vertex 152.493 114.709 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 149.502 -117.498 -3 + vertex 149.5 117.5 -3 + vertex 149.502 117.498 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 149.502 -117.498 -3 + vertex 149.5 -117.5 -3 + vertex 149.5 117.5 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 149.5 117.5 -3 + vertex 149.5 -117.5 -3 + vertex -149.5 117.5 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 -117.498 -3 + vertex -152.5 114.5 -3 + vertex -149.502 117.498 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -149.814 117.484 -3 + vertex -149.605 117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -150.021 117.454 -3 + vertex -149.814 117.484 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -150.226 117.411 -3 + vertex -150.021 117.454 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -150.427 117.353 -3 + vertex -150.226 117.411 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -150.624 117.282 -3 + vertex -150.427 117.353 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -150.815 117.196 -3 + vertex -150.624 117.282 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -151 117.098 -3 + vertex -150.815 117.196 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -151.178 116.987 -3 + vertex -151 117.098 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -151.347 116.864 -3 + vertex -151.178 116.987 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -151.507 116.729 -3 + vertex -151.347 116.864 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -151.658 116.584 -3 + vertex -151.507 116.729 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -151.798 116.428 -3 + vertex -151.658 116.584 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -151.927 116.263 -3 + vertex -151.798 116.428 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -152.044 116.09 -3 + vertex -151.927 116.263 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -152.149 115.908 -3 + vertex -152.044 116.09 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -152.241 115.72 -3 + vertex -152.149 115.908 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -152.319 115.526 -3 + vertex -152.241 115.72 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -152.384 115.327 -3 + vertex -152.319 115.526 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -152.434 115.124 -3 + vertex -152.384 115.327 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -152.471 114.918 -3 + vertex -152.434 115.124 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -152.493 114.709 -3 + vertex -152.471 114.918 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -152.5 114.5 -3 + vertex -152.493 114.709 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 -117.498 -3 + vertex -152.5 -114.5 -3 + vertex -152.5 114.5 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -150.021 -117.454 -3 + vertex -149.502 -117.498 -3 + vertex -149.814 -117.484 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 -117.498 -3 + vertex -152.471 -114.918 -3 + vertex -152.493 -114.709 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.384 -115.327 -3 + vertex -152.434 -115.124 -3 + vertex -149.502 -117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.241 -115.72 -3 + vertex -149.502 -117.498 -3 + vertex -152.149 -115.908 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.241 -115.72 -3 + vertex -152.319 -115.526 -3 + vertex -149.502 -117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 -117.498 -3 + vertex -151.507 -116.729 -3 + vertex -151.658 -116.584 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -151.927 -116.263 -3 + vertex -149.502 -117.498 -3 + vertex -151.798 -116.428 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -151.927 -116.263 -3 + vertex -152.044 -116.09 -3 + vertex -149.502 -117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -151.798 -116.428 -3 + vertex -149.502 -117.498 -3 + vertex -151.658 -116.584 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 -117.498 -3 + vertex -150.427 -117.353 -3 + vertex -150.624 -117.282 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -151.347 -116.864 -3 + vertex -149.502 -117.498 -3 + vertex -151.178 -116.987 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -151.347 -116.864 -3 + vertex -151.507 -116.729 -3 + vertex -149.502 -117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -151.178 -116.987 -3 + vertex -149.502 -117.498 -3 + vertex -151 -117.098 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -151 -117.098 -3 + vertex -149.502 -117.498 -3 + vertex -150.815 -117.196 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -150.815 -117.196 -3 + vertex -149.502 -117.498 -3 + vertex -150.624 -117.282 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.149 -115.908 -3 + vertex -149.502 -117.498 -3 + vertex -152.044 -116.09 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -150.226 -117.411 -3 + vertex -149.502 -117.498 -3 + vertex -150.021 -117.454 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -150.226 -117.411 -3 + vertex -150.427 -117.353 -3 + vertex -149.502 -117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.319 -115.526 -3 + vertex -152.384 -115.327 -3 + vertex -149.502 -117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.434 -115.124 -3 + vertex -152.471 -114.918 -3 + vertex -149.502 -117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.605 -117.498 -3 + vertex -149.814 -117.484 -3 + vertex -149.502 -117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 -117.498 -3 + vertex -152.493 -114.709 -3 + vertex -152.5 -114.5 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex -149.5 117.5 -3 + vertex -149.5 -117.5 -3 + vertex -149.502 117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.5 117.5 -3 + vertex 149.5 -117.5 -3 + vertex -149.5 -117.5 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.5 -117.5 -3 + vertex -149.502 -117.498 -3 + vertex -149.502 117.498 -3 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 149.814 -117.484 0 + vertex 149.502 -117.498 0 + vertex 149.605 -117.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 150.021 -117.454 0 + vertex 149.502 -117.498 0 + vertex 149.814 -117.484 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 149.502 117.498 0 + vertex 149.502 -117.498 0 + vertex 152.5 -114.5 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 150.226 -117.411 0 + vertex 149.502 -117.498 0 + vertex 150.021 -117.454 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 150.427 -117.353 0 + vertex 149.502 -117.498 0 + vertex 150.226 -117.411 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 150.624 -117.282 0 + vertex 149.502 -117.498 0 + vertex 150.427 -117.353 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 150.815 -117.196 0 + vertex 149.502 -117.498 0 + vertex 150.624 -117.282 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 151 -117.098 0 + vertex 149.502 -117.498 0 + vertex 150.815 -117.196 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 151.178 -116.987 0 + vertex 149.502 -117.498 0 + vertex 151 -117.098 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 151.347 -116.864 0 + vertex 149.502 -117.498 0 + vertex 151.178 -116.987 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 151.507 -116.729 0 + vertex 149.502 -117.498 0 + vertex 151.347 -116.864 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 151.658 -116.584 0 + vertex 149.502 -117.498 0 + vertex 151.507 -116.729 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 151.798 -116.428 0 + vertex 149.502 -117.498 0 + vertex 151.658 -116.584 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 151.927 -116.263 0 + vertex 149.502 -117.498 0 + vertex 151.798 -116.428 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.044 -116.09 0 + vertex 149.502 -117.498 0 + vertex 151.927 -116.263 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.149 -115.908 0 + vertex 149.502 -117.498 0 + vertex 152.044 -116.09 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.241 -115.72 0 + vertex 149.502 -117.498 0 + vertex 152.149 -115.908 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.319 -115.526 0 + vertex 149.502 -117.498 0 + vertex 152.241 -115.72 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.384 -115.327 0 + vertex 149.502 -117.498 0 + vertex 152.319 -115.526 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.434 -115.124 0 + vertex 149.502 -117.498 0 + vertex 152.384 -115.327 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.471 -114.918 0 + vertex 149.502 -117.498 0 + vertex 152.434 -115.124 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.493 -114.709 0 + vertex 149.502 -117.498 0 + vertex 152.471 -114.918 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.5 -114.5 0 + vertex 149.502 -117.498 0 + vertex 152.493 -114.709 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.5 114.5 0 + vertex 149.502 117.498 0 + vertex 152.5 -114.5 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.493 114.709 0 + vertex 152.471 114.918 0 + vertex 149.502 117.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 149.502 117.498 0 + vertex 152.434 115.124 0 + vertex 152.384 115.327 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.149 115.908 0 + vertex 149.502 117.498 0 + vertex 152.241 115.72 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 149.502 117.498 0 + vertex 152.319 115.526 0 + vertex 152.241 115.72 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 151.658 116.584 0 + vertex 151.507 116.729 0 + vertex 149.502 117.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 151.798 116.428 0 + vertex 149.502 117.498 0 + vertex 151.927 116.263 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 149.502 117.498 0 + vertex 152.044 116.09 0 + vertex 151.927 116.263 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 151.658 116.584 0 + vertex 149.502 117.498 0 + vertex 151.798 116.428 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 150.624 117.282 0 + vertex 150.427 117.353 0 + vertex 149.502 117.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 151.178 116.987 0 + vertex 149.502 117.498 0 + vertex 151.347 116.864 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 149.502 117.498 0 + vertex 151.507 116.729 0 + vertex 151.347 116.864 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 151 117.098 0 + vertex 149.502 117.498 0 + vertex 151.178 116.987 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 150.815 117.196 0 + vertex 149.502 117.498 0 + vertex 151 117.098 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 150.624 117.282 0 + vertex 149.502 117.498 0 + vertex 150.815 117.196 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.044 116.09 0 + vertex 149.502 117.498 0 + vertex 152.149 115.908 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 150.021 117.454 0 + vertex 149.502 117.498 0 + vertex 150.226 117.411 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 149.502 117.498 0 + vertex 150.427 117.353 0 + vertex 150.226 117.411 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 149.502 117.498 0 + vertex 152.384 115.327 0 + vertex 152.319 115.526 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 149.502 117.498 0 + vertex 150.021 117.454 0 + vertex 149.814 117.484 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.471 114.918 0 + vertex 152.434 115.124 0 + vertex 149.502 117.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 149.814 117.484 0 + vertex 149.605 117.498 0 + vertex 149.502 117.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.493 114.709 0 + vertex 149.502 117.498 0 + vertex 152.5 114.5 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 149.502 117.498 0 + vertex 149.5 117.5 0 + vertex 149.502 -117.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 149.5 117.5 0 + vertex 149.5 -117.5 0 + vertex 149.502 -117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -149.5 117.5 0 + vertex 149.5 -117.5 0 + vertex 149.5 117.5 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -149.502 117.498 0 + vertex -152.5 114.5 0 + vertex -149.502 -117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -149.605 117.498 0 + vertex -149.814 117.484 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -149.814 117.484 0 + vertex -150.021 117.454 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -150.021 117.454 0 + vertex -150.226 117.411 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -150.226 117.411 0 + vertex -150.427 117.353 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -150.427 117.353 0 + vertex -150.624 117.282 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -150.624 117.282 0 + vertex -150.815 117.196 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -150.815 117.196 0 + vertex -151 117.098 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -151 117.098 0 + vertex -151.178 116.987 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -151.178 116.987 0 + vertex -151.347 116.864 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -151.347 116.864 0 + vertex -151.507 116.729 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -151.507 116.729 0 + vertex -151.658 116.584 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -151.658 116.584 0 + vertex -151.798 116.428 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -151.798 116.428 0 + vertex -151.927 116.263 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -151.927 116.263 0 + vertex -152.044 116.09 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.044 116.09 0 + vertex -152.149 115.908 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.149 115.908 0 + vertex -152.241 115.72 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.241 115.72 0 + vertex -152.319 115.526 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.319 115.526 0 + vertex -152.384 115.327 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.384 115.327 0 + vertex -152.434 115.124 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.434 115.124 0 + vertex -152.471 114.918 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.471 114.918 0 + vertex -152.493 114.709 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.493 114.709 0 + vertex -152.5 114.5 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.5 114.5 0 + vertex -152.5 -114.5 0 + vertex -149.502 -117.498 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -149.814 -117.484 0 + vertex -149.502 -117.498 0 + vertex -150.021 -117.454 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.493 -114.709 0 + vertex -152.471 -114.918 0 + vertex -149.502 -117.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -149.502 -117.498 0 + vertex -152.434 -115.124 0 + vertex -152.384 -115.327 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -152.149 -115.908 0 + vertex -149.502 -117.498 0 + vertex -152.241 -115.72 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -149.502 -117.498 0 + vertex -152.319 -115.526 0 + vertex -152.241 -115.72 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -151.658 -116.584 0 + vertex -151.507 -116.729 0 + vertex -149.502 -117.498 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -151.798 -116.428 0 + vertex -149.502 -117.498 0 + vertex -151.927 -116.263 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -149.502 -117.498 0 + vertex -152.044 -116.09 0 + vertex -151.927 -116.263 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -151.658 -116.584 0 + vertex -149.502 -117.498 0 + vertex -151.798 -116.428 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -150.624 -117.282 0 + vertex -150.427 -117.353 0 + vertex -149.502 -117.498 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -151.178 -116.987 0 + vertex -149.502 -117.498 0 + vertex -151.347 -116.864 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -149.502 -117.498 0 + vertex -151.507 -116.729 0 + vertex -151.347 -116.864 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -151 -117.098 0 + vertex -149.502 -117.498 0 + vertex -151.178 -116.987 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -150.815 -117.196 0 + vertex -149.502 -117.498 0 + vertex -151 -117.098 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -150.624 -117.282 0 + vertex -149.502 -117.498 0 + vertex -150.815 -117.196 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -152.044 -116.09 0 + vertex -149.502 -117.498 0 + vertex -152.149 -115.908 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -150.021 -117.454 0 + vertex -149.502 -117.498 0 + vertex -150.226 -117.411 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -149.502 -117.498 0 + vertex -150.427 -117.353 0 + vertex -150.226 -117.411 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -149.502 -117.498 0 + vertex -152.384 -115.327 0 + vertex -152.319 -115.526 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -149.502 -117.498 0 + vertex -152.471 -114.918 0 + vertex -152.434 -115.124 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -149.502 -117.498 0 + vertex -149.814 -117.484 0 + vertex -149.605 -117.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.5 -114.5 0 + vertex -152.493 -114.709 0 + vertex -149.502 -117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -149.502 117.498 0 + vertex -149.5 -117.5 0 + vertex -149.5 117.5 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -149.5 -117.5 0 + vertex 149.5 -117.5 0 + vertex -149.5 117.5 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -149.502 117.498 0 + vertex -149.502 -117.498 0 + vertex -149.5 -117.5 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 149.605 -117.498 -3 + vertex 149.502 -117.498 0 + vertex 149.502 -117.498 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 149.605 -117.498 -3 + vertex 149.605 -117.498 0 + vertex 149.502 -117.498 0 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 149.814 -117.484 -3 + vertex 149.605 -117.498 0 + vertex 149.605 -117.498 -3 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 149.814 -117.484 -3 + vertex 149.814 -117.484 0 + vertex 149.605 -117.498 0 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 150.021 -117.454 -3 + vertex 149.814 -117.484 0 + vertex 149.814 -117.484 -3 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 150.021 -117.454 -3 + vertex 150.021 -117.454 0 + vertex 149.814 -117.484 0 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 150.226 -117.411 -3 + vertex 150.021 -117.454 0 + vertex 150.021 -117.454 -3 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 150.226 -117.411 -3 + vertex 150.226 -117.411 0 + vertex 150.021 -117.454 0 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 150.427 -117.353 -3 + vertex 150.226 -117.411 0 + vertex 150.226 -117.411 -3 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 150.427 -117.353 -3 + vertex 150.427 -117.353 0 + vertex 150.226 -117.411 0 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 150.624 -117.282 -3 + vertex 150.427 -117.353 0 + vertex 150.427 -117.353 -3 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 150.624 -117.282 -3 + vertex 150.624 -117.282 0 + vertex 150.427 -117.353 0 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 150.815 -117.196 -3 + vertex 150.624 -117.282 0 + vertex 150.624 -117.282 -3 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 150.815 -117.196 -3 + vertex 150.815 -117.196 0 + vertex 150.624 -117.282 0 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 151 -117.098 -3 + vertex 150.815 -117.196 0 + vertex 150.815 -117.196 -3 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 151 -117.098 -3 + vertex 151 -117.098 0 + vertex 150.815 -117.196 0 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 151.178 -116.987 -3 + vertex 151 -117.098 0 + vertex 151 -117.098 -3 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 151.178 -116.987 -3 + vertex 151.178 -116.987 0 + vertex 151 -117.098 0 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 151.347 -116.864 -3 + vertex 151.178 -116.987 0 + vertex 151.178 -116.987 -3 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 151.347 -116.864 -3 + vertex 151.347 -116.864 0 + vertex 151.178 -116.987 0 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 151.507 -116.729 -3 + vertex 151.347 -116.864 0 + vertex 151.347 -116.864 -3 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 151.507 -116.729 -3 + vertex 151.507 -116.729 0 + vertex 151.347 -116.864 0 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 151.658 -116.584 -3 + vertex 151.507 -116.729 0 + vertex 151.507 -116.729 -3 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 151.658 -116.584 -3 + vertex 151.658 -116.584 0 + vertex 151.507 -116.729 0 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 151.798 -116.428 -3 + vertex 151.658 -116.584 0 + vertex 151.658 -116.584 -3 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 151.798 -116.428 -3 + vertex 151.798 -116.428 0 + vertex 151.658 -116.584 0 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 151.927 -116.263 -3 + vertex 151.798 -116.428 0 + vertex 151.798 -116.428 -3 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 151.927 -116.263 -3 + vertex 151.927 -116.263 0 + vertex 151.798 -116.428 0 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 152.044 -116.09 -3 + vertex 151.927 -116.263 0 + vertex 151.927 -116.263 -3 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 152.044 -116.09 -3 + vertex 152.044 -116.09 0 + vertex 151.927 -116.263 0 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 152.149 -115.908 -3 + vertex 152.044 -116.09 0 + vertex 152.044 -116.09 -3 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 152.149 -115.908 -3 + vertex 152.149 -115.908 0 + vertex 152.044 -116.09 0 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 152.241 -115.72 -3 + vertex 152.149 -115.908 0 + vertex 152.149 -115.908 -3 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 152.241 -115.72 -3 + vertex 152.241 -115.72 0 + vertex 152.149 -115.908 0 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 152.319 -115.526 -3 + vertex 152.241 -115.72 0 + vertex 152.241 -115.72 -3 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 152.319 -115.526 -3 + vertex 152.319 -115.526 0 + vertex 152.241 -115.72 0 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 152.384 -115.327 -3 + vertex 152.319 -115.526 0 + vertex 152.319 -115.526 -3 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 152.384 -115.327 -3 + vertex 152.384 -115.327 0 + vertex 152.319 -115.526 0 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 152.434 -115.124 -3 + vertex 152.384 -115.327 0 + vertex 152.384 -115.327 -3 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 152.434 -115.124 -3 + vertex 152.434 -115.124 0 + vertex 152.384 -115.327 0 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 152.471 -114.918 -3 + vertex 152.434 -115.124 0 + vertex 152.434 -115.124 -3 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 152.471 -114.918 -3 + vertex 152.471 -114.918 0 + vertex 152.434 -115.124 0 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 152.493 -114.709 -3 + vertex 152.471 -114.918 0 + vertex 152.471 -114.918 -3 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 152.493 -114.709 -3 + vertex 152.493 -114.709 0 + vertex 152.471 -114.918 0 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 152.5 -114.5 -3 + vertex 152.493 -114.709 0 + vertex 152.493 -114.709 -3 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 152.5 -114.5 -3 + vertex 152.5 -114.5 0 + vertex 152.493 -114.709 0 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 152.5 114.5 -3 + vertex 152.5 -114.5 0 + vertex 152.5 -114.5 -3 + endloop + endfacet + facet normal 1 0 -0 + outer loop + vertex 152.5 114.5 -3 + vertex 152.5 114.5 0 + vertex 152.5 -114.5 0 + endloop + endfacet + facet normal 0.99944 0.0334741 0 + outer loop + vertex 152.493 114.709 -3 + vertex 152.5 114.5 0 + vertex 152.5 114.5 -3 + endloop + endfacet + facet normal 0.99944 0.0334741 -0 + outer loop + vertex 152.493 114.709 -3 + vertex 152.493 114.709 0 + vertex 152.5 114.5 0 + endloop + endfacet + facet normal 0.994505 0.104685 0 + outer loop + vertex 152.471 114.918 -3 + vertex 152.493 114.709 0 + vertex 152.493 114.709 -3 + endloop + endfacet + facet normal 0.994505 0.104685 -0 + outer loop + vertex 152.471 114.918 -3 + vertex 152.471 114.918 0 + vertex 152.493 114.709 0 + endloop + endfacet + facet normal 0.98425 0.176783 0 + outer loop + vertex 152.434 115.124 -3 + vertex 152.471 114.918 0 + vertex 152.471 114.918 -3 + endloop + endfacet + facet normal 0.98425 0.176783 -0 + outer loop + vertex 152.434 115.124 -3 + vertex 152.434 115.124 0 + vertex 152.471 114.918 0 + endloop + endfacet + facet normal 0.970981 0.239158 0 + outer loop + vertex 152.384 115.327 -3 + vertex 152.434 115.124 0 + vertex 152.434 115.124 -3 + endloop + endfacet + facet normal 0.970981 0.239158 -0 + outer loop + vertex 152.384 115.327 -3 + vertex 152.384 115.327 0 + vertex 152.434 115.124 0 + endloop + endfacet + facet normal 0.950577 0.31049 0 + outer loop + vertex 152.319 115.526 -3 + vertex 152.384 115.327 0 + vertex 152.384 115.327 -3 + endloop + endfacet + facet normal 0.950577 0.31049 -0 + outer loop + vertex 152.319 115.526 -3 + vertex 152.319 115.526 0 + vertex 152.384 115.327 0 + endloop + endfacet + facet normal 0.927816 0.373039 0 + outer loop + vertex 152.241 115.72 -3 + vertex 152.319 115.526 0 + vertex 152.319 115.526 -3 + endloop + endfacet + facet normal 0.927816 0.373039 -0 + outer loop + vertex 152.241 115.72 -3 + vertex 152.241 115.72 0 + vertex 152.319 115.526 0 + endloop + endfacet + facet normal 0.898217 0.439553 0 + outer loop + vertex 152.149 115.908 -3 + vertex 152.241 115.72 0 + vertex 152.241 115.72 -3 + endloop + endfacet + facet normal 0.898217 0.439553 -0 + outer loop + vertex 152.149 115.908 -3 + vertex 152.149 115.908 0 + vertex 152.241 115.72 0 + endloop + endfacet + facet normal 0.866186 0.499722 0 + outer loop + vertex 152.044 116.09 -3 + vertex 152.149 115.908 0 + vertex 152.149 115.908 -3 + endloop + endfacet + facet normal 0.866186 0.499722 -0 + outer loop + vertex 152.044 116.09 -3 + vertex 152.044 116.09 0 + vertex 152.149 115.908 0 + endloop + endfacet + facet normal 0.828349 0.560213 0 + outer loop + vertex 151.927 116.263 -3 + vertex 152.044 116.09 0 + vertex 152.044 116.09 -3 + endloop + endfacet + facet normal 0.828349 0.560213 -0 + outer loop + vertex 151.927 116.263 -3 + vertex 151.927 116.263 0 + vertex 152.044 116.09 0 + endloop + endfacet + facet normal 0.787807 0.615922 0 + outer loop + vertex 151.798 116.428 -3 + vertex 151.927 116.263 0 + vertex 151.927 116.263 -3 + endloop + endfacet + facet normal 0.787807 0.615922 -0 + outer loop + vertex 151.798 116.428 -3 + vertex 151.798 116.428 0 + vertex 151.927 116.263 0 + endloop + endfacet + facet normal 0.744242 0.66791 0 + outer loop + vertex 151.658 116.584 -3 + vertex 151.798 116.428 0 + vertex 151.798 116.428 -3 + endloop + endfacet + facet normal 0.744242 0.66791 -0 + outer loop + vertex 151.658 116.584 -3 + vertex 151.658 116.584 0 + vertex 151.798 116.428 0 + endloop + endfacet + facet normal 0.692631 0.721292 0 + outer loop + vertex 151.507 116.729 -3 + vertex 151.658 116.584 0 + vertex 151.658 116.584 -3 + endloop + endfacet + facet normal 0.692631 0.721292 -0 + outer loop + vertex 151.507 116.729 -3 + vertex 151.507 116.729 0 + vertex 151.658 116.584 0 + endloop + endfacet + facet normal 0.644871 0.764291 0 + outer loop + vertex 151.347 116.864 -3 + vertex 151.507 116.729 0 + vertex 151.507 116.729 -3 + endloop + endfacet + facet normal 0.644871 0.764291 -0 + outer loop + vertex 151.347 116.864 -3 + vertex 151.347 116.864 0 + vertex 151.507 116.729 0 + endloop + endfacet + facet normal 0.588456 0.808529 0 + outer loop + vertex 151.178 116.987 -3 + vertex 151.347 116.864 0 + vertex 151.347 116.864 -3 + endloop + endfacet + facet normal 0.588456 0.808529 -0 + outer loop + vertex 151.178 116.987 -3 + vertex 151.178 116.987 0 + vertex 151.347 116.864 0 + endloop + endfacet + facet normal 0.529142 0.848533 0 + outer loop + vertex 151 117.098 -3 + vertex 151.178 116.987 0 + vertex 151.178 116.987 -3 + endloop + endfacet + facet normal 0.529142 0.848533 -0 + outer loop + vertex 151 117.098 -3 + vertex 151 117.098 0 + vertex 151.178 116.987 0 + endloop + endfacet + facet normal 0.468107 0.883672 0 + outer loop + vertex 150.815 117.196 -3 + vertex 151 117.098 0 + vertex 151 117.098 -3 + endloop + endfacet + facet normal 0.468107 0.883672 -0 + outer loop + vertex 150.815 117.196 -3 + vertex 150.815 117.196 0 + vertex 151 117.098 0 + endloop + endfacet + facet normal 0.410563 0.911832 0 + outer loop + vertex 150.624 117.282 -3 + vertex 150.815 117.196 0 + vertex 150.815 117.196 -3 + endloop + endfacet + facet normal 0.410563 0.911832 -0 + outer loop + vertex 150.624 117.282 -3 + vertex 150.624 117.282 0 + vertex 150.815 117.196 0 + endloop + endfacet + facet normal 0.339058 0.940766 0 + outer loop + vertex 150.427 117.353 -3 + vertex 150.624 117.282 0 + vertex 150.624 117.282 -3 + endloop + endfacet + facet normal 0.339058 0.940766 -0 + outer loop + vertex 150.427 117.353 -3 + vertex 150.427 117.353 0 + vertex 150.624 117.282 0 + endloop + endfacet + facet normal 0.277246 0.960799 0 + outer loop + vertex 150.226 117.411 -3 + vertex 150.427 117.353 0 + vertex 150.427 117.353 -3 + endloop + endfacet + facet normal 0.277246 0.960799 -0 + outer loop + vertex 150.226 117.411 -3 + vertex 150.226 117.411 0 + vertex 150.427 117.353 0 + endloop + endfacet + facet normal 0.205289 0.978701 0 + outer loop + vertex 150.021 117.454 -3 + vertex 150.226 117.411 0 + vertex 150.226 117.411 -3 + endloop + endfacet + facet normal 0.205289 0.978701 -0 + outer loop + vertex 150.021 117.454 -3 + vertex 150.021 117.454 0 + vertex 150.226 117.411 0 + endloop + endfacet + facet normal 0.143429 0.989661 0 + outer loop + vertex 149.814 117.484 -3 + vertex 150.021 117.454 0 + vertex 150.021 117.454 -3 + endloop + endfacet + facet normal 0.143429 0.989661 -0 + outer loop + vertex 149.814 117.484 -3 + vertex 149.814 117.484 0 + vertex 150.021 117.454 0 + endloop + endfacet + facet normal 0.0668359 0.997764 0 + outer loop + vertex 149.605 117.498 -3 + vertex 149.814 117.484 0 + vertex 149.814 117.484 -3 + endloop + endfacet + facet normal 0.0668359 0.997764 -0 + outer loop + vertex 149.605 117.498 -3 + vertex 149.605 117.498 0 + vertex 149.814 117.484 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 149.502 117.498 -3 + vertex 149.605 117.498 0 + vertex 149.605 117.498 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 149.502 117.498 -3 + vertex 149.502 117.498 0 + vertex 149.605 117.498 0 + endloop + endfacet + facet normal 0.707107 0.707107 0 + outer loop + vertex 149.5 117.5 -3 + vertex 149.502 117.498 0 + vertex 149.502 117.498 -3 + endloop + endfacet + facet normal 0.707107 0.707107 -0 + outer loop + vertex 149.5 117.5 -3 + vertex 149.5 117.5 0 + vertex 149.502 117.498 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -149.5 117.5 -3 + vertex 149.5 117.5 0 + vertex 149.5 117.5 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -149.5 117.5 -3 + vertex -149.5 117.5 0 + vertex 149.5 117.5 0 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -149.502 117.498 -3 + vertex -149.5 117.5 0 + vertex -149.5 117.5 -3 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -149.502 117.498 -3 + vertex -149.502 117.498 0 + vertex -149.5 117.5 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -149.605 117.498 -3 + vertex -149.502 117.498 0 + vertex -149.502 117.498 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -149.605 117.498 -3 + vertex -149.605 117.498 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -149.814 117.484 -3 + vertex -149.605 117.498 0 + vertex -149.605 117.498 -3 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -149.814 117.484 -3 + vertex -149.814 117.484 0 + vertex -149.605 117.498 0 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -150.021 117.454 -3 + vertex -149.814 117.484 0 + vertex -149.814 117.484 -3 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -150.021 117.454 -3 + vertex -150.021 117.454 0 + vertex -149.814 117.484 0 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -150.226 117.411 -3 + vertex -150.021 117.454 0 + vertex -150.021 117.454 -3 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -150.226 117.411 -3 + vertex -150.226 117.411 0 + vertex -150.021 117.454 0 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -150.427 117.353 -3 + vertex -150.226 117.411 0 + vertex -150.226 117.411 -3 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -150.427 117.353 -3 + vertex -150.427 117.353 0 + vertex -150.226 117.411 0 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -150.624 117.282 -3 + vertex -150.427 117.353 0 + vertex -150.427 117.353 -3 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -150.624 117.282 -3 + vertex -150.624 117.282 0 + vertex -150.427 117.353 0 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -150.815 117.196 -3 + vertex -150.624 117.282 0 + vertex -150.624 117.282 -3 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -150.815 117.196 -3 + vertex -150.815 117.196 0 + vertex -150.624 117.282 0 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -151 117.098 -3 + vertex -150.815 117.196 0 + vertex -150.815 117.196 -3 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -151 117.098 -3 + vertex -151 117.098 0 + vertex -150.815 117.196 0 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -151.178 116.987 -3 + vertex -151 117.098 0 + vertex -151 117.098 -3 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -151.178 116.987 -3 + vertex -151.178 116.987 0 + vertex -151 117.098 0 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -151.347 116.864 -3 + vertex -151.178 116.987 0 + vertex -151.178 116.987 -3 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -151.347 116.864 -3 + vertex -151.347 116.864 0 + vertex -151.178 116.987 0 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -151.507 116.729 -3 + vertex -151.347 116.864 0 + vertex -151.347 116.864 -3 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -151.507 116.729 -3 + vertex -151.507 116.729 0 + vertex -151.347 116.864 0 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -151.658 116.584 -3 + vertex -151.507 116.729 0 + vertex -151.507 116.729 -3 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -151.658 116.584 -3 + vertex -151.658 116.584 0 + vertex -151.507 116.729 0 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -151.798 116.428 -3 + vertex -151.658 116.584 0 + vertex -151.658 116.584 -3 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -151.798 116.428 -3 + vertex -151.798 116.428 0 + vertex -151.658 116.584 0 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -151.927 116.263 -3 + vertex -151.798 116.428 0 + vertex -151.798 116.428 -3 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -151.927 116.263 -3 + vertex -151.927 116.263 0 + vertex -151.798 116.428 0 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -152.044 116.09 -3 + vertex -151.927 116.263 0 + vertex -151.927 116.263 -3 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -152.044 116.09 -3 + vertex -152.044 116.09 0 + vertex -151.927 116.263 0 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -152.149 115.908 -3 + vertex -152.044 116.09 0 + vertex -152.044 116.09 -3 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -152.149 115.908 -3 + vertex -152.149 115.908 0 + vertex -152.044 116.09 0 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -152.241 115.72 -3 + vertex -152.149 115.908 0 + vertex -152.149 115.908 -3 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -152.241 115.72 -3 + vertex -152.241 115.72 0 + vertex -152.149 115.908 0 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -152.319 115.526 -3 + vertex -152.241 115.72 0 + vertex -152.241 115.72 -3 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -152.319 115.526 -3 + vertex -152.319 115.526 0 + vertex -152.241 115.72 0 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -152.384 115.327 -3 + vertex -152.319 115.526 0 + vertex -152.319 115.526 -3 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -152.384 115.327 -3 + vertex -152.384 115.327 0 + vertex -152.319 115.526 0 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -152.434 115.124 -3 + vertex -152.384 115.327 0 + vertex -152.384 115.327 -3 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -152.434 115.124 -3 + vertex -152.434 115.124 0 + vertex -152.384 115.327 0 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -152.471 114.918 -3 + vertex -152.434 115.124 0 + vertex -152.434 115.124 -3 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -152.471 114.918 -3 + vertex -152.471 114.918 0 + vertex -152.434 115.124 0 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -152.493 114.709 -3 + vertex -152.471 114.918 0 + vertex -152.471 114.918 -3 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -152.493 114.709 -3 + vertex -152.493 114.709 0 + vertex -152.471 114.918 0 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -152.5 114.5 -3 + vertex -152.493 114.709 0 + vertex -152.493 114.709 -3 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -152.5 114.5 -3 + vertex -152.5 114.5 0 + vertex -152.493 114.709 0 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -152.5 -114.5 -3 + vertex -152.5 114.5 0 + vertex -152.5 114.5 -3 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -152.5 -114.5 -3 + vertex -152.5 -114.5 0 + vertex -152.5 114.5 0 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -152.493 -114.709 -3 + vertex -152.5 -114.5 0 + vertex -152.5 -114.5 -3 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -152.493 -114.709 -3 + vertex -152.493 -114.709 0 + vertex -152.5 -114.5 0 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -152.471 -114.918 -3 + vertex -152.493 -114.709 0 + vertex -152.493 -114.709 -3 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -152.471 -114.918 -3 + vertex -152.471 -114.918 0 + vertex -152.493 -114.709 0 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -152.434 -115.124 -3 + vertex -152.471 -114.918 0 + vertex -152.471 -114.918 -3 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -152.434 -115.124 -3 + vertex -152.434 -115.124 0 + vertex -152.471 -114.918 0 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -152.384 -115.327 -3 + vertex -152.434 -115.124 0 + vertex -152.434 -115.124 -3 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -152.384 -115.327 -3 + vertex -152.384 -115.327 0 + vertex -152.434 -115.124 0 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -152.319 -115.526 -3 + vertex -152.384 -115.327 0 + vertex -152.384 -115.327 -3 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -152.319 -115.526 -3 + vertex -152.319 -115.526 0 + vertex -152.384 -115.327 0 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -152.241 -115.72 -3 + vertex -152.319 -115.526 0 + vertex -152.319 -115.526 -3 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -152.241 -115.72 -3 + vertex -152.241 -115.72 0 + vertex -152.319 -115.526 0 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -152.149 -115.908 -3 + vertex -152.241 -115.72 0 + vertex -152.241 -115.72 -3 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -152.149 -115.908 -3 + vertex -152.149 -115.908 0 + vertex -152.241 -115.72 0 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -152.044 -116.09 -3 + vertex -152.149 -115.908 0 + vertex -152.149 -115.908 -3 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -152.044 -116.09 -3 + vertex -152.044 -116.09 0 + vertex -152.149 -115.908 0 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -151.927 -116.263 -3 + vertex -152.044 -116.09 0 + vertex -152.044 -116.09 -3 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -151.927 -116.263 -3 + vertex -151.927 -116.263 0 + vertex -152.044 -116.09 0 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -151.798 -116.428 -3 + vertex -151.927 -116.263 0 + vertex -151.927 -116.263 -3 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -151.798 -116.428 -3 + vertex -151.798 -116.428 0 + vertex -151.927 -116.263 0 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -151.658 -116.584 -3 + vertex -151.798 -116.428 0 + vertex -151.798 -116.428 -3 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -151.658 -116.584 -3 + vertex -151.658 -116.584 0 + vertex -151.798 -116.428 0 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -151.507 -116.729 -3 + vertex -151.658 -116.584 0 + vertex -151.658 -116.584 -3 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -151.507 -116.729 -3 + vertex -151.507 -116.729 0 + vertex -151.658 -116.584 0 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -151.347 -116.864 -3 + vertex -151.507 -116.729 0 + vertex -151.507 -116.729 -3 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -151.347 -116.864 -3 + vertex -151.347 -116.864 0 + vertex -151.507 -116.729 0 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -151.178 -116.987 -3 + vertex -151.347 -116.864 0 + vertex -151.347 -116.864 -3 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -151.178 -116.987 -3 + vertex -151.178 -116.987 0 + vertex -151.347 -116.864 0 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -151 -117.098 -3 + vertex -151.178 -116.987 0 + vertex -151.178 -116.987 -3 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -151 -117.098 -3 + vertex -151 -117.098 0 + vertex -151.178 -116.987 0 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -150.815 -117.196 -3 + vertex -151 -117.098 0 + vertex -151 -117.098 -3 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -150.815 -117.196 -3 + vertex -150.815 -117.196 0 + vertex -151 -117.098 0 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -150.624 -117.282 -3 + vertex -150.815 -117.196 0 + vertex -150.815 -117.196 -3 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -150.624 -117.282 -3 + vertex -150.624 -117.282 0 + vertex -150.815 -117.196 0 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -150.427 -117.353 -3 + vertex -150.624 -117.282 0 + vertex -150.624 -117.282 -3 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -150.427 -117.353 -3 + vertex -150.427 -117.353 0 + vertex -150.624 -117.282 0 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -150.226 -117.411 -3 + vertex -150.427 -117.353 0 + vertex -150.427 -117.353 -3 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -150.226 -117.411 -3 + vertex -150.226 -117.411 0 + vertex -150.427 -117.353 0 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -150.021 -117.454 -3 + vertex -150.226 -117.411 0 + vertex -150.226 -117.411 -3 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -150.021 -117.454 -3 + vertex -150.021 -117.454 0 + vertex -150.226 -117.411 0 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -149.814 -117.484 -3 + vertex -150.021 -117.454 0 + vertex -150.021 -117.454 -3 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -149.814 -117.484 -3 + vertex -149.814 -117.484 0 + vertex -150.021 -117.454 0 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -149.605 -117.498 -3 + vertex -149.814 -117.484 0 + vertex -149.814 -117.484 -3 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -149.605 -117.498 -3 + vertex -149.605 -117.498 0 + vertex -149.814 -117.484 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -149.502 -117.498 -3 + vertex -149.605 -117.498 0 + vertex -149.605 -117.498 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -149.502 -117.498 -3 + vertex -149.502 -117.498 0 + vertex -149.605 -117.498 0 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -149.5 -117.5 -3 + vertex -149.502 -117.498 0 + vertex -149.502 -117.498 -3 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -149.5 -117.5 -3 + vertex -149.5 -117.5 0 + vertex -149.502 -117.498 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 149.5 -117.5 -3 + vertex -149.5 -117.5 0 + vertex -149.5 -117.5 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 149.5 -117.5 -3 + vertex 149.5 -117.5 0 + vertex -149.5 -117.5 0 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 149.502 -117.498 -3 + vertex 149.5 -117.5 0 + vertex 149.5 -117.5 -3 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 149.502 -117.498 -3 + vertex 149.502 -117.498 0 + vertex 149.5 -117.5 0 + endloop + endfacet +endsolid OpenSCAD_Model diff --git a/resources/profiles/Creality/cr10s4.svg b/resources/profiles/Creality/cr10s4.svg new file mode 100644 index 0000000000..c3719456d1 --- /dev/null +++ b/resources/profiles/Creality/cr10s4.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/profiles/Creality/cr10s4_bed.stl b/resources/profiles/Creality/cr10s4_bed.stl new file mode 100644 index 0000000000..c34ac4e5e4 --- /dev/null +++ b/resources/profiles/Creality/cr10s4_bed.stl @@ -0,0 +1,2774 @@ +solid OpenSCAD_Model + facet normal 0 0 -1 + outer loop + vertex 202.105 -204.998 -3 + vertex 202.002 -204.998 -3 + vertex 202.314 -204.984 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 202.314 -204.984 -3 + vertex 202.002 -204.998 -3 + vertex 202.521 -204.954 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 205 -202 -3 + vertex 202.002 -204.998 -3 + vertex 202.002 204.998 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 202.521 -204.954 -3 + vertex 202.002 -204.998 -3 + vertex 202.726 -204.911 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 202.726 -204.911 -3 + vertex 202.002 -204.998 -3 + vertex 202.927 -204.853 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 202.927 -204.853 -3 + vertex 202.002 -204.998 -3 + vertex 203.124 -204.782 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 203.124 -204.782 -3 + vertex 202.002 -204.998 -3 + vertex 203.315 -204.696 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 203.315 -204.696 -3 + vertex 202.002 -204.998 -3 + vertex 203.5 -204.598 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 203.5 -204.598 -3 + vertex 202.002 -204.998 -3 + vertex 203.678 -204.487 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 203.678 -204.487 -3 + vertex 202.002 -204.998 -3 + vertex 203.847 -204.364 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 203.847 -204.364 -3 + vertex 202.002 -204.998 -3 + vertex 204.007 -204.229 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 204.007 -204.229 -3 + vertex 202.002 -204.998 -3 + vertex 204.158 -204.084 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 204.158 -204.084 -3 + vertex 202.002 -204.998 -3 + vertex 204.298 -203.928 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 204.298 -203.928 -3 + vertex 202.002 -204.998 -3 + vertex 204.427 -203.763 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 204.427 -203.763 -3 + vertex 202.002 -204.998 -3 + vertex 204.544 -203.59 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 204.544 -203.59 -3 + vertex 202.002 -204.998 -3 + vertex 204.649 -203.408 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 204.649 -203.408 -3 + vertex 202.002 -204.998 -3 + vertex 204.741 -203.22 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 204.741 -203.22 -3 + vertex 202.002 -204.998 -3 + vertex 204.819 -203.026 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 204.819 -203.026 -3 + vertex 202.002 -204.998 -3 + vertex 204.884 -202.827 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 204.884 -202.827 -3 + vertex 202.002 -204.998 -3 + vertex 204.934 -202.624 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 204.934 -202.624 -3 + vertex 202.002 -204.998 -3 + vertex 204.971 -202.418 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 204.971 -202.418 -3 + vertex 202.002 -204.998 -3 + vertex 204.993 -202.209 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 204.993 -202.209 -3 + vertex 202.002 -204.998 -3 + vertex 205 -202 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 205 -202 -3 + vertex 202.002 204.998 -3 + vertex 205 202 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 202.002 204.998 -3 + vertex 204.971 202.418 -3 + vertex 204.993 202.209 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 204.884 202.827 -3 + vertex 204.934 202.624 -3 + vertex 202.002 204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 204.741 203.22 -3 + vertex 202.002 204.998 -3 + vertex 204.649 203.408 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 204.741 203.22 -3 + vertex 204.819 203.026 -3 + vertex 202.002 204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 202.002 204.998 -3 + vertex 204.007 204.229 -3 + vertex 204.158 204.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 204.427 203.763 -3 + vertex 202.002 204.998 -3 + vertex 204.298 203.928 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 204.427 203.763 -3 + vertex 204.544 203.59 -3 + vertex 202.002 204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 204.298 203.928 -3 + vertex 202.002 204.998 -3 + vertex 204.158 204.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 202.002 204.998 -3 + vertex 202.927 204.853 -3 + vertex 203.124 204.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 203.847 204.364 -3 + vertex 202.002 204.998 -3 + vertex 203.678 204.487 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 203.847 204.364 -3 + vertex 204.007 204.229 -3 + vertex 202.002 204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 203.678 204.487 -3 + vertex 202.002 204.998 -3 + vertex 203.5 204.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 203.5 204.598 -3 + vertex 202.002 204.998 -3 + vertex 203.315 204.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 203.315 204.696 -3 + vertex 202.002 204.998 -3 + vertex 203.124 204.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 204.649 203.408 -3 + vertex 202.002 204.998 -3 + vertex 204.544 203.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 202.726 204.911 -3 + vertex 202.002 204.998 -3 + vertex 202.521 204.954 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 202.726 204.911 -3 + vertex 202.927 204.853 -3 + vertex 202.002 204.998 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 204.819 203.026 -3 + vertex 204.884 202.827 -3 + vertex 202.002 204.998 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 202.314 204.984 -3 + vertex 202.521 204.954 -3 + vertex 202.002 204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 202.002 204.998 -3 + vertex 204.934 202.624 -3 + vertex 204.971 202.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 202.002 204.998 -3 + vertex 202.105 204.998 -3 + vertex 202.314 204.984 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 205 202 -3 + vertex 202.002 204.998 -3 + vertex 204.993 202.209 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex -202 205 -3 + vertex 202 205 -3 + vertex -202.002 204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex 202 205 -3 + vertex 202.002 204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 202.002 -204.998 -3 + vertex -202.002 204.998 -3 + vertex 202.002 204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -205 -202 -3 + vertex -205 202 -3 + vertex -202.002 -204.998 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -202.314 204.984 -3 + vertex -202.105 204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -202.521 204.954 -3 + vertex -202.314 204.984 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -202.726 204.911 -3 + vertex -202.521 204.954 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -202.927 204.853 -3 + vertex -202.726 204.911 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -203.124 204.782 -3 + vertex -202.927 204.853 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -203.315 204.696 -3 + vertex -203.124 204.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -203.5 204.598 -3 + vertex -203.315 204.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -203.678 204.487 -3 + vertex -203.5 204.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -203.847 204.364 -3 + vertex -203.678 204.487 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -204.007 204.229 -3 + vertex -203.847 204.364 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -204.158 204.084 -3 + vertex -204.007 204.229 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -204.298 203.928 -3 + vertex -204.158 204.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -204.427 203.763 -3 + vertex -204.298 203.928 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -204.544 203.59 -3 + vertex -204.427 203.763 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -204.649 203.408 -3 + vertex -204.544 203.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -204.741 203.22 -3 + vertex -204.649 203.408 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -204.819 203.026 -3 + vertex -204.741 203.22 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -204.884 202.827 -3 + vertex -204.819 203.026 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -204.934 202.624 -3 + vertex -204.884 202.827 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -204.971 202.418 -3 + vertex -204.934 202.624 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -204.993 202.209 -3 + vertex -204.971 202.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -205 202 -3 + vertex -204.993 202.209 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 -204.998 -3 + vertex -205 202 -3 + vertex -202.002 204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 202.002 -204.998 -3 + vertex -202.002 -204.998 -3 + vertex -202.002 204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 -204.998 -3 + vertex -204.971 -202.418 -3 + vertex -204.993 -202.209 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -204.884 -202.827 -3 + vertex -204.934 -202.624 -3 + vertex -202.002 -204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -204.741 -203.22 -3 + vertex -202.002 -204.998 -3 + vertex -204.649 -203.408 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -204.741 -203.22 -3 + vertex -204.819 -203.026 -3 + vertex -202.002 -204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 -204.998 -3 + vertex -204.007 -204.229 -3 + vertex -204.158 -204.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -204.427 -203.763 -3 + vertex -202.002 -204.998 -3 + vertex -204.298 -203.928 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -204.427 -203.763 -3 + vertex -204.544 -203.59 -3 + vertex -202.002 -204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -204.298 -203.928 -3 + vertex -202.002 -204.998 -3 + vertex -204.158 -204.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 -204.998 -3 + vertex -202.927 -204.853 -3 + vertex -203.124 -204.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -203.847 -204.364 -3 + vertex -202.002 -204.998 -3 + vertex -203.678 -204.487 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -203.847 -204.364 -3 + vertex -204.007 -204.229 -3 + vertex -202.002 -204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -203.678 -204.487 -3 + vertex -202.002 -204.998 -3 + vertex -203.5 -204.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -203.5 -204.598 -3 + vertex -202.002 -204.998 -3 + vertex -203.315 -204.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -203.315 -204.696 -3 + vertex -202.002 -204.998 -3 + vertex -203.124 -204.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -204.649 -203.408 -3 + vertex -202.002 -204.998 -3 + vertex -204.544 -203.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.726 -204.911 -3 + vertex -202.002 -204.998 -3 + vertex -202.521 -204.954 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.726 -204.911 -3 + vertex -202.927 -204.853 -3 + vertex -202.002 -204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -204.819 -203.026 -3 + vertex -204.884 -202.827 -3 + vertex -202.002 -204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.314 -204.984 -3 + vertex -202.521 -204.954 -3 + vertex -202.002 -204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 -204.998 -3 + vertex -204.934 -202.624 -3 + vertex -204.971 -202.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 -204.998 -3 + vertex -202.105 -204.998 -3 + vertex -202.314 -204.984 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 202.002 -204.998 -3 + vertex 202 -205 -3 + vertex -202.002 -204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 -204.998 -3 + vertex 202 -205 -3 + vertex -202 -205 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -205 -202 -3 + vertex -202.002 -204.998 -3 + vertex -204.993 -202.209 -3 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.314 -204.984 0 + vertex 202.002 -204.998 0 + vertex 202.105 -204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.521 -204.954 0 + vertex 202.002 -204.998 0 + vertex 202.314 -204.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.002 204.998 0 + vertex 202.002 -204.998 0 + vertex 205 -202 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.726 -204.911 0 + vertex 202.002 -204.998 0 + vertex 202.521 -204.954 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.927 -204.853 0 + vertex 202.002 -204.998 0 + vertex 202.726 -204.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 203.124 -204.782 0 + vertex 202.002 -204.998 0 + vertex 202.927 -204.853 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 203.315 -204.696 0 + vertex 202.002 -204.998 0 + vertex 203.124 -204.782 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 203.5 -204.598 0 + vertex 202.002 -204.998 0 + vertex 203.315 -204.696 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 203.678 -204.487 0 + vertex 202.002 -204.998 0 + vertex 203.5 -204.598 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 203.847 -204.364 0 + vertex 202.002 -204.998 0 + vertex 203.678 -204.487 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.007 -204.229 0 + vertex 202.002 -204.998 0 + vertex 203.847 -204.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.158 -204.084 0 + vertex 202.002 -204.998 0 + vertex 204.007 -204.229 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.298 -203.928 0 + vertex 202.002 -204.998 0 + vertex 204.158 -204.084 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.427 -203.763 0 + vertex 202.002 -204.998 0 + vertex 204.298 -203.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.544 -203.59 0 + vertex 202.002 -204.998 0 + vertex 204.427 -203.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.649 -203.408 0 + vertex 202.002 -204.998 0 + vertex 204.544 -203.59 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.741 -203.22 0 + vertex 202.002 -204.998 0 + vertex 204.649 -203.408 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.819 -203.026 0 + vertex 202.002 -204.998 0 + vertex 204.741 -203.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.884 -202.827 0 + vertex 202.002 -204.998 0 + vertex 204.819 -203.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.934 -202.624 0 + vertex 202.002 -204.998 0 + vertex 204.884 -202.827 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.971 -202.418 0 + vertex 202.002 -204.998 0 + vertex 204.934 -202.624 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.993 -202.209 0 + vertex 202.002 -204.998 0 + vertex 204.971 -202.418 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 205 -202 0 + vertex 202.002 -204.998 0 + vertex 204.993 -202.209 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 205 202 0 + vertex 202.002 204.998 0 + vertex 205 -202 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.993 202.209 0 + vertex 204.971 202.418 0 + vertex 202.002 204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.002 204.998 0 + vertex 204.934 202.624 0 + vertex 204.884 202.827 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.649 203.408 0 + vertex 202.002 204.998 0 + vertex 204.741 203.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.002 204.998 0 + vertex 204.819 203.026 0 + vertex 204.741 203.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.158 204.084 0 + vertex 204.007 204.229 0 + vertex 202.002 204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.298 203.928 0 + vertex 202.002 204.998 0 + vertex 204.427 203.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.002 204.998 0 + vertex 204.544 203.59 0 + vertex 204.427 203.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.158 204.084 0 + vertex 202.002 204.998 0 + vertex 204.298 203.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 203.124 204.782 0 + vertex 202.927 204.853 0 + vertex 202.002 204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 203.678 204.487 0 + vertex 202.002 204.998 0 + vertex 203.847 204.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.002 204.998 0 + vertex 204.007 204.229 0 + vertex 203.847 204.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 203.5 204.598 0 + vertex 202.002 204.998 0 + vertex 203.678 204.487 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 203.315 204.696 0 + vertex 202.002 204.998 0 + vertex 203.5 204.598 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 203.124 204.782 0 + vertex 202.002 204.998 0 + vertex 203.315 204.696 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.544 203.59 0 + vertex 202.002 204.998 0 + vertex 204.649 203.408 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.521 204.954 0 + vertex 202.002 204.998 0 + vertex 202.726 204.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.002 204.998 0 + vertex 202.927 204.853 0 + vertex 202.726 204.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.002 204.998 0 + vertex 204.884 202.827 0 + vertex 204.819 203.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.002 204.998 0 + vertex 202.521 204.954 0 + vertex 202.314 204.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.971 202.418 0 + vertex 204.934 202.624 0 + vertex 202.002 204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.314 204.984 0 + vertex 202.105 204.998 0 + vertex 202.002 204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.993 202.209 0 + vertex 202.002 204.998 0 + vertex 205 202 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -202.002 204.998 0 + vertex 202 205 0 + vertex -202 205 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.002 204.998 0 + vertex 202 205 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.002 204.998 0 + vertex -202.002 204.998 0 + vertex 202.002 -204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -202.002 -204.998 0 + vertex -205 202 0 + vertex -205 -202 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -202.105 204.998 0 + vertex -202.314 204.984 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -202.314 204.984 0 + vertex -202.521 204.954 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -202.521 204.954 0 + vertex -202.726 204.911 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -202.726 204.911 0 + vertex -202.927 204.853 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -202.927 204.853 0 + vertex -203.124 204.782 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -203.124 204.782 0 + vertex -203.315 204.696 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -203.315 204.696 0 + vertex -203.5 204.598 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -203.5 204.598 0 + vertex -203.678 204.487 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -203.678 204.487 0 + vertex -203.847 204.364 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -203.847 204.364 0 + vertex -204.007 204.229 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -204.007 204.229 0 + vertex -204.158 204.084 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -204.158 204.084 0 + vertex -204.298 203.928 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -204.298 203.928 0 + vertex -204.427 203.763 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -204.427 203.763 0 + vertex -204.544 203.59 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -204.544 203.59 0 + vertex -204.649 203.408 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -204.649 203.408 0 + vertex -204.741 203.22 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -204.741 203.22 0 + vertex -204.819 203.026 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -204.819 203.026 0 + vertex -204.884 202.827 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -204.884 202.827 0 + vertex -204.934 202.624 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -204.934 202.624 0 + vertex -204.971 202.418 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -204.971 202.418 0 + vertex -204.993 202.209 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -204.993 202.209 0 + vertex -205 202 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -202.002 204.998 0 + vertex -205 202 0 + vertex -202.002 -204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -202.002 204.998 0 + vertex -202.002 -204.998 0 + vertex 202.002 -204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -204.993 -202.209 0 + vertex -204.971 -202.418 0 + vertex -202.002 -204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -202.002 -204.998 0 + vertex -204.934 -202.624 0 + vertex -204.884 -202.827 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -204.649 -203.408 0 + vertex -202.002 -204.998 0 + vertex -204.741 -203.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -202.002 -204.998 0 + vertex -204.819 -203.026 0 + vertex -204.741 -203.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -204.158 -204.084 0 + vertex -204.007 -204.229 0 + vertex -202.002 -204.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -204.298 -203.928 0 + vertex -202.002 -204.998 0 + vertex -204.427 -203.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -202.002 -204.998 0 + vertex -204.544 -203.59 0 + vertex -204.427 -203.763 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -204.158 -204.084 0 + vertex -202.002 -204.998 0 + vertex -204.298 -203.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -203.124 -204.782 0 + vertex -202.927 -204.853 0 + vertex -202.002 -204.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -203.678 -204.487 0 + vertex -202.002 -204.998 0 + vertex -203.847 -204.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -202.002 -204.998 0 + vertex -204.007 -204.229 0 + vertex -203.847 -204.364 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -203.5 -204.598 0 + vertex -202.002 -204.998 0 + vertex -203.678 -204.487 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -203.315 -204.696 0 + vertex -202.002 -204.998 0 + vertex -203.5 -204.598 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -203.124 -204.782 0 + vertex -202.002 -204.998 0 + vertex -203.315 -204.696 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -204.544 -203.59 0 + vertex -202.002 -204.998 0 + vertex -204.649 -203.408 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -202.521 -204.954 0 + vertex -202.002 -204.998 0 + vertex -202.726 -204.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -202.002 -204.998 0 + vertex -202.927 -204.853 0 + vertex -202.726 -204.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -202.002 -204.998 0 + vertex -204.884 -202.827 0 + vertex -204.819 -203.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -202.002 -204.998 0 + vertex -202.521 -204.954 0 + vertex -202.314 -204.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -204.971 -202.418 0 + vertex -204.934 -202.624 0 + vertex -202.002 -204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -202.314 -204.984 0 + vertex -202.105 -204.998 0 + vertex -202.002 -204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -202.002 -204.998 0 + vertex 202 -205 0 + vertex 202.002 -204.998 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex -202 -205 0 + vertex 202 -205 0 + vertex -202.002 -204.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -204.993 -202.209 0 + vertex -202.002 -204.998 0 + vertex -205 -202 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 202.105 -204.998 -3 + vertex 202.002 -204.998 0 + vertex 202.002 -204.998 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 202.105 -204.998 -3 + vertex 202.105 -204.998 0 + vertex 202.002 -204.998 0 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 202.314 -204.984 -3 + vertex 202.105 -204.998 0 + vertex 202.105 -204.998 -3 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 202.314 -204.984 -3 + vertex 202.314 -204.984 0 + vertex 202.105 -204.998 0 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 202.521 -204.954 -3 + vertex 202.314 -204.984 0 + vertex 202.314 -204.984 -3 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 202.521 -204.954 -3 + vertex 202.521 -204.954 0 + vertex 202.314 -204.984 0 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 202.726 -204.911 -3 + vertex 202.521 -204.954 0 + vertex 202.521 -204.954 -3 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 202.726 -204.911 -3 + vertex 202.726 -204.911 0 + vertex 202.521 -204.954 0 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 202.927 -204.853 -3 + vertex 202.726 -204.911 0 + vertex 202.726 -204.911 -3 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 202.927 -204.853 -3 + vertex 202.927 -204.853 0 + vertex 202.726 -204.911 0 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 203.124 -204.782 -3 + vertex 202.927 -204.853 0 + vertex 202.927 -204.853 -3 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 203.124 -204.782 -3 + vertex 203.124 -204.782 0 + vertex 202.927 -204.853 0 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 203.315 -204.696 -3 + vertex 203.124 -204.782 0 + vertex 203.124 -204.782 -3 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 203.315 -204.696 -3 + vertex 203.315 -204.696 0 + vertex 203.124 -204.782 0 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 203.5 -204.598 -3 + vertex 203.315 -204.696 0 + vertex 203.315 -204.696 -3 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 203.5 -204.598 -3 + vertex 203.5 -204.598 0 + vertex 203.315 -204.696 0 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 203.678 -204.487 -3 + vertex 203.5 -204.598 0 + vertex 203.5 -204.598 -3 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 203.678 -204.487 -3 + vertex 203.678 -204.487 0 + vertex 203.5 -204.598 0 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 203.847 -204.364 -3 + vertex 203.678 -204.487 0 + vertex 203.678 -204.487 -3 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 203.847 -204.364 -3 + vertex 203.847 -204.364 0 + vertex 203.678 -204.487 0 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 204.007 -204.229 -3 + vertex 203.847 -204.364 0 + vertex 203.847 -204.364 -3 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 204.007 -204.229 -3 + vertex 204.007 -204.229 0 + vertex 203.847 -204.364 0 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 204.158 -204.084 -3 + vertex 204.007 -204.229 0 + vertex 204.007 -204.229 -3 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 204.158 -204.084 -3 + vertex 204.158 -204.084 0 + vertex 204.007 -204.229 0 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 204.298 -203.928 -3 + vertex 204.158 -204.084 0 + vertex 204.158 -204.084 -3 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 204.298 -203.928 -3 + vertex 204.298 -203.928 0 + vertex 204.158 -204.084 0 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 204.427 -203.763 -3 + vertex 204.298 -203.928 0 + vertex 204.298 -203.928 -3 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 204.427 -203.763 -3 + vertex 204.427 -203.763 0 + vertex 204.298 -203.928 0 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 204.544 -203.59 -3 + vertex 204.427 -203.763 0 + vertex 204.427 -203.763 -3 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 204.544 -203.59 -3 + vertex 204.544 -203.59 0 + vertex 204.427 -203.763 0 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 204.649 -203.408 -3 + vertex 204.544 -203.59 0 + vertex 204.544 -203.59 -3 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 204.649 -203.408 -3 + vertex 204.649 -203.408 0 + vertex 204.544 -203.59 0 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 204.741 -203.22 -3 + vertex 204.649 -203.408 0 + vertex 204.649 -203.408 -3 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 204.741 -203.22 -3 + vertex 204.741 -203.22 0 + vertex 204.649 -203.408 0 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 204.819 -203.026 -3 + vertex 204.741 -203.22 0 + vertex 204.741 -203.22 -3 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 204.819 -203.026 -3 + vertex 204.819 -203.026 0 + vertex 204.741 -203.22 0 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 204.884 -202.827 -3 + vertex 204.819 -203.026 0 + vertex 204.819 -203.026 -3 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 204.884 -202.827 -3 + vertex 204.884 -202.827 0 + vertex 204.819 -203.026 0 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 204.934 -202.624 -3 + vertex 204.884 -202.827 0 + vertex 204.884 -202.827 -3 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 204.934 -202.624 -3 + vertex 204.934 -202.624 0 + vertex 204.884 -202.827 0 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 204.971 -202.418 -3 + vertex 204.934 -202.624 0 + vertex 204.934 -202.624 -3 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 204.971 -202.418 -3 + vertex 204.971 -202.418 0 + vertex 204.934 -202.624 0 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 204.993 -202.209 -3 + vertex 204.971 -202.418 0 + vertex 204.971 -202.418 -3 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 204.993 -202.209 -3 + vertex 204.993 -202.209 0 + vertex 204.971 -202.418 0 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 205 -202 -3 + vertex 204.993 -202.209 0 + vertex 204.993 -202.209 -3 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 205 -202 -3 + vertex 205 -202 0 + vertex 204.993 -202.209 0 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 205 202 -3 + vertex 205 -202 0 + vertex 205 -202 -3 + endloop + endfacet + facet normal 1 0 -0 + outer loop + vertex 205 202 -3 + vertex 205 202 0 + vertex 205 -202 0 + endloop + endfacet + facet normal 0.99944 0.0334741 0 + outer loop + vertex 204.993 202.209 -3 + vertex 205 202 0 + vertex 205 202 -3 + endloop + endfacet + facet normal 0.99944 0.0334741 -0 + outer loop + vertex 204.993 202.209 -3 + vertex 204.993 202.209 0 + vertex 205 202 0 + endloop + endfacet + facet normal 0.994505 0.104685 0 + outer loop + vertex 204.971 202.418 -3 + vertex 204.993 202.209 0 + vertex 204.993 202.209 -3 + endloop + endfacet + facet normal 0.994505 0.104685 -0 + outer loop + vertex 204.971 202.418 -3 + vertex 204.971 202.418 0 + vertex 204.993 202.209 0 + endloop + endfacet + facet normal 0.98425 0.176783 0 + outer loop + vertex 204.934 202.624 -3 + vertex 204.971 202.418 0 + vertex 204.971 202.418 -3 + endloop + endfacet + facet normal 0.98425 0.176783 -0 + outer loop + vertex 204.934 202.624 -3 + vertex 204.934 202.624 0 + vertex 204.971 202.418 0 + endloop + endfacet + facet normal 0.970981 0.239158 0 + outer loop + vertex 204.884 202.827 -3 + vertex 204.934 202.624 0 + vertex 204.934 202.624 -3 + endloop + endfacet + facet normal 0.970981 0.239158 -0 + outer loop + vertex 204.884 202.827 -3 + vertex 204.884 202.827 0 + vertex 204.934 202.624 0 + endloop + endfacet + facet normal 0.950577 0.31049 0 + outer loop + vertex 204.819 203.026 -3 + vertex 204.884 202.827 0 + vertex 204.884 202.827 -3 + endloop + endfacet + facet normal 0.950577 0.31049 -0 + outer loop + vertex 204.819 203.026 -3 + vertex 204.819 203.026 0 + vertex 204.884 202.827 0 + endloop + endfacet + facet normal 0.927816 0.373039 0 + outer loop + vertex 204.741 203.22 -3 + vertex 204.819 203.026 0 + vertex 204.819 203.026 -3 + endloop + endfacet + facet normal 0.927816 0.373039 -0 + outer loop + vertex 204.741 203.22 -3 + vertex 204.741 203.22 0 + vertex 204.819 203.026 0 + endloop + endfacet + facet normal 0.898217 0.439553 0 + outer loop + vertex 204.649 203.408 -3 + vertex 204.741 203.22 0 + vertex 204.741 203.22 -3 + endloop + endfacet + facet normal 0.898217 0.439553 -0 + outer loop + vertex 204.649 203.408 -3 + vertex 204.649 203.408 0 + vertex 204.741 203.22 0 + endloop + endfacet + facet normal 0.866186 0.499722 0 + outer loop + vertex 204.544 203.59 -3 + vertex 204.649 203.408 0 + vertex 204.649 203.408 -3 + endloop + endfacet + facet normal 0.866186 0.499722 -0 + outer loop + vertex 204.544 203.59 -3 + vertex 204.544 203.59 0 + vertex 204.649 203.408 0 + endloop + endfacet + facet normal 0.828349 0.560213 0 + outer loop + vertex 204.427 203.763 -3 + vertex 204.544 203.59 0 + vertex 204.544 203.59 -3 + endloop + endfacet + facet normal 0.828349 0.560213 -0 + outer loop + vertex 204.427 203.763 -3 + vertex 204.427 203.763 0 + vertex 204.544 203.59 0 + endloop + endfacet + facet normal 0.787807 0.615922 0 + outer loop + vertex 204.298 203.928 -3 + vertex 204.427 203.763 0 + vertex 204.427 203.763 -3 + endloop + endfacet + facet normal 0.787807 0.615922 -0 + outer loop + vertex 204.298 203.928 -3 + vertex 204.298 203.928 0 + vertex 204.427 203.763 0 + endloop + endfacet + facet normal 0.744242 0.66791 0 + outer loop + vertex 204.158 204.084 -3 + vertex 204.298 203.928 0 + vertex 204.298 203.928 -3 + endloop + endfacet + facet normal 0.744242 0.66791 -0 + outer loop + vertex 204.158 204.084 -3 + vertex 204.158 204.084 0 + vertex 204.298 203.928 0 + endloop + endfacet + facet normal 0.692631 0.721292 0 + outer loop + vertex 204.007 204.229 -3 + vertex 204.158 204.084 0 + vertex 204.158 204.084 -3 + endloop + endfacet + facet normal 0.692631 0.721292 -0 + outer loop + vertex 204.007 204.229 -3 + vertex 204.007 204.229 0 + vertex 204.158 204.084 0 + endloop + endfacet + facet normal 0.644871 0.764291 0 + outer loop + vertex 203.847 204.364 -3 + vertex 204.007 204.229 0 + vertex 204.007 204.229 -3 + endloop + endfacet + facet normal 0.644871 0.764291 -0 + outer loop + vertex 203.847 204.364 -3 + vertex 203.847 204.364 0 + vertex 204.007 204.229 0 + endloop + endfacet + facet normal 0.588456 0.808529 0 + outer loop + vertex 203.678 204.487 -3 + vertex 203.847 204.364 0 + vertex 203.847 204.364 -3 + endloop + endfacet + facet normal 0.588456 0.808529 -0 + outer loop + vertex 203.678 204.487 -3 + vertex 203.678 204.487 0 + vertex 203.847 204.364 0 + endloop + endfacet + facet normal 0.529142 0.848533 0 + outer loop + vertex 203.5 204.598 -3 + vertex 203.678 204.487 0 + vertex 203.678 204.487 -3 + endloop + endfacet + facet normal 0.529142 0.848533 -0 + outer loop + vertex 203.5 204.598 -3 + vertex 203.5 204.598 0 + vertex 203.678 204.487 0 + endloop + endfacet + facet normal 0.468107 0.883672 0 + outer loop + vertex 203.315 204.696 -3 + vertex 203.5 204.598 0 + vertex 203.5 204.598 -3 + endloop + endfacet + facet normal 0.468107 0.883672 -0 + outer loop + vertex 203.315 204.696 -3 + vertex 203.315 204.696 0 + vertex 203.5 204.598 0 + endloop + endfacet + facet normal 0.410563 0.911832 0 + outer loop + vertex 203.124 204.782 -3 + vertex 203.315 204.696 0 + vertex 203.315 204.696 -3 + endloop + endfacet + facet normal 0.410563 0.911832 -0 + outer loop + vertex 203.124 204.782 -3 + vertex 203.124 204.782 0 + vertex 203.315 204.696 0 + endloop + endfacet + facet normal 0.339058 0.940766 0 + outer loop + vertex 202.927 204.853 -3 + vertex 203.124 204.782 0 + vertex 203.124 204.782 -3 + endloop + endfacet + facet normal 0.339058 0.940766 -0 + outer loop + vertex 202.927 204.853 -3 + vertex 202.927 204.853 0 + vertex 203.124 204.782 0 + endloop + endfacet + facet normal 0.277246 0.960799 0 + outer loop + vertex 202.726 204.911 -3 + vertex 202.927 204.853 0 + vertex 202.927 204.853 -3 + endloop + endfacet + facet normal 0.277246 0.960799 -0 + outer loop + vertex 202.726 204.911 -3 + vertex 202.726 204.911 0 + vertex 202.927 204.853 0 + endloop + endfacet + facet normal 0.205289 0.978701 0 + outer loop + vertex 202.521 204.954 -3 + vertex 202.726 204.911 0 + vertex 202.726 204.911 -3 + endloop + endfacet + facet normal 0.205289 0.978701 -0 + outer loop + vertex 202.521 204.954 -3 + vertex 202.521 204.954 0 + vertex 202.726 204.911 0 + endloop + endfacet + facet normal 0.143429 0.989661 0 + outer loop + vertex 202.314 204.984 -3 + vertex 202.521 204.954 0 + vertex 202.521 204.954 -3 + endloop + endfacet + facet normal 0.143429 0.989661 -0 + outer loop + vertex 202.314 204.984 -3 + vertex 202.314 204.984 0 + vertex 202.521 204.954 0 + endloop + endfacet + facet normal 0.0668359 0.997764 0 + outer loop + vertex 202.105 204.998 -3 + vertex 202.314 204.984 0 + vertex 202.314 204.984 -3 + endloop + endfacet + facet normal 0.0668359 0.997764 -0 + outer loop + vertex 202.105 204.998 -3 + vertex 202.105 204.998 0 + vertex 202.314 204.984 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 202.002 204.998 -3 + vertex 202.105 204.998 0 + vertex 202.105 204.998 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 202.002 204.998 -3 + vertex 202.002 204.998 0 + vertex 202.105 204.998 0 + endloop + endfacet + facet normal 0.707107 0.707107 0 + outer loop + vertex 202 205 -3 + vertex 202.002 204.998 0 + vertex 202.002 204.998 -3 + endloop + endfacet + facet normal 0.707107 0.707107 -0 + outer loop + vertex 202 205 -3 + vertex 202 205 0 + vertex 202.002 204.998 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -202 205 -3 + vertex 202 205 0 + vertex 202 205 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -202 205 -3 + vertex -202 205 0 + vertex 202 205 0 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -202.002 204.998 -3 + vertex -202 205 0 + vertex -202 205 -3 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -202.002 204.998 -3 + vertex -202.002 204.998 0 + vertex -202 205 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -202.105 204.998 -3 + vertex -202.002 204.998 0 + vertex -202.002 204.998 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -202.105 204.998 -3 + vertex -202.105 204.998 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -202.314 204.984 -3 + vertex -202.105 204.998 0 + vertex -202.105 204.998 -3 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -202.314 204.984 -3 + vertex -202.314 204.984 0 + vertex -202.105 204.998 0 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -202.521 204.954 -3 + vertex -202.314 204.984 0 + vertex -202.314 204.984 -3 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -202.521 204.954 -3 + vertex -202.521 204.954 0 + vertex -202.314 204.984 0 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -202.726 204.911 -3 + vertex -202.521 204.954 0 + vertex -202.521 204.954 -3 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -202.726 204.911 -3 + vertex -202.726 204.911 0 + vertex -202.521 204.954 0 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -202.927 204.853 -3 + vertex -202.726 204.911 0 + vertex -202.726 204.911 -3 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -202.927 204.853 -3 + vertex -202.927 204.853 0 + vertex -202.726 204.911 0 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -203.124 204.782 -3 + vertex -202.927 204.853 0 + vertex -202.927 204.853 -3 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -203.124 204.782 -3 + vertex -203.124 204.782 0 + vertex -202.927 204.853 0 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -203.315 204.696 -3 + vertex -203.124 204.782 0 + vertex -203.124 204.782 -3 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -203.315 204.696 -3 + vertex -203.315 204.696 0 + vertex -203.124 204.782 0 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -203.5 204.598 -3 + vertex -203.315 204.696 0 + vertex -203.315 204.696 -3 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -203.5 204.598 -3 + vertex -203.5 204.598 0 + vertex -203.315 204.696 0 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -203.678 204.487 -3 + vertex -203.5 204.598 0 + vertex -203.5 204.598 -3 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -203.678 204.487 -3 + vertex -203.678 204.487 0 + vertex -203.5 204.598 0 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -203.847 204.364 -3 + vertex -203.678 204.487 0 + vertex -203.678 204.487 -3 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -203.847 204.364 -3 + vertex -203.847 204.364 0 + vertex -203.678 204.487 0 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -204.007 204.229 -3 + vertex -203.847 204.364 0 + vertex -203.847 204.364 -3 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -204.007 204.229 -3 + vertex -204.007 204.229 0 + vertex -203.847 204.364 0 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -204.158 204.084 -3 + vertex -204.007 204.229 0 + vertex -204.007 204.229 -3 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -204.158 204.084 -3 + vertex -204.158 204.084 0 + vertex -204.007 204.229 0 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -204.298 203.928 -3 + vertex -204.158 204.084 0 + vertex -204.158 204.084 -3 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -204.298 203.928 -3 + vertex -204.298 203.928 0 + vertex -204.158 204.084 0 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -204.427 203.763 -3 + vertex -204.298 203.928 0 + vertex -204.298 203.928 -3 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -204.427 203.763 -3 + vertex -204.427 203.763 0 + vertex -204.298 203.928 0 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -204.544 203.59 -3 + vertex -204.427 203.763 0 + vertex -204.427 203.763 -3 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -204.544 203.59 -3 + vertex -204.544 203.59 0 + vertex -204.427 203.763 0 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -204.649 203.408 -3 + vertex -204.544 203.59 0 + vertex -204.544 203.59 -3 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -204.649 203.408 -3 + vertex -204.649 203.408 0 + vertex -204.544 203.59 0 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -204.741 203.22 -3 + vertex -204.649 203.408 0 + vertex -204.649 203.408 -3 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -204.741 203.22 -3 + vertex -204.741 203.22 0 + vertex -204.649 203.408 0 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -204.819 203.026 -3 + vertex -204.741 203.22 0 + vertex -204.741 203.22 -3 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -204.819 203.026 -3 + vertex -204.819 203.026 0 + vertex -204.741 203.22 0 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -204.884 202.827 -3 + vertex -204.819 203.026 0 + vertex -204.819 203.026 -3 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -204.884 202.827 -3 + vertex -204.884 202.827 0 + vertex -204.819 203.026 0 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -204.934 202.624 -3 + vertex -204.884 202.827 0 + vertex -204.884 202.827 -3 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -204.934 202.624 -3 + vertex -204.934 202.624 0 + vertex -204.884 202.827 0 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -204.971 202.418 -3 + vertex -204.934 202.624 0 + vertex -204.934 202.624 -3 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -204.971 202.418 -3 + vertex -204.971 202.418 0 + vertex -204.934 202.624 0 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -204.993 202.209 -3 + vertex -204.971 202.418 0 + vertex -204.971 202.418 -3 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -204.993 202.209 -3 + vertex -204.993 202.209 0 + vertex -204.971 202.418 0 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -205 202 -3 + vertex -204.993 202.209 0 + vertex -204.993 202.209 -3 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -205 202 -3 + vertex -205 202 0 + vertex -204.993 202.209 0 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -205 -202 -3 + vertex -205 202 0 + vertex -205 202 -3 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -205 -202 -3 + vertex -205 -202 0 + vertex -205 202 0 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -204.993 -202.209 -3 + vertex -205 -202 0 + vertex -205 -202 -3 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -204.993 -202.209 -3 + vertex -204.993 -202.209 0 + vertex -205 -202 0 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -204.971 -202.418 -3 + vertex -204.993 -202.209 0 + vertex -204.993 -202.209 -3 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -204.971 -202.418 -3 + vertex -204.971 -202.418 0 + vertex -204.993 -202.209 0 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -204.934 -202.624 -3 + vertex -204.971 -202.418 0 + vertex -204.971 -202.418 -3 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -204.934 -202.624 -3 + vertex -204.934 -202.624 0 + vertex -204.971 -202.418 0 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -204.884 -202.827 -3 + vertex -204.934 -202.624 0 + vertex -204.934 -202.624 -3 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -204.884 -202.827 -3 + vertex -204.884 -202.827 0 + vertex -204.934 -202.624 0 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -204.819 -203.026 -3 + vertex -204.884 -202.827 0 + vertex -204.884 -202.827 -3 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -204.819 -203.026 -3 + vertex -204.819 -203.026 0 + vertex -204.884 -202.827 0 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -204.741 -203.22 -3 + vertex -204.819 -203.026 0 + vertex -204.819 -203.026 -3 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -204.741 -203.22 -3 + vertex -204.741 -203.22 0 + vertex -204.819 -203.026 0 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -204.649 -203.408 -3 + vertex -204.741 -203.22 0 + vertex -204.741 -203.22 -3 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -204.649 -203.408 -3 + vertex -204.649 -203.408 0 + vertex -204.741 -203.22 0 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -204.544 -203.59 -3 + vertex -204.649 -203.408 0 + vertex -204.649 -203.408 -3 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -204.544 -203.59 -3 + vertex -204.544 -203.59 0 + vertex -204.649 -203.408 0 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -204.427 -203.763 -3 + vertex -204.544 -203.59 0 + vertex -204.544 -203.59 -3 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -204.427 -203.763 -3 + vertex -204.427 -203.763 0 + vertex -204.544 -203.59 0 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -204.298 -203.928 -3 + vertex -204.427 -203.763 0 + vertex -204.427 -203.763 -3 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -204.298 -203.928 -3 + vertex -204.298 -203.928 0 + vertex -204.427 -203.763 0 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -204.158 -204.084 -3 + vertex -204.298 -203.928 0 + vertex -204.298 -203.928 -3 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -204.158 -204.084 -3 + vertex -204.158 -204.084 0 + vertex -204.298 -203.928 0 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -204.007 -204.229 -3 + vertex -204.158 -204.084 0 + vertex -204.158 -204.084 -3 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -204.007 -204.229 -3 + vertex -204.007 -204.229 0 + vertex -204.158 -204.084 0 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -203.847 -204.364 -3 + vertex -204.007 -204.229 0 + vertex -204.007 -204.229 -3 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -203.847 -204.364 -3 + vertex -203.847 -204.364 0 + vertex -204.007 -204.229 0 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -203.678 -204.487 -3 + vertex -203.847 -204.364 0 + vertex -203.847 -204.364 -3 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -203.678 -204.487 -3 + vertex -203.678 -204.487 0 + vertex -203.847 -204.364 0 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -203.5 -204.598 -3 + vertex -203.678 -204.487 0 + vertex -203.678 -204.487 -3 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -203.5 -204.598 -3 + vertex -203.5 -204.598 0 + vertex -203.678 -204.487 0 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -203.315 -204.696 -3 + vertex -203.5 -204.598 0 + vertex -203.5 -204.598 -3 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -203.315 -204.696 -3 + vertex -203.315 -204.696 0 + vertex -203.5 -204.598 0 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -203.124 -204.782 -3 + vertex -203.315 -204.696 0 + vertex -203.315 -204.696 -3 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -203.124 -204.782 -3 + vertex -203.124 -204.782 0 + vertex -203.315 -204.696 0 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -202.927 -204.853 -3 + vertex -203.124 -204.782 0 + vertex -203.124 -204.782 -3 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -202.927 -204.853 -3 + vertex -202.927 -204.853 0 + vertex -203.124 -204.782 0 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -202.726 -204.911 -3 + vertex -202.927 -204.853 0 + vertex -202.927 -204.853 -3 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -202.726 -204.911 -3 + vertex -202.726 -204.911 0 + vertex -202.927 -204.853 0 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -202.521 -204.954 -3 + vertex -202.726 -204.911 0 + vertex -202.726 -204.911 -3 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -202.521 -204.954 -3 + vertex -202.521 -204.954 0 + vertex -202.726 -204.911 0 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -202.314 -204.984 -3 + vertex -202.521 -204.954 0 + vertex -202.521 -204.954 -3 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -202.314 -204.984 -3 + vertex -202.314 -204.984 0 + vertex -202.521 -204.954 0 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -202.105 -204.998 -3 + vertex -202.314 -204.984 0 + vertex -202.314 -204.984 -3 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -202.105 -204.998 -3 + vertex -202.105 -204.998 0 + vertex -202.314 -204.984 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -202.002 -204.998 -3 + vertex -202.105 -204.998 0 + vertex -202.105 -204.998 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -202.002 -204.998 -3 + vertex -202.002 -204.998 0 + vertex -202.105 -204.998 0 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -202 -205 -3 + vertex -202.002 -204.998 0 + vertex -202.002 -204.998 -3 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -202 -205 -3 + vertex -202 -205 0 + vertex -202.002 -204.998 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 202 -205 -3 + vertex -202 -205 0 + vertex -202 -205 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 202 -205 -3 + vertex 202 -205 0 + vertex -202 -205 0 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 202.002 -204.998 -3 + vertex 202 -205 0 + vertex 202 -205 -3 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 202.002 -204.998 -3 + vertex 202.002 -204.998 0 + vertex 202 -205 0 + endloop + endfacet +endsolid OpenSCAD_Model diff --git a/resources/profiles/Creality/cr10s5.svg b/resources/profiles/Creality/cr10s5.svg new file mode 100644 index 0000000000..1dfca17dc2 --- /dev/null +++ b/resources/profiles/Creality/cr10s5.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/profiles/Creality/cr10s5_bed.stl b/resources/profiles/Creality/cr10s5_bed.stl new file mode 100644 index 0000000000..5b9acaf104 --- /dev/null +++ b/resources/profiles/Creality/cr10s5_bed.stl @@ -0,0 +1,2774 @@ +solid OpenSCAD_Model + facet normal 0 0 -1 + outer loop + vertex 252.105 -254.998 -3 + vertex 252.002 -254.998 -3 + vertex 252.314 -254.984 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 252.314 -254.984 -3 + vertex 252.002 -254.998 -3 + vertex 252.521 -254.954 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 255 -252 -3 + vertex 252.002 -254.998 -3 + vertex 252.002 254.998 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 252.521 -254.954 -3 + vertex 252.002 -254.998 -3 + vertex 252.726 -254.911 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 252.726 -254.911 -3 + vertex 252.002 -254.998 -3 + vertex 252.927 -254.853 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 252.927 -254.853 -3 + vertex 252.002 -254.998 -3 + vertex 253.124 -254.782 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 253.124 -254.782 -3 + vertex 252.002 -254.998 -3 + vertex 253.315 -254.696 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 253.315 -254.696 -3 + vertex 252.002 -254.998 -3 + vertex 253.5 -254.598 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 253.5 -254.598 -3 + vertex 252.002 -254.998 -3 + vertex 253.678 -254.487 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 253.678 -254.487 -3 + vertex 252.002 -254.998 -3 + vertex 253.847 -254.364 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 253.847 -254.364 -3 + vertex 252.002 -254.998 -3 + vertex 254.007 -254.229 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 254.007 -254.229 -3 + vertex 252.002 -254.998 -3 + vertex 254.158 -254.084 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 254.158 -254.084 -3 + vertex 252.002 -254.998 -3 + vertex 254.298 -253.928 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 254.298 -253.928 -3 + vertex 252.002 -254.998 -3 + vertex 254.427 -253.763 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 254.427 -253.763 -3 + vertex 252.002 -254.998 -3 + vertex 254.544 -253.59 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 254.544 -253.59 -3 + vertex 252.002 -254.998 -3 + vertex 254.649 -253.408 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 254.649 -253.408 -3 + vertex 252.002 -254.998 -3 + vertex 254.741 -253.22 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 254.741 -253.22 -3 + vertex 252.002 -254.998 -3 + vertex 254.819 -253.026 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 254.819 -253.026 -3 + vertex 252.002 -254.998 -3 + vertex 254.884 -252.827 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 254.884 -252.827 -3 + vertex 252.002 -254.998 -3 + vertex 254.934 -252.624 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 254.934 -252.624 -3 + vertex 252.002 -254.998 -3 + vertex 254.971 -252.418 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 254.971 -252.418 -3 + vertex 252.002 -254.998 -3 + vertex 254.993 -252.209 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 254.993 -252.209 -3 + vertex 252.002 -254.998 -3 + vertex 255 -252 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 255 -252 -3 + vertex 252.002 254.998 -3 + vertex 255 252 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 252.002 254.998 -3 + vertex 254.971 252.418 -3 + vertex 254.993 252.209 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 254.884 252.827 -3 + vertex 254.934 252.624 -3 + vertex 252.002 254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 254.741 253.22 -3 + vertex 252.002 254.998 -3 + vertex 254.649 253.408 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 254.741 253.22 -3 + vertex 254.819 253.026 -3 + vertex 252.002 254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 252.002 254.998 -3 + vertex 254.007 254.229 -3 + vertex 254.158 254.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 254.427 253.763 -3 + vertex 252.002 254.998 -3 + vertex 254.298 253.928 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 254.427 253.763 -3 + vertex 254.544 253.59 -3 + vertex 252.002 254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 254.298 253.928 -3 + vertex 252.002 254.998 -3 + vertex 254.158 254.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 252.002 254.998 -3 + vertex 252.927 254.853 -3 + vertex 253.124 254.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 253.847 254.364 -3 + vertex 252.002 254.998 -3 + vertex 253.678 254.487 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 253.847 254.364 -3 + vertex 254.007 254.229 -3 + vertex 252.002 254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 253.678 254.487 -3 + vertex 252.002 254.998 -3 + vertex 253.5 254.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 253.5 254.598 -3 + vertex 252.002 254.998 -3 + vertex 253.315 254.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 253.315 254.696 -3 + vertex 252.002 254.998 -3 + vertex 253.124 254.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 254.649 253.408 -3 + vertex 252.002 254.998 -3 + vertex 254.544 253.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 252.726 254.911 -3 + vertex 252.002 254.998 -3 + vertex 252.521 254.954 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 252.726 254.911 -3 + vertex 252.927 254.853 -3 + vertex 252.002 254.998 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 254.819 253.026 -3 + vertex 254.884 252.827 -3 + vertex 252.002 254.998 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 252.314 254.984 -3 + vertex 252.521 254.954 -3 + vertex 252.002 254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 252.002 254.998 -3 + vertex 254.934 252.624 -3 + vertex 254.971 252.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 252.002 254.998 -3 + vertex 252.105 254.998 -3 + vertex 252.314 254.984 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 255 252 -3 + vertex 252.002 254.998 -3 + vertex 254.993 252.209 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex -252 255 -3 + vertex 252 255 -3 + vertex -252.002 254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex 252 255 -3 + vertex 252.002 254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 252.002 -254.998 -3 + vertex -252.002 254.998 -3 + vertex 252.002 254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -255 -252 -3 + vertex -255 252 -3 + vertex -252.002 -254.998 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -252.314 254.984 -3 + vertex -252.105 254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -252.521 254.954 -3 + vertex -252.314 254.984 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -252.726 254.911 -3 + vertex -252.521 254.954 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -252.927 254.853 -3 + vertex -252.726 254.911 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -253.124 254.782 -3 + vertex -252.927 254.853 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -253.315 254.696 -3 + vertex -253.124 254.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -253.5 254.598 -3 + vertex -253.315 254.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -253.678 254.487 -3 + vertex -253.5 254.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -253.847 254.364 -3 + vertex -253.678 254.487 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -254.007 254.229 -3 + vertex -253.847 254.364 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -254.158 254.084 -3 + vertex -254.007 254.229 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -254.298 253.928 -3 + vertex -254.158 254.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -254.427 253.763 -3 + vertex -254.298 253.928 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -254.544 253.59 -3 + vertex -254.427 253.763 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -254.649 253.408 -3 + vertex -254.544 253.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -254.741 253.22 -3 + vertex -254.649 253.408 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -254.819 253.026 -3 + vertex -254.741 253.22 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -254.884 252.827 -3 + vertex -254.819 253.026 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -254.934 252.624 -3 + vertex -254.884 252.827 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -254.971 252.418 -3 + vertex -254.934 252.624 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -254.993 252.209 -3 + vertex -254.971 252.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -255 252 -3 + vertex -254.993 252.209 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 -254.998 -3 + vertex -255 252 -3 + vertex -252.002 254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 252.002 -254.998 -3 + vertex -252.002 -254.998 -3 + vertex -252.002 254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 -254.998 -3 + vertex -254.971 -252.418 -3 + vertex -254.993 -252.209 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -254.884 -252.827 -3 + vertex -254.934 -252.624 -3 + vertex -252.002 -254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -254.741 -253.22 -3 + vertex -252.002 -254.998 -3 + vertex -254.649 -253.408 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -254.741 -253.22 -3 + vertex -254.819 -253.026 -3 + vertex -252.002 -254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 -254.998 -3 + vertex -254.007 -254.229 -3 + vertex -254.158 -254.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -254.427 -253.763 -3 + vertex -252.002 -254.998 -3 + vertex -254.298 -253.928 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -254.427 -253.763 -3 + vertex -254.544 -253.59 -3 + vertex -252.002 -254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -254.298 -253.928 -3 + vertex -252.002 -254.998 -3 + vertex -254.158 -254.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 -254.998 -3 + vertex -252.927 -254.853 -3 + vertex -253.124 -254.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -253.847 -254.364 -3 + vertex -252.002 -254.998 -3 + vertex -253.678 -254.487 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -253.847 -254.364 -3 + vertex -254.007 -254.229 -3 + vertex -252.002 -254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -253.678 -254.487 -3 + vertex -252.002 -254.998 -3 + vertex -253.5 -254.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -253.5 -254.598 -3 + vertex -252.002 -254.998 -3 + vertex -253.315 -254.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -253.315 -254.696 -3 + vertex -252.002 -254.998 -3 + vertex -253.124 -254.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -254.649 -253.408 -3 + vertex -252.002 -254.998 -3 + vertex -254.544 -253.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.726 -254.911 -3 + vertex -252.002 -254.998 -3 + vertex -252.521 -254.954 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.726 -254.911 -3 + vertex -252.927 -254.853 -3 + vertex -252.002 -254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -254.819 -253.026 -3 + vertex -254.884 -252.827 -3 + vertex -252.002 -254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.314 -254.984 -3 + vertex -252.521 -254.954 -3 + vertex -252.002 -254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 -254.998 -3 + vertex -254.934 -252.624 -3 + vertex -254.971 -252.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 -254.998 -3 + vertex -252.105 -254.998 -3 + vertex -252.314 -254.984 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 252.002 -254.998 -3 + vertex 252 -255 -3 + vertex -252.002 -254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 -254.998 -3 + vertex 252 -255 -3 + vertex -252 -255 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -255 -252 -3 + vertex -252.002 -254.998 -3 + vertex -254.993 -252.209 -3 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.314 -254.984 0 + vertex 252.002 -254.998 0 + vertex 252.105 -254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.521 -254.954 0 + vertex 252.002 -254.998 0 + vertex 252.314 -254.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.002 254.998 0 + vertex 252.002 -254.998 0 + vertex 255 -252 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.726 -254.911 0 + vertex 252.002 -254.998 0 + vertex 252.521 -254.954 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.927 -254.853 0 + vertex 252.002 -254.998 0 + vertex 252.726 -254.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 253.124 -254.782 0 + vertex 252.002 -254.998 0 + vertex 252.927 -254.853 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 253.315 -254.696 0 + vertex 252.002 -254.998 0 + vertex 253.124 -254.782 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 253.5 -254.598 0 + vertex 252.002 -254.998 0 + vertex 253.315 -254.696 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 253.678 -254.487 0 + vertex 252.002 -254.998 0 + vertex 253.5 -254.598 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 253.847 -254.364 0 + vertex 252.002 -254.998 0 + vertex 253.678 -254.487 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.007 -254.229 0 + vertex 252.002 -254.998 0 + vertex 253.847 -254.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.158 -254.084 0 + vertex 252.002 -254.998 0 + vertex 254.007 -254.229 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.298 -253.928 0 + vertex 252.002 -254.998 0 + vertex 254.158 -254.084 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.427 -253.763 0 + vertex 252.002 -254.998 0 + vertex 254.298 -253.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.544 -253.59 0 + vertex 252.002 -254.998 0 + vertex 254.427 -253.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.649 -253.408 0 + vertex 252.002 -254.998 0 + vertex 254.544 -253.59 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.741 -253.22 0 + vertex 252.002 -254.998 0 + vertex 254.649 -253.408 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.819 -253.026 0 + vertex 252.002 -254.998 0 + vertex 254.741 -253.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.884 -252.827 0 + vertex 252.002 -254.998 0 + vertex 254.819 -253.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.934 -252.624 0 + vertex 252.002 -254.998 0 + vertex 254.884 -252.827 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.971 -252.418 0 + vertex 252.002 -254.998 0 + vertex 254.934 -252.624 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.993 -252.209 0 + vertex 252.002 -254.998 0 + vertex 254.971 -252.418 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 255 -252 0 + vertex 252.002 -254.998 0 + vertex 254.993 -252.209 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 255 252 0 + vertex 252.002 254.998 0 + vertex 255 -252 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.993 252.209 0 + vertex 254.971 252.418 0 + vertex 252.002 254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.002 254.998 0 + vertex 254.934 252.624 0 + vertex 254.884 252.827 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.649 253.408 0 + vertex 252.002 254.998 0 + vertex 254.741 253.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.002 254.998 0 + vertex 254.819 253.026 0 + vertex 254.741 253.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.158 254.084 0 + vertex 254.007 254.229 0 + vertex 252.002 254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.298 253.928 0 + vertex 252.002 254.998 0 + vertex 254.427 253.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.002 254.998 0 + vertex 254.544 253.59 0 + vertex 254.427 253.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.158 254.084 0 + vertex 252.002 254.998 0 + vertex 254.298 253.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 253.124 254.782 0 + vertex 252.927 254.853 0 + vertex 252.002 254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 253.678 254.487 0 + vertex 252.002 254.998 0 + vertex 253.847 254.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.002 254.998 0 + vertex 254.007 254.229 0 + vertex 253.847 254.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 253.5 254.598 0 + vertex 252.002 254.998 0 + vertex 253.678 254.487 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 253.315 254.696 0 + vertex 252.002 254.998 0 + vertex 253.5 254.598 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 253.124 254.782 0 + vertex 252.002 254.998 0 + vertex 253.315 254.696 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.544 253.59 0 + vertex 252.002 254.998 0 + vertex 254.649 253.408 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.521 254.954 0 + vertex 252.002 254.998 0 + vertex 252.726 254.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.002 254.998 0 + vertex 252.927 254.853 0 + vertex 252.726 254.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.002 254.998 0 + vertex 254.884 252.827 0 + vertex 254.819 253.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.002 254.998 0 + vertex 252.521 254.954 0 + vertex 252.314 254.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.971 252.418 0 + vertex 254.934 252.624 0 + vertex 252.002 254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.314 254.984 0 + vertex 252.105 254.998 0 + vertex 252.002 254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.993 252.209 0 + vertex 252.002 254.998 0 + vertex 255 252 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -252.002 254.998 0 + vertex 252 255 0 + vertex -252 255 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.002 254.998 0 + vertex 252 255 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.002 254.998 0 + vertex -252.002 254.998 0 + vertex 252.002 -254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -252.002 -254.998 0 + vertex -255 252 0 + vertex -255 -252 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -252.105 254.998 0 + vertex -252.314 254.984 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -252.314 254.984 0 + vertex -252.521 254.954 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -252.521 254.954 0 + vertex -252.726 254.911 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -252.726 254.911 0 + vertex -252.927 254.853 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -252.927 254.853 0 + vertex -253.124 254.782 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -253.124 254.782 0 + vertex -253.315 254.696 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -253.315 254.696 0 + vertex -253.5 254.598 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -253.5 254.598 0 + vertex -253.678 254.487 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -253.678 254.487 0 + vertex -253.847 254.364 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -253.847 254.364 0 + vertex -254.007 254.229 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -254.007 254.229 0 + vertex -254.158 254.084 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -254.158 254.084 0 + vertex -254.298 253.928 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -254.298 253.928 0 + vertex -254.427 253.763 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -254.427 253.763 0 + vertex -254.544 253.59 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -254.544 253.59 0 + vertex -254.649 253.408 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -254.649 253.408 0 + vertex -254.741 253.22 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -254.741 253.22 0 + vertex -254.819 253.026 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -254.819 253.026 0 + vertex -254.884 252.827 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -254.884 252.827 0 + vertex -254.934 252.624 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -254.934 252.624 0 + vertex -254.971 252.418 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -254.971 252.418 0 + vertex -254.993 252.209 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -254.993 252.209 0 + vertex -255 252 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -252.002 254.998 0 + vertex -255 252 0 + vertex -252.002 -254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -252.002 254.998 0 + vertex -252.002 -254.998 0 + vertex 252.002 -254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -254.993 -252.209 0 + vertex -254.971 -252.418 0 + vertex -252.002 -254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -252.002 -254.998 0 + vertex -254.934 -252.624 0 + vertex -254.884 -252.827 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -254.649 -253.408 0 + vertex -252.002 -254.998 0 + vertex -254.741 -253.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -252.002 -254.998 0 + vertex -254.819 -253.026 0 + vertex -254.741 -253.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -254.158 -254.084 0 + vertex -254.007 -254.229 0 + vertex -252.002 -254.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -254.298 -253.928 0 + vertex -252.002 -254.998 0 + vertex -254.427 -253.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -252.002 -254.998 0 + vertex -254.544 -253.59 0 + vertex -254.427 -253.763 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -254.158 -254.084 0 + vertex -252.002 -254.998 0 + vertex -254.298 -253.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -253.124 -254.782 0 + vertex -252.927 -254.853 0 + vertex -252.002 -254.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -253.678 -254.487 0 + vertex -252.002 -254.998 0 + vertex -253.847 -254.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -252.002 -254.998 0 + vertex -254.007 -254.229 0 + vertex -253.847 -254.364 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -253.5 -254.598 0 + vertex -252.002 -254.998 0 + vertex -253.678 -254.487 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -253.315 -254.696 0 + vertex -252.002 -254.998 0 + vertex -253.5 -254.598 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -253.124 -254.782 0 + vertex -252.002 -254.998 0 + vertex -253.315 -254.696 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -254.544 -253.59 0 + vertex -252.002 -254.998 0 + vertex -254.649 -253.408 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -252.521 -254.954 0 + vertex -252.002 -254.998 0 + vertex -252.726 -254.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -252.002 -254.998 0 + vertex -252.927 -254.853 0 + vertex -252.726 -254.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -252.002 -254.998 0 + vertex -254.884 -252.827 0 + vertex -254.819 -253.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -252.002 -254.998 0 + vertex -252.521 -254.954 0 + vertex -252.314 -254.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -254.971 -252.418 0 + vertex -254.934 -252.624 0 + vertex -252.002 -254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -252.314 -254.984 0 + vertex -252.105 -254.998 0 + vertex -252.002 -254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -252.002 -254.998 0 + vertex 252 -255 0 + vertex 252.002 -254.998 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex -252 -255 0 + vertex 252 -255 0 + vertex -252.002 -254.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -254.993 -252.209 0 + vertex -252.002 -254.998 0 + vertex -255 -252 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 252.105 -254.998 -3 + vertex 252.002 -254.998 0 + vertex 252.002 -254.998 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 252.105 -254.998 -3 + vertex 252.105 -254.998 0 + vertex 252.002 -254.998 0 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 252.314 -254.984 -3 + vertex 252.105 -254.998 0 + vertex 252.105 -254.998 -3 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 252.314 -254.984 -3 + vertex 252.314 -254.984 0 + vertex 252.105 -254.998 0 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 252.521 -254.954 -3 + vertex 252.314 -254.984 0 + vertex 252.314 -254.984 -3 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 252.521 -254.954 -3 + vertex 252.521 -254.954 0 + vertex 252.314 -254.984 0 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 252.726 -254.911 -3 + vertex 252.521 -254.954 0 + vertex 252.521 -254.954 -3 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 252.726 -254.911 -3 + vertex 252.726 -254.911 0 + vertex 252.521 -254.954 0 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 252.927 -254.853 -3 + vertex 252.726 -254.911 0 + vertex 252.726 -254.911 -3 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 252.927 -254.853 -3 + vertex 252.927 -254.853 0 + vertex 252.726 -254.911 0 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 253.124 -254.782 -3 + vertex 252.927 -254.853 0 + vertex 252.927 -254.853 -3 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 253.124 -254.782 -3 + vertex 253.124 -254.782 0 + vertex 252.927 -254.853 0 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 253.315 -254.696 -3 + vertex 253.124 -254.782 0 + vertex 253.124 -254.782 -3 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 253.315 -254.696 -3 + vertex 253.315 -254.696 0 + vertex 253.124 -254.782 0 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 253.5 -254.598 -3 + vertex 253.315 -254.696 0 + vertex 253.315 -254.696 -3 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 253.5 -254.598 -3 + vertex 253.5 -254.598 0 + vertex 253.315 -254.696 0 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 253.678 -254.487 -3 + vertex 253.5 -254.598 0 + vertex 253.5 -254.598 -3 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 253.678 -254.487 -3 + vertex 253.678 -254.487 0 + vertex 253.5 -254.598 0 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 253.847 -254.364 -3 + vertex 253.678 -254.487 0 + vertex 253.678 -254.487 -3 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 253.847 -254.364 -3 + vertex 253.847 -254.364 0 + vertex 253.678 -254.487 0 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 254.007 -254.229 -3 + vertex 253.847 -254.364 0 + vertex 253.847 -254.364 -3 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 254.007 -254.229 -3 + vertex 254.007 -254.229 0 + vertex 253.847 -254.364 0 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 254.158 -254.084 -3 + vertex 254.007 -254.229 0 + vertex 254.007 -254.229 -3 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 254.158 -254.084 -3 + vertex 254.158 -254.084 0 + vertex 254.007 -254.229 0 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 254.298 -253.928 -3 + vertex 254.158 -254.084 0 + vertex 254.158 -254.084 -3 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 254.298 -253.928 -3 + vertex 254.298 -253.928 0 + vertex 254.158 -254.084 0 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 254.427 -253.763 -3 + vertex 254.298 -253.928 0 + vertex 254.298 -253.928 -3 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 254.427 -253.763 -3 + vertex 254.427 -253.763 0 + vertex 254.298 -253.928 0 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 254.544 -253.59 -3 + vertex 254.427 -253.763 0 + vertex 254.427 -253.763 -3 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 254.544 -253.59 -3 + vertex 254.544 -253.59 0 + vertex 254.427 -253.763 0 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 254.649 -253.408 -3 + vertex 254.544 -253.59 0 + vertex 254.544 -253.59 -3 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 254.649 -253.408 -3 + vertex 254.649 -253.408 0 + vertex 254.544 -253.59 0 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 254.741 -253.22 -3 + vertex 254.649 -253.408 0 + vertex 254.649 -253.408 -3 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 254.741 -253.22 -3 + vertex 254.741 -253.22 0 + vertex 254.649 -253.408 0 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 254.819 -253.026 -3 + vertex 254.741 -253.22 0 + vertex 254.741 -253.22 -3 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 254.819 -253.026 -3 + vertex 254.819 -253.026 0 + vertex 254.741 -253.22 0 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 254.884 -252.827 -3 + vertex 254.819 -253.026 0 + vertex 254.819 -253.026 -3 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 254.884 -252.827 -3 + vertex 254.884 -252.827 0 + vertex 254.819 -253.026 0 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 254.934 -252.624 -3 + vertex 254.884 -252.827 0 + vertex 254.884 -252.827 -3 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 254.934 -252.624 -3 + vertex 254.934 -252.624 0 + vertex 254.884 -252.827 0 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 254.971 -252.418 -3 + vertex 254.934 -252.624 0 + vertex 254.934 -252.624 -3 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 254.971 -252.418 -3 + vertex 254.971 -252.418 0 + vertex 254.934 -252.624 0 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 254.993 -252.209 -3 + vertex 254.971 -252.418 0 + vertex 254.971 -252.418 -3 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 254.993 -252.209 -3 + vertex 254.993 -252.209 0 + vertex 254.971 -252.418 0 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 255 -252 -3 + vertex 254.993 -252.209 0 + vertex 254.993 -252.209 -3 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 255 -252 -3 + vertex 255 -252 0 + vertex 254.993 -252.209 0 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 255 252 -3 + vertex 255 -252 0 + vertex 255 -252 -3 + endloop + endfacet + facet normal 1 0 -0 + outer loop + vertex 255 252 -3 + vertex 255 252 0 + vertex 255 -252 0 + endloop + endfacet + facet normal 0.99944 0.0334741 0 + outer loop + vertex 254.993 252.209 -3 + vertex 255 252 0 + vertex 255 252 -3 + endloop + endfacet + facet normal 0.99944 0.0334741 -0 + outer loop + vertex 254.993 252.209 -3 + vertex 254.993 252.209 0 + vertex 255 252 0 + endloop + endfacet + facet normal 0.994505 0.104685 0 + outer loop + vertex 254.971 252.418 -3 + vertex 254.993 252.209 0 + vertex 254.993 252.209 -3 + endloop + endfacet + facet normal 0.994505 0.104685 -0 + outer loop + vertex 254.971 252.418 -3 + vertex 254.971 252.418 0 + vertex 254.993 252.209 0 + endloop + endfacet + facet normal 0.98425 0.176783 0 + outer loop + vertex 254.934 252.624 -3 + vertex 254.971 252.418 0 + vertex 254.971 252.418 -3 + endloop + endfacet + facet normal 0.98425 0.176783 -0 + outer loop + vertex 254.934 252.624 -3 + vertex 254.934 252.624 0 + vertex 254.971 252.418 0 + endloop + endfacet + facet normal 0.970981 0.239158 0 + outer loop + vertex 254.884 252.827 -3 + vertex 254.934 252.624 0 + vertex 254.934 252.624 -3 + endloop + endfacet + facet normal 0.970981 0.239158 -0 + outer loop + vertex 254.884 252.827 -3 + vertex 254.884 252.827 0 + vertex 254.934 252.624 0 + endloop + endfacet + facet normal 0.950577 0.31049 0 + outer loop + vertex 254.819 253.026 -3 + vertex 254.884 252.827 0 + vertex 254.884 252.827 -3 + endloop + endfacet + facet normal 0.950577 0.31049 -0 + outer loop + vertex 254.819 253.026 -3 + vertex 254.819 253.026 0 + vertex 254.884 252.827 0 + endloop + endfacet + facet normal 0.927816 0.373039 0 + outer loop + vertex 254.741 253.22 -3 + vertex 254.819 253.026 0 + vertex 254.819 253.026 -3 + endloop + endfacet + facet normal 0.927816 0.373039 -0 + outer loop + vertex 254.741 253.22 -3 + vertex 254.741 253.22 0 + vertex 254.819 253.026 0 + endloop + endfacet + facet normal 0.898217 0.439553 0 + outer loop + vertex 254.649 253.408 -3 + vertex 254.741 253.22 0 + vertex 254.741 253.22 -3 + endloop + endfacet + facet normal 0.898217 0.439553 -0 + outer loop + vertex 254.649 253.408 -3 + vertex 254.649 253.408 0 + vertex 254.741 253.22 0 + endloop + endfacet + facet normal 0.866186 0.499722 0 + outer loop + vertex 254.544 253.59 -3 + vertex 254.649 253.408 0 + vertex 254.649 253.408 -3 + endloop + endfacet + facet normal 0.866186 0.499722 -0 + outer loop + vertex 254.544 253.59 -3 + vertex 254.544 253.59 0 + vertex 254.649 253.408 0 + endloop + endfacet + facet normal 0.828349 0.560213 0 + outer loop + vertex 254.427 253.763 -3 + vertex 254.544 253.59 0 + vertex 254.544 253.59 -3 + endloop + endfacet + facet normal 0.828349 0.560213 -0 + outer loop + vertex 254.427 253.763 -3 + vertex 254.427 253.763 0 + vertex 254.544 253.59 0 + endloop + endfacet + facet normal 0.787807 0.615922 0 + outer loop + vertex 254.298 253.928 -3 + vertex 254.427 253.763 0 + vertex 254.427 253.763 -3 + endloop + endfacet + facet normal 0.787807 0.615922 -0 + outer loop + vertex 254.298 253.928 -3 + vertex 254.298 253.928 0 + vertex 254.427 253.763 0 + endloop + endfacet + facet normal 0.744242 0.66791 0 + outer loop + vertex 254.158 254.084 -3 + vertex 254.298 253.928 0 + vertex 254.298 253.928 -3 + endloop + endfacet + facet normal 0.744242 0.66791 -0 + outer loop + vertex 254.158 254.084 -3 + vertex 254.158 254.084 0 + vertex 254.298 253.928 0 + endloop + endfacet + facet normal 0.692631 0.721292 0 + outer loop + vertex 254.007 254.229 -3 + vertex 254.158 254.084 0 + vertex 254.158 254.084 -3 + endloop + endfacet + facet normal 0.692631 0.721292 -0 + outer loop + vertex 254.007 254.229 -3 + vertex 254.007 254.229 0 + vertex 254.158 254.084 0 + endloop + endfacet + facet normal 0.644871 0.764291 0 + outer loop + vertex 253.847 254.364 -3 + vertex 254.007 254.229 0 + vertex 254.007 254.229 -3 + endloop + endfacet + facet normal 0.644871 0.764291 -0 + outer loop + vertex 253.847 254.364 -3 + vertex 253.847 254.364 0 + vertex 254.007 254.229 0 + endloop + endfacet + facet normal 0.588456 0.808529 0 + outer loop + vertex 253.678 254.487 -3 + vertex 253.847 254.364 0 + vertex 253.847 254.364 -3 + endloop + endfacet + facet normal 0.588456 0.808529 -0 + outer loop + vertex 253.678 254.487 -3 + vertex 253.678 254.487 0 + vertex 253.847 254.364 0 + endloop + endfacet + facet normal 0.529142 0.848533 0 + outer loop + vertex 253.5 254.598 -3 + vertex 253.678 254.487 0 + vertex 253.678 254.487 -3 + endloop + endfacet + facet normal 0.529142 0.848533 -0 + outer loop + vertex 253.5 254.598 -3 + vertex 253.5 254.598 0 + vertex 253.678 254.487 0 + endloop + endfacet + facet normal 0.468107 0.883672 0 + outer loop + vertex 253.315 254.696 -3 + vertex 253.5 254.598 0 + vertex 253.5 254.598 -3 + endloop + endfacet + facet normal 0.468107 0.883672 -0 + outer loop + vertex 253.315 254.696 -3 + vertex 253.315 254.696 0 + vertex 253.5 254.598 0 + endloop + endfacet + facet normal 0.410563 0.911832 0 + outer loop + vertex 253.124 254.782 -3 + vertex 253.315 254.696 0 + vertex 253.315 254.696 -3 + endloop + endfacet + facet normal 0.410563 0.911832 -0 + outer loop + vertex 253.124 254.782 -3 + vertex 253.124 254.782 0 + vertex 253.315 254.696 0 + endloop + endfacet + facet normal 0.339058 0.940766 0 + outer loop + vertex 252.927 254.853 -3 + vertex 253.124 254.782 0 + vertex 253.124 254.782 -3 + endloop + endfacet + facet normal 0.339058 0.940766 -0 + outer loop + vertex 252.927 254.853 -3 + vertex 252.927 254.853 0 + vertex 253.124 254.782 0 + endloop + endfacet + facet normal 0.277246 0.960799 0 + outer loop + vertex 252.726 254.911 -3 + vertex 252.927 254.853 0 + vertex 252.927 254.853 -3 + endloop + endfacet + facet normal 0.277246 0.960799 -0 + outer loop + vertex 252.726 254.911 -3 + vertex 252.726 254.911 0 + vertex 252.927 254.853 0 + endloop + endfacet + facet normal 0.205289 0.978701 0 + outer loop + vertex 252.521 254.954 -3 + vertex 252.726 254.911 0 + vertex 252.726 254.911 -3 + endloop + endfacet + facet normal 0.205289 0.978701 -0 + outer loop + vertex 252.521 254.954 -3 + vertex 252.521 254.954 0 + vertex 252.726 254.911 0 + endloop + endfacet + facet normal 0.143429 0.989661 0 + outer loop + vertex 252.314 254.984 -3 + vertex 252.521 254.954 0 + vertex 252.521 254.954 -3 + endloop + endfacet + facet normal 0.143429 0.989661 -0 + outer loop + vertex 252.314 254.984 -3 + vertex 252.314 254.984 0 + vertex 252.521 254.954 0 + endloop + endfacet + facet normal 0.0668359 0.997764 0 + outer loop + vertex 252.105 254.998 -3 + vertex 252.314 254.984 0 + vertex 252.314 254.984 -3 + endloop + endfacet + facet normal 0.0668359 0.997764 -0 + outer loop + vertex 252.105 254.998 -3 + vertex 252.105 254.998 0 + vertex 252.314 254.984 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 252.002 254.998 -3 + vertex 252.105 254.998 0 + vertex 252.105 254.998 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 252.002 254.998 -3 + vertex 252.002 254.998 0 + vertex 252.105 254.998 0 + endloop + endfacet + facet normal 0.707107 0.707107 0 + outer loop + vertex 252 255 -3 + vertex 252.002 254.998 0 + vertex 252.002 254.998 -3 + endloop + endfacet + facet normal 0.707107 0.707107 -0 + outer loop + vertex 252 255 -3 + vertex 252 255 0 + vertex 252.002 254.998 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -252 255 -3 + vertex 252 255 0 + vertex 252 255 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -252 255 -3 + vertex -252 255 0 + vertex 252 255 0 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -252.002 254.998 -3 + vertex -252 255 0 + vertex -252 255 -3 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -252.002 254.998 -3 + vertex -252.002 254.998 0 + vertex -252 255 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -252.105 254.998 -3 + vertex -252.002 254.998 0 + vertex -252.002 254.998 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -252.105 254.998 -3 + vertex -252.105 254.998 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -252.314 254.984 -3 + vertex -252.105 254.998 0 + vertex -252.105 254.998 -3 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -252.314 254.984 -3 + vertex -252.314 254.984 0 + vertex -252.105 254.998 0 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -252.521 254.954 -3 + vertex -252.314 254.984 0 + vertex -252.314 254.984 -3 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -252.521 254.954 -3 + vertex -252.521 254.954 0 + vertex -252.314 254.984 0 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -252.726 254.911 -3 + vertex -252.521 254.954 0 + vertex -252.521 254.954 -3 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -252.726 254.911 -3 + vertex -252.726 254.911 0 + vertex -252.521 254.954 0 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -252.927 254.853 -3 + vertex -252.726 254.911 0 + vertex -252.726 254.911 -3 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -252.927 254.853 -3 + vertex -252.927 254.853 0 + vertex -252.726 254.911 0 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -253.124 254.782 -3 + vertex -252.927 254.853 0 + vertex -252.927 254.853 -3 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -253.124 254.782 -3 + vertex -253.124 254.782 0 + vertex -252.927 254.853 0 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -253.315 254.696 -3 + vertex -253.124 254.782 0 + vertex -253.124 254.782 -3 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -253.315 254.696 -3 + vertex -253.315 254.696 0 + vertex -253.124 254.782 0 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -253.5 254.598 -3 + vertex -253.315 254.696 0 + vertex -253.315 254.696 -3 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -253.5 254.598 -3 + vertex -253.5 254.598 0 + vertex -253.315 254.696 0 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -253.678 254.487 -3 + vertex -253.5 254.598 0 + vertex -253.5 254.598 -3 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -253.678 254.487 -3 + vertex -253.678 254.487 0 + vertex -253.5 254.598 0 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -253.847 254.364 -3 + vertex -253.678 254.487 0 + vertex -253.678 254.487 -3 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -253.847 254.364 -3 + vertex -253.847 254.364 0 + vertex -253.678 254.487 0 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -254.007 254.229 -3 + vertex -253.847 254.364 0 + vertex -253.847 254.364 -3 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -254.007 254.229 -3 + vertex -254.007 254.229 0 + vertex -253.847 254.364 0 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -254.158 254.084 -3 + vertex -254.007 254.229 0 + vertex -254.007 254.229 -3 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -254.158 254.084 -3 + vertex -254.158 254.084 0 + vertex -254.007 254.229 0 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -254.298 253.928 -3 + vertex -254.158 254.084 0 + vertex -254.158 254.084 -3 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -254.298 253.928 -3 + vertex -254.298 253.928 0 + vertex -254.158 254.084 0 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -254.427 253.763 -3 + vertex -254.298 253.928 0 + vertex -254.298 253.928 -3 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -254.427 253.763 -3 + vertex -254.427 253.763 0 + vertex -254.298 253.928 0 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -254.544 253.59 -3 + vertex -254.427 253.763 0 + vertex -254.427 253.763 -3 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -254.544 253.59 -3 + vertex -254.544 253.59 0 + vertex -254.427 253.763 0 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -254.649 253.408 -3 + vertex -254.544 253.59 0 + vertex -254.544 253.59 -3 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -254.649 253.408 -3 + vertex -254.649 253.408 0 + vertex -254.544 253.59 0 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -254.741 253.22 -3 + vertex -254.649 253.408 0 + vertex -254.649 253.408 -3 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -254.741 253.22 -3 + vertex -254.741 253.22 0 + vertex -254.649 253.408 0 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -254.819 253.026 -3 + vertex -254.741 253.22 0 + vertex -254.741 253.22 -3 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -254.819 253.026 -3 + vertex -254.819 253.026 0 + vertex -254.741 253.22 0 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -254.884 252.827 -3 + vertex -254.819 253.026 0 + vertex -254.819 253.026 -3 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -254.884 252.827 -3 + vertex -254.884 252.827 0 + vertex -254.819 253.026 0 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -254.934 252.624 -3 + vertex -254.884 252.827 0 + vertex -254.884 252.827 -3 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -254.934 252.624 -3 + vertex -254.934 252.624 0 + vertex -254.884 252.827 0 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -254.971 252.418 -3 + vertex -254.934 252.624 0 + vertex -254.934 252.624 -3 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -254.971 252.418 -3 + vertex -254.971 252.418 0 + vertex -254.934 252.624 0 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -254.993 252.209 -3 + vertex -254.971 252.418 0 + vertex -254.971 252.418 -3 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -254.993 252.209 -3 + vertex -254.993 252.209 0 + vertex -254.971 252.418 0 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -255 252 -3 + vertex -254.993 252.209 0 + vertex -254.993 252.209 -3 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -255 252 -3 + vertex -255 252 0 + vertex -254.993 252.209 0 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -255 -252 -3 + vertex -255 252 0 + vertex -255 252 -3 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -255 -252 -3 + vertex -255 -252 0 + vertex -255 252 0 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -254.993 -252.209 -3 + vertex -255 -252 0 + vertex -255 -252 -3 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -254.993 -252.209 -3 + vertex -254.993 -252.209 0 + vertex -255 -252 0 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -254.971 -252.418 -3 + vertex -254.993 -252.209 0 + vertex -254.993 -252.209 -3 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -254.971 -252.418 -3 + vertex -254.971 -252.418 0 + vertex -254.993 -252.209 0 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -254.934 -252.624 -3 + vertex -254.971 -252.418 0 + vertex -254.971 -252.418 -3 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -254.934 -252.624 -3 + vertex -254.934 -252.624 0 + vertex -254.971 -252.418 0 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -254.884 -252.827 -3 + vertex -254.934 -252.624 0 + vertex -254.934 -252.624 -3 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -254.884 -252.827 -3 + vertex -254.884 -252.827 0 + vertex -254.934 -252.624 0 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -254.819 -253.026 -3 + vertex -254.884 -252.827 0 + vertex -254.884 -252.827 -3 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -254.819 -253.026 -3 + vertex -254.819 -253.026 0 + vertex -254.884 -252.827 0 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -254.741 -253.22 -3 + vertex -254.819 -253.026 0 + vertex -254.819 -253.026 -3 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -254.741 -253.22 -3 + vertex -254.741 -253.22 0 + vertex -254.819 -253.026 0 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -254.649 -253.408 -3 + vertex -254.741 -253.22 0 + vertex -254.741 -253.22 -3 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -254.649 -253.408 -3 + vertex -254.649 -253.408 0 + vertex -254.741 -253.22 0 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -254.544 -253.59 -3 + vertex -254.649 -253.408 0 + vertex -254.649 -253.408 -3 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -254.544 -253.59 -3 + vertex -254.544 -253.59 0 + vertex -254.649 -253.408 0 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -254.427 -253.763 -3 + vertex -254.544 -253.59 0 + vertex -254.544 -253.59 -3 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -254.427 -253.763 -3 + vertex -254.427 -253.763 0 + vertex -254.544 -253.59 0 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -254.298 -253.928 -3 + vertex -254.427 -253.763 0 + vertex -254.427 -253.763 -3 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -254.298 -253.928 -3 + vertex -254.298 -253.928 0 + vertex -254.427 -253.763 0 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -254.158 -254.084 -3 + vertex -254.298 -253.928 0 + vertex -254.298 -253.928 -3 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -254.158 -254.084 -3 + vertex -254.158 -254.084 0 + vertex -254.298 -253.928 0 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -254.007 -254.229 -3 + vertex -254.158 -254.084 0 + vertex -254.158 -254.084 -3 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -254.007 -254.229 -3 + vertex -254.007 -254.229 0 + vertex -254.158 -254.084 0 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -253.847 -254.364 -3 + vertex -254.007 -254.229 0 + vertex -254.007 -254.229 -3 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -253.847 -254.364 -3 + vertex -253.847 -254.364 0 + vertex -254.007 -254.229 0 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -253.678 -254.487 -3 + vertex -253.847 -254.364 0 + vertex -253.847 -254.364 -3 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -253.678 -254.487 -3 + vertex -253.678 -254.487 0 + vertex -253.847 -254.364 0 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -253.5 -254.598 -3 + vertex -253.678 -254.487 0 + vertex -253.678 -254.487 -3 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -253.5 -254.598 -3 + vertex -253.5 -254.598 0 + vertex -253.678 -254.487 0 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -253.315 -254.696 -3 + vertex -253.5 -254.598 0 + vertex -253.5 -254.598 -3 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -253.315 -254.696 -3 + vertex -253.315 -254.696 0 + vertex -253.5 -254.598 0 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -253.124 -254.782 -3 + vertex -253.315 -254.696 0 + vertex -253.315 -254.696 -3 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -253.124 -254.782 -3 + vertex -253.124 -254.782 0 + vertex -253.315 -254.696 0 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -252.927 -254.853 -3 + vertex -253.124 -254.782 0 + vertex -253.124 -254.782 -3 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -252.927 -254.853 -3 + vertex -252.927 -254.853 0 + vertex -253.124 -254.782 0 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -252.726 -254.911 -3 + vertex -252.927 -254.853 0 + vertex -252.927 -254.853 -3 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -252.726 -254.911 -3 + vertex -252.726 -254.911 0 + vertex -252.927 -254.853 0 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -252.521 -254.954 -3 + vertex -252.726 -254.911 0 + vertex -252.726 -254.911 -3 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -252.521 -254.954 -3 + vertex -252.521 -254.954 0 + vertex -252.726 -254.911 0 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -252.314 -254.984 -3 + vertex -252.521 -254.954 0 + vertex -252.521 -254.954 -3 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -252.314 -254.984 -3 + vertex -252.314 -254.984 0 + vertex -252.521 -254.954 0 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -252.105 -254.998 -3 + vertex -252.314 -254.984 0 + vertex -252.314 -254.984 -3 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -252.105 -254.998 -3 + vertex -252.105 -254.998 0 + vertex -252.314 -254.984 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -252.002 -254.998 -3 + vertex -252.105 -254.998 0 + vertex -252.105 -254.998 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -252.002 -254.998 -3 + vertex -252.002 -254.998 0 + vertex -252.105 -254.998 0 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -252 -255 -3 + vertex -252.002 -254.998 0 + vertex -252.002 -254.998 -3 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -252 -255 -3 + vertex -252 -255 0 + vertex -252.002 -254.998 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 252 -255 -3 + vertex -252 -255 0 + vertex -252 -255 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 252 -255 -3 + vertex 252 -255 0 + vertex -252 -255 0 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 252.002 -254.998 -3 + vertex 252 -255 0 + vertex 252 -255 -3 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 252.002 -254.998 -3 + vertex 252.002 -254.998 0 + vertex 252 -255 0 + endloop + endfacet +endsolid OpenSCAD_Model diff --git a/resources/profiles/Creality/cr10v2_bed.stl b/resources/profiles/Creality/cr10v2_bed.stl new file mode 100644 index 0000000000..004e0b114c --- /dev/null +++ b/resources/profiles/Creality/cr10v2_bed.stl @@ -0,0 +1,2774 @@ +solid OpenSCAD_Model + facet normal 0 0 -1 + outer loop + vertex 152.105 -159.998 -3 + vertex 152.002 -159.998 -3 + vertex 152.314 -159.984 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.314 -159.984 -3 + vertex 152.002 -159.998 -3 + vertex 152.521 -159.954 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex 152.002 159.998 -3 + vertex -155 157 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.521 -159.954 -3 + vertex 152.002 -159.998 -3 + vertex 152.726 -159.911 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.726 -159.911 -3 + vertex 152.002 -159.998 -3 + vertex 152.927 -159.853 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.927 -159.853 -3 + vertex 152.002 -159.998 -3 + vertex 153.124 -159.782 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 153.124 -159.782 -3 + vertex 152.002 -159.998 -3 + vertex 153.315 -159.696 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 153.315 -159.696 -3 + vertex 152.002 -159.998 -3 + vertex 153.5 -159.598 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 153.5 -159.598 -3 + vertex 152.002 -159.998 -3 + vertex 153.678 -159.487 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 153.678 -159.487 -3 + vertex 152.002 -159.998 -3 + vertex 153.847 -159.364 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 153.847 -159.364 -3 + vertex 152.002 -159.998 -3 + vertex 154.007 -159.229 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.007 -159.229 -3 + vertex 152.002 -159.998 -3 + vertex 154.158 -159.084 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.158 -159.084 -3 + vertex 152.002 -159.998 -3 + vertex 154.298 -158.928 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.298 -158.928 -3 + vertex 152.002 -159.998 -3 + vertex 154.427 -158.763 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.427 -158.763 -3 + vertex 152.002 -159.998 -3 + vertex 154.544 -158.59 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.544 -158.59 -3 + vertex 152.002 -159.998 -3 + vertex 154.649 -158.408 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.649 -158.408 -3 + vertex 152.002 -159.998 -3 + vertex 154.741 -158.22 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.741 -158.22 -3 + vertex 152.002 -159.998 -3 + vertex 154.819 -158.026 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.819 -158.026 -3 + vertex 152.002 -159.998 -3 + vertex 154.884 -157.827 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.884 -157.827 -3 + vertex 152.002 -159.998 -3 + vertex 154.934 -157.624 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.934 -157.624 -3 + vertex 152.002 -159.998 -3 + vertex 154.971 -157.418 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.971 -157.418 -3 + vertex 152.002 -159.998 -3 + vertex 154.993 -157.209 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.993 -157.209 -3 + vertex 152.002 -159.998 -3 + vertex 155 -157 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex 152 160 -3 + vertex 152.002 159.998 -3 + vertex -152.002 159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 159.998 -3 + vertex 154.971 157.418 -3 + vertex 154.993 157.209 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 154.884 157.827 -3 + vertex 154.934 157.624 -3 + vertex 152.002 159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 154.741 158.22 -3 + vertex 152.002 159.998 -3 + vertex 154.649 158.408 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 154.741 158.22 -3 + vertex 154.819 158.026 -3 + vertex 152.002 159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 159.998 -3 + vertex 154.007 159.229 -3 + vertex 154.158 159.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 154.427 158.763 -3 + vertex 152.002 159.998 -3 + vertex 154.298 158.928 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 154.427 158.763 -3 + vertex 154.544 158.59 -3 + vertex 152.002 159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 154.298 158.928 -3 + vertex 152.002 159.998 -3 + vertex 154.158 159.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 159.998 -3 + vertex 152.927 159.853 -3 + vertex 153.124 159.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 153.847 159.364 -3 + vertex 152.002 159.998 -3 + vertex 153.678 159.487 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 153.847 159.364 -3 + vertex 154.007 159.229 -3 + vertex 152.002 159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 153.678 159.487 -3 + vertex 152.002 159.998 -3 + vertex 153.5 159.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 153.5 159.598 -3 + vertex 152.002 159.998 -3 + vertex 153.315 159.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 153.315 159.696 -3 + vertex 152.002 159.998 -3 + vertex 153.124 159.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 154.649 158.408 -3 + vertex 152.002 159.998 -3 + vertex 154.544 158.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.726 159.911 -3 + vertex 152.002 159.998 -3 + vertex 152.521 159.954 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 152.726 159.911 -3 + vertex 152.927 159.853 -3 + vertex 152.002 159.998 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 154.819 158.026 -3 + vertex 154.884 157.827 -3 + vertex 152.002 159.998 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 152.314 159.984 -3 + vertex 152.521 159.954 -3 + vertex 152.002 159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 159.998 -3 + vertex 154.934 157.624 -3 + vertex 154.971 157.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 159.998 -3 + vertex 152.105 159.998 -3 + vertex 152.314 159.984 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 155 157 -3 + vertex 152.002 159.998 -3 + vertex 154.993 157.209 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex -152 160 -3 + vertex 152 160 -3 + vertex -152.002 159.998 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex 152.002 159.998 -3 + vertex 155 157 -3 + vertex -155 157 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -155 157 -3 + vertex 155 157 -3 + vertex 155 -157 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -155 157 -3 + vertex -154.993 157.209 -3 + vertex -152.002 159.998 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -152.314 159.984 -3 + vertex -152.105 159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -152.521 159.954 -3 + vertex -152.314 159.984 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -152.726 159.911 -3 + vertex -152.521 159.954 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -152.927 159.853 -3 + vertex -152.726 159.911 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -153.124 159.782 -3 + vertex -152.927 159.853 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -153.315 159.696 -3 + vertex -153.124 159.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -153.5 159.598 -3 + vertex -153.315 159.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -153.678 159.487 -3 + vertex -153.5 159.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -153.847 159.364 -3 + vertex -153.678 159.487 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -154.007 159.229 -3 + vertex -153.847 159.364 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -154.158 159.084 -3 + vertex -154.007 159.229 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -154.298 158.928 -3 + vertex -154.158 159.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -154.427 158.763 -3 + vertex -154.298 158.928 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -154.544 158.59 -3 + vertex -154.427 158.763 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -154.649 158.408 -3 + vertex -154.544 158.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -154.741 158.22 -3 + vertex -154.649 158.408 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -154.819 158.026 -3 + vertex -154.741 158.22 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -154.884 157.827 -3 + vertex -154.819 158.026 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -154.934 157.624 -3 + vertex -154.884 157.827 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -154.971 157.418 -3 + vertex -154.934 157.624 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -154.993 157.209 -3 + vertex -154.971 157.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -155 -157 -3 + vertex -155 157 -3 + vertex 155 -157 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 -159.998 -3 + vertex -155 -157 -3 + vertex 155 -157 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 -159.998 -3 + vertex -152.002 -159.998 -3 + vertex -155 -157 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -159.998 -3 + vertex -154.971 -157.418 -3 + vertex -154.993 -157.209 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.884 -157.827 -3 + vertex -154.934 -157.624 -3 + vertex -152.002 -159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.741 -158.22 -3 + vertex -152.002 -159.998 -3 + vertex -154.649 -158.408 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.741 -158.22 -3 + vertex -154.819 -158.026 -3 + vertex -152.002 -159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -159.998 -3 + vertex -154.007 -159.229 -3 + vertex -154.158 -159.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.427 -158.763 -3 + vertex -152.002 -159.998 -3 + vertex -154.298 -158.928 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.427 -158.763 -3 + vertex -154.544 -158.59 -3 + vertex -152.002 -159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.298 -158.928 -3 + vertex -152.002 -159.998 -3 + vertex -154.158 -159.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -159.998 -3 + vertex -152.927 -159.853 -3 + vertex -153.124 -159.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -153.847 -159.364 -3 + vertex -152.002 -159.998 -3 + vertex -153.678 -159.487 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -153.847 -159.364 -3 + vertex -154.007 -159.229 -3 + vertex -152.002 -159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -153.678 -159.487 -3 + vertex -152.002 -159.998 -3 + vertex -153.5 -159.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -153.5 -159.598 -3 + vertex -152.002 -159.998 -3 + vertex -153.315 -159.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -153.315 -159.696 -3 + vertex -152.002 -159.998 -3 + vertex -153.124 -159.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.649 -158.408 -3 + vertex -152.002 -159.998 -3 + vertex -154.544 -158.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.726 -159.911 -3 + vertex -152.002 -159.998 -3 + vertex -152.521 -159.954 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.726 -159.911 -3 + vertex -152.927 -159.853 -3 + vertex -152.002 -159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.819 -158.026 -3 + vertex -154.884 -157.827 -3 + vertex -152.002 -159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.314 -159.984 -3 + vertex -152.521 -159.954 -3 + vertex -152.002 -159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -159.998 -3 + vertex -154.934 -157.624 -3 + vertex -154.971 -157.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -159.998 -3 + vertex -152.105 -159.998 -3 + vertex -152.314 -159.984 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.002 -159.998 -3 + vertex 152 -160 -3 + vertex -152.002 -159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -159.998 -3 + vertex 152 -160 -3 + vertex -152 -160 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -155 -157 -3 + vertex -152.002 -159.998 -3 + vertex -154.993 -157.209 -3 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.314 -159.984 0 + vertex 152.002 -159.998 0 + vertex 152.105 -159.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.521 -159.954 0 + vertex 152.002 -159.998 0 + vertex 152.314 -159.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -155 157 0 + vertex 152.002 159.998 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.726 -159.911 0 + vertex 152.002 -159.998 0 + vertex 152.521 -159.954 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.927 -159.853 0 + vertex 152.002 -159.998 0 + vertex 152.726 -159.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.124 -159.782 0 + vertex 152.002 -159.998 0 + vertex 152.927 -159.853 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.315 -159.696 0 + vertex 152.002 -159.998 0 + vertex 153.124 -159.782 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.5 -159.598 0 + vertex 152.002 -159.998 0 + vertex 153.315 -159.696 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.678 -159.487 0 + vertex 152.002 -159.998 0 + vertex 153.5 -159.598 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.847 -159.364 0 + vertex 152.002 -159.998 0 + vertex 153.678 -159.487 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.007 -159.229 0 + vertex 152.002 -159.998 0 + vertex 153.847 -159.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.158 -159.084 0 + vertex 152.002 -159.998 0 + vertex 154.007 -159.229 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.298 -158.928 0 + vertex 152.002 -159.998 0 + vertex 154.158 -159.084 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.427 -158.763 0 + vertex 152.002 -159.998 0 + vertex 154.298 -158.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.544 -158.59 0 + vertex 152.002 -159.998 0 + vertex 154.427 -158.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.649 -158.408 0 + vertex 152.002 -159.998 0 + vertex 154.544 -158.59 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.741 -158.22 0 + vertex 152.002 -159.998 0 + vertex 154.649 -158.408 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.819 -158.026 0 + vertex 152.002 -159.998 0 + vertex 154.741 -158.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.884 -157.827 0 + vertex 152.002 -159.998 0 + vertex 154.819 -158.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.934 -157.624 0 + vertex 152.002 -159.998 0 + vertex 154.884 -157.827 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.971 -157.418 0 + vertex 152.002 -159.998 0 + vertex 154.934 -157.624 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.993 -157.209 0 + vertex 152.002 -159.998 0 + vertex 154.971 -157.418 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 155 -157 0 + vertex 152.002 -159.998 0 + vertex 154.993 -157.209 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 159.998 0 + vertex 152.002 159.998 0 + vertex 152 160 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.993 157.209 0 + vertex 154.971 157.418 0 + vertex 152.002 159.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 159.998 0 + vertex 154.934 157.624 0 + vertex 154.884 157.827 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.649 158.408 0 + vertex 152.002 159.998 0 + vertex 154.741 158.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 159.998 0 + vertex 154.819 158.026 0 + vertex 154.741 158.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.158 159.084 0 + vertex 154.007 159.229 0 + vertex 152.002 159.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.298 158.928 0 + vertex 152.002 159.998 0 + vertex 154.427 158.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 159.998 0 + vertex 154.544 158.59 0 + vertex 154.427 158.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.158 159.084 0 + vertex 152.002 159.998 0 + vertex 154.298 158.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.124 159.782 0 + vertex 152.927 159.853 0 + vertex 152.002 159.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.678 159.487 0 + vertex 152.002 159.998 0 + vertex 153.847 159.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 159.998 0 + vertex 154.007 159.229 0 + vertex 153.847 159.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.5 159.598 0 + vertex 152.002 159.998 0 + vertex 153.678 159.487 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.315 159.696 0 + vertex 152.002 159.998 0 + vertex 153.5 159.598 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.124 159.782 0 + vertex 152.002 159.998 0 + vertex 153.315 159.696 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.544 158.59 0 + vertex 152.002 159.998 0 + vertex 154.649 158.408 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.521 159.954 0 + vertex 152.002 159.998 0 + vertex 152.726 159.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 159.998 0 + vertex 152.927 159.853 0 + vertex 152.726 159.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 159.998 0 + vertex 154.884 157.827 0 + vertex 154.819 158.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 159.998 0 + vertex 152.521 159.954 0 + vertex 152.314 159.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.971 157.418 0 + vertex 154.934 157.624 0 + vertex 152.002 159.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.314 159.984 0 + vertex 152.105 159.998 0 + vertex 152.002 159.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.993 157.209 0 + vertex 152.002 159.998 0 + vertex 155 157 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 159.998 0 + vertex 152 160 0 + vertex -152 160 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -155 157 0 + vertex 155 157 0 + vertex 152.002 159.998 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex 155 -157 0 + vertex 155 157 0 + vertex -155 157 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 159.998 0 + vertex -154.993 157.209 0 + vertex -155 157 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.105 159.998 0 + vertex -152.314 159.984 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.314 159.984 0 + vertex -152.521 159.954 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.521 159.954 0 + vertex -152.726 159.911 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.726 159.911 0 + vertex -152.927 159.853 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.927 159.853 0 + vertex -153.124 159.782 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -153.124 159.782 0 + vertex -153.315 159.696 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -153.315 159.696 0 + vertex -153.5 159.598 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -153.5 159.598 0 + vertex -153.678 159.487 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -153.678 159.487 0 + vertex -153.847 159.364 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -153.847 159.364 0 + vertex -154.007 159.229 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.007 159.229 0 + vertex -154.158 159.084 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.158 159.084 0 + vertex -154.298 158.928 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.298 158.928 0 + vertex -154.427 158.763 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.427 158.763 0 + vertex -154.544 158.59 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.544 158.59 0 + vertex -154.649 158.408 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.649 158.408 0 + vertex -154.741 158.22 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.741 158.22 0 + vertex -154.819 158.026 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.819 158.026 0 + vertex -154.884 157.827 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.884 157.827 0 + vertex -154.934 157.624 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.934 157.624 0 + vertex -154.971 157.418 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.971 157.418 0 + vertex -154.993 157.209 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 155 -157 0 + vertex -155 157 0 + vertex -155 -157 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 155 -157 0 + vertex -155 -157 0 + vertex 152.002 -159.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -155 -157 0 + vertex -152.002 -159.998 0 + vertex 152.002 -159.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -154.993 -157.209 0 + vertex -154.971 -157.418 0 + vertex -152.002 -159.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -159.998 0 + vertex -154.934 -157.624 0 + vertex -154.884 -157.827 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -154.649 -158.408 0 + vertex -152.002 -159.998 0 + vertex -154.741 -158.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -159.998 0 + vertex -154.819 -158.026 0 + vertex -154.741 -158.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -154.158 -159.084 0 + vertex -154.007 -159.229 0 + vertex -152.002 -159.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -154.298 -158.928 0 + vertex -152.002 -159.998 0 + vertex -154.427 -158.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -159.998 0 + vertex -154.544 -158.59 0 + vertex -154.427 -158.763 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -154.158 -159.084 0 + vertex -152.002 -159.998 0 + vertex -154.298 -158.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -153.124 -159.782 0 + vertex -152.927 -159.853 0 + vertex -152.002 -159.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -153.678 -159.487 0 + vertex -152.002 -159.998 0 + vertex -153.847 -159.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -159.998 0 + vertex -154.007 -159.229 0 + vertex -153.847 -159.364 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -153.5 -159.598 0 + vertex -152.002 -159.998 0 + vertex -153.678 -159.487 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -153.315 -159.696 0 + vertex -152.002 -159.998 0 + vertex -153.5 -159.598 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -153.124 -159.782 0 + vertex -152.002 -159.998 0 + vertex -153.315 -159.696 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -154.544 -158.59 0 + vertex -152.002 -159.998 0 + vertex -154.649 -158.408 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -152.521 -159.954 0 + vertex -152.002 -159.998 0 + vertex -152.726 -159.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -159.998 0 + vertex -152.927 -159.853 0 + vertex -152.726 -159.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -159.998 0 + vertex -154.884 -157.827 0 + vertex -154.819 -158.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -159.998 0 + vertex -152.521 -159.954 0 + vertex -152.314 -159.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -154.971 -157.418 0 + vertex -154.934 -157.624 0 + vertex -152.002 -159.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.314 -159.984 0 + vertex -152.105 -159.998 0 + vertex -152.002 -159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.002 -159.998 0 + vertex 152 -160 0 + vertex 152.002 -159.998 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex -152 -160 0 + vertex 152 -160 0 + vertex -152.002 -159.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -154.993 -157.209 0 + vertex -152.002 -159.998 0 + vertex -155 -157 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 152.105 -159.998 -3 + vertex 152.002 -159.998 0 + vertex 152.002 -159.998 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 152.105 -159.998 -3 + vertex 152.105 -159.998 0 + vertex 152.002 -159.998 0 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 152.314 -159.984 -3 + vertex 152.105 -159.998 0 + vertex 152.105 -159.998 -3 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 152.314 -159.984 -3 + vertex 152.314 -159.984 0 + vertex 152.105 -159.998 0 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 152.521 -159.954 -3 + vertex 152.314 -159.984 0 + vertex 152.314 -159.984 -3 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 152.521 -159.954 -3 + vertex 152.521 -159.954 0 + vertex 152.314 -159.984 0 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 152.726 -159.911 -3 + vertex 152.521 -159.954 0 + vertex 152.521 -159.954 -3 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 152.726 -159.911 -3 + vertex 152.726 -159.911 0 + vertex 152.521 -159.954 0 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 152.927 -159.853 -3 + vertex 152.726 -159.911 0 + vertex 152.726 -159.911 -3 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 152.927 -159.853 -3 + vertex 152.927 -159.853 0 + vertex 152.726 -159.911 0 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 153.124 -159.782 -3 + vertex 152.927 -159.853 0 + vertex 152.927 -159.853 -3 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 153.124 -159.782 -3 + vertex 153.124 -159.782 0 + vertex 152.927 -159.853 0 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 153.315 -159.696 -3 + vertex 153.124 -159.782 0 + vertex 153.124 -159.782 -3 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 153.315 -159.696 -3 + vertex 153.315 -159.696 0 + vertex 153.124 -159.782 0 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 153.5 -159.598 -3 + vertex 153.315 -159.696 0 + vertex 153.315 -159.696 -3 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 153.5 -159.598 -3 + vertex 153.5 -159.598 0 + vertex 153.315 -159.696 0 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 153.678 -159.487 -3 + vertex 153.5 -159.598 0 + vertex 153.5 -159.598 -3 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 153.678 -159.487 -3 + vertex 153.678 -159.487 0 + vertex 153.5 -159.598 0 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 153.847 -159.364 -3 + vertex 153.678 -159.487 0 + vertex 153.678 -159.487 -3 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 153.847 -159.364 -3 + vertex 153.847 -159.364 0 + vertex 153.678 -159.487 0 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 154.007 -159.229 -3 + vertex 153.847 -159.364 0 + vertex 153.847 -159.364 -3 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 154.007 -159.229 -3 + vertex 154.007 -159.229 0 + vertex 153.847 -159.364 0 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 154.158 -159.084 -3 + vertex 154.007 -159.229 0 + vertex 154.007 -159.229 -3 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 154.158 -159.084 -3 + vertex 154.158 -159.084 0 + vertex 154.007 -159.229 0 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 154.298 -158.928 -3 + vertex 154.158 -159.084 0 + vertex 154.158 -159.084 -3 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 154.298 -158.928 -3 + vertex 154.298 -158.928 0 + vertex 154.158 -159.084 0 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 154.427 -158.763 -3 + vertex 154.298 -158.928 0 + vertex 154.298 -158.928 -3 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 154.427 -158.763 -3 + vertex 154.427 -158.763 0 + vertex 154.298 -158.928 0 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 154.544 -158.59 -3 + vertex 154.427 -158.763 0 + vertex 154.427 -158.763 -3 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 154.544 -158.59 -3 + vertex 154.544 -158.59 0 + vertex 154.427 -158.763 0 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 154.649 -158.408 -3 + vertex 154.544 -158.59 0 + vertex 154.544 -158.59 -3 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 154.649 -158.408 -3 + vertex 154.649 -158.408 0 + vertex 154.544 -158.59 0 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 154.741 -158.22 -3 + vertex 154.649 -158.408 0 + vertex 154.649 -158.408 -3 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 154.741 -158.22 -3 + vertex 154.741 -158.22 0 + vertex 154.649 -158.408 0 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 154.819 -158.026 -3 + vertex 154.741 -158.22 0 + vertex 154.741 -158.22 -3 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 154.819 -158.026 -3 + vertex 154.819 -158.026 0 + vertex 154.741 -158.22 0 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 154.884 -157.827 -3 + vertex 154.819 -158.026 0 + vertex 154.819 -158.026 -3 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 154.884 -157.827 -3 + vertex 154.884 -157.827 0 + vertex 154.819 -158.026 0 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 154.934 -157.624 -3 + vertex 154.884 -157.827 0 + vertex 154.884 -157.827 -3 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 154.934 -157.624 -3 + vertex 154.934 -157.624 0 + vertex 154.884 -157.827 0 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 154.971 -157.418 -3 + vertex 154.934 -157.624 0 + vertex 154.934 -157.624 -3 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 154.971 -157.418 -3 + vertex 154.971 -157.418 0 + vertex 154.934 -157.624 0 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 154.993 -157.209 -3 + vertex 154.971 -157.418 0 + vertex 154.971 -157.418 -3 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 154.993 -157.209 -3 + vertex 154.993 -157.209 0 + vertex 154.971 -157.418 0 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 155 -157 -3 + vertex 154.993 -157.209 0 + vertex 154.993 -157.209 -3 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 155 -157 -3 + vertex 155 -157 0 + vertex 154.993 -157.209 0 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 155 157 -3 + vertex 155 -157 0 + vertex 155 -157 -3 + endloop + endfacet + facet normal 1 0 -0 + outer loop + vertex 155 157 -3 + vertex 155 157 0 + vertex 155 -157 0 + endloop + endfacet + facet normal 0.99944 0.0334741 0 + outer loop + vertex 154.993 157.209 -3 + vertex 155 157 0 + vertex 155 157 -3 + endloop + endfacet + facet normal 0.99944 0.0334741 -0 + outer loop + vertex 154.993 157.209 -3 + vertex 154.993 157.209 0 + vertex 155 157 0 + endloop + endfacet + facet normal 0.994505 0.104685 0 + outer loop + vertex 154.971 157.418 -3 + vertex 154.993 157.209 0 + vertex 154.993 157.209 -3 + endloop + endfacet + facet normal 0.994505 0.104685 -0 + outer loop + vertex 154.971 157.418 -3 + vertex 154.971 157.418 0 + vertex 154.993 157.209 0 + endloop + endfacet + facet normal 0.98425 0.176783 0 + outer loop + vertex 154.934 157.624 -3 + vertex 154.971 157.418 0 + vertex 154.971 157.418 -3 + endloop + endfacet + facet normal 0.98425 0.176783 -0 + outer loop + vertex 154.934 157.624 -3 + vertex 154.934 157.624 0 + vertex 154.971 157.418 0 + endloop + endfacet + facet normal 0.970981 0.239158 0 + outer loop + vertex 154.884 157.827 -3 + vertex 154.934 157.624 0 + vertex 154.934 157.624 -3 + endloop + endfacet + facet normal 0.970981 0.239158 -0 + outer loop + vertex 154.884 157.827 -3 + vertex 154.884 157.827 0 + vertex 154.934 157.624 0 + endloop + endfacet + facet normal 0.950577 0.31049 0 + outer loop + vertex 154.819 158.026 -3 + vertex 154.884 157.827 0 + vertex 154.884 157.827 -3 + endloop + endfacet + facet normal 0.950577 0.31049 -0 + outer loop + vertex 154.819 158.026 -3 + vertex 154.819 158.026 0 + vertex 154.884 157.827 0 + endloop + endfacet + facet normal 0.927816 0.373039 0 + outer loop + vertex 154.741 158.22 -3 + vertex 154.819 158.026 0 + vertex 154.819 158.026 -3 + endloop + endfacet + facet normal 0.927816 0.373039 -0 + outer loop + vertex 154.741 158.22 -3 + vertex 154.741 158.22 0 + vertex 154.819 158.026 0 + endloop + endfacet + facet normal 0.898217 0.439553 0 + outer loop + vertex 154.649 158.408 -3 + vertex 154.741 158.22 0 + vertex 154.741 158.22 -3 + endloop + endfacet + facet normal 0.898217 0.439553 -0 + outer loop + vertex 154.649 158.408 -3 + vertex 154.649 158.408 0 + vertex 154.741 158.22 0 + endloop + endfacet + facet normal 0.866186 0.499722 0 + outer loop + vertex 154.544 158.59 -3 + vertex 154.649 158.408 0 + vertex 154.649 158.408 -3 + endloop + endfacet + facet normal 0.866186 0.499722 -0 + outer loop + vertex 154.544 158.59 -3 + vertex 154.544 158.59 0 + vertex 154.649 158.408 0 + endloop + endfacet + facet normal 0.828349 0.560213 0 + outer loop + vertex 154.427 158.763 -3 + vertex 154.544 158.59 0 + vertex 154.544 158.59 -3 + endloop + endfacet + facet normal 0.828349 0.560213 -0 + outer loop + vertex 154.427 158.763 -3 + vertex 154.427 158.763 0 + vertex 154.544 158.59 0 + endloop + endfacet + facet normal 0.787807 0.615922 0 + outer loop + vertex 154.298 158.928 -3 + vertex 154.427 158.763 0 + vertex 154.427 158.763 -3 + endloop + endfacet + facet normal 0.787807 0.615922 -0 + outer loop + vertex 154.298 158.928 -3 + vertex 154.298 158.928 0 + vertex 154.427 158.763 0 + endloop + endfacet + facet normal 0.744242 0.66791 0 + outer loop + vertex 154.158 159.084 -3 + vertex 154.298 158.928 0 + vertex 154.298 158.928 -3 + endloop + endfacet + facet normal 0.744242 0.66791 -0 + outer loop + vertex 154.158 159.084 -3 + vertex 154.158 159.084 0 + vertex 154.298 158.928 0 + endloop + endfacet + facet normal 0.692631 0.721292 0 + outer loop + vertex 154.007 159.229 -3 + vertex 154.158 159.084 0 + vertex 154.158 159.084 -3 + endloop + endfacet + facet normal 0.692631 0.721292 -0 + outer loop + vertex 154.007 159.229 -3 + vertex 154.007 159.229 0 + vertex 154.158 159.084 0 + endloop + endfacet + facet normal 0.644871 0.764291 0 + outer loop + vertex 153.847 159.364 -3 + vertex 154.007 159.229 0 + vertex 154.007 159.229 -3 + endloop + endfacet + facet normal 0.644871 0.764291 -0 + outer loop + vertex 153.847 159.364 -3 + vertex 153.847 159.364 0 + vertex 154.007 159.229 0 + endloop + endfacet + facet normal 0.588456 0.808529 0 + outer loop + vertex 153.678 159.487 -3 + vertex 153.847 159.364 0 + vertex 153.847 159.364 -3 + endloop + endfacet + facet normal 0.588456 0.808529 -0 + outer loop + vertex 153.678 159.487 -3 + vertex 153.678 159.487 0 + vertex 153.847 159.364 0 + endloop + endfacet + facet normal 0.529142 0.848533 0 + outer loop + vertex 153.5 159.598 -3 + vertex 153.678 159.487 0 + vertex 153.678 159.487 -3 + endloop + endfacet + facet normal 0.529142 0.848533 -0 + outer loop + vertex 153.5 159.598 -3 + vertex 153.5 159.598 0 + vertex 153.678 159.487 0 + endloop + endfacet + facet normal 0.468107 0.883672 0 + outer loop + vertex 153.315 159.696 -3 + vertex 153.5 159.598 0 + vertex 153.5 159.598 -3 + endloop + endfacet + facet normal 0.468107 0.883672 -0 + outer loop + vertex 153.315 159.696 -3 + vertex 153.315 159.696 0 + vertex 153.5 159.598 0 + endloop + endfacet + facet normal 0.410563 0.911832 0 + outer loop + vertex 153.124 159.782 -3 + vertex 153.315 159.696 0 + vertex 153.315 159.696 -3 + endloop + endfacet + facet normal 0.410563 0.911832 -0 + outer loop + vertex 153.124 159.782 -3 + vertex 153.124 159.782 0 + vertex 153.315 159.696 0 + endloop + endfacet + facet normal 0.339058 0.940766 0 + outer loop + vertex 152.927 159.853 -3 + vertex 153.124 159.782 0 + vertex 153.124 159.782 -3 + endloop + endfacet + facet normal 0.339058 0.940766 -0 + outer loop + vertex 152.927 159.853 -3 + vertex 152.927 159.853 0 + vertex 153.124 159.782 0 + endloop + endfacet + facet normal 0.277246 0.960799 0 + outer loop + vertex 152.726 159.911 -3 + vertex 152.927 159.853 0 + vertex 152.927 159.853 -3 + endloop + endfacet + facet normal 0.277246 0.960799 -0 + outer loop + vertex 152.726 159.911 -3 + vertex 152.726 159.911 0 + vertex 152.927 159.853 0 + endloop + endfacet + facet normal 0.205289 0.978701 0 + outer loop + vertex 152.521 159.954 -3 + vertex 152.726 159.911 0 + vertex 152.726 159.911 -3 + endloop + endfacet + facet normal 0.205289 0.978701 -0 + outer loop + vertex 152.521 159.954 -3 + vertex 152.521 159.954 0 + vertex 152.726 159.911 0 + endloop + endfacet + facet normal 0.143429 0.989661 0 + outer loop + vertex 152.314 159.984 -3 + vertex 152.521 159.954 0 + vertex 152.521 159.954 -3 + endloop + endfacet + facet normal 0.143429 0.989661 -0 + outer loop + vertex 152.314 159.984 -3 + vertex 152.314 159.984 0 + vertex 152.521 159.954 0 + endloop + endfacet + facet normal 0.0668359 0.997764 0 + outer loop + vertex 152.105 159.998 -3 + vertex 152.314 159.984 0 + vertex 152.314 159.984 -3 + endloop + endfacet + facet normal 0.0668359 0.997764 -0 + outer loop + vertex 152.105 159.998 -3 + vertex 152.105 159.998 0 + vertex 152.314 159.984 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 152.002 159.998 -3 + vertex 152.105 159.998 0 + vertex 152.105 159.998 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 152.002 159.998 -3 + vertex 152.002 159.998 0 + vertex 152.105 159.998 0 + endloop + endfacet + facet normal 0.707107 0.707107 0 + outer loop + vertex 152 160 -3 + vertex 152.002 159.998 0 + vertex 152.002 159.998 -3 + endloop + endfacet + facet normal 0.707107 0.707107 -0 + outer loop + vertex 152 160 -3 + vertex 152 160 0 + vertex 152.002 159.998 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -152 160 -3 + vertex 152 160 0 + vertex 152 160 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -152 160 -3 + vertex -152 160 0 + vertex 152 160 0 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -152.002 159.998 -3 + vertex -152 160 0 + vertex -152 160 -3 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -152.002 159.998 -3 + vertex -152.002 159.998 0 + vertex -152 160 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -152.105 159.998 -3 + vertex -152.002 159.998 0 + vertex -152.002 159.998 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -152.105 159.998 -3 + vertex -152.105 159.998 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -152.314 159.984 -3 + vertex -152.105 159.998 0 + vertex -152.105 159.998 -3 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -152.314 159.984 -3 + vertex -152.314 159.984 0 + vertex -152.105 159.998 0 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -152.521 159.954 -3 + vertex -152.314 159.984 0 + vertex -152.314 159.984 -3 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -152.521 159.954 -3 + vertex -152.521 159.954 0 + vertex -152.314 159.984 0 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -152.726 159.911 -3 + vertex -152.521 159.954 0 + vertex -152.521 159.954 -3 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -152.726 159.911 -3 + vertex -152.726 159.911 0 + vertex -152.521 159.954 0 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -152.927 159.853 -3 + vertex -152.726 159.911 0 + vertex -152.726 159.911 -3 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -152.927 159.853 -3 + vertex -152.927 159.853 0 + vertex -152.726 159.911 0 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -153.124 159.782 -3 + vertex -152.927 159.853 0 + vertex -152.927 159.853 -3 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -153.124 159.782 -3 + vertex -153.124 159.782 0 + vertex -152.927 159.853 0 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -153.315 159.696 -3 + vertex -153.124 159.782 0 + vertex -153.124 159.782 -3 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -153.315 159.696 -3 + vertex -153.315 159.696 0 + vertex -153.124 159.782 0 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -153.5 159.598 -3 + vertex -153.315 159.696 0 + vertex -153.315 159.696 -3 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -153.5 159.598 -3 + vertex -153.5 159.598 0 + vertex -153.315 159.696 0 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -153.678 159.487 -3 + vertex -153.5 159.598 0 + vertex -153.5 159.598 -3 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -153.678 159.487 -3 + vertex -153.678 159.487 0 + vertex -153.5 159.598 0 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -153.847 159.364 -3 + vertex -153.678 159.487 0 + vertex -153.678 159.487 -3 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -153.847 159.364 -3 + vertex -153.847 159.364 0 + vertex -153.678 159.487 0 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -154.007 159.229 -3 + vertex -153.847 159.364 0 + vertex -153.847 159.364 -3 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -154.007 159.229 -3 + vertex -154.007 159.229 0 + vertex -153.847 159.364 0 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -154.158 159.084 -3 + vertex -154.007 159.229 0 + vertex -154.007 159.229 -3 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -154.158 159.084 -3 + vertex -154.158 159.084 0 + vertex -154.007 159.229 0 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -154.298 158.928 -3 + vertex -154.158 159.084 0 + vertex -154.158 159.084 -3 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -154.298 158.928 -3 + vertex -154.298 158.928 0 + vertex -154.158 159.084 0 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -154.427 158.763 -3 + vertex -154.298 158.928 0 + vertex -154.298 158.928 -3 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -154.427 158.763 -3 + vertex -154.427 158.763 0 + vertex -154.298 158.928 0 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -154.544 158.59 -3 + vertex -154.427 158.763 0 + vertex -154.427 158.763 -3 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -154.544 158.59 -3 + vertex -154.544 158.59 0 + vertex -154.427 158.763 0 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -154.649 158.408 -3 + vertex -154.544 158.59 0 + vertex -154.544 158.59 -3 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -154.649 158.408 -3 + vertex -154.649 158.408 0 + vertex -154.544 158.59 0 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -154.741 158.22 -3 + vertex -154.649 158.408 0 + vertex -154.649 158.408 -3 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -154.741 158.22 -3 + vertex -154.741 158.22 0 + vertex -154.649 158.408 0 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -154.819 158.026 -3 + vertex -154.741 158.22 0 + vertex -154.741 158.22 -3 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -154.819 158.026 -3 + vertex -154.819 158.026 0 + vertex -154.741 158.22 0 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -154.884 157.827 -3 + vertex -154.819 158.026 0 + vertex -154.819 158.026 -3 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -154.884 157.827 -3 + vertex -154.884 157.827 0 + vertex -154.819 158.026 0 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -154.934 157.624 -3 + vertex -154.884 157.827 0 + vertex -154.884 157.827 -3 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -154.934 157.624 -3 + vertex -154.934 157.624 0 + vertex -154.884 157.827 0 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -154.971 157.418 -3 + vertex -154.934 157.624 0 + vertex -154.934 157.624 -3 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -154.971 157.418 -3 + vertex -154.971 157.418 0 + vertex -154.934 157.624 0 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -154.993 157.209 -3 + vertex -154.971 157.418 0 + vertex -154.971 157.418 -3 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -154.993 157.209 -3 + vertex -154.993 157.209 0 + vertex -154.971 157.418 0 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -155 157 -3 + vertex -154.993 157.209 0 + vertex -154.993 157.209 -3 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -155 157 -3 + vertex -155 157 0 + vertex -154.993 157.209 0 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -155 -157 -3 + vertex -155 157 0 + vertex -155 157 -3 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -155 -157 -3 + vertex -155 -157 0 + vertex -155 157 0 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -154.993 -157.209 -3 + vertex -155 -157 0 + vertex -155 -157 -3 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -154.993 -157.209 -3 + vertex -154.993 -157.209 0 + vertex -155 -157 0 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -154.971 -157.418 -3 + vertex -154.993 -157.209 0 + vertex -154.993 -157.209 -3 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -154.971 -157.418 -3 + vertex -154.971 -157.418 0 + vertex -154.993 -157.209 0 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -154.934 -157.624 -3 + vertex -154.971 -157.418 0 + vertex -154.971 -157.418 -3 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -154.934 -157.624 -3 + vertex -154.934 -157.624 0 + vertex -154.971 -157.418 0 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -154.884 -157.827 -3 + vertex -154.934 -157.624 0 + vertex -154.934 -157.624 -3 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -154.884 -157.827 -3 + vertex -154.884 -157.827 0 + vertex -154.934 -157.624 0 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -154.819 -158.026 -3 + vertex -154.884 -157.827 0 + vertex -154.884 -157.827 -3 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -154.819 -158.026 -3 + vertex -154.819 -158.026 0 + vertex -154.884 -157.827 0 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -154.741 -158.22 -3 + vertex -154.819 -158.026 0 + vertex -154.819 -158.026 -3 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -154.741 -158.22 -3 + vertex -154.741 -158.22 0 + vertex -154.819 -158.026 0 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -154.649 -158.408 -3 + vertex -154.741 -158.22 0 + vertex -154.741 -158.22 -3 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -154.649 -158.408 -3 + vertex -154.649 -158.408 0 + vertex -154.741 -158.22 0 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -154.544 -158.59 -3 + vertex -154.649 -158.408 0 + vertex -154.649 -158.408 -3 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -154.544 -158.59 -3 + vertex -154.544 -158.59 0 + vertex -154.649 -158.408 0 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -154.427 -158.763 -3 + vertex -154.544 -158.59 0 + vertex -154.544 -158.59 -3 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -154.427 -158.763 -3 + vertex -154.427 -158.763 0 + vertex -154.544 -158.59 0 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -154.298 -158.928 -3 + vertex -154.427 -158.763 0 + vertex -154.427 -158.763 -3 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -154.298 -158.928 -3 + vertex -154.298 -158.928 0 + vertex -154.427 -158.763 0 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -154.158 -159.084 -3 + vertex -154.298 -158.928 0 + vertex -154.298 -158.928 -3 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -154.158 -159.084 -3 + vertex -154.158 -159.084 0 + vertex -154.298 -158.928 0 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -154.007 -159.229 -3 + vertex -154.158 -159.084 0 + vertex -154.158 -159.084 -3 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -154.007 -159.229 -3 + vertex -154.007 -159.229 0 + vertex -154.158 -159.084 0 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -153.847 -159.364 -3 + vertex -154.007 -159.229 0 + vertex -154.007 -159.229 -3 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -153.847 -159.364 -3 + vertex -153.847 -159.364 0 + vertex -154.007 -159.229 0 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -153.678 -159.487 -3 + vertex -153.847 -159.364 0 + vertex -153.847 -159.364 -3 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -153.678 -159.487 -3 + vertex -153.678 -159.487 0 + vertex -153.847 -159.364 0 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -153.5 -159.598 -3 + vertex -153.678 -159.487 0 + vertex -153.678 -159.487 -3 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -153.5 -159.598 -3 + vertex -153.5 -159.598 0 + vertex -153.678 -159.487 0 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -153.315 -159.696 -3 + vertex -153.5 -159.598 0 + vertex -153.5 -159.598 -3 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -153.315 -159.696 -3 + vertex -153.315 -159.696 0 + vertex -153.5 -159.598 0 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -153.124 -159.782 -3 + vertex -153.315 -159.696 0 + vertex -153.315 -159.696 -3 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -153.124 -159.782 -3 + vertex -153.124 -159.782 0 + vertex -153.315 -159.696 0 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -152.927 -159.853 -3 + vertex -153.124 -159.782 0 + vertex -153.124 -159.782 -3 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -152.927 -159.853 -3 + vertex -152.927 -159.853 0 + vertex -153.124 -159.782 0 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -152.726 -159.911 -3 + vertex -152.927 -159.853 0 + vertex -152.927 -159.853 -3 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -152.726 -159.911 -3 + vertex -152.726 -159.911 0 + vertex -152.927 -159.853 0 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -152.521 -159.954 -3 + vertex -152.726 -159.911 0 + vertex -152.726 -159.911 -3 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -152.521 -159.954 -3 + vertex -152.521 -159.954 0 + vertex -152.726 -159.911 0 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -152.314 -159.984 -3 + vertex -152.521 -159.954 0 + vertex -152.521 -159.954 -3 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -152.314 -159.984 -3 + vertex -152.314 -159.984 0 + vertex -152.521 -159.954 0 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -152.105 -159.998 -3 + vertex -152.314 -159.984 0 + vertex -152.314 -159.984 -3 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -152.105 -159.998 -3 + vertex -152.105 -159.998 0 + vertex -152.314 -159.984 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -152.002 -159.998 -3 + vertex -152.105 -159.998 0 + vertex -152.105 -159.998 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -152.002 -159.998 -3 + vertex -152.002 -159.998 0 + vertex -152.105 -159.998 0 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -152 -160 -3 + vertex -152.002 -159.998 0 + vertex -152.002 -159.998 -3 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -152 -160 -3 + vertex -152 -160 0 + vertex -152.002 -159.998 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 152 -160 -3 + vertex -152 -160 0 + vertex -152 -160 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 152 -160 -3 + vertex 152 -160 0 + vertex -152 -160 0 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 152.002 -159.998 -3 + vertex 152 -160 0 + vertex 152 -160 -3 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 152.002 -159.998 -3 + vertex 152.002 -159.998 0 + vertex 152 -160 0 + endloop + endfacet +endsolid OpenSCAD_Model diff --git a/resources/profiles/Creality/cr20.svg b/resources/profiles/Creality/cr20.svg new file mode 100644 index 0000000000..338a59975d --- /dev/null +++ b/resources/profiles/Creality/cr20.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/profiles/Creality/ender2_bed.stl b/resources/profiles/Creality/ender2_bed.stl index 3cf022ed0b..b2a419fabb 100644 Binary files a/resources/profiles/Creality/ender2_bed.stl and b/resources/profiles/Creality/ender2_bed.stl differ diff --git a/resources/profiles/Creality/ender3_bed.stl b/resources/profiles/Creality/ender3_bed.stl index fb8f86d094..724d8905e0 100644 Binary files a/resources/profiles/Creality/ender3_bed.stl and b/resources/profiles/Creality/ender3_bed.stl differ diff --git a/resources/profiles/Creality/ender5plus.svg b/resources/profiles/Creality/ender5plus.svg new file mode 100644 index 0000000000..b5ac0b0161 --- /dev/null +++ b/resources/profiles/Creality/ender5plus.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/profiles/Creality/ender5plus_bed.stl b/resources/profiles/Creality/ender5plus_bed.stl new file mode 100644 index 0000000000..f2d17bd40c --- /dev/null +++ b/resources/profiles/Creality/ender5plus_bed.stl @@ -0,0 +1,2774 @@ +solid OpenSCAD_Model + facet normal 0 0 -1 + outer loop + vertex 182.105 -184.998 -3 + vertex 182.002 -184.998 -3 + vertex 182.314 -184.984 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 182.314 -184.984 -3 + vertex 182.002 -184.998 -3 + vertex 182.521 -184.954 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 185 -182 -3 + vertex 182.002 -184.998 -3 + vertex 182.002 184.998 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 182.521 -184.954 -3 + vertex 182.002 -184.998 -3 + vertex 182.726 -184.911 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 182.726 -184.911 -3 + vertex 182.002 -184.998 -3 + vertex 182.927 -184.853 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 182.927 -184.853 -3 + vertex 182.002 -184.998 -3 + vertex 183.124 -184.782 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 183.124 -184.782 -3 + vertex 182.002 -184.998 -3 + vertex 183.315 -184.696 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 183.315 -184.696 -3 + vertex 182.002 -184.998 -3 + vertex 183.5 -184.598 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 183.5 -184.598 -3 + vertex 182.002 -184.998 -3 + vertex 183.678 -184.487 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 183.678 -184.487 -3 + vertex 182.002 -184.998 -3 + vertex 183.847 -184.364 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 183.847 -184.364 -3 + vertex 182.002 -184.998 -3 + vertex 184.007 -184.229 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 184.007 -184.229 -3 + vertex 182.002 -184.998 -3 + vertex 184.158 -184.084 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 184.158 -184.084 -3 + vertex 182.002 -184.998 -3 + vertex 184.298 -183.928 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 184.298 -183.928 -3 + vertex 182.002 -184.998 -3 + vertex 184.427 -183.763 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 184.427 -183.763 -3 + vertex 182.002 -184.998 -3 + vertex 184.544 -183.59 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 184.544 -183.59 -3 + vertex 182.002 -184.998 -3 + vertex 184.649 -183.408 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 184.649 -183.408 -3 + vertex 182.002 -184.998 -3 + vertex 184.741 -183.22 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 184.741 -183.22 -3 + vertex 182.002 -184.998 -3 + vertex 184.819 -183.026 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 184.819 -183.026 -3 + vertex 182.002 -184.998 -3 + vertex 184.884 -182.827 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 184.884 -182.827 -3 + vertex 182.002 -184.998 -3 + vertex 184.934 -182.624 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 184.934 -182.624 -3 + vertex 182.002 -184.998 -3 + vertex 184.971 -182.418 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 184.971 -182.418 -3 + vertex 182.002 -184.998 -3 + vertex 184.993 -182.209 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 184.993 -182.209 -3 + vertex 182.002 -184.998 -3 + vertex 185 -182 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 185 -182 -3 + vertex 182.002 184.998 -3 + vertex 185 182 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 182.002 184.998 -3 + vertex 184.971 182.418 -3 + vertex 184.993 182.209 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 184.884 182.827 -3 + vertex 184.934 182.624 -3 + vertex 182.002 184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 184.741 183.22 -3 + vertex 182.002 184.998 -3 + vertex 184.649 183.408 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 184.741 183.22 -3 + vertex 184.819 183.026 -3 + vertex 182.002 184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 182.002 184.998 -3 + vertex 184.007 184.229 -3 + vertex 184.158 184.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 184.427 183.763 -3 + vertex 182.002 184.998 -3 + vertex 184.298 183.928 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 184.427 183.763 -3 + vertex 184.544 183.59 -3 + vertex 182.002 184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 184.298 183.928 -3 + vertex 182.002 184.998 -3 + vertex 184.158 184.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 182.002 184.998 -3 + vertex 182.927 184.853 -3 + vertex 183.124 184.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 183.847 184.364 -3 + vertex 182.002 184.998 -3 + vertex 183.678 184.487 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 183.847 184.364 -3 + vertex 184.007 184.229 -3 + vertex 182.002 184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 183.678 184.487 -3 + vertex 182.002 184.998 -3 + vertex 183.5 184.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 183.5 184.598 -3 + vertex 182.002 184.998 -3 + vertex 183.315 184.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 183.315 184.696 -3 + vertex 182.002 184.998 -3 + vertex 183.124 184.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 184.649 183.408 -3 + vertex 182.002 184.998 -3 + vertex 184.544 183.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 182.726 184.911 -3 + vertex 182.002 184.998 -3 + vertex 182.521 184.954 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 182.726 184.911 -3 + vertex 182.927 184.853 -3 + vertex 182.002 184.998 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 184.819 183.026 -3 + vertex 184.884 182.827 -3 + vertex 182.002 184.998 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 182.314 184.984 -3 + vertex 182.521 184.954 -3 + vertex 182.002 184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 182.002 184.998 -3 + vertex 184.934 182.624 -3 + vertex 184.971 182.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 182.002 184.998 -3 + vertex 182.105 184.998 -3 + vertex 182.314 184.984 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 185 182 -3 + vertex 182.002 184.998 -3 + vertex 184.993 182.209 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex -182 185 -3 + vertex 182 185 -3 + vertex -182.002 184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex 182 185 -3 + vertex 182.002 184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 182.002 -184.998 -3 + vertex -182.002 184.998 -3 + vertex 182.002 184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -185 -182 -3 + vertex -185 182 -3 + vertex -182.002 -184.998 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -182.314 184.984 -3 + vertex -182.105 184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -182.521 184.954 -3 + vertex -182.314 184.984 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -182.726 184.911 -3 + vertex -182.521 184.954 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -182.927 184.853 -3 + vertex -182.726 184.911 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -183.124 184.782 -3 + vertex -182.927 184.853 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -183.315 184.696 -3 + vertex -183.124 184.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -183.5 184.598 -3 + vertex -183.315 184.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -183.678 184.487 -3 + vertex -183.5 184.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -183.847 184.364 -3 + vertex -183.678 184.487 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -184.007 184.229 -3 + vertex -183.847 184.364 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -184.158 184.084 -3 + vertex -184.007 184.229 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -184.298 183.928 -3 + vertex -184.158 184.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -184.427 183.763 -3 + vertex -184.298 183.928 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -184.544 183.59 -3 + vertex -184.427 183.763 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -184.649 183.408 -3 + vertex -184.544 183.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -184.741 183.22 -3 + vertex -184.649 183.408 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -184.819 183.026 -3 + vertex -184.741 183.22 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -184.884 182.827 -3 + vertex -184.819 183.026 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -184.934 182.624 -3 + vertex -184.884 182.827 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -184.971 182.418 -3 + vertex -184.934 182.624 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -184.993 182.209 -3 + vertex -184.971 182.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -185 182 -3 + vertex -184.993 182.209 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 -184.998 -3 + vertex -185 182 -3 + vertex -182.002 184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 182.002 -184.998 -3 + vertex -182.002 -184.998 -3 + vertex -182.002 184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 -184.998 -3 + vertex -184.971 -182.418 -3 + vertex -184.993 -182.209 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -184.884 -182.827 -3 + vertex -184.934 -182.624 -3 + vertex -182.002 -184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -184.741 -183.22 -3 + vertex -182.002 -184.998 -3 + vertex -184.649 -183.408 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -184.741 -183.22 -3 + vertex -184.819 -183.026 -3 + vertex -182.002 -184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 -184.998 -3 + vertex -184.007 -184.229 -3 + vertex -184.158 -184.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -184.427 -183.763 -3 + vertex -182.002 -184.998 -3 + vertex -184.298 -183.928 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -184.427 -183.763 -3 + vertex -184.544 -183.59 -3 + vertex -182.002 -184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -184.298 -183.928 -3 + vertex -182.002 -184.998 -3 + vertex -184.158 -184.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 -184.998 -3 + vertex -182.927 -184.853 -3 + vertex -183.124 -184.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -183.847 -184.364 -3 + vertex -182.002 -184.998 -3 + vertex -183.678 -184.487 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -183.847 -184.364 -3 + vertex -184.007 -184.229 -3 + vertex -182.002 -184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -183.678 -184.487 -3 + vertex -182.002 -184.998 -3 + vertex -183.5 -184.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -183.5 -184.598 -3 + vertex -182.002 -184.998 -3 + vertex -183.315 -184.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -183.315 -184.696 -3 + vertex -182.002 -184.998 -3 + vertex -183.124 -184.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -184.649 -183.408 -3 + vertex -182.002 -184.998 -3 + vertex -184.544 -183.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.726 -184.911 -3 + vertex -182.002 -184.998 -3 + vertex -182.521 -184.954 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.726 -184.911 -3 + vertex -182.927 -184.853 -3 + vertex -182.002 -184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -184.819 -183.026 -3 + vertex -184.884 -182.827 -3 + vertex -182.002 -184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.314 -184.984 -3 + vertex -182.521 -184.954 -3 + vertex -182.002 -184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 -184.998 -3 + vertex -184.934 -182.624 -3 + vertex -184.971 -182.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 -184.998 -3 + vertex -182.105 -184.998 -3 + vertex -182.314 -184.984 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 182.002 -184.998 -3 + vertex 182 -185 -3 + vertex -182.002 -184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 -184.998 -3 + vertex 182 -185 -3 + vertex -182 -185 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -185 -182 -3 + vertex -182.002 -184.998 -3 + vertex -184.993 -182.209 -3 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.314 -184.984 0 + vertex 182.002 -184.998 0 + vertex 182.105 -184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.521 -184.954 0 + vertex 182.002 -184.998 0 + vertex 182.314 -184.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.002 184.998 0 + vertex 182.002 -184.998 0 + vertex 185 -182 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.726 -184.911 0 + vertex 182.002 -184.998 0 + vertex 182.521 -184.954 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.927 -184.853 0 + vertex 182.002 -184.998 0 + vertex 182.726 -184.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 183.124 -184.782 0 + vertex 182.002 -184.998 0 + vertex 182.927 -184.853 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 183.315 -184.696 0 + vertex 182.002 -184.998 0 + vertex 183.124 -184.782 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 183.5 -184.598 0 + vertex 182.002 -184.998 0 + vertex 183.315 -184.696 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 183.678 -184.487 0 + vertex 182.002 -184.998 0 + vertex 183.5 -184.598 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 183.847 -184.364 0 + vertex 182.002 -184.998 0 + vertex 183.678 -184.487 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.007 -184.229 0 + vertex 182.002 -184.998 0 + vertex 183.847 -184.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.158 -184.084 0 + vertex 182.002 -184.998 0 + vertex 184.007 -184.229 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.298 -183.928 0 + vertex 182.002 -184.998 0 + vertex 184.158 -184.084 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.427 -183.763 0 + vertex 182.002 -184.998 0 + vertex 184.298 -183.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.544 -183.59 0 + vertex 182.002 -184.998 0 + vertex 184.427 -183.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.649 -183.408 0 + vertex 182.002 -184.998 0 + vertex 184.544 -183.59 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.741 -183.22 0 + vertex 182.002 -184.998 0 + vertex 184.649 -183.408 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.819 -183.026 0 + vertex 182.002 -184.998 0 + vertex 184.741 -183.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.884 -182.827 0 + vertex 182.002 -184.998 0 + vertex 184.819 -183.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.934 -182.624 0 + vertex 182.002 -184.998 0 + vertex 184.884 -182.827 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.971 -182.418 0 + vertex 182.002 -184.998 0 + vertex 184.934 -182.624 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.993 -182.209 0 + vertex 182.002 -184.998 0 + vertex 184.971 -182.418 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 185 -182 0 + vertex 182.002 -184.998 0 + vertex 184.993 -182.209 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 185 182 0 + vertex 182.002 184.998 0 + vertex 185 -182 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.993 182.209 0 + vertex 184.971 182.418 0 + vertex 182.002 184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.002 184.998 0 + vertex 184.934 182.624 0 + vertex 184.884 182.827 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.649 183.408 0 + vertex 182.002 184.998 0 + vertex 184.741 183.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.002 184.998 0 + vertex 184.819 183.026 0 + vertex 184.741 183.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.158 184.084 0 + vertex 184.007 184.229 0 + vertex 182.002 184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.298 183.928 0 + vertex 182.002 184.998 0 + vertex 184.427 183.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.002 184.998 0 + vertex 184.544 183.59 0 + vertex 184.427 183.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.158 184.084 0 + vertex 182.002 184.998 0 + vertex 184.298 183.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 183.124 184.782 0 + vertex 182.927 184.853 0 + vertex 182.002 184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 183.678 184.487 0 + vertex 182.002 184.998 0 + vertex 183.847 184.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.002 184.998 0 + vertex 184.007 184.229 0 + vertex 183.847 184.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 183.5 184.598 0 + vertex 182.002 184.998 0 + vertex 183.678 184.487 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 183.315 184.696 0 + vertex 182.002 184.998 0 + vertex 183.5 184.598 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 183.124 184.782 0 + vertex 182.002 184.998 0 + vertex 183.315 184.696 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.544 183.59 0 + vertex 182.002 184.998 0 + vertex 184.649 183.408 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.521 184.954 0 + vertex 182.002 184.998 0 + vertex 182.726 184.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.002 184.998 0 + vertex 182.927 184.853 0 + vertex 182.726 184.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.002 184.998 0 + vertex 184.884 182.827 0 + vertex 184.819 183.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.002 184.998 0 + vertex 182.521 184.954 0 + vertex 182.314 184.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.971 182.418 0 + vertex 184.934 182.624 0 + vertex 182.002 184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.314 184.984 0 + vertex 182.105 184.998 0 + vertex 182.002 184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.993 182.209 0 + vertex 182.002 184.998 0 + vertex 185 182 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -182.002 184.998 0 + vertex 182 185 0 + vertex -182 185 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.002 184.998 0 + vertex 182 185 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.002 184.998 0 + vertex -182.002 184.998 0 + vertex 182.002 -184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -182.002 -184.998 0 + vertex -185 182 0 + vertex -185 -182 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -182.105 184.998 0 + vertex -182.314 184.984 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -182.314 184.984 0 + vertex -182.521 184.954 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -182.521 184.954 0 + vertex -182.726 184.911 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -182.726 184.911 0 + vertex -182.927 184.853 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -182.927 184.853 0 + vertex -183.124 184.782 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -183.124 184.782 0 + vertex -183.315 184.696 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -183.315 184.696 0 + vertex -183.5 184.598 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -183.5 184.598 0 + vertex -183.678 184.487 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -183.678 184.487 0 + vertex -183.847 184.364 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -183.847 184.364 0 + vertex -184.007 184.229 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -184.007 184.229 0 + vertex -184.158 184.084 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -184.158 184.084 0 + vertex -184.298 183.928 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -184.298 183.928 0 + vertex -184.427 183.763 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -184.427 183.763 0 + vertex -184.544 183.59 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -184.544 183.59 0 + vertex -184.649 183.408 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -184.649 183.408 0 + vertex -184.741 183.22 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -184.741 183.22 0 + vertex -184.819 183.026 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -184.819 183.026 0 + vertex -184.884 182.827 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -184.884 182.827 0 + vertex -184.934 182.624 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -184.934 182.624 0 + vertex -184.971 182.418 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -184.971 182.418 0 + vertex -184.993 182.209 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -184.993 182.209 0 + vertex -185 182 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -182.002 184.998 0 + vertex -185 182 0 + vertex -182.002 -184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -182.002 184.998 0 + vertex -182.002 -184.998 0 + vertex 182.002 -184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -184.993 -182.209 0 + vertex -184.971 -182.418 0 + vertex -182.002 -184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -182.002 -184.998 0 + vertex -184.934 -182.624 0 + vertex -184.884 -182.827 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -184.649 -183.408 0 + vertex -182.002 -184.998 0 + vertex -184.741 -183.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -182.002 -184.998 0 + vertex -184.819 -183.026 0 + vertex -184.741 -183.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -184.158 -184.084 0 + vertex -184.007 -184.229 0 + vertex -182.002 -184.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -184.298 -183.928 0 + vertex -182.002 -184.998 0 + vertex -184.427 -183.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -182.002 -184.998 0 + vertex -184.544 -183.59 0 + vertex -184.427 -183.763 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -184.158 -184.084 0 + vertex -182.002 -184.998 0 + vertex -184.298 -183.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -183.124 -184.782 0 + vertex -182.927 -184.853 0 + vertex -182.002 -184.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -183.678 -184.487 0 + vertex -182.002 -184.998 0 + vertex -183.847 -184.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -182.002 -184.998 0 + vertex -184.007 -184.229 0 + vertex -183.847 -184.364 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -183.5 -184.598 0 + vertex -182.002 -184.998 0 + vertex -183.678 -184.487 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -183.315 -184.696 0 + vertex -182.002 -184.998 0 + vertex -183.5 -184.598 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -183.124 -184.782 0 + vertex -182.002 -184.998 0 + vertex -183.315 -184.696 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -184.544 -183.59 0 + vertex -182.002 -184.998 0 + vertex -184.649 -183.408 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -182.521 -184.954 0 + vertex -182.002 -184.998 0 + vertex -182.726 -184.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -182.002 -184.998 0 + vertex -182.927 -184.853 0 + vertex -182.726 -184.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -182.002 -184.998 0 + vertex -184.884 -182.827 0 + vertex -184.819 -183.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -182.002 -184.998 0 + vertex -182.521 -184.954 0 + vertex -182.314 -184.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -184.971 -182.418 0 + vertex -184.934 -182.624 0 + vertex -182.002 -184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -182.314 -184.984 0 + vertex -182.105 -184.998 0 + vertex -182.002 -184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -182.002 -184.998 0 + vertex 182 -185 0 + vertex 182.002 -184.998 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex -182 -185 0 + vertex 182 -185 0 + vertex -182.002 -184.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -184.993 -182.209 0 + vertex -182.002 -184.998 0 + vertex -185 -182 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 182.105 -184.998 -3 + vertex 182.002 -184.998 0 + vertex 182.002 -184.998 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 182.105 -184.998 -3 + vertex 182.105 -184.998 0 + vertex 182.002 -184.998 0 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 182.314 -184.984 -3 + vertex 182.105 -184.998 0 + vertex 182.105 -184.998 -3 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 182.314 -184.984 -3 + vertex 182.314 -184.984 0 + vertex 182.105 -184.998 0 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 182.521 -184.954 -3 + vertex 182.314 -184.984 0 + vertex 182.314 -184.984 -3 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 182.521 -184.954 -3 + vertex 182.521 -184.954 0 + vertex 182.314 -184.984 0 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 182.726 -184.911 -3 + vertex 182.521 -184.954 0 + vertex 182.521 -184.954 -3 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 182.726 -184.911 -3 + vertex 182.726 -184.911 0 + vertex 182.521 -184.954 0 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 182.927 -184.853 -3 + vertex 182.726 -184.911 0 + vertex 182.726 -184.911 -3 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 182.927 -184.853 -3 + vertex 182.927 -184.853 0 + vertex 182.726 -184.911 0 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 183.124 -184.782 -3 + vertex 182.927 -184.853 0 + vertex 182.927 -184.853 -3 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 183.124 -184.782 -3 + vertex 183.124 -184.782 0 + vertex 182.927 -184.853 0 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 183.315 -184.696 -3 + vertex 183.124 -184.782 0 + vertex 183.124 -184.782 -3 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 183.315 -184.696 -3 + vertex 183.315 -184.696 0 + vertex 183.124 -184.782 0 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 183.5 -184.598 -3 + vertex 183.315 -184.696 0 + vertex 183.315 -184.696 -3 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 183.5 -184.598 -3 + vertex 183.5 -184.598 0 + vertex 183.315 -184.696 0 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 183.678 -184.487 -3 + vertex 183.5 -184.598 0 + vertex 183.5 -184.598 -3 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 183.678 -184.487 -3 + vertex 183.678 -184.487 0 + vertex 183.5 -184.598 0 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 183.847 -184.364 -3 + vertex 183.678 -184.487 0 + vertex 183.678 -184.487 -3 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 183.847 -184.364 -3 + vertex 183.847 -184.364 0 + vertex 183.678 -184.487 0 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 184.007 -184.229 -3 + vertex 183.847 -184.364 0 + vertex 183.847 -184.364 -3 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 184.007 -184.229 -3 + vertex 184.007 -184.229 0 + vertex 183.847 -184.364 0 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 184.158 -184.084 -3 + vertex 184.007 -184.229 0 + vertex 184.007 -184.229 -3 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 184.158 -184.084 -3 + vertex 184.158 -184.084 0 + vertex 184.007 -184.229 0 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 184.298 -183.928 -3 + vertex 184.158 -184.084 0 + vertex 184.158 -184.084 -3 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 184.298 -183.928 -3 + vertex 184.298 -183.928 0 + vertex 184.158 -184.084 0 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 184.427 -183.763 -3 + vertex 184.298 -183.928 0 + vertex 184.298 -183.928 -3 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 184.427 -183.763 -3 + vertex 184.427 -183.763 0 + vertex 184.298 -183.928 0 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 184.544 -183.59 -3 + vertex 184.427 -183.763 0 + vertex 184.427 -183.763 -3 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 184.544 -183.59 -3 + vertex 184.544 -183.59 0 + vertex 184.427 -183.763 0 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 184.649 -183.408 -3 + vertex 184.544 -183.59 0 + vertex 184.544 -183.59 -3 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 184.649 -183.408 -3 + vertex 184.649 -183.408 0 + vertex 184.544 -183.59 0 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 184.741 -183.22 -3 + vertex 184.649 -183.408 0 + vertex 184.649 -183.408 -3 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 184.741 -183.22 -3 + vertex 184.741 -183.22 0 + vertex 184.649 -183.408 0 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 184.819 -183.026 -3 + vertex 184.741 -183.22 0 + vertex 184.741 -183.22 -3 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 184.819 -183.026 -3 + vertex 184.819 -183.026 0 + vertex 184.741 -183.22 0 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 184.884 -182.827 -3 + vertex 184.819 -183.026 0 + vertex 184.819 -183.026 -3 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 184.884 -182.827 -3 + vertex 184.884 -182.827 0 + vertex 184.819 -183.026 0 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 184.934 -182.624 -3 + vertex 184.884 -182.827 0 + vertex 184.884 -182.827 -3 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 184.934 -182.624 -3 + vertex 184.934 -182.624 0 + vertex 184.884 -182.827 0 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 184.971 -182.418 -3 + vertex 184.934 -182.624 0 + vertex 184.934 -182.624 -3 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 184.971 -182.418 -3 + vertex 184.971 -182.418 0 + vertex 184.934 -182.624 0 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 184.993 -182.209 -3 + vertex 184.971 -182.418 0 + vertex 184.971 -182.418 -3 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 184.993 -182.209 -3 + vertex 184.993 -182.209 0 + vertex 184.971 -182.418 0 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 185 -182 -3 + vertex 184.993 -182.209 0 + vertex 184.993 -182.209 -3 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 185 -182 -3 + vertex 185 -182 0 + vertex 184.993 -182.209 0 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 185 182 -3 + vertex 185 -182 0 + vertex 185 -182 -3 + endloop + endfacet + facet normal 1 0 -0 + outer loop + vertex 185 182 -3 + vertex 185 182 0 + vertex 185 -182 0 + endloop + endfacet + facet normal 0.99944 0.0334741 0 + outer loop + vertex 184.993 182.209 -3 + vertex 185 182 0 + vertex 185 182 -3 + endloop + endfacet + facet normal 0.99944 0.0334741 -0 + outer loop + vertex 184.993 182.209 -3 + vertex 184.993 182.209 0 + vertex 185 182 0 + endloop + endfacet + facet normal 0.994505 0.104685 0 + outer loop + vertex 184.971 182.418 -3 + vertex 184.993 182.209 0 + vertex 184.993 182.209 -3 + endloop + endfacet + facet normal 0.994505 0.104685 -0 + outer loop + vertex 184.971 182.418 -3 + vertex 184.971 182.418 0 + vertex 184.993 182.209 0 + endloop + endfacet + facet normal 0.98425 0.176783 0 + outer loop + vertex 184.934 182.624 -3 + vertex 184.971 182.418 0 + vertex 184.971 182.418 -3 + endloop + endfacet + facet normal 0.98425 0.176783 -0 + outer loop + vertex 184.934 182.624 -3 + vertex 184.934 182.624 0 + vertex 184.971 182.418 0 + endloop + endfacet + facet normal 0.970981 0.239158 0 + outer loop + vertex 184.884 182.827 -3 + vertex 184.934 182.624 0 + vertex 184.934 182.624 -3 + endloop + endfacet + facet normal 0.970981 0.239158 -0 + outer loop + vertex 184.884 182.827 -3 + vertex 184.884 182.827 0 + vertex 184.934 182.624 0 + endloop + endfacet + facet normal 0.950577 0.31049 0 + outer loop + vertex 184.819 183.026 -3 + vertex 184.884 182.827 0 + vertex 184.884 182.827 -3 + endloop + endfacet + facet normal 0.950577 0.31049 -0 + outer loop + vertex 184.819 183.026 -3 + vertex 184.819 183.026 0 + vertex 184.884 182.827 0 + endloop + endfacet + facet normal 0.927816 0.373039 0 + outer loop + vertex 184.741 183.22 -3 + vertex 184.819 183.026 0 + vertex 184.819 183.026 -3 + endloop + endfacet + facet normal 0.927816 0.373039 -0 + outer loop + vertex 184.741 183.22 -3 + vertex 184.741 183.22 0 + vertex 184.819 183.026 0 + endloop + endfacet + facet normal 0.898217 0.439553 0 + outer loop + vertex 184.649 183.408 -3 + vertex 184.741 183.22 0 + vertex 184.741 183.22 -3 + endloop + endfacet + facet normal 0.898217 0.439553 -0 + outer loop + vertex 184.649 183.408 -3 + vertex 184.649 183.408 0 + vertex 184.741 183.22 0 + endloop + endfacet + facet normal 0.866186 0.499722 0 + outer loop + vertex 184.544 183.59 -3 + vertex 184.649 183.408 0 + vertex 184.649 183.408 -3 + endloop + endfacet + facet normal 0.866186 0.499722 -0 + outer loop + vertex 184.544 183.59 -3 + vertex 184.544 183.59 0 + vertex 184.649 183.408 0 + endloop + endfacet + facet normal 0.828349 0.560213 0 + outer loop + vertex 184.427 183.763 -3 + vertex 184.544 183.59 0 + vertex 184.544 183.59 -3 + endloop + endfacet + facet normal 0.828349 0.560213 -0 + outer loop + vertex 184.427 183.763 -3 + vertex 184.427 183.763 0 + vertex 184.544 183.59 0 + endloop + endfacet + facet normal 0.787807 0.615922 0 + outer loop + vertex 184.298 183.928 -3 + vertex 184.427 183.763 0 + vertex 184.427 183.763 -3 + endloop + endfacet + facet normal 0.787807 0.615922 -0 + outer loop + vertex 184.298 183.928 -3 + vertex 184.298 183.928 0 + vertex 184.427 183.763 0 + endloop + endfacet + facet normal 0.744242 0.66791 0 + outer loop + vertex 184.158 184.084 -3 + vertex 184.298 183.928 0 + vertex 184.298 183.928 -3 + endloop + endfacet + facet normal 0.744242 0.66791 -0 + outer loop + vertex 184.158 184.084 -3 + vertex 184.158 184.084 0 + vertex 184.298 183.928 0 + endloop + endfacet + facet normal 0.692631 0.721292 0 + outer loop + vertex 184.007 184.229 -3 + vertex 184.158 184.084 0 + vertex 184.158 184.084 -3 + endloop + endfacet + facet normal 0.692631 0.721292 -0 + outer loop + vertex 184.007 184.229 -3 + vertex 184.007 184.229 0 + vertex 184.158 184.084 0 + endloop + endfacet + facet normal 0.644871 0.764291 0 + outer loop + vertex 183.847 184.364 -3 + vertex 184.007 184.229 0 + vertex 184.007 184.229 -3 + endloop + endfacet + facet normal 0.644871 0.764291 -0 + outer loop + vertex 183.847 184.364 -3 + vertex 183.847 184.364 0 + vertex 184.007 184.229 0 + endloop + endfacet + facet normal 0.588456 0.808529 0 + outer loop + vertex 183.678 184.487 -3 + vertex 183.847 184.364 0 + vertex 183.847 184.364 -3 + endloop + endfacet + facet normal 0.588456 0.808529 -0 + outer loop + vertex 183.678 184.487 -3 + vertex 183.678 184.487 0 + vertex 183.847 184.364 0 + endloop + endfacet + facet normal 0.529142 0.848533 0 + outer loop + vertex 183.5 184.598 -3 + vertex 183.678 184.487 0 + vertex 183.678 184.487 -3 + endloop + endfacet + facet normal 0.529142 0.848533 -0 + outer loop + vertex 183.5 184.598 -3 + vertex 183.5 184.598 0 + vertex 183.678 184.487 0 + endloop + endfacet + facet normal 0.468107 0.883672 0 + outer loop + vertex 183.315 184.696 -3 + vertex 183.5 184.598 0 + vertex 183.5 184.598 -3 + endloop + endfacet + facet normal 0.468107 0.883672 -0 + outer loop + vertex 183.315 184.696 -3 + vertex 183.315 184.696 0 + vertex 183.5 184.598 0 + endloop + endfacet + facet normal 0.410563 0.911832 0 + outer loop + vertex 183.124 184.782 -3 + vertex 183.315 184.696 0 + vertex 183.315 184.696 -3 + endloop + endfacet + facet normal 0.410563 0.911832 -0 + outer loop + vertex 183.124 184.782 -3 + vertex 183.124 184.782 0 + vertex 183.315 184.696 0 + endloop + endfacet + facet normal 0.339058 0.940766 0 + outer loop + vertex 182.927 184.853 -3 + vertex 183.124 184.782 0 + vertex 183.124 184.782 -3 + endloop + endfacet + facet normal 0.339058 0.940766 -0 + outer loop + vertex 182.927 184.853 -3 + vertex 182.927 184.853 0 + vertex 183.124 184.782 0 + endloop + endfacet + facet normal 0.277246 0.960799 0 + outer loop + vertex 182.726 184.911 -3 + vertex 182.927 184.853 0 + vertex 182.927 184.853 -3 + endloop + endfacet + facet normal 0.277246 0.960799 -0 + outer loop + vertex 182.726 184.911 -3 + vertex 182.726 184.911 0 + vertex 182.927 184.853 0 + endloop + endfacet + facet normal 0.205289 0.978701 0 + outer loop + vertex 182.521 184.954 -3 + vertex 182.726 184.911 0 + vertex 182.726 184.911 -3 + endloop + endfacet + facet normal 0.205289 0.978701 -0 + outer loop + vertex 182.521 184.954 -3 + vertex 182.521 184.954 0 + vertex 182.726 184.911 0 + endloop + endfacet + facet normal 0.143429 0.989661 0 + outer loop + vertex 182.314 184.984 -3 + vertex 182.521 184.954 0 + vertex 182.521 184.954 -3 + endloop + endfacet + facet normal 0.143429 0.989661 -0 + outer loop + vertex 182.314 184.984 -3 + vertex 182.314 184.984 0 + vertex 182.521 184.954 0 + endloop + endfacet + facet normal 0.0668359 0.997764 0 + outer loop + vertex 182.105 184.998 -3 + vertex 182.314 184.984 0 + vertex 182.314 184.984 -3 + endloop + endfacet + facet normal 0.0668359 0.997764 -0 + outer loop + vertex 182.105 184.998 -3 + vertex 182.105 184.998 0 + vertex 182.314 184.984 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 182.002 184.998 -3 + vertex 182.105 184.998 0 + vertex 182.105 184.998 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 182.002 184.998 -3 + vertex 182.002 184.998 0 + vertex 182.105 184.998 0 + endloop + endfacet + facet normal 0.707107 0.707107 0 + outer loop + vertex 182 185 -3 + vertex 182.002 184.998 0 + vertex 182.002 184.998 -3 + endloop + endfacet + facet normal 0.707107 0.707107 -0 + outer loop + vertex 182 185 -3 + vertex 182 185 0 + vertex 182.002 184.998 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -182 185 -3 + vertex 182 185 0 + vertex 182 185 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -182 185 -3 + vertex -182 185 0 + vertex 182 185 0 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -182.002 184.998 -3 + vertex -182 185 0 + vertex -182 185 -3 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -182.002 184.998 -3 + vertex -182.002 184.998 0 + vertex -182 185 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -182.105 184.998 -3 + vertex -182.002 184.998 0 + vertex -182.002 184.998 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -182.105 184.998 -3 + vertex -182.105 184.998 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -182.314 184.984 -3 + vertex -182.105 184.998 0 + vertex -182.105 184.998 -3 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -182.314 184.984 -3 + vertex -182.314 184.984 0 + vertex -182.105 184.998 0 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -182.521 184.954 -3 + vertex -182.314 184.984 0 + vertex -182.314 184.984 -3 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -182.521 184.954 -3 + vertex -182.521 184.954 0 + vertex -182.314 184.984 0 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -182.726 184.911 -3 + vertex -182.521 184.954 0 + vertex -182.521 184.954 -3 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -182.726 184.911 -3 + vertex -182.726 184.911 0 + vertex -182.521 184.954 0 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -182.927 184.853 -3 + vertex -182.726 184.911 0 + vertex -182.726 184.911 -3 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -182.927 184.853 -3 + vertex -182.927 184.853 0 + vertex -182.726 184.911 0 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -183.124 184.782 -3 + vertex -182.927 184.853 0 + vertex -182.927 184.853 -3 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -183.124 184.782 -3 + vertex -183.124 184.782 0 + vertex -182.927 184.853 0 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -183.315 184.696 -3 + vertex -183.124 184.782 0 + vertex -183.124 184.782 -3 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -183.315 184.696 -3 + vertex -183.315 184.696 0 + vertex -183.124 184.782 0 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -183.5 184.598 -3 + vertex -183.315 184.696 0 + vertex -183.315 184.696 -3 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -183.5 184.598 -3 + vertex -183.5 184.598 0 + vertex -183.315 184.696 0 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -183.678 184.487 -3 + vertex -183.5 184.598 0 + vertex -183.5 184.598 -3 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -183.678 184.487 -3 + vertex -183.678 184.487 0 + vertex -183.5 184.598 0 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -183.847 184.364 -3 + vertex -183.678 184.487 0 + vertex -183.678 184.487 -3 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -183.847 184.364 -3 + vertex -183.847 184.364 0 + vertex -183.678 184.487 0 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -184.007 184.229 -3 + vertex -183.847 184.364 0 + vertex -183.847 184.364 -3 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -184.007 184.229 -3 + vertex -184.007 184.229 0 + vertex -183.847 184.364 0 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -184.158 184.084 -3 + vertex -184.007 184.229 0 + vertex -184.007 184.229 -3 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -184.158 184.084 -3 + vertex -184.158 184.084 0 + vertex -184.007 184.229 0 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -184.298 183.928 -3 + vertex -184.158 184.084 0 + vertex -184.158 184.084 -3 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -184.298 183.928 -3 + vertex -184.298 183.928 0 + vertex -184.158 184.084 0 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -184.427 183.763 -3 + vertex -184.298 183.928 0 + vertex -184.298 183.928 -3 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -184.427 183.763 -3 + vertex -184.427 183.763 0 + vertex -184.298 183.928 0 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -184.544 183.59 -3 + vertex -184.427 183.763 0 + vertex -184.427 183.763 -3 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -184.544 183.59 -3 + vertex -184.544 183.59 0 + vertex -184.427 183.763 0 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -184.649 183.408 -3 + vertex -184.544 183.59 0 + vertex -184.544 183.59 -3 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -184.649 183.408 -3 + vertex -184.649 183.408 0 + vertex -184.544 183.59 0 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -184.741 183.22 -3 + vertex -184.649 183.408 0 + vertex -184.649 183.408 -3 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -184.741 183.22 -3 + vertex -184.741 183.22 0 + vertex -184.649 183.408 0 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -184.819 183.026 -3 + vertex -184.741 183.22 0 + vertex -184.741 183.22 -3 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -184.819 183.026 -3 + vertex -184.819 183.026 0 + vertex -184.741 183.22 0 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -184.884 182.827 -3 + vertex -184.819 183.026 0 + vertex -184.819 183.026 -3 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -184.884 182.827 -3 + vertex -184.884 182.827 0 + vertex -184.819 183.026 0 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -184.934 182.624 -3 + vertex -184.884 182.827 0 + vertex -184.884 182.827 -3 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -184.934 182.624 -3 + vertex -184.934 182.624 0 + vertex -184.884 182.827 0 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -184.971 182.418 -3 + vertex -184.934 182.624 0 + vertex -184.934 182.624 -3 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -184.971 182.418 -3 + vertex -184.971 182.418 0 + vertex -184.934 182.624 0 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -184.993 182.209 -3 + vertex -184.971 182.418 0 + vertex -184.971 182.418 -3 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -184.993 182.209 -3 + vertex -184.993 182.209 0 + vertex -184.971 182.418 0 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -185 182 -3 + vertex -184.993 182.209 0 + vertex -184.993 182.209 -3 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -185 182 -3 + vertex -185 182 0 + vertex -184.993 182.209 0 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -185 -182 -3 + vertex -185 182 0 + vertex -185 182 -3 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -185 -182 -3 + vertex -185 -182 0 + vertex -185 182 0 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -184.993 -182.209 -3 + vertex -185 -182 0 + vertex -185 -182 -3 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -184.993 -182.209 -3 + vertex -184.993 -182.209 0 + vertex -185 -182 0 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -184.971 -182.418 -3 + vertex -184.993 -182.209 0 + vertex -184.993 -182.209 -3 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -184.971 -182.418 -3 + vertex -184.971 -182.418 0 + vertex -184.993 -182.209 0 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -184.934 -182.624 -3 + vertex -184.971 -182.418 0 + vertex -184.971 -182.418 -3 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -184.934 -182.624 -3 + vertex -184.934 -182.624 0 + vertex -184.971 -182.418 0 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -184.884 -182.827 -3 + vertex -184.934 -182.624 0 + vertex -184.934 -182.624 -3 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -184.884 -182.827 -3 + vertex -184.884 -182.827 0 + vertex -184.934 -182.624 0 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -184.819 -183.026 -3 + vertex -184.884 -182.827 0 + vertex -184.884 -182.827 -3 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -184.819 -183.026 -3 + vertex -184.819 -183.026 0 + vertex -184.884 -182.827 0 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -184.741 -183.22 -3 + vertex -184.819 -183.026 0 + vertex -184.819 -183.026 -3 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -184.741 -183.22 -3 + vertex -184.741 -183.22 0 + vertex -184.819 -183.026 0 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -184.649 -183.408 -3 + vertex -184.741 -183.22 0 + vertex -184.741 -183.22 -3 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -184.649 -183.408 -3 + vertex -184.649 -183.408 0 + vertex -184.741 -183.22 0 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -184.544 -183.59 -3 + vertex -184.649 -183.408 0 + vertex -184.649 -183.408 -3 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -184.544 -183.59 -3 + vertex -184.544 -183.59 0 + vertex -184.649 -183.408 0 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -184.427 -183.763 -3 + vertex -184.544 -183.59 0 + vertex -184.544 -183.59 -3 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -184.427 -183.763 -3 + vertex -184.427 -183.763 0 + vertex -184.544 -183.59 0 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -184.298 -183.928 -3 + vertex -184.427 -183.763 0 + vertex -184.427 -183.763 -3 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -184.298 -183.928 -3 + vertex -184.298 -183.928 0 + vertex -184.427 -183.763 0 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -184.158 -184.084 -3 + vertex -184.298 -183.928 0 + vertex -184.298 -183.928 -3 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -184.158 -184.084 -3 + vertex -184.158 -184.084 0 + vertex -184.298 -183.928 0 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -184.007 -184.229 -3 + vertex -184.158 -184.084 0 + vertex -184.158 -184.084 -3 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -184.007 -184.229 -3 + vertex -184.007 -184.229 0 + vertex -184.158 -184.084 0 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -183.847 -184.364 -3 + vertex -184.007 -184.229 0 + vertex -184.007 -184.229 -3 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -183.847 -184.364 -3 + vertex -183.847 -184.364 0 + vertex -184.007 -184.229 0 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -183.678 -184.487 -3 + vertex -183.847 -184.364 0 + vertex -183.847 -184.364 -3 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -183.678 -184.487 -3 + vertex -183.678 -184.487 0 + vertex -183.847 -184.364 0 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -183.5 -184.598 -3 + vertex -183.678 -184.487 0 + vertex -183.678 -184.487 -3 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -183.5 -184.598 -3 + vertex -183.5 -184.598 0 + vertex -183.678 -184.487 0 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -183.315 -184.696 -3 + vertex -183.5 -184.598 0 + vertex -183.5 -184.598 -3 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -183.315 -184.696 -3 + vertex -183.315 -184.696 0 + vertex -183.5 -184.598 0 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -183.124 -184.782 -3 + vertex -183.315 -184.696 0 + vertex -183.315 -184.696 -3 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -183.124 -184.782 -3 + vertex -183.124 -184.782 0 + vertex -183.315 -184.696 0 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -182.927 -184.853 -3 + vertex -183.124 -184.782 0 + vertex -183.124 -184.782 -3 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -182.927 -184.853 -3 + vertex -182.927 -184.853 0 + vertex -183.124 -184.782 0 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -182.726 -184.911 -3 + vertex -182.927 -184.853 0 + vertex -182.927 -184.853 -3 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -182.726 -184.911 -3 + vertex -182.726 -184.911 0 + vertex -182.927 -184.853 0 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -182.521 -184.954 -3 + vertex -182.726 -184.911 0 + vertex -182.726 -184.911 -3 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -182.521 -184.954 -3 + vertex -182.521 -184.954 0 + vertex -182.726 -184.911 0 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -182.314 -184.984 -3 + vertex -182.521 -184.954 0 + vertex -182.521 -184.954 -3 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -182.314 -184.984 -3 + vertex -182.314 -184.984 0 + vertex -182.521 -184.954 0 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -182.105 -184.998 -3 + vertex -182.314 -184.984 0 + vertex -182.314 -184.984 -3 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -182.105 -184.998 -3 + vertex -182.105 -184.998 0 + vertex -182.314 -184.984 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -182.002 -184.998 -3 + vertex -182.105 -184.998 0 + vertex -182.105 -184.998 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -182.002 -184.998 -3 + vertex -182.002 -184.998 0 + vertex -182.105 -184.998 0 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -182 -185 -3 + vertex -182.002 -184.998 0 + vertex -182.002 -184.998 -3 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -182 -185 -3 + vertex -182 -185 0 + vertex -182.002 -184.998 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 182 -185 -3 + vertex -182 -185 0 + vertex -182 -185 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 182 -185 -3 + vertex 182 -185 0 + vertex -182 -185 0 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 182.002 -184.998 -3 + vertex 182 -185 0 + vertex 182 -185 -3 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 182.002 -184.998 -3 + vertex 182.002 -184.998 0 + vertex 182 -185 0 + endloop + endfacet +endsolid OpenSCAD_Model diff --git a/resources/profiles/LulzBot.ini b/resources/profiles/LulzBot.ini index 53151d8195..fdd673d256 100644 --- a/resources/profiles/LulzBot.ini +++ b/resources/profiles/LulzBot.ini @@ -4,7 +4,7 @@ # Vendor name will be shown by the Config Wizard. name = LulzBot config_version = 0.0.1 -config_update_url = http://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/LulzBot/ +config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/LulzBot/ [printer_model:MINI_AERO] name = Mini Aero diff --git a/resources/profiles/PrusaResearch.idx b/resources/profiles/PrusaResearch.idx index 3990bdd782..c01a9ddea8 100644 --- a/resources/profiles/PrusaResearch.idx +++ b/resources/profiles/PrusaResearch.idx @@ -1,4 +1,12 @@ min_slic3r_version = 2.2.0-alpha3 +1.1.10 Updated firmware version. +1.1.9 Updated K values in filament profiles (linear advance). Added new filament profiles and SLA materials. +1.1.8 Updated start/end g-code scripts for MK3 family printer profiles (reduced extruder motor current for some print profiles). Added new filament and SLA material profiles. +1.1.7 Updated end g-code for MMU2 Single printer profiles. Added/updated filament and SLA material profiles. +1.1.6 Updated firmware version for MK2.5/S and MK3/S. +1.1.5 Updated MMU1 specific retraction settings for Prusament PC Blend +1.1.4 Added Prusament PC Blend filament profile. +1.1.3 Added SLA material and filament profile 1.1.2 Added renamed_from fields for PETG filaments to indicate that they were renamed from PET. 1.1.1 Added Verbatim and Fiberlogy PETG filament profiles. Updated auto cooling settings for ABS. 1.1.1-beta Updated for PrusaSlicer 2.2.0-beta @@ -11,6 +19,8 @@ min_slic3r_version = 2.2.0-alpha0 1.1.1-alpha2 Bumped up config version, so our in house customer will get updated profiles. 1.1.0 Filament aliases, Creality profiles and other goodies for PrusaSlicer 2.2.0-alpha0 min_slic3r_version = 2.1.1-beta0 +1.0.10 Updated firmware version for MK2.5/S and MK3/S. +1.0.9 Updated firmware version for MK2.5/S and MK3/S. 1.0.8 Various changes in FFF profiles, new filaments/materials added. See changelog. 1.0.7 Updated layer height limits for MINI 1.0.6 Added Prusa MINI profiles @@ -27,6 +37,8 @@ min_slic3r_version = 2.1.0-alpha0 1.0.0-alpha1 Added Prusament ASA profile 1.0.0-alpha0 Filament specific retract for PET and similar copolymers, and for FLEX min_slic3r_version = 1.42.0-alpha6 +0.8.9 Updated firmware version for MK2.5/S and MK3/S. +0.8.8 Updated firmware version for MK2.5/S and MK3/S. 0.8.7 Updated firmware version 0.8.6 Updated firmware version for MK2.5/S and MK3/S 0.8.5 Updated SL1 printer and material settings @@ -53,6 +65,8 @@ min_slic3r_version = 1.42.0-alpha 0.4.0-alpha3 Update of SLA profiles 0.4.0-alpha2 First SLA profiles min_slic3r_version = 1.41.3-alpha +0.4.12 Updated firmware version for MK2.5/S and MK3/S. +0.4.11 Updated firmware version for MK2.5/S and MK3/S. 0.4.10 Updated firmware version 0.4.9 Updated firmware version for MK2.5/S and MK3/S 0.4.8 MK2.5/3/S FW update @@ -65,6 +79,7 @@ min_slic3r_version = 1.41.3-alpha 0.4.1 New MK2.5S and MK3S FW versions 0.4.0 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt min_slic3r_version = 1.41.1 +0.3.11 Updated firmware version for MK2.5/S and MK3/S. 0.3.10 Updated firmware version 0.3.9 Updated firmware version for MK2.5/S and MK3/S 0.3.8 MK2.5/3/S FW update @@ -123,4 +138,4 @@ min_slic3r_version = 1.40.0-alpha 0.1.3 Fixed an incorrect position of the max_print_height parameter 0.1.2 Wipe tower changes 0.1.1 Minor print speed adjustments -0.1.0 Initial \ No newline at end of file +0.1.0 Initial diff --git a/resources/profiles/PrusaResearch.ini b/resources/profiles/PrusaResearch.ini index cc22d50939..9e353e0fbc 100644 --- a/resources/profiles/PrusaResearch.ini +++ b/resources/profiles/PrusaResearch.ini @@ -5,10 +5,10 @@ name = Prusa Research # 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 = 1.1.2 +config_version = 1.1.10 # Where to get the updates from? -config_update_url = http://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/PrusaResearch/ -changelog_url = http://files.prusa3d.com/?latest=slicer-profiles&lng=%1% +config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/PrusaResearch/ +changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1% # The printer models will be shown by the Configuration Wizard in this order, # also the first model installed & the first nozzle installed will be activated after install. @@ -24,7 +24,7 @@ technology = FFF family = MINI bed_model = mini_bed.stl bed_texture = mini.svg -default_materials = Generic PLA; Generic ABS @MINI; Generic PETG @MINI; Prusament PLA; Prusament PETG @MINI; Prusament ASA @MINI +default_materials = Generic PLA; Generic ABS @MINI; Generic PETG @MINI; Prusament PLA; Prusament PETG @MINI; Prusament ASA @MINI; Prusament PC Blend @MINI [printer_model:MK3S] name = Original Prusa i3 MK3S @@ -33,7 +33,7 @@ technology = FFF family = MK3 bed_model = mk3_bed.stl bed_texture = mk3.svg -default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA; Prusament PETG; Prusament ASA +default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA; Prusament PETG; Prusament ASA; Prusament PC Blend [printer_model:MK3] name = Original Prusa i3 MK3 @@ -42,7 +42,7 @@ technology = FFF family = MK3 bed_model = mk3_bed.stl bed_texture = mk3.svg -default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA; Prusament PETG; Prusament ASA +default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA; Prusament PETG; Prusament ASA; Prusament PC Blend [printer_model:MK3SMMU2S] name = Original Prusa i3 MK3S MMU2S @@ -51,7 +51,7 @@ technology = FFF family = MK3 bed_model = mk3_bed.stl bed_texture = mk3.svg -default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA @MMU2; Prusament PETG @MMU2; Prusament ASA @MMU2; Verbatim BVOH @MMU2 +default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA @MMU2; Prusament PETG @MMU2; Prusament ASA @MMU2; Verbatim BVOH @MMU2; Prusament PC Blend @MMU2 [printer_model:MK3MMU2] name = Original Prusa i3 MK3 MMU2 @@ -60,7 +60,7 @@ technology = FFF family = MK3 bed_model = mk3_bed.stl bed_texture = mk3.svg -default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA @MMU2; Prusament PETG @MMU2; Prusament ASA @MMU2; Verbatim BVOH @MMU2 +default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA @MMU2; Prusament PETG @MMU2; Prusament ASA @MMU2; Verbatim BVOH @MMU2; Prusament PC Blend @MMU2 [printer_model:MK2.5S] name = Original Prusa i3 MK2.5S @@ -69,7 +69,7 @@ technology = FFF family = MK2.5 bed_model = mk3_bed.stl bed_texture = mk3.svg -default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA; Prusament PETG; Prusament ASA +default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA; Prusament PETG; Prusament ASA; Prusament PC Blend [printer_model:MK2.5] name = Original Prusa i3 MK2.5 @@ -78,7 +78,7 @@ technology = FFF family = MK2.5 bed_model = mk3_bed.stl bed_texture = mk3.svg -default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA; Prusament PETG; Prusament ASA +default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA; Prusament PETG; Prusament ASA; Prusament PC Blend [printer_model:MK2.5SMMU2S] name = Original Prusa i3 MK2.5S MMU2S @@ -87,7 +87,7 @@ technology = FFF family = MK2.5 bed_model = mk3_bed.stl bed_texture = mk3.svg -default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA @MMU2; Prusament PETG @MMU2; Prusament ASA @MMU2; Verbatim BVOH @MMU2 +default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA @MMU2; Prusament PETG @MMU2; Prusament ASA @MMU2; Verbatim BVOH @MMU2; Prusament PC Blend @MMU2 [printer_model:MK2.5MMU2] name = Original Prusa i3 MK2.5 MMU2 @@ -96,7 +96,7 @@ technology = FFF family = MK2.5 bed_model = mk3_bed.stl bed_texture = mk3.svg -default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA @MMU2; Prusament PETG @MMU2; Prusament ASA @MMU2; Verbatim BVOH @MMU2 +default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA @MMU2; Prusament PETG @MMU2; Prusament ASA @MMU2; Verbatim BVOH @MMU2; Prusament PC Blend @MMU2 [printer_model:MK2S] name = Original Prusa i3 MK2S @@ -105,7 +105,7 @@ technology = FFF family = MK2 bed_model = mk2_bed.stl bed_texture = mk2.svg -default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA; Prusament PETG; Prusament ASA +default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA; Prusament PETG; Prusament ASA; Prusament PC Blend [printer_model:MK2SMM] name = Original Prusa i3 MK2S MMU1 @@ -114,7 +114,7 @@ technology = FFF family = MK2 bed_model = mk2_bed.stl bed_texture = mk2.svg -default_materials = Generic PLA; Generic ABS; Generic PETG @MMU1; Prusament PLA; Prusament PETG @MMU1; Prusament ASA +default_materials = Generic PLA; Generic ABS; Generic PETG @MMU1; Prusament PLA; Prusament PETG @MMU1; Prusament ASA; Prusament PC Blend [printer_model:SL1] name = Original Prusa SL1 @@ -555,7 +555,7 @@ solid_infill_speed = 50 inherits = *0.10mm*; *MK3* # alias = 0.10mm DETAIL bridge_speed = 30 -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 and ! single_extruder_multi_material +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 external_perimeter_speed = 25 infill_acceleration = 1000 infill_speed = 80 @@ -689,6 +689,7 @@ support_material_extruder = 5 support_material_interface_extruder = 5 perimeter_speed = 40 solid_infill_speed = 40 +infill_speed = 80 top_infill_extrusion_width = 0.45 top_solid_infill_speed = 30 @@ -814,6 +815,7 @@ support_material_extruder = 5 support_material_interface_extruder = 5 perimeter_speed = 40 solid_infill_speed = 40 +infill_speed = 80 top_infill_extrusion_width = 0.45 top_solid_infill_speed = 30 @@ -1073,10 +1075,10 @@ max_print_speed = 100 perimeter_speed = 45 solid_infill_speed = 70 top_solid_infill_speed = 45 -external_perimeter_extrusion_width = 0.7 -perimeter_extrusion_width = 0.7 -infill_extrusion_width = 0.7 -solid_infill_extrusion_width = 0.7 +external_perimeter_extrusion_width = 0.68 +perimeter_extrusion_width = 0.68 +infill_extrusion_width = 0.68 +solid_infill_extrusion_width = 0.68 # XXXXXXXXXXXXXXXXXXXXXX # XXX----- MK2.5 ----XXX @@ -1095,6 +1097,12 @@ inherits = 0.15mm OPTIMAL compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and nozzle_diameter[0]==0.4 single_extruder_multi_material_priming = 0 +# MK2.5 MMU2 # +[print:0.10mm DETAIL @MK2.5] +inherits = 0.10mm DETAIL +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and nozzle_diameter[0]==0.4 and num_extruders>1 +single_extruder_multi_material_priming = 0 + # MK2.5 MMU2 # [print:0.15mm OPTIMAL SOLUBLE FULL @MK2.5] inherits = 0.15mm OPTIMAL SOLUBLE FULL @@ -1443,7 +1451,7 @@ first_layer_temperature = 215 max_fan_speed = 100 min_fan_speed = 100 temperature = 210 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{elsif nozzle_diameter[0]==0.6}18{else}30{endif} ; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.04{else}0.05{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K18{else}M900 K30{endif} ; Filament gcode LA 1.0" [filament:*PET*] inherits = *common* @@ -1459,7 +1467,7 @@ first_layer_bed_temperature = 85 first_layer_temperature = 230 max_fan_speed = 50 min_fan_speed = 30 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{elsif nozzle_diameter[0]==0.6}24{else}45{endif} ; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.04{else}0.08{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K24{else}M900 K45{endif} ; Filament gcode LA 1.0" temperature = 240 filament_retract_length = 1.4 filament_retract_lift = 0.2 @@ -1552,7 +1560,7 @@ first_layer_temperature = 255 max_fan_speed = 30 min_fan_speed = 20 temperature = 255 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{elsif nozzle_diameter[0]==0.6}18{else}30{endif} ; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.02{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" compatible_printers_condition = printer_model!="MINI" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) [filament:*ABSC*] @@ -1562,7 +1570,7 @@ bridge_fan_speed = 25 cooling = 1 disable_fan_first_layers = 4 fan_always_on = 0 -fan_below_layer_time = 20 +fan_below_layer_time = 30 slowdown_below_layer_time = 20 filament_colour = #FFF2EC filament_max_volumetric_speed = 11 @@ -1574,7 +1582,7 @@ max_fan_speed = 15 min_fan_speed = 15 min_print_speed = 15 temperature = 255 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{elsif nozzle_diameter[0]==0.6}18{else}30{endif} ; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.02{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" compatible_printers_condition = printer_model!="MINI" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) [filament:*FLEX*] @@ -1607,7 +1615,7 @@ inherits = *PLA* filament_vendor = ColorFabb compatible_printers_condition = nozzle_diameter[0]>0.35 and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) extrusion_multiplier = 1.2 -filament_cost = 72.89 +filament_cost = 49.99 filament_density = 3.9 filament_colour = #804040 filament_max_volumetric_speed = 9 @@ -1617,7 +1625,7 @@ inherits = *PLA* filament_vendor = ColorFabb compatible_printers_condition = nozzle_diameter[0]>0.35 and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) extrusion_multiplier = 1.2 -filament_cost = 72.89 +filament_cost = 49.99 filament_density = 3.13 filament_colour = #808080 filament_max_volumetric_speed = 8 @@ -1647,7 +1655,7 @@ first_layer_bed_temperature = 105 first_layer_temperature = 270 max_fan_speed = 20 min_fan_speed = 10 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}45{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.05{else}0.08{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K24{else}M900 K45{endif} ; Filament gcode LA 1.0" temperature = 270 [filament:ColorFabb PLA-PHA] @@ -1661,12 +1669,12 @@ inherits = *PLA* filament_vendor = ColorFabb compatible_printers_condition = nozzle_diameter[0]>0.35 and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) extrusion_multiplier = 1.1 -filament_cost = 58.30 +filament_cost = 38.99 filament_density = 1.15 filament_colour = #dfc287 filament_max_volumetric_speed = 9 first_layer_temperature = 200 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/}0{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}0{else}10{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.02{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" temperature = 200 filament_retract_lift = 0.2 @@ -1675,19 +1683,19 @@ inherits = *PLA* filament_vendor = ColorFabb compatible_printers_condition = nozzle_diameter[0]>0.35 and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) extrusion_multiplier = 1.1 -filament_cost = 58.30 +filament_cost = 38.99 filament_density = 1.18 filament_colour = #634d33 filament_max_volumetric_speed = 6 first_layer_temperature = 220 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/}0{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}0{else}10{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.02{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" temperature = 220 filament_retract_lift = 0.2 [filament:ColorFabb XT] inherits = *PET* filament_vendor = ColorFabb -filament_cost = 58.30 +filament_cost = 38.99 filament_density = 1.27 first_layer_bed_temperature = 90 first_layer_temperature = 260 @@ -1696,17 +1704,17 @@ temperature = 270 [filament:ColorFabb XT-CF20] inherits = *PET* filament_vendor = ColorFabb -extrusion_multiplier = 1.2 -filament_cost = 72.89 +extrusion_multiplier = 1.05 +filament_cost = 49.99 filament_density = 1.35 filament_colour = #804040 -filament_max_volumetric_speed = 1 +filament_max_volumetric_speed = 2 first_layer_bed_temperature = 90 first_layer_temperature = 260 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.04{else}0.06{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K18{else}M900 K30{endif} ; Filament gcode LA 1.0" temperature = 260 filament_retract_length = nil -filament_retract_lift = 0.2 +filament_retract_lift = 0.4 [filament:ColorFabb nGen] inherits = *PET* @@ -1742,6 +1750,41 @@ filament_retract_length = nil filament_retract_lift = 0 compatible_printers_condition = nozzle_diameter[0]>0.35 and printer_model!="MINI" and num_extruders==1 && ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and single_extruder_multi_material) +[filament:Kimya PETG Carbon] +inherits = *PET* +filament_vendor = Kimya +extrusion_multiplier = 1.05 +filament_cost = 150 +filament_density = 1.317 +filament_colour = #804040 +filament_max_volumetric_speed = 6 +first_layer_bed_temperature = 85 +first_layer_temperature = 240 +temperature = 240 +filament_retract_length = nil +filament_retract_lift = 0.3 +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.04{else}0.06{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K15{else}M900 K30{endif} ; Filament gcode LA 1.0" + +[filament:Kimya ABS Carbon] +inherits = *ABSC* +filament_vendor = Kimya +filament_cost = 140.4 +filament_density = 1.032 +filament_colour = #804040 +filament_max_volumetric_speed = 6 +first_layer_temperature = 260 +temperature = 260 + +[filament:Kimya ABS Kevlar] +inherits = *ABSC* +filament_vendor = Kimya +filament_cost = 140.4 +filament_density = 1.037 +filament_colour = #804040 +filament_max_volumetric_speed = 6 +first_layer_temperature = 260 +temperature = 260 + [filament:E3D Edge] inherits = *PET* filament_vendor = E3D @@ -1762,7 +1805,7 @@ temperature = 270 [filament:Fillamentum PLA] inherits = *PLA* filament_vendor = Fillamentum -filament_cost = 25.4 +filament_cost = 21.99 filament_density = 1.24 [filament:Fillamentum ABS] @@ -1801,17 +1844,77 @@ bed_temperature = 110 cooling = 1 min_fan_speed = 20 max_fan_speed = 20 +bridge_fan_speed = 30 min_print_speed = 15 slowdown_below_layer_time = 15 disable_fan_first_layers = 4 filament_type = ASA filament_colour = #FFF2EC -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{elsif nozzle_diameter[0]==0.6}12{else}20{endif} ; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.02{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" + +[filament:Prusament PC Blend] +inherits = *ABS* +filament_vendor = Prusa Polymers +filament_cost = 49.99 +filament_density = 1.22 +fan_always_on = 0 +first_layer_temperature = 275 +first_layer_bed_temperature = 110 +temperature = 275 +bed_temperature = 115 +cooling = 1 +min_fan_speed = 20 +max_fan_speed = 20 +bridge_fan_speed = 30 +min_print_speed = 15 +slowdown_below_layer_time = 20 +disable_fan_first_layers = 4 +fan_below_layer_time = 30 +filament_type = PC +filament_colour = #DEE0E6 +filament_max_volumetric_speed = 8 +filament_retract_length = 1 +filament_retract_lift = 0.2 +compatible_printers_condition = printer_notes!~/.*PRINTER_MODEL_MK(2|2.5).*/ and printer_model!="MINI" and ! single_extruder_multi_material +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.04{else}0.07{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K17{else}M900 K40{endif} ; Filament gcode LA 1.0" + +[filament:Prusament PC Blend @MK2] +inherits = *ABS* +filament_vendor = Prusa Polymers +filament_cost = 49.99 +filament_density = 1.22 +fan_always_on = 0 +first_layer_temperature = 275 +first_layer_bed_temperature = 105 +temperature = 275 +bed_temperature = 110 +cooling = 1 +min_fan_speed = 20 +max_fan_speed = 20 +min_print_speed = 15 +bridge_fan_speed = 30 +slowdown_below_layer_time = 20 +disable_fan_first_layers = 6 +fan_below_layer_time = 30 +filament_type = PC +filament_colour = #DEE0E6 +filament_max_volumetric_speed = 8 +filament_retract_length = 1 +filament_retract_lift = 0.2 +compatible_printers_condition = printer_model!="MK2SMM" and printer_notes=~/.*PRINTER_MODEL_MK(2|2.5).*/ and ! (printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and single_extruder_multi_material) +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.04{else}0.07{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K17{else}M900 K40{endif} ; Filament gcode LA 1.0" + +[filament:Prusament PC Blend @MK2MMU1] +inherits = Prusament PC Blend @MK2 +filament_retract_length = nil +filament_retract_lift = 0.2 +compatible_printers_condition = printer_model=="MK2SMM" +start_filament_gcode = "M900 K200 ; Filament gcode LA 1.0" [filament:Fillamentum CPE] inherits = *PET* filament_vendor = Fillamentum -filament_cost = 54.1 +filament_cost = 34.99 filament_density = 1.25 filament_type = CPE first_layer_bed_temperature = 90 @@ -1819,6 +1922,7 @@ first_layer_temperature = 275 max_fan_speed = 50 min_fan_speed = 50 temperature = 275 +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.04{else}0.07{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K24{else}M900 K45{endif} ; Filament gcode LA 1.0" [filament:Fillamentum Timberfill] inherits = *PLA* @@ -1830,7 +1934,7 @@ filament_density = 1.15 filament_colour = #804040 filament_max_volumetric_speed = 10 first_layer_temperature = 190 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/}0{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}0{else}10{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.02{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" temperature = 190 filament_retract_lift = 0.2 @@ -1844,7 +1948,7 @@ filament_density = 1.58 filament_colour = #804040 filament_max_volumetric_speed = 9 first_layer_temperature = 220 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/}0{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}0{else}10{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.02{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" temperature = 220 filament_retract_lift = 0.2 @@ -1870,7 +1974,14 @@ filament_density = 1.04 inherits = *ABSC* filament_vendor = Plasty Mladec filament_cost = 27.82 -filament_density = 1.04 +filament_density = 1.08 + +[filament:Verbatim ABS] +inherits = *ABSC* +filament_vendor = Verbatim +filament_cost = 25.87 +filament_density = 1.05 +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.03{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" [filament:Generic PETG] inherits = *PET* @@ -1891,6 +2002,28 @@ filament_vendor = Generic filament_cost = 25.4 filament_density = 1.24 +[filament:Devil Design PLA] +inherits = *PLA* +filament_vendor = Devil Design +filament_cost = 20.99 +filament_density = 1.24 + +[filament:Devil Design PETG] +inherits = *PET* +filament_vendor = Devil Design +filament_cost = 20.99 +filament_density = 1.23 +first_layer_temperature = 230 +first_layer_bed_temperature = 85 +temperature = 230 +bed_temperature = 90 + +[filament:Spectrum PLA] +inherits = *PLA* +filament_vendor = Spectrum +filament_cost = 21.50 +filament_density = 1.24 + [filament:Generic FLEX] inherits = *FLEX* filament_vendor = Generic @@ -1901,6 +2034,21 @@ filament_retract_length = 0 filament_retract_speed = nil filament_retract_lift = nil +[filament:Fillamentum Flexfill 92A] +inherits = *FLEX* +filament_vendor = Fillamentum +filament_cost = 33.99 +filament_density = 1.20 +filament_max_volumetric_speed = 1.2 +filament_retract_length = 0 +filament_retract_speed = nil +filament_retract_lift = nil +fan_always_on = 1 +cooling = 0 +max_fan_speed = 50 +min_fan_speed = 50 +disable_fan_first_layers = 5 + [filament:SainSmart TPU] inherits = *FLEX* filament_vendor = SainSmart @@ -1941,7 +2089,7 @@ bridge_fan_speed = 100 max_fan_speed = 50 min_fan_speed = 50 filament_retract_before_travel = 3 -filament_cost = 51.45 +filament_cost = 34.99 filament_density = 1.22 filament_retract_length = 2 filament_retract_speed = 50 @@ -1970,7 +2118,7 @@ filament_max_volumetric_speed = 8 [filament:PrimaSelect PVA+] inherits = *PLA* filament_vendor = PrimaSelect -filament_cost = 108 +filament_cost = 45.01 filament_density = 1.23 cooling = 0 fan_always_on = 0 @@ -1980,13 +2128,13 @@ filament_ramming_parameters = "120 100 8.3871 8.6129 8.93548 9.22581 9.48387 9.7 filament_soluble = 1 filament_type = PVA first_layer_temperature = 195 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/}0{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}0{else}10{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.02{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" temperature = 195 [filament:Prusa ABS] inherits = *ABSC* filament_vendor = Made for Prusa -filament_cost = 27.82 +filament_cost = 22.99 filament_density = 1.08 [filament:*ABS MMU2*] @@ -2006,6 +2154,32 @@ filament_unloading_speed = 20 inherits = *ABS MMU2* filament_vendor = Generic +[filament:Generic HIPS @MMU2] +inherits = *ABS MMU2* +filament_vendor = Generic +filament_cost = 27.3 +filament_density = 1.04 +fan_always_on = 1 +first_layer_temperature = 230 +first_layer_bed_temperature = 100 +temperature = 230 +bed_temperature = 110 +cooling = 1 +min_fan_speed = 20 +max_fan_speed = 20 +bridge_fan_speed = 50 +min_print_speed = 15 +slowdown_below_layer_time = 20 +disable_fan_first_layers = 3 +filament_cooling_final_speed = 2 +filament_cooling_initial_speed = 3 +filament_cooling_moves = 1 +filament_type = HIPS +filament_soluble = 1 +filament_colour = #FFFFD7 +filament_ramming_parameters = "130 120 2.74194 2.96774 3.25806 3.77419 4.83871 6.3871 8.09677 9.64516 10.7419 11.2903| 0.05 2.66451 0.45 3.05805 0.95 4.05807 1.45 7.13871 1.95 10.2806 2.45 11.4194 2.95 11.342 3.45 11.4065 3.95 7.6 4.45 7.6 4.95 7.6" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.03{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" + [filament:Prusament ASA @MMU2] inherits = *ABS MMU2* filament_vendor = Prusa Polymers @@ -2019,6 +2193,7 @@ bed_temperature = 110 cooling = 1 min_fan_speed = 20 max_fan_speed = 20 +bridge_fan_speed = 30 min_print_speed = 15 slowdown_below_layer_time = 15 disable_fan_first_layers = 4 @@ -2027,15 +2202,46 @@ filament_cooling_initial_speed = 3 filament_cooling_moves = 1 filament_type = ASA filament_colour = #FFF2EC -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{elsif nozzle_diameter[0]==0.6}12{else}20{endif} ; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.02{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" + +[filament:Prusament PC Blend @MMU2] +inherits = *ABS MMU2* +filament_vendor = Prusa Polymers +filament_cost = 49.99 +filament_density = 1.22 +fan_always_on = 0 +fan_below_layer_time = 30 +first_layer_temperature = 265 +first_layer_bed_temperature = 105 +temperature = 265 +bed_temperature = 110 +cooling = 1 +min_fan_speed = 20 +max_fan_speed = 20 +bridge_fan_speed = 30 +min_print_speed = 15 +slowdown_below_layer_time = 20 +disable_fan_first_layers = 4 +filament_cooling_final_speed = 2 +filament_cooling_initial_speed = 3 +filament_cooling_moves = 1 +filament_max_volumetric_speed = 8 +filament_retract_length = 1 +filament_retract_lift = 0.2 +filament_ramming_parameters = "130 120 2.70968 2.93548 3.32258 3.83871 4.58065 5.54839 6.51613 7.35484 7.93548 8.16129| 0.05 2.66451 0.45 3.05805 0.95 4.05807 1.45 5.97742 1.95 7.69999 2.45 8.1936 2.95 11.342 3.45 11.4065 3.95 7.6 4.45 7.6 4.95 7.6" +filament_type = PC +filament_colour = #DEE0E6 +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.04{else}0.07{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K17{else}M900 K40{endif} ; Filament gcode LA 1.0" [filament:Prusa ABS @MMU2] inherits = *ABS MMU2* filament_vendor = Made for Prusa +filament_cost = 22.99 [filament:Plasty Mladec ABS @MMU2] inherits = *ABS MMU2* filament_vendor = Plasty Mladec +filament_density = 1.08 [filament:Prusa HIPS] inherits = *ABS* @@ -2053,7 +2259,7 @@ filament_type = HIPS first_layer_temperature = 220 max_fan_speed = 20 min_fan_speed = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/}0{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}0{else}10{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.03{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" temperature = 220 [filament:Generic HIPS] @@ -2072,14 +2278,14 @@ filament_type = HIPS first_layer_temperature = 230 max_fan_speed = 20 min_fan_speed = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/}0{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}0{else}10{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.03{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" temperature = 230 [filament:Prusa PETG] inherits = *PET* renamed_from = "Prusa PET" filament_vendor = Made for Prusa -filament_cost = 27.82 +filament_cost = 22.99 filament_density = 1.27 compatible_printers_condition = nozzle_diameter[0]!=0.6 and printer_model!="MK2SMM" and printer_model!="MINI" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) @@ -2102,7 +2308,7 @@ inherits = *PET* filament_vendor = Prusa Polymers first_layer_temperature = 240 temperature = 250 -filament_cost = 24.99 +filament_cost = 29.99 filament_density = 1.27 filament_type = PETG compatible_printers_condition = nozzle_diameter[0]!=0.6 and printer_model!="MK2SMM" and printer_model!="MINI" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) @@ -2111,7 +2317,7 @@ compatible_printers_condition = nozzle_diameter[0]!=0.6 and printer_model!="MK2S inherits = *PET06* renamed_from = "Prusa PET 0.6 nozzle"; "Prusa PETG 0.6 nozzle" filament_vendor = Made for Prusa -filament_cost = 27.82 +filament_cost = 22.99 filament_density = 1.27 [filament:Prusament PETG @0.6 nozzle] @@ -2119,7 +2325,7 @@ inherits = *PET06* filament_vendor = Prusa Polymers first_layer_temperature = 240 temperature = 250 -filament_cost = 24.99 +filament_cost = 29.99 filament_density = 1.27 filament_type = PETG @@ -2132,6 +2338,17 @@ filament_cost = 27.92 filament_density = 1.27 filament_type = PETG +[filament:Devil Design PETG @0.6 nozzle] +inherits = *PET06* +filament_vendor = Devil Design +first_layer_temperature = 230 +first_layer_bed_temperature = 85 +temperature = 230 +bed_temperature = 90 +filament_cost = 20.99 +filament_density = 1.23 +filament_type = PETG + [filament:Verbatim PETG @0.6 nozzle] inherits = *PET06* filament_vendor = Verbatim @@ -2186,11 +2403,14 @@ filament_vendor = Plasty Mladec inherits = *PET MMU2* renamed_from = "Prusa PET MMU2"; "Prusa PETG MMU2" filament_vendor = Made for Prusa +filament_cost = 22.99 [filament:Prusament PETG @MMU2] inherits = *PET MMU2* filament_type = PETG filament_vendor = Prusa Polymers +filament_cost = 29.99 +filament_density = 1.27 [filament:Generic PETG @MMU2 0.6 nozzle] inherits = *PET MMU2 06* @@ -2206,6 +2426,8 @@ filament_vendor = Made for Prusa inherits = *PET MMU2 06* filament_type = PETG filament_vendor = Prusa Polymers +filament_cost = 29.99 +filament_density = 1.27 [filament:Plasty Mladec PETG @MMU2 0.6 nozzle] inherits = *PET MMU2 06* @@ -2215,7 +2437,7 @@ filament_vendor = Plasty Mladec [filament:Prusa PLA] inherits = *PLA* filament_vendor = Made for Prusa -filament_cost = 25.4 +filament_cost = 20.99 filament_density = 1.24 [filament:Fiberlogy PLA] @@ -2297,18 +2519,39 @@ filament_vendor = Generic [filament:Prusa PLA @MMU2] inherits = *PLA MMU2* filament_vendor = Made for Prusa +filament_cost = 20.99 [filament:Prusament PLA @MMU2] inherits = *PLA MMU2* filament_vendor = Prusa Polymers +filament_cost = 24.99 +filament_density = 1.24 + +[filament:Fillamentum PLA @MMU2] +inherits = *PLA MMU2* +filament_vendor = Fillamentum +filament_cost = 21.99 +filament_density = 1.24 [filament:SemiFlex or Flexfill 98A] inherits = *FLEX* filament_vendor = Generic -filament_cost = 82 +filament_cost = 33.99 filament_density = 1.22 filament_max_volumetric_speed = 1.35 +[filament:Fillamentum Flexfill 98A] +inherits = *FLEX* +filament_vendor = Fillamentum +filament_cost = 33.99 +filament_density = 1.23 +filament_max_volumetric_speed = 1.35 +fan_always_on = 1 +cooling = 0 +max_fan_speed = 50 +min_fan_speed = 50 +disable_fan_first_layers = 5 + [filament:Taulman Bridge] inherits = *common* filament_vendor = Taulman @@ -2321,14 +2564,38 @@ disable_fan_first_layers = 3 fan_always_on = 0 fan_below_layer_time = 20 filament_colour = #DEE0E6 -filament_max_volumetric_speed = 10 +filament_max_volumetric_speed = 7 filament_soluble = 0 filament_type = NYLON first_layer_bed_temperature = 60 first_layer_temperature = 240 -max_fan_speed = 5 +max_fan_speed = 0 min_fan_speed = 0 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/}0{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}0{else}10{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.04{else}0.08{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K24{else}M900 K45{endif} ; Filament gcode LA 1.0" +temperature = 250 + +[filament:Fillamentum Nylon FX256] +inherits = *common* +filament_vendor = Fillamentum +filament_cost = 56.99 +filament_density = 1.01 +bed_temperature = 90 +bridge_fan_speed = 30 +cooling = 1 +disable_fan_first_layers = 6 +fan_always_on = 0 +fan_below_layer_time = 20 +min_print_speed = 15 +slowdown_below_layer_time = 20 +filament_colour = #DEE0E6 +filament_max_volumetric_speed = 6 +filament_soluble = 0 +filament_type = NYLON +first_layer_bed_temperature = 90 +first_layer_temperature = 250 +max_fan_speed = 0 +min_fan_speed = 0 +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.05{else}0.1{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K28{else}M900 K48{endif} ; Filament gcode LA 1.0" temperature = 250 [filament:Taulman T-Glase] @@ -2343,7 +2610,7 @@ first_layer_bed_temperature = 90 first_layer_temperature = 240 max_fan_speed = 5 min_fan_speed = 0 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.04{else}0.06{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K18{else}M900 K30{endif} ; Filament gcode LA 1.0" [filament:Verbatim PLA] inherits = *PLA* @@ -2354,7 +2621,7 @@ filament_density = 1.24 [filament:Verbatim BVOH] inherits = *common* filament_vendor = Verbatim -filament_cost = 218 +filament_cost = 79.99 filament_density = 1.23 bed_temperature = 60 bridge_fan_speed = 100 @@ -2371,7 +2638,7 @@ first_layer_bed_temperature = 60 first_layer_temperature = 215 max_fan_speed = 100 min_fan_speed = 100 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/}0{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}0{else}10{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.02{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" temperature = 210 [filament:Verbatim BVOH @MMU2] @@ -2408,7 +2675,7 @@ filament_colour = #FFFFD7 filament_cooling_final_speed = 2 filament_cooling_initial_speed = 4 filament_cooling_moves = 2 -filament_cost = 25.4 +filament_cost = 45.01 filament_density = 1.24 filament_diameter = 1.75 filament_load_time = 15 @@ -2429,7 +2696,7 @@ max_fan_speed = 100 min_fan_speed = 100 min_print_speed = 15 slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.02{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" temperature = 195 [filament:Verbatim PP] @@ -2451,7 +2718,7 @@ first_layer_bed_temperature = 100 first_layer_temperature = 220 max_fan_speed = 100 min_fan_speed = 100 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/}0{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}0{else}10{endif}; Filament gcode" +start_filament_gcode = "M900 K0 ; Filament gcode" temperature = 220 ## Filaments MMU1 @@ -2478,7 +2745,7 @@ temperature = 270 inherits = *PETMMU1* filament_vendor = ColorFabb filament_type = PETG -filament_cost = 62.9 +filament_cost = 38.99 filament_density = 1.27 first_layer_bed_temperature = 90 first_layer_temperature = 260 @@ -2488,11 +2755,11 @@ temperature = 270 inherits = *PETMMU1* filament_vendor = ColorFabb compatible_printers_condition = nozzle_diameter[0]>0.35 and printer_model=="MK2SMM" -extrusion_multiplier = 1.2 -filament_cost = 80.65 +extrusion_multiplier = 1.05 +filament_cost = 49.99 filament_density = 1.35 filament_colour = #804040 -filament_max_volumetric_speed = 1 +filament_max_volumetric_speed = 2 first_layer_bed_temperature = 90 first_layer_temperature = 260 start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" @@ -2521,7 +2788,7 @@ filament_type = EDGE [filament:Fillamentum CPE @MMU1] inherits = *PETMMU1* filament_vendor = Fillamentum -filament_cost = 54.1 +filament_cost = 34.99 filament_density = 1.25 filament_type = CPE first_layer_bed_temperature = 90 @@ -2537,6 +2804,16 @@ filament_vendor = Generic filament_cost = 27.82 filament_density = 1.27 +[filament:Devil Design PETG @MMU1] +inherits = *PETMMU1* +filament_vendor = Devil Design +filament_cost = 20.99 +filament_density = 1.23 +first_layer_temperature = 230 +first_layer_bed_temperature = 85 +temperature = 230 +bed_temperature = 90 + [filament:Plasty Mladec PETG @MMU1] inherits = *PETMMU1* filament_vendor = Plasty Mladec @@ -2559,7 +2836,7 @@ filament_density = 1.27 inherits = *PETMMU1* renamed_from = "Prusa PET MMU1"; "Prusa PETG MMU1" filament_vendor = Made for Prusa -filament_cost = 27.82 +filament_cost = 22.99 filament_density = 1.27 [filament:Prusament PETG @MMU1] @@ -2567,7 +2844,7 @@ inherits = *PETMMU1* filament_vendor = Prusa Polymers first_layer_temperature = 240 temperature = 250 -filament_cost = 24.99 +filament_cost = 29.99 filament_density = 1.27 filament_type = PETG @@ -2617,6 +2894,17 @@ filament_cost = 27.82 filament_density = 1.27 compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.6 +[filament:Devil Design PETG @MINI] +inherits = Generic PETG; *PETMINI* +filament_vendor = Devil Design +filament_cost = 20.99 +filament_density = 1.23 +first_layer_temperature = 230 +first_layer_bed_temperature = 85 +temperature = 230 +bed_temperature = 90 +compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.6 + [filament:Plasty Mladec PETG @MINI] inherits = Generic PETG; *PETMINI* filament_vendor = Plasty Mladec @@ -2649,9 +2937,29 @@ min_fan_speed = 15 max_fan_speed = 15 slowdown_below_layer_time = 20 disable_fan_first_layers = 4 -fan_below_layer_time = 20 +fan_below_layer_time = 30 bridge_fan_speed = 25 +[filament:Kimya ABS Carbon @MINI] +inherits = *ABSMINI* +filament_vendor = Kimya +filament_cost = 140.4 +filament_density = 1.032 +filament_colour = #804040 +filament_max_volumetric_speed = 6 +first_layer_temperature = 260 +temperature = 260 + +[filament:Kimya ABS Kevlar @MINI] +inherits = *ABSMINI* +filament_vendor = Kimya +filament_cost = 140.4 +filament_density = 1.037 +filament_colour = #804040 +filament_max_volumetric_speed = 6 +first_layer_temperature = 260 +temperature = 260 + [filament:Esun ABS @MINI] inherits = Generic ABS; *ABSMINI* filament_vendor = Esun @@ -2663,7 +2971,7 @@ min_fan_speed = 15 max_fan_speed = 15 slowdown_below_layer_time = 20 disable_fan_first_layers = 4 -fan_below_layer_time = 20 +fan_below_layer_time = 30 bridge_fan_speed = 25 [filament:Hatchbox ABS @MINI] @@ -2677,7 +2985,7 @@ min_fan_speed = 15 max_fan_speed = 15 slowdown_below_layer_time = 20 disable_fan_first_layers = 4 -fan_below_layer_time = 20 +fan_below_layer_time = 30 bridge_fan_speed = 25 [filament:Plasty Mladec ABS @MINI] @@ -2691,7 +2999,21 @@ min_fan_speed = 15 max_fan_speed = 15 slowdown_below_layer_time = 20 disable_fan_first_layers = 4 -fan_below_layer_time = 20 +fan_below_layer_time = 30 +bridge_fan_speed = 25 + +[filament:Verbatim ABS @MINI] +inherits = Generic ABS; *ABSMINI* +filament_vendor = Verbatim +filament_cost = 25.87 +filament_density = 1.05 +fan_always_on = 0 +cooling = 1 +min_fan_speed = 15 +max_fan_speed = 15 +slowdown_below_layer_time = 20 +disable_fan_first_layers = 4 +fan_below_layer_time = 30 bridge_fan_speed = 25 [filament:Prusament PETG @MINI] @@ -2700,20 +3022,44 @@ filament_vendor = Prusa Polymers first_layer_temperature = 240 temperature = 250 filament_density = 1.27 -filament_cost = 24.99 +filament_cost = 29.99 compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.6 +[filament:Kimya PETG Carbon @MINI] +inherits = *PETMINI* +filament_vendor = Kimya +extrusion_multiplier = 1.05 +filament_cost = 150 +filament_density = 1.317 +filament_colour = #804040 +filament_max_volumetric_speed = 6 +first_layer_bed_temperature = 85 +first_layer_temperature = 240 +temperature = 240 +filament_retract_length = nil +filament_retract_lift = 0.3 + [filament:Prusament PETG @0.6 nozzle MINI] inherits = Prusament PETG; *PETMINI06* first_layer_temperature = 240 temperature = 250 filament_density = 1.27 -filament_cost = 24.99 +filament_cost = 29.99 [filament:Generic PETG @0.6 nozzle MINI] inherits = Generic PETG; *PETMINI06* renamed_from = "Generic PET 0.6 nozzle MINI"; "Generic PETG 0.6 nozzle MINI" +[filament:Devil Design PETG @0.6 nozzle MINI] +inherits = Generic PETG; *PETMINI06* +filament_vendor = Devil Design +first_layer_temperature = 230 +first_layer_bed_temperature = 85 +temperature = 230 +bed_temperature = 90 +filament_cost = 20.99 +filament_density = 1.23 + [filament:Plasty Mladec PETG @0.6 nozzle MINI] inherits = Generic PETG; *PETMINI06* filament_vendor = Plasty Mladec @@ -2736,6 +3082,7 @@ fan_always_on = 1 cooling = 1 min_fan_speed = 20 max_fan_speed = 20 +bridge_fan_speed = 30 min_print_speed = 15 slowdown_below_layer_time = 15 disable_fan_first_layers = 4 @@ -2750,6 +3097,7 @@ filament_vendor = Fillamentum first_layer_temperature = 240 temperature = 240 filament_max_volumetric_speed = 1.35 +filament_cost = 33.99 [filament:Generic FLEX @MINI] inherits = SemiFlex or Flexfill 98A; *FLEXMINI* @@ -2811,7 +3159,7 @@ min_fan_speed = 50 min_print_speed = 15 slowdown_below_layer_time = 10 cooling = 1 -filament_cost = 51.45 +filament_cost = 34.99 [filament:Fillamentum Flexfill 92A @MINI] inherits = *FLEXMINI* @@ -2843,7 +3191,7 @@ first_layer_temperature = 265 first_layer_bed_temperature = 90 temperature = 265 filament_type = CPE -filament_cost = 54.1 +filament_cost = 34.99 filament_density = 1.25 [filament:ColorFabb nGen @MINI] @@ -2866,7 +3214,7 @@ min_fan_speed = 15 max_fan_speed = 15 slowdown_below_layer_time = 20 disable_fan_first_layers = 4 -fan_below_layer_time = 20 +fan_below_layer_time = 30 bridge_fan_speed = 25 [filament:Fillamentum ASA @MINI] @@ -2900,10 +3248,38 @@ bridge_fan_speed = 0 filament_cost = 77.3 filament_density = 1.20 +[filament:Prusament PC Blend @MINI] +inherits = *ABSMINI* +filament_vendor = Prusa Polymers +filament_cost = 49.99 +filament_density = 1.22 +fan_always_on = 0 +first_layer_temperature = 275 +first_layer_bed_temperature = 100 +temperature = 275 +bed_temperature = 100 +cooling = 1 +min_fan_speed = 20 +max_fan_speed = 20 +bridge_fan_speed = 30 +min_print_speed = 15 +slowdown_below_layer_time = 20 +disable_fan_first_layers = 4 +fan_below_layer_time = 30 +filament_type = PC +filament_colour = #DEE0E6 +filament_max_volumetric_speed = 7 +filament_retract_length = nil +filament_retract_speed = nil +filament_deretract_speed = nil +filament_retract_lift = nil +filament_retract_before_travel = nil +filament_wipe = nil + [filament:Prusa ABS @MINI] inherits = *ABSMINI* filament_vendor = Made for Prusa -filament_cost = 27.82 +filament_cost = 22.99 filament_density = 1.08 fan_always_on = 0 cooling = 1 @@ -2911,7 +3287,7 @@ min_fan_speed = 15 max_fan_speed = 15 slowdown_below_layer_time = 20 disable_fan_first_layers = 4 -fan_below_layer_time = 20 +fan_below_layer_time = 30 bridge_fan_speed = 25 [filament:Generic HIPS @MINI] @@ -2953,7 +3329,7 @@ temperature = 270 inherits = *PETMINI* filament_vendor = ColorFabb filament_type = PETG -filament_cost = 62.9 +filament_cost = 38.99 filament_density = 1.27 first_layer_bed_temperature = 90 first_layer_temperature = 260 @@ -2963,11 +3339,11 @@ temperature = 270 inherits = *PETMINI* filament_vendor = ColorFabb compatible_printers_condition = nozzle_diameter[0]>0.35 and printer_model=="MINI" -extrusion_multiplier = 1.2 -filament_cost = 80.65 +extrusion_multiplier = 1.05 +filament_cost = 49.99 filament_density = 1.35 filament_colour = #804040 -filament_max_volumetric_speed = 1 +filament_max_volumetric_speed = 2 first_layer_bed_temperature = 90 first_layer_temperature = 260 temperature = 260 @@ -2996,7 +3372,7 @@ filament_type = EDGE inherits = *PETMINI* renamed_from = "Prusa PET MINI"; "Prusa PETG MINI" filament_vendor = Made for Prusa -filament_cost = 27.82 +filament_cost = 22.99 filament_density = 1.27 compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.6 @@ -3004,7 +3380,7 @@ compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0. inherits = *PETMINI06* renamed_from = "Prusa PET 0.6 nozzle MINI"; "Prusa PETG 0.6 nozzle MINI" filament_vendor = Made for Prusa -filament_cost = 27.82 +filament_cost = 22.99 filament_density = 1.27 [sla_print:*common*] @@ -3109,6 +3485,13 @@ initial_exposure_time = 30 material_type = Tough material_vendor = 3DM +[sla_material:3DM-HR Red Wine 0.025] +inherits = *common 0.025* +exposure_time = 14 +initial_exposure_time = 35 +material_type = Tough +material_vendor = 3DM + [sla_material:BlueCast Phrozen Wax @0.025] inherits = *common 0.025* exposure_time = 15 @@ -3116,6 +3499,13 @@ initial_exposure_time = 50 material_type = Tough material_vendor = BlueCast +[sla_material:BlueCast Castable Wax @0.025] +inherits = *common 0.025* +exposure_time = 8 +initial_exposure_time = 35 +material_type = Casting +material_vendor = BlueCast + [sla_material:BlueCast EcoGray @0.025] inherits = *common 0.025* exposure_time = 6 @@ -3130,6 +3520,13 @@ initial_exposure_time = 45 material_type = Dental material_vendor = BlueCast +[sla_material:BlueCast Model Dental Gray @0.025] +inherits = *common 0.025* +exposure_time = 6 +initial_exposure_time = 35 +material_type = Dental +material_vendor = BlueCast + [sla_material:BlueCast X10 @0.025] inherits = *common 0.025* exposure_time = 4 @@ -3137,6 +3534,13 @@ initial_exposure_time = 100 material_type = Tough material_vendor = BlueCast +[sla_material:DruckWege Type D High Temp @0.025] +inherits = *common 0.025* +exposure_time = 6 +initial_exposure_time = 20 +material_type = Tough +material_vendor = DruckWege + [sla_material:Esun Bio-Photopolymer Resin White @0.025] inherits = *common 0.025* exposure_time = 5 @@ -3144,6 +3548,48 @@ initial_exposure_time = 30 material_type = Tough material_vendor = Esun +[sla_material:FunToDo Castable Blend Red @0.025] +inherits = *common 0.025* +exposure_time = 10 +initial_exposure_time = 35 +material_type = Casting +material_vendor = FunToDo + +[sla_material:FunToDo Snow White @0.025] +inherits = *common 0.025* +exposure_time = 7 +initial_exposure_time = 35 +material_type = Tough +material_vendor = FunToDo + +[sla_material:Harz Labs Basic Resin Red @0.025] +inherits = *common 0.025* +exposure_time = 10 +initial_exposure_time = 20 +material_type = Tough +material_vendor = Harz Labs + +[sla_material:Harz Labs Model Resin Cherry @0.025] +inherits = *common 0.025* +exposure_time = 10 +initial_exposure_time = 20 +material_type = Tough +material_vendor = Harz Labs + +[sla_material:Harz Labs Model Resin Black @0.025] +inherits = *common 0.025* +exposure_time = 10 +initial_exposure_time = 20 +material_type = Tough +material_vendor = Harz Labs + +[sla_material:Harz Labs Dental Cast Red @0.025] +inherits = *common 0.025* +exposure_time = 10 +initial_exposure_time = 20 +material_type = Dental +material_vendor = Harz Labs + [sla_material:Esun Standard Resin Black @0.025] inherits = *common 0.025* exposure_time = 6 @@ -3171,6 +3617,20 @@ exposure_time = 17 initial_exposure_time = 30 material_type = Tough material_vendor = Resinworks 3D + +[sla_material:Monocure 3D Black Rapid Resin @0.025] +inherits = *common 0.025* +exposure_time = 4 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Monocure + +[sla_material:Monocure 3D Blue Rapid Resin @0.025] +inherits = *common 0.025* +exposure_time = 4 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Monocure ## Prusa [sla_material:Prusa Orange Tough @0.025] @@ -3194,6 +3654,12 @@ initial_exposure_time = 35 material_type = Tough material_vendor = Made for Prusa +## [sla_material:Prusa Blue Tough @0.025] +## inherits = *common 0.025* +## exposure_time = 5 +## initial_exposure_time = 35 +## material_type = Tough +## material_vendor = Made for Prusa [sla_material:Prusa Maroon Tough @0.025] inherits = *common 0.025* @@ -3251,10 +3717,12 @@ initial_exposure_time = 30 material_type = Tough material_vendor = Made for Prusa -## [sla_material:Prusa ABS like White @0.025] -## inherits = *common 0.025* -## exposure_time = 6 -## initial_exposure_time = 30 +[sla_material:Prusa White ABS like @0.025] +inherits = *common 0.025* +exposure_time = 5 +initial_exposure_time = 30 +material_type = Tough +material_vendor = Made for Prusa [sla_material:Prusa Grey High Tenacity @0.025] inherits = *common 0.025* @@ -3291,6 +3759,117 @@ initial_exposure_time = 30 material_type = Tough material_vendor = Made for Prusa +[sla_material:Prusa Vibrant Orange Tough @0.025] +inherits = *common 0.025* +exposure_time = 6 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Made for Prusa + +[sla_material:Siraya Tech Simple Clear @0.025] +inherits = *common 0.025* +exposure_time = 8 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:Siraya Tech Blu Clear V2 @0.025] +inherits = *common 0.025* +exposure_time = 9 +initial_exposure_time = 30 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:Siraya Tech Blu Blue @0.025] +inherits = *common 0.025* +exposure_time = 6 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:Siraya Tech Fast Grey @0.025] +inherits = *common 0.025* +exposure_time = 6 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:Siraya Tech Tenacious @0.025] +inherits = *common 0.025* +exposure_time = 6 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:Siraya Tech Easy @0.025] +inherits = *common 0.025* +exposure_time = 11 +initial_exposure_time = 15 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:Siraya Tech Sculpt @0.025] +inherits = *common 0.025* +exposure_time = 7 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:Siraya Tech Fast Black @0.025] +inherits = *common 0.025* +exposure_time = 6 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:NextDent Model 2.0 Grey @0.025] +inherits = *common 0.025* +exposure_time = 14 +initial_exposure_time = 35 +material_type = Dental +material_vendor = NextDent + +[sla_material:NextDent Surgical Guide @0.025] +inherits = *common 0.025* +exposure_time = 6 +initial_exposure_time = 35 +material_type = Dental +material_vendor = NextDent + +[sla_material:NextDent Cast Purple @0.025] +inherits = *common 0.025* +exposure_time = 7 +initial_exposure_time = 20 +material_type = Casting +material_vendor = NextDent + +[sla_material:MakerJuice Labs Standard Red @0.025] +inherits = *common 0.025* +exposure_time = 9 +initial_exposure_time = 35 +material_type = Tough +material_vendor = MakerJuice Labs + +[sla_material:3DJake High Precision Grey @0.025] +inherits = *common 0.025* +exposure_time = 8.5 +initial_exposure_time = 35 +material_type = Tough +material_vendor = 3DJake + +[sla_material:3DJake High Precision Blue @0.025] +inherits = *common 0.025* +exposure_time = 6.5 +initial_exposure_time = 35 +material_type = Tough +material_vendor = 3DJake + +[sla_material:Zortrax Black @0.025] +inherits = *common 0.025* +exposure_time = 4 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Zortrax ########### Materials 0.05 @@ -3301,6 +3880,13 @@ initial_exposure_time = 30 material_type = Dental material_vendor = Asiga +[sla_material:Asiga PlasGRAY @0.05] +inherits = *common 0.05* +exposure_time = 29 +initial_exposure_time = 60 +material_type = Tough +material_vendor = Asiga + [sla_material:Ameralabs AMD 3 LED @0.05] inherits = *common 0.05* exposure_time = 5 @@ -3322,6 +3908,13 @@ initial_exposure_time = 50 material_type = Dental material_vendor = BlueCast +[sla_material:BlueCast Model Dental Gray @0.05] +inherits = *common 0.05* +exposure_time = 8 +initial_exposure_time = 35 +material_type = Dental +material_vendor = BlueCast + [sla_material:BlueCast LCD-DLP Original @0.05] inherits = *common 0.05* exposure_time = 10 @@ -3336,6 +3929,13 @@ initial_exposure_time = 50 material_type = Tough material_vendor = BlueCast +[sla_material:BlueCast Castable Wax @0.05] +inherits = *common 0.05* +exposure_time = 11 +initial_exposure_time = 35 +material_type = Casting +material_vendor = BlueCast + [sla_material:BlueCast S+ @0.05] inherits = *common 0.05* exposure_time = 9 @@ -3364,17 +3964,24 @@ initial_exposure_time = 50 material_type = Tough material_vendor = BlueCast +[sla_material:DruckWege Type D High Temp @0.05] +inherits = *common 0.05* +exposure_time = 10 +initial_exposure_time = 20 +material_type = Tough +material_vendor = DruckWege + [sla_material:Monocure 3D Black Rapid Resin @0.05] inherits = *common 0.05* exposure_time = 6 -initial_exposure_time = 40 +initial_exposure_time = 35 material_type = Tough material_vendor = Monocure [sla_material:Monocure 3D Blue Rapid Resin @0.05] inherits = *common 0.05* exposure_time = 7 -initial_exposure_time = 40 +initial_exposure_time = 35 material_type = Tough material_vendor = Monocure @@ -3394,8 +4001,8 @@ material_vendor = Monocure [sla_material:Monocure 3D White Rapid Resin @0.05] inherits = *common 0.05* -exposure_time = 7 -initial_exposure_time = 40 +exposure_time = 10 +initial_exposure_time = 35 material_type = Tough material_vendor = Monocure @@ -3420,6 +4027,27 @@ initial_exposure_time = 30 material_type = Tough material_vendor = Esun +[sla_material:FunToDo Castable Blend Red @0.05] +inherits = *common 0.05* +exposure_time = 15 +initial_exposure_time = 35 +material_type = Casting +material_vendor = FunToDo + +[sla_material:FunToDo Industrial Blend Unpigmented @0.05] +inherits = *common 0.05* +exposure_time = 4 +initial_exposure_time = 35 +material_type = Tough +material_vendor = FunToDo + +[sla_material:FunToDo Snow White @0.05] +inherits = *common 0.05* +exposure_time = 10 +initial_exposure_time = 35 +material_type = Tough +material_vendor = FunToDo + [sla_material:3DM-ABS @0.05] inherits = *common 0.05* exposure_time = 13 @@ -3450,7 +4078,7 @@ material_vendor = 3DM [sla_material:3DM-HR Red Wine @0.05] inherits = *common 0.05* -exposure_time = 9 +exposure_time = 18 initial_exposure_time = 35 material_type = Tough material_vendor = 3DM @@ -3476,20 +4104,41 @@ initial_exposure_time = 30 material_type = Tough material_vendor = 3DM -[sla_material:FTD Ash Grey @0.05] +[sla_material:FunToDo Ash Grey @0.05] inherits = *common 0.05* exposure_time = 9 initial_exposure_time = 40 material_type = Tough -material_vendor = FTD +material_vendor = FunToDo [sla_material:Harz Labs Model Resin Cherry @0.05] inherits = *common 0.05* -exposure_time = 8 -initial_exposure_time = 45 +exposure_time = 13 +initial_exposure_time = 20 material_type = Tough material_vendor = Harz Labs +[sla_material:Harz Labs Basic Resin Red @0.05] +inherits = *common 0.05* +exposure_time = 13 +initial_exposure_time = 20 +material_type = Tough +material_vendor = Harz Labs + +[sla_material:Harz Labs Model Resin Black @0.05] +inherits = *common 0.05* +exposure_time = 13 +initial_exposure_time = 20 +material_type = Tough +material_vendor = Harz Labs + +[sla_material:Harz Labs Dental Cast Red @0.05] +inherits = *common 0.05* +exposure_time = 13 +initial_exposure_time = 20 +material_type = Dental +material_vendor = Harz Labs + [sla_material:Resinworks 3D Violet @0.05] inherits = *common 0.05* exposure_time = 17 @@ -3518,6 +4167,139 @@ initial_exposure_time = 30 material_type = Tough material_vendor = Photocentric +[sla_material:Siraya Tech Simple Clear @0.05] +inherits = *common 0.05* +exposure_time = 10 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:Siraya Tech Blu Clear V2 @0.05] +inherits = *common 0.05* +exposure_time = 10 +initial_exposure_time = 30 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:Siraya Tech Blu Blue @0.05] +inherits = *common 0.05* +exposure_time = 12 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:Siraya Tech Fast Grey @0.05] +inherits = *common 0.05* +exposure_time = 10 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:Siraya Tech Tenacious @0.05] +inherits = *common 0.05* +exposure_time = 8 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:Siraya Tech Easy @0.05] +inherits = *common 0.05* +exposure_time = 12 +initial_exposure_time = 15 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:Siraya Tech Sculpt @0.05] +inherits = *common 0.05* +exposure_time = 8 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:Siraya Tech Fast Black @0.05] +inherits = *common 0.05* +exposure_time = 9 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:NextDent Model 2.0 Grey @0.05] +inherits = *common 0.05* +exposure_time = 12 +initial_exposure_time = 35 +material_type = Dental +material_vendor = NextDent + +[sla_material:NextDent Surgical Guide @0.05] +inherits = *common 0.05* +exposure_time = 7 +initial_exposure_time = 35 +material_type = Dental +material_vendor = NextDent + +[sla_material:NextDent Cast Purple @0.05] +inherits = *common 0.05* +exposure_time = 9 +initial_exposure_time = 20 +material_type = Casting +material_vendor = NextDent + +[sla_material:NextDent Crown Bridge @0.05] +inherits = *common 0.05* +exposure_time = 11 +initial_exposure_time = 35 +material_type = Dental +material_vendor = NextDent + +[sla_material:MakerJuice Labs Standard Red @0.05] +inherits = *common 0.05* +exposure_time = 10 +initial_exposure_time = 35 +material_type = Tough +material_vendor = MakerJuice Labs + +[sla_material:3DJake High Precision Grey @0.05] +inherits = *common 0.05* +exposure_time = 9 +initial_exposure_time = 35 +material_type = Tough +material_vendor = 3DJake + +[sla_material:3DJake High Precision Blue @0.05] +inherits = *common 0.05* +exposure_time = 7 +initial_exposure_time = 35 +material_type = Tough +material_vendor = 3DJake + +[sla_material:Dragon Resin Metalshine Metal Grey @0.05] +inherits = *common 0.05* +exposure_time = 30 +initial_exposure_time = 50 +material_type = Tough +material_vendor = Dragon Resin + +[sla_material:Dragon Resin Metalshine Dark Brass @0.05] +inherits = *common 0.05* +exposure_time = 30 +initial_exposure_time = 50 +material_type = Tough +material_vendor = Dragon Resin + +[sla_material:Dragon Resin Metalshine Brass @0.05] +inherits = *common 0.05* +exposure_time = 30 +initial_exposure_time = 50 +material_type = Tough +material_vendor = Dragon Resin + +[sla_material:Zortrax Black @0.05] +inherits = *common 0.05* +exposure_time = 7 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Zortrax + ## Prusa [sla_material:Prusa Beige Tough @0.05] @@ -3658,6 +4440,13 @@ initial_exposure_time = 35 material_type = Tough material_vendor = Made for Prusa +## [sla_material:Prusa Blue Tough @0.05] +## inherits = *common 0.05* +## exposure_time = 8 +## initial_exposure_time = 35 +## material_type = Tough +## material_vendor = Made for Prusa + [sla_material:Prusa Transparent Tough @0.05] inherits = *common 0.05* exposure_time = 7 @@ -3706,10 +4495,12 @@ initial_exposure_time = 30 material_type = Tough material_vendor = Made for Prusa -## [sla_material:Prusa ABS like White @0.05] -## inherits = *common 0.05* -## exposure_time = 8 -## initial_exposure_time = 30 +[sla_material:Prusa White ABS like @0.05] +inherits = *common 0.05* +exposure_time = 8 +initial_exposure_time = 30 +material_type = Tough +material_vendor = Made for Prusa [sla_material:Prusa Yellow Jewelry Casting @0.05] inherits = *common 0.05* @@ -3725,6 +4516,13 @@ initial_exposure_time = 30 material_type = Tough material_vendor = Made for Prusa +[sla_material:Prusa Vibrant Orange Tough @0.05] +inherits = *common 0.05* +exposure_time = 7 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Made for Prusa + ########### Materials 0.035 [sla_material:Prusa Orange Tough @0.035] @@ -3822,13 +4620,20 @@ initial_exposure_time = 35 material_type = Tough material_vendor = Made for Prusa +[sla_material:Prusa Vibrant Orange Tough @0.1] +inherits = *common 0.1* +exposure_time = 8 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Made for Prusa + [printer:*common*] printer_technology = FFF bed_shape = 0x0,250x0,250x210,0x210 before_layer_gcode = ;BEFORE_LAYER_CHANGE\nG92 E0.0\n;[layer_z]\n\n between_objects_gcode = deretract_speed = 0 -end_gcode = G4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors +end_gcode = G4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM900 K0 ; reset LA\nM84 ; disable motors extruder_offset = 0x0 gcode_flavor = marlin silent_mode = 0 @@ -3907,7 +4712,7 @@ printer_model = MK2SMM [printer:*mm-single*] inherits = *multimaterial* -end_gcode = G1 E-4 F2100.00000\nG91\nG1 Z1 F7200.000\nG90\nG1 X245 Y1\nG1 X240 E4\nG1 F4000\nG1 X190 E2.7 \nG1 F4600\nG1 X110 E2.8\nG1 F5200\nG1 X40 E3 \nG1 E-15.0000 F5000\nG1 E-50.0000 F5400\nG1 E-15.0000 F3000\nG1 E-12.0000 F2000\nG1 F1600\nG1 X0 Y1 E3.0000\nG1 X50 Y1 E-5.0000\nG1 F2000\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-3.0000\nG4 S0\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nG28 X0 ; home X axis\nM84 ; disable motors\n\n +end_gcode = G1 E-4 F2100.00000\nG91\nG1 Z1 F7200.000\nG90\nG1 X245 Y1\nG1 X240 E4\nG1 F4000\nG1 X190 E2.7 \nG1 F4600\nG1 X110 E2.8\nG1 F5200\nG1 X40 E3 \nG1 E-15.0000 F5000\nG1 E-50.0000 F5400\nG1 E-15.0000 F3000\nG1 E-12.0000 F2000\nG1 F1600\nG1 X0 Y1 E3.0000\nG1 X50 Y1 E-5.0000\nG1 F2000\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-3.0000\nG4 S0\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nG28 X0 ; home X axis\nM900 K0 ; reset LA\nM84 ; disable motors\n\n 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_PRUSA3D\nPRINTER_MODEL_MK2\nPRINTER_HAS_BOWDEN start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.2.3 ; tell printer latest fw version\nM204 S[machine_max_acceleration_extruding] T[machine_max_acceleration_retracting] ; MK2 firmware only supports the old M204 format\n; Start G-Code sequence START\nT?\nM104 S[first_layer_temperature]\nM140 S[first_layer_bed_temperature]\nM109 S[first_layer_temperature]\nM190 S[first_layer_bed_temperature]\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG28 W\nG80\nG92 E0.0\nM203 E100\nM92 E140\nG1 Z0.250 F7200.000\nG1 X50.0 E80.0 F1000.0\nG1 X160.0 E20.0 F1000.0\nG1 Z0.200 F7200.000\nG1 X220.0 E13 F1000.0\nG1 X240.0 E0 F1000.0\nG92 E0.0 default_print_profile = 0.15mm OPTIMAL @@ -3915,7 +4720,7 @@ default_print_profile = 0.15mm OPTIMAL [printer:*mm-multi*] inherits = *multimaterial* high_current_on_filament_swap = 1 -end_gcode = {if not has_wipe_tower}\n; Pull the filament into the cooling tubes.\nG1 E-4 F2100.00000\nG91\nG1 Z1 F7200.000\nG90\nG1 X245 Y1\nG1 X240 E4\nG1 F4000\nG1 X190 E2.7 \nG1 F4600\nG1 X110 E2.8\nG1 F5200\nG1 X40 E3 \nG1 E-15.0000 F5000\nG1 E-50.0000 F5400\nG1 E-15.0000 F3000\nG1 E-12.0000 F2000\nG1 F1600\nG1 X0 Y1 E3.0000\nG1 X50 Y1 E-5.0000\nG1 F2000\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-3.0000\nG4 S0\n{endif}\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nG28 X0 ; home X axis\nM84 ; disable motors +end_gcode = {if not has_wipe_tower}\n; Pull the filament into the cooling tubes.\nG1 E-4 F2100.00000\nG91\nG1 Z1 F7200.000\nG90\nG1 X245 Y1\nG1 X240 E4\nG1 F4000\nG1 X190 E2.7 \nG1 F4600\nG1 X110 E2.8\nG1 F5200\nG1 X40 E3 \nG1 E-15.0000 F5000\nG1 E-50.0000 F5400\nG1 E-15.0000 F3000\nG1 E-12.0000 F2000\nG1 F1600\nG1 X0 Y1 E3.0000\nG1 X50 Y1 E-5.0000\nG1 F2000\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-3.0000\nG4 S0\n{endif}\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nG28 X0 ; home X axis\nM900 K0 ; reset LA\nM84 ; disable motors extruder_colour = #FFAA55;#E37BA0;#4ECDD3;#FB7259 nozzle_diameter = 0.4,0.4,0.4,0.4 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_PRUSA3D\nPRINTER_MODEL_MK2\nPRINTER_HAS_BOWDEN @@ -3989,21 +4794,21 @@ inherits = Original Prusa i3 MK2S printer_model = MK2.5 remaining_times = 1 machine_max_jerk_e = 4.5 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; 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 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; 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 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 [printer:Original Prusa i3 MK2.5 0.25 nozzle] inherits = Original Prusa i3 MK2S 0.25 nozzle printer_model = MK2.5 remaining_times = 1 machine_max_jerk_e = 4.5 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; 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 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; 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 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 [printer:Original Prusa i3 MK2.5 0.6 nozzle] inherits = Original Prusa i3 MK2S 0.6 nozzle printer_model = MK2.5 remaining_times = 1 machine_max_jerk_e = 4.5 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; 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 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; 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 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 [printer:Original Prusa i3 MK2.5 MMU2 Single] inherits = Original Prusa i3 MK2.5; *mm2* @@ -4032,8 +4837,8 @@ machine_min_travel_rate = 0 default_print_profile = 0.15mm OPTIMAL @MK2.5 default_filament_profile = Prusament PLA 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_PRUSA3D\nPRINTER_MODEL_MK2.5\n -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\n; select extruder\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; load to nozzle\nTc\n; purge line\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n -end_gcode = G1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\n; select extruder\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; load to nozzle\nTc\n; purge line\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n +end_gcode = {if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+10, max_print_height)}{endif} F720 ; Move print head up\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nM702 C\nG4 ; wait\nM104 S0 ; turn off temperature\nM900 K0 ; reset LA\nM84 ; disable motors [printer:Original Prusa i3 MK2.5 MMU2 Single 0.6 nozzle] inherits = Original Prusa i3 MK2.5S MMU2S Single 0.6 nozzle @@ -4074,23 +4879,23 @@ single_extruder_multi_material = 1 # to be defined explicitely. nozzle_diameter = 0.4,0.4,0.4,0.4,0.4 extruder_colour = #FF8000;#DB5182;#00FFFF;#FF4F4F;#9FFF9F -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; 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 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E32.0 F1073.0\nG1 X5.0 E32.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\nG92 E0.0\n -end_gcode = {if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors\n +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; 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 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E32.0 F1073.0\nG1 X5.0 E32.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\nG92 E0.0\n +end_gcode = {if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM900 K0 ; reset LA\nM84 ; disable motors\n [printer:Original Prusa i3 MK2.5S] inherits = Original Prusa i3 MK2.5 printer_model = MK2.5S -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; 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 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; 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 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 [printer:Original Prusa i3 MK2.5S 0.25 nozzle] inherits = Original Prusa i3 MK2.5 0.25 nozzle printer_model = MK2.5S -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; 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 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; 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 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 [printer:Original Prusa i3 MK2.5S 0.6 nozzle] inherits = Original Prusa i3 MK2.5 0.6 nozzle printer_model = MK2.5S -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; 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 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; 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 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 [printer:Original Prusa i3 MK2.5S MMU2S Single] inherits = Original Prusa i3 MK2.5; *mm2s* @@ -4119,8 +4924,8 @@ machine_min_travel_rate = 0 default_print_profile = 0.15mm OPTIMAL @MK2.5 default_filament_profile = Prusament PLA 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_PRUSA3D\nPRINTER_MODEL_MK2.5\n -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n -end_gcode = G1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n +end_gcode = {if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+10, max_print_height)}{endif} F720 ; Move print head up\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nM702 C\nG4 ; wait\nM104 S0 ; turn off temperature\nM900 K0 ; reset LA\nM84 ; disable motors [printer:Original Prusa i3 MK2.5S MMU2S Single 0.6 nozzle] inherits = Original Prusa i3 MK2.5S MMU2S Single @@ -4140,7 +4945,7 @@ nozzle_diameter = 0.25 printer_variant = 0.25 retract_lift = 0.15 default_print_profile = 0.10mm DETAIL 0.25 nozzle -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F1400.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F1400.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n [printer:Original Prusa i3 MK2.5S MMU2S] inherits = Original Prusa i3 MK2.5; *mm2s* @@ -4173,8 +4978,8 @@ single_extruder_multi_material = 1 # to be defined explicitely. nozzle_diameter = 0.4,0.4,0.4,0.4,0.4 extruder_colour = #FF8000;#DB5182;#00FFFF;#FF4F4F;#9FFF9F -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; 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 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E29.0 F1073.0\nG1 X5.0 E29.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\nG92 E0.0\n -end_gcode = {if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors\n +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; 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 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E29.0 F1073.0\nG1 X5.0 E29.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\nG92 E0.0\n +end_gcode = {if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM900 K0 ; reset LA\nM84 ; disable motors\n [printer:Original Prusa i3 MK2.5S MMU2S 0.6 nozzle] inherits = Original Prusa i3 MK2.5S MMU2S @@ -4198,13 +5003,13 @@ default_print_profile = 0.20mm NORMAL @0.6 nozzle [printer:Original Prusa i3 MK3] inherits = *common* -end_gcode = G4 ; wait\nM221 S100\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors +end_gcode = G4 ; wait\nM221 S100 ; reset flow\nM900 K0 ; reset LA\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|@0.25 nozzle MK3).*/}M907 E538 ; reset extruder motor current{endif}\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors machine_max_acceleration_e = 5000,5000 machine_max_acceleration_extruding = 1250,1250 machine_max_acceleration_retracting = 1250,1250 machine_max_acceleration_x = 1000,960 machine_max_acceleration_y = 1000,960 -machine_max_acceleration_z = 1000,1000 +machine_max_acceleration_z = 200,200 machine_max_feedrate_e = 120,120 machine_max_feedrate_x = 200,100 machine_max_feedrate_y = 200,100 @@ -4220,7 +5025,7 @@ remaining_times = 1 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_PRUSA3D\nPRINTER_MODEL_MK3\n retract_lift_below = 209 max_print_height = 210 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; 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 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif} +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; 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 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif}\n\n; Don't change E values below. Excessive value can damage the printer.\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3).*/}M907 E430 ; set extruder motor current{endif}\n{if print_settings_id=~/.*(SPEED @MK3|DRAFT @MK3).*/}M907 E538 ; set extruder motor current{endif} printer_model = MK3 default_print_profile = 0.15mm QUALITY @MK3 @@ -4231,7 +5036,7 @@ max_layer_height = 0.15 min_layer_height = 0.05 printer_variant = 0.25 retract_lift = 0.15 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; 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 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E8.0 F700.0 ; intro line\nG1 X100.0 E12.5 F700.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif} +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; 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 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E8.0 F700.0 ; intro line\nG1 X100.0 E12.5 F700.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif}\n\n; Don't change E value below. Excessive value can damage the printer.\n{if print_settings_id=~/.*@0.25 nozzle MK3.*/}M907 E430 ; set extruder motor current{endif} default_print_profile = 0.10mm DETAIL @0.25 nozzle MK3 [printer:Original Prusa i3 MK3 0.6 nozzle] @@ -4245,17 +5050,17 @@ default_print_profile = 0.30mm QUALITY @0.6 nozzle MK3 [printer:Original Prusa i3 MK3S] inherits = Original Prusa i3 MK3 printer_model = MK3S -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; 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 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif} +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; 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 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif}\n\n; Don't change E values below. Excessive value can damage the printer.\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3).*/}M907 E430 ; set extruder motor current{endif}\n{if print_settings_id=~/.*(SPEED @MK3|DRAFT @MK3).*/}M907 E538 ; set extruder motor current{endif} [printer:Original Prusa i3 MK3S 0.25 nozzle] inherits = Original Prusa i3 MK3 0.25 nozzle printer_model = MK3S -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; 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 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E8.0 F700.0 ; intro line\nG1 X100.0 E12.5 F700.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif} +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; 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 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E8.0 F700.0 ; intro line\nG1 X100.0 E12.5 F700.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif}\n\n; Don't change E value below. Excessive value can damage the printer.\n{if print_settings_id=~/.*@0.25 nozzle MK3.*/}M907 E430 ; set extruder motor current{endif} [printer:Original Prusa i3 MK3S 0.6 nozzle] inherits = Original Prusa i3 MK3 0.6 nozzle printer_model = MK3S -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; 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 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif} +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; 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 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif} [printer:*mm2*] inherits = Original Prusa i3 MK3 @@ -4285,8 +5090,8 @@ default_filament_profile = Prusament PLA @MMU2 inherits = *mm2* single_extruder_multi_material = 0 default_filament_profile = Prusament PLA -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n -end_gcode = G1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n\n; Don't change E values below. Excessive value can damage the printer.\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3).*/}M907 E430 ; set extruder motor current{endif}\n{if print_settings_id=~/.*(SPEED @MK3|DRAFT @MK3).*/}M907 E538 ; set extruder motor current{endif} +end_gcode = {if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+10, max_print_height)}{endif} F720 ; Move print head up\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nM702 C\nG4 ; wait\nM221 S100 ; reset flow\nM900 K0 ; reset LA\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|@0.25 nozzle MK3).*/}M907 E538 ; reset extruder motor current{endif}\nM104 S0 ; turn off temperature\nM84 ; disable motors [printer:Original Prusa i3 MK3 MMU2 Single 0.6 nozzle] inherits = Original Prusa i3 MK3 MMU2 Single @@ -4295,6 +5100,7 @@ nozzle_diameter = 0.6 max_layer_height = 0.40 min_layer_height = 0.15 printer_variant = 0.6 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0 default_print_profile = 0.30mm QUALITY @0.6 nozzle MK3 [printer:Original Prusa i3 MK3 MMU2 Single 0.25 nozzle] @@ -4305,7 +5111,7 @@ max_layer_height = 0.15 min_layer_height = 0.05 printer_variant = 0.25 retract_lift = 0.15 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 E8.0 F1000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F1400.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 E8.0 F1000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F1400.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n\n; Don't change E value below. Excessive value can damage the printer.\n{if print_settings_id=~/.*@0.25 nozzle MK3.*/}M907 E430 ; set extruder motor current{endif} default_print_profile = 0.10mm DETAIL @0.25 nozzle MK3 [printer:Original Prusa i3 MK3 MMU2] @@ -4316,15 +5122,15 @@ inherits = *mm2* machine_max_acceleration_e = 8000,8000 nozzle_diameter = 0.4,0.4,0.4,0.4,0.4 extruder_colour = #FF8000;#DB5182;#00FFFF;#FF4F4F;#9FFF9F -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; 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 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E32.0 F1073.0\nG1 X5.0 E32.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n -end_gcode = {if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors\n +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; 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 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E32.0 F1073.0\nG1 X5.0 E32.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n\n; Don't change E values below. Excessive value can damage the printer.\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|SOLUBLE).*/}M907 E430 ; set extruder motor current{endif}\n{if print_settings_id=~/.*(SPEED @MK3|DRAFT @MK3).*/}M907 E538 ; set extruder motor current{endif} +end_gcode = {if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM221 S100 ; reset flow\nM900 K0 ; reset LA\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|SOLUBLE|@0.25 nozzle MK3).*/}M907 E538 ; reset extruder motor current{endif}\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors\n [printer:Original Prusa i3 MK3S MMU2S Single] inherits = *mm2s* single_extruder_multi_material = 0 default_filament_profile = Prusament PLA -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n -end_gcode = G1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n\n; Don't change E values below. Excessive value can damage the printer.\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3).*/}M907 E430 ; set extruder motor current{endif}\n{if print_settings_id=~/.*(SPEED @MK3|DRAFT @MK3).*/}M907 E538 ; set extruder motor current{endif} +end_gcode = {if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+10, max_print_height)}{endif} F720 ; Move print head up\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nM702 C\nG4 ; wait\nM221 S100 ; reset flow\nM900 K0 ; reset LA\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|@0.25 nozzle MK3).*/}M907 E538 ; reset extruder motor current{endif}\nM104 S0 ; turn off temperature\nM84 ; disable motors [printer:Original Prusa i3 MK3S MMU2S Single 0.6 nozzle] inherits = Original Prusa i3 MK3S MMU2S Single @@ -4333,6 +5139,7 @@ nozzle_diameter = 0.6 max_layer_height = 0.40 min_layer_height = 0.15 printer_variant = 0.6 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0 default_print_profile = 0.30mm QUALITY @0.6 nozzle MK3 [printer:Original Prusa i3 MK3S MMU2S Single 0.25 nozzle] @@ -4343,7 +5150,7 @@ max_layer_height = 0.15 min_layer_height = 0.05 printer_variant = 0.25 retract_lift = 0.15 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F1400.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F1400.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n\n; Don't change E value below. Excessive value can damage the printer.\n{if print_settings_id=~/.*@0.25 nozzle MK3.*/}M907 E430 ; set extruder motor current{endif} default_print_profile = 0.10mm DETAIL @0.25 nozzle MK3 [printer:Original Prusa i3 MK3S MMU2S] @@ -4351,8 +5158,8 @@ inherits = *mm2s* machine_max_acceleration_e = 8000,8000 nozzle_diameter = 0.4,0.4,0.4,0.4,0.4 extruder_colour = #FF8000;#DB5182;#00FFFF;#FF4F4F;#9FFF9F -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; 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 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E29.0 F1073.0\nG1 X5.0 E29.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n -end_gcode = {if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors\n +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; 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 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E29.0 F1073.0\nG1 X5.0 E29.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n\n; Don't change E values below. Excessive value can damage the printer.\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|SOLUBLE).*/}M907 E430 ; set extruder motor current{endif}\n{if print_settings_id=~/.*(SPEED @MK3|DRAFT @MK3).*/}M907 E538 ; set extruder motor current{endif} +end_gcode = {if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM221 S100 ; reset flow\nM900 K0 ; reset LA\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|SOLUBLE|@0.25 nozzle MK3).*/}M907 E538 ; reset extruder motor current{endif}\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors\n ## 0.6mm nozzle MMU2/S printer profiles @@ -4362,6 +5169,7 @@ nozzle_diameter = 0.6,0.6,0.6,0.6,0.6 max_layer_height = 0.40 min_layer_height = 0.15 printer_variant = 0.6 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; 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 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E29.0 F1073.0\nG1 X5.0 E29.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0 default_print_profile = 0.30mm QUALITY @0.6 nozzle MK3 [printer:Original Prusa i3 MK3 MMU2 0.6 nozzle] @@ -4370,6 +5178,7 @@ nozzle_diameter = 0.6,0.6,0.6,0.6,0.6 max_layer_height = 0.40 min_layer_height = 0.15 printer_variant = 0.6 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; 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 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E32.0 F1073.0\nG1 X5.0 E32.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0 default_print_profile = 0.30mm QUALITY @0.6 nozzle MK3 ## MINI @@ -4418,7 +5227,7 @@ retract_layer_change = 0 silent_mode = 0 remaining_times = 1 start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S170 ; set extruder temp for bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nM109 R170 ; wait for bed leveling temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nG28 ; home all without mesh bed level\nG29 ; mesh bed leveling \nM104 S[first_layer_temperature] ; set extruder temp\nG92 E0.0\nG1 Y-2.0 X179 F2400\nG1 Z3 F720\nM109 S[first_layer_temperature] ; wait for extruder temp\n\n; intro line\nG1 X170 F1000\nG1 Z0.2 F720\nG1 X110.0 E8.0 F900\nG1 X40.0 E10.0 F700\nG92 E0.0\n\nM221 S95 ; set flow -end_gcode = G1 E-1 F2100 ; retract\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+5, max_print_height)}{endif} F720 ; Move print head up\nG1 X178 Y180 F4200 ; park print head\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nM221 S100 ; reset flow\nM84 ; disable motors +end_gcode = G1 E-1 F2100 ; retract\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+2, max_print_height)}{endif} F720 ; Move print head up\nG1 X178 Y180 F4200 ; park print head\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} F720 ; Move print head further up\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nM221 S100 ; reset flow\nM900 K0 ; reset LA\nM84 ; disable motors 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_PRUSA3D\nPRINTER_MODEL_MINI\n extruder_colour = @@ -4457,7 +5266,7 @@ retract_before_travel = 1.5 printer_technology = SLA printer_model = SL1 printer_variant = default -default_sla_material_profile = Prusa Orange Tough 0.05 +default_sla_material_profile = Prusa Orange Tough @0.05 default_sla_print_profile = 0.05 Normal thumbnails = 400x400,800x480 bed_shape = 1.48x1.02,119.48x1.02,119.48x67.02,1.48x67.02 diff --git a/resources/profiles/TriLAB.idx b/resources/profiles/TriLAB.idx index a43bf4e004..eda36c227e 100644 --- a/resources/profiles/TriLAB.idx +++ b/resources/profiles/TriLAB.idx @@ -1,2 +1,3 @@ -min_slic3r_version = 2.3.0-alpha0 -0.0.1 Initial TriLAB bundle +min_slic3r_version = 2.3.0-alpha0 +0.0.2 Added 0.15mm print profile +0.0.1 Initial TriLAB bundle diff --git a/resources/profiles/TriLAB.ini b/resources/profiles/TriLAB.ini index 2412cf1159..1c9bda0c12 100644 --- a/resources/profiles/TriLAB.ini +++ b/resources/profiles/TriLAB.ini @@ -4,13 +4,13 @@ [vendor] # Vendor name will be shown by the Config Wizard. -name = TRILAB +name = TriLAB # 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.1 +config_version = 0.0.2 # Where to get the updates from? -config_update_url = http://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/TriLAB/ -# changelog_url = http://files.prusa3d.com/?latest=slicer-profiles&lng=%1% +config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/TriLAB/ +# changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1% # The printer models will be shown by the Configuration Wizard in this order, # also the first model installed & the first nozzle installed will be activated after install. @@ -43,10 +43,15 @@ default_materials = DeltiQ PLA; DeltiQ ASA; DeltiQ PET; DeltiQ ABS; DeltiQ CPE # All presets starting with asterisk, for example *common*, are intermediate and they will # not make it into the user interface. +[print:DeltiQ 0.15mm] +inherits = DeltiQ 0.2mm +layer_height = 0.15 +bottom_solid_layers = 5 +top_solid_layers = 6 [print:DeltiQ 0.2mm] avoid_crossing_perimeters = 0 -bottom_solid_layers = 3 +bottom_solid_layers = 4 bridge_acceleration = 1000 bridge_angle = 0 bridge_flow_ratio = 0.95 @@ -143,7 +148,7 @@ thin_walls = 0 threads = 4 top_infill_extrusion_width = 0.4 top_solid_infill_speed = 30 -top_solid_layers = 4 +top_solid_layers = 5 travel_speed = 150 wipe_tower = 0 wipe_tower_bridging = 10 @@ -254,7 +259,6 @@ extra_loading_move = -2 extruder_colour = "" extruder_offset = 0x0 gcode_flavor = repetier -host_type = octoprint layer_gcode = ;AFTER_LAYER_CHANGE\nM117 layer [layer_num] at [layer_z]mm\n;[layer_z]\n machine_max_acceleration_e = 10000,5000 machine_max_acceleration_extruding = 1500,1250 @@ -277,14 +281,11 @@ max_print_height = 320 min_layer_height = 0.15 nozzle_diameter = 0.4 parking_pos_retraction = 92 -print_host = printer_model = printer_notes = TRILAB printer_settings_id = printer_variant = printer_vendor = -printhost_apikey = -printhost_cafile = remaining_times = 0 retract_before_travel = 2 retract_before_wipe = 100% @@ -297,8 +298,6 @@ retract_lift_below = 0 retract_restart_extra = 0 retract_restart_extra_toolchange = 0 retract_speed = 33 -serial_port = -serial_speed = 250000 silent_mode = 1 single_extruder_multi_material = 0 start_gcode = ;START\nM220 S100 ; Set feedmultiply back to 100percent\nG90 ; Absolute positioning\nM83 ; Relative extruder\nM107 ; Layer fan OFF\nM190 S[first_layer_bed_temperature] ; Set bed temperature and wait\nM104 S[first_layer_temperature] ; Set extruder temperature\nG28 ; Home all axes\nG33 ; auto leveling rutine\nG1 X-62 Y-108 Z0.3 F6000 ; Go to purge position start\nG92 E0 ; Zero extruder\nM109 S[first_layer_temperature] ; Set and wait - hotend temperature\nG3 X62 Y-108 I62 J108 E10 F200 ; Go ARC to purge end\nG92 E0 ; Zero extruder diff --git a/resources/shaders/gouraud.fs b/resources/shaders/gouraud.fs index 45175acc21..b1a8d6ac28 100644 --- a/resources/shaders/gouraud.fs +++ b/resources/shaders/gouraud.fs @@ -9,8 +9,7 @@ const float EPSILON = 0.0001; struct SlopeDetection { bool actived; - // x = yellow, y = red - vec2 z_range; + float normal_z; mat3 volume_world_normal_matrix; }; @@ -33,8 +32,7 @@ varying vec3 eye_normal; vec3 slope_color() { - float gradient_range = slope.z_range.x - slope.z_range.y; - return (world_normal_z > slope.z_range.x - EPSILON) ? GREEN : ((gradient_range == 0.0) ? RED : mix(RED, YELLOW, clamp((world_normal_z - slope.z_range.y) / gradient_range, 0.0, 1.0))); + return (world_normal_z > slope.normal_z - EPSILON) ? GREEN : RED; } void main() diff --git a/resources/shaders/gouraud.vs b/resources/shaders/gouraud.vs index d60f6eae8a..ed7e3f56ba 100644 --- a/resources/shaders/gouraud.vs +++ b/resources/shaders/gouraud.vs @@ -29,8 +29,7 @@ struct PrintBoxDetection struct SlopeDetection { bool actived; - // x = yellow, y = red - vec2 z_range; + float normal_z; mat3 volume_world_normal_matrix; }; diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ca57ca5531..c93d95946c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.8) +cmake_minimum_required(VERSION 3.13) project(PrusaSlicer-native) add_subdirectory(build-utils) @@ -204,11 +204,11 @@ if (WIN32) VERBATIM ) endif () - + # This has to be a separate target due to the windows command line lenght limits add_custom_target(PrusaSlicerDllsCopy ALL DEPENDS PrusaSlicer) prusaslicer_copy_dlls(PrusaSlicerDllsCopy) - + else () if (APPLE) # On OSX, the name of the binary matches the name of the Application. @@ -247,4 +247,7 @@ if (WIN32) endif () else () install(TARGETS PrusaSlicer RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") + + # Install the symlink for gcodeviewer + install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink prusa-slicer prusa-gcodeviewer WORKING_DIRECTORY ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR})") endif () diff --git a/src/PrusaSlicer.cpp b/src/PrusaSlicer.cpp index d79196cfa1..0ed719c993 100644 --- a/src/PrusaSlicer.cpp +++ b/src/PrusaSlicer.cpp @@ -45,23 +45,21 @@ #include "libslic3r/Format/OBJ.hpp" #include "libslic3r/Format/SL1.hpp" #include "libslic3r/Utils.hpp" -#include "libslic3r/AppConfig.hpp" +#include "libslic3r/Thread.hpp" #include "PrusaSlicer.hpp" #ifdef SLIC3R_GUI - #include "slic3r/GUI/GUI.hpp" - #include "slic3r/GUI/GUI_App.hpp" - #include "slic3r/GUI/3DScene.hpp" - #include "slic3r/GUI/InstanceCheck.hpp" - #include "slic3r/GUI/MainFrame.hpp" - #include "slic3r/GUI/Plater.hpp" + #include "slic3r/GUI/GUI_Init.hpp" #endif /* SLIC3R_GUI */ using namespace Slic3r; int CLI::run(int argc, char **argv) { + // Mark the main thread for the debugger and for runtime checks. + set_current_thread_name("slic3r_main"); + #ifdef __WXGTK__ // On Linux, wxGTK has no support for Wayland, and the app crashes on // startup if gtk3 is used. This env var has to be set explicitly to @@ -154,6 +152,15 @@ int CLI::run(int argc, char **argv) // Read input file(s) if any. #if ENABLE_GCODE_VIEWER + for (const std::string& file : m_input_files) { + std::string ext = boost::filesystem::path(file).extension().string(); + if (ext == ".gcode" || ext == ".g") { + if (boost::filesystem::exists(file)) { + start_as_gcodeviewer = true; + break; + } + } + } if (!start_as_gcodeviewer) { #endif // ENABLE_GCODE_VIEWER for (const std::string& file : m_input_files) { @@ -509,9 +516,12 @@ int CLI::run(int argc, char **argv) outfile_final = sla_print.print_statistics().finalize_output_path(outfile); sla_archive.export_print(outfile_final, sla_print); } - if (outfile != outfile_final && Slic3r::rename_file(outfile, outfile_final)) { - boost::nowide::cerr << "Renaming file " << outfile << " to " << outfile_final << " failed" << std::endl; - return 1; + if (outfile != outfile_final) { + if (Slic3r::rename_file(outfile, outfile_final)) { + boost::nowide::cerr << "Renaming file " << outfile << " to " << outfile_final << " failed" << std::endl; + return 1; + } + outfile = outfile_final; } boost::nowide::cout << "Slicing result exported to " << outfile << std::endl; } catch (const std::exception &ex) { @@ -562,66 +572,20 @@ int CLI::run(int argc, char **argv) if (start_gui) { #ifdef SLIC3R_GUI -// #ifdef USE_WX -#if ENABLE_GCODE_VIEWER - GUI::GUI_App* gui = new GUI::GUI_App(start_as_gcodeviewer ? GUI::GUI_App::EAppMode::GCodeViewer : GUI::GUI_App::EAppMode::Editor); -#else - GUI::GUI_App *gui = new GUI::GUI_App(); -#endif // ENABLE_GCODE_VIEWER - - bool gui_single_instance_setting = gui->app_config->get("single_instance") == "1"; - if (Slic3r::instance_check(argc, argv, gui_single_instance_setting)) { - //TODO: do we have delete gui and other stuff? - return -1; - } - -// gui->autosave = m_config.opt_string("autosave"); - GUI::GUI_App::SetInstance(gui); -#if ENABLE_GCODE_VIEWER - gui->CallAfter([gui, this, &load_configs, start_as_gcodeviewer] { -#else - gui->CallAfter([gui, this, &load_configs] { -#endif // ENABLE_GCODE_VIEWER - if (!gui->initialized()) { - return; - } - -#if ENABLE_GCODE_VIEWER - if (start_as_gcodeviewer) { - if (!m_input_files.empty()) - gui->plater()->load_gcode(wxString::FromUTF8(m_input_files[0].c_str())); - } else { -#endif // ENABLE_GCODE_VIEWER_AS -#if 0 - // Load the cummulative config over the currently active profiles. - //FIXME if multiple configs are loaded, only the last one will have an effect. - // We need to decide what to do about loading of separate presets (just print preset, just filament preset etc). - // As of now only the full configs are supported here. - if (!m_print_config.empty()) - gui->mainframe->load_config(m_print_config); -#endif - if (!load_configs.empty()) - // Load the last config to give it a name at the UI. The name of the preset may be later - // changed by loading an AMF or 3MF. - //FIXME this is not strictly correct, as one may pass a print/filament/printer profile here instead of a full config. - gui->mainframe->load_config_file(load_configs.back()); - // If loading a 3MF file, the config is loaded from the last one. - if (!m_input_files.empty()) - gui->plater()->load_files(m_input_files, true, true); - if (!m_extra_config.empty()) - gui->mainframe->load_config(m_extra_config); -#if ENABLE_GCODE_VIEWER - } -#endif // ENABLE_GCODE_VIEWER - }); - int result = wxEntry(argc, argv); - return result; -#else /* SLIC3R_GUI */ + Slic3r::GUI::GUI_InitParams params; + params.argc = argc; + params.argv = argv; + params.load_configs = load_configs; + params.extra_config = std::move(m_extra_config); + params.input_files = std::move(m_input_files); + params.start_as_gcodeviewer = start_as_gcodeviewer; + return Slic3r::GUI::GUI_Run(params); +#else // SLIC3R_GUI // No GUI support. Just print out a help. this->print_help(false); // If started without a parameter, consider it to be OK, otherwise report an error code (no action etc). return (argc == 0) ? 0 : 1; -#endif /* SLIC3R_GUI */ +#endif // SLIC3R_GUI } return 0; @@ -646,7 +610,7 @@ bool CLI::setup(int argc, char **argv) #ifdef __APPLE__ // The application is packed in the .dmg archive as 'Slic3r.app/Contents/MacOS/Slic3r' // The resources are packed to 'Slic3r.app/Contents/Resources' - boost::filesystem::path path_resources = path_to_binary.parent_path() / "../Resources"; + boost::filesystem::path path_resources = boost::filesystem::canonical(path_to_binary).parent_path() / "../Resources"; #elif defined _WIN32 // The application is packed in the .zip archive in the root, // The resources are packed to 'resources' @@ -660,7 +624,7 @@ bool CLI::setup(int argc, char **argv) // The application is packed in the .tar.bz archive (or in AppImage) as 'bin/slic3r', // The resources are packed to 'resources' // Path from Slic3r binary to resources: - boost::filesystem::path path_resources = path_to_binary.parent_path() / "../resources"; + boost::filesystem::path path_resources = boost::filesystem::canonical(path_to_binary).parent_path() / "../resources"; #endif set_resources_dir(path_resources.string()); diff --git a/src/admesh/stlinit.cpp b/src/admesh/stlinit.cpp index 390fe56a40..6aa2c44177 100644 --- a/src/admesh/stlinit.cpp +++ b/src/admesh/stlinit.cpp @@ -28,7 +28,7 @@ #include #include -#include +#include #include "stl.h" @@ -36,9 +36,9 @@ #error "SEEK_SET not defined" #endif -#ifndef BOOST_LITTLE_ENDIAN +#if BOOST_ENDIAN_BIG_BYTE extern void stl_internal_reverse_quads(char *buf, size_t cnt); -#endif /* BOOST_LITTLE_ENDIAN */ +#endif /* BOOST_ENDIAN_BIG_BYTE */ static FILE* stl_open_count_facets(stl_file *stl, const char *file) { @@ -89,10 +89,10 @@ static FILE* stl_open_count_facets(stl_file *stl, const char *file) // Read the int following the header. This should contain # of facets. uint32_t header_num_facets; bool header_num_faces_read = fread(&header_num_facets, sizeof(uint32_t), 1, fp) != 0; -#ifndef BOOST_LITTLE_ENDIAN +#if BOOST_ENDIAN_BIG_BYTE // Convert from little endian to big endian. stl_internal_reverse_quads((char*)&header_num_facets, 4); -#endif /* BOOST_LITTLE_ENDIAN */ +#endif /* BOOST_ENDIAN_BIG_BYTE */ if (! header_num_faces_read || num_facets != header_num_facets) BOOST_LOG_TRIVIAL(info) << "stl_open_count_facets: Warning: File size doesn't match number of facets in the header: " << file; } @@ -158,10 +158,10 @@ static bool stl_read(stl_file *stl, FILE *fp, int first_facet, bool first) // Read a single facet from a binary .STL file. We assume little-endian architecture! if (fread(&facet, 1, SIZEOF_STL_FACET, fp) != SIZEOF_STL_FACET) return false; -#ifndef BOOST_LITTLE_ENDIAN +#if BOOST_ENDIAN_BIG_BYTE // Convert the loaded little endian data to big endian. stl_internal_reverse_quads((char*)&facet, 48); -#endif /* BOOST_LITTLE_ENDIAN */ +#endif /* BOOST_ENDIAN_BIG_BYTE */ } else { // Read a single facet from an ASCII .STL file // skip solid/endsolid diff --git a/src/hidapi/linux/hid.c b/src/hidapi/linux/hid.c index d68354fe1b..5f486c0a9d 100644 --- a/src/hidapi/linux/hid.c +++ b/src/hidapi/linux/hid.c @@ -42,10 +42,16 @@ #include #include #include -#include #include "hidapi.h" +// Declare udev structures needed in this module. They are passed by pointers +// to udev functions and not used directly. +struct udev_device; +struct udev_list_entry; +struct udev_enumerate; +struct udev; + typedef const char* (*hid_wrapper_udev_device_get_devnode_type)(struct udev_device *udev_device); typedef struct udev_device* (*hid_wrapper_udev_device_get_parent_with_subsystem_devtype_type)(struct udev_device *udev_device, const char *subsystem, const char *devtype); typedef const char* (*hid_wrapper_udev_device_get_sysattr_value_type)(struct udev_device *udev_device, const char *sysattr); diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index 72c4fd0e92..631ff2fb28 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -2,6 +2,7 @@ #include "libslic3r/Utils.hpp" #include "AppConfig.hpp" #include "Exception.hpp" +#include "Thread.hpp" #include #include @@ -37,56 +38,89 @@ void AppConfig::reset() // Override missing or keys with their defaults. void AppConfig::set_defaults() { - // Reset the empty fields to defaults. - if (get("autocenter").empty()) - set("autocenter", "0"); - // Disable background processing by default as it is not stable. - if (get("background_processing").empty()) - set("background_processing", "0"); - // If set, the "Controller" tab for the control of the printer over serial line and the serial port settings are hidden. - // By default, Prusa has the controller hidden. - if (get("no_controller").empty()) - set("no_controller", "1"); - // If set, the "- default -" selections of print/filament/printer are suppressed, if there is a valid preset available. - if (get("no_defaults").empty()) - set("no_defaults", "1"); - if (get("show_incompatible_presets").empty()) - set("show_incompatible_presets", "0"); +#if ENABLE_GCODE_VIEWER + if (m_mode == EAppMode::Editor) { +#endif // ENABLE_GCODE_VIEWER + // Reset the empty fields to defaults. + if (get("autocenter").empty()) + set("autocenter", "0"); + // Disable background processing by default as it is not stable. + if (get("background_processing").empty()) + set("background_processing", "0"); + // If set, the "Controller" tab for the control of the printer over serial line and the serial port settings are hidden. + // By default, Prusa has the controller hidden. + if (get("no_controller").empty()) + set("no_controller", "1"); + // If set, the "- default -" selections of print/filament/printer are suppressed, if there is a valid preset available. + if (get("no_defaults").empty()) + set("no_defaults", "1"); + if (get("show_incompatible_presets").empty()) + set("show_incompatible_presets", "0"); - if (get("version_check").empty()) - set("version_check", "1"); - if (get("preset_update").empty()) - set("preset_update", "1"); + if (get("version_check").empty()) + set("version_check", "1"); + if (get("preset_update").empty()) + set("preset_update", "1"); - if (get("export_sources_full_pathnames").empty()) - set("export_sources_full_pathnames", "0"); + if (get("export_sources_full_pathnames").empty()) + set("export_sources_full_pathnames", "0"); - // remove old 'use_legacy_opengl' parameter from this config, if present - if (!get("use_legacy_opengl").empty()) - erase("", "use_legacy_opengl"); + // remove old 'use_legacy_opengl' parameter from this config, if present + if (!get("use_legacy_opengl").empty()) + erase("", "use_legacy_opengl"); #ifdef __APPLE__ - if (get("use_retina_opengl").empty()) - set("use_retina_opengl", "1"); + if (get("use_retina_opengl").empty()) + set("use_retina_opengl", "1"); #endif - if (get("single_instance").empty()) - set("single_instance", "0"); + if (get("single_instance").empty()) + set("single_instance", +#ifdef __APPLE__ + "1" +#else // __APPLE__ + "0" +#endif // __APPLE__ + ); - if (get("remember_output_path").empty()) - set("remember_output_path", "1"); + if (get("remember_output_path").empty()) + set("remember_output_path", "1"); - if (get("remember_output_path_removable").empty()) - set("remember_output_path_removable", "1"); + if (get("remember_output_path_removable").empty()) + set("remember_output_path_removable", "1"); - if (get("use_custom_toolbar_size").empty()) - set("use_custom_toolbar_size", "0"); + if (get("use_custom_toolbar_size").empty()) + set("use_custom_toolbar_size", "0"); - if (get("custom_toolbar_size").empty()) - set("custom_toolbar_size", "100"); + if (get("custom_toolbar_size").empty()) + set("custom_toolbar_size", "100"); - if (get("auto_toolbar_size").empty()) - set("auto_toolbar_size", "100"); + if (get("auto_toolbar_size").empty()) + set("auto_toolbar_size", "100"); + +#if !ENABLE_GCODE_VIEWER + if (get("use_perspective_camera").empty()) + set("use_perspective_camera", "1"); + + if (get("use_free_camera").empty()) + set("use_free_camera", "0"); + + if (get("reverse_mouse_wheel_zoom").empty()) + set("reverse_mouse_wheel_zoom", "0"); +#endif // !ENABLE_GCODE_VIEWER + +#if ENABLE_ENVIRONMENT_MAP + if (get("use_environment_map").empty()) + set("use_environment_map", "0"); +#endif // ENABLE_ENVIRONMENT_MAP + + if (get("use_inches").empty()) + set("use_inches", "0"); +#if ENABLE_GCODE_VIEWER + } + + if (get("seq_top_layer_only").empty()) + set("seq_top_layer_only", "1"); if (get("use_perspective_camera").empty()) set("use_perspective_camera", "1"); @@ -94,17 +128,19 @@ void AppConfig::set_defaults() if (get("use_free_camera").empty()) set("use_free_camera", "0"); -#if ENABLE_ENVIRONMENT_MAP - if (get("use_environment_map").empty()) - set("use_environment_map", "0"); -#endif // ENABLE_ENVIRONMENT_MAP - - if (get("use_inches").empty()) - set("use_inches", "0"); + if (get("reverse_mouse_wheel_zoom").empty()) + set("reverse_mouse_wheel_zoom", "0"); +#endif // ENABLE_GCODE_VIEWER if (get("show_splash_screen").empty()) set("show_splash_screen", "1"); + if (get("default_action_on_close_application").empty()) + set("default_action_on_close_application", "none"); // , "discard" or "save" + + if (get("default_action_on_select_preset").empty()) + set("default_action_on_select_preset", "none"); // , "transfer", "discard" or "save" + // Remove legacy window positions/sizes erase("", "main_frame_maximized"); erase("", "main_frame_pos"); @@ -175,6 +211,20 @@ std::string AppConfig::load() m_legacy_datadir = ini_ver < Semver(1, 40, 0); } + // Legacy conversion + if (m_mode == EAppMode::Editor) { + // Convert [extras] "physical_printer" to [presets] "physical_printer", + // remove the [extras] section if it becomes empty. + if (auto it_section = m_storage.find("extras"); it_section != m_storage.end()) { + if (auto it_physical_printer = it_section->second.find("physical_printer"); it_physical_printer != it_section->second.end()) { + m_storage["presets"]["physical_printer"] = it_physical_printer->second; + it_section->second.erase(it_physical_printer); + } + if (it_section->second.empty()) + m_storage.erase(it_section); + } + } + // Override missing or keys with their defaults. this->set_defaults(); m_dirty = false; @@ -183,10 +233,12 @@ std::string AppConfig::load() void AppConfig::save() { -#if ENABLE_GCODE_VIEWER - if (!m_save_enabled) - return; -#endif // ENABLE_GCODE_VIEWER + { + // Returns "undefined" if the thread naming functionality is not supported by the operating system. + std::optional current_thread_name = get_current_thread_name(); + if (current_thread_name && *current_thread_name != "slic3r_main") + throw CriticalException("Calling AppConfig::save() from a worker thread!"); + } // The config is first written to a file with a PID suffix and then moved // to avoid race conditions with multiple instances of Slic3r @@ -195,7 +247,14 @@ void AppConfig::save() boost::nowide::ofstream c; c.open(path_pid, std::ios::out | std::ios::trunc); +#if ENABLE_GCODE_VIEWER + if (m_mode == EAppMode::Editor) + c << "# " << Slic3r::header_slic3r_generated() << std::endl; + else + c << "# " << Slic3r::header_gcodeviewer_generated() << std::endl; +#else c << "# " << Slic3r::header_slic3r_generated() << std::endl; +#endif // ENABLE_GCODE_VIEWER // Make sure the "no" category is written first. for (const std::pair &kvp : m_storage[""]) c << kvp.first << " = " << kvp.second << std::endl; @@ -389,13 +448,22 @@ void AppConfig::reset_selections() it->second.erase("sla_print"); it->second.erase("sla_material"); it->second.erase("printer"); + it->second.erase("physical_printer"); m_dirty = true; } } std::string AppConfig::config_path() { - return (boost::filesystem::path(Slic3r::data_dir()) / (SLIC3R_APP_KEY ".ini")).make_preferred().string(); +#if ENABLE_GCODE_VIEWER + std::string path = (m_mode == EAppMode::Editor) ? + (boost::filesystem::path(Slic3r::data_dir()) / (SLIC3R_APP_KEY ".ini")).make_preferred().string() : + (boost::filesystem::path(Slic3r::data_dir()) / (GCODEVIEWER_APP_KEY ".ini")).make_preferred().string(); + + return path; +#else + return (boost::filesystem::path(Slic3r::data_dir()) / (SLIC3R_APP_KEY ".ini")).make_preferred().string(); +#endif // ENABLE_GCODE_VIEWER } std::string AppConfig::version_check_url() const @@ -406,7 +474,11 @@ std::string AppConfig::version_check_url() const bool AppConfig::exists() { +#if ENABLE_GCODE_VIEWER + return boost::filesystem::exists(config_path()); +#else return boost::filesystem::exists(AppConfig::config_path()); +#endif // ENABLE_GCODE_VIEWER } }; // namespace Slic3r diff --git a/src/libslic3r/AppConfig.hpp b/src/libslic3r/AppConfig.hpp index f22a6314ab..1ed7b28a50 100644 --- a/src/libslic3r/AppConfig.hpp +++ b/src/libslic3r/AppConfig.hpp @@ -15,11 +15,21 @@ namespace Slic3r { class AppConfig { public: +#if ENABLE_GCODE_VIEWER + enum class EAppMode : unsigned char + { + Editor, + GCodeViewer + }; + + explicit AppConfig(EAppMode mode) : +#else AppConfig() : +#endif // ENABLE_GCODE_VIEWER m_dirty(false), m_orig_version(Semver::invalid()), #if ENABLE_GCODE_VIEWER - m_save_enabled(true), + m_mode(mode), #endif // ENABLE_GCODE_VIEWER m_legacy_datadir(false) { @@ -125,22 +135,30 @@ public: void reset_selections(); // Get the default config path from Slic3r::data_dir(). +#if ENABLE_GCODE_VIEWER + std::string config_path(); +#else static std::string config_path(); +#endif // ENABLE_GCODE_VIEWER // Returns true if the user's data directory comes from before Slic3r 1.40.0 (no updating) - bool legacy_datadir() const { return m_legacy_datadir; } - void set_legacy_datadir(bool value) { m_legacy_datadir = value; } + bool legacy_datadir() const { return m_legacy_datadir; } + void set_legacy_datadir(bool value) { m_legacy_datadir = value; } // Get the Slic3r version check url. // This returns a hardcoded string unless it is overriden by "version_check_url" in the ini file. - std::string version_check_url() const; + std::string version_check_url() const; // Returns the original Slic3r version found in the ini file before it was overwritten // by the current version - Semver orig_version() const { return m_orig_version; } + Semver orig_version() const { return m_orig_version; } // Does the config file exist? +#if ENABLE_GCODE_VIEWER + bool exists(); +#else static bool exists(); +#endif // ENABLE_GCODE_VIEWER std::vector get_recent_projects() const; void set_recent_projects(const std::vector& recent_projects); @@ -160,10 +178,6 @@ public: bool get_mouse_device_swap_yz(const std::string& name, bool& swap) const { return get_3dmouse_device_numeric_value(name, "swap_yz", swap); } -#if ENABLE_GCODE_VIEWER - void enable_save(bool enable) { m_save_enabled = enable; } -#endif // ENABLE_GCODE_VIEWER - static const std::string SECTION_FILAMENTS; static const std::string SECTION_MATERIALS; @@ -182,6 +196,10 @@ private: return true; } +#if ENABLE_GCODE_VIEWER + EAppMode m_mode { EAppMode::Editor }; +#endif // ENABLE_GCODE_VIEWER + // Map of section, name -> value std::map> m_storage; // Map of enabled vendors / models / variants @@ -190,10 +208,6 @@ private: bool m_dirty; // Original version found in the ini file before it was overwritten Semver m_orig_version; -#if ENABLE_GCODE_VIEWER - // Whether or not calls to save() should take effect - bool m_save_enabled; -#endif // ENABLE_GCODE_VIEWER // Whether the existing version is before system profiles & configuration updating bool m_legacy_datadir; }; diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index ee41248f3b..b1ef64ab5f 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -1,5 +1,5 @@ project(libslic3r) -cmake_minimum_required(VERSION 2.6) +cmake_minimum_required(VERSION 3.13) include(PrecompiledHeader) @@ -62,8 +62,6 @@ add_library(libslic3r STATIC Fill/FillRectilinear.hpp Fill/FillRectilinear2.cpp Fill/FillRectilinear2.hpp - Fill/FillRectilinear3.cpp - Fill/FillRectilinear3.hpp Flow.cpp Flow.hpp format.hpp @@ -81,8 +79,6 @@ add_library(libslic3r STATIC Format/STL.hpp Format/SL1.hpp Format/SL1.cpp - GCode/Analyzer.cpp - GCode/Analyzer.hpp GCode/ThumbnailData.cpp GCode/ThumbnailData.hpp GCode/CoolingBuffer.cpp @@ -111,8 +107,6 @@ add_library(libslic3r STATIC GCodeReader.hpp # GCodeSender.cpp # GCodeSender.hpp - GCodeTimeEstimator.cpp - GCodeTimeEstimator.hpp GCodeWriter.cpp GCodeWriter.hpp Geometry.cpp @@ -201,6 +195,8 @@ add_library(libslic3r STATIC Utils.hpp Time.cpp Time.hpp + Thread.cpp + Thread.hpp TriangleSelector.cpp TriangleSelector.hpp MTUtils.hpp diff --git a/src/libslic3r/Config.hpp b/src/libslic3r/Config.hpp index 28b28b405a..d683e55b8c 100644 --- a/src/libslic3r/Config.hpp +++ b/src/libslic3r/Config.hpp @@ -1414,6 +1414,8 @@ public: bool multiline = false; // For text input: If true, the GUI text box spans the complete page width. bool full_width = false; + // For text input: If true, the GUI formats text as code (fixed-width) + bool is_code = false; // Not editable. Currently only used for the display of the number of threads. bool readonly = false; // Height of a multiline GUI text box. diff --git a/src/libslic3r/Exception.hpp b/src/libslic3r/Exception.hpp index 8ec9f20c81..2bef204ad3 100644 --- a/src/libslic3r/Exception.hpp +++ b/src/libslic3r/Exception.hpp @@ -19,6 +19,7 @@ SLIC3R_DERIVE_EXCEPTION(InvalidArgument, LogicError); SLIC3R_DERIVE_EXCEPTION(OutOfRange, LogicError); SLIC3R_DERIVE_EXCEPTION(IOError, CriticalException); SLIC3R_DERIVE_EXCEPTION(FileIOError, IOError); +SLIC3R_DERIVE_EXCEPTION(HostNetworkError, IOError); // Runtime exception produced by Slicer. Such exception cancels the slicing process and it shall be shown in notifications. SLIC3R_DERIVE_EXCEPTION(SlicingError, Exception); #undef SLIC3R_DERIVE_EXCEPTION diff --git a/src/libslic3r/ExtrusionEntity.cpp b/src/libslic3r/ExtrusionEntity.cpp index b2c5e1350f..aa9f0f9cd1 100644 --- a/src/libslic3r/ExtrusionEntity.cpp +++ b/src/libslic3r/ExtrusionEntity.cpp @@ -331,7 +331,7 @@ std::string ExtrusionEntity::role_to_string(ExtrusionRole role) return ""; } -ExtrusionRole ExtrusionEntity::string_to_role(const std::string& role) +ExtrusionRole ExtrusionEntity::string_to_role(const std::string_view role) { if (role == L("Perimeter")) return erPerimeter; diff --git a/src/libslic3r/ExtrusionEntity.hpp b/src/libslic3r/ExtrusionEntity.hpp index 0adb2019ee..6b0153b2ea 100644 --- a/src/libslic3r/ExtrusionEntity.hpp +++ b/src/libslic3r/ExtrusionEntity.hpp @@ -6,6 +6,7 @@ #include "Polyline.hpp" #include +#include namespace Slic3r { @@ -106,7 +107,7 @@ public: virtual double total_volume() const = 0; static std::string role_to_string(ExtrusionRole role); - static ExtrusionRole string_to_role(const std::string& role); + static ExtrusionRole string_to_role(const std::string_view role); }; typedef std::vector ExtrusionEntitiesPtr; diff --git a/src/libslic3r/Fill/Fill.cpp b/src/libslic3r/Fill/Fill.cpp index 03aa798dc4..3e24d502d6 100644 --- a/src/libslic3r/Fill/Fill.cpp +++ b/src/libslic3r/Fill/Fill.cpp @@ -535,7 +535,7 @@ void Layer::make_ironing() fill_params.density = 1.; // fill_params.dont_connect = true; fill_params.dont_connect = false; - fill_params.monotonous = true; + fill_params.monotonic = true; for (size_t i = 0; i < by_extruder.size(); ++ i) { // Find span of regions equivalent to the ironing operation. @@ -579,7 +579,7 @@ void Layer::make_ironing() // Save into layer. ExtrusionEntityCollection *eec = nullptr; ironing_params.layerm->fills.entities.push_back(eec = new ExtrusionEntityCollection()); - // Don't sort the ironing infill lines as they are monotonously ordered. + // Don't sort the ironing infill lines as they are monotonicly ordered. eec->no_sort = true; extrusion_entities_append_paths( eec->entities, std::move(polylines), diff --git a/src/libslic3r/Fill/FillAdaptive.cpp b/src/libslic3r/Fill/FillAdaptive.cpp index 66a50dd1f5..b6f91b30c3 100644 --- a/src/libslic3r/Fill/FillAdaptive.cpp +++ b/src/libslic3r/Fill/FillAdaptive.cpp @@ -228,7 +228,7 @@ static const std::array child_centers { }; // Traversal order of octree children cells for three infill directions, -// so that a single line will be discretized in a strictly monotonous order. +// so that a single line will be discretized in a strictly monotonic order. static constexpr std::array, 3> child_traversal_order { std::array{ 2, 3, 0, 1, 6, 7, 4, 5 }, std::array{ 4, 0, 6, 2, 5, 1, 7, 3 }, diff --git a/src/libslic3r/Fill/FillBase.cpp b/src/libslic3r/Fill/FillBase.cpp index 85f37de32f..8e0e980e35 100644 --- a/src/libslic3r/Fill/FillBase.cpp +++ b/src/libslic3r/Fill/FillBase.cpp @@ -15,7 +15,6 @@ #include "FillPlanePath.hpp" #include "FillRectilinear.hpp" #include "FillRectilinear2.hpp" -#include "FillRectilinear3.hpp" #include "FillAdaptive.hpp" namespace Slic3r { @@ -28,7 +27,7 @@ Fill* Fill::new_from_type(const InfillPattern type) case ip3DHoneycomb: return new Fill3DHoneycomb(); case ipGyroid: return new FillGyroid(); case ipRectilinear: return new FillRectilinear2(); - case ipMonotonous: return new FillMonotonous(); + case ipMonotonic: return new FillMonotonic(); case ipLine: return new FillLine(); case ipGrid: return new FillGrid2(); case ipTriangles: return new FillTriangles(); diff --git a/src/libslic3r/Fill/FillBase.hpp b/src/libslic3r/Fill/FillBase.hpp index aedf39c81c..0df4bd6c1e 100644 --- a/src/libslic3r/Fill/FillBase.hpp +++ b/src/libslic3r/Fill/FillBase.hpp @@ -43,8 +43,8 @@ struct FillParams // Don't adjust spacing to fill the space evenly. bool dont_adjust { true }; - // Monotonous infill - strictly left to right for better surface quality of top infills. - bool monotonous { false }; + // Monotonic infill - strictly left to right for better surface quality of top infills. + bool monotonic { false }; // For Honeycomb. // we were requested to complete each loop; diff --git a/src/libslic3r/Fill/FillRectilinear2.cpp b/src/libslic3r/Fill/FillRectilinear2.cpp index 5b862e8cbd..493bb7c6f3 100644 --- a/src/libslic3r/Fill/FillRectilinear2.cpp +++ b/src/libslic3r/Fill/FillRectilinear2.cpp @@ -154,7 +154,9 @@ struct SegmentIntersection // Vertical link, up. Up, // Vertical link, down. - Down + Down, + // Phony intersection point has no link. + Phony, }; enum class LinkQuality : uint8_t { @@ -353,6 +355,25 @@ struct SegmentedIntersectionLine std::vector intersections; }; +static SegmentIntersection phony_outer_intersection(SegmentIntersection::SegmentIntersectionType type, coord_t pos) +{ + assert(type == SegmentIntersection::OUTER_LOW || type == SegmentIntersection::OUTER_HIGH); + SegmentIntersection out; + // Invalid contour & segment. + out.iContour = std::numeric_limits::max(); + out.iSegment = std::numeric_limits::max(); + out.pos_p = pos; + out.type = type; + // Invalid prev / next. + out.prev_on_contour = -1; + out.next_on_contour = -1; + out.prev_on_contour_type = SegmentIntersection::LinkType::Phony; + out.next_on_contour_type = SegmentIntersection::LinkType::Phony; + out.prev_on_contour_quality = SegmentIntersection::LinkQuality::Invalid; + out.next_on_contour_quality = SegmentIntersection::LinkQuality::Invalid; + return out; +} + // A container maintaining an expolygon with its inner offsetted polygon. // The purpose of the inner offsetted polygon is to provide segments to connect the infill lines. struct ExPolygonWithOffset @@ -889,6 +910,60 @@ static std::vector slice_region_by_vertical_lines(con return segs; } +#ifndef NDEBUG +bool validate_segment_intersection_connectivity(const std::vector &segs) +{ + // Validate the connectivity. + for (size_t i_vline = 0; i_vline + 1 < segs.size(); ++ i_vline) { + const SegmentedIntersectionLine &il_left = segs[i_vline]; + const SegmentedIntersectionLine &il_right = segs[i_vline + 1]; + for (const SegmentIntersection &it : il_left.intersections) { + if (it.has_right_horizontal()) { + const SegmentIntersection &it_right = il_right.intersections[it.right_horizontal()]; + // For a right link there is a symmetric left link. + assert(it.iContour == it_right.iContour); + assert(it.type == it_right.type); + assert(it_right.has_left_horizontal()); + assert(it_right.left_horizontal() == int(&it - il_left.intersections.data())); + } + } + for (const SegmentIntersection &it : il_right.intersections) { + if (it.has_left_horizontal()) { + const SegmentIntersection &it_left = il_left.intersections[it.left_horizontal()]; + // For a right link there is a symmetric left link. + assert(it.iContour == it_left.iContour); + assert(it.type == it_left.type); + assert(it_left.has_right_horizontal()); + assert(it_left.right_horizontal() == int(&it - il_right.intersections.data())); + } + } + } + for (size_t i_vline = 0; i_vline < segs.size(); ++ i_vline) { + const SegmentedIntersectionLine &il = segs[i_vline]; + for (const SegmentIntersection &it : il.intersections) { + auto i_it = int(&it - il.intersections.data()); + if (it.has_left_vertical_up()) { + assert(il.intersections[it.left_vertical_up()].left_vertical_down() == i_it); + assert(il.intersections[it.left_vertical_up()].prev_on_contour_quality == it.prev_on_contour_quality); + } + if (it.has_left_vertical_down()) { + assert(il.intersections[it.left_vertical_down()].left_vertical_up() == i_it); + assert(il.intersections[it.left_vertical_down()].prev_on_contour_quality == it.prev_on_contour_quality); + } + if (it.has_right_vertical_up()) { + assert(il.intersections[it.right_vertical_up()].right_vertical_down() == i_it); + assert(il.intersections[it.right_vertical_up()].next_on_contour_quality == it.next_on_contour_quality); + } + if (it.has_right_vertical_down()) { + assert(il.intersections[it.right_vertical_down()].right_vertical_up() == i_it); + assert(il.intersections[it.right_vertical_down()].next_on_contour_quality == it.next_on_contour_quality); + } + } + } + return true; +} +#endif /* NDEBUG */ + // Connect each contour / vertical line intersection point with another two contour / vertical line intersection points. // (fill in SegmentIntersection::{prev_on_contour, prev_on_contour_vertical, next_on_contour, next_on_contour_vertical}. // These contour points are either on the same vertical line, or on the vertical line left / right to the current one. @@ -1055,55 +1130,104 @@ static void connect_segment_intersections_by_contours( } } -#ifndef NDEBUG - // Validate the connectivity. - for (size_t i_vline = 0; i_vline + 1 < segs.size(); ++ i_vline) { - const SegmentedIntersectionLine &il_left = segs[i_vline]; - const SegmentedIntersectionLine &il_right = segs[i_vline + 1]; - for (const SegmentIntersection &it : il_left.intersections) { - if (it.has_right_horizontal()) { - const SegmentIntersection &it_right = il_right.intersections[it.right_horizontal()]; - // For a right link there is a symmetric left link. - assert(it.iContour == it_right.iContour); - assert(it.type == it_right.type); - assert(it_right.has_left_horizontal()); - assert(it_right.left_horizontal() == int(&it - il_left.intersections.data())); + assert(validate_segment_intersection_connectivity(segs)); +} + +static void pinch_contours_insert_phony_outer_intersections(std::vector &segs) +{ + // Keep the vector outside the loops, so they will not be reallocated. + // Where to insert new outer points. + std::vector insert_after; + // Mapping of indices of current intersection line after inserting new outer points. + std::vector map; + std::vector temp_intersections; + + for (size_t i_vline = 1; i_vline < segs.size(); ++ i_vline) { + SegmentedIntersectionLine &il = segs[i_vline]; + assert(il.intersections.empty() || il.intersections.size() >= 2); + if (! il.intersections.empty()) { + assert(il.intersections.front().type == SegmentIntersection::OUTER_LOW); + assert(il.intersections.back().type == SegmentIntersection::OUTER_HIGH); + auto end = il.intersections.end() - 1; + insert_after.clear(); + for (auto it = il.intersections.begin() + 1; it != end;) { + if (it->type == SegmentIntersection::OUTER_HIGH) { + ++ it; + assert(it->type == SegmentIntersection::OUTER_LOW); + ++ it; + } else { + auto lo = it; + assert(lo->type == SegmentIntersection::INNER_LOW); + auto hi = ++ it; + assert(hi->type == SegmentIntersection::INNER_HIGH); + auto lo2 = ++ it; + if (lo2->type == SegmentIntersection::INNER_LOW) { + // INNER_HIGH followed by INNER_LOW. The outer contour may have squeezed the inner contour into two separate loops. + // In that case one shall insert a phony OUTER_HIGH / OUTER_LOW pair. + int up = hi->vertical_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. + // Insert a phony OUTER_HIGH / OUTER_LOW pair. +#if 0 + static int pinch_idx = 0; + printf("Pinched %d\n", pinch_idx++); +#endif + insert_after.emplace_back(hi - il.intersections.begin()); + } + } + } } - } - for (const SegmentIntersection &it : il_right.intersections) { - if (it.has_left_horizontal()) { - const SegmentIntersection &it_left = il_left.intersections[it.left_horizontal()]; - // For a right link there is a symmetric left link. - assert(it.iContour == it_left.iContour); - assert(it.type == it_left.type); - assert(it_left.has_right_horizontal()); - assert(it_left.right_horizontal() == int(&it - il_right.intersections.data())); + + if (! insert_after.empty()) { + // Insert phony OUTER_HIGH / OUTER_LOW pairs, adjust indices pointing to intersection points on this contour. + map.clear(); + { + size_t i = 0; + temp_intersections.clear(); + for (size_t idx_inset_after : insert_after) { + for (; i <= idx_inset_after; ++ i) { + map.emplace_back(temp_intersections.size()); + temp_intersections.emplace_back(il.intersections[i]); + } + coord_t pos = (temp_intersections.back().pos() + il.intersections[i].pos()) / 2; + temp_intersections.emplace_back(phony_outer_intersection(SegmentIntersection::OUTER_HIGH, pos)); + temp_intersections.emplace_back(phony_outer_intersection(SegmentIntersection::OUTER_LOW, pos)); + } + for (; i < il.intersections.size(); ++ i) { + map.emplace_back(temp_intersections.size()); + temp_intersections.emplace_back(il.intersections[i]); + } + temp_intersections.swap(il.intersections); + } + // Reindex references on current intersection line. + for (SegmentIntersection &ip : il.intersections) { + if (ip.has_left_vertical()) + ip.prev_on_contour = map[ip.prev_on_contour]; + if (ip.has_right_vertical()) + ip.next_on_contour = map[ip.next_on_contour]; + } + // Reindex references on previous intersection line. + for (SegmentIntersection &ip : segs[i_vline - 1].intersections) + if (ip.has_right_horizontal()) + ip.next_on_contour = map[ip.next_on_contour]; + if (i_vline < segs.size()) { + // Reindex references on next intersection line. + for (SegmentIntersection &ip : segs[i_vline + 1].intersections) + if (ip.has_left_horizontal()) + ip.prev_on_contour = map[ip.prev_on_contour]; + } } } } - for (size_t i_vline = 0; i_vline < segs.size(); ++ i_vline) { - const SegmentedIntersectionLine &il = segs[i_vline]; - for (const SegmentIntersection &it : il.intersections) { - auto i_it = int(&it - il.intersections.data()); - if (it.has_left_vertical_up()) { - assert(il.intersections[it.left_vertical_up()].left_vertical_down() == i_it); - assert(il.intersections[it.left_vertical_up()].prev_on_contour_quality == it.prev_on_contour_quality); - } - if (it.has_left_vertical_down()) { - assert(il.intersections[it.left_vertical_down()].left_vertical_up() == i_it); - assert(il.intersections[it.left_vertical_down()].prev_on_contour_quality == it.prev_on_contour_quality); - } - if (it.has_right_vertical_up()) { - assert(il.intersections[it.right_vertical_up()].right_vertical_down() == i_it); - assert(il.intersections[it.right_vertical_up()].next_on_contour_quality == it.next_on_contour_quality); - } - if (it.has_right_vertical_down()) { - assert(il.intersections[it.right_vertical_down()].right_vertical_up() == i_it); - assert(il.intersections[it.right_vertical_down()].next_on_contour_quality == it.next_on_contour_quality); - } - } - } -#endif /* NDEBUG */ + + assert(validate_segment_intersection_connectivity(segs)); } // Find the last INNER_HIGH intersection starting with INNER_LOW, that is followed by OUTER_HIGH intersection. @@ -1387,7 +1511,7 @@ static void traverse_graph_generate_polylines( } } -struct MonotonousRegion +struct MonotonicRegion { struct Boundary { int vline; @@ -1412,13 +1536,13 @@ struct MonotonousRegion #if NDEBUG // Left regions are used to track whether all regions left to this one have already been printed. - boost::container::small_vector left_neighbors; + boost::container::small_vector left_neighbors; // Right regions are held to pick a next region to be extruded using the "Ant colony" heuristics. - boost::container::small_vector right_neighbors; + boost::container::small_vector right_neighbors; #else // For debugging, use the normal vector as it is better supported by debug visualizers. - std::vector left_neighbors; - std::vector right_neighbors; + std::vector left_neighbors; + std::vector right_neighbors; #endif }; @@ -1429,9 +1553,9 @@ struct AntPath float pheromone { 0 }; // <0, 1> }; -struct MonotonousRegionLink +struct MonotonicRegionLink { - MonotonousRegion *region; + MonotonicRegion *region; bool flipped; // Distance of right side of this region to left side of the next region, if the "flipped" flag of this region and the next region // is applied as defined. @@ -1447,7 +1571,7 @@ class AntPathMatrix { public: AntPathMatrix( - const std::vector ®ions, + const std::vector ®ions, const ExPolygonWithOffset &poly_with_offset, const std::vector &segs, const float initial_pheromone) : @@ -1463,7 +1587,7 @@ public: ap.pheromone = initial_pheromone; } - AntPath& operator()(const MonotonousRegion ®ion_from, bool flipped_from, const MonotonousRegion ®ion_to, bool flipped_to) + AntPath& operator()(const MonotonicRegion ®ion_from, bool flipped_from, const MonotonicRegion ®ion_to, bool flipped_to) { int row = 2 * int(®ion_from - m_regions.data()) + flipped_from; int col = 2 * int(®ion_to - m_regions.data()) + flipped_to; @@ -1490,16 +1614,16 @@ public: return path; } - AntPath& operator()(const MonotonousRegionLink ®ion_from, const MonotonousRegion ®ion_to, bool flipped_to) + AntPath& operator()(const MonotonicRegionLink ®ion_from, const MonotonicRegion ®ion_to, bool flipped_to) { return (*this)(*region_from.region, region_from.flipped, region_to, flipped_to); } - AntPath& operator()(const MonotonousRegion ®ion_from, bool flipped_from, const MonotonousRegionLink ®ion_to) + AntPath& operator()(const MonotonicRegion ®ion_from, bool flipped_from, const MonotonicRegionLink ®ion_to) { return (*this)(region_from, flipped_from, *region_to.region, region_to.flipped); } - AntPath& operator()(const MonotonousRegionLink ®ion_from, const MonotonousRegionLink ®ion_to) + AntPath& operator()(const MonotonicRegionLink ®ion_from, const MonotonicRegionLink ®ion_to) { return (*this)(*region_from.region, region_from.flipped, *region_to.region, region_to.flipped); } private: // Source regions, used for addressing and updating m_matrix. - const std::vector &m_regions; + const std::vector &m_regions; // To calculate the intersection points and contour lengths. const ExPolygonWithOffset &m_poly_with_offset; const std::vector &m_segs; @@ -1652,9 +1776,9 @@ static std::pair right_overlap(std:: return start_end.first == nullptr ? start_end : right_overlap(*start_end.first, *start_end.second, vline_this, vline_right); } -static std::vector generate_montonous_regions(std::vector &segs) +static std::vector generate_montonous_regions(std::vector &segs) { - std::vector monotonous_regions; + std::vector monotonic_regions; #ifndef NDEBUG #define SLIC3R_DEBUG_MONOTONOUS_REGIONS @@ -1685,11 +1809,11 @@ static std::vector generate_montonous_regions(std::vectorconsumed_vertical_up) { - // Draw a new monotonous region starting with this segment. + // Draw a new monotonic region starting with this segment. // while there is only a single right neighbor int i_vline = i_vline_seed; std::pair left(start, end); - MonotonousRegion region; + MonotonicRegion region; region.left.vline = i_vline; region.left.low = int(left.first - vline_seed.intersections.data()); region.left.high = int(left.second - vline_seed.intersections.data()); @@ -1722,19 +1846,19 @@ static std::vector generate_montonous_regions(std::vector &segs) +static float montonous_region_path_length(const MonotonicRegion ®ion, bool dir, const ExPolygonWithOffset &poly_with_offset, const std::vector &segs) { // From the initial point (i_vline, i_intersection), follow a path. int i_intersection = region.left_intersection_point(dir); @@ -1822,15 +1946,15 @@ static float montonous_region_path_length(const MonotonousRegion ®ion, bool d return unscale(total_length); } -static void connect_monotonous_regions(std::vector ®ions, const ExPolygonWithOffset &poly_with_offset, std::vector &segs) +static void connect_monotonic_regions(std::vector ®ions, const ExPolygonWithOffset &poly_with_offset, std::vector &segs) { - // Map from low intersection to left / right side of a monotonous region. - using MapType = std::pair; + // Map from low intersection to left / right side of a monotonic region. + using MapType = std::pair; std::vector map_intersection_to_region_start; std::vector map_intersection_to_region_end; map_intersection_to_region_start.reserve(regions.size()); map_intersection_to_region_end.reserve(regions.size()); - for (MonotonousRegion ®ion : regions) { + for (MonotonicRegion ®ion : regions) { map_intersection_to_region_start.emplace_back(&segs[region.left.vline].intersections[region.left.low], ®ion); map_intersection_to_region_end.emplace_back(&segs[region.right.vline].intersections[region.right.low], ®ion); } @@ -1840,7 +1964,7 @@ static void connect_monotonous_regions(std::vector ®ions, c std::sort(map_intersection_to_region_end.begin(), map_intersection_to_region_end.end(), intersections_lower); // Scatter links to neighboring regions. - for (MonotonousRegion ®ion : regions) { + for (MonotonicRegion ®ion : regions) { if (region.left.vline > 0) { auto &vline = segs[region.left.vline]; auto &vline_left = segs[region.left.vline - 1]; @@ -1884,17 +2008,17 @@ static void connect_monotonous_regions(std::vector ®ions, c // Sometimes a segment may indicate that it connects to a segment on the other side while the other does not. // This may be a valid case if one side contains runs of OUTER_LOW, INNER_LOW, {INNER_HIGH, INNER_LOW}*, INNER_HIGH, OUTER_HIGH, // where the part in the middle does not connect to the other side, but it will be extruded through. - for (MonotonousRegion ®ion : regions) { + for (MonotonicRegion ®ion : regions) { std::sort(region.left_neighbors.begin(), region.left_neighbors.end()); std::sort(region.right_neighbors.begin(), region.right_neighbors.end()); } - for (MonotonousRegion ®ion : regions) { - for (MonotonousRegion *neighbor : region.left_neighbors) { + for (MonotonicRegion ®ion : regions) { + for (MonotonicRegion *neighbor : region.left_neighbors) { auto it = std::lower_bound(neighbor->right_neighbors.begin(), neighbor->right_neighbors.end(), ®ion); if (it == neighbor->right_neighbors.end() || *it != ®ion) neighbor->right_neighbors.insert(it, ®ion); } - for (MonotonousRegion *neighbor : region.right_neighbors) { + for (MonotonicRegion *neighbor : region.right_neighbors) { auto it = std::lower_bound(neighbor->left_neighbors.begin(), neighbor->left_neighbors.end(), ®ion); if (it == neighbor->left_neighbors.end() || *it != ®ion) neighbor->left_neighbors.insert(it, ®ion); @@ -1903,12 +2027,12 @@ static void connect_monotonous_regions(std::vector ®ions, c #ifndef NDEBUG // Verify symmetry of the left_neighbors / right_neighbors. - for (MonotonousRegion ®ion : regions) { - for (MonotonousRegion *neighbor : region.left_neighbors) { + for (MonotonicRegion ®ion : regions) { + for (MonotonicRegion *neighbor : region.left_neighbors) { assert(std::count(region.left_neighbors.begin(), region.left_neighbors.end(), neighbor) == 1); assert(std::find(neighbor->right_neighbors.begin(), neighbor->right_neighbors.end(), ®ion) != neighbor->right_neighbors.end()); } - for (MonotonousRegion *neighbor : region.right_neighbors) { + for (MonotonicRegion *neighbor : region.right_neighbors) { assert(std::count(region.right_neighbors.begin(), region.right_neighbors.end(), neighbor) == 1); assert(std::find(neighbor->left_neighbors.begin(), neighbor->left_neighbors.end(), ®ion) != neighbor->left_neighbors.end()); } @@ -1916,7 +2040,7 @@ static void connect_monotonous_regions(std::vector ®ions, c #endif /* NDEBUG */ // Fill in sum length of connecting lines of a region. This length is used for optimizing the infill path for minimum length. - for (MonotonousRegion ®ion : regions) { + for (MonotonicRegion ®ion : regions) { region.len1 = montonous_region_path_length(region, false, poly_with_offset, segs); region.len2 = montonous_region_path_length(region, true, poly_with_offset, segs); // Subtract the smaller length from the longer one, so we will optimize just with the positive difference of the two. @@ -1934,7 +2058,7 @@ static void connect_monotonous_regions(std::vector ®ions, c // https://www.chalmers.se/en/departments/math/research/research-groups/optimization/OptimizationMasterTheses/MScThesis-RaadSalman-final.pdf // Algorithm 6.1 Lexicographic Path Preserving 3-opt // Optimize path while maintaining the ordering constraints. -void monotonous_3_opt(std::vector &path, const std::vector &segs) +void monotonic_3_opt(std::vector &path, const std::vector &segs) { // When doing the 3-opt path preserving flips, one has to fulfill two constraints: // @@ -1949,7 +2073,7 @@ void monotonous_3_opt(std::vector &path, const std::vector // then the precedence constraint verification is amortized inside the O(n^3) loop. Now which is better for our task? // // It is beneficial to also try flipping of the infill zig-zags, for which a prefix sum of both flipped and non-flipped paths over - // MonotonousRegionLinks may be utilized, however updating the prefix sum has a linear complexity, the same complexity as doing the 3-opt + // MonotonicRegionLinks may be utilized, however updating the prefix sum has a linear complexity, the same complexity as doing the 3-opt // exchange by copying the pieces. } @@ -1962,17 +2086,17 @@ inline void print_ant(const std::string& fmt, TArgs&&... args) { #endif } -// Find a run through monotonous infill blocks using an 'Ant colony" optimization method. +// Find a run through monotonic infill blocks using an 'Ant colony" optimization method. // http://www.scholarpedia.org/article/Ant_colony_optimization -static std::vector chain_monotonous_regions( - std::vector ®ions, const ExPolygonWithOffset &poly_with_offset, const std::vector &segs, std::mt19937_64 &rng) +static std::vector chain_monotonic_regions( + std::vector ®ions, const ExPolygonWithOffset &poly_with_offset, const std::vector &segs, std::mt19937_64 &rng) { // Number of left neighbors (regions that this region depends on, this region cannot be printed before the regions left of it are printed) + self. std::vector left_neighbors_unprocessed(regions.size(), 1); // Queue of regions, which have their left neighbors already printed. - std::vector queue; + std::vector queue; queue.reserve(regions.size()); - for (MonotonousRegion ®ion : regions) + for (MonotonicRegion ®ion : regions) if (region.left_neighbors.empty()) queue.emplace_back(®ion); else @@ -1981,13 +2105,13 @@ static std::vector chain_monotonous_regions( auto left_neighbors_unprocessed_initial = left_neighbors_unprocessed; auto queue_initial = queue; - std::vector path, best_path; + std::vector path, best_path; path.reserve(regions.size()); best_path.reserve(regions.size()); float best_path_length = std::numeric_limits::max(); struct NextCandidate { - MonotonousRegion *region; + MonotonicRegion *region; AntPath *link; AntPath *link_flipped; float probability; @@ -2002,22 +2126,22 @@ static std::vector chain_monotonous_regions( [®ions, &left_neighbors_unprocessed, &path, &queue]() { std::vector regions_processed(regions.size(), false); std::vector regions_in_queue(regions.size(), false); - for (const MonotonousRegion *region : queue) { + for (const MonotonicRegion *region : queue) { // This region is not processed yet, his predecessors are processed. assert(left_neighbors_unprocessed[region - regions.data()] == 1); regions_in_queue[region - regions.data()] = true; } - for (const MonotonousRegionLink &link : path) { + for (const MonotonicRegionLink &link : path) { assert(left_neighbors_unprocessed[link.region - regions.data()] == 0); regions_processed[link.region - regions.data()] = true; } for (size_t i = 0; i < regions_processed.size(); ++ i) { assert(! regions_processed[i] || ! regions_in_queue[i]); - const MonotonousRegion ®ion = regions[i]; + const MonotonicRegion ®ion = regions[i]; if (regions_processed[i] || regions_in_queue[i]) { assert(left_neighbors_unprocessed[i] == (regions_in_queue[i] ? 1 : 0)); // All left neighbors should be processed already. - for (const MonotonousRegion *left : region.left_neighbors) { + for (const MonotonicRegion *left : region.left_neighbors) { assert(regions_processed[left - regions.data()]); assert(left_neighbors_unprocessed[left - regions.data()] == 0); } @@ -2026,7 +2150,7 @@ static std::vector chain_monotonous_regions( assert(left_neighbors_unprocessed[i] > 1); size_t num_predecessors_unprocessed = 0; bool has_left_last_on_path = false; - for (const MonotonousRegion* left : region.left_neighbors) { + for (const MonotonicRegion* left : region.left_neighbors) { size_t iprev = left - regions.data(); if (regions_processed[iprev]) { assert(left_neighbors_unprocessed[iprev] == 0); @@ -2058,7 +2182,7 @@ static std::vector chain_monotonous_regions( // After how many rounds without an improvement to exit? constexpr int num_rounds_no_change_exit = 8; // With how many ants each of the run will be performed? - const int num_ants = std::min(regions.size(), 10); + const int num_ants = std::min(int(regions.size()), 10); // Base (initial) pheromone level. This value will be adjusted based on the length of the first greedy path found. float pheromone_initial_deposit = 0.5f; // Evaporation rate of pheromones. @@ -2080,18 +2204,18 @@ static std::vector chain_monotonous_regions( left_neighbors_unprocessed = left_neighbors_unprocessed_initial; assert(validate_unprocessed()); // Pick the last of the queue. - MonotonousRegionLink path_end { queue.back(), false }; + MonotonicRegionLink path_end { queue.back(), false }; queue.pop_back(); -- left_neighbors_unprocessed[path_end.region - regions.data()]; float total_length = path_end.region->length(false); while (! queue.empty() || ! path_end.region->right_neighbors.empty()) { // Chain. - MonotonousRegion ®ion = *path_end.region; + MonotonicRegion ®ion = *path_end.region; bool dir = path_end.flipped; NextCandidate next_candidate; next_candidate.probability = 0; - for (MonotonousRegion *next : region.right_neighbors) { + for (MonotonicRegion *next : region.right_neighbors) { int &unprocessed = left_neighbors_unprocessed[next - regions.data()]; assert(unprocessed > 1); if (left_neighbors_unprocessed[next - regions.data()] == 2) { @@ -2106,7 +2230,7 @@ static std::vector chain_monotonous_regions( } bool from_queue = next_candidate.probability == 0; if (from_queue) { - for (MonotonousRegion *next : queue) { + for (MonotonicRegion *next : queue) { AntPath &path1 = path_matrix(region, dir, *next, false); AntPath &path2 = path_matrix(region, dir, *next, true); if (path1.visibility > next_candidate.probability) @@ -2116,7 +2240,7 @@ static std::vector chain_monotonous_regions( } } // Move the other right neighbors with satisified constraints to the queue. - for (MonotonousRegion *next : region.right_neighbors) + for (MonotonicRegion *next : region.right_neighbors) if (-- left_neighbors_unprocessed[next - regions.data()] == 1 && next_candidate.region != next) queue.emplace_back(next); if (from_queue) { @@ -2127,7 +2251,7 @@ static std::vector chain_monotonous_regions( queue.pop_back(); } // Extend the path. - MonotonousRegion *next_region = 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; path_end = { next_region, next_dir }; @@ -2136,11 +2260,11 @@ static std::vector chain_monotonous_regions( } // Set an initial pheromone value to 10% of the greedy path's value. - pheromone_initial_deposit = 0.1 / total_length; + pheromone_initial_deposit = 0.1f / total_length; path_matrix.update_inital_pheromone(pheromone_initial_deposit); } - // Probability (unnormalized) of traversing a link between two monotonous regions. + // Probability (unnormalized) of traversing a link between two monotonic regions. auto path_probability = [pheromone_alpha, pheromone_beta](AntPath &path) { return pow(path.pheromone, pheromone_alpha) * pow(path.visibility, pheromone_beta); }; @@ -2163,10 +2287,10 @@ static std::vector chain_monotonous_regions( left_neighbors_unprocessed = left_neighbors_unprocessed_initial; assert(validate_unprocessed()); // Pick randomly the first from the queue at random orientation. - //FIXME picking the 1st monotonous region should likely be done based on accumulated pheromone level as well, - // but the inefficiency caused by the random pick of the 1st monotonous region is likely insignificant. + //FIXME picking the 1st monotonic region should likely be done based on accumulated pheromone level as well, + // but the inefficiency caused by the random pick of the 1st monotonic region is likely insignificant. int first_idx = std::uniform_int_distribution<>(0, int(queue.size()) - 1)(rng); - path.emplace_back(MonotonousRegionLink{ queue[first_idx], rng() > rng.max() / 2 }); + path.emplace_back(MonotonicRegionLink{ queue[first_idx], rng() > rng.max() / 2 }); *(queue.begin() + first_idx) = std::move(queue.back()); queue.pop_back(); -- left_neighbors_unprocessed[path.back().region - regions.data()]; @@ -2182,12 +2306,12 @@ static std::vector chain_monotonous_regions( while (! queue.empty() || ! path.back().region->right_neighbors.empty()) { // Chain. - MonotonousRegion ®ion = *path.back().region; + MonotonicRegion ®ion = *path.back().region; bool dir = path.back().flipped; // Sort by distance to pt. next_candidates.clear(); next_candidates.reserve(region.right_neighbors.size() * 2); - for (MonotonousRegion *next : region.right_neighbors) { + for (MonotonicRegion *next : region.right_neighbors) { int &unprocessed = left_neighbors_unprocessed[next - regions.data()]; assert(unprocessed > 1); if (-- unprocessed == 1) { @@ -2204,7 +2328,7 @@ static std::vector chain_monotonous_regions( //FIXME add the queue items to the candidates? These are valid moves as well. if (num_direct_neighbors == 0) { // Add the queue candidates. - for (MonotonousRegion *next : queue) { + for (MonotonicRegion *next : queue) { assert(left_neighbors_unprocessed[next - regions.data()] == 1); AntPath &path1 = path_matrix(region, dir, *next, false); AntPath &path1_flipped = path_matrix(region, ! dir, *next, true); @@ -2247,11 +2371,11 @@ static std::vector chain_monotonous_regions( queue.pop_back(); } // Extend the path. - MonotonousRegion *next_region = take_path->region; + MonotonicRegion *next_region = take_path->region; bool next_dir = take_path->dir; path.back().next = take_path->link; path.back().next_flipped = take_path->link_flipped; - path.emplace_back(MonotonousRegionLink{ next_region, next_dir }); + path.emplace_back(MonotonicRegionLink{ next_region, next_dir }); assert(left_neighbors_unprocessed[next_region - regions.data()] == 1); left_neighbors_unprocessed[next_region - regions.data()] = 0; print_ant("\tRegion (%1%:%2%,%3%) (%4%:%5%,%6%) length to prev %7%", @@ -2279,14 +2403,14 @@ static std::vector chain_monotonous_regions( } // Perform 3-opt local optimization of the path. - monotonous_3_opt(path, segs); + monotonic_3_opt(path, segs); // Measure path length. assert(! path.empty()); float path_length = std::accumulate(path.begin(), path.end() - 1, path.back().region->length(path.back().flipped), - [&path_matrix](const float l, const MonotonousRegionLink &r) { - const MonotonousRegionLink &next = *(&r + 1); + [&path_matrix](const float l, const MonotonicRegionLink &r) { + const MonotonicRegionLink &next = *(&r + 1); return l + r.region->length(r.flipped) + path_matrix(*r.region, r.flipped, *next.region, next.flipped).length; }); // Save the shortest path. @@ -2309,7 +2433,7 @@ static std::vector chain_monotonous_regions( // Reinforce the path pheromones with the best path. float total_cost = best_path_length + float(EPSILON); for (size_t i = 0; i + 1 < path.size(); ++ i) { - MonotonousRegionLink &link = path[i]; + MonotonicRegionLink &link = path[i]; link.next->pheromone = (1.f - pheromone_evaporation) * link.next->pheromone + pheromone_evaporation / total_cost; } @@ -2324,7 +2448,7 @@ end: } // Traverse path, produce polylines. -static void polylines_from_paths(const std::vector &path, const ExPolygonWithOffset &poly_with_offset, const std::vector &segs, Polylines &polylines_out) +static void polylines_from_paths(const std::vector &path, const ExPolygonWithOffset &poly_with_offset, const std::vector &segs, Polylines &polylines_out) { Polyline *polyline = nullptr; auto finish_polyline = [&polyline, &polylines_out]() { @@ -2334,14 +2458,26 @@ static void polylines_from_paths(const std::vector &path, // Handle nearly zero length edges. if (polyline->points.size() <= 1 || (polyline->points.size() == 2 && - std::abs(polyline->points.front()(0) - polyline->points.back()(0)) < SCALED_EPSILON && - std::abs(polyline->points.front()(1) - polyline->points.back()(1)) < SCALED_EPSILON)) + std::abs(polyline->points.front().x() - polyline->points.back().x()) < SCALED_EPSILON && + std::abs(polyline->points.front().y() - polyline->points.back().y()) < SCALED_EPSILON)) polylines_out.pop_back(); + else if (polylines_out.size() >= 2) { + assert(polyline->points.size() >= 2); + // Merge the two last polylines. An extrusion may have been split by an introduction of phony outer points on intersection lines + // to cope with pinching of inner offset contours. + Polyline &pl_prev = polylines_out[polylines_out.size() - 2]; + if (std::abs(polyline->points.front().x() - pl_prev.points.back().x()) < SCALED_EPSILON && + std::abs(polyline->points.front().y() - pl_prev.points.back().y()) < SCALED_EPSILON) { + pl_prev.points.back() = (pl_prev.points.back() + polyline->points.front()) / 2; + pl_prev.points.insert(pl_prev.points.end(), polyline->points.begin() + 1, polyline->points.end()); + polylines_out.pop_back(); + } + } polyline = nullptr; }; - for (const MonotonousRegionLink &path_segment : path) { - MonotonousRegion ®ion = *path_segment.region; + for (const MonotonicRegionLink &path_segment : path) { + MonotonicRegion ®ion = *path_segment.region; bool dir = path_segment.flipped; // From the initial point (i_vline, i_intersection), follow a path. @@ -2350,8 +2486,8 @@ static void polylines_from_paths(const std::vector &path, if (polyline != nullptr && &path_segment != path.data()) { // Connect previous path segment with the new one. - const MonotonousRegionLink &path_segment_prev = *(&path_segment - 1); - const MonotonousRegion ®ion_prev = *path_segment_prev.region; + const MonotonicRegionLink &path_segment_prev = *(&path_segment - 1); + const MonotonicRegion ®ion_prev = *path_segment_prev.region; bool dir_prev = path_segment_prev.flipped; int i_vline_prev = region_prev.right.vline; const SegmentedIntersectionLine &vline_prev = segs[i_vline_prev]; @@ -2456,7 +2592,7 @@ static void polylines_from_paths(const std::vector &path, if (polyline != nullptr) { // Finish the current vertical line, - const MonotonousRegion ®ion = *path.back().region; + const MonotonicRegion ®ion = *path.back().region; const SegmentedIntersectionLine &vline = segs[region.right.vline]; const SegmentIntersection *ip = &vline.intersections[region.right_intersection_point(path.back().flipped)]; assert(ip->is_inner()); @@ -2489,7 +2625,7 @@ bool FillRectilinear2::fill_surface_by_lines(const Surface *surface, const FillP surface->expolygon, - rotate_vector.first, float(scale_(this->overlap - (0.5 - INFILL_OVERLAP_OVER_SPACING) * this->spacing)), - float(scale_(this->overlap - 0.5 * this->spacing))); + float(scale_(this->overlap - 0.5f * this->spacing))); if (poly_with_offset.n_contours_inner == 0) { // Not a single infill line fits. //FIXME maybe one shall trigger the gap fill here? @@ -2558,14 +2694,18 @@ bool FillRectilinear2::fill_surface_by_lines(const Surface *surface, const FillP svg.Close(); #endif /* SLIC3R_DEBUG */ - //FIXME this is a hack to get the monotonous infill rolling. We likely want a smarter switch, likely based on user decison. - bool monotonous_infill = params.monotonous; // || params.density > 0.99; - if (monotonous_infill) { - std::vector regions = generate_montonous_regions(segs); - connect_monotonous_regions(regions, poly_with_offset, segs); + //FIXME this is a hack to get the monotonic infill rolling. We likely want a smarter switch, likely based on user decison. + bool monotonic_infill = params.monotonic; // || params.density > 0.99; + if (monotonic_infill) { + // Sometimes the outer contour pinches the inner contour from both sides along a single vertical line. + // This situation is not handled correctly by generate_montonous_regions(). + // Insert phony OUTER_HIGH / OUTER_LOW pairs at the position where the contour is pinched. + pinch_contours_insert_phony_outer_intersections(segs); + std::vector regions = generate_montonous_regions(segs); + connect_monotonic_regions(regions, poly_with_offset, segs); if (! regions.empty()) { std::mt19937_64 rng; - std::vector path = chain_monotonous_regions(regions, poly_with_offset, segs, rng); + std::vector path = chain_monotonic_regions(regions, poly_with_offset, segs, rng); polylines_from_paths(path, poly_with_offset, segs, polylines_out); } } else @@ -2616,13 +2756,13 @@ Polylines FillRectilinear2::fill_surface(const Surface *surface, const FillParam return polylines_out; } -Polylines FillMonotonous::fill_surface(const Surface *surface, const FillParams ¶ms) +Polylines FillMonotonic::fill_surface(const Surface *surface, const FillParams ¶ms) { FillParams params2 = params; - params2.monotonous = true; + params2.monotonic = true; Polylines polylines_out; if (! fill_surface_by_lines(surface, params2, 0.f, 0.f, polylines_out)) { - printf("FillMonotonous::fill_surface() failed to fill a region.\n"); + printf("FillMonotonic::fill_surface() failed to fill a region.\n"); } return polylines_out; } diff --git a/src/libslic3r/Fill/FillRectilinear2.hpp b/src/libslic3r/Fill/FillRectilinear2.hpp index 3fe95f19c5..fd28f155d4 100644 --- a/src/libslic3r/Fill/FillRectilinear2.hpp +++ b/src/libslic3r/Fill/FillRectilinear2.hpp @@ -20,11 +20,11 @@ protected: bool fill_surface_by_lines(const Surface *surface, const FillParams ¶ms, float angleBase, float pattern_shift, Polylines &polylines_out); }; -class FillMonotonous : public FillRectilinear2 +class FillMonotonic : public FillRectilinear2 { public: - virtual Fill* clone() const { return new FillMonotonous(*this); }; - virtual ~FillMonotonous() = default; + virtual Fill* clone() const { return new FillMonotonic(*this); }; + virtual ~FillMonotonic() = default; virtual Polylines fill_surface(const Surface *surface, const FillParams ¶ms); virtual bool no_sort() const { return true; } }; diff --git a/src/libslic3r/Fill/FillRectilinear3.cpp b/src/libslic3r/Fill/FillRectilinear3.cpp deleted file mode 100644 index 078feeae92..0000000000 --- a/src/libslic3r/Fill/FillRectilinear3.cpp +++ /dev/null @@ -1,1642 +0,0 @@ -#include -#include - -#include -#include -#include - -#include - -#include "../ClipperUtils.hpp" -#include "../ExPolygon.hpp" -#include "../Geometry.hpp" -#include "../Surface.hpp" -#include "../Int128.hpp" - -#include "FillRectilinear3.hpp" - -// #define SLIC3R_DEBUG - -// Make assert active if SLIC3R_DEBUG -#ifdef SLIC3R_DEBUG - #undef NDEBUG - #define DEBUG - #define _DEBUG - #include "../SVG.hpp" -#endif - -#include - -namespace Slic3r { - -namespace FillRectilinear3_Internal { - -// A container maintaining the source expolygon with its inner offsetted polygon. -// The source expolygon is offsetted twice: -// 1) A tiny offset is used to get a contour, to which the open hatching lines will be extended. -// 2) A larger offset is used to get a contor, along which the individual hatching lines will be connected. -struct ExPolygonWithOffset -{ -public: - ExPolygonWithOffset( - const ExPolygon &expolygon, - float aoffset1, - float aoffset2) - { - // Copy and rotate the source polygons. - polygons_src = expolygon; - - double mitterLimit = 3.; - // for the infill pattern, don't cut the corners. - // default miterLimt = 3 - //double mitterLimit = 10.; - assert(aoffset1 < 0); - assert(aoffset2 < 0); - assert(aoffset2 < aoffset1); -// bool sticks_removed = remove_sticks(polygons_src); -// if (sticks_removed) printf("Sticks removed!\n"); - polygons_outer = offset(polygons_src, aoffset1, - ClipperLib::jtMiter, - mitterLimit); - polygons_inner = offset(polygons_outer, aoffset2 - aoffset1, - ClipperLib::jtMiter, - mitterLimit); - // Filter out contours with zero area or small area, contours with 2 points only. - const double min_area_threshold = 0.01 * aoffset2 * aoffset2; - remove_small(polygons_outer, min_area_threshold); - remove_small(polygons_inner, min_area_threshold); - remove_sticks(polygons_outer); - remove_sticks(polygons_inner); - n_contours_outer = polygons_outer.size(); - n_contours_inner = polygons_inner.size(); - n_contours = n_contours_outer + n_contours_inner; - polygons_ccw.assign(n_contours, false); - for (size_t i = 0; i < n_contours; ++ i) { - contour(i).remove_duplicate_points(); - assert(! contour(i).has_duplicate_points()); - polygons_ccw[i] = Slic3r::Geometry::is_ccw(contour(i)); - } - } - - // Any contour with offset1 - bool is_contour_outer(size_t idx) const { return idx < n_contours_outer; } - // Any contour with offset2 - bool is_contour_inner(size_t idx) const { return idx >= n_contours_outer; } - - const Polygon& contour(size_t idx) const - { return is_contour_outer(idx) ? polygons_outer[idx] : polygons_inner[idx - n_contours_outer]; } - - Polygon& contour(size_t idx) - { return is_contour_outer(idx) ? polygons_outer[idx] : polygons_inner[idx - n_contours_outer]; } - - bool is_contour_ccw(size_t idx) const { return polygons_ccw[idx] != 0; } - - BoundingBox bounding_box_src() const - { return get_extents(polygons_src); } - BoundingBox bounding_box_outer() const - { return get_extents(polygons_outer); } - BoundingBox bounding_box_inner() const - { return get_extents(polygons_inner); } - -#ifdef SLIC3R_DEBUG - void export_to_svg(Slic3r::SVG &svg) const { - svg.draw_outline(polygons_src, "black"); - svg.draw_outline(polygons_outer, "green"); - svg.draw_outline(polygons_inner, "brown"); - } -#endif /* SLIC3R_DEBUG */ - - ExPolygon polygons_src; - Polygons polygons_outer; - Polygons polygons_inner; - - size_t n_contours_outer; - size_t n_contours_inner; - size_t n_contours; - -protected: - // For each polygon of polygons_inner, remember its orientation. - std::vector polygons_ccw; -}; - -class SegmentedIntersectionLine; - -// Intersection point of a vertical line with a polygon segment. -class SegmentIntersection -{ -public: - SegmentIntersection() : - line(nullptr), - expoly_with_offset(nullptr), - iContour(0), - iSegment(0), - type(UNKNOWN), - consumed_vertical_up(false), - consumed_perimeter_right(false) - {} - - // Parent object owning this intersection point. - const SegmentedIntersectionLine *line; - // Container with the source expolygon and its shrank copies, to be intersected by the line. - const ExPolygonWithOffset *expoly_with_offset; - - // Index of a contour in ExPolygonWithOffset, with which this vertical line intersects. - size_t iContour; - // Index of a segment in iContour, with which this vertical line intersects. - size_t iSegment; - - // Kind of intersection. With the original contour, or with the inner offestted contour? - // A vertical segment will be at least intersected by OUTER_LOW, OUTER_HIGH, - // but it could be intersected with OUTER_LOW, INNER_LOW, INNER_HIGH, OUTER_HIGH, - // and there may be more than one pair of INNER_LOW, INNER_HIGH between OUTER_LOW, OUTER_HIGH. - enum SegmentIntersectionType { - OUTER_LOW = 0, - OUTER_HIGH = 1, - INNER_LOW = 2, - INNER_HIGH = 3, - UNKNOWN = -1 - }; - SegmentIntersectionType type; - - // For the INNER_LOW type, this point may be connected to another INNER_LOW point following a perimeter contour. - // For the INNER_HIGH type, this point may be connected to another INNER_HIGH point following a perimeter contour. - // If INNER_LOW is connected to INNER_HIGH or vice versa, - // one has to make sure the vertical infill line does not overlap with the connecting perimeter line. - bool is_inner() const { return type == INNER_LOW || type == INNER_HIGH; } - bool is_outer() const { return type == OUTER_LOW || type == OUTER_HIGH; } - bool is_low () const { return type == INNER_LOW || type == OUTER_LOW; } - bool is_high () const { return type == INNER_HIGH || type == OUTER_HIGH; } - - // Calculate a position of this intersection point. The position does not need to be necessary exact. - Point pos() const; - - // Returns 0, if this and other segments intersect at the hatching line. - // Returns -1, if this intersection is below the other intersection on the hatching line. - // Returns +1 otherwise. - int ordering_along_line(const SegmentIntersection &other) const; - - // Compare two y intersection points given by rational numbers. - bool operator< (const SegmentIntersection &other) const; - // { return this->ordering_along_line(other) == -1; } - bool operator==(const SegmentIntersection &other) const { return this->ordering_along_line(other) == 0; } - - //FIXME legacy code, suporting the old graph traversal algorithm. Please remove. - // Was this segment along the y axis consumed? - // Up means up along the vertical segment. - bool consumed_vertical_up; - // Was a segment of the inner perimeter contour consumed? - // Right means right from the vertical segment. - bool consumed_perimeter_right; -}; - -// A single hathing line intersecting the ExPolygonWithOffset. -class SegmentedIntersectionLine -{ -public: - // Index of this vertical intersection line. - size_t idx; - // Position of the line along the X axis of the oriented bounding box. -// coord_t x; - // Position of this vertical intersection line, rotated to the world coordinate system. - Point pos; - // Direction of this vertical intersection line, rotated to the world coordinate system. The direction is not normalized to maintain a sufficient accuracy! - Vector dir; - // List of intersection points with polygons, sorted increasingly by the y axis. - // The SegmentIntersection keeps a pointer to this object to access the start and direction of this line. - std::vector intersections; -}; - -// Return an intersection point of the parent SegmentedIntersectionLine with the segment of a parent ExPolygonWithOffset. -// The intersected segment of the ExPolygonWithOffset is addressed with (iContour, iSegment). -// When calling this method, the SegmentedIntersectionLine must not be parallel with the segment. -Point SegmentIntersection::pos() const -{ - // Get the two rays to be intersected. - const Polygon &poly = this->expoly_with_offset->contour(this->iContour); - // 30 bits + 1 signum bit. - const Point &seg_start = poly.points[(this->iSegment == 0) ? poly.points.size() - 1 : this->iSegment - 1]; - const Point &seg_end = poly.points[this->iSegment]; - // Point, vector of the segment. - const Vec2d p1(seg_start.cast()); - const Vec2d v1((seg_end - seg_start).cast()); - // Point, vector of this hatching line. - const Vec2d p2(line->pos.cast()); - const Vec2d v2(line->dir.cast()); - // Intersect the two rays. - double denom = v1(0) * v2(1) - v2(0) * v1(1); - Point out; - if (denom == 0.) { - // Lines are collinear. As the pos() method is not supposed to be called on collinear vectors, - // the source vectors are not quite collinear. Return the center of the contour segment. - out = seg_start + seg_end; - out(0) >>= 1; - out(1) >>= 1; - } else { - // Find the intersection point. - double t = (v2(0) * (p1(1) - p2(1)) - v2(1) * (p1(0) - p2(0))) / denom; - if (t < 0.) - out = seg_start; - else if (t > 1.) - out = seg_end; - else { - out(0) = coord_t(floor(p1(0) + t * v1(0) + 0.5)); - out(1) = coord_t(floor(p1(1) + t * v1(1) + 0.5)); - } - } - return out; -} - -static inline int signum(int64_t v) { return (v > 0) - (v < 0); } - -// Returns 0, if this and other segments intersect at the hatching line. -// Returns -1, if this intersection is below the other intersection on the hatching line. -// Returns +1 otherwise. -int SegmentIntersection::ordering_along_line(const SegmentIntersection &other) const -{ - assert(this->line == other.line); - assert(this->expoly_with_offset == other.expoly_with_offset); - - if (this->iContour == other.iContour && this->iSegment == other.iSegment) - return true; - - // Segment of this - const Polygon &poly_a = this->expoly_with_offset->contour(this->iContour); - // 30 bits + 1 signum bit. - const Point &seg_start_a = poly_a.points[(this->iSegment == 0) ? poly_a.points.size() - 1 : this->iSegment - 1]; - const Point &seg_end_a = poly_a.points[this->iSegment]; - - // Segment of other - const Polygon &poly_b = this->expoly_with_offset->contour(other.iContour); - // 30 bits + 1 signum bit. - const Point &seg_start_b = poly_b.points[(other.iSegment == 0) ? poly_b.points.size() - 1 : other.iSegment - 1]; - const Point &seg_end_b = poly_b.points[other.iSegment]; - - if (this->iContour == other.iContour) { - if ((this->iSegment + 1) % poly_a.points.size() == other.iSegment) { - // other.iSegment succeeds this->iSegment - assert(seg_end_a == seg_start_b); - // Avoid calling the 128bit x 128bit multiplication below if this->line intersects the common point. - if (cross2(Vec2i64(this->line->dir.cast()), (seg_end_b - this->line->pos).cast()) == 0) - return 0; - } else if ((other.iSegment + 1) % poly_a.points.size() == this->iSegment) { - // this->iSegment succeeds other.iSegment - assert(seg_start_a == seg_end_b); - // Avoid calling the 128bit x 128bit multiplication below if this->line intersects the common point. - if (cross2(Vec2i64(this->line->dir.cast()), (seg_start_a - this->line->pos).cast()) == 0) - return 0; - } else { - // General case. - } - } - - // First test, whether both points of one segment are completely in one half-plane of the other line. - const Vec2i64 vec_b = (seg_end_b - seg_start_b).cast(); - int side_start = signum(cross2(vec_b, (seg_start_a - seg_start_b).cast())); - int side_end = signum(cross2(vec_b, (seg_end_a - seg_start_b).cast())); - int side = side_start * side_end; - if (side > 0) - // This segment is completely inside one half-plane of the other line, therefore the ordering is trivial. - return signum(cross2(vec_b, this->line->dir.cast())) * side_start; - - const Vec2i64 vec_a = (seg_end_a - seg_start_a).cast(); - int side_start2 = signum(cross2(vec_a, (seg_start_b - seg_start_a).cast())); - int side_end2 = signum(cross2(vec_a, (seg_end_b - seg_start_a).cast())); - int side2 = side_start2 * side_end2; - //if (side == 0 && side2 == 0) - // The segments share one of their end points. - if (side2 > 0) - // This segment is completely inside one half-plane of the other line, therefore the ordering is trivial. - return signum(cross2(this->line->dir.cast(), vec_a)) * side_start2; - - // The two segments intersect and they are not sucessive segments of the same contour. - // Ordering of the points depends on the position of the segment intersection (left / right from this->line), - // therefore a simple test over the input segment end points is not sufficient. - - // Find the parameters of intersection of the two segmetns with this->line. - int64_t denom1 = cross2(this->line->dir.cast(), vec_a); - int64_t denom2 = cross2(this->line->dir.cast(), vec_b); - Vec2i64 vx_a = (seg_start_a - this->line->pos).cast(); - Vec2i64 vx_b = (seg_start_b - this->line->pos).cast(); - int64_t t1_times_denom1 = vx_a(0) * vec_a(1) - vx_a(1) * vec_a(0); - int64_t t2_times_denom2 = vx_b(0) * vec_b(1) - vx_b(1) * vec_b(0); - assert(denom1 != 0); - assert(denom2 != 0); - return Int128::compare_rationals_filtered(t1_times_denom1, denom1, t2_times_denom2, denom2); -} - -// Compare two y intersection points given by rational numbers. -bool SegmentIntersection::operator<(const SegmentIntersection &other) const -{ -#ifdef _DEBUG - Point p1 = this->pos(); - Point p2 = other.pos(); - int64_t d = this->line->dir.cast().dot((p2 - p1).cast()); -#endif /* _DEBUG */ - int ordering = this->ordering_along_line(other); -#ifdef _DEBUG - if (ordering == -1) - assert(d >= - int64_t(SCALED_EPSILON)); - else if (ordering == 1) - assert(d <= int64_t(SCALED_EPSILON)); -#endif /* _DEBUG */ - return ordering == -1; -} - -// When doing a rectilinear / grid / triangle / stars / cubic infill, -// the following class holds the hatching lines of each of the hatching directions. -class InfillHatchingSingleDirection -{ -public: - // Hatching angle, CCW from the X axis. - double angle; - // Starting point of the 1st hatching line. - Point start_point; - // Direction vector, its size is not normalized to maintain a sufficient accuracy! - Vector direction; - // Spacing of the hatching lines, perpendicular to the direction vector. - coord_t line_spacing; - // Infill segments oriented at angle. - std::vector segs; -}; - -// For the rectilinear, grid, triangles, stars and cubic pattern fill one InfillHatchingSingleDirection structure -// for each infill direction. The segments stored in InfillHatchingSingleDirection will then form a graph of candidate -// paths to be extruded. -static bool prepare_infill_hatching_segments( - // Input geometry to be hatch, containing two concentric contours for each input contour. - const ExPolygonWithOffset &poly_with_offset, - // fill density, dont_adjust - const FillParams ¶ms, - // angle, pattern_shift, spacing - FillRectilinear3::FillDirParams &fill_dir_params, - // Reference point of the pattern, to which the infill lines will be alligned, and the base angle. - const std::pair &rotate_vector, - // Resulting straight segments of the infill graph. - InfillHatchingSingleDirection &out) -{ - out.angle = rotate_vector.first + fill_dir_params.angle; - out.direction = Point(coord_t(scale_(1000)), coord_t(0)); - // Hatch along the Y axis of the rotated coordinate system. - out.direction.rotate(out.angle + 0.5 * M_PI); - out.segs.clear(); - - assert(params.density > 0.0001f && params.density <= 1.f); - coord_t line_spacing = coord_t(scale_(fill_dir_params.spacing) / params.density); - - // Bounding box around the source contour, aligned with out.angle. - BoundingBox bounding_box = get_extents_rotated(poly_with_offset.polygons_src.contour, - out.angle); - - // Define the flow spacing according to requested density. - if (params.full_infill() && ! params.dont_adjust) { - // Full infill, adjust the line spacing to fit an integer number of lines. - out.line_spacing = Fill::_adjust_solid_spacing(bounding_box.size()(0), line_spacing); - // Report back the adjusted line spacing. - fill_dir_params.spacing = unscale(line_spacing); - } else { - // Extend bounding box so that our pattern will be aligned with the other layers. - // Transform the reference point to the rotated coordinate system. - Point refpt = rotate_vector.second.rotated(- out.angle); - // _align_to_grid will not work correctly with positive pattern_shift. - coord_t pattern_shift_scaled = coord_t(scale_(fill_dir_params.pattern_shift)) % line_spacing; - refpt(0) -= (pattern_shift_scaled >= 0) ? pattern_shift_scaled : (line_spacing + pattern_shift_scaled); - bounding_box.merge(Fill::_align_to_grid( - bounding_box.min, - Point(line_spacing, line_spacing), - refpt)); - } - - // Intersect a set of euqally spaced vertical lines wiht expolygon. - // n_vlines = ceil(bbox_width / line_spacing) - size_t n_vlines = (bounding_box.max(0) - bounding_box.min(0) + line_spacing - 1) / line_spacing; - coord_t x0 = bounding_box.min(0); - if (params.full_infill()) - x0 += coord_t((line_spacing + SCALED_EPSILON) / 2); - - out.line_spacing = line_spacing; - out.start_point = Point(x0, bounding_box.min(1)); - out.start_point.rotate(out.angle); - -#ifdef SLIC3R_DEBUG - static int iRun = 0; - BoundingBox bbox_svg = poly_with_offset.bounding_box_outer(); - ::Slic3r::SVG svg(debug_out_path("FillRectilinear2-%d.svg", iRun), bbox_svg); // , scale_(1.)); - poly_with_offset.export_to_svg(svg); - { - ::Slic3r::SVG svg(debug_out_path("FillRectilinear2-initial-%d.svg", iRun), bbox_svg); // , scale_(1.)); - poly_with_offset.export_to_svg(svg); - } - iRun ++; -#endif /* SLIC3R_DEBUG */ - - // For each contour - // Allocate storage for the segments. - out.segs.assign(n_vlines, SegmentedIntersectionLine()); - double cos_a = cos(out.angle); - double sin_a = sin(out.angle); - for (size_t i = 0; i < n_vlines; ++ i) { - auto &seg = out.segs[i]; - seg.idx = i; - // seg(0) = x0 + coord_t(i) * line_spacing; - coord_t x = x0 + coord_t(i) * line_spacing; - seg.pos(0) = coord_t(floor(cos_a * x - sin_a * bounding_box.min(1) + 0.5)); - seg.pos(1) = coord_t(floor(cos_a * bounding_box.min(1) + sin_a * x + 0.5)); - seg.dir = out.direction; - } - - for (size_t iContour = 0; iContour < poly_with_offset.n_contours; ++ iContour) { - const Points &contour = poly_with_offset.contour(iContour).points; - if (contour.size() < 2) - continue; - // For each segment - for (size_t iSegment = 0; iSegment < contour.size(); ++ iSegment) { - size_t iPrev = ((iSegment == 0) ? contour.size() : iSegment) - 1; - const Point *pl = &contour[iPrev]; - const Point *pr = &contour[iSegment]; - // Orient the segment to the direction vector. - const Point v = *pr - *pl; - int orientation = Int128::sign_determinant_2x2_filtered(v(0), v(1), out.direction(0), out.direction(1)); - if (orientation == 0) - // Ignore strictly vertical segments. - continue; - if (orientation < 0) - // Always orient the input segment consistently towards the hatching direction. - std::swap(pl, pr); - // Which of the equally spaced vertical lines is intersected by this segment? - coord_t l = (coord_t)floor(cos_a * (*pl)(0) + sin_a * (*pl)(1) - SCALED_EPSILON); - coord_t r = (coord_t)ceil (cos_a * (*pr)(0) + sin_a * (*pr)(1) + SCALED_EPSILON); - assert(l < r - SCALED_EPSILON); - // il, ir are the left / right indices of vertical lines intersecting a segment - int il = std::max(0, (l - x0 + line_spacing) / line_spacing); - int ir = std::min(int(out.segs.size()) - 1, (r - x0) / line_spacing); - // The previous tests were done with floating point arithmetics over an epsilon-extended interval. - // Now do the same tests with exact arithmetics over the exact interval. - while (il <= ir && int128::orient(out.segs[il].pos, out.segs[il].pos + out.direction, *pl) < 0) - ++ il; - while (il <= ir && int128::orient(out.segs[ir].pos, out.segs[ir].pos + out.direction, *pr) > 0) - -- ir; - // Here it is ensured, that - // 1) out.seg is not parallel to (pl, pr) - // 2) all lines from il to ir intersect . - assert(il >= 0 && ir < int(out.segs.size())); - for (int i = il; i <= ir; ++ i) { - // assert(out.segs[i](0) == i * line_spacing + x0); - // assert(l <= out.segs[i](0)); - // assert(r >= out.segs[i](0)); - SegmentIntersection is; - is.line = &out.segs[i]; - is.expoly_with_offset = &poly_with_offset; - is.iContour = iContour; - is.iSegment = iSegment; - // Test whether the calculated intersection point falls into the bounding box of the input segment. - // +-1 to take rounding into account. - assert(int128::orient(out.segs[i].pos, out.segs[i].pos + out.direction, *pl) >= 0); - assert(int128::orient(out.segs[i].pos, out.segs[i].pos + out.direction, *pr) <= 0); - assert(is.pos()(0) + 1 >= std::min((*pl)(0), (*pr)(0))); - assert(is.pos()(1) + 1 >= std::min((*pl)(1), (*pr)(1))); - assert(is.pos()(0) <= std::max((*pl)(0), (*pr)(0)) + 1); - assert(is.pos()(1) <= std::max((*pl)(1), (*pr)(1)) + 1); - out.segs[i].intersections.push_back(is); - } - } - } - - // Sort the intersections along their segments, specify the intersection types. - for (size_t i_seg = 0; i_seg < out.segs.size(); ++ i_seg) { - SegmentedIntersectionLine &sil = out.segs[i_seg]; - // Sort the intersection points using exact rational arithmetic. - std::sort(sil.intersections.begin(), sil.intersections.end()); -#ifdef _DEBUG - // Verify that the intersections are sorted along the haching direction. - for (size_t i = 1; i < sil.intersections.size(); ++ i) { - Point p1 = sil.intersections[i - 1].pos(); - Point p2 = sil.intersections[i].pos(); - int64_t d = sil.dir.cast().dot((p2 - p1).cast()); - assert(d >= - int64_t(SCALED_EPSILON)); - } -#endif /* _DEBUG */ - // Assign the intersection types, remove duplicate or overlapping intersection points. - // When a loop vertex touches a vertical line, intersection point is generated for both segments. - // If such two segments are oriented equally, then one of them is removed. - // Otherwise the vertex is tangential to the vertical line and both segments are removed. - // The same rule applies, if the loop is pinched into a single point and this point touches the vertical line: - // The loop has a zero vertical size at the vertical line, therefore the intersection point is removed. - size_t j = 0; - for (size_t i = 0; i < sil.intersections.size(); ++ i) { - // What is the orientation of the segment at the intersection point? - size_t iContour = sil.intersections[i].iContour; - const Points &contour = poly_with_offset.contour(iContour).points; - size_t iSegment = sil.intersections[i].iSegment; - size_t iPrev = ((iSegment == 0) ? contour.size() : iSegment) - 1; - int dir = int128::cross(contour[iSegment] - contour[iPrev], sil.dir); - bool low = dir > 0; - sil.intersections[i].type = poly_with_offset.is_contour_outer(iContour) ? - (low ? SegmentIntersection::OUTER_LOW : SegmentIntersection::OUTER_HIGH) : - (low ? SegmentIntersection::INNER_LOW : SegmentIntersection::INNER_HIGH); - if (j > 0 && sil.intersections[i].iContour == sil.intersections[j-1].iContour) { - // Two successive intersection points on a vertical line with the same contour. This may be a special case. - if (sil.intersections[i] == sil.intersections[j-1]) { - // Two successive segments meet exactly at the vertical line. - #ifdef SLIC3R_DEBUG - // Verify that the segments of sil.intersections[i] and sil.intersections[j-1] are adjoint. - size_t iSegment2 = sil.intersections[j-1].iSegment; - size_t iPrev2 = ((iSegment2 == 0) ? contour.size() : iSegment2) - 1; - assert(iSegment == iPrev2 || iSegment2 == iPrev); - #endif /* SLIC3R_DEBUG */ - if (sil.intersections[i].type == sil.intersections[j-1].type) { - // Two successive segments of the same direction (both to the right or both to the left) - // meet exactly at the vertical line. - // Remove the second intersection point. - } else { - // This is a loop returning to the same point. - // It may as well be a vertex of a loop touching this vertical line. - // Remove both the lines. - -- j; - } - } else if (sil.intersections[i].type == sil.intersections[j-1].type) { - // Two non successive segments of the same direction (both to the right or both to the left) - // meet exactly at the vertical line. That means there is a Z shaped path, where the center segment - // of the Z shaped path is aligned with this vertical line. - // Remove one of the intersection points while maximizing the vertical segment length. - if (low) { - // Remove the second intersection point, keep the first intersection point. - } else { - // Remove the first intersection point, keep the second intersection point. - sil.intersections[j-1] = sil.intersections[i]; - } - } else { - // Vertical line intersects a contour segment at a general position (not at one of its end points). - // or the contour just touches this vertical line with a vertical segment or a sequence of vertical segments. - // Keep both intersection points. - if (j < i) - sil.intersections[j] = sil.intersections[i]; - ++ j; - } - } else { - // Vertical line intersects a contour segment at a general position (not at one of its end points). - if (j < i) - sil.intersections[j] = sil.intersections[i]; - ++ j; - } - } - // Shrink the list of intersections, if any of the intersection was removed during the classification. - if (j < sil.intersections.size()) - sil.intersections.erase(sil.intersections.begin() + j, sil.intersections.end()); - } - - // Verify the segments. If something is wrong, give up. -#define ASSERT_OR_RETURN(CONDITION) do { assert(CONDITION); if (! (CONDITION)) return false; } while (0) -#ifdef _MSC_VER - #pragma warning(push) - #pragma warning(disable: 4127) -#endif - for (size_t i_seg = 0; i_seg < out.segs.size(); ++ i_seg) { - SegmentedIntersectionLine &sil = out.segs[i_seg]; - // The intersection points have to be even. - ASSERT_OR_RETURN((sil.intersections.size() & 1) == 0); - for (size_t i = 0; i < sil.intersections.size();) { - // An intersection segment crossing the bigger contour may cross the inner offsetted contour even number of times. - ASSERT_OR_RETURN(sil.intersections[i].type == SegmentIntersection::OUTER_LOW); - size_t j = i + 1; - ASSERT_OR_RETURN(j < sil.intersections.size()); - ASSERT_OR_RETURN(sil.intersections[j].type == SegmentIntersection::INNER_LOW || sil.intersections[j].type == SegmentIntersection::OUTER_HIGH); - for (; j < sil.intersections.size() && sil.intersections[j].is_inner(); ++ j) ; - ASSERT_OR_RETURN(j < sil.intersections.size()); - ASSERT_OR_RETURN((j & 1) == 1); - ASSERT_OR_RETURN(sil.intersections[j].type == SegmentIntersection::OUTER_HIGH); - ASSERT_OR_RETURN(i + 1 == j || sil.intersections[j - 1].type == SegmentIntersection::INNER_HIGH); - i = j + 1; - } - } -#undef ASSERT_OR_RETURN -#ifdef _MSC_VER - #pragma warning(push) -#endif /* _MSC_VER */ - -#ifdef SLIC3R_DEBUG - // Paint the segments and finalize the SVG file. - for (size_t i_seg = 0; i_seg < out.segs.size(); ++ i_seg) { - SegmentedIntersectionLine &sil = out.segs[i_seg]; - for (size_t i = 0; i < sil.intersections.size();) { - size_t j = i + 1; - for (; j < sil.intersections.size() && sil.intersections[j].is_inner(); ++ j) ; - if (i + 1 == j) { - svg.draw(Line(sil.intersections[i ].pos(), sil.intersections[j ].pos()), "blue"); - } else { - svg.draw(Line(sil.intersections[i ].pos(), sil.intersections[i+1].pos()), "green"); - svg.draw(Line(sil.intersections[i+1].pos(), sil.intersections[j-1].pos()), (j - i + 1 > 4) ? "yellow" : "magenta"); - svg.draw(Line(sil.intersections[j-1].pos(), sil.intersections[j ].pos()), "green"); - } - i = j + 1; - } - } - svg.Close(); -#endif /* SLIC3R_DEBUG */ - - - return true; -} - - - - - - - - -/****************************************************************** Legacy code, to be replaced by a graph algorithm ******************************************************************/ - - -// Having a segment of a closed polygon, calculate its Euclidian length. -// The segment indices seg1 and seg2 signify an end point of an edge in the forward direction of the loop, -// therefore the point p1 lies on poly.points[seg1-1], poly.points[seg1] etc. -static inline coordf_t segment_length(const Polygon &poly, size_t seg1, const Point &p1, size_t seg2, const Point &p2) -{ -#ifdef SLIC3R_DEBUG - // Verify that p1 lies on seg1. This is difficult to verify precisely, - // but at least verify, that p1 lies in the bounding box of seg1. - for (size_t i = 0; i < 2; ++ i) { - size_t seg = (i == 0) ? seg1 : seg2; - Point px = (i == 0) ? p1 : p2; - Point pa = poly.points[((seg == 0) ? poly.points.size() : seg) - 1]; - Point pb = poly.points[seg]; - if (pa(0) > pb(0)) - std::swap(pa(0), pb(0)); - if (pa(1) > pb(1)) - std::swap(pa(1), pb(1)); - assert(px(0) >= pa(0) && px(0) <= pb(0)); - assert(px(1) >= pa(1) && px(1) <= pb(1)); - } -#endif /* SLIC3R_DEBUG */ - const Point *pPrev = &p1; - const Point *pThis = NULL; - coordf_t len = 0; - if (seg1 <= seg2) { - for (size_t i = seg1; i < seg2; ++ i, pPrev = pThis) - len += (*pPrev - *(pThis = &poly.points[i])).cast().norm(); - } else { - for (size_t i = seg1; i < poly.points.size(); ++ i, pPrev = pThis) - len += (*pPrev - *(pThis = &poly.points[i])).cast().norm(); - for (size_t i = 0; i < seg2; ++ i, pPrev = pThis) - len += (*pPrev - *(pThis = &poly.points[i])).cast().norm(); - } - len += (*pPrev - p2).cast().norm(); - return len; -} - -// Append a segment of a closed polygon to a polyline. -// The segment indices seg1 and seg2 signify an end point of an edge in the forward direction of the loop. -// Only insert intermediate points between seg1 and seg2. -static inline void polygon_segment_append(Points &out, const Polygon &polygon, size_t seg1, size_t seg2) -{ - if (seg1 == seg2) { - // Nothing to append from this segment. - } else if (seg1 < seg2) { - // Do not append a point pointed to by seg2. - out.insert(out.end(), polygon.points.begin() + seg1, polygon.points.begin() + seg2); - } else { - out.reserve(out.size() + seg2 + polygon.points.size() - seg1); - out.insert(out.end(), polygon.points.begin() + seg1, polygon.points.end()); - // Do not append a point pointed to by seg2. - out.insert(out.end(), polygon.points.begin(), polygon.points.begin() + seg2); - } -} - -// Append a segment of a closed polygon to a polyline. -// The segment indices seg1 and seg2 signify an end point of an edge in the forward direction of the loop, -// but this time the segment is traversed backward. -// Only insert intermediate points between seg1 and seg2. -static inline void polygon_segment_append_reversed(Points &out, const Polygon &polygon, size_t seg1, size_t seg2) -{ - if (seg1 >= seg2) { - out.reserve(seg1 - seg2); - for (size_t i = seg1; i > seg2; -- i) - out.push_back(polygon.points[i - 1]); - } else { - // it could be, that seg1 == seg2. In that case, append the complete loop. - out.reserve(out.size() + seg2 + polygon.points.size() - seg1); - for (size_t i = seg1; i > 0; -- i) - out.push_back(polygon.points[i - 1]); - for (size_t i = polygon.points.size(); i > seg2; -- i) - out.push_back(polygon.points[i - 1]); - } -} - -static inline int distance_of_segmens(const Polygon &poly, size_t seg1, size_t seg2, bool forward) -{ - int d = int(seg2) - int(seg1); - if (! forward) - d = - d; - if (d < 0) - d += int(poly.points.size()); - return d; -} - -// For a vertical line, an inner contour and an intersection point, -// find an intersection point on the previous resp. next vertical line. -// The intersection point is connected with the prev resp. next intersection point with iInnerContour. -// Return -1 if there is no such point on the previous resp. next vertical line. -static inline int intersection_on_prev_next_vertical_line( - const ExPolygonWithOffset &poly_with_offset, - const std::vector &segs, - size_t iVerticalLine, - size_t iInnerContour, - size_t iIntersection, - bool dir_is_next) -{ - size_t iVerticalLineOther = iVerticalLine; - if (dir_is_next) { - if (++ iVerticalLineOther == segs.size()) - // No successive vertical line. - return -1; - } else if (iVerticalLineOther -- == 0) { - // No preceding vertical line. - return -1; - } - - const SegmentedIntersectionLine &il = segs[iVerticalLine]; - const SegmentIntersection &itsct = il.intersections[iIntersection]; - const SegmentedIntersectionLine &il2 = segs[iVerticalLineOther]; - const Polygon &poly = poly_with_offset.contour(iInnerContour); -// const bool ccw = poly_with_offset.is_contour_ccw(iInnerContour); - const bool forward = itsct.is_low() == dir_is_next; - // Resulting index of an intersection point on il2. - int out = -1; - // Find an intersection point on iVerticalLineOther, intersecting iInnerContour - // at the same orientation as iIntersection, and being closest to iIntersection - // in the number of contour segments, when following the direction of the contour. - int dmin = std::numeric_limits::max(); - for (size_t i = 0; i < il2.intersections.size(); ++ i) { - const SegmentIntersection &itsct2 = il2.intersections[i]; - if (itsct.iContour == itsct2.iContour && itsct.type == itsct2.type) { - /* - if (itsct.is_low()) { - assert(itsct.type == SegmentIntersection::INNER_LOW); - assert(iIntersection > 0); - assert(il.intersections[iIntersection-1].type == SegmentIntersection::OUTER_LOW); - assert(i > 0); - if (il2.intersections[i-1].is_inner()) - // Take only the lowest inner intersection point. - continue; - assert(il2.intersections[i-1].type == SegmentIntersection::OUTER_LOW); - } else { - assert(itsct.type == SegmentIntersection::INNER_HIGH); - assert(iIntersection+1 < il.intersections.size()); - assert(il.intersections[iIntersection+1].type == SegmentIntersection::OUTER_HIGH); - assert(i+1 < il2.intersections.size()); - if (il2.intersections[i+1].is_inner()) - // Take only the highest inner intersection point. - continue; - assert(il2.intersections[i+1].type == SegmentIntersection::OUTER_HIGH); - } - */ - // The intersection points lie on the same contour and have the same orientation. - // Find the intersection point with a shortest path in the direction of the contour. - int d = distance_of_segmens(poly, itsct.iSegment, itsct2.iSegment, forward); - if (d < dmin) { - out = i; - dmin = d; - } - } - } - //FIXME this routine is not asymptotic optimal, it will be slow if there are many intersection points along the line. - return out; -} - -static inline int intersection_on_prev_vertical_line( - const ExPolygonWithOffset &poly_with_offset, - const std::vector &segs, - size_t iVerticalLine, - size_t iInnerContour, - size_t iIntersection) -{ - return intersection_on_prev_next_vertical_line(poly_with_offset, segs, iVerticalLine, iInnerContour, iIntersection, false); -} - -static inline int intersection_on_next_vertical_line( - const ExPolygonWithOffset &poly_with_offset, - const std::vector &segs, - size_t iVerticalLine, - size_t iInnerContour, - size_t iIntersection) -{ - return intersection_on_prev_next_vertical_line(poly_with_offset, segs, iVerticalLine, iInnerContour, iIntersection, true); -} - -enum IntersectionTypeOtherVLine { - // There is no connection point on the other vertical line. - INTERSECTION_TYPE_OTHER_VLINE_UNDEFINED = -1, - // Connection point on the other vertical segment was found - // and it could be followed. - INTERSECTION_TYPE_OTHER_VLINE_OK = 0, - // The connection segment connects to a middle of a vertical segment. - // Cannot follow. - INTERSECTION_TYPE_OTHER_VLINE_INNER, - // Cannot extend the contor to this intersection point as either the connection segment - // or the succeeding vertical segment were already consumed. - INTERSECTION_TYPE_OTHER_VLINE_CONSUMED, - // Not the first intersection along the contor. This intersection point - // has been preceded by an intersection point along the vertical line. - INTERSECTION_TYPE_OTHER_VLINE_NOT_FIRST, -}; - -// Find an intersection on a previous line, but return -1, if the connecting segment of a perimeter was already extruded. -static inline IntersectionTypeOtherVLine intersection_type_on_prev_next_vertical_line( - const std::vector &segs, - size_t iVerticalLine, - size_t iIntersection, - size_t iIntersectionOther, - bool dir_is_next) -{ - // This routine will propose a connecting line even if the connecting perimeter segment intersects - // iVertical line multiple times before reaching iIntersectionOther. - if (iIntersectionOther == size_t(-1)) - return INTERSECTION_TYPE_OTHER_VLINE_UNDEFINED; - assert(dir_is_next ? (iVerticalLine + 1 < segs.size()) : (iVerticalLine > 0)); - const SegmentedIntersectionLine &il_this = segs[iVerticalLine]; - const SegmentIntersection &itsct_this = il_this.intersections[iIntersection]; - const SegmentedIntersectionLine &il_other = segs[dir_is_next ? (iVerticalLine+1) : (iVerticalLine-1)]; - const SegmentIntersection &itsct_other = il_other.intersections[iIntersectionOther]; - assert(itsct_other.is_inner()); - assert(iIntersectionOther > 0); - assert(iIntersectionOther + 1 < il_other.intersections.size()); - // Is iIntersectionOther at the boundary of a vertical segment? - const SegmentIntersection &itsct_other2 = il_other.intersections[itsct_other.is_low() ? iIntersectionOther - 1 : iIntersectionOther + 1]; - if (itsct_other2.is_inner()) - // Cannot follow a perimeter segment into the middle of another vertical segment. - // Only perimeter segments connecting to the end of a vertical segment are followed. - return INTERSECTION_TYPE_OTHER_VLINE_INNER; - assert(itsct_other.is_low() == itsct_other2.is_low()); - if (dir_is_next ? itsct_this.consumed_perimeter_right : itsct_other.consumed_perimeter_right) - // This perimeter segment was already consumed. - return INTERSECTION_TYPE_OTHER_VLINE_CONSUMED; - if (itsct_other.is_low() ? itsct_other.consumed_vertical_up : il_other.intersections[iIntersectionOther-1].consumed_vertical_up) - // This vertical segment was already consumed. - return INTERSECTION_TYPE_OTHER_VLINE_CONSUMED; - return INTERSECTION_TYPE_OTHER_VLINE_OK; -} - -static inline IntersectionTypeOtherVLine intersection_type_on_prev_vertical_line( - const std::vector &segs, - size_t iVerticalLine, - size_t iIntersection, - size_t iIntersectionPrev) -{ - return intersection_type_on_prev_next_vertical_line(segs, iVerticalLine, iIntersection, iIntersectionPrev, false); -} - -static inline IntersectionTypeOtherVLine intersection_type_on_next_vertical_line( - const std::vector &segs, - size_t iVerticalLine, - size_t iIntersection, - size_t iIntersectionNext) -{ - return intersection_type_on_prev_next_vertical_line(segs, iVerticalLine, iIntersection, iIntersectionNext, true); -} - -// Measure an Euclidian length of a perimeter segment when going from iIntersection to iIntersection2. -static inline coordf_t measure_perimeter_prev_next_segment_length( - const ExPolygonWithOffset &poly_with_offset, - const std::vector &segs, - size_t iVerticalLine, - size_t iInnerContour, - size_t iIntersection, - size_t iIntersection2, - bool dir_is_next) -{ - size_t iVerticalLineOther = iVerticalLine; - if (dir_is_next) { - if (++ iVerticalLineOther == segs.size()) - // No successive vertical line. - return coordf_t(-1); - } else if (iVerticalLineOther -- == 0) { - // No preceding vertical line. - return coordf_t(-1); - } - - const SegmentedIntersectionLine &il = segs[iVerticalLine]; - const SegmentIntersection &itsct = il.intersections[iIntersection]; - const SegmentedIntersectionLine &il2 = segs[iVerticalLineOther]; - const SegmentIntersection &itsct2 = il2.intersections[iIntersection2]; - const Polygon &poly = poly_with_offset.contour(iInnerContour); -// const bool ccw = poly_with_offset.is_contour_ccw(iInnerContour); - assert(itsct.type == itsct2.type); - assert(itsct.iContour == itsct2.iContour); - assert(itsct.is_inner()); - const bool forward = itsct.is_low() == dir_is_next; - - Point p1 = itsct.pos(); - Point p2 = itsct2.pos(); - return forward ? - segment_length(poly, itsct .iSegment, p1, itsct2.iSegment, p2) : - segment_length(poly, itsct2.iSegment, p2, itsct .iSegment, p1); -} - -static inline coordf_t measure_perimeter_prev_segment_length( - const ExPolygonWithOffset &poly_with_offset, - const std::vector &segs, - size_t iVerticalLine, - size_t iInnerContour, - size_t iIntersection, - size_t iIntersection2) -{ - return measure_perimeter_prev_next_segment_length(poly_with_offset, segs, iVerticalLine, iInnerContour, iIntersection, iIntersection2, false); -} - -static inline coordf_t measure_perimeter_next_segment_length( - const ExPolygonWithOffset &poly_with_offset, - const std::vector &segs, - size_t iVerticalLine, - size_t iInnerContour, - size_t iIntersection, - size_t iIntersection2) -{ - return measure_perimeter_prev_next_segment_length(poly_with_offset, segs, iVerticalLine, iInnerContour, iIntersection, iIntersection2, true); -} - -// Append the points of a perimeter segment when going from iIntersection to iIntersection2. -// The first point (the point of iIntersection) will not be inserted, -// the last point will be inserted. -static inline void emit_perimeter_prev_next_segment( - const ExPolygonWithOffset &poly_with_offset, - const std::vector &segs, - size_t iVerticalLine, - size_t iInnerContour, - size_t iIntersection, - size_t iIntersection2, - Polyline &out, - bool dir_is_next) -{ - size_t iVerticalLineOther = iVerticalLine; - if (dir_is_next) { - ++ iVerticalLineOther; - assert(iVerticalLineOther < segs.size()); - } else { - assert(iVerticalLineOther > 0); - -- iVerticalLineOther; - } - - const SegmentedIntersectionLine &il = segs[iVerticalLine]; - const SegmentIntersection &itsct = il.intersections[iIntersection]; - const SegmentedIntersectionLine &il2 = segs[iVerticalLineOther]; - const SegmentIntersection &itsct2 = il2.intersections[iIntersection2]; - const Polygon &poly = poly_with_offset.contour(iInnerContour); -// const bool ccw = poly_with_offset.is_contour_ccw(iInnerContour); - assert(itsct.type == itsct2.type); - assert(itsct.iContour == itsct2.iContour); - assert(itsct.is_inner()); - const bool forward = itsct.is_low() == dir_is_next; - // Do not append the first point. - // out.points.push_back(Point(il.pos, itsct.pos)); - if (forward) - polygon_segment_append(out.points, poly, itsct.iSegment, itsct2.iSegment); - else - polygon_segment_append_reversed(out.points, poly, itsct.iSegment, itsct2.iSegment); - // Append the last point. - out.points.push_back(itsct2.pos()); -} - -static inline coordf_t measure_perimeter_segment_on_vertical_line_length( - const ExPolygonWithOffset &poly_with_offset, - const std::vector &segs, - size_t iVerticalLine, - size_t iInnerContour, - size_t iIntersection, - size_t iIntersection2, - bool forward) -{ - const SegmentedIntersectionLine &il = segs[iVerticalLine]; - const SegmentIntersection &itsct = il.intersections[iIntersection]; - const SegmentIntersection &itsct2 = il.intersections[iIntersection2]; - const Polygon &poly = poly_with_offset.contour(iInnerContour); - assert(itsct.is_inner()); - assert(itsct2.is_inner()); - assert(itsct.type != itsct2.type); - assert(itsct.iContour == iInnerContour); - assert(itsct.iContour == itsct2.iContour); - return forward ? - segment_length(poly, itsct .iSegment, itsct.pos(), itsct2.iSegment, itsct2.pos()) : - segment_length(poly, itsct2.iSegment, itsct2.pos(), itsct .iSegment, itsct.pos()); -} - -// Append the points of a perimeter segment when going from iIntersection to iIntersection2. -// The first point (the point of iIntersection) will not be inserted, -// the last point will be inserted. -static inline void emit_perimeter_segment_on_vertical_line( - const ExPolygonWithOffset &poly_with_offset, - const std::vector &segs, - size_t iVerticalLine, - size_t iInnerContour, - size_t iIntersection, - size_t iIntersection2, - Polyline &out, - bool forward) -{ - const SegmentedIntersectionLine &il = segs[iVerticalLine]; - const SegmentIntersection &itsct = il.intersections[iIntersection]; - const SegmentIntersection &itsct2 = il.intersections[iIntersection2]; - const Polygon &poly = poly_with_offset.contour(iInnerContour); - assert(itsct.is_inner()); - assert(itsct2.is_inner()); - assert(itsct.type != itsct2.type); - assert(itsct.iContour == iInnerContour); - assert(itsct.iContour == itsct2.iContour); - // Do not append the first point. - // out.points.push_back(Point(il.pos, itsct.pos)); - if (forward) - polygon_segment_append(out.points, poly, itsct.iSegment, itsct2.iSegment); - else - polygon_segment_append_reversed(out.points, poly, itsct.iSegment, itsct2.iSegment); - // Append the last point. - out.points.push_back(itsct2.pos()); -} - -//TBD: For precise infill, measure the area of a slab spanned by an infill line. -/* -static inline float measure_outer_contour_slab( - const ExPolygonWithOffset &poly_with_offset, - const std::vector &segs, - size_t i_vline, - size_t iIntersection) -{ - const SegmentedIntersectionLine &il = segs[i_vline]; - const SegmentIntersection &itsct = il.intersections[i_vline]; - const SegmentIntersection &itsct2 = il.intersections[iIntersection2]; - const Polygon &poly = poly_with_offset.contour((itsct.iContour); - assert(itsct.is_outer()); - assert(itsct2.is_outer()); - assert(itsct.type != itsct2.type); - assert(itsct.iContour == itsct2.iContour); - if (! itsct.is_outer() || ! itsct2.is_outer() || itsct.type == itsct2.type || itsct.iContour != itsct2.iContour) - // Error, return zero area. - return 0.f; - - // Find possible connection points on the previous / next vertical line. - int iPrev = intersection_on_prev_vertical_line(poly_with_offset, segs, i_vline, itsct.iContour, i_intersection); - int iNext = intersection_on_next_vertical_line(poly_with_offset, segs, i_vline, itsct.iContour, i_intersection); - // Find possible connection points on the same vertical line. - int iAbove = iBelow = -1; - // Does the perimeter intersect the current vertical line above intrsctn? - for (size_t i = i_intersection + 1; i + 1 < seg.intersections.size(); ++ i) - if (seg.intersections[i].iContour == itsct.iContour) - { iAbove = i; break; } - // Does the perimeter intersect the current vertical line below intrsctn? - for (int i = int(i_intersection) - 1; i > 0; -- i) - if (seg.intersections[i].iContour == itsct.iContour) - { iBelow = i; break; } - - if (iSegAbove != -1 && seg.intersections[iAbove].type == SegmentIntersection::OUTER_HIGH) { - // Invalidate iPrev resp. iNext, if the perimeter crosses the current vertical line earlier than iPrev resp. iNext. - // The perimeter contour orientation. - const Polygon &poly = poly_with_offset.contour(itsct.iContour); - { - int d_horiz = (iPrev == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, segs[i_vline-1].intersections[iPrev].iSegment, itsct.iSegment, true); - int d_down = (iBelow == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, iSegBelow, itsct.iSegment, true); - int d_up = (iAbove == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, iSegAbove, itsct.iSegment, true); - if (intrsctn_type_prev == INTERSECTION_TYPE_OTHER_VLINE_OK && d_horiz > std::min(d_down, d_up)) - // The vertical crossing comes eralier than the prev crossing. - // Disable the perimeter going back. - intrsctn_type_prev = INTERSECTION_TYPE_OTHER_VLINE_NOT_FIRST; - if (d_up > std::min(d_horiz, d_down)) - // The horizontal crossing comes earlier than the vertical crossing. - vert_seg_dir_valid_mask &= ~DIR_BACKWARD; - } - { - int d_horiz = (iNext == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, itsct.iSegment, segs[i_vline+1].intersections[iNext].iSegment, true); - int d_down = (iSegBelow == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, itsct.iSegment, iSegBelow, true); - int d_up = (iSegAbove == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, itsct.iSegment, iSegAbove, true); - if (d_up > std::min(d_horiz, d_down)) - // The horizontal crossing comes earlier than the vertical crossing. - vert_seg_dir_valid_mask &= ~DIR_FORWARD; - } - } -} -*/ - -enum DirectionMask -{ - DIR_FORWARD = 1, - DIR_BACKWARD = 2 -}; - -// For the rectilinear, grid, triangles, stars and cubic pattern fill one InfillHatchingSingleDirection structure -// for each infill direction. The segments stored in InfillHatchingSingleDirection will then form a graph of candidate -// paths to be extruded. -static bool fill_hatching_segments_legacy( - // Input geometry to be hatch, containing two concentric contours for each input contour. - const ExPolygonWithOffset &poly_with_offset, - // fill density, dont_adjust - const FillParams ¶ms, - const coord_t link_max_length, - // Resulting straight segments of the infill graph. - InfillHatchingSingleDirection &hatching, - Polylines &polylines_out) -{ - // At the end, only the new polylines will be rotated back. - size_t n_polylines_out_initial = polylines_out.size(); - - std::vector &segs = hatching.segs; - - // For each outer only chords, measure their maximum distance to the bow of the outer contour. - // Mark an outer only chord as consumed, if the distance is low. - for (size_t i_vline = 0; i_vline < segs.size(); ++ i_vline) { - SegmentedIntersectionLine &seg = segs[i_vline]; - for (size_t i_intersection = 0; i_intersection + 1 < seg.intersections.size(); ++ i_intersection) { - if (seg.intersections[i_intersection].type == SegmentIntersection::OUTER_LOW && - seg.intersections[i_intersection+1].type == SegmentIntersection::OUTER_HIGH) { - bool consumed = false; -// if (params.full_infill()) { -// measure_outer_contour_slab(poly_with_offset, segs, i_vline, i_ntersection); -// } else - consumed = true; - seg.intersections[i_intersection].consumed_vertical_up = consumed; - } - } - } - - // Now construct a graph. - // Find the first point. - // Naively one would expect to achieve best results by chaining the paths by the shortest distance, - // but that procedure does not create the longest continuous paths. - // A simple "sweep left to right" procedure achieves better results. - size_t i_vline = 0; - size_t i_intersection = size_t(-1); - // Follow the line, connect the lines into a graph. - // Until no new line could be added to the output path: - Point pointLast; - Polyline *polyline_current = NULL; - if (! polylines_out.empty()) - pointLast = polylines_out.back().points.back(); - for (;;) { - if (i_intersection == size_t(-1)) { - // The path has been interrupted. Find a next starting point, closest to the previous extruder position. - coordf_t dist2min = std::numeric_limits().max(); - for (size_t i_vline2 = 0; i_vline2 < segs.size(); ++ i_vline2) { - const SegmentedIntersectionLine &seg = segs[i_vline2]; - if (! seg.intersections.empty()) { - assert(seg.intersections.size() > 1); - // Even number of intersections with the loops. - assert((seg.intersections.size() & 1) == 0); - assert(seg.intersections.front().type == SegmentIntersection::OUTER_LOW); - for (size_t i = 0; i < seg.intersections.size(); ++ i) { - const SegmentIntersection &intrsctn = seg.intersections[i]; - if (intrsctn.is_outer()) { - assert(intrsctn.is_low() || i > 0); - bool consumed = intrsctn.is_low() ? - intrsctn.consumed_vertical_up : - seg.intersections[i-1].consumed_vertical_up; - if (! consumed) { - coordf_t dist2 = (intrsctn.pos() - pointLast).cast().norm(); - if (dist2 < dist2min) { - dist2min = dist2; - i_vline = i_vline2; - i_intersection = i; - //FIXME We are taking the first left point always. Verify, that the caller chains the paths - // by a shortest distance, while reversing the paths if needed. - //if (polylines_out.empty()) - // Initial state, take the first line, which is the first from the left. - goto found; - } - } - } - } - } - } - if (i_intersection == size_t(-1)) - // We are finished. - break; - found: - // Start a new path. - polylines_out.push_back(Polyline()); - polyline_current = &polylines_out.back(); - // Emit the first point of a path. - pointLast = segs[i_vline].intersections[i_intersection].pos(); - polyline_current->points.push_back(pointLast); - } - - // From the initial point (i_vline, i_intersection), follow a path. - SegmentedIntersectionLine &seg = segs[i_vline]; - SegmentIntersection *intrsctn = &seg.intersections[i_intersection]; - bool going_up = intrsctn->is_low(); - bool try_connect = false; - if (going_up) { - assert(! intrsctn->consumed_vertical_up); - assert(i_intersection + 1 < seg.intersections.size()); - // Step back to the beginning of the vertical segment to mark it as consumed. - if (intrsctn->is_inner()) { - assert(i_intersection > 0); - -- intrsctn; - -- i_intersection; - } - // Consume the complete vertical segment up to the outer contour. - do { - intrsctn->consumed_vertical_up = true; - ++ intrsctn; - ++ i_intersection; - assert(i_intersection < seg.intersections.size()); - } while (intrsctn->type != SegmentIntersection::OUTER_HIGH); - if ((intrsctn - 1)->is_inner()) { - // Step back. - -- intrsctn; - -- i_intersection; - assert(intrsctn->type == SegmentIntersection::INNER_HIGH); - try_connect = true; - } - } else { - // Going down. - assert(intrsctn->is_high()); - assert(i_intersection > 0); - assert(! (intrsctn - 1)->consumed_vertical_up); - // Consume the complete vertical segment up to the outer contour. - if (intrsctn->is_inner()) - intrsctn->consumed_vertical_up = true; - do { - assert(i_intersection > 0); - -- intrsctn; - -- i_intersection; - intrsctn->consumed_vertical_up = true; - } while (intrsctn->type != SegmentIntersection::OUTER_LOW); - if ((intrsctn + 1)->is_inner()) { - // Step back. - ++ intrsctn; - ++ i_intersection; - assert(intrsctn->type == SegmentIntersection::INNER_LOW); - try_connect = true; - } - } - if (try_connect) { - // Decide, whether to finish the segment, or whether to follow the perimeter. - - // 1) Find possible connection points on the previous / next vertical line. - int iPrev = intersection_on_prev_vertical_line(poly_with_offset, segs, i_vline, intrsctn->iContour, i_intersection); - int iNext = intersection_on_next_vertical_line(poly_with_offset, segs, i_vline, intrsctn->iContour, i_intersection); - IntersectionTypeOtherVLine intrsctn_type_prev = intersection_type_on_prev_vertical_line(segs, i_vline, i_intersection, iPrev); - IntersectionTypeOtherVLine intrsctn_type_next = intersection_type_on_next_vertical_line(segs, i_vline, i_intersection, iNext); - - // 2) Find possible connection points on the same vertical line. - int iAbove = -1; - int iBelow = -1; - int iSegAbove = -1; - int iSegBelow = -1; - { -// SegmentIntersection::SegmentIntersectionType type_crossing = (intrsctn->type == SegmentIntersection::INNER_LOW) ? -// SegmentIntersection::INNER_HIGH : SegmentIntersection::INNER_LOW; - // Does the perimeter intersect the current vertical line above intrsctn? - for (size_t i = i_intersection + 1; i + 1 < seg.intersections.size(); ++ i) -// if (seg.intersections[i].iContour == intrsctn->iContour && seg.intersections[i].type == type_crossing) { - if (seg.intersections[i].iContour == intrsctn->iContour) { - iAbove = i; - iSegAbove = seg.intersections[i].iSegment; - break; - } - // Does the perimeter intersect the current vertical line below intrsctn? - for (size_t i = i_intersection - 1; i > 0; -- i) -// if (seg.intersections[i].iContour == intrsctn->iContour && seg.intersections[i].type == type_crossing) { - if (seg.intersections[i].iContour == intrsctn->iContour) { - iBelow = i; - iSegBelow = seg.intersections[i].iSegment; - break; - } - } - - // 3) Sort the intersection points, clear iPrev / iNext / iSegBelow / iSegAbove, - // if it is preceded by any other intersection point along the contour. - unsigned int vert_seg_dir_valid_mask = - (going_up ? - (iSegAbove != -1 && seg.intersections[iAbove].type == SegmentIntersection::INNER_LOW) : - (iSegBelow != -1 && seg.intersections[iBelow].type == SegmentIntersection::INNER_HIGH)) ? - (DIR_FORWARD | DIR_BACKWARD) : - 0; - { - // Invalidate iPrev resp. iNext, if the perimeter crosses the current vertical line earlier than iPrev resp. iNext. - // The perimeter contour orientation. - const bool forward = intrsctn->is_low(); // == poly_with_offset.is_contour_ccw(intrsctn->iContour); - const Polygon &poly = poly_with_offset.contour(intrsctn->iContour); - { - int d_horiz = (iPrev == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, segs[i_vline-1].intersections[iPrev].iSegment, intrsctn->iSegment, forward); - int d_down = (iSegBelow == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, iSegBelow, intrsctn->iSegment, forward); - int d_up = (iSegAbove == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, iSegAbove, intrsctn->iSegment, forward); - if (intrsctn_type_prev == INTERSECTION_TYPE_OTHER_VLINE_OK && d_horiz > std::min(d_down, d_up)) - // The vertical crossing comes eralier than the prev crossing. - // Disable the perimeter going back. - intrsctn_type_prev = INTERSECTION_TYPE_OTHER_VLINE_NOT_FIRST; - if (going_up ? (d_up > std::min(d_horiz, d_down)) : (d_down > std::min(d_horiz, d_up))) - // The horizontal crossing comes earlier than the vertical crossing. - vert_seg_dir_valid_mask &= ~(forward ? DIR_BACKWARD : DIR_FORWARD); - } - { - int d_horiz = (iNext == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, intrsctn->iSegment, segs[i_vline+1].intersections[iNext].iSegment, forward); - int d_down = (iSegBelow == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, intrsctn->iSegment, iSegBelow, forward); - int d_up = (iSegAbove == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, intrsctn->iSegment, iSegAbove, forward); - if (intrsctn_type_next == INTERSECTION_TYPE_OTHER_VLINE_OK && d_horiz > std::min(d_down, d_up)) - // The vertical crossing comes eralier than the prev crossing. - // Disable the perimeter going forward. - intrsctn_type_next = INTERSECTION_TYPE_OTHER_VLINE_NOT_FIRST; - if (going_up ? (d_up > std::min(d_horiz, d_down)) : (d_down > std::min(d_horiz, d_up))) - // The horizontal crossing comes earlier than the vertical crossing. - vert_seg_dir_valid_mask &= ~(forward ? DIR_FORWARD : DIR_BACKWARD); - } - } - - // 4) Try to connect to a previous or next vertical line, making a zig-zag pattern. - if (intrsctn_type_prev == INTERSECTION_TYPE_OTHER_VLINE_OK || intrsctn_type_next == INTERSECTION_TYPE_OTHER_VLINE_OK) { - coordf_t distPrev = (intrsctn_type_prev != INTERSECTION_TYPE_OTHER_VLINE_OK) ? std::numeric_limits::max() : - measure_perimeter_prev_segment_length(poly_with_offset, segs, i_vline, intrsctn->iContour, i_intersection, iPrev); - coordf_t distNext = (intrsctn_type_next != INTERSECTION_TYPE_OTHER_VLINE_OK) ? std::numeric_limits::max() : - measure_perimeter_next_segment_length(poly_with_offset, segs, i_vline, intrsctn->iContour, i_intersection, iNext); - // Take the shorter path. - //FIXME this may not be always the best strategy to take the shortest connection line now. - bool take_next = (intrsctn_type_prev == INTERSECTION_TYPE_OTHER_VLINE_OK && intrsctn_type_next == INTERSECTION_TYPE_OTHER_VLINE_OK) ? - (distNext < distPrev) : - intrsctn_type_next == INTERSECTION_TYPE_OTHER_VLINE_OK; - assert(intrsctn->is_inner()); - bool skip = params.dont_connect || (link_max_length > 0 && (take_next ? distNext : distPrev) > link_max_length); - if (skip) { - // Just skip the connecting contour and start a new path. - goto dont_connect; - polyline_current->points.push_back(intrsctn->pos()); - polylines_out.push_back(Polyline()); - polyline_current = &polylines_out.back(); - const SegmentedIntersectionLine &il2 = segs[take_next ? (i_vline + 1) : (i_vline - 1)]; - polyline_current->points.push_back(il2.intersections[take_next ? iNext : iPrev].pos()); - } else { - polyline_current->points.push_back(intrsctn->pos()); - emit_perimeter_prev_next_segment(poly_with_offset, segs, i_vline, intrsctn->iContour, i_intersection, take_next ? iNext : iPrev, *polyline_current, take_next); - } - // Mark both the left and right connecting segment as consumed, because one cannot go to this intersection point as it has been consumed. - if (iPrev != -1) - segs[i_vline-1].intersections[iPrev].consumed_perimeter_right = true; - if (iNext != -1) - intrsctn->consumed_perimeter_right = true; - //FIXME consume the left / right connecting segments at the other end of this line? Currently it is not critical because a perimeter segment is not followed if the vertical segment at the other side has already been consumed. - // Advance to the neighbor line. - if (take_next) { - ++ i_vline; - i_intersection = iNext; - } else { - -- i_vline; - i_intersection = iPrev; - } - continue; - } - - // 5) Try to connect to a previous or next point on the same vertical line. - if (vert_seg_dir_valid_mask) { - bool valid = true; - // Verify, that there is no intersection with the inner contour up to the end of the contour segment. - // Verify, that the successive segment has not been consumed yet. - if (going_up) { - if (seg.intersections[iAbove].consumed_vertical_up) { - valid = false; - } else { - for (int i = (int)i_intersection + 1; i < iAbove && valid; ++i) - if (seg.intersections[i].is_inner()) - valid = false; - } - } else { - if (seg.intersections[iBelow-1].consumed_vertical_up) { - valid = false; - } else { - for (int i = iBelow + 1; i < (int)i_intersection && valid; ++i) - if (seg.intersections[i].is_inner()) - valid = false; - } - } - if (valid) { - const Polygon &poly = poly_with_offset.contour(intrsctn->iContour); - int iNext = going_up ? iAbove : iBelow; - int iSegNext = going_up ? iSegAbove : iSegBelow; - bool dir_forward = (vert_seg_dir_valid_mask == (DIR_FORWARD | DIR_BACKWARD)) ? - // Take the shorter length between the current and the next intersection point. - (distance_of_segmens(poly, intrsctn->iSegment, iSegNext, true) < - distance_of_segmens(poly, intrsctn->iSegment, iSegNext, false)) : - (vert_seg_dir_valid_mask == DIR_FORWARD); - // Skip this perimeter line? - bool skip = params.dont_connect; - if (! skip && link_max_length > 0) { - coordf_t link_length = measure_perimeter_segment_on_vertical_line_length( - poly_with_offset, segs, i_vline, intrsctn->iContour, i_intersection, iNext, dir_forward); - skip = link_length > link_max_length; - } - polyline_current->points.push_back(intrsctn->pos()); - if (skip) { - // Just skip the connecting contour and start a new path. - polylines_out.push_back(Polyline()); - polyline_current = &polylines_out.back(); - polyline_current->points.push_back(seg.intersections[iNext].pos()); - } else { - // Consume the connecting contour and the next segment. - emit_perimeter_segment_on_vertical_line(poly_with_offset, segs, i_vline, intrsctn->iContour, i_intersection, iNext, *polyline_current, dir_forward); - } - // Mark both the left and right connecting segment as consumed, because one cannot go to this intersection point as it has been consumed. - // If there are any outer intersection points skipped (bypassed) by the contour, - // mark them as processed. - if (going_up) { - for (int i = (int)i_intersection; i < iAbove; ++ i) - seg.intersections[i].consumed_vertical_up = true; - } else { - for (int i = iBelow; i < (int)i_intersection; ++ i) - seg.intersections[i].consumed_vertical_up = true; - } -// seg.intersections[going_up ? i_intersection : i_intersection - 1].consumed_vertical_up = true; - intrsctn->consumed_perimeter_right = true; - i_intersection = iNext; - if (going_up) - ++ intrsctn; - else - -- intrsctn; - intrsctn->consumed_perimeter_right = true; - continue; - } - } - dont_connect: - // No way to continue the current polyline. Take the rest of the line up to the outer contour. - // This will finish the polyline, starting another polyline at a new point. - if (going_up) - ++ intrsctn; - else - -- intrsctn; - } - - // Finish the current vertical line, - // reset the current vertical line to pick a new starting point in the next round. - assert(intrsctn->is_outer()); - assert(intrsctn->is_high() == going_up); - pointLast = intrsctn->pos(); - polyline_current->points.push_back(pointLast); - // Handle duplicate points and zero length segments. - polyline_current->remove_duplicate_points(); - assert(! polyline_current->has_duplicate_points()); - // Handle nearly zero length edges. - if (polyline_current->points.size() <= 1 || - (polyline_current->points.size() == 2 && - std::abs(polyline_current->points.front()(0) - polyline_current->points.back()(0)) < SCALED_EPSILON && - std::abs(polyline_current->points.front()(1) - polyline_current->points.back()(1)) < SCALED_EPSILON)) - polylines_out.pop_back(); - intrsctn = NULL; - i_intersection = -1; - polyline_current = NULL; - } - -#ifdef SLIC3R_DEBUG - { - static int iRun = 0; - BoundingBox bbox_svg = poly_with_offset.bounding_box_outer(); - { - ::Slic3r::SVG svg(debug_out_path("FillRectilinear2-final-%03d.svg", iRun), bbox_svg); // , scale_(1.)); - poly_with_offset.export_to_svg(svg); - for (size_t i = n_polylines_out_initial; i < polylines_out.size(); ++ i) - svg.draw(polylines_out[i].lines(), "black"); - } - // Paint a picture per polyline. This makes it easier to discover the order of the polylines and their overlap. - for (size_t i_polyline = n_polylines_out_initial; i_polyline < polylines_out.size(); ++ i_polyline) { - ::Slic3r::SVG svg(debug_out_path("FillRectilinear2-final-%03d-%03d.svg", iRun, i_polyline), bbox_svg); // , scale_(1.)); - svg.draw(polylines_out[i_polyline].lines(), "black"); - } - } -#endif /* SLIC3R_DEBUG */ - - // paths must be rotated back - for (Polylines::iterator it = polylines_out.begin() + n_polylines_out_initial; it != polylines_out.end(); ++ it) { - // No need to translate, the absolute position is irrelevant. - // it->translate(- rotate_vector.second(0), - rotate_vector.second(1)); - assert(! it->has_duplicate_points()); - //it->rotate(rotate_vector.first); - //FIXME rather simplify the paths to avoid very short edges? - //assert(! it->has_duplicate_points()); - it->remove_duplicate_points(); - } - -#ifdef SLIC3R_DEBUG - // Verify, that there are no duplicate points in the sequence. - for (Polyline &polyline : polylines_out) - assert(! polyline.has_duplicate_points()); -#endif /* SLIC3R_DEBUG */ - - return true; -} - -}; // namespace FillRectilinear3_Internal - -bool FillRectilinear3::fill_surface_by_lines(const Surface *surface, const FillParams ¶ms, std::vector &fill_dir_params, Polylines &polylines_out) -{ - assert(params.density > 0.0001f && params.density <= 1.f); - - const float INFILL_OVERLAP_OVER_SPACING = 0.45f; - assert(INFILL_OVERLAP_OVER_SPACING > 0 && INFILL_OVERLAP_OVER_SPACING < 0.5f); - - // On the polygons of poly_with_offset, the infill lines will be connected. - FillRectilinear3_Internal::ExPolygonWithOffset poly_with_offset( - surface->expolygon, - float(scale_(- (0.5 - INFILL_OVERLAP_OVER_SPACING) * this->spacing)), - float(scale_(- 0.5 * this->spacing))); - if (poly_with_offset.n_contours_inner == 0) { - // Not a single infill line fits. - //FIXME maybe one shall trigger the gap fill here? - return true; - } - - // Rotate polygons so that we can work with vertical lines here - std::pair rotate_vector = this->_infill_direction(surface); - std::vector hatching(fill_dir_params.size(), FillRectilinear3_Internal::InfillHatchingSingleDirection()); - for (size_t i = 0; i < hatching.size(); ++ i) - if (! FillRectilinear3_Internal::prepare_infill_hatching_segments(poly_with_offset, params, fill_dir_params[i], rotate_vector, hatching[i])) - return false; - - for (size_t i = 0; i < hatching.size(); ++ i) - if (! FillRectilinear3_Internal::fill_hatching_segments_legacy( - poly_with_offset, - params, - this->link_max_length, - hatching[i], - polylines_out)) - return false; - - return true; -} - -Polylines FillRectilinear3::fill_surface(const Surface *surface, const FillParams ¶ms) -{ - Polylines polylines_out; - std::vector fill_dir_params; - fill_dir_params.emplace_back(FillDirParams(this->spacing, 0.f)); - if (! fill_surface_by_lines(surface, params, fill_dir_params, polylines_out)) - printf("FillRectilinear3::fill_surface() failed to fill a region.\n"); - if (params.full_infill() && ! params.dont_adjust) - // Return back the adjusted spacing. - this->spacing = fill_dir_params.front().spacing; - return polylines_out; -} - -Polylines FillGrid3::fill_surface(const Surface *surface, const FillParams ¶ms) -{ - // Each linear fill covers half of the target coverage. - FillParams params2 = params; - params2.density *= 0.5f; - Polylines polylines_out; - std::vector fill_dir_params; - fill_dir_params.emplace_back(FillDirParams(this->spacing, 0.f)); - fill_dir_params.emplace_back(FillDirParams(this->spacing, float(M_PI / 2.))); - if (! fill_surface_by_lines(surface, params2, fill_dir_params, polylines_out)) - printf("FillGrid3::fill_surface() failed to fill a region.\n"); - return polylines_out; -} - -Polylines FillTriangles3::fill_surface(const Surface *surface, const FillParams ¶ms) -{ - // Each linear fill covers 1/3 of the target coverage. - FillParams params2 = params; - params2.density *= 0.333333333f; - Polylines polylines_out; - std::vector fill_dir_params; - fill_dir_params.emplace_back(FillDirParams(this->spacing, 0.)); - fill_dir_params.emplace_back(FillDirParams(this->spacing, M_PI / 3.)); - fill_dir_params.emplace_back(FillDirParams(this->spacing, 2. * M_PI / 3.)); - if (! fill_surface_by_lines(surface, params2, fill_dir_params, polylines_out)) - printf("FillTriangles3::fill_surface() failed to fill a region.\n"); - return polylines_out; -} - -Polylines FillStars3::fill_surface(const Surface *surface, const FillParams ¶ms) -{ - // Each linear fill covers 1/3 of the target coverage. - FillParams params2 = params; - params2.density *= 0.333333333f; - Polylines polylines_out; - std::vector fill_dir_params; - fill_dir_params.emplace_back(FillDirParams(this->spacing, 0.)); - fill_dir_params.emplace_back(FillDirParams(this->spacing, M_PI / 3.)); - fill_dir_params.emplace_back(FillDirParams(this->spacing, 2. * M_PI / 3., 0.5 * this->spacing / params2.density)); - if (! fill_surface_by_lines(surface, params2, fill_dir_params, polylines_out)) - printf("FillStars3::fill_surface() failed to fill a region.\n"); - return polylines_out; -} - -Polylines FillCubic3::fill_surface(const Surface *surface, const FillParams ¶ms) -{ - // Each linear fill covers 1/3 of the target coverage. - FillParams params2 = params; - params2.density *= 0.333333333f; - Polylines polylines_out; - std::vector fill_dir_params; - coordf_t dx = sqrt(0.5) * z; - fill_dir_params.emplace_back(FillDirParams(this->spacing, 0., dx)); - fill_dir_params.emplace_back(FillDirParams(this->spacing, M_PI / 3., -dx)); - fill_dir_params.emplace_back(FillDirParams(this->spacing, 2. * M_PI / 3., dx)); - if (! fill_surface_by_lines(surface, params2, fill_dir_params, polylines_out)) - printf("FillCubic3::fill_surface() failed to fill a region.\n"); - return polylines_out; -} - -} // namespace Slic3r diff --git a/src/libslic3r/Fill/FillRectilinear3.hpp b/src/libslic3r/Fill/FillRectilinear3.hpp deleted file mode 100644 index 2023a25b77..0000000000 --- a/src/libslic3r/Fill/FillRectilinear3.hpp +++ /dev/null @@ -1,83 +0,0 @@ -#ifndef slic3r_FillRectilinear3_hpp_ -#define slic3r_FillRectilinear3_hpp_ - -#include "../libslic3r.h" - -#include "FillBase.hpp" - -namespace Slic3r { - -class Surface; - -class FillRectilinear3 : public Fill -{ -public: - virtual Fill* clone() const { return new FillRectilinear3(*this); }; - virtual ~FillRectilinear3() {} - virtual Polylines fill_surface(const Surface *surface, const FillParams ¶ms); - - struct FillDirParams - { - FillDirParams(coordf_t spacing, double angle, coordf_t pattern_shift = 0.f) : - spacing(spacing), angle(angle), pattern_shift(pattern_shift) {} - coordf_t spacing; - double angle; - coordf_t pattern_shift; - }; - -protected: - bool fill_surface_by_lines(const Surface *surface, const FillParams ¶ms, std::vector &fill_dir_params, Polylines &polylines_out); -}; - -class FillGrid3 : public FillRectilinear3 -{ -public: - virtual Fill* clone() const { return new FillGrid3(*this); }; - virtual ~FillGrid3() {} - virtual Polylines fill_surface(const Surface *surface, const FillParams ¶ms); - -protected: - // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill. - virtual float _layer_angle(size_t /* idx */) const { return 0.f; } -}; - -class FillTriangles3 : public FillRectilinear3 -{ -public: - virtual Fill* clone() const { return new FillTriangles3(*this); }; - virtual ~FillTriangles3() {} - virtual Polylines fill_surface(const Surface *surface, const FillParams ¶ms); - -protected: - // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill. - virtual float _layer_angle(size_t /* idx */) const { return 0.f; } -}; - -class FillStars3 : public FillRectilinear3 -{ -public: - virtual Fill* clone() const { return new FillStars3(*this); }; - virtual ~FillStars3() {} - virtual Polylines fill_surface(const Surface *surface, const FillParams ¶ms); - -protected: - // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill. - virtual float _layer_angle(size_t /* idx */) const { return 0.f; } -}; - -class FillCubic3 : public FillRectilinear3 -{ -public: - virtual Fill* clone() const { return new FillCubic3(*this); }; - virtual ~FillCubic3() {} - virtual Polylines fill_surface(const Surface *surface, const FillParams ¶ms); - -protected: - // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill. - virtual float _layer_angle(size_t /* idx */) const { return 0.f; } -}; - - -}; // namespace Slic3r - -#endif // slic3r_FillRectilinear3_hpp_ diff --git a/src/libslic3r/Format/3mf.cpp b/src/libslic3r/Format/3mf.cpp index 436a2b29f2..a4fd228fc4 100644 --- a/src/libslic3r/Format/3mf.cpp +++ b/src/libslic3r/Format/3mf.cpp @@ -1899,9 +1899,9 @@ namespace Slic3r { assert(index < geometry.custom_supports.size()); assert(index < geometry.custom_seam.size()); if (! geometry.custom_supports[index].empty()) - volume->m_supported_facets.set_triangle_from_string(i, geometry.custom_supports[index]); + volume->supported_facets.set_triangle_from_string(i, geometry.custom_supports[index]); if (! geometry.custom_seam[index].empty()) - volume->m_seam_facets.set_triangle_from_string(i, geometry.custom_seam[index]); + volume->seam_facets.set_triangle_from_string(i, geometry.custom_seam[index]); } @@ -2417,11 +2417,11 @@ namespace Slic3r { stream << "v" << j + 1 << "=\"" << its.indices[i][j] + volume_it->second.first_vertex_id << "\" "; } - std::string custom_supports_data_string = volume->m_supported_facets.get_triangle_as_string(i); + 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 << "\" "; - std::string custom_seam_data_string = volume->m_seam_facets.get_triangle_as_string(i); + 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 << "\" "; diff --git a/src/libslic3r/Format/SL1.cpp b/src/libslic3r/Format/SL1.cpp index 274f84f002..c4a9f5864f 100644 --- a/src/libslic3r/Format/SL1.cpp +++ b/src/libslic3r/Format/SL1.cpp @@ -383,6 +383,7 @@ void fill_slicerconf(ConfMap &m, const SLAPrint &print) static constexpr auto banned_keys = { "compatible_printers"sv, "compatible_prints"sv, + //FIXME The print host keys should not be exported to full_print_config anymore. The following keys may likely be removed. "print_host"sv, "printhost_apikey"sv, "printhost_cafile"sv diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index febdff7e02..81ddec5768 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -158,7 +158,7 @@ namespace Slic3r { polygons_per_layer[i * 2] = union_(polys); } }); - for (size_t i = 0; i < cnt / 2; ++i) + for (size_t i = 1; i < cnt / 2; ++i) polygons_per_layer[i] = std::move(polygons_per_layer[i * 2]); if (cnt & 1) polygons_per_layer[cnt / 2] = std::move(polygons_per_layer[cnt - 1]); @@ -819,48 +819,54 @@ namespace DoExport { // this->print_machine_envelope(file, print); // shall be adjusted as well to produce a G-code block compatible with the particular firmware flavor. if (config.gcode_flavor.value == gcfMarlin) { - normal_time_estimator.set_max_acceleration((float)config.machine_max_acceleration_extruding.values[0]); - normal_time_estimator.set_retract_acceleration((float)config.machine_max_acceleration_retracting.values[0]); - normal_time_estimator.set_minimum_feedrate((float)config.machine_min_extruding_rate.values[0]); - normal_time_estimator.set_minimum_travel_feedrate((float)config.machine_min_travel_rate.values[0]); - normal_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::X, (float)config.machine_max_acceleration_x.values[0]); - normal_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::Y, (float)config.machine_max_acceleration_y.values[0]); - normal_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::Z, (float)config.machine_max_acceleration_z.values[0]); - normal_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::E, (float)config.machine_max_acceleration_e.values[0]); - normal_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::X, (float)config.machine_max_feedrate_x.values[0]); - normal_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::Y, (float)config.machine_max_feedrate_y.values[0]); - normal_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::Z, (float)config.machine_max_feedrate_z.values[0]); - normal_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::E, (float)config.machine_max_feedrate_e.values[0]); - normal_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::X, (float)config.machine_max_jerk_x.values[0]); - normal_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::Y, (float)config.machine_max_jerk_y.values[0]); - normal_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::Z, (float)config.machine_max_jerk_z.values[0]); - normal_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::E, (float)config.machine_max_jerk_e.values[0]); - + if (config.machine_limits_usage.value != MachineLimitsUsage::Ignore) { + normal_time_estimator.set_max_acceleration((float)config.machine_max_acceleration_extruding.values[0]); + normal_time_estimator.set_retract_acceleration((float)config.machine_max_acceleration_retracting.values[0]); + normal_time_estimator.set_minimum_feedrate((float)config.machine_min_extruding_rate.values[0]); + normal_time_estimator.set_minimum_travel_feedrate((float)config.machine_min_travel_rate.values[0]); + normal_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::X, (float)config.machine_max_acceleration_x.values[0]); + normal_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::Y, (float)config.machine_max_acceleration_y.values[0]); + normal_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::Z, (float)config.machine_max_acceleration_z.values[0]); + normal_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::E, (float)config.machine_max_acceleration_e.values[0]); + normal_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::X, (float)config.machine_max_feedrate_x.values[0]); + normal_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::Y, (float)config.machine_max_feedrate_y.values[0]); + normal_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::Z, (float)config.machine_max_feedrate_z.values[0]); + normal_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::E, (float)config.machine_max_feedrate_e.values[0]); + normal_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::X, (float)config.machine_max_jerk_x.values[0]); + normal_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::Y, (float)config.machine_max_jerk_y.values[0]); + normal_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::Z, (float)config.machine_max_jerk_z.values[0]); + normal_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::E, (float)config.machine_max_jerk_e.values[0]); + } + if (silent_time_estimator_enabled) { silent_time_estimator.reset(); silent_time_estimator.set_dialect(config.gcode_flavor); silent_time_estimator.set_extrusion_axis(config.get_extrusion_axis()[0]); - /* "Stealth mode" values can be just a copy of "normal mode" values - * (when they aren't input for a printer preset). - * Thus, use back value from values, instead of second one, which could be absent - */ - silent_time_estimator.set_max_acceleration((float)config.machine_max_acceleration_extruding.values.back()); - silent_time_estimator.set_retract_acceleration((float)config.machine_max_acceleration_retracting.values.back()); - silent_time_estimator.set_minimum_feedrate((float)config.machine_min_extruding_rate.values.back()); - silent_time_estimator.set_minimum_travel_feedrate((float)config.machine_min_travel_rate.values.back()); - silent_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::X, (float)config.machine_max_acceleration_x.values.back()); - silent_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::Y, (float)config.machine_max_acceleration_y.values.back()); - silent_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::Z, (float)config.machine_max_acceleration_z.values.back()); - silent_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::E, (float)config.machine_max_acceleration_e.values.back()); - silent_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::X, (float)config.machine_max_feedrate_x.values.back()); - silent_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::Y, (float)config.machine_max_feedrate_y.values.back()); - silent_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::Z, (float)config.machine_max_feedrate_z.values.back()); - silent_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::E, (float)config.machine_max_feedrate_e.values.back()); - silent_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::X, (float)config.machine_max_jerk_x.values.back()); - silent_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::Y, (float)config.machine_max_jerk_y.values.back()); - silent_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::Z, (float)config.machine_max_jerk_z.values.back()); - silent_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::E, (float)config.machine_max_jerk_e.values.back()); + + if (config.machine_limits_usage.value != MachineLimitsUsage::Ignore) { + /* "Stealth mode" values can be just a copy of "normal mode" values + * (when they aren't input for a printer preset). + * Thus, use back value from values, instead of second one, which could be absent + */ + silent_time_estimator.set_max_acceleration((float)config.machine_max_acceleration_extruding.values.back()); + silent_time_estimator.set_retract_acceleration((float)config.machine_max_acceleration_retracting.values.back()); + silent_time_estimator.set_minimum_feedrate((float)config.machine_min_extruding_rate.values.back()); + silent_time_estimator.set_minimum_travel_feedrate((float)config.machine_min_travel_rate.values.back()); + silent_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::X, (float)config.machine_max_acceleration_x.values.back()); + silent_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::Y, (float)config.machine_max_acceleration_y.values.back()); + silent_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::Z, (float)config.machine_max_acceleration_z.values.back()); + silent_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::E, (float)config.machine_max_acceleration_e.values.back()); + silent_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::X, (float)config.machine_max_feedrate_x.values.back()); + silent_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::Y, (float)config.machine_max_feedrate_y.values.back()); + silent_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::Z, (float)config.machine_max_feedrate_z.values.back()); + silent_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::E, (float)config.machine_max_feedrate_e.values.back()); + silent_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::X, (float)config.machine_max_jerk_x.values.back()); + silent_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::Y, (float)config.machine_max_jerk_y.values.back()); + silent_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::Z, (float)config.machine_max_jerk_z.values.back()); + silent_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::E, (float)config.machine_max_jerk_e.values.back()); + } + if (config.single_extruder_multi_material) { // As of now the fields are shown at the UI dialog in the same combo box as the ramming values, so they // are considered to be active for the single extruder multi-material printers only. @@ -1082,14 +1088,14 @@ namespace DoExport { ++ dst.second; }; print_statistics.filament_stats.insert(std::pair{extruder.id(), (float)used_filament}); - append(out_filament_used_mm, "%.1lf", used_filament); - append(out_filament_used_cm3, "%.1lf", extruded_volume * 0.001); + append(out_filament_used_mm, "%.2lf", used_filament); + append(out_filament_used_cm3, "%.2lf", extruded_volume * 0.001); if (filament_weight > 0.) { print_statistics.total_weight = print_statistics.total_weight + filament_weight; - append(out_filament_used_g, "%.1lf", filament_weight); + append(out_filament_used_g, "%.2lf", filament_weight); if (filament_cost > 0.) { print_statistics.total_cost = print_statistics.total_cost + filament_cost; - append(out_filament_cost, "%.1lf", filament_cost); + append(out_filament_cost, "%.2lf", filament_cost); } } print_statistics.total_used_filament += used_filament; @@ -1598,8 +1604,8 @@ void GCode::_do_export(Print& print, FILE* file, ThumbnailsGeneratorCallback thu // Modifies print.m_print_statistics)); _write(file, "\n"); - _write_format(file, "; total filament used [g] = %.1lf\n", print.m_print_statistics.total_weight); - _write_format(file, "; total filament cost = %.1lf\n", print.m_print_statistics.total_cost); + _write_format(file, "; total filament used [g] = %.2lf\n", print.m_print_statistics.total_weight); + _write_format(file, "; total filament cost = %.2lf\n", print.m_print_statistics.total_cost); if (print.m_print_statistics.total_toolchanges > 0) _write_format(file, "; total toolchanges = %i\n", print.m_print_statistics.total_toolchanges); #if ENABLE_GCODE_VIEWER @@ -1613,7 +1619,7 @@ void GCode::_do_export(Print& print, FILE* file, ThumbnailsGeneratorCallback thu // Append full config. _write(file, "\n"); { - std::string full_config = ""; + std::string full_config; append_full_config(print, full_config); if (!full_config.empty()) _write(file, full_config); @@ -1636,9 +1642,9 @@ std::string GCode::placeholder_parser_process(const std::string &name, const std } } -// Parse the custom G-code, try to find mcode_set_temp_dont_wait and mcode_set_temp_and_wait inside the custom G-code. +// Parse the custom G-code, try to find mcode_set_temp_dont_wait and mcode_set_temp_and_wait or optionally G10 with temperature inside the custom G-code. // Returns true if one of the temp commands are found, and try to parse the target temperature value into temp_out. -static bool custom_gcode_sets_temperature(const std::string &gcode, const int mcode_set_temp_dont_wait, const int mcode_set_temp_and_wait, int &temp_out) +static bool custom_gcode_sets_temperature(const std::string &gcode, const int mcode_set_temp_dont_wait, const int mcode_set_temp_and_wait, const bool include_g10, int &temp_out) { temp_out = -1; if (gcode.empty()) @@ -1649,17 +1655,23 @@ static bool custom_gcode_sets_temperature(const std::string &gcode, const int mc while (*ptr != 0) { // Skip whitespaces. for (; *ptr == ' ' || *ptr == '\t'; ++ ptr); - if (*ptr == 'M') { - // Line starts with 'M'. It is a machine command. + if (*ptr == 'M' || // Line starts with 'M'. It is a machine command. + (*ptr == 'G' && include_g10)) { // Only check for G10 if requested + bool is_gcode = *ptr == 'G'; ++ ptr; - // Parse the M code value. + // Parse the M or G code value. char *endptr = nullptr; - int mcode = int(strtol(ptr, &endptr, 10)); - if (endptr != nullptr && endptr != ptr && (mcode == mcode_set_temp_dont_wait || mcode == mcode_set_temp_and_wait)) { - // M104/M109 or M140/M190 found. + int mgcode = int(strtol(ptr, &endptr, 10)); + if (endptr != nullptr && endptr != ptr && + is_gcode ? + // G10 found + mgcode == 10 : + // M104/M109 or M140/M190 found. + (mgcode == mcode_set_temp_dont_wait || mgcode == mcode_set_temp_and_wait)) { ptr = endptr; - // Let the caller know that the custom G-code sets the temperature. - temp_set_by_gcode = true; + if (! is_gcode) + // Let the caller know that the custom M-code sets the temperature. + temp_set_by_gcode = true; // Now try to parse the temperature value. // While not at the end of the line: while (strchr(";\r\n\0", *ptr) == nullptr) { @@ -1674,6 +1686,10 @@ static bool custom_gcode_sets_temperature(const std::string &gcode, const int mc if (endptr > ptr) { ptr = endptr; temp_out = temp_parsed; + // Let the caller know that the custom G-code sets the temperature + // Only do this after successfully parsing temperature since G10 + // can be used for other reasons + temp_set_by_gcode = true; } } else { // Skip this word. @@ -1694,7 +1710,7 @@ static bool custom_gcode_sets_temperature(const std::string &gcode, const int mc // Do not process this piece of G-code by the time estimator, it already knows the values through another sources. void GCode::print_machine_envelope(FILE *file, Print &print) { - if (print.config().gcode_flavor.value == gcfMarlin) { + if (print.config().gcode_flavor.value == gcfMarlin && print.config().machine_limits_usage.value == MachineLimitsUsage::EmitToGCode) { fprintf(file, "M201 X%d Y%d Z%d E%d ; sets maximum accelerations, mm/sec^2\n", int(print.config().machine_max_acceleration_x.values.front() + 0.5), int(print.config().machine_max_acceleration_y.values.front() + 0.5), @@ -1730,7 +1746,7 @@ void GCode::_print_first_layer_bed_temperature(FILE *file, Print &print, const s int temp = print.config().first_layer_bed_temperature.get_at(first_printing_extruder_id); // Is the bed temperature set by the provided custom G-code? int temp_by_gcode = -1; - bool temp_set_by_gcode = custom_gcode_sets_temperature(gcode, 140, 190, temp_by_gcode); + bool temp_set_by_gcode = custom_gcode_sets_temperature(gcode, 140, 190, false, temp_by_gcode); if (temp_set_by_gcode && temp_by_gcode >= 0 && temp_by_gcode < 1000) temp = temp_by_gcode; // Always call m_writer.set_bed_temperature() so it will set the internal "current" state of the bed temp as if @@ -1744,11 +1760,13 @@ void GCode::_print_first_layer_bed_temperature(FILE *file, Print &print, const s // Only do that if the start G-code does not already contain any M-code controlling an extruder temperature. // M104 - Set Extruder Temperature // M109 - Set Extruder Temperature and Wait +// RepRapFirmware: G10 Sxx void GCode::_print_first_layer_extruder_temperatures(FILE *file, Print &print, const std::string &gcode, unsigned int first_printing_extruder_id, bool wait) { // Is the bed temperature set by the provided custom G-code? - int temp_by_gcode = -1; - if (custom_gcode_sets_temperature(gcode, 104, 109, temp_by_gcode)) { + int temp_by_gcode = -1; + bool include_g10 = print.config().gcode_flavor == gcfRepRapFirmware; + if (custom_gcode_sets_temperature(gcode, 104, 109, include_g10, temp_by_gcode)) { // Set the extruder temperature at m_writer, but throw away the generated G-code as it will be written with the custom G-code. int temp = print.config().first_layer_temperature.get_at(first_printing_extruder_id); if (temp_by_gcode >= 0 && temp_by_gcode < 1000) @@ -2457,6 +2475,7 @@ void GCode::append_full_config(const Print &print, std::string &str) static constexpr auto banned_keys = { "compatible_printers"sv, "compatible_prints"sv, + //FIXME The print host keys should not be exported to full_print_config anymore. The following keys may likely be removed. "print_host"sv, "printhost_apikey"sv, "printhost_cafile"sv diff --git a/src/libslic3r/GCode/Analyzer.cpp b/src/libslic3r/GCode/Analyzer.cpp deleted file mode 100644 index d022b37983..0000000000 --- a/src/libslic3r/GCode/Analyzer.cpp +++ /dev/null @@ -1,1197 +0,0 @@ -#include -#include -#include - -#include "../libslic3r.h" -#include "../PrintConfig.hpp" -#include "../Utils.hpp" -#include "Print.hpp" - -#include - -#include "Analyzer.hpp" -#include "PreviewData.hpp" - -#if !ENABLE_GCODE_VIEWER - -static const std::string AXIS_STR = "XYZE"; -static const float MMMIN_TO_MMSEC = 1.0f / 60.0f; -static const float INCHES_TO_MM = 25.4f; -static const float DEFAULT_FEEDRATE = 0.0f; -static const unsigned int DEFAULT_EXTRUDER_ID = 0; -static const unsigned int DEFAULT_COLOR_PRINT_ID = 0; -static const Slic3r::Vec3f DEFAULT_START_POSITION = Slic3r::Vec3f::Zero(); -static const float DEFAULT_START_EXTRUSION = 0.0f; -static const float DEFAULT_FAN_SPEED = 0.0f; - -namespace Slic3r { - -const std::string GCodeAnalyzer::Extrusion_Role_Tag = "_ANALYZER_EXTR_ROLE:"; -const std::string GCodeAnalyzer::Mm3_Per_Mm_Tag = "_ANALYZER_MM3_PER_MM:"; -const std::string GCodeAnalyzer::Width_Tag = "_ANALYZER_WIDTH:"; -const std::string GCodeAnalyzer::Height_Tag = "_ANALYZER_HEIGHT:"; -const std::string GCodeAnalyzer::Color_Change_Tag = "_ANALYZER_COLOR_CHANGE"; -const std::string GCodeAnalyzer::Pause_Print_Tag = "_ANALYZER_PAUSE_PRINT"; -const std::string GCodeAnalyzer::Custom_Code_Tag = "_ANALYZER_CUSTOM_CODE"; -const std::string GCodeAnalyzer::End_Pause_Print_Or_Custom_Code_Tag = "_ANALYZER_END_PAUSE_PRINT_OR_CUSTOM_CODE"; - -const float GCodeAnalyzer::Default_mm3_per_mm = 0.0f; -const float GCodeAnalyzer::Default_Width = 0.0f; -const float GCodeAnalyzer::Default_Height = 0.0f; - -GCodeAnalyzer::Metadata::Metadata() - : extrusion_role(erNone) - , extruder_id(DEFAULT_EXTRUDER_ID) - , mm3_per_mm(GCodeAnalyzer::Default_mm3_per_mm) - , width(GCodeAnalyzer::Default_Width) - , height(GCodeAnalyzer::Default_Height) - , feedrate(DEFAULT_FEEDRATE) - , fan_speed(DEFAULT_FAN_SPEED) - , cp_color_id(DEFAULT_COLOR_PRINT_ID) -{ -} - -GCodeAnalyzer::Metadata::Metadata(ExtrusionRole extrusion_role, unsigned int extruder_id, float mm3_per_mm, float width, float height, float feedrate, float fan_speed, unsigned int cp_color_id/* = 0*/) - : extrusion_role(extrusion_role) - , extruder_id(extruder_id) - , mm3_per_mm(mm3_per_mm) - , width(width) - , height(height) - , feedrate(feedrate) - , fan_speed(fan_speed) - , cp_color_id(cp_color_id) -{ -} - -bool GCodeAnalyzer::Metadata::operator != (const GCodeAnalyzer::Metadata& other) const -{ - if (extrusion_role != other.extrusion_role) - return true; - - if (extruder_id != other.extruder_id) - return true; - - if (mm3_per_mm != other.mm3_per_mm) - return true; - - if (width != other.width) - return true; - - if (height != other.height) - return true; - - if (feedrate != other.feedrate) - return true; - - if (fan_speed != other.fan_speed) - return true; - - if (cp_color_id != other.cp_color_id) - return true; - - return false; -} - -GCodeAnalyzer::GCodeMove::GCodeMove(GCodeMove::EType type, ExtrusionRole extrusion_role, unsigned int extruder_id, float mm3_per_mm, float width, float height, float feedrate, const Vec3f& start_position, const Vec3f& end_position, float delta_extruder, float fan_speed, unsigned int cp_color_id/* = 0*/) - : type(type) - , data(extrusion_role, extruder_id, mm3_per_mm, width, height, feedrate, fan_speed, cp_color_id) - , start_position(start_position) - , end_position(end_position) - , delta_extruder(delta_extruder) -{ -} - -GCodeAnalyzer::GCodeMove::GCodeMove(GCodeMove::EType type, const GCodeAnalyzer::Metadata& data, const Vec3f& start_position, const Vec3f& end_position, float delta_extruder) - : type(type) - , data(data) - , start_position(start_position) - , end_position(end_position) - , delta_extruder(delta_extruder) -{ -} - -void GCodeAnalyzer::set_extruders_count(unsigned int count) -{ - m_extruders_count = count; - for (unsigned int i=0; i_process_gcode_line(reader, line); }); - - return m_process_output; -} - -void GCodeAnalyzer::calc_gcode_preview_data(GCodePreviewData& preview_data, std::function cancel_callback) -{ - // resets preview data - preview_data.reset(); - - // calculates extrusion layers - _calc_gcode_preview_extrusion_layers(preview_data, cancel_callback); - - // calculates travel - _calc_gcode_preview_travel(preview_data, cancel_callback); - - // calculates retractions - _calc_gcode_preview_retractions(preview_data, cancel_callback); - - // calculates unretractions - _calc_gcode_preview_unretractions(preview_data, cancel_callback); -} - -bool GCodeAnalyzer::is_valid_extrusion_role(ExtrusionRole role) -{ - return ((erPerimeter <= role) && (role < erMixed)); -} - -void GCodeAnalyzer::_process_gcode_line(GCodeReader&, const GCodeReader::GCodeLine& line) -{ - // processes 'special' comments contained in line - if (_process_tags(line)) - { -#if 0 - // DEBUG ONLY: puts the line back into the gcode - m_process_output += line.raw() + "\n"; -#endif - return; - } - - // sets new start position/extrusion - _set_start_position(_get_end_position()); - _set_start_extrusion(_get_axis_position(E)); - - // processes 'normal' gcode lines - std::string cmd = line.cmd(); - if (cmd.length() > 1) - { - switch (::toupper(cmd[0])) - { - case 'G': - { - switch (::atoi(&cmd[1])) - { - case 1: // Move - { - _processG1(line); - break; - } - case 10: // Retract - { - _processG10(line); - break; - } - case 11: // Unretract - { - _processG11(line); - break; - } - case 22: // Firmware controlled Retract - { - _processG22(line); - break; - } - case 23: // Firmware controlled Unretract - { - _processG23(line); - break; - } - case 90: // Set to Absolute Positioning - { - _processG90(line); - break; - } - case 91: // Set to Relative Positioning - { - _processG91(line); - break; - } - case 92: // Set Position - { - _processG92(line); - break; - } - } - - break; - } - case 'M': - { - switch (::atoi(&cmd[1])) - { - case 82: // Set extruder to absolute mode - { - _processM82(line); - break; - } - case 83: // Set extruder to relative mode - { - _processM83(line); - break; - } - case 106: // Set fan speed - { - _processM106(line); - break; - } - case 107: // Disable fan - { - _processM107(line); - break; - } - case 108: - case 135: - { - // these are used by MakerWare and Sailfish firmwares - // for tool changing - we can process it in one place - _processM108orM135(line); - break; - } - case 132: // Recall stored home offsets - { - _processM132(line); - break; - } - case 401: // Repetier: Store x, y and z position - { - _processM401(line); - break; - } - case 402: // Repetier: Go to stored position - { - _processM402(line); - break; - } - } - - break; - } - case 'T': // Select Tools - { - _processT(line); - break; - } - } - } - - // puts the line back into the gcode - m_process_output += line.raw() + "\n"; -} - -void GCodeAnalyzer::_processG1(const GCodeReader::GCodeLine& line) -{ - auto axis_absolute_position = [this](GCodeAnalyzer::EAxis axis, const GCodeReader::GCodeLine& lineG1) -> float - { - bool is_relative = (_get_global_positioning_type() == Relative); - if (axis == E) - is_relative |= (_get_e_local_positioning_type() == Relative); - - if (lineG1.has(Slic3r::Axis(axis))) - { - float lengthsScaleFactor = (_get_units() == GCodeAnalyzer::Inches) ? INCHES_TO_MM : 1.0f; - float ret = lineG1.value(Slic3r::Axis(axis)) * lengthsScaleFactor; - return is_relative ? _get_axis_position(axis) + ret : _get_axis_origin(axis) + ret; - } - else - return _get_axis_position(axis); - }; - - // updates axes positions from line - - float new_pos[Num_Axis]; - for (unsigned char a = X; a < Num_Axis; ++a) - { - new_pos[a] = axis_absolute_position((EAxis)a, line); - } - - // updates feedrate from line, if present - if (line.has_f()) - _set_feedrate(line.f() * MMMIN_TO_MMSEC); - - // calculates movement deltas - float delta_pos[Num_Axis]; - for (unsigned char a = X; a < Num_Axis; ++a) - { - delta_pos[a] = new_pos[a] - _get_axis_position((EAxis)a); - } - - // Detects move type - GCodeMove::EType type = GCodeMove::Noop; - - if (delta_pos[E] < 0.0f) - { - if ((delta_pos[X] != 0.0f) || (delta_pos[Y] != 0.0f) || (delta_pos[Z] != 0.0f)) - type = GCodeMove::Move; - else - type = GCodeMove::Retract; - } - else if (delta_pos[E] > 0.0f) - { - if ((delta_pos[X] == 0.0f) && (delta_pos[Y] == 0.0f) && (delta_pos[Z] == 0.0f)) - type = GCodeMove::Unretract; - else if ((delta_pos[X] != 0.0f) || (delta_pos[Y] != 0.0f)) - type = GCodeMove::Extrude; - } - else if ((delta_pos[X] != 0.0f) || (delta_pos[Y] != 0.0f) || (delta_pos[Z] != 0.0f)) - type = GCodeMove::Move; - - ExtrusionRole role = _get_extrusion_role(); - if ((type == GCodeMove::Extrude) && ((_get_width() == 0.0f) || (_get_height() == 0.0f) || !is_valid_extrusion_role(role))) - type = GCodeMove::Move; - - // updates axis positions - for (unsigned char a = X; a < Num_Axis; ++a) - { - _set_axis_position((EAxis)a, new_pos[a]); - } - - // stores the move - if (type != GCodeMove::Noop) - _store_move(type); -} - -void GCodeAnalyzer::_processG10(const GCodeReader::GCodeLine& line) -{ - // stores retract move - _store_move(GCodeMove::Retract); -} - -void GCodeAnalyzer::_processG11(const GCodeReader::GCodeLine& line) -{ - // stores unretract move - _store_move(GCodeMove::Unretract); -} - -void GCodeAnalyzer::_processG22(const GCodeReader::GCodeLine& line) -{ - // stores retract move - _store_move(GCodeMove::Retract); -} - -void GCodeAnalyzer::_processG23(const GCodeReader::GCodeLine& line) -{ - // stores unretract move - _store_move(GCodeMove::Unretract); -} - -void GCodeAnalyzer::_processG90(const GCodeReader::GCodeLine& line) -{ - _set_global_positioning_type(Absolute); -} - -void GCodeAnalyzer::_processG91(const GCodeReader::GCodeLine& line) -{ - _set_global_positioning_type(Relative); -} - -void GCodeAnalyzer::_processG92(const GCodeReader::GCodeLine& line) -{ - float lengthsScaleFactor = (_get_units() == Inches) ? INCHES_TO_MM : 1.0f; - bool anyFound = false; - - if (line.has_x()) - { - _set_axis_origin(X, _get_axis_position(X) - line.x() * lengthsScaleFactor); - anyFound = true; - } - - if (line.has_y()) - { - _set_axis_origin(Y, _get_axis_position(Y) - line.y() * lengthsScaleFactor); - anyFound = true; - } - - if (line.has_z()) - { - _set_axis_origin(Z, _get_axis_position(Z) - line.z() * lengthsScaleFactor); - anyFound = true; - } - - if (line.has_e()) - { - // extruder coordinate can grow to the point where its float representation does not allow for proper addition with small increments, - // we set the value taken from the G92 line as the new current position for it - _set_axis_position(E, line.e() * lengthsScaleFactor); - anyFound = true; - } - - if (!anyFound && ! line.has_unknown_axis()) - { - // The G92 may be called for axes that PrusaSlicer does not recognize, for example see GH issue #3510, - // where G92 A0 B0 is called although the extruder axis is till E. - for (unsigned char a = X; a < Num_Axis; ++a) - { - _set_axis_origin((EAxis)a, _get_axis_position((EAxis)a)); - } - } -} - -void GCodeAnalyzer::_processM82(const GCodeReader::GCodeLine& line) -{ - _set_e_local_positioning_type(Absolute); -} - -void GCodeAnalyzer::_processM83(const GCodeReader::GCodeLine& line) -{ - _set_e_local_positioning_type(Relative); -} - -void GCodeAnalyzer::_processM106(const GCodeReader::GCodeLine& line) -{ - if (!line.has('P')) - { - // The absence of P means the print cooling fan, so ignore anything else. - float new_fan_speed; - if (line.has_value('S', new_fan_speed)) - _set_fan_speed((100.0f / 255.0f) * new_fan_speed); - else - _set_fan_speed(100.0f); - } -} - -void GCodeAnalyzer::_processM107(const GCodeReader::GCodeLine& line) -{ - _set_fan_speed(0.0f); -} - -void GCodeAnalyzer::_processM108orM135(const GCodeReader::GCodeLine& line) -{ - // These M-codes are used by MakerWare and Sailfish to change active tool. - // They have to be processed otherwise toolchanges will be unrecognised - // by the analyzer - see https://github.com/prusa3d/PrusaSlicer/issues/2566 - - size_t code = ::atoi(&(line.cmd()[1])); - if ((code == 108 && m_gcode_flavor == gcfSailfish) - || (code == 135 && m_gcode_flavor == gcfMakerWare)) { - - std::string cmd = line.raw(); - size_t T_pos = cmd.find("T"); - if (T_pos != std::string::npos) { - cmd = cmd.substr(T_pos); - _processT(cmd); - } - } -} - -void GCodeAnalyzer::_processM132(const GCodeReader::GCodeLine& line) -{ - // This command is used by Makerbot to load the current home position from EEPROM - // see: https://github.com/makerbot/s3g/blob/master/doc/GCodeProtocol.md - // Using this command to reset the axis origin to zero helps in fixing: https://github.com/prusa3d/PrusaSlicer/issues/3082 - - if (line.has_x()) - _set_axis_origin(X, 0.0f); - - if (line.has_y()) - _set_axis_origin(Y, 0.0f); - - if (line.has_z()) - _set_axis_origin(Z, 0.0f); - - if (line.has_e()) - _set_axis_origin(E, 0.0f); -} - -void GCodeAnalyzer::_processM401(const GCodeReader::GCodeLine& line) -{ - if (m_gcode_flavor != gcfRepetier) - return; - - for (unsigned char a = 0; a <= 3; ++a) - { - _set_cached_position(a, _get_axis_position((EAxis)a)); - } - _set_cached_position(4, _get_feedrate()); -} - -void GCodeAnalyzer::_processM402(const GCodeReader::GCodeLine& line) -{ - if (m_gcode_flavor != gcfRepetier) - return; - - // see for reference: - // https://github.com/repetier/Repetier-Firmware/blob/master/src/ArduinoAVR/Repetier/Printer.cpp - // void Printer::GoToMemoryPosition(bool x, bool y, bool z, bool e, float feed) - - bool has_xyz = !(line.has_x() || line.has_y() || line.has_z()); - - float p = FLT_MAX; - for (unsigned char a = X; a <= Z; ++a) - { - if (has_xyz || line.has(a)) - { - p = _get_cached_position(a); - if (p != FLT_MAX) - _set_axis_position((EAxis)a, p); - } - } - - p = _get_cached_position(E); - if (p != FLT_MAX) - _set_axis_position(E, p); - - p = FLT_MAX; - if (!line.has_value(4, p)) - p = _get_cached_position(4); - - if (p != FLT_MAX) - _set_feedrate(p); -} - -void GCodeAnalyzer::_reset_cached_position() -{ - for (unsigned char a = 0; a <= 4; ++a) - { - m_state.cached_position[a] = FLT_MAX; - } -} - -void GCodeAnalyzer::_processT(const std::string& cmd) -{ - if (cmd.length() > 1) - { - unsigned int id = (unsigned int)::strtol(cmd.substr(1).c_str(), nullptr, 10); - if (_get_extruder_id() != id) - { - if (id >= m_extruders_count) - { - if (m_extruders_count > 1) - BOOST_LOG_TRIVIAL(error) << "GCodeAnalyzer encountered an invalid toolchange, maybe from a custom gcode."; - } - else - { - _set_extruder_id(id); - if (_get_cp_color_id() != INT_MAX) - _set_cp_color_id(m_extruder_color[id]); - } - - // stores tool change move - _store_move(GCodeMove::Tool_change); - } - } -} - -void GCodeAnalyzer::_processT(const GCodeReader::GCodeLine& line) -{ - _processT(line.cmd()); -} - -bool GCodeAnalyzer::_process_tags(const GCodeReader::GCodeLine& line) -{ - std::string comment = line.comment(); - - // extrusion role tag - size_t pos = comment.find(Extrusion_Role_Tag); - if (pos != comment.npos) - { - _process_extrusion_role_tag(comment, pos); - return true; - } - - // mm3 per mm tag - pos = comment.find(Mm3_Per_Mm_Tag); - if (pos != comment.npos) - { - _process_mm3_per_mm_tag(comment, pos); - return true; - } - - // width tag - pos = comment.find(Width_Tag); - if (pos != comment.npos) - { - _process_width_tag(comment, pos); - return true; - } - - // height tag - pos = comment.find(Height_Tag); - if (pos != comment.npos) - { - _process_height_tag(comment, pos); - return true; - } - - // color change tag - pos = comment.find(Color_Change_Tag); - if (pos != comment.npos) - { - pos = comment.find_last_of(",T"); - unsigned extruder = pos == comment.npos ? 0 : std::stoi(comment.substr(pos + 1, comment.npos)); - _process_color_change_tag(extruder); - return true; - } - - // pause print tag - pos = comment.find(Pause_Print_Tag); - if (pos != comment.npos) - { - _process_pause_print_or_custom_code_tag(); - return true; - } - - // custom code tag - pos = comment.find(Custom_Code_Tag); - if (pos != comment.npos) - { - _process_pause_print_or_custom_code_tag(); - return true; - } - - // end pause print or custom code tag - pos = comment.find(End_Pause_Print_Or_Custom_Code_Tag); - if (pos != comment.npos) - { - _process_end_pause_print_or_custom_code_tag(); - return true; - } - - return false; -} - -void GCodeAnalyzer::_process_extrusion_role_tag(const std::string& comment, size_t pos) -{ - int role = (int)::strtol(comment.substr(pos + Extrusion_Role_Tag.length()).c_str(), nullptr, 10); - if (_is_valid_extrusion_role(role)) - _set_extrusion_role((ExtrusionRole)role); - else - { - // todo: show some error ? - } -} - -void GCodeAnalyzer::_process_mm3_per_mm_tag(const std::string& comment, size_t pos) -{ - _set_mm3_per_mm((float)::strtod(comment.substr(pos + Mm3_Per_Mm_Tag.length()).c_str(), nullptr)); -} - -void GCodeAnalyzer::_process_width_tag(const std::string& comment, size_t pos) -{ - _set_width((float)::strtod(comment.substr(pos + Width_Tag.length()).c_str(), nullptr)); -} - -void GCodeAnalyzer::_process_height_tag(const std::string& comment, size_t pos) -{ - _set_height((float)::strtod(comment.substr(pos + Height_Tag.length()).c_str(), nullptr)); -} - -void GCodeAnalyzer::_process_color_change_tag(unsigned extruder) -{ - m_extruder_color[extruder] = m_extruders_count + m_state.cp_color_counter; // color_change position in list of color for preview - m_state.cp_color_counter++; - - if (_get_extruder_id() == extruder) - _set_cp_color_id(m_extruder_color[extruder]); -} - -void GCodeAnalyzer::_process_pause_print_or_custom_code_tag() -{ - _set_cp_color_id(INT_MAX); -} - -void GCodeAnalyzer::_process_end_pause_print_or_custom_code_tag() -{ - if (_get_cp_color_id() == INT_MAX) - _set_cp_color_id(m_extruder_color[_get_extruder_id()]); -} - -void GCodeAnalyzer::_set_units(GCodeAnalyzer::EUnits units) -{ - m_state.units = units; -} - -GCodeAnalyzer::EUnits GCodeAnalyzer::_get_units() const -{ - return m_state.units; -} - -void GCodeAnalyzer::_set_global_positioning_type(GCodeAnalyzer::EPositioningType type) -{ - m_state.global_positioning_type = type; -} - -GCodeAnalyzer::EPositioningType GCodeAnalyzer::_get_global_positioning_type() const -{ - return m_state.global_positioning_type; -} - -void GCodeAnalyzer::_set_e_local_positioning_type(GCodeAnalyzer::EPositioningType type) -{ - m_state.e_local_positioning_type = type; -} - -GCodeAnalyzer::EPositioningType GCodeAnalyzer::_get_e_local_positioning_type() const -{ - return m_state.e_local_positioning_type; -} - -void GCodeAnalyzer::_set_extrusion_role(ExtrusionRole extrusion_role) -{ - m_state.data.extrusion_role = extrusion_role; -} - -ExtrusionRole GCodeAnalyzer::_get_extrusion_role() const -{ - return m_state.data.extrusion_role; -} - -void GCodeAnalyzer::_set_extruder_id(unsigned int id) -{ - m_state.data.extruder_id = id; -} - -unsigned int GCodeAnalyzer::_get_extruder_id() const -{ - return m_state.data.extruder_id; -} - -void GCodeAnalyzer::_set_cp_color_id(unsigned int id) -{ - m_state.data.cp_color_id = id; -} - -unsigned int GCodeAnalyzer::_get_cp_color_id() const -{ - return m_state.data.cp_color_id; -} - -void GCodeAnalyzer::_set_mm3_per_mm(float value) -{ - m_state.data.mm3_per_mm = value; -} - -float GCodeAnalyzer::_get_mm3_per_mm() const -{ - return m_state.data.mm3_per_mm; -} - -void GCodeAnalyzer::_set_width(float width) -{ - m_state.data.width = width; -} - -float GCodeAnalyzer::_get_width() const -{ - return m_state.data.width; -} - -void GCodeAnalyzer::_set_height(float height) -{ - m_state.data.height = height; -} - -float GCodeAnalyzer::_get_height() const -{ - return m_state.data.height; -} - -void GCodeAnalyzer::_set_feedrate(float feedrate_mm_sec) -{ - m_state.data.feedrate = feedrate_mm_sec; -} - -float GCodeAnalyzer::_get_feedrate() const -{ - return m_state.data.feedrate; -} - -void GCodeAnalyzer::_set_fan_speed(float fan_speed_percentage) -{ - m_state.data.fan_speed = fan_speed_percentage; -} - -float GCodeAnalyzer::_get_fan_speed() const -{ - return m_state.data.fan_speed; -} - -void GCodeAnalyzer::_set_axis_position(EAxis axis, float position) -{ - m_state.position[axis] = position; -} - -float GCodeAnalyzer::_get_axis_position(EAxis axis) const -{ - return m_state.position[axis]; -} - -void GCodeAnalyzer::_set_axis_origin(EAxis axis, float position) -{ - m_state.origin[axis] = position; -} - -float GCodeAnalyzer::_get_axis_origin(EAxis axis) const -{ - return m_state.origin[axis]; -} - -void GCodeAnalyzer::_reset_axes_position() -{ - ::memset((void*)m_state.position, 0, Num_Axis * sizeof(float)); -} - -void GCodeAnalyzer::_reset_axes_origin() -{ - ::memset((void*)m_state.origin, 0, Num_Axis * sizeof(float)); -} - -void GCodeAnalyzer::_set_start_position(const Vec3f& position) -{ - m_state.start_position = position; -} - -const Vec3f& GCodeAnalyzer::_get_start_position() const -{ - return m_state.start_position; -} - -void GCodeAnalyzer::_set_cached_position(unsigned char axis, float position) -{ - if ((0 <= axis) || (axis <= 4)) - m_state.cached_position[axis] = position; -} - -float GCodeAnalyzer::_get_cached_position(unsigned char axis) const -{ - return ((0 <= axis) || (axis <= 4)) ? m_state.cached_position[axis] : FLT_MAX; -} - -void GCodeAnalyzer::_set_start_extrusion(float extrusion) -{ - m_state.start_extrusion = extrusion; -} - -float GCodeAnalyzer::_get_start_extrusion() const -{ - return m_state.start_extrusion; -} - -float GCodeAnalyzer::_get_delta_extrusion() const -{ - return _get_axis_position(E) - m_state.start_extrusion; -} - -Vec3f GCodeAnalyzer::_get_end_position() const -{ - return Vec3f(m_state.position[X], m_state.position[Y], m_state.position[Z]); -} - -void GCodeAnalyzer::_store_move(GCodeAnalyzer::GCodeMove::EType type) -{ - // if type non mapped yet, map it - TypeToMovesMap::iterator it = m_moves_map.find(type); - if (it == m_moves_map.end()) - it = m_moves_map.insert(TypeToMovesMap::value_type(type, GCodeMovesList())).first; - - // store move - Vec3f extruder_offset = Vec3f::Zero(); - unsigned int extruder_id = _get_extruder_id(); - ExtruderOffsetsMap::iterator extr_it = m_extruder_offsets.find(extruder_id); - if (extr_it != m_extruder_offsets.end()) - extruder_offset = Vec3f((float)extr_it->second(0), (float)extr_it->second(1), 0.0f); - - Vec3f start_position = _get_start_position() + extruder_offset; - Vec3f end_position = _get_end_position() + extruder_offset; - it->second.emplace_back(type, _get_extrusion_role(), extruder_id, _get_mm3_per_mm(), _get_width(), _get_height(), _get_feedrate(), start_position, end_position, _get_delta_extrusion(), _get_fan_speed(), _get_cp_color_id()); -} - -bool GCodeAnalyzer::_is_valid_extrusion_role(int value) const -{ - return ((int)erNone <= value) && (value <= (int)erMixed); -} - -void GCodeAnalyzer::_calc_gcode_preview_extrusion_layers(GCodePreviewData& preview_data, std::function cancel_callback) -{ - struct Helper - { - static GCodePreviewData::Extrusion::Layer& get_layer_at_z(GCodePreviewData::Extrusion::LayersList& layers, float z) - { - //FIXME this has a terrible time complexity - for (GCodePreviewData::Extrusion::Layer& layer : layers) - { - // if layer found, return it - if (layer.z == z) - return layer; - } - - // if layer not found, create and return it - layers.emplace_back(z, GCodePreviewData::Extrusion::Paths()); - return layers.back(); - } - - static void store_polyline(const Polyline& polyline, const Metadata& data, float z, GCodePreviewData& preview_data) - { - // if the polyline is valid, create the extrusion path from it and store it - if (polyline.is_valid()) - { - auto& paths = get_layer_at_z(preview_data.extrusion.layers, z).paths; - paths.emplace_back(GCodePreviewData::Extrusion::Path()); - GCodePreviewData::Extrusion::Path &path = paths.back(); - path.polyline = polyline; - path.extrusion_role = data.extrusion_role; - path.mm3_per_mm = data.mm3_per_mm; - path.width = data.width; - path.height = data.height; - path.feedrate = data.feedrate; - path.extruder_id = data.extruder_id; - path.cp_color_id = data.cp_color_id; - path.fan_speed = data.fan_speed; - } - } - }; - - TypeToMovesMap::iterator extrude_moves = m_moves_map.find(GCodeMove::Extrude); - if (extrude_moves == m_moves_map.end()) - return; - - Metadata data; - float z = FLT_MAX; - Polyline polyline; - Vec3f position(FLT_MAX, FLT_MAX, FLT_MAX); - float volumetric_rate = FLT_MAX; - GCodePreviewData::Range height_range; - GCodePreviewData::Range width_range; - GCodePreviewData::MultiRange feedrate_range; - GCodePreviewData::Range volumetric_rate_range; - GCodePreviewData::Range fan_speed_range; - - // to avoid to call the callback too often - unsigned int cancel_callback_threshold = (unsigned int)std::max((int)extrude_moves->second.size() / 25, 1); - unsigned int cancel_callback_curr = 0; - - // constructs the polylines while traversing the moves - for (const GCodeMove& move : extrude_moves->second) - { - // to avoid to call the callback too often - cancel_callback_curr = (cancel_callback_curr + 1) % cancel_callback_threshold; - if (cancel_callback_curr == 0) - cancel_callback(); - - if ((data != move.data) || (z != move.start_position.z()) || (position != move.start_position) || (volumetric_rate != move.data.feedrate * move.data.mm3_per_mm)) - { - // store current polyline - polyline.remove_duplicate_points(); - Helper::store_polyline(polyline, data, z, preview_data); - - // reset current polyline - polyline = Polyline(); - - // add both vertices of the move - polyline.append(Point(scale_(move.start_position.x()), scale_(move.start_position.y()))); - polyline.append(Point(scale_(move.end_position.x()), scale_(move.end_position.y()))); - - // update current values - data = move.data; - z = (float)move.start_position.z(); - volumetric_rate = move.data.feedrate * move.data.mm3_per_mm; - height_range.update_from(move.data.height); - width_range.update_from(move.data.width); - feedrate_range.update_from(move.data.feedrate, GCodePreviewData::FeedrateKind::EXTRUSION); - volumetric_rate_range.update_from(volumetric_rate); - fan_speed_range.update_from(move.data.fan_speed); - } - else - // append end vertex of the move to current polyline - polyline.append(Point(scale_(move.end_position.x()), scale_(move.end_position.y()))); - - // update current values - position = move.end_position; - } - - // store last polyline - polyline.remove_duplicate_points(); - Helper::store_polyline(polyline, data, z, preview_data); - - // updates preview ranges data - preview_data.ranges.height.update_from(height_range); - preview_data.ranges.width.update_from(width_range); - preview_data.ranges.feedrate.update_from(feedrate_range); - preview_data.ranges.volumetric_rate.update_from(volumetric_rate_range); - preview_data.ranges.fan_speed.update_from(fan_speed_range); - - // we need to sort the layers by their z as they can be shuffled in case of sequential prints - std::sort(preview_data.extrusion.layers.begin(), preview_data.extrusion.layers.end(), [](const GCodePreviewData::Extrusion::Layer& l1, const GCodePreviewData::Extrusion::Layer& l2)->bool { return l1.z < l2.z; }); -} - -void GCodeAnalyzer::_calc_gcode_preview_travel(GCodePreviewData& preview_data, std::function cancel_callback) -{ - struct Helper - { - static void store_polyline(const Polyline3& polyline, GCodePreviewData::Travel::EType type, GCodePreviewData::Travel::Polyline::EDirection direction, - float feedrate, unsigned int extruder_id, GCodePreviewData& preview_data) - { - // if the polyline is valid, store it - if (polyline.is_valid()) - preview_data.travel.polylines.emplace_back(type, direction, feedrate, extruder_id, polyline); - } - }; - - TypeToMovesMap::iterator travel_moves = m_moves_map.find(GCodeMove::Move); - if (travel_moves == m_moves_map.end()) - return; - - Polyline3 polyline; - Vec3f position(FLT_MAX, FLT_MAX, FLT_MAX); - GCodePreviewData::Travel::EType type = GCodePreviewData::Travel::Num_Types; - GCodePreviewData::Travel::Polyline::EDirection direction = GCodePreviewData::Travel::Polyline::Num_Directions; - float feedrate = FLT_MAX; - unsigned int extruder_id = -1; - - GCodePreviewData::Range height_range; - GCodePreviewData::Range width_range; - GCodePreviewData::MultiRange feedrate_range; - - // to avoid to call the callback too often - unsigned int cancel_callback_threshold = (unsigned int)std::max((int)travel_moves->second.size() / 25, 1); - unsigned int cancel_callback_curr = 0; - - // constructs the polylines while traversing the moves - for (const GCodeMove& move : travel_moves->second) - { - cancel_callback_curr = (cancel_callback_curr + 1) % cancel_callback_threshold; - if (cancel_callback_curr == 0) - cancel_callback(); - - GCodePreviewData::Travel::EType move_type = (move.delta_extruder < 0.0f) ? GCodePreviewData::Travel::Retract : ((move.delta_extruder > 0.0f) ? GCodePreviewData::Travel::Extrude : GCodePreviewData::Travel::Move); - GCodePreviewData::Travel::Polyline::EDirection move_direction = ((move.start_position.x() != move.end_position.x()) || (move.start_position.y() != move.end_position.y())) ? GCodePreviewData::Travel::Polyline::Generic : GCodePreviewData::Travel::Polyline::Vertical; - - if ((type != move_type) || (direction != move_direction) || (feedrate != move.data.feedrate) || (position != move.start_position) || (extruder_id != move.data.extruder_id)) - { - // store current polyline - polyline.remove_duplicate_points(); - Helper::store_polyline(polyline, type, direction, feedrate, extruder_id, preview_data); - - // reset current polyline - polyline = Polyline3(); - - // add both vertices of the move - polyline.append(Vec3crd((int)scale_(move.start_position.x()), (int)scale_(move.start_position.y()), (int)scale_(move.start_position.z()))); - polyline.append(Vec3crd((int)scale_(move.end_position.x()), (int)scale_(move.end_position.y()), (int)scale_(move.end_position.z()))); - } - else - // append end vertex of the move to current polyline - polyline.append(Vec3crd((int)scale_(move.end_position.x()), (int)scale_(move.end_position.y()), (int)scale_(move.end_position.z()))); - - // update current values - position = move.end_position; - type = move_type; - feedrate = move.data.feedrate; - extruder_id = move.data.extruder_id; - height_range.update_from(move.data.height); - width_range.update_from(move.data.width); - feedrate_range.update_from(move.data.feedrate, GCodePreviewData::FeedrateKind::TRAVEL); - } - - // store last polyline - polyline.remove_duplicate_points(); - Helper::store_polyline(polyline, type, direction, feedrate, extruder_id, preview_data); - - // updates preview ranges data - preview_data.ranges.height.update_from(height_range); - preview_data.ranges.width.update_from(width_range); - preview_data.ranges.feedrate.update_from(feedrate_range); - - // we need to sort the polylines by their min z as they can be shuffled in case of sequential prints - std::sort(preview_data.travel.polylines.begin(), preview_data.travel.polylines.end(), - [](const GCodePreviewData::Travel::Polyline& p1, const GCodePreviewData::Travel::Polyline& p2)->bool - { return unscale(p1.polyline.bounding_box().min(2)) < unscale(p2.polyline.bounding_box().min(2)); }); -} - -void GCodeAnalyzer::_calc_gcode_preview_retractions(GCodePreviewData& preview_data, std::function cancel_callback) -{ - TypeToMovesMap::iterator retraction_moves = m_moves_map.find(GCodeMove::Retract); - if (retraction_moves == m_moves_map.end()) - return; - - // to avoid to call the callback too often - unsigned int cancel_callback_threshold = (unsigned int)std::max((int)retraction_moves->second.size() / 25, 1); - unsigned int cancel_callback_curr = 0; - - for (const GCodeMove& move : retraction_moves->second) - { - cancel_callback_curr = (cancel_callback_curr + 1) % cancel_callback_threshold; - if (cancel_callback_curr == 0) - cancel_callback(); - - // store position - Vec3crd position((int)scale_(move.start_position.x()), (int)scale_(move.start_position.y()), (int)scale_(move.start_position.z())); - preview_data.retraction.positions.emplace_back(position, move.data.width, move.data.height); - } - - // we need to sort the positions by their z as they can be shuffled in case of sequential prints - std::sort(preview_data.retraction.positions.begin(), preview_data.retraction.positions.end(), - [](const GCodePreviewData::Retraction::Position& p1, const GCodePreviewData::Retraction::Position& p2)->bool - { return unscale(p1.position(2)) < unscale(p2.position(2)); }); -} - -void GCodeAnalyzer::_calc_gcode_preview_unretractions(GCodePreviewData& preview_data, std::function cancel_callback) -{ - TypeToMovesMap::iterator unretraction_moves = m_moves_map.find(GCodeMove::Unretract); - if (unretraction_moves == m_moves_map.end()) - return; - - // to avoid to call the callback too often - unsigned int cancel_callback_threshold = (unsigned int)std::max((int)unretraction_moves->second.size() / 25, 1); - unsigned int cancel_callback_curr = 0; - - for (const GCodeMove& move : unretraction_moves->second) - { - cancel_callback_curr = (cancel_callback_curr + 1) % cancel_callback_threshold; - if (cancel_callback_curr == 0) - cancel_callback(); - - // store position - Vec3crd position((int)scale_(move.start_position.x()), (int)scale_(move.start_position.y()), (int)scale_(move.start_position.z())); - preview_data.unretraction.positions.emplace_back(position, move.data.width, move.data.height); - } - - // we need to sort the positions by their z as they can be shuffled in case of sequential prints - std::sort(preview_data.unretraction.positions.begin(), preview_data.unretraction.positions.end(), - [](const GCodePreviewData::Retraction::Position& p1, const GCodePreviewData::Retraction::Position& p2)->bool - { return unscale(p1.position(2)) < unscale(p2.position(2)); }); -} - -// Return an estimate of the memory consumed by the time estimator. -size_t GCodeAnalyzer::memory_used() const -{ - size_t out = sizeof(*this); - for (const std::pair &kvp : m_moves_map) - out += sizeof(kvp) + SLIC3R_STDVEC_MEMSIZE(kvp.second, GCodeMove); - out += m_process_output.size(); - return out; -} - -} // namespace Slic3r - -#endif // !ENABLE_GCODE_VIEWER diff --git a/src/libslic3r/GCode/Analyzer.hpp b/src/libslic3r/GCode/Analyzer.hpp deleted file mode 100644 index 37d9072592..0000000000 --- a/src/libslic3r/GCode/Analyzer.hpp +++ /dev/null @@ -1,309 +0,0 @@ -#ifndef slic3r_GCode_Analyzer_hpp_ -#define slic3r_GCode_Analyzer_hpp_ - -#if !ENABLE_GCODE_VIEWER - -#include "../libslic3r.h" -#include "../PrintConfig.hpp" -#include "../ExtrusionEntity.hpp" - -#include "../Point.hpp" -#include "../GCodeReader.hpp" - -namespace Slic3r { - -class GCodePreviewData; - -class GCodeAnalyzer -{ -public: - static const std::string Extrusion_Role_Tag; - static const std::string Mm3_Per_Mm_Tag; - static const std::string Width_Tag; - static const std::string Height_Tag; - static const std::string Color_Change_Tag; - static const std::string Pause_Print_Tag; - static const std::string Custom_Code_Tag; - static const std::string End_Pause_Print_Or_Custom_Code_Tag; - - static const float Default_mm3_per_mm; - static const float Default_Width; - static const float Default_Height; - - enum EUnits : unsigned char - { - Millimeters, - Inches - }; - - enum EAxis : unsigned char - { - X, - Y, - Z, - E, - Num_Axis - }; - - enum EPositioningType : unsigned char - { - Absolute, - Relative - }; - - struct Metadata - { - ExtrusionRole extrusion_role; - unsigned int extruder_id; - float mm3_per_mm; - float width; // mm - float height; // mm - float feedrate; // mm/s - float fan_speed; // percentage - unsigned int cp_color_id; - - Metadata(); - Metadata(ExtrusionRole extrusion_role, unsigned int extruder_id, float mm3_per_mm, float width, float height, float feedrate, float fan_speed, unsigned int cp_color_id = 0); - - bool operator != (const Metadata& other) const; - }; - - struct GCodeMove - { - enum EType : unsigned char - { - Noop, - Retract, - Unretract, - Tool_change, - Move, - Extrude, - Num_Types - }; - - EType type; - Metadata data; - Vec3f start_position; - Vec3f end_position; - float delta_extruder; - - GCodeMove(EType type, ExtrusionRole extrusion_role, unsigned int extruder_id, float mm3_per_mm, float width, float height, float feedrate, const Vec3f& start_position, const Vec3f& end_position, float delta_extruder, float fan_speed, unsigned int cp_color_id = 0); - GCodeMove(EType type, const Metadata& data, const Vec3f& start_position, const Vec3f& end_position, float delta_extruder); - }; - - typedef std::vector GCodeMovesList; - typedef std::map TypeToMovesMap; - typedef std::map ExtruderOffsetsMap; - typedef std::map ExtruderToColorMap; - -private: - struct State - { - EUnits units; - EPositioningType global_positioning_type; - EPositioningType e_local_positioning_type; - Metadata data; - Vec3f start_position = Vec3f::Zero(); - float cached_position[5]; - float start_extrusion; - float position[Num_Axis]; - float origin[Num_Axis]; - unsigned int cp_color_counter = 0; - }; - -private: - State m_state; - GCodeReader m_parser; - TypeToMovesMap m_moves_map; - ExtruderOffsetsMap m_extruder_offsets; - unsigned int m_extruders_count; - GCodeFlavor m_gcode_flavor; - - ExtruderToColorMap m_extruder_color; - - // The output of process_layer() - std::string m_process_output; - -public: - GCodeAnalyzer() { reset(); } - - void set_extruder_offsets(const ExtruderOffsetsMap& extruder_offsets) { m_extruder_offsets = extruder_offsets; } - void set_extruders_count(unsigned int count); - - void set_extrusion_axis(char axis) { m_parser.set_extrusion_axis(axis); } - - void set_gcode_flavor(const GCodeFlavor& flavor) { m_gcode_flavor = flavor; } - - // Reinitialize the analyzer - void reset(); - - // Adds the gcode contained in the given string to the analysis and returns it after removing the workcodes - const std::string& process_gcode(const std::string& gcode); - - // Calculates all data needed for gcode visualization - // throws CanceledException through print->throw_if_canceled() (sent by the caller as callback). - void calc_gcode_preview_data(GCodePreviewData& preview_data, std::function cancel_callback = std::function()); - - // Return an estimate of the memory consumed by the time estimator. - size_t memory_used() const; - - static bool is_valid_extrusion_role(ExtrusionRole role); - -private: - // Processes the given gcode line - void _process_gcode_line(GCodeReader& reader, const GCodeReader::GCodeLine& line); - - // Move - void _processG1(const GCodeReader::GCodeLine& line); - - // Retract - void _processG10(const GCodeReader::GCodeLine& line); - - // Unretract - void _processG11(const GCodeReader::GCodeLine& line); - - // Firmware controlled Retract - void _processG22(const GCodeReader::GCodeLine& line); - - // Firmware controlled Unretract - void _processG23(const GCodeReader::GCodeLine& line); - - // Set to Absolute Positioning - void _processG90(const GCodeReader::GCodeLine& line); - - // Set to Relative Positioning - void _processG91(const GCodeReader::GCodeLine& line); - - // Set Position - void _processG92(const GCodeReader::GCodeLine& line); - - // Set extruder to absolute mode - void _processM82(const GCodeReader::GCodeLine& line); - - // Set extruder to relative mode - void _processM83(const GCodeReader::GCodeLine& line); - - // Set fan speed - void _processM106(const GCodeReader::GCodeLine& line); - - // Disable fan - void _processM107(const GCodeReader::GCodeLine& line); - - // Set tool (MakerWare and Sailfish flavor) - void _processM108orM135(const GCodeReader::GCodeLine& line); - - // Recall stored home offsets - void _processM132(const GCodeReader::GCodeLine& line); - - // Repetier: Store x, y and z position - void _processM401(const GCodeReader::GCodeLine& line); - - // Repetier: Go to stored position - void _processM402(const GCodeReader::GCodeLine& line); - - // Processes T line (Select Tool) - void _processT(const std::string& command); - void _processT(const GCodeReader::GCodeLine& line); - - // Processes the tags - // Returns true if any tag has been processed - bool _process_tags(const GCodeReader::GCodeLine& line); - - // Processes extrusion role tag - void _process_extrusion_role_tag(const std::string& comment, size_t pos); - - // Processes mm3_per_mm tag - void _process_mm3_per_mm_tag(const std::string& comment, size_t pos); - - // Processes width tag - void _process_width_tag(const std::string& comment, size_t pos); - - // Processes height tag - void _process_height_tag(const std::string& comment, size_t pos); - - // Processes color change tag - void _process_color_change_tag(unsigned extruder); - - // Processes pause print and custom gcode tag - void _process_pause_print_or_custom_code_tag(); - - // Processes new layer tag - void _process_end_pause_print_or_custom_code_tag(); - - void _set_units(EUnits units); - EUnits _get_units() const; - - void _set_global_positioning_type(EPositioningType type); - EPositioningType _get_global_positioning_type() const; - - void _set_e_local_positioning_type(EPositioningType type); - EPositioningType _get_e_local_positioning_type() const; - - void _set_extrusion_role(ExtrusionRole extrusion_role); - ExtrusionRole _get_extrusion_role() const; - - void _set_extruder_id(unsigned int id); - unsigned int _get_extruder_id() const; - - void _set_cp_color_id(unsigned int id); - unsigned int _get_cp_color_id() const; - - void _set_mm3_per_mm(float value); - float _get_mm3_per_mm() const; - - void _set_width(float width); - float _get_width() const; - - void _set_height(float height); - float _get_height() const; - - void _set_feedrate(float feedrate_mm_sec); - float _get_feedrate() const; - - void _set_fan_speed(float fan_speed_percentage); - float _get_fan_speed() const; - - void _set_axis_position(EAxis axis, float position); - float _get_axis_position(EAxis axis) const; - - void _set_axis_origin(EAxis axis, float position); - float _get_axis_origin(EAxis axis) const; - - // Sets axes position to zero - void _reset_axes_position(); - // Sets origin position to zero - void _reset_axes_origin(); - - void _set_start_position(const Vec3f& position); - const Vec3f& _get_start_position() const; - - void _set_cached_position(unsigned char axis, float position); - float _get_cached_position(unsigned char axis) const; - - void _reset_cached_position(); - - void _set_start_extrusion(float extrusion); - float _get_start_extrusion() const; - float _get_delta_extrusion() const; - - // Returns current xyz position (from m_state.position[]) - Vec3f _get_end_position() const; - - // Adds a new move with the given data - void _store_move(GCodeMove::EType type); - - // Checks if the given int is a valid extrusion role (contained into enum ExtrusionRole) - bool _is_valid_extrusion_role(int value) const; - - // All the following methods throw CanceledException through print->throw_if_canceled() (sent by the caller as callback). - void _calc_gcode_preview_extrusion_layers(GCodePreviewData& preview_data, std::function cancel_callback); - void _calc_gcode_preview_travel(GCodePreviewData& preview_data, std::function cancel_callback); - void _calc_gcode_preview_retractions(GCodePreviewData& preview_data, std::function cancel_callback); - void _calc_gcode_preview_unretractions(GCodePreviewData& preview_data, std::function cancel_callback); -}; - -} // namespace Slic3r - -#endif // !ENABLE_GCODE_VIEWER - -#endif /* slic3r_GCode_Analyzer_hpp_ */ diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp index ac67fdabe5..a1c9c688d3 100644 --- a/src/libslic3r/GCode/GCodeProcessor.cpp +++ b/src/libslic3r/GCode/GCodeProcessor.cpp @@ -10,6 +10,11 @@ #include #include +#if __has_include() + #include + #include +#endif + #if ENABLE_GCODE_VIEWER #include @@ -170,7 +175,7 @@ void GCodeProcessor::TimeMachine::reset() prev.reset(); gcode_time.reset(); blocks = std::vector(); - g1_times_cache = std::vector(); + g1_times_cache = std::vector(); std::fill(moves_time.begin(), moves_time.end(), 0.0f); std::fill(roles_time.begin(), roles_time.end(), 0.0f); layers_time = std::vector(); @@ -292,7 +297,7 @@ void GCodeProcessor::TimeMachine::calculate_time(size_t keep_last_n_blocks) } layers_time[block.layer_id - 1] += block_time; } - g1_times_cache.push_back(time); + g1_times_cache.push_back({ block.g1_line_id, time }); } if (keep_last_n_blocks) @@ -358,7 +363,7 @@ void GCodeProcessor::TimeProcessor::post_process(const std::string& filename) std::string ret; - if (line == First_Line_M73_Placeholder_Tag || line == Last_Line_M73_Placeholder_Tag) { + if (export_remaining_time_enabled && (line == First_Line_M73_Placeholder_Tag || line == Last_Line_M73_Placeholder_Tag)) { for (size_t i = 0; i < static_cast(PrintEstimatedTimeStatistics::ETimeMode::Count); ++i) { const TimeMachine& machine = machines[i]; if (machine.enabled) { @@ -371,10 +376,11 @@ void GCodeProcessor::TimeProcessor::post_process(const std::string& filename) else if (line == Estimated_Printing_Time_Placeholder_Tag) { for (size_t i = 0; i < static_cast(PrintEstimatedTimeStatistics::ETimeMode::Count); ++i) { const TimeMachine& machine = machines[i]; - if (machine.enabled) { + PrintEstimatedTimeStatistics::ETimeMode mode = static_cast(i); + if (mode == PrintEstimatedTimeStatistics::ETimeMode::Normal || machine.enabled) { char buf[128]; sprintf(buf, "; estimated printing time (%s mode) = %s\n", - (static_cast(i) == PrintEstimatedTimeStatistics::ETimeMode::Normal) ? "normal" : "silent", + (mode == PrintEstimatedTimeStatistics::ETimeMode::Normal) ? "normal" : "silent", get_time_dhms(machine.time).c_str()); ret += buf; } @@ -394,18 +400,30 @@ void GCodeProcessor::TimeProcessor::post_process(const std::string& filename) return false; }; + // Iterators for the normal and silent cached time estimate entry recently processed, used by process_line_G1. + auto g1_times_cache_it = Slic3r::reserve_vector::const_iterator>(machines.size()); + for (const auto& machine : machines) + g1_times_cache_it.emplace_back(machine.g1_times_cache.begin()); // add lines M73 to exported gcode auto process_line_G1 = [&]() { - for (size_t i = 0; i < static_cast(PrintEstimatedTimeStatistics::ETimeMode::Count); ++i) { - const TimeMachine& machine = machines[i]; - if (machine.enabled && g1_lines_counter < machine.g1_times_cache.size()) { - float elapsed_time = machine.g1_times_cache[g1_lines_counter]; - std::pair to_export = { int(::roundf(100.0f * elapsed_time / machine.time)), - time_in_minutes(machine.time - elapsed_time) }; - if (last_exported[i] != to_export) { - export_line += format_line_M73(machine.line_m73_mask.c_str(), - to_export.first, to_export.second); - last_exported[i] = to_export; + if (export_remaining_time_enabled) { + for (size_t i = 0; i < static_cast(PrintEstimatedTimeStatistics::ETimeMode::Count); ++i) { + const TimeMachine& machine = machines[i]; + if (machine.enabled) { + // Skip all machine.g1_times_cache below g1_lines_counter. + auto& it = g1_times_cache_it[i]; + while (it != machine.g1_times_cache.end() && it->id < g1_lines_counter) + ++it; + if (it != machine.g1_times_cache.end() && it->id == g1_lines_counter) { + float elapsed_time = it->elapsed_time; + std::pair to_export = { int(100.0f * elapsed_time / machine.time), + time_in_minutes(machine.time - elapsed_time) }; + if (last_exported[i] != to_export) { + export_line += format_line_M73(machine.line_m73_mask.c_str(), + to_export.first, to_export.second); + last_exported[i] = to_export; + } + } } } } @@ -466,6 +484,8 @@ void GCodeProcessor::TimeProcessor::post_process(const std::string& filename) const std::vector> GCodeProcessor::Producers = { { EProducer::PrusaSlicer, "PrusaSlicer" }, + { EProducer::Slic3rPE, "Slic3r Prusa Edition" }, + { EProducer::Slic3r, "Slic3r" }, { EProducer::Cura, "Cura_SteamEngine" }, { EProducer::Simplify3D, "Simplify3D" }, { EProducer::CraftWare, "CraftWare" }, @@ -505,7 +525,9 @@ void GCodeProcessor::apply_config(const PrintConfig& config) m_filament_diameters[i] = static_cast(config.filament_diameter.values[i]); } - m_time_processor.machine_limits = reinterpret_cast(config); + if (config.machine_limits_usage.value != MachineLimitsUsage::Ignore) + m_time_processor.machine_limits = reinterpret_cast(config); + // Filament load / unload times are not specific to a firmware flavor. Let anybody use it if they find it useful. // As of now the fields are shown at the UI dialog in the same combo box as the ramming values, so they // are considered to be active for the single extruder multi-material printers only. @@ -687,7 +709,7 @@ void GCodeProcessor::reset() m_global_positioning_type = EPositioningType::Absolute; m_e_local_positioning_type = EPositioningType::Absolute; m_extruder_offsets = std::vector(Min_Extruder_Count, Vec3f::Zero()); - m_flavor = gcfRepRap; + m_flavor = gcfRepRapSprinter; m_start_position = { 0.0f, 0.0f, 0.0f, 0.0f }; m_end_position = { 0.0f, 0.0f, 0.0f, 0.0f }; @@ -709,6 +731,7 @@ void GCodeProcessor::reset() m_filament_diameters = std::vector(Min_Extruder_Count, 1.75f); m_extruded_last_z = 0.0f; + m_g1_line_id = 0; m_layer_id = 0; m_cp_color.reset(); @@ -739,9 +762,9 @@ void GCodeProcessor::process_file(const std::string& filename, std::function 1 && detect_producer(comment)) m_parser.quit_parsing_file(); } @@ -749,7 +772,7 @@ void GCodeProcessor::process_file(const std::string& filename, std::function 1) { // process command lines switch (::toupper(cmd[0])) @@ -923,122 +945,151 @@ void GCodeProcessor::process_gcode_line(const GCodeReader::GCodeLine& line) } } else { - std::string comment = line.comment(); - if (comment.length() > 1) - // process tags embedded into comments - process_tags(comment); + const std::string &comment = line.raw(); + if (comment.length() > 2 && comment.front() == ';') + // Process tags embedded into comments. Tag comments always start at the start of a line + // with a comment and continue with a tag without any whitespace separator. + process_tags(comment.substr(1)); } } -void GCodeProcessor::process_tags(const std::string& comment) +static inline bool starts_with(const std::string_view comment, const std::string_view tag) { - // producers tags - if (m_producers_enabled) { - if (m_producer != EProducer::Unknown) { - if (process_producers_tags(comment)) - return; + size_t tag_len = tag.size(); + return comment.size() >= tag_len && comment.substr(0, tag_len) == tag; +} + +#if __has_include() + template + struct is_from_chars_convertible : std::false_type {}; + template + struct is_from_chars_convertible(), std::declval(), std::declval()))>> : std::true_type {}; +#endif + +// Returns true if the number was parsed correctly into out and the number spanned the whole input string. +template +[[nodiscard]] static inline bool parse_number(const std::string_view sv, T &out) +{ + // https://www.bfilipek.com/2019/07/detect-overload-from-chars.html#example-stdfromchars +#if __has_include() + // Visual Studio 19 supports from_chars all right. + // OSX compiler that we use only implements std::from_chars just for ints. + // GCC that we compile on does not provide at all. + if constexpr (is_from_chars_convertible::value) { + auto str_end = sv.data() + sv.size(); + auto [end_ptr, error_code] = std::from_chars(sv.data(), str_end, out); + return error_code == std::errc() && end_ptr == str_end; + } + else +#endif + { + // Legacy conversion, which is costly due to having to make a copy of the string before conversion. + try { + assert(sv.size() < 1024); + assert(sv.data() != nullptr); + std::string str { sv }; + size_t read = 0; + if constexpr (std::is_same_v) + out = std::stoi(str, &read); + else if constexpr (std::is_same_v) + out = std::stol(str, &read); + else if constexpr (std::is_same_v) + out = std::stof(str, &read); + else if constexpr (std::is_same_v) + out = std::stod(str, &read); + return str.size() == read; + } catch (...) { + return false; } } +} + +void GCodeProcessor::process_tags(const std::string_view comment) +{ + // producers tags + if (m_producers_enabled && process_producers_tags(comment)) + return; // extrusion role tag - size_t pos = comment.find(Extrusion_Role_Tag); - if (pos != comment.npos) { - m_extrusion_role = ExtrusionEntity::string_to_role(comment.substr(pos + Extrusion_Role_Tag.length())); + if (starts_with(comment, Extrusion_Role_Tag)) { + m_extrusion_role = ExtrusionEntity::string_to_role(comment.substr(Extrusion_Role_Tag.length())); return; } - if (!m_producers_enabled || m_producer == EProducer::PrusaSlicer) { + if ((!m_producers_enabled || m_producer == EProducer::PrusaSlicer) && + starts_with(comment, Height_Tag)) { // height tag - pos = comment.find(Height_Tag); - if (pos != comment.npos) { - try { - m_height = std::stof(comment.substr(pos + Height_Tag.length())); - } - catch (...) { - BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Height (" << comment << ")."; - } - return; - } + if (! parse_number(comment.substr(Height_Tag.size()), m_height)) + BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Height (" << comment << ")."; + return; } #if ENABLE_GCODE_VIEWER_DATA_CHECKING // width tag - pos = comment.find(Width_Tag); - if (pos != comment.npos) { - try { - m_width_compare.last_tag_value = std::stof(comment.substr(pos + Width_Tag.length())); - } - catch (...) { + if (starts_with(comment, Width_Tag)) { + if (! parse_number(comment.substr(Width_Tag.size()), m_width_compare.last_tag_value)) BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Width (" << comment << ")."; - } return; } #endif // ENABLE_GCODE_VIEWER_DATA_CHECKING // color change tag - pos = comment.find(Color_Change_Tag); - if (pos != comment.npos) { - pos = comment.find_last_of(",T"); - try { - unsigned char extruder_id = (pos == comment.npos) ? 0 : static_cast(std::stoi(comment.substr(pos + 1))); - - m_extruder_colors[extruder_id] = static_cast(m_extruder_offsets.size()) + m_cp_color.counter; // color_change position in list of color for preview - ++m_cp_color.counter; - if (m_cp_color.counter == UCHAR_MAX) - m_cp_color.counter = 0; - - if (m_extruder_id == extruder_id) { - m_cp_color.current = m_extruder_colors[extruder_id]; - store_move_vertex(EMoveType::Color_change); + if (starts_with(comment, Color_Change_Tag)) { + unsigned char extruder_id = 0; + if (starts_with(comment.substr(Color_Change_Tag.size()), ",T")) { + int eid; + if (! parse_number(comment.substr(Color_Change_Tag.size() + 2), eid) || eid < 0 || eid > 255) { + BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Color_Change (" << comment << ")."; + return; } + extruder_id = static_cast(eid); + } - process_custom_gcode_time(CustomGCode::ColorChange); - } - catch (...) { - BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Color_Change (" << comment << ")."; + m_extruder_colors[extruder_id] = static_cast(m_extruder_offsets.size()) + m_cp_color.counter; // color_change position in list of color for preview + ++m_cp_color.counter; + if (m_cp_color.counter == UCHAR_MAX) + m_cp_color.counter = 0; + + if (m_extruder_id == extruder_id) { + m_cp_color.current = m_extruder_colors[extruder_id]; + store_move_vertex(EMoveType::Color_change); } + process_custom_gcode_time(CustomGCode::ColorChange); + return; } // pause print tag - pos = comment.find(Pause_Print_Tag); - if (pos != comment.npos) { + if (comment == Pause_Print_Tag) { store_move_vertex(EMoveType::Pause_Print); process_custom_gcode_time(CustomGCode::PausePrint); return; } // custom code tag - pos = comment.find(Custom_Code_Tag); - if (pos != comment.npos) { + if (comment == Custom_Code_Tag) { store_move_vertex(EMoveType::Custom_GCode); return; } #if ENABLE_GCODE_VIEWER_DATA_CHECKING // mm3_per_mm print tag - pos = comment.find(Mm3_Per_Mm_Tag); - if (pos != comment.npos) { - try { - m_mm3_per_mm_compare.last_tag_value = std::stof(comment.substr(pos + Mm3_Per_Mm_Tag.length())); - } - catch (...) { + if (starts_with(comment, Mm3_Per_Mm_Tag)) { + if (! parse_number(comment.substr(Mm3_Per_Mm_Tag.size()), m_mm3_per_mm_compare.last_tag_value)) BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Mm3_Per_Mm (" << comment << ")."; - } return; } #endif // ENABLE_GCODE_VIEWER_DATA_CHECKING // layer change tag - pos = comment.find(Layer_Change_Tag); - if (pos != comment.npos) { + if (comment == Layer_Change_Tag) { ++m_layer_id; return; } } -bool GCodeProcessor::process_producers_tags(const std::string& comment) +bool GCodeProcessor::process_producers_tags(const std::string_view comment) { switch (m_producer) { @@ -1051,18 +1102,18 @@ bool GCodeProcessor::process_producers_tags(const std::string& comment) } } -bool GCodeProcessor::process_prusaslicer_tags(const std::string& comment) +bool GCodeProcessor::process_prusaslicer_tags(const std::string_view comment) { return false; } -bool GCodeProcessor::process_cura_tags(const std::string& comment) +bool GCodeProcessor::process_cura_tags(const std::string_view comment) { // TYPE -> extrusion role std::string tag = "TYPE:"; size_t pos = comment.find(tag); if (pos != comment.npos) { - std::string type = comment.substr(pos + tag.length()); + const std::string_view type = comment.substr(pos + tag.length()); if (type == "SKIRT") m_extrusion_role = erSkirt; else if (type == "WALL-OUTER") @@ -1091,7 +1142,7 @@ bool GCodeProcessor::process_cura_tags(const std::string& comment) tag = "FLAVOR:"; pos = comment.find(tag); if (pos != comment.npos) { - std::string flavor = comment.substr(pos + tag.length()); + const std::string_view flavor = comment.substr(pos + tag.length()); if (flavor == "BFB") m_flavor = gcfMarlin; // << ??????????????????????? else if (flavor == "Mach3") @@ -1107,7 +1158,7 @@ bool GCodeProcessor::process_cura_tags(const std::string& comment) else if (flavor == "Repetier") m_flavor = gcfRepetier; else if (flavor == "RepRap") - m_flavor = gcfRepRap; + m_flavor = gcfRepRapFirmware; else if (flavor == "Marlin") m_flavor = gcfMarlin; else @@ -1119,7 +1170,7 @@ bool GCodeProcessor::process_cura_tags(const std::string& comment) return false; } -bool GCodeProcessor::process_simplify3d_tags(const std::string& comment) +bool GCodeProcessor::process_simplify3d_tags(const std::string_view comment) { // extrusion roles @@ -1207,7 +1258,7 @@ bool GCodeProcessor::process_simplify3d_tags(const std::string& comment) std::string tag = " tool"; pos = comment.find(tag); if (pos == 0) { - std::string data = comment.substr(pos + tag.length()); + const std::string_view data = comment.substr(pos + tag.length()); std::string h_tag = "H"; size_t h_start = data.find(h_tag); size_t h_end = data.find_first_of(' ', h_start); @@ -1215,20 +1266,12 @@ bool GCodeProcessor::process_simplify3d_tags(const std::string& comment) size_t w_start = data.find(w_tag); size_t w_end = data.find_first_of(' ', w_start); if (h_start != data.npos) { - try { - m_height_compare.last_tag_value = std::stof(data.substr(h_start + 1, (h_end != data.npos) ? h_end - h_start - 1 : h_end)); - } - catch (...) { + if (! parse_number(data.substr(h_start + 1, (h_end != data.npos) ? h_end - h_start - 1 : h_end), m_height_compare.last_tag_value)) BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Height (" << comment << ")."; - } } if (w_start != data.npos) { - try { - m_width_compare.last_tag_value = std::stof(data.substr(w_start + 1, (w_end != data.npos) ? w_end - w_start - 1 : w_end)); - } - catch (...) { + if (! parse_number(data.substr(w_start + 1, (w_end != data.npos) ? w_end - w_start - 1 : w_end), m_width_compare.last_tag_value)) BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Width (" << comment << ")."; - } } return true; @@ -1238,13 +1281,13 @@ bool GCodeProcessor::process_simplify3d_tags(const std::string& comment) return false; } -bool GCodeProcessor::process_craftware_tags(const std::string& comment) +bool GCodeProcessor::process_craftware_tags(const std::string_view comment) { // segType -> extrusion role std::string tag = "segType:"; size_t pos = comment.find(tag); if (pos != comment.npos) { - std::string type = comment.substr(pos + tag.length()); + const std::string_view type = comment.substr(pos + tag.length()); if (type == "Skirt") m_extrusion_role = erSkirt; else if (type == "Perimeter") @@ -1278,13 +1321,13 @@ bool GCodeProcessor::process_craftware_tags(const std::string& comment) return false; } -bool GCodeProcessor::process_ideamaker_tags(const std::string& comment) +bool GCodeProcessor::process_ideamaker_tags(const std::string_view comment) { // TYPE -> extrusion role std::string tag = "TYPE:"; size_t pos = comment.find(tag); if (pos != comment.npos) { - std::string type = comment.substr(pos + tag.length()); + const std::string_view type = comment.substr(pos + tag.length()); if (type == "RAFT") m_extrusion_role = erSkirt; else if (type == "WALL-OUTER") @@ -1313,12 +1356,8 @@ bool GCodeProcessor::process_ideamaker_tags(const std::string& comment) tag = "WIDTH:"; pos = comment.find(tag); if (pos != comment.npos) { - try { - m_width_compare.last_tag_value = std::stof(comment.substr(pos + tag.length())); - } - catch (...) { + if (! parse_number(comment.substr(pos + tag.length()), m_width_compare.last_tag_value)) BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Width (" << comment << ")."; - } return true; } @@ -1326,12 +1365,8 @@ bool GCodeProcessor::process_ideamaker_tags(const std::string& comment) tag = "HEIGHT:"; pos = comment.find(tag); if (pos != comment.npos) { - try { - m_height_compare.last_tag_value = std::stof(comment.substr(pos + tag.length())); - } - catch (...) { + if (! parse_number(comment.substr(pos + tag.length()), m_height_compare.last_tag_value)) BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Height (" << comment << ")."; - } return true; } #endif // ENABLE_GCODE_VIEWER_DATA_CHECKING @@ -1339,7 +1374,7 @@ bool GCodeProcessor::process_ideamaker_tags(const std::string& comment) return false; } -bool GCodeProcessor::detect_producer(const std::string& comment) +bool GCodeProcessor::detect_producer(const std::string_view comment) { for (const auto& [id, search_string] : Producers) { size_t pos = comment.find(search_string); @@ -1391,6 +1426,8 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line) return type; }; + ++m_g1_line_id; + // enable processing of lines M201/M203/M204/M205 m_time_processor.machine_envelope_processing_enabled = true; @@ -1454,7 +1491,8 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line) m_width = delta_pos[E] * static_cast(M_PI * sqr(filament_radius)) / (delta_xyz * m_height) + static_cast(1.0 - 0.25 * M_PI) * m_height; // clamp width to avoid artifacts which may arise from wrong values of m_height - m_width = std::min(m_width, 4.0f * m_height); + m_width = std::min(m_width, 1.0f); +// m_width = std::min(m_width, 4.0f * m_height); #if ENABLE_GCODE_VIEWER_DATA_CHECKING m_width_compare.update(m_width, m_extrusion_role); @@ -1495,6 +1533,7 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line) block.move_type = type; block.role = m_extrusion_role; block.distance = distance; + block.g1_line_id = m_g1_line_id; block.layer_id = m_layer_id; // calculates block cruise feedrate @@ -1798,7 +1837,7 @@ void GCodeProcessor::process_M201(const GCodeReader::GCodeLine& line) return; // see http://reprap.org/wiki/G-code#M201:_Set_max_printing_acceleration - float factor = (m_flavor != gcfRepRap && m_units == EUnits::Inches) ? INCHES_TO_MM : 1.0f; + float factor = ((m_flavor != gcfRepRapSprinter && m_flavor != gcfRepRapFirmware) && m_units == EUnits::Inches) ? INCHES_TO_MM : 1.0f; for (size_t i = 0; i < static_cast(PrintEstimatedTimeStatistics::ETimeMode::Count); ++i) { if (line.has_x()) @@ -1991,11 +2030,14 @@ void GCodeProcessor::process_T(const GCodeReader::GCodeLine& line) process_T(line.cmd()); } -void GCodeProcessor::process_T(const std::string& command) +void GCodeProcessor::process_T(const std::string_view command) { if (command.length() > 1) { - try { - unsigned char id = static_cast(std::stoi(command.substr(1))); + int eid; + if (! parse_number(command.substr(1), eid) || eid < 0 || eid > 255) { + BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid toolchange (" << command << ")."; + } else { + unsigned char id = static_cast(eid); if (m_extruder_id != id) { unsigned char extruders_count = static_cast(m_extruder_offsets.size()); if (id >= extruders_count) @@ -2017,9 +2059,6 @@ void GCodeProcessor::process_T(const std::string& command) store_move_vertex(EMoveType::Tool_change); } } - catch (...) { - BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid toolchange (" << command << ")."; - } } } diff --git a/src/libslic3r/GCode/GCodeProcessor.hpp b/src/libslic3r/GCode/GCodeProcessor.hpp index b31591ca86..5f9c4ae450 100644 --- a/src/libslic3r/GCode/GCodeProcessor.hpp +++ b/src/libslic3r/GCode/GCodeProcessor.hpp @@ -11,6 +11,7 @@ #include #include #include +#include namespace Slic3r { @@ -145,6 +146,7 @@ namespace Slic3r { EMoveType move_type{ EMoveType::Noop }; ExtrusionRole role{ erNone }; + unsigned int g1_line_id{ 0 }; unsigned int layer_id{ 0 }; float distance{ 0.0f }; // mm float acceleration{ 0.0f }; // mm/s^2 @@ -182,6 +184,12 @@ namespace Slic3r { void reset(); }; + struct G1LinesCacheItem + { + unsigned int id; + float elapsed_time; + }; + bool enabled; float acceleration; // mm/s^2 // hard limit for the acceleration, to which the firmware will clamp. @@ -193,7 +201,7 @@ namespace Slic3r { State prev; CustomGCodeTime gcode_time; std::vector blocks; - std::vector g1_times_cache; + std::vector g1_times_cache; std::array(EMoveType::Count)> moves_time; std::array(ExtrusionRole::erCount)> roles_time; std::vector layers_time; @@ -305,10 +313,12 @@ namespace Slic3r { {} void update(float value, ExtrusionRole role) { - ++count; - if (last_tag_value != 0.0f) { - if (std::abs(value - last_tag_value) / last_tag_value > threshold) - errors.push_back({ value, last_tag_value, role }); + if (role != erCustom) { + ++count; + if (last_tag_value != 0.0f) { + if (std::abs(value - last_tag_value) / last_tag_value > threshold) + errors.push_back({ value, last_tag_value, role }); + } } } @@ -374,6 +384,7 @@ namespace Slic3r { ExtruderColors m_extruder_colors; std::vector m_filament_diameters; float m_extruded_last_z; + unsigned int m_g1_line_id; unsigned int m_layer_id; CpColor m_cp_color; @@ -381,6 +392,8 @@ namespace Slic3r { { Unknown, PrusaSlicer, + Slic3rPE, + Slic3r, Cura, Simplify3D, CraftWare, @@ -434,15 +447,15 @@ namespace Slic3r { void process_gcode_line(const GCodeReader::GCodeLine& line); // Process tags embedded into comments - void process_tags(const std::string& comment); - bool process_producers_tags(const std::string& comment); - bool process_prusaslicer_tags(const std::string& comment); - bool process_cura_tags(const std::string& comment); - bool process_simplify3d_tags(const std::string& comment); - bool process_craftware_tags(const std::string& comment); - bool process_ideamaker_tags(const std::string& comment); + void process_tags(const std::string_view comment); + bool process_producers_tags(const std::string_view comment); + bool process_prusaslicer_tags(const std::string_view comment); + bool process_cura_tags(const std::string_view comment); + bool process_simplify3d_tags(const std::string_view comment); + bool process_craftware_tags(const std::string_view comment); + bool process_ideamaker_tags(const std::string_view comment); - bool detect_producer(const std::string& comment); + bool detect_producer(const std::string_view comment); // Move void process_G0(const GCodeReader::GCodeLine& line); @@ -528,7 +541,7 @@ namespace Slic3r { // Processes T line (Select Tool) void process_T(const GCodeReader::GCodeLine& line); - void process_T(const std::string& command); + void process_T(const std::string_view command); void store_move_vertex(EMoveType type); diff --git a/src/libslic3r/GCode/PressureEqualizer.cpp b/src/libslic3r/GCode/PressureEqualizer.cpp index 33601e5e9f..c3f084a24a 100644 --- a/src/libslic3r/GCode/PressureEqualizer.cpp +++ b/src/libslic3r/GCode/PressureEqualizer.cpp @@ -165,9 +165,10 @@ static inline float parse_float(const char *&line) return result; }; -#define EXTRUSION_ROLE_TAG ";_EXTRUSION_ROLE:" bool PressureEqualizer::process_line(const char *line, const size_t len, GCodeLine &buf) { + static constexpr const char *EXTRUSION_ROLE_TAG = ";_EXTRUSION_ROLE:"; + if (strncmp(line, EXTRUSION_ROLE_TAG, strlen(EXTRUSION_ROLE_TAG)) == 0) { line += strlen(EXTRUSION_ROLE_TAG); int role = atoi(line); diff --git a/src/libslic3r/GCode/PreviewData.cpp b/src/libslic3r/GCode/PreviewData.cpp index 8aec327db3..de83bf20a7 100644 --- a/src/libslic3r/GCode/PreviewData.cpp +++ b/src/libslic3r/GCode/PreviewData.cpp @@ -1,4 +1,3 @@ -#include "Analyzer.hpp" #include "PreviewData.hpp" #include #include "Utils.hpp" diff --git a/src/libslic3r/GCode/WipeTower.cpp b/src/libslic3r/GCode/WipeTower.cpp index d6d336292d..8bb441786f 100644 --- a/src/libslic3r/GCode/WipeTower.cpp +++ b/src/libslic3r/GCode/WipeTower.cpp @@ -126,7 +126,7 @@ public: } WipeTowerWriter& disable_linear_advance() { - m_gcode += (m_gcode_flavor == gcfRepRap + m_gcode += (m_gcode_flavor == gcfRepRapSprinter || m_gcode_flavor == gcfRepRapFirmware ? (std::string("M572 D") + std::to_string(m_current_tool) + " S0\n") : std::string("M900 K0\n")); return *this; @@ -386,7 +386,7 @@ public: // Set digital trimpot motor WipeTowerWriter& set_extruder_trimpot(int current) { - if (m_gcode_flavor == gcfRepRap) + if (m_gcode_flavor == gcfRepRapSprinter || m_gcode_flavor == gcfRepRapFirmware) m_gcode += "M906 E"; else m_gcode += "M907 E"; diff --git a/src/libslic3r/GCodeReader.hpp b/src/libslic3r/GCodeReader.hpp index 7e0793cd9b..8d835185ec 100644 --- a/src/libslic3r/GCodeReader.hpp +++ b/src/libslic3r/GCodeReader.hpp @@ -6,6 +6,7 @@ #include #include #include +#include #include "PrintConfig.hpp" namespace Slic3r { @@ -17,13 +18,13 @@ public: GCodeLine() { reset(); } void reset() { m_mask = 0; memset(m_axis, 0, sizeof(m_axis)); m_raw.clear(); } - const std::string& raw() const { return m_raw; } - const std::string cmd() const { + const std::string& raw() const { return m_raw; } + const std::string_view cmd() const { const char *cmd = GCodeReader::skip_whitespaces(m_raw.c_str()); - return std::string(cmd, GCodeReader::skip_word(cmd)); + return std::string_view(cmd, GCodeReader::skip_word(cmd) - cmd); } - const std::string comment() const - { size_t pos = m_raw.find(';'); return (pos == std::string::npos) ? "" : m_raw.substr(pos + 1); } + const std::string_view comment() const + { size_t pos = m_raw.find(';'); return (pos == std::string::npos) ? std::string_view() : std::string_view(m_raw).substr(pos + 1); } bool has(Axis axis) const { return (m_mask & (1 << int(axis))) != 0; } float value(Axis axis) const { return m_axis[axis]; } diff --git a/src/libslic3r/GCodeTimeEstimator.cpp b/src/libslic3r/GCodeTimeEstimator.cpp deleted file mode 100644 index a3e20ca2f4..0000000000 --- a/src/libslic3r/GCodeTimeEstimator.cpp +++ /dev/null @@ -1,1678 +0,0 @@ -#include "Exception.hpp" -#include "GCodeTimeEstimator.hpp" -#include "Utils.hpp" -#include -#include - -#include - -#include -#include -#include - -#if !ENABLE_GCODE_VIEWER - -static const float MMMIN_TO_MMSEC = 1.0f / 60.0f; -static const float MILLISEC_TO_SEC = 0.001f; -static const float INCHES_TO_MM = 25.4f; - -static const float DEFAULT_FEEDRATE = 1500.0f; // from Prusa Firmware (Marlin_main.cpp) -static const float DEFAULT_ACCELERATION = 1500.0f; // Prusa Firmware 1_75mm_MK2 -static const float DEFAULT_RETRACT_ACCELERATION = 1500.0f; // Prusa Firmware 1_75mm_MK2 -static const float DEFAULT_AXIS_MAX_FEEDRATE[] = { 500.0f, 500.0f, 12.0f, 120.0f }; // Prusa Firmware 1_75mm_MK2 -static const float DEFAULT_AXIS_MAX_ACCELERATION[] = { 9000.0f, 9000.0f, 500.0f, 10000.0f }; // Prusa Firmware 1_75mm_MK2 -static const float DEFAULT_AXIS_MAX_JERK[] = { 10.0f, 10.0f, 0.4f, 2.5f }; // from Prusa Firmware (Configuration.h) -static const float DEFAULT_MINIMUM_FEEDRATE = 0.0f; // from Prusa Firmware (Configuration_adv.h) -static const float DEFAULT_MINIMUM_TRAVEL_FEEDRATE = 0.0f; // from Prusa Firmware (Configuration_adv.h) -static const float DEFAULT_EXTRUDE_FACTOR_OVERRIDE_PERCENTAGE = 1.0f; // 100 percent - -static const float PREVIOUS_FEEDRATE_THRESHOLD = 0.0001f; - -#if ENABLE_MOVE_STATS -static const std::string MOVE_TYPE_STR[Slic3r::GCodeTimeEstimator::Block::Num_Types] = -{ - "Noop", - "Retract", - "Unretract", - "Tool_change", - "Move", - "Extrude" -}; -#endif // ENABLE_MOVE_STATS - -namespace Slic3r { - void GCodeTimeEstimator::Feedrates::reset() - { - feedrate = 0.0f; - safe_feedrate = 0.0f; - ::memset(axis_feedrate, 0, Num_Axis * sizeof(float)); - ::memset(abs_axis_feedrate, 0, Num_Axis * sizeof(float)); - } - - float GCodeTimeEstimator::Block::Trapezoid::acceleration_time(float entry_feedrate, float acceleration) const - { - return acceleration_time_from_distance(entry_feedrate, accelerate_until, acceleration); - } - - float GCodeTimeEstimator::Block::Trapezoid::cruise_time() const - { - return (cruise_feedrate != 0.0f) ? cruise_distance() / cruise_feedrate : 0.0f; - } - - float GCodeTimeEstimator::Block::Trapezoid::deceleration_time(float distance, float acceleration) const - { - return acceleration_time_from_distance(cruise_feedrate, (distance - decelerate_after), -acceleration); - } - - float GCodeTimeEstimator::Block::Trapezoid::cruise_distance() const - { - return decelerate_after - accelerate_until; - } - - float GCodeTimeEstimator::Block::Trapezoid::acceleration_time_from_distance(float initial_feedrate, float distance, float acceleration) - { - return (acceleration != 0.0f) ? (speed_from_distance(initial_feedrate, distance, acceleration) - initial_feedrate) / acceleration : 0.0f; - } - - float GCodeTimeEstimator::Block::Trapezoid::speed_from_distance(float initial_feedrate, float distance, float acceleration) - { - // to avoid invalid negative numbers due to numerical imprecision - float value = std::max(0.0f, sqr(initial_feedrate) + 2.0f * acceleration * distance); - return ::sqrt(value); - } - - float GCodeTimeEstimator::Block::acceleration_time() const - { - return trapezoid.acceleration_time(feedrate.entry, acceleration); - } - - float GCodeTimeEstimator::Block::cruise_time() const - { - return trapezoid.cruise_time(); - } - - float GCodeTimeEstimator::Block::deceleration_time() const - { - return trapezoid.deceleration_time(distance, acceleration); - } - - float GCodeTimeEstimator::Block::cruise_distance() const - { - return trapezoid.cruise_distance(); - } - - void GCodeTimeEstimator::Block::calculate_trapezoid() - { - trapezoid.cruise_feedrate = feedrate.cruise; - - float accelerate_distance = std::max(0.0f, estimate_acceleration_distance(feedrate.entry, feedrate.cruise, acceleration)); - float decelerate_distance = std::max(0.0f, estimate_acceleration_distance(feedrate.cruise, feedrate.exit, -acceleration)); - float cruise_distance = distance - accelerate_distance - decelerate_distance; - - // Not enough space to reach the nominal feedrate. - // This means no cruising, and we'll have to use intersection_distance() to calculate when to abort acceleration - // and start braking in order to reach the exit_feedrate exactly at the end of this block. - if (cruise_distance < 0.0f) - { - accelerate_distance = std::clamp(intersection_distance(feedrate.entry, feedrate.exit, acceleration, distance), 0.0f, distance); - cruise_distance = 0.0f; - trapezoid.cruise_feedrate = Trapezoid::speed_from_distance(feedrate.entry, accelerate_distance, acceleration); - } - - trapezoid.accelerate_until = accelerate_distance; - trapezoid.decelerate_after = accelerate_distance + cruise_distance; - } - - float GCodeTimeEstimator::Block::max_allowable_speed(float acceleration, float target_velocity, float distance) - { - // to avoid invalid negative numbers due to numerical imprecision - float value = std::max(0.0f, sqr(target_velocity) - 2.0f * acceleration * distance); - return ::sqrt(value); - } - - float GCodeTimeEstimator::Block::estimate_acceleration_distance(float initial_rate, float target_rate, float acceleration) - { - return (acceleration == 0.0f) ? 0.0f : (sqr(target_rate) - sqr(initial_rate)) / (2.0f * acceleration); - } - - float GCodeTimeEstimator::Block::intersection_distance(float initial_rate, float final_rate, float acceleration, float distance) - { - return (acceleration == 0.0f) ? 0.0f : (2.0f * acceleration * distance - sqr(initial_rate) + sqr(final_rate)) / (4.0f * acceleration); - } - -#if ENABLE_MOVE_STATS - GCodeTimeEstimator::MoveStats::MoveStats() - : count(0) - , time(0.0f) - { - } -#endif // ENABLE_MOVE_STATS - - const std::string GCodeTimeEstimator::Normal_First_M73_Output_Placeholder_Tag = "; _TE_NORMAL_FIRST_M73_OUTPUT_PLACEHOLDER"; - const std::string GCodeTimeEstimator::Silent_First_M73_Output_Placeholder_Tag = "; _TE_SILENT_FIRST_M73_OUTPUT_PLACEHOLDER"; - const std::string GCodeTimeEstimator::Normal_Last_M73_Output_Placeholder_Tag = "; _TE_NORMAL_LAST_M73_OUTPUT_PLACEHOLDER"; - const std::string GCodeTimeEstimator::Silent_Last_M73_Output_Placeholder_Tag = "; _TE_SILENT_LAST_M73_OUTPUT_PLACEHOLDER"; - - const std::string GCodeTimeEstimator::Color_Change_Tag = "PRINT_COLOR_CHANGE"; - const std::string GCodeTimeEstimator::Pause_Print_Tag = "PRINT_PAUSE"; - - GCodeTimeEstimator::GCodeTimeEstimator(EMode mode) - : m_mode(mode) - { - reset(); - set_default(); - } - - void GCodeTimeEstimator::add_gcode_line(const std::string& gcode_line) - { - PROFILE_FUNC(); - m_parser.parse_line(gcode_line, - [this](GCodeReader &reader, const GCodeReader::GCodeLine &line) - { this->_process_gcode_line(reader, line); }); - } - - void GCodeTimeEstimator::add_gcode_block(const char *ptr) - { - PROFILE_FUNC(); - GCodeReader::GCodeLine gline; - auto action = [this](GCodeReader &reader, const GCodeReader::GCodeLine &line) - { this->_process_gcode_line(reader, line); }; - for (; *ptr != 0;) { - gline.reset(); - ptr = m_parser.parse_line(ptr, gline, action); - } - } - - void GCodeTimeEstimator::calculate_time(bool start_from_beginning) - { - PROFILE_FUNC(); - if (start_from_beginning) - _reset_time(); - _calculate_time(0); - - if (m_needs_custom_gcode_times && (m_custom_gcode_time_cache != 0.0f)) - m_custom_gcode_times.push_back({CustomGCode::ColorChange, m_custom_gcode_time_cache }); - -#if ENABLE_MOVE_STATS - _log_moves_stats(); -#endif // ENABLE_MOVE_STATS - } - -#if 0 - void GCodeTimeEstimator::calculate_time_from_text(const std::string& gcode) - { - reset(); - - m_parser.parse_buffer(gcode, - [this](GCodeReader &reader, const GCodeReader::GCodeLine &line) - { this->_process_gcode_line(reader, line); }); - - _calculate_time(0); - - if (m_needs_custom_gcode_times && (m_custom_gcode_time_cache != 0.0f)) - m_custom_gcode_times.push_back({ cgtColorChange, m_custom_gcode_time_cache }); - -#if ENABLE_MOVE_STATS - _log_moves_stats(); -#endif // ENABLE_MOVE_STATS - } - - void GCodeTimeEstimator::calculate_time_from_file(const std::string& file) - { - reset(); - - m_parser.parse_file(file, boost::bind(&GCodeTimeEstimator::_process_gcode_line, this, _1, _2)); - _calculate_time(0); - - if (m_needs_custom_gcode_times && (m_custom_gcode_time_cache != 0.0f)) - m_custom_gcode_times.push_back({ cgtColorChange, m_custom_gcode_time_cache }); - -#if ENABLE_MOVE_STATS - _log_moves_stats(); -#endif // ENABLE_MOVE_STATS - } - - void GCodeTimeEstimator::calculate_time_from_lines(const std::vector& gcode_lines) - { - reset(); - - auto action = [this](GCodeReader &reader, const GCodeReader::GCodeLine &line) - { this->_process_gcode_line(reader, line); }; - for (const std::string& line : gcode_lines) - m_parser.parse_line(line, action); - _calculate_time(0); - - if (m_needs_custom_gcode_times && (m_custom_gcode_time_cache != 0.0f)) - m_custom_gcode_times.push_back({ cgtColorChange, m_custom_gcode_time_cache}); - -#if ENABLE_MOVE_STATS - _log_moves_stats(); -#endif // ENABLE_MOVE_STATS - } -#endif - - bool GCodeTimeEstimator::post_process(const std::string& filename, float interval_sec, const PostProcessData* const normal_mode, const PostProcessData* const silent_mode) - { - boost::nowide::ifstream in(filename); - if (!in.good()) - throw Slic3r::RuntimeError(std::string("Time estimator post process export failed.\nCannot open file for reading.\n")); - - std::string path_tmp = filename + ".postprocess"; - - FILE* out = boost::nowide::fopen(path_tmp.c_str(), "wb"); - if (out == nullptr) - throw Slic3r::RuntimeError(std::string("Time estimator post process export failed.\nCannot open file for writing.\n")); - - std::string normal_time_mask = "M73 P%s R%s\n"; - std::string silent_time_mask = "M73 Q%s S%s\n"; - char line_M73[64]; - - std::string gcode_line; - // buffer line to export only when greater than 64K to reduce writing calls - std::string export_line; - - // helper function to write to disk - auto write_string = [&](const std::string& str) { - fwrite((const void*)export_line.c_str(), 1, export_line.length(), out); - if (ferror(out)) - { - in.close(); - fclose(out); - boost::nowide::remove(path_tmp.c_str()); - throw Slic3r::RuntimeError(std::string("Time estimator post process export failed.\nIs the disk full?\n")); - } - export_line.clear(); - }; - - GCodeReader parser; - int g1_lines_count = 0; - int normal_g1_line_id = 0; - float normal_last_recorded_time = 0.0f; - int silent_g1_line_id = 0; - float silent_last_recorded_time = 0.0f; - - // helper function to process g1 lines - auto process_g1_line = [&](const PostProcessData* const data, const GCodeReader::GCodeLine& line, int& g1_line_id, float& last_recorded_time, const std::string& time_mask) { - if (data == nullptr) - return; - - assert((g1_line_id >= (int)data->g1_times.size()) || (data->g1_times[g1_line_id].first >= (int)g1_lines_count)); - float elapsed_time = -1.0f; - if (g1_line_id < (int)data->g1_times.size()) - { - const G1LineIdTime& map_item = data->g1_times[g1_line_id]; - if (map_item.first == g1_lines_count) - { - if (line.has_e()) - elapsed_time = map_item.second; - ++g1_line_id; - } - } - - if (elapsed_time != -1.0f) - { - float block_remaining_time = data->time - elapsed_time; - if (std::abs(last_recorded_time - block_remaining_time) > interval_sec) - { - sprintf(line_M73, time_mask.c_str(), std::to_string((int)(100.0f * elapsed_time / data->time)).c_str(), _get_time_minutes(block_remaining_time).c_str()); - gcode_line += line_M73; - - last_recorded_time = block_remaining_time; - } - } - }; - - while (std::getline(in, gcode_line)) - { - if (!in.good()) - { - fclose(out); - throw Slic3r::RuntimeError(std::string("Time estimator post process export failed.\nError while reading from file.\n")); - } - - // check tags - // remove Color_Change_Tag and Pause_Print_Tag - if (gcode_line == "; " + Color_Change_Tag || gcode_line == "; " + Pause_Print_Tag) - continue; - - // replaces placeholders for initial line M73 with the real lines - if ((normal_mode != nullptr) && (gcode_line == Normal_First_M73_Output_Placeholder_Tag)) - { - sprintf(line_M73, normal_time_mask.c_str(), "0", _get_time_minutes(normal_mode->time).c_str()); - gcode_line = line_M73; - } - else if ((silent_mode != nullptr) && (gcode_line == Silent_First_M73_Output_Placeholder_Tag)) - { - sprintf(line_M73, silent_time_mask.c_str(), "0", _get_time_minutes(silent_mode->time).c_str()); - gcode_line = line_M73; - } - // replaces placeholders for final line M73 with the real lines - else if ((normal_mode != nullptr) && (gcode_line == Normal_Last_M73_Output_Placeholder_Tag)) - { - sprintf(line_M73, normal_time_mask.c_str(), "100", "0"); - gcode_line = line_M73; - } - else if ((silent_mode != nullptr) && (gcode_line == Silent_Last_M73_Output_Placeholder_Tag)) - { - sprintf(line_M73, silent_time_mask.c_str(), "100", "0"); - gcode_line = line_M73; - } - else - gcode_line += "\n"; - - // add remaining time lines where needed - parser.parse_line(gcode_line, - [&](GCodeReader& reader, const GCodeReader::GCodeLine& line) - { - if (line.cmd_is("G1")) - { - ++g1_lines_count; - process_g1_line(silent_mode, line, silent_g1_line_id, silent_last_recorded_time, silent_time_mask); - process_g1_line(normal_mode, line, normal_g1_line_id, normal_last_recorded_time, normal_time_mask); - } - }); - - export_line += gcode_line; - if (export_line.length() > 65535) - write_string(export_line); - } - - if (!export_line.empty()) - write_string(export_line); - - fclose(out); - in.close(); - - if (rename_file(path_tmp, filename)) - throw Slic3r::RuntimeError(std::string("Failed to rename the output G-code file from ") + path_tmp + " to " + filename + '\n' + - "Is " + path_tmp + " locked?" + '\n'); - - return true; - } - - void GCodeTimeEstimator::set_axis_position(EAxis axis, float position) - { - m_state.axis[axis].position = position; - } - - void GCodeTimeEstimator::set_axis_origin(EAxis axis, float position) - { - m_state.axis[axis].origin = position; - } - - void GCodeTimeEstimator::set_axis_max_feedrate(EAxis axis, float feedrate_mm_sec) - { - m_state.axis[axis].max_feedrate = feedrate_mm_sec; - } - - void GCodeTimeEstimator::set_axis_max_acceleration(EAxis axis, float acceleration) - { - m_state.axis[axis].max_acceleration = acceleration; - } - - void GCodeTimeEstimator::set_axis_max_jerk(EAxis axis, float jerk) - { - m_state.axis[axis].max_jerk = jerk; - } - - float GCodeTimeEstimator::get_axis_position(EAxis axis) const - { - return m_state.axis[axis].position; - } - - float GCodeTimeEstimator::get_axis_origin(EAxis axis) const - { - return m_state.axis[axis].origin; - } - - float GCodeTimeEstimator::get_axis_max_feedrate(EAxis axis) const - { - return m_state.axis[axis].max_feedrate; - } - - float GCodeTimeEstimator::get_axis_max_acceleration(EAxis axis) const - { - return m_state.axis[axis].max_acceleration; - } - - float GCodeTimeEstimator::get_axis_max_jerk(EAxis axis) const - { - return m_state.axis[axis].max_jerk; - } - - void GCodeTimeEstimator::set_feedrate(float feedrate_mm_sec) - { - m_state.feedrate = feedrate_mm_sec; - } - - float GCodeTimeEstimator::get_feedrate() const - { - return m_state.feedrate; - } - - void GCodeTimeEstimator::set_acceleration(float acceleration_mm_sec2) - { - m_state.acceleration = (m_state.max_acceleration == 0) ? - acceleration_mm_sec2 : - // Clamp the acceleration with the maximum. - std::min(m_state.max_acceleration, acceleration_mm_sec2); - } - - float GCodeTimeEstimator::get_acceleration() const - { - return m_state.acceleration; - } - - void GCodeTimeEstimator::set_max_acceleration(float acceleration_mm_sec2) - { - m_state.max_acceleration = acceleration_mm_sec2; - if (acceleration_mm_sec2 > 0) - m_state.acceleration = acceleration_mm_sec2; - } - - float GCodeTimeEstimator::get_max_acceleration() const - { - return m_state.max_acceleration; - } - - void GCodeTimeEstimator::set_retract_acceleration(float acceleration_mm_sec2) - { - m_state.retract_acceleration = acceleration_mm_sec2; - } - - float GCodeTimeEstimator::get_retract_acceleration() const - { - return m_state.retract_acceleration; - } - - void GCodeTimeEstimator::set_minimum_feedrate(float feedrate_mm_sec) - { - m_state.minimum_feedrate = feedrate_mm_sec; - } - - float GCodeTimeEstimator::get_minimum_feedrate() const - { - return m_state.minimum_feedrate; - } - - void GCodeTimeEstimator::set_minimum_travel_feedrate(float feedrate_mm_sec) - { - m_state.minimum_travel_feedrate = feedrate_mm_sec; - } - - float GCodeTimeEstimator::get_minimum_travel_feedrate() const - { - return m_state.minimum_travel_feedrate; - } - - void GCodeTimeEstimator::set_filament_load_times(const std::vector &filament_load_times) - { - m_state.filament_load_times.clear(); - for (double t : filament_load_times) - m_state.filament_load_times.push_back((float)t); - } - - void GCodeTimeEstimator::set_filament_unload_times(const std::vector &filament_unload_times) - { - m_state.filament_unload_times.clear(); - for (double t : filament_unload_times) - m_state.filament_unload_times.push_back((float)t); - } - - float GCodeTimeEstimator::get_filament_load_time(unsigned int id_extruder) - { - return - (m_state.filament_load_times.empty() || id_extruder == m_state.extruder_id_unloaded) ? - 0 : - (m_state.filament_load_times.size() <= id_extruder) ? - m_state.filament_load_times.front() : - m_state.filament_load_times[id_extruder]; - } - - float GCodeTimeEstimator::get_filament_unload_time(unsigned int id_extruder) - { - return - (m_state.filament_unload_times.empty() || id_extruder == m_state.extruder_id_unloaded) ? - 0 : - (m_state.filament_unload_times.size() <= id_extruder) ? - m_state.filament_unload_times.front() : - m_state.filament_unload_times[id_extruder]; - } - - void GCodeTimeEstimator::set_extrude_factor_override_percentage(float percentage) - { - m_state.extrude_factor_override_percentage = percentage; - } - - float GCodeTimeEstimator::get_extrude_factor_override_percentage() const - { - return m_state.extrude_factor_override_percentage; - } - - void GCodeTimeEstimator::set_dialect(GCodeFlavor dialect) - { - m_state.dialect = dialect; - } - - GCodeFlavor GCodeTimeEstimator::get_dialect() const - { - PROFILE_FUNC(); - return m_state.dialect; - } - - void GCodeTimeEstimator::set_units(GCodeTimeEstimator::EUnits units) - { - m_state.units = units; - } - - GCodeTimeEstimator::EUnits GCodeTimeEstimator::get_units() const - { - return m_state.units; - } - - void GCodeTimeEstimator::set_global_positioning_type(GCodeTimeEstimator::EPositioningType type) - { - m_state.global_positioning_type = type; - } - - GCodeTimeEstimator::EPositioningType GCodeTimeEstimator::get_global_positioning_type() const - { - return m_state.global_positioning_type; - } - - void GCodeTimeEstimator::set_e_local_positioning_type(GCodeTimeEstimator::EPositioningType type) - { - m_state.e_local_positioning_type = type; - } - - GCodeTimeEstimator::EPositioningType GCodeTimeEstimator::get_e_local_positioning_type() const - { - return m_state.e_local_positioning_type; - } - - int GCodeTimeEstimator::get_g1_line_id() const - { - return m_state.g1_line_id; - } - - void GCodeTimeEstimator::increment_g1_line_id() - { - ++m_state.g1_line_id; - } - - void GCodeTimeEstimator::reset_g1_line_id() - { - m_state.g1_line_id = 0; - } - - void GCodeTimeEstimator::set_extruder_id(unsigned int id) - { - m_state.extruder_id = id; - } - - unsigned int GCodeTimeEstimator::get_extruder_id() const - { - return m_state.extruder_id; - } - - void GCodeTimeEstimator::reset_extruder_id() - { - // Set the initial extruder ID to unknown. For the multi-material setup it means - // that all the filaments are parked in the MMU and no filament is loaded yet. - m_state.extruder_id = m_state.extruder_id_unloaded; - } - - void GCodeTimeEstimator::set_default() - { - set_units(Millimeters); - set_dialect(gcfRepRap); - set_global_positioning_type(Absolute); - set_e_local_positioning_type(Absolute); - - set_feedrate(DEFAULT_FEEDRATE); - // Setting the maximum acceleration to zero means that the there is no limit and the G-code - // is allowed to set excessive values. - set_max_acceleration(0); - set_acceleration(DEFAULT_ACCELERATION); - set_retract_acceleration(DEFAULT_RETRACT_ACCELERATION); - set_minimum_feedrate(DEFAULT_MINIMUM_FEEDRATE); - set_minimum_travel_feedrate(DEFAULT_MINIMUM_TRAVEL_FEEDRATE); - set_extrude_factor_override_percentage(DEFAULT_EXTRUDE_FACTOR_OVERRIDE_PERCENTAGE); - - for (unsigned char a = X; a < Num_Axis; ++a) - { - EAxis axis = (EAxis)a; - set_axis_max_feedrate(axis, DEFAULT_AXIS_MAX_FEEDRATE[a]); - set_axis_max_acceleration(axis, DEFAULT_AXIS_MAX_ACCELERATION[a]); - set_axis_max_jerk(axis, DEFAULT_AXIS_MAX_JERK[a]); - } - - m_state.filament_load_times.clear(); - m_state.filament_unload_times.clear(); - } - - void GCodeTimeEstimator::reset() - { - _reset_time(); -#if ENABLE_MOVE_STATS - _moves_stats.clear(); -#endif // ENABLE_MOVE_STATS - _reset_blocks(); - _reset(); - } - - float GCodeTimeEstimator::get_time() const - { - return m_time; - } - - std::string GCodeTimeEstimator::get_time_dhms() const - { - return _get_time_dhms(get_time()); - } - - std::string GCodeTimeEstimator::get_time_dhm() const - { - return _get_time_dhm(get_time()); - } - - std::string GCodeTimeEstimator::get_time_minutes() const - { - return _get_time_minutes(get_time()); - } - - std::vector> GCodeTimeEstimator::get_custom_gcode_times() const - { - return m_custom_gcode_times; - } - - std::vector GCodeTimeEstimator::get_color_times_dhms(bool include_remaining) const - { - std::vector ret; - float total_time = 0.0f; -// for (float t : m_color_times) - for (auto t : m_custom_gcode_times) - { - std::string time = _get_time_dhms(t.second); - if (include_remaining) - { - time += " ("; - time += _get_time_dhms(m_time - total_time); - time += ")"; - } - total_time += t.second; - ret.push_back(time); - } - return ret; - } - - std::vector GCodeTimeEstimator::get_color_times_minutes(bool include_remaining) const - { - std::vector ret; - float total_time = 0.0f; -// for (float t : m_color_times) - for (auto t : m_custom_gcode_times) - { - std::string time = _get_time_minutes(t.second); - if (include_remaining) - { - time += " ("; - time += _get_time_minutes(m_time - total_time); - time += ")"; - } - total_time += t.second; - } - return ret; - } - - std::vector> GCodeTimeEstimator::get_custom_gcode_times_dhm(bool include_remaining) const - { - std::vector> ret; - - float total_time = 0.0f; - for (auto t : m_custom_gcode_times) - { - std::string time = _get_time_dhm(t.second); - if (include_remaining) - { - time += " ("; - time += _get_time_dhm(m_time - total_time); - time += ")"; - } - total_time += t.second; - ret.push_back({t.first, time}); - } - - return ret; - } - - // Return an estimate of the memory consumed by the time estimator. - size_t GCodeTimeEstimator::memory_used() const - { - size_t out = sizeof(*this); - out += SLIC3R_STDVEC_MEMSIZE(this->m_blocks, Block); - out += SLIC3R_STDVEC_MEMSIZE(this->m_g1_times, G1LineIdTime); - return out; - } - - void GCodeTimeEstimator::_reset() - { - m_curr.reset(); - m_prev.reset(); - - set_axis_position(X, 0.0f); - set_axis_position(Y, 0.0f); - set_axis_position(Z, 0.0f); - set_axis_origin(X, 0.0f); - set_axis_origin(Y, 0.0f); - set_axis_origin(Z, 0.0f); - - if (get_e_local_positioning_type() == Absolute) - set_axis_position(E, 0.0f); - - reset_extruder_id(); - reset_g1_line_id(); - m_g1_times.clear(); - - m_needs_custom_gcode_times = false; - m_custom_gcode_times.clear(); - m_custom_gcode_time_cache = 0.0f; - } - - void GCodeTimeEstimator::_reset_time() - { - m_time = 0.0f; - } - - void GCodeTimeEstimator::_reset_blocks() - { - m_blocks.clear(); - } - - void GCodeTimeEstimator::_calculate_time(size_t keep_last_n_blocks) - { - PROFILE_FUNC(); - - assert(keep_last_n_blocks <= m_blocks.size()); - - _forward_pass(); - _reverse_pass(); - _recalculate_trapezoids(); - - size_t n_blocks_process = m_blocks.size() - keep_last_n_blocks; - m_g1_times.reserve(m_g1_times.size() + n_blocks_process); - for (size_t i = 0; i < n_blocks_process; ++ i) - { - Block& block = m_blocks[i]; - float block_time = 0.0f; - block_time += block.acceleration_time(); - block_time += block.cruise_time(); - block_time += block.deceleration_time(); - m_time += block_time; - if (block.g1_line_id >= 0) - m_g1_times.emplace_back(block.g1_line_id, m_time); - -#if ENABLE_MOVE_STATS - MovesStatsMap::iterator it = _moves_stats.find(block.move_type); - if (it == _moves_stats.end()) - it = _moves_stats.insert(MovesStatsMap::value_type(block.move_type, MoveStats())).first; - - it->second.count += 1; - it->second.time += block_time; -#endif // ENABLE_MOVE_STATS - - m_custom_gcode_time_cache += block_time; - } - - if (keep_last_n_blocks) - m_blocks.erase(m_blocks.begin(), m_blocks.begin() + n_blocks_process); - else - m_blocks.clear(); - } - - void GCodeTimeEstimator::_process_gcode_line(GCodeReader&, const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - - // processes 'special' comments contained in line - if (_process_tags(line)) - return; - - std::string cmd = line.cmd(); - if (cmd.length() > 1) - { - switch (::toupper(cmd[0])) - { - case 'G': - { - switch (::atoi(&cmd[1])) - { - case 1: // Move - { - _processG1(line); - break; - } - case 4: // Dwell - { - _processG4(line); - break; - } - case 20: // Set Units to Inches - { - _processG20(line); - break; - } - case 21: // Set Units to Millimeters - { - _processG21(line); - break; - } - case 28: // Move to Origin (Home) - { - _processG28(line); - break; - } - case 90: // Set to Absolute Positioning - { - _processG90(line); - break; - } - case 91: // Set to Relative Positioning - { - _processG91(line); - break; - } - case 92: // Set Position - { - _processG92(line); - break; - } - } - - break; - } - case 'M': - { - switch (::atoi(&cmd[1])) - { - case 1: // Sleep or Conditional stop - { - _processM1(line); - break; - } - case 82: // Set extruder to absolute mode - { - _processM82(line); - break; - } - case 83: // Set extruder to relative mode - { - _processM83(line); - break; - } - case 109: // Set Extruder Temperature and Wait - { - _processM109(line); - break; - } - case 201: // Set max printing acceleration - { - _processM201(line); - break; - } - case 203: // Set maximum feedrate - { - _processM203(line); - break; - } - case 204: // Set default acceleration - { - _processM204(line); - break; - } - case 205: // Advanced settings - { - _processM205(line); - break; - } - case 221: // Set extrude factor override percentage - { - _processM221(line); - break; - } - case 566: // Set allowable instantaneous speed change - { - _processM566(line); - break; - } - case 702: // MK3 MMU2: Process the final filament unload. - { - _processM702(line); - break; - } - } - - break; - } - case 'T': // Select Tools - { - _processT(line); - break; - } - } - } - } - - void GCodeTimeEstimator::_processG1(const GCodeReader::GCodeLine& line) - { - auto axis_absolute_position = [this](GCodeTimeEstimator::EAxis axis, const GCodeReader::GCodeLine& lineG1) -> float - { - float current_absolute_position = get_axis_position(axis); - float current_origin = get_axis_origin(axis); - float lengthsScaleFactor = (get_units() == GCodeTimeEstimator::Inches) ? INCHES_TO_MM : 1.0f; - - bool is_relative = (get_global_positioning_type() == Relative); - if (axis == E) - is_relative |= (get_e_local_positioning_type() == Relative); - - if (lineG1.has(Slic3r::Axis(axis))) - { - float ret = lineG1.value(Slic3r::Axis(axis)) * lengthsScaleFactor; - return is_relative ? current_absolute_position + ret : ret + current_origin; - } - else - return current_absolute_position; - }; - - // delta_pos must have size >= Num_Axis - auto move_length = [](const float* delta_pos) { - float xyz_length = std::sqrt(sqr(delta_pos[X]) + sqr(delta_pos[Y]) + sqr(delta_pos[Z])); - return (xyz_length > 0.0f) ? xyz_length : std::abs(delta_pos[E]); - }; - - // delta_pos must have size >= Num_Axis - auto is_extruder_only_move = [](const float* delta_pos) { - return (delta_pos[X] == 0.0f) && (delta_pos[Y] == 0.0f) && (delta_pos[Z] == 0.0f) && (delta_pos[E] != 0.0f); - }; - - PROFILE_FUNC(); - increment_g1_line_id(); - - // updates axes positions from line - float new_pos[Num_Axis]; - for (unsigned char a = X; a < Num_Axis; ++a) - { - new_pos[a] = axis_absolute_position((EAxis)a, line); - } - - // updates feedrate from line, if present - if (line.has_f()) - set_feedrate(std::max(line.f() * MMMIN_TO_MMSEC, get_minimum_feedrate())); - - // fills block data - Block block; - - // calculates block movement deltas - float max_abs_delta = 0.0f; - float delta_pos[Num_Axis]; - for (unsigned char a = X; a < Num_Axis; ++a) - { - delta_pos[a] = new_pos[a] - get_axis_position((EAxis)a); - max_abs_delta = std::max(max_abs_delta, std::abs(delta_pos[a])); - } - - // is it a move ? - if (max_abs_delta == 0.0f) - return; - - // calculates block feedrate - m_curr.feedrate = std::max(get_feedrate(), (delta_pos[E] == 0.0f) ? get_minimum_travel_feedrate() : get_minimum_feedrate()); - - block.distance = move_length(delta_pos); - float invDistance = 1.0f / block.distance; - - float min_feedrate_factor = 1.0f; - for (unsigned char a = X; a < Num_Axis; ++a) - { - m_curr.axis_feedrate[a] = m_curr.feedrate * delta_pos[a] * invDistance; - if (a == E) - m_curr.axis_feedrate[a] *= get_extrude_factor_override_percentage(); - - m_curr.abs_axis_feedrate[a] = std::abs(m_curr.axis_feedrate[a]); - if (m_curr.abs_axis_feedrate[a] > 0.0f) - min_feedrate_factor = std::min(min_feedrate_factor, get_axis_max_feedrate((EAxis)a) / m_curr.abs_axis_feedrate[a]); - } - - block.feedrate.cruise = min_feedrate_factor * m_curr.feedrate; - - if (min_feedrate_factor < 1.0f) - { - for (unsigned char a = X; a < Num_Axis; ++a) - { - m_curr.axis_feedrate[a] *= min_feedrate_factor; - m_curr.abs_axis_feedrate[a] *= min_feedrate_factor; - } - } - - // calculates block acceleration - float acceleration = is_extruder_only_move(delta_pos) ? get_retract_acceleration() : get_acceleration(); - - for (unsigned char a = X; a < Num_Axis; ++a) - { - float axis_max_acceleration = get_axis_max_acceleration((EAxis)a); - if (acceleration * std::abs(delta_pos[a]) * invDistance > axis_max_acceleration) - acceleration = axis_max_acceleration; - } - - block.acceleration = acceleration; - - // calculates block exit feedrate - m_curr.safe_feedrate = block.feedrate.cruise; - - for (unsigned char a = X; a < Num_Axis; ++a) - { - float axis_max_jerk = get_axis_max_jerk((EAxis)a); - if (m_curr.abs_axis_feedrate[a] > axis_max_jerk) - m_curr.safe_feedrate = std::min(m_curr.safe_feedrate, axis_max_jerk); - } - - block.feedrate.exit = m_curr.safe_feedrate; - - // calculates block entry feedrate - float vmax_junction = m_curr.safe_feedrate; - if (!m_blocks.empty() && (m_prev.feedrate > PREVIOUS_FEEDRATE_THRESHOLD)) - { - bool prev_speed_larger = m_prev.feedrate > block.feedrate.cruise; - float smaller_speed_factor = prev_speed_larger ? (block.feedrate.cruise / m_prev.feedrate) : (m_prev.feedrate / block.feedrate.cruise); - // Pick the smaller of the nominal speeds. Higher speed shall not be achieved at the junction during coasting. - vmax_junction = prev_speed_larger ? block.feedrate.cruise : m_prev.feedrate; - - float v_factor = 1.0f; - bool limited = false; - - for (unsigned char a = X; a < Num_Axis; ++a) - { - // Limit an axis. We have to differentiate coasting from the reversal of an axis movement, or a full stop. - float v_exit = m_prev.axis_feedrate[a]; - float v_entry = m_curr.axis_feedrate[a]; - - if (prev_speed_larger) - v_exit *= smaller_speed_factor; - - if (limited) - { - v_exit *= v_factor; - v_entry *= v_factor; - } - - // Calculate the jerk depending on whether the axis is coasting in the same direction or reversing a direction. - float jerk = - (v_exit > v_entry) ? - (((v_entry > 0.0f) || (v_exit < 0.0f)) ? - // coasting - (v_exit - v_entry) : - // axis reversal - std::max(v_exit, -v_entry)) : - // v_exit <= v_entry - (((v_entry < 0.0f) || (v_exit > 0.0f)) ? - // coasting - (v_entry - v_exit) : - // axis reversal - std::max(-v_exit, v_entry)); - - float axis_max_jerk = get_axis_max_jerk((EAxis)a); - if (jerk > axis_max_jerk) - { - v_factor *= axis_max_jerk / jerk; - limited = true; - } - } - - if (limited) - vmax_junction *= v_factor; - - // Now the transition velocity is known, which maximizes the shared exit / entry velocity while - // respecting the jerk factors, it may be possible, that applying separate safe exit / entry velocities will achieve faster prints. - float vmax_junction_threshold = vmax_junction * 0.99f; - - // Not coasting. The machine will stop and start the movements anyway, better to start the segment from start. - if ((m_prev.safe_feedrate > vmax_junction_threshold) && (m_curr.safe_feedrate > vmax_junction_threshold)) - vmax_junction = m_curr.safe_feedrate; - } - - float v_allowable = Block::max_allowable_speed(-acceleration, m_curr.safe_feedrate, block.distance); - block.feedrate.entry = std::min(vmax_junction, v_allowable); - - block.max_entry_speed = vmax_junction; - block.flags.nominal_length = (block.feedrate.cruise <= v_allowable); - block.flags.recalculate = true; - block.safe_feedrate = m_curr.safe_feedrate; - - // calculates block trapezoid - block.calculate_trapezoid(); - - // updates previous - m_prev = m_curr; - - // updates axis positions - for (unsigned char a = X; a < Num_Axis; ++a) - { - set_axis_position((EAxis)a, new_pos[a]); - } - -#if ENABLE_MOVE_STATS - // detects block move type - block.move_type = Block::Noop; - - if (delta_pos[E] < 0.0f) - { - if ((delta_pos[X] != 0.0f) || (delta_pos[Y] != 0.0f) || (delta_pos[Z] != 0.0f)) - block.move_type = Block::Move; - else - block.move_type = Block::Retract; - } - else if (delta_pos[E] > 0.0f) - { - if ((delta_pos[X] == 0.0f) && (delta_pos[Y] == 0.0f) && (delta_pos[Z] == 0.0f)) - block.move_type = Block::Unretract; - else if ((delta_pos[X] != 0.0f) || (delta_pos[Y] != 0.0f)) - block.move_type = Block::Extrude; - } - else if ((delta_pos[X] != 0.0f) || (delta_pos[Y] != 0.0f) || (delta_pos[Z] != 0.0f)) - block.move_type = Block::Move; -#endif // ENABLE_MOVE_STATS - - // adds block to blocks list - block.g1_line_id = this->get_g1_line_id(); - m_blocks.emplace_back(block); - - if (m_blocks.size() > planner_refresh_if_larger) - _calculate_time(planner_queue_size); - } - - void GCodeTimeEstimator::_processG4(const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - GCodeFlavor dialect = get_dialect(); - - float value; - float extra_time = 0.f; - if (line.has_value('P', value)) - extra_time += value * MILLISEC_TO_SEC; - - // see: http://reprap.org/wiki/G-code#G4:_Dwell - if ((dialect == gcfRepetier) || - (dialect == gcfMarlin) || - (dialect == gcfSmoothie) || - (dialect == gcfRepRap)) - { - if (line.has_value('S', value)) - extra_time += value; - } - - _simulate_st_synchronize(extra_time); - } - - void GCodeTimeEstimator::_processG20(const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - set_units(Inches); - } - - void GCodeTimeEstimator::_processG21(const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - set_units(Millimeters); - } - - void GCodeTimeEstimator::_processG28(const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - // TODO - } - - void GCodeTimeEstimator::_processG90(const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - set_global_positioning_type(Absolute); - } - - void GCodeTimeEstimator::_processG91(const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - set_global_positioning_type(Relative); - } - - void GCodeTimeEstimator::_processG92(const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - float lengthsScaleFactor = (get_units() == Inches) ? INCHES_TO_MM : 1.0f; - bool anyFound = false; - - if (line.has_x()) - { - set_axis_origin(X, get_axis_position(X) - line.x() * lengthsScaleFactor); - anyFound = true; - } - - if (line.has_y()) - { - set_axis_origin(Y, get_axis_position(Y) - line.y() * lengthsScaleFactor); - anyFound = true; - } - - if (line.has_z()) - { - set_axis_origin(Z, get_axis_position(Z) - line.z() * lengthsScaleFactor); - anyFound = true; - } - - if (line.has_e()) - { - // extruder coordinate can grow to the point where its float representation does not allow for proper addition with small increments, - // we set the value taken from the G92 line as the new current position for it - set_axis_position(E, line.e() * lengthsScaleFactor); - anyFound = true; - } - else - _simulate_st_synchronize(0.f); - - if (!anyFound) - { - for (unsigned char a = X; a < Num_Axis; ++a) - { - set_axis_origin((EAxis)a, get_axis_position((EAxis)a)); - } - } - } - - void GCodeTimeEstimator::_processM1(const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - _simulate_st_synchronize(0.f); - } - - void GCodeTimeEstimator::_processM82(const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - set_e_local_positioning_type(Absolute); - } - - void GCodeTimeEstimator::_processM83(const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - set_e_local_positioning_type(Relative); - } - - void GCodeTimeEstimator::_processM109(const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - // TODO - } - - void GCodeTimeEstimator::_processM201(const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - GCodeFlavor dialect = get_dialect(); - - // see http://reprap.org/wiki/G-code#M201:_Set_max_printing_acceleration - float factor = ((dialect != gcfRepRap) && (get_units() == GCodeTimeEstimator::Inches)) ? INCHES_TO_MM : 1.0f; - - if (line.has_x()) - set_axis_max_acceleration(X, line.x() * factor); - - if (line.has_y()) - set_axis_max_acceleration(Y, line.y() * factor); - - if (line.has_z()) - set_axis_max_acceleration(Z, line.z() * factor); - - if (line.has_e()) - set_axis_max_acceleration(E, line.e() * factor); - } - - void GCodeTimeEstimator::_processM203(const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - GCodeFlavor dialect = get_dialect(); - - // see http://reprap.org/wiki/G-code#M203:_Set_maximum_feedrate - if (dialect == gcfRepetier) - return; - - // see http://reprap.org/wiki/G-code#M203:_Set_maximum_feedrate - // http://smoothieware.org/supported-g-codes - float factor = (dialect == gcfMarlin || dialect == gcfSmoothie) ? 1.0f : MMMIN_TO_MMSEC; - - if (line.has_x()) - set_axis_max_feedrate(X, line.x() * factor); - - if (line.has_y()) - set_axis_max_feedrate(Y, line.y() * factor); - - if (line.has_z()) - set_axis_max_feedrate(Z, line.z() * factor); - - if (line.has_e()) - set_axis_max_feedrate(E, line.e() * factor); - } - - void GCodeTimeEstimator::_processM204(const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - float value; - if (line.has_value('S', value)) { - // Legacy acceleration format. This format is used by the legacy Marlin, MK2 or MK3 firmware, - // and it is also generated by Slic3r to control acceleration per extrusion type - // (there is a separate acceleration settings in Slicer for perimeter, first layer etc). - set_acceleration(value); - if (line.has_value('T', value)) - set_retract_acceleration(value); - } else { - // New acceleration format, compatible with the upstream Marlin. - if (line.has_value('P', value)) - set_acceleration(value); - if (line.has_value('R', value)) - set_retract_acceleration(value); - if (line.has_value('T', value)) { - // Interpret the T value as the travel acceleration in the new Marlin format. - //FIXME Prusa3D firmware currently does not support travel acceleration value independent from the extruding acceleration value. - // set_travel_acceleration(value); - } - } - } - - void GCodeTimeEstimator::_processM205(const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - if (line.has_x()) - { - float max_jerk = line.x(); - set_axis_max_jerk(X, max_jerk); - set_axis_max_jerk(Y, max_jerk); - } - - if (line.has_y()) - set_axis_max_jerk(Y, line.y()); - - if (line.has_z()) - set_axis_max_jerk(Z, line.z()); - - if (line.has_e()) - set_axis_max_jerk(E, line.e()); - - float value; - if (line.has_value('S', value)) - set_minimum_feedrate(value); - - if (line.has_value('T', value)) - set_minimum_travel_feedrate(value); - } - - void GCodeTimeEstimator::_processM221(const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - float value_s; - float value_t; - if (line.has_value('S', value_s) && !line.has_value('T', value_t)) - set_extrude_factor_override_percentage(value_s * 0.01f); - } - - void GCodeTimeEstimator::_processM566(const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - if (line.has_x()) - set_axis_max_jerk(X, line.x() * MMMIN_TO_MMSEC); - - if (line.has_y()) - set_axis_max_jerk(Y, line.y() * MMMIN_TO_MMSEC); - - if (line.has_z()) - set_axis_max_jerk(Z, line.z() * MMMIN_TO_MMSEC); - - if (line.has_e()) - set_axis_max_jerk(E, line.e() * MMMIN_TO_MMSEC); - } - - void GCodeTimeEstimator::_processM702(const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - if (line.has('C')) { - // MK3 MMU2 specific M code: - // M702 C is expected to be sent by the custom end G-code when finalizing a print. - // The MK3 unit shall unload and park the active filament into the MMU2 unit. - float extra_time = get_filament_unload_time(get_extruder_id()); - reset_extruder_id(); - _simulate_st_synchronize(extra_time); - } - } - - void GCodeTimeEstimator::_processT(const GCodeReader::GCodeLine& line) - { - std::string cmd = line.cmd(); - if (cmd.length() > 1) - { - unsigned int id = (unsigned int)::strtol(cmd.substr(1).c_str(), nullptr, 10); - if (get_extruder_id() != id) - { - // Specific to the MK3 MMU2: The initial extruder ID is set to -1 indicating - // that the filament is parked in the MMU2 unit and there is nothing to be unloaded yet. - float extra_time = get_filament_unload_time(get_extruder_id()); - set_extruder_id(id); - extra_time += get_filament_load_time(get_extruder_id()); - _simulate_st_synchronize(extra_time); - } - } - } - - bool GCodeTimeEstimator::_process_tags(const GCodeReader::GCodeLine& line) - { - std::string comment = line.comment(); - - // Color_Change_Tag - size_t pos = comment.find(Color_Change_Tag); - if (pos != comment.npos) - { - _process_custom_gcode_tag(CustomGCode::ColorChange); - return true; - } - - // Pause_Print_Tag - pos = comment.find(Pause_Print_Tag); - if (pos != comment.npos) - { - _process_custom_gcode_tag(CustomGCode::PausePrint); - return true; - } - - return false; - } - - void GCodeTimeEstimator::_process_custom_gcode_tag(CustomGCode::Type code) - { - PROFILE_FUNC(); - m_needs_custom_gcode_times = true; - //FIXME this simulates st_synchronize! is it correct? - // The estimated time may be longer than the real print time. - _simulate_st_synchronize(0.f); - if (m_custom_gcode_time_cache != 0.0f) - { - m_custom_gcode_times.push_back({code, m_custom_gcode_time_cache}); - m_custom_gcode_time_cache = 0.0f; - } - } - - void GCodeTimeEstimator::_simulate_st_synchronize(float extra_time) - { - PROFILE_FUNC(); - m_time += extra_time; - m_custom_gcode_time_cache += extra_time; - _calculate_time(0); - } - - void GCodeTimeEstimator::_forward_pass() - { - PROFILE_FUNC(); - for (int i = 0; i + 1 < (int)m_blocks.size(); ++i) - _planner_forward_pass_kernel(m_blocks[i], m_blocks[i + 1]); - } - - void GCodeTimeEstimator::_reverse_pass() - { - PROFILE_FUNC(); - for (int i = (int)m_blocks.size() - 1; i > 0; -- i) - _planner_reverse_pass_kernel(m_blocks[i - 1], m_blocks[i]); - } - - void GCodeTimeEstimator::_planner_forward_pass_kernel(Block& prev, Block& curr) - { - PROFILE_FUNC(); - // If the previous block is an acceleration block, but it is not long enough to complete the - // full speed change within the block, we need to adjust the entry speed accordingly. Entry - // speeds have already been reset, maximized, and reverse planned by reverse planner. - // If nominal length is true, max junction speed is guaranteed to be reached. No need to recheck. - if (!prev.flags.nominal_length) - { - if (prev.feedrate.entry < curr.feedrate.entry) - { - float entry_speed = std::min(curr.feedrate.entry, Block::max_allowable_speed(-prev.acceleration, prev.feedrate.entry, prev.distance)); - - // Check for junction speed change - if (curr.feedrate.entry != entry_speed) - { - curr.feedrate.entry = entry_speed; - curr.flags.recalculate = true; - } - } - } - } - - void GCodeTimeEstimator::_planner_reverse_pass_kernel(Block& curr, Block& next) - { - // If entry speed is already at the maximum entry speed, no need to recheck. Block is cruising. - // If not, block in state of acceleration or deceleration. Reset entry speed to maximum and - // check for maximum allowable speed reductions to ensure maximum possible planned speed. - if (curr.feedrate.entry != curr.max_entry_speed) - { - // If nominal length true, max junction speed is guaranteed to be reached. Only compute - // for max allowable speed if block is decelerating and nominal length is false. - if (!curr.flags.nominal_length && (curr.max_entry_speed > next.feedrate.entry)) - curr.feedrate.entry = std::min(curr.max_entry_speed, Block::max_allowable_speed(-curr.acceleration, next.feedrate.entry, curr.distance)); - else - curr.feedrate.entry = curr.max_entry_speed; - - curr.flags.recalculate = true; - } - } - - void GCodeTimeEstimator::_recalculate_trapezoids() - { - PROFILE_FUNC(); - Block* curr = nullptr; - Block* next = nullptr; - - for (size_t i = 0; i < m_blocks.size(); ++ i) - { - Block& b = m_blocks[i]; - - curr = next; - next = &b; - - if (curr != nullptr) - { - // Recalculate if current block entry or exit junction speed has changed. - if (curr->flags.recalculate || next->flags.recalculate) - { - // NOTE: Entry and exit factors always > 0 by all previous logic operations. - Block block = *curr; - block.feedrate.exit = next->feedrate.entry; - block.calculate_trapezoid(); - curr->trapezoid = block.trapezoid; - curr->flags.recalculate = false; // Reset current only to ensure next trapezoid is computed - } - } - } - - // Last/newest block in buffer. Always recalculated. - if (next != nullptr) - { - Block block = *next; - block.feedrate.exit = next->safe_feedrate; - block.calculate_trapezoid(); - next->trapezoid = block.trapezoid; - next->flags.recalculate = false; - } - } - - std::string GCodeTimeEstimator::_get_time_dhms(float time_in_secs) - { - int days = (int)(time_in_secs / 86400.0f); - time_in_secs -= (float)days * 86400.0f; - int hours = (int)(time_in_secs / 3600.0f); - time_in_secs -= (float)hours * 3600.0f; - int minutes = (int)(time_in_secs / 60.0f); - time_in_secs -= (float)minutes * 60.0f; - - char buffer[64]; - if (days > 0) - ::sprintf(buffer, "%dd %dh %dm %ds", days, hours, minutes, (int)time_in_secs); - else if (hours > 0) - ::sprintf(buffer, "%dh %dm %ds", hours, minutes, (int)time_in_secs); - else if (minutes > 0) - ::sprintf(buffer, "%dm %ds", minutes, (int)time_in_secs); - else - ::sprintf(buffer, "%ds", (int)time_in_secs); - - return buffer; - } - - std::string GCodeTimeEstimator::_get_time_dhm(float time_in_secs) - { - char buffer[64]; - - int minutes = int(std::round(time_in_secs / 60.)); - if (minutes <= 0) { - ::sprintf(buffer, "%ds", (int)time_in_secs); - } else { - int days = minutes / 1440; - minutes -= days * 1440; - int hours = minutes / 60; - minutes -= hours * 60; - if (days > 0) - ::sprintf(buffer, "%dd %dh %dm", days, hours, minutes); - else if (hours > 0) - ::sprintf(buffer, "%dh %dm", hours, minutes); - else - ::sprintf(buffer, "%dm", minutes); - } - - return buffer; - } - - std::string GCodeTimeEstimator::_get_time_minutes(float time_in_secs) - { - return std::to_string((int)(::roundf(time_in_secs / 60.0f))); - } - -#if ENABLE_MOVE_STATS - void GCodeTimeEstimator::_log_moves_stats() const - { - float moves_count = 0.0f; - for (const MovesStatsMap::value_type& move : _moves_stats) - { - moves_count += (float)move.second.count; - } - - for (const MovesStatsMap::value_type& move : _moves_stats) - { - std::cout << MOVE_TYPE_STR[move.first]; - std::cout << ": count " << move.second.count << " (" << 100.0f * (float)move.second.count / moves_count << "%)"; - std::cout << " - time: " << move.second.time << "s (" << 100.0f * move.second.time / m_time << "%)"; - std::cout << std::endl; - } - std::cout << std::endl; - } -#endif // ENABLE_MOVE_STATS -} - -#endif // !ENABLE_GCODE_VIEWER diff --git a/src/libslic3r/GCodeTimeEstimator.hpp b/src/libslic3r/GCodeTimeEstimator.hpp deleted file mode 100644 index 0dd3407cb0..0000000000 --- a/src/libslic3r/GCodeTimeEstimator.hpp +++ /dev/null @@ -1,488 +0,0 @@ -#ifndef slic3r_GCodeTimeEstimator_hpp_ -#define slic3r_GCodeTimeEstimator_hpp_ - -#include "libslic3r.h" -#include "PrintConfig.hpp" -#include "GCodeReader.hpp" -#include "CustomGCode.hpp" - -#if !ENABLE_GCODE_VIEWER - -#define ENABLE_MOVE_STATS 0 - -namespace Slic3r { - - // - // Some of the algorithms used by class GCodeTimeEstimator were inpired by - // Cura Engine's class TimeEstimateCalculator - // https://github.com/Ultimaker/CuraEngine/blob/master/src/timeEstimate.h - // - class GCodeTimeEstimator - { - public: - static const std::string Normal_First_M73_Output_Placeholder_Tag; - static const std::string Silent_First_M73_Output_Placeholder_Tag; - static const std::string Normal_Last_M73_Output_Placeholder_Tag; - static const std::string Silent_Last_M73_Output_Placeholder_Tag; - - static const std::string Color_Change_Tag; - static const std::string Pause_Print_Tag; - - enum EMode : unsigned char - { - Normal, - Silent - }; - - enum EUnits : unsigned char - { - Millimeters, - Inches - }; - - enum EAxis : unsigned char - { - X, - Y, - Z, - E, - Num_Axis - }; - - enum EPositioningType : unsigned char - { - Absolute, - Relative - }; - - private: - struct Axis - { - float position; // mm - float origin; // mm - float max_feedrate; // mm/s - float max_acceleration; // mm/s^2 - float max_jerk; // mm/s - }; - - struct Feedrates - { - float feedrate; // mm/s - float axis_feedrate[Num_Axis]; // mm/s - float abs_axis_feedrate[Num_Axis]; // mm/s - float safe_feedrate; // mm/s - - void reset(); - }; - - struct State - { - GCodeFlavor dialect; - EUnits units; - EPositioningType global_positioning_type; - EPositioningType e_local_positioning_type; - Axis axis[Num_Axis]; - float feedrate; // mm/s - float acceleration; // mm/s^2 - // hard limit for the acceleration, to which the firmware will clamp. - float max_acceleration; // mm/s^2 - float retract_acceleration; // mm/s^2 - float minimum_feedrate; // mm/s - float minimum_travel_feedrate; // mm/s - float extrude_factor_override_percentage; - // Additional load / unload times for a filament exchange sequence. - std::vector filament_load_times; - std::vector filament_unload_times; - unsigned int g1_line_id; - // extruder_id is currently used to correctly calculate filament load / unload times - // into the total print time. This is currently only really used by the MK3 MMU2: - // Extruder id (-1) means no filament is loaded yet, all the filaments are parked in the MK3 MMU2 unit. - static const unsigned int extruder_id_unloaded = (unsigned int)-1; - unsigned int extruder_id; - }; - - public: - struct Block - { -#if ENABLE_MOVE_STATS - enum EMoveType : unsigned char - { - Noop, - Retract, - Unretract, - Tool_change, - Move, - Extrude, - Num_Types - }; -#endif // ENABLE_MOVE_STATS - - struct FeedrateProfile - { - float entry; // mm/s - float cruise; // mm/s - float exit; // mm/s - }; - - struct Trapezoid - { - float accelerate_until; // mm - float decelerate_after; // mm - float cruise_feedrate; // mm/sec - - float acceleration_time(float entry_feedrate, float acceleration) const; - float cruise_time() const; - float deceleration_time(float distance, float acceleration) const; - float cruise_distance() const; - - // This function gives the time needed to accelerate from an initial speed to reach a final distance. - static float acceleration_time_from_distance(float initial_feedrate, float distance, float acceleration); - - // This function gives the final speed while accelerating at the given constant acceleration from the given initial speed along the given distance. - static float speed_from_distance(float initial_feedrate, float distance, float acceleration); - }; - - struct Flags - { - bool recalculate; - bool nominal_length; - }; - -#if ENABLE_MOVE_STATS - EMoveType move_type; -#endif // ENABLE_MOVE_STATS - Flags flags; - - float distance; // mm - float acceleration; // mm/s^2 - float max_entry_speed; // mm/s - float safe_feedrate; // mm/s - - FeedrateProfile feedrate; - Trapezoid trapezoid; - - // Ordnary index of this G1 line in the file. - int g1_line_id { -1 }; - - // Returns the time spent accelerating toward cruise speed, in seconds - float acceleration_time() const; - - // Returns the time spent at cruise speed, in seconds - float cruise_time() const; - - // Returns the time spent decelerating from cruise speed, in seconds - float deceleration_time() const; - - // Returns the distance covered at cruise speed, in mm - float cruise_distance() const; - - // Calculates this block's trapezoid - void calculate_trapezoid(); - - // Calculates the maximum allowable speed at this point when you must be able to reach target_velocity using the - // acceleration within the allotted distance. - static float max_allowable_speed(float acceleration, float target_velocity, float distance); - - // Calculates the distance (not time) it takes to accelerate from initial_rate to target_rate using the given acceleration: - static float estimate_acceleration_distance(float initial_rate, float target_rate, float acceleration); - - // This function gives you the point at which you must start braking (at the rate of -acceleration) if - // you started at speed initial_rate and accelerated until this point and want to end at the final_rate after - // a total travel of distance. This can be used to compute the intersection point between acceleration and - // deceleration in the cases where the trapezoid has no plateau (i.e. never reaches maximum speed) - static float intersection_distance(float initial_rate, float final_rate, float acceleration, float distance); - }; - - typedef std::vector BlocksList; - -#if ENABLE_MOVE_STATS - struct MoveStats - { - unsigned int count; - float time; - - MoveStats(); - }; - - typedef std::map MovesStatsMap; -#endif // ENABLE_MOVE_STATS - - public: - typedef std::pair G1LineIdTime; - typedef std::vector G1LineIdsTimes; - - struct PostProcessData - { - const G1LineIdsTimes& g1_times; - float time; - }; - - private: - EMode m_mode; - GCodeReader m_parser; - State m_state; - Feedrates m_curr; - Feedrates m_prev; - BlocksList m_blocks; - // Size of the firmware planner queue. The old 8-bit Marlins usually just managed 16 trapezoidal blocks. - // Let's be conservative and plan for newer boards with more memory. - static constexpr size_t planner_queue_size = 64; - // The firmware recalculates last planner_queue_size trapezoidal blocks each time a new block is added. - // We are not simulating the firmware exactly, we calculate a sequence of blocks once a reasonable number of blocks accumulate. - static constexpr size_t planner_refresh_if_larger = planner_queue_size * 4; - // Map from g1 line id to its elapsed time from the start of the print. - G1LineIdsTimes m_g1_times; - float m_time; // s - - // data to calculate custom code times - bool m_needs_custom_gcode_times; - std::vector> m_custom_gcode_times; - float m_custom_gcode_time_cache; - -#if ENABLE_MOVE_STATS - MovesStatsMap _moves_stats; -#endif // ENABLE_MOVE_STATS - - public: - explicit GCodeTimeEstimator(EMode mode); - - // Adds the given gcode line - void add_gcode_line(const std::string& gcode_line); - - void add_gcode_block(const char *ptr); - void add_gcode_block(const std::string &str) { this->add_gcode_block(str.c_str()); } - - // Calculates the time estimate from the gcode lines added using add_gcode_line() or add_gcode_block() - // start_from_beginning: - // if set to true all blocks will be used to calculate the time estimate, - // if set to false only the blocks not yet processed will be used and the calculated time will be added to the current calculated time - void calculate_time(bool start_from_beginning); - - // Calculates the time estimate from the given gcode in string format - //void calculate_time_from_text(const std::string& gcode); - - // Calculates the time estimate from the gcode contained in the file with the given filename - //void calculate_time_from_file(const std::string& file); - - // Calculates the time estimate from the gcode contained in given list of gcode lines - //void calculate_time_from_lines(const std::vector& gcode_lines); - - // Process the gcode contained in the file with the given filename, - // replacing placeholders with correspondent new lines M73 - // placing new lines M73 (containing the remaining time) where needed (in dependence of the given interval in seconds) - // and removing working tags (as those used for color changes) - // if normal_mode == nullptr no M73 line will be added for normal mode - // if silent_mode == nullptr no M73 line will be added for silent mode - static bool post_process(const std::string& filename, float interval_sec, const PostProcessData* const normal_mode, const PostProcessData* const silent_mode); - - // Set current position on the given axis with the given value - void set_axis_position(EAxis axis, float position); - // Set current origin on the given axis with the given value - void set_axis_origin(EAxis axis, float position); - - void set_axis_max_feedrate(EAxis axis, float feedrate_mm_sec); - void set_axis_max_acceleration(EAxis axis, float acceleration); - void set_axis_max_jerk(EAxis axis, float jerk); - - // Returns current position on the given axis - float get_axis_position(EAxis axis) const; - // Returns current origin on the given axis - float get_axis_origin(EAxis axis) const; - - float get_axis_max_feedrate(EAxis axis) const; - float get_axis_max_acceleration(EAxis axis) const; - float get_axis_max_jerk(EAxis axis) const; - - void set_feedrate(float feedrate_mm_sec); - float get_feedrate() const; - - void set_acceleration(float acceleration_mm_sec2); - float get_acceleration() const; - - // Maximum acceleration for the machine. The firmware simulator will clamp the M204 Sxxx to this maximum. - void set_max_acceleration(float acceleration_mm_sec2); - float get_max_acceleration() const; - - void set_retract_acceleration(float acceleration_mm_sec2); - float get_retract_acceleration() const; - - void set_minimum_feedrate(float feedrate_mm_sec); - float get_minimum_feedrate() const; - - void set_minimum_travel_feedrate(float feedrate_mm_sec); - float get_minimum_travel_feedrate() const; - - void set_filament_load_times(const std::vector &filament_load_times); - void set_filament_unload_times(const std::vector &filament_unload_times); - float get_filament_load_time(unsigned int id_extruder); - float get_filament_unload_time(unsigned int id_extruder); - - void set_extrude_factor_override_percentage(float percentage); - float get_extrude_factor_override_percentage() const; - - void set_dialect(GCodeFlavor dialect); - GCodeFlavor get_dialect() const; - - void set_units(EUnits units); - EUnits get_units() const; - - void set_global_positioning_type(EPositioningType type); - EPositioningType get_global_positioning_type() const; - - void set_e_local_positioning_type(EPositioningType type); - EPositioningType get_e_local_positioning_type() const; - - int get_g1_line_id() const; - void increment_g1_line_id(); - void reset_g1_line_id(); - - void set_extrusion_axis(char axis) { m_parser.set_extrusion_axis(axis); } - - void set_extruder_id(unsigned int id); - unsigned int get_extruder_id() const; - void reset_extruder_id(); - - void set_default(); - - // Call this method before to start adding lines using add_gcode_line() when reusing an instance of GCodeTimeEstimator - void reset(); - - // Returns the estimated time, in seconds - float get_time() const; - - // Returns the estimated time, in format DDd HHh MMm SSs - std::string get_time_dhms() const; - - // Returns the estimated time, in format DDd HHh MMm - std::string get_time_dhm() const; - - // Returns the estimated time, in minutes (integer) - std::string get_time_minutes() const; - - // Returns the estimated time, in seconds, for each custom gcode - std::vector> get_custom_gcode_times() const; - - // Returns the estimated time, in format DDd HHh MMm SSs, for each color - // If include_remaining==true the strings will be formatted as: "time for color (remaining time at color start)" - std::vector get_color_times_dhms(bool include_remaining) const; - - // Returns the estimated time, in minutes (integer), for each color - // If include_remaining==true the strings will be formatted as: "time for color (remaining time at color start)" - std::vector get_color_times_minutes(bool include_remaining) const; - - // Returns the estimated time, in format DDd HHh MMm, for each custom_gcode - // If include_remaining==true the strings will be formatted as: "time for custom_gcode (remaining time at color start)" - std::vector> get_custom_gcode_times_dhm(bool include_remaining) const; - - // Return an estimate of the memory consumed by the time estimator. - size_t memory_used() const; - - PostProcessData get_post_process_data() const { return PostProcessData{ m_g1_times, m_time }; } - - private: - void _reset(); - void _reset_time(); - void _reset_blocks(); - - // Calculates the time estimate - void _calculate_time(size_t keep_last_n_blocks); - - // Processes the given gcode line - void _process_gcode_line(GCodeReader&, const GCodeReader::GCodeLine& line); - - // Move - void _processG1(const GCodeReader::GCodeLine& line); - - // Dwell - void _processG4(const GCodeReader::GCodeLine& line); - - // Set Units to Inches - void _processG20(const GCodeReader::GCodeLine& line); - - // Set Units to Millimeters - void _processG21(const GCodeReader::GCodeLine& line); - - // Move to Origin (Home) - void _processG28(const GCodeReader::GCodeLine& line); - - // Set to Absolute Positioning - void _processG90(const GCodeReader::GCodeLine& line); - - // Set to Relative Positioning - void _processG91(const GCodeReader::GCodeLine& line); - - // Set Position - void _processG92(const GCodeReader::GCodeLine& line); - - // Sleep or Conditional stop - void _processM1(const GCodeReader::GCodeLine& line); - - // Set extruder to absolute mode - void _processM82(const GCodeReader::GCodeLine& line); - - // Set extruder to relative mode - void _processM83(const GCodeReader::GCodeLine& line); - - // Set Extruder Temperature and Wait - void _processM109(const GCodeReader::GCodeLine& line); - - // Set max printing acceleration - void _processM201(const GCodeReader::GCodeLine& line); - - // Set maximum feedrate - void _processM203(const GCodeReader::GCodeLine& line); - - // Set default acceleration - void _processM204(const GCodeReader::GCodeLine& line); - - // Advanced settings - void _processM205(const GCodeReader::GCodeLine& line); - - // Set extrude factor override percentage - void _processM221(const GCodeReader::GCodeLine& line); - - // Set allowable instantaneous speed change - void _processM566(const GCodeReader::GCodeLine& line); - - // Unload the current filament into the MK3 MMU2 unit at the end of print. - void _processM702(const GCodeReader::GCodeLine& line); - - // Processes T line (Select Tool) - void _processT(const GCodeReader::GCodeLine& line); - - // Processes the tags - // Returns true if any tag has been processed - bool _process_tags(const GCodeReader::GCodeLine& line); - - // Processes ColorChangeTag and PausePrintTag - void _process_custom_gcode_tag(CustomGCode::Type code); - - // Simulates firmware st_synchronize() call - void _simulate_st_synchronize(float additional_time); - - void _forward_pass(); - void _reverse_pass(); - - void _planner_forward_pass_kernel(Block& prev, Block& curr); - void _planner_reverse_pass_kernel(Block& curr, Block& next); - - void _recalculate_trapezoids(); - - // Returns the given time is seconds in format DDd HHh MMm SSs - static std::string _get_time_dhms(float time_in_secs); - // Returns the given time is minutes in format DDd HHh MMm - static std::string _get_time_dhm(float time_in_secs); - - // Returns the given, in minutes (integer) - static std::string _get_time_minutes(float time_in_secs); - -#if ENABLE_MOVE_STATS - void _log_moves_stats() const; -#endif // ENABLE_MOVE_STATS - }; - -} /* namespace Slic3r */ - -#endif // !ENABLE_GCODE_VIEWER - -#endif /* slic3r_GCodeTimeEstimator_hpp_ */ diff --git a/src/libslic3r/GCodeWriter.cpp b/src/libslic3r/GCodeWriter.cpp index 38a1c3ebee..c09d819de3 100644 --- a/src/libslic3r/GCodeWriter.cpp +++ b/src/libslic3r/GCodeWriter.cpp @@ -20,7 +20,7 @@ void GCodeWriter::apply_print_config(const PrintConfig &print_config) this->config.apply(print_config, true); m_extrusion_axis = this->config.get_extrusion_axis(); m_single_extruder_multi_material = print_config.single_extruder_multi_material.value; - m_max_acceleration = std::lrint((print_config.gcode_flavor.value == gcfMarlin) ? + m_max_acceleration = std::lrint((print_config.gcode_flavor.value == gcfMarlin && print_config.machine_limits_usage.value == MachineLimitsUsage::EmitToGCode) ? print_config.machine_max_acceleration_extruding.values.front() : 0); } @@ -46,7 +46,13 @@ std::string GCodeWriter::preamble() gcode << "G21 ; set units to millimeters\n"; gcode << "G90 ; use absolute coordinates\n"; } - if (FLAVOR_IS(gcfRepRap) || FLAVOR_IS(gcfMarlin) || FLAVOR_IS(gcfTeacup) || FLAVOR_IS(gcfRepetier) || FLAVOR_IS(gcfSmoothie)) { + if (FLAVOR_IS(gcfRepRapSprinter) || + FLAVOR_IS(gcfRepRapFirmware) || + FLAVOR_IS(gcfMarlin) || + FLAVOR_IS(gcfTeacup) || + FLAVOR_IS(gcfRepetier) || + FLAVOR_IS(gcfSmoothie)) + { if (this->config.use_relative_e_distances) { gcode << "M83 ; use relative distances for extrusion\n"; } else { @@ -72,11 +78,15 @@ std::string GCodeWriter::set_temperature(unsigned int temperature, bool wait, in return ""; std::string code, comment; - if (wait && FLAVOR_IS_NOT(gcfTeacup)) { + if (wait && FLAVOR_IS_NOT(gcfTeacup) && FLAVOR_IS_NOT(gcfRepRapFirmware)) { code = "M109"; comment = "set temperature and wait for it to be reached"; } else { - code = "M104"; + if (FLAVOR_IS(gcfRepRapFirmware)) { // M104 is deprecated on RepRapFirmware + code = "G10"; + } else { + code = "M104"; + } comment = "set temperature"; } @@ -88,14 +98,17 @@ std::string GCodeWriter::set_temperature(unsigned int temperature, bool wait, in gcode << "S"; } gcode << temperature; - if (tool != -1 && - ( (this->multiple_extruders && ! m_single_extruder_multi_material) || - FLAVOR_IS(gcfMakerWare) || FLAVOR_IS(gcfSailfish)) ) { - gcode << " T" << tool; + bool multiple_tools = this->multiple_extruders && ! m_single_extruder_multi_material; + if (tool != -1 && (multiple_tools || FLAVOR_IS(gcfMakerWare) || FLAVOR_IS(gcfSailfish)) ) { + if (FLAVOR_IS(gcfRepRapFirmware)) { + gcode << " P" << tool; + } else { + gcode << " T" << tool; + } } gcode << " ; " << comment << "\n"; - if (FLAVOR_IS(gcfTeacup) && wait) + if ((FLAVOR_IS(gcfTeacup) || FLAVOR_IS(gcfRepRapFirmware)) && wait) gcode << "M116 ; wait for temperature to be reached\n"; return gcode.str(); diff --git a/src/libslic3r/MeshBoolean.cpp b/src/libslic3r/MeshBoolean.cpp index dd34b28300..6ffc5dec39 100644 --- a/src/libslic3r/MeshBoolean.cpp +++ b/src/libslic3r/MeshBoolean.cpp @@ -12,7 +12,6 @@ #include #include #include -#include #include #include #include diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index a4541eeecc..e424f84425 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -608,6 +608,7 @@ void ModelObject::assign_new_unique_ids_recursive() model_volume->assign_new_unique_ids_recursive(); for (ModelInstance *model_instance : this->instances) model_instance->assign_new_unique_ids_recursive(); + this->layer_height_profile.set_new_unique_id(); } // Clone this ModelObject including its volumes and instances, keep the IDs of the copies equal to the original. @@ -1041,14 +1042,15 @@ void ModelObject::convert_units(ModelObjectPtrs& new_objects, bool from_imperial int vol_idx = 0; for (ModelVolume* volume : volumes) { - volume->m_supported_facets.clear(); - volume->m_seam_facets.clear(); + volume->supported_facets.clear(); + volume->seam_facets.clear(); if (!volume->mesh().empty()) { TriangleMesh mesh(volume->mesh()); mesh.require_shared_vertices(); ModelVolume* vol = new_object->add_volume(mesh); vol->name = volume->name; + vol->set_type(volume->type()); // Don't copy the config's ID. vol->config.assign_config(volume->config); assert(vol->config.id().valid()); @@ -1059,7 +1061,7 @@ void ModelObject::convert_units(ModelObjectPtrs& new_objects, bool from_imperial if (volume_idxs.empty() || std::find(volume_idxs.begin(), volume_idxs.end(), vol_idx) != volume_idxs.end()) { vol->scale_geometry_after_creation(versor); - vol->set_offset(versor.cwiseProduct(vol->get_offset())); + vol->set_offset(versor.cwiseProduct(volume->get_offset())); } else vol->set_offset(volume->get_offset()); @@ -1147,8 +1149,8 @@ ModelObjectPtrs ModelObject::cut(size_t instance, coordf_t z, bool keep_upper, b for (ModelVolume *volume : volumes) { const auto volume_matrix = volume->get_matrix(); - volume->m_supported_facets.clear(); - volume->m_seam_facets.clear(); + volume->supported_facets.clear(); + volume->seam_facets.clear(); if (! volume->is_model_part()) { // Modifiers are not cut, but we still need to add the instance transformation @@ -1727,6 +1729,14 @@ void ModelObject::scale_to_fit(const Vec3d &size) */ } +void ModelVolume::assign_new_unique_ids_recursive() +{ + ObjectBase::set_new_unique_id(); + config.set_new_unique_id(); + supported_facets.set_new_unique_id(); + seam_facets.set_new_unique_id(); +} + void ModelVolume::rotate(double angle, Axis axis) { switch (axis) @@ -2011,7 +2021,7 @@ bool model_custom_supports_data_changed(const ModelObject& mo, const ModelObject assert(! model_volume_list_changed(mo, mo_new, ModelVolumeType::MODEL_PART)); assert(mo.volumes.size() == mo_new.volumes.size()); for (size_t i=0; im_supported_facets.timestamp_matches(mo.volumes[i]->m_supported_facets)) + if (! mo_new.volumes[i]->supported_facets.timestamp_matches(mo.volumes[i]->supported_facets)) return true; } return false; @@ -2021,7 +2031,7 @@ bool model_custom_seam_data_changed(const ModelObject& mo, const ModelObject& mo assert(! model_volume_list_changed(mo, mo_new, ModelVolumeType::MODEL_PART)); assert(mo.volumes.size() == mo_new.volumes.size()); for (size_t i=0; im_seam_facets.timestamp_matches(mo.volumes[i]->m_seam_facets)) + if (! mo_new.volumes[i]->seam_facets.timestamp_matches(mo.volumes[i]->seam_facets)) return true; } return false; diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index 003c4ed0f8..c2965f60cb 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -55,14 +55,14 @@ private: // Constructors to be only called by derived classes. // Default constructor to assign a unique ID. - explicit ModelConfigObject() {} + explicit ModelConfigObject() = default; // Constructor with ignored int parameter to assign an invalid ID, to be replaced // by an existing ID copied from elsewhere. explicit ModelConfigObject(int) : ObjectBase(-1) {} // Copy constructor copies the ID. - explicit ModelConfigObject(const ModelConfigObject &cfg) : ObjectBase(-1), ModelConfig(cfg) { this->copy_id(cfg); } + explicit ModelConfigObject(const ModelConfigObject &cfg) = default; // Move constructor copies the ID. - explicit ModelConfigObject(ModelConfigObject &&cfg) : ObjectBase(-1), ModelConfig(std::move(cfg)) { this->copy_id(cfg); } + explicit ModelConfigObject(ModelConfigObject &&cfg) = default; Timestamp timestamp() const throw() override { return this->ModelConfig::timestamp(); } bool object_id_and_timestamp_match(const ModelConfigObject &rhs) const throw() { return this->id() == rhs.id() && this->timestamp() == rhs.timestamp(); } @@ -178,6 +178,10 @@ private: class LayerHeightProfile final : public ObjectWithTimestamp { public: + // Assign the content if the timestamp differs, don't assign an ObjectID. + void assign(const LayerHeightProfile &rhs) { if (! this->timestamp_matches(rhs)) { this->m_data = rhs.m_data; this->copy_timestamp(rhs); } } + void assign(LayerHeightProfile &&rhs) { if (! this->timestamp_matches(rhs)) { this->m_data = std::move(rhs.m_data); this->copy_timestamp(rhs); } } + std::vector get() const throw() { return m_data; } bool empty() const throw() { return m_data.empty(); } void set(const std::vector &data) { if (m_data != data) { m_data = data; this->touch(); } } @@ -190,7 +194,25 @@ public: } private: + // Constructors to be only called by derived classes. + // Default constructor to assign a unique ID. + explicit LayerHeightProfile() = default; + // Constructor with ignored int parameter to assign an invalid ID, to be replaced + // by an existing ID copied from elsewhere. + explicit LayerHeightProfile(int) : ObjectWithTimestamp(-1) {} + // Copy constructor copies the ID. + explicit LayerHeightProfile(const LayerHeightProfile &rhs) = default; + // Move constructor copies the ID. + explicit LayerHeightProfile(LayerHeightProfile &&rhs) = default; + + // called by ModelObject::assign_copy() + LayerHeightProfile& operator=(const LayerHeightProfile &rhs) = default; + LayerHeightProfile& operator=(LayerHeightProfile &&rhs) = default; + std::vector m_data; + + // to access set_new_unique_id() when copy / pasting an object + friend class ModelObject; }; // A printable object, possibly having multiple print volumes (each with its own set of parameters and materials), @@ -338,41 +360,85 @@ private: // This constructor assigns new ID to this ModelObject and its config. explicit ModelObject(Model* model) : m_model(model), printable(true), origin_translation(Vec3d::Zero()), m_bounding_box_valid(false), m_raw_bounding_box_valid(false), m_raw_mesh_bounding_box_valid(false) - { assert(this->id().valid()); } - explicit ModelObject(int) : ObjectBase(-1), config(-1), m_model(nullptr), printable(true), origin_translation(Vec3d::Zero()), m_bounding_box_valid(false), m_raw_bounding_box_valid(false), m_raw_mesh_bounding_box_valid(false) - { assert(this->id().invalid()); assert(this->config.id().invalid()); } + { + assert(this->id().valid()); + assert(this->config.id().valid()); + assert(this->layer_height_profile.id().valid()); + } + explicit ModelObject(int) : ObjectBase(-1), config(-1), layer_height_profile(-1), m_model(nullptr), printable(true), origin_translation(Vec3d::Zero()), m_bounding_box_valid(false), m_raw_bounding_box_valid(false), m_raw_mesh_bounding_box_valid(false) + { + assert(this->id().invalid()); + assert(this->config.id().invalid()); + assert(this->layer_height_profile.id().invalid()); + } ~ModelObject(); void assign_new_unique_ids_recursive() override; // To be able to return an object from own copy / clone methods. Hopefully the compiler will do the "Copy elision" // (Omits copy and move(since C++11) constructors, resulting in zero - copy pass - by - value semantics). - ModelObject(const ModelObject &rhs) : ObjectBase(-1), config(-1), m_model(rhs.m_model) { - assert(this->id().invalid()); assert(this->config.id().invalid()); assert(rhs.id() != rhs.config.id()); + ModelObject(const ModelObject &rhs) : ObjectBase(-1), config(-1), layer_height_profile(-1), m_model(rhs.m_model) { + assert(this->id().invalid()); + assert(this->config.id().invalid()); + assert(this->layer_height_profile.id().invalid()); + assert(rhs.id() != rhs.config.id()); + assert(rhs.id() != rhs.layer_height_profile.id()); this->assign_copy(rhs); - assert(this->id().valid()); assert(this->config.id().valid()); assert(this->id() != this->config.id()); - assert(this->id() == rhs.id()); assert(this->config.id() == rhs.config.id()); + assert(this->id().valid()); + assert(this->config.id().valid()); + assert(this->layer_height_profile.id().valid()); + assert(this->id() != this->config.id()); + assert(this->id() != this->layer_height_profile.id()); + assert(this->id() == rhs.id()); + assert(this->config.id() == rhs.config.id()); + assert(this->layer_height_profile.id() == rhs.layer_height_profile.id()); } - explicit ModelObject(ModelObject &&rhs) : ObjectBase(-1), config(-1) { - assert(this->id().invalid()); assert(this->config.id().invalid()); assert(rhs.id() != rhs.config.id()); + explicit ModelObject(ModelObject &&rhs) : ObjectBase(-1), config(-1), layer_height_profile(-1) { + assert(this->id().invalid()); + assert(this->config.id().invalid()); + assert(this->layer_height_profile.id().invalid()); + assert(rhs.id() != rhs.config.id()); + assert(rhs.id() != rhs.layer_height_profile.id()); this->assign_copy(std::move(rhs)); - assert(this->id().valid()); assert(this->config.id().valid()); assert(this->id() != this->config.id()); - assert(this->id() == rhs.id()); assert(this->config.id() == rhs.config.id()); + assert(this->id().valid()); + assert(this->config.id().valid()); + assert(this->layer_height_profile.id().valid()); + assert(this->id() != this->config.id()); + assert(this->id() != this->layer_height_profile.id()); + assert(this->id() == rhs.id()); + assert(this->config.id() == rhs.config.id()); + assert(this->layer_height_profile.id() == rhs.layer_height_profile.id()); } - ModelObject& operator=(const ModelObject &rhs) { + ModelObject& operator=(const ModelObject &rhs) { this->assign_copy(rhs); m_model = rhs.m_model; - assert(this->id().valid()); assert(this->config.id().valid()); assert(this->id() != this->config.id()); - assert(this->id() == rhs.id()); assert(this->config.id() == rhs.config.id()); + assert(this->id().valid()); + assert(this->config.id().valid()); + assert(this->layer_height_profile.id().valid()); + assert(this->id() != this->config.id()); + assert(this->id() != this->layer_height_profile.id()); + assert(this->id() == rhs.id()); + assert(this->config.id() == rhs.config.id()); + assert(this->layer_height_profile.id() == rhs.layer_height_profile.id()); return *this; } - ModelObject& operator=(ModelObject &&rhs) { + ModelObject& operator=(ModelObject &&rhs) { this->assign_copy(std::move(rhs)); m_model = rhs.m_model; - assert(this->id().valid()); assert(this->config.id().valid()); assert(this->id() != this->config.id()); - assert(this->id() == rhs.id()); assert(this->config.id() == rhs.config.id()); + assert(this->id().valid()); + assert(this->config.id().valid()); + assert(this->layer_height_profile.id().valid()); + assert(this->id() != this->config.id()); + assert(this->id() != this->layer_height_profile.id()); + assert(this->id() == rhs.id()); + assert(this->config.id() == rhs.config.id()); + assert(this->layer_height_profile.id() == rhs.layer_height_profile.id()); return *this; } - void set_new_unique_id() { ObjectBase::set_new_unique_id(); this->config.set_new_unique_id(); } + void set_new_unique_id() { + ObjectBase::set_new_unique_id(); + this->config.set_new_unique_id(); + this->layer_height_profile.set_new_unique_id(); + } OBJECTBASE_DERIVED_COPY_MOVE_CLONE(ModelObject) @@ -396,8 +462,12 @@ private: friend class cereal::access; friend class UndoRedo::StackImpl; // Used for deserialization -> Don't allocate any IDs for the ModelObject or its config. - ModelObject() : ObjectBase(-1), config(-1), m_model(nullptr), m_bounding_box_valid(false), m_raw_bounding_box_valid(false), m_raw_mesh_bounding_box_valid(false) { - assert(this->id().invalid()); assert(this->config.id().invalid()); + ModelObject() : + ObjectBase(-1), config(-1), layer_height_profile(-1), + m_model(nullptr), m_bounding_box_valid(false), m_raw_bounding_box_valid(false), m_raw_mesh_bounding_box_valid(false) { + assert(this->id().invalid()); + assert(this->config.id().invalid()); + assert(this->layer_height_profile.id().invalid()); } template void serialize(Archive &ar) { ar(cereal::base_class(this)); @@ -427,16 +497,33 @@ enum class EnforcerBlockerType : int8_t { class FacetsAnnotation final : public ObjectWithTimestamp { public: - void assign(const FacetsAnnotation &rhs) { if (! this->timestamp_matches(rhs)) this->m_data = rhs.m_data; } - void assign(FacetsAnnotation &&rhs) { if (! this->timestamp_matches(rhs)) this->m_data = rhs.m_data; } + // Assign the content if the timestamp differs, don't assign an ObjectID. + void assign(const FacetsAnnotation& rhs) { if (! this->timestamp_matches(rhs)) { this->m_data = rhs.m_data; this->copy_timestamp(rhs); } } + void assign(FacetsAnnotation&& rhs) { if (! this->timestamp_matches(rhs)) { this->m_data = std::move(rhs.m_data); this->copy_timestamp(rhs); } } const std::map>& get_data() const throw() { return m_data; } bool set(const TriangleSelector& selector); indexed_triangle_set get_facets(const ModelVolume& mv, EnforcerBlockerType type) const; + bool empty() const { return m_data.empty(); } void clear(); std::string get_triangle_as_string(int i) const; void set_triangle_from_string(int triangle_id, const std::string& str); private: + // Constructors to be only called by derived classes. + // Default constructor to assign a unique ID. + explicit FacetsAnnotation() = default; + // Constructor with ignored int parameter to assign an invalid ID, to be replaced + // by an existing ID copied from elsewhere. + explicit FacetsAnnotation(int) : ObjectWithTimestamp(-1) {} + // Copy constructor copies the ID. + explicit FacetsAnnotation(const FacetsAnnotation &rhs) = default; + // Move constructor copies the ID. + explicit FacetsAnnotation(FacetsAnnotation &&rhs) = default; + + // called by ModelVolume::assign_copy() + FacetsAnnotation& operator=(const FacetsAnnotation &rhs) = default; + FacetsAnnotation& operator=(FacetsAnnotation &&rhs) = default; + friend class cereal::access; friend class UndoRedo::StackImpl; @@ -446,6 +533,9 @@ private: } std::map> m_data; + + // To access set_new_unique_id() when copy / pasting a ModelVolume. + friend class ModelVolume; }; // An object STL, or a modifier volume, over which a different set of parameters shall be applied. @@ -483,10 +573,10 @@ public: ModelConfigObject config; // List of mesh facets to be supported/unsupported. - FacetsAnnotation m_supported_facets; + FacetsAnnotation supported_facets; // List of seam enforcers/blockers. - FacetsAnnotation m_seam_facets; + FacetsAnnotation seam_facets; // A parent object owning this modifier volume. ModelObject* get_object() const { return this->object; } @@ -568,7 +658,12 @@ public: const Transform3d& get_matrix(bool dont_translate = false, bool dont_rotate = false, bool dont_scale = false, bool dont_mirror = false) const { return m_transformation.get_matrix(dont_translate, dont_rotate, dont_scale, dont_mirror); } - void set_new_unique_id() { ObjectBase::set_new_unique_id(); this->config.set_new_unique_id(); } + void set_new_unique_id() { + ObjectBase::set_new_unique_id(); + this->config.set_new_unique_id(); + this->supported_facets.set_new_unique_id(); + this->seam_facets.set_new_unique_id(); + } protected: friend class Print; @@ -579,7 +674,7 @@ protected: // Copies IDs of both the ModelVolume and its config. explicit ModelVolume(const ModelVolume &rhs) = default; void set_model_object(ModelObject *model_object) { object = model_object; } - void assign_new_unique_ids_recursive() override { ObjectBase::set_new_unique_id(); config.set_new_unique_id(); } + void assign_new_unique_ids_recursive() override; void transform_this_mesh(const Transform3d& t, bool fix_left_handed); void transform_this_mesh(const Matrix3d& m, bool fix_left_handed); @@ -603,13 +698,25 @@ private: ModelVolume(ModelObject *object, const TriangleMesh &mesh) : m_mesh(new TriangleMesh(mesh)), m_type(ModelVolumeType::MODEL_PART), object(object) { - assert(this->id().valid()); assert(this->config.id().valid()); assert(this->id() != this->config.id()); + assert(this->id().valid()); + assert(this->config.id().valid()); + assert(this->supported_facets.id().valid()); + assert(this->seam_facets.id().valid()); + assert(this->id() != this->config.id()); + assert(this->id() != this->supported_facets.id()); + assert(this->id() != this->seam_facets.id()); if (mesh.stl.stats.number_of_facets > 1) calculate_convex_hull(); } ModelVolume(ModelObject *object, TriangleMesh &&mesh, TriangleMesh &&convex_hull) : m_mesh(new TriangleMesh(std::move(mesh))), m_convex_hull(new TriangleMesh(std::move(convex_hull))), m_type(ModelVolumeType::MODEL_PART), object(object) { - assert(this->id().valid()); assert(this->config.id().valid()); assert(this->id() != this->config.id()); + assert(this->id().valid()); + assert(this->config.id().valid()); + assert(this->supported_facets.id().valid()); + assert(this->seam_facets.id().valid()); + assert(this->id() != this->config.id()); + assert(this->id() != this->supported_facets.id()); + assert(this->id() != this->seam_facets.id()); } // Copying an existing volume, therefore this volume will get a copy of the ID assigned. @@ -617,26 +724,45 @@ private: ObjectBase(other), name(other.name), source(other.source), m_mesh(other.m_mesh), m_convex_hull(other.m_convex_hull), config(other.config), m_type(other.m_type), object(object), m_transformation(other.m_transformation), - m_supported_facets(other.m_supported_facets), m_seam_facets(other.m_seam_facets) + supported_facets(other.supported_facets), seam_facets(other.seam_facets) { - assert(this->id().valid()); assert(this->config.id().valid()); assert(this->id() != this->config.id()); - assert(this->id() == other.id() && this->config.id() == other.config.id()); + assert(this->id().valid()); + assert(this->config.id().valid()); + assert(this->supported_facets.id().valid()); + assert(this->seam_facets.id().valid()); + assert(this->id() != this->config.id()); + assert(this->id() != this->supported_facets.id()); + assert(this->id() != this->seam_facets.id()); + assert(this->id() == other.id()); + assert(this->config.id() == other.config.id()); + assert(this->supported_facets.id() == other.supported_facets.id()); + assert(this->seam_facets.id() == other.seam_facets.id()); this->set_material_id(other.material_id()); } // Providing a new mesh, therefore this volume will get a new unique ID assigned. ModelVolume(ModelObject *object, const ModelVolume &other, const TriangleMesh &&mesh) : name(other.name), source(other.source), m_mesh(new TriangleMesh(std::move(mesh))), config(other.config), m_type(other.m_type), object(object), m_transformation(other.m_transformation) { - assert(this->id().valid()); assert(this->config.id().valid()); assert(this->id() != this->config.id()); - assert(this->id() != other.id() && this->config.id() == other.config.id()); + assert(this->id().valid()); + assert(this->config.id().valid()); + assert(this->supported_facets.id().valid()); + assert(this->seam_facets.id().valid()); + assert(this->id() != this->config.id()); + assert(this->id() != this->supported_facets.id()); + assert(this->id() != this->seam_facets.id()); + assert(this->id() != other.id()); + assert(this->config.id() == other.config.id()); this->set_material_id(other.material_id()); this->config.set_new_unique_id(); if (mesh.stl.stats.number_of_facets > 1) calculate_convex_hull(); - assert(this->config.id().valid()); assert(this->config.id() != other.config.id()); assert(this->id() != this->config.id()); - - m_supported_facets.clear(); - m_seam_facets.clear(); + assert(this->config.id().valid()); + assert(this->config.id() != other.config.id()); + assert(this->supported_facets.id() != other.supported_facets.id()); + assert(this->seam_facets.id() != other.seam_facets.id()); + assert(this->id() != this->config.id()); + assert(this->supported_facets.empty()); + assert(this->seam_facets.empty()); } ModelVolume& operator=(ModelVolume &rhs) = delete; @@ -644,14 +770,17 @@ private: friend class cereal::access; friend class UndoRedo::StackImpl; // Used for deserialization, therefore no IDs are allocated. - ModelVolume() : ObjectBase(-1), config(-1), object(nullptr) { - assert(this->id().invalid()); assert(this->config.id().invalid()); + ModelVolume() : ObjectBase(-1), config(-1), supported_facets(-1), seam_facets(-1), object(nullptr) { + assert(this->id().invalid()); + assert(this->config.id().invalid()); + assert(this->supported_facets.id().invalid()); + assert(this->seam_facets.id().invalid()); } template void load(Archive &ar) { bool has_convex_hull; ar(name, source, m_mesh, m_type, m_material_id, m_transformation, m_is_splittable, has_convex_hull); - cereal::load_by_value(ar, m_supported_facets); - cereal::load_by_value(ar, m_seam_facets); + cereal::load_by_value(ar, supported_facets); + cereal::load_by_value(ar, seam_facets); cereal::load_by_value(ar, config); assert(m_mesh); if (has_convex_hull) { @@ -665,8 +794,8 @@ private: template void save(Archive &ar) const { bool has_convex_hull = m_convex_hull.get() != nullptr; ar(name, source, m_mesh, m_type, m_material_id, m_transformation, m_is_splittable, has_convex_hull); - cereal::save_by_value(ar, m_supported_facets); - cereal::save_by_value(ar, m_seam_facets); + cereal::save_by_value(ar, supported_facets); + cereal::save_by_value(ar, seam_facets); cereal::save_by_value(ar, config); if (has_convex_hull) cereal::save_optional(ar, m_convex_hull); diff --git a/src/libslic3r/ObjectID.hpp b/src/libslic3r/ObjectID.hpp index bd2f6b86ec..ea7c748a50 100644 --- a/src/libslic3r/ObjectID.hpp +++ b/src/libslic3r/ObjectID.hpp @@ -108,6 +108,8 @@ protected: // Resetting timestamp to 1 indicates the object is in its initial (cleared) state. // To be called by the derived class's clear() method. void reset_timestamp() { m_timestamp = 1; } + // The timestamp uniquely identifies content of the derived class' data, therefore it makes sense to copy the timestamp if the content data was copied. + void copy_timestamp(const ObjectWithTimestamp& rhs) { m_timestamp = rhs.m_timestamp; } public: // Return an optional timestamp of this object. diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index ddcadf9281..1982a91fb4 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -454,27 +454,40 @@ const std::vector& Preset::filament_options() return s_opts; } +const std::vector& Preset::machine_limits_options() +{ + static std::vector s_opts; + if (s_opts.empty()) { + s_opts = { + "machine_max_acceleration_extruding", "machine_max_acceleration_retracting", + "machine_max_acceleration_x", "machine_max_acceleration_y", "machine_max_acceleration_z", "machine_max_acceleration_e", + "machine_max_feedrate_x", "machine_max_feedrate_y", "machine_max_feedrate_z", "machine_max_feedrate_e", + "machine_min_extruding_rate", "machine_min_travel_rate", + "machine_max_jerk_x", "machine_max_jerk_y", "machine_max_jerk_z", "machine_max_jerk_e", + }; + } + return s_opts; +} + const std::vector& Preset::printer_options() { static std::vector s_opts; if (s_opts.empty()) { s_opts = { "printer_technology", - "bed_shape", "bed_custom_texture", "bed_custom_model", "z_offset", "gcode_flavor", "use_relative_e_distances", "serial_port", "serial_speed", + "bed_shape", "bed_custom_texture", "bed_custom_model", "z_offset", "gcode_flavor", "use_relative_e_distances", "use_firmware_retraction", "use_volumetric_e", "variable_layer_height", + //FIXME the print host keys are left here just for conversion from the Printer preset to Physical Printer preset. "host_type", "print_host", "printhost_apikey", "printhost_cafile", "single_extruder_multi_material", "start_gcode", "end_gcode", "before_layer_gcode", "layer_gcode", "toolchange_gcode", "color_change_gcode", "pause_print_gcode", "template_custom_gcode", "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", "machine_max_acceleration_extruding", "machine_max_acceleration_retracting", - "machine_max_acceleration_x", "machine_max_acceleration_y", "machine_max_acceleration_z", "machine_max_acceleration_e", - "machine_max_feedrate_x", "machine_max_feedrate_y", "machine_max_feedrate_z", "machine_max_feedrate_e", - "machine_min_extruding_rate", "machine_min_travel_rate", - "machine_max_jerk_x", "machine_max_jerk_y", "machine_max_jerk_z", "machine_max_jerk_e", - "thumbnails" + "remaining_times", "silent_mode", + "machine_limits_usage", "thumbnails" }; + s_opts.insert(s_opts.end(), Preset::machine_limits_options().begin(), Preset::machine_limits_options().end()); s_opts.insert(s_opts.end(), Preset::nozzle_options().begin(), Preset::nozzle_options().end()); } return s_opts; @@ -583,6 +596,7 @@ const std::vector& Preset::sla_printer_options() "gamma_correction", "min_exposure_time", "max_exposure_time", "min_initial_exposure_time", "max_initial_exposure_time", + //FIXME the print host keys are left here just for conversion from the Printer preset to Physical Printer preset. "print_host", "printhost_apikey", "printhost_cafile", "printer_notes", "inherits" @@ -699,38 +713,6 @@ Preset& PresetCollection::load_preset(const std::string &path, const std::string return this->load_preset(path, name, std::move(cfg), select); } -enum class ProfileHostParams -{ - Same, - Different, - Anonymized, -}; - -static ProfileHostParams profile_host_params_same_or_anonymized(const DynamicPrintConfig &cfg_old, const DynamicPrintConfig &cfg_new) -{ - auto opt_print_host_old = cfg_old.option("print_host"); - auto opt_printhost_apikey_old = cfg_old.option("printhost_apikey"); - auto opt_printhost_cafile_old = cfg_old.option("printhost_cafile"); - - auto opt_print_host_new = cfg_new.option("print_host"); - auto opt_printhost_apikey_new = cfg_new.option("printhost_apikey"); - auto opt_printhost_cafile_new = cfg_new.option("printhost_cafile"); - - // If the new print host data is undefined, use the old data. - bool new_print_host_undefined = (opt_print_host_new == nullptr || opt_print_host_new ->empty()) && - (opt_printhost_apikey_new == nullptr || opt_printhost_apikey_new ->empty()) && - (opt_printhost_cafile_new == nullptr || opt_printhost_cafile_new ->empty()); - if (new_print_host_undefined) - return ProfileHostParams::Anonymized; - - auto opt_same = [](const ConfigOptionString *l, const ConfigOptionString *r) { - return ((l == nullptr || l->empty()) && (r == nullptr || r->empty())) || - (l != nullptr && r != nullptr && l->value == r->value); - }; - return (opt_same(opt_print_host_old, opt_print_host_new) && opt_same(opt_printhost_apikey_old, opt_printhost_apikey_new) && - opt_same(opt_printhost_cafile_old, opt_printhost_cafile_new)) ? ProfileHostParams::Same : ProfileHostParams::Different; -} - static bool profile_print_params_same(const DynamicPrintConfig &cfg_old, const DynamicPrintConfig &cfg_new) { t_config_option_keys diff = cfg_old.diff(cfg_new); @@ -740,10 +722,11 @@ static bool profile_print_params_same(const DynamicPrintConfig &cfg_old, const D "compatible_printers", "compatible_printers_condition", "inherits", "print_settings_id", "filament_settings_id", "sla_print_settings_id", "sla_material_settings_id", "printer_settings_id", "printer_model", "printer_variant", "default_print_profile", "default_filament_profile", "default_sla_print_profile", "default_sla_material_profile", + //FIXME remove the print host keys? "print_host", "printhost_apikey", "printhost_cafile" }) diff.erase(std::remove(diff.begin(), diff.end(), key), diff.end()); // Preset with the same name as stored inside the config exists. - return diff.empty() && profile_host_params_same_or_anonymized(cfg_old, cfg_new) != ProfileHostParams::Different; + return diff.empty(); } // Load a preset from an already parsed config file, insert it into the sorted sequence of presets @@ -772,25 +755,11 @@ Preset& PresetCollection::load_external_preset( it = this->find_preset_renamed(original_name); found = it != m_presets.end(); } - if (found) { - if (profile_print_params_same(it->config, cfg)) { - // The preset exists and it matches the values stored inside config. - if (select) - this->select_preset(it - m_presets.begin()); - return *it; - } - if (profile_host_params_same_or_anonymized(it->config, cfg) == ProfileHostParams::Anonymized) { - // The project being loaded is anonymized. Replace the empty host keys of the loaded profile with the data from the original profile. - // See "Octoprint Settings when Opening a .3MF file" GH issue #3244 - auto opt_update = [it, &cfg](const std::string &opt_key) { - auto opt = it->config.option(opt_key); - if (opt != nullptr) - cfg.set_key_value(opt_key, opt->clone()); - }; - opt_update("print_host"); - opt_update("printhost_apikey"); - opt_update("printhost_cafile"); - } + if (found && profile_print_params_same(it->config, cfg)) { + // The preset exists and it matches the values stored inside config. + if (select) + this->select_preset(it - m_presets.begin()); + return *it; } // Update the "inherits" field. std::string &inherits = Preset::inherits(cfg); @@ -1362,31 +1331,25 @@ const std::vector& PhysicalPrinter::printer_options() "preset_name", "printer_technology", // "printer_model", - "host_type", - "print_host", - "printhost_apikey", + "host_type", + "print_host", + "printhost_apikey", "printhost_cafile", + "printhost_port", "printhost_authorization_type", // HTTP digest authentization (RFC 2617) - "printhost_user", + "printhost_user", "printhost_password" }; } return s_opts; } -const std::vector& PhysicalPrinter::print_host_options() -{ - static std::vector s_opts; - if (s_opts.empty()) { - s_opts = { - "print_host", - "printhost_apikey", - "printhost_cafile" - }; - } - return s_opts; -} +static constexpr auto legacy_print_host_options = { + "print_host", + "printhost_apikey", + "printhost_cafile", +}; std::vector PhysicalPrinter::presets_with_print_host_information(const PrinterPresetCollection& printer_presets) { @@ -1400,7 +1363,7 @@ std::vector PhysicalPrinter::presets_with_print_host_information(co bool PhysicalPrinter::has_print_host_information(const DynamicPrintConfig& config) { - for (const std::string& opt : print_host_options()) + for (const char *opt : legacy_print_host_options) if (!config.opt_string(opt).empty()) return true; @@ -1417,6 +1380,7 @@ 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() && + config.opt_string("printhost_port" ).empty() && config.opt_string("printhost_user" ).empty() && config.opt_string("printhost_password").empty(); } @@ -1445,7 +1409,7 @@ void PhysicalPrinter::update_from_preset(const Preset& preset) { config.apply_only(preset.config, printer_options(), true); // add preset names to the options list - auto ret = preset_names.emplace(preset.name); + preset_names.emplace(preset.name); update_preset_names_in_config(); } @@ -1602,9 +1566,7 @@ void PhysicalPrinterCollection::load_printers_from_presets(PrinterPresetCollecti int cnt=0; for (Preset& preset: printer_presets) { DynamicPrintConfig& config = preset.config; - const std::vector& options = PhysicalPrinter::print_host_options(); - - for(const std::string& option : options) { + for(const char* option : legacy_print_host_options) { if (!config.opt_string(option).empty()) { // check if printer with those "Print Host upload" options already exist PhysicalPrinter* existed_printer = find_printer_with_same_config(config); @@ -1623,7 +1585,7 @@ void PhysicalPrinterCollection::load_printers_from_presets(PrinterPresetCollecti } // erase "Print Host upload" information from the preset - for (const std::string& opt : options) + for (const char *opt : legacy_print_host_options) config.opt_string(opt).clear(); // save changes for preset preset.save(); @@ -1631,7 +1593,7 @@ void PhysicalPrinterCollection::load_printers_from_presets(PrinterPresetCollecti // update those changes for edited preset if it's equal to the preset Preset& edited = printer_presets.get_edited_preset(); if (preset.name == edited.name) { - for (const std::string& opt : options) + for (const char *opt : legacy_print_host_options) edited.config.opt_string(opt).clear(); } @@ -1664,7 +1626,7 @@ std::deque::iterator PhysicalPrinterCollection::find_printer_in std::string low_name = boost::to_lower_copy(name); - int i = 0; + size_t i = 0; for (const PhysicalPrinter& printer : m_printers) { if (boost::to_lower_copy(printer.name) == low_name) break; @@ -1680,7 +1642,7 @@ PhysicalPrinter* PhysicalPrinterCollection::find_printer_with_same_config(const { for (const PhysicalPrinter& printer :*this) { bool is_equal = true; - for (const std::string& opt : PhysicalPrinter::print_host_options()) + for (const char *opt : legacy_print_host_options) if (is_equal && printer.config.opt_string(opt) != config.opt_string(opt)) is_equal = false; @@ -1854,7 +1816,7 @@ void PhysicalPrinterCollection::unselect_printer() bool PhysicalPrinterCollection::is_selected(PhysicalPrinterCollection::ConstIterator it, const std::string& preset_name) const { - return m_idx_selected == 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 e3e16b65dc..dc6dd8e68b 100644 --- a/src/libslic3r/Preset.hpp +++ b/src/libslic3r/Preset.hpp @@ -218,6 +218,8 @@ public: static const std::vector& printer_options(); // Nozzle options of the printer options. static const std::vector& nozzle_options(); + // Printer machine limits, those are contained in printer_options(). + static const std::vector& machine_limits_options(); static const std::vector& sla_printer_options(); static const std::vector& sla_material_options(); @@ -369,19 +371,28 @@ public: size_t i = m_default_suppressed ? m_num_default_presets : 0; size_t n = this->m_presets.size(); size_t i_compatible = n; + int match_quality = -1; for (; i < n; ++ i) // Since we use the filament selection from Wizard, it's needed to control the preset visibility too if (m_presets[i].is_compatible && m_presets[i].is_visible) { - if (prefered_condition(m_presets[i].name)) - return i; - if (i_compatible == n) - // Store the first compatible profile into i_compatible. + int this_match_quality = prefered_condition(m_presets[i]); + if (this_match_quality > match_quality) { + if (match_quality == std::numeric_limits::max()) + // Better match will not be found. + return i; + // Store the first compatible profile with highest match quality into i_compatible. i_compatible = i; + match_quality = this_match_quality; + } } - return (i_compatible == n) ? 0 : i_compatible; + return (i_compatible == n) ? + // No compatible preset found, return the default preset. + 0 : + // Compatible preset found. + i_compatible; } // Return index of the first compatible preset. Certainly at least the '- default -' preset shall be compatible. - size_t first_compatible_idx() const { return this->first_compatible_idx([](const std::string&){return true;}); } + size_t first_compatible_idx() const { return this->first_compatible_idx([](const Preset&) -> int { return 0; }); } // Return index of the first visible preset. Certainly at least the '- default -' preset shall be visible. // Return the first visible preset. Certainly at least the '- default -' preset shall be visible. @@ -405,7 +416,7 @@ public: this->select_preset(this->first_compatible_idx(prefered_condition)); } void update_compatible(const PresetWithVendorProfile &active_printer, const PresetWithVendorProfile *active_print, PresetSelectCompatibleType select_other_if_incompatible) - { this->update_compatible(active_printer, active_print, select_other_if_incompatible, [](const std::string&){return true;}); } + { this->update_compatible(active_printer, active_print, select_other_if_incompatible, [](const Preset&) -> int { return 0; }); } size_t num_visible() const { return std::count_if(m_presets.begin(), m_presets.end(), [](const Preset &preset){return preset.is_visible;}); } diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index 4309f07328..44df000c3b 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -37,11 +37,11 @@ static std::vector s_project_options { const char *PresetBundle::PRUSA_BUNDLE = "PrusaResearch"; PresetBundle::PresetBundle() : - prints(Preset::TYPE_PRINT, Preset::print_options(), static_cast(FullPrintConfig::defaults())), - filaments(Preset::TYPE_FILAMENT, Preset::filament_options(), static_cast(FullPrintConfig::defaults())), + prints(Preset::TYPE_PRINT, Preset::print_options(), static_cast(FullPrintConfig::defaults())), + filaments(Preset::TYPE_FILAMENT, Preset::filament_options(), static_cast(FullPrintConfig::defaults())), sla_materials(Preset::TYPE_SLA_MATERIAL, Preset::sla_material_options(), static_cast(SLAFullPrintConfig::defaults())), sla_prints(Preset::TYPE_SLA_PRINT, Preset::sla_print_options(), static_cast(SLAFullPrintConfig::defaults())), - printers(Preset::TYPE_PRINTER, Preset::printer_options(), static_cast(FullPrintConfig::defaults()), "- default FFF -"), + printers(Preset::TYPE_PRINTER, Preset::printer_options(), static_cast(FullPrintConfig::defaults()), "- default FFF -"), physical_printers(PhysicalPrinter::printer_options()) { // The following keys are handled by the UI, they do not have a counterpart in any StaticPrintConfig derived classes, @@ -77,11 +77,12 @@ PresetBundle::PresetBundle() : for (size_t i = 0; i < 2; ++ i) { // The following ugly switch is to avoid printers.preset(0) to return the edited instance, as the 0th default is the current one. Preset &preset = this->printers.default_preset(i); - preset.config.optptr("printer_settings_id", true); - preset.config.optptr("printer_vendor", true); - preset.config.optptr("printer_model", true); - preset.config.optptr("printer_variant", true); - preset.config.optptr("thumbnails", true); + for (const char *key : { + "printer_settings_id", "printer_vendor", "printer_model", "printer_variant", "thumbnails", + //FIXME the following keys are only created here for compatibility to be able to parse legacy Printer profiles. + // These keys are converted to Physical Printer profile. After the conversion, they shall be removed. + "host_type", "print_host", "printhost_apikey", "printhost_cafile"}) + preset.config.optptr(key, true); if (i == 0) { preset.config.optptr("default_print_profile", true); preset.config.option("default_filament_profile", true)->values = { "" }; @@ -458,7 +459,7 @@ void PresetBundle::load_selections(AppConfig &config, const std::string &preferr this->update_multi_material_filament_presets(); // Parse the initial physical printer name. - std::string initial_physical_printer_name = remove_ini_suffix(config.get("extras", "physical_printer")); + std::string initial_physical_printer_name = remove_ini_suffix(config.get("presets", "physical_printer")); // Activate physical printer from the config if (!initial_physical_printer_name.empty()) @@ -482,8 +483,7 @@ void PresetBundle::export_selections(AppConfig &config) config.set("presets", "sla_print", sla_prints.get_selected_preset_name()); config.set("presets", "sla_material", sla_materials.get_selected_preset_name()); config.set("presets", "printer", printers.get_selected_preset_name()); - - config.set("extras", "physical_printer", physical_printers.get_selected_full_printer_name()); + config.set("presets", "physical_printer", physical_printers.get_selected_full_printer_name()); } DynamicPrintConfig PresetBundle::full_config() const @@ -496,6 +496,7 @@ DynamicPrintConfig PresetBundle::full_config() const DynamicPrintConfig PresetBundle::full_config_secure() const { DynamicPrintConfig config = this->full_config(); + //FIXME legacy, the keys should not be there after conversion to a Physical Printer profile. config.erase("print_host"); config.erase("printhost_apikey"); config.erase("printhost_cafile"); @@ -1439,50 +1440,132 @@ void PresetBundle::update_compatible(PresetSelectCompatibleType select_other_pri const Preset &printer_preset = this->printers.get_edited_preset(); const PresetWithVendorProfile printer_preset_with_vendor_profile = this->printers.get_preset_with_vendor_profile(printer_preset); + class PreferedProfileMatch + { + public: + PreferedProfileMatch(const std::string &prefered_alias, const std::string &prefered_name) : + m_prefered_alias(prefered_alias), m_prefered_name(prefered_name) {} + + 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; + } + + private: + const std::string m_prefered_alias; + const std::string &m_prefered_name; + }; + + // Matching by the layer height in addition. + 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")) {} + + int operator()(const Preset &preset) const + { + int match_quality = PreferedProfileMatch::operator()(preset); + if (match_quality < std::numeric_limits::max()) { + match_quality += 1; + if (m_prefered_layer_height > 0. && std::abs(preset.config.opt_float("layer_height") - m_prefered_layer_height) < 0.0005) + match_quality *= 10; + } + return match_quality; + } + + private: + const double m_prefered_layer_height; + }; + + // Matching by the layer height in addition. + class PreferedFilamentProfileMatch : public PreferedProfileMatch + { + public: + PreferedFilamentProfileMatch(const Preset *preset, const std::string &prefered_name) : + PreferedProfileMatch(preset ? preset->alias : std::string(), prefered_name), + m_prefered_filament_type(preset ? preset->config.opt_string("filament_type", 0) : std::string()) {} + + int operator()(const Preset &preset) const + { + int match_quality = PreferedProfileMatch::operator()(preset); + if (match_quality < std::numeric_limits::max()) { + match_quality += 1; + if (! m_prefered_filament_type.empty() && m_prefered_filament_type == preset.config.opt_string("filament_type", 0)) + match_quality *= 10; + } + return match_quality; + } + + private: + const std::string m_prefered_filament_type; + }; + + // Matching by the layer height in addition. + 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)), + m_prefered_names(prefered_names) + {} + + int operator()(const Preset &preset) const + { + if (! m_prefered_alias.empty() && m_prefered_alias == preset.alias) + // Matching an alias, always take this preset with priority. + return std::numeric_limits::max(); + int match_quality = (std::find(m_prefered_names.begin(), m_prefered_names.end(), preset.name) != m_prefered_names.end()) + 1; + if (! m_prefered_filament_type.empty() && m_prefered_filament_type == preset.config.opt_string("filament_type", 0)) + match_quality *= 10; + return match_quality; + } + + private: + const std::string m_prefered_alias; + const std::string m_prefered_filament_type; + const std::vector &m_prefered_names; + }; + switch (printer_preset.printer_technology()) { case ptFFF: { assert(printer_preset.config.has("default_print_profile")); assert(printer_preset.config.has("default_filament_profile")); - const std::string &prefered_print_profile = printer_preset.config.opt_string("default_print_profile"); const std::vector &prefered_filament_profiles = printer_preset.config.option("default_filament_profile")->values; - prefered_print_profile.empty() ? - this->prints.update_compatible(printer_preset_with_vendor_profile, nullptr, select_other_print_if_incompatible) : - this->prints.update_compatible(printer_preset_with_vendor_profile, nullptr, select_other_print_if_incompatible, - [&prefered_print_profile](const std::string& profile_name) { return profile_name == prefered_print_profile; }); + 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"))); 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); for (size_t idx = 0; idx < this->filament_presets.size(); ++ idx) { - std::string &filament_name = this->filament_presets[idx]; - Preset *preset = this->filaments.find_preset(filament_name, false); + Preset *preset = this->filaments.find_preset(this->filament_presets[idx], false); filament_preset_was_compatible[idx] = preset != nullptr && preset->is_compatible; } - prefered_filament_profiles.empty() ? - this->filaments.update_compatible(printer_preset_with_vendor_profile, &print_preset_with_vendor_profile, select_other_filament_if_incompatible) : - this->filaments.update_compatible(printer_preset_with_vendor_profile, &print_preset_with_vendor_profile, select_other_filament_if_incompatible, - [&prefered_filament_profiles](const std::string& profile_name) - { return std::find(prefered_filament_profiles.begin(), prefered_filament_profiles.end(), profile_name) != prefered_filament_profiles.end(); }); + // 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)); 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(); if (this->filament_presets.size() == 1) { + // The compatible profile should have been already selected for the preset editor. Just use it. if (select_other_filament_if_incompatible == PresetSelectCompatibleType::Always || filament_preset_was_compatible.front()) this->filament_presets.front() = this->filaments.get_edited_preset().name; } else { for (size_t idx = 0; idx < this->filament_presets.size(); ++ idx) { std::string &filament_name = this->filament_presets[idx]; Preset *preset = this->filaments.find_preset(filament_name, false); - if (preset == nullptr || (! preset->is_compatible && (select_other_filament_if_incompatible == PresetSelectCompatibleType::Always || filament_preset_was_compatible[idx]))) { + if (preset == nullptr || (! preset->is_compatible && (select_other_filament_if_incompatible == PresetSelectCompatibleType::Always || filament_preset_was_compatible[idx]))) // Pick a compatible profile. If there are prefered_filament_profiles, use them. - if (prefered_filament_profiles.empty()) - filament_name = this->filaments.first_compatible().name; - else { - const std::string &preferred = (idx < prefered_filament_profiles.size()) ? - prefered_filament_profiles[idx] : prefered_filament_profiles.front(); - filament_name = this->filaments.first_compatible( - [&preferred](const std::string& profile_name) { return profile_name == preferred; }).name; - } - } + filament_name = this->filaments.first_compatible( + PreferedFilamentProfileMatch(preset, + (idx < prefered_filament_profiles.size()) ? prefered_filament_profiles[idx] : prefered_filament_profile)).name; } } } @@ -1492,17 +1575,11 @@ 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")); - const PresetWithVendorProfile sla_print_preset_with_vendor_profile = this->sla_prints.get_edited_preset_with_vendor_profile(); - const std::string &prefered_sla_print_profile = printer_preset.config.opt_string("default_sla_print_profile"); - (prefered_sla_print_profile.empty()) ? - this->sla_prints.update_compatible(printer_preset_with_vendor_profile, nullptr, select_other_print_if_incompatible) : - this->sla_prints.update_compatible(printer_preset_with_vendor_profile, nullptr, select_other_print_if_incompatible, - [&prefered_sla_print_profile](const std::string& profile_name){ return profile_name == prefered_sla_print_profile; }); - const std::string &prefered_sla_material_profile = printer_preset.config.opt_string("default_sla_material_profile"); - prefered_sla_material_profile.empty() ? - this->sla_materials.update_compatible(printer_preset_with_vendor_profile, &sla_print_preset_with_vendor_profile, select_other_filament_if_incompatible) : - this->sla_materials.update_compatible(printer_preset_with_vendor_profile, &sla_print_preset_with_vendor_profile, select_other_filament_if_incompatible, - [&prefered_sla_material_profile](const std::string& profile_name){ return profile_name == prefered_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"))); + 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"))); break; } default: break; diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 34a3d8b237..9c5c7bfb7c 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -10,6 +10,7 @@ #include "I18N.hpp" #include "ShortestPath.hpp" #include "SupportMaterial.hpp" +#include "Thread.hpp" #include "GCode.hpp" #include "GCode/WipeTower.hpp" #include "Utils.hpp" @@ -404,10 +405,10 @@ static inline void model_volume_list_copy_configs(ModelObject &model_object_dst, // Copy the ModelVolume data. mv_dst.name = mv_src.name; mv_dst.config.assign_config(mv_src.config); - if (! mv_dst.m_supported_facets.timestamp_matches(mv_src.m_supported_facets)) - mv_dst.m_supported_facets = mv_src.m_supported_facets; - if (! mv_dst.m_seam_facets.timestamp_matches(mv_src.m_seam_facets)) - mv_dst.m_seam_facets = mv_src.m_seam_facets; + assert(mv_dst.supported_facets.id() == mv_src.supported_facets.id()); + mv_dst.supported_facets.assign(mv_src.supported_facets); + assert(mv_dst.seam_facets.id() == mv_src.seam_facets.id()); + mv_dst.seam_facets.assign(mv_src.seam_facets); //FIXME what to do with the materials? // mv_dst.m_material_id = mv_src.m_material_id; ++ i_src; @@ -577,6 +578,16 @@ void Print::config_diffs( } } +std::vector Print::print_object_ids() const +{ + std::vector out; + // Reserve one more for the caller to append the ID of the Print itself. + out.reserve(m_objects.size() + 1); + for (const PrintObject *print_object : m_objects) + out.emplace_back(print_object->id()); + return out; +} + Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_config) { #ifdef _DEBUG @@ -1274,8 +1285,9 @@ std::string Print::validate() const "and use filaments of the same diameter."); } - if (m_config.gcode_flavor != gcfRepRap && m_config.gcode_flavor != gcfRepetier && m_config.gcode_flavor != gcfMarlin) - return L("The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter and Repetier G-code flavors."); + if (m_config.gcode_flavor != gcfRepRapSprinter && m_config.gcode_flavor != gcfRepRapFirmware && + m_config.gcode_flavor != gcfRepetier && m_config.gcode_flavor != gcfMarlin) + return L("The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter, RepRapFirmware and Repetier G-code flavors."); if (! m_config.use_relative_e_distances) return L("The Wipe Tower is currently only supported with the relative extruder addressing (use_relative_e_distances=1)."); if (m_config.ooze_prevention) @@ -1594,6 +1606,8 @@ void Print::auto_assign_extruders(ModelObject* model_object) const // Slicing process, running at a background thread. void Print::process() { + name_tbb_thread_pool_threads(); + BOOST_LOG_TRIVIAL(info) << "Starting the slicing process." << log_memory_info(); for (PrintObject *obj : m_objects) obj->make_perimeters(); diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index a389ef00da..d354b0d792 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -37,16 +37,18 @@ namespace FillAdaptive { }; // Print step IDs for keeping track of the print state. +// The Print steps are applied in this order. enum PrintStep { - psSkirt, - psBrim, - // Synonym for the last step before the Wipe Tower / Tool Ordering, for the G-code preview slider to understand that - // all the extrusions are there for the layer slider to add color changes etc. - psExtrusionPaths = psBrim, psWipeTower, + // Ordering of the tools on PrintObjects for a multi-material print. // psToolOrdering is a synonym to psWipeTower, as the Wipe Tower calculates and modifies the ToolOrdering, // while if printing without the Wipe Tower, the ToolOrdering is calculated as well. psToolOrdering = psWipeTower, + psSkirt, + psBrim, + // Last step before G-code export, after this step is finished, the initial extrusion path preview + // should be refreshed. + psSlicingFinished = psBrim, psGCodeExport, psCount, }; @@ -370,6 +372,8 @@ public: // a cancellation callback is executed to stop the background processing before the operation. 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 override; ApplyStatus apply(const Model &model, DynamicPrintConfig config) override; diff --git a/src/libslic3r/PrintBase.hpp b/src/libslic3r/PrintBase.hpp index 647c24c1ce..bfbabd06b5 100644 --- a/src/libslic3r/PrintBase.hpp +++ b/src/libslic3r/PrintBase.hpp @@ -348,6 +348,8 @@ public: // The Print is empty either after clear() or after apply() over an empty model, // or after apply() over a model, where no object is printable (all outside the print volume). virtual bool empty() const = 0; + // List of existing PrintObject IDs, to remove notifications for non-existent IDs. + virtual std::vector print_object_ids() const = 0; // Validate the print, return empty string if valid, return error if process() cannot (or should not) be started. virtual std::string validate() const { return std::string(); } @@ -406,7 +408,7 @@ public: // set to an ObjectID of a Print or a PrintObject based on flags // (whether UPDATE_PRINT_STEP_WARNINGS or UPDATE_PRINT_OBJECT_STEP_WARNINGS is set). ObjectID warning_object_id; - // For which Print or PrintObject step a new warning is beeing issued? + // For which Print or PrintObject step a new warning is being issued? int warning_step { -1 }; }; typedef std::function status_callback_type; diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 93d9cfbcff..ee4a0945e9 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -39,11 +39,6 @@ void PrintConfigDef::init_common_params() { ConfigOptionDef* def; - def = this->add("single_instance", coBool); - def->label = L("Single Instance"); - def->mode = comAdvanced; - def->set_default_value(new ConfigOptionBool(false)); - def = this->add("printer_technology", coEnum); def->label = L("Printer technology"); def->tooltip = L("Printer technology"); @@ -113,7 +108,14 @@ void PrintConfigDef::init_common_params() "the API Key or the password required for authentication."); def->mode = comAdvanced; def->set_default_value(new ConfigOptionString("")); - + + def = this->add("printhost_port", coString); + def->label = L("Printer"); + def->tooltip = L("Name of the printer"); + def->gui_type = "select_open"; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionString("")); + def = this->add("printhost_cafile", coString); def->label = L("HTTPS CA File"); def->tooltip = L("Custom CA certificate file can be specified for HTTPS OctoPrint connections, in crt/pem format. " @@ -457,20 +459,20 @@ void PrintConfigDef::init_fff_params() def->cli = "top-fill-pattern|external-fill-pattern|solid-fill-pattern"; def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); def->enum_values.push_back("rectilinear"); - def->enum_values.push_back("monotonous"); + def->enum_values.push_back("monotonic"); def->enum_values.push_back("concentric"); def->enum_values.push_back("hilbertcurve"); def->enum_values.push_back("archimedeanchords"); def->enum_values.push_back("octagramspiral"); def->enum_labels.push_back(L("Rectilinear")); - def->enum_labels.push_back(L("Monotonous")); + def->enum_labels.push_back(L("Monotonic")); def->enum_labels.push_back(L("Concentric")); def->enum_labels.push_back(L("Hilbert Curve")); def->enum_labels.push_back(L("Archimedean Chords")); def->enum_labels.push_back(L("Octagram Spiral")); // solid_fill_pattern is an obsolete equivalent to top_fill_pattern/bottom_fill_pattern. def->aliases = { "solid_fill_pattern", "external_fill_pattern" }; - def->set_default_value(new ConfigOptionEnum(ipMonotonous)); + def->set_default_value(new ConfigOptionEnum(ipMonotonic)); def = this->add("bottom_fill_pattern", coEnum); def->label = L("Bottom fill pattern"); @@ -988,6 +990,7 @@ void PrintConfigDef::init_fff_params() "The \"No extrusion\" flavor prevents PrusaSlicer from exporting any extrusion value at all."); def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); def->enum_values.push_back("reprap"); + def->enum_values.push_back("reprapfirmware"); def->enum_values.push_back("repetier"); def->enum_values.push_back("teacup"); def->enum_values.push_back("makerware"); @@ -998,6 +1001,7 @@ void PrintConfigDef::init_fff_params() def->enum_values.push_back("smoothie"); def->enum_values.push_back("no-extrusion"); def->enum_labels.push_back("RepRap/Sprinter"); + def->enum_labels.push_back("RepRapFirmware"); def->enum_labels.push_back("Repetier"); def->enum_labels.push_back("Teacup"); def->enum_labels.push_back("MakerWare (MakerBot)"); @@ -1008,7 +1012,7 @@ void PrintConfigDef::init_fff_params() def->enum_labels.push_back("Smoothie"); def->enum_labels.push_back(L("No extrusion")); def->mode = comExpert; - def->set_default_value(new ConfigOptionEnum(gcfRepRap)); + def->set_default_value(new ConfigOptionEnum(gcfRepRapSprinter)); def = this->add("gcode_label_objects", coBool); def->label = L("Label objects"); @@ -1201,6 +1205,21 @@ void PrintConfigDef::init_fff_params() def->mode = comExpert; def->set_default_value(new ConfigOptionBool(true)); + def = this->add("machine_limits_usage", coEnum); + def->label = L("How to apply"); + def->full_label = L("Purpose of Machine Limits"); + def->category = L("Machine limits"); + def->tooltip = L("How to apply the Machine Limits"); + def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); + def->enum_values.push_back("emit_to_gcode"); + def->enum_values.push_back("time_estimate_only"); + def->enum_values.push_back("ignore"); + def->enum_labels.push_back("Emit to G-code"); + def->enum_labels.push_back("Use for time estimate"); + def->enum_labels.push_back("Ignore"); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionEnum(MachineLimitsUsage::EmitToGCode)); + { struct AxisDefault { std::string name; @@ -1435,10 +1454,12 @@ void PrintConfigDef::init_fff_params() def->enum_values.push_back("duet"); def->enum_values.push_back("flashair"); def->enum_values.push_back("astrobox"); + def->enum_values.push_back("repetier"); def->enum_labels.push_back("OctoPrint"); def->enum_labels.push_back("Duet"); def->enum_labels.push_back("FlashAir"); def->enum_labels.push_back("AstroBox"); + def->enum_labels.push_back("Repetier"); def->mode = comAdvanced; def->set_default_value(new ConfigOptionEnum(htOctoPrint)); @@ -1753,26 +1774,6 @@ void PrintConfigDef::init_fff_params() def->set_default_value(new ConfigOptionFloat(30)); #endif - def = this->add("serial_port", coString); - def->gui_type = "select_open"; - def->label = ""; - def->full_label = L("Serial port"); - def->tooltip = L("USB/serial port for printer connection."); - def->width = 20; - def->set_default_value(new ConfigOptionString("")); - - def = this->add("serial_speed", coInt); - def->gui_type = "i_enum_open"; - def->label = L("Speed"); - def->full_label = L("Serial port speed"); - def->tooltip = L("Speed (baud) of USB/serial port for printer connection."); - def->min = 1; - def->max = 300000; - def->enum_values.push_back("115200"); - def->enum_values.push_back("250000"); - def->mode = comAdvanced; - def->set_default_value(new ConfigOptionInt(250000)); - def = this->add("skirt_distance", coFloat); def->label = L("Distance from object"); def->tooltip = L("Distance between skirt and object(s). Set this to zero to attach the skirt " @@ -3164,10 +3165,15 @@ void PrintConfigDef::handle_legacy(t_config_option_key &opt_key, std::string &va "seal_position", "vibration_limit", "bed_size", "print_center", "g0", "threads", "pressure_advance", "wipe_tower_per_color_wipe" #ifndef HAS_PRESSURE_EQUALIZER - , "max_volumetric_extrusion_rate_slope_positive", "max_volumetric_extrusion_rate_slope_negative" + , "max_volumetric_extrusion_rate_slope_positive", "max_volumetric_extrusion_rate_slope_negative", #endif /* HAS_PRESSURE_EQUALIZER */ + "serial_port", "serial_speed" }; + // In PrusaSlicer 2.3.0-alpha0 the "monotonous" infill was introduced, which was later renamed to "monotonic". + if (value == "monotonous" && (opt_key == "top_fill_pattern" || opt_key == "bottom_fill_pattern" || opt_key == "fill_pattern")) + value = "monotonic"; + if (ignore.find(opt_key) != ignore.end()) { opt_key = ""; return; @@ -3338,11 +3344,12 @@ std::string FullPrintConfig::validate() if (this->use_firmware_retraction.value && this->gcode_flavor.value != gcfSmoothie && - this->gcode_flavor.value != gcfRepRap && + this->gcode_flavor.value != gcfRepRapSprinter && + this->gcode_flavor.value != gcfRepRapFirmware && this->gcode_flavor.value != gcfMarlin && this->gcode_flavor.value != gcfMachinekit && this->gcode_flavor.value != gcfRepetier) - return "--use-firmware-retraction is only supported by Marlin, Smoothie, Repetier and Machinekit firmware"; + return "--use-firmware-retraction is only supported by Marlin, Smoothie, RepRapFirmware, Repetier and Machinekit firmware"; if (this->use_firmware_retraction.value) for (unsigned char wipe : this->wipe.values) @@ -3481,7 +3488,6 @@ StaticPrintConfig::StaticCache PrintRegionConfi StaticPrintConfig::StaticCache MachineEnvelopeConfig::s_cache_MachineEnvelopeConfig; StaticPrintConfig::StaticCache GCodeConfig::s_cache_GCodeConfig; StaticPrintConfig::StaticCache PrintConfig::s_cache_PrintConfig; -StaticPrintConfig::StaticCache HostConfig::s_cache_HostConfig; StaticPrintConfig::StaticCache FullPrintConfig::s_cache_FullPrintConfig; StaticPrintConfig::StaticCache SLAMaterialConfig::s_cache_SLAMaterialConfig; @@ -3679,6 +3685,12 @@ CLIMiscConfigDef::CLIMiscConfigDef() def->tooltip = L("The file where the output will be written (if not specified, it will be based on the input file)."); def->cli = "output|o"; + def = this->add("single_instance", coBool); + def->label = L("Single Instance"); + def->tooltip = L("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."); + /* def = this->add("autosave", coString); def->label = L("Autosave"); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 52e3bc38cf..89c9c7a97f 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -11,7 +11,6 @@ // PrintRegionConfig // PrintConfig // GCodeConfig -// HostConfig // #ifndef slic3r_PrintConfig_hpp_ @@ -25,12 +24,19 @@ namespace Slic3r { enum GCodeFlavor : unsigned char { - gcfRepRap, gcfRepetier, gcfTeacup, gcfMakerWare, gcfMarlin, gcfSailfish, gcfMach3, gcfMachinekit, + gcfRepRapSprinter, gcfRepRapFirmware, gcfRepetier, gcfTeacup, gcfMakerWare, gcfMarlin, gcfSailfish, gcfMach3, gcfMachinekit, gcfSmoothie, gcfNoExtrusion, }; +enum class MachineLimitsUsage { + EmitToGCode, + TimeEstimateOnly, + Ignore, + Count, +}; + enum PrintHostType { - htOctoPrint, htDuet, htFlashAir, htAstroBox + htOctoPrint, htDuet, htFlashAir, htAstroBox, htRepetier }; enum AuthorizationType { @@ -38,7 +44,7 @@ enum AuthorizationType { }; enum InfillPattern : int { - ipRectilinear, ipMonotonous, ipGrid, ipTriangles, ipStars, ipCubic, ipLine, ipConcentric, ipHoneycomb, ip3DHoneycomb, + ipRectilinear, ipMonotonic, ipGrid, ipTriangles, ipStars, ipCubic, ipLine, ipConcentric, ipHoneycomb, ip3DHoneycomb, ipGyroid, ipHilbertCurve, ipArchimedeanChords, ipOctagramSpiral, ipAdaptiveCubic, ipSupportCubic, ipCount, }; @@ -88,7 +94,8 @@ 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["reprap"] = gcfRepRap; + keys_map["reprap"] = gcfRepRapSprinter; + keys_map["reprapfirmware"] = gcfRepRapFirmware; keys_map["repetier"] = gcfRepetier; keys_map["teacup"] = gcfTeacup; keys_map["makerware"] = gcfMakerWare; @@ -102,6 +109,16 @@ template<> inline const t_config_enum_values& ConfigOptionEnum::get 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["emit_to_gcode"] = int(MachineLimitsUsage::EmitToGCode); + keys_map["time_estimate_only"] = int(MachineLimitsUsage::TimeEstimateOnly); + keys_map["ignore"] = int(MachineLimitsUsage::Ignore); + } + 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()) { @@ -109,6 +126,7 @@ template<> inline const t_config_enum_values& ConfigOptionEnum::g keys_map["duet"] = htDuet; keys_map["flashair"] = htFlashAir; keys_map["astrobox"] = htAstroBox; + keys_map["repetier"] = htRepetier; } return keys_map; } @@ -126,7 +144,7 @@ template<> inline const t_config_enum_values& ConfigOptionEnum::g static t_config_enum_values keys_map; if (keys_map.empty()) { keys_map["rectilinear"] = ipRectilinear; - keys_map["monotonous"] = ipMonotonous; + keys_map["monotonic"] = ipMonotonic; keys_map["grid"] = ipGrid; keys_map["triangles"] = ipTriangles; keys_map["stars"] = ipStars; @@ -597,6 +615,8 @@ class MachineEnvelopeConfig : public StaticPrintConfig { STATIC_PRINT_CONFIG_CACHE(MachineEnvelopeConfig) public: + // Allowing the machine limits to be completely ignored or used just for time estimator. + ConfigOptionEnum machine_limits_usage; // M201 X... Y... Z... E... [mm/sec^2] ConfigOptionFloats machine_max_acceleration_x; ConfigOptionFloats machine_max_acceleration_y; @@ -624,6 +644,7 @@ public: protected: void initialize(StaticCacheBase &cache, const char *base_ptr) { + OPT_PTR(machine_limits_usage); OPT_PTR(machine_max_acceleration_x); OPT_PTR(machine_max_acceleration_y); OPT_PTR(machine_max_acceleration_z); @@ -941,38 +962,14 @@ protected: } }; -class HostConfig : public StaticPrintConfig -{ - STATIC_PRINT_CONFIG_CACHE(HostConfig) -public: - ConfigOptionEnum host_type; - ConfigOptionString print_host; - ConfigOptionString printhost_apikey; - ConfigOptionString printhost_cafile; - ConfigOptionString serial_port; - ConfigOptionInt serial_speed; - -protected: - void initialize(StaticCacheBase &cache, const char *base_ptr) - { - OPT_PTR(host_type); - OPT_PTR(print_host); - OPT_PTR(printhost_apikey); - OPT_PTR(printhost_cafile); - OPT_PTR(serial_port); - OPT_PTR(serial_speed); - } -}; - // This object is mapped to Perl as Slic3r::Config::Full. class FullPrintConfig : public PrintObjectConfig, public PrintRegionConfig, - public PrintConfig, - public HostConfig + public PrintConfig { STATIC_PRINT_CONFIG_CACHE_DERIVED(FullPrintConfig) - FullPrintConfig() : PrintObjectConfig(0), PrintRegionConfig(0), PrintConfig(0), HostConfig(0) { initialize_cache(); *this = s_cache_FullPrintConfig.defaults(); } + FullPrintConfig() : PrintObjectConfig(0), PrintRegionConfig(0), PrintConfig(0) { initialize_cache(); *this = s_cache_FullPrintConfig.defaults(); } public: // Validate the FullPrintConfig. Returns an empty string on success, otherwise an error message is returned. @@ -980,13 +977,12 @@ public: protected: // Protected constructor to be called to initialize ConfigCache::m_default. - FullPrintConfig(int) : PrintObjectConfig(0), PrintRegionConfig(0), PrintConfig(0), HostConfig(0) {} + FullPrintConfig(int) : PrintObjectConfig(0), PrintRegionConfig(0), PrintConfig(0) {} void initialize(StaticCacheBase &cache, const char *base_ptr) { this->PrintObjectConfig::initialize(cache, base_ptr); this->PrintRegionConfig::initialize(cache, base_ptr); this->PrintConfig ::initialize(cache, base_ptr); - this->HostConfig ::initialize(cache, base_ptr); } }; @@ -1385,8 +1381,6 @@ class ModelConfig public: void clear() { m_data.clear(); m_timestamp = 1; } - // Modification of the ModelConfig is not thread safe due to the global timestamp counter! - // Don't call modification methods from the back-end! void assign_config(const ModelConfig &rhs) { if (m_timestamp != rhs.m_timestamp) { m_data = rhs.m_data; @@ -1400,6 +1394,9 @@ public: rhs.clear(); } } + + // Modification of the ModelConfig is not thread safe due to the global timestamp counter! + // Don't call modification methods from the back-end! // Assign methods don't assign if src==dst to not having to bump the timestamp in case they are equal. void assign_config(const DynamicPrintConfig &rhs) { if (m_data != rhs) { m_data = rhs; this->touch(); } } void assign_config(DynamicPrintConfig &&rhs) { if (m_data != rhs) { m_data = std::move(rhs); this->touch(); } } diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 6f26d8b9de..db654bb340 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -650,14 +650,14 @@ bool PrintObject::invalidate_step(PrintObjectStep step) // propagate to dependent steps if (step == posPerimeters) { - invalidated |= this->invalidate_steps({ posPrepareInfill, posInfill }); + invalidated |= this->invalidate_steps({ posPrepareInfill, posInfill, posIroning }); invalidated |= m_print->invalidate_steps({ psSkirt, psBrim }); } else if (step == posPrepareInfill) { - invalidated |= this->invalidate_step(posInfill); + invalidated |= this->invalidate_steps({ posInfill, posIroning }); } else if (step == posInfill) { invalidated |= m_print->invalidate_steps({ psSkirt, psBrim }); } else if (step == posSlice) { - invalidated |= this->invalidate_steps({ posPerimeters, posPrepareInfill, posInfill, posSupportMaterial }); + invalidated |= this->invalidate_steps({ posPerimeters, posPrepareInfill, posInfill, posIroning, posSupportMaterial }); invalidated |= m_print->invalidate_steps({ psSkirt, psBrim }); this->m_slicing_params.valid = false; } else if (step == posSupportMaterial) { @@ -1688,12 +1688,6 @@ void PrintObject::_slice(const std::vector &layer_height_profile) m_typed_slices = false; -#ifdef SLIC3R_PROFILE - // Disable parallelization so the Shiny profiler works - static tbb::task_scheduler_init *tbb_init = nullptr; - tbb_init = new tbb::task_scheduler_init(1); -#endif - // 1) Initialize layers and their slice heights. std::vector slice_zs; { @@ -2706,7 +2700,7 @@ void PrintObject::combine_infill() // Because fill areas for rectilinear and honeycomb are grown // later to overlap perimeters, we need to counteract that too. ((region->config().fill_pattern == ipRectilinear || - region->config().fill_pattern == ipMonotonous || + region->config().fill_pattern == ipMonotonic || region->config().fill_pattern == ipGrid || region->config().fill_pattern == ipLine || region->config().fill_pattern == ipHoneycomb) ? 1.5f : 0.5f) * @@ -2748,8 +2742,8 @@ void PrintObject::project_and_append_custom_facets( { for (const ModelVolume* mv : this->model_object()->volumes) { const indexed_triangle_set custom_facets = seam - ? mv->m_seam_facets.get_facets(*mv, type) - : mv->m_supported_facets.get_facets(*mv, type); + ? mv->seam_facets.get_facets(*mv, type) + : mv->supported_facets.get_facets(*mv, type); if (! mv->is_model_part() || custom_facets.indices.empty()) continue; diff --git a/src/libslic3r/SLA/SupportPointGenerator.cpp b/src/libslic3r/SLA/SupportPointGenerator.cpp index 7e884b6e3c..8f720339ab 100644 --- a/src/libslic3r/SLA/SupportPointGenerator.cpp +++ b/src/libslic3r/SLA/SupportPointGenerator.cpp @@ -11,8 +11,12 @@ #include "Point.hpp" #include "ClipperUtils.hpp" #include "Tesselate.hpp" +#include "ExPolygonCollection.hpp" #include "libslic3r.h" +#include "libnest2d/backends/clipper/geometries.hpp" +#include "libnest2d/utils/rotcalipers.hpp" + #include #include @@ -300,32 +304,35 @@ void SupportPointGenerator::add_support_points(SupportPointGenerator::Structure float tp = m_config.tear_pressure(); float current = s.supports_force_total(); - static constexpr float SLOPE_DAMPING = .0015f; - static constexpr float DANGL_DAMPING = .09f; + static constexpr float DANGL_DAMPING = .5f; + static constexpr float SLOPE_DAMPING = .1f; if (s.islands_below.empty()) { // completely new island - needs support no doubt // deficit is full, there is nothing below that would hold this island - uniformly_cover({ *s.polygon }, s, s.area * tp, grid3d, IslandCoverageFlags(icfIsNew | icfBoundaryOnly) ); + uniformly_cover({ *s.polygon }, s, s.area * tp, grid3d, IslandCoverageFlags(icfIsNew | icfWithBoundary) ); return; } + if (! s.overhangs.empty()) { + uniformly_cover(s.overhangs, s, s.overhangs_area * tp, grid3d); + } + auto areafn = [](double sum, auto &p) { return sum + p.area() * SCALING_FACTOR * SCALING_FACTOR; }; + + current = s.supports_force_total(); if (! s.dangling_areas.empty()) { // Let's see if there's anything that overlaps enough to need supports: // What we now have in polygons needs support, regardless of what the forces are, so we can add them. double a = std::accumulate(s.dangling_areas.begin(), s.dangling_areas.end(), 0., areafn); - uniformly_cover(s.dangling_areas, s, a * tp - current * DANGL_DAMPING * std::sqrt(1. - a / s.area), grid3d); + uniformly_cover(s.dangling_areas, s, a * tp - a * current * s.area, grid3d, icfWithBoundary); } + current = s.supports_force_total(); if (! s.overhangs_slopes.empty()) { double a = std::accumulate(s.overhangs_slopes.begin(), s.overhangs_slopes.end(), 0., areafn); - uniformly_cover(s.overhangs_slopes, s, a * tp - current * SLOPE_DAMPING * std::sqrt(1. - a / s.area), grid3d); - } - - if (! s.overhangs.empty()) { - uniformly_cover(s.overhangs, s, s.overhangs_area * tp, grid3d); + uniformly_cover(s.overhangs_slopes, s, a * tp - a * current / s.area, grid3d, icfWithBoundary); } } @@ -357,13 +364,26 @@ std::vector sample_expolygon(const ExPolygon &expoly, float samples_per_m double r = random_triangle(rng); size_t idx_triangle = std::min(std::upper_bound(areas.begin(), areas.end(), (float)r) - areas.begin(), areas.size() - 1) * 3; // Select a random point on the triangle. - double u = float(std::sqrt(random_float(rng))); - double v = float(random_float(rng)); const Vec2f &a = triangles[idx_triangle ++]; const Vec2f &b = triangles[idx_triangle++]; const Vec2f &c = triangles[idx_triangle]; - const Vec2f x = a * (1.f - u) + b * (u * (1.f - v)) + c * (v * u); - out.emplace_back(x); +#if 1 + // https://www.cs.princeton.edu/~funk/tog02.pdf + // page 814, formula 1. + double u = float(std::sqrt(random_float(rng))); + double v = float(random_float(rng)); + out.emplace_back(a * (1.f - u) + b * (u * (1.f - v)) + c * (v * u)); +#else + // Greg Turk, Graphics Gems + // https://devsplorer.wordpress.com/2019/08/07/find-a-random-point-on-a-plane-using-barycentric-coordinates-in-unity/ + double u = float(random_float(rng)); + double v = float(random_float(rng)); + if (u + v >= 1.f) { + u = 1.f - u; + v = 1.f - v; + } + out.emplace_back(a + u * (b - a) + v * (c - a)); +#endif } } return out; @@ -532,10 +552,14 @@ void SupportPointGenerator::uniformly_cover(const ExPolygons& islands, Structure //int num_of_points = std::max(1, (int)((island.area()*pow(SCALING_FACTOR, 2) * m_config.tear_pressure)/m_config.support_force)); float support_force_deficit = deficit; - auto bb = get_extents(islands); +// auto bb = get_extents(islands); if (flags & icfIsNew) { - Vec2d bbdim = unscaled(Vec2crd{bb.max - bb.min}); + auto chull_ex = ExPolygonCollection{islands}.convex_hull(); + auto chull = Slic3rMultiPoint_to_ClipperPath(chull_ex); + auto rotbox = libnest2d::minAreaBoundingBox(chull); + Vec2d bbdim = {unscaled(rotbox.width()), unscaled(rotbox.height())}; + if (bbdim.x() > bbdim.y()) std::swap(bbdim.x(), bbdim.y()); double aspectr = bbdim.y() / bbdim.x(); @@ -560,7 +584,7 @@ void SupportPointGenerator::uniformly_cover(const ExPolygons& islands, Structure //FIXME share the random generator. The random generator may be not so cheap to initialize, also we don't want the random generator to be restarted for each polygon. std::vector raw_samples = - flags & icfBoundaryOnly ? + flags & icfWithBoundary ? sample_expolygon_with_boundary(islands, samples_per_mm2, 5.f / poisson_radius, m_rng) : sample_expolygon(islands, samples_per_mm2, m_rng); diff --git a/src/libslic3r/SLA/SupportPointGenerator.hpp b/src/libslic3r/SLA/SupportPointGenerator.hpp index 30c221c041..ebb8cc373f 100644 --- a/src/libslic3r/SLA/SupportPointGenerator.hpp +++ b/src/libslic3r/SLA/SupportPointGenerator.hpp @@ -201,7 +201,7 @@ private: void process(const std::vector& slices, const std::vector& heights); public: - enum IslandCoverageFlags : uint8_t { icfNone = 0x0, icfIsNew = 0x1, icfBoundaryOnly = 0x2 }; + enum IslandCoverageFlags : uint8_t { icfNone = 0x0, icfIsNew = 0x1, icfWithBoundary = 0x2 }; private: diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index a2d2ff6209..f36e48aa66 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -4,6 +4,7 @@ #include "ClipperUtils.hpp" #include "Geometry.hpp" #include "MTUtils.hpp" +#include "Thread.hpp" #include #include @@ -175,6 +176,16 @@ static std::vector sla_instances(const ModelObject &mo return instances; } +std::vector SLAPrint::print_object_ids() const +{ + std::vector out; + // Reserve one more for the caller to append the ID of the Print itself. + out.reserve(m_objects.size() + 1); + for (const SLAPrintObject *print_object : m_objects) + out.emplace_back(print_object->id()); + return out; +} + SLAPrint::ApplyStatus SLAPrint::apply(const Model &model, DynamicPrintConfig config) { #ifdef _DEBUG @@ -679,7 +690,10 @@ bool SLAPrint::invalidate_step(SLAPrintStep step) void SLAPrint::process() { - if(m_objects.empty()) return; + if (m_objects.empty()) + return; + + name_tbb_thread_pool_threads(); // Assumption: at this point the print objects should be populated only with // the model objects we have to process and the instances are also filtered diff --git a/src/libslic3r/SLAPrint.hpp b/src/libslic3r/SLAPrint.hpp index 5ca1b2b8e7..a4305e0c31 100644 --- a/src/libslic3r/SLAPrint.hpp +++ b/src/libslic3r/SLAPrint.hpp @@ -420,6 +420,8 @@ public: 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; ApplyStatus apply(const Model &model, DynamicPrintConfig config) override; void set_task(const TaskParams ¶ms) override; void process() override; diff --git a/src/libslic3r/SLAPrintSteps.cpp b/src/libslic3r/SLAPrintSteps.cpp index d94bc682b3..11c8c6f4e6 100644 --- a/src/libslic3r/SLAPrintSteps.cpp +++ b/src/libslic3r/SLAPrintSteps.cpp @@ -93,9 +93,10 @@ void SLAPrint::Steps::apply_printer_corrections(SLAPrintObject &po, SliceOrigin coord_t clpr_offs = scaled(doffs); faded_lyrs = std::min(po.m_slice_index.size(), faded_lyrs); + size_t faded_lyrs_efc = std::max(size_t(1), faded_lyrs - 1); - auto efc = [start_efc, faded_lyrs](size_t pos) { - return (faded_lyrs - 1 - pos) * start_efc / (faded_lyrs - 1); + auto efc = [start_efc, faded_lyrs_efc](size_t pos) { + return (faded_lyrs_efc - pos) * start_efc / faded_lyrs_efc; }; std::vector &slices = o == soModel ? diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index a0484b259c..3ee299e61d 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -39,11 +39,8 @@ //=================== #define ENABLE_2_3_0_ALPHA1 1 -// Enable rendering of objects colored by facets' slope -#define ENABLE_SLOPE_RENDERING (1 && ENABLE_2_3_0_ALPHA1) - // Enable rendering of objects using environment map -#define ENABLE_ENVIRONMENT_MAP (1 && ENABLE_2_3_0_ALPHA1) +#define ENABLE_ENVIRONMENT_MAP (0 && ENABLE_2_3_0_ALPHA1) // Enable smoothing of objects normals #define ENABLE_SMOOTH_NORMALS (0 && ENABLE_2_3_0_ALPHA1) @@ -58,6 +55,13 @@ #define ENABLE_GCODE_VIEWER (1 && ENABLE_2_3_0_ALPHA1) #define ENABLE_GCODE_VIEWER_STATISTICS (0 && ENABLE_GCODE_VIEWER) #define ENABLE_GCODE_VIEWER_DATA_CHECKING (0 && ENABLE_GCODE_VIEWER) -#define ENABLE_GCODE_VIEWER_TASKBAR_ICON (0 && ENABLE_GCODE_VIEWER) + + +//=================== +// 2.3.0.alpha3 techs +//=================== +#define ENABLE_2_3_0_ALPHA3 1 + +#define ENABLE_CTRL_M_ON_WINDOWS (0 && ENABLE_2_3_0_ALPHA3) #endif // _prusaslicer_technologies_h_ diff --git a/src/libslic3r/Thread.cpp b/src/libslic3r/Thread.cpp new file mode 100644 index 0000000000..4e915f0c99 --- /dev/null +++ b/src/libslic3r/Thread.cpp @@ -0,0 +1,238 @@ +#ifdef _WIN32 + #include + #include +#else + // any posix system + #include +#endif + +#include +#include +#include +#include +#include + + +#include "Thread.hpp" + +namespace Slic3r { + +#ifdef _WIN32 +// The new API is better than the old SEH style thread naming since the names also show up in crash dumpsand ETW traces. +// Because the new API is only available on newer Windows 10, look it up dynamically. + +typedef HRESULT(__stdcall* SetThreadDescriptionType)(HANDLE, PCWSTR); +typedef HRESULT(__stdcall* GetThreadDescriptionType)(HANDLE, PWSTR*); + +static bool s_SetGetThreadDescriptionInitialized = false; +static HMODULE s_hKernel32 = nullptr; +static SetThreadDescriptionType s_fnSetThreadDescription = nullptr; +static GetThreadDescriptionType s_fnGetThreadDescription = nullptr; + +static bool WindowsGetSetThreadNameAPIInitialize() +{ + if (! s_SetGetThreadDescriptionInitialized) { + // Not thread safe! It is therefore a good idea to name the main thread before spawning worker threads + // to initialize + s_hKernel32 = LoadLibraryW(L"Kernel32.dll"); + if (s_hKernel32) { + s_fnSetThreadDescription = (SetThreadDescriptionType)::GetProcAddress(s_hKernel32, "SetThreadDescription"); + s_fnGetThreadDescription = (GetThreadDescriptionType)::GetProcAddress(s_hKernel32, "GetThreadDescription"); + } + s_SetGetThreadDescriptionInitialized = true; + } + return s_fnSetThreadDescription && s_fnGetThreadDescription; +} + +#ifndef NDEBUG + // Use the old way by throwing an exception, so at least in Debug mode the thread names are shown by the debugger. + static constexpr DWORD MSVC_SEH_EXCEPTION_NAME_THREAD = 0x406D1388; + +#pragma pack(push,8) + typedef struct tagTHREADNAME_INFO + { + DWORD dwType; // Must be 0x1000. + LPCSTR szName; // Pointer to name (in user addr space). + DWORD dwThreadID; // Thread ID (-1=caller thread). + DWORD dwFlags; // Reserved for future use, must be zero. + } THREADNAME_INFO; +#pragma pack(pop) + + static void WindowsSetThreadNameSEH(HANDLE hThread, const char* thread_name) + { + THREADNAME_INFO info; + info.dwType = 0x1000; + info.szName = thread_name; + info.dwThreadID = ::GetThreadId(hThread); + info.dwFlags = 0; + __try { + RaiseException(MSVC_SEH_EXCEPTION_NAME_THREAD, 0, sizeof(info) / sizeof(ULONG_PTR), (ULONG_PTR*)&info); + } __except (EXCEPTION_EXECUTE_HANDLER) { + } + } +#endif // NDEBUG + +static bool WindowsSetThreadName(HANDLE hThread, const char *thread_name) +{ + if (! WindowsGetSetThreadNameAPIInitialize()) { +#ifdef NDEBUG + return false; +#else // NDEBUG + // Running on Windows 7 or old Windows 7 in debug mode, + // inform the debugger about the thread name by throwing an SEH. + WindowsSetThreadNameSEH(hThread, thread_name); + return true; +#endif // NDEBUG + } + + size_t len = strlen(thread_name); + if (len < 1024) { + // Allocate the temp string on stack. + wchar_t buf[1024]; + s_fnSetThreadDescription(hThread, boost::nowide::widen(buf, 1024, thread_name)); + } else { + // Allocate dynamically. + s_fnSetThreadDescription(hThread, boost::nowide::widen(thread_name).c_str()); + } + return true; +} + +bool set_thread_name(std::thread &thread, const char *thread_name) +{ + return WindowsSetThreadName(static_cast(thread.native_handle()), thread_name); +} + +bool set_thread_name(boost::thread &thread, const char *thread_name) +{ + return WindowsSetThreadName(static_cast(thread.native_handle()), thread_name); +} + +bool set_current_thread_name(const char *thread_name) +{ + return WindowsSetThreadName(::GetCurrentThread(), thread_name); +} + +std::optional get_current_thread_name() +{ + if (! WindowsGetSetThreadNameAPIInitialize()) + return std::nullopt; + + wchar_t *ptr = nullptr; + s_fnGetThreadDescription(::GetCurrentThread(), &ptr); + return (ptr == nullptr) ? std::string() : boost::nowide::narrow(ptr); +} + +#else // _WIN32 + +#ifdef __APPLE__ + +// Appe screwed the Posix norm. +bool set_thread_name(std::thread &thread, const char *thread_name) +{ +// not supported +// pthread_setname_np(thread.native_handle(), thread_name); + return false; +} + +bool set_thread_name(boost::thread &thread, const char *thread_name) +{ +// not supported +// pthread_setname_np(thread.native_handle(), thread_name); + return false; +} + +bool set_current_thread_name(const char *thread_name) +{ + pthread_setname_np(thread_name); + return true; +} + +std::optional get_current_thread_name() +{ +// not supported +// char buf[16]; +// return std::string(thread_getname_np(buf, 16) == 0 ? buf : ""); + return std::nullopt; +} + +#else + +// posix +bool set_thread_name(std::thread &thread, const char *thread_name) +{ + pthread_setname_np(thread.native_handle(), thread_name); + return true; +} + +bool set_thread_name(boost::thread &thread, const char *thread_name) +{ + pthread_setname_np(thread.native_handle(), thread_name); + return true; +} + +bool set_current_thread_name(const char *thread_name) +{ + pthread_setname_np(pthread_self(), thread_name); + return true; +} + +std::optional get_current_thread_name() +{ + char buf[16]; + return std::string(pthread_getname_np(pthread_self(), buf, 16) == 0 ? buf : ""); +} + +#endif + +#endif // _WIN32 + +// Spawn (n - 1) worker threads on Intel TBB thread pool and name them by an index and a system thread ID. +void name_tbb_thread_pool_threads() +{ + static bool initialized = false; + if (initialized) + return; + initialized = true; + + const size_t nthreads_hw = std::thread::hardware_concurrency(); + size_t nthreads = nthreads_hw; + +#ifdef SLIC3R_PROFILE + // Shiny profiler is not thread safe, thus disable parallelization. + nthreads = 1; +#endif + + if (nthreads != nthreads_hw) + new tbb::task_scheduler_init(int(nthreads)); + + std::atomic nthreads_running(0); + std::condition_variable cv; + std::mutex cv_m; + auto master_thread_id = tbb::this_tbb_thread::get_id(); + tbb::parallel_for( + tbb::blocked_range(0, nthreads, 1), + [&nthreads_running, nthreads, &master_thread_id, &cv, &cv_m](const tbb::blocked_range &range) { + assert(range.begin() + 1 == range.end()); + if (nthreads_running.fetch_add(1) + 1 == nthreads) { + // All threads are spinning. + // Wake them up. + cv.notify_all(); + } else { + // Wait for the last thread to wake the others. + std::unique_lock lk(cv_m); + cv.wait(lk, [&nthreads_running, nthreads]{return nthreads_running == nthreads;}); + } + auto thread_id = tbb::this_tbb_thread::get_id(); + if (thread_id == master_thread_id) { + // The calling thread runs the 0'th task. + assert(range.begin() == 0); + } else { + assert(range.begin() > 0); + std::ostringstream name; + name << "slic3r_tbb_" << range.begin(); + set_current_thread_name(name.str().c_str()); + } + }); +} + +} diff --git a/src/libslic3r/Thread.hpp b/src/libslic3r/Thread.hpp new file mode 100644 index 0000000000..a861237962 --- /dev/null +++ b/src/libslic3r/Thread.hpp @@ -0,0 +1,57 @@ +#ifndef GUI_THREAD_HPP +#define GUI_THREAD_HPP + +#include +#include +#include +#include + +namespace Slic3r { + +// Set / get thread name. +// Returns false if the API is not supported. +// +// It is a good idea to name the main thread before spawning children threads, because dynamic linking is used on Windows 10 +// to initialize Get/SetThreadDescription functions, which is not thread safe. +// +// pthread_setname_np supports maximum 15 character thread names! (16th character is the null terminator) +// +// Methods taking the thread as an argument are not supported by OSX. +// Naming threads is only supported on newer Windows 10. + +bool set_thread_name(std::thread &thread, const char *thread_name); +inline bool set_thread_name(std::thread &thread, const std::string &thread_name) { return set_thread_name(thread, thread_name.c_str()); } +bool set_thread_name(boost::thread &thread, const char *thread_name); +inline bool set_thread_name(boost::thread &thread, const std::string &thread_name) { return set_thread_name(thread, thread_name.c_str()); } +bool set_current_thread_name(const char *thread_name); +inline bool set_current_thread_name(const std::string &thread_name) { return set_current_thread_name(thread_name.c_str()); } + +// Returns nullopt if not supported. +// Not supported by OSX. +// Naming threads is only supported on newer Windows 10. +std::optional get_current_thread_name(); + +// To be called somewhere before the TBB threads are spinned for the first time, to +// give them names recognizible in the debugger. +void name_tbb_thread_pool_threads(); + +template +inline boost::thread create_thread(boost::thread::attributes &attrs, Fn &&fn) +{ + // Duplicating the stack allocation size of Thread Building Block worker + // threads of the thread pool: allocate 4MB on a 64bit system, allocate 2MB + // on a 32bit system by default. + + attrs.set_stack_size((sizeof(void*) == 4) ? (2048 * 1024) : (4096 * 1024)); + return boost::thread{attrs, std::forward(fn)}; +} + +template inline boost::thread create_thread(Fn &&fn) +{ + boost::thread::attributes attrs; + return create_thread(attrs, std::forward(fn)); +} + +} + +#endif // GUI_THREAD_HPP diff --git a/src/libslic3r/TriangleSelector.cpp b/src/libslic3r/TriangleSelector.cpp index 1462b1a764..c69ab6d9af 100644 --- a/src/libslic3r/TriangleSelector.cpp +++ b/src/libslic3r/TriangleSelector.cpp @@ -34,16 +34,15 @@ void TriangleSelector::Triangle::set_division(int sides_to_split, int special_si void TriangleSelector::select_patch(const Vec3f& hit, int facet_start, - const Vec3f& source, const Vec3f& dir, - float radius, CursorType cursor_type, - EnforcerBlockerType new_state) + const Vec3f& source, float radius, + CursorType cursor_type, EnforcerBlockerType new_state, + const Transform3d& trafo) { assert(facet_start < m_orig_size_indices); - assert(is_approx(dir.norm(), 1.f)); - // Save current cursor center, squared radius and camera direction, - // so we don't have to pass it around. - m_cursor = {hit, source, dir, radius*radius, cursor_type}; + // Save current cursor center, squared radius and camera direction, so we don't + // have to pass it around. + m_cursor = Cursor(hit, source, radius, cursor_type, trafo); // In case user changed cursor size since last time, update triangle edge limit. if (m_old_cursor_radius != radius) { @@ -176,10 +175,24 @@ void TriangleSelector::split_triangle(int facet_idx) const double limit_squared = m_edge_limit_sqr; std::array& facet = tr->verts_idxs; - const stl_vertex* pts[3] = { &m_vertices[facet[0]].v, &m_vertices[facet[1]].v, &m_vertices[facet[2]].v}; - double sides[3] = { (*pts[2]-*pts[1]).squaredNorm(), - (*pts[0]-*pts[2]).squaredNorm(), - (*pts[1]-*pts[0]).squaredNorm() }; + std::array pts = { &m_vertices[facet[0]].v, + &m_vertices[facet[1]].v, + &m_vertices[facet[2]].v}; + std::array pts_transformed; // must stay in scope of pts !!! + + // In case the object is non-uniformly scaled, transform the + // points to world coords. + if (! m_cursor.uniform_scaling) { + for (size_t i=0; i sides; + sides = { (*pts[2]-*pts[1]).squaredNorm(), + (*pts[0]-*pts[2]).squaredNorm(), + (*pts[1]-*pts[0]).squaredNorm() }; std::vector sides_to_split; int side_to_keep = -1; @@ -204,38 +217,14 @@ void TriangleSelector::split_triangle(int facet_idx) } -// Calculate distance of a point from a line. -bool TriangleSelector::is_point_inside_cursor(const Vec3f& point) const -{ - Vec3f diff = m_cursor.center - point; - - if (m_cursor.type == CIRCLE) - return (diff - diff.dot(m_cursor.dir) * m_cursor.dir).squaredNorm() < m_cursor.radius_sqr; - else // SPHERE - return diff.squaredNorm() < m_cursor.radius_sqr; -} - // Is pointer in a triangle? bool TriangleSelector::is_pointer_in_triangle(int facet_idx) const { - auto signed_volume_sign = [](const Vec3f& a, const Vec3f& b, - const Vec3f& c, const Vec3f& d) -> bool { - return ((b-a).cross(c-a)).dot(d-a) > 0.; - }; - const Vec3f& p1 = m_vertices[m_triangles[facet_idx].verts_idxs[0]].v; const Vec3f& p2 = m_vertices[m_triangles[facet_idx].verts_idxs[1]].v; const Vec3f& p3 = m_vertices[m_triangles[facet_idx].verts_idxs[2]].v; - const Vec3f& q1 = m_cursor.center + m_cursor.dir; - const Vec3f q2 = m_cursor.center - m_cursor.dir; - - if (signed_volume_sign(q1,p1,p2,p3) != signed_volume_sign(q2,p1,p2,p3)) { - bool pos = signed_volume_sign(q1,q2,p1,p2); - if (signed_volume_sign(q1,q2,p2,p3) == pos && signed_volume_sign(q1,q2,p3,p1) == pos) - return true; - } - return false; + return m_cursor.is_pointer_in_triangle(p1, p2, p3); } @@ -245,7 +234,13 @@ bool TriangleSelector::faces_camera(int facet) const { assert(facet < m_orig_size_indices); // The normal is cached in mesh->stl, use it. - return (m_mesh->stl.facet_start[facet].normal.dot(m_cursor.dir) < 0.); + Vec3f normal = m_mesh->stl.facet_start[facet].normal; + + if (! m_cursor.uniform_scaling) { + // Transform the normal into world coords. + normal = m_cursor.trafo_normal * normal; + } + return (normal.dot(m_cursor.dir) < 0.); } @@ -254,7 +249,7 @@ int TriangleSelector::vertices_inside(int facet_idx) const { int inside = 0; for (size_t i=0; i<3; ++i) { - if (is_point_inside_cursor(m_vertices[m_triangles[facet_idx].verts_idxs[i]].v)) + if (m_cursor.is_mesh_point_inside(m_vertices[m_triangles[facet_idx].verts_idxs[i]].v)) ++inside; } return inside; @@ -264,9 +259,12 @@ int TriangleSelector::vertices_inside(int facet_idx) const // Is edge inside cursor? bool TriangleSelector::is_edge_inside_cursor(int facet_idx) const { - Vec3f pts[3]; - for (int i=0; i<3; ++i) + std::array pts; + for (int i=0; i<3; ++i) { pts[i] = m_vertices[m_triangles[facet_idx].verts_idxs[i]].v; + if (! m_cursor.uniform_scaling) + pts[i] = m_cursor.trafo * pts[i]; + } const Vec3f& p = m_cursor.center; @@ -690,6 +688,79 @@ void TriangleSelector::deserialize(const std::map> data) } +TriangleSelector::Cursor::Cursor( + const Vec3f& center_, const Vec3f& source_, float radius_world, + CursorType type_, const Transform3d& trafo_) + : center{center_}, + source{source_}, + type{type_}, + trafo{trafo_.cast()} +{ + Vec3d sf = Geometry::Transformation(trafo_).get_scaling_factor(); + if (is_approx(sf(0), sf(1)) && is_approx(sf(1), sf(2))) { + radius_sqr = std::pow(radius_world / sf(0), 2); + uniform_scaling = true; + } + else { + // In case that the transformation is non-uniform, all checks whether + // something is inside the cursor should be done in world coords. + // First transform center, source and dir in world coords and remember + // that we did this. + center = trafo * center; + source = trafo * source; + uniform_scaling = false; + radius_sqr = radius_world * radius_world; + trafo_normal = trafo.linear().inverse().transpose(); + } + + // Calculate dir, in whatever coords is appropriate. + dir = (center - source).normalized(); +} + + +// Is a point (in mesh coords) inside a cursor? +bool TriangleSelector::Cursor::is_mesh_point_inside(Vec3f point) const +{ + if (! uniform_scaling) + point = trafo * point; + + Vec3f diff = center - point; + + if (type == CIRCLE) + return (diff - diff.dot(dir) * dir).squaredNorm() < radius_sqr; + else // SPHERE + return diff.squaredNorm() < radius_sqr; +} + + + +// p1, p2, p3 are in mesh coords! +bool TriangleSelector::Cursor::is_pointer_in_triangle(const Vec3f& p1_, + const Vec3f& p2_, + const Vec3f& p3_) const +{ + const Vec3f& q1 = center + dir; + const Vec3f& q2 = center - dir; + + auto signed_volume_sign = [](const Vec3f& a, const Vec3f& b, + const Vec3f& c, const Vec3f& d) -> bool { + return ((b-a).cross(c-a)).dot(d-a) > 0.; + }; + + // In case the object is non-uniformly scaled, do the check in world coords. + const Vec3f& p1 = uniform_scaling ? p1_ : Vec3f(trafo * p1_); + const Vec3f& p2 = uniform_scaling ? p2_ : Vec3f(trafo * p2_); + const Vec3f& p3 = uniform_scaling ? p3_ : Vec3f(trafo * p3_); + + if (signed_volume_sign(q1,p1,p2,p3) != signed_volume_sign(q2,p1,p2,p3)) { + bool pos = signed_volume_sign(q1,q2,p1,p2); + if (signed_volume_sign(q1,q2,p2,p3) == pos && signed_volume_sign(q1,q2,p3,p1) == pos) + return true; + } + return false; +} + + } // namespace Slic3r diff --git a/src/libslic3r/TriangleSelector.hpp b/src/libslic3r/TriangleSelector.hpp index 899539c8e7..6f4ca29ac4 100644 --- a/src/libslic3r/TriangleSelector.hpp +++ b/src/libslic3r/TriangleSelector.hpp @@ -32,10 +32,10 @@ public: void select_patch(const Vec3f& hit, // point where to start int facet_start, // facet that point belongs to const Vec3f& source, // camera position (mesh coords) - const Vec3f& dir, // direction of the ray (mesh coords) float radius, // radius of the cursor CursorType type, // current type of cursor - EnforcerBlockerType new_state); // enforcer or blocker? + EnforcerBlockerType new_state, // enforcer or blocker? + const Transform3d& trafo); // matrix to get from mesh to world // Get facets currently in the given state. indexed_triangle_set get_facets(EnforcerBlockerType state) const; @@ -129,11 +129,20 @@ protected: // Cache for cursor position, radius and direction. struct Cursor { + Cursor() = default; + Cursor(const Vec3f& center_, const Vec3f& source_, float radius_world, + CursorType type_, const Transform3d& trafo_); + bool is_mesh_point_inside(Vec3f pt) const; + bool is_pointer_in_triangle(const Vec3f& p1, const Vec3f& p2, const Vec3f& p3) const; + Vec3f center; Vec3f source; Vec3f dir; float radius_sqr; CursorType type; + Transform3f trafo; + Transform3f trafo_normal; + bool uniform_scaling; }; Cursor m_cursor; @@ -142,7 +151,6 @@ protected: // Private functions: bool select_triangle(int facet_idx, EnforcerBlockerType type, bool recursive_call = false); - bool is_point_inside_cursor(const Vec3f& point) const; int vertices_inside(int facet_idx) const; bool faces_camera(int facet) const; void undivide_triangle(int facet_idx); diff --git a/src/libslic3r/Utils.hpp b/src/libslic3r/Utils.hpp index 99b105a6b1..13be6d9ecb 100644 --- a/src/libslic3r/Utils.hpp +++ b/src/libslic3r/Utils.hpp @@ -7,6 +7,8 @@ #include #include +#include + #include "libslic3r.h" namespace boost { namespace filesystem { class directory_entry; }} @@ -73,11 +75,12 @@ enum CopyFileResult { FAIL_CHECK_TARGET_NOT_OPENED }; // Copy a file, adjust the access attributes, so that the target is writable. -CopyFileResult copy_file_inner(const std::string &from, const std::string &to); +CopyFileResult copy_file_inner(const std::string &from, const std::string &to, std::string& error_message); // Copy file to a temp file first, then rename it to the final file name. // If with_check is true, then the content of the copied file is compared to the content // of the source file before renaming. -extern CopyFileResult copy_file(const std::string &from, const std::string &to, const bool with_check = false); +// Additional error info is passed in error message. +extern CopyFileResult copy_file(const std::string &from, const std::string &to, std::string& error_message, const bool with_check = false); // Compares two files if identical. extern CopyFileResult check_copy(const std::string& origin, const std::string& copy); @@ -107,6 +110,12 @@ std::string string_printf(const char *format, ...); // to be placed at the top of Slic3r generated files. std::string header_slic3r_generated(); +#if ENABLE_GCODE_VIEWER +// Standard "generated by PrusaGCodeViewer version xxx timestamp xxx" header string, +// to be placed at the top of Slic3r generated files. +std::string header_gcodeviewer_generated(); +#endif // ENABLE_GCODE_VIEWER + // getpid platform wrapper extern unsigned get_current_pid(); diff --git a/src/libslic3r/libslic3r.h b/src/libslic3r/libslic3r.h index 76ff271360..a404d230dd 100644 --- a/src/libslic3r/libslic3r.h +++ b/src/libslic3r/libslic3r.h @@ -2,6 +2,9 @@ #define _libslic3r_h_ #include "libslic3r_version.h" +#define GCODEVIEWER_APP_NAME "PrusaSlicer G-code Viewer" +#define GCODEVIEWER_APP_KEY "PrusaSlicerGcodeViewer" +#define GCODEVIEWER_BUILD_ID std::string("PrusaSlicer G-code Viewer-") + std::string(SLIC3R_VERSION) + std::string("-UNKNOWN") // this needs to be included early for MSVC (listing it in Build.PL is not enough) #include diff --git a/src/libslic3r/libslic3r_version.h.in b/src/libslic3r/libslic3r_version.h.in index 90f0812aba..26a67362b7 100644 --- a/src/libslic3r/libslic3r_version.h.in +++ b/src/libslic3r/libslic3r_version.h.in @@ -6,7 +6,4 @@ #define SLIC3R_VERSION "@SLIC3R_VERSION@" #define SLIC3R_BUILD_ID "@SLIC3R_BUILD_ID@" -#define GCODEVIEWER_APP_NAME "@GCODEVIEWER_APP_NAME@" -#define GCODEVIEWER_BUILD_ID "@GCODEVIEWER_BUILD_ID@" - #endif /* __SLIC3R_VERSION_H */ diff --git a/src/libslic3r/utils.cpp b/src/libslic3r/utils.cpp index ad91e5239b..886dcf46a9 100644 --- a/src/libslic3r/utils.cpp +++ b/src/libslic3r/utils.cpp @@ -417,7 +417,7 @@ std::error_code rename_file(const std::string &from, const std::string &to) #endif } -CopyFileResult copy_file_inner(const std::string& from, const std::string& to) +CopyFileResult copy_file_inner(const std::string& from, const std::string& to, std::string& error_message) { const boost::filesystem::path source(from); const boost::filesystem::path target(to); @@ -429,20 +429,31 @@ CopyFileResult copy_file_inner(const std::string& from, const std::string& to) // the copy_file() function will fail appropriately and we don't want the permission() // calls to cause needless failures on permissionless filesystems (ie. FATs on SD cards etc.) // or when the target file doesn't exist. + + //This error code is ignored boost::system::error_code ec; + boost::filesystem::permissions(target, perms, ec); + //if (ec) + // BOOST_LOG_TRIVIAL(error) << "Copy file permisions before copy error message: " << ec.message(); + // This error code is passed up + ec.clear(); boost::filesystem::copy_file(source, target, boost::filesystem::copy_option::overwrite_if_exists, ec); if (ec) { + error_message = ec.message(); return FAIL_COPY_FILE; } + //ec.clear(); boost::filesystem::permissions(target, perms, ec); + //if (ec) + // BOOST_LOG_TRIVIAL(error) << "Copy file permisions after copy error message: " << ec.message(); return SUCCESS; } -CopyFileResult copy_file(const std::string &from, const std::string &to, const bool with_check) +CopyFileResult copy_file(const std::string &from, const std::string &to, std::string& error_message, const bool with_check) { std::string to_temp = to + ".tmp"; - CopyFileResult ret_val = copy_file_inner(from,to_temp); + CopyFileResult ret_val = copy_file_inner(from, to_temp, error_message); if(ret_val == SUCCESS) { if (with_check) @@ -604,9 +615,16 @@ std::string string_printf(const char *format, ...) std::string header_slic3r_generated() { - return std::string("generated by " SLIC3R_APP_NAME " " SLIC3R_VERSION " on " ) + Utils::utc_timestamp(); + return std::string("generated by " SLIC3R_APP_NAME " " SLIC3R_VERSION " on " ) + Utils::utc_timestamp(); } +#if ENABLE_GCODE_VIEWER +std::string header_gcodeviewer_generated() +{ + return std::string("generated by " GCODEVIEWER_APP_NAME " " SLIC3R_VERSION " on ") + Utils::utc_timestamp(); +} +#endif // ENABLE_GCODE_VIEWER + unsigned get_current_pid() { #ifdef WIN32 diff --git a/src/platform/osx/Info.plist.in b/src/platform/osx/Info.plist.in index fc4b6a8756..e922b23f56 100644 --- a/src/platform/osx/Info.plist.in +++ b/src/platform/osx/Info.plist.in @@ -103,7 +103,7 @@ CFBundleTypeName GCODE CFBundleTypeRole - Editor + Viewer LISsAppleDefaultForType LSHandlerRank diff --git a/src/platform/unix/PrusaGcodeviewer.desktop b/src/platform/unix/PrusaGcodeviewer.desktop new file mode 100644 index 0000000000..b6c419b0f3 --- /dev/null +++ b/src/platform/unix/PrusaGcodeviewer.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Name=Prusa GCode viewer +Exec=prusa-slicer --gcodeviewer %F +Icon=PrusaSlicer # TODO: change when the new icon is ready +Terminal=false +Type=Application +MimeType=text/x.gcode; +Categories=Graphics;3DGraphics; +Keywords=3D;Printing;Slicer; \ No newline at end of file diff --git a/src/platform/unix/PrusaSlicer.desktop b/src/platform/unix/PrusaSlicer.desktop new file mode 100644 index 0000000000..dae507b54a --- /dev/null +++ b/src/platform/unix/PrusaSlicer.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Name=PrusaSlicer +GenericName=3D Printing Software +Icon=PrusaSlicer +Exec=prusa-slicer %F +Terminal=false +Type=Application +MimeType=model/stl;application/vnd.ms-3mfdocument;application/prs.wavefront-obj;application/x-amf; +Categories=Graphics;3DGraphics;Engineering; +Keywords=3D;Printing;Slicer;slice;3D;printer;convert;gcode;stl;obj;amf;SLA +StartupNotify=false +StartupWMClass=prusa-slicer \ No newline at end of file diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index 1c30078102..c44b76970c 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.8) +cmake_minimum_required(VERSION 3.13) project(libslic3r_gui) include(PrecompiledHeader) @@ -73,6 +73,8 @@ set(SLIC3R_GUI_SOURCES GUI/PresetHints.hpp GUI/GUI.cpp GUI/GUI.hpp + GUI/GUI_Init.cpp + GUI/GUI_Init.hpp GUI/GUI_Preview.cpp GUI/GUI_Preview.hpp GUI/GUI_App.cpp @@ -87,6 +89,8 @@ set(SLIC3R_GUI_SOURCES GUI/Plater.hpp GUI/PresetComboBoxes.hpp GUI/PresetComboBoxes.cpp + GUI/SavePresetDialog.hpp + GUI/SavePresetDialog.cpp GUI/PhysicalPrinterDialog.hpp GUI/PhysicalPrinterDialog.cpp GUI/GUI_ObjectList.cpp @@ -107,6 +111,8 @@ set(SLIC3R_GUI_SOURCES GUI/Field.hpp GUI/OptionsGroup.cpp GUI/OptionsGroup.hpp + GUI/OG_CustomCtrl.cpp + GUI/OG_CustomCtrl.hpp GUI/BedShapeDialog.cpp GUI/BedShapeDialog.hpp GUI/2DBed.cpp @@ -189,6 +195,8 @@ set(SLIC3R_GUI_SOURCES Utils/FlashAir.hpp Utils/AstroBox.cpp Utils/AstroBox.hpp + Utils/Repetier.cpp + Utils/Repetier.hpp Utils/PrintHost.cpp Utils/PrintHost.hpp Utils/Bonjour.cpp @@ -202,7 +210,6 @@ set(SLIC3R_GUI_SOURCES Utils/UndoRedo.hpp Utils/HexFile.cpp Utils/HexFile.hpp - Utils/Thread.hpp ) if (APPLE) diff --git a/src/slic3r/Config/Snapshot.cpp b/src/slic3r/Config/Snapshot.cpp index 45dc998741..54d1dea577 100644 --- a/src/slic3r/Config/Snapshot.cpp +++ b/src/slic3r/Config/Snapshot.cpp @@ -31,8 +31,11 @@ void Snapshot::clear() this->comment.clear(); this->reason = SNAPSHOT_UNKNOWN; this->print.clear(); + this->sla_print.clear(); this->filaments.clear(); + this->sla_material.clear(); this->printer.clear(); + this->physical_printer.clear(); } void Snapshot::load_ini(const std::string &path) @@ -94,6 +97,8 @@ void Snapshot::load_ini(const std::string &path) for (auto &kvp : section.second) { if (kvp.first == "print") { this->print = kvp.second.data(); + } else if (kvp.first == "sla_print") { + this->sla_print = kvp.second.data(); } else if (boost::starts_with(kvp.first, "filament")) { int idx = 0; if (kvp.first == "filament" || sscanf(kvp.first.c_str(), "filament_%d", &idx) == 1) { @@ -101,8 +106,12 @@ void Snapshot::load_ini(const std::string &path) this->filaments.resize(idx + 1, std::string()); this->filaments[idx] = kvp.second.data(); } + } else if (kvp.first == "sla_material") { + this->sla_material = kvp.second.data(); } else if (kvp.first == "printer") { this->printer = kvp.second.data(); + } else if (kvp.first == "physical_printer") { + this->physical_printer = kvp.second.data(); } } } else if (boost::starts_with(section.first, group_name_vendor) && section.first.size() > group_name_vendor.size()) { @@ -172,10 +181,13 @@ void Snapshot::save_ini(const std::string &path) // Export the active presets at the time of the snapshot. c << std::endl << "[presets]" << std::endl; c << "print = " << this->print << std::endl; + c << "sla_print = " << this->sla_print << std::endl; c << "filament = " << this->filaments.front() << std::endl; for (size_t i = 1; i < this->filaments.size(); ++ i) c << "filament_" << std::to_string(i) << " = " << this->filaments[i] << std::endl; + c << "sla_material = " << this->sla_material << std::endl; c << "printer = " << this->printer << std::endl; + c << "physical_printer = " << this->physical_printer << std::endl; // Export the vendor configs. for (const VendorConfig &vc : this->vendor_configs) { @@ -199,14 +211,17 @@ void Snapshot::export_selections(AppConfig &config) const { assert(filaments.size() >= 1); config.clear_section("presets"); - config.set("presets", "print", print); - config.set("presets", "filament", filaments.front()); + config.set("presets", "print", print); + config.set("presets", "sla_print", sla_print); + config.set("presets", "filament", filaments.front()); for (unsigned i = 1; i < filaments.size(); ++i) { char name[64]; sprintf(name, "filament_%u", i); config.set("presets", name, filaments[i]); } - config.set("presets", "printer", printer); + config.set("presets", "sla_material", sla_material); + config.set("presets", "printer", printer); + config.set("presets", "physical_printer", physical_printer); } void Snapshot::export_vendor_configs(AppConfig &config) const @@ -217,8 +232,10 @@ void Snapshot::export_vendor_configs(AppConfig &config) const config.set_vendors(std::move(vendors)); } -// Perform a deep compare of the active print / filament / printer / vendor directories. -// Return true if the content of the current print / filament / printer / vendor directories +static constexpr auto snapshot_subdirs = { "print", "sla_print", "filament", "sla_material", "printer", "physical_printer", "vendor" }; + +// Perform a deep compare of the active print / sla_print / filament / sla_material / printer / physical_printer / vendor directories. +// Return true if the content of the current print / sla_print / filament / sla_material / printer / physical_printer / vendor directories // matches the state stored in this snapshot. bool Snapshot::equal_to_active(const AppConfig &app_config) const { @@ -243,7 +260,7 @@ bool Snapshot::equal_to_active(const AppConfig &app_config) const // 2) Check, whether this snapshot references the same set of ini files as the current state. boost::filesystem::path data_dir = boost::filesystem::path(Slic3r::data_dir()); boost::filesystem::path snapshot_dir = boost::filesystem::path(Slic3r::data_dir()) / SLIC3R_SNAPSHOTS_DIR / this->id; - for (const char *subdir : { "print", "filament", "printer", "vendor" }) { + for (const char *subdir : snapshot_subdirs) { boost::filesystem::path path1 = data_dir / subdir; boost::filesystem::path path2 = snapshot_dir / subdir; std::vector files1, files2; @@ -369,9 +386,12 @@ const Snapshot& SnapshotDB::take_snapshot(const AppConfig &app_config, Snapshot: snapshot.comment = comment; snapshot.reason = reason; // Active presets at the time of the snapshot. - snapshot.print = app_config.get("presets", "print"); + snapshot.print = app_config.get("presets", "print"); + snapshot.sla_print = app_config.get("presets", "sla_print"); snapshot.filaments.emplace_back(app_config.get("presets", "filament")); - snapshot.printer = app_config.get("presets", "printer"); + snapshot.sla_material = app_config.get("presets", "sla_material"); + snapshot.printer = app_config.get("presets", "printer"); + snapshot.physical_printer = app_config.get("presets", "physical_printer"); for (unsigned i = 1; i < 1000; ++ i) { char name[64]; sprintf(name, "filament_%u", i); @@ -414,7 +434,7 @@ const Snapshot& SnapshotDB::take_snapshot(const AppConfig &app_config, Snapshot: boost::filesystem::create_directory(snapshot_dir); // Backup the presets. - for (const char *subdir : { "print", "filament", "printer", "vendor" }) + for (const char *subdir : snapshot_subdirs) copy_config_dir_single_level(data_dir / subdir, snapshot_dir / subdir); snapshot.save_ini((snapshot_dir / "snapshot.ini").string()); assert(m_snapshots.empty() || m_snapshots.back().time_captured <= snapshot.time_captured); @@ -438,11 +458,11 @@ void SnapshotDB::restore_snapshot(const Snapshot &snapshot, AppConfig &app_confi boost::filesystem::path snapshot_db_dir = SnapshotDB::create_db_dir(); boost::filesystem::path snapshot_dir = snapshot_db_dir / snapshot.id; // Remove existing ini files and restore the ini files from the snapshot. - for (const char *subdir : { "print", "filament", "printer", "vendor" }) { + for (const char *subdir : snapshot_subdirs) { delete_existing_ini_files(data_dir / subdir); copy_config_dir_single_level(snapshot_dir / subdir, data_dir / subdir); } - // Update AppConfig with the selections of the print / filament / printer profiles + // Update AppConfig with the selections of the print / sla_print / filament / sla_material / printer profiles // and about the installed printer types and variants. snapshot.export_selections(app_config); snapshot.export_vendor_configs(app_config); diff --git a/src/slic3r/Config/Snapshot.hpp b/src/slic3r/Config/Snapshot.hpp index c6bd5c6e87..48add8a1ad 100644 --- a/src/slic3r/Config/Snapshot.hpp +++ b/src/slic3r/Config/Snapshot.hpp @@ -23,8 +23,11 @@ namespace Config { // Slic3r.ini // vendor/ // print/ +// sla_print/ // filament/ +// sla_material // printer/ +// physical_printer/ class Snapshot { public: @@ -42,12 +45,12 @@ public: void load_ini(const std::string &path); void save_ini(const std::string &path); - // Export the print / filament / printer selections to be activated into the AppConfig. + // Export the print / sla_print / filament / sla_material / printer selections to be activated into the AppConfig. void export_selections(AppConfig &config) const; void export_vendor_configs(AppConfig &config) const; - // Perform a deep compare of the active print / filament / printer / vendor directories. - // Return true if the content of the current print / filament / printer / vendor directories + // Perform a deep compare of the active print / sla_print / filament / sla_material / printer / physical_printer / vendor directories. + // Return true if the content of the current print / sla_print / filament / sla_material / printer / physical_printer / vendor directories // matches the state stored in this snapshot. bool equal_to_active(const AppConfig &app_config) const; @@ -65,8 +68,11 @@ public: // Active presets at the time of the snapshot. std::string print; + std::string sla_print; std::vector filaments; + std::string sla_material; std::string printer; + std::string physical_printer; // Annotation of the vendor configuration stored in the snapshot. // This information is displayed to the user and used to decide compatibility @@ -97,7 +103,7 @@ public: size_t load_db(); void update_slic3r_versions(std::vector &index_db); - // Create a snapshot directory, copy the vendor config bundles, user print/filament/printer profiles, + // Create a snapshot directory, copy the vendor config bundles, user print / sla_print / filament / sla_material / printer / physical_printer profiles, // create an index. const Snapshot& take_snapshot(const AppConfig &app_config, Snapshot::Reason reason, const std::string &comment = ""); const Snapshot& restore_snapshot(const std::string &id, AppConfig &app_config); diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index 84a5e4d2fc..fc285e3356 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -506,24 +506,6 @@ void GLVolume::render() const glFrontFace(GL_CCW); } -#if !ENABLE_SLOPE_RENDERING -void GLVolume::render(int color_id, int detection_id, int worldmatrix_id) const -{ - if (color_id >= 0) - glsafe(::glUniform4fv(color_id, 1, (const GLfloat*)render_color)); - else - glsafe(::glColor4fv(render_color)); - - if (detection_id != -1) - glsafe(::glUniform1i(detection_id, shader_outside_printer_detection_enabled ? 1 : 0)); - - if (worldmatrix_id != -1) - glsafe(::glUniformMatrix4fv(worldmatrix_id, 1, GL_FALSE, (const GLfloat*)world_matrix().cast().data())); - - render(); -} -#endif // !ENABLE_SLOPE_RENDERING - bool GLVolume::is_sla_support() const { return this->composite_id.volume_id == -int(slaposSupportTree); } bool GLVolume::is_sla_pad() const { return this->composite_id.volume_id == -int(slaposPad); } @@ -775,9 +757,7 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab shader->set_uniform("print_box.max", m_print_box_max, 3); shader->set_uniform("z_range", m_z_range, 2); shader->set_uniform("clipping_plane", m_clipping_plane, 4); -#if ENABLE_SLOPE_RENDERING - shader->set_uniform("slope.z_range", m_slope.z_range); -#endif // ENABLE_SLOPE_RENDERING + shader->set_uniform("slope.normal_z", m_slope.normal_z); #if ENABLE_ENVIRONMENT_MAP unsigned int environment_texture_id = GUI::wxGetApp().plater()->get_environment_texture_id(); @@ -791,7 +771,6 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab GLVolumeWithIdAndZList to_render = volumes_to_render(this->volumes, type, view_matrix, filter_func); for (GLVolumeWithIdAndZ& volume : to_render) { volume.first->set_render_color(); -#if ENABLE_SLOPE_RENDERING shader->set_uniform("uniform_color", volume.first->render_color, 4); shader->set_uniform("print_box.actived", volume.first->shader_outside_printer_detection_enabled); shader->set_uniform("print_box.volume_world_matrix", volume.first->world_matrix()); @@ -799,9 +778,6 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab shader->set_uniform("slope.volume_world_normal_matrix", static_cast(volume.first->world_matrix().matrix().block(0, 0, 3, 3).inverse().transpose().cast())); volume.first->render(); -#else - volume.first->render(color_id, print_box_detection_id, print_box_worldmatrix_id); -#endif // ENABLE_SLOPE_RENDERING } #if ENABLE_ENVIRONMENT_MAP @@ -2020,12 +1996,8 @@ void GLModel::render() const glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); -#if ENABLE_SLOPE_RENDERING shader->set_uniform("uniform_color", m_volume.render_color, 4); m_volume.render(); -#else - m_volume.render(color_id, -1, -1); -#endif // ENABLE_SLOPE_RENDERING glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); diff --git a/src/slic3r/GUI/3DScene.hpp b/src/slic3r/GUI/3DScene.hpp index 31e974be15..a6362dadc6 100644 --- a/src/slic3r/GUI/3DScene.hpp +++ b/src/slic3r/GUI/3DScene.hpp @@ -447,9 +447,6 @@ public: void set_range(double low, double high); void render() const; -#if !ENABLE_SLOPE_RENDERING - void render(int color_id, int detection_id, int worldmatrix_id) const; -#endif // !ENABLE_SLOPE_RENDERING void finalize_geometry(bool opengl_initialized) { this->indexed_vertex_array.finalize_geometry(opengl_initialized); } void release_geometry() { this->indexed_vertex_array.release_geometry(); } @@ -494,26 +491,19 @@ private: // plane coeffs for clipping in shaders float m_clipping_plane[4]; -#if ENABLE_SLOPE_RENDERING struct Slope { // toggle for slope rendering bool active{ false }; - // [0] = yellow, [1] = red - std::array z_range; + float normal_z; }; Slope m_slope; -#endif // ENABLE_SLOPE_RENDERING public: GLVolumePtrs volumes; -#if ENABLE_SLOPE_RENDERING - GLVolumeCollection() { set_default_slope_z_range(); } -#else - GLVolumeCollection() = default; -#endif // ENABLE_SLOPE_RENDERING + GLVolumeCollection() { set_default_slope_normal_z(); } ~GLVolumeCollection() { clear(); } std::vector load_object( @@ -572,14 +562,12 @@ public: void set_z_range(float min_z, float max_z) { m_z_range[0] = min_z; m_z_range[1] = max_z; } void set_clipping_plane(const double* coeffs) { m_clipping_plane[0] = coeffs[0]; m_clipping_plane[1] = coeffs[1]; m_clipping_plane[2] = coeffs[2]; m_clipping_plane[3] = coeffs[3]; } -#if ENABLE_SLOPE_RENDERING bool is_slope_active() const { return m_slope.active; } void set_slope_active(bool active) { m_slope.active = active; } - const std::array& get_slope_z_range() const { return m_slope.z_range; } - void set_slope_z_range(const std::array& range) { m_slope.z_range = range; } - void set_default_slope_z_range() { m_slope.z_range = { -::cos(Geometry::deg2rad(90.0f - 45.0f)), -::cos(Geometry::deg2rad(90.0f - 70.0f)) }; } -#endif // ENABLE_SLOPE_RENDERING + float get_slope_normal_z() const { return m_slope.normal_z; } + void set_slope_normal_z(float normal_z) { m_slope.normal_z = normal_z; } + void set_default_slope_normal_z() { m_slope.normal_z = -::cos(Geometry::deg2rad(90.0f - 45.0f)); } // returns true if all the volumes are completely contained in the print volume // returns the containment state in the given out_state, if non-null diff --git a/src/slic3r/GUI/BackgroundSlicingProcess.cpp b/src/slic3r/GUI/BackgroundSlicingProcess.cpp index 605a98eea0..36187f81ec 100644 --- a/src/slic3r/GUI/BackgroundSlicingProcess.cpp +++ b/src/slic3r/GUI/BackgroundSlicingProcess.cpp @@ -23,6 +23,7 @@ #include "libslic3r/GCode/PreviewData.hpp" #endif // !ENABLE_GCODE_VIEWER #include "libslic3r/Format/SL1.hpp" +#include "libslic3r/Thread.hpp" #include "libslic3r/libslic3r.h" #include @@ -36,7 +37,6 @@ #include "I18N.hpp" #include "RemovableDriveManager.hpp" -#include "slic3r/Utils/Thread.hpp" #include "slic3r/GUI/Plater.hpp" namespace Slic3r { @@ -45,7 +45,7 @@ bool SlicingProcessCompletedEvent::critical_error() const { try { this->rethrow_exception(); - } catch (const Slic3r::SlicingError &ex) { + } catch (const Slic3r::SlicingError &) { // Exception derived from SlicingError is non-critical. return false; } catch (...) { @@ -122,7 +122,9 @@ void BackgroundSlicingProcess::process_fff() assert(m_print == m_fff_print); m_print->process(); wxCommandEvent evt(m_event_slicing_completed_id); - evt.SetInt((int)(m_fff_print->step_state_with_timestamp(PrintStep::psBrim).timestamp)); + // Post the Slicing Finished message for the G-code viewer to update. + // Passing the timestamp + evt.SetInt((int)(m_fff_print->step_state_with_timestamp(PrintStep::psSlicingFinished).timestamp)); wxQueueEvent(GUI::wxGetApp().mainframe->m_plater, evt.Clone()); #if ENABLE_GCODE_VIEWER m_fff_print->export_gcode(m_temp_output_path, m_gcode_result, m_thumbnail_cb); @@ -135,11 +137,12 @@ void BackgroundSlicingProcess::process_fff() //FIXME localize the messages // Perform the final post-processing of the export path by applying the print statistics over the file name. std::string export_path = m_fff_print->print_statistics().finalize_output_path(m_export_path); - int copy_ret_val = copy_file(m_temp_output_path, export_path, m_export_path_on_removable_media); + std::string error_message; + int copy_ret_val = copy_file(m_temp_output_path, export_path, error_message, m_export_path_on_removable_media); switch (copy_ret_val) { case SUCCESS: break; // no error case FAIL_COPY_FILE: - throw Slic3r::RuntimeError(_utf8(L("Copying of the temporary G-code to the output G-code failed. Maybe the SD card is write locked?"))); + throw Slic3r::RuntimeError((boost::format(_utf8(L("Copying of the temporary G-code to the output G-code failed. Maybe the SD card is write locked?\nError message: %1%"))) % error_message).str()); break; case FAIL_FILES_DIFFERENT: throw Slic3r::RuntimeError((boost::format(_utf8(L("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."))) % export_path).str()); @@ -154,7 +157,8 @@ void BackgroundSlicingProcess::process_fff() throw Slic3r::RuntimeError((boost::format(_utf8(L("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."))) % export_path).str()); break; default: - BOOST_LOG_TRIVIAL(warning) << "Unexpected fail code(" << (int)copy_ret_val << ") durring copy_file() to " << export_path << "."; + throw Slic3r::RuntimeError(_utf8(L("Unknown error occured during exporting G-code."))); + BOOST_LOG_TRIVIAL(error) << "Unexpected fail code(" << (int)copy_ret_val << ") durring copy_file() to " << export_path << "."; break; } @@ -222,6 +226,9 @@ void BackgroundSlicingProcess::process_sla() void BackgroundSlicingProcess::thread_proc() { + set_current_thread_name("slic3r_BgSlcPcs"); + name_tbb_thread_pool_threads(); + assert(m_print != nullptr); assert(m_print == m_fff_print || m_print == m_sla_print); std::unique_lock lck(m_mutex); @@ -516,7 +523,8 @@ void BackgroundSlicingProcess::prepare_upload() if (m_print == m_fff_print) { m_print->set_status(95, _utf8(L("Running post-processing scripts"))); - if (copy_file(m_temp_output_path, source_path.string()) != SUCCESS) { + std::string error_message; + if (copy_file(m_temp_output_path, source_path.string(), error_message) != SUCCESS) { throw Slic3r::RuntimeError(_utf8(L("Copying of the temporary G-code to the output G-code failed"))); } run_post_process_scripts(source_path.string(), m_fff_print->config()); diff --git a/src/slic3r/GUI/Camera.cpp b/src/slic3r/GUI/Camera.cpp index 3bd22590f5..1e589f1a15 100644 --- a/src/slic3r/GUI/Camera.cpp +++ b/src/slic3r/GUI/Camera.cpp @@ -32,15 +32,6 @@ double Camera::MaxFovDeg = 60.0; Camera::Camera() : requires_zoom_to_bed(false) - , m_type(Perspective) - , m_target(Vec3d::Zero()) - , m_zenit(45.0f) - , m_zoom(1.0) - , m_distance(DefaultDistance) - , m_gui_scale(1.0) - , m_view_matrix(Transform3d::Identity()) - , m_view_rotation(1., 0., 0., 0.) - , m_projection_matrix(Transform3d::Identity()) { set_default_orientation(); } @@ -58,11 +49,12 @@ std::string Camera::get_type_as_string() const void Camera::set_type(EType type) { - if (m_type != type) - { + if (m_type != type) { m_type = type; - wxGetApp().app_config->set("use_perspective_camera", (m_type == Perspective) ? "1" : "0"); - wxGetApp().app_config->save(); + if (m_update_config_on_type_change_enabled) { + wxGetApp().app_config->set("use_perspective_camera", (m_type == Perspective) ? "1" : "0"); + wxGetApp().app_config->save(); + } } } diff --git a/src/slic3r/GUI/Camera.hpp b/src/slic3r/GUI/Camera.hpp index 6e42562351..99b6f05d49 100644 --- a/src/slic3r/GUI/Camera.hpp +++ b/src/slic3r/GUI/Camera.hpp @@ -29,19 +29,20 @@ struct Camera bool requires_zoom_to_bed; private: - EType m_type; - Vec3d m_target; - float m_zenit; - double m_zoom; + EType m_type{ Perspective }; + bool m_update_config_on_type_change_enabled{ false }; + Vec3d m_target{ Vec3d::Zero() }; + float m_zenit{ 45.0f }; + double m_zoom{ 1.0 }; // Distance between camera position and camera target measured along the camera Z axis - mutable double m_distance; - mutable double m_gui_scale; + mutable double m_distance{ DefaultDistance }; + mutable double m_gui_scale{ 1.0 }; mutable std::array m_viewport; - mutable Transform3d m_view_matrix; + mutable Transform3d m_view_matrix{ Transform3d::Identity() }; // We are calculating the rotation part of the m_view_matrix from m_view_rotation. - mutable Eigen::Quaterniond m_view_rotation; - mutable Transform3d m_projection_matrix; + mutable Eigen::Quaterniond m_view_rotation{ 1.0, 0.0, 0.0, 0.0 }; + mutable Transform3d m_projection_matrix{ Transform3d::Identity() }; mutable std::pair m_frustrum_zs; BoundingBoxf3 m_scene_box; @@ -56,6 +57,8 @@ public: void set_type(const std::string& type); void select_next_type(); + void enable_update_config_on_type_change(bool enable) { m_update_config_on_type_change_enabled = enable; } + const Vec3d& get_target() const { return m_target; } void set_target(const Vec3d& target); diff --git a/src/slic3r/GUI/ConfigSnapshotDialog.cpp b/src/slic3r/GUI/ConfigSnapshotDialog.cpp index 48b5a2b007..5a9a2306c9 100644 --- a/src/slic3r/GUI/ConfigSnapshotDialog.cpp +++ b/src/slic3r/GUI/ConfigSnapshotDialog.cpp @@ -48,9 +48,17 @@ static wxString generate_html_row(const Config::Snapshot &snapshot, bool row_eve text += "
"; // End of row header. text += _(L("PrusaSlicer version")) + ": " + snapshot.slic3r_version_captured.to_string() + "
"; - text += _(L("print")) + ": " + snapshot.print + "
"; - text += _(L("filaments")) + ": " + snapshot.filaments.front() + "
"; - text += _(L("printer")) + ": " + snapshot.printer + "
"; + bool has_fff = ! snapshot.print.empty() || ! snapshot.filaments.empty(); + bool has_sla = ! snapshot.sla_print.empty() || ! snapshot.sla_material.empty(); + if (has_fff || ! has_sla) { + text += _(L("print")) + ": " + snapshot.print + "
"; + text += _(L("filaments")) + ": " + snapshot.filaments.front() + "
"; + } + if (has_sla) { + text += _(L("SLA print")) + ": " + snapshot.sla_print + "
"; + text += _(L("SLA material")) + ": " + snapshot.sla_material + "
"; + } + text += _(L("printer")) + ": " + (snapshot.physical_printer.empty() ? snapshot.printer : snapshot.physical_printer) + "
"; bool compatible = true; for (const Config::Snapshot::VendorConfig &vc : snapshot.vendor_configs) { diff --git a/src/slic3r/GUI/ConfigWizard.cpp b/src/slic3r/GUI/ConfigWizard.cpp index cfc81f5a7d..cd944f6890 100644 --- a/src/slic3r/GUI/ConfigWizard.cpp +++ b/src/slic3r/GUI/ConfigWizard.cpp @@ -647,7 +647,6 @@ void PageMaterials::on_mouse_move_on_profiles(wxMouseEvent& evt) const wxClientDC dc(list_profile); const wxPoint pos = evt.GetLogicalPosition(dc); int item = list_profile->HitTest(pos); - //BOOST_LOG_TRIVIAL(debug) << "hit test: " << item; on_material_hovered(item); } void PageMaterials::on_mouse_enter_profiles(wxMouseEvent& evt) @@ -661,7 +660,7 @@ void PageMaterials::reload_presets() clear(); list_printer->append(_(L("(All)")), &EMPTY); - list_printer->SetLabelMarkup("bald"); + //list_printer->SetLabelMarkup("bald"); for (const Preset* printer : materials->printers) { list_printer->append(printer->name, &printer->name); } @@ -680,7 +679,6 @@ void PageMaterials::reload_presets() void PageMaterials::set_compatible_printers_html_window(const std::vector& printer_names, bool all_printers) { - //Slic3r::GUI::wxGetApp().dark_mode() const auto bgr_clr = #if defined(__APPLE__) wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW); @@ -690,9 +688,10 @@ void PageMaterials::set_compatible_printers_html_window(const std::vector* are not compatible with some installed printers.")); wxString text; if (all_printers) { + wxString second_line = _(L("All installed printers are compatible with the selected filament.")); text = wxString::Format( "" "