diff --git a/.clang-format b/.clang-format index 42ac9f1a07..6376be4d75 100644 --- a/.clang-format +++ b/.clang-format @@ -95,7 +95,7 @@ PenaltyBreakString: 600 PenaltyBreakTemplateDeclaration: 10 PenaltyExcessCharacter: 50 PenaltyReturnTypeOnItsOwnLine: 300 -PointerAlignment: Right +PointerAlignment: Left ReflowComments: true SortIncludes: false SortUsingDeclarations: false diff --git a/.github/workflows/build_orca.yml b/.github/workflows/build_orca.yml index 713d70d89d..3091966e97 100644 --- a/.github/workflows/build_orca.yml +++ b/.github/workflows/build_orca.yml @@ -58,7 +58,7 @@ jobs: if ($versionContent -match 'set\(SoftFever_VERSION "(.*?)"\)') { $ver = $matches[1] } - ver = "V$ver" + $ver = "V$ver" } echo "ver=$ver" | Out-File -Append -FilePath $env:GITHUB_ENV -Encoding utf8 @@ -88,7 +88,7 @@ jobs: # Thanks to RaySajuuk, it's working now - name: Sign app and notary - if: github.ref == 'refs/heads/main' && inputs.os == 'macos-12' + if: (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release/')) && inputs.os == 'macos-12' working-directory: ${{ github.workspace }} env: BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }} @@ -215,4 +215,4 @@ jobs: uses: actions/upload-artifact@v3 with: name: OrcaSlicer_Linux_${{ env.ver }} - path: './build/OrcaSlicer_ubu64.AppImage' \ No newline at end of file + path: './build/OrcaSlicer_ubu64.AppImage' diff --git a/README.md b/README.md index 1034c388a4..7399b37e40 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ You can download Orca Slicer here: [github releases page](https://github.com/Sof # Main features - Auto calibrations for all printers - Sandwich(inner-outer-inner) mode - an improved version of the `External perimeters first` mode -- Precise wall +- [Precise wall](https://github.com/SoftFever/OrcaSlicer/wiki/Precise-wall) - Polyholes conversion support [SuperSlicer Wiki: Polyholes](https://github.com/supermerill/SuperSlicer/wiki/Polyholes) - Klipper support - More granular controls @@ -57,7 +57,7 @@ Orca Slicer's logo is designed by community member Justin Levine(@freejstnalxndr - Run `build_release.bat` in `x64 Native Tools Command Prompt for VS 2019` - Mac 64-bit - - Tools needed: Xcode, Cmake, git, gettext + - Tools needed: Xcode, Cmake, git, gettext, libtool, automake, autoconf - run `build_release_macos.sh` - Ubuntu diff --git a/deps/CGAL/CGAL.cmake b/deps/CGAL/CGAL.cmake index 39514e465d..18fee7c15e 100644 --- a/deps/CGAL/CGAL.cmake +++ b/deps/CGAL/CGAL.cmake @@ -1,31 +1,11 @@ orcaslicer_add_cmake_project( CGAL - GIT_REPOSITORY https://github.com/CGAL/cgal.git - GIT_TAG caacd806dc55c61cc68adaad99f2240f00493b29 # releases/CGAL-5.3 + # GIT_REPOSITORY https://github.com/CGAL/cgal.git + # GIT_TAG bec70a6d52d8aacb0b3d82a7b4edc3caa899184b # releases/CGAL-5.0 # For whatever reason, this keeps downloading forever (repeats downloads if finished) - #URL https://github.com/CGAL/cgal/archive/releases/CGAL-5.0.zip - #URL_HASH SHA256=c2b035bd078687b6d8c0fb6371a7443adcdb647856af9969532c4050cd5f48e5 + URL https://github.com/CGAL/cgal/archive/refs/tags/v5.4.zip + URL_HASH SHA256=d7605e0a5a5ca17da7547592f6f6e4a59430a0bc861948974254d0de43eab4c0 DEPENDS dep_Boost dep_GMP dep_MPFR ) include(GNUInstallDirs) - -# CGAL, for whatever reason, makes itself non-relocatable by writing the build directory into -# CGALConfig-installation-dirs.cmake and including it in configure time. -# 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/CMakeLists.txt b/deps/CMakeLists.txt index f07cfacba9..192552a6a3 100644 --- a/deps/CMakeLists.txt +++ b/deps/CMakeLists.txt @@ -32,7 +32,7 @@ if (NPROC EQUAL 0) endif () set(DESTDIR "${CMAKE_CURRENT_BINARY_DIR}/destdir" CACHE PATH "Destination directory") -set(DEP_DOWNLOAD_DIR ${CMAKE_CURRENT_BINARY_DIR} CACHE PATH "Path for downloaded source packages.") +set(DEP_DOWNLOAD_DIR ${CMAKE_CURRENT_BINARY_DIR}/DL_CACHE CACHE PATH "Path for downloaded source packages.") option(DEP_DEBUG "Build debug variants (only applicable on Windows)" OFF) diff --git a/deps/Cereal/Cereal.cmake b/deps/Cereal/Cereal.cmake index 6f4c9a1d92..7f87121f55 100644 --- a/deps/Cereal/Cereal.cmake +++ b/deps/Cereal/Cereal.cmake @@ -1,6 +1,12 @@ +#/|/ Copyright (c) Prusa Research 2021 - 2022 Tomáš Mészáros @tamasmeszaros, Filip Sykala @Jony01 +#/|/ +#/|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +#/|/ orcaslicer_add_cmake_project(Cereal - URL "https://github.com/USCiLab/cereal/archive/v1.2.2.tar.gz" - URL_HASH SHA256=1921f26d2e1daf9132da3c432e2fd02093ecaedf846e65d7679ddf868c7289c4 + URL "https://github.com/USCiLab/cereal/archive/refs/tags/v1.3.0.zip" + URL_HASH SHA256=71642cb54658e98c8f07a0f0d08bf9766f1c3771496936f6014169d3726d9657 CMAKE_ARGS - -DJUST_INSTALL_CEREAL=on + -DJUST_INSTALL_CEREAL=ON + -DSKIP_PERFORMANCE_COMPARISON=ON + -DBUILD_TESTS=OFF ) \ No newline at end of file diff --git a/deps/NanoSVG/NanoSVG.cmake b/deps/NanoSVG/NanoSVG.cmake index f02893efc9..5c833e3249 100644 --- a/deps/NanoSVG/NanoSVG.cmake +++ b/deps/NanoSVG/NanoSVG.cmake @@ -4,6 +4,7 @@ # AMD Radeon graphics cards orcaslicer_add_cmake_project(NanoSVG - URL https://github.com/fltk/nanosvg/archive/abcd277ea45e9098bed752cf9c6875b533c0892f.zip - URL_HASH SHA256=e859938fbaee4b351bd8a8b3d3c7a75b40c36885ce00b73faa1ce0b98aa0ad34 + DEPENDS dep_Boost + URL https://github.com/SoftFever/nanosvg/archive/863f6aa97ef62028126fa2c19bd4350394c2e15e.zip + URL_HASH SHA256=8d9c1624ad6518dd6dfa31e4f8dc7da9ec243d88bae595c7a037450617fec851 ) \ No newline at end of file diff --git a/deps/OpenSSL/OpenSSL.cmake b/deps/OpenSSL/OpenSSL.cmake index 3dc103698e..0adbaab43e 100644 --- a/deps/OpenSSL/OpenSSL.cmake +++ b/deps/OpenSSL/OpenSSL.cmake @@ -19,7 +19,7 @@ if(WIN32) set(_install_cmd nmake install_sw ) else() if(APPLE) - set(_conf_cmd export MACOSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET} && ./Configure ) + set(_conf_cmd export MACOSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET} && ./Configure -mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}) else() set(_conf_cmd "./config") endif() diff --git a/doc/Auxiliary-fan.md b/doc/Auxiliary-fan.md index 25e601d640..f2ae9ed89f 100644 --- a/doc/Auxiliary-fan.md +++ b/doc/Auxiliary-fan.md @@ -29,7 +29,7 @@ hardware_pwm: false [gcode_macro M106] gcode: {% set fan = 'fan' + (params.P|int if params.P is defined else 0)|string %} - {% set speed = (params.S|int if params.S is defined else 255) %} + {% set speed = (params.S|float / 255 if params.S is defined else 1.0) %} SET_FAN_SPEED FAN={fan} SPEED={speed} ``` diff --git a/doc/Precise-wall.md b/doc/Precise-wall.md new file mode 100644 index 0000000000..5e8bd9329c --- /dev/null +++ b/doc/Precise-wall.md @@ -0,0 +1,13 @@ +The 'Precise Wall' is a distinctive feature introduced by OrcaSlicer, aimed at improving the dimensional accuracy of prints and minimizing layer inconsistencies by slightly increasing the spacing between the outer wall and the inner wall. + +Below is a technical explanation of how this feature works. +First, it's important to understand some basic concepts like flow, extrusion width, and space. Slic3r has an excellent document that covers these topics in detail. You can refer to this article: [link to article](https://manual.slic3r.org/advanced/flow-math). + +Now, let's dive into the specifics. Slic3r and its forks, such as PrusaSlicer, SuperSlicer, and OrcaSlicer, assume that the extrusion path has an oval shape, which accounts for the overlaps. For example, if we set the wall width to 0.4mm and the layer height to 0.2mm, the combined thickness of two walls laid side by side is 0.714mm instead of 0.8mm due to the overlapping. +![image](./images/precise_wall.png) +This approach enhances the strength of 3D-printed parts. However, it does have some side effects. For instance, when the inner-outer wall order is used, the outer wall can be pushed outside, leading to potential size inaccuracy and more layer inconsistency. + +It's important to keep in mind that this approach to handling flow is specific to Slic3r and it's forks. Other slicing software, such as Cura, assumes that the extrusion path is rectangular and, therefore, does not include overlapping. Two 0.4 mm walls will result in a 0.8 mm shell thickness in Cura + +OrcaSlicer adheres to Slic3r's approach to handling flow. To address the downsides mentioned earlier, OrcaSlicer introduced the 'Precise Wall' feature. When this feature is enabled in OrcaSlicer, the overlap between the outer wall and its adjacent inner wall is set to zero. This ensures that the overall strength of the printed part is unaffected, while the size accuracy and layer consistency are improved. + diff --git a/doc/Print-settings.md b/doc/Print-settings.md index 128c990aca..5c31ca4eb9 100644 --- a/doc/Print-settings.md +++ b/doc/Print-settings.md @@ -4,4 +4,5 @@ Print settings: * [Axiliary fan](auxiliary-fan) * [Chamber temperature](chamber-temperature) * [Air filtration/Exhaust fan](air-filtration) -* [Single Extruder Multimaterial](semm) \ No newline at end of file +* [Single Extruder Multimaterial](semm) +* [Precise wall](Precise-wall) \ No newline at end of file diff --git a/doc/air-filtration.md b/doc/air-filtration.md index 88eee29b2e..1822ae4ecf 100644 --- a/doc/air-filtration.md +++ b/doc/air-filtration.md @@ -29,7 +29,7 @@ hardware_pwm: false [gcode_macro M106] gcode: {% set fan = 'fan' + (params.P|int if params.P is defined else 0)|string %} - {% set speed = (params.S|int if params.S is defined else 255) %} + {% set speed = (params.S|float / 255 if params.S is defined else 1.0) %} SET_FAN_SPEED FAN={fan} SPEED={speed} ``` diff --git a/doc/images/precise_wall.png b/doc/images/precise_wall.png new file mode 100644 index 0000000000..e8f237a591 Binary files /dev/null and b/doc/images/precise_wall.png differ diff --git a/localization/i18n/OrcaSlicer.pot b/localization/i18n/OrcaSlicer.pot index 50c3cdb284..59e38aead0 100644 --- a/localization/i18n/OrcaSlicer.pot +++ b/localization/i18n/OrcaSlicer.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-24 18:09+0100\n" +"POT-Creation-Date: 2023-12-19 22:09+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -296,6 +296,12 @@ msgstr "" msgid "Cut" msgstr "" +msgid "non-mainifold edges be caused by cut tool, do you want to fix it now?" +msgstr "" + +msgid "Repairing model object" +msgstr "" + msgid "Connector" msgstr "" @@ -833,6 +839,24 @@ msgstr "" msgid "Add support enforcer" msgstr "" +msgid "Add text" +msgstr "" + +msgid "Add negative text" +msgstr "" + +msgid "Add text modifier" +msgstr "" + +msgid "Add SVG part" +msgstr "" + +msgid "Add negative SVG" +msgstr "" + +msgid "Add SVG modifier" +msgstr "" + msgid "Select settings" msgstr "" @@ -848,9 +872,6 @@ msgstr "" msgid "Delete the selected object" msgstr "" -msgid "Edit Text" -msgstr "" - msgid "Load..." msgstr "" @@ -875,6 +896,12 @@ msgstr "" msgid "Cone" msgstr "" +msgid "Text" +msgstr "" + +msgid "SVG" +msgstr "" + msgid "Height range Modifier" msgstr "" @@ -1008,6 +1035,18 @@ msgstr "" msgid "Mirror object" msgstr "" +msgid "Edit text" +msgstr "" + +msgid "Ability to change text, font, size, ..." +msgstr "" + +msgid "Edit SVG" +msgstr "" + +msgid "Change SVG source file, projection, size, ..." +msgstr "" + msgid "Invalidate cut info" msgstr "" @@ -1161,9 +1200,6 @@ msgstr "" msgid "Click the icon to shift this object to the bed" msgstr "" -msgid " search results" -msgstr "" - msgid "Loading file" msgstr "" @@ -1299,9 +1335,6 @@ msgstr "" msgid "Renaming" msgstr "" -msgid "Repairing model object" -msgstr "" - msgid "Following model object has been repaired" msgid_plural "Following model objects have been repaired" msgstr[0] "" @@ -1621,10 +1654,6 @@ msgstr "" msgid "Arranging..." msgstr "" -msgid "" -"Arrange failed. Found some exceptions when processing object geometries." -msgstr "" - msgid "Arranging" msgstr "" @@ -1638,6 +1667,10 @@ msgstr "" msgid "Arranging done." msgstr "" +msgid "" +"Arrange failed. Found some exceptions when processing object geometries." +msgstr "" + #, possible-c-format, possible-boost-format msgid "" "Arrangement ignored the following objects which can't fit into a single " @@ -1661,7 +1694,10 @@ msgstr "" msgid "Orienting" msgstr "" -msgid "Filling bed " +msgid "Orienting canceled." +msgstr "" + +msgid "Filling" msgstr "" msgid "Bed filling canceled." @@ -1670,10 +1706,13 @@ msgstr "" msgid "Bed filling done." msgstr "" -msgid "Error! Unable to create thread!" +msgid "Searching for optimal orientation" msgstr "" -msgid "Exception" +msgid "Orientation search canceled." +msgstr "" + +msgid "Orientation found." msgstr "" msgid "Logging in" @@ -1737,11 +1776,6 @@ msgstr "" msgid "Print task sending times out." msgstr "" -msgid "" -"The printer timed out while receiving a print job. Please check if the " -"network is functioning properly and send the print again." -msgstr "" - msgid "Service Unavailable" msgstr "" @@ -1775,30 +1809,6 @@ msgstr "" msgid "An SD card needs to be inserted before sending to printer." msgstr "" -msgid "Choose SLA archive:" -msgstr "" - -msgid "Import file" -msgstr "" - -msgid "Import model and profile" -msgstr "" - -msgid "Import profile only" -msgstr "" - -msgid "Import model only" -msgstr "" - -msgid "Accurate" -msgstr "" - -msgid "Balanced" -msgstr "" - -msgid "Quick" -msgstr "" - msgid "Importing SLA archive" msgstr "" @@ -2427,16 +2437,6 @@ msgid "" "NO - Keep Independent Support Layer Height" msgstr "" -#, possible-boost-format -msgid "%1% infill pattern doesn't support 100%% density." -msgstr "" - -msgid "" -"Switch to rectilinear pattern?\n" -"Yes - switch to rectilinear pattern automaticlly\n" -"No - reset density to default non 100% value automaticlly" -msgstr "" - msgid "" "While printing by Object, the extruder may collide skirt.\n" "Thus, reset the skirt layer to 1 to avoid that." @@ -2535,6 +2535,18 @@ msgstr "" msgid "Motor noise showoff" msgstr "" +msgid "Nozzle filament covered detected pause" +msgstr "" + +msgid "Cutter error pause" +msgstr "" + +msgid "First layer error pause" +msgstr "" + +msgid "Nozzle clog pause" +msgstr "" + msgid "MC" msgstr "" @@ -2994,7 +3006,7 @@ msgstr "" msgid "Size:" msgstr "" -#, possible-boost-format +#, possible-c-format, possible-boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -3362,6 +3374,18 @@ msgstr "" msgid "Use Orthogonal View" msgstr "" +msgid "Show &G-code Window" +msgstr "" + +msgid "Show g-code window in Previce scene" +msgstr "" + +msgid "Reset Window Layout" +msgstr "" + +msgid "Reset to default window layout" +msgstr "" + msgid "Show &Labels" msgstr "" @@ -3722,6 +3746,9 @@ msgstr "" msgid "Connection lost. Please retry." msgstr "" +msgid "The device cannot handle more conversations. Please retry later." +msgstr "" + msgid "File not exists." msgstr "" @@ -3877,7 +3904,9 @@ msgstr "" msgid "Layer: %d/%d" msgstr "" -msgid "Please heat the nozzle to above 170 degree before loading filament." +msgid "" +"Please heat the nozzle to above 170 degree before loading or unloading " +"filament." msgstr "" msgid "Still unload" @@ -4219,7 +4248,7 @@ msgstr "" msgid "Allow Prompt Sound" msgstr "" -msgid "Fliament Tangle Detect" +msgid "Filament Tangle Detect" msgstr "" msgid "Global" @@ -4388,6 +4417,12 @@ msgid "" "It is recommended to change to smooth mode." msgstr "" +msgid "Expand sidebar" +msgstr "" + +msgid "Collapse sidebar" +msgstr "" + #, possible-c-format, possible-boost-format msgid "Loading file: %s" msgstr "" @@ -4404,31 +4439,6 @@ msgstr "" msgid "The 3mf is generated by old Orca Slicer, load geometry data only." msgstr "" -#, possible-c-format, possible-boost-format -msgid "This slicer file version %s is newer than %s's version:" -msgstr "" - -msgid "" -"Would you like to update your Bambu Studio software to enable all " -"functionality in this slicer file?\n" -msgstr "" - -msgid "Newer 3mf version" -msgstr "" - -msgid "" -"you can always update Bambu Studio at your convenience. The slicer file will " -"now be loaded without full functionality." -msgstr "" - -#, possible-c-format, possible-boost-format -msgid "" -"This slicer file version %s is newer than %s's version.\n" -"\n" -"Would you like to update your Bambu Studio software to enable all " -"functionality in this slicer file?" -msgstr "" - msgid "Invalid values found in the 3mf:" msgstr "" @@ -4644,6 +4654,9 @@ msgid "" "import it." msgstr "" +msgid "Import SLA archive" +msgstr "" + msgid "The selected file" msgstr "" @@ -4721,6 +4734,15 @@ msgid "" "will be exported." msgstr "" +msgid "" +"Are you sure you want to store original SVGs with their local paths into the " +"3MF file?\n" +"If you hit 'NO', all SVGs in the project will not be editable any more." +msgstr "" + +msgid "Private protection" +msgstr "" + msgid "Is the printer ready? Is the print sheet in place, empty and clean?" msgstr "" @@ -4741,6 +4763,9 @@ msgstr "" msgid "Custom supports and color painting were removed before repairing." msgstr "" +msgid "Optimize Rotation" +msgstr "" + msgid "Invalid number" msgstr "" @@ -4896,12 +4921,6 @@ msgstr "" msgid "If enabled, useful hints are displayed at startup." msgstr "" -msgid "Show g-code window" -msgstr "" - -msgid "If enabled, g-code window will be displayed." -msgstr "" - msgid "Flushing volumes: Auto-calculate everytime the color changed." msgstr "" @@ -5192,7 +5211,7 @@ msgstr "" msgid "User Preset" msgstr "" -msgid "Project Inside Preset" +msgid "Preset Inside Project" msgstr "" msgid "Name is invalid;" @@ -5266,6 +5285,9 @@ msgstr "" msgid "(LAN)" msgstr "" +msgid "Search" +msgstr "" + msgid "My Device" msgstr "" @@ -5296,16 +5318,16 @@ msgstr "" msgid "PLA Plate" msgstr "" -msgid "Bamabu Engineering Plate" +msgid "Bambu Engineering Plate" msgstr "" -msgid "Bamabu Smooth PEI Plate" +msgid "Bambu Smooth PEI Plate" msgstr "" msgid "High temperature Plate" msgstr "" -msgid "Bamabu Textured PEI Plate" +msgid "Bambu Textured PEI Plate" msgstr "" msgid "Send print job to" @@ -5504,6 +5526,12 @@ msgstr "" msgid "The printer does not support sending to printer SD card." msgstr "" +msgid "Slice ok." +msgstr "" + +msgid "View all Daily tips" +msgstr "" + msgid "Failed to create socket" msgstr "" @@ -5654,11 +5682,25 @@ msgid "" "independent support layer height" msgstr "" +msgid "" +"Layer height exceeds the limit in Printer Settings -> Extruder -> Layer " +"height limits ,this may cause printing quality issues." +msgstr "" + +msgid "Adjust to the set range automatically? \n" +msgstr "" + +msgid "Adjust" +msgstr "" + +msgid "Ignore" +msgstr "" + msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" msgid "Line width" @@ -5673,6 +5715,15 @@ msgstr "" msgid "Wall generator" msgstr "" +msgid "Walls and surfaces" +msgstr "" + +msgid "Bridging" +msgstr "" + +msgid "Overhangs" +msgstr "" + msgid "Walls" msgstr "" @@ -5991,6 +6042,12 @@ msgid_plural "Following presets will be deleted too." msgstr[0] "" msgstr[1] "" +msgid "" +"Are you sure to delete the selected preset? \n" +"If the preset corresponds to a filament currently in use on your printer, " +"please reset the filament information for that slot." +msgstr "" + #, possible-boost-format msgid "Are you sure to %1% the selected preset?" msgstr "" @@ -6016,7 +6073,7 @@ msgstr "" msgid "Unsaved Changes" msgstr "" -msgid "Discard or Keep changes" +msgid "Transfer or discard changes" msgstr "" msgid "Old Value" @@ -6213,19 +6270,15 @@ msgstr "" msgid "Ramming line spacing" msgstr "" -msgid "Auto-Calc" -msgstr "" - -msgid "Re-calculate" +msgid "Recalculate" msgstr "" msgid "Flushing volumes for filament change" msgstr "" msgid "" -"Studio would re-calculate your flushing volumes everytime the filaments " -"color changed. You could disable the auto-calculate in Bambu Studio > " -"Preferences" +"Orca recalculates your flushing volumes everytime the filament colors " +"change. You can change this behavior in Preferences." msgstr "" msgid "Flushing volume (mm³) for each filament pair." @@ -6242,15 +6295,6 @@ msgstr "" msgid "Multiplier" msgstr "" -msgid "unloaded" -msgstr "" - -msgid "loaded" -msgstr "" - -msgid "Filament #" -msgstr "" - msgid "From" msgstr "" @@ -6610,6 +6654,9 @@ msgstr "" msgid "Idle" msgstr "" +msgid "Beta version" +msgstr "" + msgid "Latest version" msgstr "" @@ -6947,6 +6994,25 @@ msgstr "" msgid "Variable layer height is not supported with Organic supports." msgstr "" +msgid "" +"Different nozzle diameters and different filament diameters is not allowed " +"when prime tower is enabled." +msgstr "" + +msgid "" +"The Wipe Tower is currently only supported with the relative extruder " +"addressing (use_relative_e_distances=1)." +msgstr "" + +msgid "" +"Ooze prevention is currently not supported with the prime tower enabled." +msgstr "" + +msgid "" +"The prime tower is currently only supported for the Marlin, RepRap/Sprinter, " +"RepRapFirmware and Repetier G-code flavors." +msgstr "" + msgid "The prime tower is not supported in \"By object\" print." msgstr "" @@ -7008,11 +7074,6 @@ msgstr "" msgid "Layer height cannot exceed nozzle diameter" msgstr "" -msgid "" -"Layer height cannot exceed the limit in Printer Settings -> Extruder -> " -"Layer height limits" -msgstr "" - msgid "" "Relative extruder addressing requires resetting the extruder position at " "each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to " @@ -7095,6 +7156,12 @@ msgstr "" msgid "Maximum printable height which is limited by mechanism of printer" msgstr "" +msgid "Preferred orientation" +msgstr "" + +msgid "Automatically orient stls on the Z-axis upon initial import" +msgstr "" + msgid "Printer preset names" msgstr "" @@ -7312,7 +7379,7 @@ msgstr "" msgid "Density of external bridges. 100% means solid bridge. Default is 100%." msgstr "" -msgid "Bridge flow" +msgid "Bridge flow ratio" msgstr "" msgid "" @@ -7320,6 +7387,15 @@ msgid "" "material for bridge, to improve sag" msgstr "" +msgid "Internal bridge flow ratio" +msgstr "" + +msgid "" +"This value governs the thickness of the internal bridge layer. This is the " +"first layer over sparse infill. Decrease this value slightly (for example " +"0.9) to improve surface quality over sparse infill." +msgstr "" + msgid "Top surface flow ratio" msgstr "" @@ -7612,6 +7688,15 @@ msgid "" "shorter bridged distances." msgstr "" +msgid "Thick internal bridges" +msgstr "" + +msgid "" +"If enabled, thick internal bridges will be used. It's usually recommended to " +"have this feature turned on. However, consider turning it off if you are " +"using large nozzles." +msgstr "" + msgid "Max bridge length" msgstr "" @@ -7686,7 +7771,7 @@ msgid "Internal solid infill pattern" msgstr "" msgid "" -"Line pattern of internal solid infill. if the detect nattow internal solid " +"Line pattern of internal solid infill. if the detect narrow internal solid " "infill be enabled, the concentric pattern will be used for the small area." msgstr "" @@ -7717,25 +7802,55 @@ msgid "" "This sets the threshold for small perimeter length. Default threshold is 0mm" msgstr "" -msgid "Order of walls" +msgid "Walls printing order" msgstr "" -msgid "Print sequence of inner wall and outer wall. " +msgid "" +"Print sequence of the internal (inner) and external (outer) walls. \n" +"\n" +"Use Inner/Outer for best overhangs. This is because the overhanging walls " +"can adhere to a neighouring perimeter while printing. However, this option " +"results in slightly reduced surface quality as the external perimeter is " +"deformed by being squashed to the internal perimeter.\n" +"\n" +"Use Inner/Outer/Inner for the best external surface finish and dimensional " +"accuracy as the external wall is printed undisturbed from an internal " +"perimeter. However, overhang performance will reduce as there is no internal " +"perimeter to print the external wall against. This option requires a minimum " +"of 3 walls to be effective as it prints the internal walls from the 3rd " +"perimeter onwards first, then the external perimeter and, finally, the first " +"internal perimeter. This option is recomended against the Outer/Inner option " +"in most cases. \n" +"\n" +"Use Outer/Inner for the same external wall quality and dimensional accuracy " +"benefits of Inner/Outer/Inner option. However, the z seams will appear less " +"consistent as the first extrusion of a new layer starts on a visible " +"surface.\n" +"\n" +" " msgstr "" -msgid "inner/outer" +msgid "Inner/Outer" msgstr "" -msgid "outer/inner" +msgid "Outer/Inner" msgstr "" -msgid "inner wall/outer wall/inner wall" +msgid "Inner/Outer/Inner" msgstr "" msgid "Print infill first" msgstr "" -msgid "Order of wall/infill. false means print wall first. " +msgid "" +"Order of wall/infill. When the tickbox is unchecked the walls are printed " +"first, which works best in most cases.\n" +"\n" +"Printing walls first may help with extreme overhangs as the walls have the " +"neighbouring infill to adhere to. However, the infill will slighly push out " +"the printed walls where it is attached to them, resulting in a worse " +"external surface finish. It can also cause the infill to shine through the " +"external surfaces of the part." msgstr "" msgid "Height to rod" @@ -8043,8 +8158,10 @@ msgstr "" msgid "Sparse infill density" msgstr "" -#, possible-c-format -msgid "Density of internal sparse infill, 100% means solid throughout" +#, possible-c-format, possible-boost-format +msgid "" +"Density of internal sparse infill, 100% turns all sparse infill into solid " +"infill and internal solid infill pattern will be used" msgstr "" msgid "Sparse infill pattern" @@ -8242,10 +8359,10 @@ msgstr "" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " -"than \"close_fan_the_first_x_layers\", in which case the fan will be running " -"at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower than " +"\"close_fan_the_first_x_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." msgstr "" msgid "Support interface fan speed" @@ -8291,6 +8408,12 @@ msgid "" "segment" msgstr "" +msgid "Apply fuzzy skin to first layer" +msgstr "" + +msgid "Whether to apply fuzzy skin on the first layer" +msgstr "" + msgid "Filter out tiny gaps" msgstr "" @@ -8882,13 +9005,13 @@ msgstr "" msgid "User can self-define the project file name when export" msgstr "" -msgid "Make overhang printable" +msgid "Make overhangs printable" msgstr "" msgid "Modify the geometry to print overhangs without support material." msgstr "" -msgid "Make overhang printable maximum angle" +msgid "Make overhangs printable - Maximum angle" msgstr "" msgid "" @@ -8897,7 +9020,7 @@ msgid "" "0 will replace all overhangs with conical material." msgstr "" -msgid "Make overhang printable hole area" +msgid "Make overhangs printable - Hole area" msgstr "" msgid "" @@ -9120,6 +9243,9 @@ msgstr "" msgid "Show auto-calibration marks" msgstr "" +msgid "Disable set remaining print time" +msgstr "" + msgid "Seam position" msgstr "" @@ -9237,6 +9363,22 @@ msgid "" "generated model has no seam" msgstr "" +msgid "Smooth Spiral" +msgstr "" + +msgid "" +"Smooth Spiral smoothes out X and Y moves as wellresulting in no visible seam " +"at all, even in the XY directions on walls that are not vertical" +msgstr "" + +msgid "Max XY Smoothing" +msgstr "" + +msgid "" +"Maximum distance to move points in XY to try to achieve a smooth spiralIf " +"expressed as a %, it will be computed over nozzle diameter" +msgstr "" + msgid "" "If smooth or traditional mode is selected, a timelapse video will be " "generated for each print. After each layer is printed, a snapshot is taken " @@ -9419,10 +9561,11 @@ msgid "" "filament for support and current filament is used" msgstr "" -msgid "No interface filament for body" +msgid "Avoid interface filament for base" msgstr "" -msgid "Don't use support interface filament to print support body" +msgid "" +"Avoid using support interface filament to print support base if possible." msgstr "" msgid "" @@ -9651,10 +9794,10 @@ msgid "" "double walls." msgstr "" -msgid "Tree support wall loops" +msgid "Support wall loops" msgstr "" -msgid "This setting specify the count of walls around tree support" +msgid "This setting specify the count of walls around support" msgstr "" msgid "Tree support with infill" @@ -9752,7 +9895,15 @@ msgid "Wipe Distance" msgstr "" msgid "" -"Discribe how long the nozzle will move along the last path when retracting" +"Discribe how long the nozzle will move along the last path when " +"retracting. \n" +"\n" +"Depending on how long the wipe operation lasts, how fast and long the " +"extruder/filament retraction settings are, a retraction move may be needed " +"to retract the remaining filament. \n" +"\n" +"Setting a value in the retract amount before wipe setting below will perform " +"any excess retraction before the wipe, else it will be performed after." msgstr "" msgid "" @@ -10013,10 +10164,6 @@ msgstr "" msgid "invalid value " msgstr "" -#, possible-c-format, possible-boost-format -msgid " doesn't work at 100%% density " -msgstr "" - msgid "Invalid value when spiral vase mode is enabled: " msgstr "" @@ -10859,6 +11006,704 @@ msgstr "" msgid "Delete input" msgstr "" +msgid "Network Test" +msgstr "" + +msgid "Start Test Multi-Thread" +msgstr "" + +msgid "Start Test Single-Thread" +msgstr "" + +msgid "Export Log" +msgstr "" + +msgid "Studio Version:" +msgstr "" + +msgid "System Version:" +msgstr "" + +msgid "DNS Server:" +msgstr "" + +msgid "Test BambuLab" +msgstr "" + +msgid "Test BambuLab:" +msgstr "" + +msgid "Test Bing.com" +msgstr "" + +msgid "Test bing.com:" +msgstr "" + +msgid "Test HTTP" +msgstr "" + +msgid "Test HTTP Service:" +msgstr "" + +msgid "Test storage" +msgstr "" + +msgid "Test Storage Upload:" +msgstr "" + +msgid "Test storage upgrade" +msgstr "" + +msgid "Test Storage Upgrade:" +msgstr "" + +msgid "Test storage download" +msgstr "" + +msgid "Test Storage Download:" +msgstr "" + +msgid "Test plugin download" +msgstr "" + +msgid "Test Plugin Download:" +msgstr "" + +msgid "Test Storage Upload" +msgstr "" + +msgid "Log Info" +msgstr "" + +msgid "Select filament preset" +msgstr "" + +msgid "Create Filament" +msgstr "" + +msgid "Create Based on Current Filament" +msgstr "" + +msgid "Copy Current Filament Preset " +msgstr "" + +msgid "Basic Information" +msgstr "" + +msgid "Add Filament Preset under this filament" +msgstr "" + +msgid "We could create the filament presets for your following printer:" +msgstr "" + +msgid "Select Vendor" +msgstr "" + +msgid "Input Custom Vendor" +msgstr "" + +msgid "Can't find vendor I want" +msgstr "" + +msgid "Select Type" +msgstr "" + +msgid "Select Filament Preset" +msgstr "" + +msgid "Serial" +msgstr "" + +msgid "e.g. Basic, Matte, Silk, Marble" +msgstr "" + +msgid "Filament Preset" +msgstr "" + +msgid "Create" +msgstr "" + +msgid "Vendor is not selected, please reselect vendor." +msgstr "" + +msgid "Custom vendor is not input, please input custom vendor." +msgstr "" + +msgid "" +"\"Bambu\" or \"Generic\" can not be used as a Vendor for custom filaments." +msgstr "" + +msgid "Filament type is not selected, please reselect type." +msgstr "" + +msgid "Filament serial is not inputed, please input serial." +msgstr "" + +msgid "" +"There may be escape characters in the vendor or serial input of filament. " +"Please delete and re-enter." +msgstr "" + +msgid "All inputs in the custom vendor or serial are spaces. Please re-enter." +msgstr "" + +msgid "The vendor can not be a number. Please re-enter." +msgstr "" + +msgid "" +"You have not selected a printer or preset yet. Please select at least one." +msgstr "" + +msgid "Some existing presets have failed to be created, as follows:\n" +msgstr "" + +msgid "" +"\n" +"Do you want to rewrite it?" +msgstr "" + +msgid "" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" +"To add preset for more prinetrs, Please go to printer selection" +msgstr "" + +msgid "Create Printer/Nozzle" +msgstr "" + +msgid "Create Printer" +msgstr "" + +msgid "Create Nozzle for Existing Printer" +msgstr "" + +msgid "Create from Template" +msgstr "" + +msgid "Create Based on Current Printer" +msgstr "" + +msgid "wiki" +msgstr "" + +msgid "Import Preset" +msgstr "" + +msgid "Create Type" +msgstr "" + +msgid "The model is not fond, place reselect vendor." +msgstr "" + +msgid "Select Model" +msgstr "" + +msgid "Select Printer" +msgstr "" + +msgid "Input Custom Model" +msgstr "" + +msgid "Can't find my printer model" +msgstr "" + +msgid "Rectangle" +msgstr "" + +msgid "Printable Space" +msgstr "" + +msgid "X" +msgstr "" + +msgid "Y" +msgstr "" + +msgid "Hot Bed STL" +msgstr "" + +msgid "Load stl" +msgstr "" + +msgid "Hot Bed SVG" +msgstr "" + +msgid "Load svg" +msgstr "" + +msgid "Max Print Height" +msgstr "" + +#, possible-c-format, possible-boost-format +msgid "The file exceeds %d MB, please import again." +msgstr "" + +msgid "Exception in obtaining file size, please import again." +msgstr "" + +msgid "Preset path is not find, please reselect vendor." +msgstr "" + +msgid "The printer model was not found, please reselect." +msgstr "" + +msgid "The nozzle diameter is not fond, place reselect." +msgstr "" + +msgid "The printer preset is not fond, place reselect." +msgstr "" + +msgid "Printer Preset" +msgstr "" + +msgid "Filament Preset Template" +msgstr "" + +msgid "Deselect All" +msgstr "" + +msgid "Process Preset Template" +msgstr "" + +msgid "Back Page 1" +msgstr "" + +msgid "" +"You have not yet chosen which printer preset to create based on. Please " +"choose the vendor and model of the printer" +msgstr "" + +msgid "" +"You have entered an illegal input in the printable area section on the first " +"page. Please check before creating it." +msgstr "" + +msgid "The custom printer or model is not inputed, place input." +msgstr "" + +msgid "" +"The printer preset you created already has a preset with the same name. Do " +"you want to overwrite it?\n" +"\tYes: Overwrite the printer preset with the same name, and filament and " +"process presets with the same preset name will be recreated \n" +"and filament and process presets without the same preset name will be " +"reserve.\n" +"\tCancel: Do not create a preset, return to the creation interface." +msgstr "" + +msgid "You need to select at least one filament preset." +msgstr "" + +msgid "You need to select at least one process preset." +msgstr "" + +msgid "Create filament presets failed. As follows:\n" +msgstr "" + +msgid "Create process presets failed. As follows:\n" +msgstr "" + +msgid "Vendor is not find, please reselect." +msgstr "" + +msgid "Current vendor has no models, please reselect." +msgstr "" + +msgid "" +"You have not selected the vendor and model or inputed the custom vendor and " +"model." +msgstr "" + +msgid "" +"There may be escape characters in the custom printer vendor or model. Please " +"delete and re-enter." +msgstr "" + +msgid "" +"All inputs in the custom printer vendor or model are spaces. Please re-enter." +msgstr "" + +msgid "Please check bed printable shape and origin input." +msgstr "" + +msgid "" +"You have not yet selected the printer to replace the nozzle, please choose." +msgstr "" + +msgid "Create Printer Successful" +msgstr "" + +msgid "Create Filament Successful" +msgstr "" + +msgid "Printer Created" +msgstr "" + +msgid "Please go to printer settings to edit your presets" +msgstr "" + +msgid "Filament Created" +msgstr "" + +msgid "" +"Please go to filament setting to edit your presets if you need.\n" +"Please note that nozzle temperature, hot bed temperature, and maximum " +"volumetric speed have a significant impact on printing quality. Please set " +"them carefully." +msgstr "" + +msgid "Printer Setting" +msgstr "" + +msgid "Export Configs" +msgstr "" + +msgid "Printer config bundle(.bbscfg)" +msgstr "" + +msgid "Filament bundle(.bbsflmt)" +msgstr "" + +msgid "Printer presets(.zip)" +msgstr "" + +msgid "Filament presets(.zip)" +msgstr "" + +msgid "Process presets(.zip)" +msgstr "" + +msgid "initialize fail" +msgstr "" + +msgid "add file fail" +msgstr "" + +msgid "add bundle structure file fail" +msgstr "" + +msgid "finalize fail" +msgstr "" + +msgid "open zip written fail" +msgstr "" + +msgid "Export successful" +msgstr "" + +#, possible-c-format, possible-boost-format +msgid "" +"The '%s' folder already exists in the current directory. Do you want to " +"clear it and rebuild it.\n" +"If not, a time suffix will be added, and you can modify the name after " +"creation." +msgstr "" + +msgid "" +"Printer and all the filament&process presets that belongs to the printer. \n" +"Can be shared with others." +msgstr "" + +msgid "" +"User's fillment preset set. \n" +"Can be shared with others." +msgstr "" + +msgid "" +"Only display printer names with changes to printer, filament, and process " +"presets." +msgstr "" + +msgid "Only display the filament names with changes to filament presets." +msgstr "" + +msgid "" +"Only printer names with user printer presets will be displayed, and each " +"preset you choose will be exported as a zip." +msgstr "" + +msgid "" +"Only the filament names with user filament presets will be displayed, \n" +"and all user filament presets in each filament name you select will be " +"exported as a zip." +msgstr "" + +msgid "" +"Only printer names with changed process presets will be displayed, \n" +"and all user process presets in each printer name you select will be " +"exported as a zip." +msgstr "" + +msgid "Please select at least one printer or filament." +msgstr "" + +msgid "Please select a type you want to export" +msgstr "" + +msgid "Edit Filament" +msgstr "" + +msgid "Filament presets under this filament" +msgstr "" + +msgid "" +"Note: If the only preset under this filament is deleted, the filament will " +"be deleted after exiting the dialog." +msgstr "" + +msgid "Presets inherited by other presets can not be deleted" +msgstr "" + +msgid "The following presets inherits this preset." +msgid_plural "The following preset inherits this preset." +msgstr[0] "" +msgstr[1] "" + +msgid "Delete Preset" +msgstr "" + +msgid "Are you sure to delete the selected preset?" +msgstr "" + +msgid "Delete preset" +msgstr "" + +msgid "+ Add Preset" +msgstr "" + +msgid "Delete Filament" +msgstr "" + +msgid "" +"All the filament presets belong to this filament would be deleted. \n" +"If you are using this filament on your printer, please reset the filament " +"information for that slot." +msgstr "" + +msgid "Delete filament" +msgstr "" + +msgid "Add Preset" +msgstr "" + +msgid "Add preset for new printer" +msgstr "" + +msgid "Copy preset from filament" +msgstr "" + +msgid "The filament choice not find filament preset, please reselect it" +msgstr "" + +msgid "Edit Preset" +msgstr "" + +msgid "For more information, please check out Wiki" +msgstr "" + +msgid "Collapse" +msgstr "" + +msgid "Daily Tips" +msgstr "" + +msgid "Need select printer" +msgstr "" + +msgid "The start, end or step is not valid value." +msgstr "" + +msgid "" +"Unable to calibrate: maybe because the set calibration value range is too " +"large, or the step is too small" +msgstr "" + +msgid "Physical Printer" +msgstr "" + +msgid "Print Host upload" +msgstr "" + +msgid "Could not get a valid Printer Host reference" +msgstr "" + +msgid "Success!" +msgstr "" + +msgid "Refresh Printers" +msgstr "" + +msgid "" +"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" +"signed certificate." +msgstr "" + +msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" +msgstr "" + +msgid "Open CA certificate file" +msgstr "" + +#, possible-c-format, possible-boost-format +msgid "" +"On this system, %s uses HTTPS certificates from the system Certificate Store " +"or Keychain." +msgstr "" + +msgid "" +"To use a custom CA file, please import your CA file into Certificate Store / " +"Keychain." +msgstr "" + +msgid "Connection to printers connected via the print host failed." +msgstr "" + +#, possible-c-format, possible-boost-format +msgid "Mismatched type of print host: %s" +msgstr "" + +msgid "Connection to AstroBox works correctly." +msgstr "" + +msgid "Could not connect to AstroBox" +msgstr "" + +msgid "Note: AstroBox version at least 1.1.0 is required." +msgstr "" + +msgid "Connection to Duet works correctly." +msgstr "" + +msgid "Could not connect to Duet" +msgstr "" + +msgid "Unknown error occured" +msgstr "" + +msgid "Wrong password" +msgstr "" + +msgid "Could not get resources to create a new connection" +msgstr "" + +msgid "Upload not enabled on FlashAir card." +msgstr "" + +msgid "Connection to FlashAir works correctly and upload is enabled." +msgstr "" + +msgid "Could not connect to FlashAir" +msgstr "" + +msgid "" +"Note: FlashAir with firmware 2.00.02 or newer and activated upload function " +"is required." +msgstr "" + +msgid "Connection to MKS works correctly." +msgstr "" + +msgid "Could not connect to MKS" +msgstr "" + +msgid "Connection to OctoPrint works correctly." +msgstr "" + +msgid "Could not connect to OctoPrint" +msgstr "" + +msgid "Note: OctoPrint version at least 1.1.0 is required." +msgstr "" + +msgid "Connection to Prusa SL1 / SL1S works correctly." +msgstr "" + +msgid "Could not connect to Prusa SLA" +msgstr "" + +msgid "Connection to PrusaLink works correctly." +msgstr "" + +msgid "Could not connect to PrusaLink" +msgstr "" + +msgid "Storages found" +msgstr "" + +#. TRN %1% = storage path +#, possible-boost-format +msgid "%1% : read only" +msgstr "" + +#. TRN %1% = storage path +#, possible-boost-format +msgid "%1% : no free space" +msgstr "" + +#. TRN %1% = host +#, possible-boost-format +msgid "Upload has failed. There is no suitable storage found at %1%." +msgstr "" + +msgid "Connection to Prusa Connect works correctly." +msgstr "" + +msgid "Could not connect to Prusa Connect" +msgstr "" + +msgid "Connection to Repetier works correctly." +msgstr "" + +msgid "Could not connect to Repetier" +msgstr "" + +msgid "Note: Repetier version at least 0.90.0 is required." +msgstr "" + +#, possible-boost-format +msgid "" +"HTTP status: %1%\n" +"Message body: \"%2%\"" +msgstr "" + +#, possible-boost-format +msgid "" +"Parsing of host response failed.\n" +"Message body: \"%1%\"\n" +"Error: \"%2%\"" +msgstr "" + +#, possible-boost-format +msgid "" +"Enumeration of host printers failed.\n" +"Message body: \"%1%\"\n" +"Error: \"%2%\"" +msgstr "" + +#: resources/data/hints.ini: [hint:Precise wall] +msgid "Precise wall\nDid you know that turning on precise wall can improve precision and layer consistency?" +msgstr "" + +#: resources/data/hints.ini: [hint:Sandwich mode] +msgid "Sandwich mode\nDid you know that you can use sandwich mode (inner-outer-inner) to improve precision and layer consistency if your model doesn't have very steep overhangs?" +msgstr "" + +#: resources/data/hints.ini: [hint:Chamber temperature] +msgid "Chamber temperature\nDid you know that OrcaSlicer supports chamber temperature?" +msgstr "" + +#: resources/data/hints.ini: [hint:Calibration] +msgid "Calibration\nDid you know that calibrating your printer can do wonders? Check out our beloved calibration solution in OrcaSlicer." +msgstr "" + +#: resources/data/hints.ini: [hint:Auxiliary fan] +msgid "Auxiliary fan\nDid you know that OrcaSlicer supports Auxiliary part cooling fan?" +msgstr "" + +#: resources/data/hints.ini: [hint:Air filtration] +msgid "Air filtration/Exhuast Fan\nDid you know that OrcaSlicer can support Air filtration/Exhuast Fan?" +msgstr "" + #: resources/data/hints.ini: [hint:How to use keyboard shortcuts] msgid "How to use keyboard shortcuts\nDid you know that Orca Slicer offers a wide range of keyboard shortcuts and 3D scene operations." msgstr "" @@ -10896,7 +11741,7 @@ msgid "Search Functionality\nDid you know that you use the Search tool to quickl msgstr "" #: resources/data/hints.ini: [hint:Simplify Model] -msgid "Simplify Model\nDid you know that you can reduce the number of triangles in a mesh using the Simplify mesh feature? Right-click the model and select Simplify model. Read more in the documentation." +msgid "Simplify Model\nDid you know that you can reduce the number of triangles in a mesh using the Simplify mesh feature? Right-click the model and select Simplify model." msgstr "" #: resources/data/hints.ini: [hint:Slicing Parameter Table] @@ -10908,7 +11753,7 @@ msgid "Split to Objects/Parts\nDid you know that you can split a big object into msgstr "" #: resources/data/hints.ini: [hint:Subtract a Part] -msgid "Subtract a Part\nDid you know that you can subtract one mesh from another using the Negative part modifier? That way you can, for example, create easily resizable holes directly in Orca Slicer. Read more in the documentation." +msgid "Subtract a Part\nDid you know that you can subtract one mesh from another using the Negative part modifier? That way you can, for example, create easily resizable holes directly in Orca Slicer." msgstr "" #: resources/data/hints.ini: [hint:STEP] diff --git a/localization/i18n/cs/OrcaSlicer_cs.po b/localization/i18n/cs/OrcaSlicer_cs.po index b3857c9568..cb47483f75 100644 --- a/localization/i18n/cs/OrcaSlicer_cs.po +++ b/localization/i18n/cs/OrcaSlicer_cs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-24 18:09+0100\n" +"POT-Creation-Date: 2023-12-19 22:09+0800\n" "PO-Revision-Date: 2023-09-30 15:15+0200\n" "Last-Translator: René Mošner \n" "Language-Team: \n" @@ -299,6 +299,12 @@ msgstr "Vybrat všechny spojky" msgid "Cut" msgstr "Řezat" +msgid "non-mainifold edges be caused by cut tool, do you want to fix it now?" +msgstr "" + +msgid "Repairing model object" +msgstr "Oprava objektu modelu" + msgid "Connector" msgstr "Spojka" @@ -866,6 +872,24 @@ msgstr "Přidat blokátor podpěr" msgid "Add support enforcer" msgstr "Přidat vynucení podpěr" +msgid "Add text" +msgstr "" + +msgid "Add negative text" +msgstr "" + +msgid "Add text modifier" +msgstr "" + +msgid "Add SVG part" +msgstr "" + +msgid "Add negative SVG" +msgstr "" + +msgid "Add SVG modifier" +msgstr "" + msgid "Select settings" msgstr "Vybrat nastavení" @@ -881,9 +905,6 @@ msgstr "Smazat" msgid "Delete the selected object" msgstr "Smazat vybraný objekt" -msgid "Edit Text" -msgstr "Upravit text" - msgid "Load..." msgstr "Načíst..." @@ -908,6 +929,12 @@ msgstr "Válec" msgid "Cone" msgstr "Kužel" +msgid "Text" +msgstr "" + +msgid "SVG" +msgstr "" + msgid "Height range Modifier" msgstr "Modifikátor výškového rozsahu" @@ -1041,6 +1068,18 @@ msgstr "Zrcadlit" msgid "Mirror object" msgstr "Zrcadlit objekt" +msgid "Edit text" +msgstr "" + +msgid "Ability to change text, font, size, ..." +msgstr "" + +msgid "Edit SVG" +msgstr "" + +msgid "Change SVG source file, projection, size, ..." +msgstr "" + msgid "Invalidate cut info" msgstr "Zneplatnění informací o řezu" @@ -1198,9 +1237,6 @@ msgstr "Kliknutím na ikonu upravíte barevnou malbu objektu" msgid "Click the icon to shift this object to the bed" msgstr "Klikněte na ikonu pro přesunutí tohoto objektu na podložku" -msgid " search results" -msgstr "" - msgid "Loading file" msgstr "Načítání souboru" @@ -1349,9 +1385,6 @@ msgstr "Zadejte nový název" msgid "Renaming" msgstr "Přejmenování" -msgid "Repairing model object" -msgstr "Oprava objektu modelu" - msgid "Following model object has been repaired" msgid_plural "Following model objects have been repaired" msgstr[0] "Následující objekt modelu byl opraven" @@ -1680,12 +1713,6 @@ msgstr "" msgid "Arranging..." msgstr "Uspořádávání..." -msgid "" -"Arrange failed. Found some exceptions when processing object geometries." -msgstr "" -"Uspořádání se nezdařilo. Při zpracování geometrií objektů bylo nalezeno " -"několik výjimek." - msgid "Arranging" msgstr "Uspořádávání" @@ -1701,6 +1728,12 @@ msgstr "" msgid "Arranging done." msgstr "Uspořádávání dokončeno." +msgid "" +"Arrange failed. Found some exceptions when processing object geometries." +msgstr "" +"Uspořádání se nezdařilo. Při zpracování geometrií objektů bylo nalezeno " +"několik výjimek." + #, c-format, boost-format msgid "" "Arrangement ignored the following objects which can't fit into a single " @@ -1731,8 +1764,11 @@ msgstr "Orientování..." msgid "Orienting" msgstr "Orientování" -msgid "Filling bed " -msgstr "Vyplňování podložky " +msgid "Orienting canceled." +msgstr "" + +msgid "Filling" +msgstr "" msgid "Bed filling canceled." msgstr "Vyplnění podložky zrušeno." @@ -1740,11 +1776,14 @@ msgstr "Vyplnění podložky zrušeno." msgid "Bed filling done." msgstr "Vyplnění podložky je dokončené." -msgid "Error! Unable to create thread!" -msgstr "Chyba! Nelze vytvořit vlákno!" +msgid "Searching for optimal orientation" +msgstr "" -msgid "Exception" -msgstr "Výjimka" +msgid "Orientation search canceled." +msgstr "" + +msgid "Orientation found." +msgstr "" msgid "Logging in" msgstr "Přihlášení" @@ -1815,11 +1854,6 @@ msgstr "Odesílání tiskové úlohy prostřednictvím cloudové služby" msgid "Print task sending times out." msgstr "" -msgid "" -"The printer timed out while receiving a print job. Please check if the " -"network is functioning properly and send the print again." -msgstr "" - msgid "Service Unavailable" msgstr "Služba není k dispozici" @@ -1853,30 +1887,6 @@ msgstr "Úspěšně odesláno. Zavřít aktuální stránku za %s s" msgid "An SD card needs to be inserted before sending to printer." msgstr "Před odesláním do tiskárny je třeba vložit SD kartu." -msgid "Choose SLA archive:" -msgstr "Vyberte SLA archiv:" - -msgid "Import file" -msgstr "Importovat soubor" - -msgid "Import model and profile" -msgstr "Importovat model a profil" - -msgid "Import profile only" -msgstr "Importovat pouze profil" - -msgid "Import model only" -msgstr "Importujte pouze model" - -msgid "Accurate" -msgstr "Přesné" - -msgid "Balanced" -msgstr "Vyvážené" - -msgid "Quick" -msgstr "Rychlé" - msgid "Importing SLA archive" msgstr "Importuje se SLA archiv" @@ -2621,19 +2631,6 @@ msgstr "" "ANO - Zachovat čistící věž\n" "NE - Zachovat výšku nezávislé podpůrné vrstvy" -#, boost-format -msgid "%1% infill pattern doesn't support 100%% density." -msgstr "%1% vzor výplně nepodporuje 100%% hustotu." - -msgid "" -"Switch to rectilinear pattern?\n" -"Yes - switch to rectilinear pattern automaticlly\n" -"No - reset density to default non 100% value automaticlly" -msgstr "" -"Přepnout na přímočarý vzor?\n" -"Ano - přepnout na přímočarý vzor automaticky\n" -"Ne - automaticky resetovat hustotu na výchozí ne 100% hodnotu" - msgid "" "While printing by Object, the extruder may collide skirt.\n" "Thus, reset the skirt layer to 1 to avoid that." @@ -2734,6 +2731,18 @@ msgstr "Pozastaveno uživatelem vloženým G-kódem" msgid "Motor noise showoff" msgstr "Předvedení zvuku motoru" +msgid "Nozzle filament covered detected pause" +msgstr "" + +msgid "Cutter error pause" +msgstr "" + +msgid "First layer error pause" +msgstr "" + +msgid "Nozzle clog pause" +msgstr "" + msgid "MC" msgstr "MC" @@ -3208,7 +3217,7 @@ msgstr "Objem:" msgid "Size:" msgstr "Velikost:" -#, boost-format +#, c-format, boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -3586,6 +3595,18 @@ msgstr "Použít perspektivní pohled" msgid "Use Orthogonal View" msgstr "Použít ortogonální zobrazení" +msgid "Show &G-code Window" +msgstr "" + +msgid "Show g-code window in Previce scene" +msgstr "" + +msgid "Reset Window Layout" +msgstr "" + +msgid "Reset to default window layout" +msgstr "" + msgid "Show &Labels" msgstr "Zobrazit &Popisky" @@ -3971,6 +3992,9 @@ msgstr "Stahování %d%%..." msgid "Connection lost. Please retry." msgstr "" +msgid "The device cannot handle more conversations. Please retry later." +msgstr "" + msgid "File not exists." msgstr "" @@ -4128,8 +4152,10 @@ msgstr "Vrstva: %s" msgid "Layer: %d/%d" msgstr "Vrstva: %d/%d" -msgid "Please heat the nozzle to above 170 degree before loading filament." -msgstr "Před vložením filamentu zahřejte trysku na více než 170 stupňů." +msgid "" +"Please heat the nozzle to above 170 degree before loading or unloading " +"filament." +msgstr "" msgid "Still unload" msgstr "Stále vysunovat" @@ -4494,7 +4520,7 @@ msgstr "Automatické obnovení po ztrátě kroku" msgid "Allow Prompt Sound" msgstr "Povolit zvuky upozornění" -msgid "Fliament Tangle Detect" +msgid "Filament Tangle Detect" msgstr "" msgid "Global" @@ -4683,6 +4709,12 @@ msgstr "" "Povolení tradičního časosběrného fotografování může způsobit povrchové " "nedokonalosti. Doporučuje se přepnout na hladký režim." +msgid "Expand sidebar" +msgstr "" + +msgid "Collapse sidebar" +msgstr "" + #, c-format, boost-format msgid "Loading file: %s" msgstr "Načítání souboru: %s" @@ -4701,31 +4733,6 @@ msgstr "Nelze načíst konfiguraci." msgid "The 3mf is generated by old Orca Slicer, load geometry data only." msgstr "3mf je generován starým Orca Slicerem, načtěte pouze geometrická data." -#, c-format, boost-format -msgid "This slicer file version %s is newer than %s's version:" -msgstr "" - -msgid "" -"Would you like to update your Bambu Studio software to enable all " -"functionality in this slicer file?\n" -msgstr "" - -msgid "Newer 3mf version" -msgstr "Novější verze 3mf" - -msgid "" -"you can always update Bambu Studio at your convenience. The slicer file will " -"now be loaded without full functionality." -msgstr "" - -#, c-format, boost-format -msgid "" -"This slicer file version %s is newer than %s's version.\n" -"\n" -"Would you like to update your Bambu Studio software to enable all " -"functionality in this slicer file?" -msgstr "" - msgid "Invalid values found in the 3mf:" msgstr "V 3mf byly nalezeny neplatné hodnoty:" @@ -4960,6 +4967,9 @@ msgid "" msgstr "" "Import do Orca Sliceru selhal. Stáhněte soubor a proveďte jeho ruční import." +msgid "Import SLA archive" +msgstr "" + msgid "The selected file" msgstr "Vybraný soubor" @@ -5041,6 +5051,15 @@ msgstr "" "Nelze provést logickou operaci nad mashí modelů. Budou exportovány pouze " "kladné části." +msgid "" +"Are you sure you want to store original SVGs with their local paths into the " +"3MF file?\n" +"If you hit 'NO', all SVGs in the project will not be editable any more." +msgstr "" + +msgid "Private protection" +msgstr "" + msgid "Is the printer ready? Is the print sheet in place, empty and clean?" msgstr "Je tiskárna připravená k tisku? Je podložka prázdná a čistá?" @@ -5064,6 +5083,9 @@ msgstr "Odeslat do tiskárny" msgid "Custom supports and color painting were removed before repairing." msgstr "Vlastní podpěry a barevné malby byly před opravou odstraněny." +msgid "Optimize Rotation" +msgstr "" + msgid "Invalid number" msgstr "Neplatné číslo" @@ -5226,12 +5248,6 @@ msgstr "Zobrazovat \"Tip dne\" po spuštění" msgid "If enabled, useful hints are displayed at startup." msgstr "Pokud je povoleno, při spuštění se zobrazí užitečné rady." -msgid "Show g-code window" -msgstr "Zobrazit okno s G-kódem" - -msgid "If enabled, g-code window will be displayed." -msgstr "Pokud je povoleno, zobrazí se okno s G-kódem." - msgid "Flushing volumes: Auto-calculate everytime the color changed." msgstr "" @@ -5530,7 +5546,7 @@ msgstr "Uložit %s jako" msgid "User Preset" msgstr "Uživatelská předvolba" -msgid "Project Inside Preset" +msgid "Preset Inside Project" msgstr "Projekt uvnitř přednastavení" msgid "Name is invalid;" @@ -5605,6 +5621,9 @@ msgstr "Úloha zrušena" msgid "(LAN)" msgstr "(LAN)" +msgid "Search" +msgstr "" + msgid "My Device" msgstr "Moje zařízení" @@ -5635,16 +5654,16 @@ msgstr "Bambu Cool Podložka" msgid "PLA Plate" msgstr "PLA Podložka" -msgid "Bamabu Engineering Plate" -msgstr "Bamabu Engineering Podložka" +msgid "Bambu Engineering Plate" +msgstr "Bambu Engineering Podložka" -msgid "Bamabu Smooth PEI Plate" +msgid "Bambu Smooth PEI Plate" msgstr "" msgid "High temperature Plate" msgstr "High temperature Podložka" -msgid "Bamabu Textured PEI Plate" +msgid "Bambu Textured PEI Plate" msgstr "" msgid "Send print job to" @@ -5869,6 +5888,12 @@ msgstr "Tiskárna musí být ve stejné síti LAN jako Orca Slicer." msgid "The printer does not support sending to printer SD card." msgstr "Tiskárna nepodporuje odesílání na SD kartu tiskárny." +msgid "Slice ok." +msgstr "Slicování Dokončeno." + +msgid "View all Daily tips" +msgstr "" + msgid "Failed to create socket" msgstr "Nepodařilo se vytvořit socket" @@ -6054,11 +6079,25 @@ msgstr "" "0 horní z vzdálenost, 0 rozestup rozhraní, koncentrický vzor a vypnutí " "nezávislé výšky podpůrné vrstvy" +msgid "" +"Layer height exceeds the limit in Printer Settings -> Extruder -> Layer " +"height limits ,this may cause printing quality issues." +msgstr "" + +msgid "Adjust to the set range automatically? \n" +msgstr "" + +msgid "Adjust" +msgstr "" + +msgid "Ignore" +msgstr "" + msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" "Při nahrávání časosběru bez nástrojové hlavy se doporučuje přidat " "\"Timelapse Wipe Tower\" \n" @@ -6077,6 +6116,15 @@ msgstr "Přesnost" msgid "Wall generator" msgstr "Generátor stěny" +msgid "Walls and surfaces" +msgstr "" + +msgid "Bridging" +msgstr "" + +msgid "Overhangs" +msgstr "" + msgid "Walls" msgstr "Stěny" @@ -6429,6 +6477,12 @@ msgstr[0] "Následující předvolba bude také smazána." msgstr[1] "Následující předvolby budou také smazány." msgstr[2] "" +msgid "" +"Are you sure to delete the selected preset? \n" +"If the preset corresponds to a filament currently in use on your printer, " +"please reset the filament information for that slot." +msgstr "" + #, boost-format msgid "Are you sure to %1% the selected preset?" msgstr "Opravdu chcete %1% vybrané předvolby?" @@ -6455,7 +6509,7 @@ msgstr "Nedefinováno" msgid "Unsaved Changes" msgstr "Neuložené změny" -msgid "Discard or Keep changes" +msgid "Transfer or discard changes" msgstr "Zahodit nebo ponechat změny" msgid "Old Value" @@ -6679,19 +6733,15 @@ msgstr "Šířka linky při rapidní extruzi" msgid "Ramming line spacing" msgstr "Rozestup linek při rapidní extruzi" -msgid "Auto-Calc" -msgstr "Automatický výpočet" - -msgid "Re-calculate" +msgid "Recalculate" msgstr "" msgid "Flushing volumes for filament change" msgstr "Čistící objemy pro výměnu filamentu" msgid "" -"Studio would re-calculate your flushing volumes everytime the filaments " -"color changed. You could disable the auto-calculate in Bambu Studio > " -"Preferences" +"Orca recalculates your flushing volumes everytime the filament colors " +"change. You can change this behavior in Preferences." msgstr "" msgid "Flushing volume (mm³) for each filament pair." @@ -6708,15 +6758,6 @@ msgstr "Násobitel by měl být v rozsahu [%.2f, %.2f]." msgid "Multiplier" msgstr "Multiplikátor" -msgid "unloaded" -msgstr "vyjmuto" - -msgid "loaded" -msgstr "zaváděn" - -msgid "Filament #" -msgstr "Filament #" - msgid "From" msgstr "Z" @@ -7084,6 +7125,9 @@ msgstr "Tisk" msgid "Idle" msgstr "Nečinný" +msgid "Beta version" +msgstr "" + msgid "Latest version" msgstr "Nejnovější verze" @@ -7451,6 +7495,25 @@ msgstr "" msgid "Variable layer height is not supported with Organic supports." msgstr "Variabilní výška vrstvy není podporována s organickými podpěrami." +msgid "" +"Different nozzle diameters and different filament diameters is not allowed " +"when prime tower is enabled." +msgstr "" + +msgid "" +"The Wipe Tower is currently only supported with the relative extruder " +"addressing (use_relative_e_distances=1)." +msgstr "" + +msgid "" +"Ooze prevention is currently not supported with the prime tower enabled." +msgstr "" + +msgid "" +"The prime tower is currently only supported for the Marlin, RepRap/Sprinter, " +"RepRapFirmware and Repetier G-code flavors." +msgstr "" + msgid "The prime tower is not supported in \"By object\" print." msgstr "Čistící Věž není podporován v tisku \"Podle objektu\" ." @@ -7529,11 +7592,6 @@ msgstr "" msgid "Layer height cannot exceed nozzle diameter" msgstr "Výška vrstvy nemůže překročit průměr trysky" -msgid "" -"Layer height cannot exceed the limit in Printer Settings -> Extruder -> " -"Layer height limits" -msgstr "" - msgid "" "Relative extruder addressing requires resetting the extruder position at " "each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to " @@ -7631,6 +7689,12 @@ msgstr "Výška pro tisk" msgid "Maximum printable height which is limited by mechanism of printer" msgstr "Maximální tisknutelná výška, která je omezena mechanismem tiskárny" +msgid "Preferred orientation" +msgstr "" + +msgid "Automatically orient stls on the Z-axis upon initial import" +msgstr "" + msgid "Printer preset names" msgstr "Názvy přednastavení tiskáren" @@ -7906,7 +7970,7 @@ msgid "Density of external bridges. 100% means solid bridge. Default is 100%." msgstr "" "Hustota externích mostů. 100 % znamená pevný most. Výchozí hodnota je 100 %." -msgid "Bridge flow" +msgid "Bridge flow ratio" msgstr "Průtok mostu" msgid "" @@ -7916,6 +7980,15 @@ msgstr "" "Snižte tuto hodnotu mírně (například 0,9), abyste snížili množství materiálu " "pro most a zlepšili prověšení" +msgid "Internal bridge flow ratio" +msgstr "" + +msgid "" +"This value governs the thickness of the internal bridge layer. This is the " +"first layer over sparse infill. Decrease this value slightly (for example " +"0.9) to improve surface quality over sparse infill." +msgstr "" + msgid "Top surface flow ratio" msgstr "Poměr průtoku horní vrstvy" @@ -8257,6 +8330,15 @@ msgstr "" "Pokud je zakázáno, mosty vypadají lépe, ale jsou spolehlivé jen pro kratší " "přemostění." +msgid "Thick internal bridges" +msgstr "" + +msgid "" +"If enabled, thick internal bridges will be used. It's usually recommended to " +"have this feature turned on. However, consider turning it off if you are " +"using large nozzles." +msgstr "" + msgid "Max bridge length" msgstr "Maximální délka mostu" @@ -8336,7 +8418,7 @@ msgid "Internal solid infill pattern" msgstr "Vzor vnitřní plné výplně" msgid "" -"Line pattern of internal solid infill. if the detect nattow internal solid " +"Line pattern of internal solid infill. if the detect narrow internal solid " "infill be enabled, the concentric pattern will be used for the small area." msgstr "" "Čárový vzor vnitřní plné výplně. Pokud je povolena detekce úzké vnitřní plné " @@ -8379,25 +8461,55 @@ msgstr "" "Toto nastavuje hraniční hodnotu pro malou délku obvodu. Výchozí hranice je 0 " "mm" -msgid "Order of walls" +msgid "Walls printing order" msgstr "" -msgid "Print sequence of inner wall and outer wall. " +msgid "" +"Print sequence of the internal (inner) and external (outer) walls. \n" +"\n" +"Use Inner/Outer for best overhangs. This is because the overhanging walls " +"can adhere to a neighouring perimeter while printing. However, this option " +"results in slightly reduced surface quality as the external perimeter is " +"deformed by being squashed to the internal perimeter.\n" +"\n" +"Use Inner/Outer/Inner for the best external surface finish and dimensional " +"accuracy as the external wall is printed undisturbed from an internal " +"perimeter. However, overhang performance will reduce as there is no internal " +"perimeter to print the external wall against. This option requires a minimum " +"of 3 walls to be effective as it prints the internal walls from the 3rd " +"perimeter onwards first, then the external perimeter and, finally, the first " +"internal perimeter. This option is recomended against the Outer/Inner option " +"in most cases. \n" +"\n" +"Use Outer/Inner for the same external wall quality and dimensional accuracy " +"benefits of Inner/Outer/Inner option. However, the z seams will appear less " +"consistent as the first extrusion of a new layer starts on a visible " +"surface.\n" +"\n" +" " msgstr "" -msgid "inner/outer" +msgid "Inner/Outer" msgstr "" -msgid "outer/inner" +msgid "Outer/Inner" msgstr "" -msgid "inner wall/outer wall/inner wall" +msgid "Inner/Outer/Inner" msgstr "" msgid "Print infill first" msgstr "" -msgid "Order of wall/infill. false means print wall first. " +msgid "" +"Order of wall/infill. When the tickbox is unchecked the walls are printed " +"first, which works best in most cases.\n" +"\n" +"Printing walls first may help with extreme overhangs as the walls have the " +"neighbouring infill to adhere to. However, the infill will slighly push out " +"the printed walls where it is attached to them, resulting in a worse " +"external surface finish. It can also cause the infill to shine through the " +"external surfaces of the part." msgstr "" msgid "Height to rod" @@ -8773,9 +8885,11 @@ msgstr "" msgid "Sparse infill density" msgstr "Hustota vnitřní výplně" -#, fuzzy, c-format -msgid "Density of internal sparse infill, 100% means solid throughout" -msgstr "Hustota vnitřní výplně, 100% znamená celistvou v celém rozsahu" +#, c-format, boost-format +msgid "" +"Density of internal sparse infill, 100% turns all sparse infill into solid " +"infill and internal solid infill pattern will be used" +msgstr "" msgid "Sparse infill pattern" msgstr "Vzor vnitřní výplně" @@ -9006,10 +9120,10 @@ msgstr "Maximální otáčky ventilátoru ve vrstvě" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " -"than \"close_fan_the_first_x_layers\", in which case the fan will be running " -"at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower than " +"\"close_fan_the_first_x_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." msgstr "" "Otáčky ventilátoru se lineárně zvýší z nuly ve vrstvě " "\"close_fan_first_layers\" na maximum ve vrstvě \"full_fan_speed_layer\". " @@ -9069,6 +9183,12 @@ msgid "" msgstr "" "Průměrná vzdálenost mezi náhodnými body zavedenými na každém segmentu linky" +msgid "Apply fuzzy skin to first layer" +msgstr "" + +msgid "Whether to apply fuzzy skin on the first layer" +msgstr "" + msgid "Filter out tiny gaps" msgstr "Odfiltrujte drobné mezery" @@ -9786,13 +9906,13 @@ msgstr "Formát názvu souboru" msgid "User can self-define the project file name when export" msgstr "Uživatel může sám definovat název souboru projektu při exportu" -msgid "Make overhang printable" +msgid "Make overhangs printable" msgstr "Umožnit tisk převisů" msgid "Modify the geometry to print overhangs without support material." msgstr "Upravit geometrii pro tisk převisů bez podpůrného materiálu." -msgid "Make overhang printable maximum angle" +msgid "Make overhangs printable - Maximum angle" msgstr "Umožnit tisk převisů maximálního úhlu" msgid "" @@ -9804,7 +9924,7 @@ msgstr "" "převisů. 90° nezmění model vůbec a umožní jakýkoli převis, zatímco 0 nahradí " "všechny převisy kuželovým materiálem." -msgid "Make overhang printable hole area" +msgid "Make overhangs printable - Hole area" msgstr "Oblast otvoru pro tisk převisu bez podpěr" msgid "" @@ -10069,6 +10189,9 @@ msgstr "" msgid "Show auto-calibration marks" msgstr "Zobrazit automatické kalibrační značky" +msgid "Disable set remaining print time" +msgstr "" + msgid "Seam position" msgstr "Pozice švu" @@ -10212,6 +10335,22 @@ msgstr "" "jednostěnný tisk s pevnými spodními vrstvami. Konečný vygenerovaný model " "nemá žádný šev" +msgid "Smooth Spiral" +msgstr "" + +msgid "" +"Smooth Spiral smoothes out X and Y moves as wellresulting in no visible seam " +"at all, even in the XY directions on walls that are not vertical" +msgstr "" + +msgid "Max XY Smoothing" +msgstr "" + +msgid "" +"Maximum distance to move points in XY to try to achieve a smooth spiralIf " +"expressed as a %, it will be computed over nozzle diameter" +msgstr "" + msgid "" "If smooth or traditional mode is selected, a timelapse video will be " "generated for each print. After each layer is printed, a snapshot is taken " @@ -10427,10 +10566,11 @@ msgstr "" "Filament pro tiskové podpěry základen a raftu. \"Výchozí\" znamená, že pro " "podpěry není použit žádný konkrétní filament a je použit aktuální filament" -msgid "No interface filament for body" +msgid "Avoid interface filament for base" msgstr "" -msgid "Don't use support interface filament to print support body" +msgid "" +"Avoid using support interface filament to print support base if possible." msgstr "" msgid "" @@ -10699,11 +10839,11 @@ msgstr "" "stabilitě tištěny s dvojitými stěnami. Nastavte tuto hodnotu na nulu, abyste " "zakázali dvojité stěny." -msgid "Tree support wall loops" -msgstr "Stěnové smyčky na podpěry stromů" +msgid "Support wall loops" +msgstr "" -msgid "This setting specify the count of walls around tree support" -msgstr "Toto nastavení určuje počet stěn kolem podpěry stromu" +msgid "This setting specify the count of walls around support" +msgstr "" msgid "Tree support with infill" msgstr "Podpěry stromu s výplní" @@ -10829,9 +10969,16 @@ msgid "Wipe Distance" msgstr "Vzdálenost čištění" msgid "" -"Discribe how long the nozzle will move along the last path when retracting" +"Discribe how long the nozzle will move along the last path when " +"retracting. \n" +"\n" +"Depending on how long the wipe operation lasts, how fast and long the " +"extruder/filament retraction settings are, a retraction move may be needed " +"to retract the remaining filament. \n" +"\n" +"Setting a value in the retract amount before wipe setting below will perform " +"any excess retraction before the wipe, else it will be performed after." msgstr "" -"Popište, jak dlouho se bude tryska při retrakci pohybovat po poslední dráze" msgid "" "The wiping tower can be used to clean up the residue on the nozzle and " @@ -11170,10 +11317,6 @@ msgstr "" msgid "invalid value " msgstr "neplatná hodnota " -#, c-format, boost-format -msgid " doesn't work at 100%% density " -msgstr " nefunguje při 100%% hustotě " - msgid "Invalid value when spiral vase mode is enabled: " msgstr "Neplatná hodnota, když je povolen režim spirálové vázy: " @@ -12133,6 +12276,731 @@ msgstr "Část 2" msgid "Delete input" msgstr "Smazat vstup" +msgid "Network Test" +msgstr "" + +msgid "Start Test Multi-Thread" +msgstr "" + +msgid "Start Test Single-Thread" +msgstr "" + +msgid "Export Log" +msgstr "" + +msgid "Studio Version:" +msgstr "" + +msgid "System Version:" +msgstr "" + +msgid "DNS Server:" +msgstr "" + +msgid "Test BambuLab" +msgstr "" + +msgid "Test BambuLab:" +msgstr "" + +msgid "Test Bing.com" +msgstr "" + +msgid "Test bing.com:" +msgstr "" + +msgid "Test HTTP" +msgstr "" + +msgid "Test HTTP Service:" +msgstr "" + +msgid "Test storage" +msgstr "" + +msgid "Test Storage Upload:" +msgstr "" + +msgid "Test storage upgrade" +msgstr "" + +msgid "Test Storage Upgrade:" +msgstr "" + +msgid "Test storage download" +msgstr "" + +msgid "Test Storage Download:" +msgstr "" + +msgid "Test plugin download" +msgstr "" + +msgid "Test Plugin Download:" +msgstr "" + +msgid "Test Storage Upload" +msgstr "" + +msgid "Log Info" +msgstr "" + +msgid "Select filament preset" +msgstr "" + +msgid "Create Filament" +msgstr "" + +msgid "Create Based on Current Filament" +msgstr "" + +msgid "Copy Current Filament Preset " +msgstr "" + +msgid "Basic Information" +msgstr "" + +msgid "Add Filament Preset under this filament" +msgstr "" + +msgid "We could create the filament presets for your following printer:" +msgstr "" + +msgid "Select Vendor" +msgstr "" + +msgid "Input Custom Vendor" +msgstr "" + +msgid "Can't find vendor I want" +msgstr "" + +msgid "Select Type" +msgstr "" + +msgid "Select Filament Preset" +msgstr "" + +msgid "Serial" +msgstr "" + +msgid "e.g. Basic, Matte, Silk, Marble" +msgstr "" + +msgid "Filament Preset" +msgstr "" + +msgid "Create" +msgstr "" + +msgid "Vendor is not selected, please reselect vendor." +msgstr "" + +msgid "Custom vendor is not input, please input custom vendor." +msgstr "" + +msgid "" +"\"Bambu\" or \"Generic\" can not be used as a Vendor for custom filaments." +msgstr "" + +msgid "Filament type is not selected, please reselect type." +msgstr "" + +msgid "Filament serial is not inputed, please input serial." +msgstr "" + +msgid "" +"There may be escape characters in the vendor or serial input of filament. " +"Please delete and re-enter." +msgstr "" + +msgid "All inputs in the custom vendor or serial are spaces. Please re-enter." +msgstr "" + +msgid "The vendor can not be a number. Please re-enter." +msgstr "" + +msgid "" +"You have not selected a printer or preset yet. Please select at least one." +msgstr "" + +msgid "Some existing presets have failed to be created, as follows:\n" +msgstr "" + +msgid "" +"\n" +"Do you want to rewrite it?" +msgstr "" + +msgid "" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" +"To add preset for more prinetrs, Please go to printer selection" +msgstr "" + +msgid "Create Printer/Nozzle" +msgstr "" + +msgid "Create Printer" +msgstr "" + +msgid "Create Nozzle for Existing Printer" +msgstr "" + +msgid "Create from Template" +msgstr "" + +msgid "Create Based on Current Printer" +msgstr "" + +msgid "wiki" +msgstr "" + +msgid "Import Preset" +msgstr "" + +msgid "Create Type" +msgstr "" + +msgid "The model is not fond, place reselect vendor." +msgstr "" + +msgid "Select Model" +msgstr "" + +msgid "Select Printer" +msgstr "" + +msgid "Input Custom Model" +msgstr "" + +msgid "Can't find my printer model" +msgstr "" + +msgid "Rectangle" +msgstr "" + +msgid "Printable Space" +msgstr "" + +msgid "X" +msgstr "" + +msgid "Y" +msgstr "" + +msgid "Hot Bed STL" +msgstr "" + +msgid "Load stl" +msgstr "" + +msgid "Hot Bed SVG" +msgstr "" + +msgid "Load svg" +msgstr "" + +msgid "Max Print Height" +msgstr "" + +#, c-format, boost-format +msgid "The file exceeds %d MB, please import again." +msgstr "" + +msgid "Exception in obtaining file size, please import again." +msgstr "" + +msgid "Preset path is not find, please reselect vendor." +msgstr "" + +msgid "The printer model was not found, please reselect." +msgstr "" + +msgid "The nozzle diameter is not fond, place reselect." +msgstr "" + +msgid "The printer preset is not fond, place reselect." +msgstr "" + +msgid "Printer Preset" +msgstr "" + +msgid "Filament Preset Template" +msgstr "" + +msgid "Deselect All" +msgstr "" + +msgid "Process Preset Template" +msgstr "" + +msgid "Back Page 1" +msgstr "" + +msgid "" +"You have not yet chosen which printer preset to create based on. Please " +"choose the vendor and model of the printer" +msgstr "" + +msgid "" +"You have entered an illegal input in the printable area section on the first " +"page. Please check before creating it." +msgstr "" + +msgid "The custom printer or model is not inputed, place input." +msgstr "" + +msgid "" +"The printer preset you created already has a preset with the same name. Do " +"you want to overwrite it?\n" +"\tYes: Overwrite the printer preset with the same name, and filament and " +"process presets with the same preset name will be recreated \n" +"and filament and process presets without the same preset name will be " +"reserve.\n" +"\tCancel: Do not create a preset, return to the creation interface." +msgstr "" + +msgid "You need to select at least one filament preset." +msgstr "" + +msgid "You need to select at least one process preset." +msgstr "" + +msgid "Create filament presets failed. As follows:\n" +msgstr "" + +msgid "Create process presets failed. As follows:\n" +msgstr "" + +msgid "Vendor is not find, please reselect." +msgstr "" + +msgid "Current vendor has no models, please reselect." +msgstr "" + +msgid "" +"You have not selected the vendor and model or inputed the custom vendor and " +"model." +msgstr "" + +msgid "" +"There may be escape characters in the custom printer vendor or model. Please " +"delete and re-enter." +msgstr "" + +msgid "" +"All inputs in the custom printer vendor or model are spaces. Please re-enter." +msgstr "" + +msgid "Please check bed printable shape and origin input." +msgstr "" + +msgid "" +"You have not yet selected the printer to replace the nozzle, please choose." +msgstr "" + +msgid "Create Printer Successful" +msgstr "" + +msgid "Create Filament Successful" +msgstr "" + +msgid "Printer Created" +msgstr "" + +msgid "Please go to printer settings to edit your presets" +msgstr "" + +msgid "Filament Created" +msgstr "" + +msgid "" +"Please go to filament setting to edit your presets if you need.\n" +"Please note that nozzle temperature, hot bed temperature, and maximum " +"volumetric speed have a significant impact on printing quality. Please set " +"them carefully." +msgstr "" + +msgid "Printer Setting" +msgstr "" + +msgid "Export Configs" +msgstr "" + +msgid "Printer config bundle(.bbscfg)" +msgstr "" + +msgid "Filament bundle(.bbsflmt)" +msgstr "" + +msgid "Printer presets(.zip)" +msgstr "" + +msgid "Filament presets(.zip)" +msgstr "" + +msgid "Process presets(.zip)" +msgstr "" + +msgid "initialize fail" +msgstr "" + +msgid "add file fail" +msgstr "" + +msgid "add bundle structure file fail" +msgstr "" + +msgid "finalize fail" +msgstr "" + +msgid "open zip written fail" +msgstr "" + +msgid "Export successful" +msgstr "" + +#, c-format, boost-format +msgid "" +"The '%s' folder already exists in the current directory. Do you want to " +"clear it and rebuild it.\n" +"If not, a time suffix will be added, and you can modify the name after " +"creation." +msgstr "" + +msgid "" +"Printer and all the filament&process presets that belongs to the printer. \n" +"Can be shared with others." +msgstr "" + +msgid "" +"User's fillment preset set. \n" +"Can be shared with others." +msgstr "" + +msgid "" +"Only display printer names with changes to printer, filament, and process " +"presets." +msgstr "" + +msgid "Only display the filament names with changes to filament presets." +msgstr "" + +msgid "" +"Only printer names with user printer presets will be displayed, and each " +"preset you choose will be exported as a zip." +msgstr "" + +msgid "" +"Only the filament names with user filament presets will be displayed, \n" +"and all user filament presets in each filament name you select will be " +"exported as a zip." +msgstr "" + +msgid "" +"Only printer names with changed process presets will be displayed, \n" +"and all user process presets in each printer name you select will be " +"exported as a zip." +msgstr "" + +msgid "Please select at least one printer or filament." +msgstr "" + +msgid "Please select a type you want to export" +msgstr "" + +msgid "Edit Filament" +msgstr "" + +msgid "Filament presets under this filament" +msgstr "" + +msgid "" +"Note: If the only preset under this filament is deleted, the filament will " +"be deleted after exiting the dialog." +msgstr "" + +msgid "Presets inherited by other presets can not be deleted" +msgstr "" + +msgid "The following presets inherits this preset." +msgid_plural "The following preset inherits this preset." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +msgid "Delete Preset" +msgstr "" + +msgid "Are you sure to delete the selected preset?" +msgstr "" + +msgid "Delete preset" +msgstr "" + +msgid "+ Add Preset" +msgstr "" + +msgid "Delete Filament" +msgstr "" + +msgid "" +"All the filament presets belong to this filament would be deleted. \n" +"If you are using this filament on your printer, please reset the filament " +"information for that slot." +msgstr "" + +msgid "Delete filament" +msgstr "" + +msgid "Add Preset" +msgstr "" + +msgid "Add preset for new printer" +msgstr "" + +msgid "Copy preset from filament" +msgstr "" + +msgid "The filament choice not find filament preset, please reselect it" +msgstr "" + +msgid "Edit Preset" +msgstr "" + +msgid "For more information, please check out Wiki" +msgstr "" + +msgid "Collapse" +msgstr "" + +msgid "Daily Tips" +msgstr "" + +msgid "Need select printer" +msgstr "Je nutné vybrat tiskárnu" + +msgid "The start, end or step is not valid value." +msgstr "Počáteční, koncová nebo kroková hodnota není platná." + +msgid "" +"Unable to calibrate: maybe because the set calibration value range is too " +"large, or the step is too small" +msgstr "" +"Nelze provést kalibraci: možná je rozsah kalibračních hodnot nastaven příliš " +"velký nebo krok je příliš malý" + +msgid "Physical Printer" +msgstr "Fyzická tiskárna" + +msgid "Print Host upload" +msgstr "Nahrávání do tiskového serveru" + +msgid "Could not get a valid Printer Host reference" +msgstr "Nelze získat platný odkaz na tiskový server" + +msgid "Success!" +msgstr "Úspěch!" + +msgid "Refresh Printers" +msgstr "Obnovit tiskárny" + +msgid "" +"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" +"signed certificate." +msgstr "" +"Soubor HTTPS CA je volitelný. Je nutný pouze pokud použijte HTTPS certifikát " +"s vlastním podpisem." + +msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" +msgstr "Soubory s certifikátem (*.crt, *.pem)|*.crt;*.pem|Všechny soubory|*.*" + +msgid "Open CA certificate file" +msgstr "Otevřít soubor s certifikátem CA" + +#, c-format, boost-format +msgid "" +"On this system, %s uses HTTPS certificates from the system Certificate Store " +"or Keychain." +msgstr "" +"V tomto systému používá %s certifikáty HTTPS ze systému Certificate Store " +"nebo Keychain." + +msgid "" +"To use a custom CA file, please import your CA file into Certificate Store / " +"Keychain." +msgstr "" +"Chcete-li použít vlastní soubor CA, importujte soubor CA do Certificate " +"Store / Keychain." + +msgid "Connection to printers connected via the print host failed." +msgstr "" +"Připojení k tiskárnám připojených prostřednictvím tiskového serveru se " +"nezdařilo." + +#, c-format, boost-format +msgid "Mismatched type of print host: %s" +msgstr "" + +msgid "Connection to AstroBox works correctly." +msgstr "" + +msgid "Could not connect to AstroBox" +msgstr "" + +msgid "Note: AstroBox version at least 1.1.0 is required." +msgstr "" + +msgid "Connection to Duet works correctly." +msgstr "" + +msgid "Could not connect to Duet" +msgstr "" + +msgid "Unknown error occured" +msgstr "" + +msgid "Wrong password" +msgstr "" + +msgid "Could not get resources to create a new connection" +msgstr "" + +msgid "Upload not enabled on FlashAir card." +msgstr "" + +msgid "Connection to FlashAir works correctly and upload is enabled." +msgstr "" + +msgid "Could not connect to FlashAir" +msgstr "" + +msgid "" +"Note: FlashAir with firmware 2.00.02 or newer and activated upload function " +"is required." +msgstr "" + +msgid "Connection to MKS works correctly." +msgstr "" + +msgid "Could not connect to MKS" +msgstr "" + +msgid "Connection to OctoPrint works correctly." +msgstr "" + +msgid "Could not connect to OctoPrint" +msgstr "" + +msgid "Note: OctoPrint version at least 1.1.0 is required." +msgstr "" + +msgid "Connection to Prusa SL1 / SL1S works correctly." +msgstr "" + +msgid "Could not connect to Prusa SLA" +msgstr "" + +msgid "Connection to PrusaLink works correctly." +msgstr "" + +msgid "Could not connect to PrusaLink" +msgstr "" + +msgid "Storages found" +msgstr "" + +#. TRN %1% = storage path +#, boost-format +msgid "%1% : read only" +msgstr "" + +#. TRN %1% = storage path +#, boost-format +msgid "%1% : no free space" +msgstr "" + +#. TRN %1% = host +#, boost-format +msgid "Upload has failed. There is no suitable storage found at %1%." +msgstr "" + +msgid "Connection to Prusa Connect works correctly." +msgstr "" + +msgid "Could not connect to Prusa Connect" +msgstr "" + +msgid "Connection to Repetier works correctly." +msgstr "" + +msgid "Could not connect to Repetier" +msgstr "" + +msgid "Note: Repetier version at least 0.90.0 is required." +msgstr "" + +#, boost-format +msgid "" +"HTTP status: %1%\n" +"Message body: \"%2%\"" +msgstr "" + +#, boost-format +msgid "" +"Parsing of host response failed.\n" +"Message body: \"%1%\"\n" +"Error: \"%2%\"" +msgstr "" + +#, boost-format +msgid "" +"Enumeration of host printers failed.\n" +"Message body: \"%1%\"\n" +"Error: \"%2%\"" +msgstr "" + +#: resources/data/hints.ini: [hint:Precise wall] +msgid "" +"Precise wall\n" +"Did you know that turning on precise wall can improve precision and layer " +"consistency?" +msgstr "" + +#: resources/data/hints.ini: [hint:Sandwich mode] +msgid "" +"Sandwich mode\n" +"Did you know that you can use sandwich mode (inner-outer-inner) to improve " +"precision and layer consistency if your model doesn't have very steep " +"overhangs?" +msgstr "" + +#: resources/data/hints.ini: [hint:Chamber temperature] +msgid "" +"Chamber temperature\n" +"Did you know that OrcaSlicer supports chamber temperature?" +msgstr "" + +#: resources/data/hints.ini: [hint:Calibration] +msgid "" +"Calibration\n" +"Did you know that calibrating your printer can do wonders? Check out our " +"beloved calibration solution in OrcaSlicer." +msgstr "" + +#: resources/data/hints.ini: [hint:Auxiliary fan] +msgid "" +"Auxiliary fan\n" +"Did you know that OrcaSlicer supports Auxiliary part cooling fan?" +msgstr "" + +#: resources/data/hints.ini: [hint:Air filtration] +msgid "" +"Air filtration/Exhuast Fan\n" +"Did you know that OrcaSlicer can support Air filtration/Exhuast Fan?" +msgstr "" + #: resources/data/hints.ini: [hint:How to use keyboard shortcuts] msgid "" "How to use keyboard shortcuts\n" @@ -12193,8 +13061,8 @@ msgid "" msgstr "" "Plochou na podložku\n" "Věděli jste, že můžete rychle nastavit orientaci modelu tak, aby jedna z " -"jeho stěn spočívala na tiskovém podloží? Vyberte funkci \"Plochou na " -"podložku\" nebo stiskněte klávesu F." +"jeho stěn spočívala na tiskovém podloží? Vyberte funkci \"Plochou na podložku" +"\" nebo stiskněte klávesu F." #: resources/data/hints.ini: [hint:Object List] msgid "" @@ -12217,13 +13085,8 @@ msgstr "" msgid "" "Simplify Model\n" "Did you know that you can reduce the number of triangles in a mesh using the " -"Simplify mesh feature? Right-click the model and select Simplify model. Read " -"more in the documentation." +"Simplify mesh feature? Right-click the model and select Simplify model." msgstr "" -"Zjednodušit model\n" -"Věděli jste, že můžete snížit počet trojúhelníků v síti pomocí funkce " -"Zjednodušit síť? Klikněte pravým tlačítkem na model a vyberte možnost " -"Zjednodušit model. Více informací najdete v dokumentaci." #: resources/data/hints.ini: [hint:Slicing Parameter Table] msgid "" @@ -12250,13 +13113,8 @@ msgid "" "Subtract a Part\n" "Did you know that you can subtract one mesh from another using the Negative " "part modifier? That way you can, for example, create easily resizable holes " -"directly in Orca Slicer. Read more in the documentation." +"directly in Orca Slicer." msgstr "" -"Odečíst část\n" -"Věděli jste, že můžete odečíst jednu síťovinu od druhé pomocí negativního " -"modifikátoru části? Tímto způsobem můžete například vytvářet snadno " -"nastavitelné otvory přímo v programu Orca Slicer. Přečtěte si více v " -"dokumentaci." #: resources/data/hints.ini: [hint:STEP] msgid "" @@ -12420,6 +13278,122 @@ msgid "" "probability of warping." msgstr "" +#~ msgid "Edit Text" +#~ msgstr "Upravit text" + +#~ msgid "Error! Unable to create thread!" +#~ msgstr "Chyba! Nelze vytvořit vlákno!" + +#~ msgid "Exception" +#~ msgstr "Výjimka" + +#~ msgid "Choose SLA archive:" +#~ msgstr "Vyberte SLA archiv:" + +#~ msgid "Import file" +#~ msgstr "Importovat soubor" + +#~ msgid "Import model and profile" +#~ msgstr "Importovat model a profil" + +#~ msgid "Import profile only" +#~ msgstr "Importovat pouze profil" + +#~ msgid "Import model only" +#~ msgstr "Importujte pouze model" + +#~ msgid "Accurate" +#~ msgstr "Přesné" + +#~ msgid "Balanced" +#~ msgstr "Vyvážené" + +#~ msgid "Quick" +#~ msgstr "Rychlé" + +#~ msgid "Auto-Calc" +#~ msgstr "Automatický výpočet" + +#~ msgid "unloaded" +#~ msgstr "vyjmuto" + +#~ msgid "loaded" +#~ msgstr "zaváděn" + +#~ msgid "Filament #" +#~ msgstr "Filament #" + +#~ msgid "" +#~ "Discribe how long the nozzle will move along the last path when retracting" +#~ msgstr "" +#~ "Popište, jak dlouho se bude tryska při retrakci pohybovat po poslední " +#~ "dráze" + +#~ msgid "" +#~ "Simplify Model\n" +#~ "Did you know that you can reduce the number of triangles in a mesh using " +#~ "the Simplify mesh feature? Right-click the model and select Simplify " +#~ "model. Read more in the documentation." +#~ msgstr "" +#~ "Zjednodušit model\n" +#~ "Věděli jste, že můžete snížit počet trojúhelníků v síti pomocí funkce " +#~ "Zjednodušit síť? Klikněte pravým tlačítkem na model a vyberte možnost " +#~ "Zjednodušit model. Více informací najdete v dokumentaci." + +#~ msgid "" +#~ "Subtract a Part\n" +#~ "Did you know that you can subtract one mesh from another using the " +#~ "Negative part modifier? That way you can, for example, create easily " +#~ "resizable holes directly in Orca Slicer. Read more in the documentation." +#~ msgstr "" +#~ "Odečíst část\n" +#~ "Věděli jste, že můžete odečíst jednu síťovinu od druhé pomocí negativního " +#~ "modifikátoru části? Tímto způsobem můžete například vytvářet snadno " +#~ "nastavitelné otvory přímo v programu Orca Slicer. Přečtěte si více v " +#~ "dokumentaci." + +#~ msgid "Filling bed " +#~ msgstr "Vyplňování podložky " + +#, boost-format +#~ msgid "%1% infill pattern doesn't support 100%% density." +#~ msgstr "%1% vzor výplně nepodporuje 100%% hustotu." + +#~ msgid "" +#~ "Switch to rectilinear pattern?\n" +#~ "Yes - switch to rectilinear pattern automaticlly\n" +#~ "No - reset density to default non 100% value automaticlly" +#~ msgstr "" +#~ "Přepnout na přímočarý vzor?\n" +#~ "Ano - přepnout na přímočarý vzor automaticky\n" +#~ "Ne - automaticky resetovat hustotu na výchozí ne 100% hodnotu" + +#~ msgid "Please heat the nozzle to above 170 degree before loading filament." +#~ msgstr "Před vložením filamentu zahřejte trysku na více než 170 stupňů." + +#~ msgid "Newer 3mf version" +#~ msgstr "Novější verze 3mf" + +#~ msgid "Show g-code window" +#~ msgstr "Zobrazit okno s G-kódem" + +#~ msgid "If enabled, g-code window will be displayed." +#~ msgstr "Pokud je povoleno, zobrazí se okno s G-kódem." + +#, fuzzy, c-format +#~ msgid "Density of internal sparse infill, 100% means solid throughout" +#~ msgstr "Hustota vnitřní výplně, 100% znamená celistvou v celém rozsahu" + +#~ msgid "Tree support wall loops" +#~ msgstr "Stěnové smyčky na podpěry stromů" + +#~ msgid "This setting specify the count of walls around tree support" +#~ msgstr "Toto nastavení určuje počet stěn kolem podpěry stromu" + +#, c-format, boost-format +#~ msgid " doesn't work at 100%% density " +#~ msgstr " nefunguje při 100%% hustotě " + #~ msgid "Ctrl + Shift + Enter" #~ msgstr "Ctrl + Shift + Enter" @@ -12441,9 +13415,6 @@ msgstr "" #~ msgid "Export all objects as STL" #~ msgstr "Exportovat všechny objekty jako STL" -#~ msgid "Slice ok." -#~ msgstr "Slicování Dokončeno." - #, c-format, boost-format #~ msgid "" #~ "The 3mf's version %s is newer than %s's version %s, Found following keys " @@ -12472,15 +13443,6 @@ msgstr "" #~ msgid "Add/Remove printers" #~ msgstr "Přidat/Odebrat tiskárny" -#~ msgid "Bambu Engineering Plate" -#~ msgstr "Bambu Engineering Podložka" - -#~ msgid "Bambu Smooth PEI Plate" -#~ msgstr "Bambu Smooth PEI Podložka" - -#~ msgid "Bambu Textured PEI Plate" -#~ msgstr "Bambu Textured PEI Podložka" - #~ msgid "" #~ "When print by object, machines with I3 structure will not generate " #~ "timelapse videos." @@ -12687,68 +13649,6 @@ msgstr "" #~ msgid "The selected preset: %1% is not found." #~ msgstr "Vybraná předvolba: %1% nebyla nalezena." -#~ msgid "Physical Printer" -#~ msgstr "Fyzická tiskárna" - -#~ msgid "Print Host upload" -#~ msgstr "Nahrávání do tiskového serveru" - -#~ msgid "Could not get a valid Printer Host reference" -#~ msgstr "Nelze získat platný odkaz na tiskový server" - -#~ msgid "Success!" -#~ msgstr "Úspěch!" - -#~ msgid "Refresh Printers" -#~ msgstr "Obnovit tiskárny" - -#~ msgid "" -#~ "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" -#~ "signed certificate." -#~ msgstr "" -#~ "Soubor HTTPS CA je volitelný. Je nutný pouze pokud použijte HTTPS " -#~ "certifikát s vlastním podpisem." - -#~ msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" -#~ msgstr "" -#~ "Soubory s certifikátem (*.crt, *.pem)|*.crt;*.pem|Všechny soubory|*.*" - -#~ msgid "Open CA certificate file" -#~ msgstr "Otevřít soubor s certifikátem CA" - -#, c-format, boost-format -#~ msgid "" -#~ "On this system, %s uses HTTPS certificates from the system Certificate " -#~ "Store or Keychain." -#~ msgstr "" -#~ "V tomto systému používá %s certifikáty HTTPS ze systému Certificate Store " -#~ "nebo Keychain." - -#~ msgid "" -#~ "To use a custom CA file, please import your CA file into Certificate " -#~ "Store / Keychain." -#~ msgstr "" -#~ "Chcete-li použít vlastní soubor CA, importujte soubor CA do Certificate " -#~ "Store / Keychain." - -#~ msgid "Connection to printers connected via the print host failed." -#~ msgstr "" -#~ "Připojení k tiskárnám připojených prostřednictvím tiskového serveru se " -#~ "nezdařilo." - -#~ msgid "The start, end or step is not valid value." -#~ msgstr "Počáteční, koncová nebo kroková hodnota není platná." - -#~ msgid "" -#~ "Unable to calibrate: maybe because the set calibration value range is too " -#~ "large, or the step is too small" -#~ msgstr "" -#~ "Nelze provést kalibraci: možná je rozsah kalibračních hodnot nastaven " -#~ "příliš velký nebo krok je příliš malý" - -#~ msgid "Need select printer" -#~ msgstr "Je nutné vybrat tiskárnu" - #~ msgid "" #~ "3D Scene Operations\n" #~ "Did you know how to control view and object/part selection with mouse and " @@ -12908,7 +13808,7 @@ msgstr "" #~ msgid "Score" #~ msgstr "Hodnocení" -#~ msgid "Bamabu High Temperature Plate" +#~ msgid "Bambu High Temperature Plate" #~ msgstr "Bambu vysoká teplota Podlozky" #~ msgid "Can't connect to the printer" diff --git a/localization/i18n/de/OrcaSlicer_de.po b/localization/i18n/de/OrcaSlicer_de.po index d08ca4d82e..57a787a3b1 100644 --- a/localization/i18n/de/OrcaSlicer_de.po +++ b/localization/i18n/de/OrcaSlicer_de.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-24 18:09+0100\n" +"POT-Creation-Date: 2023-12-19 22:09+0800\n" "PO-Revision-Date: \n" "Last-Translator: Heiko Liebscher \n" "Language-Team: \n" @@ -295,6 +295,12 @@ msgstr "Alle Verbinder auswählen" msgid "Cut" msgstr "Schneiden" +msgid "non-mainifold edges be caused by cut tool, do you want to fix it now?" +msgstr "" + +msgid "Repairing model object" +msgstr "Modellobjekt reparieren" + msgid "Connector" msgstr "Verbinder" @@ -871,6 +877,24 @@ msgstr "Supportblocker hinzufügen" msgid "Add support enforcer" msgstr "Supportverstärker hinzufügen" +msgid "Add text" +msgstr "Text hinzufügen" + +msgid "Add negative text" +msgstr "Negativen Text hinzufügen" + +msgid "Add text modifier" +msgstr "Textmodifizierer hinzufügen" + +msgid "Add SVG part" +msgstr "SVG Teil hinzufügen" + +msgid "Add negative SVG" +msgstr "Negatives SVG hinzufügen" + +msgid "Add SVG modifier" +msgstr "SVG Modifizierer hinzufügen" + msgid "Select settings" msgstr "Wähle Einstellungen" @@ -886,9 +910,6 @@ msgstr "Entf" msgid "Delete the selected object" msgstr "Ausgewähltes Objekt löschen" -msgid "Edit Text" -msgstr "Text bearbeiten" - msgid "Load..." msgstr "Laden..." @@ -913,6 +934,12 @@ msgstr "Zylinder" msgid "Cone" msgstr "Kegel" +msgid "Text" +msgstr "T" + +msgid "SVG" +msgstr "SVG" + msgid "Height range Modifier" msgstr "Höhen Modifizieren" @@ -1048,6 +1075,18 @@ msgstr "Spiegeln" msgid "Mirror object" msgstr "Objekt spiegeln" +msgid "Edit text" +msgstr "Text bearbeiten" + +msgid "Ability to change text, font, size, ..." +msgstr "Möglichkeit, Text, Schriftart, Größe, ... zu ändern" + +msgid "Edit SVG" +msgstr "SVG bearbeiten" + +msgid "Change SVG source file, projection, size, ..." +msgstr "Ändern der SVG-Quelldatei, Projektion, Größe, ..." + msgid "Invalidate cut info" msgstr "Fehlerhafte Schnitt Info" @@ -1215,9 +1254,6 @@ msgid "Click the icon to shift this object to the bed" msgstr "" "Klicken Sie auf das Symbol, um dieses Objekt auf das Bett zu verschieben." -msgid " search results" -msgstr " Suchergebnisse" - msgid "Loading file" msgstr "Lade Datei" @@ -1368,9 +1404,6 @@ msgstr "Neuen Namen eingeben" msgid "Renaming" msgstr "Wird umbenannt" -msgid "Repairing model object" -msgstr "Modellobjekt reparieren" - msgid "Following model object has been repaired" msgid_plural "Following model objects have been repaired" msgstr[0] "Das folgende Modellobjekt wurde repariert" @@ -1706,12 +1739,6 @@ msgstr "" msgid "Arranging..." msgstr "Anordnen..." -msgid "" -"Arrange failed. Found some exceptions when processing object geometries." -msgstr "" -"Anordnen fehlgeschlagen. Bei der Verarbeitung von Objektgeometrien wurden " -"einige Ausnahmen gefunden." - msgid "Arranging" msgstr "Anordnen" @@ -1727,6 +1754,12 @@ msgstr "" msgid "Arranging done." msgstr "Anordnung beendet." +msgid "" +"Arrange failed. Found some exceptions when processing object geometries." +msgstr "" +"Anordnen fehlgeschlagen. Bei der Verarbeitung von Objektgeometrien wurden " +"einige Ausnahmen gefunden." + #, c-format, boost-format msgid "" "Arrangement ignored the following objects which can't fit into a single " @@ -1757,8 +1790,11 @@ msgstr "Ausrichten..." msgid "Orienting" msgstr "Ausrichten" -msgid "Filling bed " -msgstr "Bett füllen" +msgid "Orienting canceled." +msgstr "Ausrichten abgebrochen." + +msgid "Filling" +msgstr "Füllen" msgid "Bed filling canceled." msgstr "Bettfüllung abgebrochen." @@ -1766,11 +1802,14 @@ msgstr "Bettfüllung abgebrochen." msgid "Bed filling done." msgstr "Bettfüllung fertig." -msgid "Error! Unable to create thread!" -msgstr "Fehler. Thread kann nicht erstellt werden." +msgid "Searching for optimal orientation" +msgstr "Suche nach optimaler Ausrichtung" -msgid "Exception" -msgstr "Ausnahme" +msgid "Orientation search canceled." +msgstr "Suche nach Ausrichtung abgebrochen." + +msgid "Orientation found." +msgstr "Ausrichtung gefunden." msgid "Logging in" msgstr "Einloggen" @@ -1846,14 +1885,6 @@ msgstr "Druckauftrag über den Cloud-Dienst senden" msgid "Print task sending times out." msgstr "Zeitüberschreitung beim Senden des Druckauftrags." -msgid "" -"The printer timed out while receiving a print job. Please check if the " -"network is functioning properly and send the print again." -msgstr "" -"Der Drucker hat beim Empfangen eines Druckauftrags eine Zeitüberschreitung " -"erhalten. Bitte überprüfen Sie, ob das Netzwerk ordnungsgemäß funktioniert, " -"und senden Sie den Druck erneut." - msgid "Service Unavailable" msgstr "Der Dienst ist nicht verfügbar" @@ -1887,30 +1918,6 @@ msgstr "Erfolgreich gesendet. Aktuelle Seite wird in %s s geschlossen" msgid "An SD card needs to be inserted before sending to printer." msgstr "Vor dem Senden an den Drucker muss eine SD-Karte eingelegt werden." -msgid "Choose SLA archive:" -msgstr "SLA-Archiv auswählen:" - -msgid "Import file" -msgstr "Datei importieren" - -msgid "Import model and profile" -msgstr "Modell und Profil importieren" - -msgid "Import profile only" -msgstr "Nur Profil importieren" - -msgid "Import model only" -msgstr "Importiere nur das Modell" - -msgid "Accurate" -msgstr "Genau" - -msgid "Balanced" -msgstr "Gleichmäßig" - -msgid "Quick" -msgstr "Schnell" - msgid "Importing SLA archive" msgstr "SLA-Archiv importieren" @@ -2690,19 +2697,6 @@ msgstr "" "JA - Reinigungsturm beibehalten\n" "NEIN - unabhängige Stütz-Schichthöhen beibehalten" -#, boost-format -msgid "%1% infill pattern doesn't support 100%% density." -msgstr "Das %1% Füllmuster unterstützt keine 100%% Dichte." - -msgid "" -"Switch to rectilinear pattern?\n" -"Yes - switch to rectilinear pattern automaticlly\n" -"No - reset density to default non 100% value automaticlly" -msgstr "" -"Zu geradlinigen Mustern wechseln?\n" -"Ja - Automatisches auf das geradlinige Muster wechseln\n" -"Nein - Dichte automatisch auf den Standardwert unter 100% zurücksetzen" - msgid "" "While printing by Object, the extruder may collide skirt.\n" "Thus, reset the skirt layer to 1 to avoid that." @@ -2805,6 +2799,18 @@ msgstr "Pausiert durch den vom Benutzer eingefügten G-Code" msgid "Motor noise showoff" msgstr "Motorgeräusch-Showoff" +msgid "Nozzle filament covered detected pause" +msgstr "Pause bei Erkennung von der Düsenfilamentabdeckung" + +msgid "Cutter error pause" +msgstr "Pause bei Cutter-Fehler" + +msgid "First layer error pause" +msgstr "Pause bei Fehler der ersten Schicht" + +msgid "Nozzle clog pause" +msgstr "Pause bei Düsenverstopfung" + msgid "MC" msgstr "MC" @@ -3282,7 +3288,7 @@ msgstr "Volumen:" msgid "Size:" msgstr "Größe:" -#, boost-format +#, c-format, boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -3664,6 +3670,18 @@ msgstr "Perspektivische Ansicht verwenden" msgid "Use Orthogonal View" msgstr "Orthogonale Ansicht verwenden" +msgid "Show &G-code Window" +msgstr "&G-Code-Fenster anzeigen" + +msgid "Show g-code window in Previce scene" +msgstr "G-Code-Fenster in der Vorschau anzeigen" + +msgid "Reset Window Layout" +msgstr "Window-Layout zurücksetzen" + +msgid "Reset to default window layout" +msgstr "Reset auf Standard-Layout" + msgid "Show &Labels" msgstr "&Bezeichnung anzeigen" @@ -4054,6 +4072,11 @@ msgstr "%d%% wird heruntergeladen..." msgid "Connection lost. Please retry." msgstr "Verbindung verloren. Bitte versuchen Sie es erneut." +msgid "The device cannot handle more conversations. Please retry later." +msgstr "" +"Das Gerät kann keine weiteren Gespräche führen. Bitte versuchen Sie es " +"später erneut." + msgid "File not exists." msgstr "Datei existiert nicht." @@ -4214,9 +4237,12 @@ msgstr "Schicht: %s" msgid "Layer: %d/%d" msgstr "Schicht: %d/%d" -msgid "Please heat the nozzle to above 170 degree before loading filament." +msgid "" +"Please heat the nozzle to above 170 degree before loading or unloading " +"filament." msgstr "" -"Bitte heizen Sie die Düse auf über 170 Grad auf, bevor Sie Filament laden." +"Heizen Sie die Düse vor dem Laden oder Entladen des Filaments auf über 170 " +"Grad." msgid "Still unload" msgstr "Entlade immer noch" @@ -4583,7 +4609,7 @@ msgstr "Automatische Wiederherstellung bei Positionsverlust (Schrittverlust)" msgid "Allow Prompt Sound" msgstr "Erlaube akustische Signale" -msgid "Fliament Tangle Detect" +msgid "Filament Tangle Detect" msgstr "Filamentverwicklung erkannt" msgid "Global" @@ -4777,6 +4803,12 @@ msgstr "" "Oberflächenfehlern führen. Es wird empfohlen, in den Smooth-Modus zu " "wechseln." +msgid "Expand sidebar" +msgstr "Seitenleiste erweitern" + +msgid "Collapse sidebar" +msgstr "Seitenleiste reduzieren" + #, c-format, boost-format msgid "Loading file: %s" msgstr "Datei wird geladen: %s" @@ -4795,37 +4827,6 @@ msgstr "" "Die 3mf wurde mit einer alten Version von OrcaSlicer generiert, lade nur die " "Geometriedaten." -#, c-format, boost-format -msgid "This slicer file version %s is newer than %s's version:" -msgstr "Diese Slicer-Dateiversion %s ist neuer als die Version von %s:" - -msgid "" -"Would you like to update your Bambu Studio software to enable all " -"functionality in this slicer file?\n" -msgstr "" -"Möchten Sie Ihre Software aktualisieren, um alle Funktionen in dieser Slicer-" -"Datei zu aktivieren?\n" - -msgid "Newer 3mf version" -msgstr "Neuere 3mf-Version" - -msgid "" -"you can always update Bambu Studio at your convenience. The slicer file will " -"now be loaded without full functionality." -msgstr "" - -#, c-format, boost-format -msgid "" -"This slicer file version %s is newer than %s's version.\n" -"\n" -"Would you like to update your Bambu Studio software to enable all " -"functionality in this slicer file?" -msgstr "" -"Diese Slicer-Dateiversion %s ist neuer als die Version von %s.\n" -"\n" -"Möchten Sie Ihre Software aktualisieren, um alle Funktionen in dieser Slicer-" -"Datei zu aktivieren?" - msgid "Invalid values found in the 3mf:" msgstr "Ungültige Werte in der 3MF-Datei gefunden:" @@ -5077,6 +5078,9 @@ msgstr "" "Der Import in Orca Slicer ist fehlgeschlagen. Bitte laden Sie die Datei " "manuell herunter und importieren Sie sie." +msgid "Import SLA archive" +msgstr "SLA-Archiv importieren" + msgid "The selected file" msgstr "Die ausgewählte Datei" @@ -5160,6 +5164,19 @@ msgstr "" "Eine boolesche Operation kann für Modellnetze nicht ausgeführt werden. Es " "werden nur positive Teile exportiert." +msgid "" +"Are you sure you want to store original SVGs with their local paths into the " +"3MF file?\n" +"If you hit 'NO', all SVGs in the project will not be editable any more." +msgstr "" +"Möchten Sie die Original-SVGs mit ihren lokalen Pfaden in die 3MF-Datei " +"speichern?\n" +"Wenn Sie auf \"NEIN\" klicken, können alle SVGs im Projekt nicht mehr " +"bearbeitet werden." + +msgid "Private protection" +msgstr "Privatsphäre" + msgid "Is the printer ready? Is the print sheet in place, empty and clean?" msgstr "" "Ist der Drucker bereit? Ist die Druckplatte eingelegt, leer und sauber?" @@ -5186,6 +5203,9 @@ msgstr "" "Benutzerdefinierte Stützstrukturen und Farbgebungen wurden vor der Reparatur " "entfernt." +msgid "Optimize Rotation" +msgstr "Rotation optimieren" + msgid "Invalid number" msgstr "Ungültige Nummer" @@ -5349,13 +5369,6 @@ msgstr "Benachrichtigung \"Tipp des Tages\" nach dem Start anzeigen" msgid "If enabled, useful hints are displayed at startup." msgstr "Wenn aktiviert, werden beim Start nützliche Hinweise angezeigt." -msgid "Show g-code window" -msgstr "Zeige G-Code Fenster" - -#, fuzzy -msgid "If enabled, g-code window will be displayed." -msgstr "Wenn aktiviert, werden beim Start nützliche Hinweise angezeigt." - msgid "Flushing volumes: Auto-calculate everytime the color changed." msgstr "Reinigungsvolumen: Auto-Berechnung bei jeder Farbänderung." @@ -5656,7 +5669,7 @@ msgstr "%s speichern als" msgid "User Preset" msgstr "Benutzer-Profil" -msgid "Project Inside Preset" +msgid "Preset Inside Project" msgstr "Projektbasiertes Profil" msgid "Name is invalid;" @@ -5733,6 +5746,9 @@ msgstr "Auftrag abgebrochen" msgid "(LAN)" msgstr "(LAN)" +msgid "Search" +msgstr "Suche" + msgid "My Device" msgstr "Mein Gerät" @@ -5763,16 +5779,16 @@ msgstr "Bambu kalte Druckplatte" msgid "PLA Plate" msgstr "PLA-Platte" -msgid "Bamabu Engineering Plate" +msgid "Bambu Engineering Plate" msgstr "Bambu technische Druckplatte" -msgid "Bamabu Smooth PEI Plate" +msgid "Bambu Smooth PEI Plate" msgstr "Bambu glatte PEI-Platte" msgid "High temperature Plate" msgstr "Hochtemperaturplatte" -msgid "Bamabu Textured PEI Plate" +msgid "Bambu Textured PEI Plate" msgstr "Bambu strukturierte PEI-Platte" msgid "Send print job to" @@ -5915,8 +5931,8 @@ msgstr "" msgid "" "Timelapse is not supported because Print sequence is set to \"By object\"." msgstr "" -"Zeitraffer wird nicht unterstützt, da die Druckreihenfolge auf \"Nach " -"Objekt\" eingestellt ist." +"Zeitraffer wird nicht unterstützt, da die Druckreihenfolge auf \"Nach Objekt" +"\" eingestellt ist." msgid "Errors" msgstr "Fehler" @@ -5944,7 +5960,7 @@ msgstr "" #, c-format, boost-format msgid "nozzle in preset: %s %s" -msgstr "" +msgstr "Düse im Profil: %s %s" #, c-format, boost-format msgid "nozzle memorized: %.1f %s" @@ -6020,6 +6036,12 @@ msgid "The printer does not support sending to printer SD card." msgstr "" "Der Drucker unterstützt nicht das Senden an die MicroSD-Karte des Druckers." +msgid "Slice ok." +msgstr "Slice ok." + +msgid "View all Daily tips" +msgstr "Zeige alle täglichen Tipps" + msgid "Failed to create socket" msgstr "Socket konnte nicht erstellt werden" @@ -6219,16 +6241,32 @@ msgstr "" "dieunabhängige Einstellung der Support-Lagenhöhe (independent support layer " "height)." +msgid "" +"Layer height exceeds the limit in Printer Settings -> Extruder -> Layer " +"height limits ,this may cause printing quality issues." +msgstr "" +"Die Schichthöhe überschreitet das Limit in Druckereinstellungen -> Extruder -" +"> Schichthöhenlimits. Dies kann zu Problemen mit der Druckqualität führen." + +msgid "Adjust to the set range automatically? \n" +msgstr "Automatisch an den eingestellten Bereich anpassen? \n" + +msgid "Adjust" +msgstr "Anpassen" + +msgid "Ignore" +msgstr "Ignorieren" + msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" "Wenn Sie einen Zeitraffer ohne Werkzeugkopf aufnehmen, wird empfohlen, einen " "\"Timelapse Wischturm\" hinzuzufügen, indem Sie mit der rechten Maustaste " -"auf die leere Position der Bauplatte klicken und \"Primitiv hinzufügen\"-" -">\"Timelapse Wischturm\" wählen." +"auf die leere Position der Bauplatte klicken und \"Primitiv hinzufügen\"->" +"\"Timelapse Wischturm\" wählen." msgid "Line width" msgstr "Breite der Linie" @@ -6242,6 +6280,15 @@ msgstr "Präzision" msgid "Wall generator" msgstr "Wandgenerator" +msgid "Walls and surfaces" +msgstr "Wände und Oberflächen" + +msgid "Bridging" +msgstr "Brücken" + +msgid "Overhangs" +msgstr "Überhänge" + msgid "Walls" msgstr "Wände" @@ -6599,6 +6646,16 @@ msgid_plural "Following presets will be deleted too." msgstr[0] "Das folgende Profil wird ebenfalls gelöscht." msgstr[1] "Die folgenden Profile werden ebenfalls gelöscht." +msgid "" +"Are you sure to delete the selected preset? \n" +"If the preset corresponds to a filament currently in use on your printer, " +"please reset the filament information for that slot." +msgstr "" +"Sind Sie sicher, dass Sie das ausgewählte Profil löschen möchten? \n" +"Wenn das Profil einem Filament entspricht, das derzeit auf Ihrem Drucker " +"verwendet wird, setzen Sie bitte die Filamentinformationen für diesen Slot " +"zurück." + #, boost-format msgid "Are you sure to %1% the selected preset?" msgstr "Sind sie sicher, dass sie das ausgewählte Profil %1% wollen?" @@ -6628,7 +6685,7 @@ msgstr "Undefiniert" msgid "Unsaved Changes" msgstr "Nicht gespeicherte Änderungen" -msgid "Discard or Keep changes" +msgid "Transfer or discard changes" msgstr "Änderungen verwerfen oder beibehalten" msgid "Old Value" @@ -6850,23 +6907,19 @@ msgstr "Ramming-Linienbreite" msgid "Ramming line spacing" msgstr "Ramming-Linienabstand" -msgid "Auto-Calc" -msgstr "Automatisch berechnen" - -msgid "Re-calculate" +msgid "Recalculate" msgstr "Neu berechnen" msgid "Flushing volumes for filament change" msgstr "Reinigungsvolumen für Filamentwechsel" msgid "" -"Studio would re-calculate your flushing volumes everytime the filaments " -"color changed. You could disable the auto-calculate in Bambu Studio > " -"Preferences" +"Orca recalculates your flushing volumes everytime the filament colors " +"change. You can change this behavior in Preferences." msgstr "" -"Studio würde jedes Mal die Reinigungsvolumen neu berechnen, wenn sich die " -"Farbe des Filaments ändert. Sie können die automatische Berechnung in Bambu " -"Studio > Einstellungen deaktivieren" +"Orca berechnet Ihre Reinigungsvolumen jedes Mal neu, wenn sich die " +"Filamentfarben ändern. Sie können dieses Verhalten in den Einstellungen " +"ändern." msgid "Flushing volume (mm³) for each filament pair." msgstr "Reinigungsvolumen (mm³) für jedes Filamentpaar." @@ -6882,15 +6935,6 @@ msgstr "Der Multiplikator sollte im Bereich [%.2f, %.2f] liegen." msgid "Multiplier" msgstr "Multiplikator " -msgid "unloaded" -msgstr "entladen" - -msgid "loaded" -msgstr "geladen" - -msgid "Filament #" -msgstr "Filament #" - msgid "From" msgstr "Von" @@ -7266,6 +7310,9 @@ msgstr "Drucken" msgid "Idle" msgstr "Inaktiv" +msgid "Beta version" +msgstr "" + msgid "Latest version" msgstr "Neueste Version" @@ -7649,6 +7696,31 @@ msgid "Variable layer height is not supported with Organic supports." msgstr "" "Variable Schichthöhe wird nicht mit organischen Stützstrukturen unterstützt." +msgid "" +"Different nozzle diameters and different filament diameters is not allowed " +"when prime tower is enabled." +msgstr "" +"Unterschiedliche Düsendurchmesser und unterschiedliche Filamentdurchmesser " +"sind nicht zulässig, wenn der Reinigungsturm aktiviert ist." + +msgid "" +"The Wipe Tower is currently only supported with the relative extruder " +"addressing (use_relative_e_distances=1)." +msgstr "" +"Der Reinigungsturm wird derzeit nur mit der relativen Extruderadressierung " +"unterstützt (use_relative_e_distances=1)." + +msgid "" +"Ooze prevention is currently not supported with the prime tower enabled." +msgstr "Ooze Prevention wird derzeit nicht mit dem Reinigungsturm unterstützt." + +msgid "" +"The prime tower is currently only supported for the Marlin, RepRap/Sprinter, " +"RepRapFirmware and Repetier G-code flavors." +msgstr "" +"Der Reinigungsturm wird derzeit nur für die Marlin-, RepRap/Sprinter-, " +"RepRapFirmware- und Repetier-G-Code-Varianten unterstützt." + msgid "The prime tower is not supported in \"By object\" print." msgstr "Der Reinigungsturm wird im \"Nach Objekt\"-Druck nicht unterstützt." @@ -7732,13 +7804,6 @@ msgstr "" msgid "Layer height cannot exceed nozzle diameter" msgstr "Schichthöhe darf den Düsendurchmesser nicht überschreiten." -msgid "" -"Layer height cannot exceed the limit in Printer Settings -> Extruder -> " -"Layer height limits" -msgstr "" -"Die Schichthöhe darf das Limit in Druckereinstellungen -> Extruder -> " -"Schichthöhenlimits nicht überschreiten" - msgid "" "Relative extruder addressing requires resetting the extruder position at " "each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to " @@ -7842,6 +7907,12 @@ msgid "Maximum printable height which is limited by mechanism of printer" msgstr "" "Maximale bedruckbare Höhe, die durch den Bauraum des Druckers begrenzt ist." +msgid "Preferred orientation" +msgstr "Bevorzugte Ausrichtung" + +msgid "Automatically orient stls on the Z-axis upon initial import" +msgstr "Automatische Ausrichtung von STLs auf der Z-Achse beim Import" + msgid "Printer preset names" msgstr "Drucker Profilname" @@ -8129,7 +8200,7 @@ msgstr "" "Einstellung kann jedoch je nach Druckanforderungen und Objekt variieren und " "angepasst werden." -msgid "Bridge flow" +msgid "Bridge flow ratio" msgstr "Brücken Flussrate" msgid "" @@ -8139,6 +8210,18 @@ msgstr "" "Verringern Sie diesen Wert geringfügig (z. B. 0,9), um die Materialmenge für " "die Brücke zu verringern und den Durchhang zu minimieren" +msgid "Internal bridge flow ratio" +msgstr "Interne Brücken Flussrate" + +msgid "" +"This value governs the thickness of the internal bridge layer. This is the " +"first layer over sparse infill. Decrease this value slightly (for example " +"0.9) to improve surface quality over sparse infill." +msgstr "" +"Dieser Wert bestimmt die Dicke der internen Brückenschicht. Dies ist die " +"erste Schicht über der dünnen Füllung. Verringern Sie diesen Wert leicht (z. " +"B. 0,9), um die Oberflächenqualität über der dünnen Füllung zu verbessern." + msgid "Top surface flow ratio" msgstr "Durchflussverhältnis obere Fläche" @@ -8514,6 +8597,18 @@ msgstr "" "Wenn deaktiviert, sehen Brücken besser aus, sind aber nur für kürzere " "Entfernungen zuverlässig." +msgid "Thick internal bridges" +msgstr "Dicke interne Brücken" + +msgid "" +"If enabled, thick internal bridges will be used. It's usually recommended to " +"have this feature turned on. However, consider turning it off if you are " +"using large nozzles." +msgstr "" +"Wenn diese Option aktiviert ist, werden dicke interne Brücken verwendet. Es " +"wird normalerweise empfohlen, diese Funktion zu aktivieren. Wenn Sie jedoch " +"große Düsen verwenden, sollten Sie diese Funktion deaktivieren." + msgid "Max bridge length" msgstr "Max Überbrückungslänge" @@ -8595,7 +8690,7 @@ msgid "Internal solid infill pattern" msgstr "Muster für das interne feste Füllmuster" msgid "" -"Line pattern of internal solid infill. if the detect nattow internal solid " +"Line pattern of internal solid infill. if the detect narrow internal solid " "infill be enabled, the concentric pattern will be used for the small area." msgstr "" "Linienmuster des internen festen Füllmusters. Wenn die Erkennung von " @@ -8641,28 +8736,89 @@ msgstr "" "Dies legt die Schwelle für eine kleine Umfangslänge fest. Der Standardwert " "für die Schwelle beträgt 0 mm." -msgid "Order of walls" +msgid "Walls printing order" msgstr "Anordnung der Wände" -msgid "Print sequence of inner wall and outer wall. " -msgstr "Druckreihenfolge der Innen- und Außenwand." +msgid "" +"Print sequence of the internal (inner) and external (outer) walls. \n" +"\n" +"Use Inner/Outer for best overhangs. This is because the overhanging walls " +"can adhere to a neighouring perimeter while printing. However, this option " +"results in slightly reduced surface quality as the external perimeter is " +"deformed by being squashed to the internal perimeter.\n" +"\n" +"Use Inner/Outer/Inner for the best external surface finish and dimensional " +"accuracy as the external wall is printed undisturbed from an internal " +"perimeter. However, overhang performance will reduce as there is no internal " +"perimeter to print the external wall against. This option requires a minimum " +"of 3 walls to be effective as it prints the internal walls from the 3rd " +"perimeter onwards first, then the external perimeter and, finally, the first " +"internal perimeter. This option is recomended against the Outer/Inner option " +"in most cases. \n" +"\n" +"Use Outer/Inner for the same external wall quality and dimensional accuracy " +"benefits of Inner/Outer/Inner option. However, the z seams will appear less " +"consistent as the first extrusion of a new layer starts on a visible " +"surface.\n" +"\n" +" " +msgstr "" +"Druckreihenfolge der inneren und äußeren Wände.\n" +"\n" +"Verwenden Sie Innen/Außen für die besten Überhänge. Dies liegt daran, dass " +"die überhängenden Wände beim Drucken an eine benachbarte Umfangsfläche " +"haften können. Diese Option führt jedoch zu einer geringfügig reduzierten " +"Oberflächenqualität, da die Außenwand durch das Zusammendrücken der " +"Innenwand verformt wird.\n" +"\n" +"Verwenden Sie Innen/Außen/Innen für die beste Oberflächenqualität und " +"dimensionale Genauigkeit, da die Außenwand ungestört von einer inneren Wand " +"gedruckt wird. Die Überhangsleistung wird jedoch verringert, da keine innere " +"Wand vorhanden ist, um die Außenwand zu drucken. Diese Option erfordert ein " +"Minimum von 3 Wänden, um wirksam zu sein, da die inneren Wände ab der 3. " +"Umfangsfläche zuerst gedruckt werden, dann die äußere Umfangsfläche und " +"schließlich die erste innere Umfangsfläche. Diese Option wird in den meisten " +"Fällen gegen die Option Außen/Innen empfohlen.\n" +"\n" +"Verwenden Sie Außen/Innen für die gleiche externe Wandqualität und " +"dimensionale Genauigkeit wie die Option Innen/Außen/Innen. Die Z-Nähte " +"werden jedoch weniger konsistent erscheinen, da die erste Extrusion einer " +"neuen Schicht auf einer sichtbaren Oberfläche beginnt.\n" +"\n" +" " -msgid "inner/outer" +msgid "Inner/Outer" msgstr "Innen/Außen" -msgid "outer/inner" +msgid "Outer/Inner" msgstr "Außen/Innen" -msgid "inner wall/outer wall/inner wall" +msgid "Inner/Outer/Inner" msgstr "Innenwand/Außenwand/Innenwand" msgid "Print infill first" msgstr "Drucke zuerst die Füllung" -msgid "Order of wall/infill. false means print wall first. " +msgid "" +"Order of wall/infill. When the tickbox is unchecked the walls are printed " +"first, which works best in most cases.\n" +"\n" +"Printing walls first may help with extreme overhangs as the walls have the " +"neighbouring infill to adhere to. However, the infill will slighly push out " +"the printed walls where it is attached to them, resulting in a worse " +"external surface finish. It can also cause the infill to shine through the " +"external surfaces of the part." msgstr "" -"Reihenfolge der Wand/Füllung. false bedeutet, dass die Wand zuerst gedruckt " -"wird." +"Reihenfolge der Wand/Füllung. Wenn das Kontrollkästchen nicht aktiviert ist, " +"werden die Wände zuerst gedruckt, was in den meisten Fällen am besten " +"funktioniert.\n" +"\n" +"Das Drucken der Wände zuerst kann bei extremen Überhängen hilfreich sein, da " +"die Wände die benachbarte Füllung haben, an der sie haften können. Die " +"Füllung drückt jedoch die gedruckten Wände leicht heraus, wo sie an ihnen " +"befestigt ist, was zu einer schlechteren Oberflächenqualität führt. Es kann " +"auch dazu führen, dass die Füllung durch die äußeren Oberflächen des Teils " +"schimmert." msgid "Height to rod" msgstr "Höhe zur Führung" @@ -9051,9 +9207,13 @@ msgstr "Winkel des Füllmusters, das die Richtung der Linien bestimmt." msgid "Sparse infill density" msgstr "Fülldichte" -#, c-format -msgid "Density of internal sparse infill, 100% means solid throughout" -msgstr "Dichte der inneren Füllung, 100%% bedeuten eine solide Füllung" +#, fuzzy, c-format, boost-format +msgid "" +"Density of internal sparse infill, 100% turns all sparse infill into solid " +"infill and internal solid infill pattern will be used" +msgstr "" +"Dichte der internen Füllung, 100% verwandelt alle interne Füllung in massive " +"Füllung und das interne massive Füllmuster wird verwendet." msgid "Sparse infill pattern" msgstr "Füllmuster" @@ -9300,13 +9460,13 @@ msgstr "Volle Lüfterdrehzahl ab Schicht" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " -"than \"close_fan_the_first_x_layers\", in which case the fan will be running " -"at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower than " +"\"close_fan_the_first_x_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." msgstr "" -"Die Lüftergeschwindigkeit wird linear von Null bei der " -"Schicht\"close_fan_the_first_x_layers\" auf das Maximum bei der Schicht " +"Die Lüftergeschwindigkeit wird linear von Null bei der Schicht" +"\"close_fan_the_first_x_layers\" auf das Maximum bei der Schicht " "\"full_fan_speed_layer\" erhöht. \"full_fan_speed_layer\" wird ignoriert, " "wenn es niedriger ist als \"close_fan_the_first_x_layers\",in diesem Fall " "läuft der Lüfter bei Schicht \"close_fan_the_first_x_layers\"+ 1 mit maximal " @@ -9366,6 +9526,12 @@ msgstr "" "Der durchschnittliche Abstand zwischen den auf jedem Linienabschnitt " "eingeführten Zufallspunkten" +msgid "Apply fuzzy skin to first layer" +msgstr "Fuzzy Skin auf die erste Schicht anwenden" + +msgid "Whether to apply fuzzy skin on the first layer" +msgstr "Ob Fuzzy Skin auf die erste Schicht angewendet werden soll" + msgid "Filter out tiny gaps" msgstr "Filtert winzige Lücken aus" @@ -10098,13 +10264,13 @@ msgstr "Format des Dateinamens" msgid "User can self-define the project file name when export" msgstr "Der Benutzer kann den Projektdateinamen beim Export selbst bestimmen" -msgid "Make overhang printable" +msgid "Make overhangs printable" msgstr "Überhang druckbar machen" msgid "Modify the geometry to print overhangs without support material." msgstr "Die Geometrie anpassen, um Überhänge ohne Stützmaterial zu drucken." -msgid "Make overhang printable maximum angle" +msgid "Make overhangs printable - Maximum angle" msgstr "Maximaler Winkel für druckbare Überhänge" msgid "" @@ -10117,7 +10283,7 @@ msgstr "" "jeden Überhang erlauben, während 0 alle Überhänge durch konisches Material " "ersetzt." -msgid "Make overhang printable hole area" +msgid "Make overhangs printable - Hole area" msgstr "Flächenbereich für druckbare Überhänge von Löchern" msgid "" @@ -10391,6 +10557,9 @@ msgstr "" msgid "Show auto-calibration marks" msgstr "Zeige automatische Kalibrierungsmarkierungen" +msgid "Disable set remaining print time" +msgstr "Deaktiviere die verbleibende Druckzeit" + msgid "Seam position" msgstr "Nahtposition" @@ -10546,6 +10715,28 @@ msgstr "" "soliden unteren Schichten. Das endgültig erzeugte Modell hat dadurch keine " "Naht." +msgid "Smooth Spiral" +msgstr "Gleichmäßig Spirale" + +msgid "" +"Smooth Spiral smoothes out X and Y moves as wellresulting in no visible seam " +"at all, even in the XY directions on walls that are not vertical" +msgstr "" +"Die gleichmäßige Spirale glättet auch die X- und Y-Bewegungen, so dass keine " +"Naht sichtbar ist, auch nicht in den XY-Richtungen an Wänden, die nicht " +"senkrecht sind." + +msgid "Max XY Smoothing" +msgstr "Maximale XY-Glättung" + +msgid "" +"Maximum distance to move points in XY to try to achieve a smooth spiralIf " +"expressed as a %, it will be computed over nozzle diameter" +msgstr "" +"Maximaler Abstand, um Punkte in XY zu verschieben, um eine glatte Spirale zu " +"erreichen. Wenn als Prozentsatz angegeben, wird er in Bezug auf den " +"Düsendurchmesser berechnet." + msgid "" "If smooth or traditional mode is selected, a timelapse video will be " "generated for each print. After each layer is printed, a snapshot is taken " @@ -10557,14 +10748,14 @@ msgid "" "wipe nozzle." msgstr "" "Wenn der Modus \"Gleichmäßig\" oder \"Traditionell\" ausgewählt ist, wird " -"für jeden Druck ein Zeitraffervideo erstellt. Nachdem jede Schicht gedruckt " -"wurde, wird mit der Kamera ein Bild gemacht. Alle diese Bilder werden nach " -"Abschluss des Drucks zu einem Zeitraffervideo zusammengesetzt. Wenn der " -"gleichmäßige Modus ausgewählt ist, bewegt sich der Werkzeugkopf nach dem " -"Druck jeder Schicht zum Auswurfschacht und macht dann ein Bild. Da das " -"geschmolzene Filament während der Aufnahme aus der Düse austreten kann, ist " -"für den Gleichmäßig-Modus ein Reinigungsturm erforderlich, um die Düse " -"abzuwischen." +"für jeden Druck ein Zeitraffer-Video generiert. Nachdem jede Schicht " +"gedruckt wurde, wird eine Momentaufnahme mit der Kamerakammer erstellt. Alle " +"diese Schnappschüsse werden zu einem Zeitraffer-Video zusammengesetzt, wenn " +"der Druck abgeschlossen ist. Wenn der Modus \"Gleichmäßig\" ausgewählt ist, " +"bewegt sich der Druckkopf nach dem Drucken jeder Schicht zum Überschusskanal " +"und nimmt dann eine Momentaufnahme auf. Da das geschmolzene Filament während " +"des Aufnahmeprozesses aus der Düse austreten kann, ist ein Reinigungsturm " +"erforderlich, damit der Druckkopf gereinigt wird." msgid "Traditional" msgstr "Traditionell" @@ -10772,13 +10963,13 @@ msgstr "" "kein spezielles Filament für die Stützen verwendet wird, sondern das " "aktuelle Filament." -msgid "No interface filament for body" -msgstr "Kein Filament für die Schnittstelle des Körpers" +msgid "Avoid interface filament for base" +msgstr "Schnittstellenfilament für die Basis verringern" -msgid "Don't use support interface filament to print support body" +msgid "" +"Avoid using support interface filament to print support base if possible." msgstr "" -"verwende kein Filament für die Stützstruktur-Schnittstelle um den Körper zu " -"drucken" +"Vermeiden Sie es, Stütz-Schnittstellenfilament für die Basis zu verwenden" msgid "" "Line width of support. If expressed as a %, it will be computed over the " @@ -11059,11 +11250,11 @@ msgstr "" "diesem Durchmesser, werden mit doppelten Wänden für die Stabilität gedruckt. " "Setzen Sie diesen Wert auf Null, um keine doppelten Wände zu erhalten." -msgid "Tree support wall loops" -msgstr "Wandschleifen für Baumstützen" +msgid "Support wall loops" +msgstr "Wände um Stützstrukturen" -msgid "This setting specify the count of walls around tree support" -msgstr "Diese Einstellung gibt die Anzahl der Wände um die Baumstütze an." +msgid "This setting specify the count of walls around support" +msgstr "Diese Einstellung gibt die Anzahl der Wände um die Stützstrukturen an" msgid "Tree support with infill" msgstr "Baumsupport mit Füllung" @@ -11190,10 +11381,27 @@ msgid "Wipe Distance" msgstr "Wischabstand" msgid "" -"Discribe how long the nozzle will move along the last path when retracting" +"Discribe how long the nozzle will move along the last path when " +"retracting. \n" +"\n" +"Depending on how long the wipe operation lasts, how fast and long the " +"extruder/filament retraction settings are, a retraction move may be needed " +"to retract the remaining filament. \n" +"\n" +"Setting a value in the retract amount before wipe setting below will perform " +"any excess retraction before the wipe, else it will be performed after." msgstr "" -"Beschreibt, wie weit sich die Düse während dem Rückzug entlang der letzten " -"Bahn bewegt." +"Beschreibt, wie lange die Düse entlang des letzten Pfades bewegt wird, wenn " +"zurückgezogen wird. \n" +"\n" +"Je nachdem, wie lange die Wischoperation dauert, wie schnell und wie lange " +"die Einstellungen für den Extruder-/Filamentrückzug sind, kann ein " +"Rückzugsbefehl erforderlich sein, um das verbleibende Filament " +"zurückzuziehen. \n" +"\n" +"Wenn ein Wert in der Einstellung \"Rückzugsmenge vor dem Wischen\" unten " +"angegeben ist, wird ein überschüssiger Rückzug vor dem Wischen ausgeführt, " +"ansonsten wird er danach ausgeführt." msgid "" "The wiping tower can be used to clean up the residue on the nozzle and " @@ -11546,10 +11754,6 @@ msgstr "" msgid "invalid value " msgstr "Ungültiger Wert" -#, c-format, boost-format -msgid " doesn't work at 100%% density " -msgstr " doesn't work at 100%% density " - msgid "Invalid value when spiral vase mode is enabled: " msgstr "Ungültiger Wert, wenn der Spiral-Vase-Modus aktiviert ist: " @@ -12539,12 +12743,850 @@ msgstr "Teil 2" msgid "Delete input" msgstr "Eingabe löschen" +msgid "Network Test" +msgstr "Netzwerktest" + +msgid "Start Test Multi-Thread" +msgstr "Starten Sie den Test mit mehreren Threads" + +msgid "Start Test Single-Thread" +msgstr "Starten Sie den Test mit einem Thread" + +msgid "Export Log" +msgstr "Protokoll exportieren" + +msgid "Studio Version:" +msgstr "Studio Version:" + +msgid "System Version:" +msgstr "System Version:" + +msgid "DNS Server:" +msgstr "DNS Server:" + +msgid "Test BambuLab" +msgstr "Test BambuLab" + +msgid "Test BambuLab:" +msgstr "Test BambuLab:" + +msgid "Test Bing.com" +msgstr "Test Bing.com" + +msgid "Test bing.com:" +msgstr "Test bing.com:" + +msgid "Test HTTP" +msgstr "Test HTTP" + +msgid "Test HTTP Service:" +msgstr "Test HTTP Service:" + +msgid "Test storage" +msgstr "Test Speicher" + +msgid "Test Storage Upload:" +msgstr "Test Speicher hochladen:" + +msgid "Test storage upgrade" +msgstr "Test Speicher Upgrade" + +msgid "Test Storage Upgrade:" +msgstr "Test Speicher Upgrade:" + +msgid "Test storage download" +msgstr "Test Speicher Download" + +msgid "Test Storage Download:" +msgstr "Test Speicher Download:" + +msgid "Test plugin download" +msgstr "Test Plugin Download" + +msgid "Test Plugin Download:" +msgstr "Test Plugin Download:" + +msgid "Test Storage Upload" +msgstr "Test Speicher hochladen" + +msgid "Log Info" +msgstr "Protokoll Info" + +msgid "Select filament preset" +msgstr "Filament-Voreinstellung auswählen" + +msgid "Create Filament" +msgstr "Filament erstellen" + +msgid "Create Based on Current Filament" +msgstr "Erstellen Sie basierend auf dem aktuellen Filament" + +msgid "Copy Current Filament Preset " +msgstr "Aktuelle Filament-Voreinstellung kopieren" + +msgid "Basic Information" +msgstr "Grundlegende Informationen" + +msgid "Add Filament Preset under this filament" +msgstr "Filament-Voreinstellung unter diesem Filament hinzufügen" + +msgid "We could create the filament presets for your following printer:" +msgstr "" +"Sie könnten die Filament-Voreinstellungen für Ihren folgenden Drucker " +"erstellen:" + +msgid "Select Vendor" +msgstr "Hersteller auswählen" + +msgid "Input Custom Vendor" +msgstr "Benutzerdefinierten Hersteller eingeben" + +msgid "Can't find vendor I want" +msgstr "Ich kann den Hersteller, den ich möchte, nicht finden" + +msgid "Select Type" +msgstr "Typ auswählen" + +msgid "Select Filament Preset" +msgstr "Filament-Voreinstellung auswählen" + +msgid "Serial" +msgstr "Seriennummer" + +msgid "e.g. Basic, Matte, Silk, Marble" +msgstr "z.B. Basic, Matte, Silk, Marble" + +msgid "Filament Preset" +msgstr "Filament-Voreinstellung" + +msgid "Create" +msgstr "Erstellen" + +msgid "Vendor is not selected, please reselect vendor." +msgstr "Hersteller ist nicht ausgewählt, bitte Hersteller erneut auswählen." + +msgid "Custom vendor is not input, please input custom vendor." +msgstr "" +"Benutzerdefinierter Hersteller ist nicht eingegeben, bitte " +"benutzerdefinierten Hersteller eingeben." + +msgid "" +"\"Bambu\" or \"Generic\" can not be used as a Vendor for custom filaments." +msgstr "" +"\"Bambu\" oder \"Generic\" kann nicht als Hersteller für benutzerdefinierte " +"Filamente verwendet werden." + +msgid "Filament type is not selected, please reselect type." +msgstr "Filamenttyp ist nicht ausgewählt, bitte Filamenttyp erneut auswählen." + +msgid "Filament serial is not inputed, please input serial." +msgstr "" +"Filament-Seriennummer ist nicht eingegeben, bitte Seriennummer eingeben." + +msgid "" +"There may be escape characters in the vendor or serial input of filament. " +"Please delete and re-enter." +msgstr "" +"In der Eingabe des Herstellers oder der Seriennummer des Filaments können " +"Escape-Zeichen vorhanden sein. Bitte löschen und erneut eingeben." + +msgid "All inputs in the custom vendor or serial are spaces. Please re-enter." +msgstr "" +"Alle Eingaben im benutzerdefinierten Hersteller oder in der Seriennummer " +"bestehen aus Leerzeichen. Bitte erneut eingeben." + +msgid "The vendor can not be a number. Please re-enter." +msgstr "" + +msgid "" +"You have not selected a printer or preset yet. Please select at least one." +msgstr "" +"Sie haben noch keinen Drucker oder keine Voreinstellung ausgewählt. Bitte " +"wählen Sie mindestens einen aus." + +msgid "Some existing presets have failed to be created, as follows:\n" +msgstr "" +"Einige vorhandene Voreinstellungen konnten nicht erstellt werden, wie " +"folgt:\n" + +msgid "" +"\n" +"Do you want to rewrite it?" +msgstr "" +"\n" +"Möchten Sie es überschreiben?" + +msgid "" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" +"To add preset for more prinetrs, Please go to printer selection" +msgstr "" +"Wir würden die Voreinstellungen als \"Hersteller Typ Seriennummer @Drucker " +"den Sie ausgewählt haben\" umbenennen. \n" +"Um Voreinstellungen für mehr Drucker hinzuzufügen, gehen Sie bitte zur " +"Druckerauswahl" + +msgid "Create Printer/Nozzle" +msgstr "Drucker/Düse erstellen" + +msgid "Create Printer" +msgstr "Drucker erstellen" + +msgid "Create Nozzle for Existing Printer" +msgstr "Düse für vorhandenen Drucker erstellen" + +msgid "Create from Template" +msgstr "Aus Vorlage erstellen" + +msgid "Create Based on Current Printer" +msgstr "Erstellen Sie basierend auf dem aktuellen Drucker" + +msgid "wiki" +msgstr "wiki" + +msgid "Import Preset" +msgstr "Voreinstellung importieren" + +msgid "Create Type" +msgstr "Typ erstellen" + +msgid "The model is not fond, place reselect vendor." +msgstr "Das Modell ist nicht gefunden, bitte Hersteller erneut auswählen." + +msgid "Select Model" +msgstr "Modell auswählen" + +msgid "Select Printer" +msgstr "Drucker auswählen" + +msgid "Input Custom Model" +msgstr "Benutzerdefiniertes Modell eingeben" + +msgid "Can't find my printer model" +msgstr "Ich kann mein Druckermodell nicht finden" + +msgid "Rectangle" +msgstr "Rechteck" + +msgid "Printable Space" +msgstr "Druckbarer Raum" + +msgid "X" +msgstr "X" + +msgid "Y" +msgstr "Y" + +msgid "Hot Bed STL" +msgstr "Hot Bed STL" + +msgid "Load stl" +msgstr "STL laden" + +msgid "Hot Bed SVG" +msgstr "Hot Bed SVG" + +msgid "Load svg" +msgstr "SVG laden" + +msgid "Max Print Height" +msgstr "Maximale Druckhöhe" + +#, c-format, boost-format +msgid "The file exceeds %d MB, please import again." +msgstr "Die Datei überschreitet %d MB, bitte erneut importieren." + +msgid "Exception in obtaining file size, please import again." +msgstr "Ausnahme beim Abrufen der Dateigröße, bitte erneut importieren." + +msgid "Preset path is not find, please reselect vendor." +msgstr "Voreinstellungspfad nicht gefunden, bitte Hersteller erneut auswählen." + +msgid "The printer model was not found, please reselect." +msgstr "Das Druckermodell wurde nicht gefunden, bitte erneut auswählen." + +msgid "The nozzle diameter is not fond, place reselect." +msgstr "Der Düsendurchmesser ist nicht gefunden, bitte erneut auswählen." + +msgid "The printer preset is not fond, place reselect." +msgstr "Die Druckervoreinstellung ist nicht gefunden, bitte erneut auswählen." + +msgid "Printer Preset" +msgstr "Druckervoreinstellung" + +msgid "Filament Preset Template" +msgstr "Filament-Vorlagenvoreinstellung" + +msgid "Deselect All" +msgstr "Alle abwählen" + +msgid "Process Preset Template" +msgstr "Prozess Vorlagen Voreinstellung" + +msgid "Back Page 1" +msgstr "Zurück Seite 1" + +msgid "" +"You have not yet chosen which printer preset to create based on. Please " +"choose the vendor and model of the printer" +msgstr "" +"Sie haben noch nicht ausgewählt, welche Druckervoreinstellung erstellt " +"werden soll. Bitte wählen Sie den Hersteller und das Modell des Druckers" + +msgid "" +"You have entered an illegal input in the printable area section on the first " +"page. Please check before creating it." +msgstr "" +"Sie haben eine ungültige Eingabe im Bereich des druckbaren Bereichs auf der " +"ersten Seite eingegeben. Bitte überprüfen Sie es, bevor Sie es erstellen." + +msgid "The custom printer or model is not inputed, place input." +msgstr "" +"Der benutzerdefinierte Drucker oder das Modell ist nicht eingegeben, bitte " +"eingeben." + +msgid "" +"The printer preset you created already has a preset with the same name. Do " +"you want to overwrite it?\n" +"\tYes: Overwrite the printer preset with the same name, and filament and " +"process presets with the same preset name will be recreated \n" +"and filament and process presets without the same preset name will be " +"reserve.\n" +"\tCancel: Do not create a preset, return to the creation interface." +msgstr "" +"Die von Ihnen erstellte Druckervoreinstellung hat bereits eine " +"Voreinstellung mit dem gleichen Namen. Möchten Sie es überschreiben?\n" +"\tJa: Überschreiben Sie die Druckervoreinstellung mit dem gleichen Namen, " +"und Filament- und Prozessvoreinstellungen mit dem gleichen Voreinstellungs- " +"und Filament- und Prozessvornamen werden neu erstellt \n" +"und Filament- und Prozessvoreinstellungen ohne den gleichen " +"Voreinstellungsnamen werden beibehalten.\n" +"\tAbbrechen: Erstellen Sie keine Voreinstellung, kehren Sie zur Erstellungs-" +"Schnittstelle zurück." + +msgid "You need to select at least one filament preset." +msgstr "Sie müssen mindestens eine Filament-Voreinstellung auswählen." + +msgid "You need to select at least one process preset." +msgstr "Sie müssen mindestens eine Prozess-Voreinstellung auswählen." + +msgid "Create filament presets failed. As follows:\n" +msgstr "Erstellen von Filament-Voreinstellungen fehlgeschlagen. Wie folgt:\n" + +msgid "Create process presets failed. As follows:\n" +msgstr "Erstellen von Prozess-Voreinstellungen fehlgeschlagen. Wie folgt:\n" + +msgid "Vendor is not find, please reselect." +msgstr "Hersteller nicht gefunden, bitte erneut auswählen." + +msgid "Current vendor has no models, please reselect." +msgstr "Der aktuelle Hersteller hat keine Modelle, bitte erneut auswählen." + +msgid "" +"You have not selected the vendor and model or inputed the custom vendor and " +"model." +msgstr "" +"Sie haben den Hersteller und das Modell nicht ausgewählt oder den " +"benutzerdefinierten Hersteller und das Modell eingegeben." + +msgid "" +"There may be escape characters in the custom printer vendor or model. Please " +"delete and re-enter." +msgstr "" +"In der benutzerdefinierten Druckerhersteller- oder Modellzeichenfolge können " +"Escape-Zeichen vorhanden sein. Bitte löschen und erneut eingeben." + +msgid "" +"All inputs in the custom printer vendor or model are spaces. Please re-enter." +msgstr "" +"Alle Eingaben im benutzerdefinierten Druckerhersteller oder Modell bestehen " +"aus Leerzeichen. Bitte erneut eingeben." + +msgid "Please check bed printable shape and origin input." +msgstr "" +"Bitte überprüfen Sie die Eingabe der druckbaren Form und des Ursprungs." + +msgid "" +"You have not yet selected the printer to replace the nozzle, please choose." +msgstr "" +"Sie haben den Drucker, der die Düse ersetzen soll, noch nicht ausgewählt, " +"bitte wählen Sie." + +msgid "Create Printer Successful" +msgstr "Drucker erfolgreich erstellt" + +msgid "Create Filament Successful" +msgstr "Filament erfolgreich erstellt" + +msgid "Printer Created" +msgstr "Drucker erstellt" + +msgid "Please go to printer settings to edit your presets" +msgstr "" +"Bitte gehen Sie zu den Druckereinstellungen, um Ihre Voreinstellungen zu " +"bearbeiten" + +msgid "Filament Created" +msgstr "Filament erstellt" + +msgid "" +"Please go to filament setting to edit your presets if you need.\n" +"Please note that nozzle temperature, hot bed temperature, and maximum " +"volumetric speed have a significant impact on printing quality. Please set " +"them carefully." +msgstr "" +"Bitte gehen Sie zu den Filament-Einstellungen, um Ihre Voreinstellungen zu " +"bearbeiten, wenn Sie dies benötigen.\n" +"Bitte beachten Sie, dass die Düsentemperatur, die Heizbetttemperatur und die " +"maximale volumetrische Geschwindigkeit einen erheblichen Einfluss auf die " +"Druckqualität haben. Bitte stellen Sie sie sorgfältig ein." + +msgid "Printer Setting" +msgstr "Druckereinstellung" + +msgid "Export Configs" +msgstr "Konfigurationen exportieren" + +msgid "Printer config bundle(.bbscfg)" +msgstr "Drucker-Konfigurationsbündel (.bbscfg)" + +msgid "Filament bundle(.bbsflmt)" +msgstr "Filament-Bündel (.bbsflmt)" + +msgid "Printer presets(.zip)" +msgstr "Druckervoreinstellungen (.zip)" + +msgid "Filament presets(.zip)" +msgstr "Filament-Voreinstellungen (.zip)" + +msgid "Process presets(.zip)" +msgstr "Prozess-Voreinstellungen (.zip)" + +msgid "initialize fail" +msgstr "Initialisierung fehlgeschlagen" + +msgid "add file fail" +msgstr "Datei hinzufügen fehlgeschlagen" + +msgid "add bundle structure file fail" +msgstr "Hinzufügen der Bündelstrukturdatei fehlgeschlagen" + +msgid "finalize fail" +msgstr "Finalisierung fehlgeschlagen" + +msgid "open zip written fail" +msgstr "ZIP-Schreibfehler" + +msgid "Export successful" +msgstr "Export erfolgreich" + +#, c-format, boost-format +msgid "" +"The '%s' folder already exists in the current directory. Do you want to " +"clear it and rebuild it.\n" +"If not, a time suffix will be added, and you can modify the name after " +"creation." +msgstr "" +"Der Ordner '%s' existiert bereits im aktuellen Verzeichnis. Möchten Sie ihn " +"löschen und neu erstellen.\n" +"Wenn nicht, wird ein Zeitstempel hinzugefügt, und Sie können den Namen nach " +"der Erstellung ändern." + +msgid "" +"Printer and all the filament&process presets that belongs to the printer. \n" +"Can be shared with others." +msgstr "" +"Drucker und alle Filament- und Prozessvoreinstellungen, die zum Drucker " +"gehören. \n" +"Kann mit anderen geteilt werden." + +msgid "" +"User's fillment preset set. \n" +"Can be shared with others." +msgstr "" +"Benutzerfüllung Voreinstellung eingestellt. \n" +"Kann mit anderen geteilt werden." + +msgid "" +"Only display printer names with changes to printer, filament, and process " +"presets." +msgstr "" +"Nur Druckernamen mit Änderungen an Drucker-, Filament- und Prozessvorlagen " +"werden angezeigt." + +msgid "Only display the filament names with changes to filament presets." +msgstr "" +"Nur die Filamentnamen mit Änderungen an den Filamentvorlagen werden " +"angezeigt." + +msgid "" +"Only printer names with user printer presets will be displayed, and each " +"preset you choose will be exported as a zip." +msgstr "" +"Nur Druckernamen mit Benutzerdruckervoreinstellungen werden angezeigt, und " +"jede Voreinstellung, die Sie auswählen, wird als ZIP exportiert." + +msgid "" +"Only the filament names with user filament presets will be displayed, \n" +"and all user filament presets in each filament name you select will be " +"exported as a zip." +msgstr "" +"Nur die Filamentnamen mit Benutzerfilamentvorlagen werden angezeigt, \n" +"und alle Benutzerfilamentvorlagen in jedem Filamentnamen, den Sie auswählen, " + +msgid "" +"Only printer names with changed process presets will be displayed, \n" +"and all user process presets in each printer name you select will be " +"exported as a zip." +msgstr "" +"Nur Druckernamen mit geänderten Prozessvorlagen werden angezeigt, \n" +"und alle Benutzerprozessvorlagen in jedem Druckernamen, den Sie auswählen, " +"werden als ZIP exportiert." + +msgid "Please select at least one printer or filament." +msgstr "Bitte wählen Sie mindestens einen Drucker oder ein Filament aus." + +msgid "Please select a type you want to export" +msgstr "Bitte wählen Sie einen Typ aus, den Sie exportieren möchten" + +msgid "Edit Filament" +msgstr "Filament bearbeiten" + +msgid "Filament presets under this filament" +msgstr "Filamentvoreinstellungen unter diesem Filament" + +msgid "" +"Note: If the only preset under this filament is deleted, the filament will " +"be deleted after exiting the dialog." +msgstr "" +"Hinweis: Wenn die einzige Voreinstellung unter diesem Filament gelöscht " +"wird, wird das Filament nach dem Verlassen des Dialogfelds gelöscht." + +msgid "Presets inherited by other presets can not be deleted" +msgstr "" +"Voreinstellungen, die von anderen Voreinstellungen geerbt wurden, können " +"nicht gelöscht werden" + +msgid "The following presets inherits this preset." +msgid_plural "The following preset inherits this preset." +msgstr[0] "Die folgenden Voreinstellungen erben diese Voreinstellung." +msgstr[1] "Die folgende Voreinstellung erbt diese Voreinstellung." + +msgid "Delete Preset" +msgstr "Voreinstellung löschen" + +msgid "Are you sure to delete the selected preset?" +msgstr "Möchten Sie die ausgewählte Voreinstellung wirklich löschen?" + +msgid "Delete preset" +msgstr "Voreinstellung löschen" + +msgid "+ Add Preset" +msgstr "+ Voreinstellung hinzufügen" + +msgid "Delete Filament" +msgstr "Filament löschen" + +msgid "" +"All the filament presets belong to this filament would be deleted. \n" +"If you are using this filament on your printer, please reset the filament " +"information for that slot." +msgstr "" +"Alle Filamentvoreinstellungen, die zu diesem Filament gehören, werden " +"gelöscht. \n" +"Wenn Sie dieses Filament auf Ihrem Drucker verwenden, setzen Sie bitte die " +"Filamentinformationen für diesen Schacht zurück." + +msgid "Delete filament" +msgstr "Filament löschen" + +msgid "Add Preset" +msgstr "Voreinstellung hinzufügen" + +msgid "Add preset for new printer" +msgstr "Voreinstellung für neuen Drucker hinzufügen" + +msgid "Copy preset from filament" +msgstr "Voreinstellung vom Filament kopieren" + +msgid "The filament choice not find filament preset, please reselect it" +msgstr "" +"Die Filamentauswahl findet keine Filamentvoreinstellung, bitte neu auswählen" + +msgid "Edit Preset" +msgstr "Voreinstellung bearbeiten" + +msgid "For more information, please check out Wiki" +msgstr "Für weitere Informationen besuchen Sie bitte Wiki" + +msgid "Collapse" +msgstr "Zusammenbruch" + +msgid "Daily Tips" +msgstr "Tägliche Tipps" + +msgid "Need select printer" +msgstr "Drucker auswählen" + +msgid "The start, end or step is not valid value." +msgstr "Der Start, das Ende oder der Schritt ist kein gültiger Wert." + +msgid "" +"Unable to calibrate: maybe because the set calibration value range is too " +"large, or the step is too small" +msgstr "" +"Kalibrierung nicht möglich: Möglicherweise, weil der eingestellte " +"Kalibrierungswertebereich zu groß ist oder der Schritt zu klein ist" + +#, fuzzy +msgid "Physical Printer" +msgstr "Drucker" + +msgid "Print Host upload" +msgstr "Hochladen zum Druck-Host" + +msgid "Could not get a valid Printer Host reference" +msgstr "Konnte keine gültige Referenz zum Druck-Host erhalten" + +msgid "Success!" +msgstr "Erfolgreich!" + +msgid "Refresh Printers" +msgstr "Drucker aktualisieren" + +msgid "" +"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" +"signed certificate." +msgstr "" +"Die HTTPS-CA-Datei ist optional. Sie wird nur benötigt, wenn Sie HTTPS mit " +"einem selbstsignierten Zertifikat verwenden." + +msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" +msgstr "Zertifikatdateien (*.crt, *.pem)|*.crt;*.pem|Alle Dateien|*.*" + +msgid "Open CA certificate file" +msgstr "Öffnen Sie die CA-Zertifikatsdatei." + +#, c-format, boost-format +msgid "" +"On this system, %s uses HTTPS certificates from the system Certificate Store " +"or Keychain." +msgstr "" +"Auf diesem System verwendet %s HTTPS-Zertifikate aus dem " +"Systemzertifikatspeicher oder dem Schlüsselbund." + +msgid "" +"To use a custom CA file, please import your CA file into Certificate Store / " +"Keychain." +msgstr "" +"Um eine benutzerdefinierte CA-Datei zu verwenden, importieren Sie bitte Ihre " +"CA-Datei in den Zertifikatspeicher / das Schlüsselbund." + +msgid "Connection to printers connected via the print host failed." +msgstr "" +"Die Verbindung zu den über den Druck-Host verbundenen Druckern ist " +"fehlgeschlagen." + +#, c-format, boost-format +msgid "Mismatched type of print host: %s" +msgstr "Typ des Druck-Hosts: %s ist falsch" + +msgid "Connection to AstroBox works correctly." +msgstr "Verbindung zum AstroBox funktioniert korrekt." + +msgid "Could not connect to AstroBox" +msgstr "Konnte keine Verbindung zum AstroBox herstellen" + +msgid "Note: AstroBox version at least 1.1.0 is required." +msgstr "Hinweis: AstroBox Version mindestens 1.1.0 ist erforderlich." + +msgid "Connection to Duet works correctly." +msgstr "Verbindung zu Duet funktioniert korrekt." + +msgid "Could not connect to Duet" +msgstr "Konnte keine Verbindung zu Duet herstellen" + +msgid "Unknown error occured" +msgstr "Unbekannter Fehler aufgetreten" + +msgid "Wrong password" +msgstr "Falsches Passwort" + +msgid "Could not get resources to create a new connection" +msgstr "Konnte keine Ressourcen zum Erstellen einer neuen Verbindung erzeugen" + +msgid "Upload not enabled on FlashAir card." +msgstr "Upload auf FlashAir-Karte nicht aktiviert." + +msgid "Connection to FlashAir works correctly and upload is enabled." +msgstr "Verbindung zu FlashAir funktioniert korrekt und Upload ist aktiviert." + +msgid "Could not connect to FlashAir" +msgstr "Konnte keine Verbindung zu FlashAir herstellen" + +msgid "" +"Note: FlashAir with firmware 2.00.02 or newer and activated upload function " +"is required." +msgstr "" +"Hinweis: FlashAir mit Firmware 2.00.02 oder neuer und aktivierter Upload-" +"Funktion ist erforderlich." + +msgid "Connection to MKS works correctly." +msgstr "Verbindung zu MKS funktioniert korrekt." + +msgid "Could not connect to MKS" +msgstr "Konnte keine Verbindung zu MKS herstellen" + +msgid "Connection to OctoPrint works correctly." +msgstr "Verbindung zu OctoPrint funktioniert korrekt." + +msgid "Could not connect to OctoPrint" +msgstr "Konnte keine Verbindung zu OctoPrint herstellen" + +msgid "Note: OctoPrint version at least 1.1.0 is required." +msgstr "Hinweis: OctoPrint Version mindestens 1.1.0 ist erforderlich." + +msgid "Connection to Prusa SL1 / SL1S works correctly." +msgstr "Verbindung zu Prusa SL1 / SL1S funktioniert korrekt." + +msgid "Could not connect to Prusa SLA" +msgstr "Konnte keine Verbindung zu Prusa SLA herstellen" + +msgid "Connection to PrusaLink works correctly." +msgstr "Verbindung zu PrusaLink funktioniert korrekt." + +msgid "Could not connect to PrusaLink" +msgstr "Konnte keine Verbindung zu PrusaLink herstellen" + +msgid "Storages found" +msgstr "Speicher gefunden" + +#. TRN %1% = storage path +#, boost-format +msgid "%1% : read only" +msgstr "%1% : Nur-Lesen" + +#. TRN %1% = storage path +#, boost-format +msgid "%1% : no free space" +msgstr "%1% : kein freier Speicherplatz" + +#. TRN %1% = host +#, boost-format +msgid "Upload has failed. There is no suitable storage found at %1%." +msgstr "" +"Der Upload ist fehlgeschlagen. Es wurde kein geeigneter Speicherplatz unter " +"%1% gefunden." + +msgid "Connection to Prusa Connect works correctly." +msgstr "Verbindung zu Prusa Connect funktioniert korrekt." + +msgid "Could not connect to Prusa Connect" +msgstr "Konnte keine Verbindung zu Prusa Connect herstellen" + +msgid "Connection to Repetier works correctly." +msgstr "Verbindung zu Repetier funktioniert korrekt." + +msgid "Could not connect to Repetier" +msgstr "Konnte keine Verbindung zu Repetier herstellen" + +msgid "Note: Repetier version at least 0.90.0 is required." +msgstr "Hinweis: Repetier Version mindestens 0.90.0 ist erforderlich." + +#, boost-format +msgid "" +"HTTP status: %1%\n" +"Message body: \"%2%\"" +msgstr "" +"HTTP-Status: %1%\n" +"Nachrichtentext: \"%2%\"" + +#, boost-format +msgid "" +"Parsing of host response failed.\n" +"Message body: \"%1%\"\n" +"Error: \"%2%\"" +msgstr "" +"Das Parsen der Host-Antwort ist fehlgeschlagen.\n" +"Nachrichtentext: \"%1%\"\n" +"Fehler: \"%2%\"" + +#, boost-format +msgid "" +"Enumeration of host printers failed.\n" +"Message body: \"%1%\"\n" +"Error: \"%2%\"" +msgstr "" +"Die Aufzählung der Drucker des Hosts ist fehlgeschlagen.\n" +"Nachrichtentext: \"%1%\"\n" +"Fehler: \"%2%\"" + +#: resources/data/hints.ini: [hint:Precise wall] +msgid "" +"Precise wall\n" +"Did you know that turning on precise wall can improve precision and layer " +"consistency?" +msgstr "" +"Präzise Wand\n" +"Wussten Sie, dass Sie durch das Einschalten der präzisen Wand die Präzision " +"und die Schichtkonsistenz verbessern können?" + +#: resources/data/hints.ini: [hint:Sandwich mode] +msgid "" +"Sandwich mode\n" +"Did you know that you can use sandwich mode (inner-outer-inner) to improve " +"precision and layer consistency if your model doesn't have very steep " +"overhangs?" +msgstr "" +"Sandwich-Modus\n" +"Wussten Sie, dass Sie den Sandwich-Modus (innen-außen-innen) verwenden " +"können, um die Präzision und die Schichtkonsistenz zu verbessern, wenn Ihr " +"Modell keine sehr steilen Überhänge hat?" + +#: resources/data/hints.ini: [hint:Chamber temperature] +msgid "" +"Chamber temperature\n" +"Did you know that OrcaSlicer supports chamber temperature?" +msgstr "" +"Kammertemperatur\n" +"Wussten Sie, dass OrcaSlicer die Kammertemperatur unterstützt?" + +#: resources/data/hints.ini: [hint:Calibration] +msgid "" +"Calibration\n" +"Did you know that calibrating your printer can do wonders? Check out our " +"beloved calibration solution in OrcaSlicer." +msgstr "" +"Kalibrierung\n" +"Wussten Sie, dass die Kalibrierung Ihres Druckers Wunder bewirken kann? " +"Schauen Sie sich unsere beliebte Kalibrierungslösung in OrcaSlicer an." + +#: resources/data/hints.ini: [hint:Auxiliary fan] +msgid "" +"Auxiliary fan\n" +"Did you know that OrcaSlicer supports Auxiliary part cooling fan?" +msgstr "" +"Hilfsventilator\n" +"Wussten Sie, dass OrcaSlicer einen Hilfskühlventilator unterstützt?" + +#: resources/data/hints.ini: [hint:Air filtration] +msgid "" +"Air filtration/Exhuast Fan\n" +"Did you know that OrcaSlicer can support Air filtration/Exhuast Fan?" +msgstr "" +"Luftfiltration/Abluftventilator\n" +"Wussten Sie, dass OrcaSlicer eine Luftfiltration/Abluftventilator " +"unterstützen kann?" + #: resources/data/hints.ini: [hint:How to use keyboard shortcuts] msgid "" "How to use keyboard shortcuts\n" "Did you know that Orca Slicer offers a wide range of keyboard shortcuts and " "3D scene operations." msgstr "" +"Wie werden Tastenkombinationen verwendet\n" +"Wussten Sie, dass Orca Slicer eine Vielzahl von Tastenkombinationen und 3D-" +"Szenenoperationen bietet." #: resources/data/hints.ini: [hint:Cut Tool] msgid "" @@ -12562,6 +13604,9 @@ msgid "" "Did you know that you can fix a corrupted 3D model to avoid a lot of slicing " "problems on the Windows system?" msgstr "" +"Modell reparieren\n" +"Wussten Sie, dass Sie ein beschädigtes 3D-Modell reparieren können, um eine " +"Vielzahl von Slicing-Problemen auf dem Windows-System zu vermeiden?" #: resources/data/hints.ini: [hint:Timelapse] msgid "" @@ -12618,19 +13663,20 @@ msgid "" "Did you know that you use the Search tool to quickly find a specific Orca " "Slicer setting?" msgstr "" +"Suchfunktion\n" +"Wussten Sie, dass Sie das Suchwerkzeug verwenden können, um schnell eine " +"bestimmte Orca Slicer-Einstellung zu finden?" #: resources/data/hints.ini: [hint:Simplify Model] msgid "" "Simplify Model\n" "Did you know that you can reduce the number of triangles in a mesh using the " -"Simplify mesh feature? Right-click the model and select Simplify model. Read " -"more in the documentation." +"Simplify mesh feature? Right-click the model and select Simplify model." msgstr "" "Modell vereinfachen\n" -"Wussten Sie schon, dass Sie die Anzahl der Dreiecke in einem Netz mit der " +"Wussten Sie, dass Sie die Anzahl der Dreiecke in einem Netz mithilfe der " "Funktion \"Netz vereinfachen\" reduzieren können? Klicken Sie mit der " -"rechten Maustaste auf das Modell und wählen Sie \"Modell vereinfachen\". " -"Weitere Informationen finden Sie in der Dokumentation." +"rechten Maustaste auf das Modell und wählen Sie \"Modell vereinfachen\"." #: resources/data/hints.ini: [hint:Slicing Parameter Table] msgid "" @@ -12657,13 +13703,12 @@ msgid "" "Subtract a Part\n" "Did you know that you can subtract one mesh from another using the Negative " "part modifier? That way you can, for example, create easily resizable holes " -"directly in Orca Slicer. Read more in the documentation." +"directly in Orca Slicer." msgstr "" -"Ein Teil subtrahieren\n" -"Wussten Sie, dass Sie mit dem \"negatives Teil Modifikator\" ein Netz von " -"einem anderen subtrahieren können? Auf diese Weise können Sie z.B. leicht " -"veränderbare Löcher direkt in Orca Slicer erstellen. Lesen Sie mehr dazu in " -"der Dokumentation." +"Teile entfernen\n" +"Wussten Sie, dass Sie ein Netz von einem anderen abziehen können, indem Sie " +"den negativen Teilmodifikator verwenden? Auf diese Weise können Sie " +"beispielsweise direkt in Orca Slicer leicht skalierbare Löcher erstellen." #: resources/data/hints.ini: [hint:STEP] msgid "" @@ -12821,6 +13866,11 @@ msgid "" "extruder/hotend clogging when printing lower temperature filament with a " "higher enclosure temperature. More info about this in the Wiki." msgstr "" +"Wenn mit geöffneter Druckertür gedruckt werden muss\n" +"Wussten Sie, dass das Öffnen der Druckertür die Wahrscheinlichkeit eines " +"Verstopfens des Extruders/Hotends beim Drucken von Filamenten mit niedriger " +"Temperatur und höherer Gehäusetemperatur verringern kann. Weitere " +"Informationen dazu finden Sie im Wiki." #: resources/data/hints.ini: [hint:Avoid warping] msgid "" @@ -12829,6 +13879,202 @@ msgid "" "ABS, appropriately increasing the heatbed temperature can reduce the " "probability of warping." msgstr "" +"Verwerfungen vermeiden\n" +"Wussten Sie, dass beim Drucken von Materialien, die zu Verwerfungen neigen, " +"wie z.B. ABS, durch eine entsprechende Erhöhung der Heizbetttemperatur die " +"Wahrscheinlichkeit von Verwerfungen verringert werden kann." + +#~ msgid "" +#~ "The printer timed out while receiving a print job. Please check if the " +#~ "network is functioning properly and send the print again." +#~ msgstr "" +#~ "Der Drucker hat beim Empfangen eines Druckauftrags eine " +#~ "Zeitüberschreitung erhalten. Bitte überprüfen Sie, ob das Netzwerk " +#~ "ordnungsgemäß funktioniert, und senden Sie den Druck erneut." + +#~ msgid "The beginning of the vendor can not be a number. Please re-enter." +#~ msgstr "" +#~ "Der Anfang des Herstellers darf keine Zahl sein. Bitte erneut eingeben." + +#~ msgid "Edit Text" +#~ msgstr "Text bearbeiten" + +#~ msgid "Error! Unable to create thread!" +#~ msgstr "Fehler. Thread kann nicht erstellt werden." + +#~ msgid "Exception" +#~ msgstr "Ausnahme" + +#~ msgid "Choose SLA archive:" +#~ msgstr "SLA-Archiv auswählen:" + +#~ msgid "Import file" +#~ msgstr "Datei importieren" + +#~ msgid "Import model and profile" +#~ msgstr "Modell und Profil importieren" + +#~ msgid "Import profile only" +#~ msgstr "Nur Profil importieren" + +#~ msgid "Import model only" +#~ msgstr "Importiere nur das Modell" + +#~ msgid "Accurate" +#~ msgstr "Genau" + +#~ msgid "Balanced" +#~ msgstr "Gleichmäßig" + +#~ msgid "Quick" +#~ msgstr "Schnell" + +#~ msgid "Auto-Calc" +#~ msgstr "Automatisch berechnen" + +#~ msgid "Re-calculate" +#~ msgstr "Neu berechnen" + +#~ msgid "" +#~ "Studio would re-calculate your flushing volumes everytime the filaments " +#~ "color changed. You could disable the auto-calculate in Bambu Studio > " +#~ "Preferences" +#~ msgstr "" +#~ "Studio würde jedes Mal die Reinigungsvolumen neu berechnen, wenn sich die " +#~ "Farbe des Filaments ändert. Sie können die automatische Berechnung in " +#~ "Bambu Studio > Einstellungen deaktivieren" + +#~ msgid "unloaded" +#~ msgstr "entladen" + +#~ msgid "loaded" +#~ msgstr "geladen" + +#~ msgid "Filament #" +#~ msgstr "Filament #" + +#~ msgid "Print sequence of inner wall and outer wall. " +#~ msgstr "Druckreihenfolge der Innen- und Außenwand." + +#~ msgid "Order of wall/infill. false means print wall first. " +#~ msgstr "" +#~ "Reihenfolge der Wand/Füllung. false bedeutet, dass die Wand zuerst " +#~ "gedruckt wird." + +#~ msgid "" +#~ "Discribe how long the nozzle will move along the last path when retracting" +#~ msgstr "" +#~ "Beschreibt, wie weit sich die Düse während dem Rückzug entlang der " +#~ "letzten Bahn bewegt." + +#~ msgid "" +#~ "Simplify Model\n" +#~ "Did you know that you can reduce the number of triangles in a mesh using " +#~ "the Simplify mesh feature? Right-click the model and select Simplify " +#~ "model. Read more in the documentation." +#~ msgstr "" +#~ "Modell vereinfachen\n" +#~ "Wussten Sie schon, dass Sie die Anzahl der Dreiecke in einem Netz mit der " +#~ "Funktion \"Netz vereinfachen\" reduzieren können? Klicken Sie mit der " +#~ "rechten Maustaste auf das Modell und wählen Sie \"Modell vereinfachen\". " +#~ "Weitere Informationen finden Sie in der Dokumentation." + +#~ msgid "" +#~ "Subtract a Part\n" +#~ "Did you know that you can subtract one mesh from another using the " +#~ "Negative part modifier? That way you can, for example, create easily " +#~ "resizable holes directly in Orca Slicer. Read more in the documentation." +#~ msgstr "" +#~ "Ein Teil subtrahieren\n" +#~ "Wussten Sie, dass Sie mit dem \"negatives Teil Modifikator\" ein Netz von " +#~ "einem anderen subtrahieren können? Auf diese Weise können Sie z.B. leicht " +#~ "veränderbare Löcher direkt in Orca Slicer erstellen. Lesen Sie mehr dazu " +#~ "in der Dokumentation." + +#~ msgid " search results" +#~ msgstr " Suchergebnisse" + +#~ msgid "Filling bed " +#~ msgstr "Bett füllen" + +#, boost-format +#~ msgid "%1% infill pattern doesn't support 100%% density." +#~ msgstr "Das %1% Füllmuster unterstützt keine 100%% Dichte." + +#~ msgid "" +#~ "Switch to rectilinear pattern?\n" +#~ "Yes - switch to rectilinear pattern automaticlly\n" +#~ "No - reset density to default non 100% value automaticlly" +#~ msgstr "" +#~ "Zu geradlinigen Mustern wechseln?\n" +#~ "Ja - Automatisches auf das geradlinige Muster wechseln\n" +#~ "Nein - Dichte automatisch auf den Standardwert unter 100% zurücksetzen" + +#~ msgid "Please heat the nozzle to above 170 degree before loading filament." +#~ msgstr "" +#~ "Bitte heizen Sie die Düse auf über 170 Grad auf, bevor Sie Filament laden." + +#, c-format, boost-format +#~ msgid "This slicer file version %s is newer than %s's version:" +#~ msgstr "Diese Slicer-Dateiversion %s ist neuer als die Version von %s:" + +#~ msgid "" +#~ "Would you like to update your Bambu Studio software to enable all " +#~ "functionality in this slicer file?\n" +#~ msgstr "" +#~ "Möchten Sie Ihre Software aktualisieren, um alle Funktionen in dieser " +#~ "Slicer-Datei zu aktivieren?\n" + +#~ msgid "Newer 3mf version" +#~ msgstr "Neuere 3mf-Version" + +#, c-format, boost-format +#~ msgid "" +#~ "This slicer file version %s is newer than %s's version.\n" +#~ "\n" +#~ "Would you like to update your Bambu Studio software to enable all " +#~ "functionality in this slicer file?" +#~ msgstr "" +#~ "Diese Slicer-Dateiversion %s ist neuer als die Version von %s.\n" +#~ "\n" +#~ "Möchten Sie Ihre Software aktualisieren, um alle Funktionen in dieser " +#~ "Slicer-Datei zu aktivieren?" + +#~ msgid "Show g-code window" +#~ msgstr "Zeige G-Code Fenster" + +#, fuzzy +#~ msgid "If enabled, g-code window will be displayed." +#~ msgstr "Wenn aktiviert, werden beim Start nützliche Hinweise angezeigt." + +#~ msgid "" +#~ "Layer height cannot exceed the limit in Printer Settings -> Extruder -> " +#~ "Layer height limits" +#~ msgstr "" +#~ "Die Schichthöhe darf das Limit in Druckereinstellungen -> Extruder -> " +#~ "Schichthöhenlimits nicht überschreiten" + +#, c-format +#~ msgid "Density of internal sparse infill, 100% means solid throughout" +#~ msgstr "Dichte der inneren Füllung, 100%% bedeuten eine solide Füllung" + +#~ msgid "No interface filament for body" +#~ msgstr "Kein Filament für die Schnittstelle des Körpers" + +#~ msgid "Don't use support interface filament to print support body" +#~ msgstr "" +#~ "verwende kein Filament für die Stützstruktur-Schnittstelle um den Körper " +#~ "zu drucken" + +#~ msgid "Tree support wall loops" +#~ msgstr "Wandschleifen für Baumstützen" + +#~ msgid "This setting specify the count of walls around tree support" +#~ msgstr "Diese Einstellung gibt die Anzahl der Wände um die Baumstütze an." + +#, c-format, boost-format +#~ msgid " doesn't work at 100%% density " +#~ msgstr " doesn't work at 100%% density " #~ msgid "Ctrl + Shift + Enter" #~ msgstr "Strg + Umschalt + Eingabetaste" @@ -12854,9 +14100,6 @@ msgstr "" #~ msgid "Export all objects as STL" #~ msgstr "Alle Objekte als STL exportieren" -#~ msgid "Slice ok." -#~ msgstr "Slice ok." - #, c-format, boost-format #~ msgid "" #~ "The 3mf's version %s is newer than %s's version %s, Found following keys " @@ -12885,15 +14128,6 @@ msgstr "" #~ msgid "Add/Remove printers" #~ msgstr "Drucker hinzufügen/entfernen" -#~ msgid "Bambu Engineering Plate" -#~ msgstr "Bambu Engineering-Platte" - -#~ msgid "Bambu Smooth PEI Plate" -#~ msgstr "Bambu glatte PEI-Platte" - -#~ msgid "Bambu Textured PEI Plate" -#~ msgstr "Bambu strukturierte PEI-Platte" - #~ msgid "" #~ "When print by object, machines with I3 structure will not generate " #~ "timelapse videos." @@ -13105,68 +14339,6 @@ msgstr "" #~ msgid "The selected preset: %1% is not found." #~ msgstr "Die ausgewählte Voreinstellung: %1% wurde nicht gefunden." -#, fuzzy -#~ msgid "Physical Printer" -#~ msgstr "Drucker" - -#~ msgid "Print Host upload" -#~ msgstr "Hochladen zum Druck-Host" - -#~ msgid "Could not get a valid Printer Host reference" -#~ msgstr "Konnte keine gültige Referenz zum Druck-Host erhalten" - -#~ msgid "Success!" -#~ msgstr "Erfolgreich!" - -#~ msgid "Refresh Printers" -#~ msgstr "Drucker aktualisieren" - -#~ msgid "" -#~ "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" -#~ "signed certificate." -#~ msgstr "" -#~ "Die HTTPS-CA-Datei ist optional. Sie wird nur benötigt, wenn Sie HTTPS " -#~ "mit einem selbstsignierten Zertifikat verwenden." - -#~ msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" -#~ msgstr "Zertifikatdateien (*.crt, *.pem)|*.crt;*.pem|Alle Dateien|*.*" - -#~ msgid "Open CA certificate file" -#~ msgstr "Öffnen Sie die CA-Zertifikatsdatei." - -#, c-format, boost-format -#~ msgid "" -#~ "On this system, %s uses HTTPS certificates from the system Certificate " -#~ "Store or Keychain." -#~ msgstr "" -#~ "Auf diesem System verwendet %s HTTPS-Zertifikate aus dem " -#~ "Systemzertifikatspeicher oder dem Schlüsselbund." - -#~ msgid "" -#~ "To use a custom CA file, please import your CA file into Certificate " -#~ "Store / Keychain." -#~ msgstr "" -#~ "Um eine benutzerdefinierte CA-Datei zu verwenden, importieren Sie bitte " -#~ "Ihre CA-Datei in den Zertifikatspeicher / das Schlüsselbund." - -#~ msgid "Connection to printers connected via the print host failed." -#~ msgstr "" -#~ "Die Verbindung zu den über den Druck-Host verbundenen Druckern ist " -#~ "fehlgeschlagen." - -#~ msgid "The start, end or step is not valid value." -#~ msgstr "Der Start, das Ende oder der Schritt ist kein gültiger Wert." - -#~ msgid "" -#~ "Unable to calibrate: maybe because the set calibration value range is too " -#~ "large, or the step is too small" -#~ msgstr "" -#~ "Kalibrierung nicht möglich: Möglicherweise, weil der eingestellte " -#~ "Kalibrierungswertebereich zu groß ist oder der Schritt zu klein ist" - -#~ msgid "Need select printer" -#~ msgstr "Drucker auswählen" - #~ msgid "" #~ "3D Scene Operations\n" #~ "Did you know how to control view and object/part selection with mouse and " @@ -13346,7 +14518,7 @@ msgstr "" #~ msgid "Score" #~ msgstr "Punktzahl" -#~ msgid "Bamabu High Temperature Plate" +#~ msgid "Bambu High Temperature Plate" #~ msgstr "Bambu Hochtemperaturdruckplatte" #~ msgid "Can't connect to the printer" diff --git a/localization/i18n/en/OrcaSlicer_en.po b/localization/i18n/en/OrcaSlicer_en.po index 56406cf96d..d4409c8e25 100644 --- a/localization/i18n/en/OrcaSlicer_en.po +++ b/localization/i18n/en/OrcaSlicer_en.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-24 18:09+0100\n" +"POT-Creation-Date: 2023-12-19 22:09+0800\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -293,6 +293,12 @@ msgstr "Select all connectors" msgid "Cut" msgstr "Cut" +msgid "non-mainifold edges be caused by cut tool, do you want to fix it now?" +msgstr "" + +msgid "Repairing model object" +msgstr "Repairing model object" + msgid "Connector" msgstr "Connector" @@ -843,6 +849,24 @@ msgstr "Add Support Blocker" msgid "Add support enforcer" msgstr "Add Support Enforcer" +msgid "Add text" +msgstr "" + +msgid "Add negative text" +msgstr "" + +msgid "Add text modifier" +msgstr "" + +msgid "Add SVG part" +msgstr "" + +msgid "Add negative SVG" +msgstr "" + +msgid "Add SVG modifier" +msgstr "" + msgid "Select settings" msgstr "Select settings" @@ -858,9 +882,6 @@ msgstr "Del" msgid "Delete the selected object" msgstr "Delete the selected object" -msgid "Edit Text" -msgstr "Edit Text" - msgid "Load..." msgstr "Load..." @@ -885,6 +906,12 @@ msgstr "Cylinder" msgid "Cone" msgstr "Cone" +msgid "Text" +msgstr "" + +msgid "SVG" +msgstr "" + msgid "Height range Modifier" msgstr "Height Range Modifier" @@ -1018,6 +1045,18 @@ msgstr "Mirror" msgid "Mirror object" msgstr "Mirror object" +msgid "Edit text" +msgstr "" + +msgid "Ability to change text, font, size, ..." +msgstr "" + +msgid "Edit SVG" +msgstr "" + +msgid "Change SVG source file, projection, size, ..." +msgstr "" + msgid "Invalidate cut info" msgstr "Invalidate cut info" @@ -1171,9 +1210,6 @@ msgstr "Click the icon to edit color painting for the object" msgid "Click the icon to shift this object to the bed" msgstr "Click the icon to shift this object to the bed" -msgid " search results" -msgstr "" - msgid "Loading file" msgstr "Loading file" @@ -1322,9 +1358,6 @@ msgstr "Enter new name" msgid "Renaming" msgstr "Renaming" -msgid "Repairing model object" -msgstr "Repairing model object" - msgid "Following model object has been repaired" msgid_plural "Following model objects have been repaired" msgstr[0] "The following model object has been repaired" @@ -1650,11 +1683,6 @@ msgstr "" msgid "Arranging..." msgstr "Arranging..." -msgid "" -"Arrange failed. Found some exceptions when processing object geometries." -msgstr "" -"Arrange failed. Found some exceptions when processing object geometries." - msgid "Arranging" msgstr "Arranging" @@ -1670,6 +1698,11 @@ msgstr "" msgid "Arranging done." msgstr "Arranging done." +msgid "" +"Arrange failed. Found some exceptions when processing object geometries." +msgstr "" +"Arrange failed. Found some exceptions when processing object geometries." + #, c-format, boost-format msgid "" "Arrangement ignored the following objects which can't fit into a single " @@ -1700,8 +1733,11 @@ msgstr "Orienting..." msgid "Orienting" msgstr "Orienting" -msgid "Filling bed " -msgstr "Filling bed" +msgid "Orienting canceled." +msgstr "" + +msgid "Filling" +msgstr "" msgid "Bed filling canceled." msgstr "Bed filling canceled." @@ -1709,11 +1745,14 @@ msgstr "Bed filling canceled." msgid "Bed filling done." msgstr "Bed filling done." -msgid "Error! Unable to create thread!" -msgstr "Error. Unable to create thread." +msgid "Searching for optimal orientation" +msgstr "" -msgid "Exception" -msgstr "Exception" +msgid "Orientation search canceled." +msgstr "" + +msgid "Orientation found." +msgstr "" msgid "Logging in" msgstr "Logging in" @@ -1784,11 +1823,6 @@ msgstr "Sending print job through cloud service" msgid "Print task sending times out." msgstr "" -msgid "" -"The printer timed out while receiving a print job. Please check if the " -"network is functioning properly and send the print again." -msgstr "" - msgid "Service Unavailable" msgstr "Service Unavailable" @@ -1822,30 +1856,6 @@ msgstr "Successfully sent. Close current page in %s s" msgid "An SD card needs to be inserted before sending to printer." msgstr "A MicroSD card needs to be inserted before sending to printer." -msgid "Choose SLA archive:" -msgstr "Choose SLA archive:" - -msgid "Import file" -msgstr "Import file" - -msgid "Import model and profile" -msgstr "Import model and profile" - -msgid "Import profile only" -msgstr "Import profile only" - -msgid "Import model only" -msgstr "Import model only" - -msgid "Accurate" -msgstr "Accurate" - -msgid "Balanced" -msgstr "Balanced" - -msgid "Quick" -msgstr "Quick" - msgid "Importing SLA archive" msgstr "Importing SLA archive" @@ -2576,19 +2586,6 @@ msgstr "" "YES - Keep Prime Tower\n" "NO - Keep Independent Support Layer Height" -#, boost-format -msgid "%1% infill pattern doesn't support 100%% density." -msgstr "%1% infill pattern doesn't support 100%% density." - -msgid "" -"Switch to rectilinear pattern?\n" -"Yes - switch to rectilinear pattern automaticlly\n" -"No - reset density to default non 100% value automaticlly" -msgstr "" -"Switch to rectilinear pattern?\n" -"Yes - Switch to rectilinear pattern automatically\n" -"No - Reset density to default non 100% value automatically" - msgid "" "While printing by Object, the extruder may collide skirt.\n" "Thus, reset the skirt layer to 1 to avoid that." @@ -2689,6 +2686,18 @@ msgstr "" msgid "Motor noise showoff" msgstr "" +msgid "Nozzle filament covered detected pause" +msgstr "" + +msgid "Cutter error pause" +msgstr "" + +msgid "First layer error pause" +msgstr "" + +msgid "Nozzle clog pause" +msgstr "" + msgid "MC" msgstr "MC" @@ -3151,7 +3160,7 @@ msgstr "Volume:" msgid "Size:" msgstr "Size:" -#, boost-format +#, c-format, boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -3528,6 +3537,18 @@ msgstr "Use Perspective View" msgid "Use Orthogonal View" msgstr "Use Orthogonal View" +msgid "Show &G-code Window" +msgstr "" + +msgid "Show g-code window in Previce scene" +msgstr "" + +msgid "Reset Window Layout" +msgstr "" + +msgid "Reset to default window layout" +msgstr "" + msgid "Show &Labels" msgstr "Show &Labels" @@ -3898,6 +3919,9 @@ msgstr "Downloading %d%%..." msgid "Connection lost. Please retry." msgstr "" +msgid "The device cannot handle more conversations. Please retry later." +msgstr "" + msgid "File not exists." msgstr "" @@ -4053,8 +4077,10 @@ msgstr "Layer: %s" msgid "Layer: %d/%d" msgstr "Layer: %d/%d" -msgid "Please heat the nozzle to above 170 degree before loading filament." -msgstr "Please heat the nozzle to above 170 degrees before loading filament." +msgid "" +"Please heat the nozzle to above 170 degree before loading or unloading " +"filament." +msgstr "" msgid "Still unload" msgstr "Still unload" @@ -4403,7 +4429,7 @@ msgstr "Auto-recover from step loss" msgid "Allow Prompt Sound" msgstr "" -msgid "Fliament Tangle Detect" +msgid "Filament Tangle Detect" msgstr "" msgid "Global" @@ -4583,6 +4609,12 @@ msgid "" "It is recommended to change to smooth mode." msgstr "" +msgid "Expand sidebar" +msgstr "" + +msgid "Collapse sidebar" +msgstr "" + #, c-format, boost-format msgid "Loading file: %s" msgstr "Loading file: %s" @@ -4599,31 +4631,6 @@ msgstr "The Config cannot be loaded." msgid "The 3mf is generated by old Orca Slicer, load geometry data only." msgstr "" -#, c-format, boost-format -msgid "This slicer file version %s is newer than %s's version:" -msgstr "" - -msgid "" -"Would you like to update your Bambu Studio software to enable all " -"functionality in this slicer file?\n" -msgstr "" - -msgid "Newer 3mf version" -msgstr "Newer 3mf version" - -msgid "" -"you can always update Bambu Studio at your convenience. The slicer file will " -"now be loaded without full functionality." -msgstr "" - -#, c-format, boost-format -msgid "" -"This slicer file version %s is newer than %s's version.\n" -"\n" -"Would you like to update your Bambu Studio software to enable all " -"functionality in this slicer file?" -msgstr "" - msgid "Invalid values found in the 3mf:" msgstr "Invalid values found in the 3mf:" @@ -4855,6 +4862,9 @@ msgid "" "import it." msgstr "" +msgid "Import SLA archive" +msgstr "" + msgid "The selected file" msgstr "The selected file" @@ -4938,6 +4948,15 @@ msgstr "" "Unable to perform boolean operation on model meshes. Only positive parts " "will be exported." +msgid "" +"Are you sure you want to store original SVGs with their local paths into the " +"3MF file?\n" +"If you hit 'NO', all SVGs in the project will not be editable any more." +msgstr "" + +msgid "Private protection" +msgstr "" + msgid "Is the printer ready? Is the print sheet in place, empty and clean?" msgstr "" @@ -4960,6 +4979,9 @@ msgstr "Send to printer" msgid "Custom supports and color painting were removed before repairing." msgstr "Custom supports and color painting were removed before repairing." +msgid "Optimize Rotation" +msgstr "" + msgid "Invalid number" msgstr "Invalid number" @@ -5120,12 +5142,6 @@ msgstr "Show \"Tip of the day\" notification after start" msgid "If enabled, useful hints are displayed at startup." msgstr "If enabled, useful hints are displayed at startup." -msgid "Show g-code window" -msgstr "" - -msgid "If enabled, g-code window will be displayed." -msgstr "" - msgid "Flushing volumes: Auto-calculate everytime the color changed." msgstr "" @@ -5424,8 +5440,8 @@ msgstr "Save %s as" msgid "User Preset" msgstr "User Preset" -msgid "Project Inside Preset" -msgstr "Project Inside Preset" +msgid "Preset Inside Project" +msgstr "Preset Inside Project" msgid "Name is invalid;" msgstr "Name is invalid;" @@ -5499,6 +5515,9 @@ msgstr "Task canceled" msgid "(LAN)" msgstr "(LAN)" +msgid "Search" +msgstr "" + msgid "My Device" msgstr "My Device" @@ -5529,16 +5548,16 @@ msgstr "Bambu Cool Plate" msgid "PLA Plate" msgstr "PLA Plate" -msgid "Bamabu Engineering Plate" +msgid "Bambu Engineering Plate" msgstr "Bambu Engineering Plate" -msgid "Bamabu Smooth PEI Plate" +msgid "Bambu Smooth PEI Plate" msgstr "" msgid "High temperature Plate" msgstr "" -msgid "Bamabu Textured PEI Plate" +msgid "Bambu Textured PEI Plate" msgstr "" msgid "Send print job to" @@ -5760,6 +5779,12 @@ msgstr "The printer is required to be on the same LAN as Orca Slicer." msgid "The printer does not support sending to printer SD card." msgstr "The printer does not support sending to printer MicroSD card." +msgid "Slice ok." +msgstr "Slice complete" + +msgid "View all Daily tips" +msgstr "" + msgid "Failed to create socket" msgstr "Failed to create socket" @@ -5944,16 +5969,30 @@ msgstr "" "0 top z distance, 0 interface spacing, concentric pattern and disable " "independent support layer height" +msgid "" +"Layer height exceeds the limit in Printer Settings -> Extruder -> Layer " +"height limits ,this may cause printing quality issues." +msgstr "" + +msgid "Adjust to the set range automatically? \n" +msgstr "" + +msgid "Adjust" +msgstr "" + +msgid "Ignore" +msgstr "" + msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgid "Line width" msgstr "Line width" @@ -5967,6 +6006,15 @@ msgstr "Precision" msgid "Wall generator" msgstr "Wall generator" +msgid "Walls and surfaces" +msgstr "" + +msgid "Bridging" +msgstr "" + +msgid "Overhangs" +msgstr "" + msgid "Walls" msgstr "Walls" @@ -6306,6 +6354,12 @@ msgid_plural "Following presets will be deleted too." msgstr[0] "The following preset will be deleted too:" msgstr[1] "The following presets will be deleted too:" +msgid "" +"Are you sure to delete the selected preset? \n" +"If the preset corresponds to a filament currently in use on your printer, " +"please reset the filament information for that slot." +msgstr "" + #, boost-format msgid "Are you sure to %1% the selected preset?" msgstr "Are you sure you want to %1% the selected preset?" @@ -6331,8 +6385,8 @@ msgstr "Undefined" msgid "Unsaved Changes" msgstr "unsaved changes" -msgid "Discard or Keep changes" -msgstr "Discard or keep changes" +msgid "Transfer or discard changes" +msgstr "Transfer or discard changes" msgid "Old Value" msgstr "Old value" @@ -6547,19 +6601,15 @@ msgstr "" msgid "Ramming line spacing" msgstr "" -msgid "Auto-Calc" -msgstr "Auto-Calc" - -msgid "Re-calculate" +msgid "Recalculate" msgstr "" msgid "Flushing volumes for filament change" msgstr "Flushing volumes for filament change" msgid "" -"Studio would re-calculate your flushing volumes everytime the filaments " -"color changed. You could disable the auto-calculate in Bambu Studio > " -"Preferences" +"Orca recalculates your flushing volumes everytime the filament colors " +"change. You can change this behavior in Preferences." msgstr "" msgid "Flushing volume (mm³) for each filament pair." @@ -6576,15 +6626,6 @@ msgstr "The multiplier should be in range [%.2f, %.2f]." msgid "Multiplier" msgstr "Multiplier" -msgid "unloaded" -msgstr "unloaded" - -msgid "loaded" -msgstr "loaded" - -msgid "Filament #" -msgstr "Filament #" - msgid "From" msgstr "From" @@ -6951,6 +6992,9 @@ msgstr "Printing" msgid "Idle" msgstr "Idle" +msgid "Beta version" +msgstr "" + msgid "Latest version" msgstr "Latest version" @@ -7313,6 +7357,25 @@ msgstr "" msgid "Variable layer height is not supported with Organic supports." msgstr "" +msgid "" +"Different nozzle diameters and different filament diameters is not allowed " +"when prime tower is enabled." +msgstr "" + +msgid "" +"The Wipe Tower is currently only supported with the relative extruder " +"addressing (use_relative_e_distances=1)." +msgstr "" + +msgid "" +"Ooze prevention is currently not supported with the prime tower enabled." +msgstr "" + +msgid "" +"The prime tower is currently only supported for the Marlin, RepRap/Sprinter, " +"RepRapFirmware and Repetier G-code flavors." +msgstr "" + msgid "The prime tower is not supported in \"By object\" print." msgstr "A prime tower is not supported in “By object” print." @@ -7385,11 +7448,6 @@ msgstr "" msgid "Layer height cannot exceed nozzle diameter" msgstr "Layer height cannot exceed nozzle diameter." -msgid "" -"Layer height cannot exceed the limit in Printer Settings -> Extruder -> " -"Layer height limits" -msgstr "" - msgid "" "Relative extruder addressing requires resetting the extruder position at " "each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to " @@ -7481,6 +7539,12 @@ msgstr "" "This is the maximum printable height which is limited by the height of the " "build area." +msgid "Preferred orientation" +msgstr "" + +msgid "Automatically orient stls on the Z-axis upon initial import" +msgstr "" + msgid "Printer preset names" msgstr "Printer preset names" @@ -7753,8 +7817,8 @@ msgstr "" msgid "Density of external bridges. 100% means solid bridge. Default is 100%." msgstr "" -msgid "Bridge flow" -msgstr "Bridge flow" +msgid "Bridge flow ratio" +msgstr "Bridge flow ratio" msgid "" "Decrease this value slightly(for example 0.9) to reduce the amount of " @@ -7763,6 +7827,15 @@ msgstr "" "Decrease this value slightly (for example 0.9) to reduce the amount of " "material extruded for bridges to avoid sagging." +msgid "Internal bridge flow ratio" +msgstr "" + +msgid "" +"This value governs the thickness of the internal bridge layer. This is the " +"first layer over sparse infill. Decrease this value slightly (for example " +"0.9) to improve surface quality over sparse infill." +msgstr "" + msgid "Top surface flow ratio" msgstr "" @@ -8079,6 +8152,15 @@ msgstr "" "may look worse. If disabled, bridges look better but are reliable only for " "shorter distances." +msgid "Thick internal bridges" +msgstr "" + +msgid "" +"If enabled, thick internal bridges will be used. It's usually recommended to " +"have this feature turned on. However, consider turning it off if you are " +"using large nozzles." +msgstr "" + msgid "Max bridge length" msgstr "Max bridge length" @@ -8160,7 +8242,7 @@ msgid "Internal solid infill pattern" msgstr "" msgid "" -"Line pattern of internal solid infill. if the detect nattow internal solid " +"Line pattern of internal solid infill. if the detect narrow internal solid " "infill be enabled, the concentric pattern will be used for the small area." msgstr "" @@ -8193,25 +8275,55 @@ msgid "" "This sets the threshold for small perimeter length. Default threshold is 0mm" msgstr "" -msgid "Order of walls" +msgid "Walls printing order" msgstr "" -msgid "Print sequence of inner wall and outer wall. " +msgid "" +"Print sequence of the internal (inner) and external (outer) walls. \n" +"\n" +"Use Inner/Outer for best overhangs. This is because the overhanging walls " +"can adhere to a neighouring perimeter while printing. However, this option " +"results in slightly reduced surface quality as the external perimeter is " +"deformed by being squashed to the internal perimeter.\n" +"\n" +"Use Inner/Outer/Inner for the best external surface finish and dimensional " +"accuracy as the external wall is printed undisturbed from an internal " +"perimeter. However, overhang performance will reduce as there is no internal " +"perimeter to print the external wall against. This option requires a minimum " +"of 3 walls to be effective as it prints the internal walls from the 3rd " +"perimeter onwards first, then the external perimeter and, finally, the first " +"internal perimeter. This option is recomended against the Outer/Inner option " +"in most cases. \n" +"\n" +"Use Outer/Inner for the same external wall quality and dimensional accuracy " +"benefits of Inner/Outer/Inner option. However, the z seams will appear less " +"consistent as the first extrusion of a new layer starts on a visible " +"surface.\n" +"\n" +" " msgstr "" -msgid "inner/outer" +msgid "Inner/Outer" msgstr "" -msgid "outer/inner" +msgid "Outer/Inner" msgstr "" -msgid "inner wall/outer wall/inner wall" +msgid "Inner/Outer/Inner" msgstr "" msgid "Print infill first" msgstr "" -msgid "Order of wall/infill. false means print wall first. " +msgid "" +"Order of wall/infill. When the tickbox is unchecked the walls are printed " +"first, which works best in most cases.\n" +"\n" +"Printing walls first may help with extreme overhangs as the walls have the " +"neighbouring infill to adhere to. However, the infill will slighly push out " +"the printed walls where it is attached to them, resulting in a worse " +"external surface finish. It can also cause the infill to shine through the " +"external surfaces of the part." msgstr "" msgid "Height to rod" @@ -8551,11 +8663,11 @@ msgstr "" msgid "Sparse infill density" msgstr "Sparse infill density" -#, c-format -msgid "Density of internal sparse infill, 100% means solid throughout" +#, c-format, boost-format +msgid "" +"Density of internal sparse infill, 100% turns all sparse infill into solid " +"infill and internal solid infill pattern will be used" msgstr "" -"This is the density of internal sparse infill. 100% means that the object " -"will be solid throughout." msgid "Sparse infill pattern" msgstr "Sparse infill pattern" @@ -8760,10 +8872,10 @@ msgstr "Full fan speed at layer" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " -"than \"close_fan_the_first_x_layers\", in which case the fan will be running " -"at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower than " +"\"close_fan_the_first_x_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." msgstr "" msgid "Support interface fan speed" @@ -8816,6 +8928,12 @@ msgstr "" "The average distance between the random points introduced on each line " "segment" +msgid "Apply fuzzy skin to first layer" +msgstr "" + +msgid "Whether to apply fuzzy skin on the first layer" +msgstr "" + msgid "Filter out tiny gaps" msgstr "" @@ -9444,13 +9562,13 @@ msgstr "Filename format" msgid "User can self-define the project file name when export" msgstr "Users can decide project file names when exporting." -msgid "Make overhang printable" +msgid "Make overhangs printable" msgstr "" msgid "Modify the geometry to print overhangs without support material." msgstr "" -msgid "Make overhang printable maximum angle" +msgid "Make overhangs printable - Maximum angle" msgstr "" msgid "" @@ -9459,7 +9577,7 @@ msgid "" "0 will replace all overhangs with conical material." msgstr "" -msgid "Make overhang printable hole area" +msgid "Make overhangs printable - Hole area" msgstr "" msgid "" @@ -9703,6 +9821,9 @@ msgstr "" msgid "Show auto-calibration marks" msgstr "" +msgid "Disable set remaining print time" +msgstr "" + msgid "Seam position" msgstr "Seam position" @@ -9831,6 +9952,22 @@ msgstr "" "and turns a solid model into a single walled print with solid bottom layers. " "The final generated model has no seam." +msgid "Smooth Spiral" +msgstr "" + +msgid "" +"Smooth Spiral smoothes out X and Y moves as wellresulting in no visible seam " +"at all, even in the XY directions on walls that are not vertical" +msgstr "" + +msgid "Max XY Smoothing" +msgstr "" + +msgid "" +"Maximum distance to move points in XY to try to achieve a smooth spiralIf " +"expressed as a %, it will be computed over nozzle diameter" +msgstr "" + msgid "" "If smooth or traditional mode is selected, a timelapse video will be " "generated for each print. After each layer is printed, a snapshot is taken " @@ -10034,10 +10171,11 @@ msgstr "" "Filament to print support bases and rafts. \"Default\" means no specific " "filament for support, and current filament is used" -msgid "No interface filament for body" +msgid "Avoid interface filament for base" msgstr "" -msgid "Don't use support interface filament to print support body" +msgid "" +"Avoid using support interface filament to print support base if possible." msgstr "" msgid "" @@ -10283,11 +10421,11 @@ msgid "" "double walls." msgstr "" -msgid "Tree support wall loops" -msgstr "Tree support wall loops" +msgid "Support wall loops" +msgstr "" -msgid "This setting specify the count of walls around tree support" -msgstr "This setting specifies the wall count around tree support." +msgid "This setting specify the count of walls around support" +msgstr "" msgid "Tree support with infill" msgstr "Tree support with infill" @@ -10401,10 +10539,16 @@ msgid "Wipe Distance" msgstr "Wipe distance" msgid "" -"Discribe how long the nozzle will move along the last path when retracting" +"Discribe how long the nozzle will move along the last path when " +"retracting. \n" +"\n" +"Depending on how long the wipe operation lasts, how fast and long the " +"extruder/filament retraction settings are, a retraction move may be needed " +"to retract the remaining filament. \n" +"\n" +"Setting a value in the retract amount before wipe setting below will perform " +"any excess retraction before the wipe, else it will be performed after." msgstr "" -"This describes how long the nozzle will move along the last path while " -"retracting." msgid "" "The wiping tower can be used to clean up the residue on the nozzle and " @@ -10719,10 +10863,6 @@ msgstr "" msgid "invalid value " msgstr "invalid value " -#, c-format, boost-format -msgid " doesn't work at 100%% density " -msgstr " doesn't work at 100%% density " - msgid "Invalid value when spiral vase mode is enabled: " msgstr "Invalid value when spiral vase mode is enabled: " @@ -11574,6 +11714,721 @@ msgstr "" msgid "Delete input" msgstr "" +msgid "Network Test" +msgstr "" + +msgid "Start Test Multi-Thread" +msgstr "" + +msgid "Start Test Single-Thread" +msgstr "" + +msgid "Export Log" +msgstr "" + +msgid "Studio Version:" +msgstr "" + +msgid "System Version:" +msgstr "" + +msgid "DNS Server:" +msgstr "" + +msgid "Test BambuLab" +msgstr "" + +msgid "Test BambuLab:" +msgstr "" + +msgid "Test Bing.com" +msgstr "" + +msgid "Test bing.com:" +msgstr "" + +msgid "Test HTTP" +msgstr "" + +msgid "Test HTTP Service:" +msgstr "" + +msgid "Test storage" +msgstr "" + +msgid "Test Storage Upload:" +msgstr "" + +msgid "Test storage upgrade" +msgstr "" + +msgid "Test Storage Upgrade:" +msgstr "" + +msgid "Test storage download" +msgstr "" + +msgid "Test Storage Download:" +msgstr "" + +msgid "Test plugin download" +msgstr "" + +msgid "Test Plugin Download:" +msgstr "" + +msgid "Test Storage Upload" +msgstr "" + +msgid "Log Info" +msgstr "" + +msgid "Select filament preset" +msgstr "" + +msgid "Create Filament" +msgstr "" + +msgid "Create Based on Current Filament" +msgstr "" + +msgid "Copy Current Filament Preset " +msgstr "" + +msgid "Basic Information" +msgstr "" + +msgid "Add Filament Preset under this filament" +msgstr "" + +msgid "We could create the filament presets for your following printer:" +msgstr "" + +msgid "Select Vendor" +msgstr "" + +msgid "Input Custom Vendor" +msgstr "" + +msgid "Can't find vendor I want" +msgstr "" + +msgid "Select Type" +msgstr "" + +msgid "Select Filament Preset" +msgstr "" + +msgid "Serial" +msgstr "" + +msgid "e.g. Basic, Matte, Silk, Marble" +msgstr "" + +msgid "Filament Preset" +msgstr "" + +msgid "Create" +msgstr "" + +msgid "Vendor is not selected, please reselect vendor." +msgstr "" + +msgid "Custom vendor is not input, please input custom vendor." +msgstr "" + +msgid "" +"\"Bambu\" or \"Generic\" can not be used as a Vendor for custom filaments." +msgstr "" + +msgid "Filament type is not selected, please reselect type." +msgstr "" + +msgid "Filament serial is not inputed, please input serial." +msgstr "" + +msgid "" +"There may be escape characters in the vendor or serial input of filament. " +"Please delete and re-enter." +msgstr "" + +msgid "All inputs in the custom vendor or serial are spaces. Please re-enter." +msgstr "" + +msgid "The vendor can not be a number. Please re-enter." +msgstr "" + +msgid "" +"You have not selected a printer or preset yet. Please select at least one." +msgstr "" + +msgid "Some existing presets have failed to be created, as follows:\n" +msgstr "" + +msgid "" +"\n" +"Do you want to rewrite it?" +msgstr "" + +msgid "" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" +"To add preset for more prinetrs, Please go to printer selection" +msgstr "" + +msgid "Create Printer/Nozzle" +msgstr "" + +msgid "Create Printer" +msgstr "" + +msgid "Create Nozzle for Existing Printer" +msgstr "" + +msgid "Create from Template" +msgstr "" + +msgid "Create Based on Current Printer" +msgstr "" + +msgid "wiki" +msgstr "" + +msgid "Import Preset" +msgstr "" + +msgid "Create Type" +msgstr "" + +msgid "The model is not fond, place reselect vendor." +msgstr "" + +msgid "Select Model" +msgstr "" + +msgid "Select Printer" +msgstr "" + +msgid "Input Custom Model" +msgstr "" + +msgid "Can't find my printer model" +msgstr "" + +msgid "Rectangle" +msgstr "" + +msgid "Printable Space" +msgstr "" + +msgid "X" +msgstr "" + +msgid "Y" +msgstr "" + +msgid "Hot Bed STL" +msgstr "" + +msgid "Load stl" +msgstr "" + +msgid "Hot Bed SVG" +msgstr "" + +msgid "Load svg" +msgstr "" + +msgid "Max Print Height" +msgstr "" + +#, c-format, boost-format +msgid "The file exceeds %d MB, please import again." +msgstr "" + +msgid "Exception in obtaining file size, please import again." +msgstr "" + +msgid "Preset path is not find, please reselect vendor." +msgstr "" + +msgid "The printer model was not found, please reselect." +msgstr "" + +msgid "The nozzle diameter is not fond, place reselect." +msgstr "" + +msgid "The printer preset is not fond, place reselect." +msgstr "" + +msgid "Printer Preset" +msgstr "" + +msgid "Filament Preset Template" +msgstr "" + +msgid "Deselect All" +msgstr "" + +msgid "Process Preset Template" +msgstr "" + +msgid "Back Page 1" +msgstr "" + +msgid "" +"You have not yet chosen which printer preset to create based on. Please " +"choose the vendor and model of the printer" +msgstr "" + +msgid "" +"You have entered an illegal input in the printable area section on the first " +"page. Please check before creating it." +msgstr "" + +msgid "The custom printer or model is not inputed, place input." +msgstr "" + +msgid "" +"The printer preset you created already has a preset with the same name. Do " +"you want to overwrite it?\n" +"\tYes: Overwrite the printer preset with the same name, and filament and " +"process presets with the same preset name will be recreated \n" +"and filament and process presets without the same preset name will be " +"reserve.\n" +"\tCancel: Do not create a preset, return to the creation interface." +msgstr "" + +msgid "You need to select at least one filament preset." +msgstr "" + +msgid "You need to select at least one process preset." +msgstr "" + +msgid "Create filament presets failed. As follows:\n" +msgstr "" + +msgid "Create process presets failed. As follows:\n" +msgstr "" + +msgid "Vendor is not find, please reselect." +msgstr "" + +msgid "Current vendor has no models, please reselect." +msgstr "" + +msgid "" +"You have not selected the vendor and model or inputed the custom vendor and " +"model." +msgstr "" + +msgid "" +"There may be escape characters in the custom printer vendor or model. Please " +"delete and re-enter." +msgstr "" + +msgid "" +"All inputs in the custom printer vendor or model are spaces. Please re-enter." +msgstr "" + +msgid "Please check bed printable shape and origin input." +msgstr "" + +msgid "" +"You have not yet selected the printer to replace the nozzle, please choose." +msgstr "" + +msgid "Create Printer Successful" +msgstr "" + +msgid "Create Filament Successful" +msgstr "" + +msgid "Printer Created" +msgstr "" + +msgid "Please go to printer settings to edit your presets" +msgstr "" + +msgid "Filament Created" +msgstr "" + +msgid "" +"Please go to filament setting to edit your presets if you need.\n" +"Please note that nozzle temperature, hot bed temperature, and maximum " +"volumetric speed have a significant impact on printing quality. Please set " +"them carefully." +msgstr "" + +msgid "Printer Setting" +msgstr "" + +msgid "Export Configs" +msgstr "" + +msgid "Printer config bundle(.bbscfg)" +msgstr "" + +msgid "Filament bundle(.bbsflmt)" +msgstr "" + +msgid "Printer presets(.zip)" +msgstr "" + +msgid "Filament presets(.zip)" +msgstr "" + +msgid "Process presets(.zip)" +msgstr "" + +msgid "initialize fail" +msgstr "" + +msgid "add file fail" +msgstr "" + +msgid "add bundle structure file fail" +msgstr "" + +msgid "finalize fail" +msgstr "" + +msgid "open zip written fail" +msgstr "" + +msgid "Export successful" +msgstr "" + +#, c-format, boost-format +msgid "" +"The '%s' folder already exists in the current directory. Do you want to " +"clear it and rebuild it.\n" +"If not, a time suffix will be added, and you can modify the name after " +"creation." +msgstr "" + +msgid "" +"Printer and all the filament&process presets that belongs to the printer. \n" +"Can be shared with others." +msgstr "" + +msgid "" +"User's fillment preset set. \n" +"Can be shared with others." +msgstr "" + +msgid "" +"Only display printer names with changes to printer, filament, and process " +"presets." +msgstr "" + +msgid "Only display the filament names with changes to filament presets." +msgstr "" + +msgid "" +"Only printer names with user printer presets will be displayed, and each " +"preset you choose will be exported as a zip." +msgstr "" + +msgid "" +"Only the filament names with user filament presets will be displayed, \n" +"and all user filament presets in each filament name you select will be " +"exported as a zip." +msgstr "" + +msgid "" +"Only printer names with changed process presets will be displayed, \n" +"and all user process presets in each printer name you select will be " +"exported as a zip." +msgstr "" + +msgid "Please select at least one printer or filament." +msgstr "" + +msgid "Please select a type you want to export" +msgstr "" + +msgid "Edit Filament" +msgstr "" + +msgid "Filament presets under this filament" +msgstr "" + +msgid "" +"Note: If the only preset under this filament is deleted, the filament will " +"be deleted after exiting the dialog." +msgstr "" + +msgid "Presets inherited by other presets can not be deleted" +msgstr "" + +msgid "The following presets inherits this preset." +msgid_plural "The following preset inherits this preset." +msgstr[0] "" +msgstr[1] "" + +msgid "Delete Preset" +msgstr "" + +msgid "Are you sure to delete the selected preset?" +msgstr "" + +msgid "Delete preset" +msgstr "" + +msgid "+ Add Preset" +msgstr "" + +msgid "Delete Filament" +msgstr "" + +msgid "" +"All the filament presets belong to this filament would be deleted. \n" +"If you are using this filament on your printer, please reset the filament " +"information for that slot." +msgstr "" + +msgid "Delete filament" +msgstr "" + +msgid "Add Preset" +msgstr "" + +msgid "Add preset for new printer" +msgstr "" + +msgid "Copy preset from filament" +msgstr "" + +msgid "The filament choice not find filament preset, please reselect it" +msgstr "" + +msgid "Edit Preset" +msgstr "" + +msgid "For more information, please check out Wiki" +msgstr "" + +msgid "Collapse" +msgstr "" + +msgid "Daily Tips" +msgstr "" + +msgid "Need select printer" +msgstr "" + +msgid "The start, end or step is not valid value." +msgstr "" + +msgid "" +"Unable to calibrate: maybe because the set calibration value range is too " +"large, or the step is too small" +msgstr "" + +#, fuzzy +msgid "Physical Printer" +msgstr "Printer" + +msgid "Print Host upload" +msgstr "" + +msgid "Could not get a valid Printer Host reference" +msgstr "" + +msgid "Success!" +msgstr "" + +msgid "Refresh Printers" +msgstr "" + +msgid "" +"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" +"signed certificate." +msgstr "" + +msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" +msgstr "" + +msgid "Open CA certificate file" +msgstr "" + +#, c-format, boost-format +msgid "" +"On this system, %s uses HTTPS certificates from the system Certificate Store " +"or Keychain." +msgstr "" + +msgid "" +"To use a custom CA file, please import your CA file into Certificate Store / " +"Keychain." +msgstr "" + +msgid "Connection to printers connected via the print host failed." +msgstr "" + +#, c-format, boost-format +msgid "Mismatched type of print host: %s" +msgstr "" + +msgid "Connection to AstroBox works correctly." +msgstr "" + +msgid "Could not connect to AstroBox" +msgstr "" + +msgid "Note: AstroBox version at least 1.1.0 is required." +msgstr "" + +msgid "Connection to Duet works correctly." +msgstr "" + +msgid "Could not connect to Duet" +msgstr "" + +msgid "Unknown error occured" +msgstr "" + +msgid "Wrong password" +msgstr "" + +msgid "Could not get resources to create a new connection" +msgstr "" + +msgid "Upload not enabled on FlashAir card." +msgstr "" + +msgid "Connection to FlashAir works correctly and upload is enabled." +msgstr "" + +msgid "Could not connect to FlashAir" +msgstr "" + +msgid "" +"Note: FlashAir with firmware 2.00.02 or newer and activated upload function " +"is required." +msgstr "" + +msgid "Connection to MKS works correctly." +msgstr "" + +msgid "Could not connect to MKS" +msgstr "" + +msgid "Connection to OctoPrint works correctly." +msgstr "" + +msgid "Could not connect to OctoPrint" +msgstr "" + +msgid "Note: OctoPrint version at least 1.1.0 is required." +msgstr "" + +msgid "Connection to Prusa SL1 / SL1S works correctly." +msgstr "" + +msgid "Could not connect to Prusa SLA" +msgstr "" + +msgid "Connection to PrusaLink works correctly." +msgstr "" + +msgid "Could not connect to PrusaLink" +msgstr "" + +msgid "Storages found" +msgstr "" + +#. TRN %1% = storage path +#, boost-format +msgid "%1% : read only" +msgstr "" + +#. TRN %1% = storage path +#, boost-format +msgid "%1% : no free space" +msgstr "" + +#. TRN %1% = host +#, boost-format +msgid "Upload has failed. There is no suitable storage found at %1%." +msgstr "" + +msgid "Connection to Prusa Connect works correctly." +msgstr "" + +msgid "Could not connect to Prusa Connect" +msgstr "" + +msgid "Connection to Repetier works correctly." +msgstr "" + +msgid "Could not connect to Repetier" +msgstr "" + +msgid "Note: Repetier version at least 0.90.0 is required." +msgstr "" + +#, boost-format +msgid "" +"HTTP status: %1%\n" +"Message body: \"%2%\"" +msgstr "" + +#, boost-format +msgid "" +"Parsing of host response failed.\n" +"Message body: \"%1%\"\n" +"Error: \"%2%\"" +msgstr "" + +#, boost-format +msgid "" +"Enumeration of host printers failed.\n" +"Message body: \"%1%\"\n" +"Error: \"%2%\"" +msgstr "" + +#: resources/data/hints.ini: [hint:Precise wall] +msgid "" +"Precise wall\n" +"Did you know that turning on precise wall can improve precision and layer " +"consistency?" +msgstr "" + +#: resources/data/hints.ini: [hint:Sandwich mode] +msgid "" +"Sandwich mode\n" +"Did you know that you can use sandwich mode (inner-outer-inner) to improve " +"precision and layer consistency if your model doesn't have very steep " +"overhangs?" +msgstr "" + +#: resources/data/hints.ini: [hint:Chamber temperature] +msgid "" +"Chamber temperature\n" +"Did you know that OrcaSlicer supports chamber temperature?" +msgstr "" + +#: resources/data/hints.ini: [hint:Calibration] +msgid "" +"Calibration\n" +"Did you know that calibrating your printer can do wonders? Check out our " +"beloved calibration solution in OrcaSlicer." +msgstr "" + +#: resources/data/hints.ini: [hint:Auxiliary fan] +msgid "" +"Auxiliary fan\n" +"Did you know that OrcaSlicer supports Auxiliary part cooling fan?" +msgstr "" + +#: resources/data/hints.ini: [hint:Air filtration] +msgid "" +"Air filtration/Exhuast Fan\n" +"Did you know that OrcaSlicer can support Air filtration/Exhuast Fan?" +msgstr "" + #: resources/data/hints.ini: [hint:How to use keyboard shortcuts] msgid "" "How to use keyboard shortcuts\n" @@ -11640,8 +12495,7 @@ msgstr "" msgid "" "Simplify Model\n" "Did you know that you can reduce the number of triangles in a mesh using the " -"Simplify mesh feature? Right-click the model and select Simplify model. Read " -"more in the documentation." +"Simplify mesh feature? Right-click the model and select Simplify model." msgstr "" #: resources/data/hints.ini: [hint:Slicing Parameter Table] @@ -11663,7 +12517,7 @@ msgid "" "Subtract a Part\n" "Did you know that you can subtract one mesh from another using the Negative " "part modifier? That way you can, for example, create easily resizable holes " -"directly in Orca Slicer. Read more in the documentation." +"directly in Orca Slicer." msgstr "" #: resources/data/hints.ini: [hint:STEP] @@ -11782,6 +12636,96 @@ msgid "" "probability of warping." msgstr "" +#~ msgid "Edit Text" +#~ msgstr "Edit Text" + +#~ msgid "Error! Unable to create thread!" +#~ msgstr "Error. Unable to create thread." + +#~ msgid "Exception" +#~ msgstr "Exception" + +#~ msgid "Choose SLA archive:" +#~ msgstr "Choose SLA archive:" + +#~ msgid "Import file" +#~ msgstr "Import file" + +#~ msgid "Import model and profile" +#~ msgstr "Import model and profile" + +#~ msgid "Import profile only" +#~ msgstr "Import profile only" + +#~ msgid "Import model only" +#~ msgstr "Import model only" + +#~ msgid "Accurate" +#~ msgstr "Accurate" + +#~ msgid "Balanced" +#~ msgstr "Balanced" + +#~ msgid "Quick" +#~ msgstr "Quick" + +#~ msgid "Auto-Calc" +#~ msgstr "Auto-Calc" + +#~ msgid "unloaded" +#~ msgstr "unloaded" + +#~ msgid "loaded" +#~ msgstr "loaded" + +#~ msgid "Filament #" +#~ msgstr "Filament #" + +#~ msgid "" +#~ "Discribe how long the nozzle will move along the last path when retracting" +#~ msgstr "" +#~ "This describes how long the nozzle will move along the last path while " +#~ "retracting." + +#~ msgid "Filling bed " +#~ msgstr "Filling bed" + +#, boost-format +#~ msgid "%1% infill pattern doesn't support 100%% density." +#~ msgstr "%1% infill pattern doesn't support 100%% density." + +#~ msgid "" +#~ "Switch to rectilinear pattern?\n" +#~ "Yes - switch to rectilinear pattern automaticlly\n" +#~ "No - reset density to default non 100% value automaticlly" +#~ msgstr "" +#~ "Switch to rectilinear pattern?\n" +#~ "Yes - Switch to rectilinear pattern automatically\n" +#~ "No - Reset density to default non 100% value automatically" + +#~ msgid "Please heat the nozzle to above 170 degree before loading filament." +#~ msgstr "" +#~ "Please heat the nozzle to above 170 degrees before loading filament." + +#~ msgid "Newer 3mf version" +#~ msgstr "Newer 3mf version" + +#, c-format +#~ msgid "Density of internal sparse infill, 100% means solid throughout" +#~ msgstr "" +#~ "This is the density of internal sparse infill. 100% means that the object " +#~ "will be solid throughout." + +#~ msgid "Tree support wall loops" +#~ msgstr "Tree support wall loops" + +#~ msgid "This setting specify the count of walls around tree support" +#~ msgstr "This setting specifies the wall count around tree support." + +#, c-format, boost-format +#~ msgid " doesn't work at 100%% density " +#~ msgstr " doesn't work at 100%% density " + #~ msgid "Ctrl + Shift + Enter" #~ msgstr "Ctrl + Shift + Enter" @@ -11803,9 +12747,6 @@ msgstr "" #~ msgid "Export all objects as STL" #~ msgstr "Export All Objects as STL" -#~ msgid "Slice ok." -#~ msgstr "Slice complete" - #, c-format, boost-format #~ msgid "" #~ "The 3mf's version %s is newer than %s's version %s, Found following keys " @@ -11983,10 +12924,6 @@ msgstr "" #~ "Sets debug logging level. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" #~ "trace\n" -#, fuzzy -#~ msgid "Physical Printer" -#~ msgstr "Printer" - #~ msgid "Embeded" #~ msgstr "Embedded" @@ -12081,7 +13018,7 @@ msgstr "" #~ msgid "Score" #~ msgstr "Score" -#~ msgid "Bamabu High Temperature Plate" +#~ msgid "Bambu High Temperature Plate" #~ msgstr "Bambu High Temperature Plate" #~ msgid "Can't connect to the printer" diff --git a/localization/i18n/es/OrcaSlicer_es.po b/localization/i18n/es/OrcaSlicer_es.po index e757da3b2d..c16143b26a 100644 --- a/localization/i18n/es/OrcaSlicer_es.po +++ b/localization/i18n/es/OrcaSlicer_es.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-24 18:09+0100\n" +"POT-Creation-Date: 2023-12-19 22:09+0800\n" "PO-Revision-Date: \n" "Last-Translator: Carlos Fco. Caruncho Serrano \n" "Language-Team: \n" @@ -295,6 +295,12 @@ msgstr "Seleccionar todos los conectores" msgid "Cut" msgstr "Cortar" +msgid "non-mainifold edges be caused by cut tool, do you want to fix it now?" +msgstr "" + +msgid "Repairing model object" +msgstr "Reparación de un objeto modelo" + msgid "Connector" msgstr "Conector" @@ -873,6 +879,24 @@ msgstr "Añadir bloqueo de soportes" msgid "Add support enforcer" msgstr "Añadir refuerzo de soportes" +msgid "Add text" +msgstr "" + +msgid "Add negative text" +msgstr "" + +msgid "Add text modifier" +msgstr "" + +msgid "Add SVG part" +msgstr "" + +msgid "Add negative SVG" +msgstr "" + +msgid "Add SVG modifier" +msgstr "" + msgid "Select settings" msgstr "Seleccione los ajustes" @@ -888,9 +912,6 @@ msgstr "Borrar" msgid "Delete the selected object" msgstr "Eliminar el objeto seleccionado" -msgid "Edit Text" -msgstr "Editar Texto" - msgid "Load..." msgstr "Cargar..." @@ -915,6 +936,12 @@ msgstr "Cilindro" msgid "Cone" msgstr "Cono" +msgid "Text" +msgstr "" + +msgid "SVG" +msgstr "" + msgid "Height range Modifier" msgstr "Modificador de rango de Altura" @@ -1048,6 +1075,18 @@ msgstr "Reflejar" msgid "Mirror object" msgstr "Objeto reflejado" +msgid "Edit text" +msgstr "" + +msgid "Ability to change text, font, size, ..." +msgstr "" + +msgid "Edit SVG" +msgstr "" + +msgid "Change SVG source file, projection, size, ..." +msgstr "" + msgid "Invalidate cut info" msgstr "Invalidar información de corte" @@ -1209,9 +1248,6 @@ msgstr "Haga clic en el icono para editar la pintura de color del objeto" msgid "Click the icon to shift this object to the bed" msgstr "Presionar el icono para desplazar este objeto a la cama" -msgid " search results" -msgstr "" - msgid "Loading file" msgstr "Cargando archivo" @@ -1362,9 +1398,6 @@ msgstr "Introduce un nuevo nombre" msgid "Renaming" msgstr "Renombrar" -msgid "Repairing model object" -msgstr "Reparación de un objeto modelo" - msgid "Following model object has been repaired" msgid_plural "Following model objects have been repaired" msgstr[0] "Se ha reparado el siguiente modelo de objeto" @@ -1693,12 +1726,6 @@ msgstr "" msgid "Arranging..." msgstr "Organizando..." -msgid "" -"Arrange failed. Found some exceptions when processing object geometries." -msgstr "" -"El posicionamiento ha fallado. Se han encontrado algunas excepciones al " -"procesar las geometrías de los objetos." - msgid "Arranging" msgstr "Organizando" @@ -1714,6 +1741,12 @@ msgstr "" msgid "Arranging done." msgstr "Organización terminada." +msgid "" +"Arrange failed. Found some exceptions when processing object geometries." +msgstr "" +"El posicionamiento ha fallado. Se han encontrado algunas excepciones al " +"procesar las geometrías de los objetos." + #, c-format, boost-format msgid "" "Arrangement ignored the following objects which can't fit into a single " @@ -1744,8 +1777,11 @@ msgstr "Orientando..." msgid "Orienting" msgstr "Orientación" -msgid "Filling bed " -msgstr "Rellenando cama " +msgid "Orienting canceled." +msgstr "" + +msgid "Filling" +msgstr "" msgid "Bed filling canceled." msgstr "Bed filling canceled." @@ -1753,11 +1789,14 @@ msgstr "Bed filling canceled." msgid "Bed filling done." msgstr "Bed filling done." -msgid "Error! Unable to create thread!" -msgstr "¡Error! ¡No se ha podido crear el proceso!" +msgid "Searching for optimal orientation" +msgstr "" -msgid "Exception" -msgstr "Excepción" +msgid "Orientation search canceled." +msgstr "" + +msgid "Orientation found." +msgstr "" msgid "Logging in" msgstr "Iniciando sesión" @@ -1830,11 +1869,6 @@ msgstr "Enviando trabajo de impresión a través del servicio en la nube" msgid "Print task sending times out." msgstr "" -msgid "" -"The printer timed out while receiving a print job. Please check if the " -"network is functioning properly and send the print again." -msgstr "" - msgid "Service Unavailable" msgstr "Servicio No Disponible" @@ -1869,30 +1903,6 @@ msgstr "Envío exitoso. Cierre la página actual en %s s" msgid "An SD card needs to be inserted before sending to printer." msgstr "Se necesita insertar una tarjeta SD antes de enviar a la impresora." -msgid "Choose SLA archive:" -msgstr "Elige el archivo SLA:" - -msgid "Import file" -msgstr "Importar archivo" - -msgid "Import model and profile" -msgstr "Importar modelo y perfil" - -msgid "Import profile only" -msgstr "Importar perfil solo" - -msgid "Import model only" -msgstr "Importar solo el modelo" - -msgid "Accurate" -msgstr "Precisión" - -msgid "Balanced" -msgstr "Balanceado" - -msgid "Quick" -msgstr "Rápido" - msgid "Importing SLA archive" msgstr "Importando archivo SLA" @@ -2660,19 +2670,6 @@ msgstr "" "SÍ - Mantener la torre de purga\n" "NO - Mantener la altura de la capa de soporte independiente" -#, boost-format -msgid "%1% infill pattern doesn't support 100%% density." -msgstr "El patrón de relleno %1% no soporta el 100%% de densidad." - -msgid "" -"Switch to rectilinear pattern?\n" -"Yes - switch to rectilinear pattern automaticlly\n" -"No - reset density to default non 100% value automaticlly" -msgstr "" -"¿Cambiar a patrón rectilíneo?\n" -"Sí - cambiar a patrón rectilíneo automaticamente\n" -"No - reiniciar a valor de densidad no 100% por defecto automáticamente" - msgid "" "While printing by Object, the extruder may collide skirt.\n" "Thus, reset the skirt layer to 1 to avoid that." @@ -2777,6 +2774,18 @@ msgstr "Pausado debido a un G-Code de usuario" msgid "Motor noise showoff" msgstr "Ruido notable del motor" +msgid "Nozzle filament covered detected pause" +msgstr "" + +msgid "Cutter error pause" +msgstr "" + +msgid "First layer error pause" +msgstr "" + +msgid "Nozzle clog pause" +msgstr "" + msgid "MC" msgstr "MC" @@ -3254,7 +3263,7 @@ msgstr "Volumen:" msgid "Size:" msgstr "Tamaño:" -#, boost-format +#, c-format, boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -3633,6 +3642,18 @@ msgstr "Utilizar Vista en Perspectiva" msgid "Use Orthogonal View" msgstr "Utilizar Vista Octogonal" +msgid "Show &G-code Window" +msgstr "" + +msgid "Show g-code window in Previce scene" +msgstr "" + +msgid "Reset Window Layout" +msgstr "" + +msgid "Reset to default window layout" +msgstr "" + msgid "Show &Labels" msgstr "Mostrar &Etiquetas" @@ -4015,6 +4036,9 @@ msgstr "Descargando %d%%..." msgid "Connection lost. Please retry." msgstr "" +msgid "The device cannot handle more conversations. Please retry later." +msgstr "" + msgid "File not exists." msgstr "" @@ -4174,8 +4198,10 @@ msgstr "Capa: %s" msgid "Layer: %d/%d" msgstr "Capa: %d/%d" -msgid "Please heat the nozzle to above 170 degree before loading filament." -msgstr "Caliente la boquilla a más de 170 grados antes de cargar el filamento." +msgid "" +"Please heat the nozzle to above 170 degree before loading or unloading " +"filament." +msgstr "" msgid "Still unload" msgstr "Aún descargado" @@ -4542,7 +4568,7 @@ msgstr "Autorecuperar desde pérdida de paso" msgid "Allow Prompt Sound" msgstr "Permitir Sonido de Aviso" -msgid "Fliament Tangle Detect" +msgid "Filament Tangle Detect" msgstr "" msgid "Global" @@ -4732,6 +4758,12 @@ msgstr "" "Activar la fotografía timelapse tradicional puede causar imperfecciones en " "la superficie. Se recomienda cambiar al modo suave." +msgid "Expand sidebar" +msgstr "" + +msgid "Collapse sidebar" +msgstr "" + #, c-format, boost-format msgid "Loading file: %s" msgstr "Cargando archivo: %s" @@ -4750,31 +4782,6 @@ msgstr "" "El 3mf está generado por un Orca Slicer antiguo, cargar solo datos de " "geometría." -#, c-format, boost-format -msgid "This slicer file version %s is newer than %s's version:" -msgstr "" - -msgid "" -"Would you like to update your Bambu Studio software to enable all " -"functionality in this slicer file?\n" -msgstr "" - -msgid "Newer 3mf version" -msgstr "Nueva versión 3mf" - -msgid "" -"you can always update Bambu Studio at your convenience. The slicer file will " -"now be loaded without full functionality." -msgstr "" - -#, c-format, boost-format -msgid "" -"This slicer file version %s is newer than %s's version.\n" -"\n" -"Would you like to update your Bambu Studio software to enable all " -"functionality in this slicer file?" -msgstr "" - msgid "Invalid values found in the 3mf:" msgstr "Valores inválidos encontrados en el 3mf:" @@ -5016,6 +5023,9 @@ msgstr "" "La importación a Bambu Studio ha fallado. Descargue el archivo e impórtelo " "manualmente." +msgid "Import SLA archive" +msgstr "" + msgid "The selected file" msgstr "El archivo seleccionado" @@ -5099,6 +5109,15 @@ msgstr "" "Unable to perform boolean operation on model meshes. Only positive parts " "will be exported." +msgid "" +"Are you sure you want to store original SVGs with their local paths into the " +"3MF file?\n" +"If you hit 'NO', all SVGs in the project will not be editable any more." +msgstr "" + +msgid "Private protection" +msgstr "" + msgid "Is the printer ready? Is the print sheet in place, empty and clean?" msgstr "" "¿Está la impresora preparada? ¿Está la hoja en el sitio. limpia y vacía?" @@ -5124,6 +5143,9 @@ msgstr "" "Los soportes personalizados y la pintura de color se eliminaron antes de la " "reparación." +msgid "Optimize Rotation" +msgstr "" + msgid "Invalid number" msgstr "Número inválido" @@ -5292,12 +5314,6 @@ msgstr "Mostrar la notificación \"Consejo del Día\" después de empezar" msgid "If enabled, useful hints are displayed at startup." msgstr "Si está activado, las sugerencias útiles serán mostradas al inicio." -msgid "Show g-code window" -msgstr "Mostrar la ventana de G-Code" - -msgid "If enabled, g-code window will be displayed." -msgstr "Si está activado, se mostrará la ventana de G-Code." - msgid "Flushing volumes: Auto-calculate everytime the color changed." msgstr "" @@ -5601,7 +5617,7 @@ msgstr "Guardar %s como" msgid "User Preset" msgstr "Preajuste de usuario" -msgid "Project Inside Preset" +msgid "Preset Inside Project" msgstr "Preajuste interno del proyecto" msgid "Name is invalid;" @@ -5677,6 +5693,9 @@ msgstr "Tarea cancelada" msgid "(LAN)" msgstr "(Red local)" +msgid "Search" +msgstr "" + msgid "My Device" msgstr "Mi dispositivo" @@ -5707,16 +5726,16 @@ msgstr "Bandeja frío Bambu" msgid "PLA Plate" msgstr "PLA Plate" -msgid "Bamabu Engineering Plate" +msgid "Bambu Engineering Plate" msgstr "Bandeja de Ingeniería Bambú" -msgid "Bamabu Smooth PEI Plate" +msgid "Bambu Smooth PEI Plate" msgstr "" msgid "High temperature Plate" msgstr "Bandeja de Alta Temperatura" -msgid "Bamabu Textured PEI Plate" +msgid "Bambu Textured PEI Plate" msgstr "" msgid "Send print job to" @@ -5955,6 +5974,12 @@ msgstr "" msgid "The printer does not support sending to printer SD card." msgstr "La impresora no soporta el envio directo a la tarjeta SD." +msgid "Slice ok." +msgstr "Laminado correcto." + +msgid "View all Daily tips" +msgstr "" + msgid "Failed to create socket" msgstr "Failed to create socket" @@ -6143,11 +6168,25 @@ msgstr "" "distancia z0, espaciado de interfaz 0, patrón concéntrico y desactivar " "altura de soporte independiente de altura de capa" +msgid "" +"Layer height exceeds the limit in Printer Settings -> Extruder -> Layer " +"height limits ,this may cause printing quality issues." +msgstr "" + +msgid "Adjust to the set range automatically? \n" +msgstr "" + +msgid "Adjust" +msgstr "" + +msgid "Ignore" +msgstr "" + msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" "Cuando grabamos timelapse sin cabezal de impresión, es recomendable añadir " "un \"Torre de Purga de Intervalo\" \n" @@ -6166,6 +6205,15 @@ msgstr "Precisión" msgid "Wall generator" msgstr "Generador de perímetros" +msgid "Walls and surfaces" +msgstr "" + +msgid "Bridging" +msgstr "" + +msgid "Overhangs" +msgstr "" + msgid "Walls" msgstr "Perímetros" @@ -6521,6 +6569,12 @@ msgid_plural "Following presets will be deleted too." msgstr[0] "El siguiente preajuste también se eliminará." msgstr[1] "Los siguientes preajustes también se eliminarán." +msgid "" +"Are you sure to delete the selected preset? \n" +"If the preset corresponds to a filament currently in use on your printer, " +"please reset the filament information for that slot." +msgstr "" + #, boost-format msgid "Are you sure to %1% the selected preset?" msgstr "¿Está seguro de %1% el preajuste seleccionado?" @@ -6548,7 +6602,7 @@ msgstr "No definido" msgid "Unsaved Changes" msgstr "Cambios No guardados" -msgid "Discard or Keep changes" +msgid "Transfer or discard changes" msgstr "Descartar o mantener los cambios" msgid "Old Value" @@ -6767,19 +6821,15 @@ msgstr "Ancho de línea de Ramming" msgid "Ramming line spacing" msgstr "Espaciado de línea de moldeado de extremo" -msgid "Auto-Calc" -msgstr "Auto-Calc" - -msgid "Re-calculate" +msgid "Recalculate" msgstr "" msgid "Flushing volumes for filament change" msgstr "Volúmenes de limpieza para el cambio de filamentos" msgid "" -"Studio would re-calculate your flushing volumes everytime the filaments " -"color changed. You could disable the auto-calculate in Bambu Studio > " -"Preferences" +"Orca recalculates your flushing volumes everytime the filament colors " +"change. You can change this behavior in Preferences." msgstr "" msgid "Flushing volume (mm³) for each filament pair." @@ -6796,15 +6846,6 @@ msgstr "El multiplicador debería estar en el rango [%.2f, %.2f]." msgid "Multiplier" msgstr "Multiplicador" -msgid "unloaded" -msgstr "descargado" - -msgid "loaded" -msgstr "cargado" - -msgid "Filament #" -msgstr "Filamento #" - msgid "From" msgstr "Desde" @@ -7179,6 +7220,9 @@ msgstr "Imprimendo" msgid "Idle" msgstr "Inactivo" +msgid "Beta version" +msgstr "" + msgid "Latest version" msgstr "Última versión" @@ -7558,6 +7602,25 @@ msgid "Variable layer height is not supported with Organic supports." msgstr "" "La altura de capa variable no es compatible con los soportes orgánicos." +msgid "" +"Different nozzle diameters and different filament diameters is not allowed " +"when prime tower is enabled." +msgstr "" + +msgid "" +"The Wipe Tower is currently only supported with the relative extruder " +"addressing (use_relative_e_distances=1)." +msgstr "" + +msgid "" +"Ooze prevention is currently not supported with the prime tower enabled." +msgstr "" + +msgid "" +"The prime tower is currently only supported for the Marlin, RepRap/Sprinter, " +"RepRapFirmware and Repetier G-code flavors." +msgstr "" + msgid "The prime tower is not supported in \"By object\" print." msgstr "La torre de purga no es compatible con la impresión \"Por objeto\"." @@ -7641,11 +7704,6 @@ msgstr "" msgid "Layer height cannot exceed nozzle diameter" msgstr "La altura de la capa no puede superar el diámetro de la boquilla" -msgid "" -"Layer height cannot exceed the limit in Printer Settings -> Extruder -> " -"Layer height limits" -msgstr "" - msgid "" "Relative extruder addressing requires resetting the extruder position at " "each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to " @@ -7747,6 +7805,12 @@ msgstr "Altura imprimible" msgid "Maximum printable height which is limited by mechanism of printer" msgstr "Altura máxima imprimible limitada por el mecanismo de la impresora" +msgid "Preferred orientation" +msgstr "" + +msgid "Automatically orient stls on the Z-axis upon initial import" +msgstr "" + msgid "Printer preset names" msgstr "Nombres de ajustes de la impresora" @@ -8032,7 +8096,7 @@ msgstr "" "Densidad de puentes externos. 100% significa puente sólido. Por defecto es " "100%." -msgid "Bridge flow" +msgid "Bridge flow ratio" msgstr "Ratio de caudal en puentes" msgid "" @@ -8042,6 +8106,15 @@ msgstr "" "Disminuya este valor ligeramente (por ejemplo 0,9) para reducir la cantidad " "de material para el puente, para mejorar el hundimiento" +msgid "Internal bridge flow ratio" +msgstr "" + +msgid "" +"This value governs the thickness of the internal bridge layer. This is the " +"first layer over sparse infill. Decrease this value slightly (for example " +"0.9) to improve surface quality over sparse infill." +msgstr "" + msgid "Top surface flow ratio" msgstr "Ratio de caudal en superficie superior" @@ -8398,6 +8471,15 @@ msgstr "" "más largas, pero pueden tener peor aspecto. Si están desactivados, los " "puentes se ven mejor pero son fiables sólo para distancias más cortas." +msgid "Thick internal bridges" +msgstr "" + +msgid "" +"If enabled, thick internal bridges will be used. It's usually recommended to " +"have this feature turned on. However, consider turning it off if you are " +"using large nozzles." +msgstr "" + msgid "Max bridge length" msgstr "Distancia máxima de puentes" @@ -8479,7 +8561,7 @@ msgid "Internal solid infill pattern" msgstr "Patrón de relleno sólido interno" msgid "" -"Line pattern of internal solid infill. if the detect nattow internal solid " +"Line pattern of internal solid infill. if the detect narrow internal solid " "infill be enabled, the concentric pattern will be used for the small area." msgstr "" "Patrón lineal de relleno sólido interno, si se activa la detección de " @@ -8524,25 +8606,55 @@ msgstr "" "Esto configura el umbral para longitud de perímetro pequeño. El umbral por " "defecto es 0mm" -msgid "Order of walls" +msgid "Walls printing order" msgstr "" -msgid "Print sequence of inner wall and outer wall. " +msgid "" +"Print sequence of the internal (inner) and external (outer) walls. \n" +"\n" +"Use Inner/Outer for best overhangs. This is because the overhanging walls " +"can adhere to a neighouring perimeter while printing. However, this option " +"results in slightly reduced surface quality as the external perimeter is " +"deformed by being squashed to the internal perimeter.\n" +"\n" +"Use Inner/Outer/Inner for the best external surface finish and dimensional " +"accuracy as the external wall is printed undisturbed from an internal " +"perimeter. However, overhang performance will reduce as there is no internal " +"perimeter to print the external wall against. This option requires a minimum " +"of 3 walls to be effective as it prints the internal walls from the 3rd " +"perimeter onwards first, then the external perimeter and, finally, the first " +"internal perimeter. This option is recomended against the Outer/Inner option " +"in most cases. \n" +"\n" +"Use Outer/Inner for the same external wall quality and dimensional accuracy " +"benefits of Inner/Outer/Inner option. However, the z seams will appear less " +"consistent as the first extrusion of a new layer starts on a visible " +"surface.\n" +"\n" +" " msgstr "" -msgid "inner/outer" +msgid "Inner/Outer" msgstr "" -msgid "outer/inner" +msgid "Outer/Inner" msgstr "" -msgid "inner wall/outer wall/inner wall" +msgid "Inner/Outer/Inner" msgstr "" msgid "Print infill first" msgstr "" -msgid "Order of wall/infill. false means print wall first. " +msgid "" +"Order of wall/infill. When the tickbox is unchecked the walls are printed " +"first, which works best in most cases.\n" +"\n" +"Printing walls first may help with extreme overhangs as the walls have the " +"neighbouring infill to adhere to. However, the infill will slighly push out " +"the printed walls where it is attached to them, resulting in a worse " +"external surface finish. It can also cause the infill to shine through the " +"external surfaces of the part." msgstr "" msgid "Height to rod" @@ -8934,10 +9046,11 @@ msgstr "" msgid "Sparse infill density" msgstr "Densidad de relleno" -#, c-format -msgid "Density of internal sparse infill, 100% means solid throughout" +#, c-format, boost-format +msgid "" +"Density of internal sparse infill, 100% turns all sparse infill into solid " +"infill and internal solid infill pattern will be used" msgstr "" -"Densidad del relleno interno, el 100%% significa sólido en toda la superficie" msgid "Sparse infill pattern" msgstr "Patrón de relleno de baja densidad" @@ -9177,10 +9290,10 @@ msgstr "Velocidad máxima del ventilador en la capa" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " -"than \"close_fan_the_first_x_layers\", in which case the fan will be running " -"at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower than " +"\"close_fan_the_first_x_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." msgstr "" "La velocidad de ventilador se incrementará linealmente de cero a " "\"close_fan_the_first_x_layers\" al máximo de capa \"full_fan_speed_layer\". " @@ -9240,6 +9353,12 @@ msgstr "" "La diatancia media entre los puntos aleatorios introducidos en cada segmento " "de línea" +msgid "Apply fuzzy skin to first layer" +msgstr "" + +msgid "Whether to apply fuzzy skin on the first layer" +msgstr "" + msgid "Filter out tiny gaps" msgstr "Filtrar pequeños huecos" @@ -9987,13 +10106,13 @@ msgstr "" "El usuario puede definir por sí mismo el nombre del archivo del proyecto al " "exportarlo" -msgid "Make overhang printable" +msgid "Make overhangs printable" msgstr "Voladizos imprimibles sin soporte" msgid "Modify the geometry to print overhangs without support material." msgstr "Modificar la geometría para imprimir voladizos sin soportes." -msgid "Make overhang printable maximum angle" +msgid "Make overhangs printable - Maximum angle" msgstr "Máximo ángulo de impresión de voladizos imprimibles sin soporte" msgid "" @@ -10005,7 +10124,7 @@ msgstr "" "cambiará el modelo del todo y permitirá cualquier voladizo, mientras que 0 " "reemplazará todos lo voladizos con material cónico." -msgid "Make overhang printable hole area" +msgid "Make overhangs printable - Hole area" msgstr "Área hueca del voladizo imprimible sin soporte" msgid "" @@ -10281,6 +10400,9 @@ msgstr "" msgid "Show auto-calibration marks" msgstr "Muestra marcas de autocalibración" +msgid "Disable set remaining print time" +msgstr "" + msgid "Seam position" msgstr "Posición de la costura" @@ -10428,6 +10550,22 @@ msgstr "" "modelo sólido en una impresión de una soel perímetro con capas inferiores " "sólidas. El modelo final generado no tiene costura" +msgid "Smooth Spiral" +msgstr "" + +msgid "" +"Smooth Spiral smoothes out X and Y moves as wellresulting in no visible seam " +"at all, even in the XY directions on walls that are not vertical" +msgstr "" + +msgid "Max XY Smoothing" +msgstr "" + +msgid "" +"Maximum distance to move points in XY to try to achieve a smooth spiralIf " +"expressed as a %, it will be computed over nozzle diameter" +msgstr "" + msgid "" "If smooth or traditional mode is selected, a timelapse video will be " "generated for each print. After each layer is printed, a snapshot is taken " @@ -10649,10 +10787,11 @@ msgstr "" "defecto\" significa que no hay filamento específico para el soporte y se " "utiliza el filamento actual" -msgid "No interface filament for body" +msgid "Avoid interface filament for base" msgstr "" -msgid "Don't use support interface filament to print support body" +msgid "" +"Avoid using support interface filament to print support base if possible." msgstr "" msgid "" @@ -10932,13 +11071,11 @@ msgstr "" "imprimirán con doble pared para mayor estabilidad. Establezca este valor en " "cero para no tener doble pared." -msgid "Tree support wall loops" -msgstr "Perímetros de las ramas" - -msgid "This setting specify the count of walls around tree support" +msgid "Support wall loops" +msgstr "" + +msgid "This setting specify the count of walls around support" msgstr "" -"Este ajuste especifica el número de perímetros alrededor del soporte del " -"árbol" msgid "Tree support with infill" msgstr "Soporte para árboles con relleno" @@ -11067,10 +11204,16 @@ msgid "Wipe Distance" msgstr "Distancia de limpieza" msgid "" -"Discribe how long the nozzle will move along the last path when retracting" +"Discribe how long the nozzle will move along the last path when " +"retracting. \n" +"\n" +"Depending on how long the wipe operation lasts, how fast and long the " +"extruder/filament retraction settings are, a retraction move may be needed " +"to retract the remaining filament. \n" +"\n" +"Setting a value in the retract amount before wipe setting below will perform " +"any excess retraction before the wipe, else it will be performed after." msgstr "" -"Describa cuánto tiempo se moverá la boquilla a lo largo de la última " -"trayectoria al retraerse" msgid "" "The wiping tower can be used to clean up the residue on the nozzle and " @@ -11422,10 +11565,6 @@ msgstr "" msgid "invalid value " msgstr "valor inválido " -#, c-format, boost-format -msgid " doesn't work at 100%% density " -msgstr " no funciona con una densidad del 100%% " - msgid "Invalid value when spiral vase mode is enabled: " msgstr "Valor no válido cuando está activado el modo jarrón espiral: " @@ -11810,12 +11949,12 @@ msgstr "" "wiki.\n" "\n" "Normalmente la calibración es innecesaria. Cuando se inicia una impresión de " -"un solo color/material, con la opción \"Calibración de la dinámica de " -"caudal\" marcada en el menú de inicio de impresión, la impresora seguirá el " -"método antiguo, calibrar el filamento antes de la impresión; Cuando se " -"inicia una impresión de varios colores/materiales, la impresora utilizará el " -"parámetro de compensación por defecto para el filamento durante cada cambio " -"de filamento que tendrá un buen resultado en la mayoría de los casos.\n" +"un solo color/material, con la opción \"Calibración de la dinámica de caudal" +"\" marcada en el menú de inicio de impresión, la impresora seguirá el método " +"antiguo, calibrar el filamento antes de la impresión; Cuando se inicia una " +"impresión de varios colores/materiales, la impresora utilizará el parámetro " +"de compensación por defecto para el filamento durante cada cambio de " +"filamento que tendrá un buen resultado en la mayoría de los casos.\n" "\n" "Tenga en cuenta que hay algunos casos en los que el resultado de la " "calibración no es fiable: el uso de una placa de textura para hacer la " @@ -12413,6 +12552,731 @@ msgstr "Parte 2" msgid "Delete input" msgstr "Borrado de entrada" +msgid "Network Test" +msgstr "" + +msgid "Start Test Multi-Thread" +msgstr "" + +msgid "Start Test Single-Thread" +msgstr "" + +msgid "Export Log" +msgstr "" + +msgid "Studio Version:" +msgstr "" + +msgid "System Version:" +msgstr "" + +msgid "DNS Server:" +msgstr "" + +msgid "Test BambuLab" +msgstr "" + +msgid "Test BambuLab:" +msgstr "" + +msgid "Test Bing.com" +msgstr "" + +msgid "Test bing.com:" +msgstr "" + +msgid "Test HTTP" +msgstr "" + +msgid "Test HTTP Service:" +msgstr "" + +msgid "Test storage" +msgstr "" + +msgid "Test Storage Upload:" +msgstr "" + +msgid "Test storage upgrade" +msgstr "" + +msgid "Test Storage Upgrade:" +msgstr "" + +msgid "Test storage download" +msgstr "" + +msgid "Test Storage Download:" +msgstr "" + +msgid "Test plugin download" +msgstr "" + +msgid "Test Plugin Download:" +msgstr "" + +msgid "Test Storage Upload" +msgstr "" + +msgid "Log Info" +msgstr "" + +msgid "Select filament preset" +msgstr "" + +msgid "Create Filament" +msgstr "" + +msgid "Create Based on Current Filament" +msgstr "" + +msgid "Copy Current Filament Preset " +msgstr "" + +msgid "Basic Information" +msgstr "" + +msgid "Add Filament Preset under this filament" +msgstr "" + +msgid "We could create the filament presets for your following printer:" +msgstr "" + +msgid "Select Vendor" +msgstr "" + +msgid "Input Custom Vendor" +msgstr "" + +msgid "Can't find vendor I want" +msgstr "" + +msgid "Select Type" +msgstr "" + +msgid "Select Filament Preset" +msgstr "" + +msgid "Serial" +msgstr "" + +msgid "e.g. Basic, Matte, Silk, Marble" +msgstr "" + +msgid "Filament Preset" +msgstr "" + +msgid "Create" +msgstr "" + +msgid "Vendor is not selected, please reselect vendor." +msgstr "" + +msgid "Custom vendor is not input, please input custom vendor." +msgstr "" + +msgid "" +"\"Bambu\" or \"Generic\" can not be used as a Vendor for custom filaments." +msgstr "" + +msgid "Filament type is not selected, please reselect type." +msgstr "" + +msgid "Filament serial is not inputed, please input serial." +msgstr "" + +msgid "" +"There may be escape characters in the vendor or serial input of filament. " +"Please delete and re-enter." +msgstr "" + +msgid "All inputs in the custom vendor or serial are spaces. Please re-enter." +msgstr "" + +msgid "The vendor can not be a number. Please re-enter." +msgstr "" + +msgid "" +"You have not selected a printer or preset yet. Please select at least one." +msgstr "" + +msgid "Some existing presets have failed to be created, as follows:\n" +msgstr "" + +msgid "" +"\n" +"Do you want to rewrite it?" +msgstr "" + +msgid "" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" +"To add preset for more prinetrs, Please go to printer selection" +msgstr "" + +msgid "Create Printer/Nozzle" +msgstr "" + +msgid "Create Printer" +msgstr "" + +msgid "Create Nozzle for Existing Printer" +msgstr "" + +msgid "Create from Template" +msgstr "" + +msgid "Create Based on Current Printer" +msgstr "" + +msgid "wiki" +msgstr "" + +msgid "Import Preset" +msgstr "" + +msgid "Create Type" +msgstr "" + +msgid "The model is not fond, place reselect vendor." +msgstr "" + +msgid "Select Model" +msgstr "" + +msgid "Select Printer" +msgstr "" + +msgid "Input Custom Model" +msgstr "" + +msgid "Can't find my printer model" +msgstr "" + +msgid "Rectangle" +msgstr "" + +msgid "Printable Space" +msgstr "" + +msgid "X" +msgstr "" + +msgid "Y" +msgstr "" + +msgid "Hot Bed STL" +msgstr "" + +msgid "Load stl" +msgstr "" + +msgid "Hot Bed SVG" +msgstr "" + +msgid "Load svg" +msgstr "" + +msgid "Max Print Height" +msgstr "" + +#, c-format, boost-format +msgid "The file exceeds %d MB, please import again." +msgstr "" + +msgid "Exception in obtaining file size, please import again." +msgstr "" + +msgid "Preset path is not find, please reselect vendor." +msgstr "" + +msgid "The printer model was not found, please reselect." +msgstr "" + +msgid "The nozzle diameter is not fond, place reselect." +msgstr "" + +msgid "The printer preset is not fond, place reselect." +msgstr "" + +msgid "Printer Preset" +msgstr "" + +msgid "Filament Preset Template" +msgstr "" + +msgid "Deselect All" +msgstr "" + +msgid "Process Preset Template" +msgstr "" + +msgid "Back Page 1" +msgstr "" + +msgid "" +"You have not yet chosen which printer preset to create based on. Please " +"choose the vendor and model of the printer" +msgstr "" + +msgid "" +"You have entered an illegal input in the printable area section on the first " +"page. Please check before creating it." +msgstr "" + +msgid "The custom printer or model is not inputed, place input." +msgstr "" + +msgid "" +"The printer preset you created already has a preset with the same name. Do " +"you want to overwrite it?\n" +"\tYes: Overwrite the printer preset with the same name, and filament and " +"process presets with the same preset name will be recreated \n" +"and filament and process presets without the same preset name will be " +"reserve.\n" +"\tCancel: Do not create a preset, return to the creation interface." +msgstr "" + +msgid "You need to select at least one filament preset." +msgstr "" + +msgid "You need to select at least one process preset." +msgstr "" + +msgid "Create filament presets failed. As follows:\n" +msgstr "" + +msgid "Create process presets failed. As follows:\n" +msgstr "" + +msgid "Vendor is not find, please reselect." +msgstr "" + +msgid "Current vendor has no models, please reselect." +msgstr "" + +msgid "" +"You have not selected the vendor and model or inputed the custom vendor and " +"model." +msgstr "" + +msgid "" +"There may be escape characters in the custom printer vendor or model. Please " +"delete and re-enter." +msgstr "" + +msgid "" +"All inputs in the custom printer vendor or model are spaces. Please re-enter." +msgstr "" + +msgid "Please check bed printable shape and origin input." +msgstr "" + +msgid "" +"You have not yet selected the printer to replace the nozzle, please choose." +msgstr "" + +msgid "Create Printer Successful" +msgstr "" + +msgid "Create Filament Successful" +msgstr "" + +msgid "Printer Created" +msgstr "" + +msgid "Please go to printer settings to edit your presets" +msgstr "" + +msgid "Filament Created" +msgstr "" + +msgid "" +"Please go to filament setting to edit your presets if you need.\n" +"Please note that nozzle temperature, hot bed temperature, and maximum " +"volumetric speed have a significant impact on printing quality. Please set " +"them carefully." +msgstr "" + +msgid "Printer Setting" +msgstr "" + +msgid "Export Configs" +msgstr "" + +msgid "Printer config bundle(.bbscfg)" +msgstr "" + +msgid "Filament bundle(.bbsflmt)" +msgstr "" + +msgid "Printer presets(.zip)" +msgstr "" + +msgid "Filament presets(.zip)" +msgstr "" + +msgid "Process presets(.zip)" +msgstr "" + +msgid "initialize fail" +msgstr "" + +msgid "add file fail" +msgstr "" + +msgid "add bundle structure file fail" +msgstr "" + +msgid "finalize fail" +msgstr "" + +msgid "open zip written fail" +msgstr "" + +msgid "Export successful" +msgstr "" + +#, c-format, boost-format +msgid "" +"The '%s' folder already exists in the current directory. Do you want to " +"clear it and rebuild it.\n" +"If not, a time suffix will be added, and you can modify the name after " +"creation." +msgstr "" + +msgid "" +"Printer and all the filament&process presets that belongs to the printer. \n" +"Can be shared with others." +msgstr "" + +msgid "" +"User's fillment preset set. \n" +"Can be shared with others." +msgstr "" + +msgid "" +"Only display printer names with changes to printer, filament, and process " +"presets." +msgstr "" + +msgid "Only display the filament names with changes to filament presets." +msgstr "" + +msgid "" +"Only printer names with user printer presets will be displayed, and each " +"preset you choose will be exported as a zip." +msgstr "" + +msgid "" +"Only the filament names with user filament presets will be displayed, \n" +"and all user filament presets in each filament name you select will be " +"exported as a zip." +msgstr "" + +msgid "" +"Only printer names with changed process presets will be displayed, \n" +"and all user process presets in each printer name you select will be " +"exported as a zip." +msgstr "" + +msgid "Please select at least one printer or filament." +msgstr "" + +msgid "Please select a type you want to export" +msgstr "" + +msgid "Edit Filament" +msgstr "" + +msgid "Filament presets under this filament" +msgstr "" + +msgid "" +"Note: If the only preset under this filament is deleted, the filament will " +"be deleted after exiting the dialog." +msgstr "" + +msgid "Presets inherited by other presets can not be deleted" +msgstr "" + +msgid "The following presets inherits this preset." +msgid_plural "The following preset inherits this preset." +msgstr[0] "" +msgstr[1] "" + +msgid "Delete Preset" +msgstr "" + +msgid "Are you sure to delete the selected preset?" +msgstr "" + +msgid "Delete preset" +msgstr "" + +msgid "+ Add Preset" +msgstr "" + +msgid "Delete Filament" +msgstr "" + +msgid "" +"All the filament presets belong to this filament would be deleted. \n" +"If you are using this filament on your printer, please reset the filament " +"information for that slot." +msgstr "" + +msgid "Delete filament" +msgstr "" + +msgid "Add Preset" +msgstr "" + +msgid "Add preset for new printer" +msgstr "" + +msgid "Copy preset from filament" +msgstr "" + +msgid "The filament choice not find filament preset, please reselect it" +msgstr "" + +msgid "Edit Preset" +msgstr "" + +msgid "For more information, please check out Wiki" +msgstr "" + +msgid "Collapse" +msgstr "" + +msgid "Daily Tips" +msgstr "" + +msgid "Need select printer" +msgstr "Necesario seleccionar impresora" + +msgid "The start, end or step is not valid value." +msgstr "El inicio, el final o el paso no tienen un valor válido." + +msgid "" +"Unable to calibrate: maybe because the set calibration value range is too " +"large, or the step is too small" +msgstr "" +"No es posible calibrar debido a que el valor del rango de calibración es muy " +"grande, o el paso es muy pequeño" + +msgid "Physical Printer" +msgstr "Impresora física" + +msgid "Print Host upload" +msgstr "Carga de Host de Impresión" + +msgid "Could not get a valid Printer Host reference" +msgstr "No se ha podido obtener una referencia de host de impresora válida" + +msgid "Success!" +msgstr "¡Exitoso!" + +msgid "Refresh Printers" +msgstr "Refrescar Impresoras" + +msgid "" +"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" +"signed certificate." +msgstr "" +"El archivo HTTPS CA es opcional. Solo es necesario si utiliza HTTPS con un " +"certificado autofirmado." + +msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" +msgstr "" +"Archivos de certificado (*.crt, *.pem)|*.crt;*.pem|Todos los archivos|*.*" + +msgid "Open CA certificate file" +msgstr "Abrir archivo de certificado CA" + +#, c-format, boost-format +msgid "" +"On this system, %s uses HTTPS certificates from the system Certificate Store " +"or Keychain." +msgstr "" +"En este sistema, %s utiliza certificados HTTPS del almacén de certificados o " +"llavero del sistema." + +msgid "" +"To use a custom CA file, please import your CA file into Certificate Store / " +"Keychain." +msgstr "" +"Para utilizar un archivo de CA personalizado, importe su archivo de CA a " +"Almacén de certificados / Llavero." + +msgid "Connection to printers connected via the print host failed." +msgstr "" +"Ha fallado la conexión a impresoras conectadas a través del host de " +"impresión." + +#, c-format, boost-format +msgid "Mismatched type of print host: %s" +msgstr "" + +msgid "Connection to AstroBox works correctly." +msgstr "" + +msgid "Could not connect to AstroBox" +msgstr "" + +msgid "Note: AstroBox version at least 1.1.0 is required." +msgstr "" + +msgid "Connection to Duet works correctly." +msgstr "" + +msgid "Could not connect to Duet" +msgstr "" + +msgid "Unknown error occured" +msgstr "" + +msgid "Wrong password" +msgstr "" + +msgid "Could not get resources to create a new connection" +msgstr "" + +msgid "Upload not enabled on FlashAir card." +msgstr "" + +msgid "Connection to FlashAir works correctly and upload is enabled." +msgstr "" + +msgid "Could not connect to FlashAir" +msgstr "" + +msgid "" +"Note: FlashAir with firmware 2.00.02 or newer and activated upload function " +"is required." +msgstr "" + +msgid "Connection to MKS works correctly." +msgstr "" + +msgid "Could not connect to MKS" +msgstr "" + +msgid "Connection to OctoPrint works correctly." +msgstr "" + +msgid "Could not connect to OctoPrint" +msgstr "" + +msgid "Note: OctoPrint version at least 1.1.0 is required." +msgstr "" + +msgid "Connection to Prusa SL1 / SL1S works correctly." +msgstr "" + +msgid "Could not connect to Prusa SLA" +msgstr "" + +msgid "Connection to PrusaLink works correctly." +msgstr "" + +msgid "Could not connect to PrusaLink" +msgstr "" + +msgid "Storages found" +msgstr "" + +#. TRN %1% = storage path +#, boost-format +msgid "%1% : read only" +msgstr "" + +#. TRN %1% = storage path +#, boost-format +msgid "%1% : no free space" +msgstr "" + +#. TRN %1% = host +#, boost-format +msgid "Upload has failed. There is no suitable storage found at %1%." +msgstr "" + +msgid "Connection to Prusa Connect works correctly." +msgstr "" + +msgid "Could not connect to Prusa Connect" +msgstr "" + +msgid "Connection to Repetier works correctly." +msgstr "" + +msgid "Could not connect to Repetier" +msgstr "" + +msgid "Note: Repetier version at least 0.90.0 is required." +msgstr "" + +#, boost-format +msgid "" +"HTTP status: %1%\n" +"Message body: \"%2%\"" +msgstr "" + +#, boost-format +msgid "" +"Parsing of host response failed.\n" +"Message body: \"%1%\"\n" +"Error: \"%2%\"" +msgstr "" + +#, boost-format +msgid "" +"Enumeration of host printers failed.\n" +"Message body: \"%1%\"\n" +"Error: \"%2%\"" +msgstr "" + +#: resources/data/hints.ini: [hint:Precise wall] +msgid "" +"Precise wall\n" +"Did you know that turning on precise wall can improve precision and layer " +"consistency?" +msgstr "" + +#: resources/data/hints.ini: [hint:Sandwich mode] +msgid "" +"Sandwich mode\n" +"Did you know that you can use sandwich mode (inner-outer-inner) to improve " +"precision and layer consistency if your model doesn't have very steep " +"overhangs?" +msgstr "" + +#: resources/data/hints.ini: [hint:Chamber temperature] +msgid "" +"Chamber temperature\n" +"Did you know that OrcaSlicer supports chamber temperature?" +msgstr "" + +#: resources/data/hints.ini: [hint:Calibration] +msgid "" +"Calibration\n" +"Did you know that calibrating your printer can do wonders? Check out our " +"beloved calibration solution in OrcaSlicer." +msgstr "" + +#: resources/data/hints.ini: [hint:Auxiliary fan] +msgid "" +"Auxiliary fan\n" +"Did you know that OrcaSlicer supports Auxiliary part cooling fan?" +msgstr "" + +#: resources/data/hints.ini: [hint:Air filtration] +msgid "" +"Air filtration/Exhuast Fan\n" +"Did you know that OrcaSlicer can support Air filtration/Exhuast Fan?" +msgstr "" + #: resources/data/hints.ini: [hint:How to use keyboard shortcuts] msgid "" "How to use keyboard shortcuts\n" @@ -12497,13 +13361,8 @@ msgstr "" msgid "" "Simplify Model\n" "Did you know that you can reduce the number of triangles in a mesh using the " -"Simplify mesh feature? Right-click the model and select Simplify model. Read " -"more in the documentation." +"Simplify mesh feature? Right-click the model and select Simplify model." msgstr "" -"Simplificar modelo\n" -"¿Sabías que puedes reducir el número de triángulos de una malla utilizando " -"la función Simplificar malla? Haga clic con el botón derecho del ratón en el " -"modelo y seleccione Simplificar modelo. Más información en la documentación." #: resources/data/hints.ini: [hint:Slicing Parameter Table] msgid "" @@ -12530,13 +13389,8 @@ msgid "" "Subtract a Part\n" "Did you know that you can subtract one mesh from another using the Negative " "part modifier? That way you can, for example, create easily resizable holes " -"directly in Orca Slicer. Read more in the documentation." +"directly in Orca Slicer." msgstr "" -"Restar una parte\n" -"¿Sabías que puedes sustraer una malla de otra utilizando el modificador de " -"pieza Negativa? De esta forma puedes, por ejemplo, crear orificios " -"fácilmente redimensionables directamente en Orca Slicer. Más información en " -"la documentación." #: resources/data/hints.ini: [hint:STEP] msgid "" @@ -12701,6 +13555,128 @@ msgid "" "probability of warping." msgstr "" +#~ msgid "Edit Text" +#~ msgstr "Editar Texto" + +#~ msgid "Error! Unable to create thread!" +#~ msgstr "¡Error! ¡No se ha podido crear el proceso!" + +#~ msgid "Exception" +#~ msgstr "Excepción" + +#~ msgid "Choose SLA archive:" +#~ msgstr "Elige el archivo SLA:" + +#~ msgid "Import file" +#~ msgstr "Importar archivo" + +#~ msgid "Import model and profile" +#~ msgstr "Importar modelo y perfil" + +#~ msgid "Import profile only" +#~ msgstr "Importar perfil solo" + +#~ msgid "Import model only" +#~ msgstr "Importar solo el modelo" + +#~ msgid "Accurate" +#~ msgstr "Precisión" + +#~ msgid "Balanced" +#~ msgstr "Balanceado" + +#~ msgid "Quick" +#~ msgstr "Rápido" + +#~ msgid "Auto-Calc" +#~ msgstr "Auto-Calc" + +#~ msgid "unloaded" +#~ msgstr "descargado" + +#~ msgid "loaded" +#~ msgstr "cargado" + +#~ msgid "Filament #" +#~ msgstr "Filamento #" + +#~ msgid "" +#~ "Discribe how long the nozzle will move along the last path when retracting" +#~ msgstr "" +#~ "Describa cuánto tiempo se moverá la boquilla a lo largo de la última " +#~ "trayectoria al retraerse" + +#~ msgid "" +#~ "Simplify Model\n" +#~ "Did you know that you can reduce the number of triangles in a mesh using " +#~ "the Simplify mesh feature? Right-click the model and select Simplify " +#~ "model. Read more in the documentation." +#~ msgstr "" +#~ "Simplificar modelo\n" +#~ "¿Sabías que puedes reducir el número de triángulos de una malla " +#~ "utilizando la función Simplificar malla? Haga clic con el botón derecho " +#~ "del ratón en el modelo y seleccione Simplificar modelo. Más información " +#~ "en la documentación." + +#~ msgid "" +#~ "Subtract a Part\n" +#~ "Did you know that you can subtract one mesh from another using the " +#~ "Negative part modifier? That way you can, for example, create easily " +#~ "resizable holes directly in Orca Slicer. Read more in the documentation." +#~ msgstr "" +#~ "Restar una parte\n" +#~ "¿Sabías que puedes sustraer una malla de otra utilizando el modificador " +#~ "de pieza Negativa? De esta forma puedes, por ejemplo, crear orificios " +#~ "fácilmente redimensionables directamente en Orca Slicer. Más información " +#~ "en la documentación." + +#~ msgid "Filling bed " +#~ msgstr "Rellenando cama " + +#, boost-format +#~ msgid "%1% infill pattern doesn't support 100%% density." +#~ msgstr "El patrón de relleno %1% no soporta el 100%% de densidad." + +#~ msgid "" +#~ "Switch to rectilinear pattern?\n" +#~ "Yes - switch to rectilinear pattern automaticlly\n" +#~ "No - reset density to default non 100% value automaticlly" +#~ msgstr "" +#~ "¿Cambiar a patrón rectilíneo?\n" +#~ "Sí - cambiar a patrón rectilíneo automaticamente\n" +#~ "No - reiniciar a valor de densidad no 100% por defecto automáticamente" + +#~ msgid "Please heat the nozzle to above 170 degree before loading filament." +#~ msgstr "" +#~ "Caliente la boquilla a más de 170 grados antes de cargar el filamento." + +#~ msgid "Newer 3mf version" +#~ msgstr "Nueva versión 3mf" + +#~ msgid "Show g-code window" +#~ msgstr "Mostrar la ventana de G-Code" + +#~ msgid "If enabled, g-code window will be displayed." +#~ msgstr "Si está activado, se mostrará la ventana de G-Code." + +#, c-format +#~ msgid "Density of internal sparse infill, 100% means solid throughout" +#~ msgstr "" +#~ "Densidad del relleno interno, el 100%% significa sólido en toda la " +#~ "superficie" + +#~ msgid "Tree support wall loops" +#~ msgstr "Perímetros de las ramas" + +#~ msgid "This setting specify the count of walls around tree support" +#~ msgstr "" +#~ "Este ajuste especifica el número de perímetros alrededor del soporte del " +#~ "árbol" + +#, c-format, boost-format +#~ msgid " doesn't work at 100%% density " +#~ msgstr " no funciona con una densidad del 100%% " + #~ msgid "Ctrl + Shift + Enter" #~ msgstr "Ctrl + Shift + Enter" @@ -12722,9 +13698,6 @@ msgstr "" #~ msgid "Export all objects as STL" #~ msgstr "Exportar todos los objetos como STL" -#~ msgid "Slice ok." -#~ msgstr "Laminado correcto." - #, c-format, boost-format #~ msgid "" #~ "The 3mf's version %s is newer than %s's version %s, Found following keys " @@ -12753,15 +13726,6 @@ msgstr "" #~ msgid "Add/Remove printers" #~ msgstr "Añadir/Borrar impresoras" -#~ msgid "Bambu Engineering Plate" -#~ msgstr "Bandeja de Ingeniería Bambu" - -#~ msgid "Bambu Smooth PEI Plate" -#~ msgstr "Bandeja PEI lisa Bambu" - -#~ msgid "Bambu Textured PEI Plate" -#~ msgstr "Bandeja Texturizada PEI" - #~ msgid "" #~ "When print by object, machines with I3 structure will not generate " #~ "timelapse videos." @@ -12971,68 +13935,6 @@ msgstr "" #~ msgid "The selected preset: %1% is not found." #~ msgstr "El ajuste seleccionado: %1% no encontrado." -#~ msgid "Physical Printer" -#~ msgstr "Impresora física" - -#~ msgid "Print Host upload" -#~ msgstr "Carga de Host de Impresión" - -#~ msgid "Could not get a valid Printer Host reference" -#~ msgstr "No se ha podido obtener una referencia de host de impresora válida" - -#~ msgid "Success!" -#~ msgstr "¡Exitoso!" - -#~ msgid "Refresh Printers" -#~ msgstr "Refrescar Impresoras" - -#~ msgid "" -#~ "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" -#~ "signed certificate." -#~ msgstr "" -#~ "El archivo HTTPS CA es opcional. Solo es necesario si utiliza HTTPS con " -#~ "un certificado autofirmado." - -#~ msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" -#~ msgstr "" -#~ "Archivos de certificado (*.crt, *.pem)|*.crt;*.pem|Todos los archivos|*.*" - -#~ msgid "Open CA certificate file" -#~ msgstr "Abrir archivo de certificado CA" - -#, c-format, boost-format -#~ msgid "" -#~ "On this system, %s uses HTTPS certificates from the system Certificate " -#~ "Store or Keychain." -#~ msgstr "" -#~ "En este sistema, %s utiliza certificados HTTPS del almacén de " -#~ "certificados o llavero del sistema." - -#~ msgid "" -#~ "To use a custom CA file, please import your CA file into Certificate " -#~ "Store / Keychain." -#~ msgstr "" -#~ "Para utilizar un archivo de CA personalizado, importe su archivo de CA a " -#~ "Almacén de certificados / Llavero." - -#~ msgid "Connection to printers connected via the print host failed." -#~ msgstr "" -#~ "Ha fallado la conexión a impresoras conectadas a través del host de " -#~ "impresión." - -#~ msgid "The start, end or step is not valid value." -#~ msgstr "El inicio, el final o el paso no tienen un valor válido." - -#~ msgid "" -#~ "Unable to calibrate: maybe because the set calibration value range is too " -#~ "large, or the step is too small" -#~ msgstr "" -#~ "No es posible calibrar debido a que el valor del rango de calibración es " -#~ "muy grande, o el paso es muy pequeño" - -#~ msgid "Need select printer" -#~ msgstr "Necesario seleccionar impresora" - #~ msgid "" #~ "3D Scene Operations\n" #~ "Did you know how to control view and object/part selection with mouse and " @@ -13214,7 +14116,7 @@ msgstr "" #~ msgid "Score" #~ msgstr "Score" -#~ msgid "Bamabu High Temperature Plate" +#~ msgid "Bambu High Temperature Plate" #~ msgstr "Bandeja de Alta Temperatura Bambú" #~ msgid "Can't connect to the printer" diff --git a/localization/i18n/fr/OrcaSlicer_fr.po b/localization/i18n/fr/OrcaSlicer_fr.po index 25f36128a7..d697fcf2f4 100644 --- a/localization/i18n/fr/OrcaSlicer_fr.po +++ b/localization/i18n/fr/OrcaSlicer_fr.po @@ -6,22 +6,22 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-24 18:09+0100\n" +"POT-Creation-Date: 2023-12-19 22:09+0800\n" "PO-Revision-Date: \n" "Last-Translator: \n" -"Language-Team: Guislain Cyril\n" +"Language-Team: Guislain Cyril, Thomas Lété\n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n==0 || n==1) ? 0 : 1;\n" -"X-Generator: Poedit 3.3.1\n" +"X-Generator: Poedit 3.4.1\n" msgid "Supports Painting" -msgstr "Peindre les supports" +msgstr "Prend en charge la peinture" msgid "Alt + Mouse wheel" -msgstr "Alt + Molette de la souris" +msgstr "Alt + molette de la souris" msgid "Section view" msgstr "Vue en coupe" @@ -30,10 +30,10 @@ msgid "Reset direction" msgstr "Réinitialiser la direction" msgid "Ctrl + Mouse wheel" -msgstr "Ctrl + Molette de la souris" +msgstr "Ctrl + molette de la souris" msgid "Pen size" -msgstr "Taille du pinceau" +msgstr "Taille du stylo" msgid "Left mouse button" msgstr "Bouton gauche de la souris" @@ -48,25 +48,25 @@ msgid "Block supports" msgstr "Bloquer les supports" msgid "Shift + Left mouse button" -msgstr "Maj + Bouton gauche de la souris" +msgstr "Maj + bouton gauche de la souris" msgid "Erase" msgstr "Effacer" msgid "Erase all painting" -msgstr "Effacer tout" +msgstr "Effacer toute la peinture" msgid "Highlight overhang areas" -msgstr "Mettre en surbrillance les zones en surplomb" +msgstr "Mettez en surbrillance les zones en surplomb" msgid "Gap fill" -msgstr "Remplir les espaces" +msgstr "Remplir les trous" msgid "Perform" msgstr "Exécuter" msgid "Gap area" -msgstr "Zone d'espacement" +msgstr "Aire des trous" msgid "Tool type" msgstr "Type d'outil" @@ -78,7 +78,7 @@ msgid "On overhangs only" msgstr "Sur les surplombs uniquement" msgid "Auto support threshold angle: " -msgstr "Angle de seuil de supports automatique : " +msgstr "Angle de seuil de support automatique : " msgid "Circle" msgstr "Cercle" @@ -87,10 +87,10 @@ msgid "Sphere" msgstr "Sphère" msgid "Fill" -msgstr "Remplissage" +msgstr "Remplir" msgid "Gap Fill" -msgstr "Remplir les espaces" +msgstr "Remplissage des trous" #, boost-format msgid "Allows painting only on facets selected by: \"%1%\"" @@ -98,10 +98,10 @@ msgstr "" "Permet de peindre uniquement sur les facettes sélectionnées par : \"%1%\"" msgid "Highlight faces according to overhang angle." -msgstr "Mettre en surbrillance les faces en fonction de l'angle de surplomb." +msgstr "Mettez en surbrillance les faces en fonction de l'angle de surplomb." msgid "No auto support" -msgstr "Pas de support automatique" +msgstr "Pas de support auto" msgid "Support Generated" msgstr "Supports générés" @@ -110,7 +110,7 @@ msgid "Gizmo-Place on Face" msgstr "" msgid "Lay on face" -msgstr "Poser sur la face" +msgstr "Positionner sur une face" #, boost-format msgid "" @@ -118,23 +118,23 @@ msgid "" "the first %1% filaments will be available in painting tool." msgstr "" "Le nombre de filaments dépasse le nombre maximum pris en charge par l'outil " -"de peinture. Seuls les %1% premiers filaments seront disponibles dans " +"de peinture. seuls les %1% premiers filaments seront disponibles dans " "l'outil de peinture." msgid "Color Painting" -msgstr "Peindre" +msgstr "Couleur Peinture" msgid "Pen shape" -msgstr "Forme du pinceau" +msgstr "Forme de stylo" msgid "Paint" msgstr "Peindre" msgid "Key 1~9" -msgstr "Touche 1 ~ 9" +msgstr "Clé 1 ~ 9" msgid "Choose filament" -msgstr "Choisir le filament" +msgstr "Choisissez le filament" msgid "Edge detection" msgstr "Détection des contours" @@ -146,13 +146,13 @@ msgid "Filaments" msgstr "Filaments" msgid "Brush" -msgstr "Brosse" +msgstr "Pinceau" msgid "Smart fill" msgstr "Remplissage intelligent" msgid "Bucket fill" -msgstr "Remplissage du seau" +msgstr "Pot de peinture" msgid "Height range" msgstr "Plage de hauteur" @@ -161,10 +161,10 @@ msgid "Alt + Shift + Enter" msgstr "" msgid "Toggle Wireframe" -msgstr "Basculer la structure" +msgstr "Activer Filaire" msgid "Shortcut Key " -msgstr "Raccourci " +msgstr "Touche de raccourci " msgid "Triangle" msgstr "Triangle" @@ -173,17 +173,17 @@ msgid "Height Range" msgstr "Plage de hauteur" msgid "Vertical" -msgstr "" +msgstr "Vertical" msgid "Horizontal" -msgstr "" +msgstr "Horizontal" msgid "Remove painted color" msgstr "Supprimer la couleur peinte" #, boost-format msgid "Painted using: Filament %1%" -msgstr "Peint avec : Filament %1%" +msgstr "Peint avec : filament %1%" msgid "Move" msgstr "Déplacer" @@ -192,7 +192,7 @@ msgid "Gizmo-Move" msgstr "" msgid "Rotate" -msgstr "Rotation" +msgstr "Pivoter" msgid "Gizmo-Rotate" msgstr "" @@ -204,7 +204,7 @@ msgid "Apply" msgstr "Appliquer" msgid "Scale" -msgstr "Échelle" +msgstr "Redimensionner" msgid "Gizmo-Scale" msgstr "" @@ -219,7 +219,7 @@ msgid "mm" msgstr "mm" msgid "Position" -msgstr "Position" +msgstr "Emplacement" msgid "Rotation" msgstr "Rotation" @@ -240,22 +240,22 @@ msgid "Group Operations" msgstr "Opérations de groupe" msgid "Set Position" -msgstr "Définir la position" +msgstr "Définir la Position" msgid "Set Orientation" -msgstr "Définir l'orientation" +msgstr "Définir l'Orientation" msgid "Set Scale" -msgstr "Définir l'échelle" +msgstr "Définir l'Échelle" msgid "Reset Position" -msgstr "Réinitialiser la position" +msgstr "Position de réinitialisation" msgid "Reset Rotation" -msgstr "Réinitialiser la rotation" +msgstr "Réinitialiser la Rotation" msgid "World coordinates" -msgstr "Coordonnées" +msgstr "Les coordonnées mondiales" msgid "°" msgstr "°" @@ -267,7 +267,7 @@ msgid "%" msgstr "%" msgid "uniform scale" -msgstr "Échelle uniforme" +msgstr "échelle uniforme" msgid "Left click" msgstr "Clic gauche" @@ -279,7 +279,7 @@ msgid "Right click" msgstr "Clic droit" msgid "Remove connector" -msgstr "Supprimer le connecteur" +msgstr "Retirer le connecteur" msgid "Drag" msgstr "Glisser" @@ -291,7 +291,7 @@ msgid "Add connector to selection" msgstr "Ajouter un connecteur à la sélection" msgid "Remove connector from selection" -msgstr "Supprimer le connecteur de la sélection" +msgstr "Retirer le connecteur de la sélection" msgid "Select all connectors" msgstr "Sélectionner tous les connecteurs" @@ -299,6 +299,12 @@ msgstr "Sélectionner tous les connecteurs" msgid "Cut" msgstr "Couper" +msgid "non-mainifold edges be caused by cut tool, do you want to fix it now?" +msgstr "" + +msgid "Repairing model object" +msgstr "Réparer l'objet modèle" + msgid "Connector" msgstr "Connecteur" @@ -312,7 +318,7 @@ msgid "Height" msgstr "Hauteur" msgid "Edit connectors" -msgstr "Éditer les connecteurs" +msgstr "Modifier les connecteurs" msgid "Add connectors" msgstr "Ajouter des connecteurs" @@ -324,7 +330,7 @@ msgid "Lower part" msgstr "Partie inférieure" msgid "Keep" -msgstr "Conserver" +msgstr "Garder" msgid "Place on cut" msgstr "Placer sur la coupe" @@ -336,13 +342,13 @@ msgid "After cut" msgstr "Après la coupe" msgid "Cut to parts" -msgstr "Couper en pièces" +msgstr "Couper la sélection dans le presse-papiers" msgid "Auto Segment" msgstr "Segmentation automatique" msgid "Perform cut" -msgstr "Couper" +msgstr "Effectuer la coupe" msgid "Reset" msgstr "Réinitialiser" @@ -354,16 +360,16 @@ msgid "Type" msgstr "Type" msgid "Style" -msgstr "Style & Forme" +msgstr "Style" msgid "Shape" msgstr "Forme" msgid "Depth ratio" -msgstr "Profondeur" +msgstr "Rapport de profondeur" msgid "Remove connectors" -msgstr "Supprimer les connecteurs" +msgstr "Retirer les connecteurs" msgid "Prizm" msgstr "Prisme" @@ -384,22 +390,22 @@ msgid "Cancel" msgstr "Annuler" msgid "Warning" -msgstr "Avertissement" +msgstr "Alerte" msgid "Invalid connectors detected" -msgstr "Connecteurs non valides détectés" +msgstr "Connecteurs invalides détectés" msgid "connector is out of cut contour" -msgstr " connecteur est hors contour de coupe" +msgstr "le connecteur est hors du contour de la coupe" msgid "connectors are out of cut contour" -msgstr " connecteurs sont hors contour de coupe" +msgstr "les connecteurs sont hors du contour de la coupe" msgid "connector is out of object" -msgstr " connecteur est hors de l’objet" +msgstr "le connecteur est hors de l'objet" msgid "connectors is out of object" -msgstr " connecteurs sont hors de l’objet" +msgstr "les connecteurs sont hors de l'objet" msgid "Some connectors are overlapped" msgstr "Certains connecteurs se chevauchent" @@ -408,14 +414,14 @@ msgid "" "Invalid state. \n" "No one part is selected for keep after cut" msgstr "" -"Etat non valide.\n" -"Aucune pièce n’est sélectionnée pour être conservée après la coupe" +"État non valide. \n" +"Aucune pièce n'est sélectionnée pour être conservée après la découpe" msgid "Plug" -msgstr "Plug" +msgstr "Connecteur" msgid "Dowel" -msgstr "Goujon" +msgstr "Tourillon" msgid "Tolerance" msgstr "Tolérance" @@ -427,7 +433,7 @@ msgid "Detail level" msgstr "Niveau de détail" msgid "Decimate ratio" -msgstr "Ratio de décimation" +msgstr "Rapport de décimation" #, boost-format msgid "" @@ -455,13 +461,13 @@ msgid "Extra high" msgstr "Très haut" msgid "High" -msgstr "Haut" +msgstr "Élevé" msgid "Medium" msgstr "Moyen" msgid "Low" -msgstr "Bas" +msgstr "Faible" msgid "Extra low" msgstr "Très bas" @@ -471,14 +477,14 @@ msgid "%d triangles" msgstr "%d triangles" msgid "Show wireframe" -msgstr "Afficher la structure" +msgstr "Afficher la vue filaire" #, boost-format msgid "%1%" msgstr "%1%" msgid "Can't apply when proccess preview." -msgstr "Ne peut pas s'appliquer lors de l'aperçu du processus." +msgstr "Ne peut pas s'appliquer lors du processus de prévisualisation." msgid "Operation already cancelling. Please wait few seconds." msgstr "Opération déjà annulée. Veuillez patienter quelques secondes." @@ -490,10 +496,10 @@ msgid "Perform Recognition" msgstr "Effectuer la reconnaissance" msgid "Brush size" -msgstr "Taille de la brosse" +msgstr "Taille du pinceau" msgid "Brush shape" -msgstr "Forme de la brosse" +msgstr "Forme du pinceau" msgid "Enforce seam" msgstr "Forcer la couture" @@ -502,19 +508,19 @@ msgid "Block seam" msgstr "Bloquer la couture" msgid "Seam painting" -msgstr "Peindre la couture" +msgstr "Peinture des coutures" msgid "Remove selection" msgstr "Supprimer la sélection" msgid "Entering Seam painting" -msgstr "" +msgstr "Entrée dans Peinture de Couture" msgid "Leaving Seam painting" -msgstr "" +msgstr "Quitter Peinture de Couture" msgid "Paint-on seam editing" -msgstr "" +msgstr "Modification des coutures peintes" msgid "Font" msgstr "Police" @@ -531,12 +537,10 @@ msgstr "Angle" msgid "" "Embeded\n" "depth" -msgstr "" -"Profondeur\n" -"intégrée" +msgstr "Profondeur intégrée" msgid "Input text" -msgstr "Texte" +msgstr "Texte entré" msgid "Surface" msgstr "Surface" @@ -545,10 +549,10 @@ msgid "Horizontal text" msgstr "Texte horizontal" msgid "Shift + Mouse move up or dowm" -msgstr "Shift + Déplacement de la souris vers le haut ou le bas" +msgstr "Maj + souris vers le haut ou vers le bas" msgid "Rotate text" -msgstr "Rotation du texte" +msgstr "Faire pivoter le texte" msgid "Text shape" msgstr "Forme du texte" @@ -575,13 +579,13 @@ msgid "Some values have been replaced. Please check them:" msgstr "Certaines valeurs ont été remplacées. Veuillez les vérifier :" msgid "Process" -msgstr "Processus" +msgstr "Traiter" msgid "Filament" msgstr "Filament" msgid "Machine" -msgstr "Imprimante" +msgstr "Machine" msgid "Configuration package was loaded, but some values were not recognized." msgstr "" @@ -624,7 +628,7 @@ msgid "OrcaSlicer got an unhandled exception: %1%" msgstr "Orca Slicer a reçu une exception non gérée : %1%" msgid "Downloading Bambu Network Plug-in" -msgstr "Téléchargement du plug-in réseau Bambu" +msgstr "Téléchargement du plug-in Bambu Network" msgid "Login information expired. Please login again." msgstr "Les informations de connexion ont expiré. Veuillez vous reconnecter." @@ -634,19 +638,19 @@ msgstr "Mot de passe incorrect" #, c-format, boost-format msgid "Connect %s failed! [SN:%s, code=%s]" -msgstr "Connexion %s échouée ! [SN:%s, code=%s]" +msgstr "La connexion à %s a échoué ! [SN : %s, code = %s]" msgid "" "Orca Slicer requires the Microsoft WebView2 Runtime to operate certain " "features.\n" "Click Yes to install it now." msgstr "" -"Orca Slicer nécessite le Microsoft WebView2 Runtime pour faire " -"fonctionnercertaines fonctionnalités.\n" +"Orca Slicer nécessite Microsoft WebView2 Runtime pour utiliser certaines " +"fonctions.\n" "Cliquez sur Oui pour l'installer maintenant." msgid "WebView2 Runtime" -msgstr "" +msgstr "WebView2 Runtime" #, c-format, boost-format msgid "" @@ -664,7 +668,9 @@ msgstr "Chargement de la configuration" #, c-format, boost-format msgid "Click to download new version in default browser: %s" -msgstr "Cliquez pour télécharger la nouvelle version : %s" +msgstr "" +"Cliquez pour télécharger la nouvelle version dans le navigateur par défaut : " +"%s" msgid "The Orca Slicer needs an upgrade" msgstr "Orca Slicer a besoin d’être mis à jour" @@ -681,6 +687,11 @@ msgid "" "Please note, application settings will be lost, but printer profiles will " "not be affected." msgstr "" +"Le fichier de configuration d'OrcaSlicer peut être corrompu et ne peut pas " +"être analysé.\n" +"OrcaSlicer a tenté de recréer le fichier de configuration.\n" +"Veuillez noter que les paramètres de l'application seront perdus, mais que " +"les profils d'imprimante ne seront pas affectés." msgid "Rebuild" msgstr "Reconstruire" @@ -689,7 +700,7 @@ msgid "Loading current presets" msgstr "Chargement des préréglages actuels" msgid "Loading a mode view" -msgstr "Chargement d'un mode de vue" +msgstr "Chargement d'une vue de mode" msgid "Choose one file (3mf):" msgstr "Choisissez un fichier (3mf):" @@ -719,29 +730,32 @@ msgstr "Utilisateur déconnecté" msgid "new or open project file is not allowed during the slicing process!" msgstr "" -"un nouveau projet ou l’ouverture d’un projet existant n'est pas autorisé " -"pendant le processus de découpage !" +"l’ouverture ou la création d'un fichier de projet n'est pas autorisée " +"pendant le processus de tranchage !" msgid "Open Project" -msgstr "Ouvrir un projet" +msgstr "Ouvrir Projet" msgid "" "The version of Orca Slicer is too low and needs to be updated to the latest " "version before it can be used normally" msgstr "" -"La version de Orca Slicer est trop ancienne et doit être mise à jour vers la " +"La version de OrcaSlicer est trop ancienne et doit être mise à jour vers la " "dernière version afin qu’il puisse être utilisé normalement" msgid "Privacy Policy Update" -msgstr "Mise à jour de la politique de confidentialité" +msgstr "Mise à jour de politique de confidentialité" msgid "" "The number of user presets cached in the cloud has exceeded the upper limit, " "newly created user presets can only be used locally." msgstr "" +"Le nombre de préréglages utilisateur mis en cache dans le nuage a dépassé la " +"limite supérieure. Les préréglages utilisateur \n" +"nouvellement créés ne peuvent être utilisés que localement." msgid "Sync user presets" -msgstr "" +msgstr "Synchronisation des préréglages de l'utilisateur" msgid "Loading" msgstr "Chargement" @@ -753,7 +767,7 @@ msgid "Switching application language" msgstr "Changer la langue de l'application" msgid "Select the language" -msgstr "Sélectionnez la langue" +msgstr "Sélectionner la langue" msgid "Language" msgstr "Langue" @@ -762,28 +776,28 @@ msgid "*" msgstr "*" msgid "The uploads are still ongoing" -msgstr "Les téléchargements sont toujours en cours" +msgstr "Les téléversements sont toujours en cours" msgid "Stop them and continue anyway?" -msgstr "Désirez-vous les arrêter et continuer ?" +msgstr "Les arrêter et continuer quand même ?" msgid "Ongoing uploads" -msgstr "Téléchargements en cours" +msgstr "Téléversements en cours" msgid "Select a G-code file:" msgstr "Sélectionnez un fichier G-code :" msgid "Import File" -msgstr "Importer un fichier" +msgstr "Importer un Fichier" msgid "Delete" -msgstr "Effacer" +msgstr "Supprimer" msgid "Choose files" msgstr "Choisir des fichiers" msgid "New Folder" -msgstr "Nouveau dossier" +msgstr "Nouveau Dossier" msgid "Open" msgstr "Ouvrir" @@ -802,7 +816,7 @@ msgid "Quality" msgstr "Qualité" msgid "Shell" -msgstr "Coque" +msgstr "Coquille" msgid "Infill" msgstr "Remplissage" @@ -817,13 +831,13 @@ msgid "Speed" msgstr "Vitesse" msgid "Strength" -msgstr "Solidité" +msgstr "Résistance" msgid "Top Solid Layers" -msgstr "Couches solides supérieures" +msgstr "Couches supérieures solides" msgid "Top Minimum Shell Thickness" -msgstr "Épaisseur minimale de la coque supérieure" +msgstr "Épaisseur minimale de la coque" msgid "Bottom Solid Layers" msgstr "Couches solides inférieures" @@ -835,28 +849,28 @@ msgid "Ironing" msgstr "Lissage" msgid "Fuzzy Skin" -msgstr "Surface floue" +msgstr "Surface Irrégulière" msgid "Extruders" msgstr "Extrudeurs" msgid "Extrusion Width" -msgstr "Largeur d'extrusion" +msgstr "Largeur d'Extrusion" msgid "Wipe options" -msgstr "Options d'essuyage" +msgstr "Options de nettoyage" msgid "Bed adhension" -msgstr "Adhérence au plateau" +msgstr "Adhérence au lit" msgid "Advanced" -msgstr "Avancés" +msgstr "Avancé" msgid "Add part" msgstr "Ajouter une pièce" msgid "Add negative part" -msgstr "Ajouter une pièce négative" +msgstr "Ajouter une partie négative" msgid "Add modifier" msgstr "Ajouter un modificateur" @@ -865,7 +879,25 @@ msgid "Add support blocker" msgstr "Ajouter un bloqueur de support" msgid "Add support enforcer" -msgstr "Ajouter un support forcé" +msgstr "Ajouter un générateur de supports" + +msgid "Add text" +msgstr "Ajouter un texte" + +msgid "Add negative text" +msgstr "Ajouter un texte négatif" + +msgid "Add text modifier" +msgstr "Ajouter un modificateur de texte" + +msgid "Add SVG part" +msgstr "Ajouter une partie SVG" + +msgid "Add negative SVG" +msgstr "Ajouter un SVG négatif" + +msgid "Add SVG modifier" +msgstr "Ajouter un modificateur SVG" msgid "Select settings" msgstr "Sélectionnez les paramètres" @@ -877,14 +909,11 @@ msgid "Show" msgstr "Afficher" msgid "Del" -msgstr "Suppr" +msgstr "Eff" msgid "Delete the selected object" msgstr "Supprimer l'objet sélectionné" -msgid "Edit Text" -msgstr "Editer le texte" - msgid "Load..." msgstr "Charger..." @@ -909,17 +938,23 @@ msgstr "Cylindre" msgid "Cone" msgstr "Cône" +msgid "Text" +msgstr "Texte" + +msgid "SVG" +msgstr "" + msgid "Height range Modifier" msgstr "Modificateur de plage de hauteur" msgid "Add settings" -msgstr "Ajouter des paramètres" +msgstr "Ajouter des réglages" msgid "Change type" msgstr "Changer le type" msgid "Set as an individual object" -msgstr "Définir en tant qu’objet individuel" +msgstr "Définir comme un objet individuel" msgid "Set as individual objects" msgstr "Définir en tant qu'objets individuels" @@ -938,31 +973,31 @@ msgid "Fix model" msgstr "Réparer le modèle" msgid "Export as one STL" -msgstr "" +msgstr "Exporter en un seul STL" msgid "Export as STLs" -msgstr "" +msgstr "Exporter en plusieurs STL" msgid "Reload from disk" msgstr "Recharger à partir du disque" msgid "Reload the selected parts from disk" -msgstr "Recharger les modèles sélectionnés à partir du disque" +msgstr "Recharger les pièces sélectionnées à partir du disque" msgid "Replace with STL" -msgstr "Remplacer par un STL" +msgstr "Remplacer par le STL" msgid "Replace the selected part with new STL" -msgstr "Remplacer le modèle sélectionné par un nouveau STL" +msgstr "Remplacer la pièce sélectionnée par un nouveau STL" msgid "Change filament" -msgstr "Changer le filament" +msgstr "Changer de filament" msgid "Set filament for selected items" msgstr "Définir le filament pour les éléments sélectionnés" msgid "Default" -msgstr "Par défaut" +msgstr "Défaut" #, c-format, boost-format msgid "Filament %d" @@ -972,37 +1007,37 @@ msgid "active" msgstr "actif" msgid "Scale to build volume" -msgstr "Mettre à l’échelle par rapport au volume" +msgstr "Échelle pour créer du volume" msgid "Scale an object to fit the build volume" -msgstr "Mettre à l'échelle un objet pour l'adapter au volume d’impression" +msgstr "Mettre à l'échelle un objet pour l'adapter au volume de construction" msgid "Flush Options" -msgstr "Paramètres de purge" +msgstr "Options de Rinçage" msgid "Flush into objects' infill" -msgstr "Purger dans le remplissage" +msgstr "Purger dans le remplissage d'objet" msgid "Flush into this object" msgstr "Purger dans cet objet" msgid "Flush into objects' support" -msgstr "Purger dans les supports" +msgstr "Purger dans les supports de l'objet" msgid "Edit in Parameter Table" -msgstr "Modifier dans le tableau des paramètres" +msgstr "Modifier dans la Table des Paramètres" msgid "Convert from inch" msgstr "Convertir en pouce" msgid "Restore to inch" -msgstr "Restaurer en pouce" +msgstr "Restaurer en pouces" msgid "Convert from meter" msgstr "Convertir en mètre" msgid "Restore to meter" -msgstr "Restaurer en mètre" +msgstr "Restaurer au compteur" msgid "Assemble" msgstr "Assembler" @@ -1011,14 +1046,14 @@ msgid "Assemble the selected objects to an object with multiple parts" msgstr "Assembler les objets sélectionnés à un objet en plusieurs parties" msgid "Assemble the selected objects to an object with single part" -msgstr "Assembler les objets sélectionnés à un objet en une seule partie" +msgstr "Assembler les objets sélectionnés à un objet en une seule pièce" msgid "Mesh boolean" -msgstr "Maillage booléen" +msgstr "Opérations booléennes" msgid "Mesh boolean operations including union and subtraction" msgstr "" -"Opérations booléennes sur les mailles, y compris l'union et la soustraction" +"Opérations booléennes de maillage, incluant la fusion et la soustraction" msgid "Along X axis" msgstr "Le long de l'axe X" @@ -1039,13 +1074,25 @@ msgid "Mirror along the Z axis" msgstr "Miroir le long de l'axe Z" msgid "Mirror" -msgstr "Miroir" +msgstr "Symétrie" msgid "Mirror object" -msgstr "Objet miroir" +msgstr "Symétriser l'Objet" + +msgid "Edit text" +msgstr "Modifier le texte" + +msgid "Ability to change text, font, size, ..." +msgstr "Possibilité de modifier le texte, la police, la taille, ..." + +msgid "Edit SVG" +msgstr "Modifier SVG" + +msgid "Change SVG source file, projection, size, ..." +msgstr "Modifier le fichier source SVG, la projection, la taille, ..." msgid "Invalidate cut info" -msgstr "Invalider les informations de coupe" +msgstr "Invalider les informations de découpe" msgid "Add Primitive" msgstr "Ajouter une primitive" @@ -1054,29 +1101,29 @@ msgid "Show Labels" msgstr "Afficher les étiquettes" msgid "To objects" -msgstr "En objets" +msgstr "Vers les objets" msgid "Split the selected object into multiple objects" msgstr "Diviser l'objet sélectionné en plusieurs objets" msgid "To parts" -msgstr "En parties" +msgstr "Vers les parties" msgid "Split the selected object into multiple parts" msgstr "Diviser l'objet sélectionné en plusieurs parties" msgid "Split" -msgstr "Diviser" +msgstr "Scinder" msgid "Split the selected object" -msgstr "Diviser l'objet sélectionné" +msgstr "Scinder l'objet sélectionné" msgid "Auto orientation" msgstr "Orientation automatique" msgid "Auto orient the object to improve print quality." msgstr "" -"Orienter automatiquement l'objet pour améliorer la qualité d'impression." +"Orientez automatiquement l'objet pour améliorer la qualité d'impression." msgid "Split the selected object into mutiple objects" msgstr "Diviser l'objet sélectionné en plusieurs objets" @@ -1088,43 +1135,43 @@ msgid "Select All" msgstr "Tout sélectionner" msgid "select all objects on current plate" -msgstr "sélectionner tous les objets sur le plateau actuel" +msgstr "sélectionner tous les objets sur la plaque actuelle" msgid "Delete All" msgstr "Tout Supprimer" msgid "delete all objects on current plate" -msgstr "supprimer tous les objets sur le plateau actuel" +msgstr "supprimer tous les objets sur la plaque actuelle" msgid "Arrange" -msgstr "Organiser" +msgstr "Agencer" msgid "arrange current plate" -msgstr "organiser le plateau actuel" +msgstr "organiser la plaque actuelle" msgid "Auto Rotate" msgstr "Rotation automatique" msgid "auto rotate current plate" -msgstr "rotation automatique du plateau actuel" +msgstr "rotation automatique de la plaque actuelle" msgid "Delete Plate" msgstr "Supprimer le plateau" msgid "Remove the selected plate" -msgstr "Supprimer le plateau sélectionné" +msgstr "Supprimer la plaque sélectionnée" msgid "Clone" msgstr "Cloner" msgid "Simplify Model" -msgstr "Simplifier le modèle" +msgstr "Simplifier le Modèle" msgid "Center" -msgstr "Centrer" +msgstr "Centre" msgid "Edit Process Settings" -msgstr "Modifier les paramètres de processus" +msgstr "Modifier les paramètres du processus" msgid "Edit print parameters for a single object" msgstr "Modifier les paramètres d'impression d'un seul objet" @@ -1145,7 +1192,7 @@ msgid "Lock" msgstr "Bloquer" msgid "Edit Plate Name" -msgstr "Modifier le nom de la plaque" +msgstr "Modifier le nom du plateau" msgid "Name" msgstr "Nom" @@ -1157,13 +1204,13 @@ msgstr "Fila." msgid "%1$d error repaired" msgid_plural "%1$d errors repaired" msgstr[0] "%1$d erreur réparée" -msgstr[1] "%1$d erreurs réparées" +msgstr[1] "%1$d erreur réparée" #, c-format, boost-format msgid "Error: %1$d non-manifold edge." msgid_plural "Error: %1$d non-manifold edges." msgstr[0] "Erreur : %1$d arête non multiple." -msgstr[1] "Erreur : %1$d arêtes non multiple." +msgstr[1] "Erreur : %1$d arête non multiple." msgid "Remaining errors" msgstr "Erreurs restantes" @@ -1172,39 +1219,35 @@ msgstr "Erreurs restantes" msgid "%1$d non-manifold edge" msgid_plural "%1$d non-manifold edges" msgstr[0] "%1$d arête non multiple" -msgstr[1] "%1$d arêtes non multiple" +msgstr[1] "%1$d arête non multiple" msgid "Right click the icon to fix model object" -msgstr "" -"Cliquez sur l’icône avec le bouton droit de la souris pour corriger le modèle" +msgstr "Cliquez avec le bouton droit sur l'icône pour fixer l'objet modèle" msgid "Right button click the icon to drop the object settings" msgstr "" -"Cliquez sur l’icône avec le bouton droit de la souris pour supprimer les " -"paramètres de l'objet" +"Cliquez avec le bouton droit sur l'icône pour supprimer les paramètres de " +"l'objet" msgid "Click the icon to reset all settings of the object" msgstr "Cliquez sur l'icône pour réinitialiser tous les paramètres de l'objet" msgid "Right button click the icon to drop the object printable property" msgstr "" -"Cliquez sur l’icône avec le bouton droit de la souris pour déposer la " -"propriété imprimable de l'objet" +"Cliquez avec le bouton droit sur l'icône pour déposer la propriété " +"imprimable de l'objet" msgid "Click the icon to toggle printable property of the object" msgstr "Cliquez sur l'icône pour basculer la propriété imprimable de l'objet" msgid "Click the icon to edit support painting of the object" -msgstr "Cliquez sur l'icône pour modifier la peinture des supports de l'objet" +msgstr "Cliquez sur l'icône pour modifier la peinture de support de l'objet" msgid "Click the icon to edit color painting of the object" msgstr "Cliquez sur l'icône pour modifier la couleur de peinture de l'objet" msgid "Click the icon to shift this object to the bed" -msgstr "Cliquez sur l’icône pour déplacer cet objet vers le plateau" - -msgid " search results" -msgstr "" +msgstr "Cliquez sur l'icône pour déplacer cet objet vers le plateau" msgid "Loading file" msgstr "Chargement du fichier" @@ -1213,7 +1256,7 @@ msgid "Error!" msgstr "Erreur!" msgid "Failed to get the model data in the current file." -msgstr "Échec de l'obtention des données du modèle dans le fichier actuel." +msgstr "Impossible d’obtenir les données du modèle dans le fichier actuel." msgid "Generic" msgstr "Générique" @@ -1223,24 +1266,24 @@ msgstr "Ajouter un modificateur" msgid "Switch to per-object setting mode to edit modifier settings." msgstr "" -"Basculer en mode de réglage par objet pour modifier les paramètres du " +"Basculez vers le mode de réglage par objet pour modifier les paramètres du " "modificateur." msgid "" "Switch to per-object setting mode to edit process settings of selected " "objects." msgstr "" -"Basculer en mode de réglage par objet pour modifier les paramètres de " +"Passez en mode de réglage \"par objet\" pour modifier les paramètres de " "processus des objets sélectionnés." msgid "Delete connector from object which is a part of cut" -msgstr "Supprimer le connecteur de l’objet qui fait partie de la coupe" +msgstr "Supprimer le connecteur de l'objet qui fait partie de la découpe" msgid "Delete solid part from object which is a part of cut" -msgstr "Supprimer la partie solide de l’objet qui fait partie de la coupe" +msgstr "Supprimer la partie solide de l'objet qui est une partie découpée" msgid "Delete negative volume from object which is a part of cut" -msgstr "Supprimer le volume négatif de l’objet qui fait partie de la coupe" +msgstr "Supprimer le volume négatif de l'objet qui fait partie de la découpe" msgid "" "To save cut correspondence you can delete all connectors from all related " @@ -1257,10 +1300,10 @@ msgid "" "cut infornation first." msgstr "" "Cette action rompra une correspondance coupée.\n" -"Après cela, la cohérence du modèle ne peut plus être garantie.\n" +"Après cela, la cohérence du modèle ne peut être garantie.\n" "\n" "Pour manipuler des pièces solides ou des volumes négatifs, vous devez " -"d’abord invalider les informations de coupe." +"d'abord invalider les informations de coupe." msgid "Delete all connectors" msgstr "Supprimer tous les connecteurs" @@ -1276,40 +1319,40 @@ msgid "Assembly" msgstr "Assemblé" msgid "Cut Connectors information" -msgstr "Informations sur les connecteurs coupés" +msgstr "Informations sur les connecteurs de coupe" msgid "Object manipulation" -msgstr "Manipulation d’objets" +msgstr "Manipulation d'objets" msgid "Group manipulation" msgstr "Manipulation de groupe" msgid "Object Settings to modify" -msgstr "Paramètres de l’objet à modifier" +msgstr "Paramètres de l'objet à modifier" msgid "Part Settings to modify" msgstr "Paramètres de la pièce à modifier" msgid "Layer range Settings to modify" -msgstr "Paramètres de la plage de couche à modifier" +msgstr "Paramètres de plage de couches à modifier" msgid "Part manipulation" msgstr "Manipulation de pièces" msgid "Instance manipulation" -msgstr "Manipulation d’instances" +msgstr "Manipulation d'instances" msgid "Height ranges" msgstr "Plages de hauteur" msgid "Settings for height range" -msgstr "Paramètres de la plage de hauteur" +msgstr "Réglages de la plage de hauteur" msgid "Object" msgstr "Objet" msgid "Part" -msgstr "Hotend" +msgstr "Pièce" msgid "Layer" msgstr "Couche" @@ -1341,35 +1384,32 @@ msgid "Modifier" msgstr "Modificateur" msgid "Support Blocker" -msgstr "Bloqueur de support" +msgstr "Bloqueur de Support" msgid "Support Enforcer" -msgstr "Support forcé" +msgstr "Générateur de Support" msgid "Type:" -msgstr "Type:" +msgstr "Type :" msgid "Choose part type" msgstr "Choisissez le type de pièce" msgid "Enter new name" -msgstr "Entrez le nouveau nom" +msgstr "Entrer de nouveaux noms" msgid "Renaming" -msgstr "Renommer" - -msgid "Repairing model object" -msgstr "Réparer le modèle" +msgstr "Renommage" msgid "Following model object has been repaired" msgid_plural "Following model objects have been repaired" -msgstr[0] "Le modèle suivant a été réparé" -msgstr[1] "Les modèles suivants ont été réparés" +msgstr[0] "L'objet modèle suivant a été réparé" +msgstr[1] "L'objet modèle suivant a été réparé" msgid "Failed to repair folowing model object" msgid_plural "Failed to repair folowing model objects" -msgstr[0] "Échec de la réparation du modèle suivant" -msgstr[1] "Échec de la réparation des modèles suivants" +msgstr[0] "Échec de la réparation de l'objet modèle suivant" +msgstr[1] "Échec de la réparation des objets de modèle suivants" msgid "Repairing was canceled" msgstr "La réparation a été annulée" @@ -1401,7 +1441,7 @@ msgid "multiple cells copy is not supported" msgstr "la copie de plusieurs cellules n'est pas prise en charge" msgid "Outside" -msgstr "En dehors" +msgstr "Hors plaque" msgid " " msgstr " " @@ -1416,13 +1456,13 @@ msgid "Infill density(%)" msgstr "Densité de remplissage(%)" msgid "Auto Brim" -msgstr "Bordure automatique" +msgstr "Bord automatique" msgid "Auto" -msgstr "Automatique" +msgstr "Auto" msgid "Mouse ear" -msgstr "Oreille de souris" +msgstr "Sur les angles uniquement" msgid "Outer brim only" msgstr "Bordure extérieure uniquement" @@ -1434,19 +1474,19 @@ msgid "Outer and inner brim" msgstr "Bordure extérieure et intérieure" msgid "No-brim" -msgstr "Aucune" +msgstr "Sans bord" msgid "Outer wall speed" -msgstr "Vitesse de la paroi extérieure" +msgstr "Vitesse du mur extérieur" msgid "Plate" -msgstr "Plateau" +msgstr "Plaque" msgid "Brim" msgstr "Bordure" msgid "Object/Part Setting" -msgstr "Réglages Objets" +msgstr "Réglage objet/pièce" msgid "Reset parameter" msgstr "Paramètre de réinitialisation" @@ -1455,7 +1495,7 @@ msgid "Multicolor Print" msgstr "Impression multicolore" msgid "Line Type" -msgstr "Type de lignes" +msgstr "Type de ligne" msgid "More" msgstr "Plus" @@ -1467,7 +1507,7 @@ msgid "Open next tip." msgstr "Ouvrir le conseil suivant." msgid "Open Documentation in web browser." -msgstr "Ouvrir la documentation dans le navigateur Web." +msgstr "Ouvrir la documentation dans un navigateur Web." msgid "Color" msgstr "Couleur" @@ -1476,16 +1516,16 @@ msgid "Pause" msgstr "Pause" msgid "Template" -msgstr "" +msgstr "Modèle" msgid "Custom" -msgstr "Personnalisée" +msgstr "Personnalisé" msgid "Pause:" msgstr "Pause:" msgid "Custom Template:" -msgstr "Modèle personnalisé:" +msgstr "Modèle personnalisé :" msgid "Custom G-code:" msgstr "G-code personnalisé:" @@ -1494,8 +1534,7 @@ msgid "Custom G-code" msgstr "G-code personnalisé" msgid "Enter Custom G-code used on current layer:" -msgstr "" -"Saisissez les commandes personnalisées à utiliser sur la couche actuelle :" +msgstr "Entrez le G-code personnalisé a utiliser sur la couche actuelle :" msgid "OK" msgstr "OK" @@ -1507,31 +1546,31 @@ msgid "Jump to layer" msgstr "Aller à la couche" msgid "Please enter the layer number" -msgstr "Veuillez entrer le numéro de couche" +msgstr "Veuillez entrer le numéro de la couche" msgid "Add Pause" -msgstr "Ajouter une pause" +msgstr "Ajouter une Pause" msgid "Insert a pause command at the beginning of this layer." -msgstr "Insérer une commande de pause au début de cette couche." +msgstr "Insérez une commande de pause au début de cette couche." msgid "Add Custom G-code" -msgstr "Ajouter une commande personnalisée" - -msgid "Insert custom G-code at the beginning of this layer." -msgstr "Insérer des commandes personnalisées au début de cette couche." - -msgid "Add Custom Template" msgstr "Ajouter un G-code personnalisé" +msgid "Insert custom G-code at the beginning of this layer." +msgstr "Insérez un G-code personnalisé au début de cette couche." + +msgid "Add Custom Template" +msgstr "Ajouter un Modèle Personnalisé" + msgid "Insert template custom G-code at the beginning of this layer." -msgstr "Insérer un G-code personnalisé au début de cette couche." +msgstr "Insérer un modèle de G-code personnalisé au début de cette couche." msgid "Filament " msgstr "Filament " msgid "Change filament at the beginning of this layer." -msgstr "Changer de filament au début de cette couche." +msgstr "Changez le filament au début de cette couche." msgid "Delete Pause" msgstr "Supprimer la pause" @@ -1549,7 +1588,7 @@ msgid "Delete Filament Change" msgstr "Supprimer le changement de filament" msgid "No printer" -msgstr "Aucun appareil" +msgstr "Pas d'imprimante" msgid "..." msgstr "…" @@ -1570,7 +1609,7 @@ msgid "Please click on the hyperlink above to view the cloud service status" msgstr "Cliquez sur l'hyperlien ci-dessus pour voir l'état du service cloud" msgid "Failed to connect to the printer" -msgstr "Échec de la connexion" +msgstr "Échec de la connexion à l'imprimante" msgid "Connection to printer failed" msgstr "La connexion à l'imprimante a échoué" @@ -1594,7 +1633,7 @@ msgid "AMS" msgstr "AMS" msgid "Auto Refill" -msgstr "Recharge automatique" +msgstr "Recharge Automatique" msgid "AMS not connected" msgstr "AMS non connecté" @@ -1603,10 +1642,10 @@ msgid "Load Filament" msgstr "Charger" msgid "Unload Filament" -msgstr "Décharger" +msgstr "Déchargement" msgid "Ext Spool" -msgstr "Bobine externe" +msgstr "Bobine Ext" msgid "Tips" msgstr "Astuces" @@ -1618,7 +1657,7 @@ msgid "Retry" msgstr "Réessayer" msgid "Calibrating AMS..." -msgstr "Calibration de l'AMS..." +msgstr "Étalonnage de l'AMS..." msgid "A problem occured during calibration. Click to view the solution." msgstr "" @@ -1626,37 +1665,37 @@ msgstr "" "solution." msgid "Calibrate again" -msgstr "Calibrer à nouveau" +msgstr "Etalonner de nouveau" msgid "Cancel calibration" msgstr "Annuler la calibration" msgid "Idling..." -msgstr "Marche au ralenti..." +msgstr "Mise en veille…" msgid "Heat the nozzle" -msgstr "Chauffe de la buse" +msgstr "Chauffer la buse" msgid "Cut filament" -msgstr "Coupe du filament" +msgstr "Filament coupé" msgid "Pull back current filament" -msgstr "Retrait du filament actuel" +msgstr "Retirer le filament actuel" msgid "Push new filament into extruder" -msgstr "Insertion du nouveau filament dans l'extrudeur" +msgstr "Poussez le nouveau filament dans l'extrudeur" msgid "Purge old filament" -msgstr "Purge de l’ancien filament" +msgstr "Purger l'ancien filament" msgid "Feed Filament" -msgstr "Alimenter le filament" +msgstr "Chargement du filament" msgid "Confirm extruded" -msgstr "Confirmer l'extrusion" +msgstr "Confirmation de l'extrusion" msgid "Check filament location" -msgstr "Vérifier l'emplacement du filament" +msgstr "Vérification de la position du filament" msgid "Grab new filament" msgstr "Saisir un nouveau filament" @@ -1665,8 +1704,8 @@ msgid "" "Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically " "load or unload filiament." msgstr "" -"Choisissez un emplacement de l’AMS puis appuyez sur le bouton \"Charger\" ou " -"\"Décharger\" pour charger ou décharger automatiquement le filament." +"Choisissez un emplacement AMS puis appuyez sur le bouton correspondant pour " +"Charger ou Décharger le filament." msgid "Edit" msgstr "Éditer" @@ -1675,8 +1714,8 @@ msgid "" "All the selected objects are on the locked plate,\n" "We can not do auto-arrange on these objects." msgstr "" -"Tous les objets sélectionnés sont sur un plateau verrouillé,\n" -"La disposition automatique sur ces objets n'est pas possible." +"Tous les objets sélectionnés sont sur la plaque verrouillée,\n" +"nous ne pouvons pas faire d'auto-arrangement sur ces objets" msgid "No arrangable objects are selected." msgstr "Aucun objet réorganisable n'est sélectionné." @@ -1685,32 +1724,32 @@ msgid "" "This plate is locked,\n" "We can not do auto-arrange on this plate." msgstr "" -"Ce plateau est verrouillé,\n" -"la disposition automatique n'est pas possible." +"Cette plaque est verrouillée,\n" +"nous ne pouvons pas faire d'auto-arrangement sur cette plaque." msgid "Arranging..." -msgstr "Organisation…" - -msgid "" -"Arrange failed. Found some exceptions when processing object geometries." -msgstr "" -"Échec de l’organisation. Quelques exceptions ont été trouvées lors du " -"traitement des géométries d'objets." +msgstr "Organiser..." msgid "Arranging" -msgstr "Organiser" +msgstr "Agencement" msgid "Arranging canceled." -msgstr "Organisation annulée." +msgstr "Agencement annulé." msgid "" "Arranging is done but there are unpacked items. Reduce spacing and try again." msgstr "" -"L’organisation est faite mais il y a des éléments non réorganisés. Réduisez " +"L'arrangement est fait mais il y a des articles non emballés. Réduisez " "l'espacement et réessayez." msgid "Arranging done." -msgstr "Organisation terminée." +msgstr "Agencement terminé." + +msgid "" +"Arrange failed. Found some exceptions when processing object geometries." +msgstr "" +"Échec de l'arrangement. Trouvé quelques exceptions lors du traitement des " +"géométries d'objets." #, c-format, boost-format msgid "" @@ -1718,7 +1757,7 @@ msgid "" "bed:\n" "%s" msgstr "" -"L’organisation a ignoré les objets suivants qui ne peuvent pas tenir sur un " +"L'agencement a ignoré les objets suivants qui ne peuvent pas tenir dans un " "seul plateau :\n" "%s" @@ -1726,24 +1765,27 @@ msgid "" "All the selected objects are on the locked plate,\n" "We can not do auto-orient on these objects." msgstr "" -"Tous les objets sélectionnés sont sur un plateau verrouillé,\n" -"l'auto-orientation sur ces objets n'est pas possible." +"Tous les objets sélectionnés sont sur la plaque verrouillée,\n" +"on ne peut pas faire d'auto-orientation sur ces objets." msgid "" "This plate is locked,\n" "We can not do auto-orient on this plate." msgstr "" -"Ce plateau est verrouillé,\n" -"l'auto-orientation n'est pas possible." +"Cette plaque est verrouillée, on ne peut pas faire d'auto-orientation sur " +"cette plaque." msgid "Orienting..." -msgstr "Orientation…" +msgstr "Orienter..." msgid "Orienting" msgstr "Orienter" -msgid "Filling bed " -msgstr "Remplir le plateau" +msgid "Orienting canceled." +msgstr "Orientation annulée." + +msgid "Filling" +msgstr "Remplissage" msgid "Bed filling canceled." msgstr "Remplissage de plateau annulé." @@ -1751,11 +1793,14 @@ msgstr "Remplissage de plateau annulé." msgid "Bed filling done." msgstr "Remplissage du plateau fait." -msgid "Error! Unable to create thread!" -msgstr "Erreur ! Impossible de créer le fil !" +msgid "Searching for optimal orientation" +msgstr "Recherche d'une orientation optimale" -msgid "Exception" -msgstr "Anomalie" +msgid "Orientation search canceled." +msgstr "Recherche d'orientation annulée." + +msgid "Orientation found." +msgstr "Orientation trouvée." msgid "Logging in" msgstr "Connexion en cours" @@ -1764,7 +1809,7 @@ msgid "Login failed" msgstr "Échec d'identification" msgid "Please check the printer network connection." -msgstr "Veuillez vérifier la connexion réseau de l'imprimante." +msgstr "Vérifiez la connexion réseau de l'imprimante." msgid "Abnormal print file data. Please slice again." msgstr "" @@ -1792,7 +1837,7 @@ msgstr "" "Veuillez simplifier le modèle puis le retrancher." msgid "Failed to send the print job. Please try again." -msgstr "Échec de l'envoi de la tâche d'impression. Veuillez réessayer." +msgstr "L'envoi de la tâche d'impression a échoué. Veuillez réessayer." msgid "Failed to upload file to ftp. Please try again." msgstr "Échec du téléversement du fichier vers le ftp. Veuillez réessayer." @@ -1823,21 +1868,16 @@ msgstr "" "réseau et réessayez." msgid "Sending print job over LAN" -msgstr "Envoi de la tâche d'impression via le réseau local" +msgstr "Envoi de la tâche d'impression sur le réseau local" msgid "Sending print job through cloud service" msgstr "Envoi de la tâche d'impression via le service cloud" msgid "Print task sending times out." -msgstr "" - -msgid "" -"The printer timed out while receiving a print job. Please check if the " -"network is functioning properly and send the print again." -msgstr "" +msgstr "L'envoi de la tâche d'impression est interrompu." msgid "Service Unavailable" -msgstr "Service non disponible" +msgstr "Service Indisponible" msgid "Unkown Error." msgstr "Erreur inconnue." @@ -1848,21 +1888,20 @@ msgstr "Envoi de la configuration d'impression" #, c-format, boost-format msgid "Successfully sent. Will automatically jump to the device page in %ss" msgstr "" -"Envoyée avec succès. Bascule automatique sur la page de l’imprimante dans %ss" +"Envoyé avec succès. Basculement automatique vers la page Appareil dans %ss" #, c-format, boost-format msgid "Successfully sent. Will automatically jump to the next page in %ss" -msgstr "" -"Envoyé avec succès. Passera automatiquement à la page suivante dans %ss" +msgstr "Envoyée avec succès. Bascule automatique sur la page suivante dans %ss" msgid "An SD card needs to be inserted before printing via LAN." -msgstr "Une carte SD doit être insérée avant l'impression via le réseau local." +msgstr "Une carte SD doit être insérée avant d'imprimer via le réseau local." msgid "Sending gcode file over LAN" -msgstr "Envoyer un fichier gcode via le réseau local" +msgstr "Envoi d'un fichier G-code via le réseau local" msgid "Sending gcode file to sdcard" -msgstr "Envoyer un fichier gcode vers la carte SD" +msgstr "Envoi du fichier G-code sur la carte SD" #, c-format, boost-format msgid "Successfully sent. Close current page in %s s" @@ -1871,39 +1910,15 @@ msgstr "Envoyé avec succès. Fermeture de la page actuelle dans %ss" msgid "An SD card needs to be inserted before sending to printer." msgstr "Une carte SD doit être insérée avant l'envoi à l'imprimante." -msgid "Choose SLA archive:" -msgstr "Choisissez l’archive SLA :" - -msgid "Import file" -msgstr "Importer un fichier" - -msgid "Import model and profile" -msgstr "Importer le modèle et le profil" - -msgid "Import profile only" -msgstr "Importer un profil uniquement" - -msgid "Import model only" -msgstr "Importer un modèle uniquement" - -msgid "Accurate" -msgstr "Précis" - -msgid "Balanced" -msgstr "Équilibré" - -msgid "Quick" -msgstr "Rapide" - msgid "Importing SLA archive" -msgstr "Importation de l’archive SLA" +msgstr "Importation d'une archive SLA" msgid "" "The SLA archive doesn't contain any presets. Please activate some SLA " "printer preset first before importing that SLA archive." msgstr "" -"L’archive SLA ne contient aucun préréglage. Veuillez d’abord activer un " -"préréglage d’imprimante SLA avant d’importer cette archive SLA." +"L'archive SLA ne contient aucun préréglage. Veuillez d'abord activer " +"certains préréglages d'imprimante SLA avant d'importer cette archive SLA." msgid "Importing canceled." msgstr "Importation annulée." @@ -1915,7 +1930,7 @@ msgid "" "The imported SLA archive did not contain any presets. The current SLA " "presets were used as fallback." msgstr "" -"L’archive SLA importée ne contenait aucun préréglage. Les préréglages SLA " +"L'archive SLA importée ne contenait aucun préréglage. Les préréglages SLA " "actuels ont été utilisés comme solution de secours." msgid "You cannot load SLA project with a multi-part object on the bed" @@ -1924,7 +1939,7 @@ msgstr "" "sur le plateau" msgid "Please check your object list before preset changing." -msgstr "Veuillez vérifier votre liste d’objets avant de changer de préréglage." +msgstr "Vérifiez votre liste d'objets avant de modifier le préréglage." msgid "Attention!" msgstr "Attention !" @@ -1939,7 +1954,7 @@ msgid "Cancelled" msgstr "Annulé" msgid "Install successfully." -msgstr "Installation réussie." +msgstr "Installé avec succès." msgid "Installing" msgstr "Installation" @@ -1948,26 +1963,26 @@ msgid "Install failed" msgstr "Échec de l'installation" msgid "Portions copyright" -msgstr "Copyright" +msgstr "Copyright des sections" msgid "Copyright" -msgstr "Copyright" +msgstr "Droits d'auteur" msgid "License" -msgstr "License" +msgstr "Longueur" msgid "Orca Slicer is licensed under " msgstr "Orca Slicer est sous licence " msgid "GNU Affero General Public License, version 3" -msgstr "GNU Affero General Public License, version 3" +msgstr "GNU Affero Licence Publique Générale, version 3" msgid "" "Orca Slicer is based on BambuStudio by Bambulab, which is from PrusaSlicer " "by Prusa Research. PrusaSlicer is from Slic3r by Alessandro Ranellucci and " "the RepRap community" msgstr "" -"Orca Slicer est basé sur Orca Slicer de Bambulab qui a été développé sur la " +"Orca Slicer est basé sur Bambu Studio de Bambulab qui a été développé sur la " "base de PrusaSlicer de Prusa Research, qui est lui même développé sur la " "base de Slic3r par Alessandro Ranelucci et la communauté RepRap" @@ -1983,19 +1998,19 @@ msgstr "" #, c-format, boost-format msgid "About %s" -msgstr "À propos de %s" +msgstr "Au sujet de %s" msgid "Orca Slicer " -msgstr "Orca Slicer" +msgstr "Orca Slicer " msgid "OrcaSlicer is based on BambuStudio, PrusaSlicer, and SuperSlicer." msgstr "Orca Slicer est basé sur BambuStudio, PrusaSlicer, et SuperSlicer." msgid "BambuStudio is originally based on PrusaSlicer by PrusaResearch." -msgstr "Orca Slicer est basé sur PrusaSlicer de PrusaResearch." +msgstr "Bambu Studio est basé sur PrusaSlicer de PrusaResearch." msgid "PrusaSlicer is originally based on Slic3r by Alessandro Ranellucci." -msgstr "PrusaSlicer est à l'origine basé sur Slic3r d'Alessandro Ranellucci." +msgstr "PrusaSlicer est initialement basé sur Slic3r d'Alessandro Ranellucci." msgid "" "Slic3r was created by Alessandro Ranellucci with the help of many other " @@ -2008,7 +2023,7 @@ msgid "Version" msgstr "Version" msgid "AMS Materials Setting" -msgstr "Réglage des matériaux de l'AMS" +msgstr "Réglage des matériaux AMS" msgid "Confirm" msgstr "Confirmer" @@ -2039,14 +2054,14 @@ msgstr "Numéro de série" msgid "Setting AMS slot information while printing is not supported" msgstr "" -"La configuration des informations sur l'emplacement dans l'AMS lors de " -"l'impression ne sont pas prises en charge" +"La définition des informations relatives aux emplacements AMS pendant " +"l'impression n'est pas prise en charge" msgid "Factors of Flow Dynamics Calibration" -msgstr "Facteurs d'étalonnage de la dynamique des flux" +msgstr "Facteurs de calibration dynamique du débit" msgid "PA Profile" -msgstr "Profil de PA" +msgstr "Profil PA" msgid "Factor K" msgstr "Facteur K" @@ -2056,20 +2071,21 @@ msgstr "Facteur N" msgid "Setting Virtual slot information while printing is not supported" msgstr "" -"La configuration des informations d’emplacement virtuel pendant l’impression " -"n’est pas prise en charge" +"Le réglage des informations relatives à l'emplacement virtuel pendant " +"l'impression n'est pas pris en charge" msgid "Are you sure you want to clear the filament information?" -msgstr "Voulez-vous vraiment effacer les informations sur le filament ?" +msgstr "Êtes-vous sûr de vouloir effacer les informations du filament ?" msgid "You need to select the material type and color first." -msgstr "Vous devez d’abord sélectionner le type de matériau et la couleur." +msgstr "Vous devez d'abord sélectionner le type de matériau et sa couleur." msgid "Please input a valid value (K in 0~0.3)" -msgstr "" +msgstr "Veuillez saisir une valeur valide (K entre 0 et 0,3)" msgid "Please input a valid value (K in 0~0.3, N in 0.6~2.0)" msgstr "" +"Veuillez saisir une valeur valide (K entre 0 et 0,3, N entre 0,6 et 2,0)." msgid "Other Color" msgstr "Autre couleur" @@ -2078,7 +2094,7 @@ msgid "Custom Color" msgstr "Couleur perso" msgid "Dynamic flow calibration" -msgstr "Calibration dynamique du débit" +msgstr "Calibrage dynamique du débit" msgid "" "The nozzle temp and max volumetric speed will affect the calibration " @@ -2086,21 +2102,21 @@ msgid "" "auto-filled by selecting a filament preset." msgstr "" "La température de la buse et la vitesse volumétrique maximale affecteront " -"les résultats de la calibration. Veuillez remplir les mêmes valeurs qu’en " -"impression réelle. Elles peuvent être remplis automatiquement en " +"les résultats de la calibration. Veuillez saisir les mêmes valeurs que lors " +"de l'impression réelle. Ils peuvent être remplis automatiquement en " "sélectionnant un préréglage de filament." msgid "Nozzle Diameter" -msgstr "Diamètre de la buse" +msgstr "Diamètre de la Buse" msgid "Bed Type" -msgstr "Type du plateau" +msgstr "Type de plaque" msgid "Nozzle temperature" msgstr "Température de la buse" msgid "Bed Temperature" -msgstr "Température du plateau" +msgstr "Température du lit" msgid "Max volumetric speed" msgstr "Vitesse volumétrique maximale" @@ -2125,32 +2141,32 @@ msgid "" "hot bed like the picture below, and fill the value on its left side into the " "factor K input box." msgstr "" -"Calibration terminée. Veuillez trouver la ligne d’extrusion la plus uniforme " -"sur votre plateau comme l’image ci-dessous, et remplissez la valeur sur son " -"côté gauche dans la zone de saisie du facteur K." +"Calibrage terminé. Veuillez trouver la ligne d'extrusion la plus uniforme " +"sur votre plateau comme dans l'image ci-dessous, et entrez la valeur sur son " +"côté gauche dans le champ de saisie du facteur K." msgid "Save" -msgstr "Sauvegarder" +msgstr "Enregistrer" msgid "Last Step" -msgstr "Dernière étape" +msgstr "Retour" msgid "Example" msgstr "Exemple" #, c-format, boost-format msgid "Calibrating... %d%%" -msgstr "Calibration… %d%%" +msgstr "Calibration...%d%%" msgid "Calibration completed" -msgstr "Calibration terminée" +msgstr "Calibration terminé" #, c-format, boost-format msgid "%s does not support %s" msgstr "%s ne prend pas en charge %s" msgid "Dynamic flow Calibration" -msgstr "Calibration dynamique du débit" +msgstr "Calibrage dynamique du débit" msgid "Step" msgstr "Étape" @@ -2161,45 +2177,42 @@ msgstr "Emplacements AMS" msgid "" "Note: Only the AMS slots loaded with the same material type can be selected." msgstr "" -"Remarque : Seuls les emplacements dans l’AMS chargés avec le même type de " -"filament peuvent être sélectionnés." +"Remarque : seuls les emplacements AMS chargés avec le même type de matériau " +"peuvent être sélectionnés." msgid "Enable AMS" msgstr "Activer l'AMS" msgid "Print with filaments in the AMS" -msgstr "" -"Imprimer avec les filaments\n" -"dans l'AMS" +msgstr "Imprimer avec du filament de l'AMS" msgid "Disable AMS" msgstr "Désactiver l'AMS" msgid "Print with the filament mounted on the back of chassis" -msgstr "" -"Imprimer avec le filament placé\n" -"à l'arrière du châssis" +msgstr "Impression avec du filament de la bobine externe" msgid "Cabin humidity" -msgstr "Humidité dans l’AMS" +msgstr "Humidité dans l'AMS" msgid "" "Green means that AMS humidity is normal, orange represent humidity is high, " "red represent humidity is too high.(Hygrometer: lower the better.)" msgstr "" -"Vert signifie que l’humidité dans l’AMS est normale, orange représente une " -"humidité élevée, rouge représente une humidité trop élevée. (Hygromètre : un " -"niveau bas est meilleur, les barres : un niveau haut est meilleur)" +"Le vert signifie que l'humidité de l'AMS est normale, l'orange signifie que " +"l'humidité est élevée et le rouge signifie que l'humidité est trop élevée. " +"(Hygromètre : plus c'est bas, mieux c'est.)" msgid "Desiccant status" -msgstr "Statut des déshydrateurs" +msgstr "État du déshydratant" msgid "" "A desiccant status lower than two bars indicates that desiccant may be " "inactive. Please change the desiccant.(The bars: higher the better.)" msgstr "" -"Un état du déshydrateur inférieur à deux barres indique qu’il est peut-être " -"inactif. Veuillez le remplacer. (Plus le niveau haut, mieux c’est)" +"Un état du dessicant inférieur à deux barres indique que le dessicant est " +"peut-être inactif. Veuillez changer le déshydratant. (Plus c'est élevé, " +"mieux c'est.)" msgid "" "Note: When the lid is open or the desiccant pack is changed, it can take " @@ -2207,51 +2220,52 @@ msgid "" "process. During this time, the indicator may not represent the chamber " "accurately." msgstr "" -"Remarque : Lorsque le couvercle est ouvert ou que le sachet déshydrateur est " -"remplacé, cela peut prendre plusieurs heures ou une nuit pour absorber " -"l’humidité. Les basses températures ralentissent également le processus. " -"Pendant ce temps, l’indicateur peut ne pas représenter l’état avec précision." +"Remarque: Lorsque le couvercle est ouvert ou que le sachet de dessicant est " +"changé, cela peut prendre plusieurs heures ou une nuit pour absorber " +"l'humidité. Les basses températures ralentissent également le processus. " +"Pendant ce temps, l'indicateur pourrait ne pas representer l'humidité dans " +"l'AMS avec précision." msgid "" "Config which AMS slot should be used for a filament used in the print job" msgstr "" -"Configurer le ou les emplacements utilisés dans l’AMS pour un ou des " -"filaments utilisés pour cette impression" +"Configurez l'emplacement AMS qui doit être utilisé pour un filament utilisé " +"dans la tâche d'impression" msgid "Filament used in this print job" -msgstr "Filament utilisé dans cette tâche d'impression" +msgstr "Filament utilisé dans ce travail d'impression" msgid "AMS slot used for this filament" -msgstr "Emplacement utilisé dans l’AMS pour ce filament" +msgstr "Emplacement AMS utilisé pour ce filament" msgid "Click to select AMS slot manually" -msgstr "Cliquez pour sélectionner manuellement l'emplacement" +msgstr "Cliquez pour sélectionner manuellement l'emplacement AMS" msgid "Do not Enable AMS" msgstr "Ne pas activer l'AMS" msgid "Print using materials mounted on the back of the case" -msgstr "Imprimer avec le filament placé à l'arrière du châssis" +msgstr "Imprimez en utilisant le filament de la bobine externe" msgid "Print with filaments in ams" -msgstr "Imprimer avec les filaments dans l'AMS" +msgstr "Imprimer avec du filament de l'AMS" msgid "Print with filaments mounted on the back of the chassis" -msgstr "Imprimer avec le filament placé à l'arrière du châssis" +msgstr "Impression avec du filament de la bobine externe" msgid "" "When the current material run out, the printer will continue to print in the " "following order." msgstr "" -"Lorsque le matériel en cours est épuisé, l'imprimante continue à imprimer " -"dans l'ordre suivant." +"Lorsque le filament actuel est épuisé, l'imprimante\n" +"continue d'imprimer dans l'ordre suivant." msgid "Group" msgstr "Groupe" msgid "The printer does not currently support auto refill." msgstr "" -"L'imprimante ne prend pas actuellement en charge la recharge automatique." +"L’imprimante ne prend actuellement pas en charge la recharge automatique." msgid "" "AMS filament backup is not enabled, please enable it in the AMS settings." @@ -2265,23 +2279,24 @@ msgid "" "(Currently supporting automatic supply of consumables with the same brand, " "material type, and color)" msgstr "" -"S'il y a deux filaments identiques dans l'AMS, la sauvegarde des filaments " -"AMS sera activée. \n" -"(Prend actuellement en charge l'approvisionnement automatique en " -"consommables de la même marque, du même type de matériau et de la même " -"couleur)" +"S’il y a deux filaments identiques dans AMS, la prise en\n" +"charge de la recharge automatique de filaments sera activée.\n" +"\n" +"La prise en charge de la recharge automatique de filaments\n" +"n'est possible qu'avec la même marque, le même type de\n" +"matériau et la même couleur." msgid "AMS Settings" -msgstr "Paramètres de l’AMS" +msgstr "Paramètres AMS" msgid "Insertion update" -msgstr "Mise à jour à l’insertion" +msgstr "Insertion de la mise à jour" msgid "" "The AMS will automatically read the filament information when inserting a " "new Bambu Lab filament. This takes about 20 seconds." msgstr "" -"L'AMS lira automatiquement les informations relatives au filament lors de " +"L'AMS lit automatiquement les informations relatives au filament lors de " "l'insertion d'une nouvelle bobine de filament Bambu Lab. Cela prend environ " "20 secondes." @@ -2290,26 +2305,26 @@ msgid "" "automatically read any information until printing is completed." msgstr "" "Remarque : si un nouveau filament est inséré pendant l'impression, l'AMS ne " -"lira les informations qu'à la fin de l'impression." +"lira automatiquement aucune information avant la fin de l'impression." msgid "" "When inserting a new filament, the AMS will not automatically read its " "information, leaving it blank for you to enter manually." msgstr "" -"Lors de l'insertion d'un nouveau filament, l'AMS ne lira pas automatiquement " -"ses informations, les laissant vides pour que vous les saisissiez " -"manuellement." +"Lors de l'insertion d'un nouveau filament, l'AMS ne lit pas automatiquement " +"ses informations. Elles sont laissées vides pour que vous puissiez les " +"saisir manuellement." msgid "Power on update" -msgstr "Mise à jour au démarrage" +msgstr "Mise à jour de la mise sous tension" msgid "" "The AMS will automatically read the information of inserted filament on " "start-up. It will take about 1 minute.The reading process will roll filament " "spools." msgstr "" -"Au démarrage, l'AMS lira automatiquement les informations relatives aux " -"filaments insérés. Cela prend environ 1 minute et ce processus fait tourner " +"Au démarrage, l'AMS lit automatiquement les informations relatives au " +"filament inséré. Cela prend environ 1 minute et ce processus fait tourner " "les bobines de filament." msgid "" @@ -2317,12 +2332,12 @@ msgid "" "during startup and will continue to use the information recorded before the " "last shutdown." msgstr "" -"L'AMS ne lira pas automatiquement les informations des filaments insérés " -"lors du démarrage et continuera à utiliser les informations enregistrées " +"L'AMS ne lira pas automatiquement les informations du filament inséré " +"pendant le démarrage et continuera à utiliser les informations enregistrées " "avant le dernier arrêt." msgid "Update remaining capacity" -msgstr "Mise à jour de la capacité restante" +msgstr "Mettre à jour la capacité restante" msgid "" "The AMS will estimate Bambu filament's remaining capacity after the filament " @@ -2330,21 +2345,21 @@ msgid "" "automatically." msgstr "" "L'AMS estimera la capacité restante du filament Bambu après la mise à jour " -"des informations sur le filament. Pendant l'impression, la capacité restante " -"sera mise à jour automatiquement." +"des infos du filament. Pendant l'impression, la capacité restante sera " +"automatiquement mise à jour." msgid "AMS filament backup" -msgstr "Sauvegarde du filament dans l’AMS" +msgstr "Filament de secours AMS" msgid "" "AMS will continue to another spool with the same properties of filament " "automatically when current filament runs out" msgstr "" -"L'AMS continuera automatiquement vers une autre bobine de filament avec les " -"mêmes propriétés lorsque la bobine utilisée est terminée" +"L'AMS passera automatiquement à une autre bobine avec les mêmes propriétés " +"de filament lorsque la bobine actuelle est épuisé" msgid "File" -msgstr "Fichier" +msgstr "Dossier" msgid "Calibration" msgstr "Calibration" @@ -2354,47 +2369,46 @@ msgid "" "software, check and retry." msgstr "" "Échec du téléchargement du plug-in. Veuillez vérifier les paramètres de " -"votre pare-feu et de votre logiciel VPN, puis réessayez." +"votre pare-feu et votre logiciel VPN puis réessayer." msgid "" "Failed to install the plug-in. Please check whether it is blocked or deleted " "by anti-virus software." msgstr "" -"Échec de l'installation du plug-in. Veuillez vérifier s'il n'a pas été " -"bloqué ou supprimé par un logiciel antivirus." +"Échec de l'installation du plug-in. Veuillez vérifier s'il est bloqué ou " +"s'il a été supprimé par un logiciel anti-virus." msgid "click here to see more info" msgstr "cliquez ici pour voir plus d'informations" msgid "Please home all axes (click " -msgstr "Veuillez mettre en Home tous les axes (cliquez sur " +msgstr "Veuillez mettre à 0 les axes (cliquer " msgid "" ") to locate the toolhead's position. This prevents device moving beyond the " "printable boundary and causing equipment wear." msgstr "" -") pour localiser la position de la tête d'outil. Cela empêche l’imprimante " -"de se déplacer au-delà de la limite imprimable et d'entraîner l'usure de " -"l'équipement." +") pour localiser la position de la tête. Cela éviter de dépasser la limite " +"imprimable et de provoquer une usure de l'équipement." msgid "Go Home" -msgstr "Home" +msgstr "Retour 0" msgid "" "A error occurred. Maybe memory of system is not enough or it's a bug of the " "program" msgstr "" -"Une erreur s'est produite. Il est possible que la mémoire du système ne soit " -"pas suffisante ou que ce soit un bug du programme" +"Une erreur s'est produite. Peut-être que la mémoire du système n'est pas " +"suffisante ou c'est un bug du programme" msgid "Please save project and restart the program. " msgstr "Veuillez enregistrer le projet et redémarrer le programme. " msgid "Processing G-Code from Previous file..." -msgstr "Traitement G-Code du fichier précédent..." +msgstr "Traitement du G-Code du fichier précédent..." msgid "Slicing complete" -msgstr "Découpage terminé" +msgstr "Découpe terminée" msgid "Access violation" msgstr "Violation d'accès" @@ -2409,13 +2423,13 @@ msgid "Overflow" msgstr "Débordement" msgid "Underflow" -msgstr "Sous-dépassement" +msgstr "Soupassement" msgid "Floating reserved operand" -msgstr "Opérande réservé flottant" +msgstr "Opérande réservée flottante" msgid "Stack overflow" -msgstr "Stack overflow" +msgstr "Débordement de pile" msgid "Unknown error when export G-code." msgstr "Erreur inconnue lors de l'exportation du G-code." @@ -2426,13 +2440,12 @@ msgid "" "Error message: %1%.\n" "Source file %2%." msgstr "" -"Échec de l'enregistrement du fichier gcode.\n" -"Message d'erreur : %1%. \n" -"Fichier source %2%." +"Échec de l'enregistrement du fichier gcode. Message d'erreur : %1%. Fichier " +"source %2%." #, boost-format msgid "Succeed to export G-code to %1%" -msgstr "G-code exporté avec succès vers %1%" +msgstr "Succès! G-code exporté vers %1%" msgid "Running post-processing scripts" msgstr "Exécution de scripts de post-traitement" @@ -2443,8 +2456,8 @@ msgstr "La copie du G-code temporaire vers le G-code de sortie a échoué" #, boost-format msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" msgstr "" -"Planification du téléchargement vers `%1%`. Voir Fenêtre -> Imprimer la file " -"d'attente de téléchargement de l'hôte" +"Planification du téléversement vers `%1% `. Voir Fenêtre -> File d'attente " +"de téléversement de l'hôte d'impression" msgid "Origin" msgstr "Origine" @@ -2459,7 +2472,7 @@ msgid "" "Distance of the 0,0 G-code coordinate from the front left corner of the " "rectangle." msgstr "" -"Distance de la coordonnée 0,0 du G-code à partir du coin avant gauche du " +"Distance des coordonnées 0,0 du G-code depuis le coin avant gauche du " "rectangle." msgid "" @@ -2470,13 +2483,13 @@ msgstr "" "située au centre." msgid "Rectangular" -msgstr "Rectangulaire" +msgstr "Rectangle" msgid "Circular" msgstr "Circulaire" msgid "Load shape from STL..." -msgstr "Charger la forme depuis un STL..." +msgstr "Charger une forme depuis un STL..." msgid "Settings" msgstr "Réglages" @@ -2485,19 +2498,20 @@ msgid "Texture" msgstr "Texture" msgid "Remove" -msgstr "Supprimer" +msgstr "Retirer" msgid "Not found:" -msgstr "Non trouvé:" +msgstr "Introuvable:" msgid "Model" msgstr "Modèle" msgid "Choose an STL file to import bed shape from:" -msgstr "Choisissez un fichier STL pour importer une forme de plateau :" +msgstr "" +"Choisissez un fichier STL à partir duquel importer la forme du plateau :" msgid "Invalid file format." -msgstr "Format de fichier invalide." +msgstr "Format de fichier non valide." msgid "Error! Invalid model" msgstr "Erreur ! Modèle invalide" @@ -2508,14 +2522,15 @@ msgstr "Le fichier sélectionné ne contient aucune géométrie." msgid "" "The selected file contains several disjoint areas. This is not supported." msgstr "" -"Le fichier sélectionné contient plusieurs zones disjointes. Ceci n'est pas " -"pris en charge." +"Le fichier sélectionné contient plusieurs zones disjointes. Cela n'est pas " +"utilisable." msgid "Choose a file to import bed texture from (PNG/SVG):" -msgstr "Choisissez un fichier pour importer une texture de plateau (PNG/SVG) :" +msgstr "" +"Choisir un fichier à partir duquel importer la texture du plateau (PNG/SVG) :" msgid "Choose an STL file to import bed model from:" -msgstr "Choisissez un fichier STL pour importer un modèle de plateau :" +msgstr "Choisissez un fichier STL à partir duquel importer le modèle de lit :" msgid "Bed Shape" msgstr "Forme du plateau" @@ -2525,9 +2540,9 @@ msgid "" "Please make sure whether to use the temperature to print.\n" "\n" msgstr "" -"La buse peut être bouchée lorsque la température est hors de la plage " +"La buse peut être bloquée lorsque la température est hors de la plage " "recommandée.\n" -"Veuillez vous assurer d'utiliser la température adéquate pour imprimer.\n" +"Veuillez vous assurer d'utiliser la température pour imprimer.\n" #, c-format, boost-format msgid "" @@ -2541,8 +2556,8 @@ msgid "" "Too small max volumetric speed.\n" "Reset to 0.5" msgstr "" -"Vitesse volumétrique maximale trop petite.\n" -"Réinitialiser à 0.5" +"Vitesse volumétrique maximale trop faible.\n" +"La valeur a été réinitialisée à 0,5" #, c-format, boost-format msgid "" @@ -2550,33 +2565,27 @@ msgid "" "it may result in material softening and clogging.The maximum safe " "temperature for the material is %d" msgstr "" -"La température actuelle de la chambre est supérieure à la température " -"recommandéedu matériau, ce qui peut entraîner le ramollissement et le " -"colmatage du matériau.La température maximale recommandée du matériau est de " -"%d" +"La température actuelle de la chambre est supérieure à la température de " +"sécurité du matériau, ce qui peut entraîner un ramollissement et un bouchage " +"du filament. La température de sécurité maximale pour le matériau est %d" msgid "" "Too small layer height.\n" "Reset to 0.2" -msgstr "" -"Hauteur de couche trop petite.\n" -"Réinitialiser à 0.2" +msgstr "Hauteur de couche trop petite. Réinitialiser à 0,2" msgid "" "Too small ironing spacing.\n" "Reset to 0.1" -msgstr "" -"Espacement de lissage trop petit.\n" -"Réinitialiser à 0.1" +msgstr "Espacement de repassage trop petit. Réinitialiser à 0.1" msgid "" "Zero initial layer height is invalid.\n" "\n" "The first layer height will be reset to 0.2." msgstr "" -"Une hauteur de couche initiale nulle n'est pas valide.\n" -"\n" -"La hauteur de la première couche sera réinitialisée à 0.2." +"La hauteur de couche initiale nulle n'est pas valide. La hauteur de la " +"première couche sera réinitialisée à 0,2." msgid "" "This setting is only used for model size tunning with small value in some " @@ -2587,13 +2596,10 @@ msgid "" "The value will be reset to 0." msgstr "" "Ce paramètre n'est utilisé que pour le réglage de la taille du modèle avec " -"une petite valeur dans certains cas.\n" -"Par exemple, lorsque la taille du modèle présente une petite erreur et est " -"difficile à assembler.\n" -"Pour un réglage de grande taille, veuillez utiliser la fonction d'échelle de " -"modèle.\n" -"\n" -"La valeur sera réinitialisée à 0." +"une petite valeur dans certains cas. Par exemple, lorsque la taille du " +"modèle présente une petite erreur et est difficile à assembler. Pour un " +"réglage de grande taille, veuillez utiliser la fonction d'échelle de modèle. " +"La valeur sera remise à 0." msgid "" "Too large elefant foot compensation is unreasonable.\n" @@ -2602,34 +2608,33 @@ msgid "" "\n" "The value will be reset to 0." msgstr "" -"Une trop grande compensation du pied d'éléphant est déraisonnable.\n" -"Si vous avez vraiment un effet de pied d'éléphant sérieux, veuillez vérifier " -"d'autres paramètres.\n" -"Par exemple, si la température du plateau est trop élevée.\n" -"\n" -"La valeur sera réinitialisée à 0." +"Une trop grande compensation du pied d'éléphant est déraisonnable. Si vous " +"avez vraiment un effet de pied d'éléphant sérieux, veuillez vérifier " +"d'autres paramètres. Par exemple, si la température du lit est trop élevée. " +"La valeur sera remise à 0." msgid "" "Spiral mode only works when wall loops is 1, support is disabled, top shell " "layers is 0, sparse infill density is 0 and timelapse type is traditional." msgstr "" -"Le mode vase ne fonctionne que lorsque le nombre de paroi est définie à 1, " -"le nombre de couches supérieures à 0, la densité de remplissage à 0% et le " -"type de timelapse sur Traditionnel." +"Le mode spirale ne fonctionne que lorsque qu'il n'y a qu'un seul mur, les " +"supports sont désactivés, que les couches supérieures de la coque sont à 0, " +"qu'il n'y a pas de remplissage et que le type timelapse est traditionnel." msgid " But machines with I3 structure will not generate timelapse videos." msgstr "" -" Mais les machines dotées d'une structure I3 ne génèrent pas de vidéos en " -"accéléré." +" Mais les machines avec une structure I3 ne généreront pas de vidéos " +"timelapse." msgid "" "Change these settings automatically? \n" "Yes - Change these settings and enable spiral mode automatically\n" "No - Give up using spiral mode this time" msgstr "" -"Modifier ces paramètres automatiquement ?\n" -"Oui - Modifier ces paramètres et activer automatiquement le mode vase\n" -"Non - Abandonner l'utilisation du mode vase" +"Modifier ces paramètres automatiquement ? \n" +"Oui - Modifiez ces paramètres et activez automatiquement le mode spirale/" +"vase\n" +"Non - Annuler l'activation du mode spirale" msgid "" "Prime tower does not work when Adaptive Layer Height or Independent Support " @@ -2638,10 +2643,10 @@ msgid "" "YES - Keep Prime Tower\n" "NO - Keep Adaptive Layer Height and Independent Support Layer Height" msgstr "" -"La tour de purge ne fonctionne pas lorsque la hauteur de couche adaptative " -"ou la hauteur de couche de support indépendante est activée.\n" -"Voulez-vous conserver la tour de purge ?\n" -"OUI - Conserver la tour de purge\n" +"La tour de nettoyage ne fonctionne pas lorsque la hauteur de couche " +"adaptative ou la hauteur de couche de support indépendante est activée. \n" +"Que souhaitez-vous conserver ? \n" +"OUI - Conserver la tour de nettoyage \n" "NON - Conserver la hauteur de la couche adaptative et la hauteur de la " "couche de support indépendante" @@ -2651,10 +2656,10 @@ msgid "" "YES - Keep Prime Tower\n" "NO - Keep Adaptive Layer Height" msgstr "" -"La tour de purge ne fonctionne pas lorsque la hauteur de couche adaptative " -"est activée.\n" -"Voulez-vous conserver la tour de purge ?\n" -"OUI - Conserver la tour de purge\n" +"La tour de nettoyage ne fonctionne pas lorsque la hauteur de couche " +"adaptative est activée. \n" +"Que souhaitez-vous conserver ? \n" +"OUI - Conserver la tour de nettoyage \n" "NON - Conserver la hauteur de la couche adaptative" msgid "" @@ -2663,42 +2668,28 @@ msgid "" "YES - Keep Prime Tower\n" "NO - Keep Independent Support Layer Height" msgstr "" -"La tour de purge ne fonctionne pas lorsque la hauteur de la couche de " +"La tour de nettoyage ne fonctionne pas lorsque la hauteur de la couche de " "support indépendante est activée.\n" -"Voulez-vous conserver la tour de purge ?\n" -"OUI - Conserver la tour de purge\n" -"NON - Conserver la hauteur de la couche de support indépendante" - -#, boost-format -msgid "%1% infill pattern doesn't support 100%% density." -msgstr "" -"Le motif de remplissage %1% ne prend pas en charge une densité de 100%%." - -msgid "" -"Switch to rectilinear pattern?\n" -"Yes - switch to rectilinear pattern automaticlly\n" -"No - reset density to default non 100% value automaticlly" -msgstr "" -"Basculer vers le motif rectiligne ?\n" -"Oui - Basculer vers le motif rectiligne\n" -"Non - Réinitialiser automatiquement la densité par défaut" +"Que souhaitez-vous conserver ?\n" +"OUI - Garder la tour de nettoyage\n" +"NON - Gardez la hauteur de la couche de support indépendante" msgid "" "While printing by Object, the extruder may collide skirt.\n" "Thus, reset the skirt layer to 1 to avoid that." msgstr "" -"Lors de l’impression par objet, la hotend peut entrer en collision avec la " -"jupe.\n" -"Réinitialisez le nombre de couche de la jupe à 1 pour éviter cela." +"Lors de l'impression par objet, l'extrudeur peut entrer en collision avec " +"une jupe.\n" +"Il faut donc remettre la couche de la jupe à 1 pour éviter les collisions." msgid "Auto bed leveling" -msgstr "Nivellement automatique" +msgstr "Niveau de plateau automatique" msgid "Heatbed preheating" -msgstr "Préchauffage du plateau" +msgstr "Préchauffage du plateau chauffant" msgid "Sweeping XY mech mode" -msgstr "Mode mécanique de balayage X-Y" +msgstr "Mesure fréquence axes XY" msgid "Changing filament" msgstr "Changement de filament" @@ -2707,16 +2698,16 @@ msgid "M400 pause" msgstr "Pause M400" msgid "Paused due to filament runout" -msgstr "Mise en pause en raison d'un manque de filament" +msgstr "Pause en raison d'un manque de filament" msgid "Heating hotend" msgstr "Préchauffage de la buse" msgid "Calibrating extrusion" -msgstr "Calibration de l'extrusion" +msgstr "Étalonnage de l'extrusion" msgid "Scanning bed surface" -msgstr "Analyse de la surface du plateau" +msgstr "Balayage de la surface du plateau" msgid "Inspecting first layer" msgstr "Inspection de la première couche" @@ -2725,10 +2716,10 @@ msgid "Identifying build plate type" msgstr "Identification du type de plateau" msgid "Calibrating Micro Lidar" -msgstr "Calibration du Micro Lidar" +msgstr "Calibrage du Micro-Lidar" msgid "Homing toolhead" -msgstr "Positionnement en Home" +msgstr "Tête d'outil de guidage" msgid "Cleaning nozzle tip" msgstr "Nettoyage de la buse" @@ -2737,58 +2728,68 @@ msgid "Checking extruder temperature" msgstr "Vérification de la température de l'extrudeur" msgid "Printing was paused by the user" -msgstr "L'impression a été suspendue par l'utilisateur" +msgstr "L’impression a été suspendue par l’utilisateur" msgid "Pause of front cover falling" -msgstr "Mise en pause en raison de la chute du capot" +msgstr "Pause de la chute de la couverture avant" msgid "Calibrating the micro lida" -msgstr "Calibration du Micro Lidar" +msgstr "Calibrage du micro-Lidar" msgid "Calibrating extrusion flow" -msgstr "Calibration du débit d'extrusion" +msgstr "Calibrage du débit d'extrusion" msgid "Paused due to nozzle temperature malfunction" -msgstr "" -"Mise en pause en raison d'un dysfonctionnement de la température de la buse" +msgstr "Pause en raison d'un dysfonctionnement de la température de la buse" msgid "Paused due to heat bed temperature malfunction" msgstr "" -"Mise en pause en raison d'un dysfonctionnement de la température du plateau" +"Pause en raison d'un dysfonctionnement de la température du plateau chauffant" msgid "Filament unloading" msgstr "Déchargement du filament" msgid "Skip step pause" -msgstr "Sauter l'étape pause" +msgstr "Passer l’étape de la pause" msgid "Filament loading" msgstr "Chargement du filament" msgid "Motor noise calibration" -msgstr "Étalonnage du bruit du moteur" +msgstr "Calibrage du bruit du moteur" msgid "Paused due to AMS lost" -msgstr "Mise en pause en raison de la perte de l'AMS" +msgstr "Suspendu en raison de la perte de l’AMS" msgid "Paused due to low speed of the heat break fan" msgstr "" -"Mise en pause en raison de la faible vitesse du ventilateur de " -"refroidissement" +"Mise en pause en raison de la faible vitesse du ventilateur du heatbreak" msgid "Paused due to chamber temperature control error" msgstr "" -"Mise en pause en raison d'une erreur de contrôle de la température de la " +"Mise en pause en raison d’une erreur de contrôle de la température de la " "chambre" msgid "Cooling chamber" -msgstr "Chambre de refroidissement" +msgstr "Refroidissement de la chambre" msgid "Paused by the Gcode inserted by user" -msgstr "Mise en pause par le Gcode inséré par l'utilisateur" +msgstr "Mise en pause par le Gcode inséré par l’utilisateur" msgid "Motor noise showoff" -msgstr "Exposition du bruit du moteur" +msgstr "Démonstration du bruit du moteur" + +msgid "Nozzle filament covered detected pause" +msgstr "Pause en cas de détection de buse couverte de filament" + +msgid "Cutter error pause" +msgstr "Pause en cas d'erreur de coupe" + +msgid "First layer error pause" +msgstr "Pause en cas d'erreur de la première couche" + +msgid "Nozzle clog pause" +msgstr "Pause en cas de buse bouchée" msgid "MC" msgstr "MC" @@ -2803,10 +2804,10 @@ msgid "XCam" msgstr "XCam" msgid "Unknown" -msgstr "Inconnue" +msgstr "Inconnu" msgid "Fatal" -msgstr "Fatal" +msgstr "Mortel" msgid "Serious" msgstr "Sérieux" @@ -2831,56 +2832,69 @@ msgid "" "45℃.In order to avoid extruder clogging,low temperature filament(PLA/PETG/" "TPU) is not allowed to be loaded." msgstr "" +"La température actuelle de la chambre ou la température cible de la chambre " +"dépasse 45℃. Afin d’éviter le bouchage de l’extrudeur, un filament basse " +"température (PLA/PETG/TPU) ne doit pas être chargé." msgid "" "Low temperature filament(PLA/PETG/TPU) is loaded in the extruder.In order to " "avoid extruder clogging,it is not allowed to set the chamber temperature " "above 45℃." msgstr "" +"Un filament basse température (PLA/PETG/TPU) est chargé dans l’extrudeur. " +"Afin d’éviter le bouchage de l’extrudeur, il n’est pas autorisé de régler la " +"température de la chambre au-dessus de 45℃." msgid "" "When you set the chamber temperature below 40℃, the chamber temperature " "control will not be activated. And the target chamber temperature will " "automatically be set to 0℃." msgstr "" +"Lorsque vous réglez la température de la chambre en dessous de 40℃, le " +"contrôle de la température de la chambre ne sera pas activé. Et la " +"température cible de la chambre sera automatiquement réglée sur 0℃." msgid "Failed to start printing job" -msgstr "Échec du démarrage de la tâche d'impression" +msgstr "Échec du lancement de la tâche d'impression" msgid "" "This calibration does not support the currently selected nozzle diameter" msgstr "" -"Cet étalonnage ne prend pas en charge le diamètre de buse actuellement " -"sélectionné." +"Cette calibration ne prend pas en charge le diamètre de buse actuellement " +"sélectionné" msgid "Current flowrate cali param is invalid" -msgstr "Le paramètre cali du débit actuel n'est pas valide" +msgstr "Le paramètre de calibration du débit actuel n’est pas valide" msgid "Selected diameter and machine diameter do not match" msgstr "" "Le diamètre sélectionné et le diamètre de la machine ne correspondent pas" msgid "Failed to generate cali gcode" -msgstr "Échec de la génération du code cali" +msgstr "Échec de la génération du G-code de calibration" msgid "Calibration error" -msgstr "Erreur d'étalonnage" +msgstr "Erreur de la calibration" msgid "TPU is not supported by AMS." -msgstr "Le TPU n'est pas pris en charge par AMS." +msgstr "Le TPU n’est pas pris en charge par l’AMS." msgid "Bambu PET-CF/PA6-CF is not supported by AMS." -msgstr "Le PET-CF/PA6-CF Bambu n'est pas pris en charge par l'AMS." +msgstr "Bambu PET-CF/PA6-CF n’est pas pris en charge par l’AMS." msgid "" "Damp PVA will become flexible and get stuck inside AMS,please take care to " "dry it before use." msgstr "" +"Le PVA humide deviendra flexible et restera coincé à l’intérieur de l’AMS, " +"veuillez prendre soin de le sécher avant utilisation." msgid "" "CF/GF filaments are hard and brittle, It's easy to break or get stuck in " "AMS, please use with caution." msgstr "" +"Les filaments CF/GF sont durs et cassants, ils peuvent se casser ou se " +"coincer dans l’AMS, veuillez les utiliser avec prudence." msgid "default" msgstr "défaut" @@ -2889,7 +2903,7 @@ msgid "parameter name" msgstr "nom du paramètre" msgid "N/A" -msgstr "N/A" +msgstr "N / A" #, c-format, boost-format msgid "%s can't be percentage" @@ -2900,7 +2914,7 @@ msgid "Value %s is out of range, continue?" msgstr "La valeur %s est hors plage, continuer ?" msgid "Parameter validation" -msgstr "Validation des paramètres" +msgstr "Validation du paramètre" msgid "Value is out of range." msgstr "La valeur est hors plage." @@ -2910,17 +2924,14 @@ msgid "" "Is it %s%% or %s %s?\n" "YES for %s%%, \n" "NO for %s %s." -msgstr "" -"Est-ce %s%% ou %s %s ?\n" -"OUI pour %s%%, \n" -"NON pour %s %s." +msgstr "Est-ce %s%% ou %s %s ? OUI pour %s%%, NON pour %s %s." #, boost-format msgid "Invalid format. Expected vector format: \"%1%\"" msgstr "Format invalide. Format vectoriel attendu : \"%1%\"" msgid "Layer Height" -msgstr "Hauteur de couche" +msgstr "Hauteur de la couche" msgid "Line Width" msgstr "Largeur de ligne" @@ -2932,16 +2943,16 @@ msgid "Temperature" msgstr "Température" msgid "Flow" -msgstr "Débit" +msgstr "Flux" msgid "Tool" msgstr "Outil" msgid "Layer Time" -msgstr "Durée de couche" +msgstr "Temps de couche" msgid "Layer Time (log)" -msgstr "Durée de couche (log)" +msgstr "Temps de couche (journal)" msgid "Height: " msgstr "Hauteur: " @@ -2956,16 +2967,16 @@ msgid "Flow: " msgstr "Débit: " msgid "Layer Time: " -msgstr "Durée de couche:" +msgstr "Temps de couche: " msgid "Fan: " -msgstr "Vitesse du ventilateur: " +msgstr "Ventilation: " msgid "Temperature: " msgstr "Température: " msgid "Loading G-codes" -msgstr "Chargement des G-codes" +msgstr "Chargement des codes G" msgid "Generating geometry vertex data" msgstr "Génération de données de sommet de géométrie" @@ -2974,7 +2985,7 @@ msgid "Generating geometry index data" msgstr "Génération de données d'index de géométrie" msgid "Statistics of All Plates" -msgstr "Statistiques de tous les plateaux" +msgstr "Statistiques de toutes les plaques" msgid "Display" msgstr "Afficher" @@ -2986,7 +2997,7 @@ msgid "Total" msgstr "Total" msgid "Tower" -msgstr "" +msgstr "Tour" msgid "Total Estimation" msgstr "Estimation totale" @@ -3001,7 +3012,7 @@ msgid "up to" msgstr "jusqu'à" msgid "above" -msgstr "au dessus" +msgstr "au-dessus" msgid "from" msgstr "de" @@ -3013,7 +3024,7 @@ msgid "Time" msgstr "Durée" msgid "Percent" -msgstr "%" +msgstr "Pour cent" msgid "Layer Height (mm)" msgstr "Hauteur de couche (mm)" @@ -3037,34 +3048,34 @@ msgid "Used filament" msgstr "Filament utilisé" msgid "Travel" -msgstr "Déplacements" +msgstr "Déplacement" msgid "Seams" msgstr "Coutures" msgid "Retract" -msgstr "Rétraction" +msgstr "Se rétracter" msgid "Unretract" -msgstr "Réinsertion" +msgstr "Annuler le retrait" msgid "Filament Changes" msgstr "Changements de filaments" msgid "Wipe" -msgstr "Essuyage" +msgstr "Nettoyer" msgid "Options" -msgstr "Options" +msgstr "Choix" msgid "travel" -msgstr "déplacements" +msgstr "déplacement" msgid "Extruder" -msgstr "Hotend" +msgstr "Extrudeur" msgid "Filament change times" -msgstr "Durée de changement de filament" +msgstr "Temps de changement de filament" msgid "Cost" msgstr "Coût" @@ -3073,31 +3084,31 @@ msgid "Color change" msgstr "Changement de couleur" msgid "Print" -msgstr "Impression" +msgstr "Imprimer" msgid "Printer" msgstr "Imprimante" msgid "Print settings" -msgstr "Paramètres d'impression" +msgstr "Réglages d'impression" msgid "Custom g-code" -msgstr "" +msgstr "G-code personnalisé" msgid "ToolChange" -msgstr "" +msgstr "Changement d'outil" msgid "Time Estimation" -msgstr "Durée estimée" +msgstr "Estimation de temps" msgid "Normal mode" msgstr "Mode normal" msgid "Prepare time" -msgstr "Durée de préparation" +msgstr "Temps de préparation" msgid "Model printing time" -msgstr "Durée d'impression du modèle" +msgstr "Temps d'impression du modèle" msgid "Switch to silent mode" msgstr "Passer en mode silencieux" @@ -3109,64 +3120,64 @@ msgid "Variable layer height" msgstr "Hauteur de couche variable" msgid "Adaptive" -msgstr "Adaptatives" +msgstr "Adaptatif" msgid "Quality / Speed" msgstr "Qualité / Vitesse" msgid "Smooth" -msgstr "Lissé" +msgstr "Lisse" msgid "Radius" msgstr "Rayon" msgid "Keep min" -msgstr "Conserver le minimum" +msgstr "Garder min" msgid "Left mouse button:" -msgstr "Bouton gauche de la souris:" +msgstr "Bouton gauche de la souris :" msgid "Add detail" -msgstr "Ajouter un détail" +msgstr "Ajouter Détail" msgid "Right mouse button:" -msgstr "Bouton droit de la souris:" +msgstr "Bouton droit de la souris :" msgid "Remove detail" -msgstr "Supprimer un détail" +msgstr "Supprimer détail" msgid "Shift + Left mouse button:" -msgstr "Maj + Bouton gauche de la souris:" +msgstr "Maj + bouton gauche de la souris :" msgid "Reset to base" -msgstr "Réinitialiser" +msgstr "Revenir de base" msgid "Shift + Right mouse button:" -msgstr "Maj + Bouton droit de la souris:" +msgstr "Maj + bouton droit de la souris:" msgid "Smoothing" -msgstr "Lisser" +msgstr "Lissage" msgid "Mouse wheel:" -msgstr "Molette de la souris:" +msgstr "Molette de la souris :" msgid "Increase/decrease edit area" -msgstr "Augmenter/Diminuer la zone d'édition" +msgstr "Augmenter/diminuer la zone d'édition" msgid "Sequence" msgstr "Séquence" msgid "Mirror Object" -msgstr "Objet miroir" +msgstr "Symétriser l'Objet" msgid "Tool Move" -msgstr "Déplacements de l'outil" +msgstr "Déplacement d'outil" msgid "Tool Rotate" -msgstr "Rotation de l’outil" +msgstr "Rotation de l'outil" msgid "Move Object" -msgstr "Déplacer l'objet" +msgstr "Déplacer l'Objet" msgid "Auto Orientation options" msgstr "Options d'orientation automatique" @@ -3181,49 +3192,49 @@ msgid "Orient" msgstr "Orienter" msgid "Arrange options" -msgstr "Options d'organisation" +msgstr "Options d'agencement" msgid "Spacing" msgstr "Espacement" msgid "Auto rotate for arrangement" -msgstr "Rotation automatique lors de l’organisation" +msgstr "Rotation automatique pour l'arrangement" msgid "Allow multiple materials on same plate" -msgstr "Autoriser plusieurs matériaux sur le même plateau" +msgstr "Autoriser plusieurs matériaux sur la même plaque" msgid "Avoid extrusion calibration region" -msgstr "Éviter la zone de calibration de l'extrusion" +msgstr "Éviter la région de calibration de l'extrusion" msgid "Align to Y axis" -msgstr "Alignement sur l'axe Y" +msgstr "Aligner sur l’axe Y" msgid "Add" msgstr "Ajouter" msgid "Add plate" -msgstr "Ajouter un plateau" +msgstr "Ajouter une plaque" msgid "Auto orient" msgstr "Orientation automatique" msgid "Arrange all objects" -msgstr "Organiser tous les objets" +msgstr "Disposer tous les objets" msgid "Arrange objects on selected plates" -msgstr "Organiser les objets sur les plateaux sélectionnés" +msgstr "Disposer les objets sur les plaques sélectionnées" msgid "Split to objects" -msgstr "Diviser en objets" +msgstr "Diviser en objets individuels" msgid "Split to parts" -msgstr "Diviser en parties" +msgstr "Scinder en pièces" msgid "Assembly View" msgstr "Vue de l'assemblage" msgid "Select Plate" -msgstr "Sélectionner le plateau" +msgstr "Sélectionner la plaque" msgid "Assembly Return" msgstr "Retour d'assemblage" @@ -3235,27 +3246,27 @@ msgid "Paint Toolbar" msgstr "Barre d'outils de peinture" msgid "Explosion Ratio" -msgstr "Ratio d'explosion" +msgstr "Taux d'explosion" msgid "Section View" msgstr "Vue en coupe" msgid "Assemble Control" -msgstr "Contrôle de l'assemblage" +msgstr "Contrôle de l'Assemblage" msgid "Total Volume:" -msgstr "Volume total :" +msgstr "Volume total:" msgid "Assembly Info" msgstr "Informations sur l'assemblage" msgid "Volume:" -msgstr "Volume :" +msgstr "Le volume:" msgid "Size:" -msgstr "Taille :" +msgstr "Taille:" -#, boost-format +#, c-format, boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -3267,10 +3278,10 @@ msgid "An object is layed over the boundary of plate." msgstr "Un objet est posé sur la limite du plateau." msgid "A G-code path goes beyond the max print height." -msgstr "Un chemin de code G dépasse la hauteur d'impression maximale." +msgstr "Un chemin du G-code dépasse la hauteur d’impression maximale." msgid "A G-code path goes beyond the boundary of plate." -msgstr "Un chemin du G-code va au-delà de la limite du plateau." +msgstr "Un chemin de code G va au-delà de la limite de la plaque." msgid "Only the object being edit is visible." msgstr "Seul l'objet en cours d'édition est visible." @@ -3280,19 +3291,19 @@ msgid "" "Please solve the problem by moving it totally on or off the plate, and " "confirming that the height is within the build volume." msgstr "" -"Un objet est posé sur la limite du plateau ou dépasse la limite de hauteur.\n" -"Veuillez résoudre le problème en le déplaçant totalement sur ou en dehors du " -"plateau et en vous assurant que la hauteur ne dépasse pas le volume " -"d’impression." +"Un objet est posé sur la limite de la plaque ou dépasse la limite de " +"hauteur.\n" +"Veuillez résoudre le problème en le déplaçant totalement sur ou hors du " +"plateau, et en confirmant que la hauteur entre dans le volume d'impression." msgid "Calibration step selection" -msgstr "Sélection des étapes de calibration" +msgstr "Sélection de l'étape de calibration" msgid "Micro lidar calibration" -msgstr "Calibration du Micro Lidar" +msgstr "Calibration du Micro-Lidar" msgid "Bed leveling" -msgstr "Nivellement du plateau" +msgstr "Mise à niveau du lit" msgid "Vibration compensation" msgstr "Compensation des vibrations" @@ -3308,36 +3319,36 @@ msgid "" "minimize deviation.\n" "It keeps the device performing optimally." msgstr "" -"Le processus de calibration détecte automatiquement l'état de votre " -"imprimante pour minimiser les écarts. Il permet à l’imprimante de " -"fonctionner de manière optimale." +"Le processus de calibration détecte automatiquement l'état de votre appareil " +"pour minimiser les écarts. Il permet à l'appareil de fonctionner de manière " +"optimale." msgid "Calibration Flow" -msgstr "Calibration du débit" +msgstr "Calibration débit" msgid "Start Calibration" -msgstr "Démarrer" +msgstr "Démarrer la calibration" msgid "Completed" msgstr "Terminé" msgid "Calibrating" -msgstr "Calibration" +msgstr "Étalonnage" msgid "No step selected" msgstr "Aucune étape sélectionnée" msgid "Auto-record Monitoring" -msgstr "Surveillance d'enregistrement automatique" +msgstr "Surveillance de l'enregistrement automatique" msgid "Go Live" -msgstr "Passer en direct" +msgstr "Passer en LIVE" msgid "Resolution" msgstr "Résolution" msgid "Show \"Live Video\" guide page." -msgstr "Afficher la page du guide \"Live Video\"." +msgstr "Afficher la page de guide « Vidéo en direct »." msgid "720p" msgstr "720p" @@ -3349,26 +3360,27 @@ msgid "ConnectPrinter(LAN)" msgstr "Connecter l'imprimante (LAN)" msgid "Please input the printer access code:" -msgstr "Veuillez saisir le code d'accès à l'imprimante :" +msgstr "Veuillez saisir le code d’accès à l’imprimante :" msgid "" "You can find it in \"Settings > Network > Connection code\"\n" "on the printer, as shown in the figure:" msgstr "" -"Vous pouvez le trouver dans \"Paramètres > Réseau > Code de connexion\"\n" -"sur l'imprimante, comme illustré sur le schéma :" +"Vous pouvez le trouver dans \n" +"« Paramètres > Réseau > Code de connexion » sur\n" +" l'imprimante, comme illustré sur le schéma:" msgid "Invalid input." -msgstr "Entrée invalide." +msgstr "Saisie non valide." msgid "New Window" -msgstr "Nouvelle fenêtre" +msgstr "Nouvelle Fenêtre" msgid "Open a new window" msgstr "Ouvrir une nouvelle fenêtre" msgid "Application is closing" -msgstr "Fermeture de l'application" +msgstr "L'application se ferme" msgid "Closing Application while some presets are modified." msgstr "" @@ -3384,7 +3396,7 @@ msgid "Preview" msgstr "Aperçu" msgid "Device" -msgstr "Imprimante" +msgstr "Appareil" msgid "Project" msgstr "Projet" @@ -3399,13 +3411,13 @@ msgid "will be closed before creating a new model. Do you want to continue?" msgstr "sera fermé avant de créer un nouveau modèle. Voulez-vous continuer ?" msgid "Slice plate" -msgstr "Découper le plateau" +msgstr "Trancher le plateau" msgid "Print plate" -msgstr "Imprimer le plateau" +msgstr "Imprimer plateau" msgid "Slice all" -msgstr "Découper tous les plateaux" +msgstr "Tout trancher" msgid "Export G-code file" msgstr "Exporter le fichier G-code" @@ -3414,19 +3426,19 @@ msgid "Send" msgstr "Envoyer" msgid "Export plate sliced file" -msgstr "Exporter les fichiers découpés du plateau" +msgstr "Exporter fichier tranché du plateau" msgid "Export all sliced file" -msgstr "Exporter tous les fichiers découpés" +msgstr "Exporter tous les fichiers tranchés" msgid "Print all" -msgstr "Imprimer tous les plateaux" +msgstr "Tout imprimer" msgid "Send all" -msgstr "Envoyer tous les plateaux" +msgstr "Tout envoyer" msgid "Keyboard Shortcuts" -msgstr "Raccourcis clavier" +msgstr "Raccourcis Clavier" msgid "Show the list of the keyboard shortcuts" msgstr "Afficher la liste des raccourcis clavier" @@ -3438,70 +3450,70 @@ msgid "Show Configuration Folder" msgstr "Afficher le dossier de configuration" msgid "Show Tip of the Day" -msgstr "Afficher l'astuce du jour" +msgstr "Afficher l'Astuce du Jour" msgid "Check for Update" -msgstr "Vérifier les mises à jour" +msgstr "Vérifier la mise à jour" msgid "Open Network Test" -msgstr "Lancer un test réseau" +msgstr "Ouvrir le Test de Réseau" #, c-format, boost-format msgid "&About %s" -msgstr "&À propos de %s" +msgstr "&Au sujet de %s" msgid "Upload Models" -msgstr "Envoyer des modèles" +msgstr "Téléverser les Modèles" msgid "Download Models" -msgstr "Télécharger les modèles" +msgstr "Télécharger des Modèles" msgid "Default View" msgstr "Vue par défaut" #. TRN To be shown in the main menu View->Top msgid "Top" -msgstr "Vue de dessus" +msgstr "Haut" msgid "Top View" -msgstr "Vue de dessus" +msgstr "Vue du Dessus" #. TRN To be shown in the main menu View->Bottom msgid "Bottom" -msgstr "Vue de dessous" +msgstr "Dessous" msgid "Bottom View" -msgstr "Vue de dessous" +msgstr "Vue du Dessous" msgid "Front" -msgstr "Vue de face" +msgstr "Avant" msgid "Front View" -msgstr "Vue de face" +msgstr "Vue Avant" msgid "Rear" -msgstr "Vue arrière" +msgstr "Arrière" msgid "Rear View" -msgstr "Vue arrière" +msgstr "Vue Arrière" msgid "Left" -msgstr "Vue de gauche" +msgstr "Gauche" msgid "Left View" -msgstr "Vue de gauche" +msgstr "Vue Gauche" msgid "Right" -msgstr "Vue de droite" +msgstr "Droite" msgid "Right View" -msgstr "Vue de droite" +msgstr "Vue Droite" msgid "Start a new window" -msgstr "Ouvrir une nouvelle fenêtre" +msgstr "Démarrer une nouvelle fenêtre" msgid "New Project" -msgstr "Nouveau projet" +msgstr "Nouveau Projet" msgid "Start a new project" msgstr "Démarrer un nouveau projet" @@ -3516,58 +3528,58 @@ msgid "Save Project" msgstr "Sauvegarder le projet" msgid "Save current project to file" -msgstr "Enregistrer le projet actuel vers un fichier" +msgstr "Enregistrer le projet actuel dans un fichier" msgid "Save Project as" msgstr "Enregistrer le projet sous" msgid "Shift+" -msgstr "Shift+" +msgstr "Maj+" msgid "Save current project as" msgstr "Enregistrer le projet actuel sous" msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF" -msgstr "Importer un fichier 3MF/STL/STEP/SVG/OBJ/AMF" +msgstr "Importer des fichiers 3MF/STL/STEP/SVG/OBJ/AMF" msgid "Load a model" msgstr "Charger un modèle" msgid "Import Configs" -msgstr "Importer des configurations" +msgstr "Importer des Configs" msgid "Load configs" -msgstr "Charger des configurations" +msgstr "Charger les Configs" msgid "Import" msgstr "Importer" msgid "Export all objects as one STL" -msgstr "" +msgstr "Exporter tous les objets en un seul STL" msgid "Export all objects as STLs" -msgstr "" +msgstr "Exporter tous les objets en tant que plusieurs STL" msgid "Export Generic 3MF" -msgstr "Exporter au format 3MF" +msgstr "Exporter en fichier 3MF Générique" msgid "Export 3mf file without using some 3mf-extensions" -msgstr "Exporter au format 3mf sans utiliser certaines extensions 3mf" +msgstr "Exportation de fichiers 3MF sans utiliser d'extensions" msgid "Export current sliced file" -msgstr "Exporter le fichier découpé actuel" +msgstr "Exporter le fichier tranché actuel" msgid "Export all plate sliced file" -msgstr "Exporter tous les fichiers des plateaux" +msgstr "Exportation de tous les fichiers slicés de la plaque" msgid "Export G-code" msgstr "Exporter le G-code" msgid "Export current plate as G-code" -msgstr "Exporter le plateau actuel au format G-code" +msgstr "Exporter le plateau actuel en G-code" msgid "Export &Configs" -msgstr "Exporter les configurations" +msgstr "Exportation & Configs" msgid "Export current configuration to files" msgstr "Exporter la configuration actuelle vers des fichiers" @@ -3582,7 +3594,7 @@ msgid "Undo" msgstr "Annuler" msgid "Redo" -msgstr "Rétablir" +msgstr "Recommencer" msgid "Cut selection to clipboard" msgstr "Couper la sélection dans le presse-papiers" @@ -3591,31 +3603,31 @@ msgid "Copy" msgstr "Copier" msgid "Copy selection to clipboard" -msgstr "Copier la sélection dans le presse-papiers" +msgstr "Copier la sélection dans le presse-papier" msgid "Paste" msgstr "Coller" msgid "Paste clipboard" -msgstr "Coller le presse-papiers" +msgstr "Coller le presse-papier" msgid "Delete selected" msgstr "Supprimer la sélection" msgid "Deletes the current selection" -msgstr "Supprimer la sélection actuelle" +msgstr "Supprime la sélection en cours" msgid "Delete all" -msgstr "Supprimer tout" +msgstr "Tout Supprimer" msgid "Deletes all objects" msgstr "Supprimer tous les objets" msgid "Clone selected" -msgstr "Cloner la sélection" +msgstr "Cloner sélectionné" msgid "Clone copies of selections" -msgstr "Cloner les sélections" +msgstr "Cloner des copies de sélections" msgid "Select all" msgstr "Tout sélectionner" @@ -3624,7 +3636,7 @@ msgid "Selects all objects" msgstr "Sélectionner tous les objets" msgid "Deselect all" -msgstr "Tout désélectionner" +msgstr "Désélectionner tout" msgid "Deselects all objects" msgstr "Désélectionner tous les objets" @@ -3635,8 +3647,20 @@ msgstr "Utiliser la vue en perspective" msgid "Use Orthogonal View" msgstr "Utiliser la vue orthogonale" +msgid "Show &G-code Window" +msgstr "Afficher la fenêtre du &G-code" + +msgid "Show g-code window in Previce scene" +msgstr "Afficher la fenêtre du code g dans la scène précédente" + +msgid "Reset Window Layout" +msgstr "Réinitialiser la présentation de la fenêtre" + +msgid "Reset to default window layout" +msgstr "Rétablissement de la disposition par défaut des fenêtres" + msgid "Show &Labels" -msgstr "Afficher les étiquettes" +msgstr "Afficher &Les Étiquettes" msgid "Show object labels in 3D scene" msgstr "Afficher les étiquettes des objets dans la scène 3D" @@ -3657,7 +3681,7 @@ msgid "Help" msgstr "Aide" msgid "Temperature Calibration" -msgstr "Température de calibration" +msgstr "Calibration de Température" msgid "Pass 1" msgstr "Passe 1" @@ -3711,10 +3735,10 @@ msgid "Re&load from Disk" msgstr "Recharger à partir du disque" msgid "Reload the plater from disk" -msgstr "Recharger un plateau à partir du disque" +msgstr "Rechargez la machine à partir du disque" msgid "Export &Toolpaths as OBJ" -msgstr "Exporter les &parcours d'outils en OBJ" +msgstr "Exporter &Toolpaths en OBJ" msgid "Export toolpaths as OBJ" msgstr "Exporter les parcours d'outils en OBJ" @@ -3733,31 +3757,33 @@ msgid "Quit %s" msgstr "Quitter %s" msgid "&File" -msgstr "&Fichier" +msgstr "&File" msgid "&View" -msgstr "&Vue" +msgstr "&Voir" msgid "&Help" msgstr "&Aide" #, c-format, boost-format msgid "A file exists with the same name: %s, do you want to override it." -msgstr "Un fichier existe avec le même nom : %s. Voulez-vous le remplacer ?" +msgstr "" +"Il existe un fichier portant le même nom : %s. Voulez-vous le remplacer ?" #, c-format, boost-format msgid "A config exists with the same name: %s, do you want to override it." msgstr "" -"Une configuration existe avec le même nom : %s. Voulez-vous la remplacer ?" +"Il existe une configuration portant le même nom : %s. Voulez-vous la " +"remplacer ?" msgid "Overwrite file" -msgstr "Écraser le fichier" +msgstr "Remplacer le fichier" msgid "Yes to All" -msgstr "Oui pour Tous" +msgstr "Oui à Tout" msgid "No to All" -msgstr "Non pour Tous" +msgstr "Non à Tout" msgid "Choose a directory" msgstr "Choisir un dossier" @@ -3772,20 +3798,20 @@ msgstr[1] "" "système)" msgid "Export result" -msgstr "Exporter le résultat" +msgstr "Exporter le Résultat" msgid "Select profile to load:" -msgstr "Sélectionnez le profil à charger :" +msgstr "Sélectionnez le profil à charger :" #, c-format, boost-format msgid "There is %d config imported. (Only non-system and compatible configs)" msgid_plural "" "There are %d configs imported. (Only non-system and compatible configs)" msgstr[0] "" -"Il y a %d configuration importée. (Uniquement les configurations non système " +"Il y a %d configuration importée. (Uniquement les configurations non système " "et compatibles)" msgstr[1] "" -"Il y a %d configurations importées. (Uniquement les configurations non " +"Il y a %d configurations importées. (Uniquement les configurations non " "système et compatibles)" msgid "Import result" @@ -3798,7 +3824,7 @@ msgid "The project is no longer available." msgstr "Le projet n'est plus disponible." msgid "Filament Settings" -msgstr "Paramètres des filaments" +msgstr "Réglages du filament" msgid "" "Do you want to synchronize your personal data from Bambu Cloud? \n" @@ -3807,71 +3833,72 @@ msgid "" "2. The Filament presets\n" "3. The Printer presets" msgstr "" -"Souhaitez-vous synchroniser vos données personnelles depuis Bambu Cloud ?\n" -"Il contient les informations suivantes :\n" -"1. Les préréglages de processus\n" -"2. Les préréglages de filaments\n" -"3. Les préréglages de l'imprimante" +"Voulez-vous synchroniser vos données personnelles à partir de Bambu Cloud ?\n" +"Il contient les informations suivantes :\n" +"1. Les préréglages du Processus\n" +"2. Les préréglages du Filament\n" +"3. Les préréglages de l'Imprimante" msgid "Synchronization" msgstr "Synchronisation" msgid "Initialize failed (No Device)!" -msgstr "Échec de l'initialisation (pas de périphérique) !" +msgstr "Échec de l'initialisation (pas de périphérique) !" msgid "Initialize failed (Device connection not ready)!" msgstr "" -"L'initialisation a échoué (la connexion de l'appareil n'est pas prête) !" +"L'initialisation a échoué (la connexion de l'appareil n'est pas prête) !" msgid "Initialize failed (No Camera Device)!" -msgstr "Échec de l'initialisation (aucune caméra) !" +msgstr "L'initialisation a échoué (Pas de caméra)!" msgid "Printer is busy downloading, Please wait for the downloading to finish." msgstr "" -"L’imprimante est en cours de téléchargement, veuillez attendre la fin du " +"L'imprimante est occupée à télécharger, veuillez attendre la fin du " "téléchargement." msgid "Initialize failed (Not supported on the current printer version)!" msgstr "" -"Échec de l'initialisation (non pris en charge par la version actuelle de " -"l'imprimante) !" +"Échec de l'initialisation (non pris en charge par l'imprimante actuelle) !" msgid "Initialize failed (Not accessible in LAN-only mode)!" -msgstr "Échec de l'initialisation (non accessible en mode LAN uniquement) !" +msgstr "L'initialisation a échoué (Non accessible en mode LAN uniquement) !" msgid "Initialize failed (Missing LAN ip of printer)!" -msgstr "Échec de l'initialisation (IP LAN de l'imprimante manquante) !" +msgstr "" +"Échec de l'initialisation (adresse IP réseau manquante de l'imprimante) !" msgid "Initializing..." msgstr "Initialisation..." #, c-format, boost-format msgid "Initialize failed (%s)!" -msgstr "Échec de l'initialisation (%s) !" +msgstr "L'initialisation a échoué (%s)!" msgid "Network unreachable" msgstr "Réseau inaccessible" #, c-format, boost-format msgid "Stopped [%d]!" -msgstr "[%d] arrêté !" +msgstr "Arrêté [%d] !" msgid "Stopped." msgstr "Arrêté." msgid "LAN Connection Failed (Failed to start liveview)" msgstr "" -"Échec de la connexion LAN (échec du démarrage de la visualisation en direct)" +"Échec de la connexion au réseau local (échec du démarrage de la vue en " +"direct)" msgid "" "Virtual Camera Tools is required for this task!\n" "Do you want to install them?" msgstr "" -"Virtual Camera Tools est requis pour cette tâche !\n" -"Voulez-vous l'installer ?" +"Les outils de caméra virtuelle sont nécessaires pour cette tâche !\n" +"Vous souhaitez les installer ?" msgid "Downloading Virtual Camera Tools" -msgstr "Téléchargement de Virtual Camera Tools" +msgstr "Téléchargement des Outils de Caméra Virtuelle" msgid "" "Another virtual camera is running.\n" @@ -3879,18 +3906,18 @@ msgid "" "Do you want to stop this virtual camera?" msgstr "" "Une autre caméra virtuelle est en cours d'exécution.\n" -"Orca Slicer ne prend en charge qu'une seule caméra virtuelle.\n" -"Voulez-vous arrêter cette caméra virtuelle ?" +"OrcaSlicer ne prend en charge qu'une seule caméra virtuelle.\n" +"Voulez-vous arrêter cette caméra virtuelle ?" #, c-format, boost-format msgid "Virtual camera initialize failed (%s)!" -msgstr "Échec de l'initialisation de la caméra virtuelle (%s) !" +msgstr "L'initialisation de la caméra virtuelle a échoué (%s) !" msgid "Information" -msgstr "Informations" +msgstr "Information" msgid "Playing..." -msgstr "Lecture…" +msgstr "En jouant..." #, c-format, boost-format msgid "Load failed [%d]!" @@ -3906,7 +3933,7 @@ msgid "Month" msgstr "Mois" msgid "All Files" -msgstr "Tous les fichiers" +msgstr "Tous les Fichiers" msgid "Group files by year, recent first." msgstr "Regroupez les fichiers par année, les plus récents en premier." @@ -3918,44 +3945,44 @@ msgid "Show all files, recent first." msgstr "Afficher tous les fichiers, les plus récents en premier." msgid "Timelapse" -msgstr "Timelapse" +msgstr "Laps de temps" msgid "Switch to timelapse files." -msgstr "Basculer vers les fichiers Timelapse." +msgstr "Passez aux fichiers timelapse." msgid "Video" msgstr "Vidéo" msgid "Switch to video files." -msgstr "Basculer vers les fichiers vidéo." +msgstr "Passez aux fichiers vidéo." msgid "Switch to 3mf model files." msgstr "Passez aux fichiers de modèle 3mf." msgid "Delete selected files from printer." -msgstr "Supprimer les fichiers sélectionnés de l'imprimante." +msgstr "Supprimez les fichiers sélectionnés de l'imprimante." msgid "Download" msgstr "Télécharger" msgid "Download selected files from printer." -msgstr "Télécharger les fichiers sélectionnés à partir de l'imprimante." +msgstr "Téléchargez les fichiers sélectionnés depuis l'imprimante." msgid "Select" msgstr "Sélectionner" msgid "Batch manage files." -msgstr "Gestion des lots de fichiers." +msgstr "Gérer les fichiers par lots." msgid "No printers." msgstr "Aucune imprimante." #, c-format, boost-format msgid "Connect failed [%d]!" -msgstr "La connexion a échoué [%d] !" +msgstr "La connexion a échoué [%d] !" msgid "Loading file list..." -msgstr "Chargement de la liste des fichiers…" +msgstr "Chargement de la liste des fichiers..." #, c-format, boost-format msgid "No files [%d]" @@ -3970,10 +3997,14 @@ msgid "You are going to delete %u file from printer. Are you sure to continue?" msgid_plural "" "You are going to delete %u files from printer. Are you sure to continue?" msgstr[0] "" +"Vous allez supprimer le fichier %u de l’imprimante. Êtes-vous sûr de vouloir " +"continuer ?" msgstr[1] "" +"Vous allez supprimer %u fichiers de l’imprimante. Êtes-vous sûr de vouloir " +"continuer ?" msgid "Delete files" -msgstr "Supprimer des fichiers" +msgstr "Supprimer les fichiers" #, c-format, boost-format msgid "Do you want to delete the file '%s' from printer?" @@ -3990,60 +4021,67 @@ msgstr "" "Impossible de récupérer les informations du modèle depuis l'imprimante." msgid "Failed to parse model infomations." -msgstr "Impossible d'analyser les informations du modèle" +msgstr "Impossible d'analyser les informations du modèle." msgid "" "The .gcode.3mf file contains no G-code data.Please slice it with Orca Slicer " "and export a new .gcode.3mf file." msgstr "" +"Le fichier G-code .3mf ne contient pas de données G-code. Veuillez le " +"découper avec OrcaSlicer et exporter un nouveau fichier G-code .3mf." #, c-format, boost-format msgid "File '%s' was lost! Please download it again." -msgstr "Le fichier ‘%s' a été perdu ! Veuillez le télécharger à nouveau." +msgstr "Le fichier « %s » a été perdu ! Veuillez le télécharger à nouveau." msgid "Download waiting..." -msgstr "Téléchargement en attente…" +msgstr "Téléchargement en attente..." msgid "Play" msgstr "Lecture" msgid "Open Folder" -msgstr "Ouvrir un dossier" +msgstr "Ouvrir le Dossier" msgid "Download finished" msgstr "Téléchargement terminé" #, c-format, boost-format msgid "Downloading %d%%..." -msgstr "Téléchargement %d%%…" +msgstr "Téléchargement %d%%..." msgid "Connection lost. Please retry." +msgstr "Connexion perdue. Veuillez réessayer." + +msgid "The device cannot handle more conversations. Please retry later." msgstr "" +"L'appareil ne peut pas gérer plus de conversations. Veuillez réessayer plus " +"tard." msgid "File not exists." -msgstr "" +msgstr "Le fichier n'existe pas." msgid "File checksum error. Please retry." -msgstr "" +msgstr "Erreur de somme de contrôle du fichier. Veuillez réessayer." msgid "Not supported on the current printer version." -msgstr "Non pris en charge par la version actuelle de l'imprimante." +msgstr "Non pris en charge sur la version actuelle de l’imprimante." msgid "Storage unavailable, insert SD card." -msgstr "Stockage indisponible, insérer une carte SD." +msgstr "Stockage indisponible, insérez la carte SD." #, c-format, boost-format msgid "Error code: %d" -msgstr "" +msgstr "Code d'erreur : %d" msgid "Speed:" msgstr "Vitesse:" msgid "Deadzone:" -msgstr "Zone morte:" +msgstr "Zone morte :" msgid "Options:" -msgstr "Options:" +msgstr "Options :" msgid "Zoom" msgstr "Zoom" @@ -4052,7 +4090,7 @@ msgid "Translation/Zoom" msgstr "Translation/Zoom" msgid "3Dconnexion settings" -msgstr "Paramètres de connexion 3D" +msgstr "Paramètres 3Dconnexion" msgid "Swap Y/Z axes" msgstr "Permuter les axes Y/Z" @@ -4067,47 +4105,49 @@ msgid "Invert Z axis" msgstr "Inverser l'axe Z" msgid "Invert Yaw axis" -msgstr "" +msgstr "Inverser l’axe Yaw" msgid "Invert Pitch axis" -msgstr "" +msgstr "Inverser l'axe de tangage" msgid "Invert Roll axis" -msgstr "" +msgstr "Inverser l’axe de roulis" msgid "Printing Progress" msgstr "Progression de l'impression" msgid "Resume" -msgstr "Reprendre" +msgstr "Résumer" msgid "Stop" -msgstr "Arrêter" +msgstr "Arrêt" msgid "0" msgstr "0" msgid "Layer: N/A" -msgstr "Couche: N/A" +msgstr "Couche : N/A" msgid "Clear" -msgstr "Effacer" +msgstr "Nettoyer" msgid "" "You have completed printing the mall model, \n" "but the synchronization of rating information has failed." msgstr "" +"Vous avez terminé l’impression du modèle,\n" +"mais la synchronisation des informations de notation a échoué." msgid "How do you like this printing file?" -msgstr "" +msgstr "Que pensez-vous de ce fichier d’impression ?" msgid "" "(The model has already been rated. Your rating will overwrite the previous " "rating.)" -msgstr "" +msgstr "(Le modèle a déjà été noté. Votre note écrasera la note précédente.)" msgid "Rate" -msgstr "" +msgstr "Noter" msgid "Camera" msgstr "Caméra" @@ -4116,10 +4156,10 @@ msgid "SD Card" msgstr "Carte SD" msgid "Camera Setting" -msgstr "Paramètres de la caméra" +msgstr "Réglage de la Caméra" msgid "Control" -msgstr "Contrôles" +msgstr "Contrôle" msgid "Print Options" msgstr "Options d'impression" @@ -4128,13 +4168,13 @@ msgid "100%" msgstr "100%" msgid "Lamp" -msgstr "LED" +msgstr "Lampe" msgid "Aux" msgstr "Aux" msgid "Cham" -msgstr "Chambre" +msgstr "Chamb" msgid "Bed" msgstr "Plateau" @@ -4143,7 +4183,7 @@ msgid "Unload" msgstr "Décharger" msgid "Debug Info" -msgstr "Informations de déboggage" +msgstr "Les informations de débogage" msgid "No SD Card" msgstr "Pas de carte SD" @@ -4155,50 +4195,51 @@ msgid "Cancel print" msgstr "Annuler l'impression" msgid "Are you sure you want to cancel this print?" -msgstr "Voulez-vous vraiment annuler cette impression ?" +msgstr "Êtes-vous sûr de vouloir annuler cette impression ?" msgid "Downloading..." msgstr "Téléchargement…" msgid "Cloud Slicing..." -msgstr "Découpe via le Cloud…" +msgstr "Tranchage Cloud..." #, c-format, boost-format msgid "In Cloud Slicing Queue, there are %s tasks ahead." -msgstr "Dans la file d’attente Cloud Slicing, il reste %s tâches à venir." +msgstr "Dans la file d'attente des tranchage cloud %s tâches vous attendent." #, c-format, boost-format msgid "Layer: %s" -msgstr "Couche: %s" +msgstr "Couche : %s" #, c-format, boost-format msgid "Layer: %d/%d" -msgstr "Couche: %d/%d" +msgstr "Couche : %d/%d" -msgid "Please heat the nozzle to above 170 degree before loading filament." +msgid "" +"Please heat the nozzle to above 170 degree before loading or unloading " +"filament." msgstr "" -"Veuillez chauffer la buse à plus de 170 degrés avant de charger le filament." +"Veuillez chauffer la buse à plus de 170 degrés avant de charger ou de " +"décharger le filament." msgid "Still unload" -msgstr "Toujours en train de décharger" +msgstr "Décharger encore" msgid "Still load" -msgstr "Toujours en train de charger" +msgstr "Charger encore" msgid "Please select an AMS slot before calibration" -msgstr "" -"Veuillez sélectionner un emplacement dans l’AMS avant de démarrer la " -"calibration" +msgstr "Veuillez sélectionner un emplacement AMS avant la calibration" msgid "" "Cannot read filament info: the filament is loaded to the tool head,please " "unload the filament and try again." msgstr "" -"Impossible de lire les informations du filament : le filament est chargé " -"dans la tête de l'outil, veuillez décharger le filament et réessayer." +"Impossible de lire les informations sur le filament: le filament est chargé " +"dans l'extrudeur. Veuillez décharger le filament et réessayer." msgid "This only takes effect during printing" -msgstr "Cela ne prend effet que lors de l'impression" +msgstr "Cela ne prend effet que pendant l'impression" msgid "Silent" msgstr "Silencieux" @@ -4210,104 +4251,120 @@ msgid "Sport" msgstr "Sport" msgid "Ludicrous" -msgstr "Extrême" +msgstr "Insensé" msgid "Can't start this without SD card." msgstr "Impossible de démarrer sans carte SD." msgid "Rate the Print Profile" -msgstr "" +msgstr "Noter le profil d’impression" msgid "Comment" -msgstr "" +msgstr "Commentaire" msgid "Rate this print" -msgstr "" +msgstr "Noter cette impression" msgid "Add Photo" -msgstr "" +msgstr "Ajouter une image" msgid "Delete Photo" -msgstr "" +msgstr "Supprimer l’image" msgid "Submit" -msgstr "" +msgstr "Envoyer" msgid "Please click on the star first." -msgstr "" +msgstr "Veuillez d’abord cliquer sur l’étoile." msgid "InFo" -msgstr "" +msgstr "Info" msgid "Get oss config failed." -msgstr "" +msgstr "Échec de l’obtention de la configuration du système d’exploitation." msgid "Upload Pictrues" -msgstr "" +msgstr "Envoyer des images" msgid "Number of images successfully uploaded" -msgstr "" +msgstr "Nombre d’images envoyées avec succès" msgid " upload failed" -msgstr "" +msgstr " échec de l’envoi" msgid " upload config prase failed\n" -msgstr "" +msgstr " échec de l’analyse de la configuration de l’envoi\n" msgid " No corresponding storage bucket\n" -msgstr "" +msgstr " Aucun compartiment de stockage correspondant\n" msgid " can not be opened\n" -msgstr "" +msgstr " ne peut pas être ouvert\n" msgid "" "The following issues occurred during the process of uploading images. Do you " "want to ignore them?\n" "\n" msgstr "" +"Les problèmes suivants se sont produits lors du processus d’envoi des " +"images. Voulez-vous les ignorer ?\n" +"\n" msgid "info" msgstr "info" msgid "Synchronizing the printing results. Please retry a few seconds later." msgstr "" +"Synchronisation des résultats d’impression. Veuillez réessayer dans quelques " +"secondes." msgid "Upload failed\n" -msgstr "" +msgstr "Échec de l’envoi\n" msgid "obtaining instance_id failed\n" -msgstr "" +msgstr "échec de l’obtention de l’instance_id\n" msgid "" "Your comment result cannot be uploaded due to some reasons. As follows:\n" "\n" " error code: " msgstr "" +"Le résultat de votre commentaire ne peut pas être téléchargé pour certaines " +"raisons :\n" +"\n" +" code d’erreur : " msgid "error message: " -msgstr "" +msgstr "message d’erreur : " msgid "" "\n" "\n" "Would you like to redirect to the webpage for rating?" msgstr "" +"\n" +"\n" +"Souhaitez-vous être redirigé vers la page Web pour l’évaluation ?" msgid "" "Some of your images failed to upload. Would you like to redirect to the " "webpage for rating?" msgstr "" +"Certaines de vos images n’ont pas pu être envoyées. Souhaitez-vous être " +"redirigé vers la page Web pour l’évaluation ?" msgid "You can select up to 16 images." -msgstr "" +msgstr "Vous pouvez sélectionner jusqu’à 16 images." msgid "" "At least one successful print record of this print profile is required \n" "to give a positive rating(4 or 5stars)." msgstr "" +"Au moins un enregistrement d’impression réussi de ce profil\n" +"d’impression est requis pour donner une note positive (4 ou 5 étoiles)." msgid "Status" -msgstr "Statut" +msgstr "État" msgid "Update" msgstr "Mise à jour" @@ -4320,7 +4377,7 @@ msgstr "Ne plus afficher" #, c-format, boost-format msgid "%s error" -msgstr "%s erreur" +msgstr "Erreur %s" #, c-format, boost-format msgid "%s has encountered an error" @@ -4340,10 +4397,10 @@ msgstr "%s infos" #, c-format, boost-format msgid "%s information" -msgstr "%s informations" +msgstr "Information de %s" msgid "Skip" -msgstr "Passer" +msgstr "Sauter" msgid "3D Mouse disconnected." msgstr "Souris 3D déconnectée." @@ -4361,19 +4418,19 @@ msgid "Integration failed." msgstr "L'intégration a échoué." msgid "Undo integration was successful." -msgstr "Annuler l’intégration réussi." +msgstr "Annuler l'intégration a réussi." msgid "New network plug-in available." -msgstr "Une nouvelle version du plug-in réseau Bambu est disponible." +msgstr "Nouveau plug-in réseau disponible." msgid "Details" msgstr "Détails" msgid "New printer config available." -msgstr "" +msgstr "Nouvelle configuration de l’imprimante disponible." msgid "Wiki" -msgstr "" +msgstr "Wiki" msgid "Undo integration failed." msgstr "L'annulation de l'intégration a échoué." @@ -4382,28 +4439,28 @@ msgid "Exporting." msgstr "Exportation." msgid "Software has New version." -msgstr "Une nouvelle version du logiciel est disponible." +msgstr "Le logiciel a une nouvelle version." msgid "Goto download page." -msgstr "Aller à la page de téléchargement." +msgstr "Allez sur la page de téléchargement." msgid "Open Folder." -msgstr "Ouvrir un dossier." +msgstr "Ouvrir un répertoire." msgid "Safely remove hardware." -msgstr "Retirer le matériel sans risque." +msgstr "Retirez le matériel en toute sécurité." #, c-format, boost-format msgid "%1$d Object has custom supports." msgid_plural "%1$d Objects have custom supports." -msgstr[0] "L'objet %1$d a des supports personnalisés." -msgstr[1] "Les objets %1$d ont des supports personnalisés." +msgstr[0] "%1$d objet a des supports personnalisés." +msgstr[1] " %1$d objets ont des supports personnalisés." #, c-format, boost-format msgid "%1$d Object has color painting." msgid_plural "%1$d Objects have color painting." -msgstr[0] "L’objet %1$d est peint en couleur." -msgstr[1] "Les objets %1$d sont peints en couleur." +msgstr[0] "%1$d L'objet est peint en couleur." +msgstr[1] "%1$d L'objets sont peints en couleur." #, c-format, boost-format msgid "%1$d object was loaded as a part of cut object." @@ -4415,16 +4472,16 @@ msgid "ERROR" msgstr "ERREUR" msgid "CANCELED" -msgstr "ANNULÉ" +msgstr "Annulé" msgid "COMPLETED" -msgstr "TERMINÉ" +msgstr "Terminé" msgid "Cancel upload" -msgstr "Annuler le téléchargement" +msgstr "Annuler le téléversement" msgid "Jump to" -msgstr "Sélectionner" +msgstr "Sauter à" msgid "Error:" msgstr "Erreur:" @@ -4433,43 +4490,44 @@ msgid "Warning:" msgstr "Avertissement:" msgid "Export successfully." -msgstr "Exporté avec succès." +msgstr "Exportation réussie." msgid "Model file downloaded." -msgstr "" +msgstr "Modèle téléchargé." msgid "Serious warning:" -msgstr "" +msgstr "Avertissement sérieux :" msgid " (Repair)" -msgstr " (Réparer)" +msgstr " (Réparation)" msgid " Click here to install it." msgstr " Cliquez ici pour l'installer." msgid "WARNING:" -msgstr "ATTENTION:" +msgstr "ATTENTION :" msgid "Your model needs support ! Please make support material enable." -msgstr "Votre modèle a besoin de supports ! Veuillez activer les supports." +msgstr "" +"Votre modèle a besoin de supports ! Veuillez activer le matériau de support." msgid "Gcode path overlap" msgstr "Chevauchement de chemin Gcode" msgid "Support painting" -msgstr "Peindre les supports" +msgstr "Soutenir la peinture" msgid "Color painting" -msgstr "Peindre" +msgstr "Peinture couleur" msgid "Cut connectors" -msgstr "Couper les connecteurs" +msgstr "Connecteurs de découpe" msgid "Layers" msgstr "Couches" msgid "Range" -msgstr "Intervalle" +msgstr "Zone" msgid "" "The application cannot run normally because OpenGL version is lower than " @@ -4482,7 +4540,7 @@ msgid "Please upgrade your graphics card driver." msgstr "Veuillez mettre à jour le pilote de votre carte graphique." msgid "Unsupported OpenGL version" -msgstr "Version OpenGL non prise en charge" +msgstr "Version d'OpenGL non supportée" #, c-format, boost-format msgid "" @@ -4495,39 +4553,39 @@ msgstr "Erreur lors du chargement des shaders" msgctxt "Layers" msgid "Top" -msgstr "Haut" +msgstr "Du haut" msgctxt "Layers" msgid "Bottom" -msgstr "Bas" +msgstr "Du bas" msgid "Enable AI monitoring of printing" -msgstr "Activer la surveillance par IA de l'impression" +msgstr "Activer la surveillance de l'impression par l'IA" msgid "Sensitivity of pausing is" -msgstr "Le niveau de sensibilité de la pause est" +msgstr "La sensibilité de pause est" msgid "Enable detection of build plate position" -msgstr "Activer la détection de la position du plateau" +msgstr "Activation de la détection de la position de la plaque" msgid "" "The localization tag of build plate is detected, and printing is paused if " "the tag is not in predefined range." msgstr "" -"Détection de l’étiquette de localisation du plateau. L’impression est mise " -"en pause si l'étiquette n'est pas placée au bon endroit." +"La balise de localisation de la plaque est détectée, l'impression est " +"interrompue si la balise n'est pas dans la plage prédéfinie." msgid "First Layer Inspection" -msgstr "Inspection de la première couche" +msgstr "Inspection de la Première Couche" msgid "Auto-recovery from step loss" -msgstr "Récupération automatique en cas de perte de pas" +msgstr "Restauration automatique en cas de perte de pas" msgid "Allow Prompt Sound" -msgstr "Autoriser le son de l'invite" +msgstr "Autoriser le son d’invite" -msgid "Fliament Tangle Detect" -msgstr "" +msgid "Filament Tangle Detect" +msgstr "Détection de filament coincé" msgid "Global" msgstr "Global" @@ -4536,10 +4594,10 @@ msgid "Objects" msgstr "Objets" msgid "Advance" -msgstr "Avancés" +msgstr "Avancé" msgid "Compare presets" -msgstr "Comparer les préréglages" +msgstr "Comparer les Préréglages" msgid "View all object's settings" msgstr "Afficher tous les paramètres de l'objet" @@ -4554,62 +4612,62 @@ msgid "Remove current plate (if not last one)" msgstr "Retirer la plaque actuelle (si elle n'est pas la dernière)" msgid "Auto orient objects on current plate" -msgstr "Orientation automatique des objets sur la plaque actuelle" +msgstr "Orientation automatique des objets sur le plateau actuel" msgid "Arrange objects on current plate" -msgstr "Disposer des objets sur l'assiette courante" +msgstr "Organiser les objets sur le plateau actuel" msgid "Unlock current plate" -msgstr "Déverrouiller la plaque actuelle" +msgstr "Déverrouiller le plateau actuel" msgid "Lock current plate" -msgstr "Verrouiller la plaque actuelle" +msgstr "Verrouiller le plateau actuel" msgid "Customize current plate" -msgstr "Personnalisation de la plaque actuelle" +msgstr "Personnaliser le plateau actuel" msgid "Untitled" -msgstr "Sans_Titre" +msgstr "Sans titre" #, boost-format msgid " plate %1%:" -msgstr " du plateau %1% - " +msgstr " plaque %1% :" msgid "Invalid name, the following characters are not allowed:" msgstr "Nom invalide, les caractères suivants ne sont pas autorisés :" msgid "Sliced Info" -msgstr "Informations de découpe" +msgstr "Informations de découpage" msgid "Used Filament (m)" -msgstr "Filament utilisé (m)" +msgstr "Filament Utilisé (m)" msgid "Used Filament (mm³)" -msgstr "Filament utilisé (mm³)" +msgstr "Filament Utilisé (mm³)" msgid "Used Filament (g)" -msgstr "Filament utilisé (g)" +msgstr "Filament Utilisé (g)" msgid "Used Materials" msgstr "Matériaux utilisés" msgid "Estimated time" -msgstr "Durée estimée" +msgstr "Temps estimé" msgid "Filament changes" msgstr "Changements de filaments" msgid "Click to edit preset" -msgstr "Cliquez pour modifier le préréglage" +msgstr "Cliquez pour éditer le préréglage" msgid "Connection" msgstr "Connexion" msgid "Bed type" -msgstr "Type du plateau" +msgstr "Type de plaque" msgid "Flushing volumes" -msgstr "Volumes de purge" +msgstr "Volumes de rinçage" msgid "Add one filament" msgstr "Ajouter un filament" @@ -4618,46 +4676,46 @@ msgid "Remove last filament" msgstr "Retirer le dernier filament" msgid "Synchronize filament list from AMS" -msgstr "Synchroniser la liste des filaments de l'AMS" +msgstr "Synchroniser la liste des filaments depuis l'AMS" msgid "Set filaments to use" msgstr "Définir les filaments à utiliser" msgid "Search plate, object and part." -msgstr "" +msgstr "Recherche de plaque, d'objet et de pièce." msgid "" "No AMS filaments. Please select a printer in 'Device' page to load AMS info." msgstr "" -"Pas de filaments dans l'AMS. Veuillez sélectionner une imprimante sur la " -"page ‘Imprimante’ pour charger les informations de l'AMS." +"Pas de filaments AMS. Veuillez sélectionner une imprimante dans la page " +"\"Appareil\" pour charger les informations AMS." msgid "Sync filaments with AMS" -msgstr "Synchroniser les filaments avec l'AMS" +msgstr "Synchroniser les filaments avec AMS" msgid "" "Sync filaments with AMS will drop all current selected filament presets and " "colors. Do you want to continue?" msgstr "" -"La synchronisation des filaments avec l'AMS supprimera tous les préréglages " -"et couleurs de filaments actuellement sélectionnés. Voulez-vous continuer ?" +"La synchronisation des filaments avec AMS supprimera tous les préréglages et " +"couleurs de filament actuellement sélectionnés. Voulez-vous continuer ?" msgid "" "Already did a synchronization, do you want to sync only changes or resync " "all?" msgstr "" -"Vous avez déjà effectué une synchronisation, souhaitez-vous synchroniser " -"uniquement les modifications ou tout resynchroniser ?" +"Vous avez déjà effectué une synchronisation. Voulez-vous synchroniser " +"uniquement les modifications ou tout resynchroniser ?" msgid "Sync" -msgstr "Synchroniser" +msgstr "Sync" msgid "Resync" -msgstr "Resynchroniser" +msgstr "Resync" msgid "There are no compatible filaments, and sync is not performed." msgstr "" -"Il n'y a pas de filaments compatibles et la synchronisation n'a pas " +"Il n'y a pas de filaments compatibles et la synchronisation n'est pas " "effectuée." msgid "" @@ -4671,15 +4729,15 @@ msgstr "" #, boost-format msgid "Do you want to save changes to \"%1%\"?" -msgstr "Voulez-vous enregistrer les modifications à \"%1%\" ?" +msgstr "Voulez-vous enregistrer les modifications apportées à \"%1%\" ?" #, c-format, boost-format msgid "" "Successfully unmounted. The device %s(%s) can now be safely removed from the " "computer." msgstr "" -"Ejection réalisée avec succès. Le périphérique %s(%s) peut maintenant être " -"retiré en toute sécurité de l'ordinateur." +"Démonté avec succès. Le périphérique %s(%s) peut maintenant être retiré en " +"toute sécurité de l'ordinateur." #, c-format, boost-format msgid "Ejecting of device %s(%s) has failed." @@ -4696,23 +4754,31 @@ msgid "" "clogged when printing this filament in a closed enclosure. Please open the " "front door and/or remove the upper glass." msgstr "" -"La température actuelle du lit chauffant est relativement élevée. La buse " -"peut être obstruée lors de l'impression de ce filament dans une enceinte " -"fermée. Veuillez ouvrir la porte avant et/ou retirez la vitre supérieure." +"La température actuelle du plateau est relativement élevée. La buse peut se " +"boucher lors de l’impression de ce filament dans une enceinte fermée. " +"Veuillez ouvrir la porte avant et/ou retirer la vitre supérieure." msgid "" "The nozzle hardness required by the filament is higher than the default " "nozzle hardness of the printer. Please replace the hardened nozzle or " "filament, otherwise, the nozzle will be attrited or damaged." msgstr "" -"La dureté de la buse requise par le filament est supérieure à la dureté de " -"la buse par défaut de l'imprimante. Veuillez remplacer la buse ou le " -"filament, sinon la buse sera usée ou endommagée." +"La dureté de la buse requise par le filament est supérieure à la dureté par " +"défaut de la buse de l'imprimante. Veuillez remplacer la buse ou le " +"filament, sinon la buse s'usera ou s'endommagera." msgid "" "Enabling traditional timelapse photography may cause surface imperfections. " "It is recommended to change to smooth mode." msgstr "" +"L’activation de la photographie timelapse traditionnelle peut provoquer des " +"imperfections de surface. Il est recommandé de passer en mode fluide." + +msgid "Expand sidebar" +msgstr "Agrandir la barre latérale" + +msgid "Collapse sidebar" +msgstr "Réduire la barre latérale" #, c-format, boost-format msgid "Loading file: %s" @@ -4720,7 +4786,7 @@ msgstr "Chargement du fichier : %s" msgid "The 3mf is not supported by OrcaSlicer, load geometry data only." msgstr "" -"Le fichier 3mf ne provient pas de Orca Slicer, chargement des données de " +"Le fichier 3mf n’est pas supporté par OrcaSlicer, chargement des données de " "géométrie uniquement." msgid "Load 3mf" @@ -4734,63 +4800,45 @@ msgstr "" "Le fichier 3mf a été généré par une ancienne version de Orca Slicer, " "chargement des données de géométrie uniquement." -#, c-format, boost-format -msgid "This slicer file version %s is newer than %s's version:" -msgstr "" - -msgid "" -"Would you like to update your Bambu Studio software to enable all " -"functionality in this slicer file?\n" -msgstr "" - -msgid "Newer 3mf version" -msgstr "Nouvelle version 3mf" - -msgid "" -"you can always update Bambu Studio at your convenience. The slicer file will " -"now be loaded without full functionality." -msgstr "" - -#, c-format, boost-format -msgid "" -"This slicer file version %s is newer than %s's version.\n" -"\n" -"Would you like to update your Bambu Studio software to enable all " -"functionality in this slicer file?" -msgstr "" - msgid "Invalid values found in the 3mf:" -msgstr "Valeurs non valides trouvées dans le 3mf :" +msgstr "Valeurs invalides trouvées dans le 3mf :" msgid "Please correct them in the param tabs" -msgstr "Veuillez les corriger dans l’onglet paramètres" +msgstr "Veuillez les corriger dans les onglets de paramètres" msgid "The 3mf has following modified G-codes in filament or printer presets:" msgstr "" +"Le 3mf a les codes G modifiés suivants dans le filament ou les préréglages " +"de l'imprimante :" msgid "" "Please confirm that these modified G-codes are safe to prevent any damage to " "the machine!" msgstr "" +"Veuillez vous assurer que ces codes G modifiés sont sûrs afin d'éviter tout " +"dommage à la machine !" msgid "Modified G-codes" -msgstr "" +msgstr "G-codes modifiés" msgid "The 3mf has following customized filament or printer presets:" msgstr "" +"Le 3mf dispose de filaments personnalisés ou de préréglages d'imprimante :" msgid "" "Please confirm that the G-codes within these presets are safe to prevent any " "damage to the machine!" msgstr "" +"Veuillez vous assurer que les codes G de ces préréglages sont sûrs afin " +"d'éviter d'endommager la machine !" msgid "Customized Preset" -msgstr "" +msgstr "Préréglage personnalisé" msgid "Name of components inside step file is not UTF8 format!" msgstr "" -"Le nom des composants à l'intérieur du fichier step n'est pas au format " -"UTF-8 !" +"Le nom des composants à l'intérieur du fichier d'étape n'est pas au format " +"UTF8 !" msgid "The name may show garbage characters!" msgstr "Le nom peut afficher des caractères inutiles !" @@ -4812,7 +4860,7 @@ msgid "" "The object from file %s is too small, and maybe in meters or inches.\n" " Do you want to scale to millimeters?" msgstr "" -"L'objet du fichier %s est trop petit, et peut-être en mètres ou en pouces.\n" +"L'objet du fichier %s est trop petit, et peut-être en mètres ou en pouces. " "Voulez-vous mettre à l'échelle en millimètres ?" msgid "Object too small" @@ -4823,13 +4871,12 @@ msgid "" "Instead of considering them as multiple objects, should \n" "the file be loaded as a single object having multiple parts?" msgstr "" -"Ce fichier contient plusieurs objets positionnés à plusieurs hauteurs.\n" -"Au lieu de les considérer comme des objets multiples, faut-il\n" -"que le fichier soit chargé en tant qu'objet unique comportant plusieurs " -"parties ?" +"Ce fichier contient plusieurs objets positionnés à différentes hauteurs.\n" +"Au lieu de les considérer comme des objets multiples, le fichier \n" +"doit-il être chargé en tant qu'objet unique avec plusieurs parties ?" msgid "Multi-part object detected" -msgstr "Objet en plusieurs parties détecté" +msgstr "Objet en plusieurs pièces détecté" msgid "Load these files as a single object with multiple parts?\n" msgstr "" @@ -4845,14 +4892,14 @@ msgid "" "Your object appears to be too large, Do you want to scale it down to fit the " "heat bed automatically?" msgstr "" -"Votre objet semble être trop grand, voulez-vous le mettre à l’échelle pour " -"qu'il s'adapte automatiquement au volume d'impression ?" +"Votre objet semble trop grand. Voulez-vous le réduire pour l'adapter " +"automatiquement au plateau d'impression ?" msgid "Object too large" -msgstr "Objet trop large" +msgstr "Objet trop grand" msgid "Export STL file:" -msgstr "Fichier STL exporté :" +msgstr "Exporter le fichier STL :" msgid "Export AMF file:" msgstr "Exporter le fichier AMF :" @@ -4868,21 +4915,23 @@ msgid "" "The file %s already exists\n" "Do you want to replace it?" msgstr "" +"Le fichier %s existe déjà\n" +"Voulez-vous le remplacer ?" msgid "Comfirm Save As" -msgstr "" +msgstr "Confirmer Enregistrer sous" msgid "Delete object which is a part of cut object" -msgstr "Supprimer l’objet qui fait partie de l’objet coupé" +msgstr "Supprimer l'objet qui fait partie de l'objet découpé" msgid "" "You try to delete an object which is a part of a cut object.\n" "This action will break a cut correspondence.\n" "After that model consistency can't be guaranteed." msgstr "" -"Vous essayez de supprimer un objet qui fait partie d’un objet coupé.\n" -"Cette action rompra une correspondance coupée.\n" -"Après cela, la cohérence du modèle ne pourra plus être garantie." +"Vous essayez de supprimer un objet qui fait partie d'un objet coupé.\n" +"Cette action va rompre la correspondance entre les objets coupés.\n" +"Après cela, la cohérence du modèle ne peut plus être garantie." msgid "The selected object couldn't be split." msgstr "L'objet sélectionné n'a pas pu être divisé." @@ -4891,19 +4940,19 @@ msgid "Another export job is running." msgstr "Une autre tâche d'exportation est en cours d'exécution." msgid "Unable to replace with more than one volume" -msgstr "Impossible de remplacer plus d'un volume" +msgstr "Impossible de remplacer par plus d’un volume" msgid "Error during replace" msgstr "Erreur lors du remplacement" msgid "Replace from:" -msgstr "Remplacer de :" +msgstr "Remplacer par :" msgid "Select a new file" -msgstr "Sélectionner un nouveau fichier" +msgstr "Sélectionnez un nouveau fichier" msgid "File for the replace wasn't selected" -msgstr "Le fichier à remplacer n'a pas été sélectionné" +msgstr "Le fichier de remplacement n'a pas été sélectionné" msgid "Please select a file" msgstr "Veuillez sélectionner un fichier" @@ -4912,10 +4961,10 @@ msgid "Do you want to replace it" msgstr "Voulez-vous le remplacer ?" msgid "Message" -msgstr "" +msgstr "Message" msgid "Reload from:" -msgstr "Recharger à partir de :" +msgstr "Recharger depuis :" msgid "Unable to reload:" msgstr "Impossible de recharger :" @@ -4924,7 +4973,7 @@ msgid "Error during reload" msgstr "Erreur lors du rechargement" msgid "Slicing" -msgstr "Découpage" +msgstr "Découpe" msgid "There are warnings after slicing models:" msgstr "Il y a des avertissements après le découpage des modèles :" @@ -4933,14 +4982,14 @@ msgid "warnings" msgstr "avertissements" msgid "Invalid data" -msgstr "données invalides" +msgstr "Donnée non valide" msgid "Slicing Canceled" -msgstr "Découpe annulée" +msgstr "Tranchage Annulé" #, c-format, boost-format msgid "Slicing Plate %d" -msgstr "Découpe du plateau %d" +msgstr "Tranchage plateau %d" msgid "Please resolve the slicing errors and publish again." msgstr "Veuillez résoudre les erreurs de découpage et republier." @@ -4955,9 +5004,9 @@ msgid "" "Preview only mode:\n" "The loaded file contains gcode only, Can not enter the Prepare page" msgstr "" -"Mode aperçu uniquement :\n" -"Le fichier chargé contient uniquement du gcode, impossible d'accéder à la " -"page Préparer" +"Mode de prévisualisation:\n" +"Le fichier chargé contient uniquement du G-code, impossible d'accéder à la " +"page de Préparation" msgid "You can keep the modified presets to the new project or discard them" msgstr "" @@ -4975,9 +5024,9 @@ msgid "" "Please check whether the folder exists online or if other programs open the " "project file." msgstr "" -"Échec de l'enregistrement du projet.\n" -"Veuillez vérifier si le dossier existe en ligne ou si d'autres programmes " -"utilisent actuellement ce fichier de projet." +"Impossible d'enregistrer le projet.\n" +"Vérifiez si le dossier existe en ligne ou si le fichier de projet est ouvert " +"dans d'autres programmes." msgid "Save project" msgstr "Sauvegarder le projet" @@ -4986,19 +5035,24 @@ msgid "Importing Model" msgstr "Importation du modèle" msgid "prepare 3mf file..." -msgstr "préparation du fichier 3mf…" +msgstr "préparation du fichier 3mf..." msgid "downloading project ..." -msgstr "téléchargement du projet…" +msgstr "téléchargement du projet..." #, c-format, boost-format msgid "Project downloaded %d%%" -msgstr "Projet téléchargé %d%%" +msgstr "Projet téléchargé à %d%%" msgid "" "Importing to Orca Slicer failed. Please download the file and manually " "import it." msgstr "" +"L’importation vers OrcaSlicer a échoué. Veuillez télécharger le fichier et " +"l’importer manuellement." + +msgid "Import SLA archive" +msgstr "Importer les archives SLA" msgid "The selected file" msgstr "Le fichier sélectionné" @@ -5019,16 +5073,17 @@ msgid "Open as project" msgstr "Ouvrir en tant que projet" msgid "Import geometry only" -msgstr "Importer uniquement la géométrie" +msgstr "Importer la géométrie uniquement" msgid "Only one G-code file can be opened at the same time." msgstr "Un seul fichier G-code peut être ouvert à la fois." msgid "G-code loading" -msgstr "Chargement du G-code" +msgstr "Chargement du code G" msgid "G-code files can not be loaded with models together!" -msgstr "Les fichiers G-code ne peuvent pas être chargés avec des modèles !" +msgstr "" +"Les fichiers G-code ne peuvent pas être chargés avec des modèles ensemble !" msgid "Can not add models when in preview mode!" msgstr "Impossible d'ajouter des modèles en mode aperçu !" @@ -5041,26 +5096,26 @@ msgstr "Tous les objets seront supprimés, continuer ?" msgid "The current project has unsaved changes, save it before continue?" msgstr "" -"Le projet en cours comporte des modifications non enregistrées, voulez-vous " -"les enregistrer avant de continuer ?" +"Le projet en cours comporte des modifications non enregistrées, enregistrez-" +"les avant de continuer ?" msgid "Remember my choice." -msgstr "Se souvenir de mon choix" +msgstr "Mémoriser mon choix." msgid "Number of copies:" -msgstr "Nombre de copies :" +msgstr "Nombre de copies:" msgid "Copies of the selected object" msgstr "Copies de l'objet sélectionné" msgid "Save G-code file as:" -msgstr "Enregistrer le fichier G-code sous :" +msgstr "Sauvegarder le fichier G-code en tant que :" msgid "Save SLA file as:" -msgstr "" +msgstr "Enregistrer le fichier SLA sous :" msgid "The provided file name is not valid." -msgstr "" +msgstr "Le nom de fichier fourni n’est pas valide." msgid "The following characters are not allowed by a FAT file system:" msgstr "" @@ -5075,7 +5130,7 @@ msgid "" "The file %s has been sent to the printer's storage space and can be viewed " "on the printer." msgstr "" -"Le fichier %s a été envoyé sur l'espace de stockage de l'imprimante et peut " +"Le fichier %s a été envoyé vers l'espace de stockage de l'imprimante et peut " "être visualisé sur l'imprimante." msgid "" @@ -5085,19 +5140,32 @@ msgstr "" "Impossible d'effectuer une opération booléenne sur les maillages du modèle. " "Seules les parties positives seront exportées." +msgid "" +"Are you sure you want to store original SVGs with their local paths into the " +"3MF file?\n" +"If you hit 'NO', all SVGs in the project will not be editable any more." +msgstr "" +"Êtes-vous sûr de vouloir stocker les SVG originaux avec leurs chemins " +"d'accès locaux dans le fichier 3MF ?\n" +"Si vous cliquez sur \"NON\", tous les SVG du projet ne seront plus " +"modifiables." + +msgid "Private protection" +msgstr "Protection privée" + msgid "Is the printer ready? Is the print sheet in place, empty and clean?" msgstr "" -"L'imprimante est-elle prête ? La feuille d'impression est-elle en place, " -"vide et propre ?" +"L’imprimante est-elle prête ? Le plateau d’impression est-il en place, vide " +"et propre ?" msgid "Upload and Print" -msgstr "Télécharger et imprimer" +msgstr "Envoyer & Imprimer" msgid "" "Print By Object: \n" "Suggest to use auto-arrange to avoid collisions when printing." msgstr "" -"Impression par objet : \n" +"Imprimer par objet :\n" "Nous vous suggérons d'utiliser la disposition automatique pour éviter les " "collisions lors de l'impression." @@ -5109,14 +5177,17 @@ msgstr "Envoyer à l'imprimante" msgid "Custom supports and color painting were removed before repairing." msgstr "" -"Les supports personnalisés et la peinture ont été retirés avant la " -"réparation." +"Les supports personnalisés et la peinture de couleur ont été retirés avant " +"la réparation." + +msgid "Optimize Rotation" +msgstr "Optimiser la rotation" msgid "Invalid number" msgstr "Numéro invalide" msgid "Plate Settings" -msgstr "Paramètres du plateau" +msgstr "Paramètres de la plaque" #, boost-format msgid "Number of currently selected parts: %1%\n" @@ -5124,7 +5195,7 @@ msgstr "Nombre de pièces actuellement sélectionnées : %1%\n" #, boost-format msgid "Number of currently selected objects: %1%\n" -msgstr "Nombre d'objets actuellement sélectionnés : %1%\n" +msgstr "Nombre d’objets actuellement sélectionnés : %1%\n" #, boost-format msgid "Part name: %1%\n" @@ -5136,7 +5207,7 @@ msgstr "Nom de l'objet : %1%\n" #, boost-format msgid "Size: %1% x %2% x %3% in\n" -msgstr "Taille : %1% x %2% x %3% in\n" +msgstr "Taille : %1% x %2% x %3% dans\n" #, boost-format msgid "Size: %1% x %2% x %3% mm\n" @@ -5144,7 +5215,7 @@ msgstr "Taille : %1% x %2% x %3% mm\n" #, boost-format msgid "Volume: %1% in³\n" -msgstr "Volume : %1% in³\n" +msgstr "Volume : %1% en³\n" #, boost-format msgid "Volume: %1% mm³\n" @@ -5155,7 +5226,7 @@ msgid "Triangles: %1%\n" msgstr "Triangles : %1%\n" msgid "Tips:" -msgstr "Astuces :" +msgstr "Astuces:" msgid "" "\"Fix Model\" feature is currently only on Windows. Please repair the model " @@ -5171,9 +5242,10 @@ msgid "" "still want to do this printing, please set this filament's bed temperature " "to non zero." msgstr "" -"Le plateau %d : %s n’est pas suggéré pour être utilisé avec le filament " -"%s(%s). Si vous souhaitez toujours effectuer cette impression, veuillez " -"définir la température du plateau de ce filament sur une valeur non nulle." +"La plaque% d : %s n'est pas suggéré pour l'utilisation du filament " +"d'impression %s(%s). Si vous souhaitez toujours effectuer ce travail " +"d'impression, veuillez régler la température du plateau de ce filament sur " +"un nombre différent de zéro." msgid "Switching the language requires application restart.\n" msgstr "Le changement de langue nécessite le redémarrage de l'application.\n" @@ -5196,16 +5268,16 @@ msgid "Changing the region will log out your account.\n" msgstr "Si vous changez de région, vous serez déconnecté de votre compte.\n" msgid "Region selection" -msgstr "Sélection de la région" +msgstr "Choix de la région" msgid "Second" -msgstr "secondes" +msgstr "Seconde" msgid "Browse" msgstr "Parcourir" msgid "Choose Download Directory" -msgstr "Sélectionnez le dossier de téléchargement" +msgstr "Choisissez le répertoire de téléchargement" msgid "General Settings" msgstr "Paramètres généraux" @@ -5223,13 +5295,13 @@ msgid "North America" msgstr "Amérique du Nord" msgid "Others" -msgstr "Autres" +msgstr "Autre" msgid "Login Region" -msgstr "Région" +msgstr "Région d'origine" msgid "Stealth Mode" -msgstr "Mode furtif" +msgstr "Mode privé" msgid "Metric" msgstr "Métrique" @@ -5241,75 +5313,72 @@ msgid "Units" msgstr "Unités" msgid "Home" -msgstr "" +msgstr "Acceuil" msgid "Default Page" -msgstr "" +msgstr "Page par défaut" msgid "Set the page opened on startup." -msgstr "" +msgstr "Définit la page ouverte au démarrage." msgid "Zoom to mouse position" -msgstr "Zoom à la position de la souris" +msgstr "Zoom sur la position de la souris" msgid "" "Zoom in towards the mouse pointer's position in the 3D view, rather than the " "2D window center." msgstr "" -"Effectuer un zoom avant vers la position du pointeur de la souris dans la " -"vue 3D, plutôt que vers le centre de la fenêtre 2D." +"Zoomez sur la position du pointeur de la souris dans la vue 3D, plutôt que " +"sur le centre de la fenêtre 2D." msgid "Use free camera" -msgstr "Utiliser une caméra disponible" +msgstr "Utiliser la caméra libre" msgid "If enabled, use free camera. If not enabled, use constrained camera." msgstr "" -"Si cette option est activée, la caméra libre est utilisée. Si cette option " -"n'est pas activée, la caméra contrainte est utilisée." +"Si activée, utilise la caméra libre. Si désactivée, utilise la caméra " +"contrainte." msgid "Show splash screen" -msgstr "" +msgstr "Afficher l'écran de démarrage" msgid "Show the splash screen during startup." -msgstr "" +msgstr "Afficher l’écran de démarrage au démarrage." msgid "Show \"Tip of the day\" notification after start" -msgstr "Afficher la notification \"Astuce du jour\" au démarrage" +msgstr "Afficher la notification \"Astuce du jour\" après le démarrage" msgid "If enabled, useful hints are displayed at startup." -msgstr "Si activé, des conseils utiles sont affichés au démarrage." - -msgid "Show g-code window" -msgstr "Afficher la fenêtre G-code" - -msgid "If enabled, g-code window will be displayed." -msgstr "Si activé, la fenêtre avec les commandes G-code sera affichée." +msgstr "" +"Si cette option est activée, des conseils utiles s'affichent au démarrage." msgid "Flushing volumes: Auto-calculate everytime the color changed." -msgstr "" +msgstr "Volumes de purge : Auto-calcul à chaque changement de couleur." msgid "If enabled, auto-calculate everytime the color changed." msgstr "" +"Si cette option est activée, le calcul se fera automatiquement à chaque " +"changement de couleur." msgid "Presets" msgstr "Préréglages" msgid "Auto sync user presets(Printer/Filament/Process)" msgstr "" -"Synchronisation automatique des préréglages utilisateur (Imprimante/Filament/" -"Processus)" +"Synchronisation automatique des pré-réglages utilisateur (Imprimante/" +"Filament/Processus)" msgid "User Sync" msgstr "Synchronisation utilisateur" msgid "Update built-in Presets automatically." -msgstr "Mettre automatiquement à jour les préréglages intégrés." +msgstr "Mettez à jour automatiquement les préréglages intégrés." msgid "System Sync" msgstr "Synchronisation du système" msgid "Clear my choice on the unsaved presets." -msgstr "Effacer mon choix sur les préréglages non enregistrés." +msgstr "Efface mon choix sur les préréglages non enregistrés." msgid "Associate files to OrcaSlicer" msgstr "Associer des fichiers à Orca Slicer" @@ -5345,10 +5414,11 @@ msgid "Maximum count of recent projects" msgstr "Nombre maximal de projets récents" msgid "Clear my choice on the unsaved projects." -msgstr "Effacer mon choix sur les projets non enregistrés." +msgstr "Efface mon choix sur les projets non enregistrés." msgid "No warnings when loading 3MF with modified G-codes" msgstr "" +"Pas d'avertissement lors du chargement de 3MF avec des G-codes modifiés" msgid "Auto-Backup" msgstr "Sauvegarde automatique" @@ -5356,23 +5426,23 @@ msgstr "Sauvegarde automatique" msgid "" "Backup your project periodically for restoring from the occasional crash." msgstr "" -"Sauvegardez votre projet périodiquement pour restaurer en cas de plantage " -"occasionnel." +"Sauvegardez votre projet périodiquement pour faciliter la restauration après " +"un plantage occasionnel." msgid "every" -msgstr "toutes les" +msgstr "chaque" msgid "The peroid of backup in seconds." -msgstr "La période de sauvegarde en secondes." +msgstr "Période de sauvegarde en secondes." msgid "Downloads" msgstr "Téléchargements" msgid "Dark Mode" -msgstr "Mode Nuit" +msgstr "Mode Sombre" msgid "Enable Dark mode" -msgstr "Activer le Mode Nuit" +msgstr "Activer le mode Sombre" msgid "Develop mode" msgstr "Mode Développeur" @@ -5381,7 +5451,7 @@ msgid "Skip AMS blacklist check" msgstr "Ignorer la vérification de la liste noire AMS" msgid "Home page and daily tips" -msgstr "Page d'accueil et conseils quotidiens" +msgstr "Page d'accueil et Astuces quotidiennes" msgid "Show home page on startup" msgstr "Afficher la page d'accueil au démarrage" @@ -5393,7 +5463,7 @@ msgid "User sync" msgstr "Synchronisation utilisateur" msgid "Preset sync" -msgstr "Synchronisation des préréglages" +msgstr "Synchronisation préréglée" msgid "Preferences sync" msgstr "Synchronisation des préférences" @@ -5405,10 +5475,10 @@ msgid "Rotate of view" msgstr "Rotation de la vue" msgid "Move of view" -msgstr "Déplacement de la vue" +msgstr "Déplacement de vue" msgid "Zoom of view" -msgstr "Zoom de la vue" +msgstr "Vue agrandie" msgid "Other" msgstr "Autre" @@ -5429,7 +5499,7 @@ msgid "Log Level" msgstr "Niveau de journalisation" msgid "fatal" -msgstr "fatale" +msgstr "mortel" msgid "error" msgstr "erreur" @@ -5441,7 +5511,7 @@ msgid "debug" msgstr "déboguer" msgid "trace" -msgstr "tracer" +msgstr "tracé" msgid "Host Setting" msgstr "Paramètres de l'hôte" @@ -5453,22 +5523,22 @@ msgid "QA host: api-qa.bambu-lab.com/v1" msgstr "Hôte AQ : api-qa.bambu-lab.com/v1" msgid "PRE host: api-pre.bambu-lab.com/v1" -msgstr "Hôte PRE : api-pre.bambu-lab.com/v1" +msgstr "Hébergeur PRE : api-pre.bambu-lab.com/v1" msgid "Product host" msgstr "Hôte du produit" msgid "debug save button" -msgstr "bouton d'enregistrement du débogage" +msgstr "bouton d'enregistrement de débogage" msgid "save debug settings" -msgstr "enregistrer les paramètres de déboggage" +msgstr "enregistrer les paramètres de débogage" msgid "DEBUG settings have saved successfully!" -msgstr "Les paramètres DEBUG ont été enregistrés avec succès !" +msgstr "Les paramètres DEBUG ont été enregistrés avec succès !" msgid "Switch cloud environment, Please login again!" -msgstr "Changement d'environnement cloud, veuillez vous reconnecter !" +msgstr "L'environnement Cloud a changé, veuillez vous reconnecter !" msgid "System presets" msgstr "Préréglages système" @@ -5498,28 +5568,28 @@ msgid "Project-inside presets" msgstr "Préréglages intégrés au projet" msgid "Add/Remove filaments" -msgstr "Ajouter/Supprimer des filaments" +msgstr "Ajouter/Supprimer filament" msgid "Add/Remove materials" msgstr "Ajouter/Supprimer des matériaux" msgid "Select/Remove printers(system presets)" -msgstr "" +msgstr "Sélectionner/supprimer des imprimantes (préréglages du système)" msgid "Create printer" -msgstr "" +msgstr "Créer une imprimante" msgid "Incompatible" msgstr "Incompatible" msgid "The selected preset is null!" -msgstr "Le préréglage sélectionné est vide !" +msgstr "Le préréglage sélectionné est invalide !" msgid "Plate name" -msgstr "Nom du plateau" +msgstr "Nom de la plaque" msgid "Same as Global Print Sequence" -msgstr "Identique à la séquence d’impression globale" +msgstr "Identique à la séquence d'impression globale" msgid "Print sequence" msgstr "Séquence d'impression" @@ -5528,39 +5598,39 @@ msgid "Customize" msgstr "Personnaliser" msgid "First layer filament sequence" -msgstr "Séquence du filament de la première couche" +msgstr "Séquence d’impression de la première couche" msgid "Same as Global Plate Type" msgstr "Identique au type de plaque général" msgid "Same as Global Bed Type" -msgstr "Identique au type de plateau par défaut" +msgstr "Identique au type de plateau général" msgid "By Layer" -msgstr "Par couche" +msgstr "Par Couche" msgid "By Object" -msgstr "Par objet" +msgstr "Par Objet" msgid "Accept" msgstr "Accepter" msgid "Log Out" -msgstr "Se déconnecter" +msgstr "Déconnexion" msgid "Slice all plate to obtain time and filament estimation" msgstr "" -"Découper tous les plateaux pour obtenir une estimation de la durée et du " +"Tranchez toutes les couches pour obtenir une estimation du temps et du " "filament" msgid "Packing project data into 3mf file" msgstr "Compression des données du projet dans un fichier 3mf" msgid "Uploading 3mf" -msgstr "Téléchargement 3mf" +msgstr "Téléversement 3mf" msgid "Jump to model publish web page" -msgstr "Accéder à la page Web de publication de modèles" +msgstr "Accéder à la page internet de publication des modèles" msgid "Note: The preparation may takes several minutes. Please be patiant." msgstr "" @@ -5573,13 +5643,13 @@ msgid "Publish was cancelled" msgstr "La publication a été annulée" msgid "Slicing Plate 1" -msgstr "Plateau découpé 1" +msgstr "Trancher Plaque 1" msgid "Packing data to 3mf" -msgstr "Compression des données vers le fichier 3mf" +msgstr "Collecte des données 3mf" msgid "Jump to webpage" -msgstr "Aller à la page Web" +msgstr "Ouvrir la page internet" #, c-format, boost-format msgid "Save %s as" @@ -5588,11 +5658,11 @@ msgstr "Enregistrer %s sous" msgid "User Preset" msgstr "Préréglage utilisateur" -msgid "Project Inside Preset" -msgstr "Préréglages intégrés au projet" +msgid "Preset Inside Project" +msgstr "Projeter à l'intérieur du préréglage" msgid "Name is invalid;" -msgstr "Le nom n'est pas valide;" +msgstr "Le nom n'est pas valide ;" msgid "illegal characters:" msgstr "caractères illégaux :" @@ -5629,7 +5699,7 @@ msgid "The name is not allowed to end with space character." msgstr "Le nom ne doit pas se terminer par un espace." msgid "The name cannot be the same as a preset alias name." -msgstr "Le nom ne peut pas être identique à un nom d'alias prédéfini." +msgstr "Le nom ne peut pas être le même qu'un nom d'alias prédéfini." msgid "Save preset" msgstr "Enregistrer le préréglage" @@ -5650,15 +5720,15 @@ msgstr "" #, boost-format msgid "For \"%1%\", change \"%2%\" to \"%3%\" " -msgstr "Pour \"%1%\", remplacer \"%2%\" par \"%3%\" " +msgstr "Pour \"%1%\", remplacez \"%2%\" par \"%3%\" " #, boost-format msgid "For \"%1%\", add \"%2%\" as a new preset" -msgstr "Pour \"%1%\", ajouter \"%2%\" comme nouveau préréglage" +msgstr "Pour \"%1%\", ajoutez \"%2%\" comme nouveau préréglage" #, boost-format msgid "Simply switch to \"%1%\"" -msgstr "Basculer simplement vers \"%1%\"" +msgstr "Passez simplement à \"%1%\"" msgid "Task canceled" msgstr "Tâche annulée" @@ -5666,11 +5736,14 @@ msgstr "Tâche annulée" msgid "(LAN)" msgstr "(LAN)" +msgid "Search" +msgstr "Rechercher" + msgid "My Device" -msgstr "Mon Imprimante" +msgstr "Mon appareil" msgid "Other Device" -msgstr "Autre Imprimante" +msgstr "Autre appareil" msgid "Online" msgstr "En ligne" @@ -5679,7 +5752,7 @@ msgid "Input access code" msgstr "Saisir le code d'accès" msgid "Can't find my devices?" -msgstr "Aucune imprimante trouvée ?" +msgstr "Vous ne trouvez pas d'appareils ?" msgid "Log out successful." msgstr "Déconnexion réussie." @@ -5688,40 +5761,40 @@ msgid "Offline" msgstr "Hors ligne" msgid "Busy" -msgstr "Occupée" +msgstr "Occupé" msgid "Bambu Cool Plate" -msgstr "Bambu Cool Plate" +msgstr "Plaque Bambu Cool Plate" msgid "PLA Plate" msgstr "Plaque PLA" -msgid "Bamabu Engineering Plate" +msgid "Bambu Engineering Plate" msgstr "Bambu Engineering Plate" -msgid "Bamabu Smooth PEI Plate" -msgstr "" +msgid "Bambu Smooth PEI Plate" +msgstr "Bambu Smooth PEI Plate" msgid "High temperature Plate" -msgstr "" +msgstr "Bambu High Temperature Plate" -msgid "Bamabu Textured PEI Plate" -msgstr "" +msgid "Bambu Textured PEI Plate" +msgstr "Bambu Textured PEI Plate" msgid "Send print job to" -msgstr "Envoi de la tâche d'impression" +msgstr "Envoyer le travail d'impression à" msgid "Refresh" msgstr "Actualiser" msgid "Bed Leveling" -msgstr "Nivellement" +msgstr "Mise à niveau du lit" msgid "Flow Dynamics Calibration" -msgstr "Étalonnage de la dynamique des flux" +msgstr "Calibration du débit" msgid "Click here if you can't connect to the printer" -msgstr "Cliquez ici si vous ne pouvez pas vous connecter à l'imprimante" +msgstr "Connexion impossible à l’imprimante" msgid "send completed" msgstr "envoi terminé" @@ -5734,96 +5807,97 @@ msgstr "La connexion locale de l'imprimante a échoué, veuillez réessayer." msgid "No login account, only printers in LAN mode are displayed" msgstr "" -"Aucun compte de connexion, seules les imprimantes en mode LAN sont affichées" +"Pas de connexion au cloud, seules les imprimantes en mode LAN sont affichées" msgid "Connecting to server" msgstr "Connexion au serveur" msgid "Synchronizing device information" -msgstr "Synchronisation des informations de l’imprimante" +msgstr "Synchronisation des informations sur l'appareil" msgid "Synchronizing device information time out" -msgstr "" -"Expiration du délai de synchronisation des informations de l’imprimante" +msgstr "Expiration du délai de synchronisation des informations sur l'appareil" msgid "Cannot send the print job when the printer is updating firmware" msgstr "" -"Impossible d'envoyer la tâche d'impression lorsque l'imprimante met à jour " -"le firmware" +"Impossible d'envoyer une tâche d'impression pendant la mise à jour du " +"firmware de l'imprimante" msgid "" "The printer is executing instructions. Please restart printing after it ends" msgstr "" "L'imprimante exécute des instructions. Veuillez recommencer l'impression " -"après la fin de l'exécution" +"après la fin de l'exécution." msgid "The printer is busy on other print job" -msgstr "L'imprimante est occupée par une autre tâche d'impression" +msgstr "L'imprimante est occupée par un autre travail d'impression." #, c-format, boost-format msgid "" "Filament %s exceeds the number of AMS slots. Please update the printer " "firmware to support AMS slot assignment." msgstr "" -"Le filament %s dépasse le nombre d'emplacements de l'AMS. Veuillez mettre à " -"jour le firmware de l'imprimante pour prendre en charge l'affectation des " -"emplacements dans l'AMS." +"Le filament %s dépasse le nombre d'emplacements AMS. Mettez à jour le " +"firmware de l'imprimante pour qu'il prenne en charge l'attribution des " +"emplacements AMS." msgid "" "Filament exceeds the number of AMS slots. Please update the printer firmware " "to support AMS slot assignment." msgstr "" -"Le filament dépasse le nombre d'emplacements de l'AMS. Veuillez mettre à " -"jour le firmware de l'imprimante pour prendre en charge l'affectation des " -"emplacements dans l'AMS." +"Le nombre de filaments dépasse le nombre d'emplacements AMS. Mettez à jour " +"le firmware de l'imprimante pour qu'il prenne en charge l'attribution des " +"emplacements AMS." msgid "" "Filaments to AMS slots mappings have been established. You can click a " "filament above to change its mapping AMS slot" msgstr "" "L'affectation des filaments aux emplacements de l'AMS a été réalisée. Vous " -"pouvez cliquer sur un filament ci-dessus pour modifier son emplacement " -"correspondant à celui dans l'AMS" +"pouvez cliquer sur un filament ci-dessus pour modifier sa correspondance " +"avec l'emplacement AMS." msgid "" "Please click each filament above to specify its mapping AMS slot before " "sending the print job" msgstr "" "Veuillez cliquer sur chaque filament ci-dessus pour indiquer son emplacement " -"dans l'AMS avant d'envoyer la tâche d'impression" +"AMS avant d'envoyer la tâche d'impression." #, c-format, boost-format msgid "" "Filament %s does not match the filament in AMS slot %s. Please update the " "printer firmware to support AMS slot assignment." msgstr "" -"Le filament %s ne correspond pas au filament dans l'emplacement %s de " -"l'AMS . Veuillez mettre à jour le firmware de l'imprimante pour prendre en " -"charge l'affectation des emplacements dans l'AMS." +"Le filament %s ne correspond pas au filament de l'emplacement AMS %s. " +"Veuillez mettre à jour le firmware de l'imprimante pour qu'il prenne en " +"charge l'attribution des emplacements AMS." msgid "" "Filament does not match the filament in AMS slot. Please update the printer " "firmware to support AMS slot assignment." msgstr "" -"Le filament ne correspond pas au filament dans l'emplacement de l'AMS . " -"Veuillez mettre à jour le firmware de l'imprimante pour prendre en charge " -"l'affectation des emplacements dans l'AMS." +"Le filament ne correspond pas au filament du slot AMS. Mettez à jour le " +"firmware de l'imprimante pour qu'il prenne en charge l'attribution des " +"emplacements AMS." msgid "" "The printer firmware only supports sequential mapping of filament => AMS " "slot." msgstr "" -"Le firmware de l'imprimante ne prend en charge que l’affectation " -"séquentielle du filament => emplacement AMS." +"Le firmware de l’imprimante ne prend en charge que le mappage séquentiel du " +"filament => emplacement AMS." msgid "An SD card needs to be inserted before printing." msgstr "Une carte SD doit être insérée avant l'impression." msgid "The selected printer is incompatible with the chosen printer presets." msgstr "" +"L’imprimante sélectionnée est incompatible avec les préréglages d’imprimante " +"choisis." msgid "An SD card needs to be inserted to record timelapse." -msgstr "Une carte SD doit être insérée pour enregistrer le Timelapse." +msgstr "Une carte SD doit être insérée pour enregistrer un timelapse." msgid "" "Cannot send the print job to a printer whose firmware is required to get " @@ -5833,20 +5907,24 @@ msgstr "" "doit être mis à jour." msgid "Cannot send the print job for empty plate" -msgstr "Impossible d'envoyer la tâche d'impression d'un plateau vide" +msgstr "Impossible d'envoyer une tâche d'impression d'un plateau vide." msgid "This printer does not support printing all plates" msgstr "" -"Cette imprimante ne prend pas en charge l’impression de toutes les plateaux" +"Cette imprimante ne prend pas en charge l'impression de toutes les plaques" msgid "" "When enable spiral vase mode, machines with I3 structure will not generate " "timelapse videos." msgstr "" +"Lorsque vous activez le mode vase, les machines avec une structure I3 ne " +"généreront pas de vidéos timelapse." msgid "" "Timelapse is not supported because Print sequence is set to \"By object\"." msgstr "" +"La fonction Timelapse n'est pas prise en charge car la séquence d'impression " +"est réglée sur \"Par objet\"." msgid "Errors" msgstr "Erreurs" @@ -5859,60 +5937,61 @@ msgid "" "currently selected printer. It is recommended that you use the same printer " "type for slicing." msgstr "" -"Le type d'imprimante utilisé pour générer le G-code n'est pas le même que " -"l'imprimante physique actuellement sélectionnée. Il est recommandé " -"d’utiliser le même type d’imprimante pour le découpage." +"Le type d'imprimante sélectionné lors de la génération du G-Code n'est pas " +"cohérent avec l'imprimante actuellement sélectionnée. Il est recommandé " +"d'utiliser le même type d'imprimante pour le tranchage." msgid "" "There are some unknown filaments in the AMS mappings. Please check whether " "they are the required filaments. If they are okay, press \"Confirm\" to " "start printing." msgstr "" -"Il y a des filaments inconnus dans les affectations de l'AMS. Veuillez " -"vérifier s'il s'agit des filaments requis. S'ils sont corrects, appuyez sur " -"\"Confirmer\" pour lancer l'impression." +"Il y a quelques filaments inconnus dans les association avec l'AMS. Veuillez " +"vérifier s'il s'agit des filaments nécessaires. S'ils sont corrects, cliquez " +"sur \"Confirmer\" pour lancer l'impression." #, c-format, boost-format msgid "nozzle in preset: %s %s" -msgstr "" +msgstr "buse dans le préréglage : %s %s" #, c-format, boost-format msgid "nozzle memorized: %.1f %s" -msgstr "" +msgstr "buse mémorisée : %.1f %s" msgid "" "Your nozzle diameter in preset is not consistent with memorized nozzle " "diameter. Did you change your nozzle lately?" msgstr "" +"Le diamètre de la buse dans le préréglage ne correspond pas au diamètre de " +"la buse mémorisé. Avez-vous changé de buse récemment ?" #, c-format, boost-format msgid "*Printing %s material with %s may cause nozzle damage" -msgstr "" +msgstr "*L’impression du matériau %s avec %s peut endommager la buse." msgid "" "Please click the confirm button if you still want to proceed with printing." msgstr "" -"Veuillez cliquer sur le bouton de confirmation si vous souhaitez continuer " -"l’impression." +"Cliquez sur le bouton de confirmation si vous souhaitez continuer à imprimer." msgid "Hardened Steel" -msgstr "" +msgstr "Acier trempé" msgid "Stainless Steel" -msgstr "" +msgstr "Acier inoxydable" msgid "" "Connecting to the printer. Unable to cancel during the connection process." msgstr "" -"Connexion à l'imprimante. Impossible d'annuler pendant le processus de " +"Connexion à l’imprimante. Impossible d’annuler pendant le processus de " "connexion." msgid "Preparing print job" -msgstr "Préparation de la tâche d'impression" +msgstr "Préparation du travail d'impression" msgid "Abnormal print file data. Please slice again" msgstr "" -"Données de fichier d'impression anormales. Veuillez redécouper le fichier" +"Données de fichier d'impression anormales. Veuillez retrancher le fichier." msgid "The name length exceeds the limit." msgstr "La longueur du nom dépasse la limite." @@ -5921,30 +6000,39 @@ msgid "" "Caution to use! Flow calibration on Textured PEI Plate may fail due to the " "scattered surface." msgstr "" +"Attention à l’utilisation ! La calibration du débit sur le plateau Bambu " +"Dual-Sided Textured PEI peut échouer en raison de la surface texturée." msgid "Automatic flow calibration using Micro Lidar" -msgstr "Calibrage automatique du débit à l'aide d'un micro-lidar" +msgstr "Calibration automatique du débit à l’aide du Micro-Lidar" msgid "Modifying the device name" -msgstr "Modification du nom de l’imprimante" +msgstr "Modification du nom de l'appareil" msgid "Send to Printer SD card" -msgstr "Envoi sur la carte SD de l'imprimante" +msgstr "Envoyer à la carte SD de l'imprimante" msgid "Cannot send the print task when the upgrade is in progress" msgstr "" -"Impossible d'envoyer la tâche d'impression lorsque la mise à jour est en " -"cours" +"Impossible d'envoyer la tâche d'impression lorsque la mise à niveau est en " +"cours." msgid "An SD card needs to be inserted before send to printer SD card." -msgstr "Une carte SD doit être insérée avant l'envoi à l'imprimante." +msgstr "" +"Il est nécessaire d'insérer une carte MicroSD avant d'envoyer les données " +"vers l'imprimante." msgid "The printer is required to be in the same LAN as Orca Slicer." -msgstr "L'imprimante doit se trouver sur le même réseau local que Orca Slicer." +msgstr "L'imprimante doit être sur le même réseau local que OrcaSlicer." msgid "The printer does not support sending to printer SD card." -msgstr "" -"L'imprimante ne prend pas en charge l'envoi vers la carte SD de l'imprimante." +msgstr "L'imprimante ne prend pas en charge l'envoi vers la carte SD." + +msgid "Slice ok." +msgstr "Tranchage terminé." + +msgid "View all Daily tips" +msgstr "Voir toutes les Astuces quotidiennes" msgid "Failed to create socket" msgstr "Échec de la création du socket" @@ -5974,11 +6062,11 @@ msgid "Unknown Failure" msgstr "Erreur inconnue" msgid "Log in printer" -msgstr "Connecter l'imprimante" +msgstr "Connectez-vous à l'imprimante" msgid "Would you like to log in this printer with current account?" msgstr "" -"Souhaitez-vous vous connecter à cette imprimante avec le compte actuel ?" +"Souhaitez-vous vous connecter à cette imprimante avec un compte courant ?" msgid "Check the reason" msgstr "Vérifier le motif" @@ -6062,7 +6150,7 @@ msgid "Would you like to log out the printer?" msgstr "Souhaitez-vous déconnecter l'imprimante ?" msgid "Please log in first." -msgstr "Veuillez vous connecter d’abord." +msgstr "S'il vous plait Connectez-vous d'abord." msgid "There was a problem connecting to the printer. Please try again." msgstr "" @@ -6075,73 +6163,65 @@ msgstr "Échec de la déconnexion." #. TRN "Save current Settings" #, c-format, boost-format msgid "Save current %s" -msgstr "Enregistrer le %s actuel" +msgstr "Enregistrer l'état actuel %s" msgid "Delete this preset" msgstr "Supprimer ce préréglage" msgid "Search in preset" -msgstr "Rechercher dans les préréglages" +msgstr "Rechercher dans le préréglage" msgid "Click to reset all settings to the last saved preset." msgstr "" -"Cliquez pour réinitialiser tous les paramètres au dernier préréglage " -"enregistré." +"Cliquez pour rétablir tous les paramètres au dernier préréglage enregistré." msgid "" "Prime tower is required for smooth timeplase. There may be flaws on the " "model without prime tower. Are you sure you want to disable prime tower?" msgstr "" -"La tour de purge est requise pour un Timelapse fluide. Sans celle-ci, il " -"peut y avoir des défauts sur le modèle. Voulez-vous vraiment désactiver la " -"tour de purge ?" +"Une tour de nettoyage est requise pour le mode Timeplase fluide. Il peut y " +"avoir des défauts sur le modèle sans tour de nettoyage. Êtes-vous sûr de " +"vouloir la désactiver ?" msgid "" "Prime tower is required for smooth timelapse. There may be flaws on the " "model without prime tower. Do you want to enable prime tower?" msgstr "" -"La tour de purge est requise pour un Timelapse fluide. Sans celle-ci, il " -"peut y avoir des défauts sur le modèle. Voulez-vous activer la tour de " -"purge ?" +"Une tour de nettoyage est requise pour un mode timelapse fluide. Il peut y " +"avoir des défauts sur le modèle sans tour de nettoyage. Voulez-vous activer " +"la désactiver?" msgid "Still print by object?" -msgstr "" +msgstr "Vous imprimez toujours par objet ?" msgid "" "We have added an experimental style \"Tree Slim\" that features smaller " "support volume but weaker strength.\n" "We recommend using it with: 0 interface layers, 0 top distance, 2 walls." msgstr "" -"Nous avons ajouté un style expérimental \"Arborescents Fins\" qui présente " -"un volume de supports\n" -"plus petit mais une résistance plus faible.\n" -"\n" -"Nous recommandons de l’utiliser avec :\n" -"\n" -"Couches des interfaces supérieures : 0\n" -"Distance Z supérieure : 0\n" -"Nombre de parois des branches : 2" +"Nous avons ajouté un style expérimental « Arborescent Fin » qui offre un " +"volume de support plus petit mais également une résistance plus faible.\n" +"Nous recommandons de l'utiliser avec : 0 couches d'interface, 0 distance " +"supérieure, 2 murs." msgid "" "Change these settings automatically? \n" "Yes - Change these settings automatically\n" "No - Do not change these settings for me" msgstr "" -"Modifier ces paramètres automatiquement ?\n" -"Oui - Modifier ces paramètres automatiquement\n" -"Non - Ne pas modifier ces paramètres" +"Vous souhaitez modifier ces paramètres automatiquement ? \n" +"Oui - Modifiez ces paramètres automatiquement\n" +"Non - Ne modifiez pas ces paramètres pour moi" msgid "" "For \"Tree Strong\" and \"Tree Hybrid\" styles, we recommend the following " "settings: at least 2 interface layers, at least 0.1mm top z distance or " "using support materials on interface." msgstr "" -"Pour les styles \"Arborescents Solides\" et \"Arborescents Hybrides\", nous " -"recommandons les paramètres suivants :\n" -"\n" -"Couches des interfaces supérieures : 2\n" -"Distance Z supérieure d'au moins 0.1 mm ou l'utilisation de filament pour " -"supports pour l'interface" +"Pour les styles \"Arborescent fort\" et \"Arborescent Hybride\", nous " +"recommandons les réglages suivants : au moins 2 couches d'interface, au " +"moins 0,1 mm de distance entre le haut et le z ou l'utilisation de matériaux " +"de support sur l'interface." msgid "" "When using support material for the support interface, We recommend the " @@ -6149,22 +6229,38 @@ msgid "" "0 top z distance, 0 interface spacing, concentric pattern and disable " "independent support layer height" msgstr "" -"Lorsque vous utilisez du filament pour supports, nous vous recommandons les " -"paramètres suivants :\n" -"Distance Z supérieure à 0, un espacement de l’interface supérieure à 0, un " -"motif d’interface Concentrique et la désactivation de la hauteur de couche " -"indépendante des supports" +"Lorsque vous utilisez du matériel de support pour l'interface de support, " +"nous vous recommandons d'utiliser les paramètres suivants :\n" +"Distance Z supérieure nulle, espacement d'interface nul, motif concentrique " +"et désactivation de la hauteur indépendante de la couche de support" + +msgid "" +"Layer height exceeds the limit in Printer Settings -> Extruder -> Layer " +"height limits ,this may cause printing quality issues." +msgstr "" +"La hauteur de la couche dépasse la limite fixée dans Paramètres de " +"l’imprimante -> Extrudeur -> Limites de la hauteur de la couche, ce qui peut " +"entraîner des problèmes de qualité d’impression." + +msgid "Adjust to the set range automatically? \n" +msgstr "S’ajuster automatiquement à la plage définie ? \n" + +msgid "Adjust" +msgstr "Ajuster" + +msgid "Ignore" +msgstr "Ignorer" msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" -"Lors de l'enregistrement d'un Timelapse sans tête d'outil, il est recommandé " -"d'ajouter une \"Tour d’essuyage Timelapse\"\n" -"en cliquant avec le bouton droit sur une zone vide du plateau et en " -"choisissant \"Ajouter une primitive\" -> \"Tour d’essuyage Timelapse\"." +"Lorsque vous enregistrez un timelapse sans tête d’outil, il est recommandé " +"d’ajouter une \"Tour de nettoyage timelapse\".\n" +"en faisant un clic droit sur un emplacement vide sur le plateau et en " +"choisissant \"Ajouter Primitive\"-> \"Tour de nettoyage Timelapse\"." msgid "Line width" msgstr "Largeur de ligne" @@ -6176,13 +6272,22 @@ msgid "Precision" msgstr "Précision" msgid "Wall generator" -msgstr "Générateur de paroi" +msgstr "Générateur de mur" + +msgid "Walls and surfaces" +msgstr "Murs et surfaces" + +msgid "Bridging" +msgstr "Ponts" + +msgid "Overhangs" +msgstr "Surplombs" msgid "Walls" msgstr "Parois" msgid "Top/bottom shells" -msgstr "Coques supérieures/inférieures" +msgstr "Coquilles supérieures/inférieures" msgid "Initial layer speed" msgstr "Vitesse de couche initiale" @@ -6191,29 +6296,29 @@ msgid "Other layers speed" msgstr "Autres couches" msgid "Overhang speed" -msgstr "Surplombs" +msgstr "Vitesse de surplomb" msgid "" "This is the speed for various overhang degrees. Overhang degrees are " "expressed as a percentage of line width. 0 speed means no slowing down for " "the overhang degree range and wall speed is used" msgstr "" -"Il s'agit de la vitesse pour différents degrés de surplombs. Les degrés de " -"surplombs sont exprimés en pourcentage de la largeur de la ligne. Une " -"vitesse à 0 signifie qu'il n'y a pas de ralentissement pour la plage de " -"degrés des surplombs et que la vitesse des parois est utilisée" +"Il s'agit de la vitesse pour différents degrés de surplomb. Les degrés de " +"surplomb sont exprimés en pourcentage de la largeur de la ligne. 0 vitesse " +"signifie qu'il n'y a pas de ralentissement pour la plage de degrés du " +"surplomb et que la vitesse par défaut des périmètres est utilisée" msgid "Bridge" -msgstr "Ponts" +msgstr "Pont" msgid "Set speed for external and internal bridges" -msgstr "Régler la vitesse pour les ponts externes et internes" +msgstr "Définir la vitesse pour les ponts externes et internes" msgid "Travel speed" -msgstr "Vitesse de déplacements" +msgstr "Vitesse de déplacement" msgid "Acceleration" -msgstr "Accélérations" +msgstr "Accélération" msgid "Jerk(XY)" msgstr "Jerk (X-Y)" @@ -6222,25 +6327,25 @@ msgid "Raft" msgstr "Radeau" msgid "Support filament" -msgstr "Filament pour supports" +msgstr "Filament de support" msgid "Tree supports" -msgstr "Supports en arbres" +msgstr "Supports arborescents" msgid "Prime tower" -msgstr "Tour de purge" +msgstr "Tour de nettoyage" msgid "Special mode" -msgstr "Modes spéciaux" +msgstr "Mode spécial" msgid "G-code output" -msgstr "G-code" +msgstr "Sortie G-code" msgid "Post-processing Scripts" msgstr "Scripts de post-traitement" msgid "Notes" -msgstr "" +msgstr "Notes" msgid "Frequent" msgstr "Fréquent" @@ -6255,36 +6360,36 @@ msgid_plural "" "Please remove them, or will beat G-code visualization and printing time " "estimation." msgstr[0] "" -"La ligne suivante %s contient des mots clés réservés.\n" -"Veuillez les supprimer, ou cela gênera la visualisation du G-code et " -"l'estimation de la durée d'impression." +"La ligne suivante %s contient des mots clés réservés. Veuillez le supprimer, " +"ou il battra la visualisation du code G et l'estimation du temps " +"d'impression." msgstr[1] "" -"Les lignes suivantes %s contiennent des mots clés réservés.\n" -"Veuillez les supprimer, ou cela gênera la visualisation du G-code et " -"l'estimation de la durée d'impression." +"La ligne suivante %s contient des mots clés réservés. Veuillez le supprimer, " +"ou il battra la visualisation du code G et l'estimation du temps " +"d'impression." msgid "Reserved keywords found" msgstr "Mots clés réservés trouvés" msgid "Setting Overrides" -msgstr "Réglages forcés" +msgstr "Forçage des réglages" msgid "Retraction" msgstr "Rétraction" msgid "Basic information" -msgstr "Informations générales" +msgstr "Informations de base" msgid "Recommended nozzle temperature" msgstr "Température de buse recommandée" msgid "Recommended nozzle temperature range of this filament. 0 means no set" msgstr "" -"Plage de température de buse recommandée pour ce filament. Une valeur à 0 " -"signifie non définie" +"Plage de température de buse recommandée pour ce filament. 0 signifie pas " +"d'ensemble" msgid "Print chamber temperature" -msgstr "Température de la chambre d'impression" +msgstr "Température de la chambre d’impression" msgid "Print temperature" msgstr "Température d'impression" @@ -6296,46 +6401,49 @@ msgid "Nozzle temperature when printing" msgstr "Température de la buse lors de l'impression" msgid "Cool plate" -msgstr "Bambu Cool Plate" +msgstr "Plaque Cool plate" msgid "" "Bed temperature when cool plate is installed. Value 0 means the filament " "does not support to print on the Cool Plate" msgstr "" -"Température du plateau lorsque le plateau Bambu Cool Plate est installé. Une " -"valeur à 0 signifie que le filament ne prend pas en charge l'impression sur " -"le plateau Bambu Cool Plate" +"Il s'agit de la température du plateau lorsque le plateau froid (\"Cool plate" +"\") est installé. Une valeur à 0 signifie que ce filament ne peut pas être " +"imprimé sur le plateau froid." msgid "Engineering plate" -msgstr "Bambu Engineering Plate" +msgstr "Plaque Engineering" msgid "" "Bed temperature when engineering plate is installed. Value 0 means the " "filament does not support to print on the Engineering Plate" msgstr "" -"Température du plateau lorsque le plateau Bambu Engineering Plate est " -"installé. Une valeur à 0 signifie que le filament ne prend pas en charge " -"l'impression sur le plateau Bambu Engineering Plate" +"Il s'agit de la température du plateau lorsque le plaque Engineering est " +"installée. Une valeur à 0 signifie que ce filament ne peut pas être imprimé " +"sur le plateau Engineering." msgid "Smooth PEI Plate / High Temp Plate" -msgstr "Plaque PEI lisse / Plaque haute température" +msgstr "Bambu Smooth PEI Plate / High Temp Plate" msgid "" "Bed temperature when Smooth PEI Plate/High temperature plate is installed. " "Value 0 means the filament does not support to print on the Smooth PEI Plate/" "High Temp Plate" msgstr "" +"Température du plateau lorsque le plateau Bambu Smooth PEI Plate/High " +"Temperature Plate est installé. Une valeur à 0 signifie que le filament ne " +"prend pas en charge l'impression sur le plateau Bambu Smooth PEI Plate/High " +"Temperature Plate" msgid "Textured PEI Plate" -msgstr "Bambu Dual-Sided Textured PEI Plate" +msgstr "Plaque PEI texturée" msgid "" "Bed temperature when Textured PEI Plate is installed. Value 0 means the " "filament does not support to print on the Textured PEI Plate" msgstr "" -"Température du plateau lorsque le plateau Bambu Dual-Sided Textured PEI " -"Plate est installé. Une valeur à 0 signifie que le filament ne prend pas en " -"charge l'impression sur le plateau Bambu Dual-Sided Textured PEI Plate" +"Température du lit lorsque la plaque PEI texturée est installée. La valeur 0 " +"signifie que le filament n'est pas supporté par la plaque PEI texturée" msgid "Volumetric speed limitation" msgstr "Limitation de vitesse volumétrique" @@ -6344,13 +6452,13 @@ msgid "Cooling" msgstr "Refroidissement" msgid "Cooling for specific layer" -msgstr "Refroidissement des premières couches" +msgstr "Refroidissement pour une couche spécifique" msgid "Part cooling fan" -msgstr "Ventilateur de refroidissement des pièces" +msgstr "Ventilateur de refroidissement partiel" msgid "Min fan speed threshold" -msgstr "Seuil de vitesse minimale" +msgstr "Seuil de vitesse mini du ventilateur" msgid "" "Part cooling fan speed will start to run at min speed when the estimated " @@ -6358,55 +6466,58 @@ msgid "" "shorter than threshold, fan speed is interpolated between the minimum and " "maximum fan speed according to layer printing time" msgstr "" -"Le ventilateur de refroidissement commencera à fonctionner à la vitesse " -"minimale lorsque la durée de couche estimée n'est pas supérieure à la valeur " -"définie. Lorsque la durée de couche est inférieure au seuil, la vitesse du " -"ventilateur est interpolée entre la vitesse minimale et maximale du " -"ventilateur en fonction de la durée d'impression de la couche" +"La vitesse du ventilateur de refroidissement partiel commencera à " +"fonctionner à la vitesse minimale lorsque le temps de couche estimé n'est " +"pas supérieur au temps de couche dans le réglage. Lorsque le temps de couche " +"est inférieur au seuil, la vitesse du ventilateur est interpolée entre la " +"vitesse minimale et maximale du ventilateur en fonction du temps " +"d'impression de la couche" msgid "Max fan speed threshold" -msgstr "Seuil de vitesse maximale" +msgstr "Seuil de vitesse maximale du ventilateur" msgid "" "Part cooling fan speed will be max when the estimated layer time is shorter " "than the setting value" msgstr "" -"La vitesse du ventilateur de refroidissement sera maximale lorsque la durée " -"de couche estimée est plus courte que la valeur définie" +"La vitesse du ventilateur de refroidissement partiel sera maximale lorsque " +"le temps de couche estimé est plus court que la valeur de réglage" msgid "Auxiliary part cooling fan" -msgstr "Ventilateur de refroidissement auxiliaire" +msgstr "Ventilateur de refroidissement de la partie auxiliaire" msgid "Exhaust fan" -msgstr "Ventilateur d'extraction" +msgstr "Ventilateur d’extraction" msgid "During print" -msgstr "Pendant l'impression" +msgstr "Pendant l’impression" msgid "Complete print" -msgstr "Impression complète" +msgstr "Après l’impression" msgid "Filament start G-code" -msgstr "G-code de démarrage du filament" +msgstr "Code G de démarrage du filament" msgid "Filament end G-code" -msgstr "G-code de fin du filament" +msgstr "Code G de fin de filament" msgid "Multimaterial" -msgstr "Multimatériau" +msgstr "Multi-matériaux" msgid "Wipe tower parameters" -msgstr "Paramètres de la tour de nettoyage" +msgstr "Paramètres de la tour d’essuyage" msgid "Toolchange parameters with single extruder MM printers" msgstr "" "Paramètres de changement d'outil avec les imprimantes MM à extrudeur unique" msgid "Ramming settings" -msgstr "" +msgstr "Paramètres de pilonnage" msgid "Toolchange parameters with multi extruder MM printers" msgstr "" +"Paramètres de changement d'outil pour les imprimantes MM à extrudeurs " +"multiples" msgid "Printable space" msgstr "Espace imprimable" @@ -6418,43 +6529,43 @@ msgid "Fan speed-up time" msgstr "Durée d’accélération du ventilateur" msgid "Extruder Clearance" -msgstr "Tête d’impression" +msgstr "Dégagement de l'extrudeur" msgid "Accessory" msgstr "Accessoire" msgid "Machine gcode" -msgstr "G-code de l’imprimante" +msgstr "G-code de la machine" msgid "Machine start G-code" -msgstr "G-code de démarrage de l’imprimante" +msgstr "Code G de démarrage de la machine" msgid "Machine end G-code" -msgstr "G-code de fin de l’imprimante" +msgstr "Code G de fin de machine" msgid "Printing by object G-code" -msgstr "" +msgstr "Impression par objet G-code" msgid "Before layer change G-code" -msgstr "G-code avant le changement de couche" +msgstr "G-Code avant changement de couche" msgid "Layer change G-code" -msgstr "G-code de changement de couche" +msgstr "Code G de changement de couche" msgid "Time lapse G-code" -msgstr "G-code de Time lapse" +msgstr "G-code de Timelapse" msgid "Change filament G-code" -msgstr "G-code de changement de filament" +msgstr "Changer le code G du filament" msgid "Change extrusion role G-code" -msgstr "" +msgstr "G-code de changement du rôle de l’extrusion" msgid "Pause G-code" -msgstr "G-code de mise en pause" +msgstr "Mettre le code G en pause" msgid "Template Custom G-code" -msgstr "G-code personnalisé" +msgstr "Modèle G-code personnalisé" msgid "Motion ability" msgstr "Capacité de mouvement" @@ -6469,25 +6580,25 @@ msgid "Acceleration limitation" msgstr "Limitation d'accélération" msgid "Jerk limitation" -msgstr "Limitation du jerk" +msgstr "Limitation des secousses" msgid "Single extruder multimaterial setup" -msgstr "" +msgstr "Configuration multi-matériaux pour extrudeur unique" msgid "Wipe tower" -msgstr "Tour d'essuyage" +msgstr "Tour d’essuyage" msgid "Single extruder multimaterial parameters" -msgstr "" +msgstr "Paramètres multi-matériaux pour extrudeur unique" msgid "Layer height limits" msgstr "Limites de hauteur de couche" msgid "Lift Z Enforcement" -msgstr "" +msgstr "Exécution du décalage en Z" msgid "Retraction when switching material" -msgstr "Rétractions lors du changement de matériau" +msgstr "Rétraction lors du changement de matériau" msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" @@ -6497,7 +6608,7 @@ msgstr "" "L’option Essuyage n’est pas disponible lors de l’utilisation du mode " "Rétraction Firmware.\n" "\n" -"Voulez-vous désactiver cette option pour activer la Rétraction Firmware ?" +"Voulez-vous désactiver cette option pour activer la Rétraction Firmware ?" msgid "Firmware Retraction" msgstr "Rétraction Firmware" @@ -6510,34 +6621,48 @@ msgid "" "%d Filament Preset and %d Process Preset is attached to this printer. Those " "presets would be deleted if the printer is deleted." msgstr "" +"Le préréglage de filament %d et le préréglage de processus %d sont associés " +"à cette imprimante. Ces préréglages seront supprimés si l’imprimante est " +"supprimée." msgid "Presets inherited by other presets can not be deleted!" msgstr "" +"Les préréglages hérités d’autres préréglages ne peuvent pas être supprimés !" msgid "The following presets inherit this preset." msgid_plural "The following preset inherits this preset." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Les préréglages suivants héritent de ce préréglage." +msgstr[1] "Le préréglage suivant hérite de ce préréglage." #. TRN Remove/Delete #, boost-format msgid "%1% Preset" -msgstr "%1% préréglage" +msgstr "%1% Préréglage" msgid "Following preset will be deleted too." msgid_plural "Following presets will be deleted too." msgstr[0] "Le préréglage suivant sera également supprimé." msgstr[1] "Les préréglages suivants seront également supprimés." +msgid "" +"Are you sure to delete the selected preset? \n" +"If the preset corresponds to a filament currently in use on your printer, " +"please reset the filament information for that slot." +msgstr "" +"Êtes-vous sûr de vouloir supprimer le préréglage sélectionné ? \n" +"Si le préréglage correspond à un filament actuellement utilisé sur votre " +"imprimante, veuillez réinitialiser les informations sur le filament pour cet " +"emplacement." + #, boost-format msgid "Are you sure to %1% the selected preset?" msgstr "Êtes-vous sûr de %1% le préréglage sélectionné ?" msgid "All" -msgstr "Tout" +msgstr "Tous" msgid "Set" -msgstr "Définir" +msgstr "Appliquer" msgid "Click to reset current value and attach to the global value." msgstr "" @@ -6553,19 +6678,19 @@ msgid "Process Settings" msgstr "Paramètres de processus" msgid "Undef" -msgstr "Indéfini" +msgstr "Undef" msgid "Unsaved Changes" msgstr "Modifications non enregistrées" -msgid "Discard or Keep changes" +msgid "Transfer or discard changes" msgstr "Ignorer ou conserver les modifications" msgid "Old Value" msgstr "Ancienne valeur" msgid "New Value" -msgstr "Nouvelle valeur" +msgstr "Nouvelle Valeur" msgid "Transfer" msgstr "Transférer" @@ -6584,7 +6709,7 @@ msgid "All changes will not be saved" msgstr "Toutes les modifications ne seront pas enregistrées" msgid "All changes will be discarded." -msgstr "Toutes les modifications seront ignorées." +msgstr "Toutes les modifications seront rejetées." msgid "Save the selected options." msgstr "Enregistrer les options sélectionnées." @@ -6594,25 +6719,22 @@ msgstr "Conserver les options sélectionnées." msgid "Transfer the selected options to the newly selected preset." msgstr "" -"Transférer les options sélectionnées vers le préréglage nouvellement " +"Transférez les options sélectionnées vers le préréglage nouvellement " "sélectionné." #, boost-format msgid "" "Save the selected options to preset \n" "\"%1%\"." -msgstr "" -"Enregistrer les options sélectionnées vers le préréglage\n" -"\"%1%\"." +msgstr "Enregistrez les options sélectionnées dans le préréglage \"%1%\"." #, boost-format msgid "" "Transfer the selected options to the newly selected preset \n" "\"%1%\"." msgstr "" -"Transférer les options sélectionnées vers le préréglage nouvellement " -"sélectionné\n" -"\"%1%\"." +"Transférez les options sélectionnées vers le préréglage nouvellement " +"sélectionné \"%1%\"." #, boost-format msgid "Preset \"%1%\" contains the following unsaved changes:" @@ -6641,27 +6763,27 @@ msgid "" "Would you like to keep these changed settings (new value) after switching " "preset?" msgstr "" -"Vous avez modifié certains paramètres du préréglage \"%1%\".\n" -"Souhaitez-vous conserver ces paramètres modifiés (nouvelle valeur)\n" -"en basculant sur un autre préréglage ?" +"Vous avez modifié certains paramètres du préréglage \"%1%\". \n" +"Souhaitez-vous conserver ces paramètres modifiés (nouvelle valeur) après " +"avoir changé de préréglage ?" msgid "" "You have changed some preset settings. \n" "Would you like to keep these changed settings (new value) after switching " "preset?" msgstr "" -"Vous avez modifié certains paramètres prédéfinis.\n" -"Souhaitez-vous conserver ces paramètres modifiés (nouvelle valeur)\n" -"en basculant sur un autre préréglage ?" +"Vous avez modifié certains paramètres prédéfinis. \n" +"Souhaitez-vous conserver ces paramètres modifiés (nouvelle valeur) après " +"avoir changé de préréglage ?" msgid "Extruders count" -msgstr "Nombre d’extrudeurs" +msgstr "Nombre d'extrudeurs" msgid "General" msgstr "Général" msgid "Capabilities" -msgstr "Capacités" +msgstr "Fonctionnalités" msgid "Select presets to compare" msgstr "Sélectionnez les préréglages à comparer" @@ -6670,7 +6792,7 @@ msgid "Show all presets (including incompatible)" msgstr "Afficher tous les préréglages (y compris incompatibles)" msgid "Add File" -msgstr "Ajouter un fichier" +msgstr "Ajouter un Fichier" msgid "Set as cover" msgstr "Définir comme couverture" @@ -6683,10 +6805,10 @@ msgid "The name \"%1%\" already exists." msgstr "Le nom \"%1%\" existe déjà." msgid "Basic Info" -msgstr "Informations" +msgstr "Informations de base" msgid "Pictures" -msgstr "Photos" +msgstr "Des photos" msgid "Bill of Materials" msgstr "Nomenclature" @@ -6712,10 +6834,10 @@ msgstr "Mise à jour de la configuration" msgid "A new configuration package available, Do you want to install it?" msgstr "" -"Un nouveau package de configuration est disponible, Voulez-vous l'installer ?" +"Un nouveau package de configuration disponible, Voulez-vous l'installer ?" msgid "Description:" -msgstr "Description :" +msgstr "La description:" msgid "Configuration incompatible" msgstr "Configuration incompatible" @@ -6729,19 +6851,19 @@ msgid "" "The configuration package is incompatible with current application.\n" "%s will update the configuration package, Otherwise it won't be able to start" msgstr "" -"Le package de configuration est incompatible avec l'application actuelle.\n" -"%s mettra à jour le package de configuration, sinon il ne pourra pas démarrer" +"Le package de configuration est incompatible avec l'application actuelle. %s " +"mettra à jour le package de configuration, sinon il ne pourra pas démarrer" #, c-format, boost-format msgid "Exit %s" -msgstr "Quitter %s" +msgstr "Sortir de %s" msgid "the Configuration package is incompatible with current APP." msgstr "" "le package de configuration est incompatible avec l'application actuelle." msgid "Configuration updates" -msgstr "Mises à jour de configuration" +msgstr "Mises à jour de la configuration" msgid "No updates available." msgstr "Aucune mise à jour disponible." @@ -6750,7 +6872,7 @@ msgid "The configuration is up to date." msgstr "La configuration est à jour." msgid "Ramming customization" -msgstr "" +msgstr "Personnalisation du pilonnage" msgid "" "Ramming denotes the rapid extrusion just before a tool change in a single-" @@ -6763,60 +6885,61 @@ msgid "" "This is an expert-level setting, incorrect adjustment will likely lead to " "jams, extruder wheel grinding into filament etc." msgstr "" +"Le pilonnage désigne l’extrusion rapide juste avant un changement d’outil " +"sur une imprimante MM à extrudeur unique. Son but est de façonner " +"correctement l’extrémité du filament déchargé afin qu’il n’empêche pas " +"l’insertion du nouveau filament et puisse lui-même être réinséré plus tard. " +"Cette phase est importante et différents matériaux peuvent nécessiter " +"différentes vitesses d’extrusion pour obtenir la bonne forme. Pour cette " +"raison, les taux d’extrusion lors du pilonnage sont réglables.\n" +"\n" +"Il s’agit d’un réglage de niveau expert, un réglage incorrect entraînera " +"probablement des bourrages, des roues de l’extrudeur broyant le filament, " +"etc." msgid "Total ramming time" -msgstr "" +msgstr "Durée totale de pilonnage" msgid "s" msgstr "s" msgid "Total rammed volume" -msgstr "" +msgstr "Volume total de pilonnage" msgid "Ramming line width" -msgstr "" +msgstr "Largeur de ligne du pilonnage" msgid "Ramming line spacing" -msgstr "" +msgstr "Espacement des lignes du pilonnage" -msgid "Auto-Calc" -msgstr "Calcul Auto" - -msgid "Re-calculate" -msgstr "" +msgid "Recalculate" +msgstr "Recalculer" msgid "Flushing volumes for filament change" -msgstr "Volumes de purge - Changement de filament" +msgstr "Volumes de rinçage pour le changement de filament" msgid "" -"Studio would re-calculate your flushing volumes everytime the filaments " -"color changed. You could disable the auto-calculate in Bambu Studio > " -"Preferences" +"Orca recalculates your flushing volumes everytime the filament colors " +"change. You can change this behavior in Preferences." msgstr "" +"Orca recalcule vos volumes de purge à chaque fois que les couleurs des " +"filaments changent. Vous pouvez modifier ce comportement dans les " +"préférences." msgid "Flushing volume (mm³) for each filament pair." -msgstr "Volume de purge (mm³) pour chaque paire de filaments." +msgstr "Volume de rinçage (mm³) pour chaque paire de filaments." #, c-format, boost-format msgid "Suggestion: Flushing Volume in range [%d, %d]" -msgstr "Suggestion : Volume réel dans la plage [%d, %d]" +msgstr "Suggestion : Volume de rinçage dans la plage [%d, %d]." #, c-format, boost-format msgid "The multiplier should be in range [%.2f, %.2f]." -msgstr "Le multiplicateur doit être dans la plage [%.2f, %.2f]." +msgstr "Le multiplicateur doit être compris dans la plage [%.2f, %.2f]." msgid "Multiplier" msgstr "Multiplicateur" -msgid "unloaded" -msgstr "déchargé" - -msgid "loaded" -msgstr "chargé" - -msgid "Filament #" -msgstr "Filament #" - msgid "From" msgstr "De" @@ -6824,10 +6947,10 @@ msgid "To" msgstr "À" msgid "Bambu Network plug-in not detected." -msgstr "" +msgstr "Le plug-in Bambu Network n’a pas été détecté." msgid "Click here to download it." -msgstr "" +msgstr "Cliquez ici pour le télécharger." msgid "Login" msgstr "Connexion" @@ -6848,27 +6971,27 @@ msgstr "Liste des objets" msgid "Import geometry data from STL/STEP/3MF/OBJ/AMF files" msgstr "" -"Importer des données de géométrie à partir de fichiers STL/STEP/3MF/OBJ/AMF." +"Importez des données de géométrie à partir de fichiers STL/STEP/3MF/OBJ/AMF." msgid "⌘+Shift+G" -msgstr "⌘ + Shift + G" +msgstr "⌘+Maj+G" msgid "Ctrl+Shift+G" -msgstr "Ctrl + Shift + G" +msgstr "Ctrl+Maj+G" msgid "Copy to clipboard" msgstr "Copier dans le presse-papier" msgid "Paste from clipboard" -msgstr "Coller depuis le presse-papiers" +msgstr "Coller depuis le presse-papier" msgid "Show/Hide 3Dconnexion devices settings dialog" msgstr "" -"Afficher/Masquer la boîte de dialogue des paramètres des périphériques de " -"connexion 3D" +"Afficher/Masquer la boîte de dialogue des paramètres des périphériques " +"3Dconnexion" msgid "Switch table page" -msgstr "" +msgstr "Page du tableau de commutation" msgid "Show keyboard shortcuts list" msgstr "Afficher la liste des raccourcis clavier" @@ -6880,19 +7003,19 @@ msgid "Rotate View" msgstr "Rotation de la vue" msgid "Pan View" -msgstr "Vue panoramique" +msgstr "Déplacement de vue" msgid "Mouse wheel" -msgstr "Molette de la souris" +msgstr "Molette de souris" msgid "Zoom View" -msgstr "Vue zoomée" +msgstr "Vue agrandie" msgid "Shift+A" -msgstr "Shift + A" +msgstr "Maj+A" msgid "Shift+R" -msgstr "Shift + R" +msgstr "Maj+R" msgid "" "Auto orientates selected objects or all objects.If there are selected " @@ -6904,160 +7027,160 @@ msgstr "" "Sinon, il oriente tous les objets du disque actuel." msgid "Shift+Tab" -msgstr "Shift + Tab" +msgstr "Maj+Tab" msgid "Collapse/Expand the sidebar" -msgstr "Réduire/Agrandir la barre latérale" +msgstr "Réduire/développer la barre latérale" msgid "⌘+Any arrow" -msgstr "⌘ + N'importe quelle flèche" +msgstr "⌘+n'importe quelle flèche" msgid "Movement in camera space" msgstr "Mouvement dans l'espace de la caméra" msgid "⌥+Left mouse button" -msgstr "⌥ + Bouton gauche de la souris" +msgstr "⌥+Bouton gauche de la souris" msgid "Select a part" msgstr "Sélectionner une pièce" msgid "⌘+Left mouse button" -msgstr "⌘ + Bouton gauche de la souris" +msgstr "⌘+Bouton gauche de la souris" msgid "Select multiple objects" -msgstr "Sélectionner plusieurs objets" +msgstr "Sélectionnez tous les objets sur la plaque actuelle" msgid "Ctrl+Any arrow" msgstr "Ctrl+n'importe quelle flèche" msgid "Alt+Left mouse button" -msgstr "Alt + Bouton gauche de la souris" +msgstr "Alt+Bouton gauche de la souris" msgid "Ctrl+Left mouse button" -msgstr "Ctrl + Bouton gauche de la souris" +msgstr "Ctrl+Bouton gauche de la souris" msgid "Shift+Left mouse button" -msgstr "Maj + Bouton gauche de la souris" +msgstr "Maj+Bouton gauche de la souris" msgid "Select objects by rectangle" msgstr "Sélectionner les objets par rectangle" msgid "Arrow Up" -msgstr "Flèche vers le haut" +msgstr "Flèche Haut" msgid "Move selection 10 mm in positive Y direction" -msgstr "Déplacer la sélection de 10 mm dans la direction Y positif" +msgstr "Déplacer la sélection de 10 mm dans la direction positive Y" msgid "Arrow Down" -msgstr "Flèche vers le bas" +msgstr "Flèche Bas" msgid "Move selection 10 mm in negative Y direction" -msgstr "Déplacer la sélection de 10 mm dans la direction Y négatif" +msgstr "Déplacer la sélection de 10 mm dans la direction négative Y" msgid "Arrow Left" -msgstr "Flèche vers la gauche" +msgstr "Flèche Gauche" msgid "Move selection 10 mm in negative X direction" -msgstr "Déplacer la sélection de 10 mm dans la direction X négative" +msgstr "Déplacer la sélection de 10 mm dans la direction négative X" msgid "Arrow Right" -msgstr "Flèche vers la droite" +msgstr "Flèche Droite" msgid "Move selection 10 mm in positive X direction" -msgstr "Déplacer la sélection de 10 mm dans la direction X positive" +msgstr "Déplacer la sélection de 10 mm dans la direction positive X" msgid "Shift+Any arrow" -msgstr "Maj + N'importe quelle flèche" +msgstr "Maj+n'importe quelle flèche" msgid "Movement step set to 1 mm" -msgstr "Pas de mouvement réglé sur 1 mm" +msgstr "Pas du mouvement réglé sur 1 mm" msgid "Esc" -msgstr "Esc" +msgstr "Échap" msgid "keyboard 1-9: set filament for object/part" -msgstr "clavier 1-9 : définir le filament pour objet/pièce" +msgstr "clavier 1-9 : définir le filament pour l'objet/la pièce" msgid "Camera view - Default" -msgstr "Vue de la caméra - Par défaut" +msgstr "Vue caméra - Par défaut" msgid "Camera view - Top" -msgstr "Vue de la caméra - Haut" +msgstr "Vue caméra - Haut" msgid "Camera view - Bottom" -msgstr "Vue de la caméra - Bas" +msgstr "Vue caméra - Bas" msgid "Camera view - Front" msgstr "Vue de la caméra - Avant" msgid "Camera view - Behind" -msgstr "Vue de la caméra - Derrière" +msgstr "Vue caméra - Derrière" msgid "Camera Angle - Left side" -msgstr "Angle de la caméra - Côté gauche" +msgstr "Angle de caméra - Côté gauche" msgid "Camera Angle - Right side" -msgstr "Angle de la caméra - Côté droit" +msgstr "Angle de caméra - Côté droit" msgid "Select all objects" msgstr "Sélectionner tous les objets" msgid "Gizmo move" -msgstr "Gizmo Déplacements" +msgstr "Mouvement Gizmo" msgid "Gizmo scale" -msgstr "Gizmo Échelle" +msgstr "Échelle Gizmo" msgid "Gizmo rotate" -msgstr "Gizmo Rotation" +msgstr "Rotation Gizmo" msgid "Gizmo cut" -msgstr "Gizmo Couper" +msgstr "Découpe Gizmo" msgid "Gizmo Place face on bed" -msgstr "Gizmo Placer la face sur le plateau" +msgstr "Placer Gizmo sur le plateau" msgid "Gizmo SLA support points" -msgstr "Gizmo Point de support SLA" +msgstr "Points de supports Gizmo SLA" msgid "Gizmo FDM paint-on seam" -msgstr "Gizmo Peinture de la couture FDM" +msgstr "Couture peinte Gizmo FDM" msgid "Swtich between Prepare/Prewview" msgstr "Basculer entre Préparer/Aperçu" msgid "Plater" -msgstr "Plaquer" +msgstr "Plateau" msgid "Move: press to snap by 1mm" -msgstr "Déplacement : appuyez pour aligner de 1 mm" +msgstr "Déplacer : appuyez pour aligner de 1 mm" msgid "⌘+Mouse wheel" -msgstr "⌘ + Molette de la souris" +msgstr "⌘+molette de la souris" msgid "Support/Color Painting: adjust pen radius" -msgstr "Support/Peinture : ajuster le rayon du stylet" +msgstr "Support/Peinture couleur : ajustez le rayon du stylet" msgid "⌥+Mouse wheel" -msgstr "⌥ + Molette de la souris" +msgstr "⌥+Molette de la souris" msgid "Support/Color Painting: adjust section position" -msgstr "Support/Peinture : ajuster la position de la section" +msgstr "Support/Peinture couleur : ajuster la position de la section" msgid "Ctrl+Mouse wheel" -msgstr "Ctrl + Molette de la souris" +msgstr "Ctrl+molette de la souris" msgid "Alt+Mouse wheel" -msgstr "Alt + Molette de la souris" +msgstr "Alt+molette de la souris" msgid "Gizmo" -msgstr "Gizmo" +msgstr "Bidule" msgid "Set extruder number for the objects and parts" -msgstr "Définir le numéro de l’extrudeur pour les objets et les pièces" +msgstr "Définir le numéro d'extrudeuse pour les objets et les pièces" msgid "Delete objects, parts, modifiers " -msgstr "Supprimer des objets, des pièces, des modificateurs " +msgstr "Supprimer des objets, des pièces, des modificateurs " msgid "Space" msgstr "Espace" @@ -7074,38 +7197,40 @@ msgstr "" "Sélectionnez l'objet/la pièce et cliquez avec la souris pour changer le nom" msgid "Objects List" -msgstr "Liste des objets" +msgstr "Liste d'objets" msgid "Vertical slider - Move active thumb Up" -msgstr "Curseur vertical - Déplacer le pouce actif vers le haut" +msgstr "Barre de défilement verticale - Déplacer le curseur actif vers le Haut" msgid "Vertical slider - Move active thumb Down" -msgstr "Curseur vertical - Déplacer le pouce actif vers le bas" +msgstr "Barre de défilement verticale - Déplacer le curseur actif vers le Bas" msgid "Horizontal slider - Move active thumb Left" -msgstr "Curseur horizontal - Déplacer le pouce actif vers la gauche" +msgstr "" +"Barre de défilement horizontale - Déplacer le curseur actif vers la Gauche" msgid "Horizontal slider - Move active thumb Right" -msgstr "Curseur horizontal - Déplacer le pouce actif vers la droite" +msgstr "" +"Barre de défilement horizontale - Déplacer le curseur actif vers la Droite" msgid "On/Off one layer mode of the vertical slider" -msgstr "Activer/désactiver le mode une couche du curseur vertical" +msgstr "On/Off mode couche unique de la barre de défilement verticale" msgid "On/Off g-code window" msgstr "On/Off Fenêtre G-code" msgid "Move slider 5x faster" -msgstr "Déplacer le curseur 5 fois plus vite" +msgstr "Déplacez le curseur 5 fois plus vite" msgid "Shift+Mouse wheel" -msgstr "Maj + Molette de la souris" +msgstr "Maj+Molette de la souris" msgid "Release Note" msgstr "Note de version" #, c-format, boost-format msgid "version %s update information :" -msgstr "informations de mise à jour de la version %s :" +msgstr "informations de mise à jour de la version %s :" msgid "Network plug-in update" msgstr "Mise à jour du plug-in réseau" @@ -7114,84 +7239,91 @@ msgid "" "Click OK to update the Network plug-in when Orca Slicer launches next time." msgstr "" "Cliquez sur OK pour mettre à jour le plug-in réseau lors du prochain " -"lancement de Orca Slicer." +"démarrage de OrcaSlicer." #, c-format, boost-format msgid "A new Network plug-in(%s) available, Do you want to install it?" msgstr "" -"Un nouveau plug-in réseau (%s) est disponible, voulez-vous l'installer ?" +"Un nouveau plug-in réseau (%s) est disponible. Voulez-vous l'installer ?" msgid "New version of Orca Slicer" -msgstr "Nouvelle version de Orca Slicer" +msgstr "Nouvelle version de OrcaSlicer" msgid "Skip this Version" -msgstr "" +msgstr "Sauter cette version" msgid "Done" msgstr "Terminé" msgid "Confirm and Update Nozzle" -msgstr "" +msgstr "Confirmation et mise à jour de la buse" msgid "LAN Connection Failed (Sending print file)" -msgstr "Échec de la connexion LAN (envoi du fichier d’impression)" +msgstr "Échec de la connexion au réseau local (envoi du fichier d'impression)" msgid "" "Step 1, please confirm Orca Slicer and your printer are in the same LAN." msgstr "" -"Étape 1, confirmez que Orca Slicer et votre imprimante se trouvent sur le " +"Étape 1, veuillez confirmer que OrcaSlicer et votre imprimante sont sur le " "même réseau local." msgid "" "Step 2, if the IP and Access Code below are different from the actual values " "on your printer, please correct them." msgstr "" -"Étape 2, si l’adresse IP et le code d’accès ci-dessous sont différents des " -"valeurs réelles de votre imprimante, veuillez les corriger." +"Étape 2, si l'adresse IP et le code d'accès ci-dessous sont différents des " +"valeurs actuelles de votre imprimante, corrigez-les." msgid "IP" msgstr "IP" msgid "Access Code" -msgstr "Code d'accès" +msgstr "Code d'Accès" msgid "Where to find your printer's IP and Access Code?" -msgstr "Où trouver l’adresse IP et le code d’accès de votre imprimante ?" +msgstr "Où trouver l'adresse IP et le code d'accès de votre imprimante ?" msgid "Step 3: Ping the IP address to check for packet loss and latency." msgstr "" +"Étape 3 : Effectuer un ping de l’adresse IP pour vérifier la perte de " +"paquets et la latence." msgid "Test" msgstr "Tester" msgid "IP and Access Code Verified! You may close the window" -msgstr "" +msgstr "IP et code d’accès vérifiés ! Vous pouvez fermer la fenêtre" msgid "Connection failed, please double check IP and Access Code" -msgstr "" +msgstr "La connexion a échoué, veuillez vérifier l’IP et le code d’accès." msgid "" "Connection failed! If your IP and Access Code is correct, \n" "please move to step 3 for troubleshooting network issues" msgstr "" +"Échec de la connexion ! Si votre IP et votre code d’accès sont corrects, \n" +"passez à l’étape 3 pour la résolution des problèmes de réseau." msgid "Model:" -msgstr "Modèle:" +msgstr "Modèle :" msgid "Serial:" -msgstr "Serial:" +msgstr "N° de série:" msgid "Version:" -msgstr "Version:" +msgstr "Version :" msgid "Update firmware" -msgstr "Mettre à jour le firmware" +msgstr "Mise à jour du firmware" msgid "Printing" msgstr "Impression" msgid "Idle" -msgstr "Inactive" +msgstr "Inactif" + +msgid "Beta version" +msgstr "" msgid "Latest version" msgstr "Dernière version" @@ -7200,7 +7332,7 @@ msgid "Updating" msgstr "Mise à jour" msgid "Updating failed" -msgstr "Échec de la mise à jour" +msgstr "La mise à jour a échoué" msgid "Updating successful" msgstr "Mise à jour réussie" @@ -7209,34 +7341,34 @@ msgid "" "Are you sure you want to update? This will take about 10 minutes. Do not " "turn off the power while the printer is updating." msgstr "" -"Êtes-vous sûr de vouloir mettre à jour ? Cela prendra environ 10 minutes. Ne " -"coupez pas l'alimentation pendant la mise à jour de l'imprimante." +"Êtes-vous sûr de vouloir effectuer la mise à jour ? Cela prendra environ 10 " +"minutes. Ne mettez pas l'imprimante hors tension durant la mise à jour." msgid "" "An important update was detected and needs to be run before printing can " "continue. Do you want to update now? You can also update later from 'Upgrade " "firmware'." msgstr "" -"Une mise à jour importante a été détectée et doit être exécutée avant que " -"l'impression puisse continuer. Voulez-vous mettre à jour maintenant ? Vous " -"pouvez également mettre à jour plus tard via le bouton ‘Mettre à jour le " -"firmware'." +"Une mise à jour importante a été détectée et doit être exécutée avant de " +"pouvoir poursuivre l'impression. Voulez-vous effectuer la mise à jour " +"maintenant ? Vous pouvez également effectuer une mise à jour ultérieurement " +"à partir de \"Mettre à jour le firmware\"." msgid "" "The firmware version is abnormal. Repairing and updating are required before " "printing. Do you want to update now? You can also update later on printer or " "update next time starting the studio." msgstr "" -"La version du firmware est anormale. Une réparation et une mise à jour sont " -"nécessaires avant l'impression. Voulez-vous mettre à jour maintenant ? Vous " -"pouvez également mettre à jour plus tard via l'imprimante ou au prochain " -"démarrage de Orca Slicer." +"La version du firmware est erronée. La réparation et la mise à jour sont " +"nécessaires avant l'impression. Voulez-vous effectuer la mise à jour " +"maintenant ? Vous pouvez également effectuer une mise à jour ultérieurement " +"depuis l'imprimante ou lors du prochain démarrage de Bambu Studio." msgid "Extension Board" -msgstr "Carte d'extension" +msgstr "Carte d'Extension" msgid "Saving objects into the 3mf failed." -msgstr "La sauvegarde des objets dans le 3mf a échoué." +msgstr "L'enregistrement d'objets dans le 3mf a échoué." msgid "Only Windows 10 is supported." msgstr "Seul Windows 10 est pris en charge." @@ -7289,14 +7421,14 @@ msgstr "Échec de la copie du fichier %1% vers %2% : %3%" msgid "Need to check the unsaved changes before configuration updates." msgstr "" -"Il est nécessaire de vérifier les modifications non enregistrées avant les " -"mises à jour de configuration." +"Besoin de vérifier les modifications non enregistrées avant les mises à jour " +"de configuration." msgid "Configuration package updated to " msgstr "Package de configuration mis à jour pour " msgid "Open G-code file:" -msgstr "Ouvrir un fichier G-code :" +msgstr "Ouvrir un fichier G-code :" msgid "" "One object has empty initial layer and can't be printed. Please Cut the " @@ -7308,7 +7440,8 @@ msgstr "" #, boost-format msgid "Object can't be printed for empty layer between %1% and %2%." msgstr "" -"L'objet ne peut pas être imprimé pour une couche vide entre %1% et %2%." +"L'objet comporte des couches vides comprises entre %1% et %2% et ne peut pas " +"être imprimé." #, boost-format msgid "Object: %1%" @@ -7318,23 +7451,21 @@ msgid "" "Maybe parts of the object at these height are too thin, or the object has " "faulty mesh" msgstr "" -"Il est possible que certaines parties de l'objet à cette hauteur sont trop " -"fines ou que l'objet a un maillage défectueux" +"Peut-être que certaines parties de l'objet à ces hauteurs sont trop fines ou " +"que l'objet a un maillage défectueux" msgid "No object can be printed. Maybe too small" -msgstr "" -"Aucun objet ne peut être imprimé. Il est possible qu’il soit trop petit" +msgstr "Aucun objet ne peut être imprimé. Peut-être trop petit" msgid "" "Failed to generate gcode for invalid custom G-code.\n" "\n" msgstr "" "Échec de la génération du gcode pour un G-code personnalisé non valide.\n" -"\n" msgid "Please check the custom G-code or use the default custom G-code." msgstr "" -"Veuillez vérifier le G-code personnalisé ou utiliser le G-code personnalisé " +"Veuillez vérifier le code G personnalisé ou utiliser le code G personnalisé " "par défaut." #, boost-format @@ -7342,13 +7473,13 @@ msgid "Generating G-code: layer %1%" msgstr "Génération du G-code : couche %1%" msgid "Inner wall" -msgstr "Paroi intérieure" +msgstr "Mur intérieur" msgid "Outer wall" -msgstr "Paroi extérieure" +msgstr "Mur extérieur" msgid "Overhang wall" -msgstr "Paroi en surplomb" +msgstr "Mur en surplomb" msgid "Sparse infill" msgstr "Remplissage" @@ -7366,19 +7497,19 @@ msgid "Internal Bridge" msgstr "Pont interne" msgid "Gap infill" -msgstr "Remplissage des espaces" +msgstr "Remplissage d'espace" msgid "Skirt" msgstr "Jupe" msgid "Support interface" -msgstr "Interfaces de support" +msgstr "Interface de support" msgid "Support transition" -msgstr "Transition de support" +msgstr "Soutenir la transition" msgid "Multiple" -msgstr "Multiple" +msgstr "Plusieurs" #, boost-format msgid "Failed to calculate line width of %1%. Can not get value of \"%2%\" " @@ -7390,30 +7521,32 @@ msgid "" "Invalid spacing supplied to Flow::with_spacing(), check your layer height " "and extrusion width" msgstr "" +"Espacement non valide fourni à Flow::with_spacing(), vérifiez la hauteur de " +"votre couche et la largeur d’extrusion" msgid "undefined error" -msgstr "erreur indéfinie" +msgstr "erreur non définie" msgid "too many files" msgstr "trop de fichiers" msgid "file too large" -msgstr "fichier trop large" +msgstr "fichier trop volumineux" msgid "unsupported method" -msgstr "méthode non prise en charge" +msgstr "méthode non supportée" msgid "unsupported encryption" -msgstr "cryptage non pris en charge" +msgstr "cryptage non supporté" msgid "unsupported feature" -msgstr "fonctionnalité non prise en charge" +msgstr "fonction non supportée" msgid "failed finding central directory" -msgstr "échec de la recherche du dossier central" +msgstr "impossible de trouver le répertoire central" msgid "not a ZIP archive" -msgstr "n’est pas une archive ZIP" +msgstr "n'est pas une archive ZIP" msgid "invalid header or corrupted" msgstr "en-tête invalide ou corrompu" @@ -7425,61 +7558,61 @@ msgid "decompression failed" msgstr "la décompression a échoué" msgid "compression failed" -msgstr "la compression a échoué" +msgstr "échec de la compression" msgid "unexpected decompressed size" -msgstr "taille décompressée inattendue" +msgstr "volume de décompression inattendu" msgid "CRC check failed" -msgstr "la vérification CRC a échoué" +msgstr "La vérification CRC a échoué" msgid "unsupported central directory size" -msgstr "taille du dossier central non prise en charge" +msgstr "volume du répertoire central non supporté" msgid "allocation failed" -msgstr "l'attribution a échoué" +msgstr "échec de l'allocation" msgid "file open failed" -msgstr "l'ouverture du fichier a échoué" +msgstr "échec de l'ouverture du fichier" msgid "file create failed" -msgstr "la création du fichier a échoué" +msgstr "échec de création du fichier" msgid "file write failed" -msgstr "l'écriture du fichier a échoué" +msgstr "échec d'écriture du fichier" msgid "file read failed" -msgstr "la lecture du fichier a échoué" +msgstr "échec de lecture du fichier" msgid "file close failed" -msgstr "la fermeture du fichier a échoué" +msgstr "échec de la fermeture du fichier" msgid "file seek failed" -msgstr "la recherche de fichier a échoué" +msgstr "impossible de trouver le fichier" msgid "file stat failed" -msgstr "les statistiques du fichier ont échoué" +msgstr "impossible d'établir des statistiques pour ce fichier" msgid "invalid parameter" -msgstr "paramètre invalide" +msgstr "paramètre non valide" msgid "invalid filename" msgstr "nom de fichier non valide" msgid "buffer too small" -msgstr "tampon trop petit" +msgstr "buffer trop petit" msgid "internal error" msgstr "erreur interne" msgid "file not found" -msgstr "fichier introuvable" +msgstr "fichier non trouvé" msgid "archive too large" msgstr "archive trop volumineuse" msgid "validation failed" -msgstr "validation échouée" +msgstr "échec de la validation" msgid "write callback failed" msgstr "échec du rappel d'écriture" @@ -7488,14 +7621,13 @@ msgstr "échec du rappel d'écriture" msgid "" "%1% is too close to exclusion area, there may be collisions when printing." msgstr "" -"%1% est trop proche de la zone d'exclusion, cela pourrait provoquer des " -"collisions lors de l'impression." +"%1% est trop proche de la zone d'exclusion. Il peut y avoir des collisions " +"lors de l'impression." #, boost-format msgid "%1% is too close to others, and collisions may be caused." msgstr "" -"%1% est trop proche des autres objets, cela pourrait provoquer des " -"collisions." +"%1% est trop proche des autres, cela pourrait provoquer des collisions." #, boost-format msgid "%1% is too tall, and collisions will be caused." @@ -7503,24 +7635,24 @@ msgstr "%1% est trop grand, cela pourrait provoquer des collisions." msgid " is too close to others, there may be collisions when printing." msgstr "" -" est trop proche des autres objets, cela pourrait provoquer des collisions " -"lors de l’impression." +" est trop proche des autres; il peut y avoir des collisions lors de " +"l'impression." msgid " is too close to exclusion area, there may be collisions when printing." msgstr "" -" est trop proche de la zone d'exclusion, cela pourrait provoquer des " -"collisions lors de l'impression." +" est trop proche d'une zone d'exclusion, il peut y avoir des collisions lors " +"de l'impression." msgid "Prime Tower" -msgstr "Tour de purge" +msgstr "Tour de nettoyage" msgid " is too close to others, and collisions may be caused.\n" msgstr "" -" est trop proche des autres objets. Cela pourrait provoquer des collisions.\n" +" est trop proche des autres. Des collisions risquent d'être provoquées.\n" msgid " is too close to exclusion area, and collisions will be caused.\n" msgstr "" -" est trop proche de la zone d'exclusion. Cela va entraîner des collisions.\n" +" est trop proche d'une zone d'exclusion. Cela va entraîner des collisions.\n" msgid "" "Can not print multiple filaments which have large difference of temperature " @@ -7528,8 +7660,8 @@ msgid "" "during printing" msgstr "" "Impossible d'imprimer plusieurs filaments qui ont une grande différence de " -"température ensemble. Cela pourrait entraîner un blocage de l'extrudeur ou " -"de la buse pendant l'impression voir même être endommagés" +"température ensemble. Sinon, l'extrudeuse et la buse peuvent être bloquées " +"ou endommagées pendant l'impression" msgid "No extrusions under current settings." msgstr "Aucune extrusion dans les paramètres actuels." @@ -7538,85 +7670,117 @@ msgid "" "Smooth mode of timelapse is not supported when \"by object\" sequence is " "enabled." msgstr "" -"Le mode lisse du Timelapse n'est pas pris en charge lorsque la séquence " -"d’impression \"Par objet\" est activée." +"Le mode fluide du timelapse n'est pas pris en charge lorsque le mode " +"d'impression « par objet » est activé." msgid "" "Please select \"By object\" print sequence to print multiple objects in " "spiral vase mode." msgstr "" "Veuillez sélectionner la séquence d'impression \"Par objet\" pour imprimer " -"plusieurs objets en mode vase." +"plusieurs objets en mode vase en spirale." msgid "" "The spiral vase mode does not work when an object contains more than one " "materials." msgstr "" -"Le mode vase ne fonctionne pas lorsqu'un objet contient plusieurs matériaux." +"Le mode vase en spirale ne fonctionne pas lorsqu'un objet contient plusieurs " +"matériaux." #, boost-format msgid "The object %1% exceeds the maximum build volume height." -msgstr "L'objet %1% dépasse la hauteur maximale du volume de construction." +msgstr "L’objet %1% dépasse la hauteur maximale du volume de construction." #, boost-format msgid "" "While the object %1% itself fits the build volume, its last layer exceeds " "the maximum build volume height." msgstr "" +"Bien que l’objet %1% s’adapte lui-même au volume de construction, sa " +"dernière couche dépasse la hauteur maximale du volume de construction." msgid "" "You might want to reduce the size of your model or change current print " "settings and retry." msgstr "" +"Vous devez réduire la taille de votre modèle ou modifier les paramètres " +"d’impression actuels et réessayer." msgid "Variable layer height is not supported with Organic supports." msgstr "" -"La hauteur variable des couches n'est pas prise en charge par les supports " +"La hauteur de couche variable n’est pas prise en charge avec les supports " "organiques." +msgid "" +"Different nozzle diameters and different filament diameters is not allowed " +"when prime tower is enabled." +msgstr "" +"L’utilisation de diamètres de buses et de filaments différents n’est pas " +"autorisée lorsque l’option « prime tower » est activée." + +msgid "" +"The Wipe Tower is currently only supported with the relative extruder " +"addressing (use_relative_e_distances=1)." +msgstr "" +"La tour d’essuyage n’est actuellement supportée qu’avec l’adressage relatif " +"des extrudeurs (use_relative_e_distances=1)." + +msgid "" +"Ooze prevention is currently not supported with the prime tower enabled." +msgstr "" +"La prévention des dépôts de boue n’est actuellement pas prise en charge " +"lorsque la tour principale est activée." + +msgid "" +"The prime tower is currently only supported for the Marlin, RepRap/Sprinter, " +"RepRapFirmware and Repetier G-code flavors." +msgstr "" +"La tour principale n’est actuellement prise en charge que pour les versions " +"Marlin, RepRap/Sprinter, RepRapFirmware et Repetier G-code." + msgid "The prime tower is not supported in \"By object\" print." msgstr "" -"La tour de purge n'est pas prise en charge avec la séquence d’impression " -"\"Par objet\"." +"La tour de nettoyage n'est pas prise en charge dans l'impression \"Par objet" +"\"." msgid "" "The prime tower is not supported when adaptive layer height is on. It " "requires that all objects have the same layer height." msgstr "" -"La tour de purge n'est pas prise en charge lorsque la hauteur de couche " +"La tour de nettoyage n'est pas prise en charge lorsque la hauteur de couche " "adaptative est activée. Cela nécessite que tous les objets aient la même " "hauteur de couche." msgid "The prime tower requires \"support gap\" to be multiple of layer height" msgstr "" -"La tour de purge nécessite que \"l’espace de support\" soit un multiple de " -"la hauteur de la couche" +"La tour de nettoyage nécessite que \"l'écart de support\" soit un multiple " +"de la hauteur de la couche" msgid "The prime tower requires that all objects have the same layer heights" msgstr "" -"La tour de purge nécessite que tous les objets aient les mêmes hauteurs de " -"couche" +"La tour de nettoyage nécessite que tous les objets aient la même hauteur de " +"couche." msgid "" "The prime tower requires that all objects are printed over the same number " "of raft layers" msgstr "" -"La tour de purge nécessite que tous les objets soient imprimés avec le même " -"nombre de couches de radeau" +"La tour de nettoyage nécessite que tous les objets soient imprimés sur le " +"même nombre de couche de radeau." msgid "" "The prime tower requires that all objects are sliced with the same layer " "heights." msgstr "" -"La tour de purge nécessite que tous les objets soient découpés avec les " -"mêmes hauteurs de couche." +"La tour de nettoyage nécessite que tous les objets soient découpés avec la " +"même hauteur de couche." msgid "" "The prime tower is only supported if all objects have the same variable " "layer height" msgstr "" -"La tour de purge n'est prise en charge que si tous les objets ont la même " -"hauteur de couche variable" +"La tour de nettoyage n'est prise en charge que si tous les objets ont la " +"même hauteur de couche variable" msgid "Too small line width" msgstr "Largeur de ligne trop petite" @@ -7627,60 +7791,68 @@ msgstr "Largeur de ligne trop grande" msgid "" "The prime tower requires that support has the same layer height with object." msgstr "" -"La tour de purge nécessite que le support ait la même hauteur de couche que " -"l'objet." +"La tour de nettoyage nécessite que le support ait la même hauteur de couche " +"avec l'objet." msgid "" "Organic support tree tip diameter must not be smaller than support material " "extrusion width." msgstr "" +"Le diamètre de la pointe des supports organiques ne doit pas être inférieur " +"à la largeur d’extrusion du matériau utilisé pour les supports." msgid "" "Organic support branch diameter must not be smaller than 2x support material " "extrusion width." msgstr "" +"Le diamètre des branches des supports organiques ne doit pas être inférieur " +"à 2 fois la largeur d’extrusion du matériau utilisé pour les supports." msgid "" "Organic support branch diameter must not be smaller than support tree tip " "diameter." msgstr "" +"Le diamètre des branches des supports organiques ne doit pas être inférieur " +"au diamètre de la pointe des supports." msgid "" "Support enforcers are used but support is not enabled. Please enable support." msgstr "" -"Les supports forcés sont utilisés mais les supports ne sont pas activés. " -"Veuillez les activer." +"Les forceurs de support sont utilisés mais le support n'est pas activé. " +"Veuillez activer les supports." msgid "Layer height cannot exceed nozzle diameter" msgstr "La hauteur de la couche ne peut pas dépasser le diamètre de la buse" -msgid "" -"Layer height cannot exceed the limit in Printer Settings -> Extruder -> " -"Layer height limits" -msgstr "" - msgid "" "Relative extruder addressing requires resetting the extruder position at " "each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to " "layer_gcode." msgstr "" +"L'extrusion relative de l'extrudeur nécessite de réinitialiser la position " +"de celui-ci à chaque couche pour éviter la perte de précision de la virgule " +"flottante. Ajouter \"G92 E0\" au Gcode de changement de couche." msgid "" "\"G92 E0\" was found in before_layer_gcode, which is incompatible with " "absolute extruder addressing." msgstr "" +"\"G92 E0\" a été trouvé dans le Gcode avant le changement de couche, ce qui " +"est incompatible avec l’extrusion absolue de l’extrudeur." msgid "" "\"G92 E0\" was found in layer_gcode, which is incompatible with absolute " "extruder addressing." msgstr "" +"\"G92 E0\" a été trouvé dans le Gcode de changement de couche, ce qui est " +"incompatible avec l’extrusion absolue de l’extrudeur." #, c-format, boost-format msgid "Plate %d: %s does not support filament %s" -msgstr "Le plateau %d : %s ne prend pas en charge le filament %s" +msgstr "Plaque %d : %s ne prend pas en charge le filament %s" msgid "Generating skirt & brim" -msgstr "Génération jupe & bordure" +msgstr "Génération jupe et bord" msgid "Exporting G-code" msgstr "Exportation du G-code" @@ -7695,32 +7867,32 @@ msgid "Printable area" msgstr "Zone imprimable" msgid "Bed exclude area" -msgstr "Zone d'exclusion du plateau" +msgstr "Zone d'exclusion de lit" msgid "" "Unprintable area in XY plane. For example, X1 Series printers use the front " "left corner to cut filament during filament change. The area is expressed as " "polygon by points in following format: \"XxY, XxY, ...\"" msgstr "" -"Zone non imprimable dans le plan X-Y. Par exemple, les imprimantes de la " +"Zone non imprimable dans le plan XY. Par exemple, les imprimantes de la " "série X1 utilisent le coin avant gauche pour couper le filament lors du " -"changement de filament. La surface est exprimée sous forme de polygone par " -"points au format suivant : \"XxY, XxY, …\"" +"changement de filament. La zone est exprimée sous forme de polygone par des " +"points au format suivant : \"XxY, XxY,... \"" msgid "Bed custom texture" -msgstr "Texture personnalisée du plateau" +msgstr "Texture personnalisée du lit" msgid "Bed custom model" msgstr "Modèle de plateau personnalisé" msgid "Elephant foot compensation" -msgstr "Compensation du pied d'éléphant" +msgstr "Compensation de l'effet patte d'éléphant" msgid "" "Shrink the initial layer on build plate to compensate for elephant foot " "effect" msgstr "" -"Rétrécis la couche initiale sur le plateau pour compenser l'effet de pied " +"Rétrécissez la couche initiale sur le plateau pour compenser l'effet de pied " "d'éléphant" msgid "Elephant foot compensation layers" @@ -7732,10 +7904,10 @@ msgid "" "the next layers will be linearly shrunk less, up to the layer indicated by " "this value." msgstr "" -"Le nombre de couches sur lesquelles la compensation du pied d'éléphant sera " -"active. La première couche sera rétrécie de la valeur de la compensation du " -"pied d'éléphant, puis les couches suivantes seront réduites de façon " -"linéaire, jusqu'à la couche indiquée par cette valeur." +"Nombre de couches sur lesquelles la compensation du pied d'éléphant sera " +"active. La première couche sera réduite de la valeur de compensation du pied " +"d'éléphant, puis les couches suivantes seront réduites linéairement moins, " +"jusqu'à la couche indiquée par cette valeur." msgid "layers" msgstr "couches" @@ -7744,8 +7916,8 @@ msgid "" "Slicing height for each layer. Smaller layer height means more accurate and " "more printing time" msgstr "" -"Hauteur de chaque couche. Une hauteur de couche plus petite signifie plus de " -"précision et une plus longue durée d'impression" +"Hauteur de tranchage pour chaque couche. Une hauteur de couche plus petite " +"signifie plus de précision et plus de temps d'impression" msgid "Printable height" msgstr "Hauteur imprimable" @@ -7753,11 +7925,18 @@ msgstr "Hauteur imprimable" msgid "Maximum printable height which is limited by mechanism of printer" msgstr "Hauteur imprimable maximale limitée par le mécanisme de l'imprimante" +msgid "Preferred orientation" +msgstr "Orientation préférée" + +msgid "Automatically orient stls on the Z-axis upon initial import" +msgstr "" +"Orienter automatiquement les stls sur l’axe Z lors de l’importation initiale" + msgid "Printer preset names" -msgstr "Noms prédéfinis de l'imprimante" +msgstr "Noms des préréglages de l'imprimante" msgid "Hostname, IP or URL" -msgstr "Nom d'hôte, IP ou URL" +msgstr "Nom d'hôte, adresse IP ou URL" msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " @@ -7766,12 +7945,12 @@ msgid "" "name and password into the URL in the following format: https://username:" "password@your-octopi-address/" msgstr "" -"Slic3r peut télécharger des fichiers G-code sur une imprimante hôte. Ce " -"champ doit contenir le nom d'hôte, l'adresse IP ou l'URL de l'instance de " -"l'imprimante hôte. L'hôte d'impression derrière HAProxy avec " -"l'authentification de base activée est accessible en saisissant le nom " -"d'utilisateur et le mot de passe dans l'URL au format suivant : https://" -"nomutilisateur:motdepasse@votre-adresse-octopi/" +"Slic3r peut téléverser des fichiers G-code sur une imprimante hôte. Ce champ " +"doit contenir le nom d'hôte, l'adresse IP ou l'URL de l'instance hôte de " +"l'imprimante. L'hôte d'impression derrière HAProxy avec l'authentification " +"de base activée est accessible en saisissant le nom d'utilisateur et le mot " +"de passe dans l'URL au format suivant : https://username:password@your-" +"octopi-address/" msgid "Device UI" msgstr "Interface utilisateur de l’appareil" @@ -7789,14 +7968,14 @@ msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " "the API Key or the password required for authentication." msgstr "" -"Slic3r peut télécharger des fichiers G-code sur l'imprimante hôte. Ce champ " +"Slic3r peut téléverser des fichiers G-code sur une imprimante hôte. Ce champ " "doit contenir la clé API ou le mot de passe requis pour l'authentification." msgid "Name of the printer" msgstr "Nom de l'imprimante" msgid "HTTPS CA File" -msgstr "Fichier CA HTTPS" +msgstr "Fichier HTTPS CA" msgid "" "Custom CA certificate file can be specified for HTTPS OctoPrint connections, " @@ -7804,8 +7983,8 @@ msgid "" "is used." msgstr "" "Un fichier de certificat CA personnalisé peut être spécifié pour les " -"connexions HTTPS OctoPrint, au format crt/pem. S'il n'est pas renseigné, le " -"référentiel de certificats OS CA par défaut est utilisé." +"connexions HTTPS OctoPrint, au format crt/pem. Si ce champ est laissé vide, " +"le référentiel de certificats OS CA par défaut est utilisé." msgid "User" msgstr "Utilisateur" @@ -7814,22 +7993,22 @@ msgid "Password" msgstr "Mot de passe" msgid "Ignore HTTPS certificate revocation checks" -msgstr "Ignorer les vérifications de révocation de certificat HTTPS" +msgstr "Ignorer les contrôles de révocation des certificats HTTPS" msgid "" "Ignore HTTPS certificate revocation checks in case of missing or offline " "distribution points. One may want to enable this option for self signed " "certificates if connection fails." msgstr "" -"Ignore les vérifications de révocation de certificat HTTPS en cas de points " -"de distribution manquants ou hors ligne. On peut vouloir activer cette " -"option pour les certificats auto-signés si la connexion échoue." +"Ignorez les contrôles de révocation des certificats HTTPS en cas de points " +"de distribution manquants ou hors ligne. Il peut être utile d'activer cette " +"option pour les certificats auto-signés en cas d'échec de la connexion." msgid "Names of presets related to the physical printer" -msgstr "Noms des préréglages liés à l'imprimante physique" +msgstr "Noms des préréglages associés à l'imprimante physique" msgid "Authorization Type" -msgstr "Type d'autorisation" +msgstr "Type d'Autorisation" msgid "API key" msgstr "Clé API" @@ -7838,15 +8017,15 @@ msgid "HTTP digest" msgstr "Résumé HTTP" msgid "Avoid crossing wall" -msgstr "Éviter de traverser les parois" +msgstr "Évitez de traverser les murs" msgid "Detour and avoid to travel across wall which may cause blob on surface" msgstr "" -"Faire un détour et éviter de traverser les parois ce qui pourrait causer des " +"Faites un détour et évitez de traverser le mur, ce qui pourrait causer des " "taches sur la surface" msgid "Avoid crossing wall - Max detour length" -msgstr "Éviter de traverser les parois - Longueur maximale du détour" +msgstr "Évitez de traverser les murs - Longueur maximale du détour" msgid "" "Maximum detour distance for avoiding crossing wall. Don't detour if the " @@ -7854,10 +8033,11 @@ msgid "" "either as an absolute value or as percentage (for example 50%) of a direct " "travel path. Zero to disable" msgstr "" -"Distance de détour maximale pour éviter de traverser les parois. Ne pas " -"faire de détour si la distance de détour est supérieure à la valeur définie. " -"La longueur du détour peut être spécifiée soit en valeur absolue, soit en " -"pourcentage (par exemple 50 %) d'un trajet direct. Valeur à 0 pour désactiver" +"Distance de détour maximale pour éviter de traverser un mur: l'imprimante ne " +"fera pas de détour si la distance de détour est supérieure à cette valeur. " +"La longueur du détour peut être spécifiée sous forme de valeur absolue ou de " +"pourcentage (par exemple 50 %) d'un trajet direct. Une valeur de 0 " +"désactivera cette option." msgid "mm or %" msgstr "mm ou %" @@ -7869,9 +8049,9 @@ msgid "" "Bed temperature for layers except the initial one. Value 0 means the " "filament does not support to print on the Cool Plate" msgstr "" -"Température du plateau de toutes les couches à l'exception de la première. " -"La valeur 0 signifie que le filament ne prend pas en charge l'impression sur " -"le plateau Cool Plate" +"Il s'agit de la température du plateau pour toutes les couches à l'exception " +"de la première. Une valeur à 0 signifie que ce filament ne peut pas être " +"imprimé sur le plateau froid (\"Cool plate\")." msgid "°C" msgstr "°C" @@ -7880,88 +8060,92 @@ msgid "" "Bed temperature for layers except the initial one. Value 0 means the " "filament does not support to print on the Engineering Plate" msgstr "" -"Température du plateau de toutes les couches à l'exception de la première. " -"La valeur 0 signifie que le filament ne prend pas en charge l'impression sur " -"le plateau Engineering" +"Il s'agit de la température du plateau pour toutes les couches à l'exception " +"de la première. Une valeur à 0 signifie que ce filament ne peut pas être " +"imprimé sur la plaque Engineering." msgid "" "Bed temperature for layers except the initial one. Value 0 means the " "filament does not support to print on the High Temp Plate" msgstr "" +"Il s'agit de la température du plateau pour toutes les couches à l'exception " +"de la première. Une valeur à 0 signifie que ce filament ne peut pas être " +"imprimé sur le plateau haute température (\"High Temp plate\")." msgid "" "Bed temperature for layers except the initial one. Value 0 means the " "filament does not support to print on the Textured PEI Plate" msgstr "" -"Température du plateau de toutes les couches à l’exception de la première. " -"La valeur 0 signifie que le filament ne prend pas en charge l'impression sur " -"le plateau Textured PEI" +"Température du lit après la première couche. 0 signifie que le filament " +"n'est pas supporté par la plaque PEI texturée." msgid "Initial layer" msgstr "Couche initiale" msgid "Initial layer bed temperature" -msgstr "Température du plateau lors de la couche initiale" +msgstr "Température initiale du lit de couche" msgid "" "Bed temperature of the initial layer. Value 0 means the filament does not " "support to print on the Cool Plate" msgstr "" -"Température du plateau lors de la couche initiale. La valeur 0 signifie que " -"le filament ne prend pas en charge l'impression sur le plateau Cool Plate" +"Il s'agit de la température du plateau pour la première couche. Une valeur à " +"0 signifie que ce filament ne peut pas être imprimé sur le plateau froid " +"(\"Cool plate\")." msgid "" "Bed temperature of the initial layer. Value 0 means the filament does not " "support to print on the Engineering Plate" msgstr "" -"Température du plateau lors de la couche initiale. La valeur 0 signifie que " -"le filament ne prend pas en charge l'impression sur le plateau Engineering" +"Il s'agit de la température du plateau pour la première couche. Une valeur à " +"0 signifie que ce filament ne peut pas être imprimé sur le plateau " +"Engineering." msgid "" "Bed temperature of the initial layer. Value 0 means the filament does not " "support to print on the High Temp Plate" msgstr "" -"Température du plateau lors de la couche initiale. La valeur 0 signifie que " -"le filament ne prend pas en charge l'impression sur le plateau High " -"Temperature" +"Il s'agit de la température du plateau pour la première couche. Une valeur à " +"0 signifie que ce filament ne peut pas être imprimé sur le plateau haute " +"température (\"High Temp plate\")." msgid "" "Bed temperature of the initial layer. Value 0 means the filament does not " "support to print on the Textured PEI Plate" msgstr "" -"Température du plateau lors de la couche initiale. La valeur 0 signifie que " -"le filament ne prend pas en charge l'impression sur le plateau Textured PEI" +"La température du lit à la première couche. La valeur 0 signifie que le " +"filament n'est pas supporté sur la plaque PEI texturée." msgid "Bed types supported by the printer" -msgstr "Types de plateaux pris en charge par l'imprimante" +msgstr "Types de lit pris en charge par l'imprimante" msgid "Cool Plate" -msgstr "Cool Plate" +msgstr "Cool Plate/Plaque PLA" msgid "Engineering Plate" -msgstr "Engineering Plate" +msgstr "Plaque Engineering" msgid "First layer print sequence" -msgstr "Séquence d'impression de la première couche" +msgstr "Séquence d’impression de la première couche" msgid "This G-code is inserted at every layer change before lifting z" -msgstr "Ce G-code est inséré à chaque changement de couche avant la levée en Z" +msgstr "Ce G-code est inséré à chaque changement de couche avant de soulever z" msgid "Bottom shell layers" -msgstr "Nombre de couches des coques inférieures" +msgstr "Couches inférieures de la coque" msgid "" "This is the number of solid layers of bottom shell, including the bottom " "surface layer. When the thickness calculated by this value is thinner than " "bottom shell thickness, the bottom shell layers will be increased" msgstr "" -"Il s'agit du nombre de couches solides des coques inférieures, y compris la " +"Il s'agit du nombre de couches solides de coque inférieure, y compris la " "couche de surface inférieure. Lorsque l'épaisseur calculée par cette valeur " "est plus fine que l'épaisseur de la coque inférieure, les couches de la " -"coque inférieure sont augmentées" +"coque inférieure seront augmentées" msgid "Bottom shell thickness" -msgstr "Épaisseur des coques inférieures" +msgstr "Épaisseur de la coque inférieure" msgid "" "The number of bottom solid layers is increased when slicing if the thickness " @@ -7972,35 +8156,37 @@ msgid "" msgstr "" "Le nombre de couches solides inférieures est augmenté lors du découpage si " "l'épaisseur calculée par les couches de coque inférieures est inférieure à " -"la valeur définie. Cela peut éviter d'avoir une coque trop fine lorsque la " -"hauteur de couche est faible. Une valeur à 0 signifie que ce paramètre est " -"désactivé et que l'épaisseur de la coque inférieure est uniquement " -"déterminée par les couches de la coque inférieure" +"cette valeur. Cela peut éviter d'avoir une coque trop fine lorsque la " +"hauteur de couche est faible. 0 signifie que ce paramètre est désactivé et " +"que l'épaisseur de la coque inférieure est absolument déterminée par les " +"couches de la coque inférieure" msgid "Force cooling for overhang and bridge" -msgstr "Forcer la ventilation des surplombs et ponts" +msgstr "Forcer la ventilation pour les surplombs et ponts" msgid "" "Enable this option to optimize part cooling fan speed for overhang and " "bridge to get better cooling" msgstr "" -"Cette option permet d’optimiser la vitesse du ventilateur de refroidissement " -"pour les surplombs et les ponts afin d'obtenir un meilleur refroidissement" +"Activez cette option pour optimiser la vitesse du ventilateur de " +"refroidissement des pièces pour le surplomb et le pont afin d'obtenir un " +"meilleur refroidissement" msgid "Fan speed for overhang" -msgstr "Vitesse du ventilateur pour les surplombs et ponts" +msgstr "Vitesse du ventilateur pour les surplombs" msgid "" "Force part cooling fan to be this speed when printing bridge or overhang " "wall which has large overhang degree. Forcing cooling for overhang and " "bridge can get better quality for these part" msgstr "" -"Forcer le ventilateur de refroidissement à être à cette vitesse lors de " -"l'impression d'un pont ou d'une paroi qui a un degré de surplomb important. " -"Cela permet d’obtenir une meilleure qualité" +"Forcez le ventilateur de refroidissement de la pièce à être à cette vitesse " +"lors de l'impression d'un pont ou d'un mur en surplomb qui a un degré de " +"surplomb important. Forcer le refroidissement pour les surplombs et le pont " +"pour obtenir une meilleure qualité pour ces pièces." msgid "Cooling overhang threshold" -msgstr "Seuil de surplomb" +msgstr "Seuil de dépassement de refroidissement" #, c-format msgid "" @@ -8012,7 +8198,7 @@ msgstr "" "Forcer le ventilateur de refroidissement à atteindre une vitesse spécifique " "lorsque le degré de surplomb de la pièce imprimée dépasse cette valeur. Ceci " "est exprimé en pourcentage qui indique la largeur de la ligne sans support " -"provenant de la couche inférieure. 0 %% signifie un refroidissement forcé de " +"provenant de la couche inférieure. 0 %% signifie un refroidissement forcé de " "toutes les parois extérieures, quel que soit le degré de surplomb." msgid "Bridge infill direction" @@ -8023,9 +8209,9 @@ msgid "" "calculated automatically. Otherwise the provided angle will be used for " "external bridges. Use 180°for zero angle." msgstr "" -"Outrepasser l'angle de pontage. S'il est laissé à 0°, l'angle de pontage " -"sera calculé automatiquement. Sinon, l'angle fourni sera utilisé pour les " -"ponts externes. Utilisez 180° pour un angle nul." +"Forçage de l’angle des ponts. S’il est laissé à zéro, l’angle des ponts sera " +"calculé automatiquement. Sinon, l’angle fourni sera utilisé pour les ponts " +"externes. Utilisez 180° pour un angle nul." msgid "Bridge density" msgstr "Densité des ponts" @@ -8035,18 +8221,31 @@ msgstr "" "Densité des ponts externes, Une valeur à 100%% signifie un pont solide. La " "valeur par défaut est 100%." -msgid "Bridge flow" +msgid "Bridge flow ratio" msgstr "Débit des ponts" msgid "" "Decrease this value slightly(for example 0.9) to reduce the amount of " "material for bridge, to improve sag" msgstr "" -"Diminuez légèrement cette valeur (par exemple 0.9) pour réduire la quantité " +"Diminuez légèrement cette valeur (par exemple 0,9) pour réduire la quantité " "de matériaux pour le pont, pour améliorer l'affaissement" +msgid "Internal bridge flow ratio" +msgstr "Ratio de débit du pont interne" + +msgid "" +"This value governs the thickness of the internal bridge layer. This is the " +"first layer over sparse infill. Decrease this value slightly (for example " +"0.9) to improve surface quality over sparse infill." +msgstr "" +"Cette valeur détermine l’épaisseur de la couche des ponts internes. Il " +"s’agit de la première couche sur un remplissage clairsemé. Diminuez " +"légèrement cette valeur (par exemple 0.9) pour améliorer la qualité de la " +"surface sur un remplissage clairsemé." + msgid "Top surface flow ratio" -msgstr "Débit des surfaces supérieures" +msgstr "Ratio du débit des surfaces supérieures" msgid "" "This factor affects the amount of material for top solid infill. You can " @@ -8057,7 +8256,7 @@ msgstr "" "surface lisse" msgid "Bottom surface flow ratio" -msgstr "Débit des surfaces inférieures" +msgstr "Ratio du débit des surfaces inférieures" msgid "This factor affects the amount of material for bottom solid infill" msgstr "" @@ -8075,19 +8274,19 @@ msgstr "" "extérieurs. Cela améliore également la consistance des couches." msgid "Only one wall on top surfaces" -msgstr "Une seule paroi sur les surfaces supérieures" +msgstr "Un seul mur sur les surfaces supérieures" msgid "" "Use only one wall on flat top surface, to give more space to the top infill " "pattern" msgstr "" -"Utiliser qu'une seule paroi sur une surface plane pour donner plus d'espace " -"au motif de remplissage supérieur" +"N'utilisez qu'un seul mur sur les surfaces supérieures planes, afin de " +"donner plus d'espace au motif de remplissage supérieur." msgid "One wall threshold" -msgstr "Seuil d'une paroi" +msgstr "Seuil de paroi unique" -#, c-format, boost-format +#, fuzzy, c-format, boost-format msgid "" "If a top surface has to be printed and it's partially covered by another " "layer, it won't be considered at a top layer where its width is below this " @@ -8098,6 +8297,15 @@ msgid "" "on the next layer, like letters. Set this setting to 0 to remove these " "artifacts." msgstr "" +"Si une surface supérieure doit être imprimée et qu’elle est partiellement " +"couverte par une autre couche, elle ne sera pas considérée comme une couche " +"supérieure si sa largeur est inférieure à cette valeur. Cela peut être utile " +"pour ne pas déclencher l’option « un périmètre sur le dessus » sur des " +"surfaces qui ne devraient être couvertes que par des périmètres. Cette " +"valeur peut être un mm ou un % de la largeur d’extrusion du périmètre.\n" +"Attention : Si cette option est activée, des artefacts peuvent être créés si " +"vous avez des éléments fins sur la couche suivante, comme des lettres. " +"Réglez ce paramètre à 0 pour supprimer ces artefacts." msgid "Only one wall on first layer" msgstr "Une seule paroi sur la première couche" @@ -8110,20 +8318,20 @@ msgstr "" "d’espace au motif de remplissage inférieur" msgid "Extra perimeters on overhangs" -msgstr "Périmètres supplémentaires pour les surplombs" +msgstr "Parois supplémentaires sur les surplombs" msgid "" "Create additional perimeter paths over steep overhangs and areas where " "bridges cannot be anchored. " msgstr "" -"Créer des chemins périmétriques supplémentaires au-dessus des surplombs " -"abrupts et des zones où les les ponts ne peuvent pas être ancrés. " +"Créer des chemins de périmètres supplémentaires sur les surplombs abrupts et " +"les zones où les ponts ne peuvent pas être ancrés. " msgid "Reverse on odd" -msgstr "Inversé sur impair" +msgstr "Parois inversées sur couches impaires" msgid "Overhang reversal" -msgstr "Renversement de surplomb" +msgstr "Inversion du surplomb" msgid "" "Extrude perimeters that have a part over an overhang in the reverse " @@ -8133,9 +8341,15 @@ msgid "" "This setting can also help reduce part warping due to the reduction of " "stresses in the part walls." msgstr "" +"Extruder les périmètres dont une partie se trouve au-dessus d’un surplomb " +"dans le sens inverse sur les couches impaires. Ce motif alternatif peut " +"améliorer considérablement les surplombs abrupts.\n" +"\n" +"Ce paramètre peut également contribuer à réduire le gauchissement de la " +"pièce en raison de la réduction des contraintes dans les parois de la pièce." msgid "Reverse only internal perimeters" -msgstr "" +msgstr "Inverser uniquement les périmètres internes" msgid "" "Apply the reverse perimeters logic only on internal perimeters. \n" @@ -8151,19 +8365,37 @@ msgid "" "Reverse Threshold to 0 so that all internal walls print in alternating " "directions on odd layers irrespective of their overhang degree." msgstr "" +"Appliquer la logique d’inversion des périmètres uniquement sur les " +"périmètres internes. \n" +"\n" +"Ce paramètre réduit considérablement les contraintes exercées sur les " +"pièces, car elles sont désormais réparties dans des directions alternées. " +"Cela devrait réduire la déformation des pièces tout en maintenant la qualité " +"des parois externes. Cette fonction peut être très utile pour les matériaux " +"sujets à la déformation, comme l’ABS/ASA, ainsi que pour les filaments " +"élastiques, comme le TPU et le Silk PLA. Elle peut également contribuer à " +"réduire le gauchissement des régions flottantes sur les supports.\n" +"\n" +"Pour que ce paramètre soit le plus efficace possible, il est recommandé de " +"régler le seuil d’inversion sur 0 afin que toutes les parois internes " +"s’impriment dans des directions alternées sur les couches impaires, quel que " +"soit leur degré de surplomb." msgid "Reverse threshold" -msgstr "Seuil d'inversion" +msgstr "Seuil d’inversion" msgid "Overhang reversal threshold" -msgstr "Seuil d'inversion du surplomb" +msgstr "Seuil d’inversion des surplombs" -#, c-format, boost-format +#, fuzzy, c-format, boost-format msgid "" "Number of mm the overhang need to be for the reversal to be considered " "useful. Can be a % of the perimeter width.\n" "Value 0 enables reversal on every odd layers regardless." msgstr "" +"Nombre de mm de dépassement nécessaire pour que l’inversion soit considérée " +"comme utile. Il peut s’agir d’un pourcentage de la largeur du périmètre.\n" +"La valeur 0 permet l’inversion sur toutes les couches impaires." msgid "Classic mode" msgstr "Classique" @@ -8172,20 +8404,22 @@ msgid "Enable this option to use classic mode" msgstr "Activer cette option pour utiliser le mode classique" msgid "Slow down for overhang" -msgstr "Ralentir lors des surplombs" +msgstr "Ralentir pour le surplomb" msgid "Enable this option to slow printing down for different overhang degree" -msgstr "Permet de ralentir l'impression pour différents degrés de surplomb" +msgstr "" +"Activez cette option pour ralentir l'impression pour différents degrés de " +"surplomb" msgid "Slow down for curled perimeters" -msgstr "Ralentir pour les périmètres courbés" +msgstr "Ralentir lors des périmètres courbés" msgid "" "Enable this option to slow printing down in areas where potential curled " "perimeters may exist" msgstr "" -"Activez cette option pour ralentir l'impression dans les zones où des " -"périmètres peuvent exister" +"Activer cette option pour ralentir l’impression dans les zones où des " +"périmètres potentiellement courbées peuvent exister." msgid "mm/s or %" msgstr "mm/s ou %" @@ -8194,7 +8428,8 @@ msgid "External" msgstr "Externe" msgid "Speed of bridge and completely overhang wall" -msgstr "Vitesse des ponts et parois complètement en surplombs" +msgstr "" +"Il s'agit de la vitesse pour les ponts et les murs en surplomb à 100 %." msgid "mm/s" msgstr "mm/s" @@ -8206,12 +8441,14 @@ msgid "" "Speed of internal bridge. If the value is expressed as a percentage, it will " "be calculated based on the bridge_speed. Default value is 150%." msgstr "" +"Vitesse des ponts internes. Si la valeur est exprimée en pourcentage, elle " +"sera calculée en fonction de bridge_speed. La valeur par défaut est 150%." msgid "Brim width" msgstr "Largeur de la bordure" msgid "Distance from model to the outermost brim line" -msgstr "Distance entre le modèle et la ligne la plus externe de la bordure" +msgstr "Distance du modèle à la ligne de bord la plus externe" msgid "Brim type" msgstr "Type de bordure" @@ -8220,58 +8457,65 @@ msgid "" "This controls the generation of the brim at outer and/or inner side of " "models. Auto means the brim width is analysed and calculated automatically." msgstr "" -"Cela contrôle la génération de la bordure extérieure et/ou intérieure des " -"modèles. Automatique signifie que la largeur de la bordure est analysée et " +"Cela permet de contrôler la génération de bordure extérieur et/ou intérieur " +"des modèles. Auto signifie que la largeur de bordure est analysée et " "calculée automatiquement." msgid "Brim-object gap" -msgstr "Distance entre la bordure et l'objet" +msgstr "Écart bord-objet" msgid "" "A gap between innermost brim line and object can make brim be removed more " "easily" msgstr "" -"Espace entre la ligne la plus interne de la bordure et l'objet. Cela peut " -"faciliter le retrait de la bordure" +"Un espace entre la ligne de bord la plus interne et l'objet peut faciliter " +"le retrait du bord" msgid "Brim ears" msgstr "Oreilles de bordure" msgid "Only draw brim over the sharp edges of the model." -msgstr "Ne dessinez le bord que sur les arêtes vives du modèle." +msgstr "Bordure que sur les arêtes vives du modèle." msgid "Brim ear max angle" -msgstr "Angle maximal de l'oreille du bord" +msgstr "Angle maximum de la bordure" msgid "" "Maximum angle to let a brim ear appear. \n" "If set to 0, no brim will be created. \n" "If set to ~180, brim will be created on everything but straight sections." msgstr "" +"Angle maximum pour laisser apparaître la bordure.\n" +"S’il est défini sur 0, aucune bordure ne sera créée.\n" +"S’il est réglé sur ~180, la bordure sera créée sur tout sauf les sections " +"droites." msgid "Brim ear detection radius" -msgstr "Rayon de détection de l'oreille du bord" +msgstr "Rayon de détection de la bordure" msgid "" "The geometry will be decimated before dectecting sharp angles. This " "parameter indicates the minimum length of the deviation for the decimation.\n" "0 to deactivate" msgstr "" +"La géométrie sera décimée avant de détecter les angles vifs. Ce paramètre " +"indique la longueur minimale de l’écart pour la décimation.\n" +"0 pour désactiver" msgid "Compatible machine" -msgstr "Imprimantes compatibles" +msgstr "Appareils compatibles" msgid "upward compatible machine" -msgstr "imprimante compatible en haut" +msgstr "machine à compatibilité ascendante" msgid "Compatible machine condition" -msgstr "Condition de l’imprimante compatible" +msgstr "État de la machine compatible" msgid "Compatible process profiles" msgstr "Profils de processus compatibles" msgid "Compatible process profiles condition" -msgstr "Condition des profils de processus compatibles" +msgstr "Condition de profils de processus compatibles" msgid "Print sequence, layer by layer or object by object" msgstr "Séquence d'impression, couche par couche ou objet par objet" @@ -8283,7 +8527,7 @@ msgid "By object" msgstr "Par objet" msgid "Slow printing down for better layer cooling" -msgstr "Ralentir l’impression pour un meilleur refroidissement" +msgstr "Impression lente pour un meilleur refroidissement des couches" msgid "" "Enable this option to slow printing speed down to make the final layer time " @@ -8291,11 +8535,11 @@ msgid "" "that layer can be cooled for longer time. This can improve the cooling " "quality for needle and small details" msgstr "" -"Cette option permet de ralentir la vitesse d'impression afin que la durée de " -"couche finale ne soit pas plus courte que le seuil de la durée de couche " -"dans \"Seuil de vitesse maximale\", afin que cette couche puisse être " -"refroidie plus longtemps. Cela peut améliorer la qualité de refroidissement " -"pour les petits détails" +"Activez cette option pour ralentir la vitesse d'impression afin que le temps " +"de couche final ne soit pas plus court que le seuil de temps de couche dans " +"\"Seuil de vitesse maximale du ventilateur\", afin que cette couche puisse " +"être refroidie plus longtemps. Cela peut améliorer la qualité de " +"refroidissement pour l'aiguille et les petits détails" msgid "Normal printing" msgstr "Impression normale" @@ -8314,21 +8558,20 @@ msgid "Default filament profile" msgstr "Profil de filament par défaut" msgid "Default filament profile when switch to this machine profile" -msgstr "Profil de filament par défaut lors du passage à ce profil d’imprimante" +msgstr "Profil de filament par défaut lors du passage à ce profil de machine" msgid "Default process profile" msgstr "Profil de processus par défaut" msgid "Default process profile when switch to this machine profile" -msgstr "" -"Profil de processus par défaut lors du passage à ce profil d’imprimante" +msgstr "Profil de processus par défaut lors du passage à ce profil de machine" msgid "Activate air filtration" -msgstr "Activer la filtration de l'air" +msgstr "Activer la filtration de l’air" msgid "Activate for better air filtration. G-code command: M106 P3 S(0-255)" msgstr "" -"Activer pour une meilleure filtration de l'air. Commande du code G : M106 P3 " +"Activer pour une meilleure filtration de l’air. Commande G-code : M106 P3 " "S(0-255)" msgid "Fan speed" @@ -8338,22 +8581,21 @@ msgid "" "Speed of exhuast fan during printing.This speed will overwrite the speed in " "filament custom gcode" msgstr "" -"Vitesse du ventilateur d'extraction pendant l'impression. Cette vitesse " -"remplacera la vitesse dans gcode de filament personnalisé" +"Vitesse du ventilateur d’extraction pendant l’impression. Cette vitesse " +"écrasera la vitesse dans le G-code personnalisé du filament." msgid "Speed of exhuast fan after printing completes" -msgstr "Vitesse du ventilateur d'extraction après la fin de l'impression" +msgstr "Vitesse du ventilateur d’extraction après l’impression" msgid "No cooling for the first" -msgstr "Pas de ventilation pour la/les première(s)" +msgstr "Pas de refroidissement pour" msgid "" "Close all cooling fan for the first certain layers. Cooling fan of the first " "layer used to be closed to get better build plate adhesion" msgstr "" -"Arrêter tous les ventilateurs de refroidissement pour certaines premières " -"couches. Un arrêt des ventilateurs permet d’obtenir une meilleure adhérence " -"de la première couche sur le plateau" +"Éteignez tous les ventilateurs de refroidissement pour les premières " +"couches. Cela peut être utilisé pour améliorer l'adhérence à la plaque." msgid "Don't support bridges" msgstr "Ne pas supporter les ponts" @@ -8362,9 +8604,9 @@ msgid "" "Don't support the whole bridge area which make support very large. Bridge " "usually can be printing directly without support if not very long" msgstr "" -"Ne pas supporter toute la zone du pont, ce qui rend le support plus large. " -"Les ponts peuvent généralement s'imprimer directement sans support s'ils ne " -"sont pas très longs" +"Cela désactive le support des ponts, ce qui diminue le nombre de supports " +"requis. Les ponts peuvent généralement être imprimés directement sans " +"support s'ils ne sont pas très longs." msgid "Thick bridges" msgstr "Ponts épais" @@ -8374,13 +8616,25 @@ msgid "" "look worse. If disabled, bridges look better but are reliable just for " "shorter bridged distances." msgstr "" -"S'ils sont activés, les ponts sont plus fiables, peuvent couvrir de plus " -"longues distances, mais peuvent sembler moins bons. S'ils sont désactivés, " -"les ponts ont une meilleure apparence mais ne sont fiables que pour des " -"distances plus courtes." +"S'ils sont activés, les ponts sont plus fiables et peuvent couvrir de plus " +"longues distances, mais ils peuvent sembler moins jolis. S'ils sont " +"désactivés, les ponts ont une meilleure apparence mais ne sont fiables que " +"sur de courtes distances." + +msgid "Thick internal bridges" +msgstr "Ponts internes épais" + +msgid "" +"If enabled, thick internal bridges will be used. It's usually recommended to " +"have this feature turned on. However, consider turning it off if you are " +"using large nozzles." +msgstr "" +"Si cette option est activée, des ponts internes épais seront utilisés. Il " +"est généralement recommandé d’activer cette fonctionnalité. Pensez cependant " +"à la désactiver si vous utilisez des buses larges." msgid "Max bridge length" -msgstr "Longueur maximale des ponts" +msgstr "Longueur max des ponts" msgid "" "Max length of bridges that don't need support. Set it to 0 if you want all " @@ -8388,38 +8642,42 @@ msgid "" "any bridges to be supported." msgstr "" "Il s'agit de la longueur maximale des ponts qui n'ont pas besoin de support. " -"Une valeur à 0 permet que tous les ponts soient pris en charge, une valeur " -"très élevée permet qu'aucun pont ne soit pris en charge." +"Mettez 0 si vous souhaitez que tous les ponts soient pris en charge, ou " +"mettez une valeur très élevée si vous souhaitez qu'aucun pont ne soit pris " +"en charge." msgid "End G-code" msgstr "G-code de fin" msgid "End G-code when finish the whole printing" -msgstr "G-code lorsque l'ensemble de l'impression est terminée" +msgstr "Terminer le code G lorsque vous avez terminé toute l'impression" msgid "Between Object Gcode" -msgstr "" +msgstr "G-code entre objet" msgid "" "Insert Gcode between objects. This parameter will only come into effect when " "you print your models object by object" msgstr "" +"Insérer le G-code entre les objets. Ce paramètre n’entrera en vigueur que " +"lorsque vous imprimerez vos modèles objet par objet." msgid "End G-code when finish the printing of this filament" -msgstr "G-code lorsque l'impression de ce filament est terminée" +msgstr "Fin du code G lorsque l'impression de ce filament est terminée" msgid "Ensure vertical shell thickness" -msgstr "Veiller à l'épaisseur verticale de la coque" +msgstr "Assurer l'épaisseur verticale de la coque" msgid "" "Add solid infill near sloping surfaces to guarantee the vertical shell " "thickness (top+bottom solid layers)" msgstr "" -"Ajouter un remplissage solide près des surfaces en pente pour garantir " -"l'épaisseur verticale de la coque (couches solides supérieures + inférieures)" +"Ajoutez du remplissage solide à proximité des surfaces inclinées pour " +"garantir l'épaisseur verticale de la coque (couches solides supérieure" +"+inférieure)." msgid "Top surface pattern" -msgstr "Motif des surfaces supérieures" +msgstr "Motif de surface supérieure" msgid "Line pattern of top surface infill" msgstr "Motif de ligne du remplissage de la surface supérieure" @@ -8437,45 +8695,50 @@ msgid "Monotonic line" msgstr "Ligne monotone" msgid "Aligned Rectilinear" -msgstr "Rectiligne aligné" +msgstr "Rectiligne Aligné" msgid "Hilbert Curve" msgstr "Courbe de Hilbert" msgid "Archimedean Chords" -msgstr "Accords d'Archimède" +msgstr "Spirale d'Archimède" msgid "Octagram Spiral" -msgstr "Spirale octagramme" +msgstr "Spirale Octagramme" msgid "Bottom surface pattern" -msgstr "Motif des surfaces inférieures" +msgstr "Motif de surface inférieure" msgid "Line pattern of bottom surface infill, not bridge infill" msgstr "" -"Motif de ligne du remplissage de la surface inférieure, et non pas du " -"remplissage du pont" +"Motif de ligne du remplissage de la surface inférieure, pas du remplissage " +"du pont" msgid "Internal solid infill pattern" -msgstr "Motif de remplissage interne solide" +msgstr "Motif de remplissage solide interne" msgid "" -"Line pattern of internal solid infill. if the detect nattow internal solid " +"Line pattern of internal solid infill. if the detect narrow internal solid " "infill be enabled, the concentric pattern will be used for the small area." msgstr "" +"Modèle de ligne de remplissage interne. Si la détection d’un remplissage " +"interne étroit est activée, le modèle concentrique sera utilisé pour la " +"petite zone." msgid "" "Line width of outer wall. If expressed as a %, it will be computed over the " "nozzle diameter." msgstr "" +"Largeur de la ligne de la paroi extérieure. Si elle est exprimée en %, elle " +"sera calculée sur le diamètre de la buse." msgid "" "Speed of outer wall which is outermost and visible. It's used to be slower " "than inner wall speed to get better quality." msgstr "" -"Vitesse de la paroi qui est la plus à l'extérieur et visible. Elle est " -"utilisée pour être plus lente que la vitesse de la paroi interne pour " -"obtenir une meilleure qualité." +"Vitesse du mur extérieur qui est le plus à l'extérieur et visible. Il est " +"utilisé pour être plus lent que la vitesse de la paroi interne pour obtenir " +"une meilleure qualité." msgid "Small perimeters" msgstr "Petits périmètres" @@ -8488,7 +8751,7 @@ msgid "" msgstr "" "Ce paramètre séparé affectera la vitesse des périmètres ayant un rayon <= " "petite longueur de périmètre (généralement des trous). S’il est exprimé en " -"pourcentage (par exemple : 80%), il sera calculé sur la vitesse du mur " +"pourcentage (par exemple : 80%), il sera calculé sur la vitesse du mur " "extérieur ci-dessus. Mettre à zéro pour automatique." msgid "Small perimeters threshold" @@ -8500,26 +8763,93 @@ msgstr "" "Cela définit le seuil pour une petite longueur de périmètre. Le seuil par " "défaut est de 0 mm" -msgid "Order of walls" -msgstr "" +msgid "Walls printing order" +msgstr "Ordre d’impression des parois" -msgid "Print sequence of inner wall and outer wall. " +msgid "" +"Print sequence of the internal (inner) and external (outer) walls. \n" +"\n" +"Use Inner/Outer for best overhangs. This is because the overhanging walls " +"can adhere to a neighouring perimeter while printing. However, this option " +"results in slightly reduced surface quality as the external perimeter is " +"deformed by being squashed to the internal perimeter.\n" +"\n" +"Use Inner/Outer/Inner for the best external surface finish and dimensional " +"accuracy as the external wall is printed undisturbed from an internal " +"perimeter. However, overhang performance will reduce as there is no internal " +"perimeter to print the external wall against. This option requires a minimum " +"of 3 walls to be effective as it prints the internal walls from the 3rd " +"perimeter onwards first, then the external perimeter and, finally, the first " +"internal perimeter. This option is recomended against the Outer/Inner option " +"in most cases. \n" +"\n" +"Use Outer/Inner for the same external wall quality and dimensional accuracy " +"benefits of Inner/Outer/Inner option. However, the z seams will appear less " +"consistent as the first extrusion of a new layer starts on a visible " +"surface.\n" +"\n" +" " msgstr "" +"Séquence d'impression des parois internes (intérieures) et externes " +"(extérieures). \n" +"\n" +"Utilisez Inner/Outer pour obtenir les meilleurs surplombs. En effet, les " +"parois en surplomb peuvent adhérer à un périmètre voisin lors de " +"l'impression. Toutefois, cette option entraîne une légère diminution de la " +"qualité de la surface, car le périmètre externe est déformé par l'écrasement " +"du périmètre interne.\n" +"\n" +"Utilisez l’option Inner/Outer/Inner pour obtenir la meilleure finition de " +"surface externe et la meilleure précision dimensionnelle, car la paroi " +"externe est imprimée sans être dérangée par un périmètre interne. Cependant, " +"les performances de la paroi en surplomb seront réduites car il n’y a pas de " +"périmètre interne contre lequel imprimer la paroi externe. Cette option " +"nécessite un minimum de trois parois pour être efficace, car elle imprime " +"d’abord les parois internes à partir du troisième périmètre, puis le " +"périmètre externe et, enfin, le premier périmètre interne. Cette option est " +"recommandée par rapport à l’option Extérieur/intérieur dans la plupart des " +"cas. \n" +"\n" +"Utilisez l’option Extérieur/intérieur pour bénéficier de la même qualité de " +"paroi externe et de la même précision dimensionnelle que l’option Intérieur/" +"extérieur/intérieur. Cependant, les joints en z paraîtront moins cohérents " +"car la première extrusion d’une nouvelle couche commence sur une surface " +"visible.\n" +"\n" +" " -msgid "inner/outer" -msgstr "" +msgid "Inner/Outer" +msgstr "Intérieur/extérieur" -msgid "outer/inner" -msgstr "" +msgid "Outer/Inner" +msgstr "Extérieur/intérieur" -msgid "inner wall/outer wall/inner wall" -msgstr "" +msgid "Inner/Outer/Inner" +msgstr "Intérieur/extérieur/intérieur" msgid "Print infill first" -msgstr "" +msgstr "Imprimer d’abord le remplissage" -msgid "Order of wall/infill. false means print wall first. " +msgid "" +"Order of wall/infill. When the tickbox is unchecked the walls are printed " +"first, which works best in most cases.\n" +"\n" +"Printing walls first may help with extreme overhangs as the walls have the " +"neighbouring infill to adhere to. However, the infill will slighly push out " +"the printed walls where it is attached to them, resulting in a worse " +"external surface finish. It can also cause the infill to shine through the " +"external surfaces of the part." msgstr "" +"Ordre des parois/remplissages. Lorsque la case n’est pas cochée, les parois " +"sont imprimées en premier, ce qui fonctionne le mieux dans la plupart des " +"cas.\n" +"\n" +"L’impression des parois en premier peut s’avérer utile en cas de surplombs " +"extrêmes, car les parois ont le remplissage voisin auquel adhérer. " +"Cependant, le remplissage repoussera légèrement les parois imprimées à " +"l’endroit où il est fixé, ce qui se traduira par une moins bonne finition de " +"la surface extérieure. Cela peut également faire briller le remplissage à " +"travers les surfaces externes de la pièce." msgid "Height to rod" msgstr "Hauteur à la tige" @@ -8528,8 +8858,8 @@ msgid "" "Distance of the nozzle tip to the lower rod. Used for collision avoidance in " "by-object printing." msgstr "" -"Distance de la pointe de la buse à la tige inférieure. Utilisée pour éviter " -"les collisions dans l'impression par objet." +"Distance entre la pointe de la buse et la tige de carbone inférieure. " +"Utilisé pour éviter les collisions lors de l'impression \"par objets\"." msgid "Height to lid" msgstr "Hauteur au couvercle" @@ -8538,27 +8868,27 @@ msgid "" "Distance of the nozzle tip to the lid. Used for collision avoidance in by-" "object printing." msgstr "" -"Distance de la pointe de la buse au couvercle. Utilisée pour éviter les " -"collisions dans l'impression par objet." +"Distance entre la pointe de la buse et le capot. Utilisé pour éviter les " +"collisions lors de l'impression \"par objets\"." msgid "" "Clearance radius around extruder. Used for collision avoidance in by-object " "printing." msgstr "" -"Rayon autour de la tête d’impression. Utilisé pour éviter les collisions " -"dans l'impression par objet." +"Rayon de dégagement autour de l'extrudeuse : utilisé pour éviter les " +"collisions lors de l'impression par objets." msgid "Extruder Color" msgstr "Couleur de l'extrudeur" msgid "Only used as a visual help on UI" -msgstr "Utilisée uniquement comme aide visuelle sur l'interface utilisateur" +msgstr "Utilisé uniquement comme aide visuelle sur l'interface utilisateur" msgid "Extruder offset" -msgstr "Décalage de la hotend" +msgstr "Décalage de l'extrudeur" msgid "Flow ratio" -msgstr "Ratio du débit" +msgstr "Rapport de débit" msgid "" "The material may have volumetric change after switching between molten state " @@ -8567,12 +8897,12 @@ msgid "" "and 1.05. Maybe you can tune this value to get nice flat surface when there " "has slight overflow or underflow" msgstr "" -"Le matériau peut avoir un changement volumétrique après avoir basculé de " -"l'état fondu à l'état cristallin. Ce paramètre modifie proportionnellement " +"Le matériau peut avoir un changement volumétrique après avoir basculé entre " +"l'état fondu et l'état cristallin. Ce paramètre modifie proportionnellement " "tout le flux d'extrusion de ce filament dans le gcode. La plage de valeurs " -"recommandée est comprise entre 0.95 et 1.05. Vous devrez peut-être ajuster " -"cette valeur pour obtenir une belle surface plane en cas de légère sur-" -"extrusion ou sous-extrusion" +"recommandée est comprise entre 0,95 et 1,05. Vous pouvez peut-être ajuster " +"cette valeur pour obtenir une belle surface plane en cas de léger " +"débordement ou sous-dépassement" msgid "Enable pressure advance" msgstr "Activer le Pressure Advance" @@ -8595,28 +8925,28 @@ msgstr "" "Si elle est exprimée en %, elle sera calculée sur le diamètre de la buse." msgid "Keep fan always on" -msgstr "Ventilateur toujours actif" +msgstr "Garder le ventilateur toujours actif" msgid "" "If enable this setting, part cooling fan will never be stoped and will run " "at least at minimum speed to reduce the frequency of starting and stoping" msgstr "" -"Si ce paramètre est activé, le ventilateur de refroidissement ne sera jamais " -"arrêté et fonctionnera au minimum à la vitesse minimale pour réduire la " -"fréquence de démarrage et d'arrêt" +"Si ce paramètre est activé, le ventilateur de refroidissement partiel ne " +"sera jamais arrêté et fonctionnera au moins à la vitesse minimale pour " +"réduire la fréquence de démarrage et d'arrêt" msgid "Layer time" -msgstr "Durée de couche" +msgstr "Temps de couche" msgid "" "Part cooling fan will be enabled for layers of which estimated time is " "shorter than this value. Fan speed is interpolated between the minimum and " "maximum fan speeds according to layer printing time" msgstr "" -"Le ventilateur de refroidissement sera activé pour les couches dont la durée " -"estimée est inférieure à la valeur définie. La vitesse du ventilateur est " -"interpolée entre les vitesses minimales et maximales du ventilateur en " -"fonction de la durée d'impression de la couche" +"Le ventilateur de refroidissement partiel sera activé pour les couches dont " +"le temps estimé est inférieur à cette valeur. La vitesse du ventilateur est " +"interpolée entre les vitesses minimale et maximale du ventilateur en " +"fonction du temps d'impression de la couche" msgid "Default color" msgstr "Couleur par défaut" @@ -8625,59 +8955,59 @@ msgid "Default filament color" msgstr "Couleur du filament par défaut" msgid "Filament notes" -msgstr "Notes sur le filament" +msgstr "Notes du filament" msgid "You can put your notes regarding the filament here." msgstr "Vous pouvez mettre vos notes concernant le filament ici." msgid "Required nozzle HRC" -msgstr "HRC de la buse nécessaire" +msgstr "Buse HRC requise" msgid "" "Minimum HRC of nozzle required to print the filament. Zero means no checking " "of nozzle's HRC." msgstr "" -"HRC minimum de la buse nécessaire pour imprimer le filament. Une valeur à 0 " -"signifie aucune vérification du HRC de la buse." +"Dureté HRC minimum de la buse requis pour imprimer le filament. Une valeur " +"de 0 signifie qu'il n'y a pas de vérification de la dureté HRC de la buse." msgid "" "This setting stands for how much volume of filament can be melted and " "extruded per second. Printing speed is limited by max volumetric speed, in " "case of too high and unreasonable speed setting. Can't be zero" msgstr "" -"Ce paramètre représente le volume de filament pouvant être fondu et extrudé " -"par seconde. La vitesse d'impression est limitée par la vitesse volumétrique " -"maximale, en cas de réglage d’une vitesse trop élevée et déraisonnable. " -"Cette valeur ne peut pas être à 0" +"Ce paramètre correspond au volume de filament qui peut être fondu et extrudé " +"par seconde. La vitesse d'impression sera limitée par la vitesse " +"volumétrique maximale en cas de réglage de vitesse déraisonnablement trop " +"élevé. Cette valeur ne peut pas être nulle." msgid "mm³/s" msgstr "mm³/s" msgid "Filament load time" -msgstr "Durée de chargement du filament" +msgstr "Temps de chargement du filament" msgid "Time to load new filament when switch filament. For statistics only" msgstr "" -"Durée pour charger un nouveau filament lors du changement de filament. Pour " -"les statistiques uniquement" +"Il est temps de charger un nouveau filament lors du changement de filament. " +"Pour les statistiques uniquement" msgid "Filament unload time" -msgstr "Durée de déchargement du filament" +msgstr "Temps de déchargement du filament" msgid "Time to unload old filament when switch filament. For statistics only" msgstr "" -"Durée pour décharger l'ancien filament lors du changement de filament. Pour " -"les statistiques uniquement" +"Il est temps de décharger l'ancien filament lorsque vous changez de " +"filament. Pour les statistiques uniquement" msgid "" "Filament diameter is used to calculate extrusion in gcode, so it's important " "and should be accurate" msgstr "" "Le diamètre du filament est utilisé pour calculer les variables d'extrusion " -"dans le G-code, il est donc important qu'il soit exact et précis" +"dans le G-code, il est donc important qu'il soit exact et précis." msgid "Shrinkage" -msgstr "Rétrécissement" +msgstr "Pourcentage de retrait" #, fuzzy, c-format, boost-format msgid "" @@ -8687,21 +9017,21 @@ msgid "" "Be sure to allow enough space between objects, as this compensation is done " "after the checks." msgstr "" -"Entrez le pourcentage de retrait que le filament obtiendra après " +"Entrez le pourcentage de rétrécissement que le filament obtiendra après " "refroidissement (94% si vous mesurez 94mm au lieu de 100mm). La pièce sera " -"mise à l’échelle en X-Y pour compenser. Seul le filament utilisé pour le " +"mise à l’échelle en xy pour compenser. Seul le filament utilisé pour le " "périmètre est pris en compte.\n" -"Assurez-vous de laisser suffisamment d’espace entre les objets, car cette " -"compensation est effectuée après les vérifications." +"Veillez à laisser suffisamment d’espace entre les objets, car cette " +"compensation est effectuée après les contrôles." msgid "Loading speed" msgstr "Vitesse de chargement" msgid "Speed used for loading the filament on the wipe tower." -msgstr "Vitesse utilisée pour charger le filament sur la tour d'essuyage." +msgstr "Vitesse utilisée pour charger le filament sur la tour d’essuyage." msgid "Loading speed at the start" -msgstr "Vitesse de chargement au départ" +msgstr "Vitesse de chargement au démarrage" msgid "Speed used at the very beginning of loading phase." msgstr "Vitesse utilisée au tout début de la phase de chargement." @@ -8713,22 +9043,29 @@ msgid "" "Speed used for unloading the filament on the wipe tower (does not affect " "initial part of unloading just after ramming)." msgstr "" +"Vitesse utilisée pour le déchargement du filament sur la tour d’essuyage " +"(n’affecte pas la partie initiale de retrait juste après le pilonnage)." msgid "Unloading speed at the start" -msgstr "Vitesse de déchargement au départ" +msgstr "Vitesse de déchargement au démarrage" msgid "" "Speed used for unloading the tip of the filament immediately after ramming." msgstr "" +"Vitesse utilisée pour décharger la pointe du filament immédiatement après le " +"pilonnage." msgid "Delay after unloading" -msgstr "" +msgstr "Délai après déchargement" 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 "" +"Délai une fois le filament déchargé. Peut aider à obtenir des changements " +"d’outils fiables avec des matériaux flexibles qui peuvent nécessiter plus de " +"temps pour revenir aux dimensions d’origine." msgid "Number of cooling moves" msgstr "Nombre de mouvements de refroidissement" @@ -8737,17 +9074,19 @@ msgid "" "Filament is cooled by being moved back and forth in the cooling tubes. " "Specify desired number of these moves." msgstr "" +"Le filament est refroidi en étant déplacé d’avant en arrière dans les tubes " +"de refroidissement. Précisez le nombre souhaité de ces mouvements." msgid "Speed of the first cooling move" msgstr "Vitesse du premier mouvement de refroidissement" msgid "Cooling moves are gradually accelerating beginning at this speed." msgstr "" -"Les mouvements de refroidissement s'accélèrent progressivement à partir de " +"Les mouvements de refroidissement s’accélèrent progressivement à partir de " "cette vitesse." msgid "Minimal purge on wipe tower" -msgstr "Purge minimale sur la tour d’essuyage" +msgstr "Purge minimale sur la tour de nettoyage" msgid "" "After a tool change, the exact position of the newly loaded filament inside " @@ -8768,7 +9107,7 @@ msgstr "Vitesse du dernier mouvement de refroidissement" msgid "Cooling moves are gradually accelerating towards this speed." msgstr "" -"Les mouvements de refroidissement s'accélèrent progressivement vers cette " +"Les mouvements de refroidissement s’accélèrent progressivement vers cette " "vitesse." msgid "" @@ -8776,23 +9115,33 @@ msgid "" "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 "" +"Temps nécessaire au firmware de l’imprimante (ou au Multi Material Unit 2.0) " +"pour charger un nouveau filament lors d’un changement d’outil (lors de " +"l’exécution du code T). Ce temps est ajouté au temps d’impression total par " +"l’estimateur de temps du G-code." msgid "Ramming parameters" -msgstr "" +msgstr "Paramètres de pilonnage" msgid "" "This string is edited by RammingDialog and contains ramming specific " "parameters." msgstr "" +"Cette chaîne est éditée par RammingDialog et contient des paramètres " +"spécifiques au pilonnage." 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 "" +"Temps nécessaire au firmware de l’imprimante (ou au Multi Material Unit 2.0) " +"pour décharger un filament lors d’un changement d’outil (lors de l’exécution " +"du code T). Ce temps est ajouté au temps d’impression total par l’estimateur " +"de temps du G-code." msgid "Enable ramming for multitool setups" -msgstr "" +msgstr "Activer le pilonnage pour les configurations multi-outils" msgid "" "Perform ramming when using multitool printer (i.e. when the 'Single Extruder " @@ -8800,30 +9149,36 @@ msgid "" "amount of filament is rapidly extruded on the wipe tower just before the " "toolchange. This option is only used when the wipe tower is enabled." msgstr "" +"Effectuez un pilonnage lorsque vous utilisez une imprimante multi-outils " +"(c’est-à-dire lorsque l’option ‘Multi-matériau à extrudeur unique’ dans les " +"paramètres de l’imprimante n’est pas cochée). Une fois vérifié, une petite " +"quantité de filament est rapidement extrudée sur la tour d’essuyage juste " +"avant le changement d’outil. Cette option n’est utilisée que lorsque la tour " +"de nettoyage est activée." msgid "Multitool ramming volume" -msgstr "" +msgstr "Volume du pilonnage multi-outils" msgid "The volume to be rammed before the toolchange." -msgstr "" +msgstr "Volume à pilonner avant le changement d’outil." msgid "Multitool ramming flow" -msgstr "" +msgstr "Débit du pilonnage multi-outils" msgid "Flow used for ramming the filament before the toolchange." -msgstr "" +msgstr "Débit utilisé pour pilonner le filament avant le changement d’outil." msgid "Density" msgstr "Densité" msgid "Filament density. For statistics only" -msgstr "Densité du filament. Pour les statistiques uniquement" +msgstr "Densité des filaments. Pour les statistiques uniquement" msgid "g/cm³" msgstr "g/cm³" msgid "The material type of filament" -msgstr "Type de matériau du filament" +msgstr "Le type de matériau du filament" msgid "Soluble material" msgstr "Matériau soluble" @@ -8831,68 +9186,76 @@ msgstr "Matériau soluble" msgid "" "Soluble material is commonly used to print support and support interface" msgstr "" -"Le matériau soluble est couramment utilisé pour imprimer les supports et les " -"interfaces de support" +"Le matériau soluble est couramment utilisé pour imprimer le support et " +"l'interface de support" msgid "Support material" -msgstr "Matériau de supports" +msgstr "Supports" msgid "" "Support material is commonly used to print support and support interface" msgstr "" -"Le matériau de supports est généralement utilisé pour imprimer les supports " -"et les interfaces de support" +"Le matériau de support est généralement utilisé pour imprimer le support et " +"les interfaces de support." msgid "Softening temperature" -msgstr "Température de ramollissement" +msgstr "Température de vitrification" msgid "" "The material softens at this temperature, so when the bed temperature is " "equal to or greater than it, it's highly recommended to open the front door " "and/or remove the upper glass to avoid cloggings." msgstr "" +"Température où le matériau se ramollit. Lorsque la température du plateau " +"est égale ou supérieure à celle-ci, il est fortement recommandé d’ouvrir la " +"porte avant et/ou de retirer la vitre supérieure pour éviter les problèmes " +"d’obstruction." msgid "Price" -msgstr "Coût" +msgstr "Tarif" msgid "Filament price. For statistics only" -msgstr "Coût ​​des filaments. Pour les statistiques uniquement" +msgstr "Coût ​​des filaments, pour les statistiques uniquement." msgid "money/kg" -msgstr "€/kg" +msgstr "argent/kg" msgid "Vendor" -msgstr "Vendeur" +msgstr "Fabriquant" msgid "Vendor of filament. For show only" -msgstr "Vendeur de filament. Pour l'affichage uniquement" +msgstr "Fabriquant du filament." msgid "(Undefined)" -msgstr "(Non défini)" +msgstr "(Indéfini)" msgid "Infill direction" -msgstr "Direction du remplissage" +msgstr "Sens de remplissage" msgid "" "Angle for sparse infill pattern, which controls the start or main direction " "of line" msgstr "" -"Angle pour le motif de remplissage, qui contrôle le début ou la direction " +"Angle pour le motif de remplissage qui contrôle le début ou la direction " "principale de la ligne" msgid "Sparse infill density" msgstr "Densité de remplissage" -#, c-format -msgid "Density of internal sparse infill, 100% means solid throughout" +#, fuzzy, c-format, boost-format +msgid "" +"Density of internal sparse infill, 100% turns all sparse infill into solid " +"infill and internal solid infill pattern will be used" msgstr "" -"Densité du remplissage interne, Une valeur à 100%% signifie solide partout" +"Densité du remplissage interne clairsemé, 100% transforme tous les " +"remplissages clairsemés en remplissages solides et le modèle de remplissage " +"solide interne sera utilisé." msgid "Sparse infill pattern" msgstr "Motif de remplissage" msgid "Line pattern for internal sparse infill" -msgstr "Motif de ligne pour le remplissage" +msgstr "Motif de ligne du remplissage interne" msgid "Grid" msgstr "Grille" @@ -8919,10 +9282,10 @@ msgid "3D Honeycomb" msgstr "Nid d'abeille 3D" msgid "Support Cubic" -msgstr "Support cubique" +msgstr "Support Cubique" msgid "Lightning" -msgstr "Éclair" +msgstr "Lightning" msgid "Sparse infill anchor length" msgstr "Longueur de l’ancrage de remplissage interne" @@ -8940,7 +9303,7 @@ msgid "" msgstr "" "Connecter une ligne de remplissage à un périmètre interne avec un court " "segment de périmètre supplémentaire. S’il est exprimé en pourcentage " -"(exemple : 15%), il est calculé sur la largeur de l’extrusion de " +"(exemple : 15%), il est calculé sur la largeur de l’extrusion de " "remplissage. Si aucun segment de périmètre plus court que infill_anchor_max " "n’est trouvé, la ligne de remplissage est connectée à un segment de " "périmètre d’un seul côté et la longueur du segment de périmètre pris est " @@ -8949,7 +9312,7 @@ msgstr "" "ligne de remplissage." msgid "0 (no open anchors)" -msgstr "0 (pas d’ancres ouvertes)" +msgstr "0 (aucune ancre ouverte)" msgid "1000 (unlimited)" msgstr "1000 (illimité)" @@ -8970,7 +9333,7 @@ msgid "" msgstr "" "Connecter une ligne de remplissage à un périmètre interne avec un court " "segment de périmètre supplémentaire. S’il est exprimé en pourcentage " -"(exemple : 15 %), il est calculé sur la largeur de l’extrusion de " +"(exemple : 15 %), il est calculé sur la largeur de l’extrusion de " "remplissage. Slic3r essaie de connecter deux lignes de remplissage proches à " "un court segment de périmètre. Si aucun segment de périmètre plus court que " "ce paramètre n’est trouvé, la ligne de remplissage est connectée à un " @@ -8995,13 +9358,14 @@ msgid "" "Acceleration of top surface infill. Using a lower value may improve top " "surface quality" msgstr "" -"Accélération du remplissage de la surface supérieure. L’utilisation d’une " -"valeur plus basse peut améliorer la qualité de la surface supérieure" +"Il s'agit de l'accélération de la surface supérieure du remplissage. " +"Utiliser une valeur plus petite pourrait améliorer la qualité de la surface " +"supérieure." msgid "Acceleration of outer wall. Using a lower value can improve quality" msgstr "" -"Accélération de la paroi extérieure. L'utilisation d'une valeur inférieure " -"peut améliorer la qualité" +"Accélération du mur extérieur : l'utilisation d'une valeur inférieure peut " +"améliorer la qualité." msgid "" "Acceleration of bridges. If the value is expressed as a percentage (e.g. " @@ -9050,7 +9414,8 @@ msgstr "Ajuster l’accélération à la décélération" #, c-format, boost-format msgid "" "Klipper's max_accel_to_decel will be adjusted to this %% of acceleration" -msgstr "Le max_accel_to_decel de Klipper sera ajusté à ce %% d'accélération." +msgstr "" +"Le paramètre max_accel_to_decel de Klipper sera ajusté à %% d'accélération" msgid "Jerk of outer walls" msgstr "Jerk des parois extérieures" @@ -9074,6 +9439,8 @@ msgid "" "Line width of initial layer. If expressed as a %, it will be computed over " "the nozzle diameter." msgstr "" +"Largeur de la ligne de la couche initiale. Si elle est exprimée en %, elle " +"sera calculée sur le diamètre de la buse." msgid "Initial layer height" msgstr "Hauteur de couche initiale" @@ -9082,18 +9449,19 @@ msgid "" "Height of initial layer. Making initial layer height to be thick slightly " "can improve build plate adhension" msgstr "" -"Hauteur de la couche initiale. Une couche initiale légèrement épaisse peut " -"améliorer l'adhérence sur le plateau" +"Il s'agit de la hauteur de la première couche. L'augmentation de la hauteur " +"de la première couche peut améliorer l'adhérence sur le plateau." msgid "Speed of initial layer except the solid infill part" msgstr "" -"Vitesse de la couche initiale à l'exception des parties de remplissage solide" +"Vitesse de la couche initiale à l'exception de la partie de remplissage " +"solide" msgid "Initial layer infill" -msgstr "Remplissage solide" +msgstr "Remplissage de la couche initiale" msgid "Speed of solid infill part of initial layer" -msgstr "Vitesse des parties de remplissage solide de la couche initiale" +msgstr "Vitesse de la partie de remplissage solide de la couche initiale" msgid "Initial layer travel speed" msgstr "Déplacements" @@ -9113,7 +9481,7 @@ msgstr "" "couches spécifié." msgid "Initial layer nozzle temperature" -msgstr "Température de la buse de la couche initiale" +msgstr "Température de la buse de couche initiale" msgid "Nozzle temperature to print initial layer when using this filament" msgstr "" @@ -9121,14 +9489,14 @@ msgstr "" "l'utilisation de ce filament" msgid "Full fan speed at layer" -msgstr "Vitesse maximale du ventilateur à la couche" +msgstr "Ventilateur à pleine vitesse pour la couche" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " -"than \"close_fan_the_first_x_layers\", in which case the fan will be running " -"at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower than " +"\"close_fan_the_first_x_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." msgstr "" "La vitesse du ventilateur augmentera de manière linéaire à partir de zéro à " "la couche \"close_fan_the_first_x_layers\" jusqu’au maximum à la couche " @@ -9156,8 +9524,8 @@ msgid "" "Randomly jitter while printing the wall, so that the surface has a rough " "look. This setting controls the fuzzy position" msgstr "" -"Gigue aléatoire lors de l'impression de la paroi, de sorte que la surface " -"ait un aspect rugueux. Ce réglage contrôle la position floue" +"Gigue aléatoire lors de l'impression du mur, de sorte que la surface ait un " +"aspect rugueux. Ce réglage contrôle la position irrégulière" msgid "None" msgstr "Aucun" @@ -9172,24 +9540,30 @@ msgid "All walls" msgstr "Toutes les parois" msgid "Fuzzy skin thickness" -msgstr "Épaisseur de surface floue" +msgstr "Épaisseur de la surface Irrégulière" msgid "" "The width within which to jitter. It's adversed to be below outer wall line " "width" msgstr "" -"Largeur à l'intérieur de la gigue. Il est conseillé d'être en dessous de la " -"largeur de ligne de la paroi extérieure." +"La largeur à l'intérieur de laquelle jitter. Il est déconseillé d'être en " +"dessous de la largeur de la ligne du mur extérieur" msgid "Fuzzy skin point distance" -msgstr "Distance du point de fuite" +msgstr "Distance de point de la surface irrégulière" msgid "" "The average diatance between the random points introducded on each line " "segment" msgstr "" -"Distance moyenne entre les points aléatoires introduits sur chaque segment " -"de ligne" +"La distance moyenne entre les points aléatoires introduits sur chaque " +"segment de ligne" + +msgid "Apply fuzzy skin to first layer" +msgstr "Appliquer la surface irrégulière sur la première couche" + +msgid "Whether to apply fuzzy skin on the first layer" +msgstr "Application ou non d’une surface irrégulière sur la première couche" msgid "Filter out tiny gaps" msgstr "Filtrer les petits espaces" @@ -9198,42 +9572,42 @@ msgid "Layers and Perimeters" msgstr "Couches et Périmètres" msgid "Filter out gaps smaller than the threshold specified" -msgstr "Filtrer les écarts inférieurs au seuil spécifié" +msgstr "Filtrer les petits espaces au seuil spécifié." msgid "" "Speed of gap infill. Gap usually has irregular line width and should be " "printed more slowly" msgstr "" -"Vitesse de remplissage des espaces. Ils ont généralement une largeur de " -"ligne irrégulière et doivent être imprimés plus lentement" +"Vitesse de remplissage des interstices. L'écart a généralement une largeur " +"de ligne irrégulière et doit être imprimé plus lentement" msgid "Arc fitting" -msgstr "Fonction Arc" +msgstr "Raccord en arc" msgid "" "Enable this to get a G-code file which has G2 and G3 moves. And the fitting " "tolerance is same with resolution" msgstr "" -"Cette option permet d’obtenir un fichier G-code contenant des mouvements G2 " -"et G3. Et la tolérance d'ajustement est la même avec la résolution" +"Activez cette option pour obtenir un fichier G-code contenant des mouvements " +"G2 et G3. Et la tolérance d'ajustement est la même avec la résolution" msgid "Add line number" msgstr "Ajouter un numéro de ligne" msgid "Enable this to add line number(Nx) at the beginning of each G-Code line" msgstr "" -"Activer cette option pour ajouter un numéro de ligne (Nx) au début de chaque " +"Activez cette option pour ajouter un numéro de ligne (Nx) au début de chaque " "ligne G-Code" msgid "Scan first layer" -msgstr "Analyser la première couche" +msgstr "Numériser la première couche" msgid "" "Enable this to enable the camera on printer to check the quality of first " "layer" msgstr "" -"Cette option pour permettre à caméra de l'imprimante de vérifier la qualité " -"de la première couche" +"Activez cette option pour permettre à l'appareil photo de l'imprimante de " +"vérifier la qualité de la première couche" msgid "Nozzle type" msgstr "Type de buse" @@ -9242,8 +9616,8 @@ msgid "" "The metallic material of nozzle. This determines the abrasive resistance of " "nozzle, and what kind of filament can be printed" msgstr "" -"Matériau métallique de la buse. Cela détermine la résistance à l'abrasion de " -"la buse et le type de filament pouvant être imprimé" +"Le matériau métallique de la buse. Cela détermine la résistance à l'abrasion " +"de la buse et le type de filament pouvant être imprimé" msgid "Undefine" msgstr "Non défini" @@ -9258,48 +9632,50 @@ msgid "Brass" msgstr "Laiton" msgid "Nozzle HRC" -msgstr "HRC Buse" +msgstr "Dureté HRC buse" msgid "" "The nozzle's hardness. Zero means no checking for nozzle's hardness during " "slicing." msgstr "" -"Dureté de la buse. Une valeur à 0 signifie qu'il n'y a pas de vérification " -"de la dureté de la buse pendant le découpage." +"La dureté de la buse. Zéro signifie qu'il n'est pas nécessaire de vérifier " +"la dureté de la buse pendant le tranchage." msgid "HRC" msgstr "HRC" msgid "Printer structure" -msgstr "Structure de l'imprimante" +msgstr "Structure de l’imprimante" msgid "The physical arrangement and components of a printing device" -msgstr "L'agencement physique et les composants d'un dispositif d'impression" +msgstr "Disposition physique et les composants du périphérique d’impression" msgid "CoreXY" -msgstr "" +msgstr "CoreXY" msgid "I3" -msgstr "" +msgstr "I3" msgid "Hbot" -msgstr "" +msgstr "Hbot" msgid "Delta" -msgstr "" +msgstr "Delta" msgid "Best object position" -msgstr "Meilleure position de l'objet" +msgstr "Meilleure position d’organisation automatique" msgid "Best auto arranging position in range [0,1] w.r.t. bed shape." msgstr "" -"Meilleure position de rangement automatique dans l'intervalle [0,1] par " -"rapport à la forme du lit." +"Meilleure position d’organisation automatique dans la plage [0,1] par " +"rapport à forme du plateau." msgid "" "Enable this option if machine has auxiliary part cooling fan. G-code " "command: M106 P2 S(0-255)." msgstr "" +"Activer cette option si l’imprimante est équipée d'un ventilateur de " +"refroidissement auxiliaire. Commande G-code : M106 P2 S (0-255)." msgid "" "Start the fan this number of seconds earlier than its target start time (you " @@ -9348,35 +9724,40 @@ msgstr "" "Mettre à 0 pour désactiver." msgid "Time cost" -msgstr "Coûts liés au temps" +msgstr "Coût horaire" msgid "The printer cost per hour" -msgstr "Le coût horaire de l'imprimante" +msgstr "Coût horaire de l’imprimante" msgid "money/h" -msgstr "argent/h" +msgstr "€/heure" msgid "Support control chamber temperature" -msgstr "Soutenir la température de la chambre de contrôle" +msgstr "Contrôle de température de la chambre" msgid "" "This option is enabled if machine support controlling chamber temperature\n" "G-code command: M141 S(0-255)" msgstr "" +"Activez cette option si la machine prend en charge le contrôle de la " +"température de la chambre\n" +"Commande de G-code : M141 S(0-255)" msgid "Support air filtration" -msgstr "Favoriser la filtration de l'air" +msgstr "Filtration de l’air" msgid "" "Enable this if printer support air filtration\n" "G-code command: M106 P3 S(0-255)" msgstr "" +"Activez cette option si l’imprimante prend en charge la filtration de l’air\n" +"Commande G-code : M106 P3 S(0-255)" msgid "G-code flavor" -msgstr "Version de G-code" +msgstr "Version du G-code" msgid "What kind of gcode the printer is compatible with" -msgstr "Type de gcode avec lequel l'imprimante est compatible" +msgstr "Avec quel type de gcode l'imprimante est-elle compatible" msgid "Klipper" msgstr "Klipper" @@ -9422,20 +9803,22 @@ msgid "" "Automatically Combine sparse infill of several layers to print together to " "reduce time. Wall is still printed with original layer height." msgstr "" -"Combiner automatiquement plusieurs couches de remplissage à imprimer " -"ensemble afin de réduire la durée. La paroi est toujours imprimée avec la " +"Combinez automatiquement le remplissage de plusieurs couches pour imprimer " +"ensemble afin de réduire le temps. Le mur est toujours imprimé avec la " "hauteur de couche d'origine." msgid "Filament to print internal sparse infill." -msgstr "Filament pour imprimer le remplissage interne." +msgstr "Filament pour imprimer un remplissage interne." msgid "" "Line width of internal sparse infill. If expressed as a %, it will be " "computed over the nozzle diameter." msgstr "" +"Largeur de ligne du remplissage interne clairsemé. Si elle est exprimée en " +"%, elle sera calculée sur le diamètre de la buse." msgid "Infill/Wall overlap" -msgstr "Chevauchement du remplissage et de la paroi" +msgstr "Chevauchement de remplissage/mur" msgid "" "Infill area is enlarged slightly to overlap with wall for better bonding. " @@ -9443,7 +9826,7 @@ msgid "" msgstr "" "La zone de remplissage est légèrement agrandie pour chevaucher le mur pour " "une meilleure adhérence. La valeur en pourcentage est relative à la largeur " -"de ligne du remplissage" +"de ligne du remplissage." msgid "Speed of internal sparse infill" msgstr "Vitesse de remplissage interne" @@ -9461,16 +9844,19 @@ msgstr "" "ou un matériau de support soluble" msgid "Maximum width of a segmented region" -msgstr "" +msgstr "Largeur maximale d’une région segmentée" msgid "Maximum width of a segmented region. Zero disables this feature." msgstr "" +"Largeur maximale d’une région segmentée. Zéro désactive cette fonction." msgid "Interlocking depth of a segmented region" -msgstr "" +msgstr "Profondeur d’emboîtement d’une région segmentée" msgid "Interlocking depth of a segmented region. Zero disables this feature." msgstr "" +"Profondeur d’imbrication d’une région segmentée. Zéro désactive cette " +"fonction." msgid "Ironing Type" msgstr "Type de lissage" @@ -9479,12 +9865,12 @@ msgid "" "Ironing is using small flow to print on same height of surface again to make " "flat surface more smooth. This setting controls which layer being ironed" msgstr "" -"Le lissage utilise un petit débit pour imprimer à nouveau sur la même " +"Le repassage utilise un petit débit pour imprimer à nouveau sur la même " "hauteur de surface pour rendre la surface plane plus lisse. Ce paramètre " -"contrôle quelle couche doit être lissée" +"contrôle quelle couche est repassée" msgid "No ironing" -msgstr "Pas de lissage" +msgstr "Pas de repassage" msgid "Top surfaces" msgstr "Surfaces supérieures" @@ -9499,62 +9885,62 @@ msgid "Ironing Pattern" msgstr "Modèle de repassage" msgid "The pattern that will be used when ironing" -msgstr "Le motif qui sera utilisé pour le repassage" +msgstr "Motif qui sera utilisé lors du lissage" msgid "Ironing flow" -msgstr "Débit de lissage" +msgstr "Flux de repassage" msgid "" "The amount of material to extrude during ironing. Relative to flow of normal " "layer height. Too high value results in overextrusion on the surface" msgstr "" -"Quantité de matière à extruder lors du lissage. Relatif au débit de la " -"hauteur de couche normale. Une valeur trop élevée entraîne une sur-extrusion " +"La quantité de matière à extruder lors du repassage. Relatif au débit de la " +"hauteur de couche normale. Une valeur trop élevée entraîne une surextrusion " "en surface" msgid "Ironing line spacing" -msgstr "Espacement des lignes de lissage" +msgstr "Espacement des lignes de repassage" msgid "The distance between the lines of ironing" -msgstr "Distance entre les lignes de lissage" +msgstr "La distance entre les lignes de repassage" msgid "Ironing speed" -msgstr "Vitesse de lissage" +msgstr "Vitesse de repassage" msgid "Print speed of ironing lines" -msgstr "Vitesse d'impression des lignes de lissage" +msgstr "Vitesse d'impression des lignes de repassage" msgid "Ironing angle" -msgstr "Angle de repassage" +msgstr "Angle de lissage" msgid "" "The angle ironing is done at. A negative number disables this function and " "uses the default method." msgstr "" -"Angle auquel le repassage des angles se fait. Un nombre négatif désactive " -"cette fonction et utilise la méthode par défaut." +"Angle auquel le lissage se fait. Un nombre négatif désactive cette fonction " +"et utilise la méthode par défaut." msgid "This gcode part is inserted at every layer change after lift z" msgstr "" -"Cette partie gcode est insérée à chaque changement de couche après une levée " -"en Z" +"Cette partie gcode est insérée à chaque changement de couche après lift z" msgid "Supports silent mode" -msgstr "Prise en charge du mode silencieux" +msgstr "Prend en charge le mode silencieux" msgid "" "Whether the machine supports silent mode in which machine use lower " "acceleration to print" msgstr "" -"Prise en charge du mode silencieux dans lequel l’imprimante utilise une " -"accélération plus faible pour imprimer" +"Si la machine prend en charge le mode silencieux dans lequel la machine " +"utilise une accélération plus faible pour imprimer" msgid "" "This G-code will be used as a code for the pause print. User can insert " "pause G-code in gcode viewer" msgstr "" -"Ce G-code sera utilisé comme code pour la pause d'impression. L'utilisateur " -"peut insérer un G-code de pause dans la visionneuse G-code" +"Ce G-code sera utilisé comme code pour la pause d'impression. Les " +"utilisateurs peuvent insérer un G-code de pause dans la visionneuse de G-" +"code." msgid "This G-code will be used as a custom code" msgstr "Ce G-code sera utilisé comme code personnalisé" @@ -9572,67 +9958,67 @@ msgid "Maximum speed E" msgstr "Vitesse maximale E" msgid "Machine limits" -msgstr "Limites de l’imprimante" +msgstr "Limites de la machine" msgid "Maximum X speed" -msgstr "Vitesse maximale de l’axe X" +msgstr "Vitesse maximale X" msgid "Maximum Y speed" -msgstr "Vitesse maximale de l’axe Y" +msgstr "Vitesse Y maximale" msgid "Maximum Z speed" -msgstr "Vitesse maximale de l’axe Z" +msgstr "Vitesse Z maximale" msgid "Maximum E speed" -msgstr "Vitesse maximale de l’extrudeur" +msgstr "Vitesse E maximale" msgid "Maximum acceleration X" -msgstr "Accélération maximale X" +msgstr "Accélérations maximum X" msgid "Maximum acceleration Y" -msgstr "Accélération maximale Y" +msgstr "Accélérations maximum Y" msgid "Maximum acceleration Z" -msgstr "Accélération maximale Z" +msgstr "Accélérations maximum Z" msgid "Maximum acceleration E" -msgstr "Accélération maximale E" +msgstr "Accélérations maximum E" msgid "Maximum acceleration of the X axis" -msgstr "Accélération maximale de l'axe X" +msgstr "Accélération maximum de l'axe X" msgid "Maximum acceleration of the Y axis" -msgstr "Accélération maximale de l'axe Y" +msgstr "Accélération maximum de l'axe Y" msgid "Maximum acceleration of the Z axis" -msgstr "Accélération maximale de l'axe Z" +msgstr "Accélération maximum de l'axe Z" msgid "Maximum acceleration of the E axis" -msgstr "Accélération maximale de l’extrudeur" +msgstr "Accélération maximum de l'axe E" msgid "Maximum jerk X" -msgstr "Jerk maximum X" +msgstr "Mouvement brusque maximum X" msgid "Maximum jerk Y" -msgstr "Jerk maximum Y" +msgstr "Mouvement brusque maximum Y" msgid "Maximum jerk Z" -msgstr "Jerk maximum Z" +msgstr "Mouvement brusque maximum Z" msgid "Maximum jerk E" -msgstr "Jerk maximum E" +msgstr "Mouvement brusque maximum E" msgid "Maximum jerk of the X axis" -msgstr "Jerk maximum de l'axe X" +msgstr "Mouvement brusque maximum de l'axe X" msgid "Maximum jerk of the Y axis" -msgstr "Jerk maximum de l'axe Y" +msgstr "Mouvement brusque maximum de l'axe Y" msgid "Maximum jerk of the Z axis" -msgstr "Jerk maximum de l'axe Z" +msgstr "Mouvement brusque maximum de l'axe Z" msgid "Maximum jerk of the E axis" -msgstr "Jerk maximum de l’extrudeur" +msgstr "Mouvement brusque maximum de l'axe E" msgid "Minimum speed for extruding" msgstr "Vitesse minimale d'extrusion" @@ -9647,32 +10033,32 @@ msgid "Minimum travel speed (M205 T)" msgstr "Vitesse de déplacement minimale (M205 T)" msgid "Maximum acceleration for extruding" -msgstr "Accélération maximale de l'extrusion" +msgstr "Accélération maximale pour l'extrusion" msgid "Maximum acceleration for extruding (M204 P)" -msgstr "Accélération maximale de l'extrusion (M204 P)" +msgstr "Accélération maximale pour l'extrusion (M204 P)" msgid "Maximum acceleration for retracting" -msgstr "Accélération maximale de la rétraction" +msgstr "Accélération maximale pour la rétraction" msgid "Maximum acceleration for retracting (M204 R)" -msgstr "Accélération maximale de la rétraction (M204 R)" +msgstr "Accélération maximale pour la rétraction (M204 R)" msgid "Maximum acceleration for travel" -msgstr "Accélération maximale de déplacement" +msgstr "Accélération maximale pour le déplacement" msgid "Maximum acceleration for travel (M204 T), it only applies to Marlin 2" msgstr "" -"Accélération maximale pour le déplacement (M204 T), elle ne s'applique qu'à " +"Accélération maximale de déplacement (M204 T), cela ne s’applique qu’à " "Marlin 2" msgid "" "Part cooling fan speed may be increased when auto cooling is enabled. This " "is the maximum speed limitation of part cooling fan" msgstr "" -"La vitesse du ventilateur de refroidissement peut être augmentée lorsque le " -"refroidissement automatique est activé. Il s'agit de la limitation de " -"vitesse maximale du ventilateur de refroidissement" +"La vitesse du ventilateur de refroidissement partiel peut être augmentée " +"lorsque le refroidissement automatique est activé. Il s'agit de la " +"limitation de vitesse maximale du ventilateur de refroidissement partiel" msgid "Max" msgstr "Maximum" @@ -9681,12 +10067,12 @@ msgid "" "The largest printable layer height for extruder. Used tp limits the maximum " "layer hight when enable adaptive layer height" msgstr "" -"La plus grande hauteur de couche imprimable pour l'extrudeur. Utilisé pour " -"limiter la hauteur de couche maximale lorsque la hauteur de couche " -"adaptative est activée" +"La plus grande hauteur de couche imprimable pour l'extrudeuse. Utilisé tp " +"limite la hauteur de couche maximale lorsque la hauteur de couche adaptative " +"est activée" msgid "Extrusion rate smoothing" -msgstr "Lissage du taux d'extrusion" +msgstr "Lissage du taux d’extrusion" msgid "" "This parameter smooths out sudden extrusion rate changes that happen when " @@ -9716,9 +10102,38 @@ msgid "" "\n" "Note: this parameter disables arc fitting." msgstr "" +"Ce paramètre atténue les changements soudains du taux d’extrusion qui se " +"produisent lorsque l’imprimante passe d’une impression à haut débit (vitesse " +"élevée / largeur de ligne plus grande) à une extrusion à débit plus faible " +"(vitesse plus faible / largeur de ligne plus petite) et vice versa.\n" +"\n" +"Il définit le taux maximum auquel le débit volumétrique extrudé en mm3/sec " +"peut varier dans le temps. Des valeurs plus élevées signifient que des " +"changements du taux d’extrusion plus élevés sont autorisés, ce qui entraîne " +"des transitions de vitesse plus rapides.\n" +"\n" +"Une valeur de 0 désactive la fonctionnalité.\n" +"\n" +"Pour une imprimante direct drive à grande vitesse et à haut débit (comme " +"BambuLab ou Voron), cette valeur n’est généralement pas nécessaire. " +"Cependant, cela peut apporter un avantage marginal dans certains cas où les " +"vitesses varient considérablement. Par exemple, en cas de ralentissements " +"agressifs dus à des surplombs. Dans ces cas, une valeur élevée d’environ " +"300-350 mm3/s2 est recommandée car elle permet un lissage juste suffisant " +"pour aider l’augmentation de la pression pour obtenir une transition de " +"débit plus douce.\n" +"\n" +"Pour les imprimantes plus lentes sans fonction de pressure advance, la " +"valeur doit être réglée beaucoup plus bas. Une valeur de 10-15 mm3/s2 est un " +"bon point de départ en direct drive et de 5-10 mm3/s2 en Bowden.\n" +"\n" +"Cette fonctionnalité est connue sous le nom de Pressure Equalizer dans Prusa " +"Slicer.\n" +"\n" +"Remarque : ce paramètre désactive la fonction Arc." msgid "mm³/s²" -msgstr "" +msgstr "mm³/s²" msgid "Smoothing segment length" msgstr "Longueur du segment de lissage" @@ -9733,9 +10148,18 @@ msgid "" "\n" "Allowed values: 1-5" msgstr "" +"Une valeur inférieure entraîne des transitions du taux d’extrusion plus " +"douces. Cependant, cela entraîne un fichier gcode beaucoup plus volumineux " +"et davantage d’instructions à traiter par l’imprimante.\n" +"\n" +"La valeur 3 par défaut fonctionne bien dans la plupart des cas. Si votre " +"imprimante a du mal à suivre, augmentez cette valeur pour réduire le nombre " +"de réglages effectués\n" +"\n" +"Valeurs autorisées : 1-5" msgid "Minimum speed for part cooling fan" -msgstr "Vitesse minimale du ventilateur de refroidissement" +msgstr "Vitesse minimale du ventilateur de refroidissement partiel" msgid "" "Speed of auxiliary part cooling fan. Auxiliary fan will run at this speed " @@ -9744,6 +10168,11 @@ msgid "" "Please enable auxiliary_fan in printer settings to use this feature. G-code " "command: M106 P2 S(0-255)" msgstr "" +"Vitesse du ventilateur de refroidissement auxiliaire. Le ventilateur " +"auxiliaire fonctionnera à cette vitesse pendant l'impression, à l'exception " +"des premières couches définies sans refroidissement.\n" +"Veuillez activer auxiliaire_fan dans les paramètres de l’imprimante pour " +"utiliser cette fonctionnalité. Commande G-code : M106 P2 S(0-255)" msgid "Min" msgstr "Minimum" @@ -9752,9 +10181,9 @@ msgid "" "The lowest printable layer height for extruder. Used tp limits the minimum " "layer hight when enable adaptive layer height" msgstr "" -"La plus petite hauteur de couche imprimable pour l'extrudeur. Utilisé pour " -"limiter la hauteur de couche minimale lorsque la hauteur de couche " -"adaptative est activée" +"La hauteur de couche imprimable la plus basse pour l'extrudeuse. Utilisé tp " +"limite la hauteur de couche minimale lorsque la hauteur de couche adaptative " +"est activée" msgid "Min print speed" msgstr "Vitesse d'impression minimale" @@ -9764,22 +10193,26 @@ msgid "" "cooling is enabled, when printing overhangs and when feature speeds are not " "specified explicitly." msgstr "" +"La vitesse d’impression minimale lors du ralentissement pour un meilleur " +"refroidissement des couches est activée, lors de l’impression des surplombs " +"et lorsque les fonctionnalités de vitesses ne sont pas spécifiées " +"explicitement." msgid "Nozzle diameter" msgstr "Diamètre de la buse" msgid "Diameter of nozzle" -msgstr "Diamètre de la buse" +msgstr "Diamètre de buse" msgid "Configuration notes" -msgstr "Notes de configuration" +msgstr "Notes de la configuration" msgid "" "You can put here your personal notes. This text will be added to the G-code " "header comments." msgstr "" "Vous pouvez mettre ici vos notes personnelles. Ce texte sera ajouté aux " -"commentaires d'en-tête du G-code." +"commentaires d’en-tête du G-code." msgid "Host Type" msgstr "Type d'hôte" @@ -9788,8 +10221,8 @@ msgid "" "Slic3r can upload G-code files to a printer host. This field must contain " "the kind of the host." msgstr "" -"Slic3r peut télécharger des fichiers G-code sur une imprimante hôte. Ce " -"champ doit contenir le genre de l'hôte." +"Slic3r peut téléverser des fichiers G-code sur une imprimante hôte. Ce champ " +"doit contenir le type d'hôte." msgid "Nozzle volume" msgstr "Volume de la buse" @@ -9799,36 +10232,47 @@ msgstr "" "Volume de la buse entre le coupeur de filament et l'extrémité de la buse" msgid "Cooling tube position" -msgstr "" +msgstr "Position du tube de refroidissement" msgid "Distance of the center-point of the cooling tube from the extruder tip." msgstr "" +"Distance entre le point central du tube de refroidissement et la pointe de " +"l’extrudeur." msgid "Cooling tube length" -msgstr "" +msgstr "Longueur du tube de refroidissement" msgid "Length of the cooling tube to limit space for cooling moves inside it." msgstr "" +"Longueur du tube de refroidissement pour limiter l’espace à l’intérieur du " +"tube de refroidissement." msgid "High extruder current on filament swap" -msgstr "" +msgstr "Courant de l’extrudeur élevé lors du changement de filament" 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 "" +"Il peut être avantageux d’augmenter le courant du moteur de l’extrudeur " +"pendant la séquence d’échange de filament pour permettre des vitesses " +"d’alimentation rapides et pour surmonter la résistance lors du chargement " +"d’un filament." msgid "Filament parking position" -msgstr "" +msgstr "Position de stationnement du filament" 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 "" +"Distance entre la pointe de l’extrudeur et la position où le filament est " +"parqué une fois déchargé. Cela doit correspondre à la valeur du firmware de " +"l’imprimante." msgid "Extra loading distance" -msgstr "" +msgstr "Distance de chargement supplémentaire" msgid "" "When set to zero, the distance the filament is moved from parking position " @@ -9836,26 +10280,32 @@ msgid "" "positive, it is loaded further, if negative, the loading move is shorter " "than unloading." msgstr "" +"Lorsqu’il est réglé sur zéro, la distance à laquelle le filament est déplacé " +"depuis la position de stationnement pendant le chargement est exactement la " +"même que celle à laquelle il a été déplacé pendant le déchargement. " +"Lorsqu’il est positif, il est chargé davantage, s’il est négatif, le " +"mouvement de chargement est plus court que le déchargement." msgid "Start end points" -msgstr "Points de départ et d’arrivée" +msgstr "Points de départ et d'arrivée" msgid "The start and end points which is from cutter area to garbage can." msgstr "" -"Points de départ et d’arrivée qui vont de la zone de coupe à la poubelle." +"Les points de départ et d'arrivée qui se situent entre la zone de coupe et " +"la goulotte d'évacuation." msgid "Reduce infill retraction" -msgstr "Réduire les rétractions lors du remplissage" +msgstr "Réduire la rétraction du remplissage" msgid "" "Don't retract when the travel is in infill area absolutely. That means the " "oozing can't been seen. This can reduce times of retraction for complex " "model and save printing time, but make slicing and G-code generating slower" msgstr "" -"Ne pas rétracter lorsque le déplacement se trouve dans la zone de " -"remplissage. Cela peut réduire les temps de rétraction pour les modèles " -"complexes et réduire la durée d'impression, mais rend le découpage et la " -"génération du G-code plus lent" +"Ne pas effectuer de rétractation lors de déplacement en zone de remplissage " +"car même si l’extrudeur suinte, les coulures ne seraient pas visibles. Cela " +"peut réduire les rétractations pour les modèles complexes et économiser du " +"temps d’impression, mais ralentit le tranchage et la génération du G-code." msgid "Enable" msgstr "Activer" @@ -9868,54 +10318,63 @@ msgstr "" "L'utilisateur peut définir lui-même le nom du fichier de projet lors de " "l'exportation" -msgid "Make overhang printable" -msgstr "" +msgid "Make overhangs printable" +msgstr "Rendre les surplombs imprimables" msgid "Modify the geometry to print overhangs without support material." -msgstr "" +msgstr "Modifier la géométrie pour imprimer les surplombs sans support." -msgid "Make overhang printable maximum angle" -msgstr "" +msgid "Make overhangs printable - Maximum angle" +msgstr "Rendre les surplombs imprimables - Angle maximal" msgid "" "Maximum angle of overhangs to allow after making more steep overhangs " "printable.90° will not change the model at all and allow any overhang, while " "0 will replace all overhangs with conical material." msgstr "" +"Angle maximal des surplombs à autoriser après avoir rendu imprimables les " +"surplombs plus raides. Une valeur de 90° ne changera pas du tout le modèle " +"et n’autorisera aucun surplomb, tandis que 0 remplacera tous les surplombs " +"par un matériau conique." -msgid "Make overhang printable hole area" -msgstr "" +msgid "Make overhangs printable - Hole area" +msgstr "Rendre les surplombs imprimables - Zone de trous" msgid "" "Maximum area of a hole in the base of the model before it's filled by " "conical material.A value of 0 will fill all the holes in the model base." msgstr "" +"Aire maximale d’un trou dans la base du modèle avant qu’il ne soit rempli " +"par un matériau conique. Une valeur de 0 remplira tous les trous dans la " +"base du modèle." msgid "mm²" msgstr "mm²" msgid "Detect overhang wall" -msgstr "Détecter une paroi en surplomb" +msgstr "Détecter un mur en surplomb" #, c-format, boost-format msgid "" "Detect the overhang percentage relative to line width and use different " "speed to print. For 100%% overhang, bridge speed is used." msgstr "" -"Détecter le pourcentage de surplomb par rapport à la largeur de la ligne et " -"utilisez une vitesse différente pour imprimer. Pour un surplomb de 100%%, la " +"Détectez le pourcentage de surplomb par rapport à la largeur de la ligne et " +"utilisez une vitesse différente pour imprimer. Pour un surplomb de 100%% la " "vitesse du pont est utilisée." msgid "" "Line width of inner wall. If expressed as a %, it will be computed over the " "nozzle diameter." msgstr "" +"Largeur de ligne de la paroi intérieure. Si elle est exprimée en %, elle " +"sera calculée sur le diamètre de la buse." msgid "Speed of inner wall" msgstr "Vitesse de la paroi intérieure" msgid "Number of walls of every layer" -msgstr "Nombre de parois de chaque couche" +msgstr "Nombre de murs de chaque couche" msgid "" "If you want to process the output G-code through custom scripts, just list " @@ -9931,38 +10390,36 @@ msgstr "" "configuration Slic3r en lisant les variables d’environnement." msgid "Printer notes" -msgstr "" +msgstr "Notes de l’mprimante" msgid "You can put your notes regarding the printer here." -msgstr "" +msgstr "Vous pouvez mettre vos notes concernant l’imprimante ici." msgid "Raft contact Z distance" -msgstr "Distance Z de contact du radeau" +msgstr "Distance Z de contact du raft" msgid "Z gap between object and raft. Ignored for soluble interface" -msgstr "" -"Espace Z entre l'objet et le radeau. Ignoré pour les interfaces de support " -"solubles" +msgstr "Écart en Z entre l'objet et le radeau. Ignoré pour l'interface soluble" msgid "Raft expansion" -msgstr "Expansion du radeau" +msgstr "Agrandissement du raft" msgid "Expand all raft layers in XY plane" -msgstr "Etendre toutes les couches de radeau dans le plan X-Y" +msgstr "Développer toutes les couches de radeau dans le plan XY" msgid "Initial layer density" -msgstr "Densité de la couche initiale" +msgstr "Densité de couche initiale" msgid "Density of the first raft or support layer" -msgstr "Densité du premier radeau ou couche de support" +msgstr "Densité du premier radier ou couche de support" msgid "Initial layer expansion" -msgstr "Expension de la couche initiale" +msgstr "Extension de la couche initiale" msgid "Expand the first raft or support layer to improve bed plate adhesion" msgstr "" -"Expension de la première couche du radeau pour améliorer l'adhérence sur le " -"plateau" +"Développez le premier radeau ou couche de support pour améliorer l'adhérence " +"de la plaque d'assise" msgid "Raft layers" msgstr "Couches du radeau" @@ -9971,21 +10428,21 @@ msgid "" "Object will be raised by this number of support layers. Use this function to " "avoid wrapping when print ABS" msgstr "" -"Nombre de couches du radeau. Utilisez cette fonction pour éviter la " -"déformation lors de l'impression ABS" +"L'objet sera élevé par ce nombre de couches de support. Utilisez cette " +"fonction pour éviter l'emballage lors de l'impression ABS" msgid "" "G-code path is genereated after simplifing the contour of model to avoid too " "much points and gcode lines in gcode file. Smaller value means higher " "resolution and more time to slice" msgstr "" -"Le chemin du G-code est généré après avoir simplifié le contour du modèle " -"pour éviter trop de points et de lignes dans le fichier gcode. Une valeur " -"plus petite signifie une résolution plus élevée et plus de temps pour " -"découper" +"Le chemin du code G est généré après avoir simplifié le contour du modèle " +"pour éviter trop de points et de lignes gcode dans le fichier gcode. Une " +"valeur plus petite signifie une résolution plus élevée et plus de temps pour " +"trancher" msgid "Travel distance threshold" -msgstr "Distance minimale" +msgstr "Seuil de distance parcourue" msgid "" "Only trigger retraction when the travel distance is longer than this " @@ -9995,107 +10452,118 @@ msgstr "" "à ce seuil" msgid "Retract amount before wipe" -msgstr "Quantité de rétraction avant essuyage" +msgstr "Quantité de rétractation avant essuyage" msgid "" "The length of fast retraction before wipe, relative to retraction length" msgstr "" -"Longueur de la rétraction rapide avant l’essuyage, par rapport à la longueur " -"de la rétraction" +"La longueur de la rétraction rapide avant le balayage, par rapport à la " +"longueur de la rétraction" msgid "Retract when change layer" -msgstr "Rétracter au changement de couche" +msgstr "Rétracter lors de changement de couche" msgid "Force a retraction when changes layer" -msgstr "Forcer une rétraction lors d'un changement de couche" +msgstr "Cela force une rétractation sur les changements de couche." msgid "Length" msgstr "Longueur" msgid "Retraction Length" -msgstr "Longueur de rétraction" +msgstr "Longueur de Rétractation" msgid "" "Some amount of material in extruder is pulled back to avoid ooze during long " "travel. Set zero to disable retraction" msgstr "" -"Une certaine quantité de filament dans l'extrudeur est retirée pour éviter " -"le suintement pendant les longs trajets. Définir à 0 pour désactiver la " +"Une certaine quantité de matériau dans l'extrudeuse est retirée pour éviter " +"le suintement pendant les longs trajets. Définir zéro pour désactiver la " "rétraction" msgid "Z hop when retract" -msgstr "Décalage en Z lors des rétractions" +msgstr "Z saut lors de la rétraction" msgid "" "Whenever the retraction is done, the nozzle is lifted a little to create " "clearance between nozzle and the print. It prevents nozzle from hitting the " "print when travel move. Using spiral line to lift z can prevent stringing" msgstr "" -"A chaque fois qu’une rétraction est effectuée, la buse est légèrement " -"soulevée pour créer un espace entre la buse et l'impression. Cela empêche la " -"buse de toucher l'impression lors du déplacement. L'utilisation d'une ligne " -"en spirale pour soulever l’axe Z peut empêcher le stringing" +"Chaque fois que la rétraction est effectuée, la buse est légèrement soulevée " +"pour créer un espace entre la buse et l'impression. Il empêche la buse de " +"toucher l'impression lors du déplacement. L'utilisation d'une ligne en " +"spirale pour soulever z peut empêcher l'enfilage" msgid "Z hop lower boundary" -msgstr "" +msgstr "Limite inférieure du saut de Z" msgid "" "Z hop will only come into effect when Z is above this value and is below the " "parameter: \"Z hop upper boundary\"" msgstr "" +"Le saut de Z ne sera effectif que si Z est supérieur à cette valeur et " +"inférieur au paramètre : « Limite supérieure du saut de Z »" msgid "Z hop upper boundary" -msgstr "" +msgstr "Limite supérieure du saut de Z" msgid "" "If this value is positive, Z hop will only come into effect when Z is above " "the parameter: \"Z hop lower boundary\" and is below this value" msgstr "" +"Si cette valeur est positive, le saut de Z ne sera effectif que si Z est " +"supérieur au paramètre : « Limite inférieure de Z hop » et qu’il est " +"inférieur à cette valeur." msgid "Z hop type" msgstr "Type de décalage en Z" msgid "Slope" -msgstr "Classique" +msgstr "Pente" msgid "Spiral" msgstr "Spirale" msgid "Only lift Z above" -msgstr "" +msgstr "Décalage en Z au-dessus uniquement" msgid "" "If you set this to a positive value, Z lift will only take place above the " "specified absolute Z." msgstr "" +"Si définie sur une valeur positive, l’élévation Z n’aura lieu qu’au-dessus " +"du Z absolu spécifié." msgid "Only lift Z below" -msgstr "" +msgstr "Décalage en Z en dessous uniquement" msgid "" "If you set this to a positive value, Z lift will only take place below the " "specified absolute Z." msgstr "" +"Si définie sur une valeur positive, l’élévation Z n’aura lieu qu’en dessous " +"du Z absolu spécifié." msgid "On surfaces" -msgstr "" +msgstr "Sur les surfaces" msgid "" "Enforce Z Hop behavior. This setting is impacted by the above settings (Only " "lift Z above/below)." msgstr "" +"Appliquer le comportement du décalage en Z. Ce paramètre est impacté par les " +"paramètres ci-dessus (décalage en Z au-dessus/en dessous uniquement)." msgid "All Surfaces" -msgstr "" +msgstr "Toutes les surfaces" msgid "Top Only" -msgstr "" +msgstr "Supérieures" msgid "Bottom Only" -msgstr "" +msgstr "Inférieures" msgid "Top and Bottom" -msgstr "" +msgstr "Supérieures et Inférieures" msgid "Extra length on restart" msgstr "Longueur supplémentaire" @@ -10116,10 +10584,10 @@ msgstr "" "poussera cette quantité supplémentaire de filament." msgid "Retraction Speed" -msgstr "Vitesse de rétraction" +msgstr "Vitesse de Rétractation" msgid "Speed of retractions" -msgstr "Vitesse des rétractions" +msgstr "Vitesse de rétractation" msgid "Deretraction Speed" msgstr "Vitesse de réinsertion" @@ -10128,8 +10596,8 @@ msgid "" "Speed for reloading filament into extruder. Zero means same speed with " "retraction" msgstr "" -"Vitesse de réinsertion du filament dans l'extrudeur. Une valeur à 0 signifie " -"la même vitesse que celle de rétraction" +"Vitesse de rechargement du filament dans l'extrudeuse. Zéro signifie même " +"vitesse avec rétraction" msgid "Use firmware retraction" msgstr "Utiliser la rétraction firmware" @@ -10145,14 +10613,17 @@ msgstr "" msgid "Show auto-calibration marks" msgstr "Afficher les marques de calibration" +msgid "Disable set remaining print time" +msgstr "Désactiver le réglage du temps d’impression restant" + msgid "Seam position" msgstr "Position de la couture" msgid "The start position to print each part of outer wall" -msgstr "Position de départ pour imprimer chaque partie de la paroi extérieure" +msgstr "La position de départ pour imprimer chaque partie du mur extérieur" msgid "Nearest" -msgstr "Rapprochée" +msgstr "La plus proche" msgid "Aligned" msgstr "Alignée" @@ -10164,12 +10635,14 @@ msgid "Random" msgstr "Aléatoire" msgid "Staggered inner seams" -msgstr "" +msgstr "Coutures intérieures décalées" msgid "" "This option causes the inner seams to be shifted backwards based on their " "depth, forming a zigzag pattern." msgstr "" +"Cette option entraîne le décalage des coutures intérieures vers l’arrière en " +"fonction de leur profondeur, formant un motif en zigzag." msgid "Seam gap" msgstr "Distance de la couture" @@ -10183,7 +10656,7 @@ msgstr "" "Afin de réduire la visibilité de la couture dans une extrusion en boucle " "fermée, la boucle est interrompue et raccourcie d’une valeur spécifiée.\n" "Cette quantité peut être spécifiée en millimètres ou en pourcentage du " -"diamètre actuel de la buse. La valeur par défaut de ce paramètre est 10 %." +"diamètre actuel de la buse. La valeur par défaut de ce paramètre est 10%." msgid "Role base wipe speed" msgstr "Vitesse d’essuyage basée sur la vitesse d’extrusion" @@ -10224,35 +10697,37 @@ msgstr "" "déplacement ci-dessus. La valeur par défaut de ce paramètre est 80%" msgid "Skirt distance" -msgstr "Distance de la jupe" +msgstr "Distance jupe" msgid "Distance from skirt to brim or object" -msgstr "Distance entre la jupe et la bordure ou l'objet" +msgstr "Distance de la jupe au bord ou à l'objet" msgid "Skirt height" msgstr "Hauteur de la jupe" msgid "How many layers of skirt. Usually only one layer" -msgstr "Nombre de couches de la jupe. Généralement une seule couche suffit." +msgstr "Nombre de couches de jupe, généralement une seule." msgid "Skirt loops" -msgstr "Nombre de lignes de la jupe" +msgstr "Boucles de jupe" msgid "Number of loops for the skirt. Zero means disabling skirt" -msgstr "Nombre de ligne de la jupe. Une valeur à 0 signifie aucune jupe" +msgstr "Nombre de boucles pour la jupe. Zéro signifie désactiver la jupe" msgid "Skirt speed" -msgstr "" +msgstr "Vitesse de la jupe" msgid "Speed of skirt, in mm/s. Zero means use default layer extrusion speed." msgstr "" +"Vitesse de la jupe, en mm/s. Une valeur à 0 signifie que la vitesse " +"d’extrusion par défaut est utilisée." msgid "" "The printing speed in exported gcode will be slowed down, when the estimated " "layer time is shorter than this value, to get better cooling for these layers" msgstr "" "La vitesse d'impression dans le gcode exporté sera ralentie, lorsque le " -"temps de couche estimé est plus court que la valeur définie, pour obtenir un " +"temps de couche estimé est plus court que cette valeur, pour obtenir un " "meilleur refroidissement pour ces couches" msgid "Minimum sparse infill threshold" @@ -10262,29 +10737,54 @@ msgid "" "Sparse infill area which is smaller than threshold value is replaced by " "internal solid infill" msgstr "" -"La zone de remplissage qui est inférieure à la valeur seuil est remplacée " -"par un remplissage solide" +"La zone de remplissage inférieure à la valeur seuil est remplacée par un " +"remplissage solide interne" msgid "" "Line width of internal solid infill. If expressed as a %, it will be " "computed over the nozzle diameter." msgstr "" +"Largeur de ligne du remplissage solide interne. Si elle est exprimée en %, " +"elle sera calculée sur le diamètre de la buse." msgid "Speed of internal solid infill, not the top and bottom surface" msgstr "" -"Vitesse du remplissage solide, et non de la surface supérieure et inférieure" +"Vitesse du remplissage solide interne, pas de la surface supérieure et " +"inférieure" msgid "Spiral vase" -msgstr "Mode vase" +msgstr "Vase spirale" msgid "" "Spiralize smooths out the z moves of the outer contour. And turns a solid " "model into a single walled print with solid bottom layers. The final " "generated model has no seam" msgstr "" -"Lisse les mouvements en Z du contour extérieur et transforme un modèle " -"solide en une impression à paroi unique avec des couches inférieures " -"solides. Le modèle généré final n'a pas de couture" +"Spiralize lisse les mouvements z du contour extérieur. Et transforme un " +"modèle solide en une impression à paroi unique avec des couches inférieures " +"solides. Le modèle généré final n'a pas de couture." + +msgid "Smooth Spiral" +msgstr "Spirale lisse" + +msgid "" +"Smooth Spiral smoothes out X and Y moves as wellresulting in no visible seam " +"at all, even in the XY directions on walls that are not vertical" +msgstr "" +"« Spirale lisse » lisse également les mouvements X et Y, de sorte qu’aucune " +"couture n’est visible, même dans les directions XY sur des parois qui ne " +"sont pas verticales." + +msgid "Max XY Smoothing" +msgstr "Lissage Max XY" + +msgid "" +"Maximum distance to move points in XY to try to achieve a smooth spiralIf " +"expressed as a %, it will be computed over nozzle diameter" +msgstr "" +"Distance maximale pour déplacer les points dans l’axe XY afin d’obtenir une " +"spirale lisse. Si elle est exprimée en %, elle sera calculée par rapport au " +"diamètre de la buse." msgid "" "If smooth or traditional mode is selected, a timelapse video will be " @@ -10296,15 +10796,14 @@ msgid "" "process of taking a snapshot, prime tower is required for smooth mode to " "wipe nozzle." msgstr "" -"Si le mode Lissé ou Traditionnel est sélectionné, une vidéo Timelapse sera " -"générée pour chaque impression. Une fois chaque couche imprimée, un " -"instantané est pris avec la caméra de la chambre. Tous ces instantanés sont " -"composés dans une vidéo Timelapse lorsque l'impression est terminée. Si le " -"mode Lissé est sélectionné, la tête d'outil se déplacera vers la goulotte " -"excédentaire après l'impression de chaque couche, puis prendra un " -"instantané. Étant donné que le filament fondu peut couler de la buse pendant " -"le processus de prise d'instantané, la tour de purge est nécessaire pour " -"essuyer la buse pour le mode Lissé." +"Si le mode fluide ou traditionnel est sélectionné, une vidéo en timelapse " +"sera générée pour chaque impression. À chaque couche imprimée, un instantané " +"est pris avec la caméra intégrée. Tous ces instantanés seront assemblés dans " +"une vidéo timelapse une fois l'impression terminée. Si le mode lisse est " +"sélectionné, l'extrudeur se déplace vers la goulotte d'évacuation à chaque " +"couche imprimée, puis prend un cliché. Étant donné que le filament fondu " +"peut s'échapper de la buse pendant la prise de vue, une tour de nettoyage " +"est requise en mode lisse pour essuyer la buse." msgid "Traditional" msgstr "Traditionnel" @@ -10313,22 +10812,22 @@ msgid "Temperature variation" msgstr "Variation de température" msgid "Start G-code" -msgstr "G-code de démarrage" +msgstr "G-code de début" msgid "Start G-code when start the whole printing" -msgstr "G-code lors du démarrage de l'ensemble de l'impression" +msgstr "Démarrer le code G lors du démarrage de l'ensemble de l'impression" msgid "Start G-code when start the printing of this filament" -msgstr "G-code au démarrage de l'impression de ce filament" +msgstr "Démarrer le code G au démarrage de l'impression de ce filament" msgid "Single Extruder Multi Material" -msgstr "" +msgstr "Multi-matériaux pour extrudeur unique" msgid "Use single nozzle to print multi filament" -msgstr "" +msgstr "Utiliser une seule buse pour imprimer plusieurs filaments" msgid "Manual Filament Change" -msgstr "" +msgstr "Changement manuel du filament" msgid "" "Enable this option to omit the custom Change filament G-code only at the " @@ -10337,18 +10836,23 @@ msgid "" "printing, where we use M600/PAUSE to trigger the manual filament change " "action." msgstr "" +"Activez cette option pour omettre le G-code de changement de filament " +"personnalisé uniquement au début de l’impression. La commande de changement " +"d’outil (par exemple, T0) sera ignorée tout au long de l’impression. Ceci " +"est utile pour l’impression manuelle multi-matériaux, où nous utilisons M600/" +"PAUSE pour déclencher l’action de changement manuel de filament." msgid "Purge in prime tower" -msgstr "" +msgstr "Purge dans la tour d’essuyage" msgid "Purge remaining filament into prime tower" -msgstr "" +msgstr "Purger le filament restant dans la tour d’essuyage" msgid "Enable filament ramming" -msgstr "" +msgstr "Activer le pilonnage du filament" msgid "No sparse layers (EXPERIMENTAL)" -msgstr "" +msgstr "Pas sur toutes les couches (EXPÉRIMENTAL)" msgid "" "If enabled, the wipe tower will not be printed on layers with no " @@ -10356,50 +10860,56 @@ msgid "" "print the wipe tower. User is responsible for ensuring there is no collision " "with the print." msgstr "" +"Si cette option est activée, la tour de purge ne sera pas imprimée sur les " +"couches sans changement d’outil. Sur les couches avec changement d’outil, " +"l’extrudeur se déplacera vers le bas pour imprimer la tour de purge. " +"L’utilisateur est responsable de s’assurer qu’il n’y a pas de collision avec " +"l’impression." msgid "Prime all printing extruders" -msgstr "" +msgstr "Amorcer tous les extrudeurs d’impression" msgid "" "If enabled, all printing extruders will be primed at the front edge of the " "print bed at the start of the print." msgstr "" +"Si cette option est activée, tous les extrudeurs d’impression seront amorcés " +"sur le bord avant du plateau au début de l’impression." msgid "Slice gap closing radius" -msgstr "Rayon de fermeture de l'espacement" +msgstr "Rayon de fermeture du trou" 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 "" -"Les fentes d'une taille inférieure à 2x le rayon de fermeture de " -"l'espacement sont comblées lors du découpage du maillage triangulaire. " -"L'opération de fermeture de l'espace peut réduire la résolution de " -"l'impression finale, il est donc conseillé de conserver une valeur " -"raisonnablement basse." +"Les fissures inférieures à 2 fois le rayon de fermeture de trou sont " +"comblées lors du découpage à mailles triangulaires. L'opération de fermeture " +"des espaces peut réduire la résolution finale d'impression. Il est donc " +"conseillé de maintenir la valeur à un niveau raisonnablement bas." msgid "Slicing Mode" -msgstr "Mode de découpage" +msgstr "Mode de tranchage" msgid "" "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to " "close all holes in the model." msgstr "" -"Utiliser \"Even-odd\" pour les modèles d'avion 3DLabPrint. Utiliser " -"\"Combler les trous\" pour fermer tous les trous du modèle." +"Utilisez « Pair-impair » pour les modèles d'avion 3DLabPrint. Utilisez « " +"Fermer les trous » pour fermer tous les trous du modèle." msgid "Regular" -msgstr "Normal" +msgstr "Standard" msgid "Even-odd" -msgstr "Even-odd" +msgstr "Pair-impair" msgid "Close holes" -msgstr "Combler les trous" +msgstr "Fermez les trous" msgid "Z offset" -msgstr "Décalage de Z" +msgstr "Décalage Z" msgid "" "This value will be added (or subtracted) from all the Z coordinates in the " @@ -10407,10 +10917,10 @@ msgid "" "example, if your endstop zero actually leaves the nozzle 0.3mm far from the " "print bed, set this to -0.3 (or fix your endstop)." msgstr "" -"Cette valeur sera ajoutée (ou soustraite) à toutes les coordonnées Z dans le " -"G-code de sortie. Elle est utilisée pour compenser une mauvaise position de " -"la butée Z : par exemple, si votre butée zéro laisse en fait la buse à 0,3 " -"mm du d'impression, définissez cette valeur à -0,3 (ou corrigez votre butée)." +"Cette valeur sera ajoutée (ou soustraite) de toutes les coordonnées Z dans " +"le G-code de sortie. Il est utilisé pour compenser une mauvaise position de " +"la butée Z : par exemple, si votre zéro de butée laisse réellement la buse à " +"0,3 mm du plateau, réglez-le sur -0,3 (ou corrigez votre butée)." msgid "Enable support" msgstr "Activer les supports" @@ -10424,8 +10934,8 @@ msgid "" "generated" msgstr "" "Normaux (auto) et Arborescents (auto) sont utilisés pour générer " -"automatiquement les supports. Si Normaux ou Arborescents est sélectionné, " -"seuls les supports forcés sont générés" +"automatiquement un support. Si vous sélectionnez Normaux (manuel) ou " +"Arborescents (manuel), seuls les générateurs de support manuels sont générés" msgid "normal(auto)" msgstr "Normaux (auto)" @@ -10434,138 +10944,142 @@ msgid "tree(auto)" msgstr "Arborescents (auto)" msgid "normal(manual)" -msgstr "Normaux (manuels)" +msgstr "Normaux (manuel)" msgid "tree(manual)" -msgstr "Arborescents (manuels)" +msgstr "Arborescents (manuel)" msgid "Support/object xy distance" -msgstr "Distance X-Y Support/Objet" +msgstr "Distance support/objet xy" msgid "XY separation between an object and its support" -msgstr "Distance de séparation X-Y entre un objet et son support" +msgstr "Séparation XY entre un objet et ses supports" msgid "Pattern angle" msgstr "Angle du motif" msgid "Use this setting to rotate the support pattern on the horizontal plane." msgstr "" -"Utiliser ce paramètre pour faire pivoter le motif de support sur le plan " +"Utilisez ce paramètre pour faire pivoter le motif de support sur le plan " "horizontal." msgid "On build plate only" -msgstr "Sur le plateau uniquement" +msgstr "Sur plateau uniquement" msgid "Don't create support on model surface, only on build plate" msgstr "" -"Ne pas créer de support sur la surface du modèle, uniquement sur le plateau" +"Ce paramètre génère uniquement les supports qui commencent sur le plateau." msgid "Support critical regions only" -msgstr "Zones critiques uniquement" +msgstr "Ne supporter que les régions critiques" msgid "" "Only create support for critical regions including sharp tail, cantilever, " "etc." msgstr "" -"Créer uniquement des supports pour les zones critiques, y compris les " -"pointes, les surplombs, etc." +"Créez un support uniquement pour les zones critiques notamment les pointes, " +"les surplombs, etc." msgid "Remove small overhangs" -msgstr "" +msgstr "Supprimer les petits surplombs" msgid "Remove small overhangs that possibly need no supports." msgstr "" +"Supprimer les petits surplombs qui n’ont peut-être pas besoin de supports." msgid "Top Z distance" msgstr "Distance Z supérieure" msgid "The z gap between the top support interface and object" -msgstr "Distance Z entre l'interface de support supérieure et l'objet" +msgstr "L'écart z entre l'interface de support supérieure et l'objet" msgid "Bottom Z distance" msgstr "Distance Z inférieure" msgid "The z gap between the bottom support interface and object" -msgstr "Distance Z entre l'interface de support inférieure et l'objet" +msgstr "L'écart Z entre l'interface du support inférieur et l'objet" msgid "Support/raft base" -msgstr "Base Supports/Radeau" +msgstr "Support/base du radeau" msgid "" "Filament to print support base and raft. \"Default\" means no specific " "filament for support and current filament is used" msgstr "" -"Filament pour imprimer la base des supports et les radeaux. \"Par défaut\" " -"signifie qu'aucun filament spécifique n'est utilisé pour les supports et que " -"le filament actuel est utilisé" +"Filament pour imprimer les supports et radeaux. « Par défaut » signifie " +"qu'aucun filament spécifique n'est utilisé comme support et que le filament " +"actuel est utilisé" -msgid "No interface filament for body" -msgstr "" +msgid "Avoid interface filament for base" +msgstr "Réduire le filament d’interface pour la base" -msgid "Don't use support interface filament to print support body" +msgid "" +"Avoid using support interface filament to print support base if possible." msgstr "" +"Éviter d’utiliser le filament de l’interface du support pour imprimer la " +"base du support" msgid "" "Line width of support. If expressed as a %, it will be computed over the " "nozzle diameter." msgstr "" +"Largeur de ligne des supports. Si elle est exprimée en %, elle sera calculée " +"sur le diamètre de la buse." msgid "Interface use loop pattern" -msgstr "Boucles des interfaces" +msgstr "Modèle de boucle d'utilisation d'interface" msgid "" "Cover the top contact layer of the supports with loops. Disabled by default." msgstr "" -"Couvrir la couche de contact supérieure des supports avec des boucles. " +"Recouvrir la couche de contact supérieure des supports avec des boucles. " "Désactivé par défaut." msgid "Support/raft interface" -msgstr "Interfaces Supports/Radeau" +msgstr "Support/base d'interface" msgid "" "Filament to print support interface. \"Default\" means no specific filament " "for support interface and current filament is used" msgstr "" -"Filament pour imprimer les interfaces de support. \"Par défaut\" signifie " -"qu'aucun filament spécifique n'est utilisé pour les interfaces de support et " -"le filament actuel est utilisé" +"Filament pour l'impression des interfaces de support. \"Défaut\" signifie " +"qu'il n'y a pas de filament spécifique pour l'interface de support et que le " +"filament actuel est utilisé." msgid "Top interface layers" -msgstr "Couches des interfaces supérieures" +msgstr "Couches d'interface supérieures" msgid "Number of top interface layers" -msgstr "Nombre de couches des interfaces supérieures" +msgstr "Nombre de couches d'interface supérieures" msgid "Bottom interface layers" -msgstr "Couches des interfaces inférieures" +msgstr "Couches d'interface inférieures" msgid "Number of bottom interface layers" -msgstr "" +msgstr "Nombre de couches d’interface inférieures" msgid "Same as top" -msgstr "" +msgstr "Identique au sommet" msgid "Top interface spacing" -msgstr "Espacement du motif des interfaces supérieures" +msgstr "Espacement de l'interface supérieure" msgid "Spacing of interface lines. Zero means solid interface" -msgstr "" -"Espacement des lignes du motif des interfaces de support supérieures. Une " -"valeur à 0 signifie une interface solide" +msgstr "Espacement des lignes d'interface. Zéro signifie une interface solide" msgid "Bottom interface spacing" -msgstr "Espacement du motif des interfaces inférieures" +msgstr "Espacement de l'interface inférieure" msgid "Spacing of bottom interface lines. Zero means solid interface" msgstr "" -"Espacement des lignes du motif des interfaces de support inférieures. Une " -"valeur à 0 signifie une interface solide" +"Espacement des lignes d'interface inférieures. Zéro signifie une interface " +"solide" msgid "Speed of support interface" -msgstr "Vitesse des interfaces de support" +msgstr "Vitesse pour l'interface des supports" msgid "Base pattern" -msgstr "Motif de la base" +msgstr "Motif de base" msgid "Line pattern of support" msgstr "Motif de ligne de support" @@ -10577,34 +11091,34 @@ msgid "Hollow" msgstr "Creux" msgid "Interface pattern" -msgstr "Motif des interfaces" +msgstr "Motif d'interface" msgid "" "Line pattern of support interface. Default pattern for non-soluble support " "interface is Rectilinear, while default pattern for soluble support " "interface is Concentric" msgstr "" -"Modèle de ligne de l'interface de support. Le motif par défaut pour les " -"interfaces de support non solubles est Rectiligne, tandis que le modèle par " -"défaut pour les interfaces de support solubles est Concentrique" +"Modèle de ligne de l'interface de support. Le modèle par défaut pour " +"l'interface de support non soluble est rectiligne, tandis que le modèle par " +"défaut pour l'interface de support soluble est concentrique" msgid "Rectilinear Interlaced" -msgstr "Rectiligne entrelacé" +msgstr "Rectiligne Entrelacé" msgid "Base pattern spacing" -msgstr "Espacement du motif de la base" +msgstr "Espacement du motif de base" msgid "Spacing between support lines" msgstr "Espacement entre les lignes de support" msgid "Normal Support expansion" -msgstr "Expansion des supports normaux" +msgstr "Expansion normale du support" msgid "Expand (+) or shrink (-) the horizontal span of normal support" -msgstr "Agrandir (+) ou réduire (-) la portée horizontale des supports normaux" +msgstr "Augmenter (+) ou réduire (-) la portée horizontale du support normal." msgid "Speed of support" -msgstr "Vitesse des supports" +msgstr "Vitesse pour les supports" msgid "" "Style and shape of the support. For normal support, projecting the supports " @@ -10615,37 +11129,45 @@ msgid "" "style will create similar structure to normal support under large flat " "overhangs." msgstr "" +"Style et forme des supports. Pour les supports normaux, une grille régulière " +"créera des supports plus stables (par défaut), tandis que des tours de " +"supports bien ajustées économiseront du matériel et réduiront les marques " +"sur les objets.\n" +"Pour les supports arborescents, le style mince et organique fusionnera les " +"branches de manière plus agressive et économisera beaucoup de matière " +"(organique par défaut), tandis que le style hybride créera une structure " +"similaire aux supports normaux sous de grands surplombs plats." msgid "Snug" -msgstr "Ajustés" +msgstr "Ajusté" msgid "Tree Slim" -msgstr "Arborescents Fins" +msgstr "Arborescent Fin" msgid "Tree Strong" -msgstr "Arborescents Solides" +msgstr "Arborescent Fort" msgid "Tree Hybrid" -msgstr "Arborescents Hybrides" +msgstr "Arborescent Hybride" msgid "Organic" -msgstr "" +msgstr "Arborescents Organiques" msgid "Independent support layer height" -msgstr "Hauteur de la couche indépendante des supports" +msgstr "Hauteur de la couche de support indépendante" msgid "" "Support layer uses layer height independent with object layer. This is to " "support customizing z-gap and save print time.This option will be invalid " "when the prime tower is enabled." msgstr "" -"La couche de support utilise une hauteur de couche indépendante de la couche " -"d'objet. Cela permet de prendre en charge la personnalisation de l’espace Z " -"et de gagner sur la durée d'impression. Cette option sera invalide lorsque " -"la tour de purge est activée." +"La couche de support utilise la hauteur de la couche indépendamment de la " +"couche objet. Cela permet de personnaliser l'espace Z et de gagner du temps " +"d'impression. Cette option ne sera pas valide lorsque la tour de purge sera " +"activée." msgid "Threshold angle" -msgstr "Angle de surplomb" +msgstr "Angle de seuil" msgid "" "Support will be generated for overhangs whose slope angle is below the " @@ -10655,19 +11177,20 @@ msgstr "" "inférieur au seuil." msgid "Tree support branch angle" -msgstr "Angle des branches" +msgstr "Angle de branche support arborescent" msgid "" "This setting determines the maximum overhang angle that t he branches of " "tree support allowed to make.If the angle is increased, the branches can be " "printed more horizontally, allowing them to reach farther." msgstr "" -"Ce paramètre détermine l’angle de surplomb maximal que les branches sont " -"autorisées à faire. Si l’angle est augmenté, les branches peuvent être " -"imprimées plus horizontalement, ce qui leur permet de s’étendre plus loin." +"Ce paramètre détermine l'angle des surplombs maximum que les branches du " +"support arborescent peuvent faire. Si l'angle est augmenté, les branches " +"peuvent être imprimées plus horizontalement, ce qui leur permet d'aller plus " +"loin." msgid "Preferred Branch Angle" -msgstr "" +msgstr "Angle des branches préféré" #. TRN PrintSettings: "Organic supports" > "Preferred Branch Angle" msgid "" @@ -10675,16 +11198,22 @@ msgid "" "model. Use a lower angle to make them more vertical and more stable. Use a " "higher angle for branches to merge faster." msgstr "" +"Angle préféré des branches, lorsqu’elles ne doivent pas éviter le modèle. " +"Utilisez un angle inférieur pour les rendre plus verticaux et plus stables. " +"Utilisez un angle plus élevé pour que les branches fusionnent plus " +"rapidement." msgid "Tree support branch distance" -msgstr "Distance des branches" +msgstr "Distance de branche de support arborescent" msgid "" "This setting determines the distance between neighboring tree support nodes." -msgstr "Ce paramètre détermine la distance entre les branches de support." +msgstr "" +"Ce paramètre détermine la distance entre les nœuds de support arborescents " +"voisins." msgid "Branch Density" -msgstr "" +msgstr "Densité des branches" #. TRN PrintSettings: "Organic supports" > "Branch Density" msgid "" @@ -10694,9 +11223,14 @@ msgid "" "interfaces instead of a high branch density value if dense interfaces are " "needed." msgstr "" +"Ajuste la densité de la structure des supports utilisée pour générer les " +"pointes des branches. Une valeur plus élevée donne de meilleurs surplombs, " +"mais les supports sont plus difficiles à supprimer. Il est donc recommandé " +"d’activer les interfaces de support supérieures au lieu d’une valeur de " +"densité de branches élevée si des interfaces denses sont nécessaires." msgid "Adaptive layer height" -msgstr "Hauteur de couche variable" +msgstr "Hauteur de couche adaptative" msgid "" "Enabling this option means the height of tree support layer except the " @@ -10716,7 +11250,7 @@ msgstr "" "supports arborescents sera automatiquement calculée" msgid "Tree support brim width" -msgstr "Supports arborescents avec bordure" +msgstr "Largeur de bordure du support de l'arbre" msgid "Distance from tree branch to the outermost brim line" msgstr "" @@ -10724,21 +11258,21 @@ msgstr "" "de la bordure" msgid "Tip Diameter" -msgstr "" +msgstr "Diamètre de la pointe" #. TRN PrintSettings: "Organic supports" > "Tip Diameter" msgid "Branch tip diameter for organic supports." -msgstr "" +msgstr "Diamètre de l’extrémité des branches des supports organiques." msgid "Tree support branch diameter" -msgstr "Diamètre des branches" +msgstr "Diamètre de branche de support arborescent" msgid "This setting determines the initial diameter of support nodes." -msgstr "Ce paramètre détermine le diamètre initial des branches de support." +msgstr "Ce paramètre détermine le diamètre initial des nœuds de support." #. TRN PrintSettings: #lmFIXME msgid "Branch Diameter Angle" -msgstr "" +msgstr "Angle du diamètre des branches" #. TRN PrintSettings: "Organic supports" > "Branch Diameter Angle" msgid "" @@ -10747,9 +11281,13 @@ msgid "" "over their length. A bit of an angle can increase stability of the organic " "support." msgstr "" +"Angle du diamètre des branches à mesure qu’elles deviennent progressivement " +"plus épaisses vers leurs bases. Un angle de 0 donnera aux branches une " +"épaisseur uniforme sur toute leur longueur. Un léger angle peut augmenter la " +"stabilité des supports organiques." msgid "Branch Diameter with double walls" -msgstr "" +msgstr "Diamètre des branches à double paroi" #. TRN PrintSettings: "Organic supports" > "Branch Diameter" msgid "" @@ -10757,31 +11295,37 @@ msgid "" "printed with double walls for stability. Set this value to zero for no " "double walls." msgstr "" +"Les branches dont la superficie est supérieure à la superficie d’un cercle " +"de ce diamètre seront imprimées avec des doubles parois pour plus de " +"stabilité. Définissez cette valeur sur zéro pour éviter la double paroi." -msgid "Tree support wall loops" -msgstr "Nombre de parois des branches" +msgid "Support wall loops" +msgstr "Boucles de support de paroi" -msgid "This setting specify the count of walls around tree support" -msgstr "Ce paramètre spécifie le nombre de parois des branches de support" +msgid "This setting specify the count of walls around support" +msgstr "Ce paramètre spécifie le nombre de parois autour du support" msgid "Tree support with infill" -msgstr "Supports arborescents avec remplissage" +msgstr "Support arborescent avec remplissage" msgid "" "This setting specifies whether to add infill inside large hollows of tree " "support" msgstr "" -"Ce paramètre spécifie s’il faut ajouter un remplissage à l’intérieur des " -"supports arborescents" +"Ce paramètre spécifie s'il faut ajouter un remplissage à l'intérieur des " +"grands creux du support arborescent" msgid "Activate temperature control" -msgstr "" +msgstr "Activer le contrôle de la température" msgid "" "Enable this option for chamber temperature control. An M191 command will be " "added before \"machine_start_gcode\"\n" "G-code commands: M141/M191 S(0-255)" msgstr "" +"Activez cette option pour le contrôle de la température de la chambre. Une " +"commande M191 sera ajoutée avant \"machine_start_gcode\"\n" +"Commandes G-code : M141/M191 S(0-255)" msgid "Chamber temperature" msgstr "Température de la chambre" @@ -10795,20 +11339,28 @@ msgid "" "high to avoid cloggings, so 0 which stands for turning off is highly " "recommended" msgstr "" +"Une température de chambre plus élevée peut aider à supprimer ou à réduire " +"la déformation et potentiellement conduire à une force de liaison " +"intercouche plus élevée pour les matériaux à haute température comme l’ABS, " +"l’ASA, le PC, le PA, etc. Dans le même temps, la filtration de l’air de " +"l’ABS et de l’ASA s’aggravera. Pour le PLA, le PETG, le TPU, le PVA et " +"d’autres matériaux à basse température, la température réelle de la chambre " +"ne doit pas être élevée pour éviter les bouchages, donc la valeur 0 qui " +"signifie éteindre est fortement recommandé." msgid "Nozzle temperature for layers after the initial one" msgstr "Température de la buse pour les couches après la première" msgid "Detect thin wall" -msgstr "Détecter les parois fines" +msgstr "Détecter les parois minces" msgid "" "Detect thin wall which can't contain two line width. And use single line to " "print. Maybe printed not very well, because it's not closed loop" msgstr "" -"Détecter les parois minces qui ne peuvent pas contenir deux largeurs de " -"ligne et utiliser une seule ligne pour les imprimer. Peut ne pas être très " -"bien imprimé car ce n'est pas en boucle fermée" +"Détecte les parois minces qui ne peuvent pas contenir deux largeurs de " +"ligne. Et utilisez une seule ligne pour imprimer. Peut-être pas très bien " +"imprimé, car ce n'est pas en boucle fermée" msgid "" "This gcode is inserted when change filament, including T command to trigger " @@ -10818,18 +11370,20 @@ msgstr "" "pour déclencher le changement d'outil" msgid "This gcode is inserted when the extrusion role is changed" -msgstr "" +msgstr "Ce G-code est inséré lorsque le rôle d’extrusion est modifié" msgid "" "Line width for top surfaces. If expressed as a %, it will be computed over " "the nozzle diameter." msgstr "" +"Largeur de ligne pdes surfaces supérieures. Si elle est exprimée en %, elle " +"sera calculée sur le diamètre de la buse." msgid "Speed of top surface infill which is solid" msgstr "Vitesse de remplissage de la surface supérieure qui est solide" msgid "Top shell layers" -msgstr "Nombre de couches des coques supérieures" +msgstr "Couches de coque supérieures" msgid "" "This is the number of solid layers of top shell, including the top surface " @@ -10842,10 +11396,10 @@ msgstr "" "coque supérieure seront augmentées" msgid "Top solid layers" -msgstr "Couches solides supérieures" +msgstr "Couches supérieures solides" msgid "Top shell thickness" -msgstr "Épaisseur des coques supérieures" +msgstr "Épaisseur de la coque supérieure" msgid "" "The number of top solid layers is increased when slicing if the thickness " @@ -10857,41 +11411,57 @@ msgstr "" "Le nombre de couches solides supérieures est augmenté lors du découpage si " "l'épaisseur calculée par les couches de coque supérieures est inférieure à " "cette valeur. Cela peut éviter d'avoir une coque trop fine lorsque la " -"hauteur de couche est faible. Une valeur à 0 signifie que ce paramètre est " -"désactivé et que l'épaisseur de la coque supérieure est absolument " -"déterminée par les couches de coque supérieures" +"hauteur de couche est faible. 0 signifie que ce paramètre est désactivé et " +"que l'épaisseur de la coque supérieure est absolument déterminée par les " +"couches de coque supérieures" msgid "Speed of travel which is faster and without extrusion" msgstr "Vitesse de déplacement plus rapide et sans extrusion" msgid "Wipe while retracting" -msgstr "Essuyer lors des rétractions" +msgstr "Nettoyer lors des rétractions" msgid "" "Move nozzle along the last extrusion path when retracting to clean leaked " "material on nozzle. This can minimize blob when print new part after travel" msgstr "" -"Déplacer la buse le long du dernier chemin d'extrusion lors de la rétraction " +"Déplacez la buse le long du dernier chemin d'extrusion lors de la rétraction " "pour nettoyer la fuite de matériau sur la buse. Cela peut minimiser les " "taches lors de l'impression d'une nouvelle pièce après le trajet" msgid "Wipe Distance" -msgstr "Distance d’essuyage" +msgstr "Distance de balayage" msgid "" -"Discribe how long the nozzle will move along the last path when retracting" +"Discribe how long the nozzle will move along the last path when " +"retracting. \n" +"\n" +"Depending on how long the wipe operation lasts, how fast and long the " +"extruder/filament retraction settings are, a retraction move may be needed " +"to retract the remaining filament. \n" +"\n" +"Setting a value in the retract amount before wipe setting below will perform " +"any excess retraction before the wipe, else it will be performed after." msgstr "" -"Distance sur laquelle la buse se déplacera le long du dernier chemin lors de " -"la rétraction" +"Décrire la durée pendant laquelle la buse se déplacera le long de la " +"dernière trajectoire lors de la rétractation. \n" +"\n" +"En fonction de la durée de l’opération de nettoyage, de la vitesse et de la " +"longueur des réglages de rétraction de l’extrudeuse/filament, un mouvement " +"de rétraction peut être nécessaire pour rétracter le filament restant. \n" +"\n" +"Le réglage d’une valeur dans le paramètre de quantité de rétraction avant " +"essuyage ci-dessous permet d’effectuer toute rétraction excédentaire avant " +"l’essuyage, sinon elle sera effectuée après l’essuyage." msgid "" "The wiping tower can be used to clean up the residue on the nozzle and " "stabilize the chamber pressure inside the nozzle, in order to avoid " "appearance defects when printing objects." msgstr "" -"La tour de purge peut être utilisée pour nettoyer les résidus sur la buse et " -"stabiliser la pression de la chambre à l’intérieur de la buse, afin d’éviter " -"les défauts d’aspect lors de l’impression d’objets." +"La tour d'essuyage peut être utilisée pour nettoyer les résidus sur la buse " +"et stabiliser la pression de la chambre à l'intérieur de la buse afin " +"d'éviter les défauts d'apparence lors de l'impression d'objets." msgid "Purging volumes" msgstr "Volumes de purge" @@ -10903,57 +11473,65 @@ msgid "" "The actual flushing volumes is equal to the flush multiplier multiplied by " "the flushing volumes in the table." msgstr "" -"Les volumes de purge réels sont égaux au multiplicateur de purge multiplié " -"par les volumes de purge dans le tableau." +"Les volumes de rinçage actuels sont égaux à la valeur du multiplicateur de " +"rinçage multiplié par les volumes de rinçage dans le tableau." msgid "Prime volume" -msgstr "Volume de purge" +msgstr "Premier volume" msgid "The volume of material to prime extruder on tower." -msgstr "Volume de matériau pour amorcer l'extrudeur sur la tour." +msgstr "Le volume de matériau à amorcer l'extrudeuse sur la tour." msgid "Width" msgstr "Largeur" msgid "Width of prime tower" -msgstr "Largeur de la tour de purge" +msgstr "Largeur de la tour de nettoyage." msgid "Wipe tower rotation angle" -msgstr "" +msgstr "Angle de rotation de la tour d’essuyage" msgid "Wipe tower rotation angle with respect to x-axis." -msgstr "" +msgstr "Angle de rotation de la tour d’essuyage par rapport à l’axe X." msgid "Stabilization cone apex angle" -msgstr "" +msgstr "Angle au sommet du cône de stabilisation" msgid "" "Angle at the apex of the cone that is used to stabilize the wipe tower. " "Larger angle means wider base." msgstr "" +"Angle au sommet du cône utilisé pour stabiliser la tour d’essuyage. Un angle " +"plus grand signifie une base plus large." msgid "Wipe tower purge lines spacing" -msgstr "" +msgstr "Espacement des lignes de purge de la tour d’essuyage" msgid "Spacing of purge lines on the wipe tower." -msgstr "" +msgstr "Espacement des lignes de purge sur la tour d’essuyage." msgid "Wipe tower extruder" -msgstr "" +msgstr "Extrudeuse de tour d’essuyage" msgid "" "The extruder to use when printing perimeter of the wipe tower. Set to 0 to " "use the one that is available (non-soluble would be preferred)." msgstr "" +"L’extrudeur à utiliser lors de l’impression du périmètre de la tour " +"d’essuyage. Réglez sur 0 pour utiliser celui qui est disponible (un non-" +"soluble serait préféré)." msgid "Purging volumes - load/unload volumes" -msgstr "" +msgstr "Volumes de purge - Volume de Chargement/Déchargement" 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 "" +"Ce vecteur enregistre les volumes requis pour passer de/vers chaque outil " +"utilisé sur la tour d’essuyage. Ces valeurs sont utilisées pour simplifier " +"la création des volumes de purge complets ci-dessous." msgid "" "Purging after filament change will be done inside objects' infills. This may " @@ -10962,52 +11540,53 @@ msgid "" "outside. It will not take effect, unless the prime tower is enabled." msgstr "" "La purge après le changement de filament sera effectuée à l'intérieur des " -"remplissages des objets. Cela peut réduire la quantité de déchets et " -"diminuer la durée d'impression. Si les murs sont imprimés avec un filament " -"transparent, le remplissage de couleurs mélangées sera visible à " -"l'extérieur. Cela ne prendra effet que si la tour de purge est activée." +"matériaux de remplissage des objets. Cela peut réduire la quantité de " +"déchets et le temps d'impression. Si les murs sont imprimés avec un filament " +"transparent, le remplissage de couleurs mélangées sera visible. Cela ne " +"prendra effet que si la tour de nettoyage est activée." msgid "" "Purging after filament change will be done inside objects' support. This may " "lower the amount of waste and decrease the print time. It will not take " "effect, unless the prime tower is enabled." msgstr "" -"La purge après changement de filament sera effectuée à l'intérieur des " -"supports des objets. Cela peut réduire la quantité de déchets et diminuer la " -"durée d'impression. Cela ne prendra effet que si la tour de purge est " -"activée." +"La purge après le changement de filament se fera à l'intérieur du support " +"des objets. Cela peut réduire la quantité de déchets et le temps " +"d'impression. Cela ne prendra effet que si une tour de nettoyage est activée." msgid "" "This object will be used to purge the nozzle after a filament change to save " "filament and decrease the print time. Colours of the objects will be mixed " "as a result. It will not take effect, unless the prime tower is enabled." msgstr "" -"Cet objet servira à purger la buse après un changement de filament pour " -"économiser du filament et diminuer la durée d'impression. Les couleurs des " -"objets seront mélangées en conséquence. Cela ne prendra effet que si la tour " -"de purge est activée." +"Cet objet sera utilisé pour purger la buse après un changement de filament " +"afin d'économiser du filament et de réduire le temps d'impression. Les " +"couleurs des objets seront mélangées en conséquence. Cela ne prendra effet " +"que si la tour de nettoyage est activée." msgid "Maximal bridging distance" -msgstr "" +msgstr "Distance de pont maximale" msgid "Maximal distance between supports on sparse infill sections." msgstr "" +"Distance maximale entre les supports sur les sections de remplissage " +"clairsemées." msgid "X-Y hole compensation" -msgstr "Compensation X-Y des trous" +msgstr "Compensation de trou X-Y" msgid "" "Holes of object will be grown or shrunk in XY plane by the configured value. " "Positive value makes holes bigger. Negative value makes holes smaller. This " "function is used to adjust size slightly when the object has assembling issue" msgstr "" -"Les trous de l'objet seront agrandis ou rétrécis dans le plan X-Y par la " -"valeur définie. Une valeur positive agrandit les trous. Une valeur négative " -"rend les trous plus petits. Cette fonction est utilisée pour ajuster " -"légèrement la taille lorsque l'objet a un problème d'assemblage" +"Les trous de l'objet seront agrandis ou rétrécis dans le plan XY par la " +"valeur configurée. Une valeur positive agrandit les trous. Une valeur " +"négative rend les trous plus petits. Cette fonction est utilisée pour " +"ajuster légèrement la taille lorsque l'objet a un problème d'assemblage" msgid "X-Y contour compensation" -msgstr "Compensation X-Y des contours" +msgstr "Compensation de contour X-Y" msgid "" "Contour of object will be grown or shrunk in XY plane by the configured " @@ -11015,13 +11594,13 @@ msgid "" "smaller. This function is used to adjust size slightly when the object has " "assembling issue" msgstr "" -"Les contours de l'objet seront agrandis ou rétrécis dans le plan X-Y par la " -"valeur définie. Une valeur positive agrandit les contours. Une valeur " -"négative rend les contours plus petits. Cette fonction est utilisée pour " -"ajuster légèrement la taille lorsque l'objet a un problème d'assemblage" +"Le contour de l'objet sera agrandi ou rétréci dans le plan XY par la valeur " +"configurée. Une valeur positive agrandit le contour. Une valeur négative " +"rend le contour plus petit. Cette fonction est utilisée pour ajuster " +"légèrement la taille lorsque l'objet a un problème d'assemblage" msgid "Convert holes to polyholes" -msgstr "" +msgstr "Convertir les trous en trous polygones" msgid "" "Search for almost-circular holes that span more than one layer and convert " @@ -11029,11 +11608,15 @@ msgid "" "compute the polyhole.\n" "See http://hydraraptor.blogspot.com/2011/02/polyholes.html" msgstr "" +"Rechercher les trous presque circulaires qui s’étendent sur plusieurs " +"couches et convertir la géométrie en trous polygones. Utilise la taille de " +"la buse et le (plus grand) diamètre pour calculer le trou polygone.\n" +"Voir http://hydraraptor.blogspot.com/2011/02/polyholes.html" msgid "Polyhole detection margin" -msgstr "" +msgstr "Marge de détection des trous polygones" -#, c-format, boost-format +#, fuzzy, c-format, boost-format msgid "" "Maximum defection of a point to the estimated radius of the circle.\n" "As cylinders are often exported as triangles of varying size, points may not " @@ -11041,12 +11624,17 @@ msgid "" "broaden the detection.\n" "In mm or in % of the radius." msgstr "" +"Défection maximale d’un point par rapport au rayon estimé du cercle.\n" +"Comme les cylindres sont souvent exportés sous forme de triangles de taille " +"variable, les points peuvent ne pas se trouver sur la circonférence du " +"cercle. Ce paramètre vous permet d’élargir la détection.\n" +"En mm ou en % du rayon." msgid "Polyhole twist" -msgstr "" +msgstr "Torsion des trous polygones" msgid "Rotate the polyhole every layer." -msgstr "" +msgstr "Faites pivoter le polyhole à chaque couche." msgid "G-code thumbnails" msgstr "Vignette G-code" @@ -11056,15 +11644,17 @@ msgid "" "following format: \"XxY, XxY, ...\"" msgstr "" "Tailles des images à stocker dans les fichiers .gcode et .sl1/.sl1s, au " -"format suivant : \"XxY, XxY, …\"" +"format suivant : \"XxY, XxY, …\"" msgid "Format of G-code thumbnails" -msgstr "" +msgstr "Format des vignettes G-code" msgid "" "Format of G-code thumbnails: PNG for best quality, JPG for smallest size, " "QOI for low memory firmware" msgstr "" +"Format des vignettes G-code : PNG pour la meilleure qualité, JPG pour la " +"plus petite taille, QOI pour les firmwares à faible mémoire" msgid "Use relative E distances" msgstr "Utiliser l’extrusion relative" @@ -11077,7 +11667,7 @@ msgid "" msgstr "" "L’extrusion relative est recommandée lors de l’utilisation de l’option " "\"label_objects\". Certains extrudeurs fonctionnent mieux avec cette option " -"décochée (mode d’extrusion absolu). La tour de purge n’est compatible " +"décochée (mode d’extrusion absolu). La tour d’essuyage n’est compatible " "qu’avec le mode relatif. Il est toujours activé sur les imprimantes " "BambuLab. La valeur par défaut est cochée" @@ -11086,32 +11676,31 @@ msgid "" "very thin areas is used gap-fill. Arachne engine produces walls with " "variable extrusion width" msgstr "" -"Le générateur de parois classiques produit des parois avec une largeur " -"d'extrusion constante, et pour les zones très minces il est utilisé pour " -"combler les espaces. Le moteur Arachne produit des parois avec une largeur " -"d'extrusion variable." +"Le générateur de murs classique produit des murs avec une largeur " +"d'extrusion constante, les zones très fines seront remplies. Le générateur " +"Arachne produit des murs avec une largeur d'extrusion variable." msgid "Classic" msgstr "Classique" msgid "Arachne" -msgstr "Arachne" +msgstr "Arachné" msgid "Wall transition length" -msgstr "Longueur de transition de paroi" +msgstr "Longueur de la transition murale" msgid "" "When transitioning between different numbers of walls as the part becomes " "thinner, a certain amount of space is allotted to split or join the wall " "segments. It's expressed as a percentage over nozzle diameter" msgstr "" -"Lors de la transition entre différents nombres de parois à mesure que la " -"pièce devient plus mince, un certain espace est alloué pour diviser ou " -"joindre les segments de paroi. Elle est exprimée en pourcentage sur le " -"diamètre de la buse" +"Lorsque vous passez d'un nombre différent de murs à un autre lorsque la " +"pièce s'amincit, un certain espace est alloué pour séparer ou joindre les " +"segments du mur. Il est exprimé en pourcentage par rapport au diamètre de la " +"buse." msgid "Wall transitioning filter margin" -msgstr "Marge du filtre de transition de paroi" +msgstr "Marge du filtre de transition de mur" msgid "" "Prevent transitioning back and forth between one extra wall and one less. " @@ -11122,17 +11711,17 @@ msgid "" "variation can lead to under- or overextrusion problems. It's expressed as a " "percentage over nozzle diameter" msgstr "" -"Empêche les transitions entre une paroi supplémentaire et une paroi de " -"moins. Cette marge étend la plage des largeurs d'extrusion suivante [Largeur " -"minimale de la paroi - marge, 2 * Largeur minimale da paroi + marge]. " +"Empêchez les allers-retours entre un mur supplémentaire et un mur de moins. " +"Cette marge étend la plage de largeurs d'extrusion qui suit jusqu'à [Largeur " +"de paroi minimale - marge, 2* Largeur de paroi minimale + marge]. " "L'augmentation de cette marge réduit le nombre de transitions, ce qui réduit " -"le nombre de démarrages/arrêts d'extrusion et le temps de parcours. " -"Cependant, une grande variation de largeur d'extrusion peut entraîner des " -"problèmes de sous-extrusion ou de sur-extrusion. Elle est exprimée en " -"pourcentage sur le diamètre de la buse" +"le nombre de démarrages/arrêts d'extrusion et le temps de trajet. Cependant, " +"une variation importante de la largeur d'extrusion peut entraîner des " +"problèmes de sous-extrusion ou de surextrusion. Il est exprimé en " +"pourcentage par rapport au diamètre de la buse" msgid "Wall transitioning threshold angle" -msgstr "Angle de seuil de transition de paroi" +msgstr "Angle du seuil de transition du mur" msgid "" "When to create transitions between even and odd numbers of walls. A wedge " @@ -11141,26 +11730,26 @@ msgid "" "this setting reduces the number and length of these center walls, but may " "leave gaps or overextrude" msgstr "" -"Permet d'indiquer quand créer des transitions entre des nombres pairs et " -"impairs des parois. Une forme de coin avec un angle supérieur à ce paramètre " -"n'aura pas de transitions et aucune paroi ne sera imprimée au centre pour " -"remplir l'espace restant. La réduction de ce paramètre réduit le nombre et " -"la longueur de ces parois centrales, mais peut laisser des espaces ou une " -"sur-extrusion" +"Quand créer des transitions entre les nombres pairs et impairs de murs. Une " +"forme cunéiforme dont l'angle est supérieur à ce paramètre n'aura pas de " +"transitions et aucun mur ne sera imprimé au centre pour remplir l'espace " +"restant. En réduisant ce paramètre, vous réduisez le nombre et la longueur " +"de ces murs centraux, mais vous risquez de laisser des vides ou de " +"surextruder les murs." msgid "Wall distribution count" -msgstr "Nombre de distributions de paroi" +msgstr "Nombre de distributions murales" msgid "" "The number of walls, counted from the center, over which the variation needs " "to be spread. Lower values mean that the outer walls don't change in width" msgstr "" -"Nombre de parois, comptées à partir du centre, sur lesquelles la variation " -"doit être répartie. Des valeurs inférieures signifient que les parois " -"extérieures ne changent pas de largeur." +"Nombre de murs, comptés à partir du centre, sur lesquels la variation doit " +"être répartie. Des valeurs plus faibles signifient que la largeur des parois " +"extérieures ne change pas" msgid "Minimum feature size" -msgstr "Épaisseur minimale des parois fines" +msgstr "Taille minimale de l'élément" msgid "" "Minimum thickness of thin features. Model features that are thinner than " @@ -11168,23 +11757,26 @@ msgid "" "feature size will be widened to the Minimum wall width. It's expressed as a " "percentage over nozzle diameter" msgstr "" -"Épaisseur minimale des parois fines. Les parois du modèle qui sont plus " -"minces que cette valeur ne seront pas imprimées, tandis que les parois plus " -"épaisses que la taille minimale de la paroi seront élargies à la largeur de " -"la paroi minimale. Elle est exprimée en pourcentage sur le diamètre de la " -"buse" +"Épaisseur minimale des éléments fins. Les caractéristiques du modèle qui " +"sont plus fines que cette valeur ne seront pas imprimées, tandis que les " +"entités plus épaisses que la taille minimale seront élargies jusqu'à la " +"largeur de paroi minimale. Il est exprimé en pourcentage par rapport au " +"diamètre de la buse" msgid "First layer minimum wall width" -msgstr "" +msgstr "Largeur minimale de la paroi de la première couche" msgid "" "The minimum wall width that should be used for the first layer is " "recommended to be set to the same size as the nozzle. This adjustment is " "expected to enhance adhesion." msgstr "" +"Il est recommandé de définir la largeur minimale de paroi à utiliser pour la " +"première couche sur la même taille que la buse. Cet ajustement devrait " +"améliorer l’adhérence." msgid "Minimum wall width" -msgstr "Largeur minimale de la paroi" +msgstr "Largeur minimale du mur" msgid "" "Width of the wall that will replace thin features (according to the Minimum " @@ -11192,75 +11784,73 @@ msgid "" "thickness of the feature, the wall will become as thick as the feature " "itself. It's expressed as a percentage over nozzle diameter" msgstr "" -"Largeur de la paroi qui remplacera les parois fines (en fonction de la " -"taille minimale de la paroi) du modèle. Si la largeur minimale de la paroi " -"est plus fine que l'épaisseur de la paroi du modèle, la paroi deviendra " -"aussi épaisse que celle du modèle. Elle est exprimée en pourcentage sur le " -"diamètre de la buse" +"Largeur du mur qui remplacera les éléments fins (selon la taille minimale " +"des éléments) du modèle. Si la largeur minimale du mur est inférieure à " +"l'épaisseur de l'élément, le mur deviendra aussi épais que l'élément lui-" +"même. Il est exprimé en pourcentage par rapport au diamètre de la buse" msgid "Detect narrow internal solid infill" -msgstr "Détecter un remplissage solide étroit" +msgstr "Détecter un remplissage solide interne étroit" msgid "" "This option will auto detect narrow internal solid infill area. If enabled, " "concentric pattern will be used for the area to speed printing up. " "Otherwise, rectilinear pattern is used defaultly." msgstr "" -"Cette option détectera automatiquement les zones de remplissage solides " -"étroits. Si activé, un motif concentrique sera utilisé pour les zones afin " -"d'accélérer l'impression. Sinon, le motif rectiligne est utilisé par défaut." +"Cette option détectera automatiquement la zone de remplissage solide interne " +"étroite. S'il est activé, un motif concentrique sera utilisé pour la zone " +"afin d'accélérer l'impression. Sinon, le motif rectiligne est utilisé par " +"défaut." msgid "invalid value " -msgstr "valeur invalide " - -#, c-format, boost-format -msgid " doesn't work at 100%% density " -msgstr " ne fonctionne pas à une densité de 100%% " +msgstr "Valeur invalide " msgid "Invalid value when spiral vase mode is enabled: " -msgstr "Valeur invalide lorsque le mode vase est activé : " +msgstr "Valeur non valide lorsque le mode vase en spirale est activé: " msgid "too large line width " -msgstr "Largeur de ligne trop grande " +msgstr "largeur de ligne trop importante " msgid " not in range " -msgstr " pas dans la plage " +msgstr " hors plage " msgid "Minimum save" -msgstr "" +msgstr "Sauvegarde minimale" msgid "export 3mf with minimum size." -msgstr "" +msgstr "Exporter le fichier 3mf avec une taille minimale." msgid "No check" msgstr "Pas de vérification" msgid "Do not run any validity checks, such as gcode path conflicts check." msgstr "" -"N’exécuter aucune vérification de validité, telle que la vérification des " -"conflits de chemin G-code." +"Ne pas effectuer de contrôle de validité, tel que le contrôle des conflits " +"de parcours de G-code." msgid "Ensure on bed" -msgstr "" +msgstr "Assurer sur le plateau" msgid "" "Lift the object above the bed when it is partially below. Disabled by default" msgstr "" +"Placer l’objet sur le plateau lorsqu’il est partiellement en dessous. " +"Désactivé par défaut" msgid "Orient Options" -msgstr "" +msgstr "Options d’orientation" msgid "Orient options: 0-disable, 1-enable, others-auto" -msgstr "" +msgstr "Options d’orientation : 0-désactiver, 1-activer, autres-auto" msgid "Rotation angle around the Z axis in degrees." -msgstr "" +msgstr "Angle de rotation autour de l’axe Z en degrés." msgid "Rotate around Y" -msgstr "" +msgstr "Rotation autour de l’axe Y" msgid "Rotation angle around the Y axis in degrees." -msgstr "" +msgstr "Angle de rotation autour de l’axe Y en degrés." msgid "Data directory" msgstr "Répertoire de données" @@ -11275,107 +11865,107 @@ msgstr "" "d’un stockage réseau." msgid "Load custom gcode" -msgstr "" +msgstr "Charger un G-code personnalisé" msgid "Load custom gcode from json" -msgstr "" +msgstr "Charger un G-code personnalisé à partir de json" msgid "Error in zip archive" msgstr "Erreur dans l'archive zip" msgid "Generating walls" -msgstr "Génération des parois" +msgstr "Génération de murs" msgid "Generating infill regions" -msgstr "Génération des zones de remplissage" +msgstr "Génération de régions de remplissage" msgid "Generating infill toolpath" -msgstr "Génération du parcours de remplissage" +msgstr "Génération d'un parcours d'outil de remplissage" msgid "Detect overhangs for auto-lift" -msgstr "Détecter les surplombs pour le décalage automatique" +msgstr "Détectez les surplombs pour un levage automatique" msgid "Generating support" msgstr "Génération des supports" msgid "Checking support necessity" -msgstr "Vérification de la nécessité de supports" +msgstr "Vérification de la nécessité du support" msgid "floating regions" -msgstr "des régions flottantes" +msgstr "régions flottantes" msgid "floating cantilever" -msgstr "un cantilever flottant" +msgstr "surplomb flottant" msgid "large overhangs" -msgstr "des surplombs importants" +msgstr "grands surplombs" #, c-format, boost-format msgid "" "It seems object %s has %s. Please re-orient the object or enable support " "generation." msgstr "" -"Il semblerait que l'objet %s ait %s. Veuillez réorienter l'objet ou activer " -"la génération de supports." +"Il semble que l'objet %s possède %s. Veuillez réorienter l'objet ou activer " +"la génération de support." msgid "Optimizing toolpath" -msgstr "Optimisation du parcours" +msgstr "Optimisation du parcours d'outil" msgid "Slicing mesh" -msgstr "Découpage du maillage" +msgstr "Maillage de tranchage" msgid "" "No layers were detected. You might want to repair your STL file(s) or check " "their size or thickness and retry.\n" msgstr "" -"Aucune couche n’a été détectée. Il est peut-être nécessaire de réparer vos " -"fichiers STL ou vérifier leur taille ou leur épaisseur et réessayer.\n" +"Aucune couche n'a été détectée. Vous pouvez réparer vos STL, vérifier leur " +"taille ou leur épaisseur et réessayer.\n" msgid "" "An object's XY size compensation will not be used because it is also color-" "painted.\n" "XY Size compensation can not be combined with color-painting." msgstr "" -"La compensation de taille X-Y d’un objet ne sera pas utilisée car il est " -"également peint en couleur.\n" -"La compensation de taille X-Y ne peut pas être combinée avec la peinture en " +"La compensation de la taille XY d'un objet ne sera pas utilisée parce qu'il " +"est également peint en couleur.\n" +"La compensation de la taille XY ne peut pas être combinée avec la peinture " "couleur." #, c-format, boost-format msgid "Support: generate toolpath at layer %d" -msgstr "Support : Génération du parcours d'impression de la couche %d" +msgstr "Support : génération du parcours d'impression à la couche %d" msgid "Support: detect overhangs" -msgstr "Support : Détection des surplombs" +msgstr "Support : détection des surplombs" msgid "Support: generate contact points" -msgstr "Support : Génération des points de contact" +msgstr "Support : génération des points de contact" msgid "Support: propagate branches" -msgstr "Support : Propagation des branches" +msgstr "Support : propagation des branches" msgid "Support: draw polygons" -msgstr "Support : Traçage de polygones" +msgstr "Support : traçage de polygones" msgid "Support: generate toolpath" -msgstr "Support : Génération du parcours d'impression" +msgstr "Support : génération du parcours d'impression" #, c-format, boost-format msgid "Support: generate polygons at layer %d" -msgstr "Support : Génération des polygones de la couche %d" +msgstr "Support : génération des polygones à la couche %d" #, c-format, boost-format msgid "Support: fix holes at layer %d" -msgstr "Support : Correction des trous de la couche %d" +msgstr "Support : Correction des trous dans la couche %d" #, c-format, boost-format msgid "Support: propagate branches at layer %d" -msgstr "Support : Propagation des branches de la couche %d" +msgstr "Support : propagation des branches à la couche %d" msgid "" "Unknown file format. Input file must have .stl, .obj, .amf(.xml) extension." msgstr "" -"Format de fichier inconnu : le fichier d'entrée doit porter l'extension ." +"Format de fichier inconnu : le fichier d'entrée doit porter l'extension ." "stl, .obj ou .amf (.xml)." msgid "Loading of a model file failed." @@ -11386,14 +11976,14 @@ msgstr "Le fichier fourni n'a pas pu être lu car il est vide." msgid "Unknown file format. Input file must have .3mf or .zip.amf extension." msgstr "" -"Format de fichier inconnu : le fichier d'entrée doit porter " +"Format de fichier inconnu : le fichier d'entrée doit porter " "l'extension .3mf, .zip ou .amf." msgid "Canceled" msgstr "Annulé" msgid "load_obj: failed to parse" -msgstr "load_obj : échec de l'analyse" +msgstr "load_obj : échec de l'analyse" msgid "The file contains polygons with more than 4 vertices." msgstr "Le fichier contient des polygones comportant plus de 4 sommets." @@ -11408,73 +11998,79 @@ msgid "This OBJ file couldn't be read because it's empty." msgstr "Ce fichier OBJ n'a pas pu être lu car il est vide." msgid "Flow Rate Calibration" -msgstr "" +msgstr "Calibration du débit" msgid "Max Volumetric Speed Calibration" -msgstr "" +msgstr "Calibration de la vitesse volumétrique maximale" msgid "Manage Result" -msgstr "" +msgstr "Gérer le résultat" msgid "Manual Calibration" -msgstr "" +msgstr "Calibration manuelle" msgid "Result can be read by human eyes." -msgstr "" +msgstr "Le résultat peut être lu par des yeux humains." msgid "Auto-Calibration" -msgstr "" +msgstr "Calibration Auto" msgid "We would use Lidar to read the calibration result" -msgstr "" +msgstr "Le Micro-Lidar sera utilisé pour lire le résultat de la calibration" msgid "Prev" -msgstr "" +msgstr "Précédent" msgid "Recalibration" -msgstr "" +msgstr "Recalibration" msgid "Calibrate" -msgstr "" +msgstr "Calibrations" msgid "Finish" msgstr "Terminer" msgid "How to use calibration result?" -msgstr "" +msgstr "Comment utiliser le résultat de la calibration ?" msgid "" "You could change the Flow Dynamics Calibration Factor in material editing" msgstr "" +"Vous pouvez modifier le facteur de calibration dynamique du débit dans les " +"paramètres du filament" msgid "" "The current firmware version of the printer does not support calibration.\n" "Please upgrade the printer firmware." msgstr "" +"La version actuelle du firmware de l'imprimante ne prend pas en charge la " +"calibration.\n" +"Veuillez mettre à jour le firmware de l'imprimante." msgid "Calibration not supported" -msgstr "" +msgstr "Calibration non pris en charge" msgid "Error desc" -msgstr "" +msgstr "Description" msgid "Extra info" -msgstr "" +msgstr "Informations" msgid "Flow Dynamics" -msgstr "" +msgstr "Calibration dynamique" msgid "Flow Rate" -msgstr "" +msgstr "Débit" msgid "Max Volumetric Speed" -msgstr "" +msgstr "Vitesse volumétrique maximale" msgid "Please enter the name you want to save to printer." msgstr "" +"Veuillez saisir le nom que vous souhaitez enregistrer sur l’imprimante." msgid "The name cannot exceed 40 characters." -msgstr "" +msgstr "Le nom ne peut pas dépasser 40 caractères." #, c-format, boost-format msgid "" @@ -11484,62 +12080,74 @@ msgid "" "End value: > Start value\n" "Value step: >= %.3f)" msgstr "" +"Veuillez saisir des valeurs valides :\n" +"Début: >= %.1f\n" +"Fin: <= %.1f\n" +"Fin: > Début\n" +"Intervalle: >= %.3f)" msgid "The name cannot be empty." -msgstr "" +msgstr "Le nom ne peut pas être vide." #, c-format, boost-format msgid "The selected preset: %s is not found." -msgstr "" +msgstr "Le préréglage sélectionné : %s est introuvable." msgid "The name cannot be the same as the system preset name." -msgstr "" +msgstr "Le nom ne peut pas être le même que le nom du préréglage système." msgid "The name is the same as another existing preset name" -msgstr "" +msgstr "Le nom est le même qu’un autre nom de préréglage existant" msgid "create new preset failed." -msgstr "" +msgstr "La création d’un nouveau préréglage a échoué." msgid "" "Are you sure to cancel the current calibration and return to the home page?" msgstr "" +"Voulez-vous vraiment annuler la calibration en cours et revenir à la page " +"d’accueil ?" msgid "No Printer Connected!" -msgstr "" +msgstr "Aucune imprimante connectée !" msgid "Printer is not connected yet." -msgstr "" +msgstr "L’imprimante n’est pas encore connectée." msgid "Please select filament to calibrate." -msgstr "" +msgstr "Veuillez sélectionner le filament à calibrer." msgid "The input value size must be 3." -msgstr "" +msgstr "La valeur saisie doit être 3." msgid "Connecting to printer..." -msgstr "" +msgstr "Connexion à l’imprimante…" msgid "The failed test result has been dropped." -msgstr "" +msgstr "Le résultat du test ayant échoué a été supprimé." msgid "Flow Dynamics Calibration result has been saved to the printer" msgstr "" +"Le résultat de la calibration dynamique du débit a été enregistré sur " +"l’imprimante" msgid "Internal Error" -msgstr "" +msgstr "Erreur interne" msgid "Please select at least one filament for calibration" -msgstr "" +msgstr "Veuillez sélectionner au moins un filament pour la calibration" msgid "Flow rate calibration result has been saved to preset" msgstr "" +"Le résultat de la calibration du débit a été enregistré dans le préréglage" msgid "Max volumetric speed calibration result has been saved to preset" msgstr "" +"Le résultat de la calibration de la vitesse volumétrique maximale a été " +"enregistré dans le préréglage" msgid "When do you need Flow Dynamics Calibration" -msgstr "" +msgstr "Nécessité de la calibration dynamique du débit" msgid "" "We now have added the auto-calibration for different filaments, which is " @@ -11551,9 +12159,18 @@ msgid "" "3. If the max volumetric speed or print temperature is changed in the " "filament setting." msgstr "" +"Nous avons maintenant ajouté l'auto-calibration pour différents filaments, " +"qui est entièrement automatisée et le résultat sera enregistré dans " +"l'imprimante pour une utilisation future. Vous n'avez besoin d'effectuer la " +"calibration que dans les cas limités suivants :\n" +"1. Si vous utilisez un nouveau filament de marques/modèles différents ou si " +"le filament est humide\n" +"2. Si la buse est usée ou remplacée par une neuve\n" +"3. Si la vitesse volumétrique maximale ou la température d'impression est " +"modifiée dans les préréglages du filament." msgid "About this calibration" -msgstr "" +msgstr "À propos de cette calibration" msgid "" "Please find the details of Flow Dynamics Calibration from our wiki.\n" @@ -11574,9 +12191,31 @@ msgid "" "cause the result not exactly the same in each calibration. We are still " "investigating the root cause to do improvements with new updates." msgstr "" +"Veuillez trouver les détails de la calibration dynamique du débit sur notre " +"Wiki.\n" +"\n" +"Habituellement, la calibration est inutile. Lorsque vous démarrez une " +"impression d'une seule couleur/matériau, avec l'option \"Calibration du débit" +"\" cochée dans le menu de démarrage de l'impression, l'imprimante suivra " +"l'ancienne méthode de calibration du filament avant l'impression.\n" +"Lorsque vous démarrez une impression multi-couleurs/matériaux, l'imprimante " +"utilise le paramètre de compensation par défaut pour le filament lors de " +"chaque changement de filament, ce qui donne un bon résultat dans la plupart " +"des cas.\n" +"\n" +"Veuillez noter qu'il y a quelques cas qui rendront le résultat de " +"calibration non fiable : utiliser un plateau texturé pour faire la " +"calibration, utiliser un plateau qui n'a pas une bonne adhérence (veuillez " +"dans ce cas laver la plaque de construction ou appliquer de la colle)… Vous " +"pouvez trouver d'autres cas sur notre Wiki.\n" +"\n" +"Les résultats de calibration ont environ 10 % d'écart dans nos tests, ce qui " +"peut faire en sorte que le résultat ne soit pas exactement le même à chaque " +"calibration. Nous enquêtons toujours sur la cause première pour apporter des " +"améliorations avec de nouvelles mises à jour." msgid "When to use Flow Rate Calibration" -msgstr "" +msgstr "Nécessité de la calibration du débit" msgid "" "After using Flow Dynamics Calibration, there might still be some extrusion " @@ -11589,12 +12228,28 @@ msgid "" "4. Weak Structural Integrity: Prints break easily or don't seem as sturdy as " "they should be." msgstr "" +"Après avoir utilisé la calibration dynamique du débit, il peut encore y " +"avoir des problèmes d'extrusion, tels que :\n" +"1. Sur-extrusion : Excès de matière sur votre objet imprimé, formant des " +"gouttes ou des boutons, ou si les couches semblent plus épaisses que prévu " +"et non uniformes.\n" +"2. Sous-extrusion : Couches très fines, une faible force de remplissage ou " +"des espaces dans la couche supérieure du modèle, même si l'impression est " +"lente\n" +"3. Mauvaise qualité de surface : Si la surface de vos impressions semble " +"rugueuse ou inégale.\n" +"4. Faible intégrité structurelle : Impressions qui cassent facilement ou ne " +"semblent pas aussi solides qu'elles le devraient." msgid "" "In addition, Flow Rate Calibration is crucial for foaming materials like LW-" "PLA used in RC planes. These materials expand greatly when heated, and " "calibration provides a useful reference flow rate." msgstr "" +"De plus, la calibration du débit est crucial pour les matériaux dotés de la " +"technologie de mousse active comme le LW-PLA utilisés dans les avions RC. " +"Ces matériaux se dilatent considérablement lorsqu'ils sont chauffés et la " +"calibration fournit un débit de référence utile." msgid "" "Flow Rate Calibration measures the ratio of expected to actual extrusion " @@ -11604,6 +12259,13 @@ msgid "" "you still see the listed defects after you have done other calibrations. For " "more details, please check out the wiki article." msgstr "" +"La calibration du débit mesure le ratio entre les volumes d’extrusion " +"attendus et réels. Le réglage par défaut fonctionne bien sur les imprimantes " +"Bambu Lab et les filaments officiels car ils ont été pré-calibrés et " +"affinés. Pour un filament ordinaire, vous n’aurez généralement pas besoin " +"d’effectuer une calibration du débit à moins que vous ne voyiez toujours les " +"défauts répertoriés après avoir effectué d’autres calibrations. Pour plus de " +"détails, veuillez consulter l’article du wiki." msgid "" "Auto Flow Rate Calibration utilizes Bambu Lab's Micro-Lidar technology, " @@ -11623,34 +12285,59 @@ msgid "" "can lead to sub-par prints or printer damage. Please make sure to carefully " "read and understand the process before doing it." msgstr "" +"La calibration automatique du débit utilise la technologie Micro-Lidar de " +"Bambu Lab, mesurant directement les modèles de calibration. Cependant, " +"veuillez noter que l’efficacité et la précision de cette méthode peuvent " +"être compromises avec des types de matériaux spécifiques. En particulier, " +"les filaments qui sont transparents ou semi-transparents, à particules " +"scintillantes ou qui ont une finition hautement réfléchissante peuvent ne " +"pas convenir à cette calibration et peuvent produire des résultats moins que " +"souhaitables.\n" +"\n" +"Les résultats d’étalonnage peuvent varier entre chaque calibration ou " +"filament. Nous améliorons toujours la précision et la compatibilité de cette " +"calibration grâce aux mises à jour du firmware au fil du temps.\n" +"\n" +"Attention : la calibration du débit est un processus avancé, qui ne doit " +"être tenté que par ceux qui comprennent parfaitement son objectif et ses " +"implications. Une utilisation incorrecte peut entraîner des impressions de " +"qualité inférieure ou endommager l’imprimante. Assurez-vous de lire " +"attentivement et de comprendre le processus avant de le faire." msgid "When you need Max Volumetric Speed Calibration" -msgstr "" +msgstr "Nécessité de la calibration de la vitesse volumétrique maximale" msgid "Over-extrusion or under extrusion" -msgstr "" +msgstr "Sur-extrusion ou sous-extrusion" msgid "Max Volumetric Speed calibration is recommended when you print with:" msgstr "" +"La calibration de la vitesse volumétrique maximale est recommandée lorsque " +"vous imprimez avec :" msgid "material with significant thermal shrinkage/expansion, such as..." -msgstr "" +msgstr "un matériau avec un retrait/dilatation thermique important, tel que…" msgid "materials with inaccurate filament diameter" -msgstr "" +msgstr "des matériaux avec un diamètre de filament imprécis" msgid "We found the best Flow Dynamics Calibration Factor" msgstr "" +"Nous avons trouvé le meilleur facteur de calibration dynamique du débit" msgid "" "Part of the calibration failed! You may clean the plate and retry. The " "failed test result would be dropped." msgstr "" +"Une partie de la calibration a échoué ! Vous pouvez nettoyer le plateau et " +"réessayer. Le résultat du test échoué serai abandonné." msgid "" "*We recommend you to add brand, materia, type, and even humidity level in " "the Name" msgstr "" +"*Nous vous recommandons d’ajouter la marque, la matière, le type et même le " +"niveau d’humidité dans le nom" msgid "Failed" msgstr "Échoué" @@ -11659,6 +12346,8 @@ msgid "" "Only one of the results with the same name will be saved. Are you sure you " "want to overrides the other results?" msgstr "" +"Un seul des résultats portant le même nom sera enregistré. Voulez-vous " +"vraiment remplacer les autres résultats ?" #, c-format, boost-format msgid "" @@ -11666,196 +12355,212 @@ msgid "" "Only one of the results with the same name is saved. Are you sure you want " "to overrides the historical result?" msgstr "" +"Il existe déjà un résultat de calibration portant le même nom : %s. Un seul " +"des résultats portant le même nom est enregistré. Voulez-vous vraiment " +"remplacer le résultat précédent ?" msgid "Please find the best line on your plate" -msgstr "" +msgstr "Veuillez trouver la meilleure ligne sur votre plateau" msgid "Please find the cornor with perfect degree of extrusion" -msgstr "" +msgstr "Veuillez trouver le coin avec un degré d’extrusion parfait" msgid "Input Value" -msgstr "" +msgstr "Valeur d’entrée" msgid "Save to Filament Preset" -msgstr "" +msgstr "Enregistrer dans le préréglage du filament" msgid "Preset" -msgstr "" +msgstr "Préréglage" msgid "Record Factor" -msgstr "" +msgstr "Enregistrer le facteur" msgid "We found the best flow ratio for you" -msgstr "" +msgstr "Nous avons trouvé le meilleur ratio de débit pour vous" msgid "Flow Ratio" -msgstr "" +msgstr "Ratio du débit" msgid "Please input a valid value (0.0 < flow ratio < 2.0)" -msgstr "" +msgstr "Veuillez saisir une valeur valide (0,0 < ratio du débit < 2,0)" msgid "Please enter the name of the preset you want to save." -msgstr "" +msgstr "Veuillez saisir le nom du préréglage que vous souhaitez enregistrer." msgid "Calibration1" -msgstr "" +msgstr "Calibration 1" msgid "Calibration2" -msgstr "" +msgstr "Calibration 2" msgid "Please find the best object on your plate" -msgstr "" +msgstr "Veuillez trouver le meilleur objet sur votre plateau" msgid "Fill in the value above the block with smoothest top surface" msgstr "" +"Remplissez la valeur au-dessus du bloc avec la surface supérieure la plus " +"lisse" msgid "Skip Calibration2" -msgstr "" +msgstr "Ignorer la Calibration 2" #, c-format, boost-format msgid "flow ratio : %s " -msgstr "" +msgstr "Ratio du débit : %s " msgid "Please choose a block with smoothest top surface" -msgstr "" +msgstr "Veuillez choisir un bloc avec la surface supérieure la plus lisse" msgid "Please choose a block with smoothest top surface." -msgstr "" +msgstr "Veuillez choisir un bloc avec la surface supérieure la plus lisse." msgid "Please input a valid value (0 <= Max Volumetric Speed <= 60)" msgstr "" +"Veuillez entrer une valeur valide (0 <= Vitesse volumétrique max <= 60)" msgid "Calibration Type" -msgstr "" +msgstr "Type de calibration" msgid "Complete Calibration" -msgstr "" +msgstr "Calibration complète" msgid "Fine Calibration based on flow ratio" -msgstr "" +msgstr "Calibration précise basée sur le ratio du débit" msgid "Title" -msgstr "" +msgstr "Titre" msgid "" "A test model will be printed. Please clear the build plate and place it back " "to the hot bed before calibration." msgstr "" +"Un modèle de test sera imprimé. Veuillez nettoyer le plateau avant la " +"calibration." msgid "Printing Parameters" -msgstr "" +msgstr "Paramètres d’impression" msgid "- ℃" -msgstr "" +msgstr "- ℃" msgid " ℃" -msgstr "" +msgstr " ℃" msgid "Plate Type" msgstr "Type de plaque" msgid "filament position" -msgstr "" +msgstr "Position du filament" msgid "External Spool" -msgstr "" +msgstr "Externe" msgid "Filament For Calibration" -msgstr "" +msgstr "Filament pour la calibration" msgid "" "Tips for calibration material: \n" "- Materials that can share same hot bed temperature\n" "- Different filament brand and family(Brand = Bambu, Family = Basic, Matte)" msgstr "" +"Conseils pour le matériau de calibration :\n" +"- Matériaux pouvant partager la même température du plateau\n" +"- Différentes marques et familles de filaments (Marque = Bambu, Famille = " +"Basique, Mat)" msgid "Pattern" -msgstr "" +msgstr "Motif" msgid "Method" msgstr "Méthode" #, c-format, boost-format msgid "%s is not compatible with %s" -msgstr "" +msgstr "%s n’est pas compatible avec %s" msgid "TPU is not supported for Flow Dynamics Auto-Calibration." -msgstr "" +msgstr "Le TPU n’est pas supporté pour la calibration dynamique du débit." msgid "Connecting to printer" -msgstr "" +msgstr "Connexion à l’imprimante" msgid "From k Value" -msgstr "" +msgstr "De la valeur K" msgid "To k Value" -msgstr "" +msgstr "À la valeur K" msgid "Step value" -msgstr "" +msgstr "Intervalle" msgid "0.5" -msgstr "" +msgstr "0.5" msgid "0.005" -msgstr "" +msgstr "0.005" msgid "The nozzle diameter has been synchronized from the printer Settings" msgstr "" +"Le diamètre de la buse a été synchronisé à partir des paramètres de " +"l’imprimante" msgid "From Volumetric Speed" -msgstr "" +msgstr "Depuis la vitesse volumétrique" msgid "To Volumetric Speed" -msgstr "" +msgstr "Vers la vitesse volumétrique" msgid "Flow Dynamics Calibration Result" -msgstr "" +msgstr "Résultat de la calibration dynamique du débit" msgid "No History Result" -msgstr "" +msgstr "Aucun historique" msgid "Success to get history result" -msgstr "" +msgstr "Aucun historique" msgid "Refreshing the historical Flow Dynamics Calibration records" -msgstr "" +msgstr "Actualisation de historique des calibrations dynamiques du débit" msgid "Action" -msgstr "" +msgstr "Action" msgid "Edit Flow Dynamics Calibration" -msgstr "" +msgstr "Editer la calibration dynamique du débit" msgid "Network lookup" -msgstr "" +msgstr "Recherche de réseau" msgid "Address" -msgstr "" +msgstr "Adresse" msgid "Hostname" -msgstr "" +msgstr "Nom d’hôte" msgid "Service name" -msgstr "" +msgstr "Nom du service" msgid "OctoPrint version" -msgstr "" +msgstr "Version OctoPrint" msgid "Searching for devices" -msgstr "" +msgstr "Recherche d’appareils" msgid "Finished" msgstr "Terminé" msgid "Multiple resolved IP addresses" -msgstr "" +msgstr "Adresses IP à résolution multiple" #, boost-format msgid "" "There are several IP addresses resolving to hostname %1%.\n" "Please select one that should be used." msgstr "" +"Il existe plusieurs adresses IP résolues par le nom d’hôte %1%.\n" +"Veuillez en sélectionner une qui doit être utilisée." msgid "PA Calibration" msgstr "Calibration Pressure Advance" @@ -11876,7 +12581,7 @@ msgid "PA Line" msgstr "Ligne PA" msgid "PA Pattern" -msgstr "" +msgstr "Motif PA" msgid "Start PA: " msgstr "Début: " @@ -11896,13 +12601,13 @@ msgid "" "End PA: > Start PA\n" "PA step: >= 0.001)" msgstr "" -"Veuillez saisir des valeurs valides :\n" +"Veuillez saisir des valeurs valides :\n" "Début: >= 0.0\n" "Fin: > Début\n" "Intervalle: >= 0.001)" msgid "Temperature calibration" -msgstr "Température de calibration" +msgstr "Calibration de Température" msgid "PLA" msgstr "PLA" @@ -11940,6 +12645,10 @@ msgid "" "End temp: >= 170\n" "Start temp > End temp + 5)" msgstr "" +"Veuillez saisir des valeurs valides :\n" +"Début <= 350\n" +"Fin >= 170\n" +"Début > Fin + 5)" msgid "Max volumetric speed test" msgstr "Test de vitesse volumétrique max" @@ -11951,7 +12660,7 @@ msgid "End volumetric speed: " msgstr "Vitesse volumétrique de fin: " msgid "step: " -msgstr "Intervalle: " +msgstr "intervalle: " msgid "" "Please input valid values:\n" @@ -11959,6 +12668,10 @@ msgid "" "step >= 0\n" "end > start + step)" msgstr "" +"Veuillez saisir des valeurs valides :\n" +"Début > 0 \n" +"Intervalle >= 0\n" +"Fin > Début + Intervalle)" msgid "VFA test" msgstr "Test VFA" @@ -11975,6 +12688,10 @@ msgid "" "step >= 0\n" "end > start + step)" msgstr "" +"Veuillez saisir des valeurs valides :\n" +"Début > 10 \n" +"intervalles >= 0\n" +"Fin > Début + Intervalle)" msgid "Start retraction length: " msgstr "Longueur de rétraction de début: " @@ -11986,51 +12703,55 @@ msgid "mm/mm" msgstr "mm/mm" msgid "Send G-Code to printer host" -msgstr "" +msgstr "Envoyer le G-code à l’imprimante" msgid "Upload to Printer Host with the following filename:" -msgstr "" +msgstr "Envoyer vers l’imprimante avec le nom de fichier suivant :" msgid "Use forward slashes ( / ) as a directory separator if needed." msgstr "" +"Utilisez des barres obliques ( / ) comme séparateur de répertoire si " +"nécessaire." msgid "Upload to storage" -msgstr "" +msgstr "Envoyer vers le stockage" #, c-format, boost-format msgid "Upload filename doesn't end with \"%s\". Do you wish to continue?" msgstr "" +"Le nom du fichier envoyé ne se termine pas par \"%s\". Souhaitez-vous " +"continuer ?" msgid "Upload" -msgstr "" +msgstr "Envoyer" msgid "Print host upload queue" -msgstr "" +msgstr "File d’attente d’envoi de l’hôte d’impression" msgid "ID" -msgstr "" +msgstr "ID" msgid "Progress" -msgstr "" +msgstr "Progression" msgid "Host" -msgstr "" +msgstr "Hôte" msgctxt "OfFile" msgid "Size" -msgstr "" +msgstr "Taille" msgid "Filename" -msgstr "" +msgstr "Nom de fichier" msgid "Cancel selected" -msgstr "" +msgstr "Annuler la sélection" msgid "Show error message" -msgstr "" +msgstr "Afficher le message d’erreur" msgid "Enqueued" -msgstr "" +msgstr "En file d’attente" msgid "Uploading" msgstr "Téléversement" @@ -12039,53 +12760,902 @@ msgid "Cancelling" msgstr "Annulation" msgid "Error uploading to print host" -msgstr "Erreur de téléchargement vers l'hôte d'impression" +msgstr "Erreur lors de l’envoi vers l’hôte d’impression" msgid "Unable to perform boolean operation on selected parts" msgstr "" +"Impossible d’effectuer une opération booléenne sur les pièces sélectionnées" msgid "Mesh Boolean" -msgstr "" +msgstr "Opérations booléennes" msgid "Union" -msgstr "" +msgstr "Fusion" msgid "Difference" -msgstr "" +msgstr "Soustraction" msgid "Intersection" -msgstr "" +msgstr "Intersection" msgid "Source Volume" -msgstr "" +msgstr "Volume d’origine" msgid "Tool Volume" -msgstr "" +msgstr "Volume d’outil" msgid "Subtract from" -msgstr "" +msgstr "Soustraire de" msgid "Subtract with" -msgstr "" +msgstr "Soustraire avec" msgid "selected" -msgstr "" +msgstr "sélectionné" msgid "Part 1" -msgstr "" +msgstr "Partie 1" msgid "Part 2" -msgstr "" +msgstr "Partie 2" msgid "Delete input" +msgstr "Supprimer l’objet" + +msgid "Network Test" +msgstr "Test du réseau" + +msgid "Start Test Multi-Thread" +msgstr "Démarrer le test multithread" + +msgid "Start Test Single-Thread" +msgstr "Démarrer le test Single-Thread" + +msgid "Export Log" +msgstr "Exportation du journal" + +msgid "Studio Version:" +msgstr "Version de Studio :" + +msgid "System Version:" +msgstr "Version du système :" + +msgid "DNS Server:" +msgstr "Serveur DNS :" + +msgid "Test BambuLab" +msgstr "Test BambuLab" + +msgid "Test BambuLab:" +msgstr "Test BambuLab :" + +msgid "Test Bing.com" +msgstr "Test Bing.com" + +msgid "Test bing.com:" +msgstr "Test bing.com :" + +msgid "Test HTTP" msgstr "" +msgid "Test HTTP Service:" +msgstr "Test du service HTTP :" + +msgid "Test storage" +msgstr "Test du stockage" + +msgid "Test Storage Upload:" +msgstr "Test de l’envoi du stockage:" + +msgid "Test storage upgrade" +msgstr "Test de la mise à niveau du stockage" + +msgid "Test Storage Upgrade:" +msgstr "Test de la mise à niveau du stockage :" + +msgid "Test storage download" +msgstr "Test du téléchargement du stockage" + +msgid "Test Storage Download:" +msgstr "Test du téléchargement du stockage :" + +msgid "Test plugin download" +msgstr "Test du téléchargement du plugin" + +msgid "Test Plugin Download:" +msgstr "Test du téléchargement du plugin :" + +msgid "Test Storage Upload" +msgstr "Test de l’envoi du stockage" + +msgid "Log Info" +msgstr "Journal de bord" + +msgid "Select filament preset" +msgstr "Sélection du préréglage du filament" + +msgid "Create Filament" +msgstr "Création d’un filament" + +msgid "Create Based on Current Filament" +msgstr "Créer en fonction du filament actuel" + +msgid "Copy Current Filament Preset " +msgstr "Copier le préréglage actuel du filament " + +msgid "Basic Information" +msgstr "Informations de base" + +msgid "Add Filament Preset under this filament" +msgstr "Ajouter un préréglage de filament sous ce filament" + +msgid "We could create the filament presets for your following printer:" +msgstr "" +"Nous pourrions créer les préréglages de filaments pour votre imprimante " +"suivante :" + +msgid "Select Vendor" +msgstr "Sélectionner le fournisseur" + +msgid "Input Custom Vendor" +msgstr "Saisir le fournisseur personnalisé" + +msgid "Can't find vendor I want" +msgstr "Je ne trouve pas le vendeur que je souhaite" + +msgid "Select Type" +msgstr "Sélectionner le type" + +msgid "Select Filament Preset" +msgstr "Sélectionner le préréglage du filament" + +msgid "Serial" +msgstr "Numéro de série" + +msgid "e.g. Basic, Matte, Silk, Marble" +msgstr "par exemple : Basic, Matte, Silk, Marble" + +msgid "Filament Preset" +msgstr "Préréglage du filament" + +msgid "Create" +msgstr "Créer" + +msgid "Vendor is not selected, please reselect vendor." +msgstr "" +"Le fournisseur n’est pas sélectionné, veuillez le sélectionner à nouveau." + +msgid "Custom vendor is not input, please input custom vendor." +msgstr "" +"Le fournisseur personnalisé n’est pas saisi, veuillez saisir le fournisseur " +"personnalisé." + +msgid "" +"\"Bambu\" or \"Generic\" can not be used as a Vendor for custom filaments." +msgstr "" +"« Bambu » ou « Générique » ne peuvent pas être utilisés comme fournisseur de " +"filaments personnalisés." + +msgid "Filament type is not selected, please reselect type." +msgstr "" +"Le type de filament n’est pas sélectionné, veuillez resélectionner le type." + +msgid "Filament serial is not inputed, please input serial." +msgstr "" +"Le numéro de série du filament n’est pas saisi, veuillez saisir le numéro de " +"série." + +msgid "" +"There may be escape characters in the vendor or serial input of filament. " +"Please delete and re-enter." +msgstr "" +"Il peut y avoir des caractères d’échappement dans l’entrée du fournisseur ou " +"du numéro de série du filament. Veuillez les supprimer et les saisir à " +"nouveau." + +msgid "All inputs in the custom vendor or serial are spaces. Please re-enter." +msgstr "" +"Toutes les entrées dans le vendeur ou le numéro de série personnalisé sont " +"des espaces. Veuillez les saisir à nouveau." + +msgid "The vendor can not be a number. Please re-enter." +msgstr "" + +msgid "" +"You have not selected a printer or preset yet. Please select at least one." +msgstr "" +"Vous n’avez pas encore sélectionné d’imprimante ou de préréglage. Veuillez " +"en sélectionner au moins un." + +msgid "Some existing presets have failed to be created, as follows:\n" +msgstr "Certains préréglages existants n’ont pas été créés, comme suit :\n" + +msgid "" +"\n" +"Do you want to rewrite it?" +msgstr "" +"\n" +"Voulez-vous le réécrire ?" + +msgid "" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" +"To add preset for more prinetrs, Please go to printer selection" +msgstr "" +"Nous renommerions les préréglages en « Fournisseur Type Série @imprimante " +"que vous avez sélectionnée ». \n" +"Pour ajouter des préréglages pour d’autres imprimantes, veuillez aller à la " +"sélection de l’imprimante." + +msgid "Create Printer/Nozzle" +msgstr "Créer une imprimante/buse" + +msgid "Create Printer" +msgstr "Créer une imprimante" + +msgid "Create Nozzle for Existing Printer" +msgstr "Créer une buse pour une imprimante existante" + +msgid "Create from Template" +msgstr "Créer depuis un modèle" + +msgid "Create Based on Current Printer" +msgstr "Créer en fonction de l’imprimante actuelle" + +msgid "wiki" +msgstr "" + +msgid "Import Preset" +msgstr "Importer un préréglage" + +msgid "Create Type" +msgstr "Créer un type" + +msgid "The model is not fond, place reselect vendor." +msgstr "Le modèle n’est pas trouvé, il faut resélectionner le fournisseur." + +msgid "Select Model" +msgstr "Sélectionner le modèle" + +msgid "Select Printer" +msgstr "Sélectionner l’imprimante" + +msgid "Input Custom Model" +msgstr "Entrée du modèle personnalisé" + +msgid "Can't find my printer model" +msgstr "Impossible de trouver le modèle de mon imprimante" + +msgid "Rectangle" +msgstr "" + +msgid "Printable Space" +msgstr "Espace imprimable" + +msgid "X" +msgstr "" + +msgid "Y" +msgstr "" + +msgid "Hot Bed STL" +msgstr "STL du plateau" + +msgid "Load stl" +msgstr "Charger stl" + +msgid "Hot Bed SVG" +msgstr "SVG du plateau" + +msgid "Load svg" +msgstr "Charger le svp" + +msgid "Max Print Height" +msgstr "Hauteur d’impression maximale" + +#, c-format, boost-format +msgid "The file exceeds %d MB, please import again." +msgstr "Le fichier dépasse %d MB, veuillez réimporter." + +msgid "Exception in obtaining file size, please import again." +msgstr "" +"Exception dans l’obtention de la taille du fichier, veuillez importer à " +"nouveau." + +msgid "Preset path is not find, please reselect vendor." +msgstr "" +"Le chemin d’accès prédéfini n’est pas trouvé, veuillez resélectionner le " +"vendeur." + +msgid "The printer model was not found, please reselect." +msgstr "Le modèle d’imprimante n’a pas été trouvé, veuillez resélectionner." + +msgid "The nozzle diameter is not fond, place reselect." +msgstr "Le diamètre de la buse n’est pas bon, resélectionner l’emplacement." + +msgid "The printer preset is not fond, place reselect." +msgstr "Le préréglage de l’imprimante n’est pas bon, placez le préréglage." + +msgid "Printer Preset" +msgstr "Préréglage de l’imprimante" + +msgid "Filament Preset Template" +msgstr "Modèle de préréglage Filament" + +msgid "Deselect All" +msgstr "Désélectionner tout" + +msgid "Process Preset Template" +msgstr "Modèle de préréglage de processus" + +msgid "Back Page 1" +msgstr "Retour à la page 1" + +msgid "" +"You have not yet chosen which printer preset to create based on. Please " +"choose the vendor and model of the printer" +msgstr "" +"Vous n’avez pas encore choisi le préréglage de l’imprimante sur lequel " +"créer. Veuillez choisir le fournisseur et le modèle de l’imprimante" + +msgid "" +"You have entered an illegal input in the printable area section on the first " +"page. Please check before creating it." +msgstr "" +"Vous avez introduit une donnée illégale dans la section « zone imprimable » " +"de la première page. Veuillez vérifier avant de la créer." + +msgid "The custom printer or model is not inputed, place input." +msgstr "" +"L’imprimante ou le modèle personnalisé n’est pas saisi, placer la saisie." + +msgid "" +"The printer preset you created already has a preset with the same name. Do " +"you want to overwrite it?\n" +"\tYes: Overwrite the printer preset with the same name, and filament and " +"process presets with the same preset name will be recreated \n" +"and filament and process presets without the same preset name will be " +"reserve.\n" +"\tCancel: Do not create a preset, return to the creation interface." +msgstr "" +"Le préréglage d’imprimante que vous avez créé possède déjà un préréglage " +"portant le même nom. Voulez-vous l’écraser ?\n" +"\tOui : écraser le préréglage d’imprimante portant le même nom, et les " +"préréglages de filament et de processus portant le même nom de préréglage " +"seront recréés. \n" +"et les préréglages de filament et de processus sans le même nom de " +"préréglage seront réservés.\n" +"\tAnnuler : Ne pas créer de préréglage, revenir à l’interface de création." + +msgid "You need to select at least one filament preset." +msgstr "Vous devez sélectionner au moins un préréglage de filament." + +msgid "You need to select at least one process preset." +msgstr "Vous devez sélectionner au moins un préréglage de filament." + +msgid "Create filament presets failed. As follows:\n" +msgstr "La création de préréglages de filaments a échoué. Comme suit :\n" + +msgid "Create process presets failed. As follows:\n" +msgstr "La création de préréglages de processus a échoué. Comme suit :\n" + +msgid "Vendor is not find, please reselect." +msgstr "Le vendeur n’est pas trouvé, veuillez resélectionner." + +msgid "Current vendor has no models, please reselect." +msgstr "Le vendeur actuel n’a pas de modèle, veuillez resélectionner." + +msgid "" +"You have not selected the vendor and model or inputed the custom vendor and " +"model." +msgstr "" +"Vous n’avez pas sélectionné le fournisseur et le modèle ou introduit le " +"fournisseur et le modèle personnalisés." + +msgid "" +"There may be escape characters in the custom printer vendor or model. Please " +"delete and re-enter." +msgstr "" +"Il peut y avoir des caractères d’échappement dans le fournisseur ou le " +"modèle de l’imprimante personnalisée. Veuillez les supprimer et les saisir à " +"nouveau." + +msgid "" +"All inputs in the custom printer vendor or model are spaces. Please re-enter." +msgstr "" +"Toutes les entrées dans le modèle ou le fournisseur de l’imprimante " +"personnalisée sont des espaces. Veuillez les saisir à nouveau." + +msgid "Please check bed printable shape and origin input." +msgstr "Veuillez vérifier la forme imprimable du lit et l’entrée de l’origine." + +msgid "" +"You have not yet selected the printer to replace the nozzle, please choose." +msgstr "" +"Vous n’avez pas encore sélectionné l’imprimante pour remplacer la buse, " +"veuillez choisir." + +msgid "Create Printer Successful" +msgstr "Création d’une imprimante réussie" + +msgid "Create Filament Successful" +msgstr "Créer un filament réussi" + +msgid "Printer Created" +msgstr "Imprimante créée" + +msgid "Please go to printer settings to edit your presets" +msgstr "" +"Veuillez aller dans les paramètres de l’imprimante pour modifier vos " +"préréglages." + +msgid "Filament Created" +msgstr "Filament créé" + +msgid "" +"Please go to filament setting to edit your presets if you need.\n" +"Please note that nozzle temperature, hot bed temperature, and maximum " +"volumetric speed have a significant impact on printing quality. Please set " +"them carefully." +msgstr "" +"Si vous le souhaitez, vous pouvez modifier vos préréglages dans les " +"paramètres du filament.\n" +"Veuillez noter que la température de la buse, la température du plateau et " +"la vitesse volumétrique maximale ont un impact significatif sur la qualité " +"de l’impression. Veuillez les régler avec soin." + +msgid "Printer Setting" +msgstr "Réglage de l’imprimante" + +msgid "Export Configs" +msgstr "Exporter les configurations" + +msgid "Printer config bundle(.bbscfg)" +msgstr "Paquet de configuration de l’imprimante (.bbscfg)" + +msgid "Filament bundle(.bbsflmt)" +msgstr "Paquet de filaments (.bbsflmt)" + +msgid "Printer presets(.zip)" +msgstr "Préréglages d’imprimante(.zip)" + +msgid "Filament presets(.zip)" +msgstr "Présélections de filaments(.zip)" + +msgid "Process presets(.zip)" +msgstr "Présélections de processus(.zip)" + +msgid "initialize fail" +msgstr "échec de l’initialisation" + +msgid "add file fail" +msgstr "échec de l’ajout d’un fichier" + +msgid "add bundle structure file fail" +msgstr "échec de l’ajout d’un fichier de structure de paquet" + +msgid "finalize fail" +msgstr "échec de la finalisation" + +msgid "open zip written fail" +msgstr "échec de l’ouverture d’un zip écrit" + +msgid "Export successful" +msgstr "Exportation réussie" + +#, c-format, boost-format +msgid "" +"The '%s' folder already exists in the current directory. Do you want to " +"clear it and rebuild it.\n" +"If not, a time suffix will be added, and you can modify the name after " +"creation." +msgstr "" +"Le dossier ‘%s’ existe déjà dans le répertoire actuel. Voulez-vous l’effacer " +"et le reconstruire ?\n" +"Si ce n’est pas le cas, un suffixe temporel sera ajouté, et vous pourrez " +"modifier le nom après la création." + +msgid "" +"Printer and all the filament&process presets that belongs to the printer. \n" +"Can be shared with others." +msgstr "" +"Imprimante et tous les préréglages de filament et de processus qui " +"appartiennent à l’imprimante. \n" +"Peut être partagé avec d’autres." + +msgid "" +"User's fillment preset set. \n" +"Can be shared with others." +msgstr "" +"Préréglage du remplissage par l’utilisateur. \n" +"Peut être partagé avec d’autres." + +msgid "" +"Only display printer names with changes to printer, filament, and process " +"presets." +msgstr "" +"N’afficher que les noms d’imprimantes avec les modifications apportées aux " +"préréglages de l’imprimante, du filament et du processus." + +msgid "Only display the filament names with changes to filament presets." +msgstr "" +"N’affichez que les noms des filaments lorsque vous modifiez les préréglages " +"des filaments." + +msgid "" +"Only printer names with user printer presets will be displayed, and each " +"preset you choose will be exported as a zip." +msgstr "" +"Seuls les noms d’imprimantes avec des préréglages d’imprimante utilisateur " +"seront affichés, et chaque préréglage que vous choisissez sera exporté sous " +"forme de fichier zip." + +msgid "" +"Only the filament names with user filament presets will be displayed, \n" +"and all user filament presets in each filament name you select will be " +"exported as a zip." +msgstr "" +"Seuls les noms de filaments contenant des préréglages de filaments " +"utilisateur seront affichés, \n" +"et tous les préréglages de filament d’utilisateur dans chaque nom de " +"filament que vous sélectionnez seront exportés sous forme de fichier zip." + +msgid "" +"Only printer names with changed process presets will be displayed, \n" +"and all user process presets in each printer name you select will be " +"exported as a zip." +msgstr "" +"Seuls les noms d’imprimantes dont les préréglages de processus ont été " +"modifiés seront affichés, \n" +"et tous les préréglages de processus de l’utilisateur dans chaque nom " +"d’imprimante que vous sélectionnez seront exportés sous forme de fichier zip." + +msgid "Please select at least one printer or filament." +msgstr "Veuillez sélectionner au moins une imprimante ou un filament." + +msgid "Please select a type you want to export" +msgstr "Veuillez sélectionner le type de produit que vous souhaitez exporter" + +msgid "Edit Filament" +msgstr "Modifier le filament" + +msgid "Filament presets under this filament" +msgstr "Préréglages du filament sous ce filament" + +msgid "" +"Note: If the only preset under this filament is deleted, the filament will " +"be deleted after exiting the dialog." +msgstr "" +"Remarque : si le seul préréglage sous ce filament est supprimé, le filament " +"sera supprimé après avoir quitté la boîte de dialogue." + +msgid "Presets inherited by other presets can not be deleted" +msgstr "" +"Les préréglages hérités d’autres préréglages ne peuvent pas être supprimés." + +msgid "The following presets inherits this preset." +msgid_plural "The following preset inherits this preset." +msgstr[0] "Les préréglages suivants héritent de ce préréglage." +msgstr[1] "Le préréglage suivant hérite de ce préréglage." + +msgid "Delete Preset" +msgstr "Supprimer la présélection" + +msgid "Are you sure to delete the selected preset?" +msgstr "Êtes-vous sûr de vouloir supprimer le préréglage sélectionné ?" + +msgid "Delete preset" +msgstr "Effacer la présélection" + +msgid "+ Add Preset" +msgstr "+ Ajouter un préréglage" + +msgid "Delete Filament" +msgstr "Supprimer le filament" + +msgid "" +"All the filament presets belong to this filament would be deleted. \n" +"If you are using this filament on your printer, please reset the filament " +"information for that slot." +msgstr "" +"Tous les préréglages de filaments appartenant à ce filament seront " +"supprimés. \n" +"Si vous utilisez ce filament sur votre imprimante, veuillez réinitialiser " +"les informations relatives au filament pour cet emplacement." + +msgid "Delete filament" +msgstr "Supprimer le filament" + +msgid "Add Preset" +msgstr "Ajouter un préréglage" + +msgid "Add preset for new printer" +msgstr "Ajouter un préréglage pour une nouvelle imprimante" + +msgid "Copy preset from filament" +msgstr "Copier le préréglage du filament" + +msgid "The filament choice not find filament preset, please reselect it" +msgstr "" +"Le choix du filament ne correspond pas à la présélection du filament, " +"veuillez le resélectionner." + +msgid "Edit Preset" +msgstr "Modifier le préréglage" + +msgid "For more information, please check out Wiki" +msgstr "Pour plus d’informations, consultez le site Wiki" + +msgid "Collapse" +msgstr "Réduire" + +msgid "Daily Tips" +msgstr "Astuces quotidiennes" + +msgid "Need select printer" +msgstr "Nécessité de sélectionner une imprimante" + +msgid "The start, end or step is not valid value." +msgstr "Le début, la fin ou l’intervalle n’est pas une valeur valide." + +msgid "" +"Unable to calibrate: maybe because the set calibration value range is too " +"large, or the step is too small" +msgstr "" +"Impossible de calibrer : il est possible que la plage de valeurs de " +"calibrage définie est trop grande ou que l’intervalle est trop petit" + +msgid "Physical Printer" +msgstr "Imprimante Physique" + +msgid "Print Host upload" +msgstr "Envoi vers l’imprimante hôte" + +msgid "Could not get a valid Printer Host reference" +msgstr "Impossible d’obtenir une référence d’imprimante hôte valide" + +msgid "Success!" +msgstr "Succès !" + +msgid "Refresh Printers" +msgstr "Actualiser les imprimantes" + +msgid "" +"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" +"signed certificate." +msgstr "" +"Le fichier CA HTTPS est facultatif. Il n'est nécessaire que si vous utilisez " +"HTTPS avec un certificat auto-signé." + +msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" +msgstr "" +"Fichiers de certificat (*.crt, *.pem)|*.crt;*.pem|Tous les fichiers|*.*" + +msgid "Open CA certificate file" +msgstr "Ouvrir le fichier de certificat CA" + +#, c-format, boost-format +msgid "" +"On this system, %s uses HTTPS certificates from the system Certificate Store " +"or Keychain." +msgstr "" +"Sur ce système, %s utilise les certificats HTTPS du magasin de certificats " +"du système ou du trousseau." + +msgid "" +"To use a custom CA file, please import your CA file into Certificate Store / " +"Keychain." +msgstr "" +"Pour utiliser un certificat personnalisé, veuillez importer votre fichier " +"dans magasin de certificats / trousseau." + +msgid "Connection to printers connected via the print host failed." +msgstr "" +"La connexion aux imprimantes connectées via l’hôte d’impression a échoué." + +#, c-format, boost-format +msgid "Mismatched type of print host: %s" +msgstr "Type d’hôte d’impression non compatible : %s" + +msgid "Connection to AstroBox works correctly." +msgstr "La connexion à l’AstroBox fonctionne correctement." + +msgid "Could not connect to AstroBox" +msgstr "Impossible de se connecter à AstroBox" + +msgid "Note: AstroBox version at least 1.1.0 is required." +msgstr "Note : La version 1.1.0 d’AstroBox est requise." + +msgid "Connection to Duet works correctly." +msgstr "La connexion à Duet fonctionne correctement." + +msgid "Could not connect to Duet" +msgstr "Impossible de se connecter à Duet" + +msgid "Unknown error occured" +msgstr "Une erreur inconnue s’est produite" + +msgid "Wrong password" +msgstr "Mot de passe erroné" + +msgid "Could not get resources to create a new connection" +msgstr "Impossible d’obtenir des ressources pour créer une nouvelle connexion" + +msgid "Upload not enabled on FlashAir card." +msgstr "Le téléchargement n’est pas activé sur la carte FlashAir." + +msgid "Connection to FlashAir works correctly and upload is enabled." +msgstr "" +"La connexion à FlashAir fonctionne correctement et le téléchargement est " +"activé." + +msgid "Could not connect to FlashAir" +msgstr "Impossible de se connecter à FlashAir" + +msgid "" +"Note: FlashAir with firmware 2.00.02 or newer and activated upload function " +"is required." +msgstr "" +"Note : FlashAir avec le firmware 2.00.02 ou plus récent et la fonction de " +"téléchargement activée sont nécessaires." + +msgid "Connection to MKS works correctly." +msgstr "La connexion à MKS fonctionne correctement." + +msgid "Could not connect to MKS" +msgstr "Impossible de se connecter à MKS" + +msgid "Connection to OctoPrint works correctly." +msgstr "La connexion à OctoPrint fonctionne correctement." + +msgid "Could not connect to OctoPrint" +msgstr "Impossible de se connecter à OctoPrint" + +msgid "Note: OctoPrint version at least 1.1.0 is required." +msgstr "Note : La version 1.1.0 d’OctoPrint est requise." + +msgid "Connection to Prusa SL1 / SL1S works correctly." +msgstr "La connexion à Prusa SL1 / SL1S fonctionne correctement." + +msgid "Could not connect to Prusa SLA" +msgstr "Impossible de se connecter à Prusa SLA" + +msgid "Connection to PrusaLink works correctly." +msgstr "La connexion à PrusaLink fonctionne correctement." + +msgid "Could not connect to PrusaLink" +msgstr "Impossible de se connecter à PrusaLink" + +msgid "Storages found" +msgstr "Stockages trouvés" + +#. TRN %1% = storage path +#, boost-format +msgid "%1% : read only" +msgstr "%1% : lecture seule" + +#. TRN %1% = storage path +#, boost-format +msgid "%1% : no free space" +msgstr "%1% : pas d’espace libre" + +#. TRN %1% = host +#, boost-format +msgid "Upload has failed. There is no suitable storage found at %1%." +msgstr "" +"Le téléchargement a échoué. Aucun espace de stockage approprié n’a été " +"trouvé à %1%." + +msgid "Connection to Prusa Connect works correctly." +msgstr "La connexion à Prusa Connect fonctionne correctement." + +msgid "Could not connect to Prusa Connect" +msgstr "Impossible de se connecter à Prusa Connect" + +msgid "Connection to Repetier works correctly." +msgstr "La connexion à Repetier fonctionne correctement." + +msgid "Could not connect to Repetier" +msgstr "Impossible de se connecter à Repetier" + +msgid "Note: Repetier version at least 0.90.0 is required." +msgstr "Note : La version 0.90.0 de Repetier est requise." + +#, boost-format +msgid "" +"HTTP status: %1%\n" +"Message body: \"%2%\"" +msgstr "" +"Statut HTTP : %1%\n" +"Corps du message : « %2% »" + +#, boost-format +msgid "" +"Parsing of host response failed.\n" +"Message body: \"%1%\"\n" +"Error: \"%2%\"" +msgstr "" +"L’analyse de la réponse de l’hôte a échoué.\n" +"Corps du message : « %1% »\n" +"Erreur : « %2% »" + +#, boost-format +msgid "" +"Enumeration of host printers failed.\n" +"Message body: \"%1%\"\n" +"Error: \"%2%\"" +msgstr "" +"L’énumération des imprimantes hôtes a échoué.\n" +"Corps du message : « %1% »\n" +"Erreur : « %2% »" + +#: resources/data/hints.ini: [hint:Precise wall] +msgid "" +"Precise wall\n" +"Did you know that turning on precise wall can improve precision and layer " +"consistency?" +msgstr "" +"Paroi précise\n" +"Saviez-vous que l’activation de la paroi précise peut améliorer la précision " +"et l’homogénéité des couches ?" + +#: resources/data/hints.ini: [hint:Sandwich mode] +msgid "" +"Sandwich mode\n" +"Did you know that you can use sandwich mode (inner-outer-inner) to improve " +"precision and layer consistency if your model doesn't have very steep " +"overhangs?" +msgstr "" +"Mode sandwich\n" +"Saviez-vous que vous pouvez utiliser le mode sandwich (intérieur-extérieur-" +"intérieur) pour améliorer la précision et la cohérence des couches si votre " +"modèle n’a pas de porte-à-faux très prononcés ?" + +#: resources/data/hints.ini: [hint:Chamber temperature] +msgid "" +"Chamber temperature\n" +"Did you know that OrcaSlicer supports chamber temperature?" +msgstr "" +"Température de la chambre\n" +"Saviez-vous qu’OrcaSlicer prend en charge la température de la chambre ?" + +#: resources/data/hints.ini: [hint:Calibration] +msgid "" +"Calibration\n" +"Did you know that calibrating your printer can do wonders? Check out our " +"beloved calibration solution in OrcaSlicer." +msgstr "" +"Calibrage\n" +"Saviez-vous que le calibrage de votre imprimante peut faire des merveilles ? " +"Découvrez notre solution de calibrage bien-aimée dans OrcaSlicer." + +#: resources/data/hints.ini: [hint:Auxiliary fan] +msgid "" +"Auxiliary fan\n" +"Did you know that OrcaSlicer supports Auxiliary part cooling fan?" +msgstr "" +"Ventilateur auxiliaire\n" +"Saviez-vous qu’OrcaSlicer prend en charge le ventilateur auxiliaire de " +"refroidissement des pièces ?" + +#: resources/data/hints.ini: [hint:Air filtration] +msgid "" +"Air filtration/Exhuast Fan\n" +"Did you know that OrcaSlicer can support Air filtration/Exhuast Fan?" +msgstr "" +"Filtration de l’air/ventilateur d’extraction\n" +"Saviez-vous qu’OrcaSlicer peut prendre en charge la filtration de l’air/le " +"ventilateur d’extraction ?" + #: resources/data/hints.ini: [hint:How to use keyboard shortcuts] msgid "" "How to use keyboard shortcuts\n" "Did you know that Orca Slicer offers a wide range of keyboard shortcuts and " "3D scene operations." msgstr "" +"Comment utiliser les raccourcis clavier\n" +"Saviez-vous qu’Orca Slicer offre une large gamme de raccourcis clavier et " +"d’opérations sur les scènes 3D." #: resources/data/hints.ini: [hint:Cut Tool] msgid "" @@ -12093,9 +13663,9 @@ msgid "" "Did you know that you can cut a model at any angle and position with the " "cutting tool?" msgstr "" -"Outil de coupe\n" -"Saviez-vous que vous pouvez couper un modèle à n'importe quel angle et " -"position avec l'outil de coupe ?" +"Outil de découpe\n" +"Saviez-vous que vous pouvez découper un modèle à n'importe quel angle et " +"dans n'importe quelle position avec l'outil de découpe ?" #: resources/data/hints.ini: [hint:Fix Model] msgid "" @@ -12103,6 +13673,9 @@ msgid "" "Did you know that you can fix a corrupted 3D model to avoid a lot of slicing " "problems on the Windows system?" msgstr "" +"Réparer un modèle\n" +"Saviez-vous que vous pouvez réparer un modèle 3D corrompu pour éviter de " +"nombreux problèmes de découpage sur le système Windows ?" #: resources/data/hints.ini: [hint:Timelapse] msgid "" @@ -12110,7 +13683,7 @@ msgid "" "Did you know that you can generate a timelapse video during each print?" msgstr "" "Timelapse\n" -"Saviez-vous que vous pouvez générer une vidéo Timelapse lors de chaque " +"Saviez-vous que vous pouvez générer une vidéo en timelapse à chaque " "impression ?" #: resources/data/hints.ini: [hint:Auto-Arrange] @@ -12118,9 +13691,9 @@ msgid "" "Auto-Arrange\n" "Did you know that you can auto-arrange all objects in your project?" msgstr "" -"Organisation automatique\n" -"Saviez-vous que vous pouvez organiser automatiquement tous les objets de " -"votre projet ?" +"Agencement Automatique\n" +"Saviez-vous que vous pouvez agencement automatiquement tous les objets de " +"votre projet ?" #: resources/data/hints.ini: [hint:Auto-Orient] msgid "" @@ -12128,9 +13701,9 @@ msgid "" "Did you know that you can rotate objects to an optimal orientation for " "printing by a simple click?" msgstr "" -"Orientation automatique\n" +"Orientation Automatique\n" "Saviez-vous que vous pouvez faire pivoter des objets dans une orientation " -"optimale pour l'impression d'un simple clic ?" +"optimale pour l'impression d'un simple clic ?" #: resources/data/hints.ini: [hint:Lay on Face] msgid "" @@ -12139,10 +13712,10 @@ msgid "" "sits on the print bed? Select the \"Place on face\" function or press the " "F key." msgstr "" -"Poser sur la face\n" -"Saviez-vous que vous pouvez orienter rapidement un modèle de manière à ce " -"que l'une de ses faces repose sur le plateau d'impression ? Sélectionnez la " -"fonction \"Poser sur la face\" ou appuyez sur la touche F." +"Positionner sur une face\n" +"Saviez-vous qu'il est possible d'orienter rapidement un modèle de manière à " +"ce que l'une de ses faces repose sur le plateau d'impression ? Sélectionnez " +"la fonction « Positionner sur une face » ou appuyez sur la touche F." #: resources/data/hints.ini: [hint:Object List] msgid "" @@ -12152,7 +13725,7 @@ msgid "" msgstr "" "Liste d'objets\n" "Saviez-vous que vous pouvez afficher tous les objets/pièces dans une liste " -"et modifier les paramètres de chaque objet/pièce ?" +"et modifier les paramètres de chaque objet/pièce ?" #: resources/data/hints.ini: [hint:Search Functionality] msgid "" @@ -12160,19 +13733,20 @@ msgid "" "Did you know that you use the Search tool to quickly find a specific Orca " "Slicer setting?" msgstr "" +"Fonctionnalité de recherche\n" +"Saviez-vous que vous pouvez utiliser l’outil de recherche pour trouver " +"rapidement un paramètre spécifique de l’Orca Slicer ?" #: resources/data/hints.ini: [hint:Simplify Model] msgid "" "Simplify Model\n" "Did you know that you can reduce the number of triangles in a mesh using the " -"Simplify mesh feature? Right-click the model and select Simplify model. Read " -"more in the documentation." +"Simplify mesh feature? Right-click the model and select Simplify model." msgstr "" "Simplifier le modèle\n" -"Saviez-vous que vous pouvez réduire le nombre de triangles dans un maillage " -"à l'aide de la fonction Simplifier le maillage ? Cliquez avec le bouton " -"droit sur le modèle et sélectionnez Simplifier le modèle. Plus " -"d'informations dans la documentation." +"Saviez-vous que vous pouviez réduire le nombre de triangles dans un maillage " +"à l’aide de la fonction Simplifier le maillage ? Cliquez avec le bouton " +"droit de la souris sur le modèle et sélectionnez Simplifier le modèle." #: resources/data/hints.ini: [hint:Slicing Parameter Table] msgid "" @@ -12180,9 +13754,9 @@ msgid "" "Did you know that you can view all objects/parts on a table and change " "settings for each object/part?" msgstr "" -"Tableau des paramètres de découpage\n" -"Saviez-vous que vous pouvez afficher tous les objets/pièces d'un tableau et " -"modifier les paramètres de chaque objet/pièce ?" +"Tableau des paramètres de tranchage\n" +"Saviez-vous que vous pouvez afficher tous les objets/pièces sur un tableau " +"et modifier les paramètres de chaque objet/pièce ?" #: resources/data/hints.ini: [hint:Split to Objects/Parts] msgid "" @@ -12190,22 +13764,21 @@ msgid "" "Did you know that you can split a big object into small ones for easy " "colorizing or printing?" msgstr "" -"Fractionner en objets/pièces\n" -"Saviez-vous que vous pouvez diviser un gros objet en petits objets pour " -"faciliter la coloration ou l'impression ?" +"Séparer en objets/parties\n" +"Saviez-vous que vous pouvez séparer un gros objet en petits objets pour les " +"colorier ou les imprimer facilement ?" #: resources/data/hints.ini: [hint:Subtract a Part] msgid "" "Subtract a Part\n" "Did you know that you can subtract one mesh from another using the Negative " "part modifier? That way you can, for example, create easily resizable holes " -"directly in Orca Slicer. Read more in the documentation." +"directly in Orca Slicer." msgstr "" -"Soustraire une partie\n" -"Saviez-vous que vous pouvez soustraire un maillage d'un autre à l'aide du " -"modificateur de partie négative ? De cette façon, vous pouvez, par exemple, " -"créer des trous facilement redimensionnables directement dans Orca Slicer. " -"Plus d'informations dans la documentation." +"Soustraire une pièce\n" +"Saviez-vous que vous pouviez soustraire un maillage d’un autre à l’aide du " +"modificateur de partie négative ? De cette façon, vous pouvez, par exemple, " +"créer des trous facilement redimensionnables directement dans Orca Slicer." #: resources/data/hints.ini: [hint:STEP] msgid "" @@ -12228,10 +13801,11 @@ msgid "" "paint it on your print, to have it in a less visible location? This improves " "the overall look of your model. Check it out!" msgstr "" -"Emplacement de la couture en Z\n" +"Emplacement de la couture Z\n" "Saviez-vous que vous pouvez personnaliser l'emplacement de la couture Z, et " -"même la peindre sur votre impression, pour l'avoir dans un endroit moins " -"visible ? Cela améliore l'aspect général de votre impression. Essayez !" +"même la peindre manuelle sur votre impression pour le placer dans un endroit " +"moins visible ? Cela améliore l'aspect général de votre modèle. Jetez-y un " +"coup d'œil !" #: resources/data/hints.ini: [hint:Fine-tuning for flow rate] msgid "" @@ -12240,10 +13814,11 @@ msgid "" "prints? Depending on the material, you can improve the overall finish of the " "printed model by doing some fine-tuning." msgstr "" -"Réglage précis du débit\n" -"Saviez-vous que le débit peut être ajusté pour des impressions encore plus " -"belles ? Selon le matériau, vous pouvez améliorer la finition globale du " -"modèle imprimé en effectuant quelques ajustements." +"Réglage fin du débit\n" +"Saviez-vous que le débit peut être réglé avec précision pour obtenir des " +"impressions encore plus belles ? En fonction du matériau, vous pouvez " +"améliorer la finition générale du modèle imprimé en procédant à un réglage " +"fin." #: resources/data/hints.ini: [hint:Split your prints into plates] msgid "" @@ -12254,7 +13829,7 @@ msgid "" msgstr "" "Divisez vos impressions en plateaux\n" "Saviez-vous que vous pouvez diviser un modèle comportant de nombreuses " -"pièces en plateaux individuels prêts à imprimer ? Cela simplifiera le " +"pièces en plateaux individuels prêts à être imprimés ? Cela simplifie le " "processus de suivi de toutes les pièces." #: resources/data/hints.ini: [hint:Speed up your print with Adaptive Layer @@ -12264,9 +13839,9 @@ msgid "" "Did you know that you can print a model even faster, by using the Adaptive " "Layer Height option? Check it out!" msgstr "" -"Accélérez votre impression avec la hauteur de couche adaptative\n" +"Accélérez votre impression grâce à la Hauteur de Couche Adaptative\n" "Saviez-vous que vous pouvez imprimer un modèle encore plus rapidement en " -"utilisant l'option Hauteur de couche adaptative ? Essayez !" +"utilisant l'option Adaptive Layer Height ? Jetez-y un coup d'œil !" #: resources/data/hints.ini: [hint:Support painting] msgid "" @@ -12275,10 +13850,10 @@ msgid "" "makes it easy to place the support material only on the sections of the " "model that actually need it." msgstr "" -"Peindre les supports\n" +"Peinture de support\n" "Saviez-vous que vous pouvez peindre l'emplacement de vos supports ? Cette " -"fonctionnalité permet de placer facilement les supports uniquement sur les " -"sections du modèle qui en ont réellement besoin." +"caractéristique permet de placer facilement le matériau de support " +"uniquement sur les sections du modèle qui en ont réellement besoin." #: resources/data/hints.ini: [hint:Different types of supports] msgid "" @@ -12289,9 +13864,9 @@ msgid "" msgstr "" "Différents types de supports\n" "Saviez-vous que vous pouvez choisir parmi plusieurs types de supports ? Les " -"supports arborescents fonctionnent parfaitement pour les modèles organiques, " -"tout en économisant du filament et en améliorant la vitesse d'impression. . " -"Essayez-les !" +"supports arborescents fonctionnent parfaitement pour les modèles organiques " +"tout en économisant du filament et en améliorant la vitesse d'impression. " +"Découvrez-les !" #: resources/data/hints.ini: [hint:Printing Silk Filament] msgid "" @@ -12300,9 +13875,9 @@ msgid "" "successfully? Higher temperature and lower speed are always recommended for " "the best results." msgstr "" -"Impression de filament Silk\n" -"Saviez-vous que le filament Silk nécessite une attention particulière pour " -"être imprimé avec succès ? Une température plus élevée et une vitesse plus " +"Impression de filament Soie\n" +"Saviez-vous que le filament soie nécessite une attention particulière pour " +"une impression réussie ? Une température plus élevée et une vitesse plus " "faible sont toujours recommandées pour obtenir les meilleurs résultats." #: resources/data/hints.ini: [hint:Brim for better adhesion] @@ -12311,9 +13886,10 @@ msgid "" "Did you know that when printing models have a small contact interface with " "the printing surface, it's recommended to use a brim?" msgstr "" -"Bordure pour une meilleure adhérence\n" -"Saviez-vous que lorsque les modèles d'impression ont une petite surface de " -"contact sur le plateau, il est recommandé d'utiliser une bordure ?" +"Bordure pour une meilleure adhésion\n" +"Saviez-vous que lorsque les modèles imprimés ont une faible interface de " +"contact avec la surface d'impression, il est recommandé d'utiliser une " +"bordure ?" #: resources/data/hints.ini: [hint:Set parameters for multiple objects] msgid "" @@ -12322,16 +13898,16 @@ msgid "" "one time?" msgstr "" "Définir les paramètres de plusieurs objets\n" -"Saviez-vous que vous pouvez définir des paramètres de découpage pour tous " -"les objets sélectionnés en même temps ?" +"Saviez-vous que vous pouvez définir des paramètres de tranchage pour tous " +"les objets sélectionnés en une seule fois ?" #: resources/data/hints.ini: [hint:Stack objects] msgid "" "Stack objects\n" "Did you know that you can stack objects as a whole one?" msgstr "" -"Empiler des objets\n" -"Saviez-vous que vous pouvez assembler des objets en un seul ?" +"Empilez des objets\n" +"Saviez-vous que vous pouvez empiler des objets pour n'en former qu'un?" #: resources/data/hints.ini: [hint:Flush into support/objects/infill] msgid "" @@ -12339,9 +13915,9 @@ msgid "" "Did you know that you can save the wasted filament by flushing them into " "support/objects/infill during filament change?" msgstr "" -"Purge dans les supports / les objets / le remplissage\n" -"Saviez-vous que vous pouvez économiser du filament en le purgeant dans les " -"supports / les objets / le remplissage lors du changement de filament ?" +"Rincer dans support/objets/remplissage\n" +"Saviez-vous que vous pouvez réduire le filament gaspillé en le rinçant dans " +"le support/les objets/le remplissage lors des changements de filament ?" #: resources/data/hints.ini: [hint:Improve strength] msgid "" @@ -12350,8 +13926,8 @@ msgid "" "density to improve the strength of the model?" msgstr "" "Améliorer la résistance\n" -"Saviez-vous que vous pouvez utiliser plus de parois et une densité de " -"remplissage plus élevée pour améliorer la résistance du modèle ?" +"Saviez-vous que vous pouvez définir un plus grand nombre de périmètre et une " +"densité de remplissage plus élevée pour améliorer la résistance du modèle ?" #: resources/data/hints.ini: [hint:When need to print with the printer door #: opened] @@ -12361,6 +13937,11 @@ msgid "" "extruder/hotend clogging when printing lower temperature filament with a " "higher enclosure temperature. More info about this in the Wiki." msgstr "" +"Quand il faut imprimer avec la porte de l’imprimante ouverte\n" +"Saviez-vous que l’ouverture de la porte de l’imprimante peut réduire la " +"probabilité de blocage de l’extrudeuse/du réchauffeur lors de l’impression " +"de filament à basse température avec une température de boîtier plus élevée. " +"Plus d’informations à ce sujet dans le Wiki." #: resources/data/hints.ini: [hint:Avoid warping] msgid "" @@ -12369,55 +13950,190 @@ msgid "" "ABS, appropriately increasing the heatbed temperature can reduce the " "probability of warping." msgstr "" +"Éviter la déformation\n" +"Saviez-vous que lors de l’impression de matériaux susceptibles de se " +"déformer, tels que l’ABS, une augmentation appropriée de la température du " +"lit chauffant peut réduire la probabilité de déformation." + +#~ msgid "" +#~ "The printer timed out while receiving a print job. Please check if the " +#~ "network is functioning properly and send the print again." +#~ msgstr "" +#~ "L'imprimante s'est arrêtée pendant la réception d'un travail " +#~ "d'impression. Vérifiez que le réseau fonctionne correctement et relancez " +#~ "l'impression." + +#~ msgid "The beginning of the vendor can not be a number. Please re-enter." +#~ msgstr "" +#~ "Le début du nom du vendeur ne peut pas être un numéro. Veuillez les " +#~ "saisir à nouveau." + +#~ msgid "Edit Text" +#~ msgstr "Modifier texte" + +#~ msgid "Error! Unable to create thread!" +#~ msgstr "Erreur! Impossible de créer le fil !" + +#~ msgid "Exception" +#~ msgstr "Anomalie" + +#~ msgid "Choose SLA archive:" +#~ msgstr "Choisissez l'archive SLA:" + +#~ msgid "Import file" +#~ msgstr "Importer un fichier" + +#~ msgid "Import model and profile" +#~ msgstr "Importer modèle et profil" + +#~ msgid "Import profile only" +#~ msgstr "Importer le profil uniquement" + +#~ msgid "Import model only" +#~ msgstr "Importer le modèle uniquement" + +#~ msgid "Accurate" +#~ msgstr "Précis" + +#~ msgid "Balanced" +#~ msgstr "Équilibré" + +#~ msgid "Quick" +#~ msgstr "Rapide" + +#~ msgid "Auto-Calc" +#~ msgstr "Auto-Calc" + +#~ msgid "unloaded" +#~ msgstr "déchargé" + +#~ msgid "loaded" +#~ msgstr "chargé" + +#~ msgid "Filament #" +#~ msgstr "Filament #" + +#~ msgid "" +#~ "Discribe how long the nozzle will move along the last path when retracting" +#~ msgstr "" +#~ "Décrire combien de temps la buse se déplacera le long du dernier chemin " +#~ "lors de la rétraction" + +#~ msgid "" +#~ "Simplify Model\n" +#~ "Did you know that you can reduce the number of triangles in a mesh using " +#~ "the Simplify mesh feature? Right-click the model and select Simplify " +#~ "model. Read more in the documentation." +#~ msgstr "" +#~ "Simplifier le modèle\n" +#~ "Saviez-vous que vous pouvez réduire le nombre de triangles dans un " +#~ "maillage à l'aide de la fonction Simplifier le maillage ? Cliquez avec le " +#~ "bouton droit sur le modèle et sélectionnez Simplifier le modèle. Pour en " +#~ "savoir plus, consultez la documentation." + +#~ msgid "" +#~ "Subtract a Part\n" +#~ "Did you know that you can subtract one mesh from another using the " +#~ "Negative part modifier? That way you can, for example, create easily " +#~ "resizable holes directly in Orca Slicer. Read more in the documentation." +#~ msgstr "" +#~ "Soustraire une partie\n" +#~ "Saviez-vous que vous pouvez soustraire un maillage d'un autre à l'aide du " +#~ "modificateur de partie négative ? De cette façon, vous pouvez, par " +#~ "exemple, créer des trous facilement redimensionnables directement dans " +#~ "Orca Slicer. Plus d'informations dans la documentation." + +#~ msgid "Filling bed " +#~ msgstr "Remplir le plateau" + +#, boost-format +#~ msgid "%1% infill pattern doesn't support 100%% density." +#~ msgstr "" +#~ "Le motif de remplissage %1% ne prend pas en charge une densité de 100%%." + +#~ msgid "" +#~ "Switch to rectilinear pattern?\n" +#~ "Yes - switch to rectilinear pattern automaticlly\n" +#~ "No - reset density to default non 100% value automaticlly" +#~ msgstr "" +#~ "Passer à un motif rectiligne ?\n" +#~ "Oui - Passez automatiquement au modèle rectiligne\n" +#~ "Non - Réinitialise automatiquement la densité à la valeur par défaut" + +#~ msgid "Please heat the nozzle to above 170 degree before loading filament." +#~ msgstr "" +#~ "Veuillez chauffer la buse à plus de 170 degrés avant de charger le " +#~ "filament." + +#~ msgid "Newer 3mf version" +#~ msgstr "Nouvelle version 3mf" + +#~ msgid "Show g-code window" +#~ msgstr "Afficher la fenêtre G-code" + +#~ msgid "If enabled, g-code window will be displayed." +#~ msgstr "Si activé, la fenêtre avec les commandes G-code sera affichée." + +#, c-format +#~ msgid "Density of internal sparse infill, 100% means solid throughout" +#~ msgstr "Densité du remplissage interne, 100%% signifie plein." + +#~ msgid "Tree support wall loops" +#~ msgstr "Nombre de parois support arborescent" + +#~ msgid "This setting specify the count of walls around tree support" +#~ msgstr "" +#~ "Ce paramètre spécifie le nombre de murs autour du support arborescent" + +#, c-format, boost-format +#~ msgid " doesn't work at 100%% density " +#~ msgstr " ne fonctionne pas à une densité de 100%% " #~ msgid "Ctrl + Shift + Enter" #~ msgstr "Ctrl + Maj + Entrée" #~ msgid "Tool-Lay on Face" -#~ msgstr "Pose de l’outil sur la face" +#~ msgstr "Outil-Positionner sur une face" #~ msgid "Export as STL" -#~ msgstr "Exporter en STL" +#~ msgstr "Exporter en tant que STL" #~ msgid "Check cloud service status" #~ msgstr "Vérifiez l'état du service cloud" #~ msgid "Please input a valid value (K in 0~0.5)" -#~ msgstr "Veuillez entrer une valeur valide (K dans la plage 0~0.5)" +#~ msgstr "Veuillez saisir une valeur valide (K entre 0 et 0,5)" #~ msgid "Please input a valid value (K in 0~0.5, N in 0.6~2.0)" #~ msgstr "" -#~ "Veuillez entrer une valeur valide (K dans la plage 0~0.5, N dans la plage " -#~ "0.6~2.0)" +#~ "Veuillez saisir une valeur valide (K entre 0 et 0,5, N entre 0,6 et 2,0)" #~ msgid "Export all objects as STL" #~ msgstr "Exporter tous les objets au format STL" -#~ msgid "Slice ok." -#~ msgstr "Découpage terminé." - #, c-format, boost-format #~ msgid "" #~ "The 3mf's version %s is newer than %s's version %s, Found following keys " #~ "unrecognized:" #~ msgstr "" -#~ "La version %s de 3mf est plus récente que la version %s de %s, clés " -#~ "suivantes non reconnues :" +#~ "La version %s du 3mf est plus récente que la version %s de %s. Les clés " +#~ "suivantes ne sont pas reconnues:" #~ msgid "You'd better upgrade your software.\n" -#~ msgstr "Il est préférable de mettre à jour votre logiciel.\n" +#~ msgstr "Vous feriez mieux de mettre à jour votre logiciel.\n" #, c-format, boost-format #~ msgid "" #~ "The 3mf's version %s is newer than %s's version %s, Suggest to upgrade " #~ "your software." #~ msgstr "" -#~ "La version %s de 3mf est plus récente que la version %s de %s, nous vous " +#~ "La version %s du 3mf est plus récente que la version %s de %s. Nous vous " #~ "suggérons de mettre à jour votre logiciel." #~ msgid "The 3mf is not compatible, load geometry data only!" #~ msgstr "" -#~ "Le 3mf n'est pas compatible, chargez uniquement les données de géométrie !" +#~ "Le 3mf n'est pas compatible, chargement des données géométriques " +#~ "uniquement!" #~ msgid "Incompatible 3mf" #~ msgstr "Fichier 3mf incompatible" @@ -12427,94 +14143,97 @@ msgstr "" #, c-format, boost-format #~ msgid "%s is not supported by AMS." -#~ msgstr "%s n’est pas pris en charge par l’AMS." +#~ msgstr "%s n'est pas pris en charge par l'AMS." #~ msgid "Don't remind me of this version again" -#~ msgstr "Ne plus me rappeler cette version" +#~ msgstr "Ne me rappelez plus cette version." #~ msgid "Error: IP or Access Code are not correct" -#~ msgstr "Erreur : l’IP ou le code d’accès n’est pas correct" +#~ msgstr "Erreur : l'adresse IP ou le code d'accès ne sont pas corrects" #~ msgid "Order of inner wall/outer wall/infil" -#~ msgstr "Ordre des parois" +#~ msgstr "Ordre de mur intérieur/extérieur/remplissage" #~ msgid "Print sequence of inner wall, outer wall and infill. " #~ msgstr "" -#~ "Séquence d'impression de la paroi intérieure, extérieure et du " -#~ "remplissage. " +#~ "Séquence d'impression du mur intérieur, du mur extérieur et du " +#~ "remplissage." #~ msgid "inner/outer/infill" -#~ msgstr "Intérieure / Extérieure / Remplissage" +#~ msgstr "intérieur/extérieur/remplissage" #~ msgid "outer/inner/infill" -#~ msgstr "Extérieure / Intérieure / Remplissage" +#~ msgstr "extérieur/intérieur/remplissage" #~ msgid "infill/inner/outer" -#~ msgstr "Remplissage / Intérieure / Extérieure" +#~ msgstr "remplissage/intérieur/extérieur" #~ msgid "infill/outer/inner" -#~ msgstr "Remplissage / Extérieure / Intérieure" +#~ msgstr "remplissage/extérieur/intérieur" #~ msgid "inner-outer-inner/infill" -#~ msgstr "Intérieure / Extérieure / Intérieure / Remplissage" +#~ msgstr "intérieur-extérieur-intérieur/remplissage" #~ msgid "Export 3MF" -#~ msgstr "Exporter 3mf" +#~ msgstr "Exporter 3MF" #~ msgid "Export project as 3MF." -#~ msgstr "Exporter le projet au format 3mf." +#~ msgstr "Exporter le projet au format 3MF." #~ msgid "Export slicing data" -#~ msgstr "Exporter les données de découpage" +#~ msgstr "Exporter les données de tranchage" #~ msgid "Export slicing data to a folder." -#~ msgstr "Exporter les données de découpage vers un dossier." +#~ msgstr "Exporter les données de tranchage vers un dossier" #~ msgid "Load slicing data" -#~ msgstr "Charger les données de découpage" +#~ msgstr "Charger les données de tranchage" #~ msgid "Load cached slicing data from directory" -#~ msgstr "Charger les données de découpage en cache à partir d'un dossier" +#~ msgstr "" +#~ "Charger les données de tranchage mises en cache à partir du répertoire" #~ msgid "Slice" #~ msgstr "Découper" #~ msgid "Slice the plates: 0-all plates, i-plate i, others-invalid" #~ msgstr "" -#~ "Découper les plateaux : 0-tous les plateaux, i-plateau i, autres-invalides" +#~ "Trancher toutes les plaques : 0-toutes, i-plaque i, autres-invalides" #~ msgid "Show command help." -#~ msgstr "Afficher l'aide des commandes." +#~ msgstr "Afficher l'aide de la commande." #~ msgid "UpToDate" #~ msgstr "À jour" #~ msgid "Update the configs values of 3mf to latest." -#~ msgstr "Mettre à jour les dernières valeurs de configuration de 3mf." +#~ msgstr "" +#~ "Mettez à jour les valeurs de configuration 3mf à la version la plus " +#~ "récente." #~ msgid "mtcpp" #~ msgstr "mtcpp" #~ msgid "max triangle count per plate for slicing." -#~ msgstr "Nombre maximum de triangles par plateau pour le découpage." +#~ msgstr "nombre maximal de triangles par plaque pour le tranchage" #~ msgid "mstpp" #~ msgstr "mstpp" #~ msgid "max slicing time per plate in seconds." -#~ msgstr "Durée de découpage maximum par plateau en secondes." +#~ msgstr "temps de tranchage maximal par plaque en secondes" #~ msgid "Normative check" -#~ msgstr "Vérification normative" +#~ msgstr "Contrôle normatif" #~ msgid "Check the normative items." -#~ msgstr "Vérifier les éléments normatifs." +#~ msgstr "Vérifiez les éléments normatifs." #~ msgid "Output Model Info" -#~ msgstr "Informations sur le modèle de sortie" +#~ msgstr "Information du Modèle de Sortie" #~ msgid "Output the model's information." -#~ msgstr "Informations sur le modèle de sortie" +#~ msgstr "Sortie des informations du modèle." #~ msgid "Export Settings" #~ msgstr "Paramètres d'exportation" @@ -12523,10 +14242,10 @@ msgstr "" #~ msgstr "Exporter les paramètres vers un fichier." #~ msgid "Send progress to pipe" -#~ msgstr "Envoyer la progression au canal" +#~ msgstr "Envoyer la progression à la queue" #~ msgid "Send progress to pipe." -#~ msgstr "Envoyer la progression au canal." +#~ msgstr "Envoyer la progression à la queue." #~ msgid "Arrange Options" #~ msgstr "Options d'organisation" @@ -12548,8 +14267,7 @@ msgstr "" #~ msgid "Load process/machine settings from the specified file" #~ msgstr "" -#~ "Charger les paramètres de processus/imprimante à partir du fichier " -#~ "spécifié" +#~ "Charger les paramètres de processus/machine à partir du fichier spécifié" #~ msgid "Load Filament Settings" #~ msgstr "Charger les paramètres de filament" @@ -12560,16 +14278,16 @@ msgstr "" #~ "spécifiée" #~ msgid "Skip Objects" -#~ msgstr "Ignorer les objets" +#~ msgstr "Ignorer les Objets" #~ msgid "Skip some objects in this print" #~ msgstr "Ignorer certains objets de cette impression" #~ msgid "Output directory" -#~ msgstr "Dossier de sortie" +#~ msgstr "Répertoire de sortie" #~ msgid "Output directory for the exported files." -#~ msgstr "Dossier de sortie des fichiers exportés." +#~ msgstr "Répertoire de sortie des fichiers exportés." #~ msgid "Debug level" #~ msgstr "Niveau de débogage" @@ -12578,85 +14296,24 @@ msgstr "" #~ "Sets debug logging level. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" #~ "trace\n" #~ msgstr "" -#~ "Définit le niveau de journalisation du déboggage. 0:fatal, 1:erreur, 2:" -#~ "avertissement, 3:info, 4:déboggage, 5:tracer\n" - -#~ msgid "Physical Printer" -#~ msgstr "Imprimante Physique" - -#~ msgid "Print Host upload" -#~ msgstr "Envoi vers l’imprimante hôte" - -#~ msgid "Could not get a valid Printer Host reference" -#~ msgstr "Impossible d’obtenir une référence d’imprimante hôte valide" - -#~ msgid "Success!" -#~ msgstr "Succès !" - -#~ msgid "Refresh Printers" -#~ msgstr "Actualiser les imprimantes" - -#~ msgid "" -#~ "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" -#~ "signed certificate." -#~ msgstr "" -#~ "Le fichier CA HTTPS est facultatif. Il n'est nécessaire que si vous " -#~ "utilisez HTTPS avec un certificat auto-signé." - -#~ msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" -#~ msgstr "" -#~ "Fichiers de certificat (*.crt, *.pem)|*.crt;*.pem|Tous les fichiers|*.*" - -#~ msgid "Open CA certificate file" -#~ msgstr "Ouvrir le fichier de certificat CA" - -#, c-format, boost-format -#~ msgid "" -#~ "On this system, %s uses HTTPS certificates from the system Certificate " -#~ "Store or Keychain." -#~ msgstr "" -#~ "Sur ce système, %s utilise les certificats HTTPS du magasin de " -#~ "certificats du système ou du trousseau." - -#~ msgid "" -#~ "To use a custom CA file, please import your CA file into Certificate " -#~ "Store / Keychain." -#~ msgstr "" -#~ "Pour utiliser un certificat personnalisé, veuillez importer votre fichier " -#~ "dans magasin de certificats / trousseau." - -#~ msgid "Connection to printers connected via the print host failed." -#~ msgstr "" -#~ "La connexion aux imprimantes connectées via l’hôte d’impression a échoué." - -#~ msgid "The start, end or step is not valid value." -#~ msgstr "Le début, la fin ou le pas n'est pas une valeur valide." - -#~ msgid "" -#~ "Unable to calibrate: maybe because the set calibration value range is too " -#~ "large, or the step is too small" -#~ msgstr "" -#~ "Impossible d'étalonner : peut-être parce que la plage de valeurs " -#~ "d'étalonnage est trop grande ou que le pas est trop petit." - -#~ msgid "Need select printer" -#~ msgstr "Besoin de sélectionner l'imprimante" +#~ "Définit le niveau de journalisation du débogage. 0 :fatal, 1 :erreur, 2 :" +#~ "avertissement, 3 :info, 4 :débogage, 5 :trace\n" #~ msgid "" #~ "3D Scene Operations\n" #~ "Did you know how to control view and object/part selection with mouse and " #~ "touchpanel in the 3D scene?" #~ msgstr "" -#~ "Opérations de scène 3D\n" -#~ "Savez-vous comment contrôler la vue et la sélection d'objets/pièces avec " -#~ "la souris et l'écran tactile dans la scène 3D ?" +#~ "Opérations dans une scène 3D\n" +#~ "Savez-vous comment contrôler la vue et la sélection des objets/pièces " +#~ "avec la souris et l'écran tactile dans la scène 3D ?" #~ msgid "" #~ "Fix Model\n" #~ "Did you know that you can fix a corrupted 3D model to avoid a lot of " #~ "slicing problems?" #~ msgstr "" -#~ "Réparer le modèle\n" +#~ "Réparer le Modèle\n" #~ "Saviez-vous que vous pouvez réparer un modèle 3D corrompu pour éviter de " #~ "nombreux problèmes de découpage ?" @@ -12680,7 +14337,8 @@ msgstr "" #~ msgid "The minimum printing speed when slow down for cooling" #~ msgstr "" -#~ "Vitesse d'impression minimale lors du ralentissement de l’impression" +#~ "La vitesse d'impression minimale lors du ralentissement pour le " +#~ "refroidissement" #~ msgid "" #~ "There are currently no identical spare consumables available, and " @@ -12701,8 +14359,8 @@ msgstr "" #~ "open the front door of printer before printing to avoid nozzle clog." #~ msgstr "" #~ "La température du plateau dépasse la température de vitrification du " -#~ "filament. Veuillez ouvrir la porte avant de l'imprimante avant d'imprimer " -#~ "pour éviter que la buse ne se bouche." +#~ "filament. Veuillez ouvrir la porte avant de l'imprimante avant " +#~ "l'impression pour éviter le bouchage de la buse." #~ msgid "Temperature of vitrificaiton" #~ msgstr "Température de vitrification" @@ -12711,22 +14369,23 @@ msgstr "" #~ "Material becomes soft at this temperature. Thus the heatbed cannot be " #~ "hotter than this tempature" #~ msgstr "" -#~ "Température lorsque le matériau devient mou. Ainsi, le plateau ne peut " -#~ "pas être plus chaud que cette température" +#~ "Le matériau devient mou à cette température. Ainsi, le lit chauffant ne " +#~ "peut pas être plus chaud que cette température" #~ msgid "Enable this option if machine has auxiliary part cooling fan" #~ msgstr "" -#~ "Activer cette option si l’imprimante est équipée d'un ventilateur de " -#~ "refroidissement auxiliaire" +#~ "Activez cette option si la machine est équipée d'un ventilateur de " +#~ "refroidissement de pièce auxiliaire" #~ msgid "" #~ "Speed of auxiliary part cooling fan. Auxiliary fan will run at this speed " #~ "during printing except the first several layers which is defined by no " #~ "cooling layers" #~ msgstr "" -#~ "Vitesse du ventilateur de refroidissement auxiliaire. Le ventilateur " -#~ "auxiliaire fonctionnera à cette vitesse pendant l'impression, à " -#~ "l'exception des premières couches définies sans refroidissement" +#~ "Vitesse du ventilateur de refroidissement de la partie auxiliaire. Le " +#~ "ventilateur auxiliaire fonctionnera à cette vitesse pendant l'impression, " +#~ "à l'exception des premières couches qui sont définies par aucune couche " +#~ "de refroidissement" #~ msgid "" #~ "Bed temperature for layers except the initial one. Value 0 means the " @@ -12745,13 +14404,14 @@ msgstr "" #~ msgid "Empty layers around bottom are replaced by nearest normal layers." #~ msgstr "" -#~ "Les couches vides inférieures sont remplacées par des couches normales." +#~ "Les couches vides situées en bas sont remplacées par les couches normales " +#~ "les plus proches." #~ msgid "The model has too many empty layers." -#~ msgstr "Le modèle comporte trop de couches vides." +#~ msgstr "Le modèle a trop de couches vides." #~ msgid "Cali" -#~ msgstr "Calibration" +#~ msgstr "Calib." #~ msgid "Calibration of extrusion" #~ msgstr "Calibration de l'extrusion" @@ -12766,9 +14426,8 @@ msgstr "" #~ "This may cause model broken free from build plate during printing" #~ msgstr "" #~ "La température du plateau des autres couches est inférieure à la " -#~ "température du plateau de la couche initiale de plus de %d degrés.\n" -#~ "Cela peut entraîner le décollement du modèle sur le plateau pendant " -#~ "l'impression" +#~ "température du plateau de la couche initiale de plus de %d degrés. Cela " +#~ "peut entraîner la séparation du modèle du plateau pendant l'impression" #~ msgid "" #~ "Bed temperature is higher than vitrification temperature of this " @@ -12777,14 +14436,16 @@ msgstr "" #~ "Please keep the printer open during the printing process to ensure air " #~ "circulation or reduce the temperature of the hot bed" #~ msgstr "" -#~ "La température du plateau est supérieure à la température de " -#~ "vitrification de ce filament.\n" -#~ "Cela peut entraîner le bouchage de la buse et l'échec de l'impression.\n" -#~ "Veuillez garder l'imprimante ouverte pendant le processus d'impression " -#~ "pour assurer la circulation de l'air ou réduire la température du plateau" +#~ "La température du lit est supérieure à la température de vitrification de " +#~ "ce filament.\n" +#~ "Cela peut provoquer un blocage de la buse et une défaillance de " +#~ "l'impression.\n" +#~ "Veuillez laisser l'imprimante ouverte pendant le processus d'impression " +#~ "afin de garantir la circulation de l'air ou de réduire la température du " +#~ "plateau." #~ msgid "Total Time Estimation" -#~ msgstr "Estimation totale" +#~ msgstr "Estimation du temps total" #~ msgid "Resonance frequency identification" #~ msgstr "Identification de la fréquence de résonance" @@ -12798,8 +14459,8 @@ msgstr "" #~ msgid "Score" #~ msgstr "Note" -#~ msgid "Bamabu High Temperature Plate" -#~ msgstr "Bambu High Temperature Plate" +#~ msgid "Bambu High Temperature Plate" +#~ msgstr "Plaque Haute Température Bambu" #~ msgid "Can't connect to the printer" #~ msgstr "Impossible de se connecter à l'imprimante" @@ -12808,18 +14469,18 @@ msgstr "" #~ msgstr "Plage de température recommandée" #~ msgid "High Temp Plate" -#~ msgstr "Bambu High Temperature Plate" +#~ msgstr "Plaque haute température" #~ msgid "" #~ "Bed temperature when high temperature plate is installed. Value 0 means " #~ "the filament does not support to print on the High Temp Plate" #~ msgstr "" -#~ "Température du plateau lorsque le plateau Bambu High Temperature Plate " -#~ "est installé. Une valeur à 0 signifie que le filament ne prend pas en " -#~ "charge l'impression sur le plateau Bambu High Temperature Plate" +#~ "Il s'agit de la température du plateau lorsque le plateau haute " +#~ "température (\"Cool plate\") est installé. Une valeur à 0 signifie que ce " +#~ "filament ne peut pas être imprimé sur le plateau haute température." #~ msgid "Internal bridge support thickness" -#~ msgstr "Épaisseur des supports de ponts internes" +#~ msgstr "Épaisseur du support interne du pont" #, fuzzy, c-format, boost-format #~ msgid "" @@ -12836,23 +14497,20 @@ msgstr "" #~ "save a lot of material (default), while hybrid style will create similar " #~ "structure to normal support under large flat overhangs." #~ msgstr "" -#~ "Style et forme des supports.\n" -#~ "Supports Normaux : Grille régulière avec des supports plus stables (par " -#~ "défaut).\n" -#~ "Support Ajustés : Economisent de la matière et réduisent les traces sur " -#~ "le modèle.\n" -#~ "Supports Arborescents Fins : Fusionnent les branches de manière plus " -#~ "agressive et économisent beaucoup de filament (par défaut).\n" -#~ "Supports Arborescents Solides : Fusionnent les branches de manière moins " -#~ "agressive et économisent moins de filament.\n" -#~ "Supports Arborescents Hybrides : Structure similaire aux supports normaux " -#~ "avec de grands surplombs plats." +#~ "Style et forme du support. Pour un support normal, la projection des " +#~ "supports sur une grille régulière créera des supports plus stables (par " +#~ "défaut), tandis que des tours de support bien ajustées permettront " +#~ "d'économiser du matériau et de réduire les cicatrices sur les objets.\n" +#~ "Pour les supports Arborescent, le style mince fusionnera les branches de " +#~ "manière plus agressive et économisera beaucoup de matière (par défaut), " +#~ "tandis que le style hybride créera une structure similaire à celle d'un " +#~ "support normal placé sous de grands surplombs plats." #~ msgid "Target chamber temperature" #~ msgstr "Température cible de la chambre" #~ msgid "Bed temperature difference" -#~ msgstr "Différence de température du plateau" +#~ msgstr "Différence de température du lit" #~ msgid "" #~ "Do not recommend bed temperature of other layer to be lower than initial " @@ -12860,9 +14518,9 @@ msgstr "" #~ "layer may cause the model broken free from build plate" #~ msgstr "" #~ "Il n'est pas recommandé que la température du plateau des autres couches " -#~ "soit inférieure à celle de la couche initiale pendant plus de ce seuil. " -#~ "Une température de plateau trop basse peut entraîner le décollement du " -#~ "modèle" +#~ "soit inférieure à celle de la première couche d'un niveau supérieur à ce " +#~ "seuil. Une température de base trop basse de l'autre couche peut " +#~ "provoquer le détachement du modèle." #~ msgid "Orient the model" #~ msgstr "Orienter le modèle" @@ -12872,7 +14530,7 @@ msgstr "" #~ "start > 0 step >= 0\n" #~ "end > start + step)" #~ msgstr "" -#~ "Veuillez saisir des valeurs valides :\n" +#~ "Veuillez saisir des valeurs valides :\n" #~ "Début > 0 intervalle >= 0\n" #~ "Fin > Début + Intervalle)" @@ -12881,6 +14539,6 @@ msgstr "" #~ "start > 10 step >= 0\n" #~ "end > start + step)" #~ msgstr "" -#~ "Veuillez saisir des valeurs valides :\n" +#~ "Veuillez saisir des valeurs valides :\n" #~ "Début > 10 intervalles >= 0\n" #~ "Fin > Début + Intervalle)" diff --git a/localization/i18n/hu/OrcaSlicer_hu.po b/localization/i18n/hu/OrcaSlicer_hu.po index 2131044d82..99c348a0a7 100644 --- a/localization/i18n/hu/OrcaSlicer_hu.po +++ b/localization/i18n/hu/OrcaSlicer_hu.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-24 18:09+0100\n" +"POT-Creation-Date: 2023-12-19 22:09+0800\n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -290,6 +290,12 @@ msgstr "Select all connectors" msgid "Cut" msgstr "Vágás" +msgid "non-mainifold edges be caused by cut tool, do you want to fix it now?" +msgstr "" + +msgid "Repairing model object" +msgstr "Modell javítása" + msgid "Connector" msgstr "Connector" @@ -845,6 +851,24 @@ msgstr "Támasz blokkoló hozzáadása" msgid "Add support enforcer" msgstr "Támasz kényszerítő hozzáadása" +msgid "Add text" +msgstr "" + +msgid "Add negative text" +msgstr "" + +msgid "Add text modifier" +msgstr "" + +msgid "Add SVG part" +msgstr "" + +msgid "Add negative SVG" +msgstr "" + +msgid "Add SVG modifier" +msgstr "" + msgid "Select settings" msgstr "Beállítások kiválasztása" @@ -860,9 +884,6 @@ msgstr "Del" msgid "Delete the selected object" msgstr "Kiválasztott objektum törlése" -msgid "Edit Text" -msgstr "Edit Text" - msgid "Load..." msgstr "Betöltés..." @@ -887,6 +908,12 @@ msgstr "Henger" msgid "Cone" msgstr "Kúp" +msgid "Text" +msgstr "" + +msgid "SVG" +msgstr "" + msgid "Height range Modifier" msgstr "Height Range Modifier" @@ -1021,6 +1048,18 @@ msgstr "Tükrözés" msgid "Mirror object" msgstr "Objektum tükrözése" +msgid "Edit text" +msgstr "" + +msgid "Ability to change text, font, size, ..." +msgstr "" + +msgid "Edit SVG" +msgstr "" + +msgid "Change SVG source file, projection, size, ..." +msgstr "" + msgid "Invalidate cut info" msgstr "Invalidate cut info" @@ -1178,9 +1217,6 @@ msgstr "Kattints az ikonra az objektum színfestésének szerkesztéséhez" msgid "Click the icon to shift this object to the bed" msgstr "Click the icon to shift this object to the bed" -msgid " search results" -msgstr "" - msgid "Loading file" msgstr "Fájl betöltése" @@ -1333,9 +1369,6 @@ msgstr "Adj meg egy új nevet" msgid "Renaming" msgstr "Átnevezés" -msgid "Repairing model object" -msgstr "Modell javítása" - msgid "Following model object has been repaired" msgid_plural "Following model objects have been repaired" msgstr[0] "A következő modell sikeresen megjavítva" @@ -1665,12 +1698,6 @@ msgstr "" msgid "Arranging..." msgstr "Elrendezés..." -msgid "" -"Arrange failed. Found some exceptions when processing object geometries." -msgstr "" -"Sikertelen elrendezés. Néhány kivételt találtunk az objektumgeometriák " -"feldolgozásakor." - msgid "Arranging" msgstr "Elrendezés" @@ -1686,6 +1713,12 @@ msgstr "" msgid "Arranging done." msgstr "Elrendezés kész." +msgid "" +"Arrange failed. Found some exceptions when processing object geometries." +msgstr "" +"Sikertelen elrendezés. Néhány kivételt találtunk az objektumgeometriák " +"feldolgozásakor." + #, c-format, boost-format msgid "" "Arrangement ignored the following objects which can't fit into a single " @@ -1716,8 +1749,11 @@ msgstr "Orientáció folyamatban..." msgid "Orienting" msgstr "Orientáció" -msgid "Filling bed " -msgstr "Filling bed" +msgid "Orienting canceled." +msgstr "" + +msgid "Filling" +msgstr "" msgid "Bed filling canceled." msgstr "Bed filling canceled." @@ -1725,11 +1761,14 @@ msgstr "Bed filling canceled." msgid "Bed filling done." msgstr "Bed filling done." -msgid "Error! Unable to create thread!" -msgstr "Hiba. Nem sikerült létrehozni a szálat." +msgid "Searching for optimal orientation" +msgstr "" -msgid "Exception" -msgstr "Kivétel" +msgid "Orientation search canceled." +msgstr "" + +msgid "Orientation found." +msgstr "" msgid "Logging in" msgstr "Bejelentkezés" @@ -1801,11 +1840,6 @@ msgstr "Nyomtatási munka küldése felhőszolgáltatáson keresztül" msgid "Print task sending times out." msgstr "" -msgid "" -"The printer timed out while receiving a print job. Please check if the " -"network is functioning properly and send the print again." -msgstr "" - msgid "Service Unavailable" msgstr "Szolgáltatás nem elérhető" @@ -1840,30 +1874,6 @@ msgstr "Sikeresen elküldve. Az oldal bezárul %s mp-en belül" msgid "An SD card needs to be inserted before sending to printer." msgstr "A nyomtatóra való küldés előtt be kell helyezned egy MicroSD-kártyát." -msgid "Choose SLA archive:" -msgstr "Choose SLA archive:" - -msgid "Import file" -msgstr "Import file" - -msgid "Import model and profile" -msgstr "Import model and profile" - -msgid "Import profile only" -msgstr "Import profile only" - -msgid "Import model only" -msgstr "Import model only" - -msgid "Accurate" -msgstr "Accurate" - -msgid "Balanced" -msgstr "Balanced" - -msgid "Quick" -msgstr "Quick" - msgid "Importing SLA archive" msgstr "Importing SLA archive" @@ -2600,19 +2610,6 @@ msgstr "" "IGEN - Törlő torony megtartása\n" "NEM - Független támasz rétegmagasság megtartása" -#, boost-format -msgid "%1% infill pattern doesn't support 100%% density." -msgstr "%1% kitöltési mintázat nem támogatja a 100%%-os kitöltés." - -msgid "" -"Switch to rectilinear pattern?\n" -"Yes - switch to rectilinear pattern automaticlly\n" -"No - reset density to default non 100% value automaticlly" -msgstr "" -"Átváltasz vonalak mintázatra?\n" -"Igen - Váltás a vonalak mintázatra\n" -"Nem - Sűrűség visszaállítása az alapértelmezett, nem 100%-os értékre" - msgid "" "While printing by Object, the extruder may collide skirt.\n" "Thus, reset the skirt layer to 1 to avoid that." @@ -2713,6 +2710,18 @@ msgstr "" msgid "Motor noise showoff" msgstr "" +msgid "Nozzle filament covered detected pause" +msgstr "" + +msgid "Cutter error pause" +msgstr "" + +msgid "First layer error pause" +msgstr "" + +msgid "Nozzle clog pause" +msgstr "" + msgid "MC" msgstr "MC" @@ -3175,7 +3184,7 @@ msgstr "Térfogat:" msgid "Size:" msgstr "Méret:" -#, boost-format +#, c-format, boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -3552,6 +3561,18 @@ msgstr "Perspektivikus nézet használata" msgid "Use Orthogonal View" msgstr "Ortogonális nézet használata" +msgid "Show &G-code Window" +msgstr "" + +msgid "Show g-code window in Previce scene" +msgstr "" + +msgid "Reset Window Layout" +msgstr "" + +msgid "Reset to default window layout" +msgstr "" + msgid "Show &Labels" msgstr "Címkék megjelenítése" @@ -3924,6 +3945,9 @@ msgstr "Letöltés %d%%..." msgid "Connection lost. Please retry." msgstr "" +msgid "The device cannot handle more conversations. Please retry later." +msgstr "" + msgid "File not exists." msgstr "" @@ -4079,8 +4103,10 @@ msgstr "Layer: %s" msgid "Layer: %d/%d" msgstr "Layer: %d/%d" -msgid "Please heat the nozzle to above 170 degree before loading filament." -msgstr "A filament betöltése előtt melegítsd fel a fúvókát 170 fok fölé." +msgid "" +"Please heat the nozzle to above 170 degree before loading or unloading " +"filament." +msgstr "" msgid "Still unload" msgstr "Még kitöltődik" @@ -4430,7 +4456,7 @@ msgstr "Automatikus helyreállítás lépésvesztésből" msgid "Allow Prompt Sound" msgstr "" -msgid "Fliament Tangle Detect" +msgid "Filament Tangle Detect" msgstr "" msgid "Global" @@ -4610,6 +4636,12 @@ msgid "" "It is recommended to change to smooth mode." msgstr "" +msgid "Expand sidebar" +msgstr "" + +msgid "Collapse sidebar" +msgstr "" + #, c-format, boost-format msgid "Loading file: %s" msgstr "Fájl betöltése: %s" @@ -4626,31 +4658,6 @@ msgstr "A konfiguráció nem tölthető be." msgid "The 3mf is generated by old Orca Slicer, load geometry data only." msgstr "" -#, c-format, boost-format -msgid "This slicer file version %s is newer than %s's version:" -msgstr "" - -msgid "" -"Would you like to update your Bambu Studio software to enable all " -"functionality in this slicer file?\n" -msgstr "" - -msgid "Newer 3mf version" -msgstr "Újabb 3mf verzió" - -msgid "" -"you can always update Bambu Studio at your convenience. The slicer file will " -"now be loaded without full functionality." -msgstr "" - -#, c-format, boost-format -msgid "" -"This slicer file version %s is newer than %s's version.\n" -"\n" -"Would you like to update your Bambu Studio software to enable all " -"functionality in this slicer file?" -msgstr "" - msgid "Invalid values found in the 3mf:" msgstr "Invalid values found in the 3mf:" @@ -4885,6 +4892,9 @@ msgid "" "import it." msgstr "" +msgid "Import SLA archive" +msgstr "" + msgid "The selected file" msgstr "A kiválasztott fájl" @@ -4967,6 +4977,15 @@ msgstr "" "Unable to perform boolean operation on model meshes. Only positive parts " "will be exported." +msgid "" +"Are you sure you want to store original SVGs with their local paths into the " +"3MF file?\n" +"If you hit 'NO', all SVGs in the project will not be editable any more." +msgstr "" + +msgid "Private protection" +msgstr "" + msgid "Is the printer ready? Is the print sheet in place, empty and clean?" msgstr "" @@ -4991,6 +5010,9 @@ msgid "Custom supports and color painting were removed before repairing." msgstr "" "Az egyedi támaszok és a színfestés eltávolításra került a javítást előtt." +msgid "Optimize Rotation" +msgstr "" + msgid "Invalid number" msgstr "Érvénytelen szám" @@ -5151,12 +5173,6 @@ msgstr "A nap tippje értesítés megjelenítése indítás után" msgid "If enabled, useful hints are displayed at startup." msgstr "Ha engedélyezve van, hasznos tippek jelennek meg indításkor." -msgid "Show g-code window" -msgstr "" - -msgid "If enabled, g-code window will be displayed." -msgstr "" - msgid "Flushing volumes: Auto-calculate everytime the color changed." msgstr "" @@ -5457,7 +5473,7 @@ msgstr "%s mentése" msgid "User Preset" msgstr "Felhasználói beállítás" -msgid "Project Inside Preset" +msgid "Preset Inside Project" msgstr "Projekt a beállításon belül" msgid "Name is invalid;" @@ -5531,6 +5547,9 @@ msgstr "Feladat törölve" msgid "(LAN)" msgstr "(LAN)" +msgid "Search" +msgstr "" + msgid "My Device" msgstr "Saját eszköz" @@ -5561,16 +5580,16 @@ msgstr "Bambu Cool Plate" msgid "PLA Plate" msgstr "PLA Plate" -msgid "Bamabu Engineering Plate" +msgid "Bambu Engineering Plate" msgstr "Bambu Engineering Plate" -msgid "Bamabu Smooth PEI Plate" +msgid "Bambu Smooth PEI Plate" msgstr "" msgid "High temperature Plate" msgstr "" -msgid "Bamabu Textured PEI Plate" +msgid "Bambu Textured PEI Plate" msgstr "" msgid "Send print job to" @@ -5801,6 +5820,12 @@ msgstr "" msgid "The printer does not support sending to printer SD card." msgstr "A nyomtató nem támogatja a MicroSD kártyára küldést." +msgid "Slice ok." +msgstr "Szeletelés kész." + +msgid "View all Daily tips" +msgstr "" + msgid "Failed to create socket" msgstr "Failed to create socket" @@ -5986,11 +6011,25 @@ msgstr "" "0 top z distance, 0 interface spacing, concentric pattern and disable " "independent support layer height" +msgid "" +"Layer height exceeds the limit in Printer Settings -> Extruder -> Layer " +"height limits ,this may cause printing quality issues." +msgstr "" + +msgid "Adjust to the set range automatically? \n" +msgstr "" + +msgid "Adjust" +msgstr "" + +msgid "Ignore" +msgstr "" + msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" "Ha a nyomtatófej nélküli timelapse engedélyezve van, javasoljuk, hogy " "helyezz el a tálcán egy „Timelapse törlőtornyot“. Ehhez kattints jobb " @@ -6009,6 +6048,15 @@ msgstr "Pontosság" msgid "Wall generator" msgstr "Falgenerátor" +msgid "Walls and surfaces" +msgstr "" + +msgid "Bridging" +msgstr "" + +msgid "Overhangs" +msgstr "" + msgid "Walls" msgstr "Falak" @@ -6352,6 +6400,12 @@ msgid_plural "Following presets will be deleted too." msgstr[0] "A következő beállítás szintén törlődni fog." msgstr[1] "A következő beállítások szintén törlődni fognak." +msgid "" +"Are you sure to delete the selected preset? \n" +"If the preset corresponds to a filament currently in use on your printer, " +"please reset the filament information for that slot." +msgstr "" + #, boost-format msgid "Are you sure to %1% the selected preset?" msgstr "Biztos, hogy %1% a kiválasztott beállítást?" @@ -6380,7 +6434,7 @@ msgstr "Nincs meghatározva" msgid "Unsaved Changes" msgstr "mentetlen változások" -msgid "Discard or Keep changes" +msgid "Transfer or discard changes" msgstr "Változások elvetése vagy megtartása" msgid "Old Value" @@ -6594,19 +6648,15 @@ msgstr "" msgid "Ramming line spacing" msgstr "" -msgid "Auto-Calc" -msgstr "Automatikus számítás" - -msgid "Re-calculate" +msgid "Recalculate" msgstr "" msgid "Flushing volumes for filament change" msgstr "Filament csere tiszítási mennyisége" msgid "" -"Studio would re-calculate your flushing volumes everytime the filaments " -"color changed. You could disable the auto-calculate in Bambu Studio > " -"Preferences" +"Orca recalculates your flushing volumes everytime the filament colors " +"change. You can change this behavior in Preferences." msgstr "" msgid "Flushing volume (mm³) for each filament pair." @@ -6623,15 +6673,6 @@ msgstr "A szorzónak [%.2f, %.2f] tartományban kell lennie." msgid "Multiplier" msgstr "Szorzó" -msgid "unloaded" -msgstr "unloaded" - -msgid "loaded" -msgstr "betöltve" - -msgid "Filament #" -msgstr "Filament #" - msgid "From" msgstr "Ettől:" @@ -7004,6 +7045,9 @@ msgstr "Nyomtatás" msgid "Idle" msgstr "Tétlen" +msgid "Beta version" +msgstr "" + msgid "Latest version" msgstr "Legfrissebb verzió" @@ -7380,6 +7424,25 @@ msgstr "" msgid "Variable layer height is not supported with Organic supports." msgstr "" +msgid "" +"Different nozzle diameters and different filament diameters is not allowed " +"when prime tower is enabled." +msgstr "" + +msgid "" +"The Wipe Tower is currently only supported with the relative extruder " +"addressing (use_relative_e_distances=1)." +msgstr "" + +msgid "" +"Ooze prevention is currently not supported with the prime tower enabled." +msgstr "" + +msgid "" +"The prime tower is currently only supported for the Marlin, RepRap/Sprinter, " +"RepRapFirmware and Repetier G-code flavors." +msgstr "" + msgid "The prime tower is not supported in \"By object\" print." msgstr "A prime tower is not supported in “By object” print." @@ -7453,11 +7516,6 @@ msgstr "" msgid "Layer height cannot exceed nozzle diameter" msgstr "A rétegmagasság nem lehet nagyobb a fúvóka átmérőjénél." -msgid "" -"Layer height cannot exceed the limit in Printer Settings -> Extruder -> " -"Layer height limits" -msgstr "" - msgid "" "Relative extruder addressing requires resetting the extruder position at " "each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to " @@ -7549,6 +7607,12 @@ msgstr "" "Ez a maximális nyomtatható magasság, amelyet a nyomtatótér magassága " "korlátoz." +msgid "Preferred orientation" +msgstr "" + +msgid "Automatically orient stls on the Z-axis upon initial import" +msgstr "" + msgid "Printer preset names" msgstr "Nyomtató beállítások neve" @@ -7824,7 +7888,7 @@ msgstr "" msgid "Density of external bridges. 100% means solid bridge. Default is 100%." msgstr "" -msgid "Bridge flow" +msgid "Bridge flow ratio" msgstr "Áthidalás áramlási sebessége" msgid "" @@ -7834,6 +7898,15 @@ msgstr "" "Csökkentsd kicsit ezt az értéket (például 0,9-re), hogy ezzel csökkentsd az " "áthidaláshoz használt anyag mennyiségét, és a megereszkedést" +msgid "Internal bridge flow ratio" +msgstr "" + +msgid "" +"This value governs the thickness of the internal bridge layer. This is the " +"first layer over sparse infill. Decrease this value slightly (for example " +"0.9) to improve surface quality over sparse infill." +msgstr "" + msgid "Top surface flow ratio" msgstr "" @@ -8149,6 +8222,15 @@ msgstr "" "Ha ki van kapcsolva, az áthidalások jobban néznek ki, de csak a rövidebb " "áthidalt távolságokon megbízhatóak." +msgid "Thick internal bridges" +msgstr "" + +msgid "" +"If enabled, thick internal bridges will be used. It's usually recommended to " +"have this feature turned on. However, consider turning it off if you are " +"using large nozzles." +msgstr "" + msgid "Max bridge length" msgstr "Maximum áthidalás hossza" @@ -8229,7 +8311,7 @@ msgid "Internal solid infill pattern" msgstr "" msgid "" -"Line pattern of internal solid infill. if the detect nattow internal solid " +"Line pattern of internal solid infill. if the detect narrow internal solid " "infill be enabled, the concentric pattern will be used for the small area." msgstr "" @@ -8262,25 +8344,55 @@ msgid "" "This sets the threshold for small perimeter length. Default threshold is 0mm" msgstr "" -msgid "Order of walls" +msgid "Walls printing order" msgstr "" -msgid "Print sequence of inner wall and outer wall. " +msgid "" +"Print sequence of the internal (inner) and external (outer) walls. \n" +"\n" +"Use Inner/Outer for best overhangs. This is because the overhanging walls " +"can adhere to a neighouring perimeter while printing. However, this option " +"results in slightly reduced surface quality as the external perimeter is " +"deformed by being squashed to the internal perimeter.\n" +"\n" +"Use Inner/Outer/Inner for the best external surface finish and dimensional " +"accuracy as the external wall is printed undisturbed from an internal " +"perimeter. However, overhang performance will reduce as there is no internal " +"perimeter to print the external wall against. This option requires a minimum " +"of 3 walls to be effective as it prints the internal walls from the 3rd " +"perimeter onwards first, then the external perimeter and, finally, the first " +"internal perimeter. This option is recomended against the Outer/Inner option " +"in most cases. \n" +"\n" +"Use Outer/Inner for the same external wall quality and dimensional accuracy " +"benefits of Inner/Outer/Inner option. However, the z seams will appear less " +"consistent as the first extrusion of a new layer starts on a visible " +"surface.\n" +"\n" +" " msgstr "" -msgid "inner/outer" +msgid "Inner/Outer" msgstr "" -msgid "outer/inner" +msgid "Outer/Inner" msgstr "" -msgid "inner wall/outer wall/inner wall" +msgid "Inner/Outer/Inner" msgstr "" msgid "Print infill first" msgstr "" -msgid "Order of wall/infill. false means print wall first. " +msgid "" +"Order of wall/infill. When the tickbox is unchecked the walls are printed " +"first, which works best in most cases.\n" +"\n" +"Printing walls first may help with extreme overhangs as the walls have the " +"neighbouring infill to adhere to. However, the infill will slighly push out " +"the printed walls where it is attached to them, resulting in a worse " +"external surface finish. It can also cause the infill to shine through the " +"external surfaces of the part." msgstr "" msgid "Height to rod" @@ -8624,11 +8736,11 @@ msgstr "" msgid "Sparse infill density" msgstr "Kitöltés sűrűsége" -#, c-format -msgid "Density of internal sparse infill, 100% means solid throughout" +#, c-format, boost-format +msgid "" +"Density of internal sparse infill, 100% turns all sparse infill into solid " +"infill and internal solid infill pattern will be used" msgstr "" -"Ez a belső ritkás kitöltés sűrűsége. A 100%% azt jelenti, hogy az objektum " -"végig tömör lesz." msgid "Sparse infill pattern" msgstr "Kitöltési mintázat" @@ -8833,10 +8945,10 @@ msgstr "Teljes ventilátor fordulatszám ennél a rétegnél" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " -"than \"close_fan_the_first_x_layers\", in which case the fan will be running " -"at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower than " +"\"close_fan_the_first_x_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." msgstr "" msgid "Support interface fan speed" @@ -8887,6 +8999,12 @@ msgid "" msgstr "" "Az egyes vonalszakaszokon használt véletlen pontok közötti átlagos távolság" +msgid "Apply fuzzy skin to first layer" +msgstr "" + +msgid "Whether to apply fuzzy skin on the first layer" +msgstr "" + msgid "Filter out tiny gaps" msgstr "" @@ -9521,13 +9639,13 @@ msgstr "Fájlnév formátum" msgid "User can self-define the project file name when export" msgstr "A felhasználó dönthet a projektfájlok nevéről exportáláskor." -msgid "Make overhang printable" +msgid "Make overhangs printable" msgstr "" msgid "Modify the geometry to print overhangs without support material." msgstr "" -msgid "Make overhang printable maximum angle" +msgid "Make overhangs printable - Maximum angle" msgstr "" msgid "" @@ -9536,7 +9654,7 @@ msgid "" "0 will replace all overhangs with conical material." msgstr "" -msgid "Make overhang printable hole area" +msgid "Make overhangs printable - Hole area" msgstr "" msgid "" @@ -9782,6 +9900,9 @@ msgstr "" msgid "Show auto-calibration marks" msgstr "" +msgid "Disable set remaining print time" +msgstr "" + msgid "Seam position" msgstr "Varrat pozíció" @@ -9915,6 +10036,22 @@ msgstr "" "nyomatokká alakítja, tömör alsó rétegekkel. A végső modellen nincsenek " "varratok" +msgid "Smooth Spiral" +msgstr "" + +msgid "" +"Smooth Spiral smoothes out X and Y moves as wellresulting in no visible seam " +"at all, even in the XY directions on walls that are not vertical" +msgstr "" + +msgid "Max XY Smoothing" +msgstr "" + +msgid "" +"Maximum distance to move points in XY to try to achieve a smooth spiralIf " +"expressed as a %, it will be computed over nozzle diameter" +msgstr "" + msgid "" "If smooth or traditional mode is selected, a timelapse video will be " "generated for each print. After each layer is printed, a snapshot is taken " @@ -10122,10 +10259,11 @@ msgstr "" "„Alapértelmezett“ beállítás választásakor a jelenleg használt filament kerül " "felhasználásra." -msgid "No interface filament for body" +msgid "Avoid interface filament for base" msgstr "" -msgid "Don't use support interface filament to print support body" +msgid "" +"Avoid using support interface filament to print support base if possible." msgstr "" msgid "" @@ -10373,11 +10511,11 @@ msgid "" "double walls." msgstr "" -msgid "Tree support wall loops" -msgstr "Fa támasz falak száma" +msgid "Support wall loops" +msgstr "" -msgid "This setting specify the count of walls around tree support" -msgstr "Ez a beállítás határozza meg a falak számát a fa támasz körül." +msgid "This setting specify the count of walls around support" +msgstr "" msgid "Tree support with infill" msgstr "Fa támasz kitöltéssel" @@ -10492,10 +10630,16 @@ msgid "Wipe Distance" msgstr "Törlési távolság" msgid "" -"Discribe how long the nozzle will move along the last path when retracting" +"Discribe how long the nozzle will move along the last path when " +"retracting. \n" +"\n" +"Depending on how long the wipe operation lasts, how fast and long the " +"extruder/filament retraction settings are, a retraction move may be needed " +"to retract the remaining filament. \n" +"\n" +"Setting a value in the retract amount before wipe setting below will perform " +"any excess retraction before the wipe, else it will be performed after." msgstr "" -"Megszabja, hogy a fúvóka visszahúzáskor mekkora távot mozog az utolsó " -"útvonalán" msgid "" "The wiping tower can be used to clean up the residue on the nozzle and " @@ -10812,10 +10956,6 @@ msgstr "" msgid "invalid value " msgstr "invalid value " -#, c-format, boost-format -msgid " doesn't work at 100%% density " -msgstr " doesn't work at 100%% density " - msgid "Invalid value when spiral vase mode is enabled: " msgstr "Invalid value when spiral vase mode is enabled: " @@ -11667,6 +11807,720 @@ msgstr "" msgid "Delete input" msgstr "" +msgid "Network Test" +msgstr "" + +msgid "Start Test Multi-Thread" +msgstr "" + +msgid "Start Test Single-Thread" +msgstr "" + +msgid "Export Log" +msgstr "" + +msgid "Studio Version:" +msgstr "" + +msgid "System Version:" +msgstr "" + +msgid "DNS Server:" +msgstr "" + +msgid "Test BambuLab" +msgstr "" + +msgid "Test BambuLab:" +msgstr "" + +msgid "Test Bing.com" +msgstr "" + +msgid "Test bing.com:" +msgstr "" + +msgid "Test HTTP" +msgstr "" + +msgid "Test HTTP Service:" +msgstr "" + +msgid "Test storage" +msgstr "" + +msgid "Test Storage Upload:" +msgstr "" + +msgid "Test storage upgrade" +msgstr "" + +msgid "Test Storage Upgrade:" +msgstr "" + +msgid "Test storage download" +msgstr "" + +msgid "Test Storage Download:" +msgstr "" + +msgid "Test plugin download" +msgstr "" + +msgid "Test Plugin Download:" +msgstr "" + +msgid "Test Storage Upload" +msgstr "" + +msgid "Log Info" +msgstr "" + +msgid "Select filament preset" +msgstr "" + +msgid "Create Filament" +msgstr "" + +msgid "Create Based on Current Filament" +msgstr "" + +msgid "Copy Current Filament Preset " +msgstr "" + +msgid "Basic Information" +msgstr "" + +msgid "Add Filament Preset under this filament" +msgstr "" + +msgid "We could create the filament presets for your following printer:" +msgstr "" + +msgid "Select Vendor" +msgstr "" + +msgid "Input Custom Vendor" +msgstr "" + +msgid "Can't find vendor I want" +msgstr "" + +msgid "Select Type" +msgstr "" + +msgid "Select Filament Preset" +msgstr "" + +msgid "Serial" +msgstr "" + +msgid "e.g. Basic, Matte, Silk, Marble" +msgstr "" + +msgid "Filament Preset" +msgstr "" + +msgid "Create" +msgstr "" + +msgid "Vendor is not selected, please reselect vendor." +msgstr "" + +msgid "Custom vendor is not input, please input custom vendor." +msgstr "" + +msgid "" +"\"Bambu\" or \"Generic\" can not be used as a Vendor for custom filaments." +msgstr "" + +msgid "Filament type is not selected, please reselect type." +msgstr "" + +msgid "Filament serial is not inputed, please input serial." +msgstr "" + +msgid "" +"There may be escape characters in the vendor or serial input of filament. " +"Please delete and re-enter." +msgstr "" + +msgid "All inputs in the custom vendor or serial are spaces. Please re-enter." +msgstr "" + +msgid "The vendor can not be a number. Please re-enter." +msgstr "" + +msgid "" +"You have not selected a printer or preset yet. Please select at least one." +msgstr "" + +msgid "Some existing presets have failed to be created, as follows:\n" +msgstr "" + +msgid "" +"\n" +"Do you want to rewrite it?" +msgstr "" + +msgid "" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" +"To add preset for more prinetrs, Please go to printer selection" +msgstr "" + +msgid "Create Printer/Nozzle" +msgstr "" + +msgid "Create Printer" +msgstr "" + +msgid "Create Nozzle for Existing Printer" +msgstr "" + +msgid "Create from Template" +msgstr "" + +msgid "Create Based on Current Printer" +msgstr "" + +msgid "wiki" +msgstr "" + +msgid "Import Preset" +msgstr "" + +msgid "Create Type" +msgstr "" + +msgid "The model is not fond, place reselect vendor." +msgstr "" + +msgid "Select Model" +msgstr "" + +msgid "Select Printer" +msgstr "" + +msgid "Input Custom Model" +msgstr "" + +msgid "Can't find my printer model" +msgstr "" + +msgid "Rectangle" +msgstr "" + +msgid "Printable Space" +msgstr "" + +msgid "X" +msgstr "" + +msgid "Y" +msgstr "" + +msgid "Hot Bed STL" +msgstr "" + +msgid "Load stl" +msgstr "" + +msgid "Hot Bed SVG" +msgstr "" + +msgid "Load svg" +msgstr "" + +msgid "Max Print Height" +msgstr "" + +#, c-format, boost-format +msgid "The file exceeds %d MB, please import again." +msgstr "" + +msgid "Exception in obtaining file size, please import again." +msgstr "" + +msgid "Preset path is not find, please reselect vendor." +msgstr "" + +msgid "The printer model was not found, please reselect." +msgstr "" + +msgid "The nozzle diameter is not fond, place reselect." +msgstr "" + +msgid "The printer preset is not fond, place reselect." +msgstr "" + +msgid "Printer Preset" +msgstr "" + +msgid "Filament Preset Template" +msgstr "" + +msgid "Deselect All" +msgstr "" + +msgid "Process Preset Template" +msgstr "" + +msgid "Back Page 1" +msgstr "" + +msgid "" +"You have not yet chosen which printer preset to create based on. Please " +"choose the vendor and model of the printer" +msgstr "" + +msgid "" +"You have entered an illegal input in the printable area section on the first " +"page. Please check before creating it." +msgstr "" + +msgid "The custom printer or model is not inputed, place input." +msgstr "" + +msgid "" +"The printer preset you created already has a preset with the same name. Do " +"you want to overwrite it?\n" +"\tYes: Overwrite the printer preset with the same name, and filament and " +"process presets with the same preset name will be recreated \n" +"and filament and process presets without the same preset name will be " +"reserve.\n" +"\tCancel: Do not create a preset, return to the creation interface." +msgstr "" + +msgid "You need to select at least one filament preset." +msgstr "" + +msgid "You need to select at least one process preset." +msgstr "" + +msgid "Create filament presets failed. As follows:\n" +msgstr "" + +msgid "Create process presets failed. As follows:\n" +msgstr "" + +msgid "Vendor is not find, please reselect." +msgstr "" + +msgid "Current vendor has no models, please reselect." +msgstr "" + +msgid "" +"You have not selected the vendor and model or inputed the custom vendor and " +"model." +msgstr "" + +msgid "" +"There may be escape characters in the custom printer vendor or model. Please " +"delete and re-enter." +msgstr "" + +msgid "" +"All inputs in the custom printer vendor or model are spaces. Please re-enter." +msgstr "" + +msgid "Please check bed printable shape and origin input." +msgstr "" + +msgid "" +"You have not yet selected the printer to replace the nozzle, please choose." +msgstr "" + +msgid "Create Printer Successful" +msgstr "" + +msgid "Create Filament Successful" +msgstr "" + +msgid "Printer Created" +msgstr "" + +msgid "Please go to printer settings to edit your presets" +msgstr "" + +msgid "Filament Created" +msgstr "" + +msgid "" +"Please go to filament setting to edit your presets if you need.\n" +"Please note that nozzle temperature, hot bed temperature, and maximum " +"volumetric speed have a significant impact on printing quality. Please set " +"them carefully." +msgstr "" + +msgid "Printer Setting" +msgstr "" + +msgid "Export Configs" +msgstr "" + +msgid "Printer config bundle(.bbscfg)" +msgstr "" + +msgid "Filament bundle(.bbsflmt)" +msgstr "" + +msgid "Printer presets(.zip)" +msgstr "" + +msgid "Filament presets(.zip)" +msgstr "" + +msgid "Process presets(.zip)" +msgstr "" + +msgid "initialize fail" +msgstr "" + +msgid "add file fail" +msgstr "" + +msgid "add bundle structure file fail" +msgstr "" + +msgid "finalize fail" +msgstr "" + +msgid "open zip written fail" +msgstr "" + +msgid "Export successful" +msgstr "" + +#, c-format, boost-format +msgid "" +"The '%s' folder already exists in the current directory. Do you want to " +"clear it and rebuild it.\n" +"If not, a time suffix will be added, and you can modify the name after " +"creation." +msgstr "" + +msgid "" +"Printer and all the filament&process presets that belongs to the printer. \n" +"Can be shared with others." +msgstr "" + +msgid "" +"User's fillment preset set. \n" +"Can be shared with others." +msgstr "" + +msgid "" +"Only display printer names with changes to printer, filament, and process " +"presets." +msgstr "" + +msgid "Only display the filament names with changes to filament presets." +msgstr "" + +msgid "" +"Only printer names with user printer presets will be displayed, and each " +"preset you choose will be exported as a zip." +msgstr "" + +msgid "" +"Only the filament names with user filament presets will be displayed, \n" +"and all user filament presets in each filament name you select will be " +"exported as a zip." +msgstr "" + +msgid "" +"Only printer names with changed process presets will be displayed, \n" +"and all user process presets in each printer name you select will be " +"exported as a zip." +msgstr "" + +msgid "Please select at least one printer or filament." +msgstr "" + +msgid "Please select a type you want to export" +msgstr "" + +msgid "Edit Filament" +msgstr "" + +msgid "Filament presets under this filament" +msgstr "" + +msgid "" +"Note: If the only preset under this filament is deleted, the filament will " +"be deleted after exiting the dialog." +msgstr "" + +msgid "Presets inherited by other presets can not be deleted" +msgstr "" + +msgid "The following presets inherits this preset." +msgid_plural "The following preset inherits this preset." +msgstr[0] "" +msgstr[1] "" + +msgid "Delete Preset" +msgstr "" + +msgid "Are you sure to delete the selected preset?" +msgstr "" + +msgid "Delete preset" +msgstr "" + +msgid "+ Add Preset" +msgstr "" + +msgid "Delete Filament" +msgstr "" + +msgid "" +"All the filament presets belong to this filament would be deleted. \n" +"If you are using this filament on your printer, please reset the filament " +"information for that slot." +msgstr "" + +msgid "Delete filament" +msgstr "" + +msgid "Add Preset" +msgstr "" + +msgid "Add preset for new printer" +msgstr "" + +msgid "Copy preset from filament" +msgstr "" + +msgid "The filament choice not find filament preset, please reselect it" +msgstr "" + +msgid "Edit Preset" +msgstr "" + +msgid "For more information, please check out Wiki" +msgstr "" + +msgid "Collapse" +msgstr "" + +msgid "Daily Tips" +msgstr "" + +msgid "Need select printer" +msgstr "" + +msgid "The start, end or step is not valid value." +msgstr "" + +msgid "" +"Unable to calibrate: maybe because the set calibration value range is too " +"large, or the step is too small" +msgstr "" + +msgid "Physical Printer" +msgstr "" + +msgid "Print Host upload" +msgstr "" + +msgid "Could not get a valid Printer Host reference" +msgstr "" + +msgid "Success!" +msgstr "" + +msgid "Refresh Printers" +msgstr "" + +msgid "" +"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" +"signed certificate." +msgstr "" + +msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" +msgstr "" + +msgid "Open CA certificate file" +msgstr "" + +#, c-format, boost-format +msgid "" +"On this system, %s uses HTTPS certificates from the system Certificate Store " +"or Keychain." +msgstr "" + +msgid "" +"To use a custom CA file, please import your CA file into Certificate Store / " +"Keychain." +msgstr "" + +msgid "Connection to printers connected via the print host failed." +msgstr "" + +#, c-format, boost-format +msgid "Mismatched type of print host: %s" +msgstr "" + +msgid "Connection to AstroBox works correctly." +msgstr "" + +msgid "Could not connect to AstroBox" +msgstr "" + +msgid "Note: AstroBox version at least 1.1.0 is required." +msgstr "" + +msgid "Connection to Duet works correctly." +msgstr "" + +msgid "Could not connect to Duet" +msgstr "" + +msgid "Unknown error occured" +msgstr "" + +msgid "Wrong password" +msgstr "" + +msgid "Could not get resources to create a new connection" +msgstr "" + +msgid "Upload not enabled on FlashAir card." +msgstr "" + +msgid "Connection to FlashAir works correctly and upload is enabled." +msgstr "" + +msgid "Could not connect to FlashAir" +msgstr "" + +msgid "" +"Note: FlashAir with firmware 2.00.02 or newer and activated upload function " +"is required." +msgstr "" + +msgid "Connection to MKS works correctly." +msgstr "" + +msgid "Could not connect to MKS" +msgstr "" + +msgid "Connection to OctoPrint works correctly." +msgstr "" + +msgid "Could not connect to OctoPrint" +msgstr "" + +msgid "Note: OctoPrint version at least 1.1.0 is required." +msgstr "" + +msgid "Connection to Prusa SL1 / SL1S works correctly." +msgstr "" + +msgid "Could not connect to Prusa SLA" +msgstr "" + +msgid "Connection to PrusaLink works correctly." +msgstr "" + +msgid "Could not connect to PrusaLink" +msgstr "" + +msgid "Storages found" +msgstr "" + +#. TRN %1% = storage path +#, boost-format +msgid "%1% : read only" +msgstr "" + +#. TRN %1% = storage path +#, boost-format +msgid "%1% : no free space" +msgstr "" + +#. TRN %1% = host +#, boost-format +msgid "Upload has failed. There is no suitable storage found at %1%." +msgstr "" + +msgid "Connection to Prusa Connect works correctly." +msgstr "" + +msgid "Could not connect to Prusa Connect" +msgstr "" + +msgid "Connection to Repetier works correctly." +msgstr "" + +msgid "Could not connect to Repetier" +msgstr "" + +msgid "Note: Repetier version at least 0.90.0 is required." +msgstr "" + +#, boost-format +msgid "" +"HTTP status: %1%\n" +"Message body: \"%2%\"" +msgstr "" + +#, boost-format +msgid "" +"Parsing of host response failed.\n" +"Message body: \"%1%\"\n" +"Error: \"%2%\"" +msgstr "" + +#, boost-format +msgid "" +"Enumeration of host printers failed.\n" +"Message body: \"%1%\"\n" +"Error: \"%2%\"" +msgstr "" + +#: resources/data/hints.ini: [hint:Precise wall] +msgid "" +"Precise wall\n" +"Did you know that turning on precise wall can improve precision and layer " +"consistency?" +msgstr "" + +#: resources/data/hints.ini: [hint:Sandwich mode] +msgid "" +"Sandwich mode\n" +"Did you know that you can use sandwich mode (inner-outer-inner) to improve " +"precision and layer consistency if your model doesn't have very steep " +"overhangs?" +msgstr "" + +#: resources/data/hints.ini: [hint:Chamber temperature] +msgid "" +"Chamber temperature\n" +"Did you know that OrcaSlicer supports chamber temperature?" +msgstr "" + +#: resources/data/hints.ini: [hint:Calibration] +msgid "" +"Calibration\n" +"Did you know that calibrating your printer can do wonders? Check out our " +"beloved calibration solution in OrcaSlicer." +msgstr "" + +#: resources/data/hints.ini: [hint:Auxiliary fan] +msgid "" +"Auxiliary fan\n" +"Did you know that OrcaSlicer supports Auxiliary part cooling fan?" +msgstr "" + +#: resources/data/hints.ini: [hint:Air filtration] +msgid "" +"Air filtration/Exhuast Fan\n" +"Did you know that OrcaSlicer can support Air filtration/Exhuast Fan?" +msgstr "" + #: resources/data/hints.ini: [hint:How to use keyboard shortcuts] msgid "" "How to use keyboard shortcuts\n" @@ -11751,13 +12605,8 @@ msgstr "" msgid "" "Simplify Model\n" "Did you know that you can reduce the number of triangles in a mesh using the " -"Simplify mesh feature? Right-click the model and select Simplify model. Read " -"more in the documentation." +"Simplify mesh feature? Right-click the model and select Simplify model." msgstr "" -"Modell egyszerűsítése\n" -"Tudtad, hogy csökkentheted a háromszögek számát a Modell egyszerűsítése " -"opcióval? Kattints jobb gombbal a modellre, és válaszd a Modell " -"egyszerűsítése lehetőséget. További információ a dokumentációban található." #: resources/data/hints.ini: [hint:Slicing Parameter Table] msgid "" @@ -11784,7 +12633,7 @@ msgid "" "Subtract a Part\n" "Did you know that you can subtract one mesh from another using the Negative " "part modifier? That way you can, for example, create easily resizable holes " -"directly in Orca Slicer. Read more in the documentation." +"directly in Orca Slicer." msgstr "" #: resources/data/hints.ini: [hint:STEP] @@ -11943,6 +12792,107 @@ msgid "" "probability of warping." msgstr "" +#~ msgid "Edit Text" +#~ msgstr "Edit Text" + +#~ msgid "Error! Unable to create thread!" +#~ msgstr "Hiba. Nem sikerült létrehozni a szálat." + +#~ msgid "Exception" +#~ msgstr "Kivétel" + +#~ msgid "Choose SLA archive:" +#~ msgstr "Choose SLA archive:" + +#~ msgid "Import file" +#~ msgstr "Import file" + +#~ msgid "Import model and profile" +#~ msgstr "Import model and profile" + +#~ msgid "Import profile only" +#~ msgstr "Import profile only" + +#~ msgid "Import model only" +#~ msgstr "Import model only" + +#~ msgid "Accurate" +#~ msgstr "Accurate" + +#~ msgid "Balanced" +#~ msgstr "Balanced" + +#~ msgid "Quick" +#~ msgstr "Quick" + +#~ msgid "Auto-Calc" +#~ msgstr "Automatikus számítás" + +#~ msgid "unloaded" +#~ msgstr "unloaded" + +#~ msgid "loaded" +#~ msgstr "betöltve" + +#~ msgid "Filament #" +#~ msgstr "Filament #" + +#~ msgid "" +#~ "Discribe how long the nozzle will move along the last path when retracting" +#~ msgstr "" +#~ "Megszabja, hogy a fúvóka visszahúzáskor mekkora távot mozog az utolsó " +#~ "útvonalán" + +#~ msgid "" +#~ "Simplify Model\n" +#~ "Did you know that you can reduce the number of triangles in a mesh using " +#~ "the Simplify mesh feature? Right-click the model and select Simplify " +#~ "model. Read more in the documentation." +#~ msgstr "" +#~ "Modell egyszerűsítése\n" +#~ "Tudtad, hogy csökkentheted a háromszögek számát a Modell egyszerűsítése " +#~ "opcióval? Kattints jobb gombbal a modellre, és válaszd a Modell " +#~ "egyszerűsítése lehetőséget. További információ a dokumentációban " +#~ "található." + +#~ msgid "Filling bed " +#~ msgstr "Filling bed" + +#, boost-format +#~ msgid "%1% infill pattern doesn't support 100%% density." +#~ msgstr "%1% kitöltési mintázat nem támogatja a 100%%-os kitöltés." + +#~ msgid "" +#~ "Switch to rectilinear pattern?\n" +#~ "Yes - switch to rectilinear pattern automaticlly\n" +#~ "No - reset density to default non 100% value automaticlly" +#~ msgstr "" +#~ "Átváltasz vonalak mintázatra?\n" +#~ "Igen - Váltás a vonalak mintázatra\n" +#~ "Nem - Sűrűség visszaállítása az alapértelmezett, nem 100%-os értékre" + +#~ msgid "Please heat the nozzle to above 170 degree before loading filament." +#~ msgstr "A filament betöltése előtt melegítsd fel a fúvókát 170 fok fölé." + +#~ msgid "Newer 3mf version" +#~ msgstr "Újabb 3mf verzió" + +#, c-format +#~ msgid "Density of internal sparse infill, 100% means solid throughout" +#~ msgstr "" +#~ "Ez a belső ritkás kitöltés sűrűsége. A 100%% azt jelenti, hogy az " +#~ "objektum végig tömör lesz." + +#~ msgid "Tree support wall loops" +#~ msgstr "Fa támasz falak száma" + +#~ msgid "This setting specify the count of walls around tree support" +#~ msgstr "Ez a beállítás határozza meg a falak számát a fa támasz körül." + +#, c-format, boost-format +#~ msgid " doesn't work at 100%% density " +#~ msgstr " doesn't work at 100%% density " + #~ msgid "Ctrl + Shift + Enter" #~ msgstr "Ctrl + Shift + Enter" @@ -11964,9 +12914,6 @@ msgstr "" #~ msgid "Export all objects as STL" #~ msgstr "Összes objektum exportálása STL-ként" -#~ msgid "Slice ok." -#~ msgstr "Szeletelés kész." - #, c-format, boost-format #~ msgid "" #~ "The 3mf's version %s is newer than %s's version %s, Found following keys " @@ -12259,7 +13206,7 @@ msgstr "" #~ msgid "Score" #~ msgstr "Score" -#~ msgid "Bamabu High Temperature Plate" +#~ msgid "Bambu High Temperature Plate" #~ msgstr "Bambu High Temperature Plate" #~ msgid "Can't connect to the printer" diff --git a/localization/i18n/it/OrcaSlicer_it.po b/localization/i18n/it/OrcaSlicer_it.po index 60ed6affb9..b0a7931d6e 100644 --- a/localization/i18n/it/OrcaSlicer_it.po +++ b/localization/i18n/it/OrcaSlicer_it.po @@ -2,7 +2,10 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-24 18:09+0100\n" +"POT-Creation-Date: 2023-12-19 22:09+0800\n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -99,7 +102,7 @@ msgid "Support Generated" msgstr "Supporto generato" msgid "Gizmo-Place on Face" -msgstr "" +msgstr "Gizmo-Posiziona su faccia" msgid "Lay on face" msgstr "Posiziona su faccia" @@ -150,7 +153,7 @@ msgid "Height range" msgstr "Intervallo altezza" msgid "Alt + Shift + Enter" -msgstr "" +msgstr "Alt + Maiusc + Invio" msgid "Toggle Wireframe" msgstr "Attiva Wireframe" @@ -181,13 +184,13 @@ msgid "Move" msgstr "Sposta" msgid "Gizmo-Move" -msgstr "" +msgstr "Gizmo-Sposta" msgid "Rotate" msgstr "Ruota" msgid "Gizmo-Rotate" -msgstr "" +msgstr "Gizmo-Ruota" msgid "Optimize orientation" msgstr "Ottimizza orientamento" @@ -199,7 +202,7 @@ msgid "Scale" msgstr "Ridimensiona" msgid "Gizmo-Scale" -msgstr "" +msgstr "Gizmo-Ridimensiona" msgid "Error: Please close all toolbar menus first" msgstr "Errore: chiudi prima tutti i menu della barra degli strumenti" @@ -291,6 +294,12 @@ msgstr "Seleziona tutti i connettori" msgid "Cut" msgstr "Taglia" +msgid "non-mainifold edges be caused by cut tool, do you want to fix it now?" +msgstr "" + +msgid "Repairing model object" +msgstr "Riparazione oggetto" + msgid "Connector" msgstr "Connettore" @@ -500,13 +509,13 @@ msgid "Remove selection" msgstr "Rimuovi selezione" msgid "Entering Seam painting" -msgstr "" +msgstr "Apertura Pittura Giunzione" msgid "Leaving Seam painting" -msgstr "" +msgstr "Chiusura Pittura Giunzione" msgid "Paint-on seam editing" -msgstr "" +msgstr "Modifica Pittura Giunzione" msgid "Font" msgstr "Font" @@ -571,7 +580,7 @@ msgid "Filament" msgstr "Filamento" msgid "Machine" -msgstr "Machine" +msgstr "Macchina" msgid "Configuration package was loaded, but some values were not recognized." msgstr "" @@ -729,9 +738,12 @@ msgid "" "The number of user presets cached in the cloud has exceeded the upper limit, " "newly created user presets can only be used locally." msgstr "" +"Il numero di impostazioni utente memorizzate nella cache cloud ha superato " +"il limite massimo. Le nuove impostazioni utente create possono essere " +"utilizzate solo in locale." msgid "Sync user presets" -msgstr "" +msgstr "Sincronizzare le preset dell'utente" msgid "Loading" msgstr "Caricamento" @@ -857,6 +869,24 @@ msgstr "Aggiungi blocco supporto" msgid "Add support enforcer" msgstr "Aggiungi rinforzo supporto" +msgid "Add text" +msgstr "Aggiungi testo" + +msgid "Add negative text" +msgstr "Aggiungi testo negativo" + +msgid "Add text modifier" +msgstr "Aggiungi modificatore di testo" + +msgid "Add SVG part" +msgstr "Aggiungi parte SVG" + +msgid "Add negative SVG" +msgstr "Aggiungi SVG negativo" + +msgid "Add SVG modifier" +msgstr "Aggiungi modificatore SVG" + msgid "Select settings" msgstr "Seleziona impostazioni" @@ -872,9 +902,6 @@ msgstr "Del" msgid "Delete the selected object" msgstr "Elimina l'oggetto selezionato" -msgid "Edit Text" -msgstr "Modifica testo" - msgid "Load..." msgstr "Caricamento..." @@ -899,6 +926,12 @@ msgstr "Cilindro" msgid "Cone" msgstr "Cono" +msgid "Text" +msgstr "Testo" + +msgid "SVG" +msgstr "SVG" + msgid "Height range Modifier" msgstr "Modifica intervallo di altezza" @@ -927,10 +960,10 @@ msgid "Fix model" msgstr "Correggi il modello" msgid "Export as one STL" -msgstr "" +msgstr "Esporta come un unico STL" msgid "Export as STLs" -msgstr "" +msgstr "Esportazione come STL" msgid "Reload from disk" msgstr "Ricarica da disco" @@ -1032,6 +1065,18 @@ msgstr "Specchia" msgid "Mirror object" msgstr "Specchia Oggetto" +msgid "Edit text" +msgstr "Modifica testo" + +msgid "Ability to change text, font, size, ..." +msgstr "Possibilità di modificare il testo, il carattere, la dimensione, ..." + +msgid "Edit SVG" +msgstr "Modifica SVG" + +msgid "Change SVG source file, projection, size, ..." +msgstr "Cambia il file sorgente SVG, la proiezione, le dimensioni, ..." + msgid "Invalidate cut info" msgstr "Annulla informazioni di taglio" @@ -1193,9 +1238,6 @@ msgstr "Clicca sull'icona per modificare i colori dell'oggetto" msgid "Click the icon to shift this object to the bed" msgstr "Fare clic sull'icona per spostare l'oggetto sul piano" -msgid " search results" -msgstr "" - msgid "Loading file" msgstr "Caricamento file" @@ -1348,9 +1390,6 @@ msgstr "Inserisci un nuovo nome" msgid "Renaming" msgstr "Rinomina" -msgid "Repairing model object" -msgstr "Riparazione oggetto" - msgid "Following model object has been repaired" msgid_plural "Following model objects have been repaired" msgstr[0] "Il seguente oggetto del modello è stato riparato" @@ -1465,7 +1504,7 @@ msgid "Pause" msgstr "Pausa" msgid "Template" -msgstr "" +msgstr "Modello" msgid "Custom" msgstr "Personalizzato" @@ -1680,12 +1719,6 @@ msgstr "" msgid "Arranging..." msgstr "Disponendo..." -msgid "" -"Arrange failed. Found some exceptions when processing object geometries." -msgstr "" -"Disposizione fallita. Riscontrate eccezioni durante l'elaborazione delle " -"geometrie degli oggetti" - msgid "Arranging" msgstr "Disposizione" @@ -1701,6 +1734,12 @@ msgstr "" msgid "Arranging done." msgstr "Disposizione completata." +msgid "" +"Arrange failed. Found some exceptions when processing object geometries." +msgstr "" +"Disposizione fallita. Riscontrate eccezioni durante l'elaborazione delle " +"geometrie degli oggetti" + #, c-format, boost-format msgid "" "Arrangement ignored the following objects which can't fit into a single " @@ -1731,8 +1770,11 @@ msgstr "Orientamento..." msgid "Orienting" msgstr "Orientamento" -msgid "Filling bed " -msgstr "Riempi piano" +msgid "Orienting canceled." +msgstr "Orientamento annullato." + +msgid "Filling" +msgstr "Riempimento" msgid "Bed filling canceled." msgstr "Riempimento del piano annullato." @@ -1740,11 +1782,14 @@ msgstr "Riempimento del piano annullato." msgid "Bed filling done." msgstr "Riempimento del piano completato." -msgid "Error! Unable to create thread!" -msgstr "Errore. Impossibile creare il processo." +msgid "Searching for optimal orientation" +msgstr "Ricerca orientamento ottimale" -msgid "Exception" -msgstr "Eccezione" +msgid "Orientation search canceled." +msgstr "Ricerca orientamento annullata." + +msgid "Orientation found." +msgstr "Trovato orientamento." msgid "Logging in" msgstr "Accesso in corso..." @@ -1813,12 +1858,7 @@ msgid "Sending print job through cloud service" msgstr "Invia stampa tramite servizio cloud" msgid "Print task sending times out." -msgstr "" - -msgid "" -"The printer timed out while receiving a print job. Please check if the " -"network is functioning properly and send the print again." -msgstr "" +msgstr "Timeout dell'invio dell'attività di stampa." msgid "Service Unavailable" msgstr "Servizio non disponibile" @@ -1857,30 +1897,6 @@ msgid "An SD card needs to be inserted before sending to printer." msgstr "" "È necessario inserire una scheda microSD prima di inviarla alla stampante." -msgid "Choose SLA archive:" -msgstr "Seleziona l'archivio SLA:" - -msgid "Import file" -msgstr "Importa file" - -msgid "Import model and profile" -msgstr "Importa modello e profilo" - -msgid "Import profile only" -msgstr "Importa solo profilo" - -msgid "Import model only" -msgstr "Importa solo modello" - -msgid "Accurate" -msgstr "Accurato" - -msgid "Balanced" -msgstr "Bilanciato" - -msgid "Quick" -msgstr "Rapido" - msgid "Importing SLA archive" msgstr "Importa archivio SLA" @@ -2054,10 +2070,10 @@ msgid "You need to select the material type and color first." msgstr "Devi prima selezionare il tipo e il colore del materiale." msgid "Please input a valid value (K in 0~0.3)" -msgstr "" +msgstr "Immettere un valore valido (K in 0~0.3)" msgid "Please input a valid value (K in 0~0.3, N in 0.6~2.0)" -msgstr "" +msgstr "Immettere un valore valido (K in 0~0.3, N in 0.6~2.0)" msgid "Other Color" msgstr "Altro colore" @@ -2646,19 +2662,6 @@ msgstr "" "SÌ - Mantieni Prime Tower\n" "NO - Mantieni Altezza Supporto Layer indipendente" -#, boost-format -msgid "%1% infill pattern doesn't support 100%% density." -msgstr "La trama riempimento %1% non supporta il 100%% di densità." - -msgid "" -"Switch to rectilinear pattern?\n" -"Yes - switch to rectilinear pattern automaticlly\n" -"No - reset density to default non 100% value automaticlly" -msgstr "" -"Passare alla trama rettilinea?\n" -"Sì - passa automaticamente alla trama rettilinea\n" -"No - ripristina automaticamente la densità al valore predefinito non 100%" - msgid "" "While printing by Object, the extruder may collide skirt.\n" "Thus, reset the skirt layer to 1 to avoid that." @@ -2759,6 +2762,18 @@ msgstr "Messo in pausa dal Gcode inserito dall'utente" msgid "Motor noise showoff" msgstr "Messa in mostra del rumore del motore" +msgid "Nozzle filament covered detected pause" +msgstr "Rilevata copertura ugello filamento in pausa" + +msgid "Cutter error pause" +msgstr "Pausa errore fresa" + +msgid "First layer error pause" +msgstr "Errore Pausa primo livello" + +msgid "Nozzle clog pause" +msgstr "Pausa intasamento dell'ugello" + msgid "MC" msgstr "MC" @@ -2967,7 +2982,7 @@ msgid "Total" msgstr "Totale" msgid "Tower" -msgstr "" +msgstr "Torre" msgid "Total Estimation" msgstr "Stima totale" @@ -3063,10 +3078,10 @@ msgid "Print settings" msgstr "Impostazioni di stampa" msgid "Custom g-code" -msgstr "" +msgstr "G-code personalizzato" msgid "ToolChange" -msgstr "" +msgstr "Cambio utensile" msgid "Time Estimation" msgstr "Tempo stimato" @@ -3236,7 +3251,7 @@ msgstr "Volume:" msgid "Size:" msgstr "Dimensione:" -#, boost-format +#, c-format, boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -3523,10 +3538,10 @@ msgid "Import" msgstr "Importa" msgid "Export all objects as one STL" -msgstr "" +msgstr "Esporta tutti gli oggetti come un unico STL" msgid "Export all objects as STLs" -msgstr "" +msgstr "Esporta tutti gli oggetti come AWL" msgid "Export Generic 3MF" msgstr "Esporta 3mf generico" @@ -3615,6 +3630,18 @@ msgstr "Usa vista prospettica" msgid "Use Orthogonal View" msgstr "Usa vista ortogonale" +msgid "Show &G-code Window" +msgstr "Mostra la finestra del G-code" + +msgid "Show g-code window in Previce scene" +msgstr "Mostra finestra G-code nella scena di anteprima" + +msgid "Reset Window Layout" +msgstr "Ripristina layout finestra" + +msgid "Reset to default window layout" +msgstr "Ripristina il layout predefinito della finestra" + msgid "Show &Labels" msgstr "Mostra &Etichette" @@ -3997,13 +4024,18 @@ msgid "Downloading %d%%..." msgstr "Scaricamento %d%%..." msgid "Connection lost. Please retry." +msgstr "Connessione persa. Si prega di riprovare." + +msgid "The device cannot handle more conversations. Please retry later." msgstr "" +"Il dispositivo non è in grado di gestire più conversazioni. Riprova più " +"tardi." msgid "File not exists." -msgstr "" +msgstr "Il file non esiste." msgid "File checksum error. Please retry." -msgstr "" +msgstr "Errore di checksum del file. Si prega di riprovare." msgid "Not supported on the current printer version." msgstr "Non supportato nella versione corrente della stampante." @@ -4013,7 +4045,7 @@ msgstr "Memoria non disponibile, inserire la scheda SD." #, c-format, boost-format msgid "Error code: %d" -msgstr "" +msgstr "Codice errore: %d" msgid "Speed:" msgstr "Velocità:" @@ -4159,10 +4191,12 @@ msgstr "Layer: %s" msgid "Layer: %d/%d" msgstr "Layer: %d/%d" -msgid "Please heat the nozzle to above 170 degree before loading filament." +msgid "" +"Please heat the nozzle to above 170 degree before loading or unloading " +"filament." msgstr "" -"Riscaldare il nozzle a una temperatura superiore a 170 gradi prima di " -"caricare il filamento." +"Si prega di riscaldare l'ugello a oltre 170 gradi prima di caricare o " +"scaricare il filamento." msgid "Still unload" msgstr "Scarica ancora" @@ -4368,7 +4402,7 @@ msgid "Details" msgstr "Dettagli" msgid "New printer config available." -msgstr "" +msgstr "È disponibile una nuova configurazione della stampante." msgid "Wiki" msgstr "Wiki" @@ -4440,7 +4474,7 @@ msgid "Serious warning:" msgstr "Avvertimento serio:" msgid " (Repair)" -msgstr " (Repair)" +msgstr "(Ripara)" msgid " Click here to install it." msgstr "Clicca per installarlo." @@ -4526,8 +4560,8 @@ msgstr "Recupero automatico perdita passi" msgid "Allow Prompt Sound" msgstr "Consenti suono di richiesta" -msgid "Fliament Tangle Detect" -msgstr "" +msgid "Filament Tangle Detect" +msgstr "Rilevamento del groviglio del filamento" msgid "Global" msgstr "Globale" @@ -4624,7 +4658,7 @@ msgid "Set filaments to use" msgstr "Imposta filamenti da usare" msgid "Search plate, object and part." -msgstr "" +msgstr "Cerca piastra, oggetto e parte." msgid "" "No AMS filaments. Please select a printer in 'Device' page to load AMS info." @@ -4717,6 +4751,12 @@ msgstr "" "L'attivazione della fotografia timelapse tradizionale può causare " "imperfezioni della superficie. Si consiglia di passare alla modalità liscia." +msgid "Expand sidebar" +msgstr "Espandi barra laterale" + +msgid "Collapse sidebar" +msgstr "Riduci barra laterale" + #, c-format, boost-format msgid "Loading file: %s" msgstr "Caricamento file: %s" @@ -4735,31 +4775,6 @@ msgstr "" "Il 3mf è stato generato da una vecchia versione di Orca Slicer, caricando \n" "solo i dati geometrici." -#, c-format, boost-format -msgid "This slicer file version %s is newer than %s's version:" -msgstr "" - -msgid "" -"Would you like to update your Bambu Studio software to enable all " -"functionality in this slicer file?\n" -msgstr "" - -msgid "Newer 3mf version" -msgstr "Versione 3mf più recente" - -msgid "" -"you can always update Bambu Studio at your convenience. The slicer file will " -"now be loaded without full functionality." -msgstr "" - -#, c-format, boost-format -msgid "" -"This slicer file version %s is newer than %s's version.\n" -"\n" -"Would you like to update your Bambu Studio software to enable all " -"functionality in this slicer file?" -msgstr "" - msgid "Invalid values found in the 3mf:" msgstr "Valori non validi trovati in 3mf:" @@ -4768,25 +4783,33 @@ msgstr "Si prega di correggerli nella scheda dei Parametri" msgid "The 3mf has following modified G-codes in filament or printer presets:" msgstr "" +"Il 3mf ha i seguenti codici G modificati nei preset del filamento o della " +"stampante:" msgid "" "Please confirm that these modified G-codes are safe to prevent any damage to " "the machine!" msgstr "" +"Si prega di confermare che questi G-code modificati sono sicuri per evitare " +"danni alla macchina!" msgid "Modified G-codes" -msgstr "" +msgstr "G-code Modificati" msgid "The 3mf has following customized filament or printer presets:" msgstr "" +"Il 3mf ha i seguenti filamenti personalizzati o preimpostazioni della " +"stampante:" msgid "" "Please confirm that the G-codes within these presets are safe to prevent any " "damage to the machine!" msgstr "" +"Si prega di confermare che i G-code all'interno di queste preimpostazioni " +"sono sicuri per evitare danni alla macchina!" msgid "Customized Preset" -msgstr "" +msgstr "Preset personalizzato" msgid "Name of components inside step file is not UTF8 format!" msgstr "" @@ -4867,9 +4890,11 @@ msgid "" "The file %s already exists\n" "Do you want to replace it?" msgstr "" +"Il file %s esiste già\n" +"Vuoi sostituirlo?" msgid "Comfirm Save As" -msgstr "" +msgstr "Comfirm Salva con nome" msgid "Delete object which is a part of cut object" msgstr "Elimina l'oggetto che fa parte dell'oggetto tagliato" @@ -4999,6 +5024,9 @@ msgstr "" "L'importazione di Orca Slicer non è riuscita. Si prega di scaricare il file " "e importarlo manualmente." +msgid "Import SLA archive" +msgstr "Importa archivio SLA" + msgid "The selected file" msgstr "Il file selezionato" @@ -5082,6 +5110,18 @@ msgstr "" "Impossibile eseguire operazioni booleane sulle mesh del modello. Verranno " "esportate solo le parti positive." +msgid "" +"Are you sure you want to store original SVGs with their local paths into the " +"3MF file?\n" +"If you hit 'NO', all SVGs in the project will not be editable any more." +msgstr "" +"Sei sicuro di voler memorizzare gli SVG originali con i loro percorsi locali " +"nel file 3MF?\n" +"Se premi \"NO\", tutti gli SVG del progetto non saranno più modificabili." + +msgid "Private protection" +msgstr "Protezione privata" + msgid "Is the printer ready? Is the print sheet in place, empty and clean?" msgstr "" "La stampante è pronta? La piastra di stampa è in posizione, vuota e pulita?" @@ -5108,6 +5148,9 @@ msgstr "" "I supporti personalizzati e la pittura a colori sono stati rimossi prima " "della riparazione." +msgid "Optimize Rotation" +msgstr "Ottimizza rotazione" + msgid "Invalid number" msgstr "Numero non valido" @@ -5271,17 +5314,12 @@ msgstr "Mostra \"Suggerimento del giorno\" dopo l'avvio" msgid "If enabled, useful hints are displayed at startup." msgstr "Se abilitato, all'avvio vengono visualizzati suggerimenti utili." -msgid "Show g-code window" -msgstr "Mostra la finestra del codice g" - -msgid "If enabled, g-code window will be displayed." -msgstr "Se abilitato, verrà visualizzata la finestra del codice g." - msgid "Flushing volumes: Auto-calculate everytime the color changed." msgstr "" +"Volumi di Spurgo: Calcola automaticamente ogni volta che il colore cambia." msgid "If enabled, auto-calculate everytime the color changed." -msgstr "" +msgstr "Se abilitato, calcola automaticamente ogni volta che il colore cambia." msgid "Presets" msgstr "Preset" @@ -5342,7 +5380,7 @@ msgid "Clear my choice on the unsaved projects." msgstr "Cancella la mia scelta sui progetti non salvati." msgid "No warnings when loading 3MF with modified G-codes" -msgstr "" +msgstr "Nessun avviso durante il caricamento di 3MF con codici G modificati" msgid "Auto-Backup" msgstr "Backup automatico" @@ -5498,10 +5536,10 @@ msgid "Add/Remove materials" msgstr "Aggiungi/rimuovi materiali" msgid "Select/Remove printers(system presets)" -msgstr "" +msgstr "Seleziona/Rimuovi stampanti (preimpostazioni di sistema)" msgid "Create printer" -msgstr "" +msgstr "Creare una stampante" msgid "Incompatible" msgstr "Non compatibile" @@ -5581,7 +5619,7 @@ msgstr "Salva %s come" msgid "User Preset" msgstr "Preset utente" -msgid "Project Inside Preset" +msgid "Preset Inside Project" msgstr "Preset interno al Progetto" msgid "Name is invalid;" @@ -5656,6 +5694,9 @@ msgstr "Attività annullata" msgid "(LAN)" msgstr "(LAN)" +msgid "Search" +msgstr "Cerca" + msgid "My Device" msgstr "Mio dispositivo" @@ -5686,17 +5727,17 @@ msgstr "Bambu Cool Plate" msgid "PLA Plate" msgstr "Piastra PLA" -msgid "Bamabu Engineering Plate" +msgid "Bambu Engineering Plate" msgstr "Bambu Engineering Plate" -msgid "Bamabu Smooth PEI Plate" -msgstr "" +msgid "Bambu Smooth PEI Plate" +msgstr "Piastra Bambu Smooth PEI" msgid "High temperature Plate" msgstr "High Temperature Plate" -msgid "Bamabu Textured PEI Plate" -msgstr "" +msgid "Bambu Textured PEI Plate" +msgstr "Piastra PEI testurizzata Bambu" msgid "Send print job to" msgstr "Invia stampa a" @@ -5832,6 +5873,8 @@ msgstr "" msgid "" "Timelapse is not supported because Print sequence is set to \"By object\"." msgstr "" +"Timelapse non è supportato perché la sequenza di stampa è impostata su \"Per " +"oggetto\"." msgid "Errors" msgstr "Errori" @@ -5859,20 +5902,22 @@ msgstr "" #, c-format, boost-format msgid "nozzle in preset: %s %s" -msgstr "" +msgstr "Ugello in preset: %s %s" #, c-format, boost-format msgid "nozzle memorized: %.1f %s" -msgstr "" +msgstr "ugello memorizzato: %.1f %s" msgid "" "Your nozzle diameter in preset is not consistent with memorized nozzle " "diameter. Did you change your nozzle lately?" msgstr "" +"Il diametro dell'ugello preimpostato non è coerente con il diametro " +"dell'ugello memorizzato. Hai cambiato l'ugello ultimamente?" #, c-format, boost-format msgid "*Printing %s material with %s may cause nozzle damage" -msgstr "" +msgstr "*La stampa di materiale %s con %s può causare danni agli ugelli" msgid "" "Please click the confirm button if you still want to proceed with printing." @@ -5880,10 +5925,10 @@ msgstr "" "Fai clic sul pulsante di conferma se desideri continuare con la stampa." msgid "Hardened Steel" -msgstr "" +msgstr "Acciaio temprato" msgid "Stainless Steel" -msgstr "" +msgstr "Acciaio inox" msgid "" "Connecting to the printer. Unable to cancel during the connection process." @@ -5931,6 +5976,12 @@ msgstr "La stampante deve essere sulla stessa LAN di Orca Slicer." msgid "The printer does not support sending to printer SD card." msgstr "La stampante non supporta l'invio alla scheda microSD della stampante." +msgid "Slice ok." +msgstr "Slice completo" + +msgid "View all Daily tips" +msgstr "Visualizza tutti i consigli giornalieri" + msgid "Failed to create socket" msgstr "Impossibile creare il socket" @@ -6081,7 +6132,7 @@ msgstr "" "Tower?" msgid "Still print by object?" -msgstr "" +msgstr "Stampare ancora per oggetto?" msgid "" "We have added an experimental style \"Tree Slim\" that features smaller " @@ -6122,11 +6173,28 @@ msgstr "" "0 distanza z superiore , 0 spaziatura interfaccia, trama concentrico e " "disabilita altezza layer di supporto indipendente" +msgid "" +"Layer height exceeds the limit in Printer Settings -> Extruder -> Layer " +"height limits ,this may cause printing quality issues." +msgstr "" +"L'altezza dello strato supera il limite in Impostazioni stampante -> " +"Estrusore -> Limiti di altezza dello strato, ciò potrebbe causare problemi " +"di qualità di stampa." + +msgid "Adjust to the set range automatically? \n" +msgstr "Regolare automaticamente l'intervallo impostato? \n" + +msgid "Adjust" +msgstr "Rettifica" + +msgid "Ignore" +msgstr "Ignora" + msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" "Quando si registra un timelapse senza testa di satmpa, si consiglia di " "aggiungere un \"Timelapse Torre di pulizia\"\n" @@ -6145,6 +6213,15 @@ msgstr "Precisione" msgid "Wall generator" msgstr "Generatore parete" +msgid "Walls and surfaces" +msgstr "Pareti e superfici" + +msgid "Bridging" +msgstr "Bridging" + +msgid "Overhangs" +msgstr "Sporgenze" + msgid "Walls" msgstr "Pareti" @@ -6183,7 +6260,7 @@ msgid "Acceleration" msgstr "Accelerazione" msgid "Jerk(XY)" -msgstr "Scatto (XY)" +msgstr "Jerk(XY)" msgid "Raft" msgstr "Raft" @@ -6342,7 +6419,7 @@ msgstr "" "tempo layer stimato è inferiore al valore di soglia." msgid "Auxiliary part cooling fan" -msgstr "Auxiliary part cooling fan" +msgstr "Ventola di raffreddamento della parte ausiliaria" msgid "Exhaust fan" msgstr "Aspiratore" @@ -6354,13 +6431,13 @@ msgid "Complete print" msgstr "Stampa completa" msgid "Filament start G-code" -msgstr "G-code avvio filamento" +msgstr "G-code Iniziale Filamento" msgid "Filament end G-code" -msgstr "Filament end G-code" +msgstr "G-code Finale Filamento" msgid "Multimaterial" -msgstr "Apertura pittura multimateriale" +msgstr "Multimateriale" msgid "Wipe tower parameters" msgstr "Parametri torre di pulitura" @@ -6384,28 +6461,28 @@ msgid "Fan speed-up time" msgstr "Tempo di accelerazione della ventola" msgid "Extruder Clearance" -msgstr "Spazio estrusore" +msgstr "Ingombro estrusore" msgid "Accessory" msgstr "Accessori" msgid "Machine gcode" -msgstr "Machine G-code" +msgstr "Macchina G-code" msgid "Machine start G-code" -msgstr "Machine start G-code" +msgstr "G-code avvio della macchina" msgid "Machine end G-code" -msgstr "Machine end G-code" +msgstr "Fine G-code" msgid "Printing by object G-code" -msgstr "" +msgstr "Stampa per oggetto G-code" msgid "Before layer change G-code" msgstr "G-code prima del cambio layer" msgid "Layer change G-code" -msgstr "Layer change G-code" +msgstr "G-code cambio layer" msgid "Time lapse G-code" msgstr "Time lapse G-code" @@ -6417,7 +6494,7 @@ msgid "Change extrusion role G-code" msgstr "Modificare il codice G del ruolo di estrusione" msgid "Pause G-code" -msgstr "Pause G-code" +msgstr "G-code Pausa" msgid "Template Custom G-code" msgstr "Modello G-code personalizzato" @@ -6476,14 +6553,17 @@ msgid "" "%d Filament Preset and %d Process Preset is attached to this printer. Those " "presets would be deleted if the printer is deleted." msgstr "" +"%d Preimpostazione filamento (Filament Preset) e %d Process Preset ( Process " +"Preset sono collegate a questa stampante. Tali impostazioni predefinite " +"verranno eliminate se la stampante viene eliminata." msgid "Presets inherited by other presets can not be deleted!" -msgstr "" +msgstr "I preset ereditati da altri preset non possono essere eliminati!" msgid "The following presets inherit this preset." msgid_plural "The following preset inherits this preset." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "I seguenti predefiniti ereditano questo predefinito." +msgstr[1] "I seguenti predefiniti ereditano questo predefinito." #. TRN Remove/Delete #, boost-format @@ -6495,6 +6575,15 @@ msgid_plural "Following presets will be deleted too." msgstr[0] "Verrà eliminato anche il seguente preset:" msgstr[1] "The following presets will be deleted too:" +msgid "" +"Are you sure to delete the selected preset? \n" +"If the preset corresponds to a filament currently in use on your printer, " +"please reset the filament information for that slot." +msgstr "" +"Sei sicuro di voler eliminare il preset selezionato? \n" +"Se la preimpostazione corrisponde a un filamento attualmente in uso sulla " +"stampante, reimpostare le informazioni sul filamento per tale slot." + #, boost-format msgid "Are you sure to %1% the selected preset?" msgstr "Sei sicuro di voler %1% il preset selezionato?" @@ -6523,7 +6612,7 @@ msgstr "Indefinito" msgid "Unsaved Changes" msgstr "Modifiche non salvate" -msgid "Discard or Keep changes" +msgid "Transfer or discard changes" msgstr "Scarta o mantieni le modifiche" msgid "Old Value" @@ -6751,20 +6840,18 @@ msgstr "Larghezza della linea di Ramming" msgid "Ramming line spacing" msgstr "Spaziatura tra linee di ramming" -msgid "Auto-Calc" -msgstr "Calcolo automatico" - -msgid "Re-calculate" -msgstr "" +msgid "Recalculate" +msgstr "Ricalcola" msgid "Flushing volumes for filament change" msgstr "Volumi di spurgo per il cambio filamento" msgid "" -"Studio would re-calculate your flushing volumes everytime the filaments " -"color changed. You could disable the auto-calculate in Bambu Studio > " -"Preferences" +"Orca recalculates your flushing volumes everytime the filament colors " +"change. You can change this behavior in Preferences." msgstr "" +"Orca ricalcola i volumi di risciacquo ogni volta che i colori del filamento " +"cambiano. È possibile modificare questo comportamento in Preferenze." msgid "Flushing volume (mm³) for each filament pair." msgstr "Volume di spurgo (mm³) per ogni coppia di filamento." @@ -6780,15 +6867,6 @@ msgstr "Il moltiplicatore deve essere compreso nell'intervallo [%.2f, %.2f]." msgid "Multiplier" msgstr "Moltiplicatore" -msgid "unloaded" -msgstr "scaricato" - -msgid "loaded" -msgstr "caricato" - -msgid "Filament #" -msgstr "Filamento #" - msgid "From" msgstr "Da" @@ -6796,10 +6874,10 @@ msgid "To" msgstr "A" msgid "Bambu Network plug-in not detected." -msgstr "" +msgstr "Plug-in di rete Bambu non rilevato." msgid "Click here to download it." -msgstr "" +msgstr "Clicca qui per scaricarlo." msgid "Login" msgstr "Login" @@ -6839,7 +6917,7 @@ msgstr "" "3Dconnexion" msgid "Switch table page" -msgstr "" +msgstr "Cambia pagina tabella" msgid "Show keyboard shortcuts list" msgstr "Mostra elenco scorciatoie di tastiera" @@ -7097,13 +7175,13 @@ msgid "New version of Orca Slicer" msgstr "Nuova versione di Orca Slicer" msgid "Skip this Version" -msgstr "" +msgstr "Salta questa versione" msgid "Done" msgstr "Fine" msgid "Confirm and Update Nozzle" -msgstr "" +msgstr "Conferma e aggiorna l'ugello" msgid "LAN Connection Failed (Sending print file)" msgstr "Connessione LAN fallita (invio del file di stampa)" @@ -7131,20 +7209,24 @@ msgstr "Dove trovo l'IP e il codice accesso della stampante?" msgid "Step 3: Ping the IP address to check for packet loss and latency." msgstr "" +"Passaggio 3: eseguire il ping dell'indirizzo IP per verificare la perdita di " +"pacchetti e la latenza." msgid "Test" msgstr "Test" msgid "IP and Access Code Verified! You may close the window" -msgstr "" +msgstr "IP e codice di accesso verificati! È possibile chiudere la finestra" msgid "Connection failed, please double check IP and Access Code" -msgstr "" +msgstr "Connessione non riuscita, ricontrolla l'IP e il codice di accesso" msgid "" "Connection failed! If your IP and Access Code is correct, \n" "please move to step 3 for troubleshooting network issues" msgstr "" +"Connessione non riuscita! Se l'IP e il codice di accesso sono corretti, \n" +"Passare al passaggio 3 per la risoluzione dei problemi di rete" msgid "Model:" msgstr "Modello:" @@ -7164,6 +7246,9 @@ msgstr "Stampa" msgid "Idle" msgstr "Inattivo" +msgid "Beta version" +msgstr "" + msgid "Latest version" msgstr "Ultima versione" @@ -7190,8 +7275,8 @@ msgid "" msgstr "" "È stato rilevato un aggiornamento importante che deve essere eseguito prima " "che la stampa possa continuare. Si desidera aggiornare ora? È possibile " -"effettuare l'aggiornamento anche in un secondo momento da \"Aggiorna " -"firmware\"." +"effettuare l'aggiornamento anche in un secondo momento da \"Aggiorna firmware" +"\"." msgid "" "The firmware version is abnormal. Repairing and updating are required before " @@ -7546,6 +7631,33 @@ msgstr "" msgid "Variable layer height is not supported with Organic supports." msgstr "Layer ad altezza variabile non è compatibile con i Supporti Organici." +msgid "" +"Different nozzle diameters and different filament diameters is not allowed " +"when prime tower is enabled." +msgstr "" +"Diametri degli ugelli diversi e diametri di filamento diversi non sono " +"consentiti quando la torre Prime è abilitata." + +msgid "" +"The Wipe Tower is currently only supported with the relative extruder " +"addressing (use_relative_e_distances=1)." +msgstr "" +"Attualmente la Torre di pulitura è supportata solo con l'indirizzamento " +"relativo dell'estrusore (use_relative_e_distances = 1)." + +msgid "" +"Ooze prevention is currently not supported with the prime tower enabled." +msgstr "" +"La prevenzione delle perdite (ooze prevention) attualmente non è supportata " +"quando è abilitata la torre di priming." + +msgid "" +"The prime tower is currently only supported for the Marlin, RepRap/Sprinter, " +"RepRapFirmware and Repetier G-code flavors." +msgstr "" +"La torre di spurgo è attualmente supportata solo per le versioni Marlin, " +"RepRap/Sprinter, RepRapFirmware e Repetier G-code." + msgid "The prime tower is not supported in \"By object\" print." msgstr "La Prime Tower non è supportata nella stampa \"Per oggetto\"." @@ -7629,11 +7741,6 @@ msgstr "" msgid "Layer height cannot exceed nozzle diameter" msgstr "L'altezza del layer non può superare il diametro del nozzle." -msgid "" -"Layer height cannot exceed the limit in Printer Settings -> Extruder -> " -"Layer height limits" -msgstr "" - msgid "" "Relative extruder addressing requires resetting the extruder position at " "each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to " @@ -7674,7 +7781,7 @@ msgid "Failed processing of the filename_format template." msgstr "Processing of the filename_format template failed." msgid "Printable area" -msgstr "Printable area" +msgstr "Area di stampa" msgid "Bed exclude area" msgstr "Zona piano esclusa" @@ -7737,6 +7844,14 @@ msgstr "" "È l'altezza massima stampabile, limitata dall'altezza dell'area di " "costruzione." +msgid "Preferred orientation" +msgstr "Orientamento preferito" + +msgid "Automatically orient stls on the Z-axis upon initial import" +msgstr "" +"Orienta automaticamente gli stl sull'asse Z al momento dell'importazione " +"iniziale" + msgid "Printer preset names" msgstr "Nomi dei preset della stampante" @@ -7932,7 +8047,7 @@ msgstr "" "Questo G-code viene inserito ad ogni cambio layer prima del sollevamento z." msgid "Bottom shell layers" -msgstr "Layer inferiori guscio" +msgstr "Layer guscio inferiore" msgid "" "This is the number of solid layers of bottom shell, including the bottom " @@ -7962,7 +8077,7 @@ msgstr "" "dal numero di layers del guscio inferiore." msgid "Force cooling for overhang and bridge" -msgstr "Force cooling for overhangs and bridges" +msgstr "Forzare il raffreddamento per sbalzi e ponti" msgid "" "Enable this option to optimize part cooling fan speed for overhang and " @@ -8020,7 +8135,7 @@ msgstr "" "Densità di ponti esterni. 100% significa solido ponte. L'impostazione " "predefinita è al 100%." -msgid "Bridge flow" +msgid "Bridge flow ratio" msgstr "Flusso del Bridge" msgid "" @@ -8030,6 +8145,19 @@ msgstr "" "Diminuire leggermente questo valore (ad esempio 0.9) per ridurre la quantità " "di materiale per il ponte e migliorare l'abbassamento dello stesso" +msgid "Internal bridge flow ratio" +msgstr "Rapporto Flusso del ponte interno" + +msgid "" +"This value governs the thickness of the internal bridge layer. This is the " +"first layer over sparse infill. Decrease this value slightly (for example " +"0.9) to improve surface quality over sparse infill." +msgstr "" +"Questo valore governa lo spessore dello strato di ponte interno. Questo è il " +"primo strato sopra il riempimento sparso. Riduci leggermente questo valore " +"(ad esempio 0.9) per migliorare la qualità della superficie sopra il " +"riempimento sparso." + msgid "Top surface flow ratio" msgstr "Rapporto di portata superficiale superiore" @@ -8042,7 +8170,7 @@ msgstr "" "superficiale liscia" msgid "Bottom surface flow ratio" -msgstr "Rapporto di flusso superficiale del fondo" +msgstr "Rapporto di flusso della superficie inferiore" msgid "This factor affects the amount of material for bottom solid infill" msgstr "" @@ -8056,7 +8184,7 @@ msgid "" "Improve shell precision by adjusting outer wall spacing. This also improves " "layer consistency." msgstr "" -"Migliora la precisione dei proiettili regolando la spaziatura delle pareti " +"Migliora la precisione del guscio regolando la spaziatura delle pareti " "esterne. Questo migliora anche la consistenza degli strati." msgid "Only one wall on top surfaces" @@ -8070,7 +8198,7 @@ msgstr "" "riempimento superiore" msgid "One wall threshold" -msgstr "Una soglia da parete" +msgstr "Soglia a una parete" #, c-format, boost-format msgid "" @@ -8127,9 +8255,15 @@ msgid "" "This setting can also help reduce part warping due to the reduction of " "stresses in the part walls." msgstr "" +"Estrudere i perimetri che hanno una parte su una sporgenza in direzione " +"inversa su layer dispari. Questo schema alternato può migliorare " +"drasticamente gli strapiombi ripidi.\n" +"\n" +"Questa impostazione può anche contribuire a ridurre la deformazione della " +"parte grazie alla riduzione delle sollecitazioni nelle pareti della parte." msgid "Reverse only internal perimeters" -msgstr "" +msgstr "Inversione solo perimetri interni" msgid "" "Apply the reverse perimeters logic only on internal perimeters. \n" @@ -8145,6 +8279,20 @@ msgid "" "Reverse Threshold to 0 so that all internal walls print in alternating " "directions on odd layers irrespective of their overhang degree." msgstr "" +"Applicare la logica dei perimetri inversi solo ai perimetri interni. \n" +"\n" +"Questa impostazione riduce notevolmente le sollecitazioni delle parti poiché " +"ora sono distribuite in direzioni alternate. Ciò dovrebbe ridurre la " +"deformazione delle parti mantenendo al contempo la qualità delle pareti " +"esterne. Questa caratteristica può essere molto utile per materiali soggetti " +"a deformazione, come ABS/ASA, e anche per filamenti elastici, come TPU e " +"Silk PLA. Può anche aiutare a ridurre la deformazione sulle regioni " +"fluttuanti sui supporti.\n" +"\n" +"Affinché questa impostazione sia la più efficace, si consiglia di impostare " +"la soglia inversa su 0 in modo che tutte le pareti interne vengano stampate " +"in direzioni alternate sugli strati dispari, indipendentemente dal loro " +"grado di sporgenza." msgid "Reverse threshold" msgstr "Soglia inversa" @@ -8226,7 +8374,7 @@ msgstr "" "automaticamente." msgid "Brim-object gap" -msgstr "Brim-object gap" +msgstr "Distanza Brim-Oggetto " msgid "" "A gap between innermost brim line and object can make brim be removed more " @@ -8388,6 +8536,18 @@ msgstr "" "maggiori, ma potrebbero avere un aspetto peggiore. Se disattivato, i ponti " "hanno un aspetto migliore ma sono affidabili solo per distanze più brevi." +msgid "Thick internal bridges" +msgstr "Ponti interni spessi" + +msgid "" +"If enabled, thick internal bridges will be used. It's usually recommended to " +"have this feature turned on. However, consider turning it off if you are " +"using large nozzles." +msgstr "" +"Se abilitato, verranno utilizzati ponti interni spessi. Di solito si " +"consiglia di attivare questa funzione. Tuttavia, considera di disattivarlo " +"se stai utilizzando ugelli di grandi dimensioni." + msgid "Max bridge length" msgstr "Lunghezza massima Bridge" @@ -8407,12 +8567,14 @@ msgid "End G-code when finish the whole printing" msgstr "Aggiungi G-code quando si termina l'intera stampa." msgid "Between Object Gcode" -msgstr "" +msgstr "Tra Gcode oggetto" msgid "" "Insert Gcode between objects. This parameter will only come into effect when " "you print your models object by object" msgstr "" +"Inserire Gcode tra gli oggetti. Questo parametro avrà effetto solo quando si " +"stampano i modelli oggetto per oggetto" msgid "End G-code when finish the printing of this filament" msgstr "Aggiungi G-code quando si termina la stampa di questo filamento." @@ -8471,7 +8633,7 @@ msgid "Internal solid infill pattern" msgstr "Schema di riempimento solido interno" msgid "" -"Line pattern of internal solid infill. if the detect nattow internal solid " +"Line pattern of internal solid infill. if the detect narrow internal solid " "infill be enabled, the concentric pattern will be used for the small area." msgstr "" "Modello di linea del riempimento solido interno. Se l'opzione Rileva " @@ -8516,26 +8678,89 @@ msgstr "" "In questo modo viene impostata la soglia per la lunghezza del perimetro " "ridotta. La soglia predefinita è 0 mm" -msgid "Order of walls" -msgstr "" +msgid "Walls printing order" +msgstr "Ordine Stampa Pareti" -msgid "Print sequence of inner wall and outer wall. " +msgid "" +"Print sequence of the internal (inner) and external (outer) walls. \n" +"\n" +"Use Inner/Outer for best overhangs. This is because the overhanging walls " +"can adhere to a neighouring perimeter while printing. However, this option " +"results in slightly reduced surface quality as the external perimeter is " +"deformed by being squashed to the internal perimeter.\n" +"\n" +"Use Inner/Outer/Inner for the best external surface finish and dimensional " +"accuracy as the external wall is printed undisturbed from an internal " +"perimeter. However, overhang performance will reduce as there is no internal " +"perimeter to print the external wall against. This option requires a minimum " +"of 3 walls to be effective as it prints the internal walls from the 3rd " +"perimeter onwards first, then the external perimeter and, finally, the first " +"internal perimeter. This option is recomended against the Outer/Inner option " +"in most cases. \n" +"\n" +"Use Outer/Inner for the same external wall quality and dimensional accuracy " +"benefits of Inner/Outer/Inner option. However, the z seams will appear less " +"consistent as the first extrusion of a new layer starts on a visible " +"surface.\n" +"\n" +" " msgstr "" +"Sequenza di stampa delle pareti interne (interne) ed esterne (esterne). \n" +"\n" +"Utilizzare Interno/Esterno per le migliori sporgenze. Questo perché le " +"pareti sporgenti possono aderire a un perimetro vicino durante la stampa. " +"Tuttavia, questa opzione comporta una qualità della superficie leggermente " +"ridotta poiché il perimetro esterno viene deformato dall'essere schiacciato " +"sul perimetro interno.\n" +"\n" +"Utilizzare Interno/Esterno/Interno per ottenere la migliore finitura " +"superficiale esterna e precisione dimensionale poiché la parete esterna " +"viene stampata indisturbata da un perimetro interno. Tuttavia, le " +"prestazioni di sporgenza si ridurranno in quanto non c'è un perimetro " +"interno contro cui stampare la parete esterna. Questa opzione richiede un " +"minimo di 3 pareti per essere efficace in quanto stampa prima le pareti " +"interne dal 3° perimetro in poi, poi il perimetro esterno e, infine, il " +"primo perimetro interno. Nella maggior parte dei casi, questa opzione è " +"consigliata rispetto all'opzione Esterno/Interno. \n" +"\n" +"Utilizzare Esterno/Interno per ottenere la stessa qualità della parete " +"esterna e gli stessi vantaggi di precisione dimensionale dell'opzione " +"Interno/Esterno/Interno. Tuttavia, le giunzioni z appariranno meno coerenti " +"quando la prima estrusione di un nuovo livello inizia su una superficie " +"visibile.\n" +" " -msgid "inner/outer" -msgstr "" +msgid "Inner/Outer" +msgstr "Interno/Esterno" -msgid "outer/inner" -msgstr "" +msgid "Outer/Inner" +msgstr "Esterno/Interno" -msgid "inner wall/outer wall/inner wall" -msgstr "" +msgid "Inner/Outer/Inner" +msgstr "Interna/Esterna/Interna" msgid "Print infill first" -msgstr "" +msgstr "Stampa prima il riempimento" -msgid "Order of wall/infill. false means print wall first. " +msgid "" +"Order of wall/infill. When the tickbox is unchecked the walls are printed " +"first, which works best in most cases.\n" +"\n" +"Printing walls first may help with extreme overhangs as the walls have the " +"neighbouring infill to adhere to. However, the infill will slighly push out " +"the printed walls where it is attached to them, resulting in a worse " +"external surface finish. It can also cause the infill to shine through the " +"external surfaces of the part." msgstr "" +"Ordine di parete/tamponamento. Quando la casella di controllo è " +"deselezionata, i muri vengono stampati per primi, il che funziona meglio " +"nella maggior parte dei casi.\n" +"\n" +"La stampa delle pareti può aiutare con sporgenze estreme poiché le pareti " +"hanno il riempimento vicino a cui aderire. Tuttavia, il riempimento spingerà " +"leggermente fuori le pareti stampate dove è attaccato ad esse, con " +"conseguente peggioramento della finitura superficiale esterna. Può anche far " +"brillare il riempimento attraverso le superfici esterne della parte." msgid "Height to rod" msgstr "Altezza asta" @@ -8885,7 +9110,7 @@ msgstr "" "supporto e le interfacce di supporto." msgid "Softening temperature" -msgstr "Temperatura di rammollimento" +msgstr "Temperatura di ammorbidimento" msgid "" "The material softens at this temperature, so when the bed temperature is " @@ -8928,11 +9153,13 @@ msgstr "" msgid "Sparse infill density" msgstr "Densità riempimento" -#, c-format -msgid "Density of internal sparse infill, 100% means solid throughout" +msgid "" +"Density of internal sparse infill, 100% turns all sparse infill into solid " +"infill and internal solid infill pattern will be used" msgstr "" -"Questa è la densità del riempimento interno. 100%% significa che l'oggetto " -"sarà in ogni sua parte." +"Verrà utilizzato la densità di riempimento interno sparsi, il 100% " +"trasforma tutto il riempimento sparso e il modello di riempimento solido " +"interno" msgid "Sparse infill pattern" msgstr "Trama riempimento" @@ -9146,7 +9373,7 @@ msgid "Speed of solid infill part of initial layer" msgstr "E' la velocità per le parti di riempimento solido del primo layer." msgid "Initial layer travel speed" -msgstr "Velocità di traslazione dello strato iniziale" +msgstr "Velocità di spostamento del primo strato" msgid "Travel speed of initial layer" msgstr "Velocità di traslazione dello strato iniziale" @@ -9174,17 +9401,16 @@ msgstr "Massima velocità della ventola al layer" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " -"than \"close_fan_the_first_x_layers\", in which case the fan will be running " -"at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower than " +"\"close_fan_the_first_x_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." msgstr "" "La velocità della ventola aumenterà linearmente da zero al livello " -"\"close_fan_the_first_x_layers\" al massimo al livello " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" verrà ignorato se " -"inferiore a \"close_fan_the_first_x_layers\", nel qual caso la ventola " -"funzionerà alla massima velocità consentita al livello " -"\"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" al massimo al livello \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" verrà ignorato se inferiore a " +"\"close_fan_the_first_x_layers\", nel qual caso la ventola funzionerà alla " +"massima velocità consentita al livello \"close_fan_the_first_x_layers\" + 1." msgid "Support interface fan speed" msgstr "Supporta la velocità della ventola dell'interfaccia" @@ -9240,6 +9466,12 @@ msgid "" msgstr "" "La distanza media tra i punti casuali introdotti su ogni segmento di linea" +msgid "Apply fuzzy skin to first layer" +msgstr "Applicare la pelle sfocata sul primo strato" + +msgid "Whether to apply fuzzy skin on the first layer" +msgstr "Se applicare la Superficie Crespa ( fuzzy skin) sul primo strato" + msgid "Filter out tiny gaps" msgstr "Filtra i piccoli spazi vuoti" @@ -9399,7 +9631,7 @@ msgstr "" "Impostare su 0 per disattivare." msgid "Time cost" -msgstr "Costo in termini di tempo" +msgstr "Costo orario" msgid "The printer cost per hour" msgstr "Il costo orario della stampante" @@ -9517,16 +9749,20 @@ msgstr "" "solubili manuali" msgid "Maximum width of a segmented region" -msgstr "" +msgstr "Larghezza massima di una regione segmentata" msgid "Maximum width of a segmented region. Zero disables this feature." msgstr "" +"Larghezza massima di una regione segmentata. Il valore zero disattiva questa " +"caratteristica." msgid "Interlocking depth of a segmented region" -msgstr "" +msgstr "Profondità di incastro di una regione segmentata" msgid "Interlocking depth of a segmented region. Zero disables this feature." msgstr "" +"Profondità di incastro di una regione segmentata. Zero disabilita questa " +"funzione." msgid "Ironing Type" msgstr "Tipo di stiratura" @@ -9739,7 +9975,7 @@ msgstr "" "limitare l'altezza massima del layer quando è abilitato il layer adattativo." msgid "Extrusion rate smoothing" -msgstr "Levigatura della velocità di estrusione" +msgstr "Lisciatura del tasso di estrusione" msgid "" "This parameter smooths out sudden extrusion rate changes that happen when " @@ -9983,14 +10219,14 @@ msgid "User can self-define the project file name when export" msgstr "" "Gli utenti possono decidere i nomi dei file progetto nell'esportazione." -msgid "Make overhang printable" +msgid "Make overhangs printable" msgstr "Rendi stampabile la sporgenza" msgid "Modify the geometry to print overhangs without support material." msgstr "" "Modificare la geometria per stampare sporgenze senza materiale di supporto." -msgid "Make overhang printable maximum angle" +msgid "Make overhangs printable - Maximum angle" msgstr "Rendi la sporgenza stampabile angolo massimo" msgid "" @@ -10002,7 +10238,7 @@ msgstr "" "sporgenze più ripide.90° non cambierà affatto il modello e consentirà alcuna " "sporgenza, mentre 0 sostituirà tutte le sporgenze con materiale conico." -msgid "Make overhang printable hole area" +msgid "Make overhangs printable - Hole area" msgstr "Rendere stampabile l'area del foro sporgente" msgid "" @@ -10160,20 +10396,25 @@ msgstr "" "sollevare z può evitare che si stringano." msgid "Z hop lower boundary" -msgstr "" +msgstr "Limite inferiore dell'hop Z" msgid "" "Z hop will only come into effect when Z is above this value and is below the " "parameter: \"Z hop upper boundary\"" msgstr "" +"L'hop Z avrà effetto solo quando Z è al di sopra di questo valore e si trova " +"al di sotto del parametro: \"Limite superiore dell'hop Z\"" msgid "Z hop upper boundary" -msgstr "" +msgstr "Limite superiore dell'hop Z" msgid "" "If this value is positive, Z hop will only come into effect when Z is above " "the parameter: \"Z hop lower boundary\" and is below this value" msgstr "" +"Se questo valore è positivo, l'hop Z avrà effetto solo quando Z si trova al " +"di sopra del parametro: \"Z hop lower boundary\" ed è al di sotto di questo " +"valore" msgid "Z hop type" msgstr "Tipo Z Hop" @@ -10274,6 +10515,9 @@ msgstr "" msgid "Show auto-calibration marks" msgstr "Mostra segni di autocalibrazione" +msgid "Disable set remaining print time" +msgstr "Disabilita il tempo di stampa rimanente impostato" + msgid "Seam position" msgstr "Posizione della cucitura" @@ -10318,7 +10562,7 @@ msgstr "" "è 10%." msgid "Role base wipe speed" -msgstr "Velocità di cancellazione della base dei ruoli" +msgstr "Wipe Speed" msgid "" "The wipe speed is determined by the speed of the current extrusion role.e.g. " @@ -10375,7 +10619,7 @@ msgstr "" "Questo è il numero di loop per lo skirt. 0 indica che lo skirt è disattivata." msgid "Skirt speed" -msgstr "Velocità del pannello esterno" +msgstr "Velocità Skirt " msgid "Speed of skirt, in mm/s. Zero means use default layer extrusion speed." msgstr "" @@ -10424,6 +10668,26 @@ msgstr "" "e trasforma un modello solido in una stampa a parete singola con layers " "inferiori solidi. Il modello finale generato non presenta alcuna giunzione." +msgid "Smooth Spiral" +msgstr "Spirale liscia" + +msgid "" +"Smooth Spiral smoothes out X and Y moves as wellresulting in no visible seam " +"at all, even in the XY directions on walls that are not vertical" +msgstr "" +"Smooth Spiral leviga anche i movimenti X e Y, senza alcuna cucitura " +"visibile, anche nelle direzioni XY su pareti che non sono verticali" + +msgid "Max XY Smoothing" +msgstr "Levigatura Max XY" + +msgid "" +"Maximum distance to move points in XY to try to achieve a smooth spiralIf " +"expressed as a %, it will be computed over nozzle diameter" +msgstr "" +"Distanza massima per spostare i punti in XY per cercare di ottenere una " +"spirale uniformeSe espressa come %, verrà calcolata sul diametro dell'ugello" + msgid "" "If smooth or traditional mode is selected, a timelapse video will be " "generated for each print. After each layer is printed, a snapshot is taken " @@ -10647,11 +10911,14 @@ msgstr "" "non viene utilizzato alcun filamento specifico per il supporto e viene " "utilizzato il filamento corrente" -msgid "No interface filament for body" -msgstr "" +msgid "Avoid interface filament for base" +msgstr "Ridurre il filamento di interfaccia per la base" -msgid "Don't use support interface filament to print support body" +msgid "" +"Avoid using support interface filament to print support base if possible." msgstr "" +"Evitare l'uso del filamento dell'interfaccia di supporto per stampare la " +"base di supporto" msgid "" "Line width of support. If expressed as a %, it will be computed over the " @@ -10690,10 +10957,10 @@ msgid "Bottom interface layers" msgstr "Layer inferiori di interfaccia " msgid "Number of bottom interface layers" -msgstr "" +msgstr "Numero di livelli di interfaccia inferiori" msgid "Same as top" -msgstr "" +msgstr "Come quello superiore" msgid "Top interface spacing" msgstr "Spaziatura interfaccia superiore" @@ -10702,7 +10969,7 @@ msgid "Spacing of interface lines. Zero means solid interface" msgstr "Spaziatura linee interfaccia. 0 significa interfaccia solida" msgid "Bottom interface spacing" -msgstr "Spaziatura inferiore interfaccia" +msgstr "Spaziatura interfaccia inferiore" msgid "Spacing of bottom interface lines. Zero means solid interface" msgstr "Spaziatura linee interfaccia di fondo. 0 significa interfaccia solida" @@ -10930,11 +11197,11 @@ msgstr "" "diametro verranno stampate con pareti doppie per garantire la stabilità. " "Imposta questo valore a zero per non avere pareti doppie." -msgid "Tree support wall loops" -msgstr "Loop parete supporto ad albero" +msgid "Support wall loops" +msgstr "Loop parete supporto" -msgid "This setting specify the count of walls around tree support" -msgstr "Questa specifica il numero di pareti attorno al supporto ad albero." +msgid "This setting specify the count of walls around support" +msgstr "Questa impostazione specifica il numero di pareti intorno al supporto" msgid "Tree support with infill" msgstr "Riempimento supporti ad albero" @@ -11066,10 +11333,27 @@ msgid "Wipe Distance" msgstr "Distanza pulizia" msgid "" -"Discribe how long the nozzle will move along the last path when retracting" +"Discribe how long the nozzle will move along the last path when " +"retracting. \n" +"\n" +"Depending on how long the wipe operation lasts, how fast and long the " +"extruder/filament retraction settings are, a retraction move may be needed " +"to retract the remaining filament. \n" +"\n" +"Setting a value in the retract amount before wipe setting below will perform " +"any excess retraction before the wipe, else it will be performed after." msgstr "" -"Descrive per quanto tempo il nozzle si muoverà lungo l'ultimo percorso " -"mentre si ritrae." +"Scrivi per quanto tempo l'ugello si sposterà lungo l'ultimo percorso quando " +"si ritrae. \n" +"\n" +"A seconda della durata dell'operazione di pulizia, della velocità e della " +"durata delle impostazioni di retrazione dell'estrusore/filamento, potrebbe " +"essere necessario un movimento di retrazione per ritrarre il filamento " +"rimanente. \n" +"\n" +"L'impostazione di un valore nella quantità di retrazione prima della " +"cancellazione di seguito eseguirà qualsiasi retrazione in eccesso prima " +"della cancellazione, altrimenti verrà eseguita dopo." msgid "" "The wiping tower can be used to clean up the residue on the nozzle and " @@ -11423,10 +11707,6 @@ msgstr "" msgid "invalid value " msgstr "Valore non valido" -#, c-format, boost-format -msgid " doesn't work at 100%% density " -msgstr " Non funziona con una densità del 100%%" - msgid "Invalid value when spiral vase mode is enabled: " msgstr "Valore non valido quando la modalità vaso a spirale è abilitata:" @@ -11711,7 +11991,7 @@ msgstr "Il nome non può essere vuoto." #, c-format, boost-format msgid "The selected preset: %s is not found." -msgstr "" +msgstr "Il preset selezionato: %s non è stato trovato." msgid "The name cannot be the same as the system preset name." msgstr "" @@ -12416,12 +12696,855 @@ msgstr "Partita #2" msgid "Delete input" msgstr "Eliminare l'input" +msgid "Network Test" +msgstr "网络测试" + +msgid "Start Test Multi-Thread" +msgstr "Avvia test multi-thread" + +msgid "Start Test Single-Thread" +msgstr "Avvia test a thread singolo" + +msgid "Export Log" +msgstr "Esporta Log" + +msgid "Studio Version:" +msgstr "Versione Studio:" + +msgid "System Version:" +msgstr "Versione del sistema:" + +msgid "DNS Server:" +msgstr "Server DNS:" + +msgid "Test BambuLab" +msgstr "Test BambuLab" + +msgid "Test BambuLab:" +msgstr "Test BambuLab:" + +msgid "Test Bing.com" +msgstr "Test Bing.com" + +msgid "Test bing.com:" +msgstr "Test bing.com:" + +msgid "Test HTTP" +msgstr "Test HTTP" + +msgid "Test HTTP Service:" +msgstr "Test servizio HTTP:" + +msgid "Test storage" +msgstr "Test Archiviazione" + +msgid "Test Storage Upload:" +msgstr "Test Caricamento dell'archiviazione:" + +msgid "Test storage upgrade" +msgstr "Test l'aggiornamento dell'archiviazione" + +msgid "Test Storage Upgrade:" +msgstr "Test l'aggiornamento dell'archiviazione:" + +msgid "Test storage download" +msgstr "Test Download dell'archiviazione " + +msgid "Test Storage Download:" +msgstr "Test Download dell'archiviazione:" + +msgid "Test plugin download" +msgstr "Test plugin download" + +msgid "Test Plugin Download:" +msgstr "Test Plugin Download:" + +msgid "Test Storage Upload" +msgstr "Test Caricamento dell'archiviazione" + +msgid "Log Info" +msgstr "Informazioni sul registro" + +msgid "Select filament preset" +msgstr "Seleziona il preset del filamento" + +msgid "Create Filament" +msgstr "Crea filamento" + +msgid "Create Based on Current Filament" +msgstr "Crea in base al filamento corrente" + +msgid "Copy Current Filament Preset " +msgstr "Copia il preset del filamento corrente " + +msgid "Basic Information" +msgstr "Informazioni di base" + +msgid "Add Filament Preset under this filament" +msgstr "Aggiungi il preset del filamento sotto questo filamento" + +msgid "We could create the filament presets for your following printer:" +msgstr "Potremmo creare i preset di filamento per la tua seguente stampante:" + +msgid "Select Vendor" +msgstr "Selezionare Fornitore" + +msgid "Input Custom Vendor" +msgstr "Inserisci fornitore personalizzato" + +msgid "Can't find vendor I want" +msgstr "Non riesco a trovare il fornitore che voglio" + +msgid "Select Type" +msgstr "Selezionare il Tipo" + +msgid "Select Filament Preset" +msgstr "Seleziona il preset del filamento" + +msgid "Serial" +msgstr "Seriale" + +msgid "e.g. Basic, Matte, Silk, Marble" +msgstr "ad es. Base, Opaco, Seta, Marmo" + +msgid "Filament Preset" +msgstr "Preset di filamento" + +msgid "Create" +msgstr "Crea" + +msgid "Vendor is not selected, please reselect vendor." +msgstr "Il fornitore non è selezionato, riseleziona il fornitore." + +msgid "Custom vendor is not input, please input custom vendor." +msgstr "" +"Il fornitore personalizzato non viene inserito, si prega di inserire il " +"fornitore personalizzato." + +msgid "" +"\"Bambu\" or \"Generic\" can not be used as a Vendor for custom filaments." +msgstr "" +"\"Bambu\" o \"Generico\" non possono essere utilizzati come Fornitore per " +"filamenti personalizzati." + +msgid "Filament type is not selected, please reselect type." +msgstr "Il tipo di filamento non è selezionato, riselezionare il tipo." + +msgid "Filament serial is not inputed, please input serial." +msgstr "Il seriale del filamento non è inserito, inserire il seriale." + +msgid "" +"There may be escape characters in the vendor or serial input of filament. " +"Please delete and re-enter." +msgstr "" +"Potrebbero essere presenti caratteri da evitare nel fornitore o nell'input " +"seriale del filamento. Si prega di eliminare e inserire nuovamente." + +msgid "All inputs in the custom vendor or serial are spaces. Please re-enter." +msgstr "" +"Tutti gli input nel fornitore personalizzato o nel numero di serie sono " +"spazi. Si prega di inserire di nuovo." + +msgid "The vendor can not be a number. Please re-enter." +msgstr "" + +msgid "" +"You have not selected a printer or preset yet. Please select at least one." +msgstr "" +"Non è stata ancora selezionata una stampante o un Preset. Si prega di " +"selezionarne almeno uno." + +msgid "Some existing presets have failed to be created, as follows:\n" +msgstr "" +"Non è stato possibile creare alcuni preset esistenti, come indicato di " +"seguito:\n" + +msgid "" +"\n" +"Do you want to rewrite it?" +msgstr "" +"\n" +"Vuoi riscriverlo?" + +msgid "" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" +"To add preset for more prinetrs, Please go to printer selection" +msgstr "" +"Rinomineremo le impostazioni predefinite come \"Tipo di fornitore seriale " +"@printer selezionato\". \n" +" Per aggiungere impostazioni predefinite per altre stampanti, vai alla " +"selezione della stampante." + +msgid "Create Printer/Nozzle" +msgstr "Crea stampante/ugello" + +msgid "Create Printer" +msgstr "Crea stampante" + +msgid "Create Nozzle for Existing Printer" +msgstr "Creazione di un ugello per la stampante esistente" + +msgid "Create from Template" +msgstr "Crea da modello" + +msgid "Create Based on Current Printer" +msgstr "Crea in base alla stampante corrente" + +msgid "wiki" +msgstr "" +"Darò i comandi per far funzionare EPEL su RHEL 8, ma se sei su RHEL 6 o RHEL " +"7 puoi trovare quelle istruzioni sul wiki." + +msgid "Import Preset" +msgstr "Importa Preset" + +msgid "Create Type" +msgstr "Crea tipo" + +msgid "The model is not fond, place reselect vendor." +msgstr "" +"La modello non è stato trovato. Si prega di selezionare nuovamente il " +"fornitore." + +msgid "Select Model" +msgstr "Seleziona modello" + +msgid "Select Printer" +msgstr "Seleziona Stampante" + +msgid "Input Custom Model" +msgstr "Inserisci modello personalizzato" + +msgid "Can't find my printer model" +msgstr "Non riesco a trovare il modello della mia stampante" + +msgid "Rectangle" +msgstr "Rettangolo" + +msgid "Printable Space" +msgstr "Spazio di stampa" + +msgid "X" +msgstr "X" + +msgid "Y" +msgstr "Y" + +msgid "Hot Bed STL" +msgstr "Hot Bed STL" + +msgid "Load stl" +msgstr "Carica stl" + +msgid "Hot Bed SVG" +msgstr "Hot Bed SVG" + +msgid "Load svg" +msgstr "Carica svg" + +msgid "Max Print Height" +msgstr "Altezza massima di stampa" + +#, c-format, boost-format +msgid "The file exceeds %d MB, please import again." +msgstr "Il file supera i %d MB, si prega di importarlo di nuovo." + +msgid "Exception in obtaining file size, please import again." +msgstr "" +"Eccezione nell'ottenere la dimensione del file, si prega di importare di " +"nuovo." + +msgid "Preset path is not find, please reselect vendor." +msgstr "" +"Il percorso preimpostato non viene trovato, riselezionare il fornitore." + +msgid "The printer model was not found, please reselect." +msgstr "Il modello della stampante non è stato trovato, riselezionare." + +msgid "The nozzle diameter is not fond, place reselect." +msgstr "Il diametro dell'ugello non trovato, riselezionare." + +msgid "The printer preset is not fond, place reselect." +msgstr "" +"La configurazione predefinita della stampante non è stata trovata. Per " +"favore, seleziona nuovamente." + +msgid "Printer Preset" +msgstr "Preimpostazione stampante" + +msgid "Filament Preset Template" +msgstr "Modello di preset di filamento" + +msgid "Deselect All" +msgstr "Deseleziona tutto" + +msgid "Process Preset Template" +msgstr "Modello di Impostazioni Predefinite del Processo" + +msgid "Back Page 1" +msgstr "Indietro Pagina 1" + +msgid "" +"You have not yet chosen which printer preset to create based on. Please " +"choose the vendor and model of the printer" +msgstr "" +"Non avete ancora scelto l'impostazione predefinita della stampante in base " +"alla quale creare. Si prega di scegliere il fornitore e il modello della " +"stampante" + +msgid "" +"You have entered an illegal input in the printable area section on the first " +"page. Please check before creating it." +msgstr "" +"Hai inserito un input non valido nella sezione dell'area stampabile nella " +"prima pagina. Controlla prima di crearlo." + +msgid "The custom printer or model is not inputed, place input." +msgstr "" +"La stampante o il modello personalizzato non viene immesso, inserire l'input." + +msgid "" +"The printer preset you created already has a preset with the same name. Do " +"you want to overwrite it?\n" +"\tYes: Overwrite the printer preset with the same name, and filament and " +"process presets with the same preset name will be recreated \n" +"and filament and process presets without the same preset name will be " +"reserve.\n" +"\tCancel: Do not create a preset, return to the creation interface." +msgstr "" +"La configurazione predefinita della stampante che hai creato ha già una " +"configurazione predefinita con lo stesso nome. Vuoi sovrascriverla?\n" +"\tSì: Sovrascrivi la configurazione predefinita della stampante con lo " +"stesso nome, e le configurazioni predefinite del filamento e del processo " +"con lo stesso nome saranno ricreate,\n" +" mentre quelle senza lo stesso nome saranno conservate.\n" +" \tAnnulla: Non creare una configurazione predefinita, torna all'interfaccia " +"di creazione." + +msgid "You need to select at least one filament preset." +msgstr "È necessario selezionare almeno un preset filamento." + +msgid "You need to select at least one process preset." +msgstr "È necessario selezionare almeno un preset di processo." + +msgid "Create filament presets failed. As follows:\n" +msgstr "La creazione dei preset di filamento non è riuscita. Come segue:\n" + +msgid "Create process presets failed. As follows:\n" +msgstr "La creazione dei predefiniti di processo non è riuscita. Come segue:\n" + +msgid "Vendor is not find, please reselect." +msgstr "Il fornitore non è stato trovato, si prega di riselezionare." + +msgid "Current vendor has no models, please reselect." +msgstr "Il fornitore attuale non ha modelli, si prega di riselezionare." + +msgid "" +"You have not selected the vendor and model or inputed the custom vendor and " +"model." +msgstr "" +"Non sono stati selezionati il fornitore e il modello o non sono stati " +"immessi il fornitore e il modello personalizzati." + +msgid "" +"There may be escape characters in the custom printer vendor or model. Please " +"delete and re-enter." +msgstr "" +"Potrebbero essere presenti caratteri da evitare nel fornitore o nel modello " +"di stampante personalizzata. Si prega di eliminare e inserire nuovamente." + +msgid "" +"All inputs in the custom printer vendor or model are spaces. Please re-enter." +msgstr "" +"Tutti gli input nel fornitore o nel modello di stampante personalizzata sono " +"spazi. Si prega di inserire di nuovo." + +msgid "Please check bed printable shape and origin input." +msgstr "" +"Si prega di controllare la forma stampabile del letto e l'input dell'origine." + +msgid "" +"You have not yet selected the printer to replace the nozzle, please choose." +msgstr "" +"Non hai ancora selezionato la stampante per sostituire l'ugello, scegli." + +msgid "Create Printer Successful" +msgstr "Creazione di una stampante riuscita" + +msgid "Create Filament Successful" +msgstr "Crea un filamento di successo" + +msgid "Printer Created" +msgstr "Stampante creata" + +msgid "Please go to printer settings to edit your presets" +msgstr "" +"Vai alle impostazioni della stampante per modificare le tue preimpostazioni" + +msgid "Filament Created" +msgstr "Filamento creato" + +msgid "" +"Please go to filament setting to edit your presets if you need.\n" +"Please note that nozzle temperature, hot bed temperature, and maximum " +"volumetric speed have a significant impact on printing quality. Please set " +"them carefully." +msgstr "" +"Vai alle impostazioni del filamento per modificare le tue impostazioni " +"predefinite se necessario. \n" +"Nota che la temperatura della ugello, la temperatura del letto riscaldato e " +"la velocità volumetrica massima hanno un impatto significativo sulla qualità " +"di stampa. Impostale con attenzione." + +msgid "Printer Setting" +msgstr "Impostazione della stampante" + +msgid "Export Configs" +msgstr "Esporta &Configurazioni" + +msgid "Printer config bundle(.bbscfg)" +msgstr "Bundle di configurazione della stampante (.bbscfg)" + +msgid "Filament bundle(.bbsflmt)" +msgstr "Bundle filamenti (.bbsflmt)" + +msgid "Printer presets(.zip)" +msgstr "Preimpostazioni della stampante (.zip)" + +msgid "Filament presets(.zip)" +msgstr "Preimpostazioni del filamento (.zip)" + +msgid "Process presets(.zip)" +msgstr "Preimpostazioni di processo (.zip)" + +msgid "initialize fail" +msgstr "Inizializzazione non riuscita" + +msgid "add file fail" +msgstr "L'aggiunta del file non è riuscita" + +msgid "add bundle structure file fail" +msgstr "L'aggiunta del file della struttura del bundle non è riuscita" + +msgid "finalize fail" +msgstr "Finalizza non riuscito" + +msgid "open zip written fail" +msgstr "apri zip scritto non riuscito" + +msgid "Export successful" +msgstr "Esportazione riuscita" + +#, c-format, boost-format +msgid "" +"The '%s' folder already exists in the current directory. Do you want to " +"clear it and rebuild it.\n" +"If not, a time suffix will be added, and you can modify the name after " +"creation." +msgstr "" +"La cartella '%s' esiste già nella directory corrente. Vuoi cancellarla e " +"ricostruirla.\n" +"In caso contrario, verrà aggiunto un suffisso temporale e sarà possibile " +"modificare il nome dopo la creazione." + +msgid "" +"Printer and all the filament&process presets that belongs to the printer. \n" +"Can be shared with others." +msgstr "" +"Stampante e tutte le preimpostazioni di filamento e processo che " +"appartengono alla stampante. \n" +"Può essere condiviso con altri." + +msgid "" +"User's fillment preset set. \n" +"Can be shared with others." +msgstr "" +"Set di preimpostazioni di riempimento dell'utente. \n" +"Può essere condiviso con altri." + +msgid "" +"Only display printer names with changes to printer, filament, and process " +"presets." +msgstr "" +"Mostrare solo i nomi delle stampanti con modifiche alle impostazioni " +"predefinite della stampante, del filamento e del processo." + +msgid "Only display the filament names with changes to filament presets." +msgstr "" +"Mostrare solo i nomi dei filamenti con modifiche alle impostazioni " +"predefinite del filamento." + +msgid "" +"Only printer names with user printer presets will be displayed, and each " +"preset you choose will be exported as a zip." +msgstr "" +"Verranno visualizzati solo i nomi delle stampanti con le preimpostazioni " +"della stampante dell'utente e ogni preimpostazione scelta verrà esportata " +"come zip." + +msgid "" +"Only the filament names with user filament presets will be displayed, \n" +"and all user filament presets in each filament name you select will be " +"exported as a zip." +msgstr "" +"Verranno visualizzati solo i nomi dei filamenti con le preimpostazioni dei " +"filamenti dell'utente, \n" +"E tutte le preimpostazioni del filamento utente in ogni nome di filamento " +"selezionato verranno esportate come ZIP." + +msgid "" +"Only printer names with changed process presets will be displayed, \n" +"and all user process presets in each printer name you select will be " +"exported as a zip." +msgstr "" +"Verranno visualizzati solo i nomi delle stampanti con le impostazioni " +"predefinite del processo modificate,\n" +" e tutte le impostazioni predefinite del processo dell'utente in ogni nome " +"della stampante selezionato saranno esportate come un file zip" + +msgid "Please select at least one printer or filament." +msgstr "Seleziona almeno una stampante o un filamento." + +msgid "Please select a type you want to export" +msgstr "Seleziona il tipo che desideri esportare" + +msgid "Edit Filament" +msgstr "Modifica filamento" + +msgid "Filament presets under this filament" +msgstr "Filamento preimpostato sotto questo filamento" + +msgid "" +"Note: If the only preset under this filament is deleted, the filament will " +"be deleted after exiting the dialog." +msgstr "" +"Nota: Se l'unico preset sotto questo filamento viene eliminato, il filamento " +"verrà cancellato dopo aver chiuso la finestra di dialogo." + +msgid "Presets inherited by other presets can not be deleted" +msgstr "I preset ereditati da altri preset non possono essere eliminati" + +msgid "The following presets inherits this preset." +msgid_plural "The following preset inherits this preset." +msgstr[0] "I seguenti preset ereditano questo preset." +msgstr[1] "I seguenti preset ereditano questo preset." + +msgid "Delete Preset" +msgstr "Elimina Predefinito" + +msgid "Are you sure to delete the selected preset?" +msgstr "Sei sicuro di voler eliminare il preset selezionato?" + +msgid "Delete preset" +msgstr "Cancella preset" + +msgid "+ Add Preset" +msgstr "+ Aggiungi preset" + +msgid "Delete Filament" +msgstr "Elimina filamento" + +msgid "" +"All the filament presets belong to this filament would be deleted. \n" +"If you are using this filament on your printer, please reset the filament " +"information for that slot." +msgstr "" +"Tutti i preset di filamento appartenenti a questo filamento verranno " +"eliminati. \n" +"Se stai utilizzando questo filamento sulla tua stampante, reimposta le " +"informazioni sul filamento per quello slot." + +msgid "Delete filament" +msgstr "Elimina filamento" + +msgid "Add Preset" +msgstr "Aggiungi preset" + +msgid "Add preset for new printer" +msgstr "Aggiungi preimpostazione per la nuova stampante" + +msgid "Copy preset from filament" +msgstr "Copia preset dal filamento" + +msgid "The filament choice not find filament preset, please reselect it" +msgstr "" +"La scelta del filamento non trova il preset del filamento, si prega di " +"riselezionarlo" + +msgid "Edit Preset" +msgstr "Modifica preset" + +msgid "For more information, please check out Wiki" +msgstr "Per ulteriori informazioni, consulta Wiki" + +msgid "Collapse" +msgstr "Riduci" + +msgid "Daily Tips" +msgstr "Consigli giornalieri" + +msgid "Need select printer" +msgstr "Hai bisogno di selezionare la stampante" + +msgid "The start, end or step is not valid value." +msgstr "L'inizio, la fine o il passo non sono valori validi." + +msgid "" +"Unable to calibrate: maybe because the set calibration value range is too " +"large, or the step is too small" +msgstr "" +"Impossibile calibrare: forse perché l'intervallo di valori di calibrazione " +"impostato è troppo ampio o il passo è troppo piccolo" + +msgid "Physical Printer" +msgstr "Stampante Fisica" + +msgid "Print Host upload" +msgstr "Caricamento Host di stampa" + +msgid "Could not get a valid Printer Host reference" +msgstr "Impossibile ottenere un riferimento Host Stampante valido" + +msgid "Success!" +msgstr "Successo!" + +msgid "Refresh Printers" +msgstr "Aggiorna Stampanti" + +msgid "" +"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" +"signed certificate." +msgstr "" +"File HTTPS CA opzionale. È necessario solo se si intende usare un HTTPS con " +"certificato autofirmato." + +msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" +msgstr "File di certificato (*.crt, *.pem)|*.crt;*.pem|All files|*.*" + +msgid "Open CA certificate file" +msgstr "Apri file di certificato CA" + +#, c-format, boost-format +msgid "" +"On this system, %s uses HTTPS certificates from the system Certificate Store " +"or Keychain." +msgstr "" +"Su questo sistema, %s utilizza certificati HTTPS provenienti dal sistema " +"Certificate Store o da Keychain." + +msgid "" +"To use a custom CA file, please import your CA file into Certificate Store / " +"Keychain." +msgstr "" +"Per utilizzare un file CA personalizzato, importa il tuo file CA sul " +"Certificate Store / Keychain." + +msgid "Connection to printers connected via the print host failed." +msgstr "" +"Collegamento alle stampanti collegate tramite l'host di stampa fallito." + +#, c-format, boost-format +msgid "Mismatched type of print host: %s" +msgstr "Tipo di Host di stampa non corrispondente: %s" + +msgid "Connection to AstroBox works correctly." +msgstr "La connessione ad AstroBox funziona correttamente." + +msgid "Could not connect to AstroBox" +msgstr "Impossibile connettere ad AstroBox" + +msgid "Note: AstroBox version at least 1.1.0 is required." +msgstr "Nota: è richiesta una versione di AstroBox 1.1.0 o successiva." + +msgid "Connection to Duet works correctly." +msgstr "La connessione a Duet funziona correttamente." + +msgid "Could not connect to Duet" +msgstr "Connessione a Duet fallita" + +msgid "Unknown error occured" +msgstr "Si è verificato un errore sconosciuto" + +msgid "Wrong password" +msgstr "Password errata" + +msgid "Could not get resources to create a new connection" +msgstr "Non sono state trovate le risorse per stabilire una nuova connessione" + +msgid "Upload not enabled on FlashAir card." +msgstr "Caricamento non attivato sulla scheda FlashAir." + +msgid "Connection to FlashAir works correctly and upload is enabled." +msgstr "" +"Connessione a FlashAir correttamente funzionante e caricamento abilitato." + +msgid "Could not connect to FlashAir" +msgstr "Impossibile connettersi a FlashAir" + +msgid "" +"Note: FlashAir with firmware 2.00.02 or newer and activated upload function " +"is required." +msgstr "" +"Nota: è necessaria FlashAir con firmware 2.00.02 o successivo e funzione di " +"caricamento attiva." + +msgid "Connection to MKS works correctly." +msgstr "La connessione a MKS funziona correttamente." + +msgid "Could not connect to MKS" +msgstr "Non è stato possibile connettersi a MKS" + +msgid "Connection to OctoPrint works correctly." +msgstr "Connessione con OctoPrint funzionante." + +msgid "Could not connect to OctoPrint" +msgstr "Impossibile connettersi ad OctoPrint" + +msgid "Note: OctoPrint version at least 1.1.0 is required." +msgstr "Nota: è richiesta una versione di OctoPrint 1.1.0 o successiva." + +msgid "Connection to Prusa SL1 / SL1S works correctly." +msgstr "Collegamento a Prusa SL1 / SL1S correttamente funzionante." + +msgid "Could not connect to Prusa SLA" +msgstr "Connessione a Prusa SLA fallita" + +msgid "Connection to PrusaLink works correctly." +msgstr "Il collegamento a PrusaLink funziona correttamente." + +msgid "Could not connect to PrusaLink" +msgstr "Impossibile connettersi a PrusaLink" + +msgid "Storages found" +msgstr "Trovato spazio di archiviazione:" + +#. TRN %1% = storage path +#, boost-format +msgid "%1% : read only" +msgstr "%1% : sola lettura" + +#. TRN %1% = storage path +#, boost-format +msgid "%1% : no free space" +msgstr "%1% : non c'è spazio libero" + +#. TRN %1% = host +#, boost-format +msgid "Upload has failed. There is no suitable storage found at %1%." +msgstr "" +"Caricamento non riuscito. Non è stato trovato uno spazio di archiviazione " +"adatto su %1%." + +msgid "Connection to Prusa Connect works correctly." +msgstr "Il collegamento a Prusa Connect funziona correttamente." + +msgid "Could not connect to Prusa Connect" +msgstr "Impossibile connettersi a Prusa Connect" + +msgid "Connection to Repetier works correctly." +msgstr "La connessione a Repetier funziona correttamente." + +msgid "Could not connect to Repetier" +msgstr "Impossibile connettersi a Repetier" + +msgid "Note: Repetier version at least 0.90.0 is required." +msgstr "Nota: è richiesta la versione di Repetier almeno 0.90.0." + +#, boost-format +msgid "" +"HTTP status: %1%\n" +"Message body: \"%2%\"" +msgstr "" +"Stato HTTP: %1%\n" +"Corpo messaggio: \"%2%\"" + +#, boost-format +msgid "" +"Parsing of host response failed.\n" +"Message body: \"%1%\"\n" +"Error: \"%2%\"" +msgstr "" +"L'analisi della risposta dell'host non è riuscita.\n" +"Corpo del messaggio: \"%1%\"\n" +"Errore: \"%2%\"" + +#, boost-format +msgid "" +"Enumeration of host printers failed.\n" +"Message body: \"%1%\"\n" +"Error: \"%2%\"" +msgstr "" +"L'enumerazione delle stampanti host non è riuscita.\n" +"Corpo messaggio: \"%1%\"\n" +"Errore: \"%2%\"" + +#: resources/data/hints.ini: [hint:Precise wall] +msgid "" +"Precise wall\n" +"Did you know that turning on precise wall can improve precision and layer " +"consistency?" +msgstr "" +"Parete precisa\n" +"Sapevi che l'accensione precisa della parete può migliorare la precisione e " +"l'uniformità degli strati?" + +#: resources/data/hints.ini: [hint:Sandwich mode] +msgid "" +"Sandwich mode\n" +"Did you know that you can use sandwich mode (inner-outer-inner) to improve " +"precision and layer consistency if your model doesn't have very steep " +"overhangs?" +msgstr "" +"Modalità sandwich\n" +"Sapevi che puoi utilizzare la modalità sandwich (interno-esterno-interno) " +"per migliorare la precisione e l'uniformità degli strati se il tuo modello " +"non presenta sporgenze molto ripide?" + +#: resources/data/hints.ini: [hint:Chamber temperature] +msgid "" +"Chamber temperature\n" +"Did you know that OrcaSlicer supports chamber temperature?" +msgstr "" +"Temperatura della camera\n" +"Sapevi che OrcaSlicer supporta la temperatura della camera?" + +#: resources/data/hints.ini: [hint:Calibration] +msgid "" +"Calibration\n" +"Did you know that calibrating your printer can do wonders? Check out our " +"beloved calibration solution in OrcaSlicer." +msgstr "" +"Taratura\n" +"Sapevi che calibrare la tua stampante può fare miracoli? Dai un'occhiata " +"alla nostra amata soluzione di calibrazione in OrcaSlicer." + +#: resources/data/hints.ini: [hint:Auxiliary fan] +msgid "" +"Auxiliary fan\n" +"Did you know that OrcaSlicer supports Auxiliary part cooling fan?" +msgstr "" +"Ventilatore ausiliario\n" +"Sapevi che OrcaSlicer supporta la ventola di raffreddamento delle parti " +"ausiliarie?" + +#: resources/data/hints.ini: [hint:Air filtration] +msgid "" +"Air filtration/Exhuast Fan\n" +"Did you know that OrcaSlicer can support Air filtration/Exhuast Fan?" +msgstr "" +"Filtrazione dell'aria/ventilatore di scarico\n" +"Sapevi che OrcaSlicer può supportare la filtrazione dell'aria/Exhuast Fan?" + #: resources/data/hints.ini: [hint:How to use keyboard shortcuts] msgid "" "How to use keyboard shortcuts\n" "Did you know that Orca Slicer offers a wide range of keyboard shortcuts and " "3D scene operations." msgstr "" +"Come utilizzare le scorciatoie da tastiera\n" +"Sapevi che Orca Slicer offre un'ampia gamma di scorciatoie da tastiera e " +"operazioni di scena 3D." #: resources/data/hints.ini: [hint:Cut Tool] msgid "" @@ -12439,6 +13562,9 @@ msgid "" "Did you know that you can fix a corrupted 3D model to avoid a lot of slicing " "problems on the Windows system?" msgstr "" +"Correggi modello\n" +"Sapevi che puoi riparare un modello 3D danneggiato per evitare molti " +"problemi di slicing sul sistema Windows?" #: resources/data/hints.ini: [hint:Timelapse] msgid "" @@ -12494,19 +13620,20 @@ msgid "" "Did you know that you use the Search tool to quickly find a specific Orca " "Slicer setting?" msgstr "" +"Funzionalità di ricerca\n" +"Sapevi che puoi usare lo strumento di ricerca per trovare rapidamente " +"un'impostazione specifica di Orca Slicer?" #: resources/data/hints.ini: [hint:Simplify Model] msgid "" "Simplify Model\n" "Did you know that you can reduce the number of triangles in a mesh using the " -"Simplify mesh feature? Right-click the model and select Simplify model. Read " -"more in the documentation." +"Simplify mesh feature? Right-click the model and select Simplify model." msgstr "" -"Semplifica Modello\n" -"Sapevate che è possibile ridurre il numero di triangoli in una mesh " -"utilizzando la funzione Semplifica mesh? Fare clic con il tasto destro del " -"mouse sul modello e selezionare Semplifica modello. Per saperne di più, " -"consultare la documentazione." +"Semplifica modello\n" +"Sapevi che puoi ridurre il numero di triangoli in una mesh utilizzando la " +"funzione Semplifica mesh? Fare clic con il pulsante destro del mouse sul " +"modello e selezionare Semplifica modello." #: resources/data/hints.ini: [hint:Slicing Parameter Table] msgid "" @@ -12533,13 +13660,12 @@ msgid "" "Subtract a Part\n" "Did you know that you can subtract one mesh from another using the Negative " "part modifier? That way you can, for example, create easily resizable holes " -"directly in Orca Slicer. Read more in the documentation." +"directly in Orca Slicer." msgstr "" "Sottrazione di una parte\n" "Sapevi che puoi sottrarre una mesh da un'altra usando il modificatore Parte " "negativa? In questo modo è possibile, ad esempio, creare fori facilmente " -"ridimensionabili direttamente in Orca Slicer. Per ulteriori informazioni, " -"consulta la documentazione." +"ridimensionabili direttamente in Orca Slicer." #: resources/data/hints.ini: [hint:STEP] msgid "" @@ -12694,6 +13820,11 @@ msgid "" "extruder/hotend clogging when printing lower temperature filament with a " "higher enclosure temperature. More info about this in the Wiki." msgstr "" +"Quando è necessario stampare con lo sportello della stampante aperto\n" +"Sapevi che l'apertura dello sportello della stampante può ridurre la " +"probabilità di intasamento dell'estrusore/hotend quando si stampa filamento " +"a temperatura inferiore con una temperatura dell'involucro più elevata. " +"Maggiori informazioni su questo nel Wiki." #: resources/data/hints.ini: [hint:Avoid warping] msgid "" @@ -12702,6 +13833,164 @@ msgid "" "ABS, appropriately increasing the heatbed temperature can reduce the " "probability of warping." msgstr "" +"Evita la deformazione\n" +"Sapevi che quando si stampano materiali soggetti a deformazioni come l'ABS, " +"aumentare in modo appropriato la temperatura del piano riscaldato può " +"ridurre la probabilità di deformazione." + +#~ msgid "" +#~ "The printer timed out while receiving a print job. Please check if the " +#~ "network is functioning properly and send the print again." +#~ msgstr "" +#~ "La stampante ha raggiunto il timeout durante la ricezione di un lavoro di " +#~ "stampa. Controlla se la rete funziona correttamente e invia nuovamente la " +#~ "stampa." + +#~ msgid "The beginning of the vendor can not be a number. Please re-enter." +#~ msgstr "" +#~ "L'inizio del fornitore non può essere un numero. Si prega di inserire di " +#~ "nuovo." + +#~ msgid "Edit Text" +#~ msgstr "Modifica testo" + +#~ msgid "Error! Unable to create thread!" +#~ msgstr "Errore. Impossibile creare il processo." + +#~ msgid "Exception" +#~ msgstr "Eccezione" + +#~ msgid "Choose SLA archive:" +#~ msgstr "Seleziona l'archivio SLA:" + +#~ msgid "Import file" +#~ msgstr "Importa file" + +#~ msgid "Import model and profile" +#~ msgstr "Importa modello e profilo" + +#~ msgid "Import profile only" +#~ msgstr "Importa solo profilo" + +#~ msgid "Import model only" +#~ msgstr "Importa solo modello" + +#~ msgid "Accurate" +#~ msgstr "Accurato" + +#~ msgid "Balanced" +#~ msgstr "Bilanciato" + +#~ msgid "Quick" +#~ msgstr "Rapido" + +#~ msgid "Auto-Calc" +#~ msgstr "Calcolo automatico" + +#~ msgid "Re-calculate" +#~ msgstr "Ricalcolo" + +#~ msgid "" +#~ "Studio would re-calculate your flushing volumes everytime the filaments " +#~ "color changed. You could disable the auto-calculate in Bambu Studio > " +#~ "Preferences" +#~ msgstr "" +#~ "Studio ricalcolava i volumi di spurgo ogni volta che il colore dei " +#~ "filamenti cambiava. È possibile disabilitare il calcolo automatico nelle " +#~ "preferenze > di Bambu Studio" + +#~ msgid "unloaded" +#~ msgstr "scaricato" + +#~ msgid "loaded" +#~ msgstr "caricato" + +#~ msgid "Filament #" +#~ msgstr "Filamento #" + +#~ msgid "Print sequence of inner wall and outer wall. " +#~ msgstr "Stampa la sequenza della parete interna e della parete esterna. " + +#~ msgid "Order of wall/infill. false means print wall first. " +#~ msgstr "" +#~ "L'ordine tra parete (wall) e riempimento (infill). \"False\" significa " +#~ "stampare prima la parete." + +#~ msgid "" +#~ "Discribe how long the nozzle will move along the last path when retracting" +#~ msgstr "" +#~ "Descrive per quanto tempo il nozzle si muoverà lungo l'ultimo percorso " +#~ "mentre si ritrae." + +#~ msgid "" +#~ "Simplify Model\n" +#~ "Did you know that you can reduce the number of triangles in a mesh using " +#~ "the Simplify mesh feature? Right-click the model and select Simplify " +#~ "model. Read more in the documentation." +#~ msgstr "" +#~ "Semplifica Modello\n" +#~ "Sapevate che è possibile ridurre il numero di triangoli in una mesh " +#~ "utilizzando la funzione Semplifica mesh? Fare clic con il tasto destro " +#~ "del mouse sul modello e selezionare Semplifica modello. Per saperne di " +#~ "più, consultare la documentazione." + +#~ msgid "" +#~ "Subtract a Part\n" +#~ "Did you know that you can subtract one mesh from another using the " +#~ "Negative part modifier? That way you can, for example, create easily " +#~ "resizable holes directly in Orca Slicer. Read more in the documentation." +#~ msgstr "" +#~ "Sottrazione di una parte\n" +#~ "Sapevi che puoi sottrarre una mesh da un'altra usando il modificatore " +#~ "Parte negativa? In questo modo è possibile, ad esempio, creare fori " +#~ "facilmente ridimensionabili direttamente in Orca Slicer. Per ulteriori " +#~ "informazioni, consulta la documentazione." + +#~ msgid "Filling bed " +#~ msgstr "Riempi piano" + +#, boost-format +#~ msgid "%1% infill pattern doesn't support 100%% density." +#~ msgstr "La trama riempimento %1% non supporta il 100%% di densità." + +#~ msgid "" +#~ "Switch to rectilinear pattern?\n" +#~ "Yes - switch to rectilinear pattern automaticlly\n" +#~ "No - reset density to default non 100% value automaticlly" +#~ msgstr "" +#~ "Passare alla trama rettilinea?\n" +#~ "Sì - passa automaticamente alla trama rettilinea\n" +#~ "No - ripristina automaticamente la densità al valore predefinito non 100%" + +#~ msgid "Please heat the nozzle to above 170 degree before loading filament." +#~ msgstr "" +#~ "Riscaldare il nozzle a una temperatura superiore a 170 gradi prima di " +#~ "caricare il filamento." + +#~ msgid "Newer 3mf version" +#~ msgstr "Versione 3mf più recente" + +#~ msgid "Show g-code window" +#~ msgstr "Mostra la finestra del codice g" + +#~ msgid "If enabled, g-code window will be displayed." +#~ msgstr "Se abilitato, verrà visualizzata la finestra del codice g." + +#, c-format +#~ msgid "Density of internal sparse infill, 100% means solid throughout" +#~ msgstr "" +#~ "Questa è la densità del riempimento interno. 100%% significa che " +#~ "l'oggetto sarà in ogni sua parte." + +#~ msgid "Tree support wall loops" +#~ msgstr "Loop parete supporto ad albero" + +#~ msgid "This setting specify the count of walls around tree support" +#~ msgstr "Questa specifica il numero di pareti attorno al supporto ad albero." + +#, c-format, boost-format +#~ msgid " doesn't work at 100%% density " +#~ msgstr " Non funziona con una densità del 100%%" #~ msgid "Ctrl + Shift + Enter" #~ msgstr "Ctrl + Shift + Invio" @@ -12724,9 +14013,6 @@ msgstr "" #~ msgid "Export all objects as STL" #~ msgstr "Esporta tutti gli oggetti come STL" -#~ msgid "Slice ok." -#~ msgstr "Slice completo" - #, c-format, boost-format #~ msgid "" #~ "The 3mf's version %s is newer than %s's version %s, Found following keys " @@ -12755,15 +14041,6 @@ msgstr "" #~ msgid "Add/Remove printers" #~ msgstr "Aggiungi/Rimuovi stampanti" -#~ msgid "Bambu Engineering Plate" -#~ msgstr "Bambu Engineering Plate" - -#~ msgid "Bambu Smooth PEI Plate" -#~ msgstr "Bambu Smooth PEI Plate" - -#~ msgid "Bambu Textured PEI Plate" -#~ msgstr "Bambu Textured PEI Plate" - #~ msgid "" #~ "When print by object, machines with I3 structure will not generate " #~ "timelapse videos." @@ -12976,66 +14253,6 @@ msgstr "" #~ msgid "The selected preset: %1% is not found." #~ msgstr "Il preset selezionato: %1% non è stato trovato." -#~ msgid "Physical Printer" -#~ msgstr "Stampante Fisica" - -#~ msgid "Print Host upload" -#~ msgstr "Caricamento Host di stampa" - -#~ msgid "Could not get a valid Printer Host reference" -#~ msgstr "Impossibile ottenere un riferimento Host Stampante valido" - -#~ msgid "Success!" -#~ msgstr "Successo!" - -#~ msgid "Refresh Printers" -#~ msgstr "Aggiorna Stampanti" - -#~ msgid "" -#~ "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" -#~ "signed certificate." -#~ msgstr "" -#~ "File HTTPS CA opzionale. È necessario solo se si intende usare un HTTPS " -#~ "con certificato autofirmato." - -#~ msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" -#~ msgstr "File di certificato (*.crt, *.pem)|*.crt;*.pem|All files|*.*" - -#~ msgid "Open CA certificate file" -#~ msgstr "Apri file di certificato CA" - -#, c-format, boost-format -#~ msgid "" -#~ "On this system, %s uses HTTPS certificates from the system Certificate " -#~ "Store or Keychain." -#~ msgstr "" -#~ "Su questo sistema, %s utilizza certificati HTTPS provenienti dal sistema " -#~ "Certificate Store o da Keychain." - -#~ msgid "" -#~ "To use a custom CA file, please import your CA file into Certificate " -#~ "Store / Keychain." -#~ msgstr "" -#~ "Per utilizzare un file CA personalizzato, importa il tuo file CA sul " -#~ "Certificate Store / Keychain." - -#~ msgid "Connection to printers connected via the print host failed." -#~ msgstr "" -#~ "Collegamento alle stampanti collegate tramite l'host di stampa fallito." - -#~ msgid "The start, end or step is not valid value." -#~ msgstr "L'inizio, la fine o il passo non sono valori validi." - -#~ msgid "" -#~ "Unable to calibrate: maybe because the set calibration value range is too " -#~ "large, or the step is too small" -#~ msgstr "" -#~ "Impossibile calibrare: forse perché l'intervallo di valori di " -#~ "calibrazione impostato è troppo ampio o il passo è troppo piccolo" - -#~ msgid "Need select printer" -#~ msgstr "Hai bisogno di selezionare la stampante" - #~ msgid "" #~ "3D Scene Operations\n" #~ "Did you know how to control view and object/part selection with mouse and " @@ -13161,7 +14378,7 @@ msgstr "" #~ msgid "Score" #~ msgstr "Punteggio" -#~ msgid "Bamabu High Temperature Plate" +#~ msgid "Bambu High Temperature Plate" #~ msgstr "Bambu High Temperature Plate" #~ msgid "Can't connect to the printer" diff --git a/localization/i18n/ja/OrcaSlicer_ja.po b/localization/i18n/ja/OrcaSlicer_ja.po index 080a316054..8ecddd505b 100644 --- a/localization/i18n/ja/OrcaSlicer_ja.po +++ b/localization/i18n/ja/OrcaSlicer_ja.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-24 18:09+0100\n" +"POT-Creation-Date: 2023-12-19 22:09+0800\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -292,6 +292,12 @@ msgstr "Select all connectors" msgid "Cut" msgstr "カット" +msgid "non-mainifold edges be caused by cut tool, do you want to fix it now?" +msgstr "" + +msgid "Repairing model object" +msgstr "モデルオブジェクトを修復" + msgid "Connector" msgstr "Connector" @@ -837,6 +843,24 @@ msgstr "サポートを追加" msgid "Add support enforcer" msgstr "サポート補強を追加" +msgid "Add text" +msgstr "" + +msgid "Add negative text" +msgstr "" + +msgid "Add text modifier" +msgstr "" + +msgid "Add SVG part" +msgstr "" + +msgid "Add negative SVG" +msgstr "" + +msgid "Add SVG modifier" +msgstr "" + msgid "Select settings" msgstr "設定を選択" @@ -852,9 +876,6 @@ msgstr "Del" msgid "Delete the selected object" msgstr "選択したオブジェクトを削除" -msgid "Edit Text" -msgstr "Edit Text" - msgid "Load..." msgstr "ファイルを読込む" @@ -879,6 +900,12 @@ msgstr "シリンダー" msgid "Cone" msgstr "コーン" +msgid "Text" +msgstr "" + +msgid "SVG" +msgstr "" + msgid "Height range Modifier" msgstr "Height Range Modifier" @@ -1012,6 +1039,18 @@ msgstr "反転" msgid "Mirror object" msgstr "オブジェクトを反転" +msgid "Edit text" +msgstr "" + +msgid "Ability to change text, font, size, ..." +msgstr "" + +msgid "Edit SVG" +msgstr "" + +msgid "Change SVG source file, projection, size, ..." +msgstr "" + msgid "Invalidate cut info" msgstr "Invalidate cut info" @@ -1162,9 +1201,6 @@ msgstr "オブジェクトに色塗りをします" msgid "Click the icon to shift this object to the bed" msgstr "Click the icon to shift this object to the bed" -msgid " search results" -msgstr "" - msgid "Loading file" msgstr "ファイルを読み込み中" @@ -1311,9 +1347,6 @@ msgstr "新しい名前を入力" msgid "Renaming" msgstr "名前を変更中" -msgid "Repairing model object" -msgstr "モデルオブジェクトを修復" - msgid "Following model object has been repaired" msgid_plural "Following model objects have been repaired" msgstr[0] "以下のモデルオブジェクトが修復されました。" @@ -1637,10 +1670,6 @@ msgstr "現在のプレートがロックされたため自動レイアウトで msgid "Arranging..." msgstr "レイアウト中" -msgid "" -"Arrange failed. Found some exceptions when processing object geometries." -msgstr "レイアウトは失敗しました、ジオメトリーを処理するのに異常がありました" - msgid "Arranging" msgstr "レイアウト中" @@ -1656,6 +1685,10 @@ msgstr "" msgid "Arranging done." msgstr "レイアウト完了" +msgid "" +"Arrange failed. Found some exceptions when processing object geometries." +msgstr "レイアウトは失敗しました、ジオメトリーを処理するのに異常がありました" + #, c-format, boost-format msgid "" "Arrangement ignored the following objects which can't fit into a single " @@ -1685,8 +1718,11 @@ msgstr "向き調整中" msgid "Orienting" msgstr "向き調整中" -msgid "Filling bed " -msgstr "Filling bed" +msgid "Orienting canceled." +msgstr "" + +msgid "Filling" +msgstr "" msgid "Bed filling canceled." msgstr "Bed filling canceled." @@ -1694,11 +1730,14 @@ msgstr "Bed filling canceled." msgid "Bed filling done." msgstr "Bed filling done." -msgid "Error! Unable to create thread!" -msgstr "エラー:スレッドを作成できません" +msgid "Searching for optimal orientation" +msgstr "" -msgid "Exception" -msgstr "異常" +msgid "Orientation search canceled." +msgstr "" + +msgid "Orientation found." +msgstr "" msgid "Logging in" msgstr "サインイン中" @@ -1769,11 +1808,6 @@ msgstr "クラウド経由で造形タスクを送信" msgid "Print task sending times out." msgstr "" -msgid "" -"The printer timed out while receiving a print job. Please check if the " -"network is functioning properly and send the print again." -msgstr "" - msgid "Service Unavailable" msgstr "サービスは利用できません" @@ -1807,30 +1841,6 @@ msgstr "送信しました、%s秒後自動閉じます。" msgid "An SD card needs to be inserted before sending to printer." msgstr "SDカードが必要です" -msgid "Choose SLA archive:" -msgstr "Choose SLA archive:" - -msgid "Import file" -msgstr "Import file" - -msgid "Import model and profile" -msgstr "Import model and profile" - -msgid "Import profile only" -msgstr "Import profile only" - -msgid "Import model only" -msgstr "Import model only" - -msgid "Accurate" -msgstr "Accurate" - -msgid "Balanced" -msgstr "Balanced" - -msgid "Quick" -msgstr "Quick" - msgid "Importing SLA archive" msgstr "Importing SLA archive" @@ -2519,19 +2529,6 @@ msgstr "" "はい - プライムタワーを有効にする\n" "いいえ - 「独立サポート積層ピッチ」を有効にする" -#, boost-format -msgid "%1% infill pattern doesn't support 100%% density." -msgstr "%1% のインフィル パターンは 100%% の密度をサポートしません。" - -msgid "" -"Switch to rectilinear pattern?\n" -"Yes - switch to rectilinear pattern automaticlly\n" -"No - reset density to default non 100% value automaticlly" -msgstr "" -"直線パターンに切り替えますか?\n" -"はい - 直線パターンに切り替えます\n" -"いいえ - 充填密度をリセットします" - msgid "" "While printing by Object, the extruder may collide skirt.\n" "Thus, reset the skirt layer to 1 to avoid that." @@ -2632,6 +2629,18 @@ msgstr "" msgid "Motor noise showoff" msgstr "" +msgid "Nozzle filament covered detected pause" +msgstr "" + +msgid "Cutter error pause" +msgstr "" + +msgid "First layer error pause" +msgstr "" + +msgid "Nozzle clog pause" +msgstr "" + msgid "MC" msgstr "MC" @@ -3093,7 +3102,7 @@ msgstr "ボリューム" msgid "Size:" msgstr "サイズ:" -#, boost-format +#, c-format, boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -3466,6 +3475,18 @@ msgstr "パースペクティブを使用" msgid "Use Orthogonal View" msgstr "直交投影を使用" +msgid "Show &G-code Window" +msgstr "" + +msgid "Show g-code window in Previce scene" +msgstr "" + +msgid "Reset Window Layout" +msgstr "" + +msgid "Reset to default window layout" +msgstr "" + msgid "Show &Labels" msgstr "ラベルを表示" @@ -3829,6 +3850,9 @@ msgstr "ダウンロード中 %d%%" msgid "Connection lost. Please retry." msgstr "" +msgid "The device cannot handle more conversations. Please retry later." +msgstr "" + msgid "File not exists." msgstr "" @@ -3984,8 +4008,10 @@ msgstr "Layer: %s" msgid "Layer: %d/%d" msgstr "Layer: %d/%d" -msgid "Please heat the nozzle to above 170 degree before loading filament." -msgstr "フィラメントをロードする前に、ノズル温度を170℃以上に加熱してください" +msgid "" +"Please heat the nozzle to above 170 degree before loading or unloading " +"filament." +msgstr "" msgid "Still unload" msgstr "アンロード" @@ -4328,7 +4354,7 @@ msgstr "自動回復" msgid "Allow Prompt Sound" msgstr "" -msgid "Fliament Tangle Detect" +msgid "Filament Tangle Detect" msgstr "" msgid "Global" @@ -4504,6 +4530,12 @@ msgid "" "It is recommended to change to smooth mode." msgstr "" +msgid "Expand sidebar" +msgstr "" + +msgid "Collapse sidebar" +msgstr "" + #, c-format, boost-format msgid "Loading file: %s" msgstr "ファイルを読込む: %s" @@ -4523,31 +4555,6 @@ msgstr "" "3mfは古いバージョンのOrca Slicerで作成されています、ジオメトリーデータのみ読" "込みます。" -#, c-format, boost-format -msgid "This slicer file version %s is newer than %s's version:" -msgstr "" - -msgid "" -"Would you like to update your Bambu Studio software to enable all " -"functionality in this slicer file?\n" -msgstr "" - -msgid "Newer 3mf version" -msgstr "新3mfバージョン" - -msgid "" -"you can always update Bambu Studio at your convenience. The slicer file will " -"now be loaded without full functionality." -msgstr "" - -#, c-format, boost-format -msgid "" -"This slicer file version %s is newer than %s's version.\n" -"\n" -"Would you like to update your Bambu Studio software to enable all " -"functionality in this slicer file?" -msgstr "" - msgid "Invalid values found in the 3mf:" msgstr "Invalid values found in the 3mf:" @@ -4777,6 +4784,9 @@ msgid "" "import it." msgstr "" +msgid "Import SLA archive" +msgstr "" + msgid "The selected file" msgstr "選択したファイル" @@ -4857,6 +4867,15 @@ msgstr "" "Unable to perform boolean operation on model meshes. Only positive parts " "will be exported." +msgid "" +"Are you sure you want to store original SVGs with their local paths into the " +"3MF file?\n" +"If you hit 'NO', all SVGs in the project will not be editable any more." +msgstr "" + +msgid "Private protection" +msgstr "" + msgid "Is the printer ready? Is the print sheet in place, empty and clean?" msgstr "" @@ -4880,6 +4899,9 @@ msgid "Custom supports and color painting were removed before repairing." msgstr "" "モデルを変更すると、ペイントデータ(サポートや色など)がリセットされます" +msgid "Optimize Rotation" +msgstr "" + msgid "Invalid number" msgstr "無効な数字" @@ -5042,12 +5064,6 @@ msgstr "起動後「毎日のヒント」を表示" msgid "If enabled, useful hints are displayed at startup." msgstr "有効になる場合、起動時にヒントを表示されます。" -msgid "Show g-code window" -msgstr "" - -msgid "If enabled, g-code window will be displayed." -msgstr "" - msgid "Flushing volumes: Auto-calculate everytime the color changed." msgstr "" @@ -5340,7 +5356,7 @@ msgstr "%sを名前つけて保存" msgid "User Preset" msgstr "ユーザープリセット" -msgid "Project Inside Preset" +msgid "Preset Inside Project" msgstr "プロジェクト プリセット" msgid "Name is invalid;" @@ -5414,6 +5430,9 @@ msgstr "タスクを取消しました" msgid "(LAN)" msgstr "(LAN)" +msgid "Search" +msgstr "" + msgid "My Device" msgstr "私のデバイス" @@ -5444,16 +5463,16 @@ msgstr "Bambu 常温プレート" msgid "PLA Plate" msgstr "PLA Plate" -msgid "Bamabu Engineering Plate" +msgid "Bambu Engineering Plate" msgstr "Bambu エンジニアリングプレート" -msgid "Bamabu Smooth PEI Plate" +msgid "Bambu Smooth PEI Plate" msgstr "" msgid "High temperature Plate" msgstr "" -msgid "Bamabu Textured PEI Plate" +msgid "Bambu Textured PEI Plate" msgstr "" msgid "Send print job to" @@ -5661,6 +5680,12 @@ msgstr "" msgid "The printer does not support sending to printer SD card." msgstr "このプリンターはSDカードに送信することができません" +msgid "Slice ok." +msgstr "スライス完了" + +msgid "View all Daily tips" +msgstr "" + msgid "Failed to create socket" msgstr "Failed to create socket" @@ -5840,11 +5865,25 @@ msgstr "" "0 top z distance, 0 interface spacing, concentric pattern and disable " "independent support layer height" +msgid "" +"Layer height exceeds the limit in Printer Settings -> Extruder -> Layer " +"height limits ,this may cause printing quality issues." +msgstr "" + +msgid "Adjust to the set range automatically? \n" +msgstr "" + +msgid "Adjust" +msgstr "" + +msgid "Ignore" +msgstr "" + msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" "ヘッド無しのタイムラプスビデオを録画する時に、「タイムラプスプライムタワー」" "を追加してください。プレートで右クリックして、「プリミティブを追加」→「タイム" @@ -5862,6 +5901,15 @@ msgstr "精度" msgid "Wall generator" msgstr "壁面生成器" +msgid "Walls and surfaces" +msgstr "" + +msgid "Bridging" +msgstr "" + +msgid "Overhangs" +msgstr "" + msgid "Walls" msgstr "壁面" @@ -6191,6 +6239,12 @@ msgid "Following preset will be deleted too." msgid_plural "Following presets will be deleted too." msgstr[0] "以下のプリセットも削除されます: " +msgid "" +"Are you sure to delete the selected preset? \n" +"If the preset corresponds to a filament currently in use on your printer, " +"please reset the filament information for that slot." +msgstr "" + #, boost-format msgid "Are you sure to %1% the selected preset?" msgstr "選択したプリセットを %1% しますか?" @@ -6216,7 +6270,7 @@ msgstr "未定義" msgid "Unsaved Changes" msgstr "未保存の変更" -msgid "Discard or Keep changes" +msgid "Transfer or discard changes" msgstr "変更を破棄または保持" msgid "Old Value" @@ -6421,19 +6475,15 @@ msgstr "" msgid "Ramming line spacing" msgstr "" -msgid "Auto-Calc" -msgstr "自動計算" - -msgid "Re-calculate" +msgid "Recalculate" msgstr "" msgid "Flushing volumes for filament change" msgstr "フィラメントを入替える為のフラッシュ量" msgid "" -"Studio would re-calculate your flushing volumes everytime the filaments " -"color changed. You could disable the auto-calculate in Bambu Studio > " -"Preferences" +"Orca recalculates your flushing volumes everytime the filament colors " +"change. You can change this behavior in Preferences." msgstr "" msgid "Flushing volume (mm³) for each filament pair." @@ -6450,15 +6500,6 @@ msgstr "マルチプライヤーの有効範囲は [%.2f, %.2f] です。" msgid "Multiplier" msgstr "マルチプライヤ" -msgid "unloaded" -msgstr "アンロードしました" - -msgid "loaded" -msgstr "ロード済み" - -msgid "Filament #" -msgstr "フィラメント#" - msgid "From" msgstr "From" @@ -6820,6 +6861,9 @@ msgstr "造形中" msgid "Idle" msgstr "待機中" +msgid "Beta version" +msgstr "" + msgid "Latest version" msgstr "最新バージョン" @@ -7169,6 +7213,25 @@ msgstr "" msgid "Variable layer height is not supported with Organic supports." msgstr "" +msgid "" +"Different nozzle diameters and different filament diameters is not allowed " +"when prime tower is enabled." +msgstr "" + +msgid "" +"The Wipe Tower is currently only supported with the relative extruder " +"addressing (use_relative_e_distances=1)." +msgstr "" + +msgid "" +"Ooze prevention is currently not supported with the prime tower enabled." +msgstr "" + +msgid "" +"The prime tower is currently only supported for the Marlin, RepRap/Sprinter, " +"RepRapFirmware and Repetier G-code flavors." +msgstr "" + msgid "The prime tower is not supported in \"By object\" print." msgstr "オブジェクト順で造形する場合、プライムタワーを利用できません" @@ -7244,11 +7307,6 @@ msgstr "" msgid "Layer height cannot exceed nozzle diameter" msgstr "積層ピッチはノズルの直径を超える為設定できません" -msgid "" -"Layer height cannot exceed the limit in Printer Settings -> Extruder -> " -"Layer height limits" -msgstr "" - msgid "" "Relative extruder addressing requires resetting the extruder position at " "each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to " @@ -7332,6 +7390,12 @@ msgstr "造形可能高さ" msgid "Maximum printable height which is limited by mechanism of printer" msgstr "造形可能の最大高さです。" +msgid "Preferred orientation" +msgstr "" + +msgid "Automatically orient stls on the Z-axis upon initial import" +msgstr "" + msgid "Printer preset names" msgstr "プリセット名" @@ -7583,7 +7647,7 @@ msgstr "" msgid "Density of external bridges. 100% means solid bridge. Default is 100%." msgstr "" -msgid "Bridge flow" +msgid "Bridge flow ratio" msgstr "ブリッジ流量" msgid "" @@ -7593,6 +7657,15 @@ msgstr "" "この値を少し (例えば 0.9) 小さくし、ブリッジ用に押出し量を減らし、たるみを防" "ぎます。" +msgid "Internal bridge flow ratio" +msgstr "" + +msgid "" +"This value governs the thickness of the internal bridge layer. This is the " +"first layer over sparse infill. Decrease this value slightly (for example " +"0.9) to improve surface quality over sparse infill." +msgstr "" + msgid "Top surface flow ratio" msgstr "" @@ -7898,6 +7971,15 @@ msgstr "" "有効になる場合、より長いブリッジを造形できますが、仕上がりが劣る可能性があり" "ます。" +msgid "Thick internal bridges" +msgstr "" + +msgid "" +"If enabled, thick internal bridges will be used. It's usually recommended to " +"have this feature turned on. However, consider turning it off if you are " +"using large nozzles." +msgstr "" + msgid "Max bridge length" msgstr "最大ブリッジ長さ" @@ -7975,7 +8057,7 @@ msgid "Internal solid infill pattern" msgstr "" msgid "" -"Line pattern of internal solid infill. if the detect nattow internal solid " +"Line pattern of internal solid infill. if the detect narrow internal solid " "infill be enabled, the concentric pattern will be used for the small area." msgstr "" @@ -8007,25 +8089,55 @@ msgid "" "This sets the threshold for small perimeter length. Default threshold is 0mm" msgstr "" -msgid "Order of walls" +msgid "Walls printing order" msgstr "" -msgid "Print sequence of inner wall and outer wall. " +msgid "" +"Print sequence of the internal (inner) and external (outer) walls. \n" +"\n" +"Use Inner/Outer for best overhangs. This is because the overhanging walls " +"can adhere to a neighouring perimeter while printing. However, this option " +"results in slightly reduced surface quality as the external perimeter is " +"deformed by being squashed to the internal perimeter.\n" +"\n" +"Use Inner/Outer/Inner for the best external surface finish and dimensional " +"accuracy as the external wall is printed undisturbed from an internal " +"perimeter. However, overhang performance will reduce as there is no internal " +"perimeter to print the external wall against. This option requires a minimum " +"of 3 walls to be effective as it prints the internal walls from the 3rd " +"perimeter onwards first, then the external perimeter and, finally, the first " +"internal perimeter. This option is recomended against the Outer/Inner option " +"in most cases. \n" +"\n" +"Use Outer/Inner for the same external wall quality and dimensional accuracy " +"benefits of Inner/Outer/Inner option. However, the z seams will appear less " +"consistent as the first extrusion of a new layer starts on a visible " +"surface.\n" +"\n" +" " msgstr "" -msgid "inner/outer" +msgid "Inner/Outer" msgstr "" -msgid "outer/inner" +msgid "Outer/Inner" msgstr "" -msgid "inner wall/outer wall/inner wall" +msgid "Inner/Outer/Inner" msgstr "" msgid "Print infill first" msgstr "" -msgid "Order of wall/infill. false means print wall first. " +msgid "" +"Order of wall/infill. When the tickbox is unchecked the walls are printed " +"first, which works best in most cases.\n" +"\n" +"Printing walls first may help with extreme overhangs as the walls have the " +"neighbouring infill to adhere to. However, the infill will slighly push out " +"the printed walls where it is attached to them, resulting in a worse " +"external surface finish. It can also cause the infill to shine through the " +"external surfaces of the part." msgstr "" msgid "Height to rod" @@ -8352,9 +8464,11 @@ msgstr "スパース インフィル パターンの角度です" msgid "Sparse infill density" msgstr "充填密度" -#, c-format -msgid "Density of internal sparse infill, 100% means solid throughout" -msgstr "スパース インフィルの密度です。100%%に設定する場合ソリッドになります。" +#, c-format, boost-format +msgid "" +"Density of internal sparse infill, 100% turns all sparse infill into solid " +"infill and internal solid infill pattern will be used" +msgstr "" msgid "Sparse infill pattern" msgstr "充填パターン" @@ -8554,10 +8668,10 @@ msgstr "最大回転速度の積層" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " -"than \"close_fan_the_first_x_layers\", in which case the fan will be running " -"at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower than " +"\"close_fan_the_first_x_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." msgstr "" msgid "Support interface fan speed" @@ -8605,6 +8719,12 @@ msgid "" "segment" msgstr "ポイント間の平均距離" +msgid "Apply fuzzy skin to first layer" +msgstr "" + +msgid "Whether to apply fuzzy skin on the first layer" +msgstr "" + msgid "Filter out tiny gaps" msgstr "" @@ -9213,13 +9333,13 @@ msgstr "ファイル名形式" msgid "User can self-define the project file name when export" msgstr "エクスポート時ファイル名を設定できます" -msgid "Make overhang printable" +msgid "Make overhangs printable" msgstr "" msgid "Modify the geometry to print overhangs without support material." msgstr "" -msgid "Make overhang printable maximum angle" +msgid "Make overhangs printable - Maximum angle" msgstr "" msgid "" @@ -9228,7 +9348,7 @@ msgid "" "0 will replace all overhangs with conical material." msgstr "" -msgid "Make overhang printable hole area" +msgid "Make overhangs printable - Hole area" msgstr "" msgid "" @@ -9468,6 +9588,9 @@ msgstr "" msgid "Show auto-calibration marks" msgstr "" +msgid "Disable set remaining print time" +msgstr "" + msgid "Seam position" msgstr "継ぎ目位置" @@ -9590,6 +9713,22 @@ msgstr "" "スパイラルモードでは、輪郭面を一筆書きで造形します。Z方向の移動に段差がないの" "で、シームはありません。" +msgid "Smooth Spiral" +msgstr "" + +msgid "" +"Smooth Spiral smoothes out X and Y moves as wellresulting in no visible seam " +"at all, even in the XY directions on walls that are not vertical" +msgstr "" + +msgid "Max XY Smoothing" +msgstr "" + +msgid "" +"Maximum distance to move points in XY to try to achieve a smooth spiralIf " +"expressed as a %, it will be computed over nozzle diameter" +msgstr "" + msgid "" "If smooth or traditional mode is selected, a timelapse video will be " "generated for each print. After each layer is printed, a snapshot is taken " @@ -9783,10 +9922,11 @@ msgstr "" "サポートとラフトを造形用のフィラメント。「デフォルト」では当時のフィラメント" "を使用する意味です。" -msgid "No interface filament for body" +msgid "Avoid interface filament for base" msgstr "" -msgid "Don't use support interface filament to print support body" +msgid "" +"Avoid using support interface filament to print support base if possible." msgstr "" msgid "" @@ -10026,11 +10166,11 @@ msgid "" "double walls." msgstr "" -msgid "Tree support wall loops" -msgstr "ツリーサポート壁層数" +msgid "Support wall loops" +msgstr "" -msgid "This setting specify the count of walls around tree support" -msgstr "ツリーサポートの壁面層数です。" +msgid "This setting specify the count of walls around support" +msgstr "" msgid "Tree support with infill" msgstr "ツリーサポートインフィル使用" @@ -10137,8 +10277,16 @@ msgid "Wipe Distance" msgstr "拭き上げ距離" msgid "" -"Discribe how long the nozzle will move along the last path when retracting" -msgstr "リトラクション時にノズルが最後のパスに沿って移動する距離です。" +"Discribe how long the nozzle will move along the last path when " +"retracting. \n" +"\n" +"Depending on how long the wipe operation lasts, how fast and long the " +"extruder/filament retraction settings are, a retraction move may be needed " +"to retract the remaining filament. \n" +"\n" +"Setting a value in the retract amount before wipe setting below will perform " +"any excess retraction before the wipe, else it will be performed after." +msgstr "" msgid "" "The wiping tower can be used to clean up the residue on the nozzle and " @@ -10437,10 +10585,6 @@ msgstr "" msgid "invalid value " msgstr "invalid value " -#, c-format, boost-format -msgid " doesn't work at 100%% density " -msgstr " doesn't work at 100%% density " - msgid "Invalid value when spiral vase mode is enabled: " msgstr "Invalid value when spiral vase mode is enabled: " @@ -11292,6 +11436,719 @@ msgstr "" msgid "Delete input" msgstr "" +msgid "Network Test" +msgstr "" + +msgid "Start Test Multi-Thread" +msgstr "" + +msgid "Start Test Single-Thread" +msgstr "" + +msgid "Export Log" +msgstr "" + +msgid "Studio Version:" +msgstr "" + +msgid "System Version:" +msgstr "" + +msgid "DNS Server:" +msgstr "" + +msgid "Test BambuLab" +msgstr "" + +msgid "Test BambuLab:" +msgstr "" + +msgid "Test Bing.com" +msgstr "" + +msgid "Test bing.com:" +msgstr "" + +msgid "Test HTTP" +msgstr "" + +msgid "Test HTTP Service:" +msgstr "" + +msgid "Test storage" +msgstr "" + +msgid "Test Storage Upload:" +msgstr "" + +msgid "Test storage upgrade" +msgstr "" + +msgid "Test Storage Upgrade:" +msgstr "" + +msgid "Test storage download" +msgstr "" + +msgid "Test Storage Download:" +msgstr "" + +msgid "Test plugin download" +msgstr "" + +msgid "Test Plugin Download:" +msgstr "" + +msgid "Test Storage Upload" +msgstr "" + +msgid "Log Info" +msgstr "" + +msgid "Select filament preset" +msgstr "" + +msgid "Create Filament" +msgstr "" + +msgid "Create Based on Current Filament" +msgstr "" + +msgid "Copy Current Filament Preset " +msgstr "" + +msgid "Basic Information" +msgstr "" + +msgid "Add Filament Preset under this filament" +msgstr "" + +msgid "We could create the filament presets for your following printer:" +msgstr "" + +msgid "Select Vendor" +msgstr "" + +msgid "Input Custom Vendor" +msgstr "" + +msgid "Can't find vendor I want" +msgstr "" + +msgid "Select Type" +msgstr "" + +msgid "Select Filament Preset" +msgstr "" + +msgid "Serial" +msgstr "" + +msgid "e.g. Basic, Matte, Silk, Marble" +msgstr "" + +msgid "Filament Preset" +msgstr "" + +msgid "Create" +msgstr "" + +msgid "Vendor is not selected, please reselect vendor." +msgstr "" + +msgid "Custom vendor is not input, please input custom vendor." +msgstr "" + +msgid "" +"\"Bambu\" or \"Generic\" can not be used as a Vendor for custom filaments." +msgstr "" + +msgid "Filament type is not selected, please reselect type." +msgstr "" + +msgid "Filament serial is not inputed, please input serial." +msgstr "" + +msgid "" +"There may be escape characters in the vendor or serial input of filament. " +"Please delete and re-enter." +msgstr "" + +msgid "All inputs in the custom vendor or serial are spaces. Please re-enter." +msgstr "" + +msgid "The vendor can not be a number. Please re-enter." +msgstr "" + +msgid "" +"You have not selected a printer or preset yet. Please select at least one." +msgstr "" + +msgid "Some existing presets have failed to be created, as follows:\n" +msgstr "" + +msgid "" +"\n" +"Do you want to rewrite it?" +msgstr "" + +msgid "" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" +"To add preset for more prinetrs, Please go to printer selection" +msgstr "" + +msgid "Create Printer/Nozzle" +msgstr "" + +msgid "Create Printer" +msgstr "" + +msgid "Create Nozzle for Existing Printer" +msgstr "" + +msgid "Create from Template" +msgstr "" + +msgid "Create Based on Current Printer" +msgstr "" + +msgid "wiki" +msgstr "" + +msgid "Import Preset" +msgstr "" + +msgid "Create Type" +msgstr "" + +msgid "The model is not fond, place reselect vendor." +msgstr "" + +msgid "Select Model" +msgstr "" + +msgid "Select Printer" +msgstr "" + +msgid "Input Custom Model" +msgstr "" + +msgid "Can't find my printer model" +msgstr "" + +msgid "Rectangle" +msgstr "" + +msgid "Printable Space" +msgstr "" + +msgid "X" +msgstr "" + +msgid "Y" +msgstr "" + +msgid "Hot Bed STL" +msgstr "" + +msgid "Load stl" +msgstr "" + +msgid "Hot Bed SVG" +msgstr "" + +msgid "Load svg" +msgstr "" + +msgid "Max Print Height" +msgstr "" + +#, c-format, boost-format +msgid "The file exceeds %d MB, please import again." +msgstr "" + +msgid "Exception in obtaining file size, please import again." +msgstr "" + +msgid "Preset path is not find, please reselect vendor." +msgstr "" + +msgid "The printer model was not found, please reselect." +msgstr "" + +msgid "The nozzle diameter is not fond, place reselect." +msgstr "" + +msgid "The printer preset is not fond, place reselect." +msgstr "" + +msgid "Printer Preset" +msgstr "" + +msgid "Filament Preset Template" +msgstr "" + +msgid "Deselect All" +msgstr "" + +msgid "Process Preset Template" +msgstr "" + +msgid "Back Page 1" +msgstr "" + +msgid "" +"You have not yet chosen which printer preset to create based on. Please " +"choose the vendor and model of the printer" +msgstr "" + +msgid "" +"You have entered an illegal input in the printable area section on the first " +"page. Please check before creating it." +msgstr "" + +msgid "The custom printer or model is not inputed, place input." +msgstr "" + +msgid "" +"The printer preset you created already has a preset with the same name. Do " +"you want to overwrite it?\n" +"\tYes: Overwrite the printer preset with the same name, and filament and " +"process presets with the same preset name will be recreated \n" +"and filament and process presets without the same preset name will be " +"reserve.\n" +"\tCancel: Do not create a preset, return to the creation interface." +msgstr "" + +msgid "You need to select at least one filament preset." +msgstr "" + +msgid "You need to select at least one process preset." +msgstr "" + +msgid "Create filament presets failed. As follows:\n" +msgstr "" + +msgid "Create process presets failed. As follows:\n" +msgstr "" + +msgid "Vendor is not find, please reselect." +msgstr "" + +msgid "Current vendor has no models, please reselect." +msgstr "" + +msgid "" +"You have not selected the vendor and model or inputed the custom vendor and " +"model." +msgstr "" + +msgid "" +"There may be escape characters in the custom printer vendor or model. Please " +"delete and re-enter." +msgstr "" + +msgid "" +"All inputs in the custom printer vendor or model are spaces. Please re-enter." +msgstr "" + +msgid "Please check bed printable shape and origin input." +msgstr "" + +msgid "" +"You have not yet selected the printer to replace the nozzle, please choose." +msgstr "" + +msgid "Create Printer Successful" +msgstr "" + +msgid "Create Filament Successful" +msgstr "" + +msgid "Printer Created" +msgstr "" + +msgid "Please go to printer settings to edit your presets" +msgstr "" + +msgid "Filament Created" +msgstr "" + +msgid "" +"Please go to filament setting to edit your presets if you need.\n" +"Please note that nozzle temperature, hot bed temperature, and maximum " +"volumetric speed have a significant impact on printing quality. Please set " +"them carefully." +msgstr "" + +msgid "Printer Setting" +msgstr "" + +msgid "Export Configs" +msgstr "" + +msgid "Printer config bundle(.bbscfg)" +msgstr "" + +msgid "Filament bundle(.bbsflmt)" +msgstr "" + +msgid "Printer presets(.zip)" +msgstr "" + +msgid "Filament presets(.zip)" +msgstr "" + +msgid "Process presets(.zip)" +msgstr "" + +msgid "initialize fail" +msgstr "" + +msgid "add file fail" +msgstr "" + +msgid "add bundle structure file fail" +msgstr "" + +msgid "finalize fail" +msgstr "" + +msgid "open zip written fail" +msgstr "" + +msgid "Export successful" +msgstr "" + +#, c-format, boost-format +msgid "" +"The '%s' folder already exists in the current directory. Do you want to " +"clear it and rebuild it.\n" +"If not, a time suffix will be added, and you can modify the name after " +"creation." +msgstr "" + +msgid "" +"Printer and all the filament&process presets that belongs to the printer. \n" +"Can be shared with others." +msgstr "" + +msgid "" +"User's fillment preset set. \n" +"Can be shared with others." +msgstr "" + +msgid "" +"Only display printer names with changes to printer, filament, and process " +"presets." +msgstr "" + +msgid "Only display the filament names with changes to filament presets." +msgstr "" + +msgid "" +"Only printer names with user printer presets will be displayed, and each " +"preset you choose will be exported as a zip." +msgstr "" + +msgid "" +"Only the filament names with user filament presets will be displayed, \n" +"and all user filament presets in each filament name you select will be " +"exported as a zip." +msgstr "" + +msgid "" +"Only printer names with changed process presets will be displayed, \n" +"and all user process presets in each printer name you select will be " +"exported as a zip." +msgstr "" + +msgid "Please select at least one printer or filament." +msgstr "" + +msgid "Please select a type you want to export" +msgstr "" + +msgid "Edit Filament" +msgstr "" + +msgid "Filament presets under this filament" +msgstr "" + +msgid "" +"Note: If the only preset under this filament is deleted, the filament will " +"be deleted after exiting the dialog." +msgstr "" + +msgid "Presets inherited by other presets can not be deleted" +msgstr "" + +msgid "The following presets inherits this preset." +msgid_plural "The following preset inherits this preset." +msgstr[0] "" + +msgid "Delete Preset" +msgstr "" + +msgid "Are you sure to delete the selected preset?" +msgstr "" + +msgid "Delete preset" +msgstr "" + +msgid "+ Add Preset" +msgstr "" + +msgid "Delete Filament" +msgstr "" + +msgid "" +"All the filament presets belong to this filament would be deleted. \n" +"If you are using this filament on your printer, please reset the filament " +"information for that slot." +msgstr "" + +msgid "Delete filament" +msgstr "" + +msgid "Add Preset" +msgstr "" + +msgid "Add preset for new printer" +msgstr "" + +msgid "Copy preset from filament" +msgstr "" + +msgid "The filament choice not find filament preset, please reselect it" +msgstr "" + +msgid "Edit Preset" +msgstr "" + +msgid "For more information, please check out Wiki" +msgstr "" + +msgid "Collapse" +msgstr "" + +msgid "Daily Tips" +msgstr "" + +msgid "Need select printer" +msgstr "" + +msgid "The start, end or step is not valid value." +msgstr "" + +msgid "" +"Unable to calibrate: maybe because the set calibration value range is too " +"large, or the step is too small" +msgstr "" + +msgid "Physical Printer" +msgstr "" + +msgid "Print Host upload" +msgstr "" + +msgid "Could not get a valid Printer Host reference" +msgstr "" + +msgid "Success!" +msgstr "" + +msgid "Refresh Printers" +msgstr "" + +msgid "" +"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" +"signed certificate." +msgstr "" + +msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" +msgstr "" + +msgid "Open CA certificate file" +msgstr "" + +#, c-format, boost-format +msgid "" +"On this system, %s uses HTTPS certificates from the system Certificate Store " +"or Keychain." +msgstr "" + +msgid "" +"To use a custom CA file, please import your CA file into Certificate Store / " +"Keychain." +msgstr "" + +msgid "Connection to printers connected via the print host failed." +msgstr "" + +#, c-format, boost-format +msgid "Mismatched type of print host: %s" +msgstr "" + +msgid "Connection to AstroBox works correctly." +msgstr "" + +msgid "Could not connect to AstroBox" +msgstr "" + +msgid "Note: AstroBox version at least 1.1.0 is required." +msgstr "" + +msgid "Connection to Duet works correctly." +msgstr "" + +msgid "Could not connect to Duet" +msgstr "" + +msgid "Unknown error occured" +msgstr "" + +msgid "Wrong password" +msgstr "" + +msgid "Could not get resources to create a new connection" +msgstr "" + +msgid "Upload not enabled on FlashAir card." +msgstr "" + +msgid "Connection to FlashAir works correctly and upload is enabled." +msgstr "" + +msgid "Could not connect to FlashAir" +msgstr "" + +msgid "" +"Note: FlashAir with firmware 2.00.02 or newer and activated upload function " +"is required." +msgstr "" + +msgid "Connection to MKS works correctly." +msgstr "" + +msgid "Could not connect to MKS" +msgstr "" + +msgid "Connection to OctoPrint works correctly." +msgstr "" + +msgid "Could not connect to OctoPrint" +msgstr "" + +msgid "Note: OctoPrint version at least 1.1.0 is required." +msgstr "" + +msgid "Connection to Prusa SL1 / SL1S works correctly." +msgstr "" + +msgid "Could not connect to Prusa SLA" +msgstr "" + +msgid "Connection to PrusaLink works correctly." +msgstr "" + +msgid "Could not connect to PrusaLink" +msgstr "" + +msgid "Storages found" +msgstr "" + +#. TRN %1% = storage path +#, boost-format +msgid "%1% : read only" +msgstr "" + +#. TRN %1% = storage path +#, boost-format +msgid "%1% : no free space" +msgstr "" + +#. TRN %1% = host +#, boost-format +msgid "Upload has failed. There is no suitable storage found at %1%." +msgstr "" + +msgid "Connection to Prusa Connect works correctly." +msgstr "" + +msgid "Could not connect to Prusa Connect" +msgstr "" + +msgid "Connection to Repetier works correctly." +msgstr "" + +msgid "Could not connect to Repetier" +msgstr "" + +msgid "Note: Repetier version at least 0.90.0 is required." +msgstr "" + +#, boost-format +msgid "" +"HTTP status: %1%\n" +"Message body: \"%2%\"" +msgstr "" + +#, boost-format +msgid "" +"Parsing of host response failed.\n" +"Message body: \"%1%\"\n" +"Error: \"%2%\"" +msgstr "" + +#, boost-format +msgid "" +"Enumeration of host printers failed.\n" +"Message body: \"%1%\"\n" +"Error: \"%2%\"" +msgstr "" + +#: resources/data/hints.ini: [hint:Precise wall] +msgid "" +"Precise wall\n" +"Did you know that turning on precise wall can improve precision and layer " +"consistency?" +msgstr "" + +#: resources/data/hints.ini: [hint:Sandwich mode] +msgid "" +"Sandwich mode\n" +"Did you know that you can use sandwich mode (inner-outer-inner) to improve " +"precision and layer consistency if your model doesn't have very steep " +"overhangs?" +msgstr "" + +#: resources/data/hints.ini: [hint:Chamber temperature] +msgid "" +"Chamber temperature\n" +"Did you know that OrcaSlicer supports chamber temperature?" +msgstr "" + +#: resources/data/hints.ini: [hint:Calibration] +msgid "" +"Calibration\n" +"Did you know that calibrating your printer can do wonders? Check out our " +"beloved calibration solution in OrcaSlicer." +msgstr "" + +#: resources/data/hints.ini: [hint:Auxiliary fan] +msgid "" +"Auxiliary fan\n" +"Did you know that OrcaSlicer supports Auxiliary part cooling fan?" +msgstr "" + +#: resources/data/hints.ini: [hint:Air filtration] +msgid "" +"Air filtration/Exhuast Fan\n" +"Did you know that OrcaSlicer can support Air filtration/Exhuast Fan?" +msgstr "" + #: resources/data/hints.ini: [hint:How to use keyboard shortcuts] msgid "" "How to use keyboard shortcuts\n" @@ -11371,12 +12228,8 @@ msgstr "" msgid "" "Simplify Model\n" "Did you know that you can reduce the number of triangles in a mesh using the " -"Simplify mesh feature? Right-click the model and select Simplify model. Read " -"more in the documentation." +"Simplify mesh feature? Right-click the model and select Simplify model." msgstr "" -"モデルを簡略化\n" -"オブジェクトのメッシュを簡略化して、スライスの速度を上げられます。モデルを右" -"クリックし、メニューで選択できます。" #: resources/data/hints.ini: [hint:Slicing Parameter Table] msgid "" @@ -11402,7 +12255,7 @@ msgid "" "Subtract a Part\n" "Did you know that you can subtract one mesh from another using the Negative " "part modifier? That way you can, for example, create easily resizable holes " -"directly in Orca Slicer. Read more in the documentation." +"directly in Orca Slicer." msgstr "" #: resources/data/hints.ini: [hint:STEP] @@ -11546,6 +12399,103 @@ msgid "" "probability of warping." msgstr "" +#~ msgid "Edit Text" +#~ msgstr "Edit Text" + +#~ msgid "Error! Unable to create thread!" +#~ msgstr "エラー:スレッドを作成できません" + +#~ msgid "Exception" +#~ msgstr "異常" + +#~ msgid "Choose SLA archive:" +#~ msgstr "Choose SLA archive:" + +#~ msgid "Import file" +#~ msgstr "Import file" + +#~ msgid "Import model and profile" +#~ msgstr "Import model and profile" + +#~ msgid "Import profile only" +#~ msgstr "Import profile only" + +#~ msgid "Import model only" +#~ msgstr "Import model only" + +#~ msgid "Accurate" +#~ msgstr "Accurate" + +#~ msgid "Balanced" +#~ msgstr "Balanced" + +#~ msgid "Quick" +#~ msgstr "Quick" + +#~ msgid "Auto-Calc" +#~ msgstr "自動計算" + +#~ msgid "unloaded" +#~ msgstr "アンロードしました" + +#~ msgid "loaded" +#~ msgstr "ロード済み" + +#~ msgid "Filament #" +#~ msgstr "フィラメント#" + +#~ msgid "" +#~ "Discribe how long the nozzle will move along the last path when retracting" +#~ msgstr "リトラクション時にノズルが最後のパスに沿って移動する距離です。" + +#~ msgid "" +#~ "Simplify Model\n" +#~ "Did you know that you can reduce the number of triangles in a mesh using " +#~ "the Simplify mesh feature? Right-click the model and select Simplify " +#~ "model. Read more in the documentation." +#~ msgstr "" +#~ "モデルを簡略化\n" +#~ "オブジェクトのメッシュを簡略化して、スライスの速度を上げられます。モデルを" +#~ "右クリックし、メニューで選択できます。" + +#~ msgid "Filling bed " +#~ msgstr "Filling bed" + +#, boost-format +#~ msgid "%1% infill pattern doesn't support 100%% density." +#~ msgstr "%1% のインフィル パターンは 100%% の密度をサポートしません。" + +#~ msgid "" +#~ "Switch to rectilinear pattern?\n" +#~ "Yes - switch to rectilinear pattern automaticlly\n" +#~ "No - reset density to default non 100% value automaticlly" +#~ msgstr "" +#~ "直線パターンに切り替えますか?\n" +#~ "はい - 直線パターンに切り替えます\n" +#~ "いいえ - 充填密度をリセットします" + +#~ msgid "Please heat the nozzle to above 170 degree before loading filament." +#~ msgstr "" +#~ "フィラメントをロードする前に、ノズル温度を170℃以上に加熱してください" + +#~ msgid "Newer 3mf version" +#~ msgstr "新3mfバージョン" + +#, c-format +#~ msgid "Density of internal sparse infill, 100% means solid throughout" +#~ msgstr "" +#~ "スパース インフィルの密度です。100%%に設定する場合ソリッドになります。" + +#~ msgid "Tree support wall loops" +#~ msgstr "ツリーサポート壁層数" + +#~ msgid "This setting specify the count of walls around tree support" +#~ msgstr "ツリーサポートの壁面層数です。" + +#, c-format, boost-format +#~ msgid " doesn't work at 100%% density " +#~ msgstr " doesn't work at 100%% density " + #~ msgid "Ctrl + Shift + Enter" #~ msgstr "Ctrl + Shift + Enter" @@ -11567,9 +12517,6 @@ msgstr "" #~ msgid "Export all objects as STL" #~ msgstr "全てのオブジェクト (STL)" -#~ msgid "Slice ok." -#~ msgstr "スライス完了" - #, c-format, boost-format #~ msgid "" #~ "The 3mf's version %s is newer than %s's version %s, Found following keys " @@ -11851,7 +12798,7 @@ msgstr "" #~ msgid "Score" #~ msgstr "Score" -#~ msgid "Bamabu High Temperature Plate" +#~ msgid "Bambu High Temperature Plate" #~ msgstr "Bambu 高温プレート" #~ msgid "Can't connect to the printer" diff --git a/localization/i18n/ko/OrcaSlicer_ko.po b/localization/i18n/ko/OrcaSlicer_ko.po index 39b76accd5..c536a5fb03 100644 --- a/localization/i18n/ko/OrcaSlicer_ko.po +++ b/localization/i18n/ko/OrcaSlicer_ko.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-24 18:09+0100\n" -"PO-Revision-Date: 2023-11-19 11:26+0900\n" +"POT-Creation-Date: 2023-12-19 22:09+0800\n" +"PO-Revision-Date: 2023-12-20 09:20+0900\n" "Last-Translator: Hotsolidinfill <138652683+Hotsolidinfill@users.noreply." "github.com>, crwusiz \n" "Language-Team: \n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Poedit 3.4\n" +"X-Generator: Poedit 3.4.1\n" msgid "Supports Painting" msgstr "지지대 칠하기" @@ -86,7 +86,7 @@ msgid "Circle" msgstr "원" msgid "Sphere" -msgstr "구" +msgstr "구체" msgid "Fill" msgstr "채움" @@ -108,7 +108,7 @@ msgid "Support Generated" msgstr "지지대 생성됨" msgid "Gizmo-Place on Face" -msgstr "" +msgstr "Gizmo-면에 배치" msgid "Lay on face" msgstr "바닥면 선택" @@ -158,7 +158,7 @@ msgid "Height range" msgstr "높이 범위" msgid "Alt + Shift + Enter" -msgstr "" +msgstr "Alt + Shift + Enter" msgid "Toggle Wireframe" msgstr "와이어프레임 전환" @@ -189,13 +189,13 @@ msgid "Move" msgstr "이동" msgid "Gizmo-Move" -msgstr "" +msgstr "Gizmo-이동" msgid "Rotate" msgstr "회전" msgid "Gizmo-Rotate" -msgstr "" +msgstr "Gizmo-회전" msgid "Optimize orientation" msgstr "방향 최적화" @@ -207,16 +207,16 @@ msgid "Scale" msgstr "배율" msgid "Gizmo-Scale" -msgstr "" +msgstr "Gizmo-배율" msgid "Error: Please close all toolbar menus first" msgstr "오류: 먼저 모든 도구 모음 메뉴를 닫으십시오." msgid "in" -msgstr "in" +msgstr "인치" msgid "mm" -msgstr "mm" +msgstr "밀리미터" msgid "Position" msgstr "위치" @@ -299,6 +299,13 @@ msgstr "모든 커넥터 선택" msgid "Cut" msgstr "잘라내기" +msgid "non-mainifold edges be caused by cut tool, do you want to fix it now?" +msgstr "" +"절단 도구로 인해 메인폴드가 아닌 가장자리가 발생했는데 지금 수정하시겠습니까?" + +msgid "Repairing model object" +msgstr "모델 개체 수리 중" + msgid "Connector" msgstr "커넥터" @@ -506,13 +513,13 @@ msgid "Remove selection" msgstr "선택 삭제" msgid "Entering Seam painting" -msgstr "" +msgstr "솔기 칠하기 입력" msgid "Leaving Seam painting" -msgstr "" +msgstr "솔기 칠하기 떠나기" msgid "Paint-on seam editing" -msgstr "" +msgstr "페인트칠 솔기 편집" msgid "Font" msgstr "글꼴" @@ -555,7 +562,7 @@ msgid "Ctrl+" msgstr "Ctrl+" msgid "Notice" -msgstr "공지" +msgstr "공지사항" msgid "Undefined" msgstr "정의되지 않음" @@ -568,7 +575,7 @@ msgid "The configuration may be generated by a newer version of OrcaSlicer." msgstr "최신 버전의 OrcaSlicer에서 설정을 생성할 수 있습니다." msgid "Some values have been replaced. Please check them:" -msgstr "일부 값이 변경되었습니다. 다음을 확인하십시오:" +msgstr "일부 값이 변경되었습니다. 다음을 확인하세요:" msgid "Process" msgstr "프로세스" @@ -604,7 +611,7 @@ msgid "" "OrcaSlicer will terminate because of a localization error. It will be " "appreciated if you report the specific scenario this issue happened." msgstr "" -"OrcaSlicer는 현지화 오류로 인해 종료됩니다. 이 문제가 발생한 구체적인 시나리" +"Orca Slicer는 현지화 오류로 인해 종료됩니다. 이 문제가 발생한 구체적인 시나리" "오를 보고해 주시면 감사하겠습니다." msgid "Critical error" @@ -612,10 +619,10 @@ msgstr "치명적 오류" #, boost-format msgid "OrcaSlicer got an unhandled exception: %1%" -msgstr "OrcaSlicer에 처리되지 않은 예외가 발생했습니다: %1%" +msgstr "Orca Slicer에 처리되지 않은 예외가 발생했습니다: %1%" msgid "Downloading Bambu Network Plug-in" -msgstr "Bambu 네트워크 플러그인 다운로드" +msgstr "뱀부 네트워크 플러그인 다운로드" msgid "Login information expired. Please login again." msgstr "로그인 정보가 만료되었습니다. 다시 로그인해주세요." @@ -634,7 +641,7 @@ msgid "" msgstr "" "Orca Slicer의 특정 기능이 작동하려면 Microsoft WebView2 Runtime이 필요합니" "다.\n" -"지금 설치하려면 예를 클릭하세요." +"지금 설치하려면 예 를 클릭하세요." msgid "WebView2 Runtime" msgstr "WebView2 런타임" @@ -658,7 +665,7 @@ msgid "Click to download new version in default browser: %s" msgstr "기본 브라우저에서 새 버전을 다운로드하려면 클릭: %s" msgid "The Orca Slicer needs an upgrade" -msgstr "Orca Slicer는 업그레이드가 필요합니다" +msgstr "Orca Slicer 업그레이드가 필요합니다" msgid "This is the newest version." msgstr "최신 버전입니다." @@ -672,8 +679,8 @@ msgid "" "Please note, application settings will be lost, but printer profiles will " "not be affected." msgstr "" -"OrcaSlicer 구성 파일이 손상되어 구문을 분석할 수 없습니다.\n" -"OrcaSlicer가 구성 파일을 다시 생성하려고 시도했습니다.\n" +"Orca Slicer 구성 파일이 손상되어 구문을 분석할 수 없습니다.\n" +"Orca Slicer가 구성 파일을 다시 생성하려고 시도했습니다.\n" "응용 프로그램 설정은 손실되지만 프린터 프로필은 영향을 받지 않습니다." msgid "Rebuild" @@ -732,9 +739,11 @@ msgid "" "The number of user presets cached in the cloud has exceeded the upper limit, " "newly created user presets can only be used locally." msgstr "" +"클라우드에 캐시된 사용자 사전 설정 수가 상한을 초과했습니다.새로 생성된 사용" +"자 사전 설정은 로컬에서만 사용할 수 있습니다." msgid "Sync user presets" -msgstr "" +msgstr "사용자 사전 설정 동기화" msgid "Loading" msgstr "로드 중" @@ -749,7 +758,7 @@ msgid "Select the language" msgstr "언어 선택" msgid "Language" -msgstr "언어(Language)" +msgstr "언어" msgid "*" msgstr "*" @@ -828,7 +837,7 @@ msgid "Ironing" msgstr "다림질" msgid "Fuzzy Skin" -msgstr "흐트러진 스킨" +msgstr "퍼지 스킨" msgid "Extruders" msgstr "압출기" @@ -860,6 +869,24 @@ msgstr "지지대 차단기 추가" msgid "Add support enforcer" msgstr "지지대 강제기 추가" +msgid "Add text" +msgstr "텍스트 추가" + +msgid "Add negative text" +msgstr "텍스트 제외 추가" + +msgid "Add text modifier" +msgstr "텍스트 수정자 추가" + +msgid "Add SVG part" +msgstr "SVG 부분 추가" + +msgid "Add negative SVG" +msgstr "SVG 제외 추가" + +msgid "Add SVG modifier" +msgstr "SVG 수정자 추가" + msgid "Select settings" msgstr "설정 선택" @@ -876,9 +903,6 @@ msgstr "Del" msgid "Delete the selected object" msgstr "선택된 개체 삭제" -msgid "Edit Text" -msgstr "텍스트 편집" - msgid "Load..." msgstr "불러오기..." @@ -892,7 +916,7 @@ msgid "Autodesk FDM Test" msgstr "Autodesk FDM 테스트" msgid "Voron Cube" -msgstr "Voron 큐브" +msgstr "보론 큐브" msgid "Cube" msgstr "정육면체" @@ -903,6 +927,12 @@ msgstr "원기둥" msgid "Cone" msgstr "원뿔" +msgid "Text" +msgstr "텍스트" + +msgid "SVG" +msgstr "SVG" + msgid "Height range Modifier" msgstr "높이 범위 수정자" @@ -931,10 +961,10 @@ msgid "Fix model" msgstr "모델 수리" msgid "Export as one STL" -msgstr "" +msgstr "하나의 STL로 내보내기" msgid "Export as STLs" -msgstr "" +msgstr "여러 STL로 내보내기" msgid "Reload from disk" msgstr "디스크에서 다시 불러오기" @@ -1036,6 +1066,18 @@ msgstr "반전" msgid "Mirror object" msgstr "개체 반전" +msgid "Edit text" +msgstr "텍스트 편집" + +msgid "Ability to change text, font, size, ..." +msgstr "텍스트, 글꼴, 크기 등을 변경하는 기능..." + +msgid "Edit SVG" +msgstr "SVG 편집" + +msgid "Change SVG source file, projection, size, ..." +msgstr "SVG 소스 파일, 투영, 크기 변경..." + msgid "Invalidate cut info" msgstr "잘못된 잘라내기 정보" @@ -1043,7 +1085,7 @@ msgid "Add Primitive" msgstr "기본 모델 추가" msgid "Show Labels" -msgstr "이름표 표시" +msgstr "이름표 보기" msgid "To objects" msgstr "개체로" @@ -1186,9 +1228,6 @@ msgstr "아이콘을 클릭하여 개체의 색상 칠하기를 편집합니다" msgid "Click the icon to shift this object to the bed" msgstr "아이콘을 클릭하여 이 개체를 베드로 옮깁니다" -msgid " search results" -msgstr "" - msgid "Loading file" msgstr "파일 로딩 중" @@ -1333,9 +1372,6 @@ msgstr "새 이름 입력" msgid "Renaming" msgstr "이름 변경 중" -msgid "Repairing model object" -msgstr "모델 개체 수리 중" - msgid "Following model object has been repaired" msgid_plural "Following model objects have been repaired" msgstr[0] "다음 모델 개체가 수리되었습니다" @@ -1423,7 +1459,7 @@ msgid "Reset parameter" msgstr "매개변수 초기화" msgid "Multicolor Print" -msgstr "다색상 출력" +msgstr "멀티컬러 출력" msgid "Line Type" msgstr "선 유형" @@ -1447,7 +1483,7 @@ msgid "Pause" msgstr "일시 정지" msgid "Template" -msgstr "" +msgstr "탬플릿" msgid "Custom" msgstr "사용자 설정" @@ -1459,10 +1495,10 @@ msgid "Custom Template:" msgstr "사용자 지정 템플릿:" msgid "Custom G-code:" -msgstr "사용자 설정 G코드:" +msgstr "사용자 정의 G코드:" msgid "Custom G-code" -msgstr "사용자 설정 G코드" +msgstr "사용자 정의 G코드" msgid "Enter Custom G-code used on current layer:" msgstr "현재 레이어에 사용될 사용자 지정 G코드 입력:" @@ -1477,7 +1513,7 @@ msgid "Jump to layer" msgstr "다음 레이어로 이동" msgid "Please enter the layer number" -msgstr "레이어 번호를 입력하십시오" +msgstr "레이어 번호를 입력하세요" msgid "Add Pause" msgstr "일시 정지 추가" @@ -1486,13 +1522,13 @@ msgid "Insert a pause command at the beginning of this layer." msgstr "이 레이어의 시작 부분에 일시 정지 명령을 삽입합니다." msgid "Add Custom G-code" -msgstr "사용자 지정 G코드 추가" +msgstr "사용자 정의 G코드 추가" msgid "Insert custom G-code at the beginning of this layer." msgstr "이 레이어의 시작 부분에 사용자 지정 G코드를 삽입합니다." msgid "Add Custom Template" -msgstr "사용자 지정 템플릿 추가" +msgstr "사용자 정의 템플릿 추가" msgid "Insert template custom G-code at the beginning of this layer." msgstr "이 레이어의 시작 부분에 사용자 지정 템플릿 G코드를 삽입합니다." @@ -1537,7 +1573,7 @@ msgid "Failed to connect to cloud service" msgstr "클라우드 서비스에 연결하지 못했습니다" msgid "Please click on the hyperlink above to view the cloud service status" -msgstr "클라우드 서비스 상태를 보려면 위의 하이퍼링크를 클릭하십시오" +msgstr "클라우드 서비스 상태를 보려면 위의 하이퍼링크를 클릭하세요" msgid "Failed to connect to the printer" msgstr "프린터 연결 실패" @@ -1546,7 +1582,7 @@ msgid "Connection to printer failed" msgstr "프린터 연결 실패" msgid "Please check the network connection of the printer and Studio." -msgstr "프린터와 Studio의 네트워크 연결을 확인하십시오." +msgstr "프린터와 Orca Slicer의 네트워크 연결을 확인하세요." msgid "Connecting..." msgstr "연결 중..." @@ -1573,7 +1609,7 @@ msgid "Load Filament" msgstr "필라멘트 넣기" msgid "Unload Filament" -msgstr "필라멘트 빼기" +msgstr "필라멘트 언로드" msgid "Ext Spool" msgstr "외부 스풀" @@ -1591,10 +1627,10 @@ msgid "Calibrating AMS..." msgstr "AMS 교정 중..." msgid "A problem occured during calibration. Click to view the solution." -msgstr "교정하는 동안 문제가 발생했습니다. 솔루션을 보려면 클릭하십시오." +msgstr "교정하는 동안 문제가 발생했습니다. 솔루션을 보려면 클릭하세요." msgid "Calibrate again" -msgstr "다시 교정" +msgstr "재교정" msgid "Cancel calibration" msgstr "교정 취소" @@ -1659,10 +1695,6 @@ msgstr "" msgid "Arranging..." msgstr "정렬 중..." -msgid "" -"Arrange failed. Found some exceptions when processing object geometries." -msgstr "정렬에 실패했습니다. 개체 형상을 처리할 때 일부 예외를 발견했습니다." - msgid "Arranging" msgstr "정렬 중" @@ -1672,12 +1704,16 @@ msgstr "정렬 취소됨." msgid "" "Arranging is done but there are unpacked items. Reduce spacing and try again." msgstr "" -"정렬은 완료되었지만 배치가 안 된 항목이 있습니다. 간격을 줄이고 다시 시도하십" -"시오." +"정렬은 완료되었지만 배치가 안 된 항목이 있습니다. 간격을 줄이고 다시 시도하세" +"요." msgid "Arranging done." msgstr "정렬 완료." +msgid "" +"Arrange failed. Found some exceptions when processing object geometries." +msgstr "정렬에 실패했습니다. 개체 형상을 처리할 때 일부 예외를 발견했습니다." + #, c-format, boost-format msgid "" "Arrangement ignored the following objects which can't fit into a single " @@ -1707,8 +1743,11 @@ msgstr "방향 지정 중..." msgid "Orienting" msgstr "방향 지정 중" -msgid "Filling bed " -msgstr "베드 채움 " +msgid "Orienting canceled." +msgstr "방향지정이 취소되었습니다." + +msgid "Filling" +msgstr "채움" msgid "Bed filling canceled." msgstr "베드 채움 취소됨." @@ -1716,11 +1755,14 @@ msgstr "베드 채움 취소됨." msgid "Bed filling done." msgstr "베드 채움 완료." -msgid "Error! Unable to create thread!" -msgstr "오류! 스레드를 만들 수 없습니다!" +msgid "Searching for optimal orientation" +msgstr "최적의 방향 검색" -msgid "Exception" -msgstr "예외" +msgid "Orientation search canceled." +msgstr "방향 검색이 취소되었습니다." + +msgid "Orientation found." +msgstr "방향을 찾았습니다." msgid "Logging in" msgstr "로그인 중" @@ -1729,20 +1771,20 @@ msgid "Login failed" msgstr "로그인 실패" msgid "Please check the printer network connection." -msgstr "프린터 네트워크 연결을 확인하십시오." +msgstr "프린터 네트워크 연결을 확인하세요." msgid "Abnormal print file data. Please slice again." -msgstr "비정상적인 출력 파일 데이터: 다시 슬라이스하십시오." +msgstr "비정상적인 출력 파일 데이터: 다시 슬라이스하세요." msgid "Task canceled." msgstr "작업 취소됨." msgid "Upload task timed out. Please check the network status and try again." msgstr "" -"업로드 작업 시간이 초과되었습니다.네트워크 상태를 확인하고 다시 시도하십시오." +"업로드 작업 시간이 초과되었습니다.네트워크 상태를 확인하고 다시 시도하세요." msgid "Cloud service connection failed. Please try again." -msgstr "클라우드 서비스 연결에 실패했습니다. 다시 시도하십시오." +msgstr "클라우드 서비스 연결에 실패했습니다. 다시 시도하세요." msgid "Print file not found. please slice again." msgstr "출력파일을 찾을 수 없습니다. 다시 슬라이스하세요." @@ -1755,30 +1797,29 @@ msgstr "" "이스하세요." msgid "Failed to send the print job. Please try again." -msgstr "출력 작업을 전송하지 못했습니다. 다시 시도하십시오." +msgstr "출력 작업을 전송하지 못했습니다. 다시 시도하세요." msgid "Failed to upload file to ftp. Please try again." msgstr "Ftp에 파일을 업로드하지 못했습니다. 다시 시도해 주세요." msgid "" "Check the current status of the bambu server by clicking on the link above." -msgstr "위의 링크를 클릭하여 Bambu Lab 서버의 현재 상태를 확인하십시오." +msgstr "위의 링크를 클릭하여 뱀부랩 서버의 현재 상태를 확인하세요." msgid "" "The size of the print file is too large. Please adjust the file size and try " "again." -msgstr "" -"출력 파일의 크기가 너무 큽니다. 파일 크기를 조정한 후 다시 시도하십시오." +msgstr "출력 파일의 크기가 너무 큽니다. 파일 크기를 조정한 후 다시 시도하세요." msgid "Print file not found, Please slice it again and send it for printing." -msgstr "출력 파일을 찾을 수 없습니다. 다시 슬라이스하여 출력전송하십시오." +msgstr "출력 파일을 찾을 수 없습니다. 다시 슬라이스하여 출력전송하세요." msgid "" "Failed to upload print file to FTP. Please check the network status and try " "again." msgstr "" "FTP를 통한 출력 파일 업로드에 실패했습니다. 네트워크 상태를 확인하고 다시 시" -"도하십시오." +"도하세요." msgid "Sending print job over LAN" msgstr "LAN을 통해 출력 작업 전송 중" @@ -1787,12 +1828,7 @@ msgid "Sending print job through cloud service" msgstr "클라우드 서비스를 통해 출력 작업 전송 중" msgid "Print task sending times out." -msgstr "" - -msgid "" -"The printer timed out while receiving a print job. Please check if the " -"network is functioning properly and send the print again." -msgstr "" +msgstr "인쇄 작업 전송 시간이 초과되었습니다." msgid "Service Unavailable" msgstr "서비스 사용 불가" @@ -1827,39 +1863,15 @@ msgstr "성공적으로 보냈습니다. %s초 내에 현재 페이지가 닫힙 msgid "An SD card needs to be inserted before sending to printer." msgstr "프린터로 전송 전에 SD 카드를 삽입해야 합니다." -msgid "Choose SLA archive:" -msgstr "SLA 아카이브 선택:" - -msgid "Import file" -msgstr "파일 가져오기" - -msgid "Import model and profile" -msgstr "모델과 파일 가져오기" - -msgid "Import profile only" -msgstr "프로필만 가져오기" - -msgid "Import model only" -msgstr "모델만 가져오기" - -msgid "Accurate" -msgstr "정밀한" - -msgid "Balanced" -msgstr "균형 잡힌" - -msgid "Quick" -msgstr "빠른" - msgid "Importing SLA archive" -msgstr "SLA 아카이브 가져오는 중" +msgstr "SLA 압축파일 가져오는 중" msgid "" "The SLA archive doesn't contain any presets. Please activate some SLA " "printer preset first before importing that SLA archive." msgstr "" -"SLA 아카이브에 사전 설정이 없습니다. 해당 SLA 아카이브를 가져오기 전에 먼저 " -"일부 SLA 프린터 사전 설정을 활성화하십시오." +"SLA 압축파일에 사전 설정이 없습니다. 해당 SLA 압축파일를 가져오기 전에 먼저 " +"일부 SLA 프린터 사전 설정을 활성화하세요." msgid "Importing canceled." msgstr "가져오기가 취소되었습니다." @@ -1871,14 +1883,14 @@ msgid "" "The imported SLA archive did not contain any presets. The current SLA " "presets were used as fallback." msgstr "" -"가져온 SLA 아카이브에 사전 설정이 없습니다. 현재 SLA 사전 설정이 예비로 사용" +"가져온 SLA 압축파일에 사전 설정이 없습니다. 현재 SLA 사전 설정이 예비로 사용" "되었습니다." msgid "You cannot load SLA project with a multi-part object on the bed" msgstr "베드에 다중 부품 개체가 있는 SLA 프로젝트를 로드할 수 없습니다" msgid "Please check your object list before preset changing." -msgstr "사전 설정을 변경하기 전에 개체 목록을 확인하십시오." +msgstr "사전 설정을 변경하기 전에 개체 목록을 확인하세요." msgid "Attention!" msgstr "주목!" @@ -1937,14 +1949,14 @@ msgstr "" #, c-format, boost-format msgid "About %s" -msgstr "About %s" +msgstr "%s 정보" msgid "Orca Slicer " msgstr "Orca Slicer " msgid "OrcaSlicer is based on BambuStudio, PrusaSlicer, and SuperSlicer." msgstr "" -"OrcaSlicer는 BambuStudio, PrusaSlicer 및 SuperSlicer를 기반으로 합니다." +"Orca Slicer는 BambuStudio, PrusaSlicer 및 SuperSlicer를 기반으로 합니다." msgid "BambuStudio is originally based on PrusaSlicer by PrusaResearch." msgstr "BambuStudio는 PrusaResearch의 PrusaSlicer를 기반으로 합니다." @@ -2019,10 +2031,10 @@ msgid "You need to select the material type and color first." msgstr "재료 유형과 색상을 먼저 선택해야 합니다." msgid "Please input a valid value (K in 0~0.3)" -msgstr "" +msgstr "유효한 값을 입력하세요(K는 0~0.3)" msgid "Please input a valid value (K in 0~0.3, N in 0.6~2.0)" -msgstr "" +msgstr "유효한 값을 입력하세요(K는 0~0.3, N은 0.6~2.0)" msgid "Other Color" msgstr "기타 색상" @@ -2039,7 +2051,7 @@ msgid "" "auto-filled by selecting a filament preset." msgstr "" "노즐 온도와 최대 체적 속도는 교정 결과에 영향을 미칩니다. 실제 출력과 동일한 " -"값을 입력하십시오. 필라멘트 사전 설정을 선택하여 자동으로 입력할 수 있습니다." +"값을 입력하세요. 필라멘트 사전 설정을 선택하여 자동으로 입력할 수 있습니다." msgid "Nozzle Diameter" msgstr "노즐 직경" @@ -2097,7 +2109,7 @@ msgstr "교정 완료" #, c-format, boost-format msgid "%s does not support %s" -msgstr "%s은(는) %s을(를) 지원하지 않습니다" +msgstr "%s 은(는) %s 을(를) 지원하지 않습니다" msgid "Dynamic flow Calibration" msgstr "동적 유량 교정" @@ -2192,8 +2204,7 @@ msgstr "프린터는 현재 자동 리필을 지원하지 않습니다." msgid "" "AMS filament backup is not enabled, please enable it in the AMS settings." -msgstr "" -"AMS 필라멘트 백업이 활성화되지 않았습니다. AMS 설정에서 활성화하십시오." +msgstr "AMS 필라멘트 백업이 활성화되지 않았습니다. AMS 설정에서 활성화하세요." msgid "" "If there are two identical filaments in AMS, AMS filament backup will be " @@ -2215,8 +2226,8 @@ msgid "" "The AMS will automatically read the filament information when inserting a " "new Bambu Lab filament. This takes about 20 seconds." msgstr "" -"AMS는 새 Bambu Lab 필라멘트를 삽입할 때 필라멘트 정보를 자동으로 읽습니다. " -"이 작업은 약 20초 정도 걸립니다." +"AMS는 새 뱀부랩 필라멘트를 삽입할 때 필라멘트 정보를 자동으로 읽습니다. 이 작" +"업은 약 20초 정도 걸립니다." msgid "" "Note: if new filament is inserted during printing, the AMS will not " @@ -2283,20 +2294,20 @@ msgid "" "software, check and retry." msgstr "" "플러그인을 다운로드하지 못했습니다. 방화벽 설정 및 VPN 소프트웨어를 확인하고 " -"확인한 후 다시 시도하십시오." +"확인한 후 다시 시도하세요." msgid "" "Failed to install the plug-in. Please check whether it is blocked or deleted " "by anti-virus software." msgstr "" "플러그인을 설치하지 못했습니다. 안티바이러스 소프트웨어에 의해 차단 또는 삭제" -"되었는지 확인하십시오." +"되었는지 확인하세요." msgid "click here to see more info" -msgstr "자세한 내용을 보려면 여기를 클릭하십시오" +msgstr "자세한 내용을 보려면 여기를 클릭하세요" msgid "Please home all axes (click " -msgstr "모든 축을 홈으로 이동하십시오(클릭 " +msgstr "모든 축을 홈으로 이동하세요(클릭 " msgid "" ") to locate the toolhead's position. This prevents device moving beyond the " @@ -2306,7 +2317,7 @@ msgstr "" "벗어나 장치가 마모되는 것을 방지할 수 있습니다." msgid "Go Home" -msgstr "홈으로 이동" +msgstr "홈으로" msgid "" "A error occurred. Maybe memory of system is not enough or it's a bug of the " @@ -2315,7 +2326,7 @@ msgstr "" "오류가 발생했습니다. 시스템 메모리가 부족하거나 프로그램의 버그일 수 있습니다" msgid "Please save project and restart the program. " -msgstr "프로젝트를 저장하고 프로그램을 다시 시작하십시오. " +msgstr "프로젝트를 저장하고 프로그램을 다시 시작하세요. " msgid "Processing G-Code from Previous file..." msgstr "이전 파일의 G코드를 처리하는 중..." @@ -2339,7 +2350,7 @@ msgid "Underflow" msgstr "압출부족" msgid "Floating reserved operand" -msgstr "Floating reserved operand" +msgstr "떠있는 예약 피연산자" msgid "Stack overflow" msgstr "스택 오버플로" @@ -2431,7 +2442,7 @@ msgid "" msgstr "선택한 파일에 여러 개의 분리된 영역이 있습니다. 지원되지 않습니다." msgid "Choose a file to import bed texture from (PNG/SVG):" -msgstr "베드 텍스쳐를 불러올 파일 선택(PNG/SVG):" +msgstr "베드 텍스처를 가져올 파일을 선택하세요 (PNG/SVG):" msgid "Choose an STL file to import bed model from:" msgstr "베드 모델을 가져올 STL 파일 선택:" @@ -2445,7 +2456,7 @@ msgid "" "\n" msgstr "" "온도가 권장 범위를 벗어나면 노즐이 막힐 수 있습니다.\n" -"출력 시 어떤 온도를 사용할지 확인하십시오.\n" +"출력 시 어떤 온도를 사용할지 확인하세요.\n" "\n" #, c-format, boost-format @@ -2515,7 +2526,7 @@ msgid "" "The value will be reset to 0." msgstr "" "너무 큰 코끼리 발 보정은 부적절합니다.\n" -"코끼리 발 효과가 정말 심각한 경우 다른 설정을 확인하십시오.\n" +"코끼리 발 효과가 정말 심각한 경우 다른 설정을 확인하세요.\n" "예를 들어, 침대 온도가 너무 높은지 여부를 확인합니다.\n" "\n" "값이 0으로 재설정됩니다." @@ -2524,7 +2535,7 @@ msgid "" "Spiral mode only works when wall loops is 1, support is disabled, top shell " "layers is 0, sparse infill density is 0 and timelapse type is traditional." msgstr "" -"나선 모드는 벽 루프 1, 지지대 비활성화, 상단 셸 레이어 0, 드문 내부 채움 밀" +"나선형 모드는 벽 루프 1, 지지대 비활성화, 상단 셸 레이어 0, 드문 내부 채움 밀" "도 0, 타임랩스 유형이 기존인 경우에만 작동합니다." msgid " But machines with I3 structure will not generate timelapse videos." @@ -2536,7 +2547,7 @@ msgid "" "No - Give up using spiral mode this time" msgstr "" "이 설정을 자동으로 변경하시겠습니까?\n" -"예 - 이 설정을 변경하고 나선 모드를 자동으로 활성화합니다\n" +"예 - 이 설정을 변경하고 나선 모드를 자동으로 활성화합니다\n" "아니오 - 이번에는 나선 모드 사용을 포기합니다" msgid "" @@ -2549,7 +2560,7 @@ msgstr "" "적응형 레이어 높이 또는 독립적 지지대 레이어 높이가 켜져 있으면 프라임 타워" "가 작동하지 않습니다.\n" "어떤 것을 유지하시겠습니까?\n" -"예 - 프라임 타워 유지\n" +"예 - 프라임 타워 유지\n" "아니요 - 적응형 레이어 높이 및 독립적 지지대 레이어 높이 유지" msgid "" @@ -2560,7 +2571,7 @@ msgid "" msgstr "" "적응형 레이어 높이가 켜져 있으면 프라임 타워가 작동하지 않습니다.\n" "어떤 것을 유지하시겠습니까?\n" -"예 - 프라임 타워 유지\n" +"예 - 프라임 타워 유지\n" "아니요 - 적응형 레이어 높이 유지" msgid "" @@ -2571,22 +2582,9 @@ msgid "" msgstr "" "독립적 지지대 레이어 높이가 켜져 있으면 프라임 타워가 작동하지 않습니다.\n" "어떤 것을 유지하시겠습니까?\n" -"예 - 프라임 타워 유지\n" +"예 - 프라임 타워 유지\n" "아니요 - 독립적 지지대 레이어 높이 유지" -#, boost-format -msgid "%1% infill pattern doesn't support 100%% density." -msgstr "%1% 내부 채움 패턴은 100%% 밀도를 지원하지 않습니다." - -msgid "" -"Switch to rectilinear pattern?\n" -"Yes - switch to rectilinear pattern automaticlly\n" -"No - reset density to default non 100% value automaticlly" -msgstr "" -"직선 패턴으로 전환하시겠습니까?\n" -"예 - 자동으로 직선 패턴으로 전환합니다\n" -"아니요 - 밀도를 기본값(100%가 아닌 값)으로 자동 재설정합니다" - msgid "" "While printing by Object, the extruder may collide skirt.\n" "Thus, reset the skirt layer to 1 to avoid that." @@ -2687,6 +2685,18 @@ msgstr "사용자가 삽입한 G코드로 인해 일시중지됨" msgid "Motor noise showoff" msgstr "모터 소음 표시" +msgid "Nozzle filament covered detected pause" +msgstr "노즐 필라멘트가 덮여있는게 감지되어 일시중지" + +msgid "Cutter error pause" +msgstr "커터 오류 일시중지" + +msgid "First layer error pause" +msgstr "첫번째 레이어 오류 일시중지" + +msgid "Nozzle clog pause" +msgstr "노즐 막힘 일시 중지" + msgid "MC" msgstr "MC" @@ -2770,21 +2780,21 @@ msgid "TPU is not supported by AMS." msgstr "TPU는 AMS에서 지원되지 않습니다." msgid "Bambu PET-CF/PA6-CF is not supported by AMS." -msgstr "Bambu PET-CF/PA6-CF는 AMS에서 지원되지 않습니다." +msgstr "뱀부 PET-CF/PA6-CF는 AMS에서 지원되지 않습니다." msgid "" "Damp PVA will become flexible and get stuck inside AMS,please take care to " "dry it before use." msgstr "" -"Damp PVA will become flexible and get stuck inside AMS,please take care to " -"dry it before use." +"습한 PVA는 유연해져서 AMS 내부에 달라붙게 됩니다. 사용하기 전에 건조시키십시" +"오." msgid "" "CF/GF filaments are hard and brittle, It's easy to break or get stuck in " "AMS, please use with caution." msgstr "" "CF/GF 필라멘트는 단단하고 부서지기 쉽습니다. AMS에 걸리거나 부러지기 쉬우므" -"로 주의하여 사용하십시오." +"로 주의하여 사용하세요." msgid "default" msgstr "기본값" @@ -2797,7 +2807,7 @@ msgstr "N/A" #, c-format, boost-format msgid "%s can't be percentage" -msgstr "%s는 백분율일 수 없습니다" +msgstr "%s 는 백분율일 수 없습니다" #, c-format, boost-format msgid "Value %s is out of range, continue?" @@ -2890,7 +2900,7 @@ msgid "Total" msgstr "합계" msgid "Tower" -msgstr "" +msgstr "타워" msgid "Total Estimation" msgstr "추정치 합계" @@ -2986,10 +2996,10 @@ msgid "Print settings" msgstr "프린터 설정" msgid "Custom g-code" -msgstr "" +msgstr "사용자 정의 G코드" msgid "ToolChange" -msgstr "" +msgstr "툴체인지" msgid "Time Estimation" msgstr "추정 시간" @@ -3097,7 +3107,7 @@ msgid "Allow multiple materials on same plate" msgstr "동일한 플레이트에 여러 재료 허용" msgid "Avoid extrusion calibration region" -msgstr "압출 교정 영역을 피하십시오" +msgstr "압출 교정 영역을 피하세요" msgid "Align to Y axis" msgstr "Y축에 정렬" @@ -3124,7 +3134,7 @@ msgid "Split to parts" msgstr "부품으로 분할" msgid "Assembly View" -msgstr "조립도" +msgstr "조립 보기" msgid "Select Plate" msgstr "플레이트 선택" @@ -3159,13 +3169,13 @@ msgstr "용량:" msgid "Size:" msgstr "크기:" -#, boost-format +#, c-format, boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." msgstr "" "레이어 %d, z = %.2lf mm에서 G코드 경로 충돌이 발견되었습니다. 충돌하는 개체" -"를 더 멀리 분리하십시오(%s <-> %s)." +"를 더 멀리 분리하세요(%s <-> %s)." msgid "An object is layed over the boundary of plate." msgstr "개체가 플레이트 경계 위에 놓여 있습니다." @@ -3186,7 +3196,7 @@ msgid "" msgstr "" "개체가 플레이트 경계를 넘었거나 높이 제한을 초과했습니다.\n" "플레이트 위 또는 밖으로 완전히 이동시키고 높이가 빌드 출력 가능 영역 내에 있" -"는지 확인하여 문제를 해결하십시오." +"는지 확인하여 문제를 해결하세요." msgid "Calibration step selection" msgstr "교정 단계 선택" @@ -3233,7 +3243,7 @@ msgid "Auto-record Monitoring" msgstr "모니터링 자동 기록" msgid "Go Live" -msgstr "Go Live" +msgstr "실시간" msgid "Resolution" msgstr "해상도" @@ -3349,7 +3359,7 @@ msgstr "네트워크 테스트 열기" #, c-format, boost-format msgid "&About %s" -msgstr "&%s 정보" +msgstr "%s 정보 (&A)" msgid "Upload Models" msgstr "모델 업로드" @@ -3444,16 +3454,16 @@ msgid "Import" msgstr "가져오기" msgid "Export all objects as one STL" -msgstr "" +msgstr "모든 개체를 하나의 STL로 내보내기" msgid "Export all objects as STLs" -msgstr "" +msgstr "모든 개체를 여러 STL로 내보내기" msgid "Export Generic 3MF" msgstr "일반 3MF 내보내기" msgid "Export 3mf file without using some 3mf-extensions" -msgstr "3mf-extensions을 사용하지 않고 3mf 파일 내보내기" +msgstr "일부 3mf 확장자를 사용하지 않고 3mf 파일 내보내기" msgid "Export current sliced file" msgstr "현재 슬라이스 파일 내보내기" @@ -3468,7 +3478,7 @@ msgid "Export current plate as G-code" msgstr "현재 플레이트를 G코드로 내보내기" msgid "Export &Configs" -msgstr "설정 &내보내기" +msgstr "설정 내보내기 (&C)" msgid "Export current configuration to files" msgstr "현재 설정을 파일로 내보내기" @@ -3536,14 +3546,26 @@ msgstr "원근법 보기 사용" msgid "Use Orthogonal View" msgstr "평행 투영 보기 사용" +msgid "Show &G-code Window" +msgstr "G코드 창 표시 (&G)" + +msgid "Show g-code window in Previce scene" +msgstr "예측 장면에 G코드 창 표시" + +msgid "Reset Window Layout" +msgstr "창 레이아웃 재설정" + +msgid "Reset to default window layout" +msgstr "기본 창 레이아웃으로 재설정" + msgid "Show &Labels" -msgstr "이름표 &보기" +msgstr "이름표 보기 (&L)" msgid "Show object labels in 3D scene" msgstr "3D 화면에 개체 이름표 표시" msgid "Show &Overhang" -msgstr "돌출부 보기" +msgstr "돌출부 보기 (&O)" msgid "Show object overhang highlight in 3D scene" msgstr "3D 장면에서 개체 오버행 하이라이트 표시" @@ -3603,44 +3625,44 @@ msgid "More calibrations" msgstr "추가 교정" msgid "&Open G-code" -msgstr "&G코드 열기" +msgstr "G코드 열기 (&O)" msgid "Open a G-code file" msgstr "G코드 파일 열기" msgid "Re&load from Disk" -msgstr "디스크에서 다시&로드" +msgstr "디스크에서 다시 불러오기 (&l)" msgid "Reload the plater from disk" msgstr "디스크에서 플레이트 다시 로드" msgid "Export &Toolpaths as OBJ" -msgstr "툴 경로를 OBJ로 &내보내기" +msgstr "툴 경로를 OBJ로 내보내기 (&T)" msgid "Export toolpaths as OBJ" msgstr "툴 경로를 OBJ로 내보내기" msgid "Open &Studio" -msgstr "Studio &열기" +msgstr "Studio 열기 (&O)" msgid "Open Studio" msgstr "Studio 열기" msgid "&Quit" -msgstr "&종료" +msgstr "종료 (&Q)" #, c-format, boost-format msgid "Quit %s" msgstr "종료 %s" msgid "&File" -msgstr "&파일" +msgstr "파일 (&F)" msgid "&View" -msgstr "&시점" +msgstr "시점 (&V)" msgid "&Help" -msgstr "&도움말" +msgstr "도움말 (&H)" #, c-format, boost-format msgid "A file exists with the same name: %s, do you want to override it." @@ -3698,7 +3720,7 @@ msgid "" "2. The Filament presets\n" "3. The Printer presets" msgstr "" -"Bambu Cloud의 개인 데이터를 동기화하시겠습니까?\n" +"뱀부 클라우드의 개인 데이터를 동기화하시겠습니까?\n" "다음과 같은 정보가 포함되어 있습니다:\n" "1. 프로세스 사전 설정\n" "2. 필라멘트 사전 설정\n" @@ -3879,12 +3901,12 @@ msgid "" "The .gcode.3mf file contains no G-code data.Please slice it with Orca Slicer " "and export a new .gcode.3mf file." msgstr "" -".gcode.3mf 파일에는 G코드 데이터가 없습니다. OrcaSlicer에서 이를 슬라이스하" -"고 새 .gcode.3mf 파일을 내보내십시오." +".gcode.3mf 파일에는 G코드 데이터가 없습니다. OrcaSlicer에서 슬라이스하고 새 ." +"gcode.3mf 파일을 내보내십시오." #, c-format, boost-format msgid "File '%s' was lost! Please download it again." -msgstr "'%s' 파일이 손실되었습니다! 다시 다운로드하십시오." +msgstr "'%s' 파일이 손실되었습니다! 다시 다운로드하세요." msgid "Download waiting..." msgstr "다운로드 대기 중..." @@ -3903,13 +3925,16 @@ msgid "Downloading %d%%..." msgstr "다운로드 중 %d%%..." msgid "Connection lost. Please retry." -msgstr "" +msgstr "연결이 끊어졌습니다. 다시 시도해 주세요." + +msgid "The device cannot handle more conversations. Please retry later." +msgstr "장치에서 더 많은 대화를 처리할 수 없습니다. 나중에 다시 시도해 주세요." msgid "File not exists." -msgstr "" +msgstr "파일이 존재하지 않습니다." msgid "File checksum error. Please retry." -msgstr "" +msgstr "파일 체크섬 오류입니다. 다시 시도해 주세요." msgid "Not supported on the current printer version." msgstr "현재 프린터 버전에서는 지원되지 않습니다." @@ -3919,7 +3944,7 @@ msgstr "저장소를 사용할 수 없습니다. SD 카드를 삽입하세요." #, c-format, boost-format msgid "Error code: %d" -msgstr "" +msgstr "오류 코드: %d" msgid "Speed:" msgstr "속도:" @@ -4028,7 +4053,7 @@ msgid "Bed" msgstr "베드" msgid "Unload" -msgstr "빼기" +msgstr "언로드" msgid "Debug Info" msgstr "디버그 정보" @@ -4063,24 +4088,27 @@ msgstr "레이어: %s" msgid "Layer: %d/%d" msgstr "레이어: %d/%d" -msgid "Please heat the nozzle to above 170 degree before loading filament." -msgstr "필라멘트를 로드하기 전에 노즐을 170도 이상으로 가열하십시오." +msgid "" +"Please heat the nozzle to above 170 degree before loading or unloading " +"filament." +msgstr "" +"필라멘트를 로드하거나 언로드하기 전에 노즐을 170도 이상으로 가열하세요." msgid "Still unload" -msgstr "빼는중" +msgstr "언로드중" msgid "Still load" -msgstr "넣는중" +msgstr "로드중" msgid "Please select an AMS slot before calibration" -msgstr "교정하기 전에 AMS 슬롯을 선택하십시오" +msgstr "교정하기 전에 AMS 슬롯을 선택하세요" msgid "" "Cannot read filament info: the filament is loaded to the tool head,please " "unload the filament and try again." msgstr "" "필라멘트 정보를 읽을 수 없음: 필라멘트가 툴 헤드에 로드되었습니다. 필라멘트" -"를 언로드하고 다시 시도하십시오." +"를 언로드하고 다시 시도하세요." msgid "This only takes effect during printing" msgstr "출력하는 동안에만 적용됩니다" @@ -4157,7 +4185,7 @@ msgid "info" msgstr "정보" msgid "Synchronizing the printing results. Please retry a few seconds later." -msgstr "출력 결과를 동기화하는 중입니다. 몇 초 후에 다시 시도하십시오." +msgstr "출력 결과를 동기화하는 중입니다. 몇 초 후에 다시 시도하세요." msgid "Upload failed\n" msgstr "업로드 실패\n" @@ -4184,7 +4212,7 @@ msgid "" msgstr "" "\n" "\n" -"평가를 위해 웹페이지로 리디렉션하시겠습니까?" +"평가를 위해 웹페이지로 이동하시겠습니까?" msgid "" "Some of your images failed to upload. Would you like to redirect to the " @@ -4229,7 +4257,7 @@ msgstr "%s 경고" #, c-format, boost-format msgid "%s has a warning" -msgstr "%s에 경고가 있습니다" +msgstr "%s 에 경고가 있습니다" #, c-format, boost-format msgid "%s info" @@ -4267,7 +4295,7 @@ msgid "Details" msgstr "세부 사항" msgid "New printer config available." -msgstr "" +msgstr "새로운 프린터 구성을 사용할 수 있습니다." msgid "Wiki" msgstr "위키" @@ -4276,10 +4304,10 @@ msgid "Undo integration failed." msgstr "통합 실행 취소에 실패했습니다." msgid "Exporting." -msgstr "내보내는 중." +msgstr "내보내는중." msgid "Software has New version." -msgstr "소프트웨어에 새 버전이 있습니다." +msgstr "새 버전의 소프트웨어가 있습니다." msgid "Goto download page." msgstr "다운로드 페이지로 이동합니다." @@ -4345,7 +4373,7 @@ msgid "WARNING:" msgstr "경고:" msgid "Your model needs support ! Please make support material enable." -msgstr "모델에 지지대가 필요합니다! 지지대를 활성화하십시오." +msgstr "모델에 지지대가 필요합니다! 지지대를 활성화하세요." msgid "Gcode path overlap" msgstr "G코드 경로 겹침" @@ -4373,7 +4401,7 @@ msgstr "" "다.\n" msgid "Please upgrade your graphics card driver." -msgstr "그래픽 카드 드라이버를 업그레이드하십시오." +msgstr "그래픽 카드 드라이버를 업그레이드하세요." msgid "Unsupported OpenGL version" msgstr "지원되지 않는 OpenGL 버전" @@ -4422,8 +4450,8 @@ msgstr "손실 단계부터 자동 복구" msgid "Allow Prompt Sound" msgstr "프롬프트 소리 허용" -msgid "Fliament Tangle Detect" -msgstr "" +msgid "Filament Tangle Detect" +msgstr "필라멘트 엉킴 감지" msgid "Global" msgstr "전역" @@ -4520,7 +4548,7 @@ msgid "Set filaments to use" msgstr "사용할 필라멘트 설정" msgid "Search plate, object and part." -msgstr "" +msgstr "플레이트, 개체 및 부품을 검색합니다." msgid "" "No AMS filaments. Please select a printer in 'Device' page to load AMS info." @@ -4561,7 +4589,7 @@ msgid "" msgstr "" "일반 사전 설정에 매핑된 알 수 없는 필라멘트가 있습니다. Orca Slicer를 업데이" "트하거나 Orca Slicer를 다시 시작하여 시스템 사전 설정에 대한 업데이트가 있는" -"지 확인하십시오." +"지 확인하세요." #, boost-format msgid "Do you want to save changes to \"%1%\"?" @@ -4598,9 +4626,9 @@ msgid "" "nozzle hardness of the printer. Please replace the hardened nozzle or " "filament, otherwise, the nozzle will be attrited or damaged." msgstr "" -"필라멘트에 필요한 노즐 경도가 프린터의 기본 노즐 경도보다 높습니다. " -"\"Hardened\" 노즐을 사용하거나 필라멘트를 교체하십시오. 그렇지 않으면 노즐이 " -"마모되거나 손상됩니다." +"필라멘트에 필요한 노즐 경도가 프린터의 기본 노즐 경도보다 높습니다. \"경화강" +"\" 노즐을 사용하거나 필라멘트를 교체하세요. 그렇지 않으면 노즐이 마모되거나 " +"손상됩니다." msgid "" "Enabling traditional timelapse photography may cause surface imperfections. " @@ -4609,6 +4637,12 @@ msgstr "" "기존 타임랩스 사진을 사용하면 표면 결함이 발생할 수 있습니다. 유연 모드로 변" "경하는 것이 좋습니다." +msgid "Expand sidebar" +msgstr "사이드바 확장" + +msgid "Collapse sidebar" +msgstr "사이드바 접기" + #, c-format, boost-format msgid "Loading file: %s" msgstr "파일 로드 중: %s" @@ -4625,31 +4659,6 @@ msgstr "구성을 로드할 수 없습니다." msgid "The 3mf is generated by old Orca Slicer, load geometry data only." msgstr "이 3mf는 이전 Orca Slicer에서 생성되었으며, 형상 데이터만 로드합니다." -#, c-format, boost-format -msgid "This slicer file version %s is newer than %s's version:" -msgstr "" - -msgid "" -"Would you like to update your Bambu Studio software to enable all " -"functionality in this slicer file?\n" -msgstr "" - -msgid "Newer 3mf version" -msgstr "최신 3mf 버전" - -msgid "" -"you can always update Bambu Studio at your convenience. The slicer file will " -"now be loaded without full functionality." -msgstr "" - -#, c-format, boost-format -msgid "" -"This slicer file version %s is newer than %s's version.\n" -"\n" -"Would you like to update your Bambu Studio software to enable all " -"functionality in this slicer file?" -msgstr "" - msgid "Invalid values found in the 3mf:" msgstr "3mf에서 잘못된 값이 발견됨:" @@ -4658,25 +4667,28 @@ msgstr "매개변수 탭에서 수정하세요" msgid "The 3mf has following modified G-codes in filament or printer presets:" msgstr "" +"3mf에는 필라멘트 또는 프린터 사전 설정에 다음과 같은 수정된 G코드가 있습니다:" msgid "" "Please confirm that these modified G-codes are safe to prevent any damage to " "the machine!" -msgstr "" +msgstr "이 수정된 G코드가 손상을 방지하기 위해 안전한지 확인하세요.장치!" msgid "Modified G-codes" -msgstr "" +msgstr "수정된 G코드" msgid "The 3mf has following customized filament or printer presets:" -msgstr "" +msgstr "3mf에는 다음과 같은 맞춤형 필라멘트 또는 프린터 사전 설정이 있습니다:" msgid "" "Please confirm that the G-codes within these presets are safe to prevent any " "damage to the machine!" msgstr "" +"이러한 사전 설정 내의 G코드가 기계 손상을 방지할 수 있도록 안전한지 확인하세" +"요!" msgid "Customized Preset" -msgstr "" +msgstr "맞춤형 프리셋" msgid "Name of components inside step file is not UTF8 format!" msgstr "단계 파일 내의 구성 요소 이름이 UTF8 형식이 아닙니다!" @@ -4751,9 +4763,11 @@ msgid "" "The file %s already exists\n" "Do you want to replace it?" msgstr "" +"파일 %s이(가) 이미 존재합니다.\n" +"파일을 바꾸시겠습니까?" msgid "Comfirm Save As" -msgstr "" +msgstr "다른 이름으로 저장 확인" msgid "Delete object which is a part of cut object" msgstr "잘라낸 개체의 일부인 개체 삭제" @@ -4789,7 +4803,7 @@ msgid "File for the replace wasn't selected" msgstr "대체할 파일이 선택되지 않았습니다" msgid "Please select a file" -msgstr "파일을 선택하십시오" +msgstr "파일을 선택하세요" msgid "Do you want to replace it" msgstr "교체하시겠습니까" @@ -4804,7 +4818,7 @@ msgid "Unable to reload:" msgstr "새로고침할 수 없음:" msgid "Error during reload" -msgstr "새로고침 중 오류가 발생했습니다." +msgstr "새로고침 중 오류가 발생했습니다" msgid "Slicing" msgstr "슬라이싱" @@ -4826,7 +4840,7 @@ msgid "Slicing Plate %d" msgstr "플레이트 슬라이싱 %d" msgid "Please resolve the slicing errors and publish again." -msgstr "슬라이싱 오류를 해결하고 다시 시도하십시오." +msgstr "슬라이싱 오류를 해결하고 다시 시도하세요." msgid "" "Network Plug-in is not detected. Network related features are unavailable." @@ -4857,7 +4871,7 @@ msgid "" msgstr "" "프로젝트를 저장하지 못했습니다.\n" "폴더가 온라인에 존재하는지 또는 다른 프로그램이 프로젝트 파일을 사용 중인지 " -"확인하십시오." +"확인하세요." msgid "Save project" msgstr "프로젝트 저장" @@ -4882,6 +4896,9 @@ msgstr "" "Orca Slicer로 가져오는 데 실패했습니다. 파일을 다운로드하여 수동으로 가져오세" "요." +msgid "Import SLA archive" +msgstr "SLA 압축파일 가져오기" + msgid "The selected file" msgstr "선택한 파일" @@ -4895,7 +4912,7 @@ msgid "Drop project file" msgstr "드롭 프로젝트 파일" msgid "Please select an action" -msgstr "작업을 선택하십시오" +msgstr "작업을 선택하세요" msgid "Open as project" msgstr "프로젝트로 열기" @@ -4963,6 +4980,17 @@ msgid "" msgstr "" "모델 메쉬에 부울 연산을 수행할 수 없습니다. 오직 양수 부품만 내보내집니다." +msgid "" +"Are you sure you want to store original SVGs with their local paths into the " +"3MF file?\n" +"If you hit 'NO', all SVGs in the project will not be editable any more." +msgstr "" +"로컬 경로가 있는 원본 SVG를 3MF 파일에 저장하시겠습니까?\n" +"'아니요'를 누르면 프로젝트의 모든 SVG를 더 이상 편집할 수 없습니다." + +msgid "Private protection" +msgstr "개인정보 보호" + msgid "Is the printer ready? Is the print sheet in place, empty and clean?" msgstr "프린터가 준비됐나요? 출력 시트가 제자리에 있고 비어 있고 깨끗합니까?" @@ -4985,6 +5013,9 @@ msgstr "프린터로 전송" msgid "Custom supports and color painting were removed before repairing." msgstr "수리 전 사용자 지정 지지대와 컬러 페인트가 제거되었습니다." +msgid "Optimize Rotation" +msgstr "회전 최적화" + msgid "Invalid number" msgstr "잘못된 번호" @@ -5035,7 +5066,7 @@ msgid "" "on Orca Slicer(windows) or CAD softwares." msgstr "" "\"모델 수리\" 기능은 현재 Windows에만 있습니다. Orca Slicer(Wndows) 또는 CAD " -"소프트웨어 등에서 모델을 수정하십시오." +"소프트웨어 등에서 모델을 수정하세요." #, c-format, boost-format msgid "" @@ -5044,7 +5075,7 @@ msgid "" "to non zero." msgstr "" "% d: %s플레이트는 %s(%s)필라멘트를 출력하는데 사용하지 않는 것이 좋습니다. " -"이 출력을 계속하려면 이 필라멘트의 베드 온도를 0이 아닌 값으로 설정하십시오." +"이 출력을 계속하려면 이 필라멘트의 베드 온도를 0이 아닌 값으로 설정하세요." msgid "Switching the language requires application restart.\n" msgstr "언어를 전환하려면 애플리케이션을 다시 시작해야 합니다.\n" @@ -5074,7 +5105,7 @@ msgid "Browse" msgstr "탐색" msgid "Choose Download Directory" -msgstr "다운로드 디렉토리 선택" +msgstr "다운로드 폴더 선택" msgid "General Settings" msgstr "일반 설정" @@ -5146,17 +5177,11 @@ msgstr "시작 후 \"오늘의 팁\" 알림 표시" msgid "If enabled, useful hints are displayed at startup." msgstr "활성화된 경우 시작 시 유용한 힌트가 표시됩니다." -msgid "Show g-code window" -msgstr "G코드 창 표시" - -msgid "If enabled, g-code window will be displayed." -msgstr "활성화된 경우 G코드 창이 표시됩니다." - msgid "Flushing volumes: Auto-calculate everytime the color changed." -msgstr "" +msgstr "플러시 볼륨: 색상이 변경될 때마다 자동 계산됩니다." msgid "If enabled, auto-calculate everytime the color changed." -msgstr "" +msgstr "활성화하면 색상이 변경될 때마다 자동 계산됩니다." msgid "Presets" msgstr "사전 설정" @@ -5211,14 +5236,14 @@ msgid "Clear my choice on the unsaved projects." msgstr "저장되지 않은 프로젝트에서 내 선택을 지웁니다." msgid "No warnings when loading 3MF with modified G-codes" -msgstr "" +msgstr "수정된 G 코드로 3MF를 로드할 때 경고 없음" msgid "Auto-Backup" msgstr "자동 백업" msgid "" "Backup your project periodically for restoring from the occasional crash." -msgstr "간헐적인 충돌로부터 복원하기 위해 주기적으로 프로젝트를 백업하십시오." +msgstr "간헐적인 충돌로부터 복원하기 위해 주기적으로 프로젝트를 백업하세요." msgid "every" msgstr "매" @@ -5326,7 +5351,7 @@ msgid "save debug settings" msgstr "디버그 세팅 저장" msgid "DEBUG settings have saved successfully!" -msgstr "DEBUG 설정이 성공적으로 저장되었습니다!" +msgstr "디버그 설정이 성공적으로 저장되었습니다!" msgid "Switch cloud environment, Please login again!" msgstr "클라우드 환경 전환, 다시 로그인해주세요!" @@ -5365,10 +5390,10 @@ msgid "Add/Remove materials" msgstr "재료 추가/제거" msgid "Select/Remove printers(system presets)" -msgstr "" +msgstr "프린터 선택/제거(시스템 사전 설정)" msgid "Create printer" -msgstr "" +msgstr "프린터 생성" msgid "Incompatible" msgstr "호환되지 않음" @@ -5446,7 +5471,7 @@ msgstr "%s을(를) 다음으로 저장" msgid "User Preset" msgstr "사용자 사전 설정" -msgid "Project Inside Preset" +msgid "Preset Inside Project" msgstr "프로젝트 내부 사전 설정" msgid "Name is invalid;" @@ -5500,7 +5525,7 @@ msgstr "%1% 프린터가 \"%2%\" 사전 설정으로 선택되었습니다" #, boost-format msgid "Please choose an action with \"%1%\" preset after saving." -msgstr "저장 후 사전 설정 \"%1%\" 으로 작업을 선택하십시오." +msgstr "저장 후 사전 설정 \"%1%\" 으로 작업을 선택하세요." #, boost-format msgid "For \"%1%\", change \"%2%\" to \"%3%\" " @@ -5520,6 +5545,9 @@ msgstr "작업이 취소됨" msgid "(LAN)" msgstr "(LAN)" +msgid "Search" +msgstr "검색" + msgid "My Device" msgstr "내 장치" @@ -5545,22 +5573,22 @@ msgid "Busy" msgstr "사용중" msgid "Bambu Cool Plate" -msgstr "Bambu Cool Plate" +msgstr "뱀부 쿨 플레이트" msgid "PLA Plate" msgstr "PLA 플레이트" -msgid "Bamabu Engineering Plate" -msgstr "Bamabu Engineering Plate" +msgid "Bambu Engineering Plate" +msgstr "뱀부 엔지니어링 플레이트" -msgid "Bamabu Smooth PEI Plate" -msgstr "" +msgid "Bambu Smooth PEI Plate" +msgstr "뱀부 부드러운 PEI 플레이트" msgid "High temperature Plate" msgstr "고온 플레이트" -msgid "Bamabu Textured PEI Plate" -msgstr "" +msgid "Bambu Textured PEI Plate" +msgstr "뱀부 텍스처 PEI 플레이트" msgid "Send print job to" msgstr "출력 작업 보내기" @@ -5584,7 +5612,7 @@ msgid "Error code" msgstr "오류 코드" msgid "Printer local connection failed, please try again." -msgstr "프린터 로컬 연결에 실패했습니다. 다시 시도하십시오." +msgstr "프린터 로컬 연결에 실패했습니다. 다시 시도하세요." msgid "No login account, only printers in LAN mode are displayed" msgstr "로그인 계정이 없으며 LAN 모드의 프린터만 표시됩니다" @@ -5603,7 +5631,7 @@ msgstr "프린터가 펌웨어를 업데이트하는 동안 출력 작업을 보 msgid "" "The printer is executing instructions. Please restart printing after it ends" -msgstr "프린터가 명령을 실행하고 있습니다. 종료 후 출력을 다시 시작하십시오" +msgstr "프린터가 명령을 실행하고 있습니다. 종료 후 출력을 다시 시작하세요" msgid "The printer is busy on other print job" msgstr "프린터가 다른 출력 작업을 수행 중입니다" @@ -5614,14 +5642,14 @@ msgid "" "firmware to support AMS slot assignment." msgstr "" "필라멘트 %s이(가) AMS 슬롯 수를 초과합니다. AMS 슬롯 할당을 지원하려면 프린" -"터 펌웨어를 업데이트하십시오." +"터 펌웨어를 업데이트하세요." msgid "" "Filament exceeds the number of AMS slots. Please update the printer firmware " "to support AMS slot assignment." msgstr "" "필라멘트가 AMS 슬롯 수를 초과합니다. AMS 슬롯 할당을 지원하려면 프린터 펌웨어" -"를 업데이트하십시오." +"를 업데이트하세요." msgid "" "Filaments to AMS slots mappings have been established. You can click a " @@ -5634,8 +5662,8 @@ msgid "" "Please click each filament above to specify its mapping AMS slot before " "sending the print job" msgstr "" -"출력 작업을 보내기 전에 위의 각 필라멘트를 클릭하여 매핑 AMS 슬롯을 지정하십" -"시오" +"출력 작업을 보내기 전에 위의 각 필라멘트를 클릭하여 매핑 AMS 슬롯을 지정하세" +"요" #, c-format, boost-format msgid "" @@ -5643,14 +5671,14 @@ msgid "" "printer firmware to support AMS slot assignment." msgstr "" "필라멘트 %s가 AMS 슬롯 %s의 필라멘트와 일치하지 않습니다. AMS 슬롯 할당을 지" -"원하려면 프린터 펌웨어를 업데이트하십시오." +"원하려면 프린터 펌웨어를 업데이트하세요." msgid "" "Filament does not match the filament in AMS slot. Please update the printer " "firmware to support AMS slot assignment." msgstr "" "필라멘트가 AMS 슬롯의 필라멘트와 일치하지 않습니다. AMS 슬롯 할당을 지원하려" -"면 프린터 펌웨어를 업데이트하십시오." +"면 프린터 펌웨어를 업데이트하세요." msgid "" "The printer firmware only supports sequential mapping of filament => AMS " @@ -5687,12 +5715,13 @@ msgstr "" msgid "" "Timelapse is not supported because Print sequence is set to \"By object\"." msgstr "" +"인쇄 순서가 \"개체별\"로 설정되어 있으므로 시간 경과는 지원되지 않습니다." msgid "Errors" msgstr "오류" msgid "Please check the following:" -msgstr "다음을 확인하십시오:" +msgstr "다음을 확인하세요:" msgid "" "The printer type selected when generating G-Code is not consistent with the " @@ -5708,34 +5737,36 @@ msgid "" "start printing." msgstr "" "AMS 매핑에 알 수 없는 필라멘트가 있습니다. 필요한 필라멘트인지 확인해주세요. " -"정상이면 \"확인\"을 눌러 출력을 시작하십시오." +"정상이면 \"확인\"을 눌러 출력을 시작하세요." #, c-format, boost-format msgid "nozzle in preset: %s %s" -msgstr "" +msgstr "미리 설정된 노즐: %s %s" #, c-format, boost-format msgid "nozzle memorized: %.1f %s" -msgstr "" +msgstr "기억된 노즐: %.1f %s" msgid "" "Your nozzle diameter in preset is not consistent with memorized nozzle " "diameter. Did you change your nozzle lately?" msgstr "" +"미리 설정된 노즐 직경이 기억된 노즐 직경과 일치하지 않습니다.직경. 최근에 노" +"즐을 바꾸셨나요?" #, c-format, boost-format msgid "*Printing %s material with %s may cause nozzle damage" -msgstr "" +msgstr "*%s 재료를 %s로 인쇄하면 노즐이 손상될 수 있습니다" msgid "" "Please click the confirm button if you still want to proceed with printing." -msgstr "그래도 출력을 계속하려면 확인 버튼을 클릭하십시오." +msgstr "그래도 출력을 계속하려면 확인 버튼을 클릭하세요." msgid "Hardened Steel" -msgstr "" +msgstr "경화강" msgid "Stainless Steel" -msgstr "" +msgstr "스테인레스 스틸" msgid "" "Connecting to the printer. Unable to cancel during the connection process." @@ -5745,7 +5776,7 @@ msgid "Preparing print job" msgstr "출력 작업 준비 중" msgid "Abnormal print file data. Please slice again" -msgstr "비정상적인 출력 파일 데이터입니다. 다시 슬라이스하십시오" +msgstr "비정상적인 출력 파일 데이터입니다. 다시 슬라이스하세요" msgid "The name length exceeds the limit." msgstr "이름 길이가 제한을 초과합니다." @@ -5758,7 +5789,7 @@ msgstr "" "습니다." msgid "Automatic flow calibration using Micro Lidar" -msgstr "Micro Lidar를 사용한 자동 유량 교정" +msgstr "마이크로 라이다를 사용한 자동 유량 교정" msgid "Modifying the device name" msgstr "장치 이름 수정" @@ -5773,11 +5804,17 @@ msgid "An SD card needs to be inserted before send to printer SD card." msgstr "프린터 SD 카드로 보내기 전에 SD 카드를 삽입해야 합니다." msgid "The printer is required to be in the same LAN as Orca Slicer." -msgstr "프린터는 Orca Slicer와 동일한 LAN에 있어야 합니다." +msgstr "프린터는 Orca Slicer와 동일한 네트워크에 있어야 합니다." msgid "The printer does not support sending to printer SD card." msgstr "프린터는 프린터 SD 카드로의 전송을 지원하지 않습니다." +msgid "Slice ok." +msgstr "슬라이스 완료." + +msgid "View all Daily tips" +msgstr "모든 일일 팁 보기" + msgid "Failed to create socket" msgstr "소켓 생성 실패" @@ -5827,11 +5864,11 @@ msgid "" "Use(collectively, the \"Terms\"). If you do not comply with or agree to the " "Bambu Lab Privacy Policy, please do not use Bambu Lab equipment and services." msgstr "" -"Bambu Lab 기기를 구매해 주셔서 감사합니다. Bambu Lab 기기를 사용하기 전에 이" -"용약관을 읽어주시기 바랍니다. Bambu Lab 기기 사용에 동의하기 위해 클릭하면 개" -"인정보 보호정책 및 이용약관(이하 통칭하여 \"약관\")을 준수하는 데 동의하는 것" -"입니다. Bambu Lab 개인정보 처리방침을 준수하지 않거나 동의하지 않는 경우, " -"Bambu Lab 장치 및 서비스를 사용하지 마십시오." +"뱀부랩 기기를 구매해 주셔서 감사합니다. 뱀부랩 기기를 사용하기 전에 이용약관" +"을 읽어주시기 바랍니다. 뱀부랩 기기 사용에 동의하기 위해 클릭하면 개인정보 보" +"호정책 및 이용약관(이하 통칭하여 \"약관\")을 준수하는 데 동의하는 것입니다. " +"뱀부랩 개인정보 처리방침을 준수하지 않거나 동의하지 않는 경우, 뱀부랩 장치 " +"및 서비스를 사용하지 마십시오." msgid "and" msgstr "그리고" @@ -5881,10 +5918,10 @@ msgid "Would you like to log out the printer?" msgstr "프린터에서 로그아웃하시겠습니까?" msgid "Please log in first." -msgstr "먼저 로그인하십시오." +msgstr "먼저 로그인하세요." msgid "There was a problem connecting to the printer. Please try again." -msgstr "프린터에 연결하는 동안 문제가 발생했습니다. 다시 시도하십시오." +msgstr "프린터에 연결하는 동안 문제가 발생했습니다. 다시 시도하세요." msgid "Failed to log out." msgstr "로그아웃에 실패했습니다." @@ -5920,7 +5957,7 @@ msgstr "" "까?" msgid "Still print by object?" -msgstr "" +msgstr "아직도 개체별로 인쇄하시겠습니까?" msgid "" "We have added an experimental style \"Tree Slim\" that features smaller " @@ -5937,7 +5974,7 @@ msgid "" "No - Do not change these settings for me" msgstr "" "이 설정을 자동으로 변경하시겠습니까?\n" -"예 - 이 설정을 자동으로 변경합니다\n" +"예 - 이 설정을 자동으로 변경합니다\n" "아니요 - 이 설정을 변경하지 않습니다" msgid "" @@ -5957,6 +5994,22 @@ msgstr "" "지지대 접점에 지지대 재료를 사용하는 경우 다음 설정을 권장합니다:\n" "상단 Z 거리 0, 접점 간격 0, 접점 패턴 동심원 및 독립적 지지대 높이 비활성화" +msgid "" +"Layer height exceeds the limit in Printer Settings -> Extruder -> Layer " +"height limits ,this may cause printing quality issues." +msgstr "" +"레이어 높이가 프린터 설정 -> 압출기 -> 레이어의 제한을 초과합니다.높이 제한으" +"로 인해 인쇄 품질 문제가 발생할 수 있습니다." + +msgid "Adjust to the set range automatically? \n" +msgstr "설정 범위에 자동으로 맞춰지나요? \n" + +msgid "Adjust" +msgstr "조정" + +msgid "Ignore" +msgstr "무시" + msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" @@ -5980,6 +6033,15 @@ msgstr "정밀도" msgid "Wall generator" msgstr "벽 생성기" +msgid "Walls and surfaces" +msgstr "벽과 표면" + +msgid "Bridging" +msgstr "브리징" + +msgid "Overhangs" +msgstr "돌출부" + msgid "Walls" msgstr "벽" @@ -6000,9 +6062,8 @@ msgid "" "expressed as a percentage of line width. 0 speed means no slowing down for " "the overhang degree range and wall speed is used" msgstr "" -"다양한 돌출부 정도(Degree)에 대한 속도입니다. 돌출부 정도는 선 너비의 백분율" -"로 표시됩니다. 0 속도는 돌출부 정도에 대한 감속이 없음을 의미하며 벽 속도가 " -"사용됩니다" +"다양한 돌출부 각도에 대한 속도입니다. 돌출부 정도는 선 너비의 백분율로 표시됩" +"니다. 0 속도는 돌출부 정도에 대한 감속이 없음을 의미하며 벽 속도가 사용됩니다" msgid "Bridge" msgstr "다리" @@ -6223,7 +6284,7 @@ msgid "Machine end G-code" msgstr "장치 종료 G코드" msgid "Printing by object G-code" -msgstr "" +msgstr "개체 G코드로 인쇄" msgid "Before layer change G-code" msgstr "레이어 변경 전 G코드" @@ -6241,7 +6302,7 @@ msgid "Change extrusion role G-code" msgstr "압출 역할 G코드 변경" msgid "Pause G-code" -msgstr "일시정지 G코드" +msgstr "일시 정지 G코드" msgid "Template Custom G-code" msgstr "템플릿 사용자 정의 G코드" @@ -6299,13 +6360,15 @@ msgid "" "%d Filament Preset and %d Process Preset is attached to this printer. Those " "presets would be deleted if the printer is deleted." msgstr "" +"%d개의 필라멘트 사전 설정과 %d개의 프로세스 사전 설정이 이 프린터에 연결되어 " +"있습니다.프린터를 삭제하면 사전 설정도 삭제됩니다." msgid "Presets inherited by other presets can not be deleted!" -msgstr "" +msgstr "다른 프리셋에 상속된 프리셋은 삭제할 수 없습니다!" msgid "The following presets inherit this preset." msgid_plural "The following preset inherits this preset." -msgstr[0] "" +msgstr[0] "다음 사전 설정은 이 사전 설정을 상속합니다." #. TRN Remove/Delete #, boost-format @@ -6316,6 +6379,15 @@ msgid "Following preset will be deleted too." msgid_plural "Following presets will be deleted too." msgstr[0] "다음 사전 설정도 삭제됩니다." +msgid "" +"Are you sure to delete the selected preset? \n" +"If the preset corresponds to a filament currently in use on your printer, " +"please reset the filament information for that slot." +msgstr "" +"선택한 사전 설정을 삭제하시겠습니까? \n" +"프리셋이 현재 프린터에서 사용 중인 필라멘트와 일치하는 경우,해당 슬롯의 필라" +"멘트 정보를 재설정해 주세요." + #, boost-format msgid "Are you sure to %1% the selected preset?" msgstr "선택한 사전 설정을 %1%로 설정하시겠습니까?" @@ -6330,7 +6402,7 @@ msgid "Click to reset current value and attach to the global value." msgstr "현재 값을 재설정하고 전역 값에 연결하려면 클릭합니다." msgid "Click to drop current modify and reset to saved value." -msgstr "현재 수정 내용을 삭제하고 저장된 값으로 재설정하려면 클릭하십시오." +msgstr "현재 수정 내용을 삭제하고 저장된 값으로 재설정하려면 클릭하세요." msgid "Process Settings" msgstr "프로세스 설정" @@ -6341,7 +6413,7 @@ msgstr "정의되지 않음" msgid "Unsaved Changes" msgstr "저장되지 않은 변경 사항" -msgid "Discard or Keep changes" +msgid "Transfer or discard changes" msgstr "변경 사항 폐기 또는 유지" msgid "Old Value" @@ -6536,11 +6608,11 @@ msgid "" "This is an expert-level setting, incorrect adjustment will likely lead to " "jams, extruder wheel grinding into filament etc." msgstr "" -"래밍(Ramming)은 단일 압출기 다중 재료 프린터에서 툴 교체 직전의 급속 압출을 " -"의미합니다. 필라멘트를 뺄때 끝 모양을 적절하게 형성하여 새 필라멘트의 삽입을 " -"방해하지 않고 나중에 다시 삽입할 수 있도록 하는 것입니다. 이 단계는 중요하" -"며, 좋은 모양을 얻으려면 재료마다 다른 압출 속도가 필요할 수 있습니다. 이러" -"한 이유로 래밍 중 압출 속도는 조정 가능합니다.\n" +"래밍은 단일 압출기 다중 재료 프린터에서 툴 교체 직전의 급속 압출을 의미합니" +"다. 필라멘트를 뺄때 끝 모양을 적절하게 형성하여 새 필라멘트의 삽입을 방해하" +"지 않고 나중에 다시 삽입할 수 있도록 하는 것입니다. 이 단계는 중요하며, 좋은 " +"모양을 얻으려면 재료마다 다른 압출 속도가 필요할 수 있습니다. 이러한 이유로 " +"래밍 중 압출 속도는 조정 가능합니다.\n" "\n" "이는 전문가 수준 설정이므로 잘못 조정하면 막힘, 필라멘트 갈림 등이 발생할 수 " "있습니다." @@ -6560,20 +6632,18 @@ msgstr "래밍 선 너비" msgid "Ramming line spacing" msgstr "래밍 선 간격" -msgid "Auto-Calc" -msgstr "자동 계산" - -msgid "Re-calculate" -msgstr "" +msgid "Recalculate" +msgstr "다시계산" msgid "Flushing volumes for filament change" msgstr "필라멘트 교체를 위한 버리기 부피" msgid "" -"Studio would re-calculate your flushing volumes everytime the filaments " -"color changed. You could disable the auto-calculate in Bambu Studio > " -"Preferences" +"Orca recalculates your flushing volumes everytime the filament colors " +"change. You can change this behavior in Preferences." msgstr "" +"Orca Slicer는 필라멘트 색상이 바뀔 때마다 플러싱 볼륨을 다시 계산합니다. 환" +"경 설정에서 이 동작을 변경할 수 있습니다." msgid "Flushing volume (mm³) for each filament pair." msgstr "각 필라멘트 쌍에 대한 버리기 부피(mm³)." @@ -6589,15 +6659,6 @@ msgstr "승수는 [%.2f, %.2f] 범위에 있어야 합니다." msgid "Multiplier" msgstr "승수" -msgid "unloaded" -msgstr "빼냄" - -msgid "loaded" -msgstr "넣음" - -msgid "Filament #" -msgstr "필라멘트 #" - msgid "From" msgstr "에서" @@ -6605,10 +6666,10 @@ msgid "To" msgstr "으로" msgid "Bambu Network plug-in not detected." -msgstr "" +msgstr "뱀부 네트워크 플러그인이 감지되지 않습니다." msgid "Click here to download it." -msgstr "" +msgstr "다운로드하려면 여기를 클릭하세요." msgid "Login" msgstr "로그인" @@ -6644,7 +6705,7 @@ msgid "Show/Hide 3Dconnexion devices settings dialog" msgstr "3D 연결 장치 설정 표시/숨기기 대화상자" msgid "Switch table page" -msgstr "" +msgstr "테이블 페이지 전환" msgid "Show keyboard shortcuts list" msgstr "키보드 단축키 목록 보기" @@ -6803,7 +6864,7 @@ msgid "Swtich between Prepare/Prewview" msgstr "준비 하기/미리 보기 전환" msgid "Plater" -msgstr "Plater" +msgstr "인쇄판" msgid "Move: press to snap by 1mm" msgstr "이동: 눌러서 1mm씩 이동" @@ -6887,8 +6948,8 @@ msgstr "네트워크 플러그인 업데이트" msgid "" "Click OK to update the Network plug-in when Orca Slicer launches next time." msgstr "" -"다음 번 Orca Slicer를 시작할 때 네트워크 플러그인을 업데이트하려면 확인을 클" -"릭합니다." +"다음 Orca Slicer를 시작할 때 네트워크 플러그인을 업데이트하려면 확인을 클릭합" +"니다." #, c-format, boost-format msgid "A new Network plug-in(%s) available, Do you want to install it?" @@ -6898,13 +6959,13 @@ msgid "New version of Orca Slicer" msgstr "Orca Slicer의 새 버전" msgid "Skip this Version" -msgstr "" +msgstr "이 버전 건너뛰기" msgid "Done" msgstr "완료" msgid "Confirm and Update Nozzle" -msgstr "" +msgstr "노즐 확인 및 업데이트" msgid "LAN Connection Failed (Sending print file)" msgstr "LAN 연결 실패(출력 파일 전송 중)" @@ -6912,14 +6973,13 @@ msgstr "LAN 연결 실패(출력 파일 전송 중)" msgid "" "Step 1, please confirm Orca Slicer and your printer are in the same LAN." msgstr "" -"1단계, Orca Slicer와 프린터가 동일한 인터넷 망에 연결되어 있는지 확인하십시" -"오." +"1단계, Orca Slicer와 프린터가 동일한 네트워크에 연결되어 있는지 확인하세요." msgid "" "Step 2, if the IP and Access Code below are different from the actual values " "on your printer, please correct them." msgstr "" -"2단계, 아래의 IP 및 액세스 코드가 프린터의 실제 값과 다른 경우 수정하십시오." +"2단계, 아래의 IP 및 액세스 코드가 프린터의 실제 값과 다른 경우 수정하세요." msgid "IP" msgstr "IP" @@ -6931,21 +6991,23 @@ msgid "Where to find your printer's IP and Access Code?" msgstr "프린터의 IP 및 액세스 코드는 어디에서 찾을 수 있습니까?" msgid "Step 3: Ping the IP address to check for packet loss and latency." -msgstr "" +msgstr "3단계: IP 주소를 ping하여 패킷 손실 및 대기 시간을 확인합니다." msgid "Test" msgstr "테스트" msgid "IP and Access Code Verified! You may close the window" -msgstr "" +msgstr "IP 및 접속코드가 확인되었습니다. 창을 닫아도 됩니다" msgid "Connection failed, please double check IP and Access Code" -msgstr "" +msgstr "연결에 실패했습니다. IP와 액세스 코드를 다시 확인하세요" msgid "" "Connection failed! If your IP and Access Code is correct, \n" "please move to step 3 for troubleshooting network issues" msgstr "" +"연결에 실패했습니다. IP와 액세스 코드가 올바른 경우 \n" +"네트워크 문제를 해결하려면 3단계로 이동하세요" msgid "Model:" msgstr "모델:" @@ -6965,6 +7027,9 @@ msgstr "출력 중" msgid "Idle" msgstr "대기 중" +msgid "Beta version" +msgstr "베타 버전" + msgid "Latest version" msgstr "최신 버전" @@ -7027,7 +7092,7 @@ msgid "Repair failed." msgstr "수리에 실패하였습니다." msgid "Loading repaired objects" -msgstr "고친 개체 로드" +msgstr "수리된 개체 로드" msgid "Exporting 3mf file failed" msgstr "3mf 파일 내보내기 실패" @@ -7071,7 +7136,7 @@ msgid "" "bottom or enable supports." msgstr "" "개체 하나에 초기 레이어가 비어 있어 출력할 수 없습니다. 바닥을 자르거나 지지" -"대를 활성화하십시오." +"대를 활성화하세요." #, boost-format msgid "Object can't be printed for empty layer between %1% and %2%." @@ -7099,7 +7164,7 @@ msgstr "" "\n" msgid "Please check the custom G-code or use the default custom G-code." -msgstr "사용자 정의 G코드를 확인하거나 기본 사용자 정의 G코드를 사용하십시오." +msgstr "사용자 정의 G코드를 확인하거나 기본 사용자 정의 G코드를 사용하세요." #, boost-format msgid "Generating G-code: layer %1%" @@ -7178,7 +7243,7 @@ msgid "failed finding central directory" msgstr "중앙 디렉토리를 찾지 못했습니다" msgid "not a ZIP archive" -msgstr "zip형식의 압축파일이 아님" +msgstr "ZIP 형식의 압축파일이 아닙니다" msgid "invalid header or corrupted" msgstr "잘못된 헤더이거나 손상됨" @@ -7261,7 +7326,7 @@ msgstr "%1% 이(가) 다른 개체와 너무 가까워 출력 시 충돌이 발 #, boost-format msgid "%1% is too tall, and collisions will be caused." -msgstr "%1% (이)가 너무 높아서 충돌이 출력 시 발생할 수 있습니다." +msgstr "%1% 이(가) 너무 높아서 충돌이 출력 시 발생할 수 있습니다." msgid " is too close to others, there may be collisions when printing." msgstr " 이(가) 다른 개체와 너무 가까워 출력 시 충돌이 발생 할 수 있습니다." @@ -7301,14 +7366,14 @@ msgid "" "Please select \"By object\" print sequence to print multiple objects in " "spiral vase mode." msgstr "" -"나선 꽃병 모드에서 여러 개체를 출력하려면 \"개체별\" 출력 순서를 선택하십시" -"오." +"나선형 꽃병 모드에서 여러 개체를 출력하려면 \"개체별\" 출력 순서를 선택하세" +"요." msgid "" "The spiral vase mode does not work when an object contains more than one " "materials." msgstr "" -"개체에 둘 이상의 재료가 포함된 경우 나선 꽃병 모드가 작동하지 않습니다." +"개체에 둘 이상의 재료가 포함된 경우 나선형 꽃병 모드가 작동하지 않습니다." #, boost-format msgid "The object %1% exceeds the maximum build volume height." @@ -7331,6 +7396,31 @@ msgstr "" msgid "Variable layer height is not supported with Organic supports." msgstr "유기체 지지대에서는 가변 레이어 높이가 지원되지 않습니다." +msgid "" +"Different nozzle diameters and different filament diameters is not allowed " +"when prime tower is enabled." +msgstr "" +"다른 노즐 직경과 다른 필라멘트 직경은 허용되지 않습니다.프라임 타워가 활성화" +"되면." + +msgid "" +"The Wipe Tower is currently only supported with the relative extruder " +"addressing (use_relative_e_distances=1)." +msgstr "" +"닦기 타워는 현재 관련 압출기에서만 지원됩니다.주소 지정" +"(use_relative_e_distances=1)." + +msgid "" +"Ooze prevention is currently not supported with the prime tower enabled." +msgstr "현재 프라임 타워가 활성화된 상태에서는 누출 방지가 지원되지 않습니다." + +msgid "" +"The prime tower is currently only supported for the Marlin, RepRap/Sprinter, " +"RepRapFirmware and Repetier G-code flavors." +msgstr "" +"프라임 타워는 현재 Marlin, RepRap/Sprinter에만 지원됩니다.RepRapFirmware 및 " +"Repetier G코드 버전." + msgid "The prime tower is not supported in \"By object\" print." msgstr "프라임 타워는 \"개체별\" 출력에서 지원되지 않습니다." @@ -7394,17 +7484,12 @@ msgstr "유기체 지지대 가지 직경은 지지대 나무 끝 직경보다 msgid "" "Support enforcers are used but support is not enabled. Please enable support." msgstr "" -"지지대 강제기가 사용되지만 지지대가 활성화되지 않습니다. 지지대를 활성화하십" -"시오." +"지지대 강제기가 사용되지만 지지대가 활성화되지 않습니다. 지지대를 활성화하세" +"요." msgid "Layer height cannot exceed nozzle diameter" msgstr "레이어 높이는 노즐 직경을 초과할 수 없습니다" -msgid "" -"Layer height cannot exceed the limit in Printer Settings -> Extruder -> " -"Layer height limits" -msgstr "" - msgid "" "Relative extruder addressing requires resetting the extruder position at " "each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to " @@ -7470,8 +7555,7 @@ msgid "" "Shrink the initial layer on build plate to compensate for elephant foot " "effect" msgstr "" -"코끼리 발 효과(Elephant foot effect)를 보정하기 위해 빌드 플레이트의 초기 레" -"이어를 축소합니다" +"코끼리 발 효과를 보정하기 위해 빌드 플레이트의 초기 레이어를 축소합니다" msgid "Elephant foot compensation layers" msgstr "코끼리 발 보정 레이어" @@ -7502,6 +7586,12 @@ msgstr "출력 가능 높이" msgid "Maximum printable height which is limited by mechanism of printer" msgstr "프린터 기계장치에 의해 제한되는 출력 가능한 최대 높이" +msgid "Preferred orientation" +msgstr "선호하는 방향" + +msgid "Automatically orient stls on the Z-axis upon initial import" +msgstr "최초 임포트 시 Z축에서 자동으로 스톨 방향 지정" + msgid "Printer preset names" msgstr "프린터 사전 설정 이름" @@ -7527,7 +7617,7 @@ msgstr "장치 UI" msgid "" "Specify the URL of your device user interface if it's not same as print_host" msgstr "" -"Print_host와 동일하지 않은 경우 장치 사용자 인터페이스의 URL을 지정하십시오" +"Print_host와 동일하지 않은 경우 장치 사용자 인터페이스의 URL을 지정하세요" msgid "API Key / Password" msgstr "API 키 / 비밀번호" @@ -7673,7 +7763,7 @@ msgstr "" "지 않음을 의미합니다" msgid "Bed types supported by the printer" -msgstr "프린터가 지원하는 침대 유형" +msgstr "프린터가 지원하는 베드 유형" msgid "Cool Plate" msgstr "쿨 플레이트" @@ -7767,14 +7857,26 @@ msgid "Density of external bridges. 100% means solid bridge. Default is 100%." msgstr "" "외부 다리의 밀도. 100%는 단단한 다리를 의미합니다. 기본값은 100%입니다." -msgid "Bridge flow" -msgstr "다리 유량" +msgid "Bridge flow ratio" +msgstr "다리 유량 비율" msgid "" "Decrease this value slightly(for example 0.9) to reduce the amount of " "material for bridge, to improve sag" msgstr "이 값을 약간(예: 0.9) 줄여 다리의 압출량을 줄여 처짐을 개선합니다" +msgid "Internal bridge flow ratio" +msgstr "내부 브릿지 유량 비율" + +msgid "" +"This value governs the thickness of the internal bridge layer. This is the " +"first layer over sparse infill. Decrease this value slightly (for example " +"0.9) to improve surface quality over sparse infill." +msgstr "" +"이 값은 내부 브리지 레이어의 두께를 결정합니다. 이것이 희박한 채우기 위의 첫 " +"번째 레이어입니다. 이 값을 약간 줄이십시오(예: 0.9) 희박한 채우기보다 표면 품" +"질을 향상시킵니다." + msgid "Top surface flow ratio" msgstr "상단 표면 유량 비율" @@ -7831,7 +7933,7 @@ msgstr "" "압출 너비의 mm 또는 % o로 설정됩니다.\n" "경고: 활성화된 경우, 의도치 않은 형상이 생성되는건 다음 레이어에 문자와 같은 " "일부 얇은 형상이 있기 때문입니다. 이러한 형상을 제거하려면 이 값을 0으로 설정" -"하십시오." +"하세요." msgid "Only one wall on first layer" msgstr "하단 표면에 단일 벽 생성" @@ -7865,9 +7967,14 @@ msgid "" "This setting can also help reduce part warping due to the reduction of " "stresses in the part walls." msgstr "" +"역방향 돌출부 위에 부분이 있는 돌출 둘레홀수 레이어의 방향입니다. 이 교대 패" +"턴은 크게 향상될 수 있습니다.가파른 돌출부.\n" +"\n" +"이 설정은 또한 감소로 인한 부품 뒤틀림을 줄이는 데 도움이 될 수 있습니다.부" +"분 벽의 응력." msgid "Reverse only internal perimeters" -msgstr "" +msgstr "내부 둘레만 반전" msgid "" "Apply the reverse perimeters logic only on internal perimeters. \n" @@ -7883,6 +7990,17 @@ msgid "" "Reverse Threshold to 0 so that all internal walls print in alternating " "directions on odd layers irrespective of their overhang degree." msgstr "" +"내부 경계에만 역방향 경계 논리를 적용합니다. \n" +"\n" +"이 설정은 부품 응력이 이제 분산되어 있으므로 부품 응력을 크게 줄여줍니다.교" +"대 방향. 이렇게 하면 부품 뒤틀림도 줄어들고 동시에 외벽 품질 유지. 이 기능은 " +"워프에 매우 유용할 수 있습니다.ABS/ASA와 같은 취약한 소재와 TPU 및 탄성 필라" +"멘트에도 사용 가능실크 PLA. 또한 부동 영역의 뒤틀림을 줄이는 데 도움이 될 수 " +"있습니다.지원합니다.\n" +"\n" +"이 설정을 가장 효과적으로 사용하려면 다음을 설정하는 것이 좋습니다.모든 내부 " +"벽이 교대로 인쇄되도록 임계값을 0으로 역방향오버행 정도에 관계없이 홀수 레이" +"어의 방향입니다." msgid "Reverse threshold" msgstr "반전 임계값" @@ -7890,14 +8008,13 @@ msgstr "반전 임계값" msgid "Overhang reversal threshold" msgstr "돌출부 반전 임계값" -#, c-format, boost-format msgid "" "Number of mm the overhang need to be for the reversal to be considered " "useful. Can be a % of the perimeter width.\n" "Value 0 enables reversal on every odd layers regardless." msgstr "" -"반전이 유용한 것으로 간주되기 위해 필요한 돌출부의 수(mm)입니다. 둘레 너비의 " -"% o일 수 있습니다.\n" +"반전이 유용한 것으로 간주되기 위해 필요한 오버행의 수(mm)입니다. 둘레 너비의 " +"%일 수 있습니다.\n" "값 0은 관계없이 모든 홀수 레이어에서 반전을 활성화합니다." msgid "Classic mode" @@ -7920,7 +8037,7 @@ msgid "" "perimeters may exist" msgstr "" "꺾여 있는 둘레가 있을 수 있는 영역에서 출력 속도를 낮추려면 이 옵션을 활성화" -"하십시오" +"하세요" msgid "mm/s or %" msgstr "mm/s or %" @@ -7941,8 +8058,8 @@ msgid "" "Speed of internal bridge. If the value is expressed as a percentage, it will " "be calculated based on the bridge_speed. Default value is 150%." msgstr "" -"내부 다리 속도. 값을 백분율로 표시하면 외부 다리 속도(bridge_speed)를 기준으" -"로 계산됩니다. 기본값은 150%입니다." +"내부 다리 속도. 값을 백분율로 표시하면 외부 다리 속도를 기준으로 계산됩니다. " +"기본값은 150%입니다." msgid "Brim width" msgstr "브림 너비" @@ -8111,8 +8228,20 @@ msgstr "" "습니다. 비활성화하면 다리가 더 좋아 보이지만 짧은 브리지 거리에 대해서만 안정" "적입니다." +msgid "Thick internal bridges" +msgstr "두꺼운 내부 다리" + +msgid "" +"If enabled, thick internal bridges will be used. It's usually recommended to " +"have this feature turned on. However, consider turning it off if you are " +"using large nozzles." +msgstr "" +"활성화되면 두꺼운 내부 브리지가 사용됩니다. 일반적으로 다음을 권장합니다.이 " +"기능을 켜두세요. 하지만 다음과 같은 경우에는 끄는 것을 고려해 보세요.큰 노즐" +"을 사용합니다." + msgid "Max bridge length" -msgstr "최대 다리 거리" +msgstr "최대 다리 길이" msgid "" "Max length of bridges that don't need support. Set it to 0 if you want all " @@ -8129,12 +8258,14 @@ msgid "End G-code when finish the whole printing" msgstr "전체 출력이 끝날때의 종료 G코드" msgid "Between Object Gcode" -msgstr "" +msgstr "개체와 G코드 사이" msgid "" "Insert Gcode between objects. This parameter will only come into effect when " "you print your models object by object" msgstr "" +"개체 사이에 G코드를 삽입하세요. 이 매개변수는 다음 경우에만 적용됩니다.모델 " +"개체를 개체별로 인쇄합니다" msgid "End G-code when finish the printing of this filament" msgstr "이 필라멘트의 출력이 끝날때의 종료 G코드" @@ -8177,7 +8308,7 @@ msgid "Archimedean Chords" msgstr "아르키메데스 코드" msgid "Octagram Spiral" -msgstr "나선형 팔각별" +msgstr "팔각 나선형" msgid "Bottom surface pattern" msgstr "하단 표면 패턴" @@ -8189,7 +8320,7 @@ msgid "Internal solid infill pattern" msgstr "내부 꽉찬 내부 채움 패턴" msgid "" -"Line pattern of internal solid infill. if the detect nattow internal solid " +"Line pattern of internal solid infill. if the detect narrow internal solid " "infill be enabled, the concentric pattern will be used for the small area." msgstr "" "내부 꽉찬 내부 채움의 선 패턴. 좁은 내부 꽉찬 내부 채움 감지가 활성화된 경우 " @@ -8227,26 +8358,81 @@ msgid "" "This sets the threshold for small perimeter length. Default threshold is 0mm" msgstr "작은 둘레 길이에 대한 임계값을 설정합니다. 기본 임계값은 0mm입니다" -msgid "Order of walls" -msgstr "" +msgid "Walls printing order" +msgstr "벽 인쇄 순서" -msgid "Print sequence of inner wall and outer wall. " +msgid "" +"Print sequence of the internal (inner) and external (outer) walls. \n" +"\n" +"Use Inner/Outer for best overhangs. This is because the overhanging walls " +"can adhere to a neighouring perimeter while printing. However, this option " +"results in slightly reduced surface quality as the external perimeter is " +"deformed by being squashed to the internal perimeter.\n" +"\n" +"Use Inner/Outer/Inner for the best external surface finish and dimensional " +"accuracy as the external wall is printed undisturbed from an internal " +"perimeter. However, overhang performance will reduce as there is no internal " +"perimeter to print the external wall against. This option requires a minimum " +"of 3 walls to be effective as it prints the internal walls from the 3rd " +"perimeter onwards first, then the external perimeter and, finally, the first " +"internal perimeter. This option is recomended against the Outer/Inner option " +"in most cases. \n" +"\n" +"Use Outer/Inner for the same external wall quality and dimensional accuracy " +"benefits of Inner/Outer/Inner option. However, the z seams will appear less " +"consistent as the first extrusion of a new layer starts on a visible " +"surface.\n" +"\n" +" " msgstr "" +"내부(내벽) 및 외부(외벽)의 인쇄 순서를 지정합니다.\n" +"\n" +"돌출부를 가장 잘 인쇄하려면 내부/외부를 사용합니다. 이는 돌출된 벽이 인쇄하" +"는 동안 인접한 경계에 부착될 수 있기 때문입니다. 그러나 이 옵션을 사용하면 외" +"부 경계가 내부 경계에 눌려 변형되므로 표면 품질이 약간 저하됩니다.\n" +"\n" +"내부/외부/내부를 사용하면 외부 벽이 내부 경계에서 방해받지 않고 인쇄되므로 최" +"상의 외부 표면 마감과 치수 정확도를 얻을 수 있습니다. 그러나 외부 벽을 인쇄" +"할 내부 경계가 없으므로 오버행 성능이 저하됩니다. 이 옵션은 세 번째 경계부터 " +"내부 벽을 먼저 인쇄한 다음 외부 경계, 마지막으로 첫 번째 내부 경계를 인쇄하므" +"로 최소 3개 이상의 벽이 있어야 효과적입니다. 이 옵션은 대부분의 경우 외부/내" +"부 옵션보다 권장됩니다.\n" +"\n" +"내부/외부/내부 옵션과 동일한 외벽 품질 및 치수 정확도 이점을 얻으려면 외부/내" +"부를 사용하세요. 그러나 새 레이어의 첫 번째 돌출이 보이는 표면에서 시작되므" +"로 Z 심이 덜 일관되게 나타납니다.\n" +"\n" +" " -msgid "inner/outer" -msgstr "" +msgid "Inner/Outer" +msgstr "내벽/외벽" -msgid "outer/inner" -msgstr "" +msgid "Outer/Inner" +msgstr "외벽/내벽" -msgid "inner wall/outer wall/inner wall" -msgstr "" +msgid "Inner/Outer/Inner" +msgstr "내벽/외벽/내벽" msgid "Print infill first" -msgstr "" +msgstr "채우기 먼저 인쇄" -msgid "Order of wall/infill. false means print wall first. " +msgid "" +"Order of wall/infill. When the tickbox is unchecked the walls are printed " +"first, which works best in most cases.\n" +"\n" +"Printing walls first may help with extreme overhangs as the walls have the " +"neighbouring infill to adhere to. However, the infill will slighly push out " +"the printed walls where it is attached to them, resulting in a worse " +"external surface finish. It can also cause the infill to shine through the " +"external surfaces of the part." msgstr "" +"벽/채우기 순서. 확인란을 선택 취소하면 벽이 먼저 인쇄되며 이는 대부분의 경우 " +"가장 잘 작동합니다.\n" +"\n" +"벽에 접착할 이웃 충전재가 있으므로 벽을 먼저 인쇄하면 과도한 돌출부에 도움이 " +"될 수 있습니다. 그러나 충전재는 인쇄된 벽이 부착된 부분을 약간 밀어내어 외부 " +"표면 마감이 더 나빠집니다. 또한 충전재가 부품의 외부 표면을 통해 빛날 수도 있" +"습니다." msgid "Height to rod" msgstr "레일까지의 높이" @@ -8415,7 +8601,7 @@ msgid "Speed used at the very beginning of loading phase." msgstr "압출 단계 초기에 사용되는 속도입니다." msgid "Unloading speed" -msgstr "빼기 속도" +msgstr "언로드 속도" msgid "" "Speed used for unloading the filament on the wipe tower (does not affect " @@ -8425,7 +8611,7 @@ msgstr "" "향을 미치지 않음)" msgid "Unloading speed at the start" -msgstr "시작 시 빼기 속도" +msgstr "시작시 언로드 속도" msgid "" "Speed used for unloading the tip of the filament immediately after ramming." @@ -8517,9 +8703,9 @@ msgid "" "toolchange. This option is only used when the wipe tower is enabled." msgstr "" "다중 압출기 프린터를 사용할 때 래밍을 수행합니다(예: 프린터 설정에서 '단일 압" -"출기 다중 재료'가 선택 취소된 경우). 활성화하면 툴 교체 직전 와이프타워에 소" -"량의 필라멘트가 빠르게 압출됩니다. 이 옵션은 닦기 타워가 활성화된 경우에만 사" -"용됩니다." +"출기 다중 재료'가 선택 취소된 경우). 활성화하면 툴 교체 직전 닦기 타워에 소량" +"의 필라멘트가 빠르게 압출됩니다. 이 옵션은 닦기 타워가 활성화된 경우에만 사용" +"됩니다." msgid "Multitool ramming volume" msgstr "다중 압출기 래밍 부피" @@ -8558,7 +8744,8 @@ msgstr "지지대 재료" msgid "" "Support material is commonly used to print support and support interface" -msgstr "지원 재료는 일반적으로 지지대 및 지지대 접점을 출력하는 데 사용됩니다" +msgstr "" +"지지대 재료는 일반적으로 지지대 및 지지대 접점을 출력하는 데 사용됩니다" msgid "Softening temperature" msgstr "연화 온도" @@ -8578,7 +8765,7 @@ msgid "Filament price. For statistics only" msgstr "필라멘트 가격. 통계 전용" msgid "money/kg" -msgstr "원/kg" +msgstr "가격/kg" msgid "Vendor" msgstr "제조사" @@ -8600,9 +8787,12 @@ msgstr "선의 시작 또는 주 방향을 제어하는 드문 내부 채움 패 msgid "Sparse infill density" msgstr "드문 내부 채움 밀도" -#, c-format -msgid "Density of internal sparse infill, 100% means solid throughout" -msgstr "내부 드문 내부 채움 밀도, 100은 전체가 꽉찬 내부 채움임을 의미합니다" +msgid "" +"Density of internal sparse infill, 100% turns all sparse infill into solid " +"infill and internal solid infill pattern will be used" +msgstr "" +"내부 드문 채우기의 밀도, 100% 모든 드문 채우기를 솔리드로 바꿉니다 채우기 및 " +"내부 솔리드 채우기 패턴이 사용됩니다" msgid "Sparse infill pattern" msgstr "드문 내부 채움 패턴" @@ -8635,7 +8825,7 @@ msgid "3D Honeycomb" msgstr "3D 벌집" msgid "Support Cubic" -msgstr "정육면체 지지대형" +msgstr "정육면체 지지대" msgid "Lightning" msgstr "번개" @@ -8727,7 +8917,7 @@ msgid "" "Acceleration of sparse infill. If the value is expressed as a percentage (e." "g. 100%), it will be calculated based on the default acceleration." msgstr "" -"드문 내부 채움 가속도. 값이 백분율 (ex. 100%)로 표시되면 기본 가속도를 기준으" +"드문 내부 채움 가속도. 값이 백분율 (예. 100%)로 표시되면 기본 가속도를 기준으" "로 계산됩니다." msgid "" @@ -8735,7 +8925,7 @@ msgid "" "percentage (e.g. 100%), it will be calculated based on the default " "acceleration." msgstr "" -"내부 꽉찬 내부 채움 가속도. 값이 백분율 (ex. 100%)로 표시되면 기본 가속도를 " +"내부 꽉찬 내부 채움 가속도. 값이 백분율 (예. 100%)로 표시되면 기본 가속도를 " "기준으로 계산됩니다." msgid "" @@ -8814,8 +9004,8 @@ msgid "" "The first few layers are printed slower than normal. The speed is gradually " "increased in a linear fashion over the specified number of layers." msgstr "" -"처음 몇 개의 레이어는 일반적인 레이어보다 느리게 출력됩니다. 속도는 지정된 레" -"이어 수에 걸쳐 선형 방식으로 점진적으로 증가합니다." +"처음 몇 개의 레이어는 평소보다 느리게 인쇄됩니다. 속도는 지정된 레이어 수에 " +"걸쳐 선형 방식으로 점차 증가합니다." msgid "Initial layer nozzle temperature" msgstr "초기 레이어 노즐 온도" @@ -8887,6 +9077,12 @@ msgid "" "segment" msgstr "각 선의 분절에 도입된 임의의 지점간 평균 거리" +msgid "Apply fuzzy skin to first layer" +msgstr "첫 번째 레이어에 퍼지 스킨 적용" + +msgid "Whether to apply fuzzy skin on the first layer" +msgstr "첫 번째 레이어에 보송보송한 스킨을 적용할지 여부" + msgid "Filter out tiny gaps" msgstr "작은 갭 필터링" @@ -8904,22 +9100,21 @@ msgstr "" "어야 합니다" msgid "Arc fitting" -msgstr "원호 맞춤(아크 피팅)" +msgstr "원호 맞춤" msgid "" "Enable this to get a G-code file which has G2 and G3 moves. And the fitting " "tolerance is same with resolution" msgstr "" -"G2 및 G3 이동(원호 기반 G코드)이 있는 G-코드 파일을 가져오려면 이 기능을 활성" -"화합니다. 피팅 공차(fitting tolerance)는 해상도와 동일합니다" +"G2 및 G3 이동(원호 기반 G코드)이 있는 G코드 파일을 가져오려면 이 기능을 활성" +"화합니다. 피팅 공차는 해상도와 동일합니다" msgid "Add line number" msgstr "라인 번호 추가" msgid "Enable this to add line number(Nx) at the beginning of each G-Code line" msgstr "" -"각 G코드 라인의 시작 부분에 라인 번호(Nx)를 추가하려면 이 기능을 활성화하십시" -"오" +"각 G코드 라인의 시작 부분에 라인 번호(Nx)를 추가하려면 이 기능을 활성화하세요" msgid "Scan first layer" msgstr "첫 레이어 스캔" @@ -8929,7 +9124,7 @@ msgid "" "layer" msgstr "" "프린터의 카메라가 첫 레이어의 품질을 확인할 수 있도록 하려면 이 옵션을 활성화" -"하십시오" +"하세요" msgid "Nozzle type" msgstr "노즐 유형" @@ -8954,7 +9149,7 @@ msgid "Brass" msgstr "동 노즐" msgid "Nozzle HRC" -msgstr "노즐 록웰 경도(HRC)" +msgstr "노즐 록웰 경도" msgid "" "The nozzle's hardness. Zero means no checking for nozzle's hardness during " @@ -8963,7 +9158,7 @@ msgstr "" "노즐의 경도. 0은 슬라이스하는 동안 노즐의 경도를 확인하지 않음을 의미합니다." msgid "HRC" -msgstr "록웰 경도(HRC)" +msgstr "록웰 경도" msgid "Printer structure" msgstr "프린터 구조" @@ -8972,7 +9167,7 @@ msgid "The physical arrangement and components of a printing device" msgstr "출력 장치의 물리적 배열 및 구성 요소" msgid "CoreXY" -msgstr "CoreXY" +msgstr "코어XY" msgid "I3" msgstr "I3" @@ -8981,7 +9176,7 @@ msgid "Hbot" msgstr "Hbot" msgid "Delta" -msgstr "Delta" +msgstr "델타" msgid "Best object position" msgstr "가장 좋은 개체 위치" @@ -9013,7 +9208,7 @@ msgstr "" "사용자 지정 G코드에서 팬 명령을 이동하지 않습니다(일종의 '장벽' 역할을 함).\n" "'사용자 정의 시작 G코드만'이 활성화된 경우 팬 명령을 시작 G코드로 이동하지 않" "습니다.\n" -"비활성화하려면 0을 사용하십시오." +"비활성화하려면 0을 사용하세요." msgid "Only overhangs" msgstr "돌출부 만" @@ -9063,7 +9258,7 @@ msgid "" "Enable this if printer support air filtration\n" "G-code command: M106 P3 S(0-255)" msgstr "" -"프린터가 공기 여과를 지원하는 경우 활성화하십시오.\n" +"프린터가 공기 여과를 지원하는 경우 활성화하세요.\n" "G코드 명령: M106 P3 S(0-255)" msgid "G-code flavor" @@ -9093,7 +9288,7 @@ msgid "Exclude objects" msgstr "개체 제외" msgid "Enable this option to add EXCLUDE OBJECT command in g-code" -msgstr "G코드에 개체 제외 명령을 추가하려면 이 옵션을 활성화하십시오" +msgstr "G코드에 개체 제외 명령을 추가하려면 이 옵션을 활성화하세요" msgid "Verbose G-code" msgstr "상세한 G코드" @@ -9103,9 +9298,9 @@ msgid "" "descriptive text. If you print from SD card, the additional weight of the " "file could make your firmware slow down." msgstr "" -"주석이 달린 G코드 파일을 가져오려면 이 기능을 활성화하십시오. 각 라인은 설명 " -"텍스트로 설명됩니다. SD 카드에서 출력하는 경우 파일의 추가 크기로 인해 펌웨" -"어 속도가 느려질 수 있습니다." +"주석이 달린 G코드 파일을 가져오려면 이 기능을 활성화하세요. 각 라인은 설명 텍" +"스트로 설명됩니다. SD 카드에서 출력하는 경우 파일의 추가 크기로 인해 펌웨어 " +"속도가 느려질 수 있습니다." msgid "Infill combination" msgstr "내부 채움 결합" @@ -9152,16 +9347,16 @@ msgstr "" "지지대 재료를 사용하는 다중 압출기 출력에 유용합니다" msgid "Maximum width of a segmented region" -msgstr "" +msgstr "분할된 영역의 최대 너비" msgid "Maximum width of a segmented region. Zero disables this feature." -msgstr "" +msgstr "분할된 영역의 최대 너비입니다. 0은 이 기능을 비활성화합니다." msgid "Interlocking depth of a segmented region" -msgstr "" +msgstr "분할된 영역의 연동 깊이" msgid "Interlocking depth of a segmented region. Zero disables this feature." -msgstr "" +msgstr "분할된 영역의 깊이를 연동합니다. 0은 이 기능을 비활성화합니다." msgid "Ironing Type" msgstr "다림질 유형" @@ -9459,7 +9654,7 @@ msgid "" msgstr "" "보조 출력물 냉각팬의 속도. 냉각 레이어가 없는 것으로 정의된 처음 여러 레이어" "를 제외하고 출력 중에 보조 팬이 이 속도로 작동합니다.\n" -"이 기능을 사용하려면 프린터 설정에서 보조 팬을 활성화하십시오. G코드 명령: " +"이 기능을 사용하려면 프린터 설정에서 보조 팬을 활성화하세요. G코드 명령: " "M106 P2 S(0-255)" msgid "Min" @@ -9590,13 +9785,13 @@ msgstr "파일 이름 형식" msgid "User can self-define the project file name when export" msgstr "사용자가 내보낼 파일 이름을 자체 정의할 수 있습니다" -msgid "Make overhang printable" +msgid "Make overhangs printable" msgstr "돌출부 형상 변경" msgid "Modify the geometry to print overhangs without support material." msgstr "지지대 없이 돌출부를 출력하도록 형상을 수정합니다." -msgid "Make overhang printable maximum angle" +msgid "Make overhangs printable - Maximum angle" msgstr "돌출부 형상 변경 최대 각도" msgid "" @@ -9608,7 +9803,7 @@ msgstr "" "전혀 변경하지 않고 돌출부를 허용하는 반면, 0은 모든 돌출부를 원뿔형 재료로 대" "체합니다." -msgid "Make overhang printable hole area" +msgid "Make overhangs printable - Hole area" msgstr "돌출부 형상 변경 구멍 영역" msgid "" @@ -9651,9 +9846,9 @@ msgid "" "environment variables." msgstr "" "사용자 정의 스크립트를 통해 출력 G코드를 처리하려면 여기에 절대 경로를 나열하" -"십시오. 여러 스크립트는 세미콜론(;)으로 구분합니다. 스크립트는 G코드 파일의 " -"절대 경로를 첫 번째 인수로 전달하며 환경 변수를 읽어 Slic3r 구성 설정에 접근" -"할 수 있습니다." +"세요. 여러 스크립트는 세미콜론(;)으로 구분합니다. 스크립트는 G코드 파일의 절" +"대 경로를 첫 번째 인수로 전달하며 환경 변수를 읽어 Slic3r 구성 설정에 접근할 " +"수 있습니다." msgid "Printer notes" msgstr "프린터 메모" @@ -9700,9 +9895,9 @@ msgid "" "much points and gcode lines in gcode file. Smaller value means higher " "resolution and more time to slice" msgstr "" -"G-code 경로는 G코드 파일에서 너무 많은 점과 gcode 라인을 방지하기 위해 모델" -"의 윤곽을 단순화한 후 생성됩니다. 작은 값은 높은 해상도와 많은 슬라이스 시간" -"을 의미합니다" +"G코드 경로는 G코드 파일에서 너무 많은 점과 G코드 라인을 방지하기 위해 모델의 " +"윤곽을 단순화한 후 생성됩니다. 작은 값은 높은 해상도와 많은 슬라이스 시간을 " +"의미합니다" msgid "Travel distance threshold" msgstr "이동 거리 임계값" @@ -9739,7 +9934,7 @@ msgid "" "travel. Set zero to disable retraction" msgstr "" "긴 이동 중에 필라멘트가 스며드는 것을 방지하기 위해 압출기의 재료를 약간 뒤" -"로 당깁니다. 퇴출을 비활성화하려면 0을 설정하십시오" +"로 당깁니다. 퇴출을 비활성화하려면 0을 설정하세요" msgid "Z hop when retract" msgstr "퇴출 시 Z 올리기" @@ -9780,7 +9975,7 @@ msgid "Slope" msgstr "경사" msgid "Spiral" -msgstr "나선" +msgstr "나선형" msgid "Only lift Z above" msgstr "Z값 위에서만 올리기" @@ -9869,6 +10064,9 @@ msgstr "" msgid "Show auto-calibration marks" msgstr "자동 교정 기호 표시" +msgid "Disable set remaining print time" +msgstr "남은 인쇄 시간 설정 비활성화" + msgid "Seam position" msgstr "솔기 위치" @@ -9996,16 +10194,36 @@ msgid "Speed of internal solid infill, not the top and bottom surface" msgstr "상단 및 하단 표면을 제외한 내부 꽉찬 내부 채움 속도" msgid "Spiral vase" -msgstr "나선 꽃병" +msgstr "나선형 꽃병 모드" msgid "" "Spiralize smooths out the z moves of the outer contour. And turns a solid " "model into a single walled print with solid bottom layers. The final " "generated model has no seam" msgstr "" -"나선화는 외부 윤곽선의 z 이동을 부드럽게 합니다. 그리고 개체를 꽉찬 하단 레이" +"나선형은 외부 윤곽선의 z 이동을 부드럽게 합니다. 그리고 개체를 꽉찬 하단 레이" "어가 있는 단일 벽으로 출력합니다. 최종 생성된 출력물에는 솔기가 없습니다" +msgid "Smooth Spiral" +msgstr "부드러운 나선형" + +msgid "" +"Smooth Spiral smoothes out X and Y moves as wellresulting in no visible seam " +"at all, even in the XY directions on walls that are not vertical" +msgstr "" +"부드러운 나선형은 X와 Y의 움직임을 매끄럽게 처리하여 수직이 아닌 벽의 XY 방향" +"에서도 이음새가 전혀 보이지 않습니다" + +msgid "Max XY Smoothing" +msgstr "최대 XY 스무딩" + +msgid "" +"Maximum distance to move points in XY to try to achieve a smooth spiralIf " +"expressed as a %, it will be computed over nozzle diameter" +msgstr "" +"부드러운 나선형을 얻기 위해 점을 XY로 이동하는 최대 거리 %로 표시할 경우 노" +"즐 직경에 대해 계산됩니다" + msgid "" "If smooth or traditional mode is selected, a timelapse video will be " "generated for each print. After each layer is printed, a snapshot is taken " @@ -10110,8 +10328,8 @@ msgid "" "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to " "close all holes in the model." msgstr "" -"3DLabPrint 비행기 모델에는 \"짝수-홀수\"를 사용하십시오. \"구멍 닫기\"를 사용" -"하여 모델의 모든 구멍을 닫습니다." +"3DLabPrint 비행기 모델에는 \"짝수-홀수\"를 사용하세요. \"구멍 닫기\"를 사용하" +"여 모델의 모든 구멍을 닫습니다." msgid "Regular" msgstr "일반" @@ -10218,11 +10436,13 @@ msgstr "" "기본 지지대 및 라프트를 출력하기 위한 필라멘트. \"기본값\"은 지원을 위한 특" "정 필라멘트가 없으며 현재 필라멘트가 사용됨을 의미합니다" -msgid "No interface filament for body" -msgstr "" +msgid "Avoid interface filament for base" +msgstr "베이스용 인터페이스 필라멘트 줄이기" -msgid "Don't use support interface filament to print support body" +msgid "" +"Avoid using support interface filament to print support base if possible." msgstr "" +"서포트 베이스를 프린트하기 위해 서포트 인터페이스 필라멘트를 사용하지 마세요" msgid "" "Line width of support. If expressed as a %, it will be computed over the " @@ -10257,10 +10477,10 @@ msgid "Bottom interface layers" msgstr "하단 접점 레이어" msgid "Number of bottom interface layers" -msgstr "" +msgstr "하단 인터페이스 레이어 수" msgid "Same as top" -msgstr "" +msgstr "위와 동일" msgid "Top interface spacing" msgstr "상단 접점 선 간격" @@ -10313,7 +10533,7 @@ msgid "Normal Support expansion" msgstr "일반 지지대 확장" msgid "Expand (+) or shrink (-) the horizontal span of normal support" -msgstr "일반 지지대의 수평 범위를 확대( + ) 또는 축소( - )합니다" +msgstr "일반 지지대의 수평 범위를 확대(+) 또는 축소(-)합니다" msgid "Speed of support" msgstr "지지대 속도" @@ -10390,8 +10610,8 @@ msgid "" "higher angle for branches to merge faster." msgstr "" "모델을 피할 필요가 없을 때 가지의 선호 각도입니다. 더 수직적이고 안정적으로 " -"만들려면 더 낮은 각도를 사용하십시오. 가지를 더 빠르게 병합하려면 더 높은 각" -"도를 사용하세요." +"만들려면 더 낮은 각도를 사용하세요. 가지를 더 빠르게 병합하려면 더 높은 각도" +"를 사용하세요." msgid "Tree support branch distance" msgstr "나무 지지대 가지 거리" @@ -10480,11 +10700,11 @@ msgstr "" "이 직경의 원 면적보다 더 큰 면적을 가진 가지는 안정성을 위해 이중벽으로 출력" "됩니다. 이중벽을 허용하지 않으려면 이 값을 0으로 설정합니다." -msgid "Tree support wall loops" -msgstr "나무 지지대 벽 루프" +msgid "Support wall loops" +msgstr "지지대 벽 루프" -msgid "This setting specify the count of walls around tree support" -msgstr "이 설정은 나무 지지대의 벽 수를 지정합니다" +msgid "This setting specify the count of walls around support" +msgstr "이 설정은 지지대 주변의 벽 수를 지정합니다" msgid "Tree support with infill" msgstr "내부 채움이 있는 나무 지지대" @@ -10546,7 +10766,7 @@ msgstr "" "니다" msgid "This gcode is inserted when the extrusion role is changed" -msgstr "이 G코드는 압출 역할이 변경될 때 삽입됩니다." +msgstr "이 G코드는 압출 역할이 변경될 때 삽입됩니다" msgid "" "Line width for top surfaces. If expressed as a %, it will be computed over " @@ -10602,8 +10822,23 @@ msgid "Wipe Distance" msgstr "닦기 거리" msgid "" -"Discribe how long the nozzle will move along the last path when retracting" -msgstr "퇴출 시 노즐이 마지막 경로를 따라 이동하는 거리" +"Discribe how long the nozzle will move along the last path when " +"retracting. \n" +"\n" +"Depending on how long the wipe operation lasts, how fast and long the " +"extruder/filament retraction settings are, a retraction move may be needed " +"to retract the remaining filament. \n" +"\n" +"Setting a value in the retract amount before wipe setting below will perform " +"any excess retraction before the wipe, else it will be performed after." +msgstr "" +"후퇴할 때 노즐이 마지막 경로를 따라 얼마나 오래 움직일지 설명합니다.\n" +"\n" +"와이프 작업의 지속 시간, 압출기/필라멘트 후퇴 설정의 속도와 길이에 따라 남은 " +"필라멘트를 후퇴시키기 위해 후퇴 동작이 필요할 수 있습니다.\n" +"\n" +"아래의 와이프 전 후퇴량 설정에서 값을 설정하면 와이프 전에 초과 후퇴가 수행되" +"고, 그렇지 않으면 와이프 후에 수행됩니다." msgid "" "The wiping tower can be used to clean up the residue on the nozzle and " @@ -10657,7 +10892,7 @@ msgid "Wipe tower purge lines spacing" msgstr "닦기 타워 청소 선 간격" msgid "Spacing of purge lines on the wipe tower." -msgstr "닦기 타워의 청소(퍼지) 선 간격입니다." +msgstr "닦기 타워의 청소 선 간격입니다." msgid "Wipe tower extruder" msgstr "닦기 타워 압출기" @@ -10667,7 +10902,7 @@ msgid "" "use the one that is available (non-soluble would be preferred)." msgstr "" "닦기 타워의 둘레를 출력할 때 사용하는 압출기입니다. 사용 가능한 압출기를 사용" -"하려면 0으로 설정하십시오(비가용성 재료가 적절함)." +"하려면 0으로 설정하세요(비가용성 재료가 적절함)." msgid "Purging volumes - load/unload volumes" msgstr "제거 부피 - 넣기/빼기 부피" @@ -10932,12 +11167,8 @@ msgstr "" msgid "invalid value " msgstr "잘못된 값 " -#, c-format, boost-format -msgid " doesn't work at 100%% density " -msgstr " 100%% 밀도에서 작동하지 않음 " - msgid "Invalid value when spiral vase mode is enabled: " -msgstr "나선 꽃병 모드가 활성화된 경우 유효하지 않은 값: " +msgstr "나선형 꽃병 모드가 활성화된 경우 유효하지 않은 값: " msgid "too large line width " msgstr "너무 넓은 선 너비 " @@ -10999,7 +11230,7 @@ msgid "Load custom gcode from json" msgstr "사용자 설정 G코드를 json에서 불러오기" msgid "Error in zip archive" -msgstr "Zip 아카이브 오류" +msgstr "ZIP 압축파일 오류" msgid "Generating walls" msgstr "벽 생성 중" @@ -11034,7 +11265,7 @@ msgid "" "generation." msgstr "" "개체 %s에 %s이(가) 있는 것 같습니다. 물체의 방향을 바꾸거나 지지대 생성을 활" -"성화하십시오." +"성화하세요." msgid "Optimizing toolpath" msgstr "툴 경로 최적화" @@ -11141,7 +11372,7 @@ msgid "Auto-Calibration" msgstr "자동 교정" msgid "We would use Lidar to read the calibration result" -msgstr "Lidar를 사용하여 교정 결과를 읽습니다" +msgstr "라이다를 사용하여 교정 결과를 읽습니다" msgid "Prev" msgstr "이전" @@ -11167,7 +11398,7 @@ msgid "" "Please upgrade the printer firmware." msgstr "" "프린터의 현재 펌웨어 버전은 교정을 지원하지 않습니다.\n" -"프린터 펌웨어를 업그레이드하십시오." +"프린터 펌웨어를 업그레이드하세요." msgid "Calibration not supported" msgstr "교정이 지원되지 않음" @@ -11201,7 +11432,7 @@ msgid "" "End value: > Start value\n" "Value step: >= %.3f)" msgstr "" -"유효한 값을 입력하십시오:\n" +"유효한 값을 입력하세요:\n" "시작 값: >= %.1f\n" "종료 값: <= %.1f\n" "종료 값: > 시작 값\n" @@ -11212,7 +11443,7 @@ msgstr "이름은 비워둘 수 없습니다." #, c-format, boost-format msgid "The selected preset: %s is not found." -msgstr "" +msgstr "선택한 사전 설정: %s을(를) 찾을 수 없습니다." msgid "The name cannot be the same as the system preset name." msgstr "이름은 시스템 사전 설정 이름과 동일할 수 없습니다." @@ -11252,7 +11483,7 @@ msgid "Internal Error" msgstr "내부 오류" msgid "Please select at least one filament for calibration" -msgstr "교정을 위해 하나 이상의 필라멘트를 선택하십시오" +msgstr "교정을 위해 하나 이상의 필라멘트를 선택하세요" msgid "Flow rate calibration result has been saved to preset" msgstr "유량 교정 결과가 사전 설정에 저장되었습니다" @@ -11385,7 +11616,7 @@ msgid "" "can lead to sub-par prints or printer damage. Please make sure to carefully " "read and understand the process before doing it." msgstr "" -"자동 유량 교정은 Bambu Lab의 Micro-Lidar 기술을 활용하여 교정 패턴을 직접 측" +"자동 유량 교정은 뱀부랩의 마이크로 라이다 기술을 활용하여 교정 패턴을 직접 측" "정합니다. 그러나 특정 유형의 재료를 사용하면 이 방법의 효율성과 정확성이 저하" "될 수 있다는 점에 유의하시기 바랍니다. 특히, 투명 또는 반투명, 반짝이는 입자 " "또는 고반사 마감 처리된 필라멘트는 이 교정에 적합하지 않을 수 있으며 바람직하" @@ -11472,7 +11703,7 @@ msgid "Flow Ratio" msgstr "유량 비율" msgid "Please input a valid value (0.0 < flow ratio < 2.0)" -msgstr "유효한 값을 입력하십시오(0.0 < 유량비율 < 2.0)" +msgstr "유효한 값을 입력하세요(0.0 < 유량비율 < 2.0)" msgid "Please enter the name of the preset you want to save." msgstr "저장하고 싶은 사전 설정의 이름을 입력해주세요." @@ -11503,7 +11734,7 @@ msgid "Please choose a block with smoothest top surface." msgstr "상단 표면이 가장 매끄러운 블록을 선택하세요." msgid "Please input a valid value (0 <= Max Volumetric Speed <= 60)" -msgstr "유효한 값을 입력하십시오(0 <= 최대 체적 속도 <= 60)" +msgstr "유효한 값을 입력하세요(0 <= 최대 체적 속도 <= 60)" msgid "Calibration Type" msgstr "교정 유형" @@ -11683,7 +11914,7 @@ msgid "" "End PA: > Start PA\n" "PA step: >= 0.001)" msgstr "" -"유효한 값을 입력하십시오:\n" +"유효한 값을 입력하세요:\n" "PA 시작: >= 0.0\n" "PA 종료: > PA 시작\n" "PA 단계: >= 0.001)" @@ -11727,7 +11958,7 @@ msgid "" "End temp: >= 170\n" "Start temp > End temp + 5)" msgstr "" -"유효한 값을 입력하십시오:\n" +"유효한 값을 입력하세요:\n" "시작 온도: <= 350\n" "종료 온도: >= 170\n" "시작온도 > 종료온도 + 5)" @@ -11750,13 +11981,13 @@ msgid "" "step >= 0\n" "end > start + step)" msgstr "" -"유효한 값을 입력하십시오:\n" +"유효한 값을 입력하세요:\n" "시작 > 0\n" "단계 >= 0\n" "끝 > 시작 + 단계)" msgid "VFA test" -msgstr "VFA 테스트(VFA test)" +msgstr "VFA 테스트" msgid "Start speed: " msgstr "시작 속도: " @@ -11770,7 +12001,7 @@ msgid "" "step >= 0\n" "end > start + step)" msgstr "" -"유효한 값을 입력하십시오:\n" +"유효한 값을 입력하세요:\n" "시작 > 10\n" "단계 >= 0\n" "끝 > 시작 + 단계)" @@ -11791,7 +12022,7 @@ msgid "Upload to Printer Host with the following filename:" msgstr "다음 파일 이름으로 프린터 호스트에 업로드:" msgid "Use forward slashes ( / ) as a directory separator if needed." -msgstr "필요한 경우 슬래시( / )를 디렉토리 구분 기호로 사용하십시오." +msgstr "필요한 경우 슬래시( / )를 디렉토리 구분 기호로 사용하세요." msgid "Upload to storage" msgstr "저장소에 업로드" @@ -11879,12 +12110,808 @@ msgstr "요소 2" msgid "Delete input" msgstr "입력개체 삭제" +msgid "Network Test" +msgstr "네트워크 테스트" + +msgid "Start Test Multi-Thread" +msgstr "멀티스레드 테스트 시작" + +msgid "Start Test Single-Thread" +msgstr "단일 스레드 테스트 시작" + +msgid "Export Log" +msgstr "로그 내보내기" + +msgid "Studio Version:" +msgstr "스튜디오 버전:" + +msgid "System Version:" +msgstr "시스템 버전:" + +msgid "DNS Server:" +msgstr "DNS 서버:" + +msgid "Test BambuLab" +msgstr "테스트 뱀부랩" + +msgid "Test BambuLab:" +msgstr "테스트 뱀부랩:" + +msgid "Test Bing.com" +msgstr "테스트 Bing.com" + +msgid "Test bing.com:" +msgstr "테스트 Bing.com:" + +msgid "Test HTTP" +msgstr "테스트 HTTP" + +msgid "Test HTTP Service:" +msgstr "테스트 HTTP 서비스:" + +msgid "Test storage" +msgstr "테스트 저장소" + +msgid "Test Storage Upload:" +msgstr "테스트 저장소 업로드:" + +msgid "Test storage upgrade" +msgstr "테스트 저장소 업그레이드" + +msgid "Test Storage Upgrade:" +msgstr "테스트 저장소 업그레이드:" + +msgid "Test storage download" +msgstr "테스트 저장소 다운로드" + +msgid "Test Storage Download:" +msgstr "테스트 저장소 다운로드:" + +msgid "Test plugin download" +msgstr "테스트 플러그인 다운로드" + +msgid "Test Plugin Download:" +msgstr "테스트 플러그인 다운로드:" + +msgid "Test Storage Upload" +msgstr "테스트 저장소 업로드" + +msgid "Log Info" +msgstr "로그 정보" + +msgid "Select filament preset" +msgstr "필라멘트 사전 설정 선택" + +msgid "Create Filament" +msgstr "필라멘트 생성" + +msgid "Create Based on Current Filament" +msgstr "현재 필라멘트를 기반으로 생성" + +msgid "Copy Current Filament Preset " +msgstr "현재 필라멘트 사전 설정 복사 " + +msgid "Basic Information" +msgstr "기본 정보" + +msgid "Add Filament Preset under this filament" +msgstr "이 필라멘트 아래에 필라멘트 사전 설정을 추가하세요" + +msgid "We could create the filament presets for your following printer:" +msgstr "다음 프린터에 대한 필라멘트 사전 설정을 만들 수 있습니다:" + +msgid "Select Vendor" +msgstr "공급업체 선택" + +msgid "Input Custom Vendor" +msgstr "맞춤 공급업체 입력" + +msgid "Can't find vendor I want" +msgstr "원하는 공급업체를 찾을 수 없습니다" + +msgid "Select Type" +msgstr "유형 선택" + +msgid "Select Filament Preset" +msgstr "필라멘트 사전 설정 선택" + +msgid "Serial" +msgstr "시리얼" + +msgid "e.g. Basic, Matte, Silk, Marble" +msgstr "예를 들어 베이직, 매트, 실크, 마블" + +msgid "Filament Preset" +msgstr "필라멘트 사전 설정" + +msgid "Create" +msgstr "생성" + +msgid "Vendor is not selected, please reselect vendor." +msgstr "공급업체가 선택되지 않았습니다. 공급업체를 다시 선택하세요." + +msgid "Custom vendor is not input, please input custom vendor." +msgstr "맞춤 공급업체가 입력되지 않았습니다. 맞춤 공급업체를 입력해 주세요." + +msgid "" +"\"Bambu\" or \"Generic\" can not be used as a Vendor for custom filaments." +msgstr "" +"\"뱀부\" 또는 \"일반적인\"은 맞춤형 필라멘트 공급업체로 사용할 수 없습니다." + +msgid "Filament type is not selected, please reselect type." +msgstr "필라멘트 유형이 선택되지 않았습니다. 유형을 다시 선택하세요." + +msgid "Filament serial is not inputed, please input serial." +msgstr "필라멘트 시리얼이 입력되지 않았습니다. 시리얼을 입력해 주세요." + +msgid "" +"There may be escape characters in the vendor or serial input of filament. " +"Please delete and re-enter." +msgstr "" +"공급업체나 필라멘트의 직렬 입력에 이스케이프 문자가 있을 수 있습니다. 삭제하" +"고 다시 입력해주세요." + +msgid "All inputs in the custom vendor or serial are spaces. Please re-enter." +msgstr "" +"사용자 정의 공급업체 또는 일련번호의 모든 입력은 공백입니다. 다시 입력해 주세" +"요." + +msgid "The vendor can not be a number. Please re-enter." +msgstr "공급업체는 숫자가 될 수 없습니다. 다시 입력하세요." + +msgid "" +"You have not selected a printer or preset yet. Please select at least one." +msgstr "아직 프린터나 사전 설정을 선택하지 않았습니다. 하나 이상 선택하세요." + +msgid "Some existing presets have failed to be created, as follows:\n" +msgstr "다음과 같이 일부 기존 사전 설정을 생성하지 못했습니다.\n" + +msgid "" +"\n" +"Do you want to rewrite it?" +msgstr "" +"\n" +"다시 작성하시겠습니까?" + +msgid "" +"We would rename the presets as \"Vendor Type Serial @printer you " +"selected\". \n" +"To add preset for more prinetrs, Please go to printer selection" +msgstr "" +"사전 설정의 이름을 \"선택한 공급업체 유형 직렬 @프린터\"로 변경합니다.\n" +"더 많은 프린터에 대한 사전 설정을 추가하려면 프린터 선택으로 이동하세요" + +msgid "Create Printer/Nozzle" +msgstr "프린터/노즐 생성" + +msgid "Create Printer" +msgstr "프린터 생성" + +msgid "Create Nozzle for Existing Printer" +msgstr "기존 프린터용 노즐 생성" + +msgid "Create from Template" +msgstr "템플릿에서 생성" + +msgid "Create Based on Current Printer" +msgstr "현재 프린터를 기반으로 생성" + +msgid "wiki" +msgstr "위키" + +msgid "Import Preset" +msgstr "사전 설정 가져오기" + +msgid "Create Type" +msgstr "유형 생성" + +msgid "The model is not fond, place reselect vendor." +msgstr "모델이 마음에 들지 않으면 공급업체를 다시 선택하세요." + +msgid "Select Model" +msgstr "모델 선택" + +msgid "Select Printer" +msgstr "프린터 선택" + +msgid "Input Custom Model" +msgstr "커스텀 모델 입력" + +msgid "Can't find my printer model" +msgstr "내 프린터 모델을 찾을 수 없습니다" + +msgid "Rectangle" +msgstr "직사각형" + +msgid "Printable Space" +msgstr "인쇄 가능 공간" + +msgid "X" +msgstr "X" + +msgid "Y" +msgstr "Y" + +msgid "Hot Bed STL" +msgstr "베드 STL" + +msgid "Load stl" +msgstr "STL 로드" + +msgid "Hot Bed SVG" +msgstr "베드 SVG" + +msgid "Load svg" +msgstr "SVG 로드" + +msgid "Max Print Height" +msgstr "최대 인쇄 높이" + +#, c-format, boost-format +msgid "The file exceeds %d MB, please import again." +msgstr "파일이 %d MB를 초과합니다. 다시 가져오십시오." + +msgid "Exception in obtaining file size, please import again." +msgstr "파일 크기를 가져오는 중 예외가 발생했습니다. 다시 가져오세요." + +msgid "Preset path is not find, please reselect vendor." +msgstr "사전 설정 경로를 찾을 수 없습니다. 공급업체를 다시 선택하세요." + +msgid "The printer model was not found, please reselect." +msgstr "프린터 모델을 찾을 수 없습니다. 다시 선택하세요." + +msgid "The nozzle diameter is not fond, place reselect." +msgstr "노즐 직경이 마음에 들지 않으면 다시 선택하세요." + +msgid "The printer preset is not fond, place reselect." +msgstr "프린터 사전 설정이 마음에 들지 않습니다. 다시 선택하세요." + +msgid "Printer Preset" +msgstr "프린터 사전 설정" + +msgid "Filament Preset Template" +msgstr "필라멘트 사전 설정 템플릿" + +msgid "Deselect All" +msgstr "모두 선택 해제" + +msgid "Process Preset Template" +msgstr "프로세스 사전 설정 템플릿" + +msgid "Back Page 1" +msgstr "뒤 페이지 1" + +msgid "" +"You have not yet chosen which printer preset to create based on. Please " +"choose the vendor and model of the printer" +msgstr "" +"생성할 프린터 사전 설정을 아직 선택하지 않았습니다. 프린터의 공급업체와 모델" +"을 선택하세요" + +msgid "" +"You have entered an illegal input in the printable area section on the first " +"page. Please check before creating it." +msgstr "" +"첫 번째 페이지의 인쇄 가능 영역 섹션에 잘못된 입력을 입력했습니다. 작성 전 " +"꼭 확인해주세요." + +msgid "The custom printer or model is not inputed, place input." +msgstr "사용자 정의 프린터 또는 모델이 입력되지 않았습니다. 입력하세요." + +msgid "" +"The printer preset you created already has a preset with the same name. Do " +"you want to overwrite it?\n" +"\tYes: Overwrite the printer preset with the same name, and filament and " +"process presets with the same preset name will be recreated \n" +"and filament and process presets without the same preset name will be " +"reserve.\n" +"\tCancel: Do not create a preset, return to the creation interface." +msgstr "" +"생성한 프린터 사전 설정에 동일한 이름의 사전 설정이 이미 있습니다. 덮어쓰시겠" +"습니까?\n" +"예: 동일한 이름으로 프린터 사전 설정을 덮어쓰면 동일한 사전 설정 이름을 가진 " +"필라멘트 및 프로세스 사전 설정이 다시 생성됩니다.\n" +"동일한 사전 설정 이름이 없는 필라멘트 및 프로세스 사전 설정은 예약됩니다.\n" +"취소: 사전 설정을 생성하지 않고 생성 인터페이스로 돌아갑니다." + +msgid "You need to select at least one filament preset." +msgstr "필라멘트 사전 설정을 하나 이상 선택해야 합니다." + +msgid "You need to select at least one process preset." +msgstr "프로세스 사전 설정을 하나 이상 선택해야 합니다." + +msgid "Create filament presets failed. As follows:\n" +msgstr "필라멘트 사전 설정 생성에 실패했습니다. 다음과 같이:\n" + +msgid "Create process presets failed. As follows:\n" +msgstr "프로세스 사전 설정 생성에 실패했습니다. 다음과 같이:\n" + +msgid "Vendor is not find, please reselect." +msgstr "공급업체를 찾을 수 없습니다. 다시 선택하세요." + +msgid "Current vendor has no models, please reselect." +msgstr "현재 공급업체에는 모델이 없습니다. 다시 선택하세요." + +msgid "" +"You have not selected the vendor and model or inputed the custom vendor and " +"model." +msgstr "" +"공급업체 및 모델을 선택하지 않았거나 맞춤 공급업체 및 모델을 입력하지 않았습" +"니다." + +msgid "" +"There may be escape characters in the custom printer vendor or model. Please " +"delete and re-enter." +msgstr "" +"사용자 정의 프린터 공급업체 또는 모델에 이스케이프 문자가 있을 수 있습니다. " +"삭제하고 다시 입력해주세요." + +msgid "" +"All inputs in the custom printer vendor or model are spaces. Please re-enter." +msgstr "" +"사용자 정의 프린터 공급업체 또는 모델의 모든 입력은 공백입니다. 다시 입력해 " +"주세요." + +msgid "Please check bed printable shape and origin input." +msgstr "인쇄 가능한 베드 형태와 원산지 입력을 확인해주세요." + +msgid "" +"You have not yet selected the printer to replace the nozzle, please choose." +msgstr "노즐을 교체할 프린터를 아직 선택하지 않으셨습니다. 선택해 주세요." + +msgid "Create Printer Successful" +msgstr "프린터 생성 성공" + +msgid "Create Filament Successful" +msgstr "필라멘트 생성 성공" + +msgid "Printer Created" +msgstr "프린터가 생성되었습니다" + +msgid "Please go to printer settings to edit your presets" +msgstr "사전 설정을 편집하려면 프린터 설정으로 이동하세요" + +msgid "Filament Created" +msgstr "필라멘트 생성됨" + +msgid "" +"Please go to filament setting to edit your presets if you need.\n" +"Please note that nozzle temperature, hot bed temperature, and maximum " +"volumetric speed have a significant impact on printing quality. Please set " +"them carefully." +msgstr "" +"필요한 경우 필라멘트 설정으로 이동하여 사전 설정을 편집하세요.\n" +"노즐 온도, 핫베드 온도 및 최대 체적 속도는 인쇄 품질에 큰 영향을 미칩니다. 신" +"중하게 설정해 주세요." + +msgid "Printer Setting" +msgstr "프린터 설정" + +msgid "Export Configs" +msgstr "구성 내보내기" + +msgid "Printer config bundle(.bbscfg)" +msgstr "프린터 구성 번들(.bbscfg)" + +msgid "Filament bundle(.bbsflmt)" +msgstr "필라멘트 번들(.bbsflmt)" + +msgid "Printer presets(.zip)" +msgstr "프린터 사전 설정(.zip)" + +msgid "Filament presets(.zip)" +msgstr "필라멘트 사전 설정(.zip)" + +msgid "Process presets(.zip)" +msgstr "프로세스 사전 설정(.zip)" + +msgid "initialize fail" +msgstr "초기화 실패" + +msgid "add file fail" +msgstr "파일 추가 실패" + +msgid "add bundle structure file fail" +msgstr "번들 구조 파일 추가 실패" + +msgid "finalize fail" +msgstr "마무리 실패" + +msgid "open zip written fail" +msgstr "ZIP 열기 실패" + +msgid "Export successful" +msgstr "내보내기 성공" + +#, c-format, boost-format +msgid "" +"The '%s' folder already exists in the current directory. Do you want to " +"clear it and rebuild it.\n" +"If not, a time suffix will be added, and you can modify the name after " +"creation." +msgstr "" +"현재 디렉터리에 '%s' 폴더가 이미 존재합니다. 지우고 다시 작성하시겠습니까?\n" +"그렇지 않은 경우 시간 접미사가 추가되며 생성 후 이름을 수정할 수 있습니다." + +msgid "" +"Printer and all the filament&process presets that belongs to the printer. \n" +"Can be shared with others." +msgstr "" +"프린터와 프린터에 속한 모든 필라멘트 및 프로세스 사전 설정.\n" +"다른 사람과 공유할 수 있습니다." + +msgid "" +"User's fillment preset set. \n" +"Can be shared with others." +msgstr "" +"사용자의 채우기 사전 설정입니다.\n" +"다른 사람과 공유할 수 있습니다." + +msgid "" +"Only display printer names with changes to printer, filament, and process " +"presets." +msgstr "" +"프린터, 필라멘트 및 프로세스 사전 설정이 변경된 경우에만 프린터 이름을 표시합" +"니다." + +msgid "Only display the filament names with changes to filament presets." +msgstr "필라멘트 사전 설정이 변경된 경우에만 필라멘트 이름을 표시합니다." + +msgid "" +"Only printer names with user printer presets will be displayed, and each " +"preset you choose will be exported as a zip." +msgstr "" +"사용자 프린터 사전 설정이 있는 프린터 이름만 표시되며, 선택한 각 사전 설정은 " +"zip으로 내보내집니다." + +msgid "" +"Only the filament names with user filament presets will be displayed, \n" +"and all user filament presets in each filament name you select will be " +"exported as a zip." +msgstr "" +"사용자 필라멘트 사전 설정이 있는 필라멘트 이름만 표시됩니다.\n" +"선택한 각 필라멘트 이름의 모든 사용자 필라멘트 사전 설정은 zip으로 내보내집니" +"다." + +msgid "" +"Only printer names with changed process presets will be displayed, \n" +"and all user process presets in each printer name you select will be " +"exported as a zip." +msgstr "" +"프로세스 사전 설정이 변경된 프린터 이름만 표시됩니다.\n" +"선택한 각 프린터 이름의 모든 사용자 프로세스 사전 설정은 zip으로 내보내집니" +"다." + +msgid "Please select at least one printer or filament." +msgstr "프린터나 필라멘트를 하나 이상 선택해 주세요." + +msgid "Please select a type you want to export" +msgstr "내보내려는 유형을 선택하세요" + +msgid "Edit Filament" +msgstr "필라멘트 편집" + +msgid "Filament presets under this filament" +msgstr "이 필라멘트 아래의 필라멘트 사전 설정" + +msgid "" +"Note: If the only preset under this filament is deleted, the filament will " +"be deleted after exiting the dialog." +msgstr "" +"참고: 이 필라멘트 아래의 유일한 사전 설정이 삭제되면 대화 상자를 종료한 후 필" +"라멘트가 삭제됩니다." + +msgid "Presets inherited by other presets can not be deleted" +msgstr "다른 사전 설정에 상속된 사전 설정은 삭제할 수 없습니다" + +msgid "The following presets inherits this preset." +msgid_plural "The following preset inherits this preset." +msgstr[0] "다음 사전 설정은 이 사전 설정을 상속합니다." + +msgid "Delete Preset" +msgstr "사전 설정 삭제" + +msgid "Are you sure to delete the selected preset?" +msgstr "선택한 사전 설정을 삭제하시겠습니까?" + +msgid "Delete preset" +msgstr "사전 설정 삭제" + +msgid "+ Add Preset" +msgstr "+ 사전 설정 추가" + +msgid "Delete Filament" +msgstr "필라멘트 삭제" + +msgid "" +"All the filament presets belong to this filament would be deleted. \n" +"If you are using this filament on your printer, please reset the filament " +"information for that slot." +msgstr "" +"이 필라멘트에 속한 모든 필라멘트 사전 설정이 삭제됩니다.\n" +"프린터에서 이 필라멘트를 사용하는 경우 해당 슬롯의 필라멘트 정보를 재설정하세" +"요." + +msgid "Delete filament" +msgstr "필라멘트 삭제" + +msgid "Add Preset" +msgstr "사전 설정 추가" + +msgid "Add preset for new printer" +msgstr "새 프린터에 대한 사전 설정 추가" + +msgid "Copy preset from filament" +msgstr "필라멘트에서 사전 설정 복사" + +msgid "The filament choice not find filament preset, please reselect it" +msgstr "필라멘트 선택에서 사전 설정을 찾을 수 없습니다. 다시 선택하세요" + +msgid "Edit Preset" +msgstr "프리셋 편집" + +msgid "For more information, please check out Wiki" +msgstr "더 자세한 내용은 위키를 확인해주세요" + +msgid "Collapse" +msgstr "무너짐" + +msgid "Daily Tips" +msgstr "일일 팁" + +msgid "Need select printer" +msgstr "프린터 선택 필요" + +msgid "The start, end or step is not valid value." +msgstr "시작, 끝 또는 단계가 유효한 값이 아닙니다." + +msgid "" +"Unable to calibrate: maybe because the set calibration value range is too " +"large, or the step is too small" +msgstr "" +"교정할 수 없음: 설정된 교정 값 범위가 너무 크거나 단계가 너무 작기 때문일 수 " +"있습니다" + +msgid "Physical Printer" +msgstr "물리 프린터" + +msgid "Print Host upload" +msgstr "출력 호스트 업로드" + +msgid "Could not get a valid Printer Host reference" +msgstr "유효한 프린터 호스트 참조를 가져올 수 없습니다" + +msgid "Success!" +msgstr "성공!" + +msgid "Refresh Printers" +msgstr "프린터 새로 고침" + +msgid "" +"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" +"signed certificate." +msgstr "" +"HTTPS CA 파일은 선택 사항입니다. 자체 서명된 인증서와 함께 HTTPS를 사용하는 " +"경우에만 필요합니다." + +msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" +msgstr "인증서 파일 (*.crt, *.pem)|*.crt;*.pem|All files|*.*" + +msgid "Open CA certificate file" +msgstr "CA 인증서 파일 열기" + +#, c-format, boost-format +msgid "" +"On this system, %s uses HTTPS certificates from the system Certificate Store " +"or Keychain." +msgstr "" +"이 시스템에서 %s는 시스템 인증서 저장소나 키체인의 HTTPS 인증서를 사용합니다." + +msgid "" +"To use a custom CA file, please import your CA file into Certificate Store / " +"Keychain." +msgstr "" +"사용자 지정 CA 파일을 사용하려면 CA 파일을 인증서 저장소/키체인으로 가져오십" +"시오." + +msgid "Connection to printers connected via the print host failed." +msgstr "출력 호스트를 통해 연결된 프린터에 연결하지 못했습니다." + +#, c-format, boost-format +msgid "Mismatched type of print host: %s" +msgstr "일치하지 않는 인쇄 호스트 유형: %s" + +msgid "Connection to AstroBox works correctly." +msgstr "AstroBox 연결이 올바르게 작동합니다." + +msgid "Could not connect to AstroBox" +msgstr "AstroBox에 연결할 수 없습니다" + +msgid "Note: AstroBox version at least 1.1.0 is required." +msgstr "참고: AstroBox 버전 1.1.0 이상이 필요합니다." + +msgid "Connection to Duet works correctly." +msgstr "Duet 연결이 제대로 작동합니다." + +msgid "Could not connect to Duet" +msgstr "Duet에 연결할 수 없습니다" + +msgid "Unknown error occured" +msgstr "알 수 없는 오류가 발생했습니다" + +msgid "Wrong password" +msgstr "잘못된 비밀번호" + +msgid "Could not get resources to create a new connection" +msgstr "새 연결을 생성하기 위한 리소스를 얻을 수 없습니다" + +msgid "Upload not enabled on FlashAir card." +msgstr "FlashAir 카드에서는 업로드가 활성화되지 않았습니다." + +msgid "Connection to FlashAir works correctly and upload is enabled." +msgstr "FlashAir 연결이 올바르게 작동하고 업로드가 활성화되었습니다." + +msgid "Could not connect to FlashAir" +msgstr "FlashAir에 연결할 수 없습니다" + +msgid "" +"Note: FlashAir with firmware 2.00.02 or newer and activated upload function " +"is required." +msgstr "" +"참고: 펌웨어 2.00.02 이상이 있고 업로드 기능이 활성화된 FlashAir필수입니다." + +msgid "Connection to MKS works correctly." +msgstr "MKS에 대한 연결이 올바르게 작동합니다." + +msgid "Could not connect to MKS" +msgstr "MKS에 연결할 수 없습니다" + +msgid "Connection to OctoPrint works correctly." +msgstr "OctoPrint에 대한 연결이 올바르게 작동합니다." + +msgid "Could not connect to OctoPrint" +msgstr "OctoPrint에 연결할 수 없습니다" + +msgid "Note: OctoPrint version at least 1.1.0 is required." +msgstr "참고: OctoPrint 버전 1.1.0 이상이 필요합니다." + +msgid "Connection to Prusa SL1 / SL1S works correctly." +msgstr "Prusa SL1 / SL1S에 대한 연결이 올바르게 작동합니다." + +msgid "Could not connect to Prusa SLA" +msgstr "Prusa SLA에 연결할 수 없습니다" + +msgid "Connection to PrusaLink works correctly." +msgstr "PrusaLink에 대한 연결이 올바르게 작동합니다." + +msgid "Could not connect to PrusaLink" +msgstr "PrusaLink에 연결할 수 없습니다" + +msgid "Storages found" +msgstr "저장소를 찾았습니다." + +#. TRN %1% = storage path +#, boost-format +msgid "%1% : read only" +msgstr "%1%: 읽기 전용" + +#. TRN %1% = storage path +#, boost-format +msgid "%1% : no free space" +msgstr "%1%: 여유 공간이 없습니다" + +#. TRN %1% = host +#, boost-format +msgid "Upload has failed. There is no suitable storage found at %1%." +msgstr "업로드에 실패했습니다. %1%에 적합한 저장소가 없습니다." + +msgid "Connection to Prusa Connect works correctly." +msgstr "Prusa Connect에 대한 연결이 올바르게 작동합니다." + +msgid "Could not connect to Prusa Connect" +msgstr "Prusa Connect에 연결할 수 없습니다" + +msgid "Connection to Repetier works correctly." +msgstr "Repetier에 대한 연결이 올바르게 작동합니다." + +msgid "Could not connect to Repetier" +msgstr "Repetier에 연결할 수 없습니다" + +msgid "Note: Repetier version at least 0.90.0 is required." +msgstr "참고: 최소 0.90.0 이상의 반복 버전이 필요합니다." + +#, boost-format +msgid "" +"HTTP status: %1%\n" +"Message body: \"%2%\"" +msgstr "" +"HTTP 상태: %1%\n" +"메시지 본문: \"%2%\"" + +#, boost-format +msgid "" +"Parsing of host response failed.\n" +"Message body: \"%1%\"\n" +"Error: \"%2%\"" +msgstr "" +"호스트 응답 구문 분석에 실패했습니다.\n" +"메시지 본문: \"%1%\"\n" +"오류: \"%2%\"" + +#, boost-format +msgid "" +"Enumeration of host printers failed.\n" +"Message body: \"%1%\"\n" +"Error: \"%2%\"" +msgstr "" +"호스트 프린터 열거에 실패했습니다.\n" +"메시지 본문: \"%1%\"\n" +"오류: \"%2%\"" + +#: resources/data/hints.ini: [hint:Precise wall] +msgid "" +"Precise wall\n" +"Did you know that turning on precise wall can improve precision and layer " +"consistency?" +msgstr "" +"정밀한 벽\n" +"정확한 벽을 켜면 정밀도와 레이어 일관성이 향상될 수 있다는 사실을 알고 계셨습" +"니까?" + +#: resources/data/hints.ini: [hint:Sandwich mode] +msgid "" +"Sandwich mode\n" +"Did you know that you can use sandwich mode (inner-outer-inner) to improve " +"precision and layer consistency if your model doesn't have very steep " +"overhangs?" +msgstr "" +"샌드위치 모드\n" +"모델에 가파른 돌출부가 없는 경우 샌드위치 모드(내부-외부-내부)를 사용하여 정" +"밀도와 레이어 일관성을 향상시킬 수 있다는 것을 알고 계셨습니까?" + +#: resources/data/hints.ini: [hint:Chamber temperature] +msgid "" +"Chamber temperature\n" +"Did you know that OrcaSlicer supports chamber temperature?" +msgstr "" +"챔버 온도\n" +"OrcaSlicer가 챔버 온도를 지원한다는 사실을 알고 계셨나요?" + +#: resources/data/hints.ini: [hint:Calibration] +msgid "" +"Calibration\n" +"Did you know that calibrating your printer can do wonders? Check out our " +"beloved calibration solution in OrcaSlicer." +msgstr "" +"보정\n" +"프린터를 보정하면 놀라운 효과를 얻을 수 있다는 사실을 알고 계셨나요? 많은 사" +"랑을 받고 있는 OrcaSlicer의 보정 솔루션을 확인해 보세요." + +#: resources/data/hints.ini: [hint:Auxiliary fan] +msgid "" +"Auxiliary fan\n" +"Did you know that OrcaSlicer supports Auxiliary part cooling fan?" +msgstr "" +"보조 팬\n" +"오르카슬라이서가 보조 부품 냉각 팬을 지원한다는 사실을 알고 계셨나요?" + +#: resources/data/hints.ini: [hint:Air filtration] +msgid "" +"Air filtration/Exhuast Fan\n" +"Did you know that OrcaSlicer can support Air filtration/Exhuast Fan?" +msgstr "" +"공기 여과/배기 팬\n" +"오르카 슬라이서가 공기 여과/배기 팬을 지원할 수 있다는 사실을 알고 계셨나요?" + #: resources/data/hints.ini: [hint:How to use keyboard shortcuts] msgid "" "How to use keyboard shortcuts\n" "Did you know that Orca Slicer offers a wide range of keyboard shortcuts and " "3D scene operations." msgstr "" +"키보드 단축키를 사용하는 방법\n" +"Orca Slicer가 다양한 키보드 단축키와 3D 장면 작업을 제공한다는 사실을 알고 계" +"셨습니까?" #: resources/data/hints.ini: [hint:Cut Tool] msgid "" @@ -11892,9 +12919,9 @@ msgid "" "Did you know that you can cut a model at any angle and position with the " "cutting tool?" msgstr "" -"자르기 도구\n" -"자르기 도구로 어떤 각도와 위치에서도 모델을 자를 수 있다는 사실을 알고 있습니" -"까?" +"절단 도구\n" +"커팅 툴로 원하는 각도와 위치에서 모델을 커팅할 수 있다는 사실을 알고 계셨나" +"요?" #: resources/data/hints.ini: [hint:Fix Model] msgid "" @@ -11902,6 +12929,9 @@ msgid "" "Did you know that you can fix a corrupted 3D model to avoid a lot of slicing " "problems on the Windows system?" msgstr "" +"모델 수정\n" +"Windows 시스템에서 많은 슬라이싱 문제를 피하기 위해 손상된 3D 모델을 수정할 " +"수 있다는 것을 알고 계셨습니까?" #: resources/data/hints.ini: [hint:Timelapse] msgid "" @@ -11909,7 +12939,7 @@ msgid "" "Did you know that you can generate a timelapse video during each print?" msgstr "" "타임랩스\n" -"출력할 때마다 타임랩스 비디오를 생성할 수 있다는 사실을 알고 있습니까?" +"각 인쇄 중에 타임랩스 비디오를 생성할 수 있다는 것을 알고 계셨습니까?" #: resources/data/hints.ini: [hint:Auto-Arrange] msgid "" @@ -11917,7 +12947,7 @@ msgid "" "Did you know that you can auto-arrange all objects in your project?" msgstr "" "자동 정렬\n" -"프로젝트의 모든 개체를 자동으로 정렬할 수 있다는 사실을 알고 있습니까?" +"프로젝트의 모든 개체를 자동 정렬할 수 있다는 것을 알고 계셨습니까?" #: resources/data/hints.ini: [hint:Auto-Orient] msgid "" @@ -11925,9 +12955,9 @@ msgid "" "Did you know that you can rotate objects to an optimal orientation for " "printing by a simple click?" msgstr "" -"자동 방향\n" -"간단한 클릭으로 출력을 위한 최적의 방향으로 개체를 회전할 수 있다는 사실을 알" -"고 있습니까?" +"자동 방향 지정\n" +"간단한 클릭만으로 개체를 최적의 인쇄 방향으로 회전할 수 있다는 것을 알고 계셨" +"습니까?" #: resources/data/hints.ini: [hint:Lay on Face] msgid "" @@ -11936,10 +12966,9 @@ msgid "" "sits on the print bed? Select the \"Place on face\" function or press the " "F key." msgstr "" -"바닥면 선택\n" -"모델의 면 중 하나가 프린터 베드에 놓이도록 모델의 방향을 빠르게 지정할 수 있" -"다는 사실을 알고 있습니까? \"바닥면 선택\" 기능을 선택하거나 F 키를 누" -"르십시오." +"면에 위치\n" +"모델의 바닥 표면을 빠르게 지정하여 인쇄 베드에 놓을 수 있다는 것을 알고 계셨" +"습니까? 면에 배치 기능을 선택하십시오. 또는F 키를 누르세요." #: resources/data/hints.ini: [hint:Object List] msgid "" @@ -11957,18 +12986,19 @@ msgid "" "Did you know that you use the Search tool to quickly find a specific Orca " "Slicer setting?" msgstr "" +"검색 기능\n" +"특정 Orca Slicer 설정을 빠르게 찾기 위해 검색 도구를 사용한다는 사실을 알고 " +"계셨습니까?" #: resources/data/hints.ini: [hint:Simplify Model] msgid "" "Simplify Model\n" "Did you know that you can reduce the number of triangles in a mesh using the " -"Simplify mesh feature? Right-click the model and select Simplify model. Read " -"more in the documentation." +"Simplify mesh feature? Right-click the model and select Simplify model." msgstr "" "모델 단순화\n" -"메쉬 단순화 기능을 사용하여 메쉬의 삼각형 수를 줄일 수 있다는 사실을 알고 있" -"습니까? 모델을 마우스 오른쪽 버튼으로 클릭하고 모델 단순화를 선택합니다. 자세" -"한 내용은 설명서를 참조하십시오." +"메쉬 단순화 기능을 사용하여 메쉬의 삼각형 수를 줄일 수 있다는 것을 알고 계셨" +"습니까? 모델을 마우스 오른쪽 버튼으로 클릭하고 모델 단순화를 선택합니다." #: resources/data/hints.ini: [hint:Slicing Parameter Table] msgid "" @@ -11995,12 +13025,12 @@ msgid "" "Subtract a Part\n" "Did you know that you can subtract one mesh from another using the Negative " "part modifier? That way you can, for example, create easily resizable holes " -"directly in Orca Slicer. Read more in the documentation." +"directly in Orca Slicer." msgstr "" -"부품 비우기\n" -"비우기 부품 수정자를 사용하여 한 메쉬를 다른 메쉬에서 뺄 수 있다는 것을 알고 " -"있습니까? 예를 들어 오르카 슬라이서에서 직접 쉽게 크기를 조정할 수 있는 구멍" -"을 만들 수 있습니다. 자세한 내용은 설명서를 참조하십시오." +"부품 빼기\n" +"네거티브 부분 수정자를 사용하여 하나의 메시를 다른 메시에서 뺄 수 있다는 것" +"을 알고 계셨습니까? 예를 들어, 이렇게 하면 Orca Slicer에서 직접 쉽게 크기 조" +"정이 가능한 구멍을 만들 수 있습니다." #: resources/data/hints.ini: [hint:STEP] msgid "" @@ -12058,9 +13088,9 @@ msgid "" "Did you know that you can print a model even faster, by using the Adaptive " "Layer Height option? Check it out!" msgstr "" -"적응형 레이어 높이로 출력 속도 향상\n" -"적응형 레이어 높이 옵션을 사용하여 모델을 더 빠르게 출력할 수 있다는 사실을 " -"알고 있습니까? 확인해 보세요!" +"적응형 레이어 높이로 인쇄 속도를 높이세요\n" +"적응형 레이어를 사용하면 모델을 더욱 빠르게 프린트할 수 있다는 사실을 알고 계" +"셨습니까?레이어 높이 옵션을 확인해 보세요!" #: resources/data/hints.ini: [hint:Support painting] msgid "" @@ -12092,9 +13122,10 @@ msgid "" "successfully? Higher temperature and lower speed are always recommended for " "the best results." msgstr "" -"실크 필라멘트 출력\n" -"실크 필라멘트를 성공적으로 출력하려면 특별한 주의가 필요하다는 사실을 알고 있" -"습니까? 최상의 결과를 얻으려면 항상 더 높은 온도와 더 낮은 속도를 권장합니다." +"실크 필라멘트 인쇄\n" +"실크 필라멘트를 성공적으로 프린팅하려면 특별한 주의가 필요하다는 사실을 알고 " +"계셨나요? 최상의 결과를 얻으려면 항상 더 높은 온도와 더 낮은 속도를 권장합니" +"다." #: resources/data/hints.ini: [hint:Brim for better adhesion] msgid "" @@ -12152,6 +13183,10 @@ msgid "" "extruder/hotend clogging when printing lower temperature filament with a " "higher enclosure temperature. More info about this in the Wiki." msgstr "" +"프린터 도어를 연 상태에서 인쇄해야 하는 경우\n" +"프린터 도어를 열면 다음과 같은 위험이 줄어든다는 사실을 알고 계셨습니까?낮은 " +"온도의 필라멘트를 인쇄할 때 압출기/핫엔드 막힘인클로저 온도가 높아집니다. 이" +"에 대한 자세한 내용은 Wiki에서 확인하세요." #: resources/data/hints.ini: [hint:Avoid warping] msgid "" @@ -12160,6 +13195,152 @@ msgid "" "ABS, appropriately increasing the heatbed temperature can reduce the " "probability of warping." msgstr "" +"뒤틀림 방지\n" +"다음과 같이 휘어지기 쉬운 소재를 인쇄할 때 알고 계셨나요?ABS, 히팅베드 온도" +"를 적절히 높이면 온도를 낮출 수 있습니다.뒤틀림 확률." + +#~ msgid "" +#~ "The printer timed out while receiving a print job. Please check if the " +#~ "network is functioning properly and send the print again." +#~ msgstr "" +#~ "프린터가 인쇄 작업을 수신하는 동안 시간이 초과되었습니다.네트워크가 제대" +#~ "로 작동하는지 확인하고 인쇄를 다시 보내십시오." + +#~ msgid "The beginning of the vendor can not be a number. Please re-enter." +#~ msgstr "공급업체의 시작 부분은 숫자일 수 없습니다. 다시 입력해 주세요." + +#~ msgid "Edit Text" +#~ msgstr "텍스트 편집" + +#~ msgid "Error! Unable to create thread!" +#~ msgstr "오류! 스레드를 만들 수 없습니다!" + +#~ msgid "Exception" +#~ msgstr "예외" + +#~ msgid "Choose SLA archive:" +#~ msgstr "SLA 압축파일 선택:" + +#~ msgid "Import file" +#~ msgstr "파일 가져오기" + +#~ msgid "Import model and profile" +#~ msgstr "모델과 파일 가져오기" + +#~ msgid "Import profile only" +#~ msgstr "프로필만 가져오기" + +#~ msgid "Import model only" +#~ msgstr "모델만 가져오기" + +#~ msgid "Accurate" +#~ msgstr "정밀한" + +#~ msgid "Balanced" +#~ msgstr "균형 잡힌" + +#~ msgid "Quick" +#~ msgstr "빠른" + +#~ msgid "Auto-Calc" +#~ msgstr "자동 계산" + +#~ msgid "Re-calculate" +#~ msgstr "다시 계산" + +#~ msgid "" +#~ "Studio would re-calculate your flushing volumes everytime the filaments " +#~ "color changed. You could disable the auto-calculate in Bambu Studio > " +#~ "Preferences" +#~ msgstr "" +#~ "Studio는 필라멘트를 교체할 때마다 플러싱 볼륨을 다시 계산합니다.색상이 변" +#~ "경되었습니다. Bambu Studio > 에서 자동 계산을 비활성화할 수 있습니다.환경" +#~ "설정" + +#~ msgid "unloaded" +#~ msgstr "언로드됨" + +#~ msgid "loaded" +#~ msgstr "로드됨" + +#~ msgid "Filament #" +#~ msgstr "필라멘트 #" + +#~ msgid "Print sequence of inner wall and outer wall. " +#~ msgstr "내벽과 외벽의 순서를 인쇄합니다." + +#~ msgid "Order of wall/infill. false means print wall first. " +#~ msgstr "벽/채우기 순서. false는 벽을 먼저 인쇄한다는 의미입니다." + +#~ msgid "" +#~ "Discribe how long the nozzle will move along the last path when retracting" +#~ msgstr "퇴출 시 노즐이 마지막 경로를 따라 이동하는 거리" + +#~ msgid "" +#~ "Simplify Model\n" +#~ "Did you know that you can reduce the number of triangles in a mesh using " +#~ "the Simplify mesh feature? Right-click the model and select Simplify " +#~ "model. Read more in the documentation." +#~ msgstr "" +#~ "모델 단순화\n" +#~ "메쉬 단순화 기능을 사용하여 메쉬의 삼각형 수를 줄일 수 있다는 사실을 알고 " +#~ "있습니까? 모델을 마우스 오른쪽 버튼으로 클릭하고 모델 단순화를 선택합니" +#~ "다. 자세한 내용은 설명서를 참조하십시오." + +#~ msgid "" +#~ "Subtract a Part\n" +#~ "Did you know that you can subtract one mesh from another using the " +#~ "Negative part modifier? That way you can, for example, create easily " +#~ "resizable holes directly in Orca Slicer. Read more in the documentation." +#~ msgstr "" +#~ "부품 비우기\n" +#~ "네거티브 부분 수정자를 사용하여 하나의 메시를 다른 메시에서 뺄 수 있다는 " +#~ "것을 알고 계셨습니까? 예를 들어, 이렇게 하면 Orca Slicer에서 직접 쉽게 크" +#~ "기 조정이 가능한 구멍을 만들 수 있습니다. 설명서에서 자세한 내용을 읽어보" +#~ "세요." + +#~ msgid "Filling bed " +#~ msgstr "베드 채움 " + +#, boost-format +#~ msgid "%1% infill pattern doesn't support 100%% density." +#~ msgstr "%1% 내부 채움 패턴은 100%% 밀도를 지원하지 않습니다." + +#~ msgid "" +#~ "Switch to rectilinear pattern?\n" +#~ "Yes - switch to rectilinear pattern automaticlly\n" +#~ "No - reset density to default non 100% value automaticlly" +#~ msgstr "" +#~ "직선 패턴으로 전환하시겠습니까?\n" +#~ "예 - 자동으로 직선 패턴으로 전환합니다\n" +#~ "아니요 - 밀도를 기본값(100%가 아닌 값)으로 자동 재설정합니다" + +#~ msgid "Please heat the nozzle to above 170 degree before loading filament." +#~ msgstr "필라멘트를 로드하기 전에 노즐을 170도 이상으로 가열하십시오." + +#~ msgid "Newer 3mf version" +#~ msgstr "최신 3mf 버전" + +#~ msgid "Show g-code window" +#~ msgstr "G코드 창 표시" + +#~ msgid "If enabled, g-code window will be displayed." +#~ msgstr "활성화된 경우 G코드 창이 표시됩니다." + +#, c-format +#~ msgid "Density of internal sparse infill, 100% means solid throughout" +#~ msgstr "" +#~ "내부 드문 내부 채움 밀도, 100은 전체가 꽉찬 내부 채움임을 의미합니다" + +#~ msgid "Tree support wall loops" +#~ msgstr "나무 지지대 벽 루프" + +#~ msgid "This setting specify the count of walls around tree support" +#~ msgstr "이 설정은 나무 지지대의 벽 수를 지정합니다" + +#, c-format, boost-format +#~ msgid " doesn't work at 100%% density " +#~ msgstr " 100%% 밀도에서 작동하지 않음 " #~ msgid "Ctrl + Shift + Enter" #~ msgstr "Ctrl + Shift + Enter" @@ -12182,9 +13363,6 @@ msgstr "" #~ msgid "Export all objects as STL" #~ msgstr "모든 개체를 STL로 내보내기" -#~ msgid "Slice ok." -#~ msgstr "슬라이스 완료." - #, c-format, boost-format #~ msgid "" #~ "The 3mf's version %s is newer than %s's version %s, Found following keys " @@ -12213,15 +13391,6 @@ msgstr "" #~ msgid "Add/Remove printers" #~ msgstr "프린터 추가/제거" -#~ msgid "Bambu Engineering Plate" -#~ msgstr "밤부 엔지니어링 플레이트" - -#~ msgid "Bambu Smooth PEI Plate" -#~ msgstr "밤부 스무스 PEI 플레이트" - -#~ msgid "Bambu Textured PEI Plate" -#~ msgstr "밤부 텍스처 PEI 플레이트" - #~ msgid "" #~ "When print by object, machines with I3 structure will not generate " #~ "timelapse videos." @@ -12427,65 +13596,6 @@ msgstr "" #~ msgid "The selected preset: %1% is not found." #~ msgstr "선택한 사전 설정: %1%을(를) 찾을 수 없습니다." -#~ msgid "Physical Printer" -#~ msgstr "물리 프린터" - -#~ msgid "Print Host upload" -#~ msgstr "출력 호스트 업로드" - -#~ msgid "Could not get a valid Printer Host reference" -#~ msgstr "유효한 프린터 호스트 참조를 가져올 수 없습니다" - -#~ msgid "Success!" -#~ msgstr "성공!" - -#~ msgid "Refresh Printers" -#~ msgstr "프린터 새로 고침" - -#~ msgid "" -#~ "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" -#~ "signed certificate." -#~ msgstr "" -#~ "HTTPS CA 파일은 선택 사항입니다. 자체 서명된 인증서와 함께 HTTPS를 사용하" -#~ "는 경우에만 필요합니다." - -#~ msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" -#~ msgstr "인증서 파일 (*.crt, *.pem)|*.crt;*.pem|All files|*.*" - -#~ msgid "Open CA certificate file" -#~ msgstr "CA 인증서 파일 열기" - -#, c-format, boost-format -#~ msgid "" -#~ "On this system, %s uses HTTPS certificates from the system Certificate " -#~ "Store or Keychain." -#~ msgstr "" -#~ "이 시스템에서 %s는 시스템 인증서 저장소나 키체인의 HTTPS 인증서를 사용합니" -#~ "다." - -#~ msgid "" -#~ "To use a custom CA file, please import your CA file into Certificate " -#~ "Store / Keychain." -#~ msgstr "" -#~ "사용자 지정 CA 파일을 사용하려면 CA 파일을 인증서 저장소/키체인으로 가져오" -#~ "십시오." - -#~ msgid "Connection to printers connected via the print host failed." -#~ msgstr "출력 호스트를 통해 연결된 프린터에 연결하지 못했습니다." - -#~ msgid "The start, end or step is not valid value." -#~ msgstr "시작, 끝 또는 단계가 유효한 값이 아닙니다." - -#~ msgid "" -#~ "Unable to calibrate: maybe because the set calibration value range is too " -#~ "large, or the step is too small" -#~ msgstr "" -#~ "교정할 수 없음: 설정된 교정 값 범위가 너무 크거나 단계가 너무 작기 때문일 " -#~ "수 있습니다" - -#~ msgid "Need select printer" -#~ msgstr "프린터 선택 필요" - #~ msgid "" #~ "3D Scene Operations\n" #~ "Did you know how to control view and object/part selection with mouse and " @@ -12644,8 +13754,8 @@ msgstr "" #~ msgid "Score" #~ msgstr "점수" -#~ msgid "Bamabu High Temperature Plate" -#~ msgstr "Bamabu High Temperature Plate" +#~ msgid "Bambu High Temperature Plate" +#~ msgstr "뱀부 고온 플레이트" #~ msgid "Can't connect to the printer" #~ msgstr "프린터에 연결할 수 없습니다" diff --git a/localization/i18n/list.txt b/localization/i18n/list.txt index 0a5ea2dc02..b8fde002ae 100644 --- a/localization/i18n/list.txt +++ b/localization/i18n/list.txt @@ -35,8 +35,6 @@ src/slic3r/GUI/ImGuiWrapper.cpp src/slic3r/GUI/Jobs/ArrangeJob.cpp src/slic3r/GUI/Jobs/OrientJob.cpp src/slic3r/GUI/Jobs/FillBedJob.cpp -src/slic3r/GUI/Jobs/Job.cpp -src/slic3r/GUI/Jobs/PlaterJob.cpp src/slic3r/GUI/Jobs/RotoptimizeJob.cpp src/slic3r/GUI/Jobs/BindJob.cpp src/slic3r/GUI/Jobs/PrintJob.cpp diff --git a/localization/i18n/nl/OrcaSlicer_nl.po b/localization/i18n/nl/OrcaSlicer_nl.po index 10a9862387..d81f0da686 100644 --- a/localization/i18n/nl/OrcaSlicer_nl.po +++ b/localization/i18n/nl/OrcaSlicer_nl.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-24 18:09+0100\n" +"POT-Creation-Date: 2023-12-19 22:09+0800\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -291,6 +291,12 @@ msgstr "Selecteer alle verbindingen" msgid "Cut" msgstr "Knippen" +msgid "non-mainifold edges be caused by cut tool, do you want to fix it now?" +msgstr "" + +msgid "Repairing model object" +msgstr "Model object repareren" + msgid "Connector" msgstr "Verbinding" @@ -854,6 +860,24 @@ msgstr "Ondersteuningsblokkade toevoegen" msgid "Add support enforcer" msgstr "Ondersteuning toevoegen" +msgid "Add text" +msgstr "" + +msgid "Add negative text" +msgstr "" + +msgid "Add text modifier" +msgstr "" + +msgid "Add SVG part" +msgstr "" + +msgid "Add negative SVG" +msgstr "" + +msgid "Add SVG modifier" +msgstr "" + msgid "Select settings" msgstr "Selecteer instellingen" @@ -869,9 +893,6 @@ msgstr "Del" msgid "Delete the selected object" msgstr "Verwijder het geselecteerde object" -msgid "Edit Text" -msgstr "Pas tekst aan" - msgid "Load..." msgstr "Laden..." @@ -896,6 +917,12 @@ msgstr "Cilinder" msgid "Cone" msgstr "Kegel" +msgid "Text" +msgstr "" + +msgid "SVG" +msgstr "" + msgid "Height range Modifier" msgstr "Hoogtebereikaanpasser" @@ -1031,6 +1058,18 @@ msgstr "Spiegelen" msgid "Mirror object" msgstr "Spiegel object" +msgid "Edit text" +msgstr "" + +msgid "Ability to change text, font, size, ..." +msgstr "" + +msgid "Edit SVG" +msgstr "" + +msgid "Change SVG source file, projection, size, ..." +msgstr "" + msgid "Invalidate cut info" msgstr "Invalideer knipsnede-info" @@ -1191,9 +1230,6 @@ msgstr "Klik op het pictogram om de kleur van het object te bewerken" msgid "Click the icon to shift this object to the bed" msgstr "Klik op het pictogram om dit object te verschuiven op het printbed" -msgid " search results" -msgstr "" - msgid "Loading file" msgstr "Bestand laden" @@ -1347,9 +1383,6 @@ msgstr "Voer nieuwe naam in" msgid "Renaming" msgstr "Hernoemen" -msgid "Repairing model object" -msgstr "Model object repareren" - msgid "Following model object has been repaired" msgid_plural "Following model objects have been repaired" msgstr[0] "" @@ -1683,12 +1716,6 @@ msgstr "" msgid "Arranging..." msgstr "Rangschikken..." -msgid "" -"Arrange failed. Found some exceptions when processing object geometries." -msgstr "" -"Het rangschikken is mislukt. Er zijn enkele uitzonderingen gevonden tijdens " -"het verwerken van het object." - msgid "Arranging" msgstr "Rangschikken..." @@ -1704,6 +1731,12 @@ msgstr "" msgid "Arranging done." msgstr "Rangschikken voltooid." +msgid "" +"Arrange failed. Found some exceptions when processing object geometries." +msgstr "" +"Het rangschikken is mislukt. Er zijn enkele uitzonderingen gevonden tijdens " +"het verwerken van het object." + #, c-format, boost-format msgid "" "Arrangement ignored the following objects which can't fit into a single " @@ -1734,8 +1767,11 @@ msgstr "Oriënteren " msgid "Orienting" msgstr "Oriënteren " -msgid "Filling bed " -msgstr "Filling bed" +msgid "Orienting canceled." +msgstr "" + +msgid "Filling" +msgstr "" msgid "Bed filling canceled." msgstr "Bed filling canceled." @@ -1743,11 +1779,14 @@ msgstr "Bed filling canceled." msgid "Bed filling done." msgstr "Bed filling done." -msgid "Error! Unable to create thread!" -msgstr "Fout! Kan geen thread maken!" +msgid "Searching for optimal orientation" +msgstr "" -msgid "Exception" -msgstr "Uitzondering" +msgid "Orientation search canceled." +msgstr "" + +msgid "Orientation found." +msgstr "" msgid "Logging in" msgstr "Bezig met inloggen" @@ -1818,11 +1857,6 @@ msgstr "Printopdracht verzenden via cloud service" msgid "Print task sending times out." msgstr "" -msgid "" -"The printer timed out while receiving a print job. Please check if the " -"network is functioning properly and send the print again." -msgstr "" - msgid "Service Unavailable" msgstr "Service niet beschikbaar" @@ -1860,30 +1894,6 @@ msgstr "" "Een MicroSD-kaart moet worden geplaatst voordat er iets naar de printer " "wordt gestuurd." -msgid "Choose SLA archive:" -msgstr "Choose SLA archive:" - -msgid "Import file" -msgstr "Import file" - -msgid "Import model and profile" -msgstr "Import model and profile" - -msgid "Import profile only" -msgstr "Import profile only" - -msgid "Import model only" -msgstr "Import model only" - -msgid "Accurate" -msgstr "Accurate" - -msgid "Balanced" -msgstr "Balanced" - -msgid "Quick" -msgstr "Quick" - msgid "Importing SLA archive" msgstr "Importing SLA archive" @@ -2630,19 +2640,6 @@ msgstr "" "JA - laat de prime-tower aan staan\n" "NO - laat onafhankelijke support-laag-hoogte ingeschakeld" -#, boost-format -msgid "%1% infill pattern doesn't support 100%% density." -msgstr "%1% het gekozen vulling patroon ondersteund geen 100%% dichtheid." - -msgid "" -"Switch to rectilinear pattern?\n" -"Yes - switch to rectilinear pattern automaticlly\n" -"No - reset density to default non 100% value automaticlly" -msgstr "" -"Overschakelen naar rechtlijnig patroon?\n" -"Ja - Automatisch overschakelen naar rechtlijnig patroon\n" -"Nee - Zet de dichtheid automatisch terug naar de standaard niet 100% waarde" - msgid "" "While printing by Object, the extruder may collide skirt.\n" "Thus, reset the skirt layer to 1 to avoid that." @@ -2743,6 +2740,18 @@ msgstr "" msgid "Motor noise showoff" msgstr "" +msgid "Nozzle filament covered detected pause" +msgstr "" + +msgid "Cutter error pause" +msgstr "" + +msgid "First layer error pause" +msgstr "" + +msgid "Nozzle clog pause" +msgstr "" + msgid "MC" msgstr "MC" @@ -3205,7 +3214,7 @@ msgstr "Volume:" msgid "Size:" msgstr "Maat:" -#, boost-format +#, c-format, boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -3582,6 +3591,18 @@ msgstr "Perspectiefweergave gebruiken" msgid "Use Orthogonal View" msgstr "Orthogonale weergave gebruiken" +msgid "Show &G-code Window" +msgstr "" + +msgid "Show g-code window in Previce scene" +msgstr "" + +msgid "Reset Window Layout" +msgstr "" + +msgid "Reset to default window layout" +msgstr "" + msgid "Show &Labels" msgstr "Toon &Labels" @@ -3953,6 +3974,9 @@ msgstr "%d%% downloaden..." msgid "Connection lost. Please retry." msgstr "" +msgid "The device cannot handle more conversations. Please retry later." +msgstr "" + msgid "File not exists." msgstr "" @@ -4108,9 +4132,10 @@ msgstr "Layer: %s" msgid "Layer: %d/%d" msgstr "Layer: %d/%d" -msgid "Please heat the nozzle to above 170 degree before loading filament." +msgid "" +"Please heat the nozzle to above 170 degree before loading or unloading " +"filament." msgstr "" -"Verwarm de nozzle tot meer dan 170 graden voordat je het filament laadt." msgid "Still unload" msgstr "Nog steeds aan het ontladen" @@ -4468,7 +4493,7 @@ msgstr "Automatisch herstel na stapverlies" msgid "Allow Prompt Sound" msgstr "" -msgid "Fliament Tangle Detect" +msgid "Filament Tangle Detect" msgstr "" msgid "Global" @@ -4651,6 +4676,12 @@ msgid "" "It is recommended to change to smooth mode." msgstr "" +msgid "Expand sidebar" +msgstr "" + +msgid "Collapse sidebar" +msgstr "" + #, c-format, boost-format msgid "Loading file: %s" msgstr "Bestand laden: %s" @@ -4668,31 +4699,6 @@ msgstr "De configuratie kan niet worden geladen." msgid "The 3mf is generated by old Orca Slicer, load geometry data only." msgstr "" -#, c-format, boost-format -msgid "This slicer file version %s is newer than %s's version:" -msgstr "" - -msgid "" -"Would you like to update your Bambu Studio software to enable all " -"functionality in this slicer file?\n" -msgstr "" - -msgid "Newer 3mf version" -msgstr "Nieuwere versie 3mf" - -msgid "" -"you can always update Bambu Studio at your convenience. The slicer file will " -"now be loaded without full functionality." -msgstr "" - -#, c-format, boost-format -msgid "" -"This slicer file version %s is newer than %s's version.\n" -"\n" -"Would you like to update your Bambu Studio software to enable all " -"functionality in this slicer file?" -msgstr "" - msgid "Invalid values found in the 3mf:" msgstr "Invalid values found in the 3mf:" @@ -4934,6 +4940,9 @@ msgid "" "import it." msgstr "" +msgid "Import SLA archive" +msgstr "" + msgid "The selected file" msgstr "Het geselecteerde bestand" @@ -5017,6 +5026,15 @@ msgstr "" "Unable to perform boolean operation on model meshes. Only positive parts " "will be exported." +msgid "" +"Are you sure you want to store original SVGs with their local paths into the " +"3MF file?\n" +"If you hit 'NO', all SVGs in the project will not be editable any more." +msgstr "" + +msgid "Private protection" +msgstr "" + msgid "Is the printer ready? Is the print sheet in place, empty and clean?" msgstr "" @@ -5041,6 +5059,9 @@ msgid "Custom supports and color painting were removed before repairing." msgstr "" "Handmatig aangebrachte support en kleuren zijn verwijderd voor het repareren." +msgid "Optimize Rotation" +msgstr "" + msgid "Invalid number" msgstr "Ongeldig nummer" @@ -5205,12 +5226,6 @@ msgid "If enabled, useful hints are displayed at startup." msgstr "" "Indien ingeschakeld, worden bij het opstarten nuttige tips weergegeven." -msgid "Show g-code window" -msgstr "" - -msgid "If enabled, g-code window will be displayed." -msgstr "" - msgid "Flushing volumes: Auto-calculate everytime the color changed." msgstr "" @@ -5514,7 +5529,7 @@ msgstr "Bewaar %s als" msgid "User Preset" msgstr "Gebruikersvoorinstelling" -msgid "Project Inside Preset" +msgid "Preset Inside Project" msgstr "Voorinstelling Project Inside" msgid "Name is invalid;" @@ -5593,6 +5608,9 @@ msgstr "Taak geannuleerd" msgid "(LAN)" msgstr "(LAN)" +msgid "Search" +msgstr "" + msgid "My Device" msgstr "Mijn apparaat" @@ -5623,16 +5641,16 @@ msgstr "Bambu Cool (koude) Plate" msgid "PLA Plate" msgstr "PLA Plate" -msgid "Bamabu Engineering Plate" +msgid "Bambu Engineering Plate" msgstr "Bambu Engineering (technische) plate" -msgid "Bamabu Smooth PEI Plate" +msgid "Bambu Smooth PEI Plate" msgstr "" msgid "High temperature Plate" msgstr "" -msgid "Bamabu Textured PEI Plate" +msgid "Bambu Textured PEI Plate" msgstr "" msgid "Send print job to" @@ -5863,6 +5881,12 @@ msgstr "" "De printer biedt geen ondersteuning voor het verzenden naar de microSD-kaart " "van de printer." +msgid "Slice ok." +msgstr "Slice gelukt" + +msgid "View all Daily tips" +msgstr "" + msgid "Failed to create socket" msgstr "Failed to create socket" @@ -6053,11 +6077,25 @@ msgstr "" "0 top z distance, 0 interface spacing, concentric pattern and disable " "independent support layer height" +msgid "" +"Layer height exceeds the limit in Printer Settings -> Extruder -> Layer " +"height limits ,this may cause printing quality issues." +msgstr "" + +msgid "Adjust to the set range automatically? \n" +msgstr "" + +msgid "Adjust" +msgstr "" + +msgid "Ignore" +msgstr "" + msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" "Bij het opnemen van timelapse zonder toolhead is het aan te raden om een " "„Timelapse Wipe Tower” toe te voegen \n" @@ -6076,6 +6114,15 @@ msgstr "Precisie" msgid "Wall generator" msgstr "Wandgenerator" +msgid "Walls and surfaces" +msgstr "" + +msgid "Bridging" +msgstr "" + +msgid "Overhangs" +msgstr "" + msgid "Walls" msgstr "Wanden" @@ -6421,6 +6468,12 @@ msgid_plural "Following presets will be deleted too." msgstr[0] "De volgende voorinstelling zal ook verwijderd worden@" msgstr[1] "De volgende voorinstelling zal ook verwijderd worden@" +msgid "" +"Are you sure to delete the selected preset? \n" +"If the preset corresponds to a filament currently in use on your printer, " +"please reset the filament information for that slot." +msgstr "" + #, boost-format msgid "Are you sure to %1% the selected preset?" msgstr "Weet u zeker dat u de geselecteerde preset wilt %1%?" @@ -6449,7 +6502,7 @@ msgstr "Niet gedefinieerd" msgid "Unsaved Changes" msgstr "niet-opgeslagen wijzigingen" -msgid "Discard or Keep changes" +msgid "Transfer or discard changes" msgstr "Verwerp of bewaar aanpassingen" msgid "Old Value" @@ -6670,19 +6723,15 @@ msgstr "" msgid "Ramming line spacing" msgstr "" -msgid "Auto-Calc" -msgstr "Automatisch berekenen" - -msgid "Re-calculate" +msgid "Recalculate" msgstr "" msgid "Flushing volumes for filament change" msgstr "Volumes reinigen voor filament wijziging" msgid "" -"Studio would re-calculate your flushing volumes everytime the filaments " -"color changed. You could disable the auto-calculate in Bambu Studio > " -"Preferences" +"Orca recalculates your flushing volumes everytime the filament colors " +"change. You can change this behavior in Preferences." msgstr "" msgid "Flushing volume (mm³) for each filament pair." @@ -6700,15 +6749,6 @@ msgstr "" msgid "Multiplier" msgstr "Vermenigvuldiger" -msgid "unloaded" -msgstr "uitgeladen" - -msgid "loaded" -msgstr "Geladen" - -msgid "Filament #" -msgstr "Filament #" - msgid "From" msgstr "Van" @@ -7083,6 +7123,9 @@ msgstr "Printen" msgid "Idle" msgstr "Inactief" +msgid "Beta version" +msgstr "" + msgid "Latest version" msgstr "Nieuwste versie" @@ -7458,6 +7501,25 @@ msgstr "" msgid "Variable layer height is not supported with Organic supports." msgstr "" +msgid "" +"Different nozzle diameters and different filament diameters is not allowed " +"when prime tower is enabled." +msgstr "" + +msgid "" +"The Wipe Tower is currently only supported with the relative extruder " +"addressing (use_relative_e_distances=1)." +msgstr "" + +msgid "" +"Ooze prevention is currently not supported with the prime tower enabled." +msgstr "" + +msgid "" +"The prime tower is currently only supported for the Marlin, RepRap/Sprinter, " +"RepRapFirmware and Repetier G-code flavors." +msgstr "" + msgid "The prime tower is not supported in \"By object\" print." msgstr "Een prime-toren wordt niet ondersteund bij het \"per object\" printen." @@ -7533,11 +7595,6 @@ msgstr "" msgid "Layer height cannot exceed nozzle diameter" msgstr "De laaghoogte kan niet groter zijn dan de diameter van de nozzle" -msgid "" -"Layer height cannot exceed the limit in Printer Settings -> Extruder -> " -"Layer height limits" -msgstr "" - msgid "" "Relative extruder addressing requires resetting the extruder position at " "each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to " @@ -7630,6 +7687,12 @@ msgstr "" "Dit is de maximale printbare hoogte gelimiteerd door de constructie van de " "printer" +msgid "Preferred orientation" +msgstr "" + +msgid "Automatically orient stls on the Z-axis upon initial import" +msgstr "" + msgid "Printer preset names" msgstr "Namen van printer voorinstellingen" @@ -7908,7 +7971,7 @@ msgstr "" msgid "Density of external bridges. 100% means solid bridge. Default is 100%." msgstr "" -msgid "Bridge flow" +msgid "Bridge flow ratio" msgstr "Brugflow" msgid "" @@ -7918,6 +7981,15 @@ msgstr "" "Verlaag deze waarde iets (bijvoorbeeld 0,9) om de hoeveelheid materiaal voor " "bruggen te verminderen, dit om doorzakken te voorkomen." +msgid "Internal bridge flow ratio" +msgstr "" + +msgid "" +"This value governs the thickness of the internal bridge layer. This is the " +"first layer over sparse infill. Decrease this value slightly (for example " +"0.9) to improve surface quality over sparse infill." +msgstr "" + msgid "Top surface flow ratio" msgstr "" @@ -8237,6 +8309,15 @@ msgstr "" "uitgeschakeld, zien bruggen er beter uit, maar zijn ze alleen betrouwbaar " "voor kortere afstanden." +msgid "Thick internal bridges" +msgstr "" + +msgid "" +"If enabled, thick internal bridges will be used. It's usually recommended to " +"have this feature turned on. However, consider turning it off if you are " +"using large nozzles." +msgstr "" + msgid "Max bridge length" msgstr "Maximale bruglengte" @@ -8320,7 +8401,7 @@ msgid "Internal solid infill pattern" msgstr "" msgid "" -"Line pattern of internal solid infill. if the detect nattow internal solid " +"Line pattern of internal solid infill. if the detect narrow internal solid " "infill be enabled, the concentric pattern will be used for the small area." msgstr "" @@ -8353,25 +8434,55 @@ msgid "" "This sets the threshold for small perimeter length. Default threshold is 0mm" msgstr "" -msgid "Order of walls" +msgid "Walls printing order" msgstr "" -msgid "Print sequence of inner wall and outer wall. " +msgid "" +"Print sequence of the internal (inner) and external (outer) walls. \n" +"\n" +"Use Inner/Outer for best overhangs. This is because the overhanging walls " +"can adhere to a neighouring perimeter while printing. However, this option " +"results in slightly reduced surface quality as the external perimeter is " +"deformed by being squashed to the internal perimeter.\n" +"\n" +"Use Inner/Outer/Inner for the best external surface finish and dimensional " +"accuracy as the external wall is printed undisturbed from an internal " +"perimeter. However, overhang performance will reduce as there is no internal " +"perimeter to print the external wall against. This option requires a minimum " +"of 3 walls to be effective as it prints the internal walls from the 3rd " +"perimeter onwards first, then the external perimeter and, finally, the first " +"internal perimeter. This option is recomended against the Outer/Inner option " +"in most cases. \n" +"\n" +"Use Outer/Inner for the same external wall quality and dimensional accuracy " +"benefits of Inner/Outer/Inner option. However, the z seams will appear less " +"consistent as the first extrusion of a new layer starts on a visible " +"surface.\n" +"\n" +" " msgstr "" -msgid "inner/outer" +msgid "Inner/Outer" msgstr "" -msgid "outer/inner" +msgid "Outer/Inner" msgstr "" -msgid "inner wall/outer wall/inner wall" +msgid "Inner/Outer/Inner" msgstr "" msgid "Print infill first" msgstr "" -msgid "Order of wall/infill. false means print wall first. " +msgid "" +"Order of wall/infill. When the tickbox is unchecked the walls are printed " +"first, which works best in most cases.\n" +"\n" +"Printing walls first may help with extreme overhangs as the walls have the " +"neighbouring infill to adhere to. However, the infill will slighly push out " +"the printed walls where it is attached to them, resulting in a worse " +"external surface finish. It can also cause the infill to shine through the " +"external surfaces of the part." msgstr "" msgid "Height to rod" @@ -8716,11 +8827,11 @@ msgstr "" msgid "Sparse infill density" msgstr "Vulling percentage" -#, c-format -msgid "Density of internal sparse infill, 100% means solid throughout" +#, c-format, boost-format +msgid "" +"Density of internal sparse infill, 100% turns all sparse infill into solid " +"infill and internal solid infill pattern will be used" msgstr "" -"Dit is de dichtheid van de interne vulling. 100%% betekent dat het object " -"geheel solide zal zijn." msgid "Sparse infill pattern" msgstr "Vulpatroon" @@ -8928,10 +9039,10 @@ msgstr "Volledige snelheid op laag" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " -"than \"close_fan_the_first_x_layers\", in which case the fan will be running " -"at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower than " +"\"close_fan_the_first_x_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." msgstr "" msgid "Support interface fan speed" @@ -8984,6 +9095,12 @@ msgstr "" "De gemiddelde afstand tussen de willekeurige punten die op ieder lijnsegment " "zijn geïntroduceerd" +msgid "Apply fuzzy skin to first layer" +msgstr "" + +msgid "Whether to apply fuzzy skin on the first layer" +msgstr "" + msgid "Filter out tiny gaps" msgstr "" @@ -9622,13 +9739,13 @@ msgid "User can self-define the project file name when export" msgstr "" "Gebruikers kunnen zelf de project bestandsnaam kiezen tijdens het exporteren" -msgid "Make overhang printable" +msgid "Make overhangs printable" msgstr "" msgid "Modify the geometry to print overhangs without support material." msgstr "" -msgid "Make overhang printable maximum angle" +msgid "Make overhangs printable - Maximum angle" msgstr "" msgid "" @@ -9637,7 +9754,7 @@ msgid "" "0 will replace all overhangs with conical material." msgstr "" -msgid "Make overhang printable hole area" +msgid "Make overhangs printable - Hole area" msgstr "" msgid "" @@ -9889,6 +10006,9 @@ msgstr "" msgid "Show auto-calibration marks" msgstr "" +msgid "Disable set remaining print time" +msgstr "" + msgid "Seam position" msgstr "Naad positie" @@ -10018,6 +10138,22 @@ msgstr "" "worden afgevlakt en een solide model wordt omgezet in een enkelwandige print " "met solide onderlagen. Het uiteindelijke gegenereerde model heeft geen naad." +msgid "Smooth Spiral" +msgstr "" + +msgid "" +"Smooth Spiral smoothes out X and Y moves as wellresulting in no visible seam " +"at all, even in the XY directions on walls that are not vertical" +msgstr "" + +msgid "Max XY Smoothing" +msgstr "" + +msgid "" +"Maximum distance to move points in XY to try to achieve a smooth spiralIf " +"expressed as a %, it will be computed over nozzle diameter" +msgstr "" + msgid "" "If smooth or traditional mode is selected, a timelapse video will be " "generated for each print. After each layer is printed, a snapshot is taken " @@ -10226,10 +10362,11 @@ msgstr "" "betekent geen specifiek filament voor ondersteuning (support) en het " "huidige filament wordt gebruikt." -msgid "No interface filament for body" +msgid "Avoid interface filament for base" msgstr "" -msgid "Don't use support interface filament to print support body" +msgid "" +"Avoid using support interface filament to print support base if possible." msgstr "" msgid "" @@ -10481,11 +10618,11 @@ msgid "" "double walls." msgstr "" -msgid "Tree support wall loops" -msgstr "Tree support wand lussen" +msgid "Support wall loops" +msgstr "" -msgid "This setting specify the count of walls around tree support" -msgstr "Deze instelling specificeert het aantal wanden rond de tree support." +msgid "This setting specify the count of walls around support" +msgstr "" msgid "Tree support with infill" msgstr "Tree support met vulling" @@ -10602,10 +10739,16 @@ msgid "Wipe Distance" msgstr "Veeg afstand" msgid "" -"Discribe how long the nozzle will move along the last path when retracting" +"Discribe how long the nozzle will move along the last path when " +"retracting. \n" +"\n" +"Depending on how long the wipe operation lasts, how fast and long the " +"extruder/filament retraction settings are, a retraction move may be needed " +"to retract the remaining filament. \n" +"\n" +"Setting a value in the retract amount before wipe setting below will perform " +"any excess retraction before the wipe, else it will be performed after." msgstr "" -"Dit beschrijft hoe lang de nozzle langs het laatste pad zal bewegen tijdens " -"het terugtrekken (rectracting)." msgid "" "The wiping tower can be used to clean up the residue on the nozzle and " @@ -10928,10 +11071,6 @@ msgstr "" msgid "invalid value " msgstr "invalid value " -#, c-format, boost-format -msgid " doesn't work at 100%% density " -msgstr " doesn't work at 100%% density " - msgid "Invalid value when spiral vase mode is enabled: " msgstr "Invalid value when spiral vase mode is enabled: " @@ -11783,6 +11922,720 @@ msgstr "" msgid "Delete input" msgstr "" +msgid "Network Test" +msgstr "" + +msgid "Start Test Multi-Thread" +msgstr "" + +msgid "Start Test Single-Thread" +msgstr "" + +msgid "Export Log" +msgstr "" + +msgid "Studio Version:" +msgstr "" + +msgid "System Version:" +msgstr "" + +msgid "DNS Server:" +msgstr "" + +msgid "Test BambuLab" +msgstr "" + +msgid "Test BambuLab:" +msgstr "" + +msgid "Test Bing.com" +msgstr "" + +msgid "Test bing.com:" +msgstr "" + +msgid "Test HTTP" +msgstr "" + +msgid "Test HTTP Service:" +msgstr "" + +msgid "Test storage" +msgstr "" + +msgid "Test Storage Upload:" +msgstr "" + +msgid "Test storage upgrade" +msgstr "" + +msgid "Test Storage Upgrade:" +msgstr "" + +msgid "Test storage download" +msgstr "" + +msgid "Test Storage Download:" +msgstr "" + +msgid "Test plugin download" +msgstr "" + +msgid "Test Plugin Download:" +msgstr "" + +msgid "Test Storage Upload" +msgstr "" + +msgid "Log Info" +msgstr "" + +msgid "Select filament preset" +msgstr "" + +msgid "Create Filament" +msgstr "" + +msgid "Create Based on Current Filament" +msgstr "" + +msgid "Copy Current Filament Preset " +msgstr "" + +msgid "Basic Information" +msgstr "" + +msgid "Add Filament Preset under this filament" +msgstr "" + +msgid "We could create the filament presets for your following printer:" +msgstr "" + +msgid "Select Vendor" +msgstr "" + +msgid "Input Custom Vendor" +msgstr "" + +msgid "Can't find vendor I want" +msgstr "" + +msgid "Select Type" +msgstr "" + +msgid "Select Filament Preset" +msgstr "" + +msgid "Serial" +msgstr "" + +msgid "e.g. Basic, Matte, Silk, Marble" +msgstr "" + +msgid "Filament Preset" +msgstr "" + +msgid "Create" +msgstr "" + +msgid "Vendor is not selected, please reselect vendor." +msgstr "" + +msgid "Custom vendor is not input, please input custom vendor." +msgstr "" + +msgid "" +"\"Bambu\" or \"Generic\" can not be used as a Vendor for custom filaments." +msgstr "" + +msgid "Filament type is not selected, please reselect type." +msgstr "" + +msgid "Filament serial is not inputed, please input serial." +msgstr "" + +msgid "" +"There may be escape characters in the vendor or serial input of filament. " +"Please delete and re-enter." +msgstr "" + +msgid "All inputs in the custom vendor or serial are spaces. Please re-enter." +msgstr "" + +msgid "The vendor can not be a number. Please re-enter." +msgstr "" + +msgid "" +"You have not selected a printer or preset yet. Please select at least one." +msgstr "" + +msgid "Some existing presets have failed to be created, as follows:\n" +msgstr "" + +msgid "" +"\n" +"Do you want to rewrite it?" +msgstr "" + +msgid "" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" +"To add preset for more prinetrs, Please go to printer selection" +msgstr "" + +msgid "Create Printer/Nozzle" +msgstr "" + +msgid "Create Printer" +msgstr "" + +msgid "Create Nozzle for Existing Printer" +msgstr "" + +msgid "Create from Template" +msgstr "" + +msgid "Create Based on Current Printer" +msgstr "" + +msgid "wiki" +msgstr "" + +msgid "Import Preset" +msgstr "" + +msgid "Create Type" +msgstr "" + +msgid "The model is not fond, place reselect vendor." +msgstr "" + +msgid "Select Model" +msgstr "" + +msgid "Select Printer" +msgstr "" + +msgid "Input Custom Model" +msgstr "" + +msgid "Can't find my printer model" +msgstr "" + +msgid "Rectangle" +msgstr "" + +msgid "Printable Space" +msgstr "" + +msgid "X" +msgstr "" + +msgid "Y" +msgstr "" + +msgid "Hot Bed STL" +msgstr "" + +msgid "Load stl" +msgstr "" + +msgid "Hot Bed SVG" +msgstr "" + +msgid "Load svg" +msgstr "" + +msgid "Max Print Height" +msgstr "" + +#, c-format, boost-format +msgid "The file exceeds %d MB, please import again." +msgstr "" + +msgid "Exception in obtaining file size, please import again." +msgstr "" + +msgid "Preset path is not find, please reselect vendor." +msgstr "" + +msgid "The printer model was not found, please reselect." +msgstr "" + +msgid "The nozzle diameter is not fond, place reselect." +msgstr "" + +msgid "The printer preset is not fond, place reselect." +msgstr "" + +msgid "Printer Preset" +msgstr "" + +msgid "Filament Preset Template" +msgstr "" + +msgid "Deselect All" +msgstr "" + +msgid "Process Preset Template" +msgstr "" + +msgid "Back Page 1" +msgstr "" + +msgid "" +"You have not yet chosen which printer preset to create based on. Please " +"choose the vendor and model of the printer" +msgstr "" + +msgid "" +"You have entered an illegal input in the printable area section on the first " +"page. Please check before creating it." +msgstr "" + +msgid "The custom printer or model is not inputed, place input." +msgstr "" + +msgid "" +"The printer preset you created already has a preset with the same name. Do " +"you want to overwrite it?\n" +"\tYes: Overwrite the printer preset with the same name, and filament and " +"process presets with the same preset name will be recreated \n" +"and filament and process presets without the same preset name will be " +"reserve.\n" +"\tCancel: Do not create a preset, return to the creation interface." +msgstr "" + +msgid "You need to select at least one filament preset." +msgstr "" + +msgid "You need to select at least one process preset." +msgstr "" + +msgid "Create filament presets failed. As follows:\n" +msgstr "" + +msgid "Create process presets failed. As follows:\n" +msgstr "" + +msgid "Vendor is not find, please reselect." +msgstr "" + +msgid "Current vendor has no models, please reselect." +msgstr "" + +msgid "" +"You have not selected the vendor and model or inputed the custom vendor and " +"model." +msgstr "" + +msgid "" +"There may be escape characters in the custom printer vendor or model. Please " +"delete and re-enter." +msgstr "" + +msgid "" +"All inputs in the custom printer vendor or model are spaces. Please re-enter." +msgstr "" + +msgid "Please check bed printable shape and origin input." +msgstr "" + +msgid "" +"You have not yet selected the printer to replace the nozzle, please choose." +msgstr "" + +msgid "Create Printer Successful" +msgstr "" + +msgid "Create Filament Successful" +msgstr "" + +msgid "Printer Created" +msgstr "" + +msgid "Please go to printer settings to edit your presets" +msgstr "" + +msgid "Filament Created" +msgstr "" + +msgid "" +"Please go to filament setting to edit your presets if you need.\n" +"Please note that nozzle temperature, hot bed temperature, and maximum " +"volumetric speed have a significant impact on printing quality. Please set " +"them carefully." +msgstr "" + +msgid "Printer Setting" +msgstr "" + +msgid "Export Configs" +msgstr "" + +msgid "Printer config bundle(.bbscfg)" +msgstr "" + +msgid "Filament bundle(.bbsflmt)" +msgstr "" + +msgid "Printer presets(.zip)" +msgstr "" + +msgid "Filament presets(.zip)" +msgstr "" + +msgid "Process presets(.zip)" +msgstr "" + +msgid "initialize fail" +msgstr "" + +msgid "add file fail" +msgstr "" + +msgid "add bundle structure file fail" +msgstr "" + +msgid "finalize fail" +msgstr "" + +msgid "open zip written fail" +msgstr "" + +msgid "Export successful" +msgstr "" + +#, c-format, boost-format +msgid "" +"The '%s' folder already exists in the current directory. Do you want to " +"clear it and rebuild it.\n" +"If not, a time suffix will be added, and you can modify the name after " +"creation." +msgstr "" + +msgid "" +"Printer and all the filament&process presets that belongs to the printer. \n" +"Can be shared with others." +msgstr "" + +msgid "" +"User's fillment preset set. \n" +"Can be shared with others." +msgstr "" + +msgid "" +"Only display printer names with changes to printer, filament, and process " +"presets." +msgstr "" + +msgid "Only display the filament names with changes to filament presets." +msgstr "" + +msgid "" +"Only printer names with user printer presets will be displayed, and each " +"preset you choose will be exported as a zip." +msgstr "" + +msgid "" +"Only the filament names with user filament presets will be displayed, \n" +"and all user filament presets in each filament name you select will be " +"exported as a zip." +msgstr "" + +msgid "" +"Only printer names with changed process presets will be displayed, \n" +"and all user process presets in each printer name you select will be " +"exported as a zip." +msgstr "" + +msgid "Please select at least one printer or filament." +msgstr "" + +msgid "Please select a type you want to export" +msgstr "" + +msgid "Edit Filament" +msgstr "" + +msgid "Filament presets under this filament" +msgstr "" + +msgid "" +"Note: If the only preset under this filament is deleted, the filament will " +"be deleted after exiting the dialog." +msgstr "" + +msgid "Presets inherited by other presets can not be deleted" +msgstr "" + +msgid "The following presets inherits this preset." +msgid_plural "The following preset inherits this preset." +msgstr[0] "" +msgstr[1] "" + +msgid "Delete Preset" +msgstr "" + +msgid "Are you sure to delete the selected preset?" +msgstr "" + +msgid "Delete preset" +msgstr "" + +msgid "+ Add Preset" +msgstr "" + +msgid "Delete Filament" +msgstr "" + +msgid "" +"All the filament presets belong to this filament would be deleted. \n" +"If you are using this filament on your printer, please reset the filament " +"information for that slot." +msgstr "" + +msgid "Delete filament" +msgstr "" + +msgid "Add Preset" +msgstr "" + +msgid "Add preset for new printer" +msgstr "" + +msgid "Copy preset from filament" +msgstr "" + +msgid "The filament choice not find filament preset, please reselect it" +msgstr "" + +msgid "Edit Preset" +msgstr "" + +msgid "For more information, please check out Wiki" +msgstr "" + +msgid "Collapse" +msgstr "" + +msgid "Daily Tips" +msgstr "" + +msgid "Need select printer" +msgstr "" + +msgid "The start, end or step is not valid value." +msgstr "" + +msgid "" +"Unable to calibrate: maybe because the set calibration value range is too " +"large, or the step is too small" +msgstr "" + +msgid "Physical Printer" +msgstr "" + +msgid "Print Host upload" +msgstr "" + +msgid "Could not get a valid Printer Host reference" +msgstr "" + +msgid "Success!" +msgstr "" + +msgid "Refresh Printers" +msgstr "" + +msgid "" +"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" +"signed certificate." +msgstr "" + +msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" +msgstr "" + +msgid "Open CA certificate file" +msgstr "" + +#, c-format, boost-format +msgid "" +"On this system, %s uses HTTPS certificates from the system Certificate Store " +"or Keychain." +msgstr "" + +msgid "" +"To use a custom CA file, please import your CA file into Certificate Store / " +"Keychain." +msgstr "" + +msgid "Connection to printers connected via the print host failed." +msgstr "" + +#, c-format, boost-format +msgid "Mismatched type of print host: %s" +msgstr "" + +msgid "Connection to AstroBox works correctly." +msgstr "" + +msgid "Could not connect to AstroBox" +msgstr "" + +msgid "Note: AstroBox version at least 1.1.0 is required." +msgstr "" + +msgid "Connection to Duet works correctly." +msgstr "" + +msgid "Could not connect to Duet" +msgstr "" + +msgid "Unknown error occured" +msgstr "" + +msgid "Wrong password" +msgstr "" + +msgid "Could not get resources to create a new connection" +msgstr "" + +msgid "Upload not enabled on FlashAir card." +msgstr "" + +msgid "Connection to FlashAir works correctly and upload is enabled." +msgstr "" + +msgid "Could not connect to FlashAir" +msgstr "" + +msgid "" +"Note: FlashAir with firmware 2.00.02 or newer and activated upload function " +"is required." +msgstr "" + +msgid "Connection to MKS works correctly." +msgstr "" + +msgid "Could not connect to MKS" +msgstr "" + +msgid "Connection to OctoPrint works correctly." +msgstr "" + +msgid "Could not connect to OctoPrint" +msgstr "" + +msgid "Note: OctoPrint version at least 1.1.0 is required." +msgstr "" + +msgid "Connection to Prusa SL1 / SL1S works correctly." +msgstr "" + +msgid "Could not connect to Prusa SLA" +msgstr "" + +msgid "Connection to PrusaLink works correctly." +msgstr "" + +msgid "Could not connect to PrusaLink" +msgstr "" + +msgid "Storages found" +msgstr "" + +#. TRN %1% = storage path +#, boost-format +msgid "%1% : read only" +msgstr "" + +#. TRN %1% = storage path +#, boost-format +msgid "%1% : no free space" +msgstr "" + +#. TRN %1% = host +#, boost-format +msgid "Upload has failed. There is no suitable storage found at %1%." +msgstr "" + +msgid "Connection to Prusa Connect works correctly." +msgstr "" + +msgid "Could not connect to Prusa Connect" +msgstr "" + +msgid "Connection to Repetier works correctly." +msgstr "" + +msgid "Could not connect to Repetier" +msgstr "" + +msgid "Note: Repetier version at least 0.90.0 is required." +msgstr "" + +#, boost-format +msgid "" +"HTTP status: %1%\n" +"Message body: \"%2%\"" +msgstr "" + +#, boost-format +msgid "" +"Parsing of host response failed.\n" +"Message body: \"%1%\"\n" +"Error: \"%2%\"" +msgstr "" + +#, boost-format +msgid "" +"Enumeration of host printers failed.\n" +"Message body: \"%1%\"\n" +"Error: \"%2%\"" +msgstr "" + +#: resources/data/hints.ini: [hint:Precise wall] +msgid "" +"Precise wall\n" +"Did you know that turning on precise wall can improve precision and layer " +"consistency?" +msgstr "" + +#: resources/data/hints.ini: [hint:Sandwich mode] +msgid "" +"Sandwich mode\n" +"Did you know that you can use sandwich mode (inner-outer-inner) to improve " +"precision and layer consistency if your model doesn't have very steep " +"overhangs?" +msgstr "" + +#: resources/data/hints.ini: [hint:Chamber temperature] +msgid "" +"Chamber temperature\n" +"Did you know that OrcaSlicer supports chamber temperature?" +msgstr "" + +#: resources/data/hints.ini: [hint:Calibration] +msgid "" +"Calibration\n" +"Did you know that calibrating your printer can do wonders? Check out our " +"beloved calibration solution in OrcaSlicer." +msgstr "" + +#: resources/data/hints.ini: [hint:Auxiliary fan] +msgid "" +"Auxiliary fan\n" +"Did you know that OrcaSlicer supports Auxiliary part cooling fan?" +msgstr "" + +#: resources/data/hints.ini: [hint:Air filtration] +msgid "" +"Air filtration/Exhuast Fan\n" +"Did you know that OrcaSlicer can support Air filtration/Exhuast Fan?" +msgstr "" + #: resources/data/hints.ini: [hint:How to use keyboard shortcuts] msgid "" "How to use keyboard shortcuts\n" @@ -11866,13 +12719,8 @@ msgstr "" msgid "" "Simplify Model\n" "Did you know that you can reduce the number of triangles in a mesh using the " -"Simplify mesh feature? Right-click the model and select Simplify model. Read " -"more in the documentation." +"Simplify mesh feature? Right-click the model and select Simplify model." msgstr "" -"Vereenvoudig het model\n" -"Wist u dat u het aantal driehoeken in een mesh kunt verminderen met de " -"functie Simplify mesh? Klik met de rechtermuisknop op het model en selecteer " -"Model vereenvoudigen. Lees meer in de documentatie." #: resources/data/hints.ini: [hint:Slicing Parameter Table] msgid "" @@ -11899,7 +12747,7 @@ msgid "" "Subtract a Part\n" "Did you know that you can subtract one mesh from another using the Negative " "part modifier? That way you can, for example, create easily resizable holes " -"directly in Orca Slicer. Read more in the documentation." +"directly in Orca Slicer." msgstr "" #: resources/data/hints.ini: [hint:STEP] @@ -12059,6 +12907,109 @@ msgid "" "probability of warping." msgstr "" +#~ msgid "Edit Text" +#~ msgstr "Pas tekst aan" + +#~ msgid "Error! Unable to create thread!" +#~ msgstr "Fout! Kan geen thread maken!" + +#~ msgid "Exception" +#~ msgstr "Uitzondering" + +#~ msgid "Choose SLA archive:" +#~ msgstr "Choose SLA archive:" + +#~ msgid "Import file" +#~ msgstr "Import file" + +#~ msgid "Import model and profile" +#~ msgstr "Import model and profile" + +#~ msgid "Import profile only" +#~ msgstr "Import profile only" + +#~ msgid "Import model only" +#~ msgstr "Import model only" + +#~ msgid "Accurate" +#~ msgstr "Accurate" + +#~ msgid "Balanced" +#~ msgstr "Balanced" + +#~ msgid "Quick" +#~ msgstr "Quick" + +#~ msgid "Auto-Calc" +#~ msgstr "Automatisch berekenen" + +#~ msgid "unloaded" +#~ msgstr "uitgeladen" + +#~ msgid "loaded" +#~ msgstr "Geladen" + +#~ msgid "Filament #" +#~ msgstr "Filament #" + +#~ msgid "" +#~ "Discribe how long the nozzle will move along the last path when retracting" +#~ msgstr "" +#~ "Dit beschrijft hoe lang de nozzle langs het laatste pad zal bewegen " +#~ "tijdens het terugtrekken (rectracting)." + +#~ msgid "" +#~ "Simplify Model\n" +#~ "Did you know that you can reduce the number of triangles in a mesh using " +#~ "the Simplify mesh feature? Right-click the model and select Simplify " +#~ "model. Read more in the documentation." +#~ msgstr "" +#~ "Vereenvoudig het model\n" +#~ "Wist u dat u het aantal driehoeken in een mesh kunt verminderen met de " +#~ "functie Simplify mesh? Klik met de rechtermuisknop op het model en " +#~ "selecteer Model vereenvoudigen. Lees meer in de documentatie." + +#~ msgid "Filling bed " +#~ msgstr "Filling bed" + +#, boost-format +#~ msgid "%1% infill pattern doesn't support 100%% density." +#~ msgstr "%1% het gekozen vulling patroon ondersteund geen 100%% dichtheid." + +#~ msgid "" +#~ "Switch to rectilinear pattern?\n" +#~ "Yes - switch to rectilinear pattern automaticlly\n" +#~ "No - reset density to default non 100% value automaticlly" +#~ msgstr "" +#~ "Overschakelen naar rechtlijnig patroon?\n" +#~ "Ja - Automatisch overschakelen naar rechtlijnig patroon\n" +#~ "Nee - Zet de dichtheid automatisch terug naar de standaard niet 100% " +#~ "waarde" + +#~ msgid "Please heat the nozzle to above 170 degree before loading filament." +#~ msgstr "" +#~ "Verwarm de nozzle tot meer dan 170 graden voordat je het filament laadt." + +#~ msgid "Newer 3mf version" +#~ msgstr "Nieuwere versie 3mf" + +#, c-format +#~ msgid "Density of internal sparse infill, 100% means solid throughout" +#~ msgstr "" +#~ "Dit is de dichtheid van de interne vulling. 100%% betekent dat het object " +#~ "geheel solide zal zijn." + +#~ msgid "Tree support wall loops" +#~ msgstr "Tree support wand lussen" + +#~ msgid "This setting specify the count of walls around tree support" +#~ msgstr "" +#~ "Deze instelling specificeert het aantal wanden rond de tree support." + +#, c-format, boost-format +#~ msgid " doesn't work at 100%% density " +#~ msgstr " doesn't work at 100%% density " + #~ msgid "Ctrl + Shift + Enter" #~ msgstr "Ctrl + Shift + Enter" @@ -12080,9 +13031,6 @@ msgstr "" #~ msgid "Export all objects as STL" #~ msgstr "Exporteer alle objecten als STL" -#~ msgid "Slice ok." -#~ msgstr "Slice gelukt" - #, c-format, boost-format #~ msgid "" #~ "The 3mf's version %s is newer than %s's version %s, Found following keys " @@ -12390,7 +13338,7 @@ msgstr "" #~ msgid "Score" #~ msgstr "Score" -#~ msgid "Bamabu High Temperature Plate" +#~ msgid "Bambu High Temperature Plate" #~ msgstr "Bambu High Temperature (hoge temperatuur) Plate" #~ msgid "Can't connect to the printer" diff --git a/localization/i18n/ru/OrcaSlicer_ru.po b/localization/i18n/ru/OrcaSlicer_ru.po index ee6a578f89..9721171694 100644 --- a/localization/i18n/ru/OrcaSlicer_ru.po +++ b/localization/i18n/ru/OrcaSlicer_ru.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: OrcaSlicer V1.8.0 Official Release\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-26 19:45+0800\n" +"POT-Creation-Date: 2023-12-19 22:09+0800\n" "PO-Revision-Date: 2023-11-20 01:07+0700\n" "Last-Translator: Andylg \n" "Language-Team: \n" @@ -15,7 +15,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" "X-Generator: Poedit 3.4.1\n" msgid "Supports Painting" @@ -106,12 +107,20 @@ msgstr "Откл. автоподдержку" msgid "Support Generated" msgstr "Поддержка сгенерирована" +msgid "Gizmo-Place on Face" +msgstr "" + msgid "Lay on face" msgstr "Поверхностью на стол" #, boost-format -msgid "Filament count exceeds the maximum number that painting tool supports. only the first %1% filaments will be available in painting tool." -msgstr "Количество пластиковых нитей превышает максимальное количество поддерживаемое инструментом рисования. Только первые %1% материала будут доступны в инструменте для рисования." +msgid "" +"Filament count exceeds the maximum number that painting tool supports. only " +"the first %1% filaments will be available in painting tool." +msgstr "" +"Количество пластиковых нитей превышает максимальное количество " +"поддерживаемое инструментом рисования. Только первые %1% материала будут " +"доступны в инструменте для рисования." msgid "Color Painting" msgstr "Покраска" @@ -149,8 +158,8 @@ msgstr "Заливка" msgid "Height range" msgstr "Диапазон высоты слоёв" -msgid "Ctrl + Shift + Enter" -msgstr "Ctrl + Shift + Enter" +msgid "Alt + Shift + Enter" +msgstr "" msgid "Toggle Wireframe" msgstr "Показать/скрыть каркас" @@ -166,6 +175,13 @@ msgstr "" "Диапазон \n" "высоты слоёв" +# +++++++++++++++++++++ +msgid "Vertical" +msgstr "Вертикальная линия" + +msgid "Horizontal" +msgstr "Горизонтальная линия" + msgid "Remove painted color" msgstr "Удаление окрашенного участка" @@ -176,9 +192,15 @@ msgstr "Окрашено с использованием прутка %1%" msgid "Move" msgstr "Перемещение" +msgid "Gizmo-Move" +msgstr "" + msgid "Rotate" msgstr "Поворот" +msgid "Gizmo-Rotate" +msgstr "" + msgid "Optimize orientation" msgstr "Оптимизация положения модели" @@ -188,12 +210,12 @@ msgstr "Применить" msgid "Scale" msgstr "Масштаб" +msgid "Gizmo-Scale" +msgstr "" + msgid "Error: Please close all toolbar menus first" msgstr "Ошибка: пожалуйста, сначала закройте все меню панели инструментов." -msgid "Tool-Lay on Face" -msgstr "Поверхностью на стол" - msgid "in" msgstr "дюйм" @@ -281,6 +303,12 @@ msgstr "Выбрать все соединения" msgid "Cut" msgstr "Разрезать" +msgid "non-mainifold edges be caused by cut tool, do you want to fix it now?" +msgstr "" + +msgid "Repairing model object" +msgstr "Починка модели" + msgid "Connector" msgstr "Соединение" @@ -412,8 +440,12 @@ msgid "Decimate ratio" msgstr "Коэффициент упрощения" #, boost-format -msgid "Processing model '%1%' with more than 1M triangles could be slow. It is highly recommended to simplify the model." -msgstr "Обработка модели '%1%' с более чем 1 млн. треугольников может быть медленной. Настоятельно рекомендуется упростить модель." +msgid "" +"Processing model '%1%' with more than 1M triangles could be slow. It is " +"highly recommended to simplify the model." +msgstr "" +"Обработка модели '%1%' с более чем 1 млн. треугольников может быть " +"медленной. Настоятельно рекомендуется упростить модель." msgid "Simplify model" msgstr "Упростить полигональную сетку" @@ -483,14 +515,14 @@ msgstr "Рисование шва" msgid "Remove selection" msgstr "Удаление выделенного" -msgid "Shift + Mouse move up or dowm" -msgstr "Shift + Мышь вверх или вниз" +msgid "Entering Seam painting" +msgstr "" -msgid "Rotate text" -msgstr "Поворот текста" +msgid "Leaving Seam painting" +msgstr "" -msgid "Text shape" -msgstr "Форма текста" +msgid "Paint-on seam editing" +msgstr "" msgid "Font" msgstr "Шрифт" @@ -498,12 +530,6 @@ msgstr "Шрифт" msgid "Thickness" msgstr "Толщина" -msgid "Input text" -msgstr "Введите текст" - -msgid "Embeded" -msgstr "Проникновение" - msgid "Text Gap" msgstr "" "Межбуквенный \n" @@ -519,12 +545,24 @@ msgstr "" "Глубина\n" "проникновения" +msgid "Input text" +msgstr "Введите текст" + msgid "Surface" msgstr "На поверхности" msgid "Horizontal text" msgstr "Горизонтальный текст" +msgid "Shift + Mouse move up or dowm" +msgstr "Shift + Мышь вверх или вниз" + +msgid "Rotate text" +msgstr "Поворот текста" + +msgid "Text shape" +msgstr "Форма текста" + msgid "Ctrl+" msgstr "Ctrl+" @@ -554,23 +592,35 @@ msgid "Machine" msgstr "Принтер" msgid "Configuration package was loaded, but some values were not recognized." -msgstr "Пакет конфигурации был загружен, но некоторые значения не были распознаны." +msgstr "" +"Пакет конфигурации был загружен, но некоторые значения не были распознаны." #, boost-format -msgid "Configuration file \"%1%\" was loaded, but some values were not recognized." -msgstr "Файл конфигурации \"%1%\" был загружен, но некоторые значения не были распознаны." +msgid "" +"Configuration file \"%1%\" was loaded, but some values were not recognized." +msgstr "" +"Файл конфигурации \"%1%\" был загружен, но некоторые значения не были " +"распознаны." msgid "V" msgstr "V" -msgid "OrcaSlicer will terminate because of running out of memory.It may be a bug. It will be appreciated if you report the issue to our team." -msgstr "OrcaSlicer завершает работу из-за нехватки памяти. Возможно, это баг программы. Будем признательны, если вы сообщите о проблеме нашей команде." +msgid "" +"OrcaSlicer will terminate because of running out of memory.It may be a bug. " +"It will be appreciated if you report the issue to our team." +msgstr "" +"OrcaSlicer завершает работу из-за нехватки памяти. Возможно, это баг " +"программы. Будем признательны, если вы сообщите о проблеме нашей команде." msgid "Fatal error" msgstr "Критическая ошибка" -msgid "OrcaSlicer will terminate because of a localization error. It will be appreciated if you report the specific scenario this issue happened." -msgstr "OrcaSlicer завершит работу из-за ошибки локализации. Будем признательны, если вы сообщите о конкретном сценарии возникновения этой проблемы." +msgid "" +"OrcaSlicer will terminate because of a localization error. It will be " +"appreciated if you report the specific scenario this issue happened." +msgstr "" +"OrcaSlicer завершит работу из-за ошибки локализации. Будем признательны, " +"если вы сообщите о конкретном сценарии возникновения этой проблемы." msgid "Critical error" msgstr "Критическая ошибка" @@ -593,22 +643,16 @@ msgid "Connect %s failed! [SN:%s, code=%s]" msgstr "Сбой подключения к %s! [Серийный №:%s, код=%s]" msgid "" -"Orca Slicer requires the Microsoft WebView2 Runtime to operate certain features.\n" +"Orca Slicer requires the Microsoft WebView2 Runtime to operate certain " +"features.\n" "Click Yes to install it now." -msgstr "Для работы некоторых функций Orca Slicer требуется Microsoft WebView2 Runtime.Нажмите Да, чтобы установить." +msgstr "" +"Для работы некоторых функций Orca Slicer требуется Microsoft WebView2 " +"Runtime.Нажмите Да, чтобы установить." msgid "WebView2 Runtime" msgstr "WebView2 Runtime" -msgid "" -"The OrcaSlicer configuration file may be corrupted and cannot be parsed.\n" -"OrcaSlicer has attempted to recreate the configuration file.\n" -"Please note, application settings will be lost, but printer profiles will not be affected." -msgstr "" -"Возможно, файл конфигурации OrcaSlicer повреждён и не может быть обработан.\n" -"OrcaSlicer попытался воссоздать файл конфигурации.\n" -"Обратите внимание, что настройки приложения будут потеряны, но профили принтера не будут затронуты." - #, c-format, boost-format msgid "" "%s\n" @@ -625,7 +669,8 @@ msgstr "Загрузка настроек" #, c-format, boost-format msgid "Click to download new version in default browser: %s" -msgstr "Нажмите OK, чтобы загрузить последнюю версию в браузере по умолчанию: %s" +msgstr "" +"Нажмите OK, чтобы загрузить последнюю версию в браузере по умолчанию: %s" msgid "The Orca Slicer needs an upgrade" msgstr "Orca Slice нуждается в обновлении." @@ -636,6 +681,17 @@ msgstr "У вас стоит самая последняя версия." msgid "Info" msgstr "Информация" +msgid "" +"The OrcaSlicer configuration file may be corrupted and cannot be parsed.\n" +"OrcaSlicer has attempted to recreate the configuration file.\n" +"Please note, application settings will be lost, but printer profiles will " +"not be affected." +msgstr "" +"Возможно, файл конфигурации OrcaSlicer повреждён и не может быть обработан.\n" +"OrcaSlicer попытался воссоздать файл конфигурации.\n" +"Обратите внимание, что настройки приложения будут потеряны, но профили " +"принтера не будут затронуты." + msgid "Rebuild" msgstr "Пересоздание" @@ -648,6 +704,10 @@ msgstr "Загрузка режима отображения" msgid "Choose one file (3mf):" msgstr "Выберите один файл (3mf):" +msgid "Choose one or more files (3mf/step/stl/svg/obj/amf/usd*/abc/ply):" +msgstr "" +"Выберите один или несколько файлов (3mf/step/stl/svg/obj/amf/usd*/abc/ply):" + msgid "Choose one or more files (3mf/step/stl/svg/obj/amf):" msgstr "Выберите один или несколько файлов (3mf/step/stl/svg/obj/amf):" @@ -657,8 +717,12 @@ msgstr "Выберите один файл (gcode/3mf):" msgid "Some presets are modified." msgstr "В некоторых профилях имеются изменения." -msgid "You can keep the modifield presets to the new project, discard or save changes as new presets." -msgstr "Вы можете сохранить изменённые профили в новом проекте, отменить или сохранить изменения в новые профили." +msgid "" +"You can keep the modifield presets to the new project, discard or save " +"changes as new presets." +msgstr "" +"Вы можете сохранить изменённые профили в новом проекте, отменить или " +"сохранить изменения в новые профили." msgid "User logged out" msgstr "Пользователь вышел из системы" @@ -669,12 +733,24 @@ msgstr "Создание или открытие файла проекта во msgid "Open Project" msgstr "Открыть проект" -msgid "The version of Orca Slicer is too low and needs to be updated to the latest version before it can be used normally" -msgstr "Слишком старая версия Orca Slicer. Для корректной работы обновите программу до последней версии." +msgid "" +"The version of Orca Slicer is too low and needs to be updated to the latest " +"version before it can be used normally" +msgstr "" +"Слишком старая версия Orca Slicer. Для корректной работы обновите программу " +"до последней версии." msgid "Privacy Policy Update" msgstr "Обновление политики конфиденциальности" +msgid "" +"The number of user presets cached in the cloud has exceeded the upper limit, " +"newly created user presets can only be used locally." +msgstr "" + +msgid "Sync user presets" +msgstr "" + msgid "Loading" msgstr "Загрузка" @@ -799,6 +875,24 @@ msgstr "Добавить блокировщик поддержки" msgid "Add support enforcer" msgstr "Добавить принудительную поддержку" +msgid "Add text" +msgstr "" + +msgid "Add negative text" +msgstr "" + +msgid "Add text modifier" +msgstr "" + +msgid "Add SVG part" +msgstr "" + +msgid "Add negative SVG" +msgstr "" + +msgid "Add SVG modifier" +msgstr "" + msgid "Select settings" msgstr "Выберите параметры" @@ -814,9 +908,6 @@ msgstr "Del" msgid "Delete the selected object" msgstr "Удаление выбранных моделей" -msgid "Edit Text" -msgstr "Изменить текст" - msgid "Load..." msgstr "Загрузить…" @@ -841,6 +932,12 @@ msgstr "Цилиндр" msgid "Cone" msgstr "Конус" +msgid "Text" +msgstr "" + +msgid "SVG" +msgstr "" + msgid "Height range Modifier" msgstr "Модификатор диапазона высоты слоёв" @@ -868,8 +965,11 @@ msgstr "Для печати" msgid "Fix model" msgstr "Починить модель" -msgid "Export as STL" -msgstr "Экспорт в STL" +msgid "Export as one STL" +msgstr "" + +msgid "Export as STLs" +msgstr "" msgid "Reload from disk" msgstr "Перезагрузить с диска" @@ -936,7 +1036,8 @@ msgid "Assemble" msgstr "Объединить в сборку" msgid "Assemble the selected objects to an object with multiple parts" -msgstr "Объединение выбранных объектов в модель, состоящую из несколько частей." +msgstr "" +"Объединение выбранных объектов в модель, состоящую из несколько частей." msgid "Assemble the selected objects to an object with single part" msgstr "Объединение выбранных моделей в единую." @@ -971,6 +1072,18 @@ msgstr "Отразить" msgid "Mirror object" msgstr "Отразить модель" +msgid "Edit text" +msgstr "" + +msgid "Ability to change text, font, size, ..." +msgstr "" + +msgid "Edit SVG" +msgstr "" + +msgid "Change SVG source file, projection, size, ..." +msgstr "" + msgid "Invalidate cut info" msgstr "Удалить информацию о разрезе" @@ -1113,7 +1226,9 @@ msgid "Click the icon to reset all settings of the object" msgstr "Нажмите на значок, чтобы сбросить все настройки модели" msgid "Right button click the icon to drop the object printable property" -msgstr "Нажмите правой кнопкой мыши на значок, чтобы разрешить/запретить печать модели" +msgstr "" +"Нажмите правой кнопкой мыши на значок, чтобы разрешить/запретить печать " +"модели" msgid "Click the icon to toggle printable property of the object" msgstr "Нажмите на значок, чтобы разрешить/запретить печать модели" @@ -1143,33 +1258,45 @@ msgid "Add Modifier" msgstr "Добавление модификатора" msgid "Switch to per-object setting mode to edit modifier settings." -msgstr "Переключение в режим редактирования настроек печати каждой модели для изменения настроек модификатора." +msgstr "" +"Переключение в режим редактирования настроек печати каждой модели для " +"изменения настроек модификатора." -msgid "Switch to per-object setting mode to edit process settings of selected objects." +msgid "" +"Switch to per-object setting mode to edit process settings of selected " +"objects." msgstr "Переключение в режим редактирования настроек печати каждой модели." msgid "Delete connector from object which is a part of cut" msgstr "Удаление соединения из модели, которое является частью разреза" msgid "Delete solid part from object which is a part of cut" -msgstr "Удаление твердотельной части из модели, которая является частью разреза" +msgstr "" +"Удаление твердотельной части из модели, которая является частью разреза" msgid "Delete negative volume from object which is a part of cut" -msgstr "Удаление объёма для вычитания из модели, которая является частью разреза" +msgstr "" +"Удаление объёма для вычитания из модели, которая является частью разреза" -msgid "To save cut correspondence you can delete all connectors from all related objects." -msgstr "Для сохранения информации о разрезе, вы можете удалить все соединения из всех связанных объектов." +msgid "" +"To save cut correspondence you can delete all connectors from all related " +"objects." +msgstr "" +"Для сохранения информации о разрезе, вы можете удалить все соединения из " +"всех связанных объектов." msgid "" "This action will break a cut correspondence.\n" "After that model consistency can't be guaranteed .\n" "\n" -"To manipulate with solid parts or negative volumes you have to invalidate cut infornation first." +"To manipulate with solid parts or negative volumes you have to invalidate " +"cut infornation first." msgstr "" "Это действие приведёт к удалению информации о разрезе.\n" "После этого согласованность модели не может быть гарантирована.\n" "\n" -"Чтобы манипулировать с твердотельными частями или объёмами для вычитания, необходимо сначала удалить информацию о сделанном разрезе." +"Чтобы манипулировать с твердотельными частями или объёмами для вычитания, " +"необходимо сначала удалить информацию о сделанном разрезе." msgid "Delete all connectors" msgstr "Удалить все соединения" @@ -1225,11 +1352,18 @@ msgstr "Слой" msgid "Selection conflicts" msgstr "Конфликты при выборе" -msgid "If first selected item is an object, the second one should also be object." -msgstr "Если первый выбранный элемент является моделью, то второй также должен быть моделью." +msgid "" +"If first selected item is an object, the second one should also be object." +msgstr "" +"Если первый выбранный элемент является моделью, то второй также должен быть " +"моделью." -msgid "If first selected item is a part, the second one should be part in the same object." -msgstr "Если первый выбранный элемент является частью, то второй должен быть частью той же модели." +msgid "" +"If first selected item is a part, the second one should be part in the same " +"object." +msgstr "" +"Если первый выбранный элемент является частью, то второй должен быть частью " +"той же модели." msgid "The type of the last solid object part is not to be changed." msgstr "Вы не можете изменить тип последнего твердотельного элемента модели." @@ -1258,9 +1392,6 @@ msgstr "Введите новое имя" msgid "Renaming" msgstr "Переименование" -msgid "Repairing model object" -msgstr "Починка модели" - msgid "Following model object has been repaired" msgid_plural "Following model objects have been repaired" msgstr[0] "Следующая часть модели успешно отремонтирована" @@ -1296,7 +1427,9 @@ msgid "Invalid numeric." msgstr "Неправильное числовое значение." msgid "one cell can only be copied to one or multiple cells in the same column" -msgstr "Одна ячейка может быть скопирована только в одну или несколько ячеек одного и того же столбца." +msgstr "" +"Одна ячейка может быть скопирована только в одну или несколько ячеек одного " +"и того же столбца." msgid "multiple cells copy is not supported" msgstr "копирование нескольких ячеек не поддерживается" @@ -1370,6 +1503,18 @@ msgstr "Следующий совет." msgid "Open Documentation in web browser." msgstr "Открыть документацию в браузере." +msgid "Color" +msgstr "Цвет" + +msgid "Pause" +msgstr "Пауза" + +msgid "Template" +msgstr "" + +msgid "Custom" +msgstr "Пользовательский" + msgid "Pause:" msgstr "Пауза:" @@ -1404,7 +1549,7 @@ msgid "Insert a pause command at the beginning of this layer." msgstr "Вставить команду паузы в начале этого слоя." msgid "Add Custom G-code" -msgstr "Добавить пользовательской G-код" +msgstr "Добавить пользовательский G-код" msgid "Insert custom G-code at the beginning of this layer." msgstr "Вставить пользовательский G-код в начале этого слоя." @@ -1445,8 +1590,8 @@ msgstr "..." msgid "Failed to connect to the server" msgstr "Не удалось подключиться к серверу" -msgid "Check cloud service status" -msgstr "Проверка статуса облачного сервиса" +msgid "Check the status of current system services" +msgstr "Проверка состояния текущих системных служб" msgid "code" msgstr "код" @@ -1455,7 +1600,8 @@ msgid "Failed to connect to cloud service" msgstr "Не удалось подключиться к облачному сервису" msgid "Please click on the hyperlink above to view the cloud service status" -msgstr "Для просмотра состояния статуса сервиса нажмите на вышерасположенную ссылку" +msgstr "" +"Для просмотра состояния статуса сервиса нажмите на вышерасположенную ссылку" msgid "Failed to connect to the printer" msgstr "Не удалось подключиться к принтеру." @@ -1472,27 +1618,21 @@ msgstr "Подключение..." msgid "?" msgstr "?" +msgid "/" +msgstr "/" + msgid "Empty" msgstr "Пусто" msgid "AMS" msgstr "АСПП" -msgid "AMS %s" -msgstr "АСПП №%s" - msgid "Auto Refill" msgstr "Дозаправка" msgid "AMS not connected" msgstr "АСПП не подключена" -msgid "Cali" -msgstr "Калиб." - -msgid "Calibration of extrusion" -msgstr "Калибровка экструзии" - msgid "Load Filament" msgstr "Загрузить" @@ -1515,7 +1655,8 @@ msgid "Calibrating AMS..." msgstr "Калибровка АСПП..." msgid "A problem occured during calibration. Click to view the solution." -msgstr "Во время калибровки возникла проблема. Нажмите, чтобы просмотреть решение." +msgstr "" +"Во время калибровки возникла проблема. Нажмите, чтобы просмотреть решение." msgid "Calibrate again" msgstr "Повторить калибровку" @@ -1543,9 +1684,6 @@ msgstr "Вставка нового прутка в экструдер" msgid "Purge old filament" msgstr "Очистка от старого материала" -msgid "Push new filament into the extruder" -msgstr "Вставка нового прутка в экструдер" - msgid "Feed Filament" msgstr "Подача прутка" @@ -1559,11 +1697,12 @@ msgstr "Проверка расположения прутка" msgid "Grab new filament" msgstr "Загрузка нового прутка" -msgid "Confirm whether the filament has been extruded" -msgstr "Подтвердите, что пластиковая нить была выдавлена" - -msgid "Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically load or unload filiament." -msgstr "Выберите слот АСПП, затем нажмите кнопку «Загрузить» или «Выгрузить» для автоматической загрузки или выгрузки прутка." +msgid "" +"Choose an AMS slot then press \"Load\" or \"Unload\" button to automatically " +"load or unload filiament." +msgstr "" +"Выберите слот АСПП, затем нажмите кнопку «Загрузить» или «Выгрузить» для " +"автоматической загрузки или выгрузки прутка." msgid "Edit" msgstr "Правка" @@ -1588,27 +1727,35 @@ msgstr "" msgid "Arranging..." msgstr "Расстановка..." -msgid "Arrange failed. Found some exceptions when processing object geometries." -msgstr "Ошибка расстановки. Обнаружены некоторые исключения при обработке геометрии моделей." - msgid "Arranging" msgstr "Расстановка" msgid "Arranging canceled." msgstr "Расстановка отменена." -msgid "Arranging is done but there are unpacked items. Reduce spacing and try again." -msgstr "Расстановка завершена, но не всё уместилось на столе. Уменьшите интервал расстановки и повторите попытку." +msgid "" +"Arranging is done but there are unpacked items. Reduce spacing and try again." +msgstr "" +"Расстановка завершена, но не всё уместилось на столе. Уменьшите интервал " +"расстановки и повторите попытку." msgid "Arranging done." msgstr "Расстановка выполнена." +msgid "" +"Arrange failed. Found some exceptions when processing object geometries." +msgstr "" +"Ошибка расстановки. Обнаружены некоторые исключения при обработке геометрии " +"моделей." + #, c-format, boost-format msgid "" -"Arrangement ignored the following objects which can't fit into a single bed:\n" +"Arrangement ignored the following objects which can't fit into a single " +"bed:\n" "%s" msgstr "" -"При расстановке были проигнорированы следующие модели, которые не помещаются на одном столе:\n" +"При расстановке были проигнорированы следующие модели, которые не помещаются " +"на одном столе:\n" "%s" msgid "" @@ -1631,8 +1778,11 @@ msgstr "Ориентация..." msgid "Orienting" msgstr "Ориентация" -msgid "Filling bed " -msgstr "Заполнение стола" +msgid "Orienting canceled." +msgstr "" + +msgid "Filling" +msgstr "" msgid "Bed filling canceled." msgstr "Заполнение стола отменено." @@ -1640,11 +1790,14 @@ msgstr "Заполнение стола отменено." msgid "Bed filling done." msgstr "Заполнение стола закончено." -msgid "Error! Unable to create thread!" -msgstr "Ошибка! Не удалось создать поток выполнения!" +msgid "Searching for optimal orientation" +msgstr "" -msgid "Exception" -msgstr "Исключение" +msgid "Orientation search canceled." +msgstr "" + +msgid "Orientation found." +msgstr "" msgid "Logging in" msgstr "Авторизация" @@ -1652,21 +1805,6 @@ msgstr "Авторизация" msgid "Login failed" msgstr "Ошибка авторизации" -msgid "The region parameter is incorrrect" -msgstr "Неправильная региональная настройка" - -msgid "Failure of printer login" -msgstr "Не удалось подключиться к принтеру." - -msgid "Failed to get ticket" -msgstr "Не удалось получить заявку" - -msgid "User authorization timeout" -msgstr "Таймаут авторизации пользователя" - -msgid "Failure of bind" -msgstr "Ошибка привязки" - msgid "Please check the printer network connection." msgstr "Пожалуйста, проверьте сетевое подключение принтера." @@ -1677,49 +1815,55 @@ msgid "Task canceled." msgstr "Задание отменено." msgid "Upload task timed out. Please check the network status and try again." -msgstr "Истекло время ожидания отправки задания. Проверьте сетевое подключение и повторите попытку." +msgstr "" +"Истекло время ожидания отправки задания. Проверьте сетевое подключение и " +"повторите попытку." msgid "Cloud service connection failed. Please try again." -msgstr "Не удалось подключиться к облачному сервису. Пожалуйста, попробуйте ещё раз." +msgstr "" +"Не удалось подключиться к облачному сервису. Пожалуйста, попробуйте ещё раз." msgid "Print file not found. please slice again." msgstr "Файл для печати не найден, нарежьте ещё раз." -msgid "Print file not found, please slice again" -msgstr "Файл для печати не найден, нарежьте ещё раз." - -msgid "The print file exceeds the maximum allowable size (1GB). Please simplify the model and slice again." -msgstr "Файл для печати превышает максимально допустимый размер (1 ГБ). Пожалуйста, упростите модель и нарежьте ещё раз." - -msgid "Failed uploading print file" -msgstr "Не удалось передать файл на печать." - -msgid "Wrong Access code" -msgstr "Неправильный код доступа" +msgid "" +"The print file exceeds the maximum allowable size (1GB). Please simplify the " +"model and slice again." +msgstr "" +"Файл для печати превышает максимально допустимый размер (1 ГБ). Пожалуйста, " +"упростите модель и нарежьте ещё раз." msgid "Failed to send the print job. Please try again." -msgstr "Не удалось отправить задание на печать. Пожалуйста, попробуйте ещё раз." - -msgid "Send to Printer failed. Please try again." -msgstr "Ошибка отправки на принтер. Пожалуйста, попробуйте ещё раз." - -msgid "No space left on Printer SD card" -msgstr "На SD-карте принтера недостаточно места" +msgstr "" +"Не удалось отправить задание на печать. Пожалуйста, попробуйте ещё раз." msgid "Failed to upload file to ftp. Please try again." msgstr "Не удалось загрузить файл на FTP. Пожалуйста, попробуйте ещё раз." -msgid "Check the current status of the bambu server by clicking on the link above." -msgstr "Проверить текущий статус сервера Bambu можно перейдя по указанной выше ссылке." +msgid "" +"Check the current status of the bambu server by clicking on the link above." +msgstr "" +"Проверить текущий статус сервера Bambu можно перейдя по указанной выше " +"ссылке." -msgid "The size of the print file is too large. Please adjust the file size and try again." -msgstr "Размер файла для печати слишком велик. Пожалуйста, уменьшите размер файла и повторите попытку." +msgid "" +"The size of the print file is too large. Please adjust the file size and try " +"again." +msgstr "" +"Размер файла для печати слишком велик. Пожалуйста, уменьшите размер файла и " +"повторите попытку." msgid "Print file not found, Please slice it again and send it for printing." -msgstr "Файл печати не найден. Пожалуйста, нарежьте его ещё раз и отправьте на печать." +msgstr "" +"Файл печати не найден. Пожалуйста, нарежьте его ещё раз и отправьте на " +"печать." -msgid "Failed to upload print file to FTP. Please check the network status and try again." -msgstr "Не удалось загрузить файл печати на FTP. Проверьте состояние сети и повторите попытку." +msgid "" +"Failed to upload print file to FTP. Please check the network status and try " +"again." +msgstr "" +"Не удалось загрузить файл печати на FTP. Проверьте состояние сети и " +"повторите попытку." msgid "Sending print job over LAN" msgstr "Отправка задания на печать по локальной сети" @@ -1727,6 +1871,9 @@ msgstr "Отправка задания на печать по локально msgid "Sending print job through cloud service" msgstr "Отправка задания на печать через облачную службу" +msgid "Print task sending times out." +msgstr "" + msgid "Service Unavailable" msgstr "Сервис недоступен" @@ -1738,11 +1885,13 @@ msgstr "Отправка конфигурации печати" #, c-format, boost-format msgid "Successfully sent. Will automatically jump to the device page in %ss" -msgstr "Успешно отправлено. Автоматический переход на страницу устройства через %s с." +msgstr "" +"Успешно отправлено. Автоматический переход на страницу устройства через %s с." #, c-format, boost-format msgid "Successfully sent. Will automatically jump to the next page in %ss" -msgstr "Успешно отправлено. Автоматический переход на следующую страницу через %s с." +msgstr "" +"Успешно отправлено. Автоматический переход на следующую страницу через %s с." msgid "An SD card needs to be inserted before printing via LAN." msgstr "Перед печатью через локальную сеть необходимо вставить SD-карту." @@ -1750,9 +1899,6 @@ msgstr "Перед печатью через локальную сеть нео msgid "Sending gcode file over LAN" msgstr "Отправка файла G-кода по локальной сети" -msgid "Sending gcode file through cloud service" -msgstr "Отправка файла G-кода через облачный сервис" - msgid "Sending gcode file to sdcard" msgstr "Отправка файла G-кода на SD-карту" @@ -1763,38 +1909,15 @@ msgstr "Успешно отправлено. Закрытие текущей с msgid "An SD card needs to be inserted before sending to printer." msgstr "Перед отправкой на принтер необходимо вставить SD-карту." -msgid "Please log out and login to the printer again." -msgstr "Пожалуйста, выйдите и снова войдите в принтер." - -msgid "Choose SLA archive:" -msgstr "Выберите SLA архив:" - -msgid "Import file" -msgstr "Импорт файла" - -msgid "Import model and profile" -msgstr "Импортировать модель и профиль" - -msgid "Import profile only" -msgstr "Импортировать только профиль" - -msgid "Import model only" -msgstr "Импортировать только модель" - -msgid "Accurate" -msgstr "Точность" - -msgid "Balanced" -msgstr "Баланс" - -msgid "Quick" -msgstr "Скорость" - msgid "Importing SLA archive" msgstr "Импорт SLA архива" -msgid "The SLA archive doesn't contain any presets. Please activate some SLA printer preset first before importing that SLA archive." -msgstr "Архив SLA не содержит никаких профилей. Пожалуйста, сначала активируйте какой-нибудь профиль SLA принтера, прежде чем импортировать этот SLA архив." +msgid "" +"The SLA archive doesn't contain any presets. Please activate some SLA " +"printer preset first before importing that SLA archive." +msgstr "" +"Архив SLA не содержит никаких профилей. Пожалуйста, сначала активируйте " +"какой-нибудь профиль SLA принтера, прежде чем импортировать этот SLA архив." msgid "Importing canceled." msgstr "Импорт отменен." @@ -1802,8 +1925,12 @@ msgstr "Импорт отменен." msgid "Importing done." msgstr "Импорт завершён." -msgid "The imported SLA archive did not contain any presets. The current SLA presets were used as fallback." -msgstr "Импортированный SLA архив не содержит никаких профилей. Текущие SLA профили использовались в качестве резервных." +msgid "" +"The imported SLA archive did not contain any presets. The current SLA " +"presets were used as fallback." +msgstr "" +"Импортированный SLA архив не содержит никаких профилей. Текущие SLA профили " +"использовались в качестве резервных." msgid "You cannot load SLA project with a multi-part object on the bed" msgstr "Вы не можете загрузить SLA проект с составной моделью на столе" @@ -1847,14 +1974,25 @@ msgstr "Orca Slicer распространяется под лицензией " msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero General Public третьей версии" -msgid "Orca Slicer is based on BambuStudio by Bambulab, which is from PrusaSlicer by Prusa Research. PrusaSlicer is from Slic3r by Alessandro Ranellucci and the RepRap community" -msgstr "Orca Slicer основан на BambuStudio от компании Bambulab, которая взяла за основу PrusaSlicer от компании Prusa Research. PrusaSlicer же основан на Slic3r от Alessandro Ranellucci и разработках сообщества RepRap." +msgid "" +"Orca Slicer is based on BambuStudio by Bambulab, which is from PrusaSlicer " +"by Prusa Research. PrusaSlicer is from Slic3r by Alessandro Ranellucci and " +"the RepRap community" +msgstr "" +"Orca Slicer основан на BambuStudio от компании Bambulab, которая взяла за " +"основу PrusaSlicer от компании Prusa Research. PrusaSlicer же основан на " +"Slic3r от Alessandro Ranellucci и разработках сообщества RepRap." msgid "Libraries" msgstr "Библиотеки" -msgid "This software uses open source components whose copyright and other proprietary rights belong to their respective owners" -msgstr "В данном программном обеспечении используются компоненты с открытым исходным кодом, авторские и иные права на которые принадлежат их соответствующим владельцам." +msgid "" +"This software uses open source components whose copyright and other " +"proprietary rights belong to their respective owners" +msgstr "" +"В данном программном обеспечении используются компоненты с открытым исходным " +"кодом, авторские и иные права на которые принадлежат их соответствующим " +"владельцам." #, c-format, boost-format msgid "About %s" @@ -1867,13 +2005,18 @@ msgid "OrcaSlicer is based on BambuStudio, PrusaSlicer, and SuperSlicer." msgstr "OrcaSlicer основан на проектах BambuStudio, PrusaSlicer и SuperSlicer." msgid "BambuStudio is originally based on PrusaSlicer by PrusaResearch." -msgstr "BambuStudio изначально основан на PrusaSlicer от компании PrusaResearch." +msgstr "" +"BambuStudio изначально основан на PrusaSlicer от компании PrusaResearch." msgid "PrusaSlicer is originally based on Slic3r by Alessandro Ranellucci." msgstr "PrusaSlicer основан на проекте Slic3r от Alessandro Ranellucci." -msgid "Slic3r was created by Alessandro Ranellucci with the help of many other contributors." -msgstr "Slic3r был создан Alessandro Ranellucci совместно с многими другими участниками сообщества." +msgid "" +"Slic3r was created by Alessandro Ranellucci with the help of many other " +"contributors." +msgstr "" +"Slic3r был создан Alessandro Ranellucci совместно с многими другими " +"участниками сообщества." msgid "Version" msgstr "Версия" @@ -1913,9 +2056,6 @@ msgstr "Серийный №" msgid "Setting AMS slot information while printing is not supported" msgstr "Изменение информации о слотах АСПП во время печати не поддерживается" -msgid "Factors of dynamic flow cali" -msgstr "Коэф. калиб. динам. потока" - msgid "Factors of Flow Dynamics Calibration" msgstr "Коэф. калиб. динам. потока" @@ -1929,7 +2069,8 @@ msgid "Factor N" msgstr "Коэф. N" msgid "Setting Virtual slot information while printing is not supported" -msgstr "Настройка информации виртуального слота во время печати не поддерживается" +msgstr "" +"Настройка информации виртуального слота во время печати не поддерживается" msgid "Are you sure you want to clear the filament information?" msgstr "Вы уверены, что хотите удалить информацию о пластиковой нити?" @@ -1937,11 +2078,11 @@ msgstr "Вы уверены, что хотите удалить информац msgid "You need to select the material type and color first." msgstr "Сначала необходимо выбрать тип материала и цвет." -msgid "Please input a valid value (K in 0~0.5)" -msgstr "Пожалуйста, введите допустимое значение (K в диапазоне 0~0.5)" +msgid "Please input a valid value (K in 0~0.3)" +msgstr "" -msgid "Please input a valid value (K in 0~0.5, N in 0.6~2.0)" -msgstr "Пожалуйста, введите допустимое значение (K в диапазоне 0~0.5, N в диапазоне 0.6~2.0)" +msgid "Please input a valid value (K in 0~0.3, N in 0.6~2.0)" +msgstr "" msgid "Other Color" msgstr "Другой цвет" @@ -1952,8 +2093,15 @@ msgstr "Пользовательский цвет" msgid "Dynamic flow calibration" msgstr "Калибровка динамики потока" -msgid "The nozzle temp and max volumetric speed will affect the calibration results. Please fill in the same values as the actual printing. They can be auto-filled by selecting a filament preset." -msgstr "Температура сопла и максимальная объёмная скорость влияют на результаты калибровки. Введите те же значения, которые вы используете при фактической печати. Их можно заполнить автоматически, выбрав существующий профиль пластиковой нити." +msgid "" +"The nozzle temp and max volumetric speed will affect the calibration " +"results. Please fill in the same values as the actual printing. They can be " +"auto-filled by selecting a filament preset." +msgstr "" +"Температура сопла и максимальная объёмная скорость влияют на результаты " +"калибровки. Введите те же значения, которые вы используете при фактической " +"печати. Их можно заполнить автоматически, выбрав существующий профиль " +"пластиковой нити." msgid "Nozzle Diameter" msgstr "Диаметр сопла" @@ -1985,8 +2133,14 @@ msgstr "Запустить калибровку" msgid "Next" msgstr "Далее" -msgid "Calibration completed. Please find the most uniform extrusion line on your hot bed like the picture below, and fill the value on its left side into the factor K input box." -msgstr "Калибровка завершена. Теперь найдите на столе наиболее равномерно экструдированную линию, как показано на рисунке ниже, и введите это значение в поле ввода коэффициента K." +msgid "" +"Calibration completed. Please find the most uniform extrusion line on your " +"hot bed like the picture below, and fill the value on its left side into the " +"factor K input box." +msgstr "" +"Калибровка завершена. Теперь найдите на столе наиболее равномерно " +"экструдированную линию, как показано на рисунке ниже, и введите это значение " +"в поле ввода коэффициента K." msgid "Save" msgstr "Сохранить" @@ -2018,8 +2172,10 @@ msgid "AMS Slots" msgstr "Слоты АСПП" # ??? Замечание: разрешён выбор только слотов АСПП с одинаковым типом материала. -msgid "Note: Only the AMS slots loaded with the same material type can be selected." -msgstr "Замечание: можно выбирать только слоты АСПП с одинаковым типом материала." +msgid "" +"Note: Only the AMS slots loaded with the same material type can be selected." +msgstr "" +"Замечание: можно выбирать только слоты АСПП с одинаковым типом материала." msgid "Enable AMS" msgstr "Включить АСПП" @@ -2036,20 +2192,40 @@ msgstr "Печать материалом, установленным на за msgid "Cabin humidity" msgstr "Влажность внутри" -msgid "Green means that AMS humidity is normal, orange represent humidity is high, red represent humidity is too high.(Hygrometer: lower the better.)" -msgstr "Зелёный цвет означает, что влажность в системе АСПП нормальная, оранжевый - высокая, красный - слишком высокая. Чем ниже значение гигрометра, тем лучше." +msgid "" +"Green means that AMS humidity is normal, orange represent humidity is high, " +"red represent humidity is too high.(Hygrometer: lower the better.)" +msgstr "" +"Зелёный цвет означает, что влажность в системе АСПП нормальная, оранжевый - " +"высокая, красный - слишком высокая. Чем ниже значение гигрометра, тем лучше." msgid "Desiccant status" msgstr "Состояние влагопоглотителя" -msgid "A desiccant status lower than two bars indicates that desiccant may be inactive. Please change the desiccant.(The bars: higher the better.)" -msgstr "Состояние влагопоглотителя (силикагеля) ниже двух делений указывает на то, что он может уже не выполнять свою функцию. Пожалуйста, замените его. Чем больше делений на индикаторе, тем лучше." +msgid "" +"A desiccant status lower than two bars indicates that desiccant may be " +"inactive. Please change the desiccant.(The bars: higher the better.)" +msgstr "" +"Состояние влагопоглотителя (силикагеля) ниже двух делений указывает на то, " +"что он может уже не выполнять свою функцию. Пожалуйста, замените его. Чем " +"больше делений на индикаторе, тем лучше." -msgid "Note: When the lid is open or the desiccant pack is changed, it can take hours or a night to absorb the moisture. Low temperatures also slow down the process. During this time, the indicator may not represent the chamber accurately." -msgstr "Примечание: при открытой крышке или заменённом влагопоглотителе, может потребоваться несколько часов или ночь для поглощения влаги. Кроме того, процесс может замедлиться из-за низкой температуры окружающей среды. В течение этого времени значения индикатора могут быть неточными." +msgid "" +"Note: When the lid is open or the desiccant pack is changed, it can take " +"hours or a night to absorb the moisture. Low temperatures also slow down the " +"process. During this time, the indicator may not represent the chamber " +"accurately." +msgstr "" +"Примечание: при открытой крышке или заменённом влагопоглотителе, может " +"потребоваться несколько часов или ночь для поглощения влаги. Кроме того, " +"процесс может замедлиться из-за низкой температуры окружающей среды. В " +"течение этого времени значения индикатора могут быть неточными." -msgid "Config which AMS slot should be used for a filament used in the print job" -msgstr "Задайте слот АСПП, который должен использоваться для прутка, используемого в текущем задании." +msgid "" +"Config which AMS slot should be used for a filament used in the print job" +msgstr "" +"Задайте слот АСПП, который должен использоваться для прутка, используемого в " +"текущем задании." msgid "Filament used in this print job" msgstr "Пруток используемый в этом задании" @@ -2064,7 +2240,8 @@ msgid "Do not Enable AMS" msgstr "Не включать АСПП" msgid "Print using materials mounted on the back of the case" -msgstr "Печать с использованием материала, установленного на задней части корпуса" +msgstr "" +"Печать с использованием материала, установленного на задней части корпуса" msgid "Print with filaments in ams" msgstr "" @@ -2074,18 +2251,35 @@ msgstr "" msgid "Print with filaments mounted on the back of the chassis" msgstr "Печать материалами, установленными на задней части корпуса." -msgid "When the current material run out, the printer will continue to print in the following order." -msgstr "Когда текущий материал закончится, принтер продолжит печать в указанном порядке." +msgid "" +"When the current material run out, the printer will continue to print in the " +"following order." +msgstr "" +"Когда текущий материал закончится, принтер продолжит печать в указанном " +"порядке." msgid "Group" msgstr "Группа" +msgid "The printer does not currently support auto refill." +msgstr "В настоящее время принтер не поддерживает функцию автодозаправки." + msgid "" -"There are currently no identical spare consumables available, and automatic replenishment is currently not possible. \n" -"(Currently supporting automatic supply of consumables with the same brand, material type, and color)" +"AMS filament backup is not enabled, please enable it in the AMS settings." msgstr "" -"В настоящее время одинаковые материалы отсутствуют, поэтому функция резервирования материала (автодозаправка) недоступна. \n" -"(В настоящее время поддерживается автоматическая дозаправка материала только одного производителя, типа и цвета)" +"Резервирование материала АСПП не включено, пожалуйста, включите его в " +"настройках АСПП." + +msgid "" +"If there are two identical filaments in AMS, AMS filament backup will be " +"enabled. \n" +"(Currently supporting automatic supply of consumables with the same brand, " +"material type, and color)" +msgstr "" +"При наличии в АСПП двух одинаковых материалов включается функция " +"резервирования материала (автодозаправка). \n" +"(В настоящее время поддерживается автоматическая дозаправка материала только " +"одного производителя, типа и цвета)" msgid "AMS Settings" msgstr "Настройки АСПП" @@ -2093,35 +2287,70 @@ msgstr "Настройки АСПП" msgid "Insertion update" msgstr "Обновление при вставке материала" -msgid "The AMS will automatically read the filament information when inserting a new Bambu Lab filament. This takes about 20 seconds." -msgstr "АСПП автоматически считывает информацию о материале при установке новой катушки Bambu. Это занимает около 20 секунд." +msgid "" +"The AMS will automatically read the filament information when inserting a " +"new Bambu Lab filament. This takes about 20 seconds." +msgstr "" +"АСПП автоматически считывает информацию о материале при установке новой " +"катушки Bambu. Это занимает около 20 секунд." -msgid "Note: if new filament is inserted during printing, the AMS will not automatically read any information until printing is completed." -msgstr "Примечание: если во время печати вставляется новая пластиковая нить, АСПП автоматически считает информацию о ней только по завершению печати." +msgid "" +"Note: if new filament is inserted during printing, the AMS will not " +"automatically read any information until printing is completed." +msgstr "" +"Примечание: если во время печати вставляется новая пластиковая нить, АСПП " +"автоматически считает информацию о ней только по завершению печати." -msgid "When inserting a new filament, the AMS will not automatically read its information, leaving it blank for you to enter manually." -msgstr "При вставке новой пластиковой нити, АСПП не будет автоматически считывать информацию о ней, оставляя поле пустым, чтобы пользователь мог ввести данные о ней вручную." +msgid "" +"When inserting a new filament, the AMS will not automatically read its " +"information, leaving it blank for you to enter manually." +msgstr "" +"При вставке новой пластиковой нити, АСПП не будет автоматически считывать " +"информацию о ней, оставляя поле пустым, чтобы пользователь мог ввести данные " +"о ней вручную." msgid "Power on update" msgstr "Обновление при включении принтера" -msgid "The AMS will automatically read the information of inserted filament on start-up. It will take about 1 minute.The reading process will roll filament spools." -msgstr "При каждом включении принтера АСПП будет автоматически считывать информация о вставленных материалах. Это занимает приблизительно одну минуту. В процессе считывания информации о материале катушка вращается." +msgid "" +"The AMS will automatically read the information of inserted filament on " +"start-up. It will take about 1 minute.The reading process will roll filament " +"spools." +msgstr "" +"При каждом включении принтера АСПП будет автоматически считывать информация " +"о вставленных материалах. Это занимает приблизительно одну минуту. В " +"процессе считывания информации о материале катушка вращается." -msgid "The AMS will not automatically read information from inserted filament during startup and will continue to use the information recorded before the last shutdown." -msgstr "При каждом включении принтера, считывание информации о вставленных материалах АСПП будет отключено. Будет использоваться информация, полученная перед последним выключением." +msgid "" +"The AMS will not automatically read information from inserted filament " +"during startup and will continue to use the information recorded before the " +"last shutdown." +msgstr "" +"При каждом включении принтера, считывание информации о вставленных " +"материалах АСПП будет отключено. Будет использоваться информация, полученная " +"перед последним выключением." msgid "Update remaining capacity" msgstr "Обновлять оставшуюся ёмкость катушки" -msgid "The AMS will estimate Bambu filament's remaining capacity after the filament info is updated. During printing, remaining capacity will be updated automatically." -msgstr "АСПП считывает информацию о расходуемом материале Bambu и рассчитывает его остаточную ёмкость на катушке. Остаточная ёмкость обновляется автоматически в процессе печати." +msgid "" +"The AMS will estimate Bambu filament's remaining capacity after the filament " +"info is updated. During printing, remaining capacity will be updated " +"automatically." +msgstr "" +"АСПП считывает информацию о расходуемом материале Bambu и рассчитывает его " +"остаточную ёмкость на катушке. Остаточная ёмкость обновляется автоматически " +"в процессе печати." msgid "AMS filament backup" msgstr "Резервирование материала АСПП" -msgid "AMS will continue to another spool with the same properties of filament automatically when current filament runs out" -msgstr "АСПП автоматически переключится на другую катушку с тем же типом материала, когда текущий закончится." +msgid "" +"AMS will continue to another spool with the same properties of filament " +"automatically when current filament runs out" +msgstr "" +"АСПП автоматически переключится на другую катушку с тем же типом материала, " +"когда текущий закончится." msgid "File" msgstr "Файл" @@ -2129,11 +2358,19 @@ msgstr "Файл" msgid "Calibration" msgstr "Калибровка" -msgid "Failed to download the plug-in. Please check your firewall settings and vpn software, check and retry." -msgstr "Не удалось загрузить плагин. Пожалуйста, проверьте настройки брандмауэра и vpn, и повторите попытку." +msgid "" +"Failed to download the plug-in. Please check your firewall settings and vpn " +"software, check and retry." +msgstr "" +"Не удалось загрузить плагин. Пожалуйста, проверьте настройки брандмауэра и " +"vpn, и повторите попытку." -msgid "Failed to install the plug-in. Please check whether it is blocked or deleted by anti-virus software." -msgstr "Не удалось установить плагин. Пожалуйста, проверьте, не заблокирован ли он или не удалён антивирусом." +msgid "" +"Failed to install the plug-in. Please check whether it is blocked or deleted " +"by anti-virus software." +msgstr "" +"Не удалось установить плагин. Пожалуйста, проверьте, не заблокирован ли он " +"или не удалён антивирусом." msgid "click here to see more info" msgstr "нажмите здесь, чтобы увидеть больше информации" @@ -2141,14 +2378,22 @@ msgstr "нажмите здесь, чтобы увидеть больше инф msgid "Please home all axes (click " msgstr "Пожалуйста, припаркуйте все оси в начало координат (нажав " -msgid ") to locate the toolhead's position. This prevents device moving beyond the printable boundary and causing equipment wear." -msgstr ") для определения положения печатной головы. Это предотвращает перемещение за пределы области печати и износ оборудования." +msgid "" +") to locate the toolhead's position. This prevents device moving beyond the " +"printable boundary and causing equipment wear." +msgstr "" +") для определения положения печатной головы. Это предотвращает перемещение " +"за пределы области печати и износ оборудования." msgid "Go Home" msgstr "На главную" -msgid "A error occurred. Maybe memory of system is not enough or it's a bug of the program" -msgstr "Произошла ошибка. Возможно, недостаточно системной памяти или это баг программы." +msgid "" +"A error occurred. Maybe memory of system is not enough or it's a bug of the " +"program" +msgstr "" +"Произошла ошибка. Возможно, недостаточно системной памяти или это баг " +"программы." msgid "Please save project and restart the program. " msgstr "Пожалуйста, сохраните проект и перезапустите программу. " @@ -2201,11 +2446,15 @@ msgid "Running post-processing scripts" msgstr "Запуск скриптов постобработки" msgid "Copying of the temporary G-code to the output G-code failed" -msgstr "Не удалось скопировать временный G-код в местонахождение выходного файла G-кода" +msgstr "" +"Не удалось скопировать временный G-код в местонахождение выходного файла G-" +"кода" #, boost-format msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" -msgstr "Планирование загрузки на `%1%`. Смотрите Окна -> Очередь загрузки на хост печати" +msgstr "" +"Планирование загрузки на `%1%`. Смотрите Окна -> Очередь загрузки на хост " +"печати" msgid "Origin" msgstr "Начало координат" @@ -2216,11 +2465,18 @@ msgstr "Диаметр" msgid "Size in X and Y of the rectangular plate." msgstr "Размеры прямоугольного стола в XY координатах." -msgid "Distance of the 0,0 G-code coordinate from the front left corner of the rectangle." -msgstr "Расстояние до точки начало координат. Отсчёт от левого переднего угла прямоугольного стола." +msgid "" +"Distance of the 0,0 G-code coordinate from the front left corner of the " +"rectangle." +msgstr "" +"Расстояние до точки начало координат. Отсчёт от левого переднего угла " +"прямоугольного стола." -msgid "Diameter of the print bed. It is assumed that origin (0,0) is located in the center." -msgstr "Диаметр стола. Предполагается, что начало координат (0,0) находится в центре." +msgid "" +"Diameter of the print bed. It is assumed that origin (0,0) is located in the " +"center." +msgstr "" +"Диаметр стола. Предполагается, что начало координат (0,0) находится в центре." msgid "Rectangular" msgstr "Прямоугольная" @@ -2228,9 +2484,6 @@ msgstr "Прямоугольная" msgid "Circular" msgstr "Круглая" -msgid "Custom" -msgstr "Пользовательский" - msgid "Load shape from STL..." msgstr "Загрузка формы стола из STL файла..." @@ -2261,8 +2514,11 @@ msgstr "Ошибка! Недопустимая модель" msgid "The selected file contains no geometry." msgstr "Выбранный файл не содержит геометрии." -msgid "The selected file contains several disjoint areas. This is not supported." -msgstr "Выбранный файл содержит несколько не пересекающихся областей. Такие файлы не поддерживаются." +msgid "" +"The selected file contains several disjoint areas. This is not supported." +msgstr "" +"Выбранный файл содержит несколько не пересекающихся областей. Такие файлы не " +"поддерживаются." msgid "Choose a file to import bed texture from (PNG/SVG):" msgstr "Выберите файл для импорта текстуры стола из PNG/SVG:" @@ -2282,26 +2538,13 @@ msgstr "" "Пожалуйста, убедитесь, что вы задали нужную температуру для печати.\n" "\n" -#, c-format, boost-format -msgid "Recommended nozzle temperature of this filament type is [%d, %d] degree centigrade" -msgstr "Рекомендуемая температура сопла для данного типа пластиковой нити составляет [%d, %d] градусов Цельсия." - #, c-format, boost-format msgid "" -"Bed temperature of other layer is lower than bed temperature of initial layer for more than %d degree centigrade.\n" -"This may cause model broken free from build plate during printing" +"Recommended nozzle temperature of this filament type is [%d, %d] degree " +"centigrade" msgstr "" -"Температура стола для последующих слоёв слишком низкая по сравнению с температурой первого слоя, более чем на %d градусов Цельсия.\n" -"Это может привести к отрыву модели от стола во время печати." - -msgid "" -"Bed temperature is higher than vitrification temperature of this filament.\n" -"This may cause nozzle blocked and printing failure\n" -"Please keep the printer open during the printing process to ensure air circulation or reduce the temperature of the hot bed" -msgstr "" -"Температура стола выше температуры стеклования этой пластиковой нити.\n" -"Это может привести к засорению сопла и сбою печати.\n" -"Пожалуйста, держите принтер открытым во время печати, чтобы обеспечить циркуляцию воздуха или снизить температуру стола." +"Рекомендуемая температура сопла для данного типа пластиковой нити составляет " +"[%d, %d] градусов Цельсия." msgid "" "Too small max volumetric speed.\n" @@ -2310,6 +2553,16 @@ msgstr "" "Слишком маленькая максимальная объёмная скорость.\n" "Сбросьте до 0,5." +#, c-format, boost-format +msgid "" +"Current chamber temperature is higher than the material's safe temperature," +"it may result in material softening and clogging.The maximum safe " +"temperature for the material is %d" +msgstr "" +"Текущая температура в камере превышает безопасную температуру для этого " +"материала, что может привести к размягчению материала или засорению " +"экструдера. Безопасная температура текущего материала составляет %d." + msgid "" "Too small layer height.\n" "Reset to 0.2" @@ -2334,15 +2587,19 @@ msgstr "" "Высота первого слоя будет сброшена до 0,2." msgid "" -"This setting is only used for model size tunning with small value in some cases.\n" +"This setting is only used for model size tunning with small value in some " +"cases.\n" "For example, when model size has small error and hard to be assembled.\n" "For large size tuning, please use model scale function.\n" "\n" "The value will be reset to 0." msgstr "" -"Этот параметр используется только для точной корректировки размера модели в определенных случаях.\n" -"Например, когда есть небольшая погрешность в размерах модели и её трудно собрать.\n" -"Для более значительной корректировки размеров используйте функцию масштабирования модели.\n" +"Этот параметр используется только для точной корректировки размера модели в " +"определенных случаях.\n" +"Например, когда есть небольшая погрешность в размерах модели и её трудно " +"собрать.\n" +"Для более значительной корректировки размеров используйте функцию " +"масштабирования модели.\n" "\n" "Это значение будет сброшено на 0." @@ -2354,14 +2611,18 @@ msgid "" "The value will be reset to 0." msgstr "" "Слишком большая компенсация слоновьей ноги нецелесообразна.\n" -"Если имеется серьёзный эффект слоновьей ноги, проверьте другие настройки печати.\n" +"Если имеется серьёзный эффект слоновьей ноги, проверьте другие настройки " +"печати.\n" "Например, не слишком ли высокая температура стола.\n" "\n" "Значение будет сброшено на 0." -msgid "Spiral mode only works when wall loops is 1, support is disabled, top shell layers is 0, sparse infill density is 0 and timelapse type is traditional." +msgid "" +"Spiral mode only works when wall loops is 1, support is disabled, top shell " +"layers is 0, sparse infill density is 0 and timelapse type is traditional." msgstr "" -"Для режима печати «Спиральная ваза» необходимо чтобы соблюдались следующие условия:\n" +"Для режима печати «Спиральная ваза» необходимо чтобы соблюдались следующие " +"условия:\n" "- одностеночный периметр\n" "- отсутствие поддержки\n" "- отсутствие верхних сплошных слоёв\n" @@ -2369,6 +2630,9 @@ msgstr "" "- отключено «Обнаружение тонких стенок»\n" "- Режим записи таймлапсов - обычный режим" +msgid " But machines with I3 structure will not generate timelapse videos." +msgstr " Но принтеры с кинематикой I3 не будут писать таймлапс." + msgid "" "Change these settings automatically? \n" "Yes - Change these settings and enable spiral mode automatically\n" @@ -2379,12 +2643,14 @@ msgstr "" "Нет - Отказаться от использования режима «Спиральная ваза»" msgid "" -"Prime tower does not work when Adaptive Layer Height or Independent Support Layer Height is on.\n" +"Prime tower does not work when Adaptive Layer Height or Independent Support " +"Layer Height is on.\n" "Which do you want to keep?\n" "YES - Keep Prime Tower\n" "NO - Keep Adaptive Layer Height and Independent Support Layer Height" msgstr "" -"Черновая башня не работает, когда включена функция «Переменная высота слоёв» или «Независимая высота слоя поддержки»\n" +"Черновая башня не работает, когда включена функция «Переменная высота слоёв» " +"или «Независимая высота слоя поддержки»\n" "Что вы хотите сохранить?\n" "ДА - Сохранить черновую башню\n" "НЕТ - Сохранить переменную высоту слоя и независимую высоту слоя поддержки" @@ -2395,7 +2661,8 @@ msgid "" "YES - Keep Prime Tower\n" "NO - Keep Adaptive Layer Height" msgstr "" -"Черновая башня не работает, когда включена функция «Переменная высота слоёв».\n" +"Черновая башня не работает, когда включена функция «Переменная высота " +"слоёв».\n" "Что вы хотите сохранить?\n" "Да - Сохранить черновую башню\n" "Нет - Сохранить переменную высоту слоёв" @@ -2406,24 +2673,12 @@ msgid "" "YES - Keep Prime Tower\n" "NO - Keep Independent Support Layer Height" msgstr "" -"Черновая башня не работает, если включена функция «Независимая высота слоя поддержки»\n" +"Черновая башня не работает, если включена функция «Независимая высота слоя " +"поддержки»\n" "Что вы хотите сохранить?\n" "ДА - Сохранить черновую башню\n" "НЕТ - Сохранить независимую высоту слоя поддержки" -#, boost-format -msgid "%1% infill pattern doesn't support 100%% density." -msgstr "Шаблон заполнения «%1%» не поддерживает 100%% заполнение." - -msgid "" -"Switch to rectilinear pattern?\n" -"Yes - switch to rectilinear pattern automaticlly\n" -"No - reset density to default non 100% value automaticlly" -msgstr "" -"Переключиться на прямолинейный (rectilinear) шаблон?\n" -"Да - переключиться на прямолинейный шаблон\n" -"Нет - сбросить плотность заполнения до значения по умолчанию (отличного от 100%)" - msgid "" "While printing by Object, the extruder may collide skirt.\n" "Thus, reset the skirt layer to 1 to avoid that." @@ -2494,6 +2749,51 @@ msgstr "Пауза при неисправности температуры со msgid "Paused due to heat bed temperature malfunction" msgstr "Пауза при неисправности температуры стола" +msgid "Filament unloading" +msgstr "Выгрузка прутка" + +# ??? +msgid "Skip step pause" +msgstr "Пропуск команды паузы" + +msgid "Filament loading" +msgstr "Загрузка прутка" + +msgid "Motor noise calibration" +msgstr "Калибровка шума двигателя" + +msgid "Paused due to AMS lost" +msgstr "Печать приостановлена из-за потери связи с АСПП" + +msgid "Paused due to low speed of the heat break fan" +msgstr "" +"Печать приостановлена из-за низкой скорости вращения вентилятора головы" + +msgid "Paused due to chamber temperature control error" +msgstr "Печать приостановлена из-за ошибки контроля температуры в камере" + +msgid "Cooling chamber" +msgstr "Охлаждение камеры" + +msgid "Paused by the Gcode inserted by user" +msgstr "Печать приостановлена G-кодом, вставленным пользователем" + +# Демонстрация шума двигателя +msgid "Motor noise showoff" +msgstr "Результат калибровки шума двигателя" + +msgid "Nozzle filament covered detected pause" +msgstr "" + +msgid "Cutter error pause" +msgstr "" + +msgid "First layer error pause" +msgstr "" + +msgid "Nozzle clog pause" +msgstr "" + msgid "MC" msgstr "Плата управления" @@ -2530,11 +2830,48 @@ msgstr "Ошибка идентификации." msgid "Update failed." msgstr "Сбой обновления." +msgid "" +"The current chamber temperature or the target chamber temperature exceeds " +"45℃.In order to avoid extruder clogging,low temperature filament(PLA/PETG/" +"TPU) is not allowed to be loaded." +msgstr "" +"Текущая температура в камере или целевая температура в камере превышает 45℃. " +"Чтобы избежать засорения экструдера, запрещается загрузка низкотемпературной " +"печатной нити (PLA/PETG/TPU)." + +msgid "" +"Low temperature filament(PLA/PETG/TPU) is loaded in the extruder.In order to " +"avoid extruder clogging,it is not allowed to set the chamber temperature " +"above 45℃." +msgstr "" +"В экструдер загружается низкотемпературная пластиковая нить (PLA/PETG/TPU). " +"Чтобы избежать засорения экструдера, запрещается устанавливать температуру в " +"камере выше 45℃." + +msgid "" +"When you set the chamber temperature below 40℃, the chamber temperature " +"control will not be activated. And the target chamber temperature will " +"automatically be set to 0℃." +msgstr "" +"Если вы установили температура в камере ниже 40℃, то контроль температуры в " +"камере не запустится, а целевая температура в ней будет автоматически " +"установлена на 0℃." + msgid "Failed to start printing job" msgstr "Не удалось запустить задание на печать." -msgid "Invalid nozzle diameter" -msgstr "Недопустимый диаметр сопла" +msgid "" +"This calibration does not support the currently selected nozzle diameter" +msgstr "Данная калибровка не поддерживает выбранный диаметр сопла" + +msgid "Current flowrate cali param is invalid" +msgstr "Текущая величина калибровки скорости потока недопустима" + +msgid "Selected diameter and machine diameter do not match" +msgstr "Выбранный диаметр и диаметр профиля принтера не совпадают" + +msgid "Failed to generate cali gcode" +msgstr "Не удалось сгенерировать калибровочный G-код" msgid "Calibration error" msgstr "Ошибка калибровки" @@ -2545,11 +2882,19 @@ msgstr "Печать TPU с помощью АСПП не поддерживае msgid "Bambu PET-CF/PA6-CF is not supported by AMS." msgstr "Печать Bambu PET-CF/PA6-CF с помощью АСПП не поддерживается." -msgid "Damp PVA will become flexible and get stuck inside AMS,please take care to dry it before use." -msgstr "Влажный PVA становится гибким и застревает внутри АСПП, поэтому перед использованием его необходимо просушить." +msgid "" +"Damp PVA will become flexible and get stuck inside AMS,please take care to " +"dry it before use." +msgstr "" +"Влажный PVA становится гибким и застревает внутри АСПП, поэтому перед " +"использованием его необходимо просушить." -msgid "CF/GF filaments are hard and brittle, It's easy to break or get stuck in AMS, please use with caution." -msgstr "CF/GF пластиковые нити твердые и хрупкие, легко ломаются или застревают в АСПП, поэтому используйте их с осторожностью." +msgid "" +"CF/GF filaments are hard and brittle, It's easy to break or get stuck in " +"AMS, please use with caution." +msgstr "" +"CF/GF пластиковые нити твердые и хрупкие, легко ломаются или застревают в " +"АСПП, поэтому используйте их с осторожностью." msgid "default" msgstr "По ум." @@ -2627,9 +2972,6 @@ msgstr "Поток: " msgid "Layer Time: " msgstr "Время печати слоя: " -msgid "Fan Speed: " -msgstr "Скорость вентилятора: " - msgid "Fan: " msgstr "Скорость вентилятора: " @@ -2657,8 +2999,12 @@ msgstr "Очищено" msgid "Total" msgstr "Общее" -msgid "Total Time Estimation" -msgstr "Оценка общего времени" +msgid "Tower" +msgstr "" + +# ++++++++++++++++++++++++++++ beta2 +msgid "Total Estimation" +msgstr "Общая оценка" msgid "Total time" msgstr "Общее время печати" @@ -2744,15 +3090,18 @@ msgstr "Смена цвета" msgid "Print" msgstr "Печать" -msgid "Pause" -msgstr "Пауза" - msgid "Printer" msgstr "Профиль принтера" msgid "Print settings" msgstr "Настройки печати" +msgid "Custom g-code" +msgstr "" + +msgid "ToolChange" +msgstr "" + msgid "Time Estimation" msgstr "Оценка времени" @@ -2861,6 +3210,9 @@ msgstr "Разрешить использование нескольких ма msgid "Avoid extrusion calibration region" msgstr "Избегать зону калибровки экструзии" +msgid "Align to Y axis" +msgstr "Выравнивать по оси Y" + msgid "Add" msgstr "Добавить" @@ -2919,8 +3271,12 @@ msgid "Size:" msgstr "Размер:" #, c-format, boost-format -msgid "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please separate the conflicted objects farther (%s <-> %s)." -msgstr "В G-коде на %d слое (z = %.2lf мм) обнаружен конфликт путей. Пожалуйста, разместите конфликтующие модели дальше друг от друга (%s <-> %s)." +msgid "" +"Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " +"separate the conflicted objects farther (%s <-> %s)." +msgstr "" +"В G-коде на %d слое (z = %.2lf мм) обнаружен конфликт путей. Пожалуйста, " +"разместите конфликтующие модели дальше друг от друга (%s <-> %s)." msgid "An object is layed over the boundary of plate." msgstr "Модель выходить за границы печатного стола." @@ -2936,10 +3292,13 @@ msgstr "При редактировании, те модели с которым msgid "" "An object is laid over the boundary of plate or exceeds the height limit.\n" -"Please solve the problem by moving it totally on or off the plate, and confirming that the height is within the build volume." +"Please solve the problem by moving it totally on or off the plate, and " +"confirming that the height is within the build volume." msgstr "" "Модель выходит за границы стола или превышает высоту печати.\n" -"Пожалуйста, устраните проблему, уместив всю модель в границы стола (или за пределы стола) и убедитесь, что высота модели находится в пределах область построения." +"Пожалуйста, устраните проблему, уместив всю модель в границы стола (или за " +"пределы стола) и убедитесь, что высота модели находится в пределах область " +"построения." msgid "Calibration step selection" msgstr "Выбор шага калибровки" @@ -2950,17 +3309,22 @@ msgstr "Калибровка микролидаром" msgid "Bed leveling" msgstr "Выравнивание стола" -msgid "Resonance frequency identification" -msgstr "Идентификация резонансной частоты" +msgid "Vibration compensation" +msgstr "Компенсация вибрации" + +msgid "Motor noise cancellation" +msgstr "Шумоподавление двигателя" msgid "Calibration program" msgstr "Программа калибровки" msgid "" -"The calibration program detects the status of your device automatically to minimize deviation.\n" +"The calibration program detects the status of your device automatically to " +"minimize deviation.\n" "It keeps the device performing optimally." msgstr "" -"Программа калибровки автоматически определяет состояние вашего принтера, чтобы свести к минимуму ошибки оборудования.\n" +"Программа калибровки автоматически определяет состояние вашего принтера, " +"чтобы свести к минимуму ошибки оборудования.\n" "Это обеспечивает оптимальную работу устройства." msgid "Calibration Flow" @@ -2975,6 +3339,9 @@ msgstr "Завершено" msgid "Calibrating" msgstr "Калибровка" +msgid "No step selected" +msgstr "Шаг не задан" + msgid "Auto-record Monitoring" msgstr "Автозапись мониторинга" @@ -3002,7 +3369,9 @@ msgstr "Пожалуйста, введите код доступа к принт msgid "" "You can find it in \"Settings > Network > Connection code\"\n" "on the printer, as shown in the figure:" -msgstr "Вы можете найти его на принтере в разделе Настройки > Сеть > Код подключения, как показано на рисунке:" +msgstr "" +"Вы можете найти его на принтере в разделе Настройки > Сеть > Код " +"подключения, как показано на рисунке:" msgid "Invalid input." msgstr "Неверный ввод." @@ -3187,8 +3556,11 @@ msgstr "Загрузка настроек" msgid "Import" msgstr "Импорт" -msgid "Export all objects as STL" -msgstr "Экспортировать все модели в STL" +msgid "Export all objects as one STL" +msgstr "" + +msgid "Export all objects as STLs" +msgstr "" msgid "Export Generic 3MF" msgstr "Экспорт в общий 3MF" @@ -3277,6 +3649,18 @@ msgstr "Вид в перспективе" msgid "Use Orthogonal View" msgstr "Ортогональный вид" +msgid "Show &G-code Window" +msgstr "" + +msgid "Show g-code window in Previce scene" +msgstr "" + +msgid "Reset Window Layout" +msgstr "" + +msgid "Reset to default window layout" +msgstr "" + msgid "Show &Labels" msgstr "Показать &имена файлов" @@ -3418,7 +3802,8 @@ msgstr "Выберите профиль для загрузки:" #, c-format, boost-format msgid "There is %d config imported. (Only non-system and compatible configs)" -msgid_plural "There are %d configs imported. (Only non-system and compatible configs)" +msgid_plural "" +"There are %d configs imported. (Only non-system and compatible configs)" msgstr[0] "Импортирована %d конфигурация (только не системная и совместимая)." msgstr[1] "Импортировано %d конфигурации (только не системные и совместимые)." msgstr[2] "Импортировано %d конфигураций (только не системные и совместимые)." @@ -3463,12 +3848,6 @@ msgstr "Ошибка инициализации (камера не обнару msgid "Printer is busy downloading, Please wait for the downloading to finish." msgstr "Принтер занят загрузкой. Дождитесь завершения загрузки." -msgid "Loading..." -msgstr "Загрузка..." - -msgid "Initialize failed (Not supported with LAN-only mode)!" -msgstr "Ошибка инициализации (не поддерживается в режиме «Только LAN»)!" - msgid "Initialize failed (Not supported on the current printer version)!" msgstr "Ошибка инициализации (не поддерживается в текущей версии принтера)!" @@ -3478,9 +3857,6 @@ msgstr "Ошибка инициализации (Недоступно в реж msgid "Initialize failed (Missing LAN ip of printer)!" msgstr "Ошибка инициализации (отсутствует IP-адрес принтера в локальной сети)!" -msgid "Initialize failed (Not supported by printer)!" -msgstr "Ошибка инициализации (не поддерживается принтером)!" - msgid "Initializing..." msgstr "Инициализация..." @@ -3499,7 +3875,9 @@ msgid "Stopped." msgstr "Остановлено." msgid "LAN Connection Failed (Failed to start liveview)" -msgstr "Сбой подключения к локальной сети (не удалось запустить просмотр в реальном времени)" +msgstr "" +"Сбой подключения к локальной сети (не удалось запустить просмотр в реальном " +"времени)" msgid "" "Virtual Camera Tools is required for this task!\n" @@ -3513,11 +3891,11 @@ msgstr "Загрузка Virtual Camera Tools" msgid "" "Another virtual camera is running.\n" -"Bambu Studio supports only a single virtual camera.\n" +"Orca Slicer supports only a single virtual camera.\n" "Do you want to stop this virtual camera?" msgstr "" "Уже работает одна виртуальная камера.\n" -"Bambu Studio поддерживает только одну виртуальную камеру.\n" +"Orca Slicer поддерживает только одну виртуальную камеру.\n" "Хотите остановить эту виртуальную камеру?" #, c-format, boost-format @@ -3534,6 +3912,9 @@ msgstr "Воспроизведение..." msgid "Load failed [%d]!" msgstr "Ошибка загрузки [%d]!" +msgid "Loading..." +msgstr "Загрузка..." + msgid "Year" msgstr "Год" @@ -3585,9 +3966,6 @@ msgstr "Пакетное управление файлами." msgid "No printers." msgstr "Принтеры отсутствуют." -msgid "Not supported by this model of printer!" -msgstr "Не поддерживается этой моделью принтера!" - #, c-format, boost-format msgid "Connect failed [%d]!" msgstr "Ошибка подключения [%d]!" @@ -3595,19 +3973,6 @@ msgstr "Ошибка подключения [%d]!" msgid "Loading file list..." msgstr "Загрузка списка файлов..." -msgid "No files" -msgstr "Файлы отсутствуют" - -msgid "Not accessible in LAN-only mode!" -msgstr "Недоступно в режиме «Только LAN»!" - -msgid "Missing LAN ip of printer!" -msgstr "Отсутствует сетевой адрес принтера!" - -#, c-format, boost-format -msgid "You are going to delete %u files. Are you sure to continue?" -msgstr "Вы собираетесь удалить файлы: %u шт. Вы уверены, что хотите это сделать?" - #, c-format, boost-format msgid "No files [%d]" msgstr "Файлы отсутствуют [%d]" @@ -3618,10 +3983,17 @@ msgstr "Ошибка загрузки [%d]" #, c-format, boost-format msgid "You are going to delete %u file from printer. Are you sure to continue?" -msgid_plural "You are going to delete %u files from printer. Are you sure to continue?" -msgstr[0] "Вы собираетесь удалить %u файл с принтера. Вы уверены, что хотите это сделать?" -msgstr[1] "Вы собираетесь удалить %u файла с принтера. Вы уверены, что хотите это сделать?" -msgstr[2] "Вы собираетесь удалить %u файлов с принтера. Вы уверены, что хотите это сделать?" +msgid_plural "" +"You are going to delete %u files from printer. Are you sure to continue?" +msgstr[0] "" +"Вы собираетесь удалить %u файл с принтера. Вы уверены, что хотите это " +"сделать?" +msgstr[1] "" +"Вы собираетесь удалить %u файла с принтера. Вы уверены, что хотите это " +"сделать?" +msgstr[2] "" +"Вы собираетесь удалить %u файлов с принтера. Вы уверены, что хотите это " +"сделать?" msgid "Delete files" msgstr "Удалить файлы" @@ -3642,8 +4014,12 @@ msgstr "Не удалось получить информацию о модел msgid "Failed to parse model infomations." msgstr "Не удалось проанализировать информацию о модели." -msgid "The .gcode.3mf file contains no G-code data.Please slice it whthBambu Studio and export a new .gcode.3mf file." -msgstr "Файл .gcode.3mf не содержит G-кода. Пожалуйста, нарежьте его в программе Bambu Studio и экспортируйте новый файл .gcode.3mf." +msgid "" +"The .gcode.3mf file contains no G-code data.Please slice it with Orca Slicer " +"and export a new .gcode.3mf file." +msgstr "" +"Файл .gcode.3mf не содержит G-кода. Пожалуйста, нарежьте его в программе " +"Orca Slicer и экспортируйте новый файл .gcode.3mf." #, c-format, boost-format msgid "File '%s' was lost! Please download it again." @@ -3665,12 +4041,28 @@ msgstr "Загрузка завершена" msgid "Downloading %d%%..." msgstr "Загрузка %d%%..." +msgid "Connection lost. Please retry." +msgstr "" + +msgid "The device cannot handle more conversations. Please retry later." +msgstr "" + +msgid "File not exists." +msgstr "" + +msgid "File checksum error. Please retry." +msgstr "" + msgid "Not supported on the current printer version." msgstr "Не поддерживается в текущей версии принтера." msgid "Storage unavailable, insert SD card." msgstr "Накопитель недоступен, вставьте SD-карту." +#, c-format, boost-format +msgid "Error code: %d" +msgstr "" + msgid "Speed:" msgstr "Скорость:" @@ -3728,12 +4120,27 @@ msgstr "0" msgid "Layer: N/A" msgstr "Слой: Н/Д" -msgid "Immediately score" -msgstr "Оценить сейчас" - msgid "Clear" msgstr "Очистить" +msgid "" +"You have completed printing the mall model, \n" +"but the synchronization of rating information has failed." +msgstr "" +"Вы завершили печать модели торгового центра, \n" +"но не удалось синхронизировать информацию о рейтинге." + +msgid "How do you like this printing file?" +msgstr "На сколько вы оцениваете этот напечатанный файл?" + +msgid "" +"(The model has already been rated. Your rating will overwrite the previous " +"rating.)" +msgstr "(Модели уже присвоен рейтинг. Ваш рейтинг перезапишет предыдущий.)" + +msgid "Rate" +msgstr "Оценка" + msgid "Camera" msgstr "Камера" @@ -3782,17 +4189,6 @@ msgstr "Отмена печати" msgid "Are you sure you want to cancel this print?" msgstr "Вы уверены, что хотите отменить эту печать?" -#, c-format, boost-format -msgid "Disconnected from printer [%s] due to LAN mode disabled.Please reconnect the printer by logging in with your user account." -msgstr "Соединение с принтером [%s] разорвано из-за отключения режима «Только LAN». Повторно подключитесь к принтеру, войдя в свою учётную запись." - -#, c-format, boost-format -msgid "Disconnected from printer [%s] due to LAN mode enabled.Please reconnect the printer by inputting Access Code which can be gotten from printer screen." -msgstr "Соединение с принтером [%s] разорвано из-за включения режима «Только LAN». Повторно подключитесь к принтеру, введя код доступа, который можно получить на экране принтера." - -msgid "Done" -msgstr "Готово" - msgid "Downloading..." msgstr "Загрузка..." @@ -3807,18 +4203,14 @@ msgstr "Количество заданий в очереди на облачн msgid "Layer: %s" msgstr "Слой: %s" -msgid "Please give a score for your favorite Bambu Market model." -msgstr "Пожалуйста, поставьте оценку вашей любимой модели в магазине Bambu Market." - -msgid "Score" -msgstr "Рейтинг" - #, c-format, boost-format msgid "Layer: %d/%d" msgstr "Слой: %d/%d" -msgid "Please heat the nozzle to above 170 degree before loading filament." -msgstr "Пожалуйста, перед загрузкой нити, нагрейте сопло до температуры выше 170 градусов." +msgid "" +"Please heat the nozzle to above 170 degree before loading or unloading " +"filament." +msgstr "" msgid "Still unload" msgstr "Ещё выгружается" @@ -3829,8 +4221,12 @@ msgstr "Ещё загружается" msgid "Please select an AMS slot before calibration" msgstr "Пожалуйста, выберите слот АСПП перед калибровкой" -msgid "Cannot read filament info: the filament is loaded to the tool head,please unload the filament and try again." -msgstr "Не удаётся считать информацию о пластиковой нити. Пластиковая нить загружена в голову, пожалуйста, выгрузите её и повторите попытку." +msgid "" +"Cannot read filament info: the filament is loaded to the tool head,please " +"unload the filament and try again." +msgstr "" +"Не удаётся считать информацию о пластиковой нити. Пластиковая нить загружена " +"в голову, пожалуйста, выгрузите её и повторите попытку." msgid "This only takes effect during printing" msgstr "Применимо только во время печати" @@ -3850,6 +4246,115 @@ msgstr "Сумасшедший" msgid "Can't start this without SD card." msgstr "Невозможно запустить без SD-карты." +msgid "Rate the Print Profile" +msgstr "Оценить профиль печати" + +msgid "Comment" +msgstr "Комментарий" + +msgid "Rate this print" +msgstr "Оценить эту печать" + +msgid "Add Photo" +msgstr "Добавить фото" + +msgid "Delete Photo" +msgstr "Удалить фото" + +msgid "Submit" +msgstr "Отправить" + +msgid "Please click on the star first." +msgstr "Пожалуйста, сначала нажмите на звездочку." + +msgid "InFo" +msgstr "Информация" + +msgid "Get oss config failed." +msgstr "" +"Не удалось получить конфигурацию OSS.\n" +"\n" +"Ошибка получения конфигурации OSS." + +msgid "Upload Pictrues" +msgstr "Отправка изображений" + +msgid "Number of images successfully uploaded" +msgstr "Количество успешно загруженных изображений" + +msgid " upload failed" +msgstr " ошибка отправки" + +msgid " upload config prase failed\n" +msgstr " ошибка обработки конфигурации при отправке\n" + +# ??? +msgid " No corresponding storage bucket\n" +msgstr " Отсутствует хранилище данных\n" + +msgid " can not be opened\n" +msgstr " не удаётся открыть\n" + +msgid "" +"The following issues occurred during the process of uploading images. Do you " +"want to ignore them?\n" +"\n" +msgstr "" +"В процессе загрузки изображений возникли следующие проблемы. Игнорировать " +"их?\n" +"\n" + +msgid "info" +msgstr "Информация" + +msgid "Synchronizing the printing results. Please retry a few seconds later." +msgstr "" +"Синхронизация результатов печати. Повторите попытку через несколько секунд." + +msgid "Upload failed\n" +msgstr "Ошибка отправки\n" + +msgid "obtaining instance_id failed\n" +msgstr "не удалось получить instance_id\n" + +msgid "" +"Your comment result cannot be uploaded due to some reasons. As follows:\n" +"\n" +" error code: " +msgstr "" +"Ваш комментарий не может быть отправлен по некоторым причинам. Причины:\n" +"\n" +"Код ошибки: " + +msgid "error message: " +msgstr "сообщение об ошибке: " + +msgid "" +"\n" +"\n" +"Would you like to redirect to the webpage for rating?" +msgstr "" +"\n" +"\n" +"Хотите перейти на страницу для выставления оценки?" + +msgid "" +"Some of your images failed to upload. Would you like to redirect to the " +"webpage for rating?" +msgstr "" +"Некоторые из ваших изображений не удалось загрузить. Хотите перейти на " +"страницу для выставления оценки?" + +msgid "You can select up to 16 images." +msgstr "Допускается выбор до 16 изображений." + +msgid "" +"At least one successful print record of this print profile is required \n" +"to give a positive rating(4 or 5stars)." +msgstr "" +"Для выставления положительной оценки (4 или 5 звезд) требуется хотя бы одна " +"успешная запись о печати данным профилем печати." + msgid "Status" msgstr "Статус" @@ -3913,6 +4418,12 @@ msgstr "Доступно обновление сетевого плагина." msgid "Details" msgstr "Подробности" +msgid "New printer config available." +msgstr "" + +msgid "Wiki" +msgstr "Вики-сайт" + msgid "Undo integration failed." msgstr "Не удалось отменить интеграцию." @@ -3964,9 +4475,6 @@ msgstr "ЗАВЕРШЕНО" msgid "Cancel upload" msgstr "Отменить отправку" -msgid "Slice ok." -msgstr "Нарезка завершена." - msgid "Jump to" msgstr "Перейти к" @@ -3979,6 +4487,9 @@ msgstr "Предупреждение:" msgid "Export successfully." msgstr "Успешно экспортировано." +msgid "Model file downloaded." +msgstr "Файл модели скачан." + msgid "Serious warning:" msgstr "Серьезное предупреждение:" @@ -4012,8 +4523,11 @@ msgstr "Слои" msgid "Range" msgstr "Диапазон" -msgid "The application cannot run normally because OpenGL version is lower than 2.0.\n" -msgstr "Приложение не может работать нормально, так как версия OpenGL ниже 2.0.\n" +msgid "" +"The application cannot run normally because OpenGL version is lower than " +"2.0.\n" +msgstr "" +"Приложение не может работать нормально, так как версия OpenGL ниже 2.0.\n" msgid "Please upgrade your graphics card driver." msgstr "Пожалуйста, обновите драйвер вашей видеокарты." @@ -4049,8 +4563,12 @@ msgstr "Чувствительность" msgid "Enable detection of build plate position" msgstr "Определение положения печатной пластины" -msgid "The localization tag of build plate is detected, and printing is paused if the tag is not in predefined range." -msgstr "Функция обнаружения метки (QR-кода) печатной пластины. Печать приостанавливается, если метка находится не в том месте." +msgid "" +"The localization tag of build plate is detected, and printing is paused if " +"the tag is not in predefined range." +msgstr "" +"Функция обнаружения метки (QR-кода) печатной пластины. Печать " +"приостанавливается, если метка находится не в том месте." msgid "First Layer Inspection" msgstr "Проверка первого слоя" @@ -4058,6 +4576,12 @@ msgstr "Проверка первого слоя" msgid "Auto-recovery from step loss" msgstr "Автовосстановление после потери шагов" +msgid "Allow Prompt Sound" +msgstr "Разрешить звуковые уведомления" + +msgid "Filament Tangle Detect" +msgstr "" + msgid "Global" msgstr "Общие" @@ -4079,6 +4603,24 @@ msgstr "Настройки прутка" msgid "Printer settings" msgstr "Настройки принтера" +msgid "Remove current plate (if not last one)" +msgstr "Удалить текущую печатную пластину (кроме последней)" + +msgid "Auto orient objects on current plate" +msgstr "Автоориентация моделей на текущей печатной пластине" + +msgid "Arrange objects on current plate" +msgstr "Расставить модели на текущей печатной пластине" + +msgid "Unlock current plate" +msgstr "Разблокировать текущую печатную пластину" + +msgid "Lock current plate" +msgstr "Заблокировать текущую печатную пластину" + +msgid "Customize current plate" +msgstr "Настроить текущую печатную пластину" + msgid "Untitled" msgstr "Без названия" @@ -4134,7 +4676,11 @@ msgstr "Синхронизировать список материалов из msgid "Set filaments to use" msgstr "Выбор пластиковой нити" -msgid "No AMS filaments. Please select a printer in 'Device' page to load AMS info." +msgid "Search plate, object and part." +msgstr "" + +msgid "" +"No AMS filaments. Please select a printer in 'Device' page to load AMS info." msgstr "" "АСПП недоступна. Пожалуйста, выберите принтер \n" "на странице «Принтер», чтобы загрузить информацию о АСПП." @@ -4142,11 +4688,19 @@ msgstr "" msgid "Sync filaments with AMS" msgstr "Синхронизация прутка с АСПП" -msgid "Sync filaments with AMS will drop all current selected filament presets and colors. Do you want to continue?" -msgstr "При синхронизации пластиковых нитей с АСПП все текущие выбранные профили прутков и цвета будут сброшены. Продолжить?" +msgid "" +"Sync filaments with AMS will drop all current selected filament presets and " +"colors. Do you want to continue?" +msgstr "" +"При синхронизации пластиковых нитей с АСПП все текущие выбранные профили " +"прутков и цвета будут сброшены. Продолжить?" -msgid "Already did a synchronization, do you want to sync only changes or resync all?" -msgstr "Синхронизация уже выполнена. Хотите синхронизировать только изменения или заново синхронизировать всё?" +msgid "" +"Already did a synchronization, do you want to sync only changes or resync " +"all?" +msgstr "" +"Синхронизация уже выполнена. Хотите синхронизировать только изменения или " +"заново синхронизировать всё?" msgid "Sync" msgstr "Только изменения" @@ -4155,18 +4709,29 @@ msgid "Resync" msgstr "Всё" msgid "There are no compatible filaments, and sync is not performed." -msgstr "Синхронизация не выполнена, ввиду отсутствия совместимых пластиковых нитей." +msgstr "" +"Синхронизация не выполнена, ввиду отсутствия совместимых пластиковых нитей." -msgid "There are some unknown filaments mapped to generic preset. Please update Orca Slicer or restart Orca Slicer to check if there is an update to system presets." -msgstr "Имеются несколько неизвестных материалов, сопоставленных с общим профилем. Обновите или перезапустите Orca Slicer, чтобы проверить наличие обновлений системных профилей." +msgid "" +"There are some unknown filaments mapped to generic preset. Please update " +"Orca Slicer or restart Orca Slicer to check if there is an update to system " +"presets." +msgstr "" +"Имеются несколько неизвестных материалов, сопоставленных с общим профилем. " +"Обновите или перезапустите Orca Slicer, чтобы проверить наличие обновлений " +"системных профилей." #, boost-format msgid "Do you want to save changes to \"%1%\"?" msgstr "Вы хотите сохранить изменения в \"%1%\"?" #, c-format, boost-format -msgid "Successfully unmounted. The device %s(%s) can now be safely removed from the computer." -msgstr "Размонтирование прошло успешно. Теперь устройство %s(%s) может быть безопасно извлечено из компьютера." +msgid "" +"Successfully unmounted. The device %s(%s) can now be safely removed from the " +"computer." +msgstr "" +"Размонтирование прошло успешно. Теперь устройство %s(%s) может быть " +"безопасно извлечено из компьютера." #, c-format, boost-format msgid "Ejecting of device %s(%s) has failed." @@ -4178,21 +4743,44 @@ msgstr "Обнаружен предыдущий несохраненный пр msgid "Restore" msgstr "Восстановить" -msgid "The bed temperature exceeds filament's vitrification temperature. Please open the front door of printer before printing to avoid nozzle clog." -msgstr "Температура стола превышает температуру стеклования пластиковой нити. Пожалуйста, откройте переднюю дверцу принтера перед печатью, чтобы избежать засорения сопла." +msgid "" +"The current hot bed temperature is relatively high. The nozzle may be " +"clogged when printing this filament in a closed enclosure. Please open the " +"front door and/or remove the upper glass." +msgstr "" +"Текущая температура стола довольно высока. При печати этим материалом в " +"закрытом корпусе возможно засорение сопла. Откройте переднюю дверцу и/или " +"верхнюю крышку принтера." -msgid "The nozzle hardness required by the filament is higher than the default nozzle hardness of the printer. Please replace the hardened nozzle or filament, otherwise, the nozzle will be attrited or damaged." -msgstr "Твердость сопла, установленного по умолчанию, не достаточна для печати данной пластиковой нитью. Замените сопло на закаленное или смените пластиковую нить. В противном случае сопло будет изношено или повреждено." +msgid "" +"The nozzle hardness required by the filament is higher than the default " +"nozzle hardness of the printer. Please replace the hardened nozzle or " +"filament, otherwise, the nozzle will be attrited or damaged." +msgstr "" +"Твердость сопла, установленного по умолчанию, не достаточна для печати " +"данной пластиковой нитью. Замените сопло на закаленное или смените " +"пластиковую нить. В противном случае сопло будет изношено или повреждено." + +msgid "" +"Enabling traditional timelapse photography may cause surface imperfections. " +"It is recommended to change to smooth mode." +msgstr "" +"Включение обычного режима таймлапса может привести к появлению дефектов " +"поверхности, поэтому рекомендуется изменить режим на плавный." + +msgid "Expand sidebar" +msgstr "" + +msgid "Collapse sidebar" +msgstr "" #, c-format, boost-format msgid "Loading file: %s" msgstr "Загрузка файла: %s" msgid "The 3mf is not supported by OrcaSlicer, load geometry data only." -msgstr "Этот 3mf создан не в OrcaSlicer, поэтому загрузятся только данные геометрии." - -msgid "The 3mf is not from Bambu Lab, load geometry data only." -msgstr "Этот 3mf создан не в Bambu Lab, поэтому загрузятся только данные геометрии." +msgstr "" +"Этот 3mf создан не в OrcaSlicer, поэтому загрузятся только данные геометрии." msgid "Load 3mf" msgstr "Загрузка 3mf" @@ -4201,24 +4789,9 @@ msgid "The Config can not be loaded." msgstr "Конфигурация не может быть загружена." msgid "The 3mf is generated by old Orca Slicer, load geometry data only." -msgstr "Этот 3mf создан в старой версии Orca Slicer, поэтому загрузятся только данные геометрии." - -msgid "The 3mf's version %s is newer than %s's version %s, Found following keys unrecognized:" msgstr "" -"Версия этого формата 3mf (%s) новее текущей версии %s (%s). \n" -"Обнаружены следующие нераспознанные ключи:" - -msgid "You'd better upgrade your software.\n" -msgstr "Рекомендуем вам обновить программу.\n" - -msgid "Newer 3mf version" -msgstr "Новая версия 3mf" - -#, c-format, boost-format -msgid "The 3mf's version %s is newer than %s's version %s, Suggest to upgrade your software." -msgstr "" -"Версия этого формата 3mf (%s) новее текущей версии %s (%s). \n" -"Рекомендуется обновить программу." +"Этот 3mf создан в старой версии Orca Slicer, поэтому загрузятся только " +"данные геометрии." msgid "Invalid values found in the 3mf:" msgstr "В файле 3mf найдены недопустимые значения:" @@ -4226,11 +4799,27 @@ msgstr "В файле 3mf найдены недопустимые значени msgid "Please correct them in the param tabs" msgstr "Пожалуйста, исправьте их на вкладках параметров" -msgid "The 3mf is not compatible, load geometry data only!" -msgstr "Этот 3mf несовместим, поэтому загрузятся только данные геометрии!" +msgid "The 3mf has following modified G-codes in filament or printer presets:" +msgstr "" -msgid "Incompatible 3mf" -msgstr "Несовместимый 3mf" +msgid "" +"Please confirm that these modified G-codes are safe to prevent any damage to " +"the machine!" +msgstr "" + +msgid "Modified G-codes" +msgstr "" + +msgid "The 3mf has following customized filament or printer presets:" +msgstr "" + +msgid "" +"Please confirm that the G-codes within these presets are safe to prevent any " +"damage to the machine!" +msgstr "" + +msgid "Customized Preset" +msgstr "" msgid "Name of components inside step file is not UTF8 format!" msgstr "Имена компонентов внутри step файла не в формате UTF8!" @@ -4240,7 +4829,8 @@ msgstr "В названии могут присутствовать ненужн #, boost-format msgid "Failed loading file \"%1%\". An invalid configuration was found." -msgstr "Не удалось загрузить файл \"%1%\". Обнаружена недопустимая конфигурация." +msgstr "" +"Не удалось загрузить файл \"%1%\". Обнаружена недопустимая конфигурация." msgid "Objects with zero volume removed" msgstr "Модели с нулевым объёмом удалены" @@ -4273,7 +4863,8 @@ msgid "Multi-part object detected" msgstr "Обнаружена модель, состоящая из нескольких частей" msgid "Load these files as a single object with multiple parts?\n" -msgstr "Загрузить эти файлы как единую модель состоящую из нескольких частей?\n" +msgstr "" +"Загрузить эти файлы как единую модель состоящую из нескольких частей?\n" msgid "Object with multiple parts was detected" msgstr "Обнаружена модель, состоящая из нескольких частей" @@ -4281,7 +4872,9 @@ msgstr "Обнаружена модель, состоящая из нескол msgid "The file does not contain any geometry data." msgstr "Файл не содержит никаких геометрических данных." -msgid "Your object appears to be too large, Do you want to scale it down to fit the heat bed automatically?" +msgid "" +"Your object appears to be too large, Do you want to scale it down to fit the " +"heat bed automatically?" msgstr "" "Похоже, ваша модель слишком большая. \n" "Хотите автоматически уменьшить её масштаб, \n" @@ -4302,6 +4895,15 @@ msgstr "Сохранить файл как:" msgid "Export OBJ file:" msgstr "Экспорт в OBJ файл:" +#, c-format, boost-format +msgid "" +"The file %s already exists\n" +"Do you want to replace it?" +msgstr "" + +msgid "Comfirm Save As" +msgstr "" + msgid "Delete object which is a part of cut object" msgstr "Удаление детали, являющейся частью разрезанной модели" @@ -4320,18 +4922,39 @@ msgstr "Выбранная модель не может быть разделе msgid "Another export job is running." msgstr "Уже идёт другой процесс экспорта." +msgid "Unable to replace with more than one volume" +msgstr "Невозможно заменить более чем одним объём" + +msgid "Error during replace" +msgstr "Ошибка при выполнении замены" + +msgid "Replace from:" +msgstr "Заменить из:" + msgid "Select a new file" msgstr "Выберите новый файл" msgid "File for the replace wasn't selected" msgstr "Файл для замены не выбран" -msgid "Error during replace" -msgstr "Ошибка при выполнении замены" - msgid "Please select a file" msgstr "Пожалуйста, выберите файл" +msgid "Do you want to replace it" +msgstr "Хотите заменить его" + +msgid "Message" +msgstr "Сообщение" + +msgid "Reload from:" +msgstr "Перезагрузка из:" + +msgid "Unable to reload:" +msgstr "Не удалось перезагрузить:" + +msgid "Error during reload" +msgstr "Ошибка во время перезагрузки" + msgid "Slicing" msgstr "Нарезка" @@ -4354,7 +4977,8 @@ msgstr "Нарезка стола %d" msgid "Please resolve the slicing errors and publish again." msgstr "Пожалуйста, устраните ошибки нарезки и попробуйте опубликовать снова." -msgid "Network Plug-in is not detected. Network related features are unavailable." +msgid "" +"Network Plug-in is not detected. Network related features are unavailable." msgstr "Сетевой плагин не обнаружен. Функции, связанные с сетью, недоступны." msgid "" @@ -4362,7 +4986,8 @@ msgid "" "The loaded file contains gcode only, Can not enter the Prepare page" msgstr "" "Режим только предпросмотра:\n" -"Загруженный файл содержит только G-код, поэтому переход на страницу «Подготовка» невозможен." +"Загруженный файл содержит только G-код, поэтому переход на страницу " +"«Подготовка» невозможен." msgid "You can keep the modified presets to the new project or discard them" msgstr "Изменённые профили можно сохранить в новом проекте или отказаться." @@ -4375,10 +5000,12 @@ msgstr "Загрузить проект" msgid "" "Failed to save the project.\n" -"Please check whether the folder exists online or if other programs open the project file." +"Please check whether the folder exists online or if other programs open the " +"project file." msgstr "" "Не удалось сохранить проект.\n" -"Убедитесь, что папка существует и что файл проекта не открыт в другой программе." +"Убедитесь, что папка существует и что файл проекта не открыт в другой " +"программе." msgid "Save project" msgstr "Сохранение проекта" @@ -4396,6 +5023,16 @@ msgstr "скачивание проекта..." msgid "Project downloaded %d%%" msgstr "Проект загружен %d%%" +msgid "" +"Importing to Orca Slicer failed. Please download the file and manually " +"import it." +msgstr "" +"Не удалось импортировать в Orca Slicer. Загрузите файл и импортируйте его " +"вручную." + +msgid "Import SLA archive" +msgstr "" + msgid "The selected file" msgstr "В выбранном файле" @@ -4452,15 +5089,39 @@ msgstr "Количество копий выбранной модели" msgid "Save G-code file as:" msgstr "Сохранить файл G-кода как:" +msgid "Save SLA file as:" +msgstr "Сохранить SLA файл как:" + +msgid "The provided file name is not valid." +msgstr "Указано недопустимое имя файла." + +msgid "The following characters are not allowed by a FAT file system:" +msgstr "Следующие символы не разрешены файловой системой FAT:" + msgid "Save Sliced file as:" msgstr "Сохранить нарезанный файл как:" #, c-format, boost-format -msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer." +msgid "" +"The file %s has been sent to the printer's storage space and can be viewed " +"on the printer." msgstr "Файл %s отправлен в память принтера и может быть просмотрен на нём." -msgid "Unable to perform boolean operation on model meshes. Only positive parts will be exported." -msgstr "Невозможно выполнить булевы операции над сетками модели. Будут экспортированы только положительные части." +msgid "" +"Unable to perform boolean operation on model meshes. Only positive parts " +"will be exported." +msgstr "" +"Невозможно выполнить булевы операции над сетками модели. Будут " +"экспортированы только положительные части." + +msgid "" +"Are you sure you want to store original SVGs with their local paths into the " +"3MF file?\n" +"If you hit 'NO', all SVGs in the project will not be editable any more." +msgstr "" + +msgid "Private protection" +msgstr "" msgid "Is the printer ready? Is the print sheet in place, empty and clean?" msgstr "Готов ли 3D-принтер? Печатная пластина на месте, пустая и чистая?" @@ -4473,7 +5134,8 @@ msgid "" "Suggest to use auto-arrange to avoid collisions when printing." msgstr "" "Печать по очереди: \n" -"Рекомендуется использовать автоматическую расстановку, чтобы избежать столкновений при печати." +"Рекомендуется использовать автоматическую расстановку, чтобы избежать " +"столкновений при печати." msgid "Send G-code" msgstr "Отправить G-код" @@ -4484,6 +5146,9 @@ msgstr "Отправить на принтер" msgid "Custom supports and color painting were removed before repairing." msgstr "Пользовательские поддержки и раскраска были удалены перед починкой." +msgid "Optimize Rotation" +msgstr "" + msgid "Invalid number" msgstr "Неправильное числовое значение" @@ -4531,12 +5196,23 @@ msgstr "Треугольников: %1%\n" msgid "Tips:" msgstr "Подсказки:" -msgid "\"Fix Model\" feature is currently only on Windows. Please repair the model on Orca Slicer(windows) or CAD softwares." -msgstr "Функция «Починить модель» в настоящее время доступна только в Windows. Пожалуйста, почините модель с помощью Bambu Studio (Windows) или другой CAD программой." +msgid "" +"\"Fix Model\" feature is currently only on Windows. Please repair the model " +"on Orca Slicer(windows) or CAD softwares." +msgstr "" +"Функция «Починить модель» в настоящее время доступна только в Windows. " +"Пожалуйста, почините модель с помощью Bambu Studio (Windows) или другой CAD " +"программой." #, c-format, boost-format -msgid "Plate% d: %s is not suggested to be used to print filament %s(%s). If you still want to do this printing, please set this filament's bed temperature to non zero." -msgstr "Не рекомендуется использовать печатную пластину% d (%s) для печати прутком %s (%s). Если вы всё же хотите сделать это, то установите температуру стола для этого прутка на ненулевое значение." +msgid "" +"Plate% d: %s is not suggested to be used to print filament %s(%s). If you " +"still want to do this printing, please set this filament's bed temperature " +"to non zero." +msgstr "" +"Не рекомендуется использовать печатную пластину% d (%s) для печати прутком " +"%s (%s). Если вы всё же хотите сделать это, то установите температуру стола " +"для этого прутка на ненулевое значение." msgid "Switching the language requires application restart.\n" msgstr "Для смены языка требуется перезапуск приложения.\n" @@ -4603,23 +5279,54 @@ msgstr "" "Единицы \n" "измерения" +msgid "Home" +msgstr "Домашняя страница" + +msgid "Default Page" +msgstr "" +"Страница \n" +"по умолчанию" + +msgid "Set the page opened on startup." +msgstr "Задание страницы, открываемой при запуске приложения." + msgid "Zoom to mouse position" msgstr "Приближать к положению курсор" -msgid "Zoom in towards the mouse pointer's position in the 3D view, rather than the 2D window center." -msgstr "Увеличивать масштаб по направлению к курсору в 3D-виде, а не к центру 2D-окна." +msgid "" +"Zoom in towards the mouse pointer's position in the 3D view, rather than the " +"2D window center." +msgstr "" +"Увеличивать масштаб по направлению к курсору в 3D-виде, а не к центру 2D-" +"окна." + +msgid "Use free camera" +msgstr "Использовать свободную камеру" + +msgid "If enabled, use free camera. If not enabled, use constrained camera." +msgstr "" +"Если включено, используется свободное вращение камеры. Если выключено, " +"используется вращение камера с ограничениями." + +msgid "Show splash screen" +msgstr "Показывать окно приветствия" + +msgid "Show the splash screen during startup." +msgstr "Показывать окно приветствия при запуске приложения." msgid "Show \"Tip of the day\" notification after start" msgstr "Показывать уведомление с полезным советом при запуске приложения" msgid "If enabled, useful hints are displayed at startup." -msgstr "Если включено, будут показываться уведомления с полезном советом при запуске приложения." +msgstr "" +"Если включено, будут показываться уведомления с полезном советом при запуске " +"приложения." -msgid "Show g-code window" -msgstr "Показать окно G-кода" +msgid "Flushing volumes: Auto-calculate everytime the color changed." +msgstr "" -msgid "If enabled, g-code window will be displayed." -msgstr "Если включено, будет отображено окно G-кода." +msgid "If enabled, auto-calculate everytime the color changed." +msgstr "" msgid "Presets" msgstr "Профили" @@ -4646,40 +5353,47 @@ msgid "Associate .3mf files to OrcaSlicer" msgstr "Ассоциировать файлы .3mf с OrcaSlicer" msgid "If enabled, sets OrcaSlicer as default application to open .3mf files" -msgstr "Если включено, назначает OrcaSlicer в качестве приложения по умолчанию для открытия .3mf файлов." +msgstr "" +"Если включено, назначает OrcaSlicer в качестве приложения по умолчанию для " +"открытия .3mf файлов." msgid "Associate .stl files to OrcaSlicer" msgstr "Ассоциировать файлы .stl с OrcaSlicer" msgid "If enabled, sets OrcaSlicer as default application to open .stl files" -msgstr "Если включено, назначает OrcaSlicer в качестве приложения по умолчанию для открытия .stl файлов." +msgstr "" +"Если включено, назначает OrcaSlicer в качестве приложения по умолчанию для " +"открытия .stl файлов." msgid "Associate .step/.stp files to OrcaSlicer" msgstr "Ассоциировать файлы .step/.stp с OrcaSlicer" msgid "If enabled, sets OrcaSlicer as default application to open .step files" -msgstr "Если включено, назначает OrcaSlicer в качестве приложения по умолчанию для открытия .step файлов." - -msgid "Online Models" -msgstr "Онлайн-модели" - -msgid "Show online staff-picked models on the home page" -msgstr "Показывать отобранные сотрудниками модели на главной странице" +msgstr "" +"Если включено, назначает OrcaSlicer в качестве приложения по умолчанию для " +"открытия .step файлов." msgid "Maximum recent projects" msgstr "Максимальное количество недавних проектов" msgid "Maximum count of recent projects" -msgstr "Максимальное количество проектов, отображаемое в списке недавних проектов." +msgstr "" +"Максимальное количество проектов, отображаемое в списке недавних проектов." msgid "Clear my choice on the unsaved projects." msgstr "Очистить мой выбор от несохранённых проектов." +msgid "No warnings when loading 3MF with modified G-codes" +msgstr "" + msgid "Auto-Backup" msgstr "Автосоздание резервной копии" -msgid "Backup your project periodically for restoring from the occasional crash." -msgstr "Периодическое создание резервной копии проекта для восстановления после непредвиденного сбоя программы." +msgid "" +"Backup your project periodically for restoring from the occasional crash." +msgstr "" +"Периодическое создание резервной копии проекта для восстановления после " +"непредвиденного сбоя программы." msgid "every" msgstr "каждые" @@ -4759,9 +5473,6 @@ msgstr "ошибка" msgid "warning" msgstr "предупреждение" -msgid "info" -msgstr "Информация" - msgid "debug" msgstr "отладка" @@ -4828,8 +5539,11 @@ msgstr "Добавить/удалить пруток" msgid "Add/Remove materials" msgstr "Добавить/удалить материал" -msgid "Add/Remove printers" -msgstr "Добавить/удалить принтер" +msgid "Select/Remove printers(system presets)" +msgstr "" + +msgid "Create printer" +msgstr "" msgid "Incompatible" msgstr "Несовместимы" @@ -4871,7 +5585,9 @@ msgid "Log Out" msgstr "Выход" msgid "Slice all plate to obtain time and filament estimation" -msgstr "Нарезка всех столов для получения примерного времени печати и расчёта необходимого количества материала." +msgstr "" +"Нарезка всех столов для получения примерного времени печати и расчёта " +"необходимого количества материала." msgid "Packing project data into 3mf file" msgstr "Упаковка данных проекта в файл формата 3mf" @@ -4883,7 +5599,9 @@ msgid "Jump to model publish web page" msgstr "Перейти на веб-страницу публикации модели" msgid "Note: The preparation may takes several minutes. Please be patiant." -msgstr "Примечание: подготовка может занять несколько минут. Пожалуйста, наберитесь терпения." +msgstr "" +"Примечание: подготовка может занять несколько минут. Пожалуйста, наберитесь " +"терпения." msgid "Publish" msgstr "Опубликовать" @@ -4907,7 +5625,7 @@ msgstr "Сохранить %s как" msgid "User Preset" msgstr "Пользовательский профиль" -msgid "Project Inside Preset" +msgid "Preset Inside Project" msgstr "Внутрипроектный профиль" msgid "Name is invalid;" @@ -4934,7 +5652,8 @@ msgid "Preset \"%1%\" already exists and is incompatible with current printer." msgstr "Профиль \"%1%\" уже существует и несовместим с текущим принтером." msgid "Please note that saving action will replace this preset" -msgstr "Обратите внимание, что при сохранении произойдёт замена текущего профиля." +msgstr "" +"Обратите внимание, что при сохранении произойдёт замена текущего профиля." msgid "The name is not allowed to be empty." msgstr "Имя не может быть пустым." @@ -4978,12 +5697,12 @@ msgstr "Просто переключиться на \"%1%\"" msgid "Task canceled" msgstr "Задание отменено" -msgid "Upload task timed out. Please check the network problem and try again" -msgstr "Истекло время ожидания отправки задания. Проверьте сетевое подключение и повторите попытку." - msgid "(LAN)" msgstr "(LAN)" +msgid "Search" +msgstr "" + msgid "My Device" msgstr "Мой принтер" @@ -5014,6 +5733,18 @@ msgstr "Не нагреваемая пластина Bambu" msgid "PLA Plate" msgstr "PLA пластина" +msgid "Bambu Engineering Plate" +msgstr "" + +msgid "Bambu Smooth PEI Plate" +msgstr "" + +msgid "High temperature Plate" +msgstr "Высокотемпературная пластина" + +msgid "Bambu Textured PEI Plate" +msgstr "" + msgid "Send print job to" msgstr "Отправка задания на печать" @@ -5030,8 +5761,8 @@ msgstr "" "Калибровка\n" "динамики потока" -msgid "Can't connect to the printer" -msgstr "Не удаётся подключиться к принтеру" +msgid "Click here if you can't connect to the printer" +msgstr "Не удаётся подключиться к принтеру?" msgid "send completed" msgstr "отправка завершена" @@ -5039,11 +5770,9 @@ msgstr "отправка завершена" msgid "Error code" msgstr "Код ошибки" -msgid "Check the status of current system services" -msgstr "Проверка состояния текущих системных служб" - msgid "Printer local connection failed, please try again." -msgstr "Не удалось установить локальное соединение с принтером, попробуйте ещё раз." +msgstr "" +"Не удалось установить локальное соединение с принтером, попробуйте ещё раз." msgid "No login account, only printers in LAN mode are displayed" msgstr "" @@ -5060,36 +5789,70 @@ msgid "Synchronizing device information time out" msgstr "Время ожидания синхронизации информации об устройстве истекло" msgid "Cannot send the print job when the printer is updating firmware" -msgstr "Невозможно отправить задание на печать, при обновлении прошивки принтера." +msgstr "" +"Невозможно отправить задание на печать, при обновлении прошивки принтера." -msgid "The printer is executing instructions. Please restart printing after it ends" -msgstr "Принтер выполняет инструкции. Пожалуйста, перезапустите печать после их завершения." +msgid "" +"The printer is executing instructions. Please restart printing after it ends" +msgstr "" +"Принтер выполняет инструкции. Пожалуйста, перезапустите печать после их " +"завершения." msgid "The printer is busy on other print job" msgstr "Принтер занят другим заданием" #, c-format, boost-format -msgid "Filament %s exceeds the number of AMS slots. Please update the printer firmware to support AMS slot assignment." -msgstr "Количество пластиковых нитей - %s, что превышает количество слотов АСПП. Обновите прошивку принтера, чтобы получить поддержку функции назначения слотов АСПП." +msgid "" +"Filament %s exceeds the number of AMS slots. Please update the printer " +"firmware to support AMS slot assignment." +msgstr "" +"Количество пластиковых нитей - %s, что превышает количество слотов АСПП. " +"Обновите прошивку принтера, чтобы получить поддержку функции назначения " +"слотов АСПП." -msgid "Filament exceeds the number of AMS slots. Please update the printer firmware to support AMS slot assignment." -msgstr "Количество пластиковых нитей превышает количество слотов АСПП. Обновите прошивку принтера, чтобы получить поддержку функции назначения слотов АСПП." +msgid "" +"Filament exceeds the number of AMS slots. Please update the printer firmware " +"to support AMS slot assignment." +msgstr "" +"Количество пластиковых нитей превышает количество слотов АСПП. Обновите " +"прошивку принтера, чтобы получить поддержку функции назначения слотов АСПП." -msgid "Filaments to AMS slots mappings have been established. You can click a filament above to change its mapping AMS slot" -msgstr "Соответствия между материалами и слотами АСПП были установлены. Вы можете нажать на пластиковую нить выше, чтобы вручную задать для неё нужный слот АСПП." +msgid "" +"Filaments to AMS slots mappings have been established. You can click a " +"filament above to change its mapping AMS slot" +msgstr "" +"Соответствия между материалами и слотами АСПП были установлены. Вы можете " +"нажать на пластиковую нить выше, чтобы вручную задать для неё нужный слот " +"АСПП." -msgid "Please click each filament above to specify its mapping AMS slot before sending the print job" -msgstr "Перед отправкой задания на печать, нажмите на каждую пластиковую нить, чтобы вручную задать для неё нужный слот АСПП." +msgid "" +"Please click each filament above to specify its mapping AMS slot before " +"sending the print job" +msgstr "" +"Перед отправкой задания на печать, нажмите на каждую пластиковую нить, чтобы " +"вручную задать для неё нужный слот АСПП." #, c-format, boost-format -msgid "Filament %s does not match the filament in AMS slot %s. Please update the printer firmware to support AMS slot assignment." -msgstr "Материал %s не соответствует материалу в слоте %s АСПП. Обновите прошивку принтера, чтобы получить поддержку функции назначения слотов АСПП." +msgid "" +"Filament %s does not match the filament in AMS slot %s. Please update the " +"printer firmware to support AMS slot assignment." +msgstr "" +"Материал %s не соответствует материалу в слоте %s АСПП. Обновите прошивку " +"принтера, чтобы получить поддержку функции назначения слотов АСПП." -msgid "Filament does not match the filament in AMS slot. Please update the printer firmware to support AMS slot assignment." -msgstr "Материал не соответствует материалу в слоте АСПП. Обновите прошивку принтера, чтобы получить поддержку функции назначения слотов АСПП." +msgid "" +"Filament does not match the filament in AMS slot. Please update the printer " +"firmware to support AMS slot assignment." +msgstr "" +"Материал не соответствует материалу в слоте АСПП. Обновите прошивку " +"принтера, чтобы получить поддержку функции назначения слотов АСПП." -msgid "The printer firmware only supports sequential mapping of filament => AMS slot." -msgstr "Текущая прошивка принтера поддерживает только последовательное сопоставление пластиковых нитей => слот АСПП." +msgid "" +"The printer firmware only supports sequential mapping of filament => AMS " +"slot." +msgstr "" +"Текущая прошивка принтера поддерживает только последовательное сопоставление " +"пластиковых нитей => слот АСПП." msgid "An SD card needs to be inserted before printing." msgstr "Перед печатью необходимо вставить SD-карту." @@ -5100,8 +5863,12 @@ msgstr "Выбранный принтер несовместим с выбран msgid "An SD card needs to be inserted to record timelapse." msgstr "Для записи таймлапсов необходимо вставить SD-карту." -msgid "Cannot send the print job to a printer whose firmware is required to get updated." -msgstr "Невозможно отправить задание печати на принтер, прошивка которого нуждается в обновлении." +msgid "" +"Cannot send the print job to a printer whose firmware is required to get " +"updated." +msgstr "" +"Невозможно отправить задание печати на принтер, прошивка которого нуждается " +"в обновлении." msgid "Cannot send the print job for empty plate" msgstr "Невозможно отправить задание на печать, так как стол пуст." @@ -5109,27 +5876,71 @@ msgstr "Невозможно отправить задание на печать msgid "This printer does not support printing all plates" msgstr "Данный принтер не поддерживает печать на всех типах печатных пластин." +msgid "" +"When enable spiral vase mode, machines with I3 structure will not generate " +"timelapse videos." +msgstr "" +"При включении режима «Спиральная ваза» принтеры с кинематикой I3 не будут " +"писать таймлапс." + +msgid "" +"Timelapse is not supported because Print sequence is set to \"By object\"." +msgstr "" + msgid "Errors" msgstr "Ошибок" msgid "Please check the following:" msgstr "Пожалуйста, проверьте следующую информацию:" -msgid "The printer type selected when generating G-Code is not consistent with the currently selected printer. It is recommended that you use the same printer type for slicing." -msgstr "Выбранный профиль принтера в настройках слайсера не совпадает с фактическим принтером. Для нарезки рекомендуется использовать тот же профиль принтера." +msgid "" +"The printer type selected when generating G-Code is not consistent with the " +"currently selected printer. It is recommended that you use the same printer " +"type for slicing." +msgstr "" +"Выбранный профиль принтера в настройках слайсера не совпадает с фактическим " +"принтером. Для нарезки рекомендуется использовать тот же профиль принтера." + +msgid "" +"There are some unknown filaments in the AMS mappings. Please check whether " +"they are the required filaments. If they are okay, press \"Confirm\" to " +"start printing." +msgstr "" +"В АСПП установлены неизвестные пластиковые нити. Убедитесь, что стоят именно " +"те, что вам нужны. Если всё в порядке, нажмите «Подтвердить», чтобы начать " +"печать." #, c-format, boost-format -msgid "%s is not supported by AMS." -msgstr "%s не поддерживается АСПП." +msgid "nozzle in preset: %s %s" +msgstr "" -msgid "There are some unknown filaments in the AMS mappings. Please check whether they are the required filaments. If they are okay, press \"Confirm\" to start printing." -msgstr "В АСПП установлены неизвестные пластиковые нити. Убедитесь, что стоят именно те, что вам нужны. Если всё в порядке, нажмите «Подтвердить», чтобы начать печать." +#, c-format, boost-format +msgid "nozzle memorized: %.1f %s" +msgstr "" -msgid "Please click the confirm button if you still want to proceed with printing." +msgid "" +"Your nozzle diameter in preset is not consistent with memorized nozzle " +"diameter. Did you change your nozzle lately?" +msgstr "" + +#, c-format, boost-format +msgid "*Printing %s material with %s may cause nozzle damage" +msgstr "" + +msgid "" +"Please click the confirm button if you still want to proceed with printing." msgstr "Нажмите кнопку подтверждения, если всё ещё хотите продолжить печать." -msgid "Connecting to the printer. Unable to cancel during the connection process." -msgstr "Подключение к принтеру. Невозможно отменить во время процесса подключения." +msgid "Hardened Steel" +msgstr "" + +msgid "Stainless Steel" +msgstr "" + +msgid "" +"Connecting to the printer. Unable to cancel during the connection process." +msgstr "" +"Подключение к принтеру. Невозможно отменить во время процесса подключения." msgid "Preparing print job" msgstr "Подготовка задания на печать" @@ -5140,8 +5951,12 @@ msgstr "Неправильные данные файла печати. Пожа msgid "The name length exceeds the limit." msgstr "Длина имени превышает установленное ограничение." -msgid "Caution to use! Flow calibration on Textured PEI Plate may fail due to the scattered surface." -msgstr "Внимание! Калибровка потока на текстурированной пластине с PEI покрытием может быть неудачной из-за шероховатой поверхности." +msgid "" +"Caution to use! Flow calibration on Textured PEI Plate may fail due to the " +"scattered surface." +msgstr "" +"Внимание! Калибровка потока на текстурированной пластине с PEI покрытием " +"может быть неудачной из-за шероховатой поверхности." msgid "Automatic flow calibration using Micro Lidar" msgstr "Автокалибровка потока с помощью микролидара" @@ -5158,12 +5973,18 @@ msgstr "Во время обновления невозможно отправи msgid "An SD card needs to be inserted before send to printer SD card." msgstr "Перед отправкой на SD-карту, сначала вставьте её в принтер." -msgid "The printer is required to be in the same LAN as Bambu Studio." -msgstr "Принтер должен находиться в одной локальной сети с Bambu Studio." +msgid "The printer is required to be in the same LAN as Orca Slicer." +msgstr "Принтер должен находиться в одной локальной сети с Orca Slicer." msgid "The printer does not support sending to printer SD card." msgstr "Принтер не поддерживает отправку на SD-карту." +msgid "Slice ok." +msgstr "Нарезка завершена." + +msgid "View all Daily tips" +msgstr "" + msgid "Failed to create socket" msgstr "Не удалось создать сокет" @@ -5206,9 +6027,19 @@ msgstr "Прочитать и принять" msgid "Terms and Conditions" msgstr "Условия использования" -msgid "Thank you for purchasing a Bambu Lab device.Before using your Bambu Lab device, please read the termsand conditions.By clicking to agree to use your Bambu Lab device, you agree to abide by the Privacy Policyand Terms of Use(collectively, the \"Terms\"). If you do not comply with or agree to the Bambu Lab Privacy Policy, please do not use Bambu Lab equipment and services." +msgid "" +"Thank you for purchasing a Bambu Lab device.Before using your Bambu Lab " +"device, please read the termsand conditions.By clicking to agree to use your " +"Bambu Lab device, you agree to abide by the Privacy Policyand Terms of " +"Use(collectively, the \"Terms\"). If you do not comply with or agree to the " +"Bambu Lab Privacy Policy, please do not use Bambu Lab equipment and services." msgstr "" -"Перед использованием устройства Bambu Lab ознакомьтесь с правилами и условиями. Нажимая на кнопку \"Согласие на использование устройства Bambu Lab\", вы соглашаетесь соблюдать Политику конфиденциальности и Условия использования (далее - \"Условия\"). Если вы не соблюдаете или не согласны с Политикой конфиденциальности Bambu Lab, пожалуйста, не пользуйтесь оборудованием и услугами Bambu Lab." +"Перед использованием устройства Bambu Lab ознакомьтесь с правилами и " +"условиями. Нажимая на кнопку \"Согласие на использование устройства Bambu Lab" +"\", вы соглашаетесь соблюдать Политику конфиденциальности и Условия " +"использования (далее - \"Условия\"). Если вы не соблюдаете или не согласны с " +"Политикой конфиденциальности Bambu Lab, пожалуйста, не пользуйтесь " +"оборудованием и услугами Bambu Lab." msgid "and" msgstr "и" @@ -5224,12 +6055,30 @@ msgstr "Заявление о программе улучшения пользо #, c-format, boost-format msgid "" -"In the 3D Printing community, we learn from each other's successes and failures to adjust our own slicing parameters and settings. %s follows the same principle and uses machine learning to improve its performance from the successes and failures of the vast number of prints by our users. We are training %s to be smarter by feeding them the real-world data. If you are willing, this service will " -"access information from your error logs and usage logs, which may include information described in Privacy Policy. We will not collect any Personal Data by which an individual can be identified directly or indirectly, including without limitation names, addresses, payment information, or phone numbers. By enabling this service, you agree to these terms and the statement about Privacy Policy." +"In the 3D Printing community, we learn from each other's successes and " +"failures to adjust our own slicing parameters and settings. %s follows the " +"same principle and uses machine learning to improve its performance from the " +"successes and failures of the vast number of prints by our users. We are " +"training %s to be smarter by feeding them the real-world data. If you are " +"willing, this service will access information from your error logs and usage " +"logs, which may include information described in Privacy Policy. We will " +"not collect any Personal Data by which an individual can be identified " +"directly or indirectly, including without limitation names, addresses, " +"payment information, or phone numbers. By enabling this service, you agree " +"to these terms and the statement about Privacy Policy." msgstr "" -"В сообществе 3D-печатников мы учимся на успехах и неудачах друг друга, чтобы корректировать свои собственные параметры и настройки нарезки. Система %s работает по тому же принципу и использует машинное обучение для улучшения своей работы на основе успехов и неудач огромного количества отпечатков наших пользователей. Мы обучаем %s быть умнее, предоставляя ему данные из реального мира. По вашему " -"желанию эта служба получит доступ к информации из журналу ошибок и журналу использования, которая может включать информацию, описанную в Политике конфиденциальности. Мы не будем собирать никаких персональных данных, по которым можно прямо или косвенно идентифицировать физическое лицо, включая, помимо прочего, имена, адреса, платежную информацию или номера телефонов. Включая данную услугу, вы " -"соглашаетесь с данными условиями и заявлением о Политике конфиденциальности." +"В сообществе 3D-печатников мы учимся на успехах и неудачах друг друга, чтобы " +"корректировать свои собственные параметры и настройки нарезки. Система %s " +"работает по тому же принципу и использует машинное обучение для улучшения " +"своей работы на основе успехов и неудач огромного количества отпечатков " +"наших пользователей. Мы обучаем %s быть умнее, предоставляя ему данные из " +"реального мира. По вашему желанию эта служба получит доступ к информации из " +"журналу ошибок и журналу использования, которая может включать информацию, " +"описанную в Политике конфиденциальности. Мы не будем собирать никаких " +"персональных данных, по которым можно прямо или косвенно идентифицировать " +"физическое лицо, включая, помимо прочего, имена, адреса, платежную " +"информацию или номера телефонов. Включая данную услугу, вы соглашаетесь с " +"данными условиями и заявлением о Политике конфиденциальности." msgid "Statement on User Experience Improvement Plan" msgstr "Заявление о плане улучшения взаимодействия с пользователем" @@ -5247,7 +6096,8 @@ msgid "Please log in first." msgstr "Пожалуйста, сначала авторизуйтесь." msgid "There was a problem connecting to the printer. Please try again." -msgstr "Возникла проблема с подключением к принтеру. Пожалуйста, попробуйте ещё раз." +msgstr "" +"Возникла проблема с подключением к принтеру. Пожалуйста, попробуйте ещё раз." msgid "Failed to log out." msgstr "Не удалось выйти." @@ -5264,18 +6114,36 @@ msgid "Search in preset" msgstr "Поиск в профиле" msgid "Click to reset all settings to the last saved preset." -msgstr "Нажмите, чтобы сбросить все настройки до последнего сохраненного профиля." - -msgid "Prime tower is required for smooth timeplase. There may be flaws on the model without prime tower. Are you sure you want to disable prime tower?" -msgstr "Для плавного таймлапса требуется черновая башня. На модели без использования черновой башни могут быть дефекты. Вы уверены, что хотите отключить черновую башню?" - -msgid "Prime tower is required for smooth timelapse. There may be flaws on the model without prime tower. Do you want to enable prime tower?" -msgstr "Для плавного таймлапса требуется черновая башня. На модели без использования черновой башни могут быть дефекты. Вы хотите включить черновую башню?" +msgstr "" +"Нажмите, чтобы сбросить все настройки до последнего сохраненного профиля." msgid "" -"We have added an experimental style \"Tree Slim\" that features smaller support volume but weaker strength.\n" +"Prime tower is required for smooth timeplase. There may be flaws on the " +"model without prime tower. Are you sure you want to disable prime tower?" +msgstr "" +"Для плавного таймлапса требуется черновая башня. На модели без использования " +"черновой башни могут быть дефекты. Вы уверены, что хотите отключить черновую " +"башню?" + +msgid "" +"Prime tower is required for smooth timelapse. There may be flaws on the " +"model without prime tower. Do you want to enable prime tower?" +msgstr "" +"Для плавного таймлапса требуется черновая башня. На модели без использования " +"черновой башни могут быть дефекты. Вы хотите включить черновую башню?" + +msgid "Still print by object?" +msgstr "" + +msgid "" +"We have added an experimental style \"Tree Slim\" that features smaller " +"support volume but weaker strength.\n" "We recommend using it with: 0 interface layers, 0 top distance, 2 walls." -msgstr "Мы добавили экспериментальный стиль «Стройный (древ. поддержка)», который отличается меньшим объёмом поддержки, а следовательно, и меньшей прочностью. Мы рекомендуем использовать его со следующими параметрами: количество связующих слоёв - 0, зазор поддержки сверху - 0, периметров - 2." +msgstr "" +"Мы добавили экспериментальный стиль «Стройный (древ. поддержка)», который " +"отличается меньшим объёмом поддержки, а следовательно, и меньшей прочностью. " +"Мы рекомендуем использовать его со следующими параметрами: количество " +"связующих слоёв - 0, зазор поддержки сверху - 0, периметров - 2." msgid "" "Change these settings automatically? \n" @@ -5286,7 +6154,10 @@ msgstr "" "Да - Изменить эти настройки автоматически\n" "Нет - Не изменять эти настройки" -msgid "For \"Tree Strong\" and \"Tree Hybrid\" styles, we recommend the following settings: at least 2 interface layers, at least 0.1mm top z distance or using support materials on interface." +msgid "" +"For \"Tree Strong\" and \"Tree Hybrid\" styles, we recommend the following " +"settings: at least 2 interface layers, at least 0.1mm top z distance or " +"using support materials on interface." msgstr "" "Для стилей «Крепкий (древ. поддержка)» и «Гибридный (древ. поддержка)» \n" "мы рекомендуем следующие параметры: \n" @@ -5295,8 +6166,10 @@ msgstr "" "или использование «материалов для поддержек» в качестве связующего слоя." msgid "" -"When using support material for the support interface, We recommend the following settings:\n" -"0 top z distance, 0 interface spacing, concentric pattern and disable independent support layer height" +"When using support material for the support interface, We recommend the " +"following settings:\n" +"0 top z distance, 0 interface spacing, concentric pattern and disable " +"independent support layer height" msgstr "" "При использовании «материалов для поддержек» в качестве связующего \n" "слоя поддержки, мы рекомендуем следующие параметры:\n" @@ -5306,11 +6179,29 @@ msgstr "" "отключение независимой высоты слоя поддержки." msgid "" -"When recording timelapse without toolhead, it is recommended to add a \"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add Primitive\"->\"Timelapse Wipe Tower\"." +"Layer height exceeds the limit in Printer Settings -> Extruder -> Layer " +"height limits ,this may cause printing quality issues." msgstr "" -"При записи таймлапса без видимости головы рекомендуется добавить «Черновая башня таймлапса». \n" -"Щелкните правой кнопкой мыши на пустом месте стола и выберите «Добавить примитив» -> «Черновая башня таймлапса»." + +msgid "Adjust to the set range automatically? \n" +msgstr "" + +msgid "Adjust" +msgstr "" + +msgid "Ignore" +msgstr "" + +msgid "" +"When recording timelapse without toolhead, it is recommended to add a " +"\"Timelapse Wipe Tower\" \n" +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." +msgstr "" +"При записи таймлапса без видимости головы рекомендуется добавить «Черновая " +"башня таймлапса». \n" +"Щелкните правой кнопкой мыши на пустом месте стола и выберите «Добавить " +"примитив» -> «Черновая башня таймлапса»." msgid "Line width" msgstr "Ширина экструзии" @@ -5324,6 +6215,15 @@ msgstr "Точность" msgid "Wall generator" msgstr "Генератор периметров" +msgid "Walls and surfaces" +msgstr "" + +msgid "Bridging" +msgstr "" + +msgid "Overhangs" +msgstr "" + msgid "Walls" msgstr "Периметры" @@ -5339,8 +6239,16 @@ msgstr "Скорость печати других слоёв" msgid "Overhang speed" msgstr "Скорость печати нависаний" -msgid "This is the speed for various overhang degrees. Overhang degrees are expressed as a percentage of line width. 0 speed means no slowing down for the overhang degree range and wall speed is used" -msgstr "Скорость печати нависаний разной степени свеса. Размер этого свеса выражается в процентах от ширины линии. Скорость 0 означает, что для данного диапазона нависаний замедление отсутствует и используется скорость периметра. Скорость для промежуточных значений рассчитывается с помощью линейной интерполяции." +msgid "" +"This is the speed for various overhang degrees. Overhang degrees are " +"expressed as a percentage of line width. 0 speed means no slowing down for " +"the overhang degree range and wall speed is used" +msgstr "" +"Скорость печати нависаний разной степени свеса. Размер этого свеса " +"выражается в процентах от ширины линии. Скорость 0 означает, что для данного " +"диапазона нависаний замедление отсутствует и используется скорость " +"периметра. Скорость для промежуточных значений рассчитывается с помощью " +"линейной интерполяции." msgid "Bridge" msgstr "Мосты" @@ -5363,6 +6271,9 @@ msgstr "Подложка" msgid "Support filament" msgstr "Пруток для поддержки" +msgid "Tree supports" +msgstr "Древовидная поддержка" + msgid "Prime tower" msgstr "Черновая башня" @@ -5384,19 +6295,24 @@ msgstr "Частые" #, c-format, boost-format msgid "" "Following line %s contains reserved keywords.\n" -"Please remove it, or will beat G-code visualization and printing time estimation." +"Please remove it, or will beat G-code visualization and printing time " +"estimation." msgid_plural "" "Following lines %s contain reserved keywords.\n" -"Please remove them, or will beat G-code visualization and printing time estimation." +"Please remove them, or will beat G-code visualization and printing time " +"estimation." msgstr[0] "" "Следующая строка %s содержит зарезервированные ключевые слова.\n" -"Пожалуйста, удалите их, иначе будет нарушена визуализация G-кода и оценка времени печати." +"Пожалуйста, удалите их, иначе будет нарушена визуализация G-кода и оценка " +"времени печати." msgstr[1] "" "Следующие строки %s содержат зарезервированные ключевые слова.\n" -"Пожалуйста, удалите их, иначе будет нарушена визуализация G-кода и оценка времени печати." +"Пожалуйста, удалите их, иначе будет нарушена визуализация G-кода и оценка " +"времени печати." msgstr[2] "" "Следующие строки %s содержат зарезервированные ключевые слова.\n" -"Пожалуйста, удалите их, иначе будет нарушена визуализация G-кода и оценка времени печати." +"Пожалуйста, удалите их, иначе будет нарушена визуализация G-кода и оценка " +"времени печати." msgid "Reserved keywords found" msgstr "Найдены зарезервированные ключевые слова" @@ -5414,10 +6330,12 @@ msgid "Recommended nozzle temperature" msgstr "Рекомендуемая температура сопла" msgid "Recommended nozzle temperature range of this filament. 0 means no set" -msgstr "Рекомендуемый диапазон температуры сопла для данной пластиковой нити. 0 значит не задано." +msgstr "" +"Рекомендуемый диапазон температуры сопла для данной пластиковой нити. 0 " +"значит не задано." -msgid "Recommended temperature range" -msgstr "Рекомендуемый диапазон температур" +msgid "Print chamber temperature" +msgstr "Температура в термокамере" msgid "Print temperature" msgstr "Температура печати" @@ -5431,26 +6349,46 @@ msgstr "Температура сопла при печати" msgid "Cool plate" msgstr "Не нагреваемая пластина" -msgid "Bed temperature when cool plate is installed. Value 0 means the filament does not support to print on the Cool Plate" -msgstr "Температура не подогреваемого стола. 0 означает, что пластиковая нить не поддерживает печать на этой печатной пластине." +msgid "" +"Bed temperature when cool plate is installed. Value 0 means the filament " +"does not support to print on the Cool Plate" +msgstr "" +"Температура не подогреваемого стола. 0 означает, что пластиковая нить не " +"поддерживает печать на этой печатной пластине." msgid "Engineering plate" msgstr "Инженерная пластина" -msgid "Bed temperature when engineering plate is installed. Value 0 means the filament does not support to print on the Engineering Plate" -msgstr "Температура стола при установленной инженерной печатной пластине. 0 означает, что пластиковая нить не поддерживает печать на этой печатной пластине." +msgid "" +"Bed temperature when engineering plate is installed. Value 0 means the " +"filament does not support to print on the Engineering Plate" +msgstr "" +"Температура стола при установленной инженерной печатной пластине. 0 " +"означает, что пластиковая нить не поддерживает печать на этой печатной " +"пластине." -msgid "High Temp Plate" -msgstr "Высокотемпературная пластина" +msgid "Smooth PEI Plate / High Temp Plate" +msgstr "Гладкая PEI/высокотемпер. пластина" -msgid "Bed temperature when high temperature plate is installed. Value 0 means the filament does not support to print on the High Temp Plate" -msgstr "Температура стола при установленной высокотемпературной печатной пластине. 0 означает, что пластиковая нить не поддерживает печать на этой печатной пластине." +msgid "" +"Bed temperature when Smooth PEI Plate/High temperature plate is installed. " +"Value 0 means the filament does not support to print on the Smooth PEI Plate/" +"High Temp Plate" +msgstr "" +"Температура стола при установленной гладкой PEI/высокотемпературный печатной " +"пластине. 0 означает, что пластиковая нить не поддерживает печать на этой " +"печатной пластине." msgid "Textured PEI Plate" msgstr "Текстурированная PEI пластина" -msgid "Bed temperature when Textured PEI Plate is installed. Value 0 means the filament does not support to print on the Textured PEI Plate" -msgstr "Температура стола при установленной текстурированной пластите с PEI покрытием. 0 означает, что пластиковая нить не поддерживает печать на этой печатной пластине." +msgid "" +"Bed temperature when Textured PEI Plate is installed. Value 0 means the " +"filament does not support to print on the Textured PEI Plate" +msgstr "" +"Температура стола при установленной текстурированной пластите с PEI " +"покрытием. 0 означает, что пластиковая нить не поддерживает печать на этой " +"печатной пластине." msgid "Volumetric speed limitation" msgstr "Ограничение объёмной скорости" @@ -5467,24 +6405,63 @@ msgstr "Вентилятор обдува модели" msgid "Min fan speed threshold" msgstr "Порог мин. скорости вентилятора" -msgid "Part cooling fan speed will start to run at min speed when the estimated layer time is no longer than the layer time in setting. When layer time is shorter than threshold, fan speed is interpolated between the minimum and maximum fan speed according to layer printing time" -msgstr "Вентилятор для охлаждения моделей начнет работать с минимальной скоростью, когда расчётное время печати слоя не превышает заданное время печати слоя. Если время печати слоя меньше порогового значения, скорость вентилятора интерполируется между минимальной и максимальной скоростью вентилятора в зависимости от времени печати слоя." +msgid "" +"Part cooling fan speed will start to run at min speed when the estimated " +"layer time is no longer than the layer time in setting. When layer time is " +"shorter than threshold, fan speed is interpolated between the minimum and " +"maximum fan speed according to layer printing time" +msgstr "" +"Вентилятор для охлаждения моделей начнет работать с минимальной скоростью, " +"когда расчётное время печати слоя не превышает заданное время печати слоя. " +"Если время печати слоя меньше порогового значения, скорость вентилятора " +"интерполируется между минимальной и максимальной скоростью вентилятора в " +"зависимости от времени печати слоя." msgid "Max fan speed threshold" msgstr "Порог макс. скорости вентилятора" -msgid "Part cooling fan speed will be max when the estimated layer time is shorter than the setting value" -msgstr "Скорость вентилятора для охлаждения детали будет максимальной, если расчётное время печати слоя меньше установленного значения." +msgid "" +"Part cooling fan speed will be max when the estimated layer time is shorter " +"than the setting value" +msgstr "" +"Скорость вентилятора для охлаждения детали будет максимальной, если " +"расчётное время печати слоя меньше установленного значения." msgid "Auxiliary part cooling fan" msgstr "Вспомогательный вентилятор для охлаждения моделей" +msgid "Exhaust fan" +msgstr "Вытяжной вентилятор" + +msgid "During print" +msgstr "Во время печати" + +msgid "Complete print" +msgstr "После завершения печати" + msgid "Filament start G-code" msgstr "Стартовый G-код прутка" msgid "Filament end G-code" msgstr "Завершающий G-код прутка" +msgid "Multimaterial" +msgstr "Экструдер ММ" + +msgid "Wipe tower parameters" +msgstr "Параметры черновой башни" + +msgid "Toolchange parameters with single extruder MM printers" +msgstr "" +"Параметры смены инструмента в одноэкструдерных мультиматериальных принтерах" + +msgid "Ramming settings" +msgstr "Настройки рэмминга" + +msgid "Toolchange parameters with multi extruder MM printers" +msgstr "" +"Параметры смены инструмента в мультиэкструдерных мультиматериальных принтерах" + msgid "Printable space" msgstr "Область печати" @@ -5509,12 +6486,18 @@ msgstr "Стартовый G-код принтера" msgid "Machine end G-code" msgstr "Завершающий G-код принтера" +msgid "Printing by object G-code" +msgstr "" + msgid "Before layer change G-code" msgstr "G-код выполняемый перед сменой слоя" msgid "Layer change G-code" msgstr "G-код выполняемый при смене слоя" +msgid "Time lapse G-code" +msgstr "G-код таймлапса" + msgid "Change filament G-code" msgstr "G-код выполняемый при смене прутка" @@ -5542,6 +6525,15 @@ msgstr "Ограничение ускорений" msgid "Jerk limitation" msgstr "Ограничение рывка" +msgid "Single extruder multimaterial setup" +msgstr "Мультиматериальный одиночный экструдер" + +msgid "Wipe tower" +msgstr "Черновая башня" + +msgid "Single extruder multimaterial parameters" +msgstr "Параметры мультиматериального одиночного экструдера" + msgid "Layer height limits" msgstr "Ограничение высоты слоя" @@ -5566,21 +6558,42 @@ msgstr "Откат из прошивки" msgid "Detached" msgstr "Отсоединён" +#, c-format, boost-format +msgid "" +"%d Filament Preset and %d Process Preset is attached to this printer. Those " +"presets would be deleted if the printer is deleted." +msgstr "" + +msgid "Presets inherited by other presets can not be deleted!" +msgstr "" + +msgid "The following presets inherit this preset." +msgid_plural "The following preset inherits this preset." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#. TRN Remove/Delete +#, boost-format +msgid "%1% Preset" +msgstr "%1% профиль" + msgid "Following preset will be deleted too." msgid_plural "Following presets will be deleted too." msgstr[0] "Следующий профиль также будет удалён." msgstr[1] "Следующие профили также будут удалены." msgstr[2] "Следующие профили также будут удалены." +msgid "" +"Are you sure to delete the selected preset? \n" +"If the preset corresponds to a filament currently in use on your printer, " +"please reset the filament information for that slot." +msgstr "" + #, boost-format msgid "Are you sure to %1% the selected preset?" msgstr "%1% выбранный профиль?" -#. TRN Remove/Delete -#, boost-format -msgid "%1% Preset" -msgstr "%1% профиль" - msgid "All" msgstr "Все" @@ -5602,7 +6615,7 @@ msgstr "Не задано" msgid "Unsaved Changes" msgstr "Несохранённые изменения" -msgid "Discard or Keep changes" +msgid "Transfer or discard changes" msgstr "Отклонить или сохранить изменения" msgid "Old Value" @@ -5659,24 +6672,34 @@ msgid "Preset \"%1%\" contains the following unsaved changes:" msgstr "Профиль \"%1%\" имеет следующие несохранённые изменения:" #, boost-format -msgid "Preset \"%1%\" is not compatible with the new printer profile and it contains the following unsaved changes:" -msgstr "Профиль \"%1%\" несовместим с новым профилем принтера, и имеет следующие несохранённые изменения:" +msgid "" +"Preset \"%1%\" is not compatible with the new printer profile and it " +"contains the following unsaved changes:" +msgstr "" +"Профиль \"%1%\" несовместим с новым профилем принтера, и имеет следующие " +"несохранённые изменения:" #, boost-format -msgid "Preset \"%1%\" is not compatible with the new process profile and it contains the following unsaved changes:" -msgstr "Профиль \"%1%\" несовместим с новым профилем процесса, и имеет следующие несохранённые изменения:" +msgid "" +"Preset \"%1%\" is not compatible with the new process profile and it " +"contains the following unsaved changes:" +msgstr "" +"Профиль \"%1%\" несовместим с новым профилем процесса, и имеет следующие " +"несохранённые изменения:" #, boost-format msgid "" "You have changed some settings of preset \"%1%\". \n" -"Would you like to keep these changed settings (new value) after switching preset?" +"Would you like to keep these changed settings (new value) after switching " +"preset?" msgstr "" "Вы изменили некоторые параметры профиля \"%1%\". \n" "Хотите сохранить эти изменения (новые значения)?" msgid "" "You have changed some preset settings. \n" -"Would you like to keep these changed settings (new value) after switching preset?" +"Would you like to keep these changed settings (new value) after switching " +"preset?" msgstr "" "Вы изменили некоторые параметры профиля.\n" "Хотите сохранить эти изменения (новые значения)?" @@ -5776,14 +6799,54 @@ msgstr "Текущая конфигурация не требует обновл msgid "Ramming customization" msgstr "Настройки рэмминга" -msgid "Auto-Calc" -msgstr "Авторасчёт" +msgid "" +"Ramming denotes the rapid extrusion just before a tool change in a single-" +"extruder MM printer. Its purpose is to properly shape the end of the " +"unloaded filament so it does not prevent insertion of the new filament and " +"can itself be reinserted later. This phase is important and different " +"materials can require different extrusion speeds to get the good shape. For " +"this reason, the extrusion rates during ramming are adjustable.\n" +"\n" +"This is an expert-level setting, incorrect adjustment will likely lead to " +"jams, extruder wheel grinding into filament etc." +msgstr "" +"Рэмминг (ramming, дословно утрамбовка) означает быстрое экструдирование " +"непосредственно перед сменой инструмента в одноэкструдерном " +"мультиматериальном принтере. Цель процесса состоит в том, чтобы правильно " +"сформировать конец выгружаемого прутка, чтобы он не препятствовал вставке " +"нового прутка или этого же прутка, вставленного позже. Эта фаза важна и " +"разные материалы могут потребовать разных скоростей экструзии, чтобы " +"получить хорошую форму. По этой причине скорость экструзии во время рэмминга " +"регулируется.\n" +"\n" +"Эта опция для опытных пользователей, неправильная настройка может привести к " +"замятию, протиранию прутка приводом экструдера и т.д." + +msgid "Total ramming time" +msgstr "Общее время рэмминга" + +msgid "s" +msgstr "с" + +msgid "Total rammed volume" +msgstr "Общий объём при рэмминге" + +msgid "Ramming line width" +msgstr "Ширина линии при рэмминге" + +msgid "Ramming line spacing" +msgstr "Расстояние между линиями при рэмминге" + +msgid "Recalculate" +msgstr "" msgid "Flushing volumes for filament change" msgstr "Объёмы очистки при смене пластиковой нити" -msgid "Multiplier" -msgstr "Множитель" +msgid "" +"Orca recalculates your flushing volumes everytime the filament colors " +"change. You can change this behavior in Preferences." +msgstr "" msgid "Flushing volume (mm³) for each filament pair." msgstr "" @@ -5798,14 +6861,8 @@ msgstr "Рекомендуемый объём очистки в диапазон msgid "The multiplier should be in range [%.2f, %.2f]." msgstr "Множитель должен находиться в диапазоне [%.2f - %.2f]." -msgid "unloaded" -msgstr "выгрузку" - -msgid "loaded" -msgstr "загрузку" - -msgid "Filament #" -msgstr "Пруток #" +msgid "Multiplier" +msgstr "Множитель" msgid "From" msgstr "С" @@ -5813,11 +6870,18 @@ msgstr "С" msgid "To" msgstr "На" +msgid "Bambu Network plug-in not detected." +msgstr "" + +msgid "Click here to download it." +msgstr "" + msgid "Login" msgstr "Войти" msgid "The configuration package is changed in previous Config Guide" -msgstr "Пакет конфигурации был изменён при предыдущем запуске мастера настройки." +msgstr "" +"Пакет конфигурации был изменён при предыдущем запуске мастера настройки." msgid "Configuration package changed" msgstr "Пакет конфигурации изменён" @@ -5848,6 +6912,9 @@ msgstr "" "Показать/Скрыть диалоговое окно настроек \n" "устройств 3Dconnexion" +msgid "Switch table page" +msgstr "" + msgid "Show keyboard shortcuts list" msgstr "Показать список сочетаний клавиш" @@ -5872,8 +6939,14 @@ msgstr "Shift+A" msgid "Shift+R" msgstr "Shift+R" -msgid "Auto orientates selected objects or all objects.If there are selected objects, it just orientates the selected ones.Otherwise, it will orientates all objects in the current disk." -msgstr "Автоориентация выбранных или всех моделей. При выбранных моделях, ориентируются только они, противном случае ориентируются все модели на текущем столе." +msgid "" +"Auto orientates selected objects or all objects.If there are selected " +"objects, it just orientates the selected ones.Otherwise, it will orientates " +"all objects in the current disk." +msgstr "" +"Автоориентация выбранных или всех моделей. При выбранных моделях, " +"ориентируются только они, противном случае ориентируются все модели на " +"текущем столе." msgid "Shift+Tab" msgstr "Shift+Tab" @@ -5998,9 +7071,6 @@ msgstr "Гизмо рисования шва (FDM)" msgid "Swtich between Prepare/Prewview" msgstr "Переключение между окном подготовки и окном предпросмотра нарезки" -msgid "Switch between Prepare/Prewview" -msgstr "Переключение между окном подготовки и окном предпросмотра нарезки" - msgid "Plater" msgstr "Печатная пластина" @@ -6062,7 +7132,8 @@ msgid "Horizontal slider - Move active thumb Right" msgstr "Горизонтальный ползунок - Сдвинуть активный ползунок вправо" msgid "On/Off one layer mode of the vertical slider" -msgstr "Включение/Отключение функции «Режим одного слоя» у вертикального ползунка" +msgstr "" +"Включение/Отключение функции «Режим одного слоя» у вертикального ползунка" msgid "On/Off g-code window" msgstr "Показать/скрыть окно отображения G-кода" @@ -6083,27 +7154,42 @@ msgstr "Информация об обновлении версии %s:" msgid "Network plug-in update" msgstr "Обновление сетевого плагина" -msgid "Click OK to update the Network plug-in when Bambu Studio launches next time." -msgstr "Нажмите OK, чтобы обновить сетевой плагин при следующем запуске Bambu Studio." +msgid "" +"Click OK to update the Network plug-in when Orca Slicer launches next time." +msgstr "" +"Нажмите OK, чтобы обновить сетевой плагин при следующем запуске Orca Slicer." #, c-format, boost-format msgid "A new Network plug-in(%s) available, Do you want to install it?" msgstr "Доступен новый сетевой плагин (%s). Хотите установить?" -msgid "New version of Bambu Studio" -msgstr "Доступна новая версия Bambu Studio" +msgid "New version of Orca Slicer" +msgstr "Доступна новая версия Orca Slicer" -msgid "Don't remind me of this version again" -msgstr "Больше не напоминай об этой версии" +msgid "Skip this Version" +msgstr "" + +msgid "Done" +msgstr "Готово" + +msgid "Confirm and Update Nozzle" +msgstr "" msgid "LAN Connection Failed (Sending print file)" msgstr "Сбой подключения к локальной сети (отправка файла на печать)" -msgid "Step 1, please confirm Bambu Studio and your printer are in the same LAN." -msgstr "Шаг 1. Пожалуйста, убедитесь, что Bambu Studio и ваш принтер находятся в одной локальной сети." +msgid "" +"Step 1, please confirm Orca Slicer and your printer are in the same LAN." +msgstr "" +"Шаг 1. Пожалуйста, убедитесь, что Orca Slicer и ваш принтер находятся в " +"одной локальной сети." -msgid "Step 2, if the IP and Access Code below are different from the actual values on your printer, please correct them." -msgstr "Шаг 2. Если приведенный ниже IP-адрес и код доступа отличаются от фактических значений на вашем принтере, пожалуйста, исправьте их." +msgid "" +"Step 2, if the IP and Access Code below are different from the actual values " +"on your printer, please correct them." +msgstr "" +"Шаг 2. Если приведенный ниже IP-адрес и код доступа отличаются от " +"фактических значений на вашем принтере, пожалуйста, исправьте их." msgid "IP" msgstr "IP" @@ -6114,8 +7200,22 @@ msgstr "Код доступа" msgid "Where to find your printer's IP and Access Code?" msgstr "Где найти IP-адрес и код доступа к вашему принтеру?" -msgid "Error: IP or Access Code are not correct" -msgstr "Ошибка: неверный IP-адрес или код доступа" +msgid "Step 3: Ping the IP address to check for packet loss and latency." +msgstr "" + +msgid "Test" +msgstr "Тест" + +msgid "IP and Access Code Verified! You may close the window" +msgstr "" + +msgid "Connection failed, please double check IP and Access Code" +msgstr "" + +msgid "" +"Connection failed! If your IP and Access Code is correct, \n" +"please move to step 3 for troubleshooting network issues" +msgstr "" msgid "Model:" msgstr "Модель:" @@ -6135,6 +7235,9 @@ msgstr "Печать" msgid "Idle" msgstr "Простой" +msgid "Beta version" +msgstr "" + msgid "Latest version" msgstr "Последняя версия" @@ -6147,14 +7250,30 @@ msgstr "Сбой при обновлении" msgid "Updating successful" msgstr "Обновление успешно выполнено" -msgid "Are you sure you want to update? This will take about 10 minutes. Do not turn off the power while the printer is updating." -msgstr "Вы уверены, что хотите обновить? Это займёт около 10 минут. Не выключайте питание во время обновления принтера." +msgid "" +"Are you sure you want to update? This will take about 10 minutes. Do not " +"turn off the power while the printer is updating." +msgstr "" +"Вы уверены, что хотите обновить? Это займёт около 10 минут. Не выключайте " +"питание во время обновления принтера." -msgid "An important update was detected and needs to be run before printing can continue. Do you want to update now? You can also update later from 'Upgrade firmware'." -msgstr "Было обнаружено важное обновление, которое необходимо установить перед продолжением печати. Хотите обновиться сейчас? Обновление можно выполнить и позже, нажав «Обновить прошивку»." +msgid "" +"An important update was detected and needs to be run before printing can " +"continue. Do you want to update now? You can also update later from 'Upgrade " +"firmware'." +msgstr "" +"Было обнаружено важное обновление, которое необходимо установить перед " +"продолжением печати. Хотите обновиться сейчас? Обновление можно выполнить и " +"позже, нажав «Обновить прошивку»." -msgid "The firmware version is abnormal. Repairing and updating are required before printing. Do you want to update now? You can also update later on printer or update next time starting the studio." -msgstr "Ошибка в версии прошивки. Перед печатью её необходимо исправить и обновить. Хотите обновить сейчас? Вы можете сделать это позже с принтера или при следующем запуске программы." +msgid "" +"The firmware version is abnormal. Repairing and updating are required before " +"printing. Do you want to update now? You can also update later on printer or " +"update next time starting the studio." +msgstr "" +"Ошибка в версии прошивки. Перед печатью её необходимо исправить и обновить. " +"Хотите обновить сейчас? Вы можете сделать это позже с принтера или при " +"следующем запуске программы." msgid "Extension Board" msgstr "Плата расширения" @@ -6212,7 +7331,8 @@ msgid "Copying of file %1% to %2% failed: %3%" msgstr "Не удалось скопировать файл %1% в %2%: %3%" msgid "Need to check the unsaved changes before configuration updates." -msgstr "Перед обновлением конфигурации необходимо проверить несохранённые изменения." +msgstr "" +"Перед обновлением конфигурации необходимо проверить несохранённые изменения." msgid "Configuration package updated to " msgstr "Пакет конфигурации обновлён до " @@ -6220,8 +7340,12 @@ msgstr "Пакет конфигурации обновлён до " msgid "Open G-code file:" msgstr "Выберите G-код файл:" -msgid "One object has empty initial layer and can't be printed. Please Cut the bottom or enable supports." -msgstr "Одна модель имеет пустой начальный слой и не может быть напечатана. Пожалуйста, обрежьте нижнюю часть или включите поддержки." +msgid "" +"One object has empty initial layer and can't be printed. Please Cut the " +"bottom or enable supports." +msgstr "" +"Одна модель имеет пустой начальный слой и не может быть напечатана. " +"Пожалуйста, обрежьте нижнюю часть или включите поддержки." #, boost-format msgid "Object can't be printed for empty layer between %1% and %2%." @@ -6231,8 +7355,12 @@ msgstr "Модель не может быть напечатан из-за пу msgid "Object: %1%" msgstr "Модель: %1%" -msgid "Maybe parts of the object at these height are too thin, or the object has faulty mesh" -msgstr "Возможно, части модели на этой высоте слишком тонкие, или она имеет дефектную сетку." +msgid "" +"Maybe parts of the object at these height are too thin, or the object has " +"faulty mesh" +msgstr "" +"Возможно, части модели на этой высоте слишком тонкие, или она имеет " +"дефектную сетку." msgid "No object can be printed. Maybe too small" msgstr "Печать моделей невозможна. Возможно, они слишком маленькие." @@ -6240,10 +7368,14 @@ msgstr "Печать моделей невозможна. Возможно, он msgid "" "Failed to generate gcode for invalid custom G-code.\n" "\n" -msgstr "Не удалось сгенерировать G-код из-за недопустимого пользовательского G-кода.\n" +msgstr "" +"Не удалось сгенерировать G-код из-за недопустимого пользовательского G-" +"кода.\n" msgid "Please check the custom G-code or use the default custom G-code." -msgstr "Пожалуйста, проверьте пользовательский G-код или используйте пользовательский G-код по умолчанию." +msgstr "" +"Пожалуйста, проверьте пользовательский G-код или используйте " +"пользовательский G-код по умолчанию." #, boost-format msgid "Generating G-code: layer %1%" @@ -6290,7 +7422,15 @@ msgstr "Множитель" #, boost-format msgid "Failed to calculate line width of %1%. Can not get value of \"%2%\" " -msgstr "Не удалось вычислить ширину линии %1%. Не удается получить значение \"%2%\". " +msgstr "" +"Не удалось вычислить ширину линии %1%. Не удается получить значение \"%2%\". " + +msgid "" +"Invalid spacing supplied to Flow::with_spacing(), check your layer height " +"and extrusion width" +msgstr "" +"Для Flow::with_spacing () был указан недопустимый интервал. Проверьте высоту " +"слоя и ширину экструзии." msgid "undefined error" msgstr "неопределённая ошибка" @@ -6386,67 +7526,158 @@ msgid "write callback failed" msgstr "ошибка записи функции обратного вызова" #, boost-format -msgid "%1% is too close to exclusion area, there may be collisions when printing." -msgstr "%1% находится слишком близко к области исключения, что может привести к столкновению при печати." +msgid "" +"%1% is too close to exclusion area, there may be collisions when printing." +msgstr "" +"%1% находится слишком близко к области исключения, что может привести к " +"столкновению при печати." #, boost-format msgid "%1% is too close to others, and collisions may be caused." -msgstr "%1% находится слишком близко к другим, что может привести к столкновению." +msgstr "" +"%1% находится слишком близко к другим, что может привести к столкновению." #, boost-format msgid "%1% is too tall, and collisions will be caused." msgstr "%1% слишком высокий, что может привести к столкновению." msgid " is too close to others, there may be collisions when printing." -msgstr " находится слишком близко к другим моделям, что может привести к столкновению при печати." +msgstr "" +" находится слишком близко к другим моделям, что может привести к " +"столкновению при печати." msgid " is too close to exclusion area, there may be collisions when printing." -msgstr " находится слишком близко к области исключения, что может привести к столкновению при печати." +msgstr "" +" находится слишком близко к области исключения, что может привести к " +"столкновению при печати." msgid "Prime Tower" msgstr "Черновая башня" msgid " is too close to others, and collisions may be caused.\n" -msgstr " находится слишком близко к другим моделям, что может привести к столкновению.\n" +msgstr "" +" находится слишком близко к другим моделям, что может привести к " +"столкновению.\n" msgid " is too close to exclusion area, and collisions will be caused.\n" -msgstr " находится слишком близко к области исключения, что может привести к столкновению.\n" +msgstr "" +" находится слишком близко к области исключения, что может привести к " +"столкновению.\n" -msgid "Can not print multiple filaments which have large difference of temperature together. Otherwise, the extruder and nozzle may be blocked or damaged during printing" -msgstr "Не допускается совместная печать несколькими материалами, имеющими большую разницу в температуре печати. Это может привести к засорению и повреждению сопла и экструдера." +msgid "" +"Can not print multiple filaments which have large difference of temperature " +"together. Otherwise, the extruder and nozzle may be blocked or damaged " +"during printing" +msgstr "" +"Не допускается совместная печать несколькими материалами, имеющими большую " +"разницу в температуре печати. Это может привести к засорению и повреждению " +"сопла и экструдера." msgid "No extrusions under current settings." msgstr "При текущих настройках экструзия отсутствует." -msgid "Smooth mode of timelapse is not supported when \"by object\" sequence is enabled." -msgstr "Плавный режим таймлапса не поддерживается, когда включена последовательность печати моделей по очереди." +msgid "" +"Smooth mode of timelapse is not supported when \"by object\" sequence is " +"enabled." +msgstr "" +"Плавный режим таймлапса не поддерживается, когда включена последовательность " +"печати моделей по очереди." -msgid "Please select \"By object\" print sequence to print multiple objects in spiral vase mode." -msgstr "Выберите последовательность печати «По очереди», для поддержки печати несколько моделей в режиме спиральной вазы." +msgid "" +"Please select \"By object\" print sequence to print multiple objects in " +"spiral vase mode." +msgstr "" +"Выберите последовательность печати «По очереди», для поддержки печати " +"несколько моделей в режиме спиральной вазы." -msgid "The spiral vase mode does not work when an object contains more than one materials." -msgstr "Режим «Спиральная ваза» не работает, когда модель печатается несколькими материалами." +msgid "" +"The spiral vase mode does not work when an object contains more than one " +"materials." +msgstr "" +"Режим «Спиральная ваза» не работает, когда модель печатается несколькими " +"материалами." + +#, boost-format +msgid "The object %1% exceeds the maximum build volume height." +msgstr "Высота модели %1% превышает максимально допустимую." + +#, boost-format +msgid "" +"While the object %1% itself fits the build volume, its last layer exceeds " +"the maximum build volume height." +msgstr "" +"Хотя сама модель %1% вписывается в область построения, её последний слой " +"превышает максимальную высоту области построения." + +msgid "" +"You might want to reduce the size of your model or change current print " +"settings and retry." +msgstr "" +"Попробуйте уменьшить размер модели или изменить текущие настройки печати и " +"повторить попытку." + +msgid "Variable layer height is not supported with Organic supports." +msgstr "" +"Функция переменной высоты слоя не совместима органическими поддержками." + +msgid "" +"Different nozzle diameters and different filament diameters is not allowed " +"when prime tower is enabled." +msgstr "" + +msgid "" +"The Wipe Tower is currently only supported with the relative extruder " +"addressing (use_relative_e_distances=1)." +msgstr "" + +msgid "" +"Ooze prevention is currently not supported with the prime tower enabled." +msgstr "" + +msgid "" +"The prime tower is currently only supported for the Marlin, RepRap/Sprinter, " +"RepRapFirmware and Repetier G-code flavors." +msgstr "" msgid "The prime tower is not supported in \"By object\" print." msgstr "Черновая башня не поддерживается при печати в режиме «По очереди»." -msgid "The prime tower is not supported when adaptive layer height is on. It requires that all objects have the same layer height." -msgstr "Черновой башни не поддерживается, когда включена функция переменной высоты слоя. Требуется, чтобы все модели имели одинаковую высоту слоя." +msgid "" +"The prime tower is not supported when adaptive layer height is on. It " +"requires that all objects have the same layer height." +msgstr "" +"Черновой башни не поддерживается, когда включена функция переменной высоты " +"слоя. Требуется, чтобы все модели имели одинаковую высоту слоя." msgid "The prime tower requires \"support gap\" to be multiple of layer height" -msgstr "Для черновой башни требуется, чтобы зазор поддержки был кратен высоте слоя." +msgstr "" +"Для черновой башни требуется, чтобы зазор поддержки был кратен высоте слоя." msgid "The prime tower requires that all objects have the same layer heights" -msgstr "Для использования черновой башни требуется, чтобы у всех моделей была одинаковая высота слоя." +msgstr "" +"Для использования черновой башни требуется, чтобы у всех моделей была " +"одинаковая высота слоя." -msgid "The prime tower requires that all objects are printed over the same number of raft layers" -msgstr "Для черновой башни требуется, чтобы все модели были напечатаны на одинаковом количестве слоёв подложки." +msgid "" +"The prime tower requires that all objects are printed over the same number " +"of raft layers" +msgstr "" +"Для черновой башни требуется, чтобы все модели были напечатаны на одинаковом " +"количестве слоёв подложки." -msgid "The prime tower requires that all objects are sliced with the same layer heights." -msgstr "Для использования черновой башни требуется, чтобы все модели были нарезаны с одинаковой высотой слоя." +msgid "" +"The prime tower requires that all objects are sliced with the same layer " +"heights." +msgstr "" +"Для использования черновой башни требуется, чтобы все модели были нарезаны с " +"одинаковой высотой слоя." -msgid "The prime tower is only supported if all objects have the same variable layer height" -msgstr "Для черновой башни требуется, чтобы все модели имели одинаковую переменную высоту слоя." +msgid "" +"The prime tower is only supported if all objects have the same variable " +"layer height" +msgstr "" +"Для черновой башни требуется, чтобы все модели имели одинаковую переменную " +"высоту слоя." msgid "Too small line width" msgstr "Слишком маленькая ширина экструзии" @@ -6454,38 +7685,67 @@ msgstr "Слишком маленькая ширина экструзии" msgid "Too large line width" msgstr "Слишком большая ширина экструзии" -msgid "The prime tower requires that support has the same layer height with object." -msgstr "Для черновой башни требуется, чтобы поддержка и модель имели одинаковую высоту слоя." - -msgid "Tree supports" -msgstr "Древовидная поддержка" +msgid "" +"The prime tower requires that support has the same layer height with object." +msgstr "" +"Для черновой башни требуется, чтобы поддержка и модель имели одинаковую " +"высоту слоя." # ??? -msgid "Organic support tree tip diameter must not be smaller than support material extrusion width." -msgstr "Диаметр кончика ветки органической поддержки не должен быть меньше значения ширины экструзии поддержки." +msgid "" +"Organic support tree tip diameter must not be smaller than support material " +"extrusion width." +msgstr "" +"Диаметр кончика ветки органической поддержки не должен быть меньше значения " +"ширины экструзии поддержки." # ??? -msgid "Organic support branch diameter must not be smaller than 2x support material extrusion width." -msgstr "Диаметр ветки органической поддержки должен быть хотя бы в два раза больше значения ширины экструзии поддержки." +msgid "" +"Organic support branch diameter must not be smaller than 2x support material " +"extrusion width." +msgstr "" +"Диаметр ветки органической поддержки должен быть хотя бы в два раза больше " +"значения ширины экструзии поддержки." # ??? -msgid "Organic support branch diameter must not be smaller than support tree tip diameter." -msgstr "Диаметр ветвей органической поддержки должен быть больше диаметра кончика ветки." +msgid "" +"Organic support branch diameter must not be smaller than support tree tip " +"diameter." +msgstr "" +"Диаметр ветвей органической поддержки должен быть больше диаметра кончика " +"ветки." -msgid "Support enforcers are used but support is not enabled. Please enable support." -msgstr "Используется принудительная поддержка, но её генерация не включена. Пожалуйста, включите генерацию поддержки в настройках слайсера." +msgid "" +"Support enforcers are used but support is not enabled. Please enable support." +msgstr "" +"Используется принудительная поддержка, но её генерация не включена. " +"Пожалуйста, включите генерацию поддержки в настройках слайсера." msgid "Layer height cannot exceed nozzle diameter" msgstr "Высота слоя не может быть больше диаметра сопла" -msgid "Relative extruder addressing requires resetting the extruder position at each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to layer_gcode." -msgstr "При относительной адресации экструдера его положение необходимо корректировать на каждом слое, чтобы предотвратить потерю точности с плавающей запятой. Добавьте \"G92 E0\" в layer_gcode." +msgid "" +"Relative extruder addressing requires resetting the extruder position at " +"each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to " +"layer_gcode." +msgstr "" +"При относительной адресации экструдера его положение необходимо " +"корректировать на каждом слое, чтобы предотвратить потерю точности с " +"плавающей запятой. Добавьте \"G92 E0\" в layer_gcode." -msgid "\"G92 E0\" was found in before_layer_gcode, which is incompatible with absolute extruder addressing." -msgstr "В before_layer_gcode была найдена команда \"G92 E0\", которая несовместима с абсолютной адресацией экструдера." +msgid "" +"\"G92 E0\" was found in before_layer_gcode, which is incompatible with " +"absolute extruder addressing." +msgstr "" +"В before_layer_gcode была найдена команда \"G92 E0\", которая несовместима с " +"абсолютной адресацией экструдера." -msgid "\"G92 E0\" was found in layer_gcode, which is incompatible with absolute extruder addressing." -msgstr "В layer_gcode была найдена команда \"G92 E0\", которая несовместима с абсолютной адресацией экструдера." +msgid "" +"\"G92 E0\" was found in layer_gcode, which is incompatible with absolute " +"extruder addressing." +msgstr "" +"В layer_gcode была найдена команда \"G92 E0\", которая несовместима с " +"абсолютной адресацией экструдера." #, c-format, boost-format msgid "Plate %d: %s does not support filament %s" @@ -6509,8 +7769,15 @@ msgstr "Область печати" msgid "Bed exclude area" msgstr "Область исключения" -msgid "Unprintable area in XY plane. For example, X1 Series printers use the front left corner to cut filament during filament change. The area is expressed as polygon by points in following format: \"XxY, XxY, ...\"" -msgstr "Непечатаемая область в плоскости XY. Например, в принтерах серии X1 передний левый угол используется для обрезания материала при его замене. Область выражается в виде многоугольника по точкам в следующем формате: \"XxY, XxY, ...\"" +msgid "" +"Unprintable area in XY plane. For example, X1 Series printers use the front " +"left corner to cut filament during filament change. The area is expressed as " +"polygon by points in following format: \"XxY, XxY, ...\"" +msgstr "" +"Непечатаемая область в плоскости XY. Например, в принтерах серии X1 передний " +"левый угол используется для обрезания материала при его замене. Область " +"выражается в виде многоугольника по точкам в следующем формате: \"XxY, " +"XxY, ...\"" msgid "Bed custom texture" msgstr "Пользовательская текстура стола" @@ -6521,11 +7788,35 @@ msgstr "Пользовательская модель стола" msgid "Elephant foot compensation" msgstr "Компенсация «слоновьей ноги»" -msgid "Shrink the initial layer on build plate to compensate for elephant foot effect" -msgstr "Уменьшение первого слоя в плоскости XY на заданное значение, чтобы компенсировать эффект слоновьей ноги." +msgid "" +"Shrink the initial layer on build plate to compensate for elephant foot " +"effect" +msgstr "" +"Уменьшение первого слоя в плоскости XY на заданное значение, чтобы " +"компенсировать эффект слоновьей ноги." -msgid "Slicing height for each layer. Smaller layer height means more accurate and more printing time" -msgstr "Высота каждого слоя. Чем меньше значение, тем лучше качество, но требуется больше времени для печати, и наоборот." +msgid "Elephant foot compensation layers" +msgstr "Компенсирующих слоёв «слоновьей ноги»" + +msgid "" +"The number of layers on which the elephant foot compensation will be active. " +"The first layer will be shrunk by the elephant foot compensation value, then " +"the next layers will be linearly shrunk less, up to the layer indicated by " +"this value." +msgstr "" +"Количество слоёв, на которые будет распространяться компенсация слоновьей " +"ноги. Первый слой будет уменьшен на величину компенсации слоновьей ноги с " +"последующим линейным уменьшением до слоя, указанного здесь." + +msgid "layers" +msgstr "слой(-я)" + +msgid "" +"Slicing height for each layer. Smaller layer height means more accurate and " +"more printing time" +msgstr "" +"Высота каждого слоя. Чем меньше значение, тем лучше качество, но требуется " +"больше времени для печати, и наоборот." msgid "Printable height" msgstr "Высота печати" @@ -6533,26 +7824,49 @@ msgstr "Высота печати" msgid "Maximum printable height which is limited by mechanism of printer" msgstr "Максимальная высота печати, которая ограничена механикой принтера." +msgid "Preferred orientation" +msgstr "" + +msgid "Automatically orient stls on the Z-axis upon initial import" +msgstr "" + msgid "Printer preset names" msgstr "Имена профиля принтера" msgid "Hostname, IP or URL" msgstr "Имя хоста, IP/URL-адрес" -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. Print host behind HAProxy with basic auth enabled can be accessed by putting the user name and password into the URL in the following format: https://username:password@your-octopi-address/" -msgstr "Slic3r может загружать файл G-кода на хост принтера. В этом поле нужно указать имя хоста, IP-адрес или URL-адрес хост-экземпляра печати. Доступ к узлу печати на основе HAProxy с включенной базовой аутентификацией можно получить, указав имя пользователя и пароль в поле URL-адрес в следующем формате: https://username:password@your-octopi-address" +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. Print host " +"behind HAProxy with basic auth enabled can be accessed by putting the user " +"name and password into the URL in the following format: https://username:" +"password@your-octopi-address/" +msgstr "" +"Slic3r может загружать файл G-кода на хост принтера. В этом поле нужно " +"указать имя хоста, IP-адрес или URL-адрес хост-экземпляра печати. Доступ к " +"узлу печати на основе HAProxy с включенной базовой аутентификацией можно " +"получить, указав имя пользователя и пароль в поле URL-адрес в следующем " +"формате: https://username:password@your-octopi-address" msgid "Device UI" msgstr "URL-адрес хоста" -msgid "Specify the URL of your device user interface if it's not same as print_host" -msgstr "Укажите URL-адрес пользовательского интерфейса вашего устройства, если он не совпадает с print_host" +msgid "" +"Specify the URL of your device user interface if it's not same as print_host" +msgstr "" +"Укажите URL-адрес пользовательского интерфейса вашего устройства, если он не " +"совпадает с print_host" msgid "API Key / Password" msgstr "API-ключ/Пароль" -msgid "Slic3r can upload G-code files to a printer host. This field should contain the API Key or the password required for authentication." -msgstr "Slic3r может загружать файл G-кода на хост принтера. Это поле должно содержать API ключ или пароль, необходимые для проверки подлинности." +msgid "" +"Slic3r can upload G-code files to a printer host. This field should contain " +"the API Key or the password required for authentication." +msgstr "" +"Slic3r может загружать файл G-кода на хост принтера. Это поле должно " +"содержать API ключ или пароль, необходимые для проверки подлинности." msgid "Name of the printer" msgstr "Название принтера" @@ -6560,8 +7874,14 @@ msgstr "Название принтера" msgid "HTTPS CA File" msgstr "Файл корневого сертификата HTTPS" -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 "Для подключений по HTTPS к OctoPrint укажите пользовательский файл корневого сертификата в формате crt/pem. Если оставить поле пустым, будет использоваться хранилище сертификатов ОС по умолчанию." +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 "" +"Для подключений по HTTPS к OctoPrint укажите пользовательский файл корневого " +"сертификата в формате crt/pem. Если оставить поле пустым, будет " +"использоваться хранилище сертификатов ОС по умолчанию." msgid "User" msgstr "Пользователь" @@ -6572,8 +7892,14 @@ msgstr "Пароль" msgid "Ignore HTTPS certificate revocation checks" msgstr "Игнорировать проверки отзыва HTTPS сертификата" -msgid "Ignore HTTPS certificate revocation checks in case of missing or offline distribution points. One may want to enable this option for self signed certificates if connection fails." -msgstr "Игнорировать проверки отзыва HTTPS сертификата в случае его отсутствия или автономности точек распространения. Можно включить эту опцию для самоподписанных сертификатов в случае сбоя подключения." +msgid "" +"Ignore HTTPS certificate revocation checks in case of missing or offline " +"distribution points. One may want to enable this option for self signed " +"certificates if connection fails." +msgstr "" +"Игнорировать проверки отзыва HTTPS сертификата в случае его отсутствия или " +"автономности точек распространения. Можно включить эту опцию для " +"самоподписанных сертификатов в случае сбоя подключения." msgid "Names of presets related to the physical printer" msgstr "Имена профилей, связанных с физическим принтером" @@ -6591,13 +7917,24 @@ msgid "Avoid crossing wall" msgstr "Избегать пересечения периметров" msgid "Detour and avoid to travel across wall which may cause blob on surface" -msgstr "Объезжать и избегать пересечения периметров, для предотвращения образования дефектов на поверхности модели." +msgstr "" +"Объезжать и избегать пересечения периметров, для предотвращения образования " +"дефектов на поверхности модели." msgid "Avoid crossing wall - Max detour length" msgstr "Избегать пересечения периметров - Макс. длина обхода" -msgid "Maximum detour distance for avoiding crossing wall. Don't detour if the detour distance is large than this value. Detour length could be specified either as an absolute value or as percentage (for example 50%) of a direct travel path. Zero to disable" -msgstr "Максимальное расстояние обхода сопла от модели во избежание пересечения периметров при движении. Если расстояние обхода превышает это значение, то для данного маршрута эта опция не применяется. Длина обхода может быть задана как в абсолютном значении, так и в процентах (например, 50%) от прямого пути перемещения. 0 - отключено." +msgid "" +"Maximum detour distance for avoiding crossing wall. Don't detour if the " +"detour distance is large than this value. Detour length could be specified " +"either as an absolute value or as percentage (for example 50%) of a direct " +"travel path. Zero to disable" +msgstr "" +"Максимальное расстояние обхода сопла от модели во избежание пересечения " +"периметров при движении. Если расстояние обхода превышает это значение, то " +"для данного маршрута эта опция не применяется. Длина обхода может быть " +"задана как в абсолютном значении, так и в процентах (например, 50%) от " +"прямого пути перемещения. 0 - отключено." msgid "mm or %" msgstr "мм или %" @@ -6605,20 +7942,36 @@ msgstr "мм или %" msgid "Other layers" msgstr "Последующие слои" -msgid "Bed temperature for layers except the initial one. Value 0 means the filament does not support to print on the Cool Plate" -msgstr "Температура стола для всех слоёв, кроме первого. 0 означает, что пластиковая нить не поддерживает печать на этой печатной пластине." +msgid "" +"Bed temperature for layers except the initial one. Value 0 means the " +"filament does not support to print on the Cool Plate" +msgstr "" +"Температура стола для всех слоёв, кроме первого. 0 означает, что пластиковая " +"нить не поддерживает печать на этой печатной пластине." msgid "°C" msgstr "°C" -msgid "Bed temperature for layers except the initial one. Value 0 means the filament does not support to print on the Engineering Plate" -msgstr "Температура стола для всех слоёв, кроме первого. 0 означает, что пластиковая нить не поддерживает печать на этой печатной пластине." +msgid "" +"Bed temperature for layers except the initial one. Value 0 means the " +"filament does not support to print on the Engineering Plate" +msgstr "" +"Температура стола для всех слоёв, кроме первого. 0 означает, что пластиковая " +"нить не поддерживает печать на этой печатной пластине." -msgid "Bed temperature for layers except the initial one. Value 0 means the filament does not support to print on the High Temp Plate" -msgstr "Температура стола для всех слоёв, кроме первого. 0 означает, что пластиковая нить не поддерживает печать на этой печатной пластине." +msgid "" +"Bed temperature for layers except the initial one. Value 0 means the " +"filament does not support to print on the High Temp Plate" +msgstr "" +"Температура стола для всех слоёв, кроме первого. 0 означает, что пластиковая " +"нить не поддерживает печать на этой печатной пластине." -msgid "Bed temperature for layers except the initial one. Value 0 means the filament does not support to print on the Textured PEI Plate" -msgstr "Температура стола для всех слоёв, кроме первого. 0 означает, что пластиковая нить не поддерживает печать на этой печатной пластине." +msgid "" +"Bed temperature for layers except the initial one. Value 0 means the " +"filament does not support to print on the Textured PEI Plate" +msgstr "" +"Температура стола для всех слоёв, кроме первого. 0 означает, что пластиковая " +"нить не поддерживает печать на этой печатной пластине." msgid "Initial layer" msgstr "Первый слой" @@ -6626,17 +7979,33 @@ msgstr "Первый слой" msgid "Initial layer bed temperature" msgstr "Температура стола для первого слоя" -msgid "Bed temperature of the initial layer. Value 0 means the filament does not support to print on the Cool Plate" -msgstr "Температура стола для первого слоя. 0 означает, что пластиковая нить не поддерживает печать на этой печатной пластине." +msgid "" +"Bed temperature of the initial layer. Value 0 means the filament does not " +"support to print on the Cool Plate" +msgstr "" +"Температура стола для первого слоя. 0 означает, что пластиковая нить не " +"поддерживает печать на этой печатной пластине." -msgid "Bed temperature of the initial layer. Value 0 means the filament does not support to print on the Engineering Plate" -msgstr "Температура стола для первого слоя. 0 означает, что пластиковая нить не поддерживает печать на этой печатной пластине." +msgid "" +"Bed temperature of the initial layer. Value 0 means the filament does not " +"support to print on the Engineering Plate" +msgstr "" +"Температура стола для первого слоя. 0 означает, что пластиковая нить не " +"поддерживает печать на этой печатной пластине." -msgid "Bed temperature of the initial layer. Value 0 means the filament does not support to print on the High Temp Plate" -msgstr "Температура стола для первого слоя. 0 означает, что пластиковая нить не поддерживает печать на этой печатной пластине." +msgid "" +"Bed temperature of the initial layer. Value 0 means the filament does not " +"support to print on the High Temp Plate" +msgstr "" +"Температура стола для первого слоя. 0 означает, что пластиковая нить не " +"поддерживает печать на этой печатной пластине." -msgid "Bed temperature of the initial layer. Value 0 means the filament does not support to print on the Textured PEI Plate" -msgstr "Температура стола для первого слоя. 0 означает, что пластиковая нить не поддерживает печать на этой печатной пластине." +msgid "" +"Bed temperature of the initial layer. Value 0 means the filament does not " +"support to print on the Textured PEI Plate" +msgstr "" +"Температура стола для первого слоя. 0 означает, что пластиковая нить не " +"поддерживает печать на этой печатной пластине." msgid "Bed types supported by the printer" msgstr "Типы столов, поддерживаемые принтером" @@ -6651,104 +8020,253 @@ msgid "First layer print sequence" msgstr "Последовательность печати первого слоя" msgid "This G-code is inserted at every layer change before lifting z" -msgstr "Этот G-код вставляется при каждой смене слоя, непосредственно перед перемещения оси Z." +msgstr "" +"Этот G-код вставляется при каждой смене слоя, непосредственно перед " +"перемещения оси Z." msgid "Bottom shell layers" msgstr "Сплошных слоёв снизу" -msgid "This is the number of solid layers of bottom shell, including the bottom surface layer. When the thickness calculated by this value is thinner than bottom shell thickness, the bottom shell layers will be increased" -msgstr "Количество сплошных слоёв при печати нижней поверхности модели, включая нижний поверхностный слой. Если толщина, рассчитанная с помощью этого значения, меньше толщины оболочки снизу, количество слоёв оболочки снизу будет увеличено." +msgid "" +"This is the number of solid layers of bottom shell, including the bottom " +"surface layer. When the thickness calculated by this value is thinner than " +"bottom shell thickness, the bottom shell layers will be increased" +msgstr "" +"Количество сплошных слоёв при печати нижней поверхности модели, включая " +"нижний поверхностный слой. Если толщина, рассчитанная с помощью этого " +"значения, меньше толщины оболочки снизу, количество слоёв оболочки снизу " +"будет увеличено." msgid "Bottom shell thickness" msgstr "Толщина оболочки снизу" -msgid "The number of bottom solid layers is increased when slicing if the thickness calculated by bottom shell layers is thinner than this value. This can avoid having too thin shell when layer height is small. 0 means that this setting is disabled and thickness of bottom shell is absolutely determained by bottom shell layers" +msgid "" +"The number of bottom solid layers is increased when slicing if the thickness " +"calculated by bottom shell layers is thinner than this value. This can avoid " +"having too thin shell when layer height is small. 0 means that this setting " +"is disabled and thickness of bottom shell is absolutely determained by " +"bottom shell layers" msgstr "" -"Минимальная толщина оболочки снизу в мм. Если толщина оболочки, рассчитанная по количеству сплошных слоёв снизу, меньше этого значения, количество сплошных слоёв снизу будет автоматически увеличено при нарезке, для удовлетворения минимальной толщины оболочки. Это позволяет избежать слишком тонкой оболочки при небольшой высоте слоя. 0 означает, что этот параметр отключён, а толщина оболочки " -"снизу полностью задаётся количеством сплошных слоёв снизу." +"Минимальная толщина оболочки снизу в мм. Если толщина оболочки, рассчитанная " +"по количеству сплошных слоёв снизу, меньше этого значения, количество " +"сплошных слоёв снизу будет автоматически увеличено при нарезке, для " +"удовлетворения минимальной толщины оболочки. Это позволяет избежать слишком " +"тонкой оболочки при небольшой высоте слоя. 0 означает, что этот параметр " +"отключён, а толщина оболочки снизу полностью задаётся количеством сплошных " +"слоёв снизу." msgid "Force cooling for overhang and bridge" msgstr "Принудительный обдув навесов и мостов" -msgid "Enable this option to optimize part cooling fan speed for overhang and bridge to get better cooling" -msgstr "Включите, чтобы оптимизировать скорость вентилятора охлаждения моделей для нависаний и мостов для обеспечения лучшего их охлаждения." +msgid "" +"Enable this option to optimize part cooling fan speed for overhang and " +"bridge to get better cooling" +msgstr "" +"Включите, чтобы оптимизировать скорость вентилятора охлаждения моделей для " +"нависаний и мостов для обеспечения лучшего их охлаждения." msgid "Fan speed for overhang" msgstr "Скорость вентилятора на нависанияx" -msgid "Force part cooling fan to be this speed when printing bridge or overhang wall which has large overhang degree. Forcing cooling for overhang and bridge can get better quality for these part" -msgstr "Заставляет вентилятор обдува модели работать на этой скорости при печати мостов или нависающих периметров, имеющих большую степень свеса. Принудительное охлаждение позволяет повысить качество печати этих частей." +msgid "" +"Force part cooling fan to be this speed when printing bridge or overhang " +"wall which has large overhang degree. Forcing cooling for overhang and " +"bridge can get better quality for these part" +msgstr "" +"Заставляет вентилятор обдува модели работать на этой скорости при печати " +"мостов или нависающих периметров, имеющих большую степень свеса. " +"Принудительное охлаждение позволяет повысить качество печати этих частей." msgid "Cooling overhang threshold" msgstr "Порог включения обдува на нависаниях" -msgid "Force cooling fan to be specific speed when overhang degree of printed part exceeds this value. Expressed as percentage which indicides how much width of the line without support from lower layer. 0% means forcing cooling for all outer wall no matter how much overhang degree" -msgstr "Принудительное включение вентилятора обдува модели на определенную скорость, если степень нависания печатаемой части превышает данное значение. Выражается в процентах и показывает, насколько велика ширина периметра без поддержки со стороны нижнего слоя. 0% означает принудительное охлаждение всего внешнего периметра независимо от величина свеса." +#, fuzzy, c-format +msgid "" +"Force cooling fan to be specific speed when overhang degree of printed part " +"exceeds this value. Expressed as percentage which indicides how much width " +"of the line without support from lower layer. 0% means forcing cooling for " +"all outer wall no matter how much overhang degree" +msgstr "" +"Принудительное включение вентилятора обдува модели на определенную скорость, " +"если степень нависания печатаемой части превышает данное значение. " +"Выражается в процентах и показывает, насколько велика ширина периметра без " +"поддержки со стороны нижнего слоя. 0% означает принудительное охлаждение " +"всего внешнего периметра независимо от величина свеса." msgid "Bridge infill direction" msgstr "Угол печати мостов" -msgid "Bridging angle override. If left to zero, the bridging angle will be calculated automatically. Otherwise the provided angle will be used for external bridges. Use 180°for zero angle." -msgstr "Переопределение угла печати мостов. Если задано 0, угол печати мостов рассчитывается автоматически. В противном случае заданный угол будет использоваться для наружных мостов. Для нулевого угла установите 180°." +msgid "" +"Bridging angle override. If left to zero, the bridging angle will be " +"calculated automatically. Otherwise the provided angle will be used for " +"external bridges. Use 180°for zero angle." +msgstr "" +"Переопределение угла печати мостов. Если задано 0, угол печати мостов " +"рассчитывается автоматически. В противном случае заданный угол будет " +"использоваться для наружных мостов. Для нулевого угла установите 180°." msgid "Bridge density" msgstr "Плотность мостов" msgid "Density of external bridges. 100% means solid bridge. Default is 100%." -msgstr "Плотность наружных мостов. 100% - сплошной мост. По умолчанию задано 100%." +msgstr "" +"Плотность наружных мостов. 100% - сплошной мост. По умолчанию задано 100%." -msgid "Bridge flow" +msgid "Bridge flow ratio" msgstr "Поток при печати мостов" -msgid "Decrease this value slightly(for example 0.9) to reduce the amount of material for bridge, to improve sag" -msgstr "Параметр задаёт количество пластика, затрачиваемое для построения мостов. В большинстве случаев настроек по умолчанию достаточно, тем не менее, при печати некоторых моделей уменьшение параметра может сократить провисание пластика при печати мостов." +msgid "" +"Decrease this value slightly(for example 0.9) to reduce the amount of " +"material for bridge, to improve sag" +msgstr "" +"Параметр задаёт количество пластика, затрачиваемое для построения мостов. В " +"большинстве случаев настроек по умолчанию достаточно, тем не менее, при " +"печати некоторых моделей уменьшение параметра может сократить провисание " +"пластика при печати мостов." + +msgid "Internal bridge flow ratio" +msgstr "" + +msgid "" +"This value governs the thickness of the internal bridge layer. This is the " +"first layer over sparse infill. Decrease this value slightly (for example " +"0.9) to improve surface quality over sparse infill." +msgstr "" msgid "Top surface flow ratio" msgstr "Коэффициент потока на верхней поверхности" -msgid "This factor affects the amount of material for top solid infill. You can decrease it slightly to have smooth surface finish" -msgstr "Этот параметр задаёт количество выдавливаемого материала для верхнего сплошного слоя заполнения. Вы можете немного уменьшить его, чтобы получить более гладкую поверхность." +msgid "" +"This factor affects the amount of material for top solid infill. You can " +"decrease it slightly to have smooth surface finish" +msgstr "" +"Этот параметр задаёт количество выдавливаемого материала для верхнего " +"сплошного слоя заполнения. Вы можете немного уменьшить его, чтобы получить " +"более гладкую поверхность." msgid "Bottom surface flow ratio" msgstr "Коэффициент потока на нижней поверхности" msgid "This factor affects the amount of material for bottom solid infill" -msgstr "Этот параметр задаёт количество выдавливаемого материала для нижнего сплошного слоя заполнения." +msgstr "" +"Этот параметр задаёт количество выдавливаемого материала для нижнего " +"сплошного слоя заполнения." msgid "Precise wall(experimental)" msgstr "Точные периметры (экспериментально)" -msgid "Improve shell precision by adjusting outer wall spacing. This also improves layer consistency." -msgstr "Повышение точности оболочки за счет регулировки расстояния между внешними стенками. Это также позволяет уменьшить расслоение слоёв." +msgid "" +"Improve shell precision by adjusting outer wall spacing. This also improves " +"layer consistency." +msgstr "" +"Повышение точности оболочки за счет регулировки расстояния между внешними " +"стенками. Это также позволяет уменьшить расслоение слоёв." msgid "Only one wall on top surfaces" msgstr "Только один периметр на верхней поверхности" -msgid "Use only one wall on flat top surface, to give more space to the top infill pattern" -msgstr "Печатать только один периметр на верхней поверхности, чтобы оставить больше пространства для верхнего шаблона заполнения." +msgid "" +"Use only one wall on flat top surface, to give more space to the top infill " +"pattern" +msgstr "" +"Печатать только один периметр на верхней поверхности, чтобы оставить больше " +"пространства для верхнего шаблона заполнения." msgid "One wall threshold" msgstr "Порог одного периметра" +#, fuzzy, c-format, boost-format msgid "" -"If a top surface has to be printed and it's partially covered by another layer, it won't be considered at a top layer where its width is below this value. This can be useful to not let the 'one perimeter on top' trigger on surface that should be covered only by perimeters. This value can be a mm or a % of the perimeter extrusion width.\n" -"Warning: If enabled, artifacts can be created is you have some thin features on the next layer, like letters. Set this setting to 0 to remove these artifacts." +"If a top surface has to be printed and it's partially covered by another " +"layer, it won't be considered at a top layer where its width is below this " +"value. This can be useful to not let the 'one perimeter on top' trigger on " +"surface that should be covered only by perimeters. This value can be a mm or " +"a % of the perimeter extrusion width.\n" +"Warning: If enabled, artifacts can be created is you have some thin features " +"on the next layer, like letters. Set this setting to 0 to remove these " +"artifacts." msgstr "" -"Если должна быть напечатана верхняя поверхность и частично покрыта другим слоем, она не будет рассматриваться как верхний слой, ширина которого ниже этого значения. Это может быть полезно, чтобы не допустить срабатывания функции «Только один периметр на верхней поверхности» на поверхности, которая должна быть покрыта только периметрами. Это значение может быть задано в мм или % от ширины " -"экструзии периметра.\n" -"Предупреждение: если этот параметр включён, то могут возникнуть артефакты, если у вас на следующем слое имеются какие-то тонкие элементы, например, буквы. Установите значение 0, чтобы убрать эти артефакты." +"Если должна быть напечатана верхняя поверхность и частично покрыта другим " +"слоем, она не будет рассматриваться как верхний слой, ширина которого ниже " +"этого значения. Это может быть полезно, чтобы не допустить срабатывания " +"функции «Только один периметр на верхней поверхности» на поверхности, " +"которая должна быть покрыта только периметрами. Это значение может быть " +"задано в мм или % от ширины экструзии периметра.\n" +"Предупреждение: если этот параметр включён, то могут возникнуть артефакты, " +"если у вас на следующем слое имеются какие-то тонкие элементы, например, " +"буквы. Установите значение 0, чтобы убрать эти артефакты." msgid "Only one wall on first layer" msgstr "Только один периметр на первом слое" -msgid "Use only one wall on first layer, to give more space to the bottom infill pattern" -msgstr "Печатать только один периметр на первом слое, чтобы оставить больше пространства для нижнего шаблона заполнения." +msgid "" +"Use only one wall on first layer, to give more space to the bottom infill " +"pattern" +msgstr "" +"Печатать только один периметр на первом слое, чтобы оставить больше " +"пространства для нижнего шаблона заполнения." msgid "Extra perimeters on overhangs" msgstr "Дополнительные периметры на нависаниях" -msgid "Create additional perimeter paths over steep overhangs and areas where bridges cannot be anchored. " -msgstr "Создание дополнительных дорожек по периметру над крутыми нависаниями и участками, где мосты не могут быть закреплены." +msgid "" +"Create additional perimeter paths over steep overhangs and areas where " +"bridges cannot be anchored. " +msgstr "" +"Создание дополнительных дорожек по периметру над крутыми нависаниями и " +"участками, где мосты не могут быть закреплены." + +# от Overhang reversal +# Реверс на нечётных слоях +msgid "Reverse on odd" +msgstr "Реверс на нависаниях" + +msgid "Overhang reversal" +msgstr "Реверс на нависаниях" + +msgid "" +"Extrude perimeters that have a part over an overhang in the reverse " +"direction on odd layers. This alternating pattern can drastically improve " +"steep overhangs.\n" +"\n" +"This setting can also help reduce part warping due to the reduction of " +"stresses in the part walls." +msgstr "" + +msgid "Reverse only internal perimeters" +msgstr "" + +msgid "" +"Apply the reverse perimeters logic only on internal perimeters. \n" +"\n" +"This setting greatly reduces part stresses as they are now distributed in " +"alternating directions. This should reduce part warping while also " +"maintaining external wall quality. This feature can be very useful for warp " +"prone material, like ABS/ASA, and also for elastic filaments, like TPU and " +"Silk PLA. It can also help reduce warping on floating regions over " +"supports.\n" +"\n" +"For this setting to be the most effective, it is recomended to set the " +"Reverse Threshold to 0 so that all internal walls print in alternating " +"directions on odd layers irrespective of their overhang degree." +msgstr "" + +# от Overhang reversal threshold +msgid "Reverse threshold" +msgstr "Порог для реверса" + +msgid "Overhang reversal threshold" +msgstr "Порог разворота на свесах" + +#, fuzzy, c-format, boost-format +msgid "" +"Number of mm the overhang need to be for the reversal to be considered " +"useful. Can be a % of the perimeter width.\n" +"Value 0 enables reversal on every odd layers regardless." +msgstr "" +"Величина свеса периметра при которой она считается достаточной для активации " +"функции реверса печати нависаний.\n" +"Может быть задано как в процентах, так и в миллиметрах от ширины периметра." msgid "Classic mode" msgstr "Классический режим" @@ -6762,6 +8280,17 @@ msgstr "Замедляться при печати нависаний" msgid "Enable this option to slow printing down for different overhang degree" msgstr "Включение динамического управления скоростью печати нависаний." +# ??? Замедление печати на изогнутых периметров +msgid "Slow down for curled perimeters" +msgstr "Снижение скорости на изогнутых периметрах" + +msgid "" +"Enable this option to slow printing down in areas where potential curled " +"perimeters may exist" +msgstr "" +"Включите эту опцию для замедления печати в тех областях, где потенциально " +"могут возникать изогнутые периметры." + msgid "mm/s or %" msgstr "мм/с или %" @@ -6777,8 +8306,12 @@ msgstr "мм/с" msgid "Internal" msgstr "Внутренние" -msgid "Speed of internal bridge. If the value is expressed as a percentage, it will be calculated based on the bridge_speed. Default value is 150%." -msgstr "Скорость печати внутреннего моста. Если задано в процентах, то значение вычисляться относительно bridge_speed. Значение по умолчанию равно 150%." +msgid "" +"Speed of internal bridge. If the value is expressed as a percentage, it will " +"be calculated based on the bridge_speed. Default value is 150%." +msgstr "" +"Скорость печати внутреннего моста. Если задано в процентах, то значение " +"вычисляться относительно bridge_speed. Значение по умолчанию равно 150%." msgid "Brim width" msgstr "Ширина каймы" @@ -6789,13 +8322,20 @@ msgstr "Расстояние от модели до внешней линии к msgid "Brim type" msgstr "Тип каймы" -msgid "This controls the generation of the brim at outer and/or inner side of models. Auto means the brim width is analysed and calculated automatically." -msgstr "Этот параметр управляет формированием каймы на внешней/внутренней стороне моделей. Авто означает, что ширина каймы анализируется и рассчитывается автоматически." +msgid "" +"This controls the generation of the brim at outer and/or inner side of " +"models. Auto means the brim width is analysed and calculated automatically." +msgstr "" +"Этот параметр управляет формированием каймы на внешней/внутренней стороне " +"моделей. Авто означает, что ширина каймы анализируется и рассчитывается " +"автоматически." msgid "Brim-object gap" msgstr "Смещение каймы" -msgid "A gap between innermost brim line and object can make brim be removed more easily" +msgid "" +"A gap between innermost brim line and object can make brim be removed more " +"easily" msgstr "Смещение каймы от печатаемой модели, может облегчить её удаление." msgid "Brim ears" @@ -6820,10 +8360,12 @@ msgid "Brim ear detection radius" msgstr "Радиус обнаружения ушек каймы" msgid "" -"The geometry will be decimated before dectecting sharp angles. This parameter indicates the minimum length of the deviation for the decimation.\n" +"The geometry will be decimated before dectecting sharp angles. This " +"parameter indicates the minimum length of the deviation for the decimation.\n" "0 to deactivate" msgstr "" -"Геометрия модели будет упрощена перед обнаружением острых углов. Этот параметр задаёт минимальную длину отклонения для её упрощения.\n" +"Геометрия модели будет упрощена перед обнаружением острых углов. Этот " +"параметр задаёт минимальную длину отклонения для её упрощения.\n" "Установите 0 для отключения." msgid "Compatible machine" @@ -6853,14 +8395,24 @@ msgstr "По очереди" msgid "Slow printing down for better layer cooling" msgstr "Замедлять печать для лучшего охлаждения слоёв" -msgid "Enable this option to slow printing speed down to make the final layer time not shorter than the layer time threshold in \"Max fan speed threshold\", so that layer can be cooled for longer time. This can improve the cooling quality for needle and small details" -msgstr "Включите эту опцию для разрешения замедления скорости печати в зависимости от времени печати слоя, чтобы слой мог охлаждаться дольше. Это позволяет улучшить качество охлаждения острых концов и мелких деталей." +msgid "" +"Enable this option to slow printing speed down to make the final layer time " +"not shorter than the layer time threshold in \"Max fan speed threshold\", so " +"that layer can be cooled for longer time. This can improve the cooling " +"quality for needle and small details" +msgstr "" +"Включите эту опцию для разрешения замедления скорости печати в зависимости " +"от времени печати слоя, чтобы слой мог охлаждаться дольше. Это позволяет " +"улучшить качество охлаждения острых концов и мелких деталей." msgid "Normal printing" msgstr "Ускорение по умолчанию" -msgid "The default acceleration of both normal printing and travel except initial layer" -msgstr "Ускорение по умолчанию для обычной печати и перемещения, кроме первого слоя." +msgid "" +"The default acceleration of both normal printing and travel except initial " +"layer" +msgstr "" +"Ускорение по умолчанию для обычной печати и перемещения, кроме первого слоя." msgid "mm/s²" msgstr "мм/с²" @@ -6869,40 +8421,90 @@ msgid "Default filament profile" msgstr "Профиль прутка по умолчанию" msgid "Default filament profile when switch to this machine profile" -msgstr "Профиль пластиковой нити по умолчанию при переключении на этот профиль принтера." +msgstr "" +"Профиль пластиковой нити по умолчанию при переключении на этот профиль " +"принтера." msgid "Default process profile" msgstr "Профиль процесса по умолчанию" msgid "Default process profile when switch to this machine profile" -msgstr "Профиль процесса по умолчанию при переключении на этот профиль принтера." +msgstr "" +"Профиль процесса по умолчанию при переключении на этот профиль принтера." + +msgid "Activate air filtration" +msgstr "Вкл. фильтрацию воздуха" + +msgid "Activate for better air filtration. G-code command: M106 P3 S(0-255)" +msgstr "" +"Активировать для лучшей фильтрации воздуха. G-код команда: M106 P3 S(0-255)" + +msgid "Fan speed" +msgstr "Скорость вентилятора" + +msgid "" +"Speed of exhuast fan during printing.This speed will overwrite the speed in " +"filament custom gcode" +msgstr "" +"Скорость вытяжного вентилятора во время печати. Эта скорость будет " +"переопределять скорость в пользовательском стартовом G-коде материала" + +msgid "Speed of exhuast fan after printing completes" +msgstr "Скорость вытяжного вентилятора после завершения печати" msgid "No cooling for the first" msgstr "Не включать вентилятор на первых" -msgid "Close all cooling fan for the first certain layers. Cooling fan of the first layer used to be closed to get better build plate adhesion" -msgstr "Вы можете задать положительное значение, чтобы отключить все вентиляторы охлаждения модели при печати первых нескольких слоёв, чтобы не ухудшить адгезию к столу." - -msgid "layers" -msgstr "слой(-я)" +msgid "" +"Close all cooling fan for the first certain layers. Cooling fan of the first " +"layer used to be closed to get better build plate adhesion" +msgstr "" +"Вы можете задать положительное значение, чтобы отключить все вентиляторы " +"охлаждения модели при печати первых нескольких слоёв, чтобы не ухудшить " +"адгезию к столу." msgid "Don't support bridges" msgstr "Не печатать поддержки под мостами" -msgid "Don't support the whole bridge area which make support very large. Bridge usually can be printing directly without support if not very long" -msgstr "Опция, препятствующая печати поддержки под мостами. Мост обычно можно печатать без поддержки, если он не очень длинный." +msgid "" +"Don't support the whole bridge area which make support very large. Bridge " +"usually can be printing directly without support if not very long" +msgstr "" +"Опция, препятствующая печати поддержки под мостами. Мост обычно можно " +"печатать без поддержки, если он не очень длинный." msgid "Thick bridges" msgstr "Толстые мосты" -msgid "If enabled, bridges are more reliable, can bridge longer distances, but may look worse. If disabled, bridges look better but are reliable just for shorter bridged distances." -msgstr "Если включено, мосты печатаются более надежные и на большие расстояния. Если отключено, мосты выглядят лучше, но они надежны только на коротких расстояниях." +msgid "" +"If enabled, bridges are more reliable, can bridge longer distances, but may " +"look worse. If disabled, bridges look better but are reliable just for " +"shorter bridged distances." +msgstr "" +"Если включено, мосты печатаются более надежные и на большие расстояния. Если " +"отключено, мосты выглядят лучше, но они надежны только на коротких " +"расстояниях." + +msgid "Thick internal bridges" +msgstr "" + +msgid "" +"If enabled, thick internal bridges will be used. It's usually recommended to " +"have this feature turned on. However, consider turning it off if you are " +"using large nozzles." +msgstr "" msgid "Max bridge length" msgstr "Максимальная длина моста" -msgid "Max length of bridges that don't need support. Set it to 0 if you want all bridges to be supported, and set it to a very large value if you don't want any bridges to be supported." -msgstr "Максимальная длина мостов, не нуждающихся в поддержке. Установите 0, если требуется поддержка всех мостов, или очень большое значение, если поддержка мостов не требуется." +msgid "" +"Max length of bridges that don't need support. Set it to 0 if you want all " +"bridges to be supported, and set it to a very large value if you don't want " +"any bridges to be supported." +msgstr "" +"Максимальная длина мостов, не нуждающихся в поддержке. Установите 0, если " +"требуется поддержка всех мостов, или очень большое значение, если поддержка " +"мостов не требуется." msgid "End G-code" msgstr "Завершающий G-код" @@ -6910,20 +8512,26 @@ msgstr "Завершающий G-код" msgid "End G-code when finish the whole printing" msgstr "Завершающий G-код при окончании всей печати." +msgid "Between Object Gcode" +msgstr "" + +msgid "" +"Insert Gcode between objects. This parameter will only come into effect when " +"you print your models object by object" +msgstr "" + msgid "End G-code when finish the printing of this filament" msgstr "Завершающий G-код при окончании печати этой пластиковой нитью." msgid "Ensure vertical shell thickness" msgstr "Обеспечивать верт. толщину оболочки" -msgid "Add solid infill near sloping surfaces to guarantee the vertical shell thickness (top+bottom solid layers)" -msgstr "Добавление сплошного заполнения вблизи наклонных поверхностей для обеспечения вертикальной толщины оболочки (верхний+нижний сплошные слои)." - -msgid "Internal bridge support thickness" -msgstr "Толщина поддержки внутреннего моста" - -msgid "If enabled, support loops will be generated under the contours of internal bridges.These support loops could prevent internal bridges from extruding over the air and improve the top surface quality, especially when the sparse infill density is low.This value determines the thickness of the support loops. 0 means disable this feature" -msgstr "Если включено, под контурами внутренних мостов будут создаваться петли поддержки. Эти петли поддержки могут препятствовать выдавливанию внутренних мостов в воздух и улучшить качество поверхности сверху, особенно при низкой плотности заполнения. Это значение определяет толщину петель поддержки. Установите 0 для отключения." +msgid "" +"Add solid infill near sloping surfaces to guarantee the vertical shell " +"thickness (top+bottom solid layers)" +msgstr "" +"Добавление сплошного заполнения вблизи наклонных поверхностей для " +"обеспечения вертикальной толщины оболочки (верхний+нижний сплошные слои)." msgid "Top surface pattern" msgstr "Шаблон заполнения верхней поверхности" @@ -6964,68 +8572,135 @@ msgstr "Шаблон заполнения нижней поверхности, msgid "Internal solid infill pattern" msgstr "Шаблон сплошного заполнения" -msgid "Line pattern of internal solid infill. if the detect nattow internal solid infill be enabled, the concentric pattern will be used for the small area." -msgstr "Шаблон печати внутреннего сплошного заполнения. Если включена функция «Обнаруживать узкую область сплошного заполнения», то для небольшой области будет использоваться концентрический шаблон заполнения." +msgid "" +"Line pattern of internal solid infill. if the detect narrow internal solid " +"infill be enabled, the concentric pattern will be used for the small area." +msgstr "" +"Шаблон печати внутреннего сплошного заполнения. Если включена функция " +"«Обнаруживать узкую область сплошного заполнения», то для небольшой области " +"будет использоваться концентрический шаблон заполнения." -msgid "Line width of outer wall. If expressed as a %, it will be computed over the nozzle diameter." -msgstr "Ширина экструзии для внешнего периметра. Если задано в процентах, то значение вычисляться относительно диаметра сопла." +msgid "" +"Line width of outer wall. If expressed as a %, it will be computed over the " +"nozzle diameter." +msgstr "" +"Ширина экструзии для внешнего периметра. Если задано в процентах, то " +"значение вычисляться относительно диаметра сопла." -msgid "Speed of outer wall which is outermost and visible. It's used to be slower than inner wall speed to get better quality." -msgstr "Скорость печати внешнего периметра (видимого). Для улучшения качества, эту скорость делают ниже скорости внутренних периметров." +msgid "" +"Speed of outer wall which is outermost and visible. It's used to be slower " +"than inner wall speed to get better quality." +msgstr "" +"Скорость печати внешнего периметра (видимого). Для улучшения качества, эту " +"скорость делают ниже скорости внутренних периметров." msgid "Small perimeters" msgstr "Маленькие периметры" -msgid "This separate setting will affect the speed of perimeters having radius <= small_perimeter_threshold (usually holes). If expressed as percentage (for example: 80%) it will be calculated on the outer wall speed setting above. Set to zero for auto." -msgstr "Этот параметр влияет на скорость печати периметров, имеющих радиус <= значению порога маленьких периметров (обычно это отверстия). Если задано в процентах, параметр вычисляется относительно скорости печати внешнего периметра указанного выше. Установите 0 для автонастройки." +msgid "" +"This separate setting will affect the speed of perimeters having radius <= " +"small_perimeter_threshold (usually holes). If expressed as percentage (for " +"example: 80%) it will be calculated on the outer wall speed setting above. " +"Set to zero for auto." +msgstr "" +"Этот параметр влияет на скорость печати периметров, имеющих радиус <= " +"значению порога маленьких периметров (обычно это отверстия). Если задано в " +"процентах, параметр вычисляется относительно скорости печати внешнего " +"периметра указанного выше. Установите 0 для автонастройки." msgid "Small perimeters threshold" msgstr "Порог маленьких периметров" -msgid "This sets the threshold for small perimeter length. Default threshold is 0mm" -msgstr "Пороговое значение длины маленьких периметров. Значение по умолчанию - 0 мм." +msgid "" +"This sets the threshold for small perimeter length. Default threshold is 0mm" +msgstr "" +"Пороговое значение длины маленьких периметров. Значение по умолчанию - 0 мм." -msgid "Order of inner wall/outer wall/infil" -msgstr "Порядок печати периметров/заполнения" +msgid "Walls printing order" +msgstr "" -msgid "Print sequence of inner wall, outer wall and infill. " -msgstr "Последовательность печати внутреннего/внешнего периметров и заполнения. " +msgid "" +"Print sequence of the internal (inner) and external (outer) walls. \n" +"\n" +"Use Inner/Outer for best overhangs. This is because the overhanging walls " +"can adhere to a neighouring perimeter while printing. However, this option " +"results in slightly reduced surface quality as the external perimeter is " +"deformed by being squashed to the internal perimeter.\n" +"\n" +"Use Inner/Outer/Inner for the best external surface finish and dimensional " +"accuracy as the external wall is printed undisturbed from an internal " +"perimeter. However, overhang performance will reduce as there is no internal " +"perimeter to print the external wall against. This option requires a minimum " +"of 3 walls to be effective as it prints the internal walls from the 3rd " +"perimeter onwards first, then the external perimeter and, finally, the first " +"internal perimeter. This option is recomended against the Outer/Inner option " +"in most cases. \n" +"\n" +"Use Outer/Inner for the same external wall quality and dimensional accuracy " +"benefits of Inner/Outer/Inner option. However, the z seams will appear less " +"consistent as the first extrusion of a new layer starts on a visible " +"surface.\n" +"\n" +" " +msgstr "" -msgid "inner/outer/infill" -msgstr "внутренний/внешний/заполнение" +msgid "Inner/Outer" +msgstr "" -msgid "outer/inner/infill" -msgstr "внешний/внутренний/заполнение" +msgid "Outer/Inner" +msgstr "" -msgid "infill/inner/outer" -msgstr "заполнение/внутренний/внешний" +msgid "Inner/Outer/Inner" +msgstr "" -msgid "infill/outer/inner" -msgstr "заполнение/внешний/внутренний" +msgid "Print infill first" +msgstr "" -msgid "inner-outer-inner/infill" -msgstr "внутренний-внешний-внутренний/заполнение" +msgid "" +"Order of wall/infill. When the tickbox is unchecked the walls are printed " +"first, which works best in most cases.\n" +"\n" +"Printing walls first may help with extreme overhangs as the walls have the " +"neighbouring infill to adhere to. However, the infill will slighly push out " +"the printed walls where it is attached to them, resulting in a worse " +"external surface finish. It can also cause the infill to shine through the " +"external surfaces of the part." +msgstr "" msgid "Height to rod" msgstr "Высота до вала" -msgid "Distance of the nozzle tip to the lower rod. Used for collision avoidance in by-object printing." -msgstr "Расстояние от кончика сопла до нижнего вала. Значение важно при печати моделей «По очереди» для предотвращения столкновений." +msgid "" +"Distance of the nozzle tip to the lower rod. Used for collision avoidance in " +"by-object printing." +msgstr "" +"Расстояние от кончика сопла до нижнего вала. Значение важно при печати " +"моделей «По очереди» для предотвращения столкновений." msgid "Height to lid" msgstr "Высота до крышки" -msgid "Distance of the nozzle tip to the lid. Used for collision avoidance in by-object printing." -msgstr "Расстояние от кончика сопла до крышки. Значение важно при печати моделей «По очереди» для предотвращения столкновений." +msgid "" +"Distance of the nozzle tip to the lid. Used for collision avoidance in by-" +"object printing." +msgstr "" +"Расстояние от кончика сопла до крышки. Значение важно при печати моделей «По " +"очереди» для предотвращения столкновений." -msgid "Clearance radius around extruder. Used for collision avoidance in by-object printing." -msgstr "Безопасное расстояние вокруг экструдера. Используется для предотвращения столкновений при печати отдельно стоящих моделей." +msgid "" +"Clearance radius around extruder. Used for collision avoidance in by-object " +"printing." +msgstr "" +"Безопасное расстояние вокруг экструдера. Используется для предотвращения " +"столкновений при печати отдельно стоящих моделей." msgid "Extruder Color" msgstr "Цвет экструдера" msgid "Only used as a visual help on UI" -msgstr "Используется только в качестве визуальной помощи в пользовательском интерфейсе" +msgstr "" +"Используется только в качестве визуальной помощи в пользовательском " +"интерфейсе" msgid "Extruder offset" msgstr "Смещение экструдера по осям X/Y" @@ -7033,37 +8708,64 @@ msgstr "Смещение экструдера по осям X/Y" msgid "Flow ratio" msgstr "Коэффициент потока" -msgid "The material may have volumetric change after switching between molten state and crystalline state. This setting changes all extrusion flow of this filament in gcode proportionally. Recommended value range is between 0.95 and 1.05. Maybe you can tune this value to get nice flat surface when there has slight overflow or underflow" +msgid "" +"The material may have volumetric change after switching between molten state " +"and crystalline state. This setting changes all extrusion flow of this " +"filament in gcode proportionally. Recommended value range is between 0.95 " +"and 1.05. Maybe you can tune this value to get nice flat surface when there " +"has slight overflow or underflow" msgstr "" -"Коэффициент пропорционального изменения величины потока подаваемого пластика. Рекомендуемый диапазон значений от 0,95 до 1,05.\n" -"При небольшом переливе или недоливе на поверхности, корректировка этого параметра поможет получить хорошую гладкую поверхность." +"Коэффициент пропорционального изменения величины потока подаваемого " +"пластика. Рекомендуемый диапазон значений от 0,95 до 1,05.\n" +"При небольшом переливе или недоливе на поверхности, корректировка этого " +"параметра поможет получить хорошую гладкую поверхность." msgid "Enable pressure advance" msgstr "Включить Pressure advance" -msgid "Enable pressure advance, auto calibration result will be overwriten once enabled." -msgstr "Включить Pressure advance (Прогнозирование давления). Результат автокалибровки будет перезаписан после включения." +msgid "" +"Enable pressure advance, auto calibration result will be overwriten once " +"enabled." +msgstr "" +"Включить Pressure advance (Прогнозирование давления). Результат " +"автокалибровки будет перезаписан после включения." msgid "Pressure advance(Klipper) AKA Linear advance factor(Marlin)" -msgstr "Pressure advance (Прогнозирование давления) в прошивки Klipper, это одно и тоже что Linear advance в прошивке Marlin." +msgstr "" +"Pressure advance (Прогнозирование давления) в прошивки Klipper, это одно и " +"тоже что Linear advance в прошивке Marlin." -msgid "Default line width if other line widths are set to 0. If expressed as a %, it will be computed over the nozzle diameter." -msgstr "Ширина экструзии по умолчанию, если какие-либо из значений ширины экструзии установлены равные нулю. Если задано в процентах, то значение вычисляться относительно диаметра сопла." +msgid "" +"Default line width if other line widths are set to 0. If expressed as a %, " +"it will be computed over the nozzle diameter." +msgstr "" +"Ширина экструзии по умолчанию, если какие-либо из значений ширины экструзии " +"установлены равные нулю. Если задано в процентах, то значение вычисляться " +"относительно диаметра сопла." msgid "Keep fan always on" msgstr "Вентилятор включён всегда" -msgid "If enable this setting, part cooling fan will never be stoped and will run at least at minimum speed to reduce the frequency of starting and stoping" -msgstr "Если включено, вентилятор охлаждения модели никогда не будет останавливаться и будет работать на минимальной скорости, чтобы сократить частоту его запуска и остановки." +msgid "" +"If enable this setting, part cooling fan will never be stoped and will run " +"at least at minimum speed to reduce the frequency of starting and stoping" +msgstr "" +"Если включено, вентилятор охлаждения модели никогда не будет останавливаться " +"и будет работать на минимальной скорости, чтобы сократить частоту его " +"запуска и остановки." msgid "Layer time" msgstr "Время слоя" -msgid "Part cooling fan will be enabled for layers of which estimated time is shorter than this value. Fan speed is interpolated between the minimum and maximum fan speeds according to layer printing time" -msgstr "Вентилятор охлаждения моделей будет включён для слоёв, расчётное время которых меньше этого значения. Скорость вентилятора интерполируется между минимальной и максимальной скоростями вентилятора зависимости от времени печати слоя." - -msgid "s" -msgstr "с" +msgid "" +"Part cooling fan will be enabled for layers of which estimated time is " +"shorter than this value. Fan speed is interpolated between the minimum and " +"maximum fan speeds according to layer printing time" +msgstr "" +"Вентилятор охлаждения моделей будет включён для слоёв, расчётное время " +"которых меньше этого значения. Скорость вентилятора интерполируется между " +"минимальной и максимальной скоростями вентилятора зависимости от времени " +"печати слоя." msgid "Default color" msgstr "Цвет по умолчанию" @@ -7071,9 +8773,6 @@ msgstr "Цвет по умолчанию" msgid "Default filament color" msgstr "Цвет пластиковой нити по умолчанию" -msgid "Color" -msgstr "Цвет" - msgid "Filament notes" msgstr "Примечание о прутке" @@ -7083,45 +8782,201 @@ msgstr "Здесь вы можете написать свои замечани msgid "Required nozzle HRC" msgstr "Необходимая твёрдость сопла" -msgid "Minimum HRC of nozzle required to print the filament. Zero means no checking of nozzle's HRC." -msgstr "Минимальная твёрдость материала сопла (HRC), необходимая для печати пластиковой нитью. 0 - отключение контроля сопел на твёрдость." +msgid "" +"Minimum HRC of nozzle required to print the filament. Zero means no checking " +"of nozzle's HRC." +msgstr "" +"Минимальная твёрдость материала сопла (HRC), необходимая для печати " +"пластиковой нитью. 0 - отключение контроля сопел на твёрдость." -msgid "This setting stands for how much volume of filament can be melted and extruded per second. Printing speed is limited by max volumetric speed, in case of too high and unreasonable speed setting. Can't be zero" -msgstr "Этот параметр определяет, какой объём материала может быть расплавлен и выдавлен в секунду. Скорость печати ограничена максимальной объёмной скоростью в случае слишком высокой и необоснованной установки скорости. Параметр не может быть нулевым." +msgid "" +"This setting stands for how much volume of filament can be melted and " +"extruded per second. Printing speed is limited by max volumetric speed, in " +"case of too high and unreasonable speed setting. Can't be zero" +msgstr "" +"Этот параметр определяет, какой объём материала может быть расплавлен и " +"выдавлен в секунду. Скорость печати ограничена максимальной объёмной " +"скоростью в случае слишком высокой и необоснованной установки скорости. " +"Параметр не может быть нулевым." msgid "mm³/s" msgstr "мм³/с" -msgid "Minimal purge on wipe tower" -msgstr "Мин. объём сброса на черновой башне" - -msgid "After a tool change, the exact position of the newly loaded filament inside the nozzle may not be known, and the filament pressure is likely not yet stable. Before purging the print head into an infill or a sacrificial object, Slic3r will always prime this amount of material into the wipe tower to produce successive infill or sacrificial object extrusions reliably." -msgstr "После смены инструмента, точное положение вновь загруженного прутка внутри него может быть неизвестно, и давление прутка, вероятно, ещё не стабильно. Перед тем, как очистить печатающую головку в заполнение или в «жертвенную» модель Slic3r всегда будет выдавливать это количество материала на черновую башню, чтобы обеспечить надёжную печать заполнения или «жертвенной» модели." - msgid "Filament load time" msgstr "Время загрузки прутка" msgid "Time to load new filament when switch filament. For statistics only" -msgstr "Время загрузки новой пластиковой нити при её смене. Только для статистики." +msgstr "" +"Время загрузки новой пластиковой нити при её смене. Только для статистики." msgid "Filament unload time" msgstr "Время выгрузки прутка" msgid "Time to unload old filament when switch filament. For statistics only" -msgstr "Время выгрузки старой пластиковой нити при её смене. Только для статистики." +msgstr "" +"Время выгрузки старой пластиковой нити при её смене. Только для статистики." -msgid "Filament diameter is used to calculate extrusion in gcode, so it's important and should be accurate" -msgstr "Диаметр пластиковой нити используется для расчёта экструзии, поэтому он важен и должен быть точным" +msgid "" +"Filament diameter is used to calculate extrusion in gcode, so it's important " +"and should be accurate" +msgstr "" +"Диаметр пластиковой нити используется для расчёта экструзии, поэтому он " +"важен и должен быть точным" msgid "Shrinkage" msgstr "Усадка материала" +#, fuzzy, c-format, boost-format msgid "" -"Enter the shrinkage percentage that the filament will get after cooling (94% if you measure 94mm instead of 100mm). The part will be scaled in xy to compensate. Only the filament used for the perimeter is taken into account.\n" -"Be sure to allow enough space between objects, as this compensation is done after the checks." +"Enter the shrinkage percentage that the filament will get after cooling " +"(94% if you measure 94mm instead of 100mm). The part will be scaled in xy to " +"compensate. Only the filament used for the perimeter is taken into account.\n" +"Be sure to allow enough space between objects, as this compensation is done " +"after the checks." msgstr "" -"Введите процент усадки пластиковой нити, которую получит она после охлаждения (пишите 94%, если вы намерили 94 мм, вместо 100 мм). Для компенсации усадки деталь будет отмасштабированна по оси XY. При этом учитывается только пластиковая нить, используемая для печати внешнего периметра.\n" -"Убедитесь, что между моделями достаточно места, так как эта компенсация выполняется после проверок." +"Введите процент усадки пластиковой нити, которую получит она после " +"охлаждения (пишите 94%, если вы намерили 94 мм, вместо 100 мм). Для " +"компенсации усадки деталь будет отмасштабированна по оси XY. При этом " +"учитывается только пластиковая нить, используемая для печати внешнего " +"периметра.\n" +"Убедитесь, что между моделями достаточно места, так как эта компенсация " +"выполняется после проверок." + +msgid "Loading speed" +msgstr "Скорость загрузки" + +msgid "Speed used for loading the filament on the wipe tower." +msgstr "Скорость загрузки прутка при печати черновой башни." + +msgid "Loading speed at the start" +msgstr "Начальная скорость загрузки" + +msgid "Speed used at the very beginning of loading phase." +msgstr "Скорость в начальной фазе загрузки прутка." + +msgid "Unloading speed" +msgstr "Скорость выгрузки" + +msgid "" +"Speed used for unloading the filament on the wipe tower (does not affect " +"initial part of unloading just after ramming)." +msgstr "" +"Скорость выгрузки прутка на черновую башню. (не влияет на начальную фазу " +"выгрузки сразу после рэмминга)." + +msgid "Unloading speed at the start" +msgstr "Начальная скорость выгрузки" + +msgid "" +"Speed used for unloading the tip of the filament immediately after ramming." +msgstr "Скорость выгрузки кончика прутка сразу после рэмминга." + +msgid "Delay after unloading" +msgstr "Задержка после выгрузки" + +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 "" +"Время ожидания после выгрузки прутка. Это может помочь вам легко сменить " +"сопло при печати гибкими материалами, которым требуется больше времени, " +"чтобы вернуться к своим первоначальным размерам." + +msgid "Number of cooling moves" +msgstr "Количество охлаждающих движений" + +msgid "" +"Filament is cooled by being moved back and forth in the cooling tubes. " +"Specify desired number of these moves." +msgstr "" +"Пруток охлаждается в охлаждающих трубках путём перемещения назад и вперёд. " +"Укажите желаемое количество таких движений." + +msgid "Speed of the first cooling move" +msgstr "Скорость первого охлаждающего движения" + +msgid "Cooling moves are gradually accelerating beginning at this speed." +msgstr "Охлаждающие движения постепенно ускоряются, начиная с этой скорости." + +msgid "Minimal purge on wipe tower" +msgstr "Мин. объём сброса на черновой башне" + +msgid "" +"After a tool change, the exact position of the newly loaded filament inside " +"the nozzle may not be known, and the filament pressure is likely not yet " +"stable. Before purging the print head into an infill or a sacrificial " +"object, Slic3r will always prime this amount of material into the wipe tower " +"to produce successive infill or sacrificial object extrusions reliably." +msgstr "" +"После смены инструмента, точное положение вновь загруженного прутка внутри " +"него может быть неизвестно, и давление прутка, вероятно, ещё не стабильно. " +"Перед тем, как очистить печатающую головку в заполнение или в «жертвенную» " +"модель Slic3r всегда будет выдавливать это количество материала на черновую " +"башню, чтобы обеспечить надёжную печать заполнения или «жертвенной» модели." + +msgid "Speed of the last cooling move" +msgstr "Скорость последнего охлаждающего движения" + +msgid "Cooling moves are gradually accelerating towards this speed." +msgstr "Охлаждающие движения постепенно ускоряют до этой скорости." + +msgid "" +"Time for the printer firmware (or the Multi Material Unit 2.0) to load a new " +"filament during a tool change (when executing the T code). This time is " +"added to the total print time by the G-code time estimator." +msgstr "" +"Время за которое прошивка принтера (или Multi Material Unit 2.0) выгружает " +"пруток во время смены инструмента (при выполнении кода Т). Это время " +"добавляется к общему времени печати с помощью алгоритма оценки времени " +"выполнения G-кода." + +msgid "Ramming parameters" +msgstr "Параметры рэмминга" + +msgid "" +"This string is edited by RammingDialog and contains ramming specific " +"parameters." +msgstr "" +"Эта строка редактируется диалоговым окном рэмминга и содержит его конкретные " +"параметры." + +msgid "" +"Time for the printer firmware (or the Multi Material Unit 2.0) to unload a " +"filament during a tool change (when executing the T code). This time is " +"added to the total print time by the G-code time estimator." +msgstr "" +"Время за которое прошивка принтера (или Multi Material Unit 2.0) выгружает " +"пруток во время смены инструмента (при выполнении кода Т). Это время " +"добавляется к общему времени печати с помощью алгоритма оценки времени " +"выполнения G-кода." + +msgid "Enable ramming for multitool setups" +msgstr "Включить рэмминг для мультиинструментальных устройств" + +msgid "" +"Perform ramming when using multitool printer (i.e. when the 'Single Extruder " +"Multimaterial' in Printer Settings is unchecked). When checked, a small " +"amount of filament is rapidly extruded on the wipe tower just before the " +"toolchange. This option is only used when the wipe tower is enabled." +msgstr "" +"Выполнять рэмминг при использовании мультиинструментального принтера (т. е. " +"когда в настройках принтера снят флажок «Мультиматериальный одиночный " +"экструдер»). При включении этой опции, небольшое количество материала быстро " +"выдавливается на черновую башню непосредственно перед сменой инструмента. " +"Эта опция используется только в том случае, если включена черновая башня." + +msgid "Multitool ramming volume" +msgstr "Объём рэмминга мультиинструмента" + +msgid "The volume to be rammed before the toolchange." +msgstr "Объём рэмминга перед сменой инструмента." + +msgid "Multitool ramming flow" +msgstr "Поток рэмминга мультиинструмента" + +msgid "Flow used for ramming the filament before the toolchange." +msgstr "Поток рэмминга пластиковой нити перед сменой инструмента." msgid "Density" msgstr "Плотность" @@ -7138,20 +8993,32 @@ msgstr "Тип материала пластиковой нити." msgid "Soluble material" msgstr "Растворимый материал" -msgid "Soluble material is commonly used to print support and support interface" -msgstr "Растворимый материал обычно используется для печати поддержки и связующего слоя поддержки." +msgid "" +"Soluble material is commonly used to print support and support interface" +msgstr "" +"Растворимый материал обычно используется для печати поддержки и связующего " +"слоя поддержки." msgid "Support material" msgstr "Поддержка" -msgid "Support material is commonly used to print support and support interface" -msgstr "«Материал для поддержки» обычно используется для печати поддержки и связующего слоя поддержки." +msgid "" +"Support material is commonly used to print support and support interface" +msgstr "" +"«Материал для поддержки» обычно используется для печати поддержки и " +"связующего слоя поддержки." -msgid "Temperature of vitrificaiton" -msgstr "Температура стеклования" +msgid "Softening temperature" +msgstr "Температура размягчения" -msgid "Material becomes soft at this temperature. Thus the heatbed cannot be hotter than this tempature" -msgstr "При этой температуре материал становится мягким. Таким образом, подогреваемый стол не может быть горячее этой температуры." +msgid "" +"The material softens at this temperature, so when the bed temperature is " +"equal to or greater than it, it's highly recommended to open the front door " +"and/or remove the upper glass to avoid cloggings." +msgstr "" +"При этой температуре материал размягчается, поэтому, когда температура стола " +"равна или превышает её, настоятельно рекомендуется открыть переднюю дверцу и/" +"или верхнюю крышку принтера, чтобы избежать засорения сопла." msgid "Price" msgstr "Стоимость" @@ -7174,14 +9041,21 @@ msgstr "(Не указано)" msgid "Infill direction" msgstr "Угол печати заполнения" -msgid "Angle for sparse infill pattern, which controls the start or main direction of line" -msgstr "Базовый угол для ориентации шаблона заполнения, который определяет начало или основное направление линий." +msgid "" +"Angle for sparse infill pattern, which controls the start or main direction " +"of line" +msgstr "" +"Базовый угол для ориентации шаблона заполнения, который определяет начало " +"или основное направление линий." msgid "Sparse infill density" msgstr "Плотность заполнения" -msgid "Density of internal sparse infill, 100% means solid throughout" -msgstr "Плотность внутреннего заполнения, выраженная в процентах. 100% означает сплошное заполнение." +#, c-format, boost-format +msgid "" +"Density of internal sparse infill, 100% turns all sparse infill into solid " +"infill and internal solid infill pattern will be used" +msgstr "" msgid "Sparse infill pattern" msgstr "Шаблон заполнения" @@ -7223,13 +9097,27 @@ msgid "Sparse infill anchor length" msgstr "Длина привязок разреженного заполнения" msgid "" -"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Slic3r tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one " -"side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max. \n" -"Set this parameter to zero to disable anchoring perimeters connected to a single infill line." +"Connect an infill line to an internal perimeter with a short segment of an " +"additional perimeter. If expressed as percentage (example: 15%) it is " +"calculated over infill extrusion width. Slic3r tries to connect two close " +"infill lines to a short perimeter segment. If no such perimeter segment " +"shorter than infill_anchor_max is found, the infill line is connected to a " +"perimeter segment at just one side and the length of the perimeter segment " +"taken is limited to this parameter, but no longer than anchor_length_max. \n" +"Set this parameter to zero to disable anchoring perimeters connected to a " +"single infill line." msgstr "" -"Соединять линию заполнения с внутренним периметром с помощью короткого отрезка дополнительного периметра (привязок). Если выражено в процентах, то она вычисляется по ширине экструзии заполнения. Программа пытается соединить две ближайшие линии заполнения с коротким отрезком периметра. Если не найдено такого отрезка периметра короче «Максимальной длины привязок разреженного " -"заполнения» (anchor_length_max), то линия заполнения соединяется с отрезком периметра только с одной стороны, а длина отрезка периметра ограничена этим параметром, но не больше «Максимальной длины привязок разреженного заполнения» (anchor_length_max). \n" -"Установите этот параметр равным нулю для отключения привязок периметров, соединённых с одной линии заполнения." +"Соединять линию заполнения с внутренним периметром с помощью короткого " +"отрезка дополнительного периметра (привязок). Если выражено в процентах, то " +"она вычисляется по ширине экструзии заполнения. Программа пытается соединить " +"две ближайшие линии заполнения с коротким отрезком периметра. Если не " +"найдено такого отрезка периметра короче «Максимальной длины привязок " +"разреженного заполнения» (anchor_length_max), то линия заполнения " +"соединяется с отрезком периметра только с одной стороны, а длина отрезка " +"периметра ограничена этим параметром, но не больше «Максимальной длины " +"привязок разреженного заполнения» (anchor_length_max). \n" +"Установите этот параметр равным нулю для отключения привязок периметров, " +"соединённых с одной линии заполнения." msgid "0 (no open anchors)" msgstr "0 (нет открытых привязок)" @@ -7241,13 +9129,26 @@ msgid "Maximum length of the infill anchor" msgstr "Максимальная длина привязок разреженного заполнения" msgid "" -"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Slic3r tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side " -"and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter. \n" -"If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0." +"Connect an infill line to an internal perimeter with a short segment of an " +"additional perimeter. If expressed as percentage (example: 15%) it is " +"calculated over infill extrusion width. Slic3r tries to connect two close " +"infill lines to a short perimeter segment. If no such perimeter segment " +"shorter than this parameter is found, the infill line is connected to a " +"perimeter segment at just one side and the length of the perimeter segment " +"taken is limited to infill_anchor, but no longer than this parameter. \n" +"If set to 0, the old algorithm for infill connection will be used, it should " +"create the same result as with 1000 & 0." msgstr "" -"Соединять линию заполнения с внутренним периметром с помощью короткого отрезка дополнительного периметра (привязок). Если выражено в процентах, то она вычисляется по ширине экструзии заполнения. Slic3r пытается соединить две ближайшие линии заполнения с коротким отрезком периметра. Если не найдено такого отрезка периметра короче этого параметра, линия заполнения соединяется с отрезком периметра " -"только с одной стороны, а длина отрезка периметра ограничена значением «Длина привязок разреженного заполнения» (infill_anchor), но не больше этого параметра. \n" -"Если установить 0, то будет использоваться старый алгоритм для соединения заполнения, который даёт такой же результат, как и при значениях 1000 и 0." +"Соединять линию заполнения с внутренним периметром с помощью короткого " +"отрезка дополнительного периметра (привязок). Если выражено в процентах, то " +"она вычисляется по ширине экструзии заполнения. Slic3r пытается соединить " +"две ближайшие линии заполнения с коротким отрезком периметра. Если не " +"найдено такого отрезка периметра короче этого параметра, линия заполнения " +"соединяется с отрезком периметра только с одной стороны, а длина отрезка " +"периметра ограничена значением «Длина привязок разреженного " +"заполнения» (infill_anchor), но не больше этого параметра. \n" +"Если установить 0, то будет использоваться старый алгоритм для соединения " +"заполнения, который даёт такой же результат, как и при значениях 1000 и 0." msgid "0 (Simple connect)" msgstr "0 (без привязок)" @@ -7261,38 +9162,67 @@ msgstr "Ускорение на внутренних периметрах." msgid "Acceleration of travel moves" msgstr "Ускорение холостого перемещения." -msgid "Acceleration of top surface infill. Using a lower value may improve top surface quality" -msgstr "Ускорение на верхней поверхности. Использование меньшего значения может улучшить качество верхней поверхности." +msgid "" +"Acceleration of top surface infill. Using a lower value may improve top " +"surface quality" +msgstr "" +"Ускорение на верхней поверхности. Использование меньшего значения может " +"улучшить качество верхней поверхности." msgid "Acceleration of outer wall. Using a lower value can improve quality" -msgstr "Ускорение на внешнем периметре. Использование более низкого значения может улучшить качество." +msgstr "" +"Ускорение на внешнем периметре. Использование более низкого значения может " +"улучшить качество." -msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration." -msgstr "Ускорение на мостах. Если задано в процентах, то значение вычисляться относительно ускорения внешнего периметра." +msgid "" +"Acceleration of bridges. If the value is expressed as a percentage (e.g. " +"50%), it will be calculated based on the outer wall acceleration." +msgstr "" +"Ускорение на мостах. Если задано в процентах, то значение вычисляться " +"относительно ускорения внешнего периметра." msgid "mm/s² or %" msgstr "мм/с² или %" -msgid "Acceleration of sparse infill. If the value is expressed as a percentage (e.g. 100%), it will be calculated based on the default acceleration." -msgstr "Ускорение на разреженном заполнении. Если задано в процентах, то значение вычисляться относительно ускорения по умолчанию." +msgid "" +"Acceleration of sparse infill. If the value is expressed as a percentage (e." +"g. 100%), it will be calculated based on the default acceleration." +msgstr "" +"Ускорение на разреженном заполнении. Если задано в процентах, то значение " +"вычисляться относительно ускорения по умолчанию." -msgid "Acceleration of internal solid infill. If the value is expressed as a percentage (e.g. 100%), it will be calculated based on the default acceleration." -msgstr "Ускорение на внутреннем сплошном заполнении. Если задано в процентах, то значение вычисляться относительно ускорения по умолчанию." +msgid "" +"Acceleration of internal solid infill. If the value is expressed as a " +"percentage (e.g. 100%), it will be calculated based on the default " +"acceleration." +msgstr "" +"Ускорение на внутреннем сплошном заполнении. Если задано в процентах, то " +"значение вычисляться относительно ускорения по умолчанию." -msgid "Acceleration of initial layer. Using a lower value can improve build plate adhensive" -msgstr "Ускорение на первом слое. Использование более низкого значения может улучшить адгезию к столу." +msgid "" +"Acceleration of initial layer. Using a lower value can improve build plate " +"adhesive" +msgstr "" +"Ускорение на первом слое. Использование более низкого значения может " +"улучшить адгезию к столу." msgid "Enable accel_to_decel" msgstr "Вкл. ограничение ускорения зигзагов" msgid "Klipper's max_accel_to_decel will be adjusted automatically" -msgstr "Значение Klipper-а max_accel_to_decel (ограничение ускорения зигзагов) будет скорректировано автоматически." +msgstr "" +"Значение Klipper-а max_accel_to_decel (ограничение ускорения зигзагов) будет " +"скорректировано автоматически." msgid "accel_to_decel" msgstr "Ограничение ускорение зигзагов" -msgid "Klipper's max_accel_to_decel will be adjusted to this % of acceleration" -msgstr "Значение Klipper-а max_accel_to_decel (ограничение ускорения зигзагов) будет скорректировано на заданный процент ускорения." +#, c-format, boost-format +msgid "" +"Klipper's max_accel_to_decel will be adjusted to this %% of acceleration" +msgstr "" +"Значение Klipper-а max_accel_to_decel (ограничение ускорения зигзагов) будет " +"скорректировано на заданный процент ускорения." msgid "Jerk of outer walls" msgstr "Рывок для внешних периметров." @@ -7312,14 +9242,22 @@ msgstr "Рывок для первого слоя." msgid "Jerk for travel" msgstr "Рывок при перемещении." -msgid "Line width of initial layer. If expressed as a %, it will be computed over the nozzle diameter." -msgstr "Ширина экструзии для первого слоя. Если задано в процентах, то значение вычисляться относительно диаметра сопла." +msgid "" +"Line width of initial layer. If expressed as a %, it will be computed over " +"the nozzle diameter." +msgstr "" +"Ширина экструзии для первого слоя. Если задано в процентах, то значение " +"вычисляться относительно диаметра сопла." msgid "Initial layer height" msgstr "Высота первого слоя" -msgid "Height of initial layer. Making initial layer height to be thick slightly can improve build plate adhension" -msgstr "Высота первого слоя. Незначительное увеличение толщины первого слоя может улучшить сцепление со столом." +msgid "" +"Height of initial layer. Making initial layer height to be thick slightly " +"can improve build plate adhension" +msgstr "" +"Высота первого слоя. Незначительное увеличение толщины первого слоя может " +"улучшить сцепление со столом." msgid "Speed of initial layer except the solid infill part" msgstr "Скорость печати первого слоя, кроме сплошного заполнения." @@ -7339,35 +9277,59 @@ msgstr "Скорость перемещения на первом слое." msgid "Number of slow layers" msgstr "Количество медленных слоёв" -msgid "The first few layers are printed slower than normal. The speed is gradually increased in a linear fashion over the specified number of layers." -msgstr "Первые несколько слоёв печатаются медленнее, чем обычно. Скорость постепенно линейно увеличивается в течение заданного количества слоёв." +msgid "" +"The first few layers are printed slower than normal. The speed is gradually " +"increased in a linear fashion over the specified number of layers." +msgstr "" +"Первые несколько слоёв печатаются медленнее, чем обычно. Скорость постепенно " +"линейно увеличивается в течение заданного количества слоёв." msgid "Initial layer nozzle temperature" msgstr "Температура сопла на первом слое" msgid "Nozzle temperature to print initial layer when using this filament" -msgstr "Температура сопла для печати первого слоя при использовании данной пластиковой нити." +msgstr "" +"Температура сопла для печати первого слоя при использовании данной " +"пластиковой нити." msgid "Full fan speed at layer" msgstr "Полная скорость вентилятора на слое" -msgid "Fan speed will be ramped up linearly from zero at layer \"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower than \"close_fan_the_first_x_layers\", in which case the fan will be running at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." -msgstr "Скорость вентилятора будет нарастать линейно от нуля на слое \"close_fan_the_first_x_layers\" до максимума на слое \"full_fan_speed_layer\". Значение \"full_fan_speed_layer\" будет игнорироваться, если оно меньше значения \"close_fan_the_first_x_layers\", в этом случае вентилятор будет работать на максимально допустимой скорости на слое \"close_fan_the_first_x_layers\" + 1." +msgid "" +"Fan speed will be ramped up linearly from zero at layer " +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower than " +"\"close_fan_the_first_x_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +msgstr "" +"Скорость вентилятора будет нарастать линейно от нуля на слое " +"\"close_fan_the_first_x_layers\" до максимума на слое \"full_fan_speed_layer" +"\". Значение \"full_fan_speed_layer\" будет игнорироваться, если оно меньше " +"значения \"close_fan_the_first_x_layers\", в этом случае вентилятор будет " +"работать на максимально допустимой скорости на слое " +"\"close_fan_the_first_x_layers\" + 1." msgid "Support interface fan speed" msgstr "Скорость вентилятора на связующем слое" msgid "" -"This fan speed is enforced during all support interfaces, to be able to weaken their bonding with a high fan speed.\n" +"This fan speed is enforced during all support interfaces, to be able to " +"weaken their bonding with a high fan speed.\n" "Set to -1 to disable this override.\n" "Can only be overriden by disable_fan_first_layers." msgstr "" -"Скорость, применяемая ко всем связующим слоях, чтобы высокой скоростью вентилятора ослабить сцепление между слоями.\n" +"Скорость, применяемая ко всем связующим слоях, чтобы высокой скоростью " +"вентилятора ослабить сцепление между слоями.\n" "Установите значение -1, чтобы запретить переопределять этот параметр.\n" "Может быть отменено только командой disable_fan_first_layers." -msgid "Randomly jitter while printing the wall, so that the surface has a rough look. This setting controls the fuzzy position" -msgstr "Случайное дрожание сопла при печати внешнего периметра для создания эффекта шероховатой поверхности. Эта настройка определяет положение нечетной оболочки." +msgid "" +"Randomly jitter while printing the wall, so that the surface has a rough " +"look. This setting controls the fuzzy position" +msgstr "" +"Случайное дрожание сопла при печати внешнего периметра для создания эффекта " +"шероховатой поверхности. Эта настройка определяет положение нечетной " +"оболочки." msgid "None" msgstr "Нет" @@ -7384,14 +9346,28 @@ msgstr "Все периметры" msgid "Fuzzy skin thickness" msgstr "Толщина нечёткой оболочки" -msgid "The width within which to jitter. It's adversed to be below outer wall line width" -msgstr "Ширина, в пределах которой будет происходить дрожание. Желательно, чтобы она была меньше ширины линии внешнего периметра." +msgid "" +"The width within which to jitter. It's adversed to be below outer wall line " +"width" +msgstr "" +"Ширина, в пределах которой будет происходить дрожание. Желательно, чтобы она " +"была меньше ширины линии внешнего периметра." msgid "Fuzzy skin point distance" msgstr "Расстояние «дрожания» при печати нечёткой оболочки" -msgid "The average diatance between the random points introducded on each line segment" -msgstr "Среднее расстояние между случайно вставленными точками при генерации нечётной оболочки." +msgid "" +"The average diatance between the random points introducded on each line " +"segment" +msgstr "" +"Среднее расстояние между случайно вставленными точками при генерации " +"нечётной оболочки." + +msgid "Apply fuzzy skin to first layer" +msgstr "" + +msgid "Whether to apply fuzzy skin on the first layer" +msgstr "" msgid "Filter out tiny gaps" msgstr "Игнорировать небольшие пробелы" @@ -7399,35 +9375,52 @@ msgstr "Игнорировать небольшие пробелы" msgid "Layers and Perimeters" msgstr "Слои и периметры" -msgid "Filter out gaps smaller than the threshold specified. This setting won't affect top/bottom layers" -msgstr "Небольшие промежутки меньше указанного порога не будут заполняться. Этот параметр не влияет на верхнюю/нижнюю поверхность." +msgid "Filter out gaps smaller than the threshold specified" +msgstr "Небольшие промежутки меньше указанного порога не будут заполняться." -msgid "Speed of gap infill. Gap usually has irregular line width and should be printed more slowly" -msgstr "Скорость заполнения пробелов. Пробелы обычно имеют неравномерную ширину линии и должен печататься медленнее." +msgid "" +"Speed of gap infill. Gap usually has irregular line width and should be " +"printed more slowly" +msgstr "" +"Скорость заполнения пробелов. Пробелы обычно имеют неравномерную ширину " +"линии и должен печататься медленнее." msgid "Arc fitting" msgstr "Поддержка движения по дуге окружности" -msgid "Enable this to get a G-code file which has G2 and G3 moves. And the fitting tolerance is same with resolution" -msgstr "Включите, если хотите использовать в G-коде команды перемещения по дуге окружности G2/G3. Значение допуска траектории такое же как разрешение G-кода выше." +msgid "" +"Enable this to get a G-code file which has G2 and G3 moves. And the fitting " +"tolerance is same with resolution" +msgstr "" +"Включите, если хотите использовать в G-коде команды перемещения по дуге " +"окружности G2/G3. Значение допуска траектории такое же как разрешение G-кода " +"выше." msgid "Add line number" msgstr "Добавить номер строки" msgid "Enable this to add line number(Nx) at the beginning of each G-Code line" -msgstr "При включении, в начало каждой строки G-кода, будет добавляться номер строки (Nx)." +msgstr "" +"При включении, в начало каждой строки G-кода, будет добавляться номер строки " +"(Nx)." msgid "Scan first layer" msgstr "Проверка первого слоя" -msgid "Enable this to enable the camera on printer to check the quality of first layer" +msgid "" +"Enable this to enable the camera on printer to check the quality of first " +"layer" msgstr "При включении, камера принтера будет проверять качество первого слоя." msgid "Nozzle type" msgstr "Тип сопла" -msgid "The metallic material of nozzle. This determines the abrasive resistance of nozzle, and what kind of filament can be printed" -msgstr "Материал сопла. Определяет абразивную стойкость сопла, а также то, каким материалом можно печатать." +msgid "" +"The metallic material of nozzle. This determines the abrasive resistance of " +"nozzle, and what kind of filament can be printed" +msgstr "" +"Материал сопла. Определяет абразивную стойкость сопла, а также то, каким " +"материалом можно печатать." msgid "Undefine" msgstr "Не задано" @@ -7444,24 +9437,68 @@ msgstr "Латунь" msgid "Nozzle HRC" msgstr "Твердость сопла (HRC)" -msgid "The nozzle's hardness. Zero means no checking for nozzle's hardness during slicing." -msgstr "Твёрдость сопел. 0 - отключение контроля сопел на твёрдость во время нарезки." +msgid "" +"The nozzle's hardness. Zero means no checking for nozzle's hardness during " +"slicing." +msgstr "" +"Твёрдость сопел. 0 - отключение контроля сопел на твёрдость во время нарезки." msgid "HRC" msgstr "HRC" -msgid "Enable this option if machine has auxiliary part cooling fan" -msgstr "Включите, если в принтере имеет вспомогательный вентилятор для охлаждения моделей." +msgid "Printer structure" +msgstr "Кинематика принтера" + +msgid "The physical arrangement and components of a printing device" +msgstr "Конструкция физического принтера" + +msgid "CoreXY" +msgstr "CoreXY" + +msgid "I3" +msgstr "I3" + +msgid "Hbot" +msgstr "Hbot" + +msgid "Delta" +msgstr "Delta" + +msgid "Best object position" +msgstr "Наилучшее расположение модели" + +msgid "Best auto arranging position in range [0,1] w.r.t. bed shape." +msgstr "" +"Наилучшее расположение модели при авторасстановке в диапазоне [0,1] " +"относительно формы стола." msgid "" -"Start the fan this number of seconds earlier than its target start time (you can use fractional seconds). It assumes infinite acceleration for this time estimation, and will only take into account G1 and G0 moves (arc fitting is unsupported).\n" -"It won't move fan comands from custom gcodes (they act as a sort of 'barrier').\n" -"It won't move fan comands into the start gcode if the 'only custom start gcode' is activated.\n" +"Enable this option if machine has auxiliary part cooling fan. G-code " +"command: M106 P2 S(0-255)." +msgstr "" +"Если в принтере имеет вспомогательный вентилятор для охлаждения моделей, " +"можете включить эту опцию. \n" +"G-код команда: M106 P2 S(0-255)." + +msgid "" +"Start the fan this number of seconds earlier than its target start time (you " +"can use fractional seconds). It assumes infinite acceleration for this time " +"estimation, and will only take into account G1 and G0 moves (arc fitting is " +"unsupported).\n" +"It won't move fan comands from custom gcodes (they act as a sort of " +"'barrier').\n" +"It won't move fan comands into the start gcode if the 'only custom start " +"gcode' is activated.\n" "Use 0 to deactivate." msgstr "" -"Запуск вентилятора на указанное количество секунд раньше целевого времени запуска (поддерживаются доли секунды). При этом предполагается бесконечное ускорение для оценки этого времени, и учёт только перемещений G1 и G0 (Поддержка движения по дуге окружности не поддерживается).\n" -"Это не приведёт к сдвигу команд вентилятора из пользовательских G-кодов (они действуют как своего рода барьер).\n" -"Это не приведёт к сдвигу команд вентилятора в стартовом G-коде, если активировано «только пользовательский стартовый G-код».\n" +"Запуск вентилятора на указанное количество секунд раньше целевого времени " +"запуска (поддерживаются доли секунды). При этом предполагается бесконечное " +"ускорение для оценки этого времени, и учёт только перемещений G1 и G0 " +"(Поддержка движения по дуге окружности не поддерживается).\n" +"Это не приведёт к сдвигу команд вентилятора из пользовательских G-кодов (они " +"действуют как своего рода барьер).\n" +"Это не приведёт к сдвигу команд вентилятора в стартовом G-коде, если " +"активировано «только пользовательский стартовый G-код».\n" "Установите 0 для отключения." msgid "Only overhangs" @@ -7474,13 +9511,50 @@ msgid "Fan kick-start time" msgstr "Продолжительность принудительного запуска вентилятора" msgid "" -"Emit a max fan speed command for this amount of seconds before reducing to target speed to kick-start the cooling fan.\n" -"This is useful for fans where a low PWM/power may be insufficient to get the fan started spinning from a stop, or to get the fan up to speed faster.\n" +"Emit a max fan speed command for this amount of seconds before reducing to " +"target speed to kick-start the cooling fan.\n" +"This is useful for fans where a low PWM/power may be insufficient to get the " +"fan started spinning from a stop, or to get the fan up to speed faster.\n" "Set to 0 to deactivate." msgstr "" -"Время принудительного запуска (kick-start) вентилятора на максимальной скорости, после чего скорость снижается до целевой. Это необходимо для вентиляторов у которых низкое значение уровня ШИМ/мощности может быть недостаточен для запуска вентилятора после остановки или для более быстрого увеличения скорости его вращения.\n" +"Время принудительного запуска (kick-start) вентилятора на максимальной " +"скорости, после чего скорость снижается до целевой. Это необходимо для " +"вентиляторов у которых низкое значение уровня ШИМ/мощности может быть " +"недостаточен для запуска вентилятора после остановки или для более быстрого " +"увеличения скорости его вращения.\n" "Установите 0 для отключения." +msgid "Time cost" +msgstr "Цена печати" + +msgid "The printer cost per hour" +msgstr "Стоимость печати в час." + +msgid "money/h" +msgstr "цена/ч" + +msgid "Support control chamber temperature" +msgstr "Контроль температуры в термокамере" + +msgid "" +"This option is enabled if machine support controlling chamber temperature\n" +"G-code command: M141 S(0-255)" +msgstr "" +"Если принтер поддерживает контроль температуры в камере, включите эту " +"опцию.\n" +"G-код команда: M141 S(0-255)" + +msgid "Support air filtration" +msgstr "Фильтрация выдуваемого воздуха" + +msgid "" +"Enable this if printer support air filtration\n" +"G-code command: M106 P3 S(0-255)" +msgstr "" +"Если принтер поддерживает фильтрацию выдуваемого воздуха, включите эту " +"опцию. \n" +"G-код команда: M106 P3 S(0-255)" + msgid "G-code flavor" msgstr "Тип G-кода" @@ -7493,40 +9567,67 @@ msgstr "Klipper" msgid "Label objects" msgstr "Название моделей" -msgid "Enable this to add comments into the G-Code labeling print moves with what object they belong to, which is useful for the Octoprint CancelObject plugin. This settings is NOT compatible with Single Extruder Multi Material setup and Wipe into Object / Wipe into Infill." -msgstr "Включите эту опцию, чтобы добавить комментарии в G-код с указанием того, к какой модели он принадлежит, что полезно для плагина Octoprint CancelObject. Эта настройка не совместима с настройкой «Мультиматериальный одиночный экструдер» и «Очистка в модель» / «Очистка в заполнение модели»." +msgid "" +"Enable this to add comments into the G-Code labeling print moves with what " +"object they belong to, which is useful for the Octoprint CancelObject " +"plugin. This settings is NOT compatible with Single Extruder Multi Material " +"setup and Wipe into Object / Wipe into Infill." +msgstr "" +"Включите эту опцию, чтобы добавить комментарии в G-код с указанием того, к " +"какой модели он принадлежит, что полезно для плагина Octoprint CancelObject. " +"Эта настройка не совместима с настройкой «Мультиматериальный одиночный " +"экструдер» и «Очистка в модель» / «Очистка в заполнение модели»." msgid "Exclude objects" msgstr "Исключить модели" msgid "Enable this option to add EXCLUDE OBJECT command in g-code" -msgstr "Включите эту опцию, чтобы добавить команду EXCLUDE OBJECT (исключения моделей) в G-код." +msgstr "" +"Включите эту опцию, чтобы добавить команду EXCLUDE OBJECT (исключения " +"моделей) в G-код." msgid "Verbose G-code" msgstr "Подробный G-код" -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 "Включите эту опцию, чтобы в каждой строке файла G-кода, присутствовал комментарий с поясняющим текстом. При печати с SD-карты, скорость чтение данных вашей прошивкой может снизится за счёт увеличения размера файла." +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 "" +"Включите эту опцию, чтобы в каждой строке файла G-кода, присутствовал " +"комментарий с поясняющим текстом. При печати с SD-карты, скорость чтение " +"данных вашей прошивкой может снизится за счёт увеличения размера файла." msgid "Infill combination" msgstr "Комбинированное заполнение" -msgid "Automatically Combine sparse infill of several layers to print together to reduce time. Wall is still printed with original layer height." +msgid "" +"Automatically Combine sparse infill of several layers to print together to " +"reduce time. Wall is still printed with original layer height." msgstr "" -"Для сокращения времени печати есть возможность печатать заполнение не на каждом слое, а на двух слоях сразу. \n" +"Для сокращения времени печати есть возможность печатать заполнение не на " +"каждом слое, а на двух слоях сразу. \n" "Периметры по-прежнему печатаются с исходной высотой слоя." msgid "Filament to print internal sparse infill." msgstr "Пластиковая нить для печати заполнения." -msgid "Line width of internal sparse infill. If expressed as a %, it will be computed over the nozzle diameter." -msgstr "Ширина экструзии для заполнения. Если задано в процентах, то значение вычисляться относительно диаметра сопла." +msgid "" +"Line width of internal sparse infill. If expressed as a %, it will be " +"computed over the nozzle diameter." +msgstr "" +"Ширина экструзии для заполнения. Если задано в процентах, то значение " +"вычисляться относительно диаметра сопла." msgid "Infill/Wall overlap" msgstr "Перекрытие линий заполнения с линиями периметра" -msgid "Infill area is enlarged slightly to overlap with wall for better bonding. The percentage value is relative to line width of sparse infill" -msgstr "Параметр указывает на сколько процентов заполнение будет перекрываться с периметром для лучшего соединения друг с другом." +msgid "" +"Infill area is enlarged slightly to overlap with wall for better bonding. " +"The percentage value is relative to line width of sparse infill" +msgstr "" +"Параметр указывает на сколько процентов заполнение будет перекрываться с " +"периметром для лучшего соединения друг с другом." msgid "Speed of internal sparse infill" msgstr "Скорость заполнения" @@ -7534,14 +9635,38 @@ msgstr "Скорость заполнения" msgid "Interface shells" msgstr "Связующие оболочки" -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 "Принудительное создание замкнутых (сплошных) оболочек между смежными материалами/объёмами. Полезно для многоэкструдерных принтеров при печати полупрозрачными материалами или растворимой поддержкой. Помогает избежать диффузию материалов." +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 "" +"Принудительное создание замкнутых (сплошных) оболочек между смежными " +"материалами/объёмами. Полезно для многоэкструдерных принтеров при печати " +"полупрозрачными материалами или растворимой поддержкой. Помогает избежать " +"диффузию материалов." + +msgid "Maximum width of a segmented region" +msgstr "" + +msgid "Maximum width of a segmented region. Zero disables this feature." +msgstr "" + +msgid "Interlocking depth of a segmented region" +msgstr "" + +msgid "Interlocking depth of a segmented region. Zero disables this feature." +msgstr "" msgid "Ironing Type" msgstr "Тип разглаживания" -msgid "Ironing is using small flow to print on same height of surface again to make flat surface more smooth. This setting controls which layer being ironed" -msgstr "При разглаживании сопло выполняет вторую фазу заполнения на том же слое (с небольшим потоком), чтобы заполнить отверстия и сгладить выступающие части пластика. Этот параметр контролирует, какой слой необходимо сгладить." +msgid "" +"Ironing is using small flow to print on same height of surface again to make " +"flat surface more smooth. This setting controls which layer being ironed" +msgstr "" +"При разглаживании сопло выполняет вторую фазу заполнения на том же слое (с " +"небольшим потоком), чтобы заполнить отверстия и сгладить выступающие части " +"пластика. Этот параметр контролирует, какой слой необходимо сгладить." msgid "No ironing" msgstr "Без разглаживания" @@ -7558,11 +9683,18 @@ msgstr "Все сплошные поверхности" msgid "Ironing Pattern" msgstr "Шаблон разглаживания" +msgid "The pattern that will be used when ironing" +msgstr "Шаблон по которому будет производиться разглаживание." + msgid "Ironing flow" msgstr "Поток" -msgid "The amount of material to extrude during ironing. Relative to flow of normal layer height. Too high value results in overextrusion on the surface" -msgstr "Количество материала, которое необходимо выдавить во время разглаживания относительно потока при нормальной высоте слоя." +msgid "" +"The amount of material to extrude during ironing. Relative to flow of normal " +"layer height. Too high value results in overextrusion on the surface" +msgstr "" +"Количество материала, которое необходимо выдавить во время разглаживания " +"относительно потока при нормальной высоте слоя." msgid "Ironing line spacing" msgstr "Расстояние между линиями разглаживания" @@ -7576,17 +9708,36 @@ msgstr "Скорость разглаживания" msgid "Print speed of ironing lines" msgstr "Скорость разглаживания" +msgid "Ironing angle" +msgstr "Угол разглаживания" + +msgid "" +"The angle ironing is done at. A negative number disables this function and " +"uses the default method." +msgstr "" +"Выбор угла разглаживания. Отрицательное число отключает эту функцию и " +"использует метод по умолчанию." + msgid "This gcode part is inserted at every layer change after lift z" -msgstr "Этот G-код вставляется при каждой смене слоя, сразу после перемещения оси Z." +msgstr "" +"Этот G-код вставляется при каждой смене слоя, сразу после перемещения оси Z." msgid "Supports silent mode" msgstr "Поддержка тихого режима" -msgid "Whether the machine supports silent mode in which machine use lower acceleration to print" -msgstr "Поддержка тихого режима, в котором принтер использует меньшее ускорение печати для уменьшения уровня шума." +msgid "" +"Whether the machine supports silent mode in which machine use lower " +"acceleration to print" +msgstr "" +"Поддержка тихого режима, в котором принтер использует меньшее ускорение " +"печати для уменьшения уровня шума." -msgid "This G-code will be used as a code for the pause print. User can insert pause G-code in gcode viewer" -msgstr "Этот G-код используется для задания паузы печати. Пользователь может вставить G-код паузы в просмотрщике G-кода." +msgid "" +"This G-code will be used as a code for the pause print. User can insert " +"pause G-code in gcode viewer" +msgstr "" +"Этот G-код используется для задания паузы печати. Пользователь может " +"вставить G-код паузы в просмотрщике G-кода." msgid "This G-code will be used as a custom code" msgstr "Этот G-код используется для пользовательского кода." @@ -7694,40 +9845,155 @@ msgid "Maximum acceleration for travel" msgstr "Максимальное ускорение при перемещении" msgid "Maximum acceleration for travel (M204 T), it only applies to Marlin 2" -msgstr "Максимальное ускорение при перемещении (M204 T), применяемое только для Marlin 2" +msgstr "" +"Максимальное ускорение при перемещении (M204 T), применяемое только для " +"Marlin 2" -msgid "Maximum acceleration for travel (M204 T)" -msgstr "Максимальное ускорение при перемещении (M204 T)" - -msgid "Fan speed" -msgstr "Скорость вентилятора" - -msgid "Part cooling fan speed may be increased when auto cooling is enabled. This is the maximum speed limitation of part cooling fan" -msgstr "Скорость вентилятора охлаждения моделей может быть увеличена, если включено автоматическое охлаждение. Это максимальное ограничение скорости вентилятора для охлаждения моделей." +msgid "" +"Part cooling fan speed may be increased when auto cooling is enabled. This " +"is the maximum speed limitation of part cooling fan" +msgstr "" +"Скорость вентилятора охлаждения моделей может быть увеличена, если включено " +"автоматическое охлаждение. Это максимальное ограничение скорости вентилятора " +"для охлаждения моделей." msgid "Max" msgstr "Макс." -msgid "The largest printable layer height for extruder. Used tp limits the maximum layer hight when enable adaptive layer height" -msgstr "Это наибольшая высота печатаемого слоя для этого экструдера, которая используется для ограничения функции «Переменная высота слоёв»." +msgid "" +"The largest printable layer height for extruder. Used tp limits the maximum " +"layer hight when enable adaptive layer height" +msgstr "" +"Это наибольшая высота печатаемого слоя для этого экструдера, которая " +"используется для ограничения функции «Переменная высота слоёв»." + +# ??? +msgid "Extrusion rate smoothing" +msgstr "Сглаживание скорости экструзии" + +msgid "" +"This parameter smooths out sudden extrusion rate changes that happen when " +"the printer transitions from printing a high flow (high speed/larger width) " +"extrusion to a lower flow (lower speed/smaller width) extrusion and vice " +"versa.\n" +"\n" +"It defines the maximum rate by which the extruded volumetric flow in mm3/sec " +"can change over time. Higher values mean higher extrusion rate changes are " +"allowed, resulting in faster speed transitions.\n" +"\n" +"A value of 0 disables the feature. \n" +"\n" +"For a high speed, high flow direct drive printer (like the Bambu lab or " +"Voron) this value is usually not needed. However it can provide some " +"marginal benefit in certain cases where feature speeds vary greatly. For " +"example, when there are aggressive slowdowns due to overhangs. In these " +"cases a high value of around 300-350mm3/s2 is recommended as this allows for " +"just enough smoothing to assist pressure advance achieve a smoother flow " +"transition.\n" +"\n" +"For slower printers without pressure advance, the value should be set much " +"lower. A value of 10-15mm3/s2 is a good starting point for direct drive " +"extruders and 5-10mm3/s2 for Bowden style. \n" +"\n" +"This feature is known as Pressure Equalizer in Prusa slicer.\n" +"\n" +"Note: this parameter disables arc fitting." +msgstr "" +"Этот параметр сглаживает резкие изменения скорости экструзии, которые " +"происходят, когда принтер переходит от печати с большим расходом (высокая " +"скорость/большая ширина) к печати с меньшим расходом (меньшая скорость/" +"меньшая ширина) и наоборот.\n" +"\n" +"Параметр задаёт максимальную скорость, с которой объёмный расход " +"экструдируемого материала может изменяться с течением времени (мм³/с). Более " +"высокие значения означают, что допускаются более высокие изменения скорости " +"экструзии, что приводит к более быстрому переключению скоростей.\n" +"\n" +"Значение 0 отключает эту функцию. \n" +"\n" +"Для высокоскоростных принтеров с прямым приводом (например, Bambu lab или " +"Voron) обычно не требуется использование данного значения. Однако в " +"некоторых случаях, когда скорость печати сильно различается, это может " +"принести некоторую дополнительную пользу. Например, когда происходят резкие " +"замедления из-за нависаний. В этих случаях рекомендуется использовать " +"высокое значение, составляющее около 300-350 мм³/с², так как это " +"обеспечивает достаточное сглаживание, помогающее прогнозированию давления " +"достичь более плавного перехода потока.\n" +"\n" +"Для более медленных принтеров, не использующих прогнозирование давления " +"(pressure advance), это значение должно быть значительно ниже. Значение " +"10-15 мм³/с² является хорошей отправной точкой для экструдеров с прямым " +"приводом и 5-10 мм³/с² для боуден экструдеров.\n" +"\n" +"В Prusa Slicer эта функция известна как «Выравнивание давления» (Pressure " +"equalizer).\n" +"\n" +"Примечание: этот параметр отключает поддержку движения по дуге окружности." + +msgid "mm³/s²" +msgstr "мм³/с²" + +msgid "Smoothing segment length" +msgstr "Длина сглаживающего сегмента" + +msgid "" +"A lower value results in smoother extrusion rate transitions. However, this " +"results in a significantly larger gcode file and more instructions for the " +"printer to process. \n" +"\n" +"Default value of 3 works well for most cases. If your printer is stuttering, " +"increase this value to reduce the number of adjustments made\n" +"\n" +"Allowed values: 1-5" +msgstr "" +"Меньшее значение приводит к более плавному изменению скорости экструзии. " +"Однако это приводит к значительному увеличению размера G-код файла и " +"увеличению количества инструкций для обработки принтером. \n" +"\n" +"Значение по умолчанию, равное 3, хорошо подходит для большинства случаев. " +"Если принтер печатает с мини-фризами, увеличьте это значение, чтобы " +"уменьшить количество выполняемых изменений.\n" +"\n" +"Допустимые значения: 1–5." msgid "Minimum speed for part cooling fan" msgstr "Минимальная скорость вентилятора обдува модели." -msgid "Speed of auxiliary part cooling fan. Auxiliary fan will run at this speed during printing except the first several layers which is defined by no cooling layers" -msgstr "Скорость вращения вспомогательного вентилятора для охлаждения моделей. Он всегда будет работать с этой скоростью, за исключением первых нескольких слоёв, которые обычно настроены на работу без охлаждения." +msgid "" +"Speed of auxiliary part cooling fan. Auxiliary fan will run at this speed " +"during printing except the first several layers which is defined by no " +"cooling layers.\n" +"Please enable auxiliary_fan in printer settings to use this feature. G-code " +"command: M106 P2 S(0-255)" +msgstr "" +"Скорость вращения вспомогательного вентилятора для охлаждения моделей. Он " +"всегда будет работать с этой скоростью, за исключением первых нескольких " +"слоёв, которые обычно настроены на работу без охлаждения.\n" +"Пожалуйста, включите вспомогательный вентилятор для охлаждения моделей " +"(auxiliary_fan) в настройках принтера, чтобы использовать эту функцию. \n" +"G-код команда: M106 P2 S(0-255)." msgid "Min" msgstr "Мин." -msgid "The lowest printable layer height for extruder. Used tp limits the minimum layer hight when enable adaptive layer height" -msgstr "Это наименьшая высота печатаемого слоя для данного экструдера и в то же время нижний предел для функции «Переменная высота слоёв»." +msgid "" +"The lowest printable layer height for extruder. Used tp limits the minimum " +"layer hight when enable adaptive layer height" +msgstr "" +"Это наименьшая высота печатаемого слоя для данного экструдера и в то же " +"время нижний предел для функции «Переменная высота слоёв»." msgid "Min print speed" msgstr "Минимальная скорость печати" -msgid "The minimum printing speed when slow down for cooling" -msgstr "Минимальная скорость печати при которой происходит сброс скорости для лучшего охлаждения." +msgid "" +"The minimum printing speed for the filament when slow down for better layer " +"cooling is enabled, when printing overhangs and when feature speeds are not " +"specified explicitly." +msgstr "" +"Минимальная скорость печати для текущего прутка при включенной функции " +"«Замедлять печать для лучшего охлаждения слоёв» при печати нависаний и когда " +"скорости элементов явно не задана." msgid "Nozzle diameter" msgstr "Диаметр сопла" @@ -7738,14 +10004,22 @@ msgstr "Диаметр сопла" msgid "Configuration notes" msgstr "Примечание конфигурации" -msgid "You can put here your personal notes. This text will be added to the G-code header comments." -msgstr "Здесь вы можете написать свои замечания для текущего профиля. Этот текст будет добавлен к комментариям в заголовок G-кода." +msgid "" +"You can put here your personal notes. This text will be added to the G-code " +"header comments." +msgstr "" +"Здесь вы можете написать свои замечания для текущего профиля. Этот текст " +"будет добавлен к комментариям в заголовок G-кода." msgid "Host Type" msgstr "Тип хоста" -msgid "Slic3r can upload G-code files to a printer host. This field must contain the kind of the host." -msgstr "Slic3r может загружать файл G-кода на хост принтера. Это поле должно содержать тип хоста." +msgid "" +"Slic3r can upload G-code files to a printer host. This field must contain " +"the kind of the host." +msgstr "" +"Slic3r может загружать файл G-кода на хост принтера. Это поле должно " +"содержать тип хоста." msgid "Nozzle volume" msgstr "Объём сопла" @@ -7753,6 +10027,57 @@ msgstr "Объём сопла" msgid "Volume of nozzle between the cutter and the end of nozzle" msgstr "Объём сопла между резцом прутка и кончиком сопла." +msgid "Cooling tube position" +msgstr "Позиция охлаждающей трубки" + +msgid "Distance of the center-point of the cooling tube from the extruder tip." +msgstr "" +"Расстояние между центральной точкой охлаждающей трубки и кончиком экструдера." + +msgid "Cooling tube length" +msgstr "Длина охлаждающей трубки" + +msgid "Length of the cooling tube to limit space for cooling moves inside it." +msgstr "" +"Длина охлаждающей трубки для ограничения перемещения при охлаждающих " +"движениях." + +msgid "High extruder current on filament swap" +msgstr "Повышение тока экструдера при замене прутка" + +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 "" +"Это может быть полезно для увеличения тока двигателя экструдера во время " +"замены прутка, чтобы быстро увеличить скорость подачи и преодолеть " +"сопротивление при загрузке прутка с плохой формой кончика." + +msgid "Filament parking position" +msgstr "Положение парковки прутка" + +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 "" +"Расстояние от кончика экструдера до точки, где размещается пруток при " +"выгрузке. Расстояние должно соответствовать значению в прошивке принтера." + +msgid "Extra loading distance" +msgstr "Дополнительная длина загрузки" + +msgid "" +"When set to zero, the distance the filament is moved from parking position " +"during load is exactly the same as it was moved back during unload. When " +"positive, it is loaded further, if negative, the loading move is shorter " +"than unloading." +msgstr "" +"Если установлено 0, то расстояние, которое проходит пруток при перемещении " +"из положения парковки во время загрузки, точно такое же, как и при выгрузке. " +"При положительном значении, она загружается дальше; при отрицательном, ход " +"загрузки короче (по сравнению с выгрузкой)." + msgid "Start end points" msgstr "Начальные и конечные точки" @@ -7762,8 +10087,15 @@ msgstr "Начальная и конечная точки от зоны обре msgid "Reduce infill retraction" msgstr "Уменьшать отката при заполнении" -msgid "Don't retract when the travel is in infill area absolutely. That means the oozing can't been seen. This can reduce times of retraction for complex model and save printing time, but make slicing and G-code generating slower" -msgstr "Отключает откат, когда перемещения полностью совершаются в области заполнения (и, таким образом, любые подтёки скорее всего будут не заметны). Это поможет снизить количество откатов при печати сложной модели и сэкономить время печати, но увеличит время нарезки и генерации G-кода." +msgid "" +"Don't retract when the travel is in infill area absolutely. That means the " +"oozing can't been seen. This can reduce times of retraction for complex " +"model and save printing time, but make slicing and G-code generating slower" +msgstr "" +"Отключает откат, когда перемещения полностью совершаются в области " +"заполнения (и, таким образом, любые подтёки скорее всего будут не заметны). " +"Это поможет снизить количество откатов при печати сложной модели и " +"сэкономить время печати, но увеличит время нарезки и генерации G-кода." msgid "Enable" msgstr "Включить" @@ -7774,23 +10106,34 @@ msgstr "Формат имени файла" msgid "User can self-define the project file name when export" msgstr "Пользователь может сам задать имя файла проекта при экспорте." -msgid "Make overhang printable" +msgid "Make overhangs printable" msgstr "Делать нависания пригодными для печати" msgid "Modify the geometry to print overhangs without support material." msgstr "Изменение геометрии модели для печати нависающих части без поддержки." -msgid "Make overhang printable maximum angle" +msgid "Make overhangs printable - Maximum angle" msgstr "Делать нависания пригодными для печати под максимальным углом" -msgid "Maximum angle of overhangs to allow after making more steep overhangs printable.90° will not change the model at all and allow any overhang, while 0 will replace all overhangs with conical material." -msgstr "Максимальный угол нависания, получаемый после изменения геометрии крутых нависаний. При 90°не происходит изменения формы модели. При 0° же, все нависания заменяются материалом конической геометрии." +msgid "" +"Maximum angle of overhangs to allow after making more steep overhangs " +"printable.90° will not change the model at all and allow any overhang, while " +"0 will replace all overhangs with conical material." +msgstr "" +"Максимальный угол нависания, получаемый после изменения геометрии крутых " +"нависаний. При 90°не происходит изменения формы модели. При 0° же, все " +"нависания заменяются материалом конической геометрии." -msgid "Make overhang printable hole area" +msgid "Make overhangs printable - Hole area" msgstr "Делать нависания отверстий пригодными для печати" -msgid "Maximum area of a hole in the base of the model before it's filled by conical material.A value of 0 will fill all the holes in the model base." -msgstr "Максимальная площадь отверстия в основании модели до его заполнения материалом конической геометрии. При 0 все отверстия в основании модели будут заполнены." +msgid "" +"Maximum area of a hole in the base of the model before it's filled by " +"conical material.A value of 0 will fill all the holes in the model base." +msgstr "" +"Максимальная площадь отверстия в основании модели до его заполнения " +"материалом конической геометрии. При 0 все отверстия в основании модели " +"будут заполнены." msgid "mm²" msgstr "мм²" @@ -7799,11 +10142,19 @@ msgid "Detect overhang wall" msgstr "Определять нависающие периметры" #, c-format, boost-format -msgid "Detect the overhang percentage relative to line width and use different speed to print. For 100%% overhang, bridge speed is used." -msgstr "Определяет процент нависания относительно ширины линии и использует разную скорость печати. Для 100%%-го свеса используется скорость печати мостов." +msgid "" +"Detect the overhang percentage relative to line width and use different " +"speed to print. For 100%% overhang, bridge speed is used." +msgstr "" +"Определяет процент нависания относительно ширины линии и использует разную " +"скорость печати. Для 100%%-го свеса используется скорость печати мостов." -msgid "Line width of inner wall. If expressed as a %, it will be computed over the nozzle diameter." -msgstr "Ширина экструзии внутренних периметров. Если задано в процентах, то значение вычисляться относительно диаметра сопла." +msgid "" +"Line width of inner wall. If expressed as a %, it will be computed over the " +"nozzle diameter." +msgstr "" +"Ширина экструзии внутренних периметров. Если задано в процентах, то значение " +"вычисляться относительно диаметра сопла." msgid "Speed of inner wall" msgstr "Скорость печати внутренних периметров." @@ -7811,8 +10162,18 @@ msgstr "Скорость печати внутренних периметров. msgid "Number of walls of every layer" msgstr "Количество периметров на каждом слое модели." -msgid "If you want to process the output G-code through custom scripts, just list their absolute paths here. Separate multiple scripts with a semicolon. Scripts will be passed the absolute path to the G-code file as the first argument, and they can access the Slic3r config settings by reading environment variables." -msgstr "Если вы хотите обработать выходной G-код с помощью пользовательских скриптов, просто перечислите здесь абсолютные пути к ним. Разделяйте скрипты точкой с запятой. Скриптам будет передан абсолютный путь к файлу G-кода в качестве первого аргумента, и они смогут получить доступ к настройкам конфигурации Slic3r, читая переменные окружения." +msgid "" +"If you want to process the output G-code through custom scripts, just list " +"their absolute paths here. Separate multiple scripts with a semicolon. " +"Scripts will be passed the absolute path to the G-code file as the first " +"argument, and they can access the Slic3r config settings by reading " +"environment variables." +msgstr "" +"Если вы хотите обработать выходной G-код с помощью пользовательских " +"скриптов, просто перечислите здесь абсолютные пути к ним. Разделяйте скрипты " +"точкой с запятой. Скриптам будет передан абсолютный путь к файлу G-кода в " +"качестве первого аргумента, и они смогут получить доступ к настройкам " +"конфигурации Slic3r, читая переменные окружения." msgid "Printer notes" msgstr "Примечания к принтеру" @@ -7824,7 +10185,9 @@ msgid "Raft contact Z distance" msgstr "Расстояние от подложки до модели по вертикали" msgid "Z gap between object and raft. Ignored for soluble interface" -msgstr "Зазор между моделью и подложкой. Значение игнорируется при выборе растворимого материала." +msgstr "" +"Зазор между моделью и подложкой. Значение игнорируется при выборе " +"растворимого материала." msgid "Raft expansion" msgstr "Расширение подложки" @@ -7842,28 +10205,48 @@ msgid "Initial layer expansion" msgstr "Расширение первого слоя" msgid "Expand the first raft or support layer to improve bed plate adhesion" -msgstr "Расширение первого слоя подложки или поддержки в плоскости XY для улучшения адгезии с материалами склонными к отлипанию и закручиванию." +msgstr "" +"Расширение первого слоя подложки или поддержки в плоскости XY для улучшения " +"адгезии с материалами склонными к отлипанию и закручиванию." msgid "Raft layers" msgstr "Слоёв в подложке" -msgid "Object will be raised by this number of support layers. Use this function to avoid wrapping when print ABS" -msgstr "Параметр устанавливает высоту подложки в слоях, тем самым поднимая модель на заданное количество слоёв от стола. Используйте эту функцию, чтобы избежать деформации при печати ABS пластиком." +msgid "" +"Object will be raised by this number of support layers. Use this function to " +"avoid wrapping when print ABS" +msgstr "" +"Параметр устанавливает высоту подложки в слоях, тем самым поднимая модель на " +"заданное количество слоёв от стола. Используйте эту функцию, чтобы избежать " +"деформации при печати ABS пластиком." -msgid "G-code path is genereated after simplifing the contour of model to avoid too much points and gcode lines in gcode file. Smaller value means higher resolution and more time to slice" -msgstr "Разрешение G-кода. Путь G-кода создаётся после упрощения контура модели, чтобы избежать слишком большого количества точек и линий в G-коде. Меньшее значение означает более высокое разрешение и больше времени для нарезки." +msgid "" +"G-code path is genereated after simplifing the contour of model to avoid too " +"much points and gcode lines in gcode file. Smaller value means higher " +"resolution and more time to slice" +msgstr "" +"Разрешение G-кода. Путь G-кода создаётся после упрощения контура модели, " +"чтобы избежать слишком большого количества точек и линий в G-коде. Меньшее " +"значение означает более высокое разрешение и больше времени для нарезки." msgid "Travel distance threshold" msgstr "Порог перемещения для отката" -msgid "Only trigger retraction when the travel distance is longer than this threshold" -msgstr "Откат будет срабатывать только в том случае, если расстояние перемещения превысит этот порог." +msgid "" +"Only trigger retraction when the travel distance is longer than this " +"threshold" +msgstr "" +"Откат будет срабатывать только в том случае, если расстояние перемещения " +"превысит этот порог." msgid "Retract amount before wipe" msgstr "Величина отката перед очисткой" -msgid "The length of fast retraction before wipe, relative to retraction length" -msgstr "Длина быстрого отката перед очисткой, выраженная в процентах от общей длины отката." +msgid "" +"The length of fast retraction before wipe, relative to retraction length" +msgstr "" +"Длина быстрого отката перед очисткой, выраженная в процентах от общей длины " +"отката." msgid "Retract when change layer" msgstr "Откат при смене слоя" @@ -7877,14 +10260,47 @@ msgstr "Длина" msgid "Retraction Length" msgstr "Длина отката" -msgid "Some amount of material in extruder is pulled back to avoid ooze during long travel. Set zero to disable retraction" -msgstr "Некоторое количество материала в экструдере откатывается назад, чтобы избежать его течи при длительном перемещении. 0 - отключение отката." +msgid "" +"Some amount of material in extruder is pulled back to avoid ooze during long " +"travel. Set zero to disable retraction" +msgstr "" +"Некоторое количество материала в экструдере откатывается назад, чтобы " +"избежать его течи при длительном перемещении. 0 - отключение отката." msgid "Z hop when retract" msgstr "Подъём оси Z при откате" -msgid "Whenever the retraction is done, the nozzle is lifted a little to create clearance between nozzle and the print. It prevents nozzle from hitting the print when travel move. Using spiral line to lift z can prevent stringing" -msgstr "Здесь задаётся на сколько миллиметров будет каждый раз приподниматься ось Z, когда срабатывает откат. Это предотвращает задевание соплом печатаемой модели при перемещении. Использование спирального типа подъёма оси Z может предотвратить образование паутины." +msgid "" +"Whenever the retraction is done, the nozzle is lifted a little to create " +"clearance between nozzle and the print. It prevents nozzle from hitting the " +"print when travel move. Using spiral line to lift z can prevent stringing" +msgstr "" +"Здесь задаётся на сколько миллиметров будет каждый раз приподниматься ось Z, " +"когда срабатывает откат. Это предотвращает задевание соплом печатаемой " +"модели при перемещении. Использование спирального типа подъёма оси Z может " +"предотвратить образование паутины." + +msgid "Z hop lower boundary" +msgstr "Приподнимать ось Z только ниже" + +msgid "" +"Z hop will only come into effect when Z is above this value and is below the " +"parameter: \"Z hop upper boundary\"" +msgstr "" +"Если указать положительное значение, ось Z будет подниматься только ниже " +"(до) заданной здесь высоты (высота считается от стола). Таким образом вы " +"можете запретить подъём оси Z выше установленной высоты." + +msgid "Z hop upper boundary" +msgstr "Приподнимать ось Z только выше" + +msgid "" +"If this value is positive, Z hop will only come into effect when Z is above " +"the parameter: \"Z hop lower boundary\" and is below this value" +msgstr "" +"Если указать положительное значение, ось Z будет подниматься только выше " +"(после) заданной здесь высоты (высота считается от стола). Таким образом вы " +"можете отключить подъём оси Z при печати на первых слоях (в начале печати)." msgid "Z hop type" msgstr "Тип подъёма оси Z" @@ -7898,20 +10314,34 @@ msgstr "Спиральный" msgid "Only lift Z above" msgstr "Приподнимать ось Z только выше" -msgid "If you set this to a positive value, Z lift will only take place above the specified absolute Z." -msgstr "Если указать положительное значение, ось Z будет подниматься только выше (после) заданной здесь высоты (высота считается от стола). Таким образом вы можете отключить подъём оси Z при печати первых слоёв." +msgid "" +"If you set this to a positive value, Z lift will only take place above the " +"specified absolute Z." +msgstr "" +"Если указать положительное значение, ось Z будет подниматься только выше " +"(после) заданной здесь высоты (высота считается от стола). Таким образом вы " +"можете отключить подъём оси Z при печати первых слоёв." msgid "Only lift Z below" msgstr "Приподнимать ось Z только ниже" -msgid "If you set this to a positive value, Z lift will only take place below the specified absolute Z." -msgstr "Если указать положительное значение, ось Z будет подниматься только ниже (до) заданной здесь высоты (высота считается от стола). Таким образом вы можете запретить подъём оси Z выше установленной высоты." +msgid "" +"If you set this to a positive value, Z lift will only take place below the " +"specified absolute Z." +msgstr "" +"Если указать положительное значение, ось Z будет подниматься только ниже " +"(до) заданной здесь высоты (высота считается от стола). Таким образом вы " +"можете запретить подъём оси Z выше установленной высоты." msgid "On surfaces" msgstr "На поверхностях" -msgid "Enforce Z Hop behavior. This setting is impacted by the above settings (Only lift Z above/below)." -msgstr "Принудительное поднятие оси Z. На этот параметр влияют указанные выше параметры (Приподнимать ось Z только выше/ниже)." +msgid "" +"Enforce Z Hop behavior. This setting is impacted by the above settings (Only " +"lift Z above/below)." +msgstr "" +"Принудительное поднятие оси Z. На этот параметр влияют указанные выше " +"параметры (Приподнимать ось Z только выше/ниже)." msgid "All Surfaces" msgstr "Все верхние поверхности" @@ -7928,11 +10358,21 @@ msgstr "На верхней и нижней" msgid "Extra length on restart" msgstr "Доп. длина подачи перед возобновлением печати" -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 "Дополнительная длина материала, которая будет выдавливаться после работы отката и перемещения. Для увеличения длины выдавливания ставится положительное значение (например 0.5 мм), для уменьшения отрицательное. Этот параметр редко нуждается в правке." +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 "" +"Дополнительная длина материала, которая будет выдавливаться после работы " +"отката и перемещения. Для увеличения длины выдавливания ставится " +"положительное значение (например 0.5 мм), для уменьшения отрицательное. Этот " +"параметр редко нуждается в правке." -msgid "When the retraction is compensated after changing tool, the extruder will push this additional amount of filament." -msgstr "Компенсация длины выдавливаемого пластика перед возобновлением печати после смены сопла." +msgid "" +"When the retraction is compensated after changing tool, the extruder will " +"push this additional amount of filament." +msgstr "" +"Компенсация длины выдавливаемого пластика перед возобновлением печати после " +"смены сопла." msgid "Retraction Speed" msgstr "Скорость извлечения при откате" @@ -7943,18 +10383,30 @@ msgstr "Скорость извлечения материала при отка msgid "Deretraction Speed" msgstr "Скорость заправки при откате" -msgid "Speed for reloading filament into extruder. Zero means same speed with retraction" -msgstr "Скорость возврата материала при откате. Если оставить 0, будет использоваться та же скорость что и при извлечении." +msgid "" +"Speed for reloading filament into extruder. Zero means same speed with " +"retraction" +msgstr "" +"Скорость возврата материала при откате. Если оставить 0, будет " +"использоваться та же скорость что и при извлечении." msgid "Use firmware retraction" msgstr "Исп. откат из прошивки" -msgid "This experimental setting uses G10 and G11 commands to have the firmware handle the retraction. This is only supported in recent Marlin." -msgstr "Эта экспериментальная опция использует команды G10 и G11, чтобы сама прошивка обрабатывала откаты. Поддерживается только в последних версиях Marlin." +msgid "" +"This experimental setting uses G10 and G11 commands to have the firmware " +"handle the retraction. This is only supported in recent Marlin." +msgstr "" +"Эта экспериментальная опция использует команды G10 и G11, чтобы сама " +"прошивка обрабатывала откаты. Поддерживается только в последних версиях " +"Marlin." msgid "Show auto-calibration marks" msgstr "Отображать на столе линии автокалибровки" +msgid "Disable set remaining print time" +msgstr "" + msgid "Seam position" msgstr "Позиция шва" @@ -7976,36 +10428,61 @@ msgstr "Случайно" msgid "Staggered inner seams" msgstr "Смещение внутренних швов" -msgid "This option causes the inner seams to be shifted backwards based on their depth, forming a zigzag pattern." -msgstr "Этот параметр заставляет внутренние швы смещаться назад в зависимости от их глубины, образуя зигзагообразный рисунок." +msgid "" +"This option causes the inner seams to be shifted backwards based on their " +"depth, forming a zigzag pattern." +msgstr "" +"Этот параметр заставляет внутренние швы смещаться назад в зависимости от их " +"глубины, образуя зигзагообразный рисунок." msgid "Seam gap" msgstr "Зазор шва" msgid "" -"In order to reduce the visibility of the seam in a closed loop extrusion, the loop is interrupted and shortened by a specified amount.\n" -"This amount can be specified in millimeters or as a percentage of the current extruder diameter. The default value for this parameter is 10%." +"In order to reduce the visibility of the seam in a closed loop extrusion, " +"the loop is interrupted and shortened by a specified amount.\n" +"This amount can be specified in millimeters or as a percentage of the " +"current extruder diameter. The default value for this parameter is 10%." msgstr "" -"Чтобы уменьшить видимость шва при печати замкнутого контура, контур будет укорачиваться на заданную величину.\n" -"Это величина может быть указана в миллиметрах или в процентах от текущего диаметра сопла. Значение по умолчанию - 10%." +"Чтобы уменьшить видимость шва при печати замкнутого контура, контур будет " +"укорачиваться на заданную величину.\n" +"Это величина может быть указана в миллиметрах или в процентах от текущего " +"диаметра сопла. Значение по умолчанию - 10%." msgid "Role base wipe speed" msgstr "Скорость очистки по типу экструзии" -msgid "The wipe speed is determined by the speed of the current extrusion role.e.g. if a wipe action is executed immediately following an outer wall extrusion, the speed of the outer wall extrusion will be utilized for the wipe action." -msgstr "Скорость очистки будет определяться скоростью текущего типа экструзии, т.е если операция очистки выполняется сразу после экструзии внешнего периметра, то для очистки используется скорость экструзии внешнего периметра." +msgid "" +"The wipe speed is determined by the speed of the current extrusion role.e.g. " +"if a wipe action is executed immediately following an outer wall extrusion, " +"the speed of the outer wall extrusion will be utilized for the wipe action." +msgstr "" +"Скорость очистки будет определяться скоростью текущего типа экструзии, т.е " +"если операция очистки выполняется сразу после экструзии внешнего периметра, " +"то для очистки используется скорость экструзии внешнего периметра." msgid "Wipe on loops" msgstr "Очистка в периметры" -msgid "To minimize the visibility of the seam in a closed loop extrusion, a small inward movement is executed before the extruder leaves the loop." -msgstr "Чтобы минимизировать видимость шва при экструзии по замкнутому контуру, перед выходом экструдера из контура выполняется небольшое движение внутрь." +msgid "" +"To minimize the visibility of the seam in a closed loop extrusion, a small " +"inward movement is executed before the extruder leaves the loop." +msgstr "" +"Чтобы минимизировать видимость шва при экструзии по замкнутому контуру, " +"перед выходом экструдера из контура выполняется небольшое движение внутрь." msgid "Wipe speed" msgstr "Скорость очистки" -msgid "The wipe speed is determined by the speed setting specified in this configuration.If the value is expressed as a percentage (e.g. 80%), it will be calculated based on the travel speed setting above.The default value for this parameter is 80%" -msgstr "Скорость очистки определяется текущей настройкой. Если задано в процентах, то она вычисляться относительно скорости перемещения. 80% - значение по умолчанию." +msgid "" +"The wipe speed is determined by the speed setting specified in this " +"configuration.If the value is expressed as a percentage (e.g. 80%), it will " +"be calculated based on the travel speed setting above.The default value for " +"this parameter is 80%" +msgstr "" +"Скорость очистки определяется текущей настройкой. Если задано в процентах, " +"то она вычисляться относительно скорости перемещения. 80% - значение по " +"умолчанию." msgid "Skirt distance" msgstr "Расстояние до юбки" @@ -8031,33 +10508,82 @@ msgstr "Скорость печати юбки" msgid "Speed of skirt, in mm/s. Zero means use default layer extrusion speed." msgstr "Скорость печати юбки (мм/с). 0 - скорость экструзии слоя по умолчанию." -msgid "The printing speed in exported gcode will be slowed down, when the estimated layer time is shorter than this value, to get better cooling for these layers" -msgstr "Скорость печати в экспортированном G-коде будет замедлена, если расчётное время печати слоя меньше этого значения, для обеспечения лучшего охлаждения этих слоёв." +msgid "" +"The printing speed in exported gcode will be slowed down, when the estimated " +"layer time is shorter than this value, to get better cooling for these layers" +msgstr "" +"Скорость печати в экспортированном G-коде будет замедлена, если расчётное " +"время печати слоя меньше этого значения, для обеспечения лучшего охлаждения " +"этих слоёв." msgid "Minimum sparse infill threshold" msgstr "Мин. порог разреженного заполнения" -msgid "Sparse infill area which is smaller than threshold value is replaced by internal solid infill" -msgstr "Область с разреженным заполнением, размер которого меньше этого порогового значения, заменяется сплошным заполнением." +msgid "" +"Sparse infill area which is smaller than threshold value is replaced by " +"internal solid infill" +msgstr "" +"Область с разреженным заполнением, размер которого меньше этого порогового " +"значения, заменяется сплошным заполнением." -msgid "Line width of internal solid infill. If expressed as a %, it will be computed over the nozzle diameter." -msgstr "Ширина экструзии для внутреннего сплошного заполнения. Если задано в процентах, то значение вычисляться относительно диаметра сопла." +msgid "" +"Line width of internal solid infill. If expressed as a %, it will be " +"computed over the nozzle diameter." +msgstr "" +"Ширина экструзии для внутреннего сплошного заполнения. Если задано в " +"процентах, то значение вычисляться относительно диаметра сопла." msgid "Speed of internal solid infill, not the top and bottom surface" -msgstr "Скорость печати внутреннего сплошного заполнения, за исключением верхней и нижней поверхностей." +msgstr "" +"Скорость печати внутреннего сплошного заполнения, за исключением верхней и " +"нижней поверхностей." msgid "Spiral vase" msgstr "Спиральная ваза" -msgid "Spiralize smooths out the z moves of the outer contour. And turns a solid model into a single walled print with solid bottom layers. The final generated model has no seam" -msgstr "Печать спиральных и пустотелых, а также тонкостенных моделей. Модель печатается в одну стенку без верхней поверхности, заполнения и поддержки. При этом сопло движется вдоль периметра непрерывно постепенно поднимаясь, так получаются ровные красивые вазы без видимых швов." +msgid "" +"Spiralize smooths out the z moves of the outer contour. And turns a solid " +"model into a single walled print with solid bottom layers. The final " +"generated model has no seam" +msgstr "" +"Печать спиральных и пустотелых, а также тонкостенных моделей. Модель " +"печатается в одну стенку без верхней поверхности, заполнения и поддержки. " +"При этом сопло движется вдоль периметра непрерывно постепенно поднимаясь, " +"так получаются ровные красивые вазы без видимых швов." + +msgid "Smooth Spiral" +msgstr "" msgid "" -"If smooth or traditional mode is selected, a timelapse video will be generated for each print. After each layer is printed, a snapshot is taken with the chamber camera. All of these snapshots are composed into a timelapse video when printing completes. If smooth mode is selected, the toolhead will move to the excess chute after each layer is printed and then take a snapshot. Since the melt " -"filament may leak from the nozzle during the process of taking a snapshot, prime tower is required for smooth mode to wipe nozzle." +"Smooth Spiral smoothes out X and Y moves as wellresulting in no visible seam " +"at all, even in the XY directions on walls that are not vertical" msgstr "" -"Если выбран плавный или обычный режим записи, то при каждой печати будет создаваться ускоренное видео печати. После печати каждого слоя встроенная камера делает снимок и по её завершении все эти снимки объединяются в единое ускоренное видео. Если включён плавный режим, то после печати каждого слоя головка перемещается к лотку для удаления излишков, а уже затем делается снимок. Очистка сопла на " -"черновой башне обязательна, т.к. при плавном режиме возможно вытекание материалы из сопла когда делается снимок." + +msgid "Max XY Smoothing" +msgstr "" + +msgid "" +"Maximum distance to move points in XY to try to achieve a smooth spiralIf " +"expressed as a %, it will be computed over nozzle diameter" +msgstr "" + +msgid "" +"If smooth or traditional mode is selected, a timelapse video will be " +"generated for each print. After each layer is printed, a snapshot is taken " +"with the chamber camera. All of these snapshots are composed into a " +"timelapse video when printing completes. If smooth mode is selected, the " +"toolhead will move to the excess chute after each layer is printed and then " +"take a snapshot. Since the melt filament may leak from the nozzle during the " +"process of taking a snapshot, prime tower is required for smooth mode to " +"wipe nozzle." +msgstr "" +"Если выбран плавный или обычный режим записи, то при каждой печати будет " +"создаваться ускоренное видео печати. После печати каждого слоя встроенная " +"камера делает снимок и по её завершении все эти снимки объединяются в единое " +"ускоренное видео. Если включён плавный режим, то после печати каждого слоя " +"головка перемещается к лотку для удаления излишков, а уже затем делается " +"снимок. Очистка сопла на черновой башне обязательна, т.к. при плавном режиме " +"возможно вытекание материалы из сопла когда делается снимок." msgid "Traditional" msgstr "Обычный" @@ -8072,19 +10598,90 @@ msgid "Start G-code when start the whole printing" msgstr "G-код выполняемый при каждом запуске печати." msgid "Start G-code when start the printing of this filament" -msgstr "Стартовый G-код выполняемый при запуске печати с текущей пластиковой нитью." +msgstr "" +"Стартовый G-код выполняемый при запуске печати с текущей пластиковой нитью." + +msgid "Single Extruder Multi Material" +msgstr "Мультиматериальный одиночный экструдер" + +msgid "Use single nozzle to print multi filament" +msgstr "" +"Использование одной экструзионной головы для печати несколькими видами/" +"цветами пластика." + +msgid "Manual Filament Change" +msgstr "Ручная замена прутка" + +msgid "" +"Enable this option to omit the custom Change filament G-code only at the " +"beginning of the print. The tool change command (e.g., T0) will be skipped " +"throughout the entire print. This is useful for manual multi-material " +"printing, where we use M600/PAUSE to trigger the manual filament change " +"action." +msgstr "" +"Включите эту опцию, если хотите пропустить пользовательский G-код смены " +"прутка только в начале печати. Команда смены инструмента (например, T0) " +"будет пропускаться на протяжении всей печати. Это полезно при ручной " +"мультиматериальной печати, где для запуска операции ручной смены прутка " +"используется команда M600." + +msgid "Purge in prime tower" +msgstr "Очистка в черновую башню" + +msgid "Purge remaining filament into prime tower" +msgstr "Очистка сопла от остатков материала в черновую башню" + +msgid "Enable filament ramming" +msgstr "Включить рэмминг прутка" + +msgid "No sparse layers (EXPERIMENTAL)" +msgstr "Отсутствие разреженных слоёв (экспериментально)" + +msgid "" +"If enabled, the wipe tower will not be printed on layers with no " +"toolchanges. On layers with a toolchange, extruder will travel downward to " +"print the wipe tower. User is responsible for ensuring there is no collision " +"with the print." +msgstr "" +"Если этот параметр включён, черновая башня не будет печататься на слоях где " +"не происходит смена инструмента. На слоях, где происходит смена инструмента, " +"экструдер будет опускаться вниз до верхней части черновой башни, чтобы " +"напечатать её. Эта функция помечена как экспериментальная, поэтому " +"пользователь несёт ответственность за то, чтобы не допустить столкновения " +"экструдера с напечатанным." + +msgid "Prime all printing extruders" +msgstr "Подготовка всех печатающих экструдеров" + +msgid "" +"If enabled, all printing extruders will be primed at the front edge of the " +"print bed at the start of the print." +msgstr "" +"Если этот параметр включён, все печатающие экструдеры в начале печати будут " +"подготавливаться на переднем крае стола." msgid "Slice gap closing radius" msgstr "Радиус закрытия пробелов при нарезке" -msgid "Cracks smaller than 2x gap closing radius are being filled during the triangle mesh slicing. The gap closing operation may reduce the final print resolution, therefore it is advisable to keep the value reasonably low." -msgstr "Трещины, меньше чем 2-кратный радиус закрытия пробелов, будут заполняться во время нарезки треугольной сетки. Операция закрытия пробелов может привести к снижению конечного разрешение печати, поэтому рекомендуется выставлять это значение достаточно низким." +msgid "" +"Cracks smaller than 2x gap closing radius are being filled during the " +"triangle mesh slicing. The gap closing operation may reduce the final print " +"resolution, therefore it is advisable to keep the value reasonably low." +msgstr "" +"Трещины, меньше чем 2-кратный радиус закрытия пробелов, будут заполняться во " +"время нарезки треугольной сетки. Операция закрытия пробелов может привести к " +"снижению конечного разрешение печати, поэтому рекомендуется выставлять это " +"значение достаточно низким." msgid "Slicing Mode" msgstr "Режим нарезки" -msgid "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to close all holes in the model." -msgstr "Режим нарезки «чётный-нечётный» используется для моделей самолетов с ресурса 3DLabPrint. А «Закрытие отверстий» для закрытия всех отверстий в модели." +msgid "" +"Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to " +"close all holes in the model." +msgstr "" +"Режим нарезки «чётный-нечётный» используется для моделей самолетов с ресурса " +"3DLabPrint. А «Закрытие отверстий» для закрытия всех отверстий в модели." msgid "Regular" msgstr "Обычный" @@ -8095,14 +10692,34 @@ msgstr "Чётный-нечётный" msgid "Close holes" msgstr "Закрытие отверстий" +msgid "Z offset" +msgstr "Смещение координат оси Z" + +msgid "" +"This value will be added (or subtracted) from all the Z coordinates in the " +"output G-code. It is used to compensate for bad Z endstop position: for " +"example, if your endstop zero actually leaves the nozzle 0.3mm far from the " +"print bed, set this to -0.3 (or fix your endstop)." +msgstr "" +"Это значение будет прибавлено (или вычтено) из всех Z координат в выходном G-" +"коде. Это, например, используется для компенсации неправильного положения " +"концевика оси Z." + msgid "Enable support" msgstr "Включить поддержку" msgid "Enable support generation." msgstr "Включить генерацию поддержки." -msgid "normal(auto) and tree(auto) is used to generate support automatically. If normal(manual) or tree(manual) is selected, only support enforcers are generated" -msgstr "Тип поддержки «Обычная (авто)» и «Древовидная (авто)» используются для автоматического создания поддержки. Если выбран тип поддержки «Обычная (вручную)» или «Древовидная (вручную)», генерируется только принудительная поддержка." +msgid "" +"normal(auto) and tree(auto) is used to generate support automatically. If " +"normal(manual) or tree(manual) is selected, only support enforcers are " +"generated" +msgstr "" +"Тип поддержки «Обычная (авто)» и «Древовидная (авто)» используются для " +"автоматического создания поддержки. Если выбран тип поддержки «Обычная " +"(вручную)» или «Древовидная (вручную)», генерируется только принудительная " +"поддержка." msgid "normal(auto)" msgstr "Обычная (авто)" @@ -8126,7 +10743,9 @@ msgid "Pattern angle" msgstr "Угол печати шаблона поддержки" msgid "Use this setting to rotate the support pattern on the horizontal plane." -msgstr "Используйте эту настройку для поворота шаблона поддержки в горизонтальной плоскости." +msgstr "" +"Используйте эту настройку для поворота шаблона поддержки в горизонтальной " +"плоскости." msgid "On build plate only" msgstr "Поддержка только от стола" @@ -8137,47 +10756,80 @@ msgstr "Создавать поддержку только от стола." msgid "Support critical regions only" msgstr "Поддержка только критических областей" -msgid "Only create support for critical regions including sharp tail, cantilever, etc." -msgstr "Создание поддержек только для критических областей, включая острые концы, консоли (горизонтально выступающие элементы) и т.д." +msgid "" +"Only create support for critical regions including sharp tail, cantilever, " +"etc." +msgstr "" +"Создание поддержек только для критических областей, включая острые концы, " +"консоли (горизонтально выступающие элементы) и т.д." msgid "Remove small overhangs" msgstr "Игнорировать небольшие нависания" msgid "Remove small overhangs that possibly need no supports." -msgstr "Не печатать поддержку под небольшими нависаниями, которые, как вам казалось, нуждаются в них." +msgstr "" +"Не печатать поддержку под небольшими нависаниями, которые, как вам казалось, " +"нуждаются в них." msgid "Top Z distance" msgstr "Зазор поддержки сверху" msgid "The z gap between the top support interface and object" -msgstr "Вертикальное расстояние между верхней частью модели и связующим слоем поддержки." +msgstr "" +"Вертикальное расстояние между верхней частью модели и связующим слоем " +"поддержки." msgid "Bottom Z distance" msgstr "Зазор поддержки снизу" msgid "The z gap between the bottom support interface and object" -msgstr "Вертикальное расстояние между нижней частью модели и связующим слоем поддержки." +msgstr "" +"Вертикальное расстояние между нижней частью модели и связующим слоем " +"поддержки." msgid "Support/raft base" msgstr "Базовая поддержка/подложка" -msgid "Filament to print support base and raft. \"Default\" means no specific filament for support and current filament is used" -msgstr "Пластиковая нить для печати базовой поддержки и подложки. Значение «По умолчанию» означает, что для поддержки используется текущая пластиковая нить." +msgid "" +"Filament to print support base and raft. \"Default\" means no specific " +"filament for support and current filament is used" +msgstr "" +"Пластиковая нить для печати базовой поддержки и подложки. Значение «По " +"умолчанию» означает, что для поддержки используется текущая пластиковая нить." -msgid "Line width of support. If expressed as a %, it will be computed over the nozzle diameter." -msgstr "Ширина экструзии для поддержки. Если задано в процентах, то значение вычисляться относительно диаметра сопла." +msgid "Avoid interface filament for base" +msgstr "" + +msgid "" +"Avoid using support interface filament to print support base if possible." +msgstr "" + +msgid "" +"Line width of support. If expressed as a %, it will be computed over the " +"nozzle diameter." +msgstr "" +"Ширина экструзии для поддержки. Если задано в процентах, то значение " +"вычисляться относительно диаметра сопла." msgid "Interface use loop pattern" msgstr "Связующий слой петлями" -msgid "Cover the top contact layer of the supports with loops. Disabled by default." -msgstr "Печатать контактный слой связующего слоя поддержки петлями. По умолчанию отключено." +msgid "" +"Cover the top contact layer of the supports with loops. Disabled by default." +msgstr "" +"Печатать контактный слой связующего слоя поддержки петлями. По умолчанию " +"отключено." msgid "Support/raft interface" msgstr "Связующий слой поддержки/подложки" -msgid "Filament to print support interface. \"Default\" means no specific filament for support interface and current filament is used" -msgstr "Пластиковая нить для печати связующего слоя поддержки. Значение «По умолчанию» означает, что для связующего слоя поддержки используется текущая пластиковая нить." +msgid "" +"Filament to print support interface. \"Default\" means no specific filament " +"for support interface and current filament is used" +msgstr "" +"Пластиковая нить для печати связующего слоя поддержки. Значение «По " +"умолчанию» означает, что для связующего слоя поддержки используется текущая " +"пластиковая нить." msgid "Top interface layers" msgstr "Связующих слоёв сверху" @@ -8188,17 +10840,27 @@ msgstr "Количество связующих слоёв сверху." msgid "Bottom interface layers" msgstr "Связующих слоёв снизу" +msgid "Number of bottom interface layers" +msgstr "" + +msgid "Same as top" +msgstr "" + msgid "Top interface spacing" msgstr "Расстояние между линиями связующего слоя сверху" msgid "Spacing of interface lines. Zero means solid interface" -msgstr "Расстояние между линиями связующего слоя сверху. Установите 0, чтобы получить сплошной слой." +msgstr "" +"Расстояние между линиями связующего слоя сверху. Установите 0, чтобы " +"получить сплошной слой." msgid "Bottom interface spacing" msgstr "Расстояние между линиями связующего слоя снизу" msgid "Spacing of bottom interface lines. Zero means solid interface" -msgstr "Расстояние между линиями связующего слоя снизу. Установите 0, чтобы получить сплошной слой." +msgstr "" +"Расстояние между линиями связующего слоя снизу. Установите 0, чтобы получить " +"сплошной слой." msgid "Speed of support interface" msgstr "Скорость печати связующего слоя поддержки." @@ -8218,8 +10880,14 @@ msgstr "Полость" msgid "Interface pattern" msgstr "Шаблон связующего слоя" -msgid "Line pattern of support interface. Default pattern for non-soluble support interface is Rectilinear, while default pattern for soluble support interface is Concentric" -msgstr "Шаблон, по которому будет происходить печать связующего слоя поддержки. При выборе по умолчанию, шаблон для нерастворимой связующей поддержки - прямолинейный, для растворимой - концентрический." +msgid "" +"Line pattern of support interface. Default pattern for non-soluble support " +"interface is Rectilinear, while default pattern for soluble support " +"interface is Concentric" +msgstr "" +"Шаблон, по которому будет происходить печать связующего слоя поддержки. При " +"выборе по умолчанию, шаблон для нерастворимой связующей поддержки - " +"прямолинейный, для растворимой - концентрический." msgid "Rectilinear Interlaced" msgstr "Прямолинейный (чередование направлений)" @@ -8234,20 +10902,31 @@ msgid "Normal Support expansion" msgstr "Горизонтальное расширение поддержки" msgid "Expand (+) or shrink (-) the horizontal span of normal support" -msgstr "Горизонтальное расширение (+) или сужение (-) базовой поддержки в плоскости XY." +msgstr "" +"Горизонтальное расширение (+) или сужение (-) базовой поддержки в плоскости " +"XY." msgid "Speed of support" msgstr "Скорость печати поддержки." msgid "" -"Style and shape of the support. For normal support, projecting the supports into a regular grid will create more stable supports (default), while snug support towers will save material and reduce object scarring.\n" -"For tree support, slim style will merge branches more aggressively and save a lot of material (default), while hybrid style will create similar structure to normal support under large flat overhangs." +"Style and shape of the support. For normal support, projecting the supports " +"into a regular grid will create more stable supports (default), while snug " +"support towers will save material and reduce object scarring.\n" +"For tree support, slim and organic style will merge branches more " +"aggressively and save a lot of material (default organic), while hybrid " +"style will create similar structure to normal support under large flat " +"overhangs." msgstr "" "Стиль и форма создаваемой поддержки.\n" "\n" -"Стиль «Сетка» создаёт более устойчивые опоры. Стиль «Аккуратный» экономит материал и уменьшает образование дефектов на моделях.\n" +"Стиль «Сетка» создаёт более устойчивые опоры (по умолчанию). Стиль " +"«Аккуратный» экономит материал и уменьшает образование дефектов на моделях.\n" "\n" -"Для древовидной поддержки, при стройном стиле происходит более агрессивное объединение ветвей и экономия материала (по умолчанию). В то время как гибридный стиль создаёт структуру, схожую с обычную поддержкой при больших плоских нависаниях." +"Для древовидной поддержки, при стройном и органическом стиле происходит " +"более агрессивное объединение ветвей и экономия материала (по умолчанию " +"органический). В то время как гибридный стиль создаёт структуру, схожую с " +"обычную поддержкой при больших плоских нависаниях." msgid "Snug" msgstr "Аккуратный" @@ -8267,45 +10946,94 @@ msgstr "Органический" msgid "Independent support layer height" msgstr "Независимая высота слоя поддержки" -msgid "Support layer uses layer height independent with object layer. This is to support customizing z-gap and save print time.This option will be invalid when the prime tower is enabled." -msgstr "Слои поддержки будут иметь высоту слоя, отличную от высоты слоя модели. Это необходимо для настройки зазора между моделью и поддержкой для экономии времени печати. Опция неактивна, когда включена черновая башня." +msgid "" +"Support layer uses layer height independent with object layer. This is to " +"support customizing z-gap and save print time.This option will be invalid " +"when the prime tower is enabled." +msgstr "" +"Слои поддержки будут иметь высоту слоя, отличную от высоты слоя модели. Это " +"необходимо для настройки зазора между моделью и поддержкой для экономии " +"времени печати. Опция неактивна, когда включена черновая башня." msgid "Threshold angle" msgstr "Пороговый угол поддержки" -msgid "Support will be generated for overhangs whose slope angle is below the threshold." -msgstr "Для нависаний, угол наклона которых ниже заданного порогового значения, будут использоваться поддержки." +msgid "" +"Support will be generated for overhangs whose slope angle is below the " +"threshold." +msgstr "" +"Для нависаний, угол наклона которых ниже заданного порогового значения, " +"будут использоваться поддержки." msgid "Tree support branch angle" msgstr "Угол нависания ветвей древовидной поддержки" -msgid "This setting determines the maximum overhang angle that t he branches of tree support allowed to make.If the angle is increased, the branches can be printed more horizontally, allowing them to reach farther." -msgstr "Этот параметр определяет максимальный угол нависания ветвей древовидной поддержки. При увеличении угла, ветви печатаются более горизонтально, что позволяет им достигать большего охвата. При указании меньшего угла, поддержка будет более вертикальной и устойчивой." +msgid "" +"This setting determines the maximum overhang angle that t he branches of " +"tree support allowed to make.If the angle is increased, the branches can be " +"printed more horizontally, allowing them to reach farther." +msgstr "" +"Этот параметр определяет максимальный угол нависания ветвей древовидной " +"поддержки. При увеличении угла, ветви печатаются более горизонтально, что " +"позволяет им достигать большего охвата. При указании меньшего угла, " +"поддержка будет более вертикальной и устойчивой." msgid "Preferred Branch Angle" msgstr "Предпочтительный угол ответвления" #. TRN PrintSettings: "Organic supports" > "Preferred Branch Angle" -msgid "The preferred angle of the branches, when they do not have to avoid the model. Use a lower angle to make them more vertical and more stable. Use a higher angle for branches to merge faster." -msgstr "Предпочтительный угол ответвления ветвей, при котором не нужно избегать модель. При указании меньшего угла поддержка будет более вертикальной и устойчивой. Для получения большего охвата указывайте более высокий угол." +msgid "" +"The preferred angle of the branches, when they do not have to avoid the " +"model. Use a lower angle to make them more vertical and more stable. Use a " +"higher angle for branches to merge faster." +msgstr "" +"Предпочтительный угол ответвления ветвей, при котором не нужно избегать " +"модель. При указании меньшего угла поддержка будет более вертикальной и " +"устойчивой. Для получения большего охвата указывайте более высокий угол." msgid "Tree support branch distance" msgstr "Расстояние между ветвями древовидной поддержки" -msgid "This setting determines the distance between neighboring tree support nodes." -msgstr "Этот параметр определяет, насколько далеко должны друг от друга располагаться ветви при касании модели." +msgid "" +"This setting determines the distance between neighboring tree support nodes." +msgstr "" +"Этот параметр определяет, насколько далеко должны друг от друга " +"располагаться ветви при касании модели." + +msgid "Branch Density" +msgstr "Плотность ветвей" + +#. TRN PrintSettings: "Organic supports" > "Branch Density" +msgid "" +"Adjusts the density of the support structure used to generate the tips of " +"the branches. A higher value results in better overhangs but the supports " +"are harder to remove, thus it is recommended to enable top support " +"interfaces instead of a high branch density value if dense interfaces are " +"needed." +msgstr "" +"Регулирует плотность создания ветвей в месте контакта с моделью. Большее " +"значение приводит к улучшению качества печати нависаний, но такие поддержки " +"сложнее удалять, поэтому рекомендуется вместо высокого значения плотности " +"ветвей включать связующие слои поддержки." msgid "Adaptive layer height" msgstr "Переменная высота слоёв" -msgid "Enabling this option means the height of tree support layer except the first will be automatically calculated " -msgstr "Включение автоматического расчёта высоты слоя древовидной поддержки, кроме первого слоя." +msgid "" +"Enabling this option means the height of tree support layer except the " +"first will be automatically calculated " +msgstr "" +"Включение автоматического расчёта высоты слоя древовидной поддержки, кроме " +"первого слоя." msgid "Auto brim width" msgstr "Автоширина каймы" -msgid "Enabling this option means the width of the brim for tree support will be automatically calculated" -msgstr "Включение автоматического расчёта ширины каймы для древовидной поддержки." +msgid "" +"Enabling this option means the width of the brim for tree support will be " +"automatically calculated" +msgstr "" +"Включение автоматического расчёта ширины каймы для древовидной поддержки." msgid "Tree support brim width" msgstr "Ширина каймы древовидной поддержки" @@ -8313,55 +11041,131 @@ msgstr "Ширина каймы древовидной поддержки" msgid "Distance from tree branch to the outermost brim line" msgstr "Расстояние от древовидной поддержки до внешней линии каймы." +msgid "Tip Diameter" +msgstr "Диаметр кончика ветки" + +#. TRN PrintSettings: "Organic supports" > "Tip Diameter" +msgid "Branch tip diameter for organic supports." +msgstr "Диаметр кончика ветки органической поддержки." + # ??? msgid "Tree support branch diameter" msgstr "Диаметр ветвей древовидной поддержки" msgid "This setting determines the initial diameter of support nodes." -msgstr "Этот параметр определяет начальный диаметр ветвей, т.е. их диаметр в месте контакта с моделью." +msgstr "" +"Этот параметр определяет начальный диаметр ветвей, т.е. их диаметр в месте " +"контакта с моделью." -msgid "Tree support wall loops" -msgstr "Периметров древовидной поддержки" +#. TRN PrintSettings: #lmFIXME +msgid "Branch Diameter Angle" +msgstr "Угол изменения диаметра ветвей" -msgid "This setting specify the count of walls around tree support" -msgstr "Этот параметр определяет количество периметров у печатаемой древовидной поддержки." +#. TRN PrintSettings: "Organic supports" > "Branch Diameter Angle" +msgid "" +"The angle of the branches' diameter as they gradually become thicker towards " +"the bottom. An angle of 0 will cause the branches to have uniform thickness " +"over their length. A bit of an angle can increase stability of the organic " +"support." +msgstr "" +"Угол изменения диаметра ветвей по мере их постепенного утолщения к " +"основанию. Если значение угла равно 0, ветви будут иметь одинаковую толщину " +"по всей своей длине. Небольшой угол может повысить устойчивость органической " +"поддержки." + +msgid "Branch Diameter with double walls" +msgstr "Диаметр ветвей с двойными стенками" + +#. TRN PrintSettings: "Organic supports" > "Branch Diameter" +msgid "" +"Branches with area larger than the area of a circle of this diameter will be " +"printed with double walls for stability. Set this value to zero for no " +"double walls." +msgstr "" +"Ветви, толщина которых больше указанного диаметра, будут напечатаны с " +"двойными стенками для прочности. Установите 0, если двойные стенки у ветвей " +"не нужны." + +msgid "Support wall loops" +msgstr "" + +msgid "This setting specify the count of walls around support" +msgstr "" msgid "Tree support with infill" msgstr "Древовидная поддержка с заполнением" -msgid "This setting specifies whether to add infill inside large hollows of tree support" -msgstr "Этот параметр определяет, следует ли заполнять большие полости внутри древовидной поддержки." +msgid "" +"This setting specifies whether to add infill inside large hollows of tree " +"support" +msgstr "" +"Этот параметр определяет, следует ли заполнять большие полости внутри " +"древовидной поддержки." + +msgid "Activate temperature control" +msgstr "Вкл. контроль температуры" + +msgid "" +"Enable this option for chamber temperature control. An M191 command will be " +"added before \"machine_start_gcode\"\n" +"G-code commands: M141/M191 S(0-255)" +msgstr "" +"Для контроля температуры в камере принтера включите эту опцию. Команда M191 " +"будет добавлена перед стартовый G-кодом принтера (machine_start_gcode).\n" +"G-код команда: M141/M191 S(0-255)" msgid "Chamber temperature" msgstr "Температура термокамеры" -msgid "Target chamber temperature" -msgstr "Температура, которую необходимо поддерживать внутри принтера." +msgid "" +"Higher chamber temperature can help suppress or reduce warping and " +"potentially lead to higher interlayer bonding strength for high temperature " +"materials like ABS, ASA, PC, PA and so on.At the same time, the air " +"filtration of ABS and ASA will get worse.While for PLA, PETG, TPU, PVA and " +"other low temperature materials,the actual chamber temperature should not be " +"high to avoid cloggings, so 0 which stands for turning off is highly " +"recommended" +msgstr "" +"Более высокая температура в камере может помочь уменьшить или даже исключить " +"коробление материала. Так же это улучшает межслойное соединения у " +"высокотемпературных материалов, таких как ABS, ASA, PC, PA и т.д. (в то же " +"время фильтрация воздуха при печати ABS и ASA сделает её хуже). Для " +"низкотемпературных материалов, таких как PLA, PETG, TPU, PVA и т. д., " +"фактическая температура в камере не должна быть слишком высокой, чтобы " +"избежать засорения сопла, поэтому настоятельно рекомендуется установить " +"температуру в камере равной 0°C." msgid "Nozzle temperature for layers after the initial one" msgstr "Температура сопла при печати для слоёв после первого." -msgid "Bed temperature difference" -msgstr "Разница температур подогреваемого стола" - -msgid "Do not recommend bed temperature of other layer to be lower than initial layer for more than this threshold. Too low bed temperature of other layer may cause the model broken free from build plate" -msgstr "Не рекомендуется, чтобы температура последующих слоёв была ниже температуры первого слоя, более чем на это пороговое значение. Слишком низкая температура последующих слоёв может привести к отрыву модели от стола." - msgid "Detect thin wall" msgstr "Обнаружение тонких стенок" -msgid "Detect thin wall which can't contain two line width. And use single line to print. Maybe printed not very well, because it's not closed loop" -msgstr "Обнаружение тонких стенок (стенки одинарной ширины), которые можно напечатать только в один проход экструдера. Возможно, будет напечатано не очень хорошо, так как это не замкнутый контур." +msgid "" +"Detect thin wall which can't contain two line width. And use single line to " +"print. Maybe printed not very well, because it's not closed loop" +msgstr "" +"Обнаружение тонких стенок (стенки одинарной ширины), которые можно " +"напечатать только в один проход экструдера. Возможно, будет напечатано не " +"очень хорошо, так как это не замкнутый контур." -msgid "This gcode is inserted when change filament, including T command to trigger tool change" -msgstr "Этот G-код вставляется при смене материала, включая команду T для запуска смены инструмента." +msgid "" +"This gcode is inserted when change filament, including T command to trigger " +"tool change" +msgstr "" +"Этот G-код вставляется при смене материала, включая команду T для запуска " +"смены инструмента." # ??? msgid "This gcode is inserted when the extrusion role is changed" msgstr "Этот G-код вставляется при смене роли экструзии." -msgid "Line width for top surfaces. If expressed as a %, it will be computed over the nozzle diameter." -msgstr "Ширина экструзии для верхней поверхности. Если задано в процентах, то значение вычисляться относительно диаметра сопла." +msgid "" +"Line width for top surfaces. If expressed as a %, it will be computed over " +"the nozzle diameter." +msgstr "" +"Ширина экструзии для верхней поверхности. Если задано в процентах, то " +"значение вычисляться относительно диаметра сопла." msgid "Speed of top surface infill which is solid" msgstr "Скорость печати верхних сплошных поверхностей." @@ -8369,8 +11173,14 @@ msgstr "Скорость печати верхних сплошных повер msgid "Top shell layers" msgstr "Сплошных слоёв сверху" -msgid "This is the number of solid layers of top shell, including the top surface layer. When the thickness calculated by this value is thinner than top shell thickness, the top shell layers will be increased" -msgstr "Количество сплошных слоёв при печати верхней поверхности модели. Если толщина, рассчитанная с помощью этого значения, меньше толщины оболочки сверху, количество сплошных слоёв сверху будет увеличено." +msgid "" +"This is the number of solid layers of top shell, including the top surface " +"layer. When the thickness calculated by this value is thinner than top shell " +"thickness, the top shell layers will be increased" +msgstr "" +"Количество сплошных слоёв при печати верхней поверхности модели. Если " +"толщина, рассчитанная с помощью этого значения, меньше толщины оболочки " +"сверху, количество сплошных слоёв сверху будет увеличено." msgid "Top solid layers" msgstr "Верхних сплошных слоёв" @@ -8378,10 +11188,20 @@ msgstr "Верхних сплошных слоёв" msgid "Top shell thickness" msgstr "Толщина оболочки сверху" -msgid "The number of top solid layers is increased when slicing if the thickness calculated by top shell layers is thinner than this value. This can avoid having too thin shell when layer height is small. 0 means that this setting is disabled and thickness of top shell is absolutely determained by top shell layers" +msgid "" +"The number of top solid layers is increased when slicing if the thickness " +"calculated by top shell layers is thinner than this value. This can avoid " +"having too thin shell when layer height is small. 0 means that this setting " +"is disabled and thickness of top shell is absolutely determained by top " +"shell layers" msgstr "" -"Минимальная толщина оболочки сверху в мм. Если толщина оболочки, рассчитанная по количеству сплошных слоёв сверху, меньше этого значения, количество сплошных слоёв сверху будет автоматически увеличено при нарезке, для удовлетворения минимальной толщины оболочки. Это позволяет избежать слишком тонкой оболочки при небольшой высоте слоя. 0 означает, что этот параметр отключён, а толщина оболочки " -"сверху полностью задаётся количеством сплошных слоёв снизу." +"Минимальная толщина оболочки сверху в мм. Если толщина оболочки, " +"рассчитанная по количеству сплошных слоёв сверху, меньше этого значения, " +"количество сплошных слоёв сверху будет автоматически увеличено при нарезке, " +"для удовлетворения минимальной толщины оболочки. Это позволяет избежать " +"слишком тонкой оболочки при небольшой высоте слоя. 0 означает, что этот " +"параметр отключён, а толщина оболочки сверху полностью задаётся количеством " +"сплошных слоёв снизу." msgid "Speed of travel which is faster and without extrusion" msgstr "Скорость перемещения экструдера при позиционировании без печати." @@ -8389,17 +11209,37 @@ msgstr "Скорость перемещения экструдера при по msgid "Wipe while retracting" msgstr "Очистка сопла при откате" -msgid "Move nozzle along the last extrusion path when retracting to clean leaked material on nozzle. This can minimize blob when print new part after travel" -msgstr "Позволяет соплу совершать движение очистки во время отката, перемещая его вдоль последнего пути экструзии. Это может снизить появление дефектов (каплей, пупырышек) при печати новой детали после перемещения." +msgid "" +"Move nozzle along the last extrusion path when retracting to clean leaked " +"material on nozzle. This can minimize blob when print new part after travel" +msgstr "" +"Позволяет соплу совершать движение очистки во время отката, перемещая его " +"вдоль последнего пути экструзии. Это может снизить появление дефектов " +"(каплей, пупырышек) при печати новой детали после перемещения." msgid "Wipe Distance" msgstr "Расстояние очистки внешней стенки" -msgid "Discribe how long the nozzle will move along the last path when retracting" -msgstr "Задаёт расстояние перемещения, добавленное после печати внешней стенки при совершении отката, чтобы сделать шов по оси Z менее заметным." +msgid "" +"Discribe how long the nozzle will move along the last path when " +"retracting. \n" +"\n" +"Depending on how long the wipe operation lasts, how fast and long the " +"extruder/filament retraction settings are, a retraction move may be needed " +"to retract the remaining filament. \n" +"\n" +"Setting a value in the retract amount before wipe setting below will perform " +"any excess retraction before the wipe, else it will be performed after." +msgstr "" -msgid "The wiping tower can be used to clean up the residue on the nozzle and stabilize the chamber pressure inside the nozzle, in order to avoid appearance defects when printing objects." -msgstr "Башня очистки используется для очистки сопла от остатков материала и стабилизации давления внутри сопла, чтобы избежать дефектов снаружи печатаемой модели." +msgid "" +"The wiping tower can be used to clean up the residue on the nozzle and " +"stabilize the chamber pressure inside the nozzle, in order to avoid " +"appearance defects when printing objects." +msgstr "" +"Башня очистки используется для очистки сопла от остатков материала и " +"стабилизации давления внутри сопла, чтобы избежать дефектов снаружи " +"печатаемой модели." msgid "Purging volumes" msgstr "Объём очистки" @@ -8407,14 +11247,19 @@ msgstr "Объём очистки" msgid "Flush multiplier" msgstr "Множитель очистки" -msgid "The actual flushing volumes is equal to the flush multiplier multiplied by the flushing volumes in the table." -msgstr "Реальные объёмы очистки равны множителю очистки, умноженному на объёмы очистки указанные в таблице." +msgid "" +"The actual flushing volumes is equal to the flush multiplier multiplied by " +"the flushing volumes in the table." +msgstr "" +"Реальные объёмы очистки равны множителю очистки, умноженному на объёмы " +"очистки указанные в таблице." msgid "Prime volume" msgstr "Объём сброса на черновой башни" msgid "The volume of material to prime extruder on tower." -msgstr "Объём выдавленного материала для заправки экструдера на черновой башне." +msgstr "" +"Объём выдавленного материала для заправки экструдера на черновой башне." msgid "Width" msgstr "Ширина" @@ -8431,8 +11276,13 @@ msgstr "Угол поворота черновой башни относител msgid "Stabilization cone apex angle" msgstr "Угол вершины стабилизирующего конуса" -msgid "Angle at the apex of the cone that is used to stabilize the wipe tower. Larger angle means wider base." -msgstr "Регулировка угла «стабилизирующего конуса», который используется для предотвращения опрокидывания черновой башни. Больший угол означает более широкое основание конуса." +msgid "" +"Angle at the apex of the cone that is used to stabilize the wipe tower. " +"Larger angle means wider base." +msgstr "" +"Регулировка угла «стабилизирующего конуса», который используется для " +"предотвращения опрокидывания черновой башни. Больший угол означает более " +"широкое основание конуса." msgid "Wipe tower purge lines spacing" msgstr "Расстояние между линиями очистки черновой башни" @@ -8443,60 +11293,177 @@ msgstr "Расстояние между линиями очистки на че msgid "Wipe tower extruder" msgstr "Экструдер черновой башни" -msgid "The extruder to use when printing perimeter of the wipe tower. Set to 0 to use the one that is available (non-soluble would be preferred)." -msgstr "Номер экструдера, которым печатаются периметры черновой башни. Установите 0, чтобы использовать тот, который доступен (предпочтительнее нерастворимый)." +msgid "" +"The extruder to use when printing perimeter of the wipe tower. Set to 0 to " +"use the one that is available (non-soluble would be preferred)." +msgstr "" +"Номер экструдера, которым печатаются периметры черновой башни. Установите 0, " +"чтобы использовать тот, который доступен (предпочтительнее нерастворимый)." msgid "Purging volumes - load/unload volumes" msgstr "Объём очистки - Объём загрузки/выгрузки" -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 "Этот параметр задаёт объём материала, который будет выдавлен на черновую башню для прочистки сопла при смене экструдеров/инструментов. Эти значения используются для упрощения создания полноты объёмов очистки указанной ниже." +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 "" +"Этот параметр задаёт объём материала, который будет выдавлен на черновую " +"башню для прочистки сопла при смене экструдеров/инструментов. Эти значения " +"используются для упрощения создания полноты объёмов очистки указанной ниже." -msgid "Purging after filament change will be done inside objects' infills. This may lower the amount of waste and decrease the print time. If the walls are printed with transparent filament, the mixed color infill will be seen outside. It will not take effect, unless the prime tower is enabled." -msgstr "Очистка сопла после смены материала будет производиться в заполнение модели. Это снижает количество отходов и сокращает время печати. Эта функция работает только при включенной черновой башне." +msgid "" +"Purging after filament change will be done inside objects' infills. This may " +"lower the amount of waste and decrease the print time. If the walls are " +"printed with transparent filament, the mixed color infill will be seen " +"outside. It will not take effect, unless the prime tower is enabled." +msgstr "" +"Очистка сопла после смены материала будет производиться в заполнение модели. " +"Это снижает количество отходов и сокращает время печати. Эта функция " +"работает только при включенной черновой башне." -msgid "Purging after filament change will be done inside objects' support. This may lower the amount of waste and decrease the print time. It will not take effect, unless the prime tower is enabled." -msgstr "Очистка сопла после смены материала будет производиться в поддержку модели. Это снижает количество отходов и сокращает время печати. Эта функция работает только при включенной черновой башне." +msgid "" +"Purging after filament change will be done inside objects' support. This may " +"lower the amount of waste and decrease the print time. It will not take " +"effect, unless the prime tower is enabled." +msgstr "" +"Очистка сопла после смены материала будет производиться в поддержку модели. " +"Это снижает количество отходов и сокращает время печати. Эта функция " +"работает только при включенной черновой башне." -msgid "This object will be used to purge the nozzle after a filament change to save filament and decrease the print time. Colours of the objects will be mixed as a result. It will not take effect, unless the prime tower is enabled." -msgstr "Эта модель будет использоваться для очистки сопла после смены материала для его экономии и сокращения времени печати. В результате цвета будут смешиваться. Это не будет действовать, если не будет включена черновая башня." +msgid "" +"This object will be used to purge the nozzle after a filament change to save " +"filament and decrease the print time. Colours of the objects will be mixed " +"as a result. It will not take effect, unless the prime tower is enabled." +msgstr "" +"Эта модель будет использоваться для очистки сопла после смены материала для " +"его экономии и сокращения времени печати. В результате цвета будут " +"смешиваться. Это не будет действовать, если не будет включена черновая башня." msgid "Maximal bridging distance" msgstr "Максимальное длина моста" msgid "Maximal distance between supports on sparse infill sections." -msgstr "Максимальное расстояние между опорами на разряженных участках заполнения." +msgstr "" +"Максимальное расстояние между опорами на разряженных участках заполнения." msgid "X-Y hole compensation" msgstr "Коррекция размеров отверстий по XY" -msgid "Holes of object will be grown or shrunk in XY plane by the configured value. Positive value makes holes bigger. Negative value makes holes smaller. This function is used to adjust size slightly when the object has assembling issue" -msgstr "Отверстия модели будут увеличены или уменьшены в плоскости XY на заданное значение. Положительное значение увеличивает отверстия, отрицательное - уменьшает. Эта функция используется для небольшой корректировки размера, когда возникают проблемы со сборкой." +msgid "" +"Holes of object will be grown or shrunk in XY plane by the configured value. " +"Positive value makes holes bigger. Negative value makes holes smaller. This " +"function is used to adjust size slightly when the object has assembling issue" +msgstr "" +"Отверстия модели будут увеличены или уменьшены в плоскости XY на заданное " +"значение. Положительное значение увеличивает отверстия, отрицательное - " +"уменьшает. Эта функция используется для небольшой корректировки размера, " +"когда возникают проблемы со сборкой." msgid "X-Y contour compensation" msgstr "Коррекция размеров модели по XY" -msgid "Contour of object will be grown or shrunk in XY plane by the configured value. Positive value makes contour bigger. Negative value makes contour smaller. This function is used to adjust size slightly when the object has assembling issue" -msgstr "Параметр отвечает за смещение границы контура печатаемой модели в плоскости XY на заданное значение. Положительное значение увеличивает контур. Отрицательное значение уменьшает контур. Эта функция используется для небольшой корректировки размера, когда возникают проблемы со сборкой." +msgid "" +"Contour of object will be grown or shrunk in XY plane by the configured " +"value. Positive value makes contour bigger. Negative value makes contour " +"smaller. This function is used to adjust size slightly when the object has " +"assembling issue" +msgstr "" +"Параметр отвечает за смещение границы контура печатаемой модели в плоскости " +"XY на заданное значение. Положительное значение увеличивает контур. " +"Отрицательное значение уменьшает контур. Эта функция используется для " +"небольшой корректировки размера, когда возникают проблемы со сборкой." + +# ??? +# Преобразование отверстий в многограннники +msgid "Convert holes to polyholes" +msgstr "Многогранные отверстия" + +# ??? +# Поиск отверстий близких к кругу в двух или более слоях +# Расчёт многогранного отверстия вычисляется по диаметру сопла. +msgid "" +"Search for almost-circular holes that span more than one layer and convert " +"the geometry to polyholes. Use the nozzle size and the (biggest) diameter to " +"compute the polyhole.\n" +"See http://hydraraptor.blogspot.com/2011/02/polyholes.html" +msgstr "" +"Поиск цилиндрических отверстий в двух или более слоях и преобразование их " +"геометрии в многогранники. Для расчёта многогранного отверстия используется " +"размер сопла и наибольший диаметр найденного отверстия.\n" +"Подробнее на http://hydraraptor.blogspot.com/2011/02/polyholes.html" + +# ??? +# Предел обнаружения многогранного отверстия +msgid "Polyhole detection margin" +msgstr "Предел обнаружения" + +#, fuzzy, c-format, boost-format +msgid "" +"Maximum defection of a point to the estimated radius of the circle.\n" +"As cylinders are often exported as triangles of varying size, points may not " +"be on the circle circumference. This setting allows you some leway to " +"broaden the detection.\n" +"In mm or in % of the radius." +msgstr "" +"Максимальное отклонение точки от расчётного радиуса окружности.\n" +"Поскольку цилиндры часто экспортируются в виде треугольников разного " +"размера, точки могут находиться не на окружности круга. Эта настройка " +"позволяет в некоторой степени расширить эту область обнаружения.\n" +"Значение задаётся в мм или в процентах от радиуса." + +msgid "Polyhole twist" +msgstr "Скручивание многогранника" + +msgid "Rotate the polyhole every layer." +msgstr "Вращение многогранного отверстия на каждом слое." msgid "G-code thumbnails" msgstr "Эскизы G-кода" -msgid "Picture sizes to be stored into a .gcode and .sl1 / .sl1s files, in the following format: \"XxY, XxY, ...\"" -msgstr "Размеры изображения, которые будут сохранены в файлах .sl1 / .sl1s в следующем формате: \"XxY, XxY, ...\"" +msgid "" +"Picture sizes to be stored into a .gcode and .sl1 / .sl1s files, in the " +"following format: \"XxY, XxY, ...\"" +msgstr "" +"Размеры изображения, которые будут сохранены в файлах .sl1 / .sl1s в " +"следующем формате: \"XxY, XxY, ...\"" + +msgid "Format of G-code thumbnails" +msgstr "Формат эскизов G-кода" + +msgid "" +"Format of G-code thumbnails: PNG for best quality, JPG for smallest size, " +"QOI for low memory firmware" +msgstr "" +"Формат эскизов G-кода: PNG для наилучшего качества, JPG для наименьшего " +"размера, QOI для прошивки с малым объемом памяти." msgid "Use relative E distances" msgstr "Исп. относительные координаты для экструдера" -msgid "Relative extrusion is recommended when using \"label_objects\" option.Some extruders work better with this option unckecked (absolute extrusion mode). Wipe tower is only compatible with relative mode. It is always enabled on BambuLab printers. Default is checked" +msgid "" +"Relative extrusion is recommended when using \"label_objects\" option.Some " +"extruders work better with this option unckecked (absolute extrusion mode). " +"Wipe tower is only compatible with relative mode. It is always enabled on " +"BambuLab printers. Default is checked" msgstr "" -"Относительная экструзия рекомендуется при использовании опции «Название моделей».\n" +"Относительная экструзия рекомендуется при использовании опции «Название " +"моделей».\n" "\n" -"Черновая башня совместима только с относительной экструзией. На принтерах BambuLab она всегда включена (флажок стоит).\n" -"Некоторые экструдеры работают лучше при отключении этой опции (абсолютный режим экструзии)." +"Черновая башня совместима только с относительной экструзией. На принтерах " +"BambuLab она всегда включена (флажок стоит).\n" +"Некоторые экструдеры работают лучше при отключении этой опции (абсолютный " +"режим экструзии)." -msgid "Classic wall generator produces walls with constant extrusion width and for very thin areas is used gap-fill. Arachne engine produces walls with variable extrusion width" -msgstr "Движок классического генератора периметров создаёт их с постоянной шириной экструзии, а для очень тонких участков используется параметр «Заполнение пробелов». Движок Arachne же создает периметры с переменной шириной экструзии." +msgid "" +"Classic wall generator produces walls with constant extrusion width and for " +"very thin areas is used gap-fill. Arachne engine produces walls with " +"variable extrusion width" +msgstr "" +"Движок классического генератора периметров создаёт их с постоянной шириной " +"экструзии, а для очень тонких участков используется параметр «Заполнение " +"пробелов». Движок Arachne же создает периметры с переменной шириной " +"экструзии." msgid "Classic" msgstr "Классический" @@ -8507,64 +11474,122 @@ msgstr "Arachne" msgid "Wall transition length" msgstr "Длина перехода к периметру" -msgid "When transitioning between different numbers of walls as the part becomes thinner, a certain amount of space is allotted to split or join the wall segments. It's expressed as a percentage over nozzle diameter" -msgstr "При переходе между разным количеством периметров по мере того, как деталь становится тоньше, выделяется определенное пространство для разделения или соединения линий периметров. Выражается в процентах от диаметра сопла." +msgid "" +"When transitioning between different numbers of walls as the part becomes " +"thinner, a certain amount of space is allotted to split or join the wall " +"segments. It's expressed as a percentage over nozzle diameter" +msgstr "" +"При переходе между разным количеством периметров по мере того, как деталь " +"становится тоньше, выделяется определенное пространство для разделения или " +"соединения линий периметров. Выражается в процентах от диаметра сопла." msgid "Wall transitioning filter margin" msgstr "Поле фильтра при переходе между периметрами" msgid "" -"Prevent transitioning back and forth between one extra wall and one less. This margin extends the range of extrusion widths which follow to [Minimum wall width - margin, 2 * Minimum wall width + margin]. Increasing this margin reduces the number of transitions, which reduces the number of extrusion starts/stops and travel time. However, large extrusion width variation can lead to under- or " -"overextrusion problems. It's expressed as a percentage over nozzle diameter" +"Prevent transitioning back and forth between one extra wall and one less. " +"This margin extends the range of extrusion widths which follow to [Minimum " +"wall width - margin, 2 * Minimum wall width + margin]. Increasing this " +"margin reduces the number of transitions, which reduces the number of " +"extrusion starts/stops and travel time. However, large extrusion width " +"variation can lead to under- or overextrusion problems. It's expressed as a " +"percentage over nozzle diameter" msgstr "" -"Предотвращает переход туда и обратно между одним лишним периметром и одним недостающим. Это поле расширяет диапазон значений ширины экструзии, который определяется как [Минимальная ширина периметра - Поле, 2 * Минимальная ширина периметра + Поле]. Расширение этого поля позволяет сократить количество переходов, что в свою очередь позволяет сократить количество запусков/остановок экструдирования " -"и время перемещения. Однако большой разброс значений ширины экструзии может привести к проблемам недо/переэкструзии материала. Если задано в процентах, то расчёт производится относительно диаметра сопла." +"Предотвращает переход туда и обратно между одним лишним периметром и одним " +"недостающим. Это поле расширяет диапазон значений ширины экструзии, который " +"определяется как [Минимальная ширина периметра - Поле, 2 * Минимальная " +"ширина периметра + Поле]. Расширение этого поля позволяет сократить " +"количество переходов, что в свою очередь позволяет сократить количество " +"запусков/остановок экструдирования и время перемещения. Однако большой " +"разброс значений ширины экструзии может привести к проблемам недо/" +"переэкструзии материала. Если задано в процентах, то расчёт производится " +"относительно диаметра сопла." msgid "Wall transitioning threshold angle" msgstr "Пороговый угол перехода между периметрами" -msgid "When to create transitions between even and odd numbers of walls. A wedge shape with an angle greater than this setting will not have transitions and no walls will be printed in the center to fill the remaining space. Reducing this setting reduces the number and length of these center walls, but may leave gaps or overextrude" +msgid "" +"When to create transitions between even and odd numbers of walls. A wedge " +"shape with an angle greater than this setting will not have transitions and " +"no walls will be printed in the center to fill the remaining space. Reducing " +"this setting reduces the number and length of these center walls, but may " +"leave gaps or overextrude" msgstr "" -"Когда требуется создавать переходы между чётным и нечётным количеством периметров. Клиновидная форма с углом, превышающим этот параметр, не будет иметь переходов, и периметры не будут напечатаны в центре для заполнения оставшегося пространства. Уменьшение значения этого параметра позволяет сократить количество и длину этих центральных периметров, но при этом могут остаться зазоры или произойти " -"чрезмерное экструдирование." +"Когда требуется создавать переходы между чётным и нечётным количеством " +"периметров. Клиновидная форма с углом, превышающим этот параметр, не будет " +"иметь переходов, и периметры не будут напечатаны в центре для заполнения " +"оставшегося пространства. Уменьшение значения этого параметра позволяет " +"сократить количество и длину этих центральных периметров, но при этом могут " +"остаться зазоры или произойти чрезмерное экструдирование." msgid "Wall distribution count" msgstr "Счётчик распределений по периметрам" -msgid "The number of walls, counted from the center, over which the variation needs to be spread. Lower values mean that the outer walls don't change in width" -msgstr "Количество периметров, отсчитываемое от центра, на которые необходимо распространить изменения. Более низкое значение означает, что ширина внешних периметров не изменяется." +msgid "" +"The number of walls, counted from the center, over which the variation needs " +"to be spread. Lower values mean that the outer walls don't change in width" +msgstr "" +"Количество периметров, отсчитываемое от центра, на которые необходимо " +"распространить изменения. Более низкое значение означает, что ширина внешних " +"периметров не изменяется." msgid "Minimum feature size" msgstr "Минимальный размер элемента" -msgid "Minimum thickness of thin features. Model features that are thinner than this value will not be printed, while features thicker than the Minimum feature size will be widened to the Minimum wall width. It's expressed as a percentage over nozzle diameter" -msgstr "Минимальная толщина тонких элементов. Элементы модели, которые тоньше этого значения, не будут напечатаны, в то время как элементы, толщина которых превышает «Минимальный размер элемента», будут расширены до минимальной ширины периметра. Выражается в процентах от диаметра сопла." +msgid "" +"Minimum thickness of thin features. Model features that are thinner than " +"this value will not be printed, while features thicker than the Minimum " +"feature size will be widened to the Minimum wall width. It's expressed as a " +"percentage over nozzle diameter" +msgstr "" +"Минимальная толщина тонких элементов. Элементы модели, которые тоньше этого " +"значения, не будут напечатаны, в то время как элементы, толщина которых " +"превышает «Минимальный размер элемента», будут расширены до минимальной " +"ширины периметра. Выражается в процентах от диаметра сопла." msgid "First layer minimum wall width" msgstr "Минимальная ширина периметра первого слоя" -msgid "The minimum wall width that should be used for the first layer is recommended to be set to the same size as the nozzle. This adjustment is expected to enhance adhesion." -msgstr "Минимальная ширина периметра, используемая для печати первого слоя. Значение рекомендуется устанавливать равным диаметру сопла. Ожидается, что такая регулировка повышает адгезию." +msgid "" +"The minimum wall width that should be used for the first layer is " +"recommended to be set to the same size as the nozzle. This adjustment is " +"expected to enhance adhesion." +msgstr "" +"Минимальная ширина периметра, используемая для печати первого слоя. Значение " +"рекомендуется устанавливать равным диаметру сопла. Ожидается, что такая " +"регулировка повышает адгезию." msgid "Minimum wall width" msgstr "Минимальная ширина периметра" -msgid "Width of the wall that will replace thin features (according to the Minimum feature size) of the model. If the Minimum wall width is thinner than the thickness of the feature, the wall will become as thick as the feature itself. It's expressed as a percentage over nozzle diameter" -msgstr "Ширина периметра, которая заменит тонкие элементы (в соответствии с минимальным размера элемента) модели. Если минимальная ширина периметра меньше толщины элемента, толщина периметра будет приведена к толщине самого элемента. Если задано в процентах, то значение вычисляться относительно диаметра сопла." +msgid "" +"Width of the wall that will replace thin features (according to the Minimum " +"feature size) of the model. If the Minimum wall width is thinner than the " +"thickness of the feature, the wall will become as thick as the feature " +"itself. It's expressed as a percentage over nozzle diameter" +msgstr "" +"Ширина периметра, которая заменит тонкие элементы (в соответствии с " +"минимальным размера элемента) модели. Если минимальная ширина периметра " +"меньше толщины элемента, толщина периметра будет приведена к толщине самого " +"элемента. Если задано в процентах, то значение вычисляться относительно " +"диаметра сопла." msgid "Detect narrow internal solid infill" msgstr "Обнаруживать узкую область сплошного заполнения" -msgid "This option will auto detect narrow internal solid infill area. If enabled, concentric pattern will be used for the area to speed printing up. Otherwise, rectilinear pattern is used defaultly." -msgstr "Этот параметр автоматически определяет узкую внутреннюю область сплошного заполнения. Если включено, для ускорения печати будет использоваться концентрический шаблон. В противном случае по умолчанию используется прямолинейный шаблон." +msgid "" +"This option will auto detect narrow internal solid infill area. If enabled, " +"concentric pattern will be used for the area to speed printing up. " +"Otherwise, rectilinear pattern is used defaultly." +msgstr "" +"Этот параметр автоматически определяет узкую внутреннюю область сплошного " +"заполнения. Если включено, для ускорения печати будет использоваться " +"концентрический шаблон. В противном случае по умолчанию используется " +"прямолинейный шаблон." msgid "invalid value " msgstr "недопустимое значение " -#, c-format, boost-format -msgid " doesn't work at 100%% density " -msgstr " не работает при 100%% заполнении " - msgid "Invalid value when spiral vase mode is enabled: " msgstr "Недопустимое значение при включенном режиме спиральной вазы: " @@ -8574,160 +11599,62 @@ msgstr "слишком большая ширина экструзии " msgid " not in range " msgstr " вне диапазона " -msgid "Export 3MF" -msgstr "Экспорт в 3MF" +msgid "Minimum save" +msgstr "Минимальное сохранение" -msgid "Export project as 3MF." -msgstr "Экспортировать проект в 3MF." - -msgid "Export slicing data" -msgstr "Экспорт данных нарезки" - -msgid "Export slicing data to a folder." -msgstr "Экспорт данных нарезки в папку." - -msgid "Load slicing data" -msgstr "Загрузка данных нарезки" - -msgid "Load cached slicing data from directory" -msgstr "Загружать кэшированные данные нарезки из папки" - -msgid "Export STL" -msgstr "Экспорт в STL" - -msgid "Export the objects as multiple STL." -msgstr "Экспорт моделей как несколько STL." - -msgid "Slice" -msgstr "Нарезать" - -msgid "Slice the plates: 0-all plates, i-plate i, others-invalid" -msgstr "Нарезка столов: 0 - все столы, i - стол i, остальные - недопустимы" - -msgid "Show command help." -msgstr "Показать справку по командам." - -msgid "UpToDate" -msgstr "Актуальная версия" - -msgid "Update the configs values of 3mf to latest." -msgstr "Обновить значения конфигурации для 3mf до актуальных." - -msgid "Load default filaments" -msgstr "Загрузка материалов по умолчанию" - -msgid "Load first filament as default for those not loaded" -msgstr "Использовать первый материал по умолчанию, если не загружен другой" - -msgid "mtcpp" -msgstr "mtcpp" - -msgid "max triangle count per plate for slicing." -msgstr "максимальное количество треугольников на стол при нарезке." - -msgid "mstpp" -msgstr "mstpp" - -msgid "max slicing time per plate in seconds." -msgstr "максимальное время нарезки на стол в секундах." +msgid "export 3mf with minimum size." +msgstr "экспорт 3mf файла с минимальным размером." msgid "No check" msgstr "Без проверки" msgid "Do not run any validity checks, such as gcode path conflicts check." -msgstr "Не запускать никакие проверки валидности, такие как проверка на конфликт путей в G-коде." +msgstr "" +"Не запускать никакие проверки валидности, такие как проверка на конфликт " +"путей в G-коде." -msgid "Normative check" -msgstr "Нормативная проверка" +msgid "Ensure on bed" +msgstr "Обеспечивать размещение на столе" -msgid "Check the normative items." -msgstr "Проверка соответствия модели определенным нормативным требованиям." +msgid "" +"Lift the object above the bed when it is partially below. Disabled by default" +msgstr "" +"Поднимает модель над столом, когда она частично находится ниже его уровня. " +"По умолчанию отключено." -msgid "Output Model Info" -msgstr "Информация о выходной модели" +msgid "Orient Options" +msgstr "Параметры ориентации" -msgid "Output the model's information." -msgstr "Вывод информации о модели." +msgid "Orient options: 0-disable, 1-enable, others-auto" +msgstr "" +"Параметры ориентации: 0 - отключить, 1 - включить, другие - автоматически" -msgid "Export Settings" -msgstr "Экспорт настроек" +msgid "Rotation angle around the Z axis in degrees." +msgstr "Угол поворота вокруг оси Z в градусах." -msgid "Export settings to a file." -msgstr "Экспорт настроек в файл." +msgid "Rotate around Y" +msgstr "Поворот вокруг оси Y" -msgid "Send progress to pipe" -msgstr "Отправить информацию о прогрессе" - -msgid "Send progress to pipe." -msgstr "Отправить информацию о прогрессе." - -msgid "Arrange Options" -msgstr "Параметры расстановки" - -msgid "Arrange options: 0-disable, 1-enable, others-auto" -msgstr "Параметры расстановки: 0 - отключить, 1 - включить, другие - автоматически" - -# ??? -msgid "Repetions count" -msgstr "Количество повторений" - -# ??? -msgid "Repetions count of the whole model" -msgstr "Количество повторений для всей модели" - -msgid "Convert Unit" -msgstr "Преобразовать единицу измерения" - -msgid "Convert the units of model" -msgstr "Преобразование единиц измерения модели" - -msgid "Orient the model" -msgstr "Ориентация модели" - -msgid "Scale the model by a float factor" -msgstr "Масштабирование модели с помощью коэффициента." - -msgid "Load General Settings" -msgstr "Загрузка общих настроек" - -msgid "Load process/machine settings from the specified file" -msgstr "Загрузка настроек процесса/принтера из указанного файла" - -msgid "Load Filament Settings" -msgstr "Загрузка настроек материала" - -msgid "Load filament settings from the specified file list" -msgstr "Загрузка настроек пластиковой нити из указанного списка файлов" - -msgid "Skip Objects" -msgstr "Исключить модели" - -msgid "Skip some objects in this print" -msgstr "Пропустить некоторые модели в этом печати" - -msgid "load uptodate process/machine settings when using uptodate" -msgstr "Загрузить последние настройки процесса/принтера при использовании актуальной версии" - -msgid "load uptodate process/machine settings from the specified file when using uptodate" -msgstr "Загружать последние настройки процесса/принтера из указанного файла при использовании актуальной версии" +msgid "Rotation angle around the Y axis in degrees." +msgstr "Угол поворота вокруг оси Y в градусах." msgid "Data directory" msgstr "Папка конфигурации пользователя" -msgid "Load and store settings at the given directory. This is useful for maintaining different profiles or including configurations from a network storage." -msgstr "Загрузка и сохранение настроек будет производиться в заданную папку. Это полезно для сохранения различных профилей или конфигураций из сетевого хранилища." +msgid "" +"Load and store settings at the given directory. This is useful for " +"maintaining different profiles or including configurations from a network " +"storage." +msgstr "" +"Загрузка и сохранение настроек будет производиться в заданную папку. Это " +"полезно для сохранения различных профилей или конфигураций из сетевого " +"хранилища." -msgid "Output directory" -msgstr "Папка для сохранения" +msgid "Load custom gcode" +msgstr "Загрузить пользовательский G-код" -msgid "Output directory for the exported files." -msgstr "Папка для сохранения экспортируемых файлов." - -msgid "Debug level" -msgstr "Уровень отладки" - -msgid "Sets debug logging level. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:trace\n" -msgstr "Задаёт параметр чувствительности записи событий в журнал. \\\"0: Неустранимая ошибка, 1: Ошибка, 2: Предупреждение, 3: Информация, 4: Отладка, 5: Трассировка\n" +msgid "Load custom gcode from json" +msgstr "Загрузить пользовательской G-код из json" msgid "Error in zip archive" msgstr "Ошибка с zip-архивом" @@ -8760,7 +11687,9 @@ msgid "large overhangs" msgstr "большая области нависания" #, c-format, boost-format -msgid "It seems object %s has %s. Please re-orient the object or enable support generation." +msgid "" +"It seems object %s has %s. Please re-orient the object or enable support " +"generation." msgstr "" "Похоже, что у модели %s имеются замечания - %s. \n" "Переориентируйте её или включите генерацию поддержки." @@ -8768,24 +11697,25 @@ msgstr "" msgid "Optimizing toolpath" msgstr "Оптимизация траектории инструмента" -msgid "Empty layers around bottom are replaced by nearest normal layers." -msgstr "Пустые слои обнаруженные на дне модели были заменены ближайшими нормальными слоями." - -msgid "The model has too many empty layers." -msgstr "Модель имеет слишком много пустых слоев." - msgid "Slicing mesh" msgstr "Нарезка сетки" -msgid "No layers were detected. You might want to repair your STL file(s) or check their size or thickness and retry.\n" -msgstr "Слоёв не обнаружено. Возможно, требуется починить STL файл(ы) или проверить размер/толщину и повторить попытку.\n" +msgid "" +"No layers were detected. You might want to repair your STL file(s) or check " +"their size or thickness and retry.\n" +msgstr "" +"Слоёв не обнаружено. Возможно, требуется починить STL файл(ы) или проверить " +"размер/толщину и повторить попытку.\n" msgid "" -"An object's XY size compensation will not be used because it is also color-painted.\n" +"An object's XY size compensation will not be used because it is also color-" +"painted.\n" "XY Size compensation can not be combined with color-painting." msgstr "" -"Коррекция горизонтальных размеров модели не будет действовать, поскольку для этой модели была выполнена операция окрашивания.\n" -"Коррекция горизонтальных размеров модели не может использоваться в сочетании с функцией раскрашивания." +"Коррекция горизонтальных размеров модели не будет действовать, поскольку для " +"этой модели была выполнена операция окрашивания.\n" +"Коррекция горизонтальных размеров модели не может использоваться в сочетании " +"с функцией раскрашивания." #, c-format, boost-format msgid "Support: generate toolpath at layer %d" @@ -8818,8 +11748,11 @@ msgstr "Поддержка: ремонт отверстий на слое %d" msgid "Support: propagate branches at layer %d" msgstr "Поддержка: построение ветвей на слое %d" -msgid "Unknown file format. Input file must have .stl, .obj, .amf(.xml) extension." -msgstr "Неизвестный формат файла. Входной файл должен иметь расширение *.stl, *.obj, *.amf(.xml)." +msgid "" +"Unknown file format. Input file must have .stl, .obj, .amf(.xml) extension." +msgstr "" +"Неизвестный формат файла. Входной файл должен иметь расширение *.stl, *.obj, " +"*.amf(.xml)." msgid "Loading of a model file failed." msgstr "Не удалось загрузить файл модели." @@ -8828,7 +11761,9 @@ msgid "The supplied file couldn't be read because it's empty" msgstr "Предоставленный файл не может быть прочитан, так как он пуст." msgid "Unknown file format. Input file must have .3mf or .zip.amf extension." -msgstr "Неизвестный формат файла. Входной файл должен иметь расширение *.3mf или *.zip.amf." +msgstr "" +"Неизвестный формат файла. Входной файл должен иметь расширение *.3mf или *." +"zip.amf." msgid "Canceled" msgstr "Отменено" @@ -8881,14 +11816,13 @@ msgstr "Калибровка" msgid "Finish" msgstr "Завершить" -msgid "Wiki" -msgstr "Вики-сайт" - msgid "How to use calibration result?" msgstr "Как использовать результаты калибровки?" -msgid "You could change the Flow Dynamics Calibration Factor in material editing" -msgstr "Коэффициент калибровки динамики потока можно изменить в настройках материала." +msgid "" +"You could change the Flow Dynamics Calibration Factor in material editing" +msgstr "" +"Коэффициент калибровки динамики потока можно изменить в настройках материала." msgid "" "The current firmware version of the printer does not support calibration.\n" @@ -8900,6 +11834,12 @@ msgstr "" msgid "Calibration not supported" msgstr "Калибровка не поддерживается" +msgid "Error desc" +msgstr "Описание ошибки" + +msgid "Extra info" +msgstr "Доп. информация" + msgid "Flow Dynamics" msgstr "Динамика потока" @@ -8915,12 +11855,26 @@ msgstr "Введите имя, который хотите сохранить н msgid "The name cannot exceed 40 characters." msgstr "Максимальная длина имени 40 символов." +#, c-format, boost-format +msgid "" +"Please input valid values:\n" +"Start value: >= %.1f\n" +"End value: <= %.1f\n" +"End value: > Start value\n" +"Value step: >= %.3f)" +msgstr "" +"Введите допустимое значение:\n" +"Начальное: >= %.1f\n" +"Конечное: <= %.1f\n" +"Конечное: > Начальное\n" +"Шаг: >= %.3f)" + msgid "The name cannot be empty." msgstr "Имя не может быть пустым." -#, boost-format -msgid "The selected preset: %1% is not found." -msgstr "Выбранный профиль: %1% не найден." +#, c-format, boost-format +msgid "The selected preset: %s is not found." +msgstr "" msgid "The name cannot be the same as the system preset name." msgstr "Имя не должно совпадать с именем системного профиля." @@ -8931,8 +11885,11 @@ msgstr "Имя совпадает с именем другого существ msgid "create new preset failed." msgstr "не удалось создать новый профиль." -msgid "Are you sure to cancel the current calibration and return to the home page?" -msgstr "Вы уверены, что хотите отменить текущую калибровку и вернуться на главную страницу?" +msgid "" +"Are you sure to cancel the current calibration and return to the home page?" +msgstr "" +"Вы уверены, что хотите отменить текущую калибровку и вернуться на главную " +"страницу?" msgid "No Printer Connected!" msgstr "Принтер не подключён!" @@ -8943,6 +11900,9 @@ msgstr "Принтер ещё не подключен." msgid "Please select filament to calibrate." msgstr "Пожалуйста, выберите пруток для калибровки." +msgid "The input value size must be 3." +msgstr "Размер входного значения должен быть равен 3." + msgid "Connecting to printer..." msgstr "Подключение к принтеру..." @@ -8961,9 +11921,6 @@ msgstr "Выберите хотя бы один пруток для калибр msgid "Flow rate calibration result has been saved to preset" msgstr "Результат калибровки динамики потока был сохранён в профиль" -msgid "The input value size must be 3." -msgstr "Размер входного значения должен быть равен 3." - msgid "Max volumetric speed calibration result has been saved to preset" msgstr "Результат калибровки максимальной объёмной скорости сохранен в профиль" @@ -8971,15 +11928,24 @@ msgid "When do you need Flow Dynamics Calibration" msgstr "В каких случаях необходима калибровка динамики потока" msgid "" -"We now have added the auto-calibration for different filaments, which is fully automated and the result will be saved into the printer for future use. You only need to do the calibration in the following limited cases:\n" -"1. If you introduce a new filament of different brands/models or the filament is damp;\n" +"We now have added the auto-calibration for different filaments, which is " +"fully automated and the result will be saved into the printer for future " +"use. You only need to do the calibration in the following limited cases:\n" +"1. If you introduce a new filament of different brands/models or the " +"filament is damp;\n" "2. if the nozzle is worn out or replaced with a new one;\n" -"3. If the max volumetric speed or print temperature is changed in the filament setting." +"3. If the max volumetric speed or print temperature is changed in the " +"filament setting." msgstr "" -"Мы добавили функцию автоматической калибровки для различных материалов, которая полностью автоматизирована, а результат калибровки сохраняется в принтере для дальнейшего использования. Калибровка требуется только в следующих ограниченных случаях:\n" -"1. При использовании нового материала другого производителя/типа или при отсыревании материала;\n" +"Мы добавили функцию автоматической калибровки для различных материалов, " +"которая полностью автоматизирована, а результат калибровки сохраняется в " +"принтере для дальнейшего использования. Калибровка требуется только в " +"следующих ограниченных случаях:\n" +"1. При использовании нового материала другого производителя/типа или при " +"отсыревании материала;\n" "2. При износе сопла или его замене на новое;\n" -"3. При изменении в настройках материала максимальной объёмной скорости или температуры печати." +"3. При изменении в настройках материала максимальной объёмной скорости или " +"температуры печати." msgid "About this calibration" msgstr "О данном виде калибровки" @@ -8987,64 +11953,129 @@ msgstr "О данном виде калибровки" msgid "" "Please find the details of Flow Dynamics Calibration from our wiki.\n" "\n" -"Usually the calibration is unnecessary. When you start a single color/material print, with the \"flow dynamics calibration\" option checked in the print start menu, the printer will follow the old way, calibrate the filament before the print; When you start a multi color/material print, the printer will use the default compensation parameter for the filament during every filament switch which " -"will have a good result in most cases.\n" +"Usually the calibration is unnecessary. When you start a single color/" +"material print, with the \"flow dynamics calibration\" option checked in the " +"print start menu, the printer will follow the old way, calibrate the " +"filament before the print; When you start a multi color/material print, the " +"printer will use the default compensation parameter for the filament during " +"every filament switch which will have a good result in most cases.\n" "\n" -"Please note there are a few cases that will make the calibration result not reliable: using a texture plate to do the calibration; the build plate does not have good adhesion (please wash the build plate or apply gluestick!) ...You can find more from our wiki.\n" +"Please note there are a few cases that will make the calibration result not " +"reliable: using a texture plate to do the calibration; the build plate does " +"not have good adhesion (please wash the build plate or apply gluestick!) ..." +"You can find more from our wiki.\n" "\n" -"The calibration results have about 10 percent jitter in our test, which may cause the result not exactly the same in each calibration. We are still investigating the root cause to do improvements with new updates." +"The calibration results have about 10 percent jitter in our test, which may " +"cause the result not exactly the same in each calibration. We are still " +"investigating the root cause to do improvements with new updates." msgstr "" -"Подробную информацию про калибровку динамики потока можно найти на нашем вики-сайте.\n" +"Подробную информацию про калибровку динамики потока можно найти на нашем " +"вики-сайте.\n" "\n" "При обычных обстоятельствах калибровка не требуется. \n" -"Если при запуске печати одним цветом/материалом в меню запуска печати отмечена опция «Калибровка динамики потока», то калибровка пластиковой нити будет производится старым способом. \n" -"При запуске печати несколькими цветами/материалами, принтер будет использовать параметр компенсации по умолчанию для материала при каждой его смене, что в большинстве случаев позволяет получить хороший результат.\n" +"Если при запуске печати одним цветом/материалом в меню запуска печати " +"отмечена опция «Калибровка динамики потока», то калибровка пластиковой нити " +"будет производится старым способом. \n" +"При запуске печати несколькими цветами/материалами, принтер будет " +"использовать параметр компенсации по умолчанию для материала при каждой его " +"смене, что в большинстве случаев позволяет получить хороший результат.\n" "\n" -"Обратите внимание, что есть несколько случаев, когда результат калибровки будет недостоверным. Это использование для калибровки текстурированной печатной пластины и когда у печатной пластины плохая адгезия с материалом. Более подробную информацию можно найти на нашем вики-сайте.\n" +"Обратите внимание, что есть несколько случаев, когда результат калибровки " +"будет недостоверным. Это использование для калибровки текстурированной " +"печатной пластины и когда у печатной пластины плохая адгезия с материалом. " +"Более подробную информацию можно найти на нашем вики-сайте.\n" "\n" -"По нашим тестам, результаты калибровки имеют погрешность примерно 10%, что может приводить к разным результатам при каждой калибровке. Мы продолжаем выяснять причину, чтобы улучшить ситуацию в новых обновлениях." +"По нашим тестам, результаты калибровки имеют погрешность примерно 10%, что " +"может приводить к разным результатам при каждой калибровке. Мы продолжаем " +"выяснять причину, чтобы улучшить ситуацию в новых обновлениях." msgid "When to use Flow Rate Calibration" msgstr "В каких случаях необходима калибровка скорости потока" msgid "" -"After using Flow Dynamics Calibration, there might still be some extrusion issues, such as:\n" -"1. Over-Extrusion: Excess material on your printed object, forming blobs or zits, or the layers seem thicker than expected and not uniform.\n" -"2. Under-Extrusion: Very thin layers, weak infill strength, or gaps in the top layer of the model, even when printing slowly.\n" +"After using Flow Dynamics Calibration, there might still be some extrusion " +"issues, such as:\n" +"1. Over-Extrusion: Excess material on your printed object, forming blobs or " +"zits, or the layers seem thicker than expected and not uniform.\n" +"2. Under-Extrusion: Very thin layers, weak infill strength, or gaps in the " +"top layer of the model, even when printing slowly.\n" "3. Poor Surface Quality: The surface of your prints seems rough or uneven.\n" -"4. Weak Structural Integrity: Prints break easily or don't seem as sturdy as they should be." +"4. Weak Structural Integrity: Prints break easily or don't seem as sturdy as " +"they should be." msgstr "" -"После проведения калибровки динамики потока всё ещё могут возникать некоторые проблемы с экструзией, такие как:\n" -"1. Избыточная экструзия. Это приводит к образованию на модели капель или сгустков, слои кажутся толще и неравномерными, чем ожидалось.\n" -"2. Недоэкструзия. Очень тонкие слои, слабая прочность заполнения или пробелы на верхнем слое модели, даже при медленной печати.\n" -"3. Низкое качество поверхности. Поверхность деталей кажется шероховатой или неровной.\n" -"4. Слабая конструкционная прочность. Напечатанное легко ломается или кажется не таким прочным, как должно быть." - -msgid "In addition, Flow Rate Calibration is crucial for foaming materials like LW-PLA used in RC planes. These materials expand greatly when heated, and calibration provides a useful reference flow rate." -msgstr "Кроме того, калибровка скорости потока крайне важна для вспенивающихся материалов, таких как LW-PLA, используемых при печати деталей для радиоуправляемых самолетов. Эти материалы сильно расширяются при нагревании, а калибровка позволяет получить эталонную скорости потока." +"После проведения калибровки динамики потока всё ещё могут возникать " +"некоторые проблемы с экструзией, такие как:\n" +"1. Избыточная экструзия. Это приводит к образованию на модели капель или " +"сгустков, слои кажутся толще и неравномерными, чем ожидалось.\n" +"2. Недоэкструзия. Очень тонкие слои, слабая прочность заполнения или пробелы " +"на верхнем слое модели, даже при медленной печати.\n" +"3. Низкое качество поверхности. Поверхность деталей кажется шероховатой или " +"неровной.\n" +"4. Слабая конструкционная прочность. Напечатанное легко ломается или кажется " +"не таким прочным, как должно быть." msgid "" -"Flow Rate Calibration measures the ratio of expected to actual extrusion volumes. The default setting works well in Bambu Lab printers and official filaments as they were pre-calibrated and fine-tuned. For a regular filament, you usually won't need to perform a Flow Rate Calibration unless you still see the listed defects after you have done other calibrations. For more details, please check " -"out the wiki article." +"In addition, Flow Rate Calibration is crucial for foaming materials like LW-" +"PLA used in RC planes. These materials expand greatly when heated, and " +"calibration provides a useful reference flow rate." msgstr "" -"Калибровка скорости потока измеряет соотношение ожидаемого и фактического объёмов экструзии. На принтерах Bambu Lab с официальными материалами, стандартные настройки работают хорошо, так как они были предварительно откалиброваны и тщательно настроены. Для обычного материала обычно не требуется выполнять калибровку скорости потока, если только после выполнения других калибровок вы всё ещё видите " -"перечисленные дефекты. Более подробную информацию можно найти на нашем вики-сайте." +"Кроме того, калибровка скорости потока крайне важна для вспенивающихся " +"материалов, таких как LW-PLA, используемых при печати деталей для " +"радиоуправляемых самолетов. Эти материалы сильно расширяются при нагревании, " +"а калибровка позволяет получить эталонную скорости потока." msgid "" -"Auto Flow Rate Calibration utilizes Bambu Lab's Micro-Lidar technology, directly measuring the calibration patterns. However, please be advised that the efficacy and accuracy of this method may be compromised with specific types of materials. Particularly, filaments that are transparent or semi-transparent, sparkling-particled, or have a high-reflective finish may not be suitable for this " -"calibration and can produce less-than-desirable results.\n" -"\n" -"The calibration results may vary between each calibration or filament. We are still improving the accuracy and compatibility of this calibration through firmware updates over time.\n" -"\n" -"Caution: Flow Rate Calibration is an advanced process, to be attempted only by those who fully understand its purpose and implications. Incorrect usage can lead to sub-par prints or printer damage. Please make sure to carefully read and understand the process before doing it." +"Flow Rate Calibration measures the ratio of expected to actual extrusion " +"volumes. The default setting works well in Bambu Lab printers and official " +"filaments as they were pre-calibrated and fine-tuned. For a regular " +"filament, you usually won't need to perform a Flow Rate Calibration unless " +"you still see the listed defects after you have done other calibrations. For " +"more details, please check out the wiki article." msgstr "" -"Автоматическая калибровка скорости потока использует технологию микролидара Bambu Lab, непосредственно измеряя калибровочные шаблоны. Однако имейте ввиду, что эффективность и точность этого метода может быть снижена при использовании определенных типов материалов. В частности, прозрачные или полупрозрачные материалы, материалы с блестящими частицами или с высокоотражающим покрытием могут не " -"подойти для данной калибровки и привести к нежелательным результатам.\n" +"Калибровка скорости потока измеряет соотношение ожидаемого и фактического " +"объёмов экструзии. На принтерах Bambu Lab с официальными материалами, " +"стандартные настройки работают хорошо, так как они были предварительно " +"откалиброваны и тщательно настроены. Для обычного материала обычно не " +"требуется выполнять калибровку скорости потока, если только после выполнения " +"других калибровок вы всё ещё видите перечисленные дефекты. Более подробную " +"информацию можно найти на нашем вики-сайте." + +msgid "" +"Auto Flow Rate Calibration utilizes Bambu Lab's Micro-Lidar technology, " +"directly measuring the calibration patterns. However, please be advised that " +"the efficacy and accuracy of this method may be compromised with specific " +"types of materials. Particularly, filaments that are transparent or semi-" +"transparent, sparkling-particled, or have a high-reflective finish may not " +"be suitable for this calibration and can produce less-than-desirable " +"results.\n" +"\n" +"The calibration results may vary between each calibration or filament. We " +"are still improving the accuracy and compatibility of this calibration " +"through firmware updates over time.\n" +"\n" +"Caution: Flow Rate Calibration is an advanced process, to be attempted only " +"by those who fully understand its purpose and implications. Incorrect usage " +"can lead to sub-par prints or printer damage. Please make sure to carefully " +"read and understand the process before doing it." +msgstr "" +"Автоматическая калибровка скорости потока использует технологию микролидара " +"Bambu Lab, непосредственно измеряя калибровочные шаблоны. Однако имейте " +"ввиду, что эффективность и точность этого метода может быть снижена при " +"использовании определенных типов материалов. В частности, прозрачные или " +"полупрозрачные материалы, материалы с блестящими частицами или с " +"высокоотражающим покрытием могут не подойти для данной калибровки и привести " +"к нежелательным результатам.\n" "\n" "\n" -"Результаты калибровки могут различаться от калибровки к калибровке или от материала к материалу. Мы продолжаем улучшать точность и совместимость этой калибровки путем обновления прошивки принтера.\n" +"Результаты калибровки могут различаться от калибровки к калибровке или от " +"материала к материалу. Мы продолжаем улучшать точность и совместимость этой " +"калибровки путем обновления прошивки принтера.\n" "\n" -"Внимание: калибровка скорости потока - это сложный процесс, к которому следует прибегать только тем, кто полностью понимает её назначение и последствия. Неправильное использование может привести к некачественной печати или повреждению принтера. Пожалуйста, внимательно прочитайте и поймите суть процесса, прежде чем приступать к его выполнению." +"Внимание: калибровка скорости потока - это сложный процесс, к которому " +"следует прибегать только тем, кто полностью понимает её назначение и " +"последствия. Неправильное использование может привести к некачественной " +"печати или повреждению принтера. Пожалуйста, внимательно прочитайте и " +"поймите суть процесса, прежде чем приступать к его выполнению." msgid "When you need Max Volumetric Speed Calibration" msgstr "В каких случаях необходима калибровка максимальной объемной скорости" @@ -9053,10 +12084,13 @@ msgid "Over-extrusion or under extrusion" msgstr "Избыточная или недостаточная экструзия" msgid "Max Volumetric Speed calibration is recommended when you print with:" -msgstr "Калибровка максимальной объёмной скорости рекомендуется при печати с использованием:" +msgstr "" +"Калибровка максимальной объёмной скорости рекомендуется при печати с " +"использованием:" msgid "material with significant thermal shrinkage/expansion, such as..." -msgstr "материалов со значительной термической усадкой/расширением, например..." +msgstr "" +"материалов со значительной термической усадкой/расширением, например..." msgid "materials with inaccurate filament diameter" msgstr "материалов с неточным диаметром пластиковой нити" @@ -9064,25 +12098,46 @@ msgstr "материалов с неточным диаметром пласти msgid "We found the best Flow Dynamics Calibration Factor" msgstr "Мы нашли лучший коэффициент калибровки динамики потока" -msgid "Part of the calibration failed! You may clean the plate and retry. The failed test result would be dropped." -msgstr "Часть калибровки выполнена неудачно! Вы можете очистить печатную пластину и повторить попытку. Результат неудачного теста будет удалён." +msgid "" +"Part of the calibration failed! You may clean the plate and retry. The " +"failed test result would be dropped." +msgstr "" +"Часть калибровки выполнена неудачно! Вы можете очистить печатную пластину и " +"повторить попытку. Результат неудачного теста будет удалён." -msgid "*We recommend you to add brand, materia, type, and even humidity level in the Name" -msgstr "*Мы рекомендуем добавить к названию материала, производителя, тип и даже уровень влажности" +msgid "" +"*We recommend you to add brand, materia, type, and even humidity level in " +"the Name" +msgstr "" +"*Мы рекомендуем добавить к названию материала, производителя, тип и даже " +"уровень влажности" msgid "Failed" msgstr "Неудачно" -msgid "Only one of the results with the same name will be saved. Are you sure you want to overrides the other results?" -msgstr "Будет сохранен только один из результатов с таким же именем. Вы уверены, что хотите перезаписать другие результаты?" +msgid "" +"Only one of the results with the same name will be saved. Are you sure you " +"want to overrides the other results?" +msgstr "" +"Будет сохранен только один из результатов с таким же именем. Вы уверены, что " +"хотите перезаписать другие результаты?" #, c-format, boost-format -msgid "There is already a historical calibration result with the same name: %s. Only one of the results with the same name is saved. Are you sure you want to overrides the historical result?" -msgstr "Результат калибровки с таким именем уже существует: %s. Будет сохранён только один результат с таким же именем. Вы уверены, что хотите перезаписать текущий результат?" +msgid "" +"There is already a historical calibration result with the same name: %s. " +"Only one of the results with the same name is saved. Are you sure you want " +"to overrides the historical result?" +msgstr "" +"Результат калибровки с таким именем уже существует: %s. Будет сохранён " +"только один результат с таким же именем. Вы уверены, что хотите перезаписать " +"текущий результат?" msgid "Please find the best line on your plate" msgstr "Пожалуйста, найдите лучшую линию на столе" +msgid "Please find the cornor with perfect degree of extrusion" +msgstr "Пожалуйста, найдите угол с идеальной степенью экструзии" + msgid "Input Value" msgstr "Входное значение" @@ -9147,8 +12202,12 @@ msgstr "Точная калибровка на основе коэффициен msgid "Title" msgstr "Заголовок" -msgid "A test model will be printed. Please clear the build plate and place it back to the hot bed before calibration." -msgstr "Будет напечатана тестовая модель. Перед калибровкой очистите печатную пластину и установите её обратно на нагреваемый стол." +msgid "" +"A test model will be printed. Please clear the build plate and place it back " +"to the hot bed before calibration." +msgstr "" +"Будет напечатана тестовая модель. Перед калибровкой очистите печатную " +"пластину и установите её обратно на нагреваемый стол." msgid "Printing Parameters" msgstr "Параметры печати" @@ -9178,13 +12237,14 @@ msgid "" msgstr "" "Советы по выбору материала для калибровки: \n" "- Материалы, которые имеют близкие значения температуры нагреваемого стола\n" -"- Различные марки и семейства расходных материалов (Производитель = Bambu, семейство = Basic - базовый, Matte - матовый)" +"- Различные марки и семейства расходных материалов (Производитель = Bambu, " +"семейство = Basic - базовый, Matte - матовый)" -msgid "Error desc" -msgstr "Описание ошибки" +msgid "Pattern" +msgstr "Шаблон" -msgid "Extra info" -msgstr "Доп. информация" +msgid "Method" +msgstr "Метод" #, c-format, boost-format msgid "%s is not compatible with %s" @@ -9196,6 +12256,21 @@ msgstr "Автоматическая калибровка динамики по msgid "Connecting to printer" msgstr "Подключением к принтеру" +msgid "From k Value" +msgstr "Начальное значение коэф. K" + +msgid "To k Value" +msgstr "Конечное значение коэф. K" + +msgid "Step value" +msgstr "Шаг" + +msgid "0.5" +msgstr "0.5" + +msgid "0.005" +msgstr "0.005" + msgid "The nozzle diameter has been synchronized from the printer Settings" msgstr "Диаметр сопла был синхронизирован с настройками принтера" @@ -9255,114 +12330,6 @@ msgstr "" "Существует несколько IP-адресов, соответствующих имени хоста %1%.\n" "Пожалуйста, выберите тот, который хотите использовать." -msgid "Unable to perform boolean operation on selected parts" -msgstr "Невозможно выполнить булевую операцию над выбранными элементами." - -msgid "Mesh Boolean" -msgstr "Булевы операции" - -msgid "Union" -msgstr "Объединение" - -msgid "Difference" -msgstr "Разность" - -msgid "Intersection" -msgstr "Пересечение" - -msgid "Source Volume" -msgstr "Исходный объём" - -# ??? -msgid "Tool Volume" -msgstr "" - -msgid "Subtract from" -msgstr "Главный" - -msgid "Subtract with" -msgstr "Вычитаемый" - -msgid "selected" -msgstr "выбрано" - -msgid "Part 1" -msgstr "Элемент 1" - -msgid "Part 2" -msgstr "Элемент 2" - -msgid "Delete input" -msgstr "Удалить исходные" - -msgid "Send G-Code to printer host" -msgstr "Отправить G-кода на хост принтера" - -msgid "Send to print" -msgstr "Отправить на печать" - -msgid "Upload to Printer Host with the following filename:" -msgstr "Загрузить на хост принтера со следующим именем:" - -msgid "Use forward slashes ( / ) as a directory separator if needed." -msgstr "В качестве разделителя каталогов используйте косую черту ( / ). " - -msgid "Upload to storage" -msgstr "Загрузить в хранилище" - -#, c-format, boost-format -msgid "Upload filename doesn't end with \"%s\". Do you wish to continue?" -msgstr "Имя загружаемого файла не заканчивается на \"%s\". Хотите продолжить?" - -msgid "Upload" -msgstr "Загрузить" - -msgid "Print host upload queue" -msgstr "Очередь загрузки на хост печати" - -msgid "ID" -msgstr "ID" - -msgid "Progress" -msgstr "Прогресс" - -msgid "Host" -msgstr "Хост" - -msgctxt "OfFile" -msgid "Size" -msgstr "Размер" - -msgid "Filename" -msgstr "Имя файла" - -msgid "Message" -msgstr "Сообщение" - -msgid "Error Message" -msgstr "Сообщение об ошибке" - -msgid "Cancel selected" -msgstr "Отменить выбранное" - -msgid "Show error message" -msgstr "Показать сообщение об ошибке" - -msgid "Enqueued" -msgstr "Поставлено в очередь" - -msgid "Uploading" -msgstr "Отправка" - -msgid "Cancelling" -msgstr "Отмена" - -msgid "Error uploading to print host" -msgstr "Ошибка при отправке на хост печати" - -msgid "Error uploading to print host:" -msgstr "Ошибка при отправке на хост печати:" - msgid "PA Calibration" msgstr "Калибровка PA" @@ -9384,9 +12351,6 @@ msgstr "Линии" msgid "PA Pattern" msgstr "Шаблон" -msgid "Method" -msgstr "Метод" - msgid "Start PA: " msgstr "Начальный коэффициент PA: " @@ -9468,12 +12432,14 @@ msgstr "Шаг изменения: " msgid "" "Please input valid values:\n" -"start > 0 step >= 0\n" +"start > 0 \n" +"step >= 0\n" "end > start + step)" msgstr "" -"Введите допустимые значения:\n" -"start > 0 step >= 0\n" -"end > start + step)" +"Введите допустимое значение:\n" +"Начальное > 0\n" +"Шаг >= 0\n" +"Конечное > Начальное + Шаг" msgid "VFA test" msgstr "Тест на вертикальные артефакты (VFA)" @@ -9486,12 +12452,14 @@ msgstr "Конечная скорость: " msgid "" "Please input valid values:\n" -"start > 10 step >= 0\n" +"start > 10 \n" +"step >= 0\n" "end > start + step)" msgstr "" -"Введите допустимые значения:\n" -"start > 10 step >= 0\n" -"end > start + step)" +"Введите допустимое значение:\n" +"Начальное > 10\n" +"Шаг >= 0\n" +"Конечное > Начальное + Шаг" msgid "Start retraction length: " msgstr "Начальная длина отката: " @@ -9502,15 +12470,623 @@ msgstr "Конечная длина отката: " msgid "mm/mm" msgstr "мм/мм" +msgid "Send G-Code to printer host" +msgstr "Отправить G-кода на хост принтера" + +msgid "Upload to Printer Host with the following filename:" +msgstr "Загрузить на хост принтера со следующим именем:" + +msgid "Use forward slashes ( / ) as a directory separator if needed." +msgstr "В качестве разделителя каталогов используйте косую черту ( / ). " + +msgid "Upload to storage" +msgstr "Загрузить в хранилище" + +#, c-format, boost-format +msgid "Upload filename doesn't end with \"%s\". Do you wish to continue?" +msgstr "Имя загружаемого файла не заканчивается на \"%s\". Хотите продолжить?" + +msgid "Upload" +msgstr "Загрузить" + +msgid "Print host upload queue" +msgstr "Очередь загрузки на хост печати" + +msgid "ID" +msgstr "ID" + +msgid "Progress" +msgstr "Прогресс" + +msgid "Host" +msgstr "Хост" + +msgctxt "OfFile" +msgid "Size" +msgstr "Размер" + +msgid "Filename" +msgstr "Имя файла" + +msgid "Cancel selected" +msgstr "Отменить выбранное" + +msgid "Show error message" +msgstr "Показать сообщение об ошибке" + +msgid "Enqueued" +msgstr "Поставлено в очередь" + +msgid "Uploading" +msgstr "Отправка" + +msgid "Cancelling" +msgstr "Отмена" + +msgid "Error uploading to print host" +msgstr "Ошибка при отправке на хост печати" + +msgid "Unable to perform boolean operation on selected parts" +msgstr "Невозможно выполнить булевую операцию над выбранными элементами." + +msgid "Mesh Boolean" +msgstr "Булевы операции" + +msgid "Union" +msgstr "Объединение" + +msgid "Difference" +msgstr "Разность" + +msgid "Intersection" +msgstr "Пересечение" + +msgid "Source Volume" +msgstr "Исходный объём" + +# ??? +msgid "Tool Volume" +msgstr "" + +msgid "Subtract from" +msgstr "Главный" + +msgid "Subtract with" +msgstr "Вычитаемый" + +msgid "selected" +msgstr "выбрано" + +msgid "Part 1" +msgstr "Элемент 1" + +msgid "Part 2" +msgstr "Элемент 2" + +msgid "Delete input" +msgstr "Удалить исходные" + +msgid "Network Test" +msgstr "Проверка сети" + +msgid "Start Test Multi-Thread" +msgstr "Запуск многопоточного теста" + +msgid "Start Test Single-Thread" +msgstr "Запуск однопоточного теста" + +msgid "Export Log" +msgstr "" + +msgid "Studio Version:" +msgstr "Версия программы:" + +msgid "System Version:" +msgstr "Версия ОС:" + +msgid "DNS Server:" +msgstr "" + +msgid "Test BambuLab" +msgstr "Тест BambuLab" + +msgid "Test BambuLab:" +msgstr "Тест BambuLab:" + +msgid "Test Bing.com" +msgstr "Тест Bing.com" + +msgid "Test bing.com:" +msgstr "Тест bing.com:" + +msgid "Test HTTP" +msgstr "Тест HTTP" + +msgid "Test HTTP Service:" +msgstr "Тест HTTP сервера:" + +msgid "Test storage" +msgstr "Тест накопителя" + +msgid "Test Storage Upload:" +msgstr "Тест накопителя (отправка):" + +msgid "Test storage upgrade" +msgstr "Тест накопителя (обновление)" + +msgid "Test Storage Upgrade:" +msgstr "Тест накопителя (обновление):" + +msgid "Test storage download" +msgstr "Тест накопителя (загрузка)" + +msgid "Test Storage Download:" +msgstr "Тест накопителя (загрузка):" + +msgid "Test plugin download" +msgstr "" + +msgid "Test Plugin Download:" +msgstr "" + +msgid "Test Storage Upload" +msgstr "Тест накопителя (отправка)" + +msgid "Log Info" +msgstr "Журнал сведений" + +msgid "Select filament preset" +msgstr "" + +msgid "Create Filament" +msgstr "" + +msgid "Create Based on Current Filament" +msgstr "" + +msgid "Copy Current Filament Preset " +msgstr "" + +msgid "Basic Information" +msgstr "" + +msgid "Add Filament Preset under this filament" +msgstr "" + +msgid "We could create the filament presets for your following printer:" +msgstr "" + +msgid "Select Vendor" +msgstr "" + +msgid "Input Custom Vendor" +msgstr "" + +msgid "Can't find vendor I want" +msgstr "" + +msgid "Select Type" +msgstr "" + +msgid "Select Filament Preset" +msgstr "" + +msgid "Serial" +msgstr "" + +msgid "e.g. Basic, Matte, Silk, Marble" +msgstr "" + +msgid "Filament Preset" +msgstr "" + +msgid "Create" +msgstr "" + +msgid "Vendor is not selected, please reselect vendor." +msgstr "" + +msgid "Custom vendor is not input, please input custom vendor." +msgstr "" + +msgid "" +"\"Bambu\" or \"Generic\" can not be used as a Vendor for custom filaments." +msgstr "" + +msgid "Filament type is not selected, please reselect type." +msgstr "" + +msgid "Filament serial is not inputed, please input serial." +msgstr "" + +msgid "" +"There may be escape characters in the vendor or serial input of filament. " +"Please delete and re-enter." +msgstr "" + +msgid "All inputs in the custom vendor or serial are spaces. Please re-enter." +msgstr "" + +msgid "The vendor can not be a number. Please re-enter." +msgstr "" + +msgid "" +"You have not selected a printer or preset yet. Please select at least one." +msgstr "" + +msgid "Some existing presets have failed to be created, as follows:\n" +msgstr "" + +msgid "" +"\n" +"Do you want to rewrite it?" +msgstr "" + +msgid "" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" +"To add preset for more prinetrs, Please go to printer selection" +msgstr "" + +msgid "Create Printer/Nozzle" +msgstr "" + +msgid "Create Printer" +msgstr "" + +msgid "Create Nozzle for Existing Printer" +msgstr "" + +msgid "Create from Template" +msgstr "" + +msgid "Create Based on Current Printer" +msgstr "" + +msgid "wiki" +msgstr "" + +msgid "Import Preset" +msgstr "" + +msgid "Create Type" +msgstr "" + +msgid "The model is not fond, place reselect vendor." +msgstr "" + +msgid "Select Model" +msgstr "" + +msgid "Select Printer" +msgstr "" + +msgid "Input Custom Model" +msgstr "" + +msgid "Can't find my printer model" +msgstr "" + +msgid "Rectangle" +msgstr "" + +msgid "Printable Space" +msgstr "" + +msgid "X" +msgstr "" + +msgid "Y" +msgstr "" + +msgid "Hot Bed STL" +msgstr "" + +msgid "Load stl" +msgstr "" + +msgid "Hot Bed SVG" +msgstr "" + +msgid "Load svg" +msgstr "" + +msgid "Max Print Height" +msgstr "" + +#, c-format, boost-format +msgid "The file exceeds %d MB, please import again." +msgstr "" + +msgid "Exception in obtaining file size, please import again." +msgstr "" + +msgid "Preset path is not find, please reselect vendor." +msgstr "" + +msgid "The printer model was not found, please reselect." +msgstr "" + +msgid "The nozzle diameter is not fond, place reselect." +msgstr "" + +msgid "The printer preset is not fond, place reselect." +msgstr "" + +msgid "Printer Preset" +msgstr "" + +msgid "Filament Preset Template" +msgstr "" + +msgid "Deselect All" +msgstr "" + +msgid "Process Preset Template" +msgstr "" + +msgid "Back Page 1" +msgstr "" + +msgid "" +"You have not yet chosen which printer preset to create based on. Please " +"choose the vendor and model of the printer" +msgstr "" + +msgid "" +"You have entered an illegal input in the printable area section on the first " +"page. Please check before creating it." +msgstr "" + +msgid "The custom printer or model is not inputed, place input." +msgstr "" + +msgid "" +"The printer preset you created already has a preset with the same name. Do " +"you want to overwrite it?\n" +"\tYes: Overwrite the printer preset with the same name, and filament and " +"process presets with the same preset name will be recreated \n" +"and filament and process presets without the same preset name will be " +"reserve.\n" +"\tCancel: Do not create a preset, return to the creation interface." +msgstr "" + +msgid "You need to select at least one filament preset." +msgstr "" + +msgid "You need to select at least one process preset." +msgstr "" + +msgid "Create filament presets failed. As follows:\n" +msgstr "" + +msgid "Create process presets failed. As follows:\n" +msgstr "" + +msgid "Vendor is not find, please reselect." +msgstr "" + +msgid "Current vendor has no models, please reselect." +msgstr "" + +msgid "" +"You have not selected the vendor and model or inputed the custom vendor and " +"model." +msgstr "" + +msgid "" +"There may be escape characters in the custom printer vendor or model. Please " +"delete and re-enter." +msgstr "" + +msgid "" +"All inputs in the custom printer vendor or model are spaces. Please re-enter." +msgstr "" + +msgid "Please check bed printable shape and origin input." +msgstr "" + +msgid "" +"You have not yet selected the printer to replace the nozzle, please choose." +msgstr "" + +msgid "Create Printer Successful" +msgstr "" + +msgid "Create Filament Successful" +msgstr "" + +msgid "Printer Created" +msgstr "" + +msgid "Please go to printer settings to edit your presets" +msgstr "" + +msgid "Filament Created" +msgstr "" + +msgid "" +"Please go to filament setting to edit your presets if you need.\n" +"Please note that nozzle temperature, hot bed temperature, and maximum " +"volumetric speed have a significant impact on printing quality. Please set " +"them carefully." +msgstr "" + +msgid "Printer Setting" +msgstr "" + +msgid "Export Configs" +msgstr "" + +msgid "Printer config bundle(.bbscfg)" +msgstr "" + +msgid "Filament bundle(.bbsflmt)" +msgstr "" + +msgid "Printer presets(.zip)" +msgstr "" + +msgid "Filament presets(.zip)" +msgstr "" + +msgid "Process presets(.zip)" +msgstr "" + +msgid "initialize fail" +msgstr "" + +msgid "add file fail" +msgstr "" + +msgid "add bundle structure file fail" +msgstr "" + +msgid "finalize fail" +msgstr "" + +msgid "open zip written fail" +msgstr "" + +msgid "Export successful" +msgstr "" + +#, c-format, boost-format +msgid "" +"The '%s' folder already exists in the current directory. Do you want to " +"clear it and rebuild it.\n" +"If not, a time suffix will be added, and you can modify the name after " +"creation." +msgstr "" + +msgid "" +"Printer and all the filament&process presets that belongs to the printer. \n" +"Can be shared with others." +msgstr "" + +msgid "" +"User's fillment preset set. \n" +"Can be shared with others." +msgstr "" + +msgid "" +"Only display printer names with changes to printer, filament, and process " +"presets." +msgstr "" + +msgid "Only display the filament names with changes to filament presets." +msgstr "" + +msgid "" +"Only printer names with user printer presets will be displayed, and each " +"preset you choose will be exported as a zip." +msgstr "" + +msgid "" +"Only the filament names with user filament presets will be displayed, \n" +"and all user filament presets in each filament name you select will be " +"exported as a zip." +msgstr "" + +msgid "" +"Only printer names with changed process presets will be displayed, \n" +"and all user process presets in each printer name you select will be " +"exported as a zip." +msgstr "" + +msgid "Please select at least one printer or filament." +msgstr "" + +msgid "Please select a type you want to export" +msgstr "" + +msgid "Edit Filament" +msgstr "" + +msgid "Filament presets under this filament" +msgstr "" + +msgid "" +"Note: If the only preset under this filament is deleted, the filament will " +"be deleted after exiting the dialog." +msgstr "" + +msgid "Presets inherited by other presets can not be deleted" +msgstr "" + +msgid "The following presets inherits this preset." +msgid_plural "The following preset inherits this preset." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +msgid "Delete Preset" +msgstr "" + +msgid "Are you sure to delete the selected preset?" +msgstr "" + +msgid "Delete preset" +msgstr "" + +msgid "+ Add Preset" +msgstr "" + +msgid "Delete Filament" +msgstr "" + +msgid "" +"All the filament presets belong to this filament would be deleted. \n" +"If you are using this filament on your printer, please reset the filament " +"information for that slot." +msgstr "" + +msgid "Delete filament" +msgstr "" + +msgid "Add Preset" +msgstr "" + +msgid "Add preset for new printer" +msgstr "" + +msgid "Copy preset from filament" +msgstr "" + +msgid "The filament choice not find filament preset, please reselect it" +msgstr "" + +msgid "Edit Preset" +msgstr "" + +msgid "For more information, please check out Wiki" +msgstr "" + +msgid "Collapse" +msgstr "" + +msgid "Daily Tips" +msgstr "" + +msgid "Need select printer" +msgstr "Нужно выбрать принтер" + +msgid "The start, end or step is not valid value." +msgstr "Недопустимое значение: начальное, конечное или шаг." + +msgid "" +"Unable to calibrate: maybe because the set calibration value range is too " +"large, or the step is too small" +msgstr "" +"Невозможно выполнить калибровку: возможно, установленный диапазон значений " +"калибровки слишком велик или шаг слишком мал." + msgid "Physical Printer" msgstr "Физический принтер" msgid "Print Host upload" msgstr "Загрузка на хост печати" -msgid "Test" -msgstr "Тест" - msgid "Could not get a valid Printer Host reference" msgstr "Не удалось получить действительную ссылку на хост принтера" @@ -9520,8 +13096,12 @@ msgstr "Успешно!" msgid "Refresh Printers" msgstr "Обновить принтеры" -msgid "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-signed certificate." -msgstr "Файл корневого сертификата HTTPS не обязателен. Он необходим только при использовании HTTPS с самоподписанным сертификатом." +msgid "" +"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" +"signed certificate." +msgstr "" +"Файл корневого сертификата HTTPS не обязателен. Он необходим только при " +"использовании HTTPS с самоподписанным сертификатом." msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" msgstr "Файлы сертификатов (*.crt, *.pem)|*.crt;*.pem|Все файлы|*.*" @@ -9530,38 +13110,208 @@ msgid "Open CA certificate file" msgstr "Открыть файл корневого сертификата" #, c-format, boost-format -msgid "On this system, %s uses HTTPS certificates from the system Certificate Store or Keychain." -msgstr "В этой системе %s использует HTTPS сертификаты из системного хранилища сертификатов/Keychain." +msgid "" +"On this system, %s uses HTTPS certificates from the system Certificate Store " +"or Keychain." +msgstr "" +"В этой системе %s использует HTTPS сертификаты из системного хранилища " +"сертификатов/Keychain." -msgid "To use a custom CA file, please import your CA file into Certificate Store / Keychain." -msgstr "Чтобы использовать пользовательский файл корневого сертификата, импортируйте его в хранилище сертификатов/Keychain." +msgid "" +"To use a custom CA file, please import your CA file into Certificate Store / " +"Keychain." +msgstr "" +"Чтобы использовать пользовательский файл корневого сертификата, импортируйте " +"его в хранилище сертификатов/Keychain." msgid "Connection to printers connected via the print host failed." msgstr "Не удалось подключиться к принтерам, подключенным через хост печати." -#: resources/data/hints.ini: [hint:3D Scene Operations] -msgid "" -"3D Scene Operations\n" -"Did you know how to control view and object/part selection with mouse and touchpanel in the 3D scene?" +#, c-format, boost-format +msgid "Mismatched type of print host: %s" +msgstr "" + +msgid "Connection to AstroBox works correctly." +msgstr "Соединение с AstroBox успешно установлено." + +msgid "Could not connect to AstroBox" +msgstr "Не удалось подключиться к AstroBox" + +msgid "Note: AstroBox version at least 1.1.0 is required." +msgstr "" + +msgid "Connection to Duet works correctly." +msgstr "Соединение с Duet успешно установлено." + +msgid "Could not connect to Duet" +msgstr "Не удалось подключиться к Duet" + +msgid "Unknown error occured" +msgstr "" + +msgid "Wrong password" +msgstr "" + +msgid "Could not get resources to create a new connection" +msgstr "" + +msgid "Upload not enabled on FlashAir card." +msgstr "" + +msgid "Connection to FlashAir works correctly and upload is enabled." +msgstr "" + +msgid "Could not connect to FlashAir" +msgstr "Не удаётся подключиться к FlashAir" + +msgid "" +"Note: FlashAir with firmware 2.00.02 or newer and activated upload function " +"is required." +msgstr "" + +msgid "Connection to MKS works correctly." +msgstr "Подключение к MKS успешно установлено." + +msgid "Could not connect to MKS" +msgstr "Не удалось подключиться к MKS" + +msgid "Connection to OctoPrint works correctly." +msgstr "" + +msgid "Could not connect to OctoPrint" +msgstr "" + +msgid "Note: OctoPrint version at least 1.1.0 is required." +msgstr "Примечание: требуется версия OctoPrint не ниже 1.1.0." + +msgid "Connection to Prusa SL1 / SL1S works correctly." +msgstr "" + +msgid "Could not connect to Prusa SLA" +msgstr "" + +msgid "Connection to PrusaLink works correctly." +msgstr "Подключение к PrusaLink установлено." + +msgid "Could not connect to PrusaLink" +msgstr "Не удалось подключиться к PrusaLink" + +msgid "Storages found" +msgstr "" + +#. TRN %1% = storage path +#, boost-format +msgid "%1% : read only" +msgstr "" + +#. TRN %1% = storage path +#, boost-format +msgid "%1% : no free space" +msgstr "" + +#. TRN %1% = host +#, boost-format +msgid "Upload has failed. There is no suitable storage found at %1%." +msgstr "" + +msgid "Connection to Prusa Connect works correctly." +msgstr "" + +msgid "Could not connect to Prusa Connect" +msgstr "" + +msgid "Connection to Repetier works correctly." +msgstr "Подключение к Repetier успешно установлено." + +msgid "Could not connect to Repetier" +msgstr "Не удалось подключиться к Repetier" + +msgid "Note: Repetier version at least 0.90.0 is required." +msgstr "" + +#, boost-format +msgid "" +"HTTP status: %1%\n" +"Message body: \"%2%\"" +msgstr "" + +#, boost-format +msgid "" +"Parsing of host response failed.\n" +"Message body: \"%1%\"\n" +"Error: \"%2%\"" +msgstr "" + +#, boost-format +msgid "" +"Enumeration of host printers failed.\n" +"Message body: \"%1%\"\n" +"Error: \"%2%\"" +msgstr "" + +#: resources/data/hints.ini: [hint:Precise wall] +msgid "" +"Precise wall\n" +"Did you know that turning on precise wall can improve precision and layer " +"consistency?" +msgstr "" + +#: resources/data/hints.ini: [hint:Sandwich mode] +msgid "" +"Sandwich mode\n" +"Did you know that you can use sandwich mode (inner-outer-inner) to improve " +"precision and layer consistency if your model doesn't have very steep " +"overhangs?" +msgstr "" + +#: resources/data/hints.ini: [hint:Chamber temperature] +msgid "" +"Chamber temperature\n" +"Did you know that OrcaSlicer supports chamber temperature?" +msgstr "" + +#: resources/data/hints.ini: [hint:Calibration] +msgid "" +"Calibration\n" +"Did you know that calibrating your printer can do wonders? Check out our " +"beloved calibration solution in OrcaSlicer." +msgstr "" + +#: resources/data/hints.ini: [hint:Auxiliary fan] +msgid "" +"Auxiliary fan\n" +"Did you know that OrcaSlicer supports Auxiliary part cooling fan?" +msgstr "" + +#: resources/data/hints.ini: [hint:Air filtration] +msgid "" +"Air filtration/Exhuast Fan\n" +"Did you know that OrcaSlicer can support Air filtration/Exhuast Fan?" +msgstr "" + +#: resources/data/hints.ini: [hint:How to use keyboard shortcuts] +msgid "" +"How to use keyboard shortcuts\n" +"Did you know that Orca Slicer offers a wide range of keyboard shortcuts and " +"3D scene operations." msgstr "" -"Операции с 3D-сценой\n" -"Знаете ли вы, как управлять видом и выбором модели/части с помощью мыши и сенсорной панели в 3D-сцене?" #: resources/data/hints.ini: [hint:Cut Tool] msgid "" "Cut Tool\n" -"Did you know that you can cut a model at any angle and position with the cutting tool?" +"Did you know that you can cut a model at any angle and position with the " +"cutting tool?" msgstr "" "Режущий инструмент\n" -"Знаете ли вы, что можно разрезать модель под любым углом с помощью режущего инструмента?" +"Знаете ли вы, что можно разрезать модель под любым углом с помощью режущего " +"инструмента?" #: resources/data/hints.ini: [hint:Fix Model] msgid "" "Fix Model\n" -"Did you know that you can fix a corrupted 3D model to avoid a lot of slicing problems?" +"Did you know that you can fix a corrupted 3D model to avoid a lot of slicing " +"problems on the Windows system?" msgstr "" -"Починка модели\n" -"Знаете ли вы, что можно починить повреждённую модель, чтобы избежать множества проблем при нарезке?" #: resources/data/hints.ini: [hint:Timelapse] msgid "" @@ -9582,140 +13332,193 @@ msgstr "" #: resources/data/hints.ini: [hint:Auto-Orient] msgid "" "Auto-Orient\n" -"Did you know that you can rotate objects to an optimal orientation for printing by a simple click?" +"Did you know that you can rotate objects to an optimal orientation for " +"printing by a simple click?" msgstr "" "Автоориентация\n" -"Знаете ли вы, что можно повернуть модели в оптимальную для печати ориентацию простым щелчком мыши?" +"Знаете ли вы, что можно повернуть модели в оптимальную для печати ориентацию " +"простым щелчком мыши?" #: resources/data/hints.ini: [hint:Lay on Face] msgid "" "Lay on Face\n" -"Did you know that you can quickly orient a model so that one of its faces sits on the print bed? Select the \"Place on face\" function or press the F key." +"Did you know that you can quickly orient a model so that one of its faces " +"sits on the print bed? Select the \"Place on face\" function or press the " +"F key." msgstr "" "Поверхностью на стол\n" -"Знаете ли вы, что можно быстро сориентировать модель так, чтобы одна из её граней лежала на столе? Используйте функцию «Поверхностью на стол» или нажмите клавишу F." +"Знаете ли вы, что можно быстро сориентировать модель так, чтобы одна из её " +"граней лежала на столе? Используйте функцию «Поверхностью на стол» или " +"нажмите клавишу F." #: resources/data/hints.ini: [hint:Object List] msgid "" "Object List\n" -"Did you know that you can view all objects/parts in a list and change settings for each object/part?" +"Did you know that you can view all objects/parts in a list and change " +"settings for each object/part?" msgstr "" "Список моделей\n" -"Знаете ли вы, что можно просматривать все модели/части в списке и изменять настройки для каждой из них?" +"Знаете ли вы, что можно просматривать все модели/части в списке и изменять " +"настройки для каждой из них?" + +#: resources/data/hints.ini: [hint:Search Functionality] +msgid "" +"Search Functionality\n" +"Did you know that you use the Search tool to quickly find a specific Orca " +"Slicer setting?" +msgstr "" #: resources/data/hints.ini: [hint:Simplify Model] msgid "" "Simplify Model\n" -"Did you know that you can reduce the number of triangles in a mesh using the Simplify mesh feature? Right-click the model and select Simplify model. Read more in the documentation." +"Did you know that you can reduce the number of triangles in a mesh using the " +"Simplify mesh feature? Right-click the model and select Simplify model." msgstr "" -"Упростить сетку модели\n" -"Знаете ли вы, что можно уменьшить количество треугольников в полигональной сетке, используя функцию упрощения сетки? Щелкните правой кнопкой мыши на модели и выберите «Упростить полигональную сетку». Подробнее читайте в документации." #: resources/data/hints.ini: [hint:Slicing Parameter Table] msgid "" "Slicing Parameter Table\n" -"Did you know that you can view all objects/parts on a table and change settings for each object/part?" +"Did you know that you can view all objects/parts on a table and change " +"settings for each object/part?" msgstr "" "Таблица параметров нарезки\n" -"Знаете ли вы, что можно просмотреть все модели/части в таблице и изменить параметры печати для каждой из них?" +"Знаете ли вы, что можно просмотреть все модели/части в таблице и изменить " +"параметры печати для каждой из них?" #: resources/data/hints.ini: [hint:Split to Objects/Parts] msgid "" "Split to Objects/Parts\n" -"Did you know that you can split a big object into small ones for easy colorizing or printing?" +"Did you know that you can split a big object into small ones for easy " +"colorizing or printing?" msgstr "" "Разделение на модели/части\n" -"Знаете ли вы, что можно разделить большую модель на маленькие для удобства раскрашивания или печати?" +"Знаете ли вы, что можно разделить большую модель на маленькие для удобства " +"раскрашивания или печати?" #: resources/data/hints.ini: [hint:Subtract a Part] msgid "" "Subtract a Part\n" -"Did you know that you can subtract one mesh from another using the Negative part modifier? That way you can, for example, create easily resizable holes directly in Orca Slicer. Read more in the documentation." +"Did you know that you can subtract one mesh from another using the Negative " +"part modifier? That way you can, for example, create easily resizable holes " +"directly in Orca Slicer." msgstr "" -"Вычитание объёмов\n" -"Знаете ли вы, что можно вычесть одну сетку из другой с помощью модификатора «Объём для вычитания»? Таким образом, например, отверстия в модели можно создавать непосредственно в Orca Slicer. Подробнее читайте в документации." #: resources/data/hints.ini: [hint:STEP] msgid "" "STEP\n" -"Did you know that you can improve your print quality by slicing a STEP file instead of an STL?\n" -"Orca Slicer supports slicing STEP files, providing smoother results than a lower resolution STL. Give it a try!" +"Did you know that you can improve your print quality by slicing a STEP file " +"instead of an STL?\n" +"Orca Slicer supports slicing STEP files, providing smoother results than a " +"lower resolution STL. Give it a try!" msgstr "" "STEP\n" -"Знаете ли вы, что можно улучшить качество печати, используя STEP файлы вместо STL?\n" -"Orca Slicer поддерживает нарезку STEP файлов, что обеспечивает более точное представление геометрии, чем при нарезке STL файлов." +"Знаете ли вы, что можно улучшить качество печати, используя STEP файлы " +"вместо STL?\n" +"Orca Slicer поддерживает нарезку STEP файлов, что обеспечивает более точное " +"представление геометрии, чем при нарезке STL файлов." #: resources/data/hints.ini: [hint:Z seam location] msgid "" "Z seam location\n" -"Did you know that you can customize the location of the Z seam, and even paint it on your print, to have it in a less visible location? This improves the overall look of your model. Check it out!" +"Did you know that you can customize the location of the Z seam, and even " +"paint it on your print, to have it in a less visible location? This improves " +"the overall look of your model. Check it out!" msgstr "" "Позиция шва\n" -"Знаете ли вы, что можно изменить расположение шва и даже нарисовать его на модели, чтобы он был менее заметен? Это улучшает общий вид модели. Попробуйте это!" +"Знаете ли вы, что можно изменить расположение шва и даже нарисовать его на " +"модели, чтобы он был менее заметен? Это улучшает общий вид модели. " +"Попробуйте это!" #: resources/data/hints.ini: [hint:Fine-tuning for flow rate] msgid "" "Fine-tuning for flow rate\n" -"Did you know that flow rate can be fine-tuned for even better-looking prints? Depending on the material, you can improve the overall finish of the printed model by doing some fine-tuning." +"Did you know that flow rate can be fine-tuned for even better-looking " +"prints? Depending on the material, you can improve the overall finish of the " +"printed model by doing some fine-tuning." msgstr "" "Точная настройка потока\n" -"Знаете ли вы, что поток можно точно настроить для получения ещё более качественной печати? В зависимости от материала можно внести некоторые корректировки, чтобы улучшить общее качество печати." +"Знаете ли вы, что поток можно точно настроить для получения ещё более " +"качественной печати? В зависимости от материала можно внести некоторые " +"корректировки, чтобы улучшить общее качество печати." #: resources/data/hints.ini: [hint:Split your prints into plates] msgid "" "Split your prints into plates\n" -"Did you know that you can split a model that has a lot of parts into individual plates ready to print? This will simplify the process of keeping track of all the parts." +"Did you know that you can split a model that has a lot of parts into " +"individual plates ready to print? This will simplify the process of keeping " +"track of all the parts." msgstr "" "Распределение печатаемого на другие столы\n" -"Знаете ли вы, что модель, состоящую из большого количества частей, можно распределить на несколько столов? Это упрощает процесс отслеживания всех деталей при печати." +"Знаете ли вы, что модель, состоящую из большого количества частей, можно " +"распределить на несколько столов? Это упрощает процесс отслеживания всех " +"деталей при печати." -#: resources/data/hints.ini: [hint:Speed up your print with Adaptive Layer Height] +#: resources/data/hints.ini: [hint:Speed up your print with Adaptive Layer +#: Height] msgid "" "Speed up your print with Adaptive Layer Height\n" -"Did you know that you can print a model even faster, by using the Adaptive Layer Height option? Check it out!" +"Did you know that you can print a model even faster, by using the Adaptive " +"Layer Height option? Check it out!" msgstr "" "Ускорение печати с функцией «Переменная высота слоёв»\n" -"Знаете ли вы, что можно печатать ещё быстрее, используя функцию «Переменная высота слоёв». Попробуйте!" +"Знаете ли вы, что можно печатать ещё быстрее, используя функцию «Переменная " +"высота слоёв». Попробуйте!" #: resources/data/hints.ini: [hint:Support painting] msgid "" "Support painting\n" -"Did you know that you can paint the location of your supports? This feature makes it easy to place the support material only on the sections of the model that actually need it." +"Did you know that you can paint the location of your supports? This feature " +"makes it easy to place the support material only on the sections of the " +"model that actually need it." msgstr "" "Рисование поддержек\n" -"Знаете ли вы, что можно прямо на модели рисовать где будет размещаться принудительная поддержка, а где поддержка будет заблокирована? Используйте для этого функцию «Рисование поддержек»." +"Знаете ли вы, что можно прямо на модели рисовать где будет размещаться " +"принудительная поддержка, а где поддержка будет заблокирована? Используйте " +"для этого функцию «Рисование поддержек»." #: resources/data/hints.ini: [hint:Different types of supports] msgid "" "Different types of supports\n" -"Did you know that you can choose from multiple types of supports? Tree supports work great for organic models, while saving filament and improving print speed. Check them out!" +"Did you know that you can choose from multiple types of supports? Tree " +"supports work great for organic models, while saving filament and improving " +"print speed. Check them out!" msgstr "" "Различные типы поддержек\n" -"Знаете ли вы, что можно выбрать один из нескольких типов поддержек? Древовидная поддержка отлично подходит для органических моделей, экономя при этом материал, уменьшая время печати." +"Знаете ли вы, что можно выбрать один из нескольких типов поддержек? " +"Древовидная поддержка отлично подходит для органических моделей, экономя при " +"этом материал, уменьшая время печати." #: resources/data/hints.ini: [hint:Printing Silk Filament] msgid "" "Printing Silk Filament\n" -"Did you know that Silk filament needs special consideration to print it successfully? Higher temperature and lower speed are always recommended for the best results." +"Did you know that Silk filament needs special consideration to print it " +"successfully? Higher temperature and lower speed are always recommended for " +"the best results." msgstr "" "Печать блестящей пластиковой нитью\n" -"Знаете ли вы, что блестящая пластиковая нить требует особого внимания для успешной печати? Для достижения наилучшего результата рекомендуется более высокая температура и более низкая скорость печати." +"Знаете ли вы, что блестящая пластиковая нить требует особого внимания для " +"успешной печати? Для достижения наилучшего результата рекомендуется более " +"высокая температура и более низкая скорость печати." #: resources/data/hints.ini: [hint:Brim for better adhesion] msgid "" "Brim for better adhesion\n" -"Did you know that when printing models have a small contact interface with the printing surface, it's recommended to use a brim?" +"Did you know that when printing models have a small contact interface with " +"the printing surface, it's recommended to use a brim?" msgstr "" "Кайма для лучшей адгезии\n" -"Знаете ли вы, что при печати модели имеющей небольшой контакт с поверхностью стола, рекомендуется использовать кайму?" +"Знаете ли вы, что при печати модели имеющей небольшой контакт с поверхностью " +"стола, рекомендуется использовать кайму?" #: resources/data/hints.ini: [hint:Set parameters for multiple objects] msgid "" "Set parameters for multiple objects\n" -"Did you know that you can set slicing parameters for all selected objects at one time?" +"Did you know that you can set slicing parameters for all selected objects at " +"one time?" msgstr "" "Задание параметров для нескольких моделей\n" -"Знаете ли вы, что можно задать параметры нарезки сразу для всех выбранных моделей?" +"Знаете ли вы, что можно задать параметры нарезки сразу для всех выбранных " +"моделей?" #: resources/data/hints.ini: [hint:Stack objects] msgid "" @@ -9723,1222 +13526,957 @@ msgid "" "Did you know that you can stack objects as a whole one?" msgstr "" "Объединение моделей\n" -"Знаете ли вы, что можно объединить несколько моделей в единую? Используйте для этого команду «Объединить в сборку», выбрав несколько моделей." +"Знаете ли вы, что можно объединить несколько моделей в единую? Используйте " +"для этого команду «Объединить в сборку», выбрав несколько моделей." #: resources/data/hints.ini: [hint:Flush into support/objects/infill] msgid "" "Flush into support/objects/infill\n" -"Did you know that you can save the wasted filament by flushing them into support/objects/infill during filament change?" +"Did you know that you can save the wasted filament by flushing them into " +"support/objects/infill during filament change?" msgstr "" "Очистка в поддержку/модель/заполнение\n" -"Знаете ли вы, что при смене пластиковой нити, можно сохранить материал, который иначе попал бы на черновую башню, сбросив его в поддержку/модель/заполнение?" +"Знаете ли вы, что при смене пластиковой нити, можно сохранить материал, " +"который иначе попал бы на черновую башню, сбросив его в поддержку/модель/" +"заполнение?" #: resources/data/hints.ini: [hint:Improve strength] msgid "" "Improve strength\n" -"Did you know that you can use more wall loops and higher sparse infill density to improve the strength of the model?" +"Did you know that you can use more wall loops and higher sparse infill " +"density to improve the strength of the model?" msgstr "" "Увеличение прочности\n" -"Знаете ли вы, что для повышения прочности модели можно увеличить количество периметров и плотность заполнения?" +"Знаете ли вы, что для повышения прочности модели можно увеличить количество " +"периметров и плотность заполнения?" -msgid "Left Preset Value" -msgstr "Значение в левом профиле" - -msgid "Right Preset Value" -msgstr "Значение в правом профиле" - -msgid "Undef category" -msgstr "Неопределённая категория" - -msgid "Undef group" -msgstr "Неопределённая группа" - -msgid "Retraction Length (Toolchange)" -msgstr "Длина отката (при смене инструмента)" - -msgid "Flow Dynamic" -msgstr "Динамика потока" - -msgid "A fatal error occurred: %1%" -msgstr "Произошла фатальная ошибка: %1%" - -msgid "Record" -msgstr "Запись" - -msgid "Report issue" -msgstr "Сообщить о проблеме" - -msgid "Connection to OctoPrint/Klipper works correctly." -msgstr "Соединение с OctoPrint/Klipper успешно установлено." - -msgid "Could not connect to OctoPrint/Klipper" -msgstr "Не удаётся подключиться к OctoPrint/Klipper" - -msgid "Connection to FlashAir works correctly." -msgstr "Соединение с FlashAir успешно установлено." - -msgid "Could not connect to FlashAir" -msgstr "Не удаётся подключиться к FlashAir" - -msgid "Connection to Duet works correctly." -msgstr "Соединение с Duet успешно установлено." - -msgid "Could not connect to Duet" -msgstr "Не удалось подключиться к Duet" - -msgid "Connection to AstroBox works correctly." -msgstr "Соединение с AstroBox успешно установлено." - -msgid "Could not connect to AstroBox" -msgstr "Не удалось подключиться к AstroBox" - -msgid "Connection to Repetier works correctly." -msgstr "Подключение к Repetier успешно установлено." - -msgid "Could not connect to Repetier" -msgstr "Не удалось подключиться к Repetier" - -msgid "Connection to MKS works correctly." -msgstr "Подключение к MKS успешно установлено." - -msgid "Could not connect to MKS" -msgstr "Не удалось подключиться к MKS" - -msgid "Connection to PrusaLink works correctly." -msgstr "Подключение к PrusaLink установлено." - -msgid "Could not connect to PrusaLink" -msgstr "Не удалось подключиться к PrusaLink" - -msgid "Note: OctoPrint version at least 1.1.0 is required." -msgstr "Примечание: требуется версия OctoPrint не ниже 1.1.0." - -msgid "Connection refused" -msgstr "Соединение запрещено" - -msgid "Failed to connect to %s port %ld: %s" -msgstr "Не удалось подключиться к порту %s %ld: %s" - -msgid "Couldn't connect to server" -msgstr "Не удалось подключиться к серверу" - -msgid "Couldn't resolve host '%s'" -msgstr "Не удаётся определить имя хоста '%s'" - -msgid "Suggestion" -msgstr "Совет" - -msgid "BambuSource has not correctly been registered for media playing! Press Yes to re-register it." -msgstr "Компонент BambuSource неправильно зарегистрирован для воспроизведения мультимедиа! Нажмите «Да», чтобы перерегистрировать его." - -msgid "Missing BambuSource component registered for media playing! Please re-install BambuStutio or seek after-sales help." -msgstr "Отсутствует компонент BambuSource, зарегистрированный для воспроизведения мультимедиа! Пожалуйста, переустановите BambuStutio или обратитесь в поддержку." - -msgid "Test storage" -msgstr "Тест накопителя" - -msgid "Test BambuLab" -msgstr "Тест BambuLab" - -msgid "Test BambuLab:" -msgstr "Тест BambuLab:" - -msgid "Test Bing.com" -msgstr "Тест Bing.com" - -msgid "Test bing.com:" -msgstr "Тест bing.com:" - -msgid "Test HTTP" -msgstr "Тест HTTP" - -msgid "Test HTTP Service:" -msgstr "Тест HTTP сервера:" - -msgid "Test storage upgrade" -msgstr "Тест накопителя (обновление)" - -msgid "Test Storage Upgrade:" -msgstr "Тест накопителя (обновление):" - -msgid "Test Storage Upload" -msgstr "Тест накопителя (отправка)" - -msgid "Test Storage Upload:" -msgstr "Тест накопителя (отправка):" - -msgid "Test storage download" -msgstr "Тест накопителя (загрузка)" - -msgid "Test Storage Download:" -msgstr "Тест накопителя (загрузка):" - -msgid "Log Info" -msgstr "Журнал сведений" - -msgid "Studio Version:" -msgstr "Версия программы:" - -msgid "System Version:" -msgstr "Версия ОС:" - -msgid "Start Test Multi-Thread" -msgstr "Запуск многопоточного теста" - -msgid "Start Test Single-Thread" -msgstr "Запуск однопоточного теста" - -msgid "Network Test" -msgstr "Проверка сети" - -msgid "Multimaterial" -msgstr "Экструдер ММ" - -msgid "Single extruder multimaterial setup" -msgstr "Мультиматериальный одиночный экструдер" - -msgid "Single Extruder Multi Material" -msgstr "Мультиматериальный одиночный экструдер" - -msgid "Use single nozzle to print multi filament" -msgstr "Использование одной экструзионной головы для печати несколькими видами/цветами пластика." - -msgid "Wipe tower" -msgstr "Черновая башня" - -msgid "Purge in prime tower" -msgstr "Очистка в черновую башню" - -msgid "Purge remaining filament into prime tower" -msgstr "Очистка сопла от остатков материала в черновую башню" - -msgid "Enable filament ramming" -msgstr "Включить рэмминг прутка" - -msgid "No sparse layers (EXPERIMENTAL)" -msgstr "Отсутствие разреженных слоёв (экспериментально)" - -msgid "If enabled, the wipe tower will not be printed on layers with no toolchanges. On layers with a toolchange, extruder will travel downward to print the wipe tower. User is responsible for ensuring there is no collision with the print." -msgstr "Если этот параметр включён, черновая башня не будет печататься на слоях где не происходит смена инструмента. На слоях, где происходит смена инструмента, экструдер будет опускаться вниз до верхней части черновой башни, чтобы напечатать её. Эта функция помечена как экспериментальная, поэтому пользователь несёт ответственность за то, чтобы не допустить столкновения экструдера с напечатанным." - -msgid "Prime all printing extruders" -msgstr "Подготовка всех печатающих экструдеров" - -msgid "If enabled, all printing extruders will be primed at the front edge of the print bed at the start of the print." -msgstr "Если этот параметр включён, все печатающие экструдеры в начале печати будут подготавливаться на переднем крае стола." - -msgid "Single extruder multimaterial parameters" -msgstr "Параметры мультиматериального одиночного экструдера" - -msgid "Cooling tube position" -msgstr "Позиция охлаждающей трубки" - -msgid "Distance of the center-point of the cooling tube from the extruder tip." -msgstr "Расстояние между центральной точкой охлаждающей трубки и кончиком экструдера." - -msgid "Cooling tube length" -msgstr "Длина охлаждающей трубки" - -msgid "Length of the cooling tube to limit space for cooling moves inside it." -msgstr "Длина охлаждающей трубки для ограничения перемещения при охлаждающих движениях." - -msgid "Filament parking position" -msgstr "Положение парковки прутка" - -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 "Расстояние от кончика экструдера до точки, где размещается пруток при выгрузке. Расстояние должно соответствовать значению в прошивке принтера." - -msgid "Extra loading distance" -msgstr "Дополнительная длина загрузки" - -msgid "When set to zero, the distance the filament is moved from parking position during load is exactly the same as it was moved back during unload. When positive, it is loaded further, if negative, the loading move is shorter than unloading." -msgstr "Если установлено 0, то расстояние, которое проходит пруток при перемещении из положения парковки во время загрузки, точно такое же, как и при выгрузке. При положительном значении, она загружается дальше; при отрицательном, ход загрузки короче (по сравнению с выгрузкой)." - -msgid "High extruder current on filament swap" -msgstr "Повышение тока экструдера при замене прутка" - -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 "Это может быть полезно для увеличения тока двигателя экструдера во время замены прутка, чтобы быстро увеличить скорость подачи и преодолеть сопротивление при загрузке прутка с плохой формой кончика." - -msgid "Toolchange parameters with single extruder MM printers" -msgstr "Параметры смены инструмента в одноэкструдерных мультиматериальных принтерах" - -msgid "Toolchange parameters with multi extruder MM printers" -msgstr "Параметры смены инструмента в мультиэкструдерных мультиматериальных принтерах" - -msgid "Ramming settings" -msgstr "Настройки рэмминга" - -msgid "Loading speed" -msgstr "Скорость загрузки" - -msgid "Speed used for loading the filament on the wipe tower." -msgstr "Скорость загрузки прутка при печати черновой башни." - -msgid "Loading speed at the start" -msgstr "Начальная скорость загрузки" - -msgid "Speed used at the very beginning of loading phase." -msgstr "Скорость в начальной фазе загрузки прутка." - -msgid "Unloading speed" -msgstr "Скорость выгрузки" - -msgid "Speed used for unloading the filament on the wipe tower (does not affect initial part of unloading just after ramming)." -msgstr "Скорость выгрузки прутка на черновую башню. (не влияет на начальную фазу выгрузки сразу после рэмминга)." - -msgid "Unloading speed at the start" -msgstr "Начальная скорость выгрузки" - -msgid "Speed used for unloading the tip of the filament immediately after ramming." -msgstr "Скорость выгрузки кончика прутка сразу после рэмминга." - -msgid "Delay after unloading" -msgstr "Задержка после выгрузки" - -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 "Время ожидания после выгрузки прутка. Это может помочь вам легко сменить сопло при печати гибкими материалами, которым требуется больше времени, чтобы вернуться к своим первоначальным размерам." - -msgid "Wipe tower parameters" -msgstr "Параметры черновой башни" - -#: src/libslic3r/PrintConfig.cpp:1048 -msgid "Number of cooling moves" -msgstr "Количество охлаждающих движений" - -msgid "Filament is cooled by being moved back and forth in the cooling tubes. Specify desired number of these moves." -msgstr "Пруток охлаждается в охлаждающих трубках путём перемещения назад и вперёд. Укажите желаемое количество таких движений." - -msgid "Speed of the first cooling move" -msgstr "Скорость первого охлаждающего движения" - -msgid "Cooling moves are gradually accelerating beginning at this speed." -msgstr "Охлаждающие движения постепенно ускоряются, начиная с этой скорости." - -msgid "Speed of the last cooling move" -msgstr "Скорость последнего охлаждающего движения" - -msgid "Cooling moves are gradually accelerating towards this speed." -msgstr "Охлаждающие движения постепенно ускоряют до этой скорости." - -msgid "Time for the printer firmware (or the Multi Material Unit 2.0) to load a new filament during a tool change (when executing the T code). This time is added to the total print time by the G-code time estimator." -msgstr "Время за которое прошивка принтера (или Multi Material Unit 2.0) выгружает пруток во время смены инструмента (при выполнении кода Т). Это время добавляется к общему времени печати с помощью алгоритма оценки времени выполнения G-кода." - -msgid "Ramming parameters" -msgstr "Параметры рэмминга" - -msgid "This string is edited by RammingDialog and contains ramming specific parameters." -msgstr "Эта строка редактируется диалоговым окном рэмминга и содержит его конкретные параметры." - -msgid "Time for the printer firmware (or the Multi Material Unit 2.0) to unload a filament during a tool change (when executing the T code). This time is added to the total print time by the G-code time estimator." -msgstr "Время за которое прошивка принтера (или Multi Material Unit 2.0) выгружает пруток во время смены инструмента (при выполнении кода Т). Это время добавляется к общему времени печати с помощью алгоритма оценки времени выполнения G-кода." - -msgid "Enable ramming for multitool setups" -msgstr "Включить рэмминг для мультиинструментальных устройств" - -msgid "Perform ramming when using multitool printer (i.e. when the 'Single Extruder Multimaterial' in Printer Settings is unchecked). When checked, a small amount of filament is rapidly extruded on the wipe tower just before the toolchange. This option is only used when the wipe tower is enabled." -msgstr "Выполнять рэмминг при использовании мультиинструментального принтера (т. е. когда в настройках принтера снят флажок «Мультиматериальный одиночный экструдер»). При включении этой опции, небольшое количество материала быстро выдавливается на черновую башню непосредственно перед сменой инструмента. Эта опция используется только в том случае, если включена черновая башня." - -msgid "Multitool ramming volume" -msgstr "Объём рэмминга мультиинструмента" - -msgid "The volume to be rammed before the toolchange." -msgstr "Объём рэмминга перед сменой инструмента." - -msgid "Multitool ramming flow" -msgstr "Поток рэмминга мультиинструмента" - -msgid "Flow used for ramming the filament before the toolchange." -msgstr "Поток рэмминга пластиковой нити перед сменой инструмента." - -msgid "" -"Ramming denotes the rapid extrusion just before a tool change in a single-extruder MM printer. Its purpose is to properly shape the end of the unloaded filament so it does not prevent insertion of the new filament and can itself be reinserted later. This phase is important and different materials can require different extrusion speeds to get the good shape. For this reason, the extrusion rates " -"during ramming are adjustable.\n" -"\n" -"This is an expert-level setting, incorrect adjustment will likely lead to jams, extruder wheel grinding into filament etc." -msgstr "" -"Рэмминг (ramming, дословно утрамбовка) означает быстрое экструдирование непосредственно перед сменой инструмента в одноэкструдерном мультиматериальном принтере. Цель процесса состоит в том, чтобы правильно сформировать конец выгружаемого прутка, чтобы он не препятствовал вставке нового прутка или этого же прутка, вставленного позже. Эта фаза важна и разные материалы могут потребовать разных " -"скоростей экструзии, чтобы получить хорошую форму. По этой причине скорость экструзии во время рэмминга регулируется.\n" -"\n" -"Эта опция для опытных пользователей, неправильная настройка может привести к замятию, протиранию прутка приводом экструдера и т.д." - -msgid "Total ramming time" -msgstr "Общее время рэмминга" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:118 -msgid "Total rammed volume" -msgstr "Общий объём при рэмминге" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:122 -msgid "Ramming line width" -msgstr "Ширина линии при рэмминге" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:124 -msgid "Ramming line spacing" -msgstr "Расстояние между линиями при рэмминге" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:175 -msgid "Wipe tower - Purging volume adjustment" -msgstr "Черновая башня - регулировка объёма сброса пластика" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:301 -msgid "Here you can adjust required purging volume (mm³) for any given pair of tools." -msgstr "Здесь вы можете отрегулировать требуемый объём очистки (мм³) для любой пары инструментов." - -#: src/slic3r/GUI/WipeTowerDialog.cpp:302 -msgid "Extruder changed to" -msgstr "Экструдер перешёл на - " - -#: src/slic3r/GUI/WipeTowerDialog.cpp:354 -msgid "Tool #" -msgstr "Инструмент #" - -#: src/slic3r/GUI/WipeTowerDialog.cpp:363 -msgid "Total purging volume is calculated by summing two values below, depending on which tools are loaded/unloaded." -msgstr "Общий объём прочистки вычисляется путём суммирования двух нижеуказанных значений, в зависимости от того, какие инструменты предзагружены/выгружены." - -#: src/slic3r/GUI/WipeTowerDialog.cpp:364 -msgid "Volume to purge (mm³) when the filament is being" -msgstr "Объём прочистки (мм³) при выдавливании прутка" - -msgid "Volumetric speed" -msgstr "Объёмная скорость потока" - -msgid "Tip Diameter" -msgstr "Диаметр кончика ветки" - -#. TRN PrintSettings: "Organic supports" > "Tip Diameter" -msgid "Branch tip diameter for organic supports." -msgstr "Диаметр кончика ветки органической поддержки." - -#: src/libslic3r/PrintConfig.cpp:2952 -msgid "Branch Diameter" -msgstr "Диаметр ветвей" - -#. TRN PrintSettings: "Organic supports" > "Branch Diameter" -msgid "The diameter of the thinnest branches of organic support. Thicker branches are more sturdy. Branches towards the base will be thicker than this." -msgstr "Диаметр самых тонких ветвей органической поддержки. Чем толще ветви, тем они крепче. Ветви, идущие к основанию, будут утолщаться." - -msgid "Branch Diameter Angle" -msgstr "Угол изменения диаметра ветвей" - -#. TRN PrintSettings: "Organic supports" > "Branch Diameter Angle" -msgid "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the organic support." -msgstr "Угол изменения диаметра ветвей по мере их постепенного утолщения к основанию. Если значение угла равно 0, ветви будут иметь одинаковую толщину по всей своей длине. Небольшой угол может повысить устойчивость органической поддержки." - -#: src/libslic3r/PrintConfig.cpp:2978 -msgid "Branch Diameter with double walls" -msgstr "Диаметр ветвей с двойными стенками" - -#. TRN PrintSettings: "Organic supports" > "Branch Diameter" -msgid "Branches with area larger than the area of a circle of this diameter will be printed with double walls for stability. Set this value to zero for no double walls." -msgstr "Ветви, толщина которых больше указанного диаметра, будут напечатаны с двойными стенками для прочности. Установите 0, если двойные стенки у ветвей не нужны." - -msgid "Branch Distance" -msgstr "Расстояние между ветками" - -#. TRN PrintSettings: "Organic supports" > "Branch Distance" -msgid "How far apart the branches need to be when they touch the model. Making this distance small will cause the tree support to touch the model at more points, causing better overhang but making support harder to remove." -msgstr "Указывает, насколько далеко друг от друга должны располагаться ветви при касании модели. Если задать небольшое расстояние, то увеличится количество точек, в которых древовидная поддержка касается модели. Это улучшит печать нависаний, но при этом усложнит удаление поддержки." - -#: src/libslic3r/PrintConfig.cpp:3004 -msgid "Branch Density" -msgstr "Плотность ветвей" - -#. TRN PrintSettings: "Organic supports" > "Branch Density" -msgid "Adjusts the density of the support structure used to generate the tips of the branches. A higher value results in better overhangs but the supports are harder to remove, thus it is recommended to enable top support interfaces instead of a high branch density value if dense interfaces are needed." -msgstr "Регулирует плотность создания ветвей в месте контакта с моделью. Большее значение приводит к улучшению качества печати нависаний, но такие поддержки сложнее удалять, поэтому рекомендуется вместо высокого значения плотности ветвей включать связующие слои поддержки." - -# +++++++++++++++++++++ -msgid "Vertical" -msgstr "Вертикальная линия" - -msgid "Horizontal" -msgstr "Горизонтальная линия" - -msgid "Choose one or more files (3mf/step/stl/svg/obj/amf/usd*/abc/ply):" -msgstr "Выберите один или несколько файлов (3mf/step/stl/svg/obj/amf/usd*/abc/ply):" - -msgid "/" -msgstr "/" - -msgid "The printer does not currently support auto refill." -msgstr "В настоящее время принтер не поддерживает функцию автодозаправки." - -msgid "AMS filament backup is not enabled, please enable it in the AMS settings." -msgstr "Резервирование материала АСПП не включено, пожалуйста, включите его в настройках АСПП." - -msgid "" -"If there are two identical filaments in AMS, AMS filament backup will be enabled. \n" -"(Currently supporting automatic supply of consumables with the same brand, material type, and color)" -msgstr "" -"При наличии в АСПП двух одинаковых материалов включается функция резервирования материала (автодозаправка). \n" -"(В настоящее время поддерживается автоматическая дозаправка материала только одного производителя, типа и цвета)" - -#, c-format, boost-format -msgid "Current chamber temperature is higher than the material's safe temperature,it may result in material softening and clogging.The maximum safe temperature for the material is %d" -msgstr "Текущая температура в камере превышает безопасную температуру для этого материала, что может привести к размягчению материала или засорению экструдера. Безопасная температура текущего материала составляет %d." - -msgid " But machines with I3 structure will not generate timelapse videos." -msgstr " Но принтеры с кинематикой I3 не будут писать таймлапс." - -msgid "Filament unloading" -msgstr "Выгрузка прутка" - -# ??? -msgid "Skip step pause" -msgstr "Пропуск команды паузы" - -msgid "Filament loading" -msgstr "Загрузка прутка" - -msgid "Motor noise calibration" -msgstr "Калибровка шума двигателя" - -msgid "Paused due to AMS lost" -msgstr "Печать приостановлена из-за потери связи с АСПП" - -msgid "Paused due to low speed of the heat break fan" -msgstr "Печать приостановлена из-за низкой скорости вращения вентилятора головы" - -msgid "Paused due to chamber temperature control error" -msgstr "Печать приостановлена из-за ошибки контроля температуры в камере" - -msgid "Cooling chamber" -msgstr "Охлаждение камеры" - -msgid "Paused by the Gcode inserted by user" -msgstr "Печать приостановлена G-кодом, вставленным пользователем" - -# Демонстрация шума двигателя -msgid "Motor noise showoff" -msgstr "Результат калибровки шума двигателя" - -msgid "The current chamber temperature or the target chamber temperature exceeds 45℃.In order to avoid extruder clogging,low temperature filament(PLA/PETG/TPU) is not allowed to be loaded." -msgstr "Текущая температура в камере или целевая температура в камере превышает 45℃. Чтобы избежать засорения экструдера, запрещается загрузка низкотемпературной печатной нити (PLA/PETG/TPU)." - -msgid "Low temperature filament(PLA/PETG/TPU) is loaded in the extruder.In order to avoid extruder clogging,it is not allowed to set the chamber temperature above 45℃." -msgstr "В экструдер загружается низкотемпературная пластиковая нить (PLA/PETG/TPU). Чтобы избежать засорения экструдера, запрещается устанавливать температуру в камере выше 45℃." - -msgid "When you set the chamber temperature below 40℃, the chamber temperature control will not be activated. And the target chamber temperature will automatically be set to 0℃." -msgstr "Если вы установили температура в камере ниже 40℃, то контроль температуры в камере не запустится, а целевая температура в ней будет автоматически установлена на 0℃." - -msgid "This calibration does not support the currently selected nozzle diameter" -msgstr "Данная калибровка не поддерживает выбранный диаметр сопла" - -msgid "Current flowrate cali param is invalid" -msgstr "Текущая величина калибровки скорости потока недопустима" - -msgid "Selected diameter and machine diameter do not match" -msgstr "Выбранный диаметр и диаметр профиля принтера не совпадают" - -msgid "Failed to generate cali gcode" -msgstr "Не удалось сгенерировать калибровочный G-код" - -msgid "Align to Y axis" -msgstr "Выравнивать по оси Y" - -msgid "Vibration compensation" -msgstr "Компенсация вибрации" - -msgid "Motor noise cancellation" -msgstr "Шумоподавление двигателя" - -msgid "No step selected" -msgstr "Шаг не задан" - -msgid "" -"Another virtual camera is running.\n" -"Orca Slicer supports only a single virtual camera.\n" -"Do you want to stop this virtual camera?" -msgstr "" -"Уже работает одна виртуальная камера.\n" -"Orca Slicer поддерживает только одну виртуальную камеру.\n" -"Хотите остановить эту виртуальную камеру?" - -msgid "The .gcode.3mf file contains no G-code data.Please slice it with Orca Slicer and export a new .gcode.3mf file." -msgstr "Файл .gcode.3mf не содержит G-кода. Пожалуйста, нарежьте его в программе Orca Slicer и экспортируйте новый файл .gcode.3mf." - -msgid "" -"You have completed printing the mall model, \n" -"but the synchronization of rating information has failed." -msgstr "" -"Вы завершили печать модели торгового центра, \n" -"но не удалось синхронизировать информацию о рейтинге." - -msgid "How do you like this printing file?" -msgstr "На сколько вы оцениваете этот напечатанный файл?" - -msgid "(The model has already been rated. Your rating will overwrite the previous rating.)" -msgstr "(Модели уже присвоен рейтинг. Ваш рейтинг перезапишет предыдущий.)" - -msgid "Rate" -msgstr "Оценка" - -msgid "Rate the Print Profile" -msgstr "Оценить профиль печати" - -msgid "Comment" -msgstr "Комментарий" - -msgid "Rate this print" -msgstr "Оценить эту печать" - -msgid "Add Photo" -msgstr "Добавить фото" - -msgid "Delete Photo" -msgstr "Удалить фото" - -msgid "Submit" -msgstr "Отправить" - -msgid "Please click on the star first." -msgstr "Пожалуйста, сначала нажмите на звездочку." - -msgid "InFo" -msgstr "Информация" - -msgid "Get oss config failed." -msgstr "" -"Не удалось получить конфигурацию OSS.\n" -"\n" -"Ошибка получения конфигурации OSS." - -msgid "Upload Pictrues" -msgstr "Отправка изображений" - -msgid "Number of images successfully uploaded" -msgstr "Количество успешно загруженных изображений" - -msgid " upload failed" -msgstr " ошибка отправки" - -msgid " upload config prase failed\n" -msgstr " ошибка обработки конфигурации при отправке\n" - -# ??? -msgid " No corresponding storage bucket\n" -msgstr " Отсутствует хранилище данных\n" - -msgid " can not be opened\n" -msgstr " не удаётся открыть\n" - -msgid "" -"The following issues occurred during the process of uploading images. Do you want to ignore them?\n" -"\n" -msgstr "" -"В процессе загрузки изображений возникли следующие проблемы. Игнорировать их?\n" -"\n" - -msgid "Synchronizing the printing results. Please retry a few seconds later." -msgstr "Синхронизация результатов печати. Повторите попытку через несколько секунд." - -msgid "Upload failed\n" -msgstr "Ошибка отправки\n" - -msgid "obtaining instance_id failed\n" -msgstr "не удалось получить instance_id\n" - -msgid "" -"Your comment result cannot be uploaded due to some reasons. As follows:\n" -"\n" -" error code: " -msgstr "" -"Ваш комментарий не может быть отправлен по некоторым причинам. Причины:\n" -"\n" -"Код ошибки: " - -msgid "error message: " -msgstr "сообщение об ошибке: " - -msgid "" -"\n" -"\n" -"Would you like to redirect to the webpage for rating?" -msgstr "" -"\n" -"\n" -"Хотите перейти на страницу для выставления оценки?" - -msgid "Some of your images failed to upload. Would you like to redirect to the webpage for rating?" -msgstr "Некоторые из ваших изображений не удалось загрузить. Хотите перейти на страницу для выставления оценки?" - -msgid "You can select up to 16 images." -msgstr "Допускается выбор до 16 изображений." - -msgid "" -"At least one successful print record of this print profile is required \n" -"to give a positive rating(4 or 5stars)." -msgstr "Для выставления положительной оценки (4 или 5 звезд) требуется хотя бы одна успешная запись о печати данным профилем печати." - -msgid "Model file downloaded." -msgstr "Файл модели скачан." - -msgid "Allow Prompt Sound" -msgstr "Разрешить звуковые уведомления" - -msgid "Remove current plate (if not last one)" -msgstr "Удалить текущую печатную пластину (кроме последней)" - -msgid "Auto orient objects on current plate" -msgstr "Автоориентация моделей на текущей печатной пластине" - -msgid "Arrange objects on current plate" -msgstr "Расставить модели на текущей печатной пластине" - -msgid "Unlock current plate" -msgstr "Разблокировать текущую печатную пластину" - -msgid "Lock current plate" -msgstr "Заблокировать текущую печатную пластину" - -msgid "Customize current plate" -msgstr "Настроить текущую печатную пластину" - -msgid "The current hot bed temperature is relatively high. The nozzle may be clogged when printing this filament in a closed enclosure. Please open the front door and/or remove the upper glass." -msgstr "Текущая температура стола довольно высока. При печати этим материалом в закрытом корпусе возможно засорение сопла. Откройте переднюю дверцу и/или верхнюю крышку принтера." - -msgid "Enabling traditional timelapse photography may cause surface imperfections. It is recommended to change to smooth mode." -msgstr "Включение обычного режима таймлапса может привести к появлению дефектов поверхности, поэтому рекомендуется изменить режим на плавный." - -msgid "Replace from:" -msgstr "Заменить из:" - -msgid "Unable to replace with more than one volume" -msgstr "Невозможно заменить более чем одним объём" - -msgid "Do you want to replace it" -msgstr "Хотите заменить его" - -msgid "Reload from:" -msgstr "Перезагрузка из:" - -msgid "Unable to reload:" -msgstr "Не удалось перезагрузить:" - -msgid "Error during reload" -msgstr "Ошибка во время перезагрузки" - -msgid "Importing to Orca Slicer failed. Please download the file and manually import it." -msgstr "Не удалось импортировать в Orca Slicer. Загрузите файл и импортируйте его вручную." - -msgid "Save SLA file as:" -msgstr "Сохранить SLA файл как:" - -msgid "The provided file name is not valid." -msgstr "Указано недопустимое имя файла." - -msgid "The following characters are not allowed by a FAT file system:" -msgstr "Следующие символы не разрешены файловой системой FAT:" - -msgid "Use free camera" -msgstr "Использовать свободную камеру" - -msgid "If enabled, use free camera. If not enabled, use constrained camera." -msgstr "Если включено, используется свободное вращение камеры. Если выключено, используется вращение камера с ограничениями." - -msgid "Bambu Engineering Plate" -msgstr "Инженерная пластина Bambu" - -msgid "Bambu Smooth PEI Plate" -msgstr "Гладкая PEI пластина Bambu" - -msgid "High temperature Plate" -msgstr "Высокотемпературная пластина" - -msgid "Bambu Textured PEI Plate" -msgstr "Текстурированная PEI пластина Bambu" - -msgid "Click here if you can't connect to the printer" -msgstr "Не удаётся подключиться к принтеру?" - -msgid "When enable spiral vase mode, machines with I3 structure will not generate timelapse videos." -msgstr "При включении режима «Спиральная ваза» принтеры с кинематикой I3 не будут писать таймлапс." - -msgid "When print by object, machines with I3 structure will not generate timelapse videos." -msgstr "При печати по очереди, принтеры с кинематикой I3 не будут писать таймлапс." - -msgid "The printer is required to be in the same LAN as Orca Slicer." -msgstr "Принтер должен находиться в одной локальной сети с Orca Slicer." - -msgid "Print chamber temperature" -msgstr "Температура в термокамере" - -msgid "Smooth PEI Plate / High Temp Plate" -msgstr "Гладкая PEI/высокотемпер. пластина" - -msgid "Bed temperature when Smooth PEI Plate/High temperature plate is installed. Value 0 means the filament does not support to print on the Smooth PEI Plate/High Temp Plate" -msgstr "Температура стола при установленной гладкой PEI/высокотемпературный печатной пластине. 0 означает, что пластиковая нить не поддерживает печать на этой печатной пластине." - -msgid "Exhaust fan" -msgstr "Вытяжной вентилятор" - -msgid "During print" -msgstr "Во время печати" - -msgid "Complete print" -msgstr "После завершения печати" - -msgid "Time lapse G-code" -msgstr "G-код таймлапса" - -msgid "Click OK to update the Network plug-in when Orca Slicer launches next time." -msgstr "Нажмите OK, чтобы обновить сетевой плагин при следующем запуске Orca Slicer." - -msgid "New version of Orca Slicer" -msgstr "Доступна новая версия Orca Slicer" - -msgid "Step 1, please confirm Orca Slicer and your printer are in the same LAN." -msgstr "Шаг 1. Пожалуйста, убедитесь, что Orca Slicer и ваш принтер находятся в одной локальной сети." - -msgid "Invalid spacing supplied to Flow::with_spacing(), check your layer height and extrusion width" -msgstr "Для Flow::with_spacing () был указан недопустимый интервал. Проверьте высоту слоя и ширину экструзии." - -#, boost-format -msgid "The object %1% exceeds the maximum build volume height." -msgstr "Высота модели %1% превышает максимально допустимую." - -#, boost-format -msgid "While the object %1% itself fits the build volume, its last layer exceeds the maximum build volume height." -msgstr "Хотя сама модель %1% вписывается в область построения, её последний слой превышает максимальную высоту области построения." - -msgid "You might want to reduce the size of your model or change current print settings and retry." -msgstr "Попробуйте уменьшить размер модели или изменить текущие настройки печати и повторить попытку." - -msgid "Variable layer height is not supported with Organic supports." -msgstr "Функция переменной высоты слоя не совместима органическими поддержками." - -msgid "Elephant foot compensation layers" -msgstr "Компенсирующих слоёв «слоновьей ноги»" - -msgid "The number of layers on which the elephant foot compensation will be active. The first layer will be shrunk by the elephant foot compensation value, then the next layers will be linearly shrunk less, up to the layer indicated by this value." -msgstr "Количество слоёв, на которые будет распространяться компенсация слоновьей ноги. Первый слой будет уменьшен на величину компенсации слоновьей ноги с последующим линейным уменьшением до слоя, указанного здесь." - -# от Overhang reversal -# Реверс на нечётных слоях -msgid "Reverse on odd" -msgstr "Реверс на нависаниях" - -msgid "Overhang reversal" -msgstr "Реверс на нависаниях" - -msgid "Extrude perimeters that have a part over an overhang in the reverse direction on odd layers. This alternating pattern can drastically improve steep overhang." -msgstr "Печать периметров, имеющих нависания, в обратном направлении на нечётных слоях. Такое чередование может значительно улучшить качество печати крутых нависаний." - -# от Overhang reversal threshold -msgid "Reverse threshold" -msgstr "Порог для реверса" - -msgid "Overhang reversal threshold" -msgstr "Порог разворота на свесах" - -msgid "" -"Number of mm the overhang need to be for the reversal to be considered useful. Can be a % of the perimeter width.\n" -"Value 0 enables reversal on every odd layers regardless." -msgstr "" -"Величина свеса периметра при которой она считается достаточной для активации функции реверса печати нависаний.\n" -"Может быть задано как в процентах, так и в миллиметрах от ширины периметра." - -# ??? Замедление печати на изогнутых периметров -msgid "Slow down for curled perimeters" -msgstr "Снижение скорости на изогнутых периметрах" - -msgid "Enable this option to slow printing down in areas where potential curled perimeters may exist" -msgstr "Включите эту опцию для замедления печати в тех областях, где потенциально могут возникать изогнутые периметры." - -msgid "Activate air filtration" -msgstr "Вкл. фильтрацию воздуха" - -msgid "Activate for better air filtration. G-code command: M106 P3 S(0-255)" -msgstr "Активировать для лучшей фильтрации воздуха. G-код команда: M106 P3 S(0-255)" - -msgid "Speed of exhuast fan during printing.This speed will overwrite the speed in filament custom gcode" -msgstr "Скорость вытяжного вентилятора во время печати. Эта скорость будет переопределять скорость в пользовательском стартовом G-коде материала" - -msgid "Speed of exhuast fan after printing completes" -msgstr "Скорость вытяжного вентилятора после завершения печати" - -msgid "Softening temperature" -msgstr "Температура размягчения" - -msgid "The material softens at this temperature, so when the bed temperature is equal to or greater than it, it's highly recommended to open the front door and/or remove the upper glass to avoid cloggings." -msgstr "При этой температуре материал размягчается, поэтому, когда температура стола равна или превышает её, настоятельно рекомендуется открыть переднюю дверцу и/или верхнюю крышку принтера, чтобы избежать засорения сопла." - -msgid "Acceleration of initial layer. Using a lower value can improve build plate adhesive" -msgstr "Ускорение на первом слое. Использование более низкого значения может улучшить адгезию к столу." - -#, c-format, boost-format -msgid "Klipper's max_accel_to_decel will be adjusted to this %% of acceleration" -msgstr "Значение Klipper-а max_accel_to_decel (ограничение ускорения зигзагов) будет скорректировано на заданный процент ускорения." - -#, c-format, boost-format -msgid "%%" -msgstr "%%" - -msgid "Filter out gaps smaller than the threshold specified" -msgstr "Небольшие промежутки меньше указанного порога не будут заполняться." - -msgid "Printer structure" -msgstr "Кинематика принтера" - -msgid "The physical arrangement and components of a printing device" -msgstr "Конструкция физического принтера" - -msgid "CoreXY" -msgstr "CoreXY" - -msgid "I3" -msgstr "I3" - -msgid "Hbot" -msgstr "Hbot" - -msgid "Delta" -msgstr "Delta" - -msgid "Best object position" -msgstr "Наилучшее расположение модели" - -msgid "Best auto arranging position in range [0,1] w.r.t. bed shape." -msgstr "Наилучшее расположение модели при авторасстановке в диапазоне [0,1] относительно формы стола." - -msgid "Enable this option if machine has auxiliary part cooling fan. G-code command: M106 P2 S(0-255)." -msgstr "" -"Если в принтере имеет вспомогательный вентилятор для охлаждения моделей, можете включить эту опцию. \n" -"G-код команда: M106 P2 S(0-255)." - -msgid "Time cost" -msgstr "Цена печати" - -msgid "The printer cost per hour" -msgstr "Стоимость печати в час." - -msgid "money/h" -msgstr "цена/ч" - -msgid "Support control chamber temperature" -msgstr "Контроль температуры в термокамере" - -msgid "" -"This option is enabled if machine support controlling chamber temperature\n" -"G-code command: M141 S(0-255)" -msgstr "" -"Если принтер поддерживает контроль температуры в камере, включите эту опцию.\n" -"G-код команда: M141 S(0-255)" - -msgid "Support air filtration" -msgstr "Фильтрация выдуваемого воздуха" - -msgid "" -"Enable this if printer support air filtration\n" -"G-code command: M106 P3 S(0-255)" -msgstr "" -"Если принтер поддерживает фильтрацию выдуваемого воздуха, включите эту опцию. \n" -"G-код команда: M106 P3 S(0-255)" - -msgid "The pattern that will be used when ironing" -msgstr "Шаблон по которому будет производиться разглаживание." - -msgid "Ironing angle" -msgstr "Угол разглаживания" - -msgid "The angle ironing is done at. A negative number disables this function and uses the default method." -msgstr "Выбор угла разглаживания. Отрицательное число отключает эту функцию и использует метод по умолчанию." - -# ??? -msgid "Extrusion rate smoothing" -msgstr "Сглаживание скорости экструзии" - -msgid "" -"This parameter smooths out sudden extrusion rate changes that happen when the printer transitions from printing a high flow (high speed/larger width) extrusion to a lower flow (lower speed/smaller width) extrusion and vice versa.\n" -"\n" -"It defines the maximum rate by which the extruded volumetric flow in mm3/sec can change over time. Higher values mean higher extrusion rate changes are allowed, resulting in faster speed transitions.\n" -"\n" -"A value of 0 disables the feature. \n" -"\n" -"For a high speed, high flow direct drive printer (like the Bambu lab or Voron) this value is usually not needed. However it can provide some marginal benefit in certain cases where feature speeds vary greatly. For example, when there are aggressive slowdowns due to overhangs. In these cases a high value of around 300-350mm3/s2 is recommended as this allows for just enough smoothing to assist " -"pressure advance achieve a smoother flow transition.\n" -"\n" -"For slower printers without pressure advance, the value should be set much lower. A value of 10-15mm3/s2 is a good starting point for direct drive extruders and 5-10mm3/s2 for Bowden style. \n" -"\n" -"This feature is known as Pressure Equalizer in Prusa slicer.\n" -"\n" -"Note: this parameter disables arc fitting." -msgstr "" -"Этот параметр сглаживает резкие изменения скорости экструзии, которые происходят, когда принтер переходит от печати с большим расходом (высокая скорость/большая ширина) к печати с меньшим расходом (меньшая скорость/меньшая ширина) и наоборот.\n" -"\n" -"Параметр задаёт максимальную скорость, с которой объёмный расход экструдируемого материала может изменяться с течением времени (мм³/с). Более высокие значения означают, что допускаются более высокие изменения скорости экструзии, что приводит к более быстрому переключению скоростей.\n" -"\n" -"Значение 0 отключает эту функцию. \n" -"\n" -"Для высокоскоростных принтеров с прямым приводом (например, Bambu lab или Voron) обычно не требуется использование данного значения. Однако в некоторых случаях, когда скорость печати сильно различается, это может принести некоторую дополнительную пользу. Например, когда происходят резкие замедления из-за нависаний. В этих случаях рекомендуется использовать высокое значение, составляющее около " -"300-350 мм³/с², так как это обеспечивает достаточное сглаживание, помогающее прогнозированию давления достичь более плавного перехода потока.\n" -"\n" -"Для более медленных принтеров, не использующих прогнозирование давления (pressure advance), это значение должно быть значительно ниже. Значение 10-15 мм³/с² является хорошей отправной точкой для экструдеров с прямым приводом и 5-10 мм³/с² для боуден экструдеров.\n" -"\n" -"В Prusa Slicer эта функция известна как «Выравнивание давления» (Pressure equalizer).\n" -"\n" -"Примечание: этот параметр отключает поддержку движения по дуге окружности." - -msgid "mm³/s²" -msgstr "мм³/с²" - -msgid "Smoothing segment length" -msgstr "Длина сглаживающего сегмента" - -msgid "" -"A lower value results in smoother extrusion rate transitions. However, this results in a significantly larger gcode file and more instructions for the printer to process. \n" -"\n" -"Default value of 3 works well for most cases. If your printer is stuttering, increase this value to reduce the number of adjustments made\n" -"\n" -"Allowed values: 1-5" -msgstr "" -"Меньшее значение приводит к более плавному изменению скорости экструзии. Однако это приводит к значительному увеличению размера G-код файла и увеличению количества инструкций для обработки принтером. \n" -"\n" -"Значение по умолчанию, равное 3, хорошо подходит для большинства случаев. Если принтер печатает с мини-фризами, увеличьте это значение, чтобы уменьшить количество выполняемых изменений.\n" -"\n" -"Допустимые значения: 1–5." - -msgid "" -"Speed of auxiliary part cooling fan. Auxiliary fan will run at this speed during printing except the first several layers which is defined by no cooling layers.\n" -"Please enable auxiliary_fan in printer settings to use this feature. G-code command: M106 P2 S(0-255)" -msgstr "" -"Скорость вращения вспомогательного вентилятора для охлаждения моделей. Он всегда будет работать с этой скоростью, за исключением первых нескольких слоёв, которые обычно настроены на работу без охлаждения.\n" -"Пожалуйста, включите вспомогательный вентилятор для охлаждения моделей (auxiliary_fan) в настройках принтера, чтобы использовать эту функцию. \n" -"G-код команда: M106 P2 S(0-255)." - -msgid "The minimum printing speed for the filament when slow down for better layer cooling is enabled, when printing overhangs and when feature speeds are not specified explicitly." -msgstr "Минимальная скорость печати для текущего прутка при включенной функции «Замедлять печать для лучшего охлаждения слоёв» при печати нависаний и когда скорости элементов явно не задана." - -msgid "Z hop lower boundary" -msgstr "Приподнимать ось Z только ниже" - -msgid "Z hop will only come into effect when Z is above this value and is below the parameter: \"Z hop upper boundary\"" -msgstr "Если указать положительное значение, ось Z будет подниматься только ниже (до) заданной здесь высоты (высота считается от стола). Таким образом вы можете запретить подъём оси Z выше установленной высоты." - -msgid "Z hop upper boundary" -msgstr "Приподнимать ось Z только выше" - -msgid "If this value is positive, Z hop will only come into effect when Z is above the parameter: \"Z hop lower boundary\" and is below this value" -msgstr "Если указать положительное значение, ось Z будет подниматься только выше (после) заданной здесь высоты (высота считается от стола). Таким образом вы можете отключить подъём оси Z при печати на первых слоях (в начале печати)." - -msgid "Manual Filament Change" -msgstr "Ручная замена прутка" - -msgid "Enable this option to omit the custom Change filament G-code only at the beginning of the print. The tool change command (e.g., T0) will be skipped throughout the entire print. This is useful for manual multi-material printing, where we use M600/PAUSE to trigger the manual filament change action." -msgstr "Включите эту опцию, если хотите пропустить пользовательский G-код смены прутка только в начале печати. Команда смены инструмента (например, T0) будет пропускаться на протяжении всей печати. Это полезно при ручной мультиматериальной печати, где для запуска операции ручной смены прутка используется команда M600." - -msgid "Z offset" -msgstr "Смещение координат оси Z" - -msgid "This value will be added (or subtracted) from all the Z coordinates in the output G-code. It is used to compensate for bad Z endstop position: for example, if your endstop zero actually leaves the nozzle 0.3mm far from the print bed, set this to -0.3 (or fix your endstop)." -msgstr "Это значение будет прибавлено (или вычтено) из всех Z координат в выходном G-коде. Это, например, используется для компенсации неправильного положения концевика оси Z." - -msgid "" -"Style and shape of the support. For normal support, projecting the supports into a regular grid will create more stable supports (default), while snug support towers will save material and reduce object scarring.\n" -"For tree support, slim and organic style will merge branches more aggressively and save a lot of material (default organic), while hybrid style will create similar structure to normal support under large flat overhangs." -msgstr "" -"Стиль и форма создаваемой поддержки.\n" -"\n" -"Стиль «Сетка» создаёт более устойчивые опоры (по умолчанию). Стиль «Аккуратный» экономит материал и уменьшает образование дефектов на моделях.\n" -"\n" -"Для древовидной поддержки, при стройном и органическом стиле происходит более агрессивное объединение ветвей и экономия материала (по умолчанию органический). В то время как гибридный стиль создаёт структуру, схожую с обычную поддержкой при больших плоских нависаниях." - -msgid "Activate temperature control" -msgstr "Вкл. контроль температуры" - -msgid "" -"Enable this option for chamber temperature control. An M191 command will be added before \"machine_start_gcode\"\n" -"G-code commands: M141/M191 S(0-255)" -msgstr "" -"Для контроля температуры в камере принтера включите эту опцию. Команда M191 будет добавлена перед стартовый G-кодом принтера (machine_start_gcode).\n" -"G-код команда: M141/M191 S(0-255)" - -msgid "" -"Higher chamber temperature can help suppress or reduce warping and potentially lead to higher interlayer bonding strength for high temperature materials like ABS, ASA, PC, PA and so on.At the same time, the air filtration of ABS and ASA will get worse.While for PLA, PETG, TPU, PVA and other low temperature materials,the actual chamber temperature should not be high to avoid cloggings, so 0 " -"which stands for turning off is highly recommended" -msgstr "" -"Более высокая температура в камере может помочь уменьшить или даже исключить коробление материала. Так же это улучшает межслойное соединения у высокотемпературных материалов, таких как ABS, ASA, PC, PA и т.д. (в то же время фильтрация воздуха при печати ABS и ASA сделает её хуже). Для низкотемпературных материалов, таких как PLA, PETG, TPU, PVA и т. д., фактическая температура в камере не " -"должна быть слишком высокой, чтобы избежать засорения сопла, поэтому настоятельно рекомендуется установить температуру в камере равной 0°C." - -# ??? -# Преобразование отверстий в многограннники -msgid "Convert holes to polyholes" -msgstr "Многогранные отверстия" - -# ??? -# Поиск отверстий близких к кругу в двух или более слоях -# Расчёт многогранного отверстия вычисляется по диаметру сопла. -msgid "" -"Search for almost-circular holes that span more than one layer and convert the geometry to polyholes. Use the nozzle size and the (biggest) diameter to compute the polyhole.\n" -"See http://hydraraptor.blogspot.com/2011/02/polyholes.html" -msgstr "" -"Поиск цилиндрических отверстий в двух или более слоях и преобразование их геометрии в многогранники. Для расчёта многогранного отверстия используется размер сопла и наибольший диаметр найденного отверстия.\n" -"Подробнее на http://hydraraptor.blogspot.com/2011/02/polyholes.html" - -# ??? -# Предел обнаружения многогранного отверстия -msgid "Polyhole detection margin" -msgstr "Предел обнаружения" - -msgid "" -"Maximum defection of a point to the estimated radius of the circle.\n" -"As cylinders are often exported as triangles of varying size, points may not be on the circle circumference. This setting allows you some leway to broaden the detection.\n" -"In mm or in % of the radius." -msgstr "" -"Максимальное отклонение точки от расчётного радиуса окружности.\n" -"Поскольку цилиндры часто экспортируются в виде треугольников разного размера, точки могут находиться не на окружности круга. Эта настройка позволяет в некоторой степени расширить эту область обнаружения.\n" -"Значение задаётся в мм или в процентах от радиуса." - -msgid "Polyhole twist" -msgstr "Скручивание многогранника" - -msgid "Rotate the polyhole every layer." -msgstr "Вращение многогранного отверстия на каждом слое." - -msgid "Format of G-code thumbnails" -msgstr "Формат эскизов G-кода" - -msgid "Format of G-code thumbnails: PNG for best quality, JPG for smallest size, QOI for low memory firmware" -msgstr "Формат эскизов G-кода: PNG для наилучшего качества, JPG для наименьшего размера, QOI для прошивки с малым объемом памяти." - -msgid "Minimum save" -msgstr "Минимальное сохранение" - -msgid "export 3mf with minimum size." -msgstr "экспорт 3mf файла с минимальным размером." - -msgid "Ensure on bed" -msgstr "Обеспечивать размещение на столе" - -msgid "Lift the object above the bed when it is partially below. Disabled by default" -msgstr "Поднимает модель над столом, когда она частично находится ниже его уровня. По умолчанию отключено." - -msgid "Orient Options" -msgstr "Параметры ориентации" - -msgid "Orient options: 0-disable, 1-enable, others-auto" -msgstr "Параметры ориентации: 0 - отключить, 1 - включить, другие - автоматически" - -msgid "Rotation angle around the Z axis in degrees." -msgstr "Угол поворота вокруг оси Z в градусах." - -msgid "Rotate around X" -msgstr "Поворот вокруг оси X" - -msgid "Rotation angle around the X axis in degrees." -msgstr "Угол поворота вокруг оси X в градусах." - -msgid "Rotate around Y" -msgstr "Поворот вокруг оси Y" - -msgid "Rotation angle around the Y axis in degrees." -msgstr "Угол поворота вокруг оси Y в градусах." - -msgid "Load custom gcode" -msgstr "Загрузить пользовательский G-код" - -msgid "Load custom gcode from json" -msgstr "Загрузить пользовательской G-код из json" - -#, c-format, boost-format -msgid "" -"Please input valid values:\n" -"Start value: >= %.1f\n" -"End value: <= %.1f\n" -"End value: > Start value\n" -"Value step: >= %.3f)" -msgstr "" -"Введите допустимое значение:\n" -"Начальное: >= %.1f\n" -"Конечное: <= %.1f\n" -"Конечное: > Начальное\n" -"Шаг: >= %.3f)" - -msgid "Please find the cornor with perfect degree of extrusion" -msgstr "Пожалуйста, найдите угол с идеальной степенью экструзии" - -msgid "Pattern" -msgstr "Шаблон" - -msgid "From k Value" -msgstr "Начальное значение коэф. K" - -msgid "To k Value" -msgstr "Конечное значение коэф. K" - -msgid "Step value" -msgstr "Шаг" - -msgid "0.5" -msgstr "0.5" - -msgid "0.005" -msgstr "0.005" - -msgid "" -"Please input valid values:\n" -"start > 0 \n" -"step >= 0\n" -"end > start + step)" -msgstr "" -"Введите допустимое значение:\n" -"Начальное > 0\n" -"Шаг >= 0\n" -"Конечное > Начальное + Шаг" - -msgid "" -"Please input valid values:\n" -"start > 10 \n" -"step >= 0\n" -"end > start + step)" -msgstr "" -"Введите допустимое значение:\n" -"Начальное > 10\n" -"Шаг >= 0\n" -"Конечное > Начальное + Шаг" - -msgid "The start, end or step is not valid value." -msgstr "Недопустимое значение: начальное, конечное или шаг." - -msgid "Unable to calibrate: maybe because the set calibration value range is too large, or the step is too small" -msgstr "Невозможно выполнить калибровку: возможно, установленный диапазон значений калибровки слишком велик или шаг слишком мал." - -msgid "Need select printer" -msgstr "Нужно выбрать принтер" - -#: resources/data/hints.ini: [hint:When need to print with the printer door opened] +#: resources/data/hints.ini: [hint:When need to print with the printer door +#: opened] msgid "" "When need to print with the printer door opened\n" -"Opening the printer door can reduce the probability of extruder/hotend clogging when printing lower temperature filament with a higher enclosure temperature. More info about this in the Wiki." +"Did you know that opening the printer door can reduce the probability of " +"extruder/hotend clogging when printing lower temperature filament with a " +"higher enclosure temperature. More info about this in the Wiki." msgstr "" -"Когда необходимо печатать с открытой дверцей принтера?\n" -"При печати низкотемпературным материалом при более высокой температуре в камере, открытие дверцы принтера снижает вероятность засорения экструдера/хотэнда. Более подробную информацию читайте на вики-сайте." -# ++++++++++++++++++++++++++++ beta2 -msgid "Total Estimation" -msgstr "Общая оценка" - -msgid "Home" -msgstr "Домашняя страница" - -msgid "Default Page" +#: resources/data/hints.ini: [hint:Avoid warping] +msgid "" +"Avoid warping\n" +"Did you know that when printing materials that are prone to warping such as " +"ABS, appropriately increasing the heatbed temperature can reduce the " +"probability of warping." msgstr "" -"Страница \n" -"по умолчанию" -msgid "Set the page opened on startup." -msgstr "Задание страницы, открываемой при запуске приложения." +#~ msgid "Edit Text" +#~ msgstr "Изменить текст" -msgid "Show splash screen" -msgstr "Показывать окно приветствия" +#~ msgid "Error! Unable to create thread!" +#~ msgstr "Ошибка! Не удалось создать поток выполнения!" -msgid "Show the splash screen during startup." -msgstr "Показывать окно приветствия при запуске приложения." +#~ msgid "Exception" +#~ msgstr "Исключение" -msgid "invalid value" -msgstr "недопустимое значение" +#~ msgid "Choose SLA archive:" +#~ msgstr "Выберите SLA архив:" -msgid "MB uploaded" -msgstr "МБ загружено" +#~ msgid "Import file" +#~ msgstr "Импорт файла" + +#~ msgid "Import model and profile" +#~ msgstr "Импортировать модель и профиль" + +#~ msgid "Import profile only" +#~ msgstr "Импортировать только профиль" + +#~ msgid "Import model only" +#~ msgstr "Импортировать только модель" + +#~ msgid "Accurate" +#~ msgstr "Точность" + +#~ msgid "Balanced" +#~ msgstr "Баланс" + +#~ msgid "Quick" +#~ msgstr "Скорость" + +#~ msgid "Auto-Calc" +#~ msgstr "Авторасчёт" + +#~ msgid "unloaded" +#~ msgstr "выгрузку" + +#~ msgid "loaded" +#~ msgstr "загрузку" + +#~ msgid "Filament #" +#~ msgstr "Пруток #" + +#~ msgid "" +#~ "Discribe how long the nozzle will move along the last path when retracting" +#~ msgstr "" +#~ "Задаёт расстояние перемещения, добавленное после печати внешней стенки " +#~ "при совершении отката, чтобы сделать шов по оси Z менее заметным." + +#~ msgid "" +#~ "Simplify Model\n" +#~ "Did you know that you can reduce the number of triangles in a mesh using " +#~ "the Simplify mesh feature? Right-click the model and select Simplify " +#~ "model. Read more in the documentation." +#~ msgstr "" +#~ "Упростить сетку модели\n" +#~ "Знаете ли вы, что можно уменьшить количество треугольников в " +#~ "полигональной сетке, используя функцию упрощения сетки? Щелкните правой " +#~ "кнопкой мыши на модели и выберите «Упростить полигональную сетку». " +#~ "Подробнее читайте в документации." + +#~ msgid "" +#~ "Subtract a Part\n" +#~ "Did you know that you can subtract one mesh from another using the " +#~ "Negative part modifier? That way you can, for example, create easily " +#~ "resizable holes directly in Orca Slicer. Read more in the documentation." +#~ msgstr "" +#~ "Вычитание объёмов\n" +#~ "Знаете ли вы, что можно вычесть одну сетку из другой с помощью " +#~ "модификатора «Объём для вычитания»? Таким образом, например, отверстия в " +#~ "модели можно создавать непосредственно в Orca Slicer. Подробнее читайте в " +#~ "документации." + +#~ msgid "Ctrl + Shift + Enter" +#~ msgstr "Ctrl + Shift + Enter" + +#~ msgid "Tool-Lay on Face" +#~ msgstr "Поверхностью на стол" + +#~ msgid "Embeded" +#~ msgstr "Проникновение" + +#~ msgid "Export as STL" +#~ msgstr "Экспорт в STL" + +#~ msgid "Check cloud service status" +#~ msgstr "Проверка статуса облачного сервиса" + +#~ msgid "AMS %s" +#~ msgstr "АСПП №%s" + +#~ msgid "Cali" +#~ msgstr "Калиб." + +#~ msgid "Calibration of extrusion" +#~ msgstr "Калибровка экструзии" + +#~ msgid "Push new filament into the extruder" +#~ msgstr "Вставка нового прутка в экструдер" + +#~ msgid "Confirm whether the filament has been extruded" +#~ msgstr "Подтвердите, что пластиковая нить была выдавлена" + +#~ msgid "Filling bed " +#~ msgstr "Заполнение стола" + +#~ msgid "The region parameter is incorrrect" +#~ msgstr "Неправильная региональная настройка" + +#~ msgid "Failure of printer login" +#~ msgstr "Не удалось подключиться к принтеру." + +#~ msgid "Failed to get ticket" +#~ msgstr "Не удалось получить заявку" + +#~ msgid "User authorization timeout" +#~ msgstr "Таймаут авторизации пользователя" + +#~ msgid "Failure of bind" +#~ msgstr "Ошибка привязки" + +#~ msgid "Print file not found, please slice again" +#~ msgstr "Файл для печати не найден, нарежьте ещё раз." + +#~ msgid "Failed uploading print file" +#~ msgstr "Не удалось передать файл на печать." + +#~ msgid "Wrong Access code" +#~ msgstr "Неправильный код доступа" + +#~ msgid "Send to Printer failed. Please try again." +#~ msgstr "Ошибка отправки на принтер. Пожалуйста, попробуйте ещё раз." + +#~ msgid "No space left on Printer SD card" +#~ msgstr "На SD-карте принтера недостаточно места" + +#~ msgid "Sending gcode file through cloud service" +#~ msgstr "Отправка файла G-кода через облачный сервис" + +#~ msgid "Please log out and login to the printer again." +#~ msgstr "Пожалуйста, выйдите и снова войдите в принтер." + +#~ msgid "Factors of dynamic flow cali" +#~ msgstr "Коэф. калиб. динам. потока" + +#~ msgid "Please input a valid value (K in 0~0.5)" +#~ msgstr "Пожалуйста, введите допустимое значение (K в диапазоне 0~0.5)" + +#~ msgid "Please input a valid value (K in 0~0.5, N in 0.6~2.0)" +#~ msgstr "" +#~ "Пожалуйста, введите допустимое значение (K в диапазоне 0~0.5, N в " +#~ "диапазоне 0.6~2.0)" + +#~ msgid "" +#~ "There are currently no identical spare consumables available, and " +#~ "automatic replenishment is currently not possible. \n" +#~ "(Currently supporting automatic supply of consumables with the same " +#~ "brand, material type, and color)" +#~ msgstr "" +#~ "В настоящее время одинаковые материалы отсутствуют, поэтому функция " +#~ "резервирования материала (автодозаправка) недоступна. \n" +#~ "(В настоящее время поддерживается автоматическая дозаправка материала " +#~ "только одного производителя, типа и цвета)" + +#, c-format, boost-format +#~ msgid "" +#~ "Bed temperature of other layer is lower than bed temperature of initial " +#~ "layer for more than %d degree centigrade.\n" +#~ "This may cause model broken free from build plate during printing" +#~ msgstr "" +#~ "Температура стола для последующих слоёв слишком низкая по сравнению с " +#~ "температурой первого слоя, более чем на %d градусов Цельсия.\n" +#~ "Это может привести к отрыву модели от стола во время печати." + +#~ msgid "" +#~ "Bed temperature is higher than vitrification temperature of this " +#~ "filament.\n" +#~ "This may cause nozzle blocked and printing failure\n" +#~ "Please keep the printer open during the printing process to ensure air " +#~ "circulation or reduce the temperature of the hot bed" +#~ msgstr "" +#~ "Температура стола выше температуры стеклования этой пластиковой нити.\n" +#~ "Это может привести к засорению сопла и сбою печати.\n" +#~ "Пожалуйста, держите принтер открытым во время печати, чтобы обеспечить " +#~ "циркуляцию воздуха или снизить температуру стола." + +#, boost-format +#~ msgid "%1% infill pattern doesn't support 100%% density." +#~ msgstr "Шаблон заполнения «%1%» не поддерживает 100%% заполнение." + +#~ msgid "" +#~ "Switch to rectilinear pattern?\n" +#~ "Yes - switch to rectilinear pattern automaticlly\n" +#~ "No - reset density to default non 100% value automaticlly" +#~ msgstr "" +#~ "Переключиться на прямолинейный (rectilinear) шаблон?\n" +#~ "Да - переключиться на прямолинейный шаблон\n" +#~ "Нет - сбросить плотность заполнения до значения по умолчанию (отличного " +#~ "от 100%)" + +#~ msgid "Invalid nozzle diameter" +#~ msgstr "Недопустимый диаметр сопла" + +#~ msgid "Fan Speed: " +#~ msgstr "Скорость вентилятора: " + +#~ msgid "Total Time Estimation" +#~ msgstr "Оценка общего времени" + +#~ msgid "Resonance frequency identification" +#~ msgstr "Идентификация резонансной частоты" + +#~ msgid "Export all objects as STL" +#~ msgstr "Экспортировать все модели в STL" + +#~ msgid "Initialize failed (Not supported with LAN-only mode)!" +#~ msgstr "Ошибка инициализации (не поддерживается в режиме «Только LAN»)!" + +#~ msgid "Initialize failed (Not supported by printer)!" +#~ msgstr "Ошибка инициализации (не поддерживается принтером)!" + +#~ msgid "" +#~ "Another virtual camera is running.\n" +#~ "Bambu Studio supports only a single virtual camera.\n" +#~ "Do you want to stop this virtual camera?" +#~ msgstr "" +#~ "Уже работает одна виртуальная камера.\n" +#~ "Bambu Studio поддерживает только одну виртуальную камеру.\n" +#~ "Хотите остановить эту виртуальную камеру?" + +#~ msgid "Not supported by this model of printer!" +#~ msgstr "Не поддерживается этой моделью принтера!" + +#~ msgid "No files" +#~ msgstr "Файлы отсутствуют" + +#~ msgid "Not accessible in LAN-only mode!" +#~ msgstr "Недоступно в режиме «Только LAN»!" + +#~ msgid "Missing LAN ip of printer!" +#~ msgstr "Отсутствует сетевой адрес принтера!" + +#, c-format, boost-format +#~ msgid "You are going to delete %u files. Are you sure to continue?" +#~ msgstr "" +#~ "Вы собираетесь удалить файлы: %u шт. Вы уверены, что хотите это сделать?" + +#~ msgid "" +#~ "The .gcode.3mf file contains no G-code data.Please slice it whthBambu " +#~ "Studio and export a new .gcode.3mf file." +#~ msgstr "" +#~ "Файл .gcode.3mf не содержит G-кода. Пожалуйста, нарежьте его в программе " +#~ "Bambu Studio и экспортируйте новый файл .gcode.3mf." + +#~ msgid "Immediately score" +#~ msgstr "Оценить сейчас" + +#, c-format, boost-format +#~ msgid "" +#~ "Disconnected from printer [%s] due to LAN mode disabled.Please reconnect " +#~ "the printer by logging in with your user account." +#~ msgstr "" +#~ "Соединение с принтером [%s] разорвано из-за отключения режима «Только " +#~ "LAN». Повторно подключитесь к принтеру, войдя в свою учётную запись." + +#, c-format, boost-format +#~ msgid "" +#~ "Disconnected from printer [%s] due to LAN mode enabled.Please reconnect " +#~ "the printer by inputting Access Code which can be gotten from printer " +#~ "screen." +#~ msgstr "" +#~ "Соединение с принтером [%s] разорвано из-за включения режима «Только " +#~ "LAN». Повторно подключитесь к принтеру, введя код доступа, который можно " +#~ "получить на экране принтера." + +#~ msgid "Please give a score for your favorite Bambu Market model." +#~ msgstr "" +#~ "Пожалуйста, поставьте оценку вашей любимой модели в магазине Bambu Market." + +#~ msgid "Score" +#~ msgstr "Рейтинг" + +#~ msgid "Please heat the nozzle to above 170 degree before loading filament." +#~ msgstr "" +#~ "Пожалуйста, перед загрузкой нити, нагрейте сопло до температуры выше 170 " +#~ "градусов." + +#~ msgid "" +#~ "The bed temperature exceeds filament's vitrification temperature. Please " +#~ "open the front door of printer before printing to avoid nozzle clog." +#~ msgstr "" +#~ "Температура стола превышает температуру стеклования пластиковой нити. " +#~ "Пожалуйста, откройте переднюю дверцу принтера перед печатью, чтобы " +#~ "избежать засорения сопла." + +#~ msgid "The 3mf is not from Bambu Lab, load geometry data only." +#~ msgstr "" +#~ "Этот 3mf создан не в Bambu Lab, поэтому загрузятся только данные " +#~ "геометрии." + +#~ msgid "" +#~ "The 3mf's version %s is newer than %s's version %s, Found following keys " +#~ "unrecognized:" +#~ msgstr "" +#~ "Версия этого формата 3mf (%s) новее текущей версии %s (%s). \n" +#~ "Обнаружены следующие нераспознанные ключи:" + +#~ msgid "You'd better upgrade your software.\n" +#~ msgstr "Рекомендуем вам обновить программу.\n" + +#~ msgid "Newer 3mf version" +#~ msgstr "Новая версия 3mf" + +#, c-format, boost-format +#~ msgid "" +#~ "The 3mf's version %s is newer than %s's version %s, Suggest to upgrade " +#~ "your software." +#~ msgstr "" +#~ "Версия этого формата 3mf (%s) новее текущей версии %s (%s). \n" +#~ "Рекомендуется обновить программу." + +#~ msgid "The 3mf is not compatible, load geometry data only!" +#~ msgstr "Этот 3mf несовместим, поэтому загрузятся только данные геометрии!" + +#~ msgid "Incompatible 3mf" +#~ msgstr "Несовместимый 3mf" + +#~ msgid "Show g-code window" +#~ msgstr "Показать окно G-кода" + +#~ msgid "If enabled, g-code window will be displayed." +#~ msgstr "Если включено, будет отображено окно G-кода." + +#~ msgid "Online Models" +#~ msgstr "Онлайн-модели" + +#~ msgid "Show online staff-picked models on the home page" +#~ msgstr "Показывать отобранные сотрудниками модели на главной странице" + +#~ msgid "Add/Remove printers" +#~ msgstr "Добавить/удалить принтер" + +#~ msgid "" +#~ "Upload task timed out. Please check the network problem and try again" +#~ msgstr "" +#~ "Истекло время ожидания отправки задания. Проверьте сетевое подключение и " +#~ "повторите попытку." + +#~ msgid "Can't connect to the printer" +#~ msgstr "Не удаётся подключиться к принтеру" + +#, c-format, boost-format +#~ msgid "%s is not supported by AMS." +#~ msgstr "%s не поддерживается АСПП." + +#~ msgid "The printer is required to be in the same LAN as Bambu Studio." +#~ msgstr "Принтер должен находиться в одной локальной сети с Bambu Studio." + +#~ msgid "Recommended temperature range" +#~ msgstr "Рекомендуемый диапазон температур" + +#~ msgid "High Temp Plate" +#~ msgstr "Высокотемпературная пластина" + +#~ msgid "" +#~ "Bed temperature when high temperature plate is installed. Value 0 means " +#~ "the filament does not support to print on the High Temp Plate" +#~ msgstr "" +#~ "Температура стола при установленной высокотемпературной печатной " +#~ "пластине. 0 означает, что пластиковая нить не поддерживает печать на этой " +#~ "печатной пластине." + +#~ msgid "Switch between Prepare/Prewview" +#~ msgstr "Переключение между окном подготовки и окном предпросмотра нарезки" + +#~ msgid "" +#~ "Click OK to update the Network plug-in when Bambu Studio launches next " +#~ "time." +#~ msgstr "" +#~ "Нажмите OK, чтобы обновить сетевой плагин при следующем запуске Bambu " +#~ "Studio." + +#~ msgid "New version of Bambu Studio" +#~ msgstr "Доступна новая версия Bambu Studio" + +#~ msgid "Don't remind me of this version again" +#~ msgstr "Больше не напоминай об этой версии" + +#~ msgid "" +#~ "Step 1, please confirm Bambu Studio and your printer are in the same LAN." +#~ msgstr "" +#~ "Шаг 1. Пожалуйста, убедитесь, что Bambu Studio и ваш принтер находятся в " +#~ "одной локальной сети." + +#~ msgid "Error: IP or Access Code are not correct" +#~ msgstr "Ошибка: неверный IP-адрес или код доступа" + +#~ msgid "Internal bridge support thickness" +#~ msgstr "Толщина поддержки внутреннего моста" + +#~ msgid "" +#~ "If enabled, support loops will be generated under the contours of " +#~ "internal bridges.These support loops could prevent internal bridges from " +#~ "extruding over the air and improve the top surface quality, especially " +#~ "when the sparse infill density is low.This value determines the thickness " +#~ "of the support loops. 0 means disable this feature" +#~ msgstr "" +#~ "Если включено, под контурами внутренних мостов будут создаваться петли " +#~ "поддержки. Эти петли поддержки могут препятствовать выдавливанию " +#~ "внутренних мостов в воздух и улучшить качество поверхности сверху, " +#~ "особенно при низкой плотности заполнения. Это значение определяет толщину " +#~ "петель поддержки. Установите 0 для отключения." + +#~ msgid "Order of inner wall/outer wall/infil" +#~ msgstr "Порядок печати периметров/заполнения" + +#~ msgid "Print sequence of inner wall, outer wall and infill. " +#~ msgstr "" +#~ "Последовательность печати внутреннего/внешнего периметров и заполнения. " + +#~ msgid "inner/outer/infill" +#~ msgstr "внутренний/внешний/заполнение" + +#~ msgid "outer/inner/infill" +#~ msgstr "внешний/внутренний/заполнение" + +#~ msgid "infill/inner/outer" +#~ msgstr "заполнение/внутренний/внешний" + +#~ msgid "infill/outer/inner" +#~ msgstr "заполнение/внешний/внутренний" + +#~ msgid "inner-outer-inner/infill" +#~ msgstr "внутренний-внешний-внутренний/заполнение" + +#~ msgid "Temperature of vitrificaiton" +#~ msgstr "Температура стеклования" + +#~ msgid "" +#~ "Material becomes soft at this temperature. Thus the heatbed cannot be " +#~ "hotter than this tempature" +#~ msgstr "" +#~ "При этой температуре материал становится мягким. Таким образом, " +#~ "подогреваемый стол не может быть горячее этой температуры." + +#~ msgid "Density of internal sparse infill, 100% means solid throughout" +#~ msgstr "" +#~ "Плотность внутреннего заполнения, выраженная в процентах. 100% означает " +#~ "сплошное заполнение." + +#~ msgid "" +#~ "Acceleration of initial layer. Using a lower value can improve build " +#~ "plate adhensive" +#~ msgstr "" +#~ "Ускорение на первом слое. Использование более низкого значения может " +#~ "улучшить адгезию к столу." + +#~ msgid "" +#~ "Klipper's max_accel_to_decel will be adjusted to this % of acceleration" +#~ msgstr "" +#~ "Значение Klipper-а max_accel_to_decel (ограничение ускорения зигзагов) " +#~ "будет скорректировано на заданный процент ускорения." + +#~ msgid "" +#~ "Filter out gaps smaller than the threshold specified. This setting won't " +#~ "affect top/bottom layers" +#~ msgstr "" +#~ "Небольшие промежутки меньше указанного порога не будут заполняться. Этот " +#~ "параметр не влияет на верхнюю/нижнюю поверхность." + +#~ msgid "Enable this option if machine has auxiliary part cooling fan" +#~ msgstr "" +#~ "Включите, если в принтере имеет вспомогательный вентилятор для охлаждения " +#~ "моделей." + +#~ msgid "Maximum acceleration for travel (M204 T)" +#~ msgstr "Максимальное ускорение при перемещении (M204 T)" + +#~ msgid "" +#~ "Speed of auxiliary part cooling fan. Auxiliary fan will run at this speed " +#~ "during printing except the first several layers which is defined by no " +#~ "cooling layers" +#~ msgstr "" +#~ "Скорость вращения вспомогательного вентилятора для охлаждения моделей. Он " +#~ "всегда будет работать с этой скоростью, за исключением первых нескольких " +#~ "слоёв, которые обычно настроены на работу без охлаждения." + +#~ msgid "The minimum printing speed when slow down for cooling" +#~ msgstr "" +#~ "Минимальная скорость печати при которой происходит сброс скорости для " +#~ "лучшего охлаждения." + +#~ msgid "" +#~ "Style and shape of the support. For normal support, projecting the " +#~ "supports into a regular grid will create more stable supports (default), " +#~ "while snug support towers will save material and reduce object scarring.\n" +#~ "For tree support, slim style will merge branches more aggressively and " +#~ "save a lot of material (default), while hybrid style will create similar " +#~ "structure to normal support under large flat overhangs." +#~ msgstr "" +#~ "Стиль и форма создаваемой поддержки.\n" +#~ "\n" +#~ "Стиль «Сетка» создаёт более устойчивые опоры. Стиль «Аккуратный» экономит " +#~ "материал и уменьшает образование дефектов на моделях.\n" +#~ "\n" +#~ "Для древовидной поддержки, при стройном стиле происходит более " +#~ "агрессивное объединение ветвей и экономия материала (по умолчанию). В то " +#~ "время как гибридный стиль создаёт структуру, схожую с обычную поддержкой " +#~ "при больших плоских нависаниях." + +#~ msgid "Tree support wall loops" +#~ msgstr "Периметров древовидной поддержки" + +#~ msgid "This setting specify the count of walls around tree support" +#~ msgstr "" +#~ "Этот параметр определяет количество периметров у печатаемой древовидной " +#~ "поддержки." + +#~ msgid "Target chamber temperature" +#~ msgstr "Температура, которую необходимо поддерживать внутри принтера." + +#~ msgid "Bed temperature difference" +#~ msgstr "Разница температур подогреваемого стола" + +#~ msgid "" +#~ "Do not recommend bed temperature of other layer to be lower than initial " +#~ "layer for more than this threshold. Too low bed temperature of other " +#~ "layer may cause the model broken free from build plate" +#~ msgstr "" +#~ "Не рекомендуется, чтобы температура последующих слоёв была ниже " +#~ "температуры первого слоя, более чем на это пороговое значение. Слишком " +#~ "низкая температура последующих слоёв может привести к отрыву модели от " +#~ "стола." + +#, c-format, boost-format +#~ msgid " doesn't work at 100%% density " +#~ msgstr " не работает при 100%% заполнении " + +#~ msgid "Export 3MF" +#~ msgstr "Экспорт в 3MF" + +#~ msgid "Export project as 3MF." +#~ msgstr "Экспортировать проект в 3MF." + +#~ msgid "Export slicing data" +#~ msgstr "Экспорт данных нарезки" + +#~ msgid "Export slicing data to a folder." +#~ msgstr "Экспорт данных нарезки в папку." + +#~ msgid "Load slicing data" +#~ msgstr "Загрузка данных нарезки" + +#~ msgid "Load cached slicing data from directory" +#~ msgstr "Загружать кэшированные данные нарезки из папки" + +#~ msgid "Export STL" +#~ msgstr "Экспорт в STL" + +#~ msgid "Export the objects as multiple STL." +#~ msgstr "Экспорт моделей как несколько STL." + +#~ msgid "Slice" +#~ msgstr "Нарезать" + +#~ msgid "Slice the plates: 0-all plates, i-plate i, others-invalid" +#~ msgstr "Нарезка столов: 0 - все столы, i - стол i, остальные - недопустимы" + +#~ msgid "Show command help." +#~ msgstr "Показать справку по командам." + +#~ msgid "UpToDate" +#~ msgstr "Актуальная версия" + +#~ msgid "Update the configs values of 3mf to latest." +#~ msgstr "Обновить значения конфигурации для 3mf до актуальных." + +#~ msgid "Load default filaments" +#~ msgstr "Загрузка материалов по умолчанию" + +#~ msgid "Load first filament as default for those not loaded" +#~ msgstr "Использовать первый материал по умолчанию, если не загружен другой" + +#~ msgid "mtcpp" +#~ msgstr "mtcpp" + +#~ msgid "max triangle count per plate for slicing." +#~ msgstr "максимальное количество треугольников на стол при нарезке." + +#~ msgid "mstpp" +#~ msgstr "mstpp" + +#~ msgid "max slicing time per plate in seconds." +#~ msgstr "максимальное время нарезки на стол в секундах." + +#~ msgid "Normative check" +#~ msgstr "Нормативная проверка" + +#~ msgid "Check the normative items." +#~ msgstr "Проверка соответствия модели определенным нормативным требованиям." + +#~ msgid "Output Model Info" +#~ msgstr "Информация о выходной модели" + +#~ msgid "Output the model's information." +#~ msgstr "Вывод информации о модели." + +#~ msgid "Export Settings" +#~ msgstr "Экспорт настроек" + +#~ msgid "Export settings to a file." +#~ msgstr "Экспорт настроек в файл." + +#~ msgid "Send progress to pipe" +#~ msgstr "Отправить информацию о прогрессе" + +#~ msgid "Send progress to pipe." +#~ msgstr "Отправить информацию о прогрессе." + +#~ msgid "Arrange Options" +#~ msgstr "Параметры расстановки" + +#~ msgid "Arrange options: 0-disable, 1-enable, others-auto" +#~ msgstr "" +#~ "Параметры расстановки: 0 - отключить, 1 - включить, другие - автоматически" + +# ??? +#~ msgid "Repetions count" +#~ msgstr "Количество повторений" + +# ??? +#~ msgid "Repetions count of the whole model" +#~ msgstr "Количество повторений для всей модели" + +#~ msgid "Convert Unit" +#~ msgstr "Преобразовать единицу измерения" + +#~ msgid "Convert the units of model" +#~ msgstr "Преобразование единиц измерения модели" + +#~ msgid "Orient the model" +#~ msgstr "Ориентация модели" + +#~ msgid "Scale the model by a float factor" +#~ msgstr "Масштабирование модели с помощью коэффициента." + +#~ msgid "Load General Settings" +#~ msgstr "Загрузка общих настроек" + +#~ msgid "Load process/machine settings from the specified file" +#~ msgstr "Загрузка настроек процесса/принтера из указанного файла" + +#~ msgid "Load Filament Settings" +#~ msgstr "Загрузка настроек материала" + +#~ msgid "Load filament settings from the specified file list" +#~ msgstr "Загрузка настроек пластиковой нити из указанного списка файлов" + +#~ msgid "Skip Objects" +#~ msgstr "Исключить модели" + +#~ msgid "Skip some objects in this print" +#~ msgstr "Пропустить некоторые модели в этом печати" + +#~ msgid "load uptodate process/machine settings when using uptodate" +#~ msgstr "" +#~ "Загрузить последние настройки процесса/принтера при использовании " +#~ "актуальной версии" + +#~ msgid "" +#~ "load uptodate process/machine settings from the specified file when using " +#~ "uptodate" +#~ msgstr "" +#~ "Загружать последние настройки процесса/принтера из указанного файла при " +#~ "использовании актуальной версии" + +#~ msgid "Output directory" +#~ msgstr "Папка для сохранения" + +#~ msgid "Output directory for the exported files." +#~ msgstr "Папка для сохранения экспортируемых файлов." + +#~ msgid "Debug level" +#~ msgstr "Уровень отладки" + +#~ msgid "" +#~ "Sets debug logging level. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" +#~ "trace\n" +#~ msgstr "" +#~ "Задаёт параметр чувствительности записи событий в журнал. \\\"0: " +#~ "Неустранимая ошибка, 1: Ошибка, 2: Предупреждение, 3: Информация, 4: " +#~ "Отладка, 5: Трассировка\n" + +#~ msgid "Empty layers around bottom are replaced by nearest normal layers." +#~ msgstr "" +#~ "Пустые слои обнаруженные на дне модели были заменены ближайшими " +#~ "нормальными слоями." + +#~ msgid "The model has too many empty layers." +#~ msgstr "Модель имеет слишком много пустых слоев." + +#, boost-format +#~ msgid "The selected preset: %1% is not found." +#~ msgstr "Выбранный профиль: %1% не найден." + +#~ msgid "Send to print" +#~ msgstr "Отправить на печать" + +#~ msgid "Error Message" +#~ msgstr "Сообщение об ошибке" + +#~ msgid "Error uploading to print host:" +#~ msgstr "Ошибка при отправке на хост печати:" + +#~ msgid "" +#~ "Please input valid values:\n" +#~ "start > 0 step >= 0\n" +#~ "end > start + step)" +#~ msgstr "" +#~ "Введите допустимые значения:\n" +#~ "start > 0 step >= 0\n" +#~ "end > start + step)" + +#~ msgid "" +#~ "Please input valid values:\n" +#~ "start > 10 step >= 0\n" +#~ "end > start + step)" +#~ msgstr "" +#~ "Введите допустимые значения:\n" +#~ "start > 10 step >= 0\n" +#~ "end > start + step)" + +#~ msgid "" +#~ "3D Scene Operations\n" +#~ "Did you know how to control view and object/part selection with mouse and " +#~ "touchpanel in the 3D scene?" +#~ msgstr "" +#~ "Операции с 3D-сценой\n" +#~ "Знаете ли вы, как управлять видом и выбором модели/части с помощью мыши и " +#~ "сенсорной панели в 3D-сцене?" + +#~ msgid "" +#~ "Fix Model\n" +#~ "Did you know that you can fix a corrupted 3D model to avoid a lot of " +#~ "slicing problems?" +#~ msgstr "" +#~ "Починка модели\n" +#~ "Знаете ли вы, что можно починить повреждённую модель, чтобы избежать " +#~ "множества проблем при нарезке?" + +#~ msgid "Left Preset Value" +#~ msgstr "Значение в левом профиле" + +#~ msgid "Right Preset Value" +#~ msgstr "Значение в правом профиле" + +#~ msgid "Undef category" +#~ msgstr "Неопределённая категория" + +#~ msgid "Undef group" +#~ msgstr "Неопределённая группа" + +#~ msgid "Retraction Length (Toolchange)" +#~ msgstr "Длина отката (при смене инструмента)" + +#~ msgid "Flow Dynamic" +#~ msgstr "Динамика потока" + +#~ msgid "A fatal error occurred: %1%" +#~ msgstr "Произошла фатальная ошибка: %1%" + +#~ msgid "Record" +#~ msgstr "Запись" + +#~ msgid "Report issue" +#~ msgstr "Сообщить о проблеме" + +#~ msgid "Connection to OctoPrint/Klipper works correctly." +#~ msgstr "Соединение с OctoPrint/Klipper успешно установлено." + +#~ msgid "Could not connect to OctoPrint/Klipper" +#~ msgstr "Не удаётся подключиться к OctoPrint/Klipper" + +#~ msgid "Connection to FlashAir works correctly." +#~ msgstr "Соединение с FlashAir успешно установлено." + +#~ msgid "Connection refused" +#~ msgstr "Соединение запрещено" + +#~ msgid "Failed to connect to %s port %ld: %s" +#~ msgstr "Не удалось подключиться к порту %s %ld: %s" + +#~ msgid "Couldn't connect to server" +#~ msgstr "Не удалось подключиться к серверу" + +#~ msgid "Couldn't resolve host '%s'" +#~ msgstr "Не удаётся определить имя хоста '%s'" + +#~ msgid "Suggestion" +#~ msgstr "Совет" + +#~ msgid "" +#~ "BambuSource has not correctly been registered for media playing! Press " +#~ "Yes to re-register it." +#~ msgstr "" +#~ "Компонент BambuSource неправильно зарегистрирован для воспроизведения " +#~ "мультимедиа! Нажмите «Да», чтобы перерегистрировать его." + +#~ msgid "" +#~ "Missing BambuSource component registered for media playing! Please re-" +#~ "install BambuStutio or seek after-sales help." +#~ msgstr "" +#~ "Отсутствует компонент BambuSource, зарегистрированный для воспроизведения " +#~ "мультимедиа! Пожалуйста, переустановите BambuStutio или обратитесь в " +#~ "поддержку." + +#~ msgid "Wipe tower - Purging volume adjustment" +#~ msgstr "Черновая башня - регулировка объёма сброса пластика" + +#~ msgid "" +#~ "Here you can adjust required purging volume (mm³) for any given pair of " +#~ "tools." +#~ msgstr "" +#~ "Здесь вы можете отрегулировать требуемый объём очистки (мм³) для любой " +#~ "пары инструментов." + +#~ msgid "Extruder changed to" +#~ msgstr "Экструдер перешёл на - " + +#~ msgid "Tool #" +#~ msgstr "Инструмент #" + +#~ msgid "" +#~ "Total purging volume is calculated by summing two values below, depending " +#~ "on which tools are loaded/unloaded." +#~ msgstr "" +#~ "Общий объём прочистки вычисляется путём суммирования двух нижеуказанных " +#~ "значений, в зависимости от того, какие инструменты предзагружены/" +#~ "выгружены." + +#~ msgid "Volume to purge (mm³) when the filament is being" +#~ msgstr "Объём прочистки (мм³) при выдавливании прутка" + +#~ msgid "Volumetric speed" +#~ msgstr "Объёмная скорость потока" + +#~ msgid "Branch Diameter" +#~ msgstr "Диаметр ветвей" + +#~ msgid "" +#~ "The diameter of the thinnest branches of organic support. Thicker " +#~ "branches are more sturdy. Branches towards the base will be thicker than " +#~ "this." +#~ msgstr "" +#~ "Диаметр самых тонких ветвей органической поддержки. Чем толще ветви, тем " +#~ "они крепче. Ветви, идущие к основанию, будут утолщаться." + +#~ msgid "Branch Distance" +#~ msgstr "Расстояние между ветками" + +#~ msgid "" +#~ "How far apart the branches need to be when they touch the model. Making " +#~ "this distance small will cause the tree support to touch the model at " +#~ "more points, causing better overhang but making support harder to remove." +#~ msgstr "" +#~ "Указывает, насколько далеко друг от друга должны располагаться ветви при " +#~ "касании модели. Если задать небольшое расстояние, то увеличится " +#~ "количество точек, в которых древовидная поддержка касается модели. Это " +#~ "улучшит печать нависаний, но при этом усложнит удаление поддержки." + +#~ msgid "" +#~ "When print by object, machines with I3 structure will not generate " +#~ "timelapse videos." +#~ msgstr "" +#~ "При печати по очереди, принтеры с кинематикой I3 не будут писать таймлапс." + +#~ msgid "" +#~ "Extrude perimeters that have a part over an overhang in the reverse " +#~ "direction on odd layers. This alternating pattern can drastically improve " +#~ "steep overhang." +#~ msgstr "" +#~ "Печать периметров, имеющих нависания, в обратном направлении на нечётных " +#~ "слоях. Такое чередование может значительно улучшить качество печати " +#~ "крутых нависаний." + +#, c-format, boost-format +#~ msgid "%%" +#~ msgstr "%%" + +#~ msgid "Rotate around X" +#~ msgstr "Поворот вокруг оси X" + +#~ msgid "Rotation angle around the X axis in degrees." +#~ msgstr "Угол поворота вокруг оси X в градусах." + +#~ msgid "" +#~ "When need to print with the printer door opened\n" +#~ "Opening the printer door can reduce the probability of extruder/hotend " +#~ "clogging when printing lower temperature filament with a higher enclosure " +#~ "temperature. More info about this in the Wiki." +#~ msgstr "" +#~ "Когда необходимо печатать с открытой дверцей принтера?\n" +#~ "При печати низкотемпературным материалом при более высокой температуре в " +#~ "камере, открытие дверцы принтера снижает вероятность засорения экструдера/" +#~ "хотэнда. Более подробную информацию читайте на вики-сайте." + +#~ msgid "invalid value" +#~ msgstr "недопустимое значение" + +#~ msgid "MB uploaded" +#~ msgstr "МБ загружено" diff --git a/localization/i18n/sv/OrcaSlicer_sv.po b/localization/i18n/sv/OrcaSlicer_sv.po index 59cd97d4bf..907d840e14 100644 --- a/localization/i18n/sv/OrcaSlicer_sv.po +++ b/localization/i18n/sv/OrcaSlicer_sv.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-24 18:09+0100\n" +"POT-Creation-Date: 2023-12-19 22:09+0800\n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -291,6 +291,12 @@ msgstr "Välj alla kontakter" msgid "Cut" msgstr "Beskär" +msgid "non-mainifold edges be caused by cut tool, do you want to fix it now?" +msgstr "" + +msgid "Repairing model object" +msgstr "Reparerar modell objektet" + msgid "Connector" msgstr "Kontakt" @@ -841,6 +847,24 @@ msgstr "Lägg till support blockerare" msgid "Add support enforcer" msgstr "Lägg till support förstärkning" +msgid "Add text" +msgstr "" + +msgid "Add negative text" +msgstr "" + +msgid "Add text modifier" +msgstr "" + +msgid "Add SVG part" +msgstr "" + +msgid "Add negative SVG" +msgstr "" + +msgid "Add SVG modifier" +msgstr "" + msgid "Select settings" msgstr "Välj inställningar" @@ -856,9 +880,6 @@ msgstr "Del" msgid "Delete the selected object" msgstr "Radera det valda objektet" -msgid "Edit Text" -msgstr "Redigera text" - msgid "Load..." msgstr "Ladda..." @@ -883,6 +904,12 @@ msgstr "Cylinder" msgid "Cone" msgstr "Kon" +msgid "Text" +msgstr "" + +msgid "SVG" +msgstr "" + msgid "Height range Modifier" msgstr "Modifierare av höjd intervall" @@ -1017,6 +1044,18 @@ msgstr "Spegelvänd" msgid "Mirror object" msgstr "Spegelvänd objektet" +msgid "Edit text" +msgstr "" + +msgid "Ability to change text, font, size, ..." +msgstr "" + +msgid "Edit SVG" +msgstr "" + +msgid "Change SVG source file, projection, size, ..." +msgstr "" + msgid "Invalidate cut info" msgstr "Ogiltig förklara delnings info" @@ -1170,9 +1209,6 @@ msgstr "Klicka på ikonen för att redigera färgläggningen av objektet" msgid "Click the icon to shift this object to the bed" msgstr "Klicka på ikonen för att flytta detta föremål till byggplattan" -msgid " search results" -msgstr "" - msgid "Loading file" msgstr "Laddar fil" @@ -1321,9 +1357,6 @@ msgstr "Skriv in nytt namn" msgid "Renaming" msgstr "Byter namn" -msgid "Repairing model object" -msgstr "Reparerar modell objektet" - msgid "Following model object has been repaired" msgid_plural "Following model objects have been repaired" msgstr[0] "" @@ -1656,12 +1689,6 @@ msgstr "" msgid "Arranging..." msgstr "Placerar..." -msgid "" -"Arrange failed. Found some exceptions when processing object geometries." -msgstr "" -"Placering misslyckades. Avvikelser hittades när objektets geometri " -"bearbetades." - msgid "Arranging" msgstr "Placerar" @@ -1677,6 +1704,12 @@ msgstr "" msgid "Arranging done." msgstr "Placering klar." +msgid "" +"Arrange failed. Found some exceptions when processing object geometries." +msgstr "" +"Placering misslyckades. Avvikelser hittades när objektets geometri " +"bearbetades." + #, c-format, boost-format msgid "" "Arrangement ignored the following objects which can't fit into a single " @@ -1706,8 +1739,11 @@ msgstr "Placerar..." msgid "Orienting" msgstr "Placerar" -msgid "Filling bed " -msgstr "Fyllning av byggytan" +msgid "Orienting canceled." +msgstr "" + +msgid "Filling" +msgstr "" msgid "Bed filling canceled." msgstr "Byggplattans fyllning avbruten." @@ -1715,11 +1751,14 @@ msgstr "Byggplattans fyllning avbruten." msgid "Bed filling done." msgstr "Byggplattans fyllning utförd." -msgid "Error! Unable to create thread!" -msgstr "Fel! Det går inte att skapa tråden!" +msgid "Searching for optimal orientation" +msgstr "" -msgid "Exception" -msgstr "Undantag" +msgid "Orientation search canceled." +msgstr "" + +msgid "Orientation found." +msgstr "" msgid "Logging in" msgstr "Loggar in" @@ -1792,11 +1831,6 @@ msgstr "Skicka utskriftsjobb via molntjänst" msgid "Print task sending times out." msgstr "" -msgid "" -"The printer timed out while receiving a print job. Please check if the " -"network is functioning properly and send the print again." -msgstr "" - msgid "Service Unavailable" msgstr "Tjänsten är inte tillgänglig" @@ -1831,30 +1865,6 @@ msgstr "Framgångsrikt skickat. Stäng den aktuella sidan i %s s" msgid "An SD card needs to be inserted before sending to printer." msgstr "Ett Micro SD-kort måste sättas i innan det skickas till skrivaren." -msgid "Choose SLA archive:" -msgstr "Välj SLA arkiv:" - -msgid "Import file" -msgstr "Importera fil" - -msgid "Import model and profile" -msgstr "Importera modell och profil" - -msgid "Import profile only" -msgstr "Importera endast profil" - -msgid "Import model only" -msgstr "Importera endast modell" - -msgid "Accurate" -msgstr "Exakt" - -msgid "Balanced" -msgstr "Balanserad" - -msgid "Quick" -msgstr "Snabb" - msgid "Importing SLA archive" msgstr "Importera SLA arkiv" @@ -2589,19 +2599,6 @@ msgstr "" "JA - Behåll Prime Torn\n" "NEJ - Behåll Oberoende Lagerhöjd på support" -#, boost-format -msgid "%1% infill pattern doesn't support 100%% density." -msgstr "%1% ifyllnads mönster stöds ej 100%% densitet." - -msgid "" -"Switch to rectilinear pattern?\n" -"Yes - switch to rectilinear pattern automaticlly\n" -"No - reset density to default non 100% value automaticlly" -msgstr "" -"Byta till rätlinjigt mönster?\n" -"Ja - Växla automatiskt till rätlinjigt mönster\n" -"Nej - Återställ automatiskt densiteten till standardvärdet som inte är 100 %." - msgid "" "While printing by Object, the extruder may collide skirt.\n" "Thus, reset the skirt layer to 1 to avoid that." @@ -2702,6 +2699,18 @@ msgstr "" msgid "Motor noise showoff" msgstr "" +msgid "Nozzle filament covered detected pause" +msgstr "" + +msgid "Cutter error pause" +msgstr "" + +msgid "First layer error pause" +msgstr "" + +msgid "Nozzle clog pause" +msgstr "" + msgid "MC" msgstr "MC" @@ -3164,7 +3173,7 @@ msgstr "Volym:" msgid "Size:" msgstr "Storlek:" -#, boost-format +#, c-format, boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -3540,6 +3549,18 @@ msgstr "Använd Perspektiv Vy" msgid "Use Orthogonal View" msgstr "Använd Ortogonal Vy" +msgid "Show &G-code Window" +msgstr "" + +msgid "Show g-code window in Previce scene" +msgstr "" + +msgid "Reset Window Layout" +msgstr "" + +msgid "Reset to default window layout" +msgstr "" + msgid "Show &Labels" msgstr "Visa & Etiketter" @@ -3911,6 +3932,9 @@ msgstr "Laddar ner %d%%..." msgid "Connection lost. Please retry." msgstr "" +msgid "The device cannot handle more conversations. Please retry later." +msgstr "" + msgid "File not exists." msgstr "" @@ -4066,8 +4090,10 @@ msgstr "Lager: %s" msgid "Layer: %d/%d" msgstr "Lager: %d/%d" -msgid "Please heat the nozzle to above 170 degree before loading filament." -msgstr "Värm nozzeln till över 170 grader innan du laddar filamentet." +msgid "" +"Please heat the nozzle to above 170 degree before loading or unloading " +"filament." +msgstr "" msgid "Still unload" msgstr "Matar ut fortfarande" @@ -4415,7 +4441,7 @@ msgstr "Automatisk återhämtning vid stegförlust" msgid "Allow Prompt Sound" msgstr "" -msgid "Fliament Tangle Detect" +msgid "Filament Tangle Detect" msgstr "" msgid "Global" @@ -4595,6 +4621,12 @@ msgid "" "It is recommended to change to smooth mode." msgstr "" +msgid "Expand sidebar" +msgstr "" + +msgid "Collapse sidebar" +msgstr "" + #, c-format, boost-format msgid "Loading file: %s" msgstr "Laddar fil: %s" @@ -4611,31 +4643,6 @@ msgstr "Konfigurationen kan inte laddas." msgid "The 3mf is generated by old Orca Slicer, load geometry data only." msgstr "" -#, c-format, boost-format -msgid "This slicer file version %s is newer than %s's version:" -msgstr "" - -msgid "" -"Would you like to update your Bambu Studio software to enable all " -"functionality in this slicer file?\n" -msgstr "" - -msgid "Newer 3mf version" -msgstr "Nyare 3mf version" - -msgid "" -"you can always update Bambu Studio at your convenience. The slicer file will " -"now be loaded without full functionality." -msgstr "" - -#, c-format, boost-format -msgid "" -"This slicer file version %s is newer than %s's version.\n" -"\n" -"Would you like to update your Bambu Studio software to enable all " -"functionality in this slicer file?" -msgstr "" - msgid "Invalid values found in the 3mf:" msgstr "Ogiltiga värden hittades i 3mf:" @@ -4871,6 +4878,9 @@ msgid "" "import it." msgstr "" +msgid "Import SLA archive" +msgstr "" + msgid "The selected file" msgstr "Den valda filen" @@ -4952,6 +4962,15 @@ msgstr "" "Det går inte att utföra booleska operationer på modell mesh. Endast positiva " "delar kommer att exporteras." +msgid "" +"Are you sure you want to store original SVGs with their local paths into the " +"3MF file?\n" +"If you hit 'NO', all SVGs in the project will not be editable any more." +msgstr "" + +msgid "Private protection" +msgstr "" + msgid "Is the printer ready? Is the print sheet in place, empty and clean?" msgstr "" @@ -4974,6 +4993,9 @@ msgstr "Skicka till skrivare" msgid "Custom supports and color painting were removed before repairing." msgstr "Custom support och färgläggning raderades innan reparation." +msgid "Optimize Rotation" +msgstr "" + msgid "Invalid number" msgstr "Ogiltligt nummer" @@ -5134,12 +5156,6 @@ msgstr "Visa \"Dagens tips\" efter start" msgid "If enabled, useful hints are displayed at startup." msgstr "Om aktiverad visas användbara tips vid start." -msgid "Show g-code window" -msgstr "" - -msgid "If enabled, g-code window will be displayed." -msgstr "" - msgid "Flushing volumes: Auto-calculate everytime the color changed." msgstr "" @@ -5434,7 +5450,7 @@ msgstr "Spara %s som" msgid "User Preset" msgstr "Användar förinställning" -msgid "Project Inside Preset" +msgid "Preset Inside Project" msgstr "Projekt förinställning" msgid "Name is invalid;" @@ -5511,6 +5527,9 @@ msgstr "Uppgift avbruten" msgid "(LAN)" msgstr "(LAN)" +msgid "Search" +msgstr "" + msgid "My Device" msgstr "Min Enhet" @@ -5541,16 +5560,16 @@ msgstr "Bambu Cool Plate" msgid "PLA Plate" msgstr "PLA platta" -msgid "Bamabu Engineering Plate" +msgid "Bambu Engineering Plate" msgstr "Bambu Engineering Plate" -msgid "Bamabu Smooth PEI Plate" +msgid "Bambu Smooth PEI Plate" msgstr "" msgid "High temperature Plate" msgstr "" -msgid "Bamabu Textured PEI Plate" +msgid "Bambu Textured PEI Plate" msgstr "" msgid "Send print job to" @@ -5775,6 +5794,12 @@ msgstr "Skrivaren måste finnas på samma LAN som Orca Slicer." msgid "The printer does not support sending to printer SD card." msgstr "Skrivaren har inte stöd för att skicka till skrivarens MicroSD kort." +msgid "Slice ok." +msgstr "Beredning klar." + +msgid "View all Daily tips" +msgstr "" + msgid "Failed to create socket" msgstr "Det gick inte att skapa uttaget" @@ -5964,11 +5989,25 @@ msgstr "" "0 top z-avstånd, 0 gränssnittsavstånd, koncentriskt mönster och inaktivera " "oberoende stödskiktshöjd" +msgid "" +"Layer height exceeds the limit in Printer Settings -> Extruder -> Layer " +"height limits ,this may cause printing quality issues." +msgstr "" + +msgid "Adjust to the set range automatically? \n" +msgstr "" + +msgid "Adjust" +msgstr "" + +msgid "Ignore" +msgstr "" + msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" "När du spelar in timelapse utan verktygshuvud rekommenderas att du lägger " "till ett \"Timelapse Wipe Tower\".\n" @@ -5987,6 +6026,15 @@ msgstr "Precision" msgid "Wall generator" msgstr "Vägg generator" +msgid "Walls and surfaces" +msgstr "" + +msgid "Bridging" +msgstr "" + +msgid "Overhangs" +msgstr "" + msgid "Walls" msgstr "Väggar" @@ -6332,6 +6380,12 @@ msgstr[1] "" "Följande förinställning raderas också.@Följande förinställningar raderas " "också." +msgid "" +"Are you sure to delete the selected preset? \n" +"If the preset corresponds to a filament currently in use on your printer, " +"please reset the filament information for that slot." +msgstr "" + #, boost-format msgid "Are you sure to %1% the selected preset?" msgstr "Välja %1% den valda förinställningen?" @@ -6360,7 +6414,7 @@ msgstr "Oidentifierad" msgid "Unsaved Changes" msgstr "Ej sparade ändringar" -msgid "Discard or Keep changes" +msgid "Transfer or discard changes" msgstr "Överge eller Behåll ändringar" msgid "Old Value" @@ -6574,19 +6628,15 @@ msgstr "" msgid "Ramming line spacing" msgstr "" -msgid "Auto-Calc" -msgstr "Autoberäkna" - -msgid "Re-calculate" +msgid "Recalculate" msgstr "" msgid "Flushing volumes for filament change" msgstr "Rensnings volym för filament byte" msgid "" -"Studio would re-calculate your flushing volumes everytime the filaments " -"color changed. You could disable the auto-calculate in Bambu Studio > " -"Preferences" +"Orca recalculates your flushing volumes everytime the filament colors " +"change. You can change this behavior in Preferences." msgstr "" msgid "Flushing volume (mm³) for each filament pair." @@ -6603,15 +6653,6 @@ msgstr "Multiplikatorn ska ligga inom intervallet [%.2f, %.2f]." msgid "Multiplier" msgstr "Multiplikator" -msgid "unloaded" -msgstr "utmatad" - -msgid "loaded" -msgstr "laddad" - -msgid "Filament #" -msgstr "Filament #" - msgid "From" msgstr "Från" @@ -6977,6 +7018,9 @@ msgstr "Utskrift pågår" msgid "Idle" msgstr "Inaktiv" +msgid "Beta version" +msgstr "" + msgid "Latest version" msgstr "Senaste version" @@ -7338,6 +7382,25 @@ msgstr "" msgid "Variable layer height is not supported with Organic supports." msgstr "" +msgid "" +"Different nozzle diameters and different filament diameters is not allowed " +"when prime tower is enabled." +msgstr "" + +msgid "" +"The Wipe Tower is currently only supported with the relative extruder " +"addressing (use_relative_e_distances=1)." +msgstr "" + +msgid "" +"Ooze prevention is currently not supported with the prime tower enabled." +msgstr "" + +msgid "" +"The prime tower is currently only supported for the Marlin, RepRap/Sprinter, " +"RepRapFirmware and Repetier G-code flavors." +msgstr "" + msgid "The prime tower is not supported in \"By object\" print." msgstr "Ett Prime Torn stöds inte i \"Per objekt\" utskrift." @@ -7405,11 +7468,6 @@ msgstr "" msgid "Layer height cannot exceed nozzle diameter" msgstr "Lagerhöjden kan inte överstiga nozzel diametern" -msgid "" -"Layer height cannot exceed the limit in Printer Settings -> Extruder -> " -"Layer height limits" -msgstr "" - msgid "" "Relative extruder addressing requires resetting the extruder position at " "each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to " @@ -7499,6 +7557,12 @@ msgstr "Utskriftsbar höjd" msgid "Maximum printable height which is limited by mechanism of printer" msgstr "Maximala utskriftshöjd begränsas av skrivarens mekanism" +msgid "Preferred orientation" +msgstr "" + +msgid "Automatically orient stls on the Z-axis upon initial import" +msgstr "" + msgid "Printer preset names" msgstr "Namn på förinställda skrivare" @@ -7769,7 +7833,7 @@ msgstr "" msgid "Density of external bridges. 100% means solid bridge. Default is 100%." msgstr "" -msgid "Bridge flow" +msgid "Bridge flow ratio" msgstr "Bridge/Brygg flöde" msgid "" @@ -7779,6 +7843,15 @@ msgstr "" "Minska detta värde något (tex 0.9) för att minska material åtgång för " "bridges/bryggor, detta för att förbättra kvaliteten" +msgid "Internal bridge flow ratio" +msgstr "" + +msgid "" +"This value governs the thickness of the internal bridge layer. This is the " +"first layer over sparse infill. Decrease this value slightly (for example " +"0.9) to improve surface quality over sparse infill." +msgstr "" + msgid "Top surface flow ratio" msgstr "" @@ -8013,9 +8086,9 @@ msgid "" "quality for needle and small details" msgstr "" "Aktivera detta val för att sänka utskifts hastigheten för att göra den sista " -"lager tiden inte kortare än lager tidströskeln \"Max fläkthastighets " -"tröskel\", detta så att lager kan kylas under en längre tid. Detta kan " -"förbättra kylnings kvaliteten för små detaljer" +"lager tiden inte kortare än lager tidströskeln \"Max fläkthastighets tröskel" +"\", detta så att lager kan kylas under en längre tid. Detta kan förbättra " +"kylnings kvaliteten för små detaljer" msgid "Normal printing" msgstr "Normal utskrift" @@ -8092,6 +8165,15 @@ msgstr "" "sträckor men kan se sämre ut. Om de är inaktiverade ser bridges bättre ut " "men är tillförlitliga endast för kortare avstånd." +msgid "Thick internal bridges" +msgstr "" + +msgid "" +"If enabled, thick internal bridges will be used. It's usually recommended to " +"have this feature turned on. However, consider turning it off if you are " +"using large nozzles." +msgstr "" + msgid "Max bridge length" msgstr "Max bridge/brygg längd" @@ -8171,7 +8253,7 @@ msgid "Internal solid infill pattern" msgstr "" msgid "" -"Line pattern of internal solid infill. if the detect nattow internal solid " +"Line pattern of internal solid infill. if the detect narrow internal solid " "infill be enabled, the concentric pattern will be used for the small area." msgstr "" @@ -8204,25 +8286,55 @@ msgid "" "This sets the threshold for small perimeter length. Default threshold is 0mm" msgstr "" -msgid "Order of walls" +msgid "Walls printing order" msgstr "" -msgid "Print sequence of inner wall and outer wall. " +msgid "" +"Print sequence of the internal (inner) and external (outer) walls. \n" +"\n" +"Use Inner/Outer for best overhangs. This is because the overhanging walls " +"can adhere to a neighouring perimeter while printing. However, this option " +"results in slightly reduced surface quality as the external perimeter is " +"deformed by being squashed to the internal perimeter.\n" +"\n" +"Use Inner/Outer/Inner for the best external surface finish and dimensional " +"accuracy as the external wall is printed undisturbed from an internal " +"perimeter. However, overhang performance will reduce as there is no internal " +"perimeter to print the external wall against. This option requires a minimum " +"of 3 walls to be effective as it prints the internal walls from the 3rd " +"perimeter onwards first, then the external perimeter and, finally, the first " +"internal perimeter. This option is recomended against the Outer/Inner option " +"in most cases. \n" +"\n" +"Use Outer/Inner for the same external wall quality and dimensional accuracy " +"benefits of Inner/Outer/Inner option. However, the z seams will appear less " +"consistent as the first extrusion of a new layer starts on a visible " +"surface.\n" +"\n" +" " msgstr "" -msgid "inner/outer" +msgid "Inner/Outer" msgstr "" -msgid "outer/inner" +msgid "Outer/Inner" msgstr "" -msgid "inner wall/outer wall/inner wall" +msgid "Inner/Outer/Inner" msgstr "" msgid "Print infill first" msgstr "" -msgid "Order of wall/infill. false means print wall first. " +msgid "" +"Order of wall/infill. When the tickbox is unchecked the walls are printed " +"first, which works best in most cases.\n" +"\n" +"Printing walls first may help with extreme overhangs as the walls have the " +"neighbouring infill to adhere to. However, the infill will slighly push out " +"the printed walls where it is attached to them, resulting in a worse " +"external surface finish. It can also cause the infill to shine through the " +"external surfaces of the part." msgstr "" msgid "Height to rod" @@ -8563,10 +8675,11 @@ msgstr "" msgid "Sparse infill density" msgstr "Sparsam ifyllnads densitet" -#, c-format -msgid "Density of internal sparse infill, 100% means solid throughout" +#, c-format, boost-format +msgid "" +"Density of internal sparse infill, 100% turns all sparse infill into solid " +"infill and internal solid infill pattern will be used" msgstr "" -"Densiteten av ifyllnad. 100%% betyder att objektet blir solid rakt igenom" msgid "Sparse infill pattern" msgstr "Sparsam ifyllnads mönster" @@ -8770,10 +8883,10 @@ msgstr "Full fläkthastighet vid lager" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " -"than \"close_fan_the_first_x_layers\", in which case the fan will be running " -"at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower than " +"\"close_fan_the_first_x_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." msgstr "" msgid "Support interface fan speed" @@ -8826,6 +8939,12 @@ msgstr "" "Den genomsnittliga distansen mellan de slumpmässiga punkter som införts på " "varje linjesegment" +msgid "Apply fuzzy skin to first layer" +msgstr "" + +msgid "Whether to apply fuzzy skin on the first layer" +msgstr "" + msgid "Filter out tiny gaps" msgstr "" @@ -9456,13 +9575,13 @@ msgstr "Filnamns format" msgid "User can self-define the project file name when export" msgstr "Användaren kan bestämma projekt namn när den ska exporteras" -msgid "Make overhang printable" +msgid "Make overhangs printable" msgstr "" msgid "Modify the geometry to print overhangs without support material." msgstr "" -msgid "Make overhang printable maximum angle" +msgid "Make overhangs printable - Maximum angle" msgstr "" msgid "" @@ -9471,7 +9590,7 @@ msgid "" "0 will replace all overhangs with conical material." msgstr "" -msgid "Make overhang printable hole area" +msgid "Make overhangs printable - Hole area" msgstr "" msgid "" @@ -9718,6 +9837,9 @@ msgstr "" msgid "Show auto-calibration marks" msgstr "" +msgid "Disable set remaining print time" +msgstr "" + msgid "Seam position" msgstr "Söm position" @@ -9843,6 +9965,22 @@ msgstr "" "konturen och förvandlar en solid modell till en enkelväggig utskrift med " "solida bottenlager. Den slutgiltligt genererade modellen har ingen söm" +msgid "Smooth Spiral" +msgstr "" + +msgid "" +"Smooth Spiral smoothes out X and Y moves as wellresulting in no visible seam " +"at all, even in the XY directions on walls that are not vertical" +msgstr "" + +msgid "Max XY Smoothing" +msgstr "" + +msgid "" +"Maximum distance to move points in XY to try to achieve a smooth spiralIf " +"expressed as a %, it will be computed over nozzle diameter" +msgstr "" + msgid "" "If smooth or traditional mode is selected, a timelapse video will be " "generated for each print. After each layer is printed, a snapshot is taken " @@ -10048,10 +10186,11 @@ msgstr "" "Filament för att skriva ut support och rafts. ”Standard” betyder ingen " "specifik filament för support, och nuvarande filament används" -msgid "No interface filament for body" +msgid "Avoid interface filament for base" msgstr "" -msgid "Don't use support interface filament to print support body" +msgid "" +"Avoid using support interface filament to print support base if possible." msgstr "" msgid "" @@ -10297,11 +10436,11 @@ msgid "" "double walls." msgstr "" -msgid "Tree support wall loops" -msgstr "Tree support vägg varv" +msgid "Support wall loops" +msgstr "" -msgid "This setting specify the count of walls around tree support" -msgstr "Inställningen bestämmer antal väggar runt tree support" +msgid "This setting specify the count of walls around support" +msgstr "" msgid "Tree support with infill" msgstr "Tree support med ifyllnad" @@ -10415,10 +10554,16 @@ msgid "Wipe Distance" msgstr "Avskrapnings avstånd" msgid "" -"Discribe how long the nozzle will move along the last path when retracting" +"Discribe how long the nozzle will move along the last path when " +"retracting. \n" +"\n" +"Depending on how long the wipe operation lasts, how fast and long the " +"extruder/filament retraction settings are, a retraction move may be needed " +"to retract the remaining filament. \n" +"\n" +"Setting a value in the retract amount before wipe setting below will perform " +"any excess retraction before the wipe, else it will be performed after." msgstr "" -"Detta beskriver hur länge nozzeln kommer att röra sig längs den sista banan " -"medan den retrakterar" msgid "" "The wiping tower can be used to clean up the residue on the nozzle and " @@ -10735,10 +10880,6 @@ msgstr "" msgid "invalid value " msgstr "ogiltigt värde " -#, c-format, boost-format -msgid " doesn't work at 100%% density " -msgstr " fungerar inte vid 100%% densitet " - msgid "Invalid value when spiral vase mode is enabled: " msgstr "Ogiltigt värde när spiralvas läget är aktiverat: " @@ -11592,6 +11733,720 @@ msgstr "" msgid "Delete input" msgstr "" +msgid "Network Test" +msgstr "" + +msgid "Start Test Multi-Thread" +msgstr "" + +msgid "Start Test Single-Thread" +msgstr "" + +msgid "Export Log" +msgstr "" + +msgid "Studio Version:" +msgstr "" + +msgid "System Version:" +msgstr "" + +msgid "DNS Server:" +msgstr "" + +msgid "Test BambuLab" +msgstr "" + +msgid "Test BambuLab:" +msgstr "" + +msgid "Test Bing.com" +msgstr "" + +msgid "Test bing.com:" +msgstr "" + +msgid "Test HTTP" +msgstr "" + +msgid "Test HTTP Service:" +msgstr "" + +msgid "Test storage" +msgstr "" + +msgid "Test Storage Upload:" +msgstr "" + +msgid "Test storage upgrade" +msgstr "" + +msgid "Test Storage Upgrade:" +msgstr "" + +msgid "Test storage download" +msgstr "" + +msgid "Test Storage Download:" +msgstr "" + +msgid "Test plugin download" +msgstr "" + +msgid "Test Plugin Download:" +msgstr "" + +msgid "Test Storage Upload" +msgstr "" + +msgid "Log Info" +msgstr "" + +msgid "Select filament preset" +msgstr "" + +msgid "Create Filament" +msgstr "" + +msgid "Create Based on Current Filament" +msgstr "" + +msgid "Copy Current Filament Preset " +msgstr "" + +msgid "Basic Information" +msgstr "" + +msgid "Add Filament Preset under this filament" +msgstr "" + +msgid "We could create the filament presets for your following printer:" +msgstr "" + +msgid "Select Vendor" +msgstr "" + +msgid "Input Custom Vendor" +msgstr "" + +msgid "Can't find vendor I want" +msgstr "" + +msgid "Select Type" +msgstr "" + +msgid "Select Filament Preset" +msgstr "" + +msgid "Serial" +msgstr "" + +msgid "e.g. Basic, Matte, Silk, Marble" +msgstr "" + +msgid "Filament Preset" +msgstr "" + +msgid "Create" +msgstr "" + +msgid "Vendor is not selected, please reselect vendor." +msgstr "" + +msgid "Custom vendor is not input, please input custom vendor." +msgstr "" + +msgid "" +"\"Bambu\" or \"Generic\" can not be used as a Vendor for custom filaments." +msgstr "" + +msgid "Filament type is not selected, please reselect type." +msgstr "" + +msgid "Filament serial is not inputed, please input serial." +msgstr "" + +msgid "" +"There may be escape characters in the vendor or serial input of filament. " +"Please delete and re-enter." +msgstr "" + +msgid "All inputs in the custom vendor or serial are spaces. Please re-enter." +msgstr "" + +msgid "The vendor can not be a number. Please re-enter." +msgstr "" + +msgid "" +"You have not selected a printer or preset yet. Please select at least one." +msgstr "" + +msgid "Some existing presets have failed to be created, as follows:\n" +msgstr "" + +msgid "" +"\n" +"Do you want to rewrite it?" +msgstr "" + +msgid "" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" +"To add preset for more prinetrs, Please go to printer selection" +msgstr "" + +msgid "Create Printer/Nozzle" +msgstr "" + +msgid "Create Printer" +msgstr "" + +msgid "Create Nozzle for Existing Printer" +msgstr "" + +msgid "Create from Template" +msgstr "" + +msgid "Create Based on Current Printer" +msgstr "" + +msgid "wiki" +msgstr "" + +msgid "Import Preset" +msgstr "" + +msgid "Create Type" +msgstr "" + +msgid "The model is not fond, place reselect vendor." +msgstr "" + +msgid "Select Model" +msgstr "" + +msgid "Select Printer" +msgstr "" + +msgid "Input Custom Model" +msgstr "" + +msgid "Can't find my printer model" +msgstr "" + +msgid "Rectangle" +msgstr "" + +msgid "Printable Space" +msgstr "" + +msgid "X" +msgstr "" + +msgid "Y" +msgstr "" + +msgid "Hot Bed STL" +msgstr "" + +msgid "Load stl" +msgstr "" + +msgid "Hot Bed SVG" +msgstr "" + +msgid "Load svg" +msgstr "" + +msgid "Max Print Height" +msgstr "" + +#, c-format, boost-format +msgid "The file exceeds %d MB, please import again." +msgstr "" + +msgid "Exception in obtaining file size, please import again." +msgstr "" + +msgid "Preset path is not find, please reselect vendor." +msgstr "" + +msgid "The printer model was not found, please reselect." +msgstr "" + +msgid "The nozzle diameter is not fond, place reselect." +msgstr "" + +msgid "The printer preset is not fond, place reselect." +msgstr "" + +msgid "Printer Preset" +msgstr "" + +msgid "Filament Preset Template" +msgstr "" + +msgid "Deselect All" +msgstr "" + +msgid "Process Preset Template" +msgstr "" + +msgid "Back Page 1" +msgstr "" + +msgid "" +"You have not yet chosen which printer preset to create based on. Please " +"choose the vendor and model of the printer" +msgstr "" + +msgid "" +"You have entered an illegal input in the printable area section on the first " +"page. Please check before creating it." +msgstr "" + +msgid "The custom printer or model is not inputed, place input." +msgstr "" + +msgid "" +"The printer preset you created already has a preset with the same name. Do " +"you want to overwrite it?\n" +"\tYes: Overwrite the printer preset with the same name, and filament and " +"process presets with the same preset name will be recreated \n" +"and filament and process presets without the same preset name will be " +"reserve.\n" +"\tCancel: Do not create a preset, return to the creation interface." +msgstr "" + +msgid "You need to select at least one filament preset." +msgstr "" + +msgid "You need to select at least one process preset." +msgstr "" + +msgid "Create filament presets failed. As follows:\n" +msgstr "" + +msgid "Create process presets failed. As follows:\n" +msgstr "" + +msgid "Vendor is not find, please reselect." +msgstr "" + +msgid "Current vendor has no models, please reselect." +msgstr "" + +msgid "" +"You have not selected the vendor and model or inputed the custom vendor and " +"model." +msgstr "" + +msgid "" +"There may be escape characters in the custom printer vendor or model. Please " +"delete and re-enter." +msgstr "" + +msgid "" +"All inputs in the custom printer vendor or model are spaces. Please re-enter." +msgstr "" + +msgid "Please check bed printable shape and origin input." +msgstr "" + +msgid "" +"You have not yet selected the printer to replace the nozzle, please choose." +msgstr "" + +msgid "Create Printer Successful" +msgstr "" + +msgid "Create Filament Successful" +msgstr "" + +msgid "Printer Created" +msgstr "" + +msgid "Please go to printer settings to edit your presets" +msgstr "" + +msgid "Filament Created" +msgstr "" + +msgid "" +"Please go to filament setting to edit your presets if you need.\n" +"Please note that nozzle temperature, hot bed temperature, and maximum " +"volumetric speed have a significant impact on printing quality. Please set " +"them carefully." +msgstr "" + +msgid "Printer Setting" +msgstr "" + +msgid "Export Configs" +msgstr "" + +msgid "Printer config bundle(.bbscfg)" +msgstr "" + +msgid "Filament bundle(.bbsflmt)" +msgstr "" + +msgid "Printer presets(.zip)" +msgstr "" + +msgid "Filament presets(.zip)" +msgstr "" + +msgid "Process presets(.zip)" +msgstr "" + +msgid "initialize fail" +msgstr "" + +msgid "add file fail" +msgstr "" + +msgid "add bundle structure file fail" +msgstr "" + +msgid "finalize fail" +msgstr "" + +msgid "open zip written fail" +msgstr "" + +msgid "Export successful" +msgstr "" + +#, c-format, boost-format +msgid "" +"The '%s' folder already exists in the current directory. Do you want to " +"clear it and rebuild it.\n" +"If not, a time suffix will be added, and you can modify the name after " +"creation." +msgstr "" + +msgid "" +"Printer and all the filament&process presets that belongs to the printer. \n" +"Can be shared with others." +msgstr "" + +msgid "" +"User's fillment preset set. \n" +"Can be shared with others." +msgstr "" + +msgid "" +"Only display printer names with changes to printer, filament, and process " +"presets." +msgstr "" + +msgid "Only display the filament names with changes to filament presets." +msgstr "" + +msgid "" +"Only printer names with user printer presets will be displayed, and each " +"preset you choose will be exported as a zip." +msgstr "" + +msgid "" +"Only the filament names with user filament presets will be displayed, \n" +"and all user filament presets in each filament name you select will be " +"exported as a zip." +msgstr "" + +msgid "" +"Only printer names with changed process presets will be displayed, \n" +"and all user process presets in each printer name you select will be " +"exported as a zip." +msgstr "" + +msgid "Please select at least one printer or filament." +msgstr "" + +msgid "Please select a type you want to export" +msgstr "" + +msgid "Edit Filament" +msgstr "" + +msgid "Filament presets under this filament" +msgstr "" + +msgid "" +"Note: If the only preset under this filament is deleted, the filament will " +"be deleted after exiting the dialog." +msgstr "" + +msgid "Presets inherited by other presets can not be deleted" +msgstr "" + +msgid "The following presets inherits this preset." +msgid_plural "The following preset inherits this preset." +msgstr[0] "" +msgstr[1] "" + +msgid "Delete Preset" +msgstr "" + +msgid "Are you sure to delete the selected preset?" +msgstr "" + +msgid "Delete preset" +msgstr "" + +msgid "+ Add Preset" +msgstr "" + +msgid "Delete Filament" +msgstr "" + +msgid "" +"All the filament presets belong to this filament would be deleted. \n" +"If you are using this filament on your printer, please reset the filament " +"information for that slot." +msgstr "" + +msgid "Delete filament" +msgstr "" + +msgid "Add Preset" +msgstr "" + +msgid "Add preset for new printer" +msgstr "" + +msgid "Copy preset from filament" +msgstr "" + +msgid "The filament choice not find filament preset, please reselect it" +msgstr "" + +msgid "Edit Preset" +msgstr "" + +msgid "For more information, please check out Wiki" +msgstr "" + +msgid "Collapse" +msgstr "" + +msgid "Daily Tips" +msgstr "" + +msgid "Need select printer" +msgstr "" + +msgid "The start, end or step is not valid value." +msgstr "" + +msgid "" +"Unable to calibrate: maybe because the set calibration value range is too " +"large, or the step is too small" +msgstr "" + +msgid "Physical Printer" +msgstr "" + +msgid "Print Host upload" +msgstr "" + +msgid "Could not get a valid Printer Host reference" +msgstr "" + +msgid "Success!" +msgstr "" + +msgid "Refresh Printers" +msgstr "" + +msgid "" +"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" +"signed certificate." +msgstr "" + +msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" +msgstr "" + +msgid "Open CA certificate file" +msgstr "" + +#, c-format, boost-format +msgid "" +"On this system, %s uses HTTPS certificates from the system Certificate Store " +"or Keychain." +msgstr "" + +msgid "" +"To use a custom CA file, please import your CA file into Certificate Store / " +"Keychain." +msgstr "" + +msgid "Connection to printers connected via the print host failed." +msgstr "" + +#, c-format, boost-format +msgid "Mismatched type of print host: %s" +msgstr "" + +msgid "Connection to AstroBox works correctly." +msgstr "" + +msgid "Could not connect to AstroBox" +msgstr "" + +msgid "Note: AstroBox version at least 1.1.0 is required." +msgstr "" + +msgid "Connection to Duet works correctly." +msgstr "" + +msgid "Could not connect to Duet" +msgstr "" + +msgid "Unknown error occured" +msgstr "" + +msgid "Wrong password" +msgstr "" + +msgid "Could not get resources to create a new connection" +msgstr "" + +msgid "Upload not enabled on FlashAir card." +msgstr "" + +msgid "Connection to FlashAir works correctly and upload is enabled." +msgstr "" + +msgid "Could not connect to FlashAir" +msgstr "" + +msgid "" +"Note: FlashAir with firmware 2.00.02 or newer and activated upload function " +"is required." +msgstr "" + +msgid "Connection to MKS works correctly." +msgstr "" + +msgid "Could not connect to MKS" +msgstr "" + +msgid "Connection to OctoPrint works correctly." +msgstr "" + +msgid "Could not connect to OctoPrint" +msgstr "" + +msgid "Note: OctoPrint version at least 1.1.0 is required." +msgstr "" + +msgid "Connection to Prusa SL1 / SL1S works correctly." +msgstr "" + +msgid "Could not connect to Prusa SLA" +msgstr "" + +msgid "Connection to PrusaLink works correctly." +msgstr "" + +msgid "Could not connect to PrusaLink" +msgstr "" + +msgid "Storages found" +msgstr "" + +#. TRN %1% = storage path +#, boost-format +msgid "%1% : read only" +msgstr "" + +#. TRN %1% = storage path +#, boost-format +msgid "%1% : no free space" +msgstr "" + +#. TRN %1% = host +#, boost-format +msgid "Upload has failed. There is no suitable storage found at %1%." +msgstr "" + +msgid "Connection to Prusa Connect works correctly." +msgstr "" + +msgid "Could not connect to Prusa Connect" +msgstr "" + +msgid "Connection to Repetier works correctly." +msgstr "" + +msgid "Could not connect to Repetier" +msgstr "" + +msgid "Note: Repetier version at least 0.90.0 is required." +msgstr "" + +#, boost-format +msgid "" +"HTTP status: %1%\n" +"Message body: \"%2%\"" +msgstr "" + +#, boost-format +msgid "" +"Parsing of host response failed.\n" +"Message body: \"%1%\"\n" +"Error: \"%2%\"" +msgstr "" + +#, boost-format +msgid "" +"Enumeration of host printers failed.\n" +"Message body: \"%1%\"\n" +"Error: \"%2%\"" +msgstr "" + +#: resources/data/hints.ini: [hint:Precise wall] +msgid "" +"Precise wall\n" +"Did you know that turning on precise wall can improve precision and layer " +"consistency?" +msgstr "" + +#: resources/data/hints.ini: [hint:Sandwich mode] +msgid "" +"Sandwich mode\n" +"Did you know that you can use sandwich mode (inner-outer-inner) to improve " +"precision and layer consistency if your model doesn't have very steep " +"overhangs?" +msgstr "" + +#: resources/data/hints.ini: [hint:Chamber temperature] +msgid "" +"Chamber temperature\n" +"Did you know that OrcaSlicer supports chamber temperature?" +msgstr "" + +#: resources/data/hints.ini: [hint:Calibration] +msgid "" +"Calibration\n" +"Did you know that calibrating your printer can do wonders? Check out our " +"beloved calibration solution in OrcaSlicer." +msgstr "" + +#: resources/data/hints.ini: [hint:Auxiliary fan] +msgid "" +"Auxiliary fan\n" +"Did you know that OrcaSlicer supports Auxiliary part cooling fan?" +msgstr "" + +#: resources/data/hints.ini: [hint:Air filtration] +msgid "" +"Air filtration/Exhuast Fan\n" +"Did you know that OrcaSlicer can support Air filtration/Exhuast Fan?" +msgstr "" + #: resources/data/hints.ini: [hint:How to use keyboard shortcuts] msgid "" "How to use keyboard shortcuts\n" @@ -11675,13 +12530,8 @@ msgstr "" msgid "" "Simplify Model\n" "Did you know that you can reduce the number of triangles in a mesh using the " -"Simplify mesh feature? Right-click the model and select Simplify model. Read " -"more in the documentation." +"Simplify mesh feature? Right-click the model and select Simplify model." msgstr "" -"Förenkla modellen\n" -"Visste du att du kan minska antalet trianglar i ett mesh med hjälp av " -"funktionen Förenkla mesh? Högerklicka på modellen och välj Förenkla " -"modellen. Läs mer i dokumentationen." #: resources/data/hints.ini: [hint:Slicing Parameter Table] msgid "" @@ -11708,7 +12558,7 @@ msgid "" "Subtract a Part\n" "Did you know that you can subtract one mesh from another using the Negative " "part modifier? That way you can, for example, create easily resizable holes " -"directly in Orca Slicer. Read more in the documentation." +"directly in Orca Slicer." msgstr "" #: resources/data/hints.ini: [hint:STEP] @@ -11868,6 +12718,106 @@ msgid "" "probability of warping." msgstr "" +#~ msgid "Edit Text" +#~ msgstr "Redigera text" + +#~ msgid "Error! Unable to create thread!" +#~ msgstr "Fel! Det går inte att skapa tråden!" + +#~ msgid "Exception" +#~ msgstr "Undantag" + +#~ msgid "Choose SLA archive:" +#~ msgstr "Välj SLA arkiv:" + +#~ msgid "Import file" +#~ msgstr "Importera fil" + +#~ msgid "Import model and profile" +#~ msgstr "Importera modell och profil" + +#~ msgid "Import profile only" +#~ msgstr "Importera endast profil" + +#~ msgid "Import model only" +#~ msgstr "Importera endast modell" + +#~ msgid "Accurate" +#~ msgstr "Exakt" + +#~ msgid "Balanced" +#~ msgstr "Balanserad" + +#~ msgid "Quick" +#~ msgstr "Snabb" + +#~ msgid "Auto-Calc" +#~ msgstr "Autoberäkna" + +#~ msgid "unloaded" +#~ msgstr "utmatad" + +#~ msgid "loaded" +#~ msgstr "laddad" + +#~ msgid "Filament #" +#~ msgstr "Filament #" + +#~ msgid "" +#~ "Discribe how long the nozzle will move along the last path when retracting" +#~ msgstr "" +#~ "Detta beskriver hur länge nozzeln kommer att röra sig längs den sista " +#~ "banan medan den retrakterar" + +#~ msgid "" +#~ "Simplify Model\n" +#~ "Did you know that you can reduce the number of triangles in a mesh using " +#~ "the Simplify mesh feature? Right-click the model and select Simplify " +#~ "model. Read more in the documentation." +#~ msgstr "" +#~ "Förenkla modellen\n" +#~ "Visste du att du kan minska antalet trianglar i ett mesh med hjälp av " +#~ "funktionen Förenkla mesh? Högerklicka på modellen och välj Förenkla " +#~ "modellen. Läs mer i dokumentationen." + +#~ msgid "Filling bed " +#~ msgstr "Fyllning av byggytan" + +#, boost-format +#~ msgid "%1% infill pattern doesn't support 100%% density." +#~ msgstr "%1% ifyllnads mönster stöds ej 100%% densitet." + +#~ msgid "" +#~ "Switch to rectilinear pattern?\n" +#~ "Yes - switch to rectilinear pattern automaticlly\n" +#~ "No - reset density to default non 100% value automaticlly" +#~ msgstr "" +#~ "Byta till rätlinjigt mönster?\n" +#~ "Ja - Växla automatiskt till rätlinjigt mönster\n" +#~ "Nej - Återställ automatiskt densiteten till standardvärdet som inte är " +#~ "100 %." + +#~ msgid "Please heat the nozzle to above 170 degree before loading filament." +#~ msgstr "Värm nozzeln till över 170 grader innan du laddar filamentet." + +#~ msgid "Newer 3mf version" +#~ msgstr "Nyare 3mf version" + +#, c-format +#~ msgid "Density of internal sparse infill, 100% means solid throughout" +#~ msgstr "" +#~ "Densiteten av ifyllnad. 100%% betyder att objektet blir solid rakt igenom" + +#~ msgid "Tree support wall loops" +#~ msgstr "Tree support vägg varv" + +#~ msgid "This setting specify the count of walls around tree support" +#~ msgstr "Inställningen bestämmer antal väggar runt tree support" + +#, c-format, boost-format +#~ msgid " doesn't work at 100%% density " +#~ msgstr " fungerar inte vid 100%% densitet " + #~ msgid "Ctrl + Shift + Enter" #~ msgstr "Ctrl + Shift + Enter" @@ -11889,9 +12839,6 @@ msgstr "" #~ msgid "Export all objects as STL" #~ msgstr "Exportera Alla Objekt som STL" -#~ msgid "Slice ok." -#~ msgstr "Beredning klar." - #, c-format, boost-format #~ msgid "" #~ "The 3mf's version %s is newer than %s's version %s, Found following keys " @@ -12183,7 +13130,7 @@ msgstr "" #~ msgid "Score" #~ msgstr "Resultat" -#~ msgid "Bamabu High Temperature Plate" +#~ msgid "Bambu High Temperature Plate" #~ msgstr "Bambu High Temperature Plate" #~ msgid "Can't connect to the printer" diff --git a/localization/i18n/tr/OrcaSlicer_tr.po b/localization/i18n/tr/OrcaSlicer_tr.po index b1d9ae3ee9..df8b05e8b5 100644 --- a/localization/i18n/tr/OrcaSlicer_tr.po +++ b/localization/i18n/tr/OrcaSlicer_tr.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: OrcaSlicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-24 18:09+0100\n" -"PO-Revision-Date: 2023-11-15 00:35+0300\n" +"POT-Creation-Date: 2023-12-19 22:09+0800\n" +"PO-Revision-Date: 2023-12-19 22:15+0300\n" "Last-Translator: Olcay ÖREN\n" "Language-Team: Türkçe\n" "Language: tr_TR\n" @@ -108,7 +108,7 @@ msgid "Support Generated" msgstr "Destek Oluşturuldu" msgid "Gizmo-Place on Face" -msgstr "" +msgstr "Gizmo-Yüzeye yerleştir" msgid "Lay on face" msgstr "Yüzüstü yatır" @@ -158,7 +158,7 @@ msgid "Height range" msgstr "Yükseklik aralığı" msgid "Alt + Shift + Enter" -msgstr "" +msgstr "Alt + Shift + Enter" msgid "Toggle Wireframe" msgstr "Wireframe Göster/Gizle" @@ -189,13 +189,13 @@ msgid "Move" msgstr "Taşı" msgid "Gizmo-Move" -msgstr "" +msgstr "Gizmo-Taşı" msgid "Rotate" msgstr "Döndür" msgid "Gizmo-Rotate" -msgstr "" +msgstr "Gizmo-Döndür" msgid "Optimize orientation" msgstr "Yönü optimize edin" @@ -207,7 +207,7 @@ msgid "Scale" msgstr "Ölçeklendir" msgid "Gizmo-Scale" -msgstr "" +msgstr "Gizmo-Ölçeklendir" msgid "Error: Please close all toolbar menus first" msgstr "Hata: Lütfen önce tüm araç çubuğu menülerini kapatın" @@ -299,6 +299,12 @@ msgstr "Tüm bağlayıcıları seç" msgid "Cut" msgstr "Kes" +msgid "non-mainifold edges be caused by cut tool, do you want to fix it now?" +msgstr "" + +msgid "Repairing model object" +msgstr "Model nesnesini onarma" + msgid "Connector" msgstr "Bağlayıcı" @@ -507,13 +513,13 @@ msgid "Remove selection" msgstr "Seçimi kaldır" msgid "Entering Seam painting" -msgstr "" +msgstr "Dikiş boyamaya girişi" msgid "Leaving Seam painting" -msgstr "" +msgstr "Dikiş boyamasından çık" msgid "Paint-on seam editing" -msgstr "" +msgstr "Boyalı dikiş düzenleme" msgid "Font" msgstr "Yazı tipi" @@ -737,7 +743,7 @@ msgid "" msgstr "" msgid "Sync user presets" -msgstr "" +msgstr "Kullanıcı ön ayarlarını senkronize edin" msgid "Loading" msgstr "Yükleniyor" @@ -831,7 +837,7 @@ msgid "Ironing" msgstr "Ütüleme" msgid "Fuzzy Skin" -msgstr "Bulanık Kaplama" +msgstr "Bulanık kaplama" msgid "Extruders" msgstr "Ekstruderler" @@ -863,6 +869,24 @@ msgstr "Destek engelleyici ekle" msgid "Add support enforcer" msgstr "Destek uygulayıcısı ekle" +msgid "Add text" +msgstr "Yazı ekle" + +msgid "Add negative text" +msgstr "Negatif metin ekle" + +msgid "Add text modifier" +msgstr "Metin değiştirici ekle" + +msgid "Add SVG part" +msgstr "SVG parça ekle" + +msgid "Add negative SVG" +msgstr "Negatif SVG ekle" + +msgid "Add SVG modifier" +msgstr "SVG değiştirici ekle" + msgid "Select settings" msgstr "Ayarları şeç" @@ -878,9 +902,6 @@ msgstr "Sil" msgid "Delete the selected object" msgstr "Seçilen nesneyi sil" -msgid "Edit Text" -msgstr "Metni düzenle" - msgid "Load..." msgstr "Yükle..." @@ -905,6 +926,12 @@ msgstr "Silindir" msgid "Cone" msgstr "Koni" +msgid "Text" +msgstr "Metin" + +msgid "SVG" +msgstr "SVG" + msgid "Height range Modifier" msgstr "Yükseklik aralığı Değiştirici" @@ -933,10 +960,10 @@ msgid "Fix model" msgstr "Modeli düzelt" msgid "Export as one STL" -msgstr "" +msgstr "STL olarak dışa aktar" msgid "Export as STLs" -msgstr "" +msgstr "STLs olarak dışa aktar" msgid "Reload from disk" msgstr "Diskten yeniden yükle" @@ -1038,6 +1065,18 @@ msgstr "Ayna" msgid "Mirror object" msgstr "Nesneyi aynala" +msgid "Edit text" +msgstr "Metni düzenle" + +msgid "Ability to change text, font, size, ..." +msgstr "Metni, yazı tipini, boyutunu değiştirme yeteneği ..." + +msgid "Edit SVG" +msgstr "SVG'yi düzenle" + +msgid "Change SVG source file, projection, size, ..." +msgstr "SVG kaynak dosyasını, projeksiyonunu, boyutunu değiştirin ..." + msgid "Invalidate cut info" msgstr "Kesim bilgisini geçersiz kıl" @@ -1191,9 +1230,6 @@ msgstr "Nesnenin renk resmini düzenlemek için simgeye tıklayın" msgid "Click the icon to shift this object to the bed" msgstr "Bu nesneyi yatağa taşımak için simgeye tıklayın" -msgid " search results" -msgstr "" - msgid "Loading file" msgstr "Dosya yükleniyor" @@ -1339,9 +1375,6 @@ msgstr "Yeni adı girin" msgid "Renaming" msgstr "Yeniden adlandırma" -msgid "Repairing model object" -msgstr "Model nesnesini onarma" - msgid "Following model object has been repaired" msgid_plural "Following model objects have been repaired" msgstr[0] "Aşağıdaki model nesnesi onarıldı" @@ -1387,7 +1420,7 @@ msgid " " msgstr " " msgid "Layer height" -msgstr "Katman yüksekliği" +msgstr "Katman Yüksekliği" msgid "Wall loops" msgstr "Duvar döngüleri" @@ -1456,7 +1489,7 @@ msgid "Pause" msgstr "Duraklat" msgid "Template" -msgstr "" +msgstr "Şablon" msgid "Custom" msgstr "Özel" @@ -1670,12 +1703,6 @@ msgstr "" msgid "Arranging..." msgstr "Hizalanıyor..." -msgid "" -"Arrange failed. Found some exceptions when processing object geometries." -msgstr "" -"Hizalama başarısız oldu. Nesne geometrilerini işlerken bazı istisnalar " -"bulundu." - msgid "Arranging" msgstr "Hizalanıyor" @@ -1691,6 +1718,12 @@ msgstr "" msgid "Arranging done." msgstr "Hizalama tamamlandı." +msgid "" +"Arrange failed. Found some exceptions when processing object geometries." +msgstr "" +"Hizalama başarısız oldu. Nesne geometrilerini işlerken bazı istisnalar " +"bulundu." + #, c-format, boost-format msgid "" "Arrangement ignored the following objects which can't fit into a single " @@ -1720,8 +1753,11 @@ msgstr "Yönlendiriliyor..." msgid "Orienting" msgstr "Yönlendiriliyor" -msgid "Filling bed " -msgstr "Yatak doldurma " +msgid "Orienting canceled." +msgstr "Yönlendirme iptal edildi." + +msgid "Filling" +msgstr "Dolduruluyor" msgid "Bed filling canceled." msgstr "Yatak dolumu iptal edildi." @@ -1729,11 +1765,14 @@ msgstr "Yatak dolumu iptal edildi." msgid "Bed filling done." msgstr "Yatak doldurma işlemi tamamlandı." -msgid "Error! Unable to create thread!" -msgstr "Hata! Konu oluşturulamıyor!" +msgid "Searching for optimal orientation" +msgstr "Optimum yönelimi arama" -msgid "Exception" -msgstr "Hata" +msgid "Orientation search canceled." +msgstr "Yön araması iptal edildi." + +msgid "Orientation found." +msgstr "Yön bulundu." msgid "Logging in" msgstr "Giriş Yapılıyor" @@ -1805,12 +1844,7 @@ msgid "Sending print job through cloud service" msgstr "Yazdırma işini bulut hizmeti aracılığıyla gönderme" msgid "Print task sending times out." -msgstr "" - -msgid "" -"The printer timed out while receiving a print job. Please check if the " -"network is functioning properly and send the print again." -msgstr "" +msgstr "Yazdırma görevi gönderimi zaman aşımına uğradı." msgid "Service Unavailable" msgstr "Hizmet kullanılamıyor" @@ -1846,30 +1880,6 @@ msgstr "Başarıyla gönderildi. %s s'de mevcut sayfayı kapat" msgid "An SD card needs to be inserted before sending to printer." msgstr "Yazıcıya göndermeden önce bir SD kartın takılması gerekir." -msgid "Choose SLA archive:" -msgstr "SLA arşivini seçin:" - -msgid "Import file" -msgstr "Dosyayı içe aktar" - -msgid "Import model and profile" -msgstr "Modeli ve profili içe aktar" - -msgid "Import profile only" -msgstr "Yalnızca profili içe aktar" - -msgid "Import model only" -msgstr "Yalnızca modeli içe aktar" - -msgid "Accurate" -msgstr "Doğru" - -msgid "Balanced" -msgstr "Dengeli" - -msgid "Quick" -msgstr "Hızlı" - msgid "Importing SLA archive" msgstr "SLA arşivi içe aktarılıyor" @@ -2041,10 +2051,10 @@ msgid "You need to select the material type and color first." msgstr "Önce malzeme türünü ve rengini seçmeniz gerekir." msgid "Please input a valid value (K in 0~0.3)" -msgstr "" +msgstr "Lütfen geçerli bir değer girin (K in 0~0.3)" msgid "Please input a valid value (K in 0~0.3, N in 0.6~2.0)" -msgstr "" +msgstr "Lütfen geçerli bir değer girin (K in 0~0.3, N in 0.6~2.0)" msgid "Other Color" msgstr "Diğer renk" @@ -2480,7 +2490,7 @@ msgid "" "Please make sure whether to use the temperature to print.\n" "\n" msgstr "" -"Sıcaklık önerilen aralığın dışında olduğunda nozül tıkanmış olabilir.\n" +"Sıcaklık önerilen aralığın dışında olduğunda nozul tıkanmış olabilir.\n" "Lütfen yazdırmak için sıcaklığı kullanıp kullanmayacağınızdan emin olun.\n" "\n" @@ -2618,19 +2628,6 @@ msgstr "" "EVET - Prime Tower'ı Koruyun\n" "HAYIR - Bağımsız Destek Katmanı Yüksekliğini Koruyun" -#, boost-format -msgid "%1% infill pattern doesn't support 100%% density." -msgstr "%1% dolgu deseni 100%% yoğunluğu desteklemiyor." - -msgid "" -"Switch to rectilinear pattern?\n" -"Yes - switch to rectilinear pattern automaticlly\n" -"No - reset density to default non 100% value automaticlly" -msgstr "" -"Doğrusal desene geçilsin mi?\n" -"Evet - otomatik olarak doğrusal desene geçin\n" -"Hayır - yoğunluğu otomatik olarak %100 olmayan varsayılan değere sıfırlayın" - msgid "" "While printing by Object, the extruder may collide skirt.\n" "Thus, reset the skirt layer to 1 to avoid that." @@ -2696,7 +2693,7 @@ msgid "Calibrating extrusion flow" msgstr "Ekstrüzyon akışını kalibre et" msgid "Paused due to nozzle temperature malfunction" -msgstr "Nozül sıcaklığı arızası nedeniyle duraklatıldı" +msgstr "Nozul sıcaklığı arızası nedeniyle duraklatıldı" msgid "Paused due to heat bed temperature malfunction" msgstr "Isı yatağı sıcaklık arızası nedeniyle duraklatıldı" @@ -2731,6 +2728,18 @@ msgstr "Kullanıcı tarafından eklenen Gcode tarafından duraklatıldı" msgid "Motor noise showoff" msgstr "Motor gürültü gösterimi" +msgid "Nozzle filament covered detected pause" +msgstr "Nozul filament ile kaplı algılandı duraklatılıyor" + +msgid "Cutter error pause" +msgstr "Kesici hatası duraklatılıyor" + +msgid "First layer error pause" +msgstr "İlk katman hatası duraklatılıyor" + +msgid "Nozzle clog pause" +msgstr "Nozul tıkanıklığı duraklatılıyor" + msgid "MC" msgstr "MC" @@ -2937,7 +2946,7 @@ msgid "Total" msgstr "Toplam" msgid "Tower" -msgstr "" +msgstr "Kule" msgid "Total Estimation" msgstr "Toplam Tahmini" @@ -3033,10 +3042,10 @@ msgid "Print settings" msgstr "Yazdırma ayarları" msgid "Custom g-code" -msgstr "" +msgstr "Özel g-code" msgid "ToolChange" -msgstr "" +msgstr "Araç Değiştirme" msgid "Time Estimation" msgstr "Zaman Tahmini" @@ -3206,7 +3215,7 @@ msgstr "Hacim:" msgid "Size:" msgstr "Boyut:" -#, boost-format +#, c-format, boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -3493,10 +3502,10 @@ msgid "Import" msgstr "İçe aktar" msgid "Export all objects as one STL" -msgstr "" +msgstr "Tüm nesneleri STL olarak dışa aktarın" msgid "Export all objects as STLs" -msgstr "" +msgstr "Tüm nesneleri STLs olarak dışa aktarın" msgid "Export Generic 3MF" msgstr "Genel 3MF olarak dışa aktar" @@ -3585,6 +3594,18 @@ msgstr "Perspektif Görünüm" msgid "Use Orthogonal View" msgstr "Ortogonal Görünüm" +msgid "Show &G-code Window" +msgstr "&G-code Penceresini Göster" + +msgid "Show g-code window in Previce scene" +msgstr "Previce sahnesinde G-kodu penceresini göster" + +msgid "Reset Window Layout" +msgstr "Pencere Düzenini Sıfırla" + +msgid "Reset to default window layout" +msgstr "Varsayılan pencere düzenine sıfırla" + msgid "Show &Labels" msgstr "Etiketleri Göster" @@ -3964,13 +3985,17 @@ msgid "Downloading %d%%..." msgstr "%d%% indiriliyor..." msgid "Connection lost. Please retry." +msgstr "Bağlantı koptu. Lütfen tekrar deneyiniz." + +msgid "The device cannot handle more conversations. Please retry later." msgstr "" +"Cihaz daha fazla konuşmayı yönetemiyor. Lütfen daha sonra tekrar deneyin." msgid "File not exists." -msgstr "" +msgstr "Dosya mevcut değil." msgid "File checksum error. Please retry." -msgstr "" +msgstr "Dosya kontrol hatası. Lütfen tekrar deneyin." msgid "Not supported on the current printer version." msgstr "Geçerli yazıcı sürümünde desteklenmiyor." @@ -3980,7 +4005,7 @@ msgstr "Depolama alanı kullanılamıyor, SD kartı takın." #, c-format, boost-format msgid "Error code: %d" -msgstr "" +msgstr "Hata kodu: %d" msgid "Speed:" msgstr "Hız:" @@ -4125,8 +4150,12 @@ msgstr "Katman: %s" msgid "Layer: %d/%d" msgstr "Katman: %d/%d" -msgid "Please heat the nozzle to above 170 degree before loading filament." -msgstr "Filamenti yüklemeden önce lütfen Nozulu 170 derecenin üzerine ısıtın." +msgid "" +"Please heat the nozzle to above 170 degree before loading or unloading " +"filament." +msgstr "" +"Filamenti yüklemeden veya boşaltmadan önce lütfen nozulu 170 derecenin " +"üzerine ısıtın." msgid "Still unload" msgstr "Daha Fazla Boşalt" @@ -4332,10 +4361,10 @@ msgid "Details" msgstr "Detaylar" msgid "New printer config available." -msgstr "" +msgstr "Yeni yazıcı yapılandırması mevcut." msgid "Wiki" -msgstr "Viki" +msgstr "Wiki" msgid "Undo integration failed." msgstr "Entegrasyon geri alınamadı." @@ -4490,8 +4519,8 @@ msgstr "Adım kaybından otomatik kurtarma" msgid "Allow Prompt Sound" msgstr "Uyarı Sesine İzin Ver" -msgid "Fliament Tangle Detect" -msgstr "" +msgid "Filament Tangle Detect" +msgstr "Filament Dolaşma Tespiti" msgid "Global" msgstr "Genel" @@ -4509,10 +4538,10 @@ msgid "View all object's settings" msgstr "Nesnenin tüm ayarları" msgid "Filament settings" -msgstr "Filament ayarları" +msgstr "Filament Ayarları" msgid "Printer settings" -msgstr "Yazıcı ayarları" +msgstr "Yazıcı Ayarları" msgid "Remove current plate (if not last one)" msgstr "Mevcut tablayı kaldırın (eğer sonuncusu değilse)" @@ -4588,7 +4617,7 @@ msgid "Set filaments to use" msgstr "Kullanılacak filamentleri ayarla" msgid "Search plate, object and part." -msgstr "" +msgstr "Arama plakası, nesne ve parça." msgid "" "No AMS filaments. Please select a printer in 'Device' page to load AMS info." @@ -4668,8 +4697,8 @@ msgid "" "filament, otherwise, the nozzle will be attrited or damaged." msgstr "" "Filamentin gerektirdiği nozul sertliği, yazıcının varsayılan nozul " -"sertliğinden daha yüksektir. Lütfen sertleşmiş nozülü veya filamenti " -"değiştirin, aksi takdirde nozül aşınır veya hasar görür." +"sertliğinden daha yüksektir. Lütfen sertleşmiş nozulu veya filamenti " +"değiştirin, aksi takdirde nozul aşınır veya hasar görür." msgid "" "Enabling traditional timelapse photography may cause surface imperfections. " @@ -4678,6 +4707,12 @@ msgstr "" "Geleneksel timelapse etkinleştirilmesi yüzey kusurlarına neden olabilir. " "Yumuşak moda geçilmesi önerilir." +msgid "Expand sidebar" +msgstr "Kenar çubuğunu genişlet" + +msgid "Collapse sidebar" +msgstr "Kenar çubuğunu daralt" + #, c-format, boost-format msgid "Loading file: %s" msgstr "Dosya yükleniyor: %s" @@ -4698,31 +4733,6 @@ msgstr "" "3mf, eski Orca Slicer tarafından oluşturulmuştur, yalnızca geometri " "verilerini yükleyin." -#, c-format, boost-format -msgid "This slicer file version %s is newer than %s's version:" -msgstr "" - -msgid "" -"Would you like to update your Bambu Studio software to enable all " -"functionality in this slicer file?\n" -msgstr "" - -msgid "Newer 3mf version" -msgstr "Daha yeni 3mf sürümü" - -msgid "" -"you can always update Bambu Studio at your convenience. The slicer file will " -"now be loaded without full functionality." -msgstr "" - -#, c-format, boost-format -msgid "" -"This slicer file version %s is newer than %s's version.\n" -"\n" -"Would you like to update your Bambu Studio software to enable all " -"functionality in this slicer file?" -msgstr "" - msgid "Invalid values found in the 3mf:" msgstr "3mf'de geçersiz değerler bulundu:" @@ -4731,25 +4741,31 @@ msgstr "Lütfen bunları parametre sekmelerinde düzeltin" msgid "The 3mf has following modified G-codes in filament or printer presets:" msgstr "" +"3mf dosyasında filament veya yazıcı ön ayarlarında şu değiştirilmiş G-" +"kodları bulunmaktadır:" msgid "" "Please confirm that these modified G-codes are safe to prevent any damage to " "the machine!" msgstr "" +"Lütfen bu değiştirilmiş G-kodlarının makineye herhangi bir zarar vermemesi " +"için güvenli olduğunu onaylayın!" msgid "Modified G-codes" -msgstr "" +msgstr "G-kodları Değişti" msgid "The 3mf has following customized filament or printer presets:" -msgstr "" +msgstr "3mf dosyasında şu özel filament veya yazıcı ayarları bulunmaktadır:" msgid "" "Please confirm that the G-codes within these presets are safe to prevent any " "damage to the machine!" msgstr "" +"Lütfen bu ön ayarlar içindeki G-kodlarının makineye herhangi bir zararı " +"önlemek için güvenli olduğunu onaylayın!" msgid "Customized Preset" -msgstr "" +msgstr "Özel Ayar" msgid "Name of components inside step file is not UTF8 format!" msgstr "Adım dosyasındaki bileşenlerin adı UTF8 formatında değil!" @@ -4827,9 +4843,11 @@ msgid "" "The file %s already exists\n" "Do you want to replace it?" msgstr "" +"%s dosyası zaten mevcut\n" +"değiştirmek istiyor musun?" msgid "Comfirm Save As" -msgstr "" +msgstr "Farklı Kaydetmeyi Onayla" msgid "Delete object which is a part of cut object" msgstr "Kesilen nesnenin bir parçası olan nesneyi silin" @@ -4956,6 +4974,9 @@ msgstr "" "Orca Slicer'ya aktarma başarısız oldu. Lütfen dosyayı indirin ve manuel " "olarak İçe aktarın." +msgid "Import SLA archive" +msgstr "SLA arşivini içe aktar" + msgid "The selected file" msgstr "Seçili dosya" @@ -5039,6 +5060,18 @@ msgstr "" "Model ağlarında boole işlemi gerçekleştirilemiyor. Yalnızca pozitif parçalar " "ihraç edilecektir." +msgid "" +"Are you sure you want to store original SVGs with their local paths into the " +"3MF file?\n" +"If you hit 'NO', all SVGs in the project will not be editable any more." +msgstr "" +"Orijinal SVG'leri yerel yollarıyla birlikte 3MF dosyasına depolamak " +"istediğinizden emin misiniz?\n" +"'HAYIR' tuşuna basarsanız projedeki tüm SVG'ler artık düzenlenemez." + +msgid "Private protection" +msgstr "Özel koruma" + msgid "Is the printer ready? Is the print sheet in place, empty and clean?" msgstr "Yazıcı hazır mı? Baskı plakası takılı, boş ve temiz mi?" @@ -5062,6 +5095,9 @@ msgstr "Yazıcıya gönder" msgid "Custom supports and color painting were removed before repairing." msgstr "Tamir edilmeden önce özel destekler ve renkli boyalar kaldırıldı." +msgid "Optimize Rotation" +msgstr "Rotasyonu Optimize Et" + msgid "Invalid number" msgstr "Geçersiz numara" @@ -5226,17 +5262,11 @@ msgstr "Başlangıçtan sonra \"Günün ipucu\" bildirimini göster" msgid "If enabled, useful hints are displayed at startup." msgstr "Etkinleştirilirse başlangıçta faydalı ipuçları görüntülenir." -msgid "Show g-code window" -msgstr "G kodu penceresini göster" - -msgid "If enabled, g-code window will be displayed." -msgstr "Etkinleştirilirse g kodu penceresi görüntülenecektir." - msgid "Flushing volumes: Auto-calculate everytime the color changed." -msgstr "" +msgstr "Hacimleri temizleme: Renk her değiştiğinde otomatik olarak hesapla." msgid "If enabled, auto-calculate everytime the color changed." -msgstr "" +msgstr "Etkinleştirilirse, renk her değiştiğinde otomatik hesapla." msgid "Presets" msgstr "Ön ayarlar" @@ -5293,7 +5323,7 @@ msgid "Clear my choice on the unsaved projects." msgstr "Kaydedilmemiş projelerdeki seçimimi temizle." msgid "No warnings when loading 3MF with modified G-codes" -msgstr "" +msgstr "Değiştirilmiş G-kodları içeren 3MF dosyalarını yüklerken uyarı verme" msgid "Auto-Backup" msgstr "Otomatik yedekleme" @@ -5449,10 +5479,10 @@ msgid "Add/Remove materials" msgstr "Materyal Ekle/Kaldır" msgid "Select/Remove printers(system presets)" -msgstr "" +msgstr "Yazıcıları Seç/Kaldır (sistem ön ayarları)" msgid "Create printer" -msgstr "" +msgstr "Yazıcı oluştur" msgid "Incompatible" msgstr "Uyumsuz" @@ -5530,7 +5560,7 @@ msgstr "%s'yi farklı kaydet" msgid "User Preset" msgstr "Kullanıcı Ön Ayarı" -msgid "Project Inside Preset" +msgid "Preset Inside Project" msgstr "Ön ayar içerisinde proje" msgid "Name is invalid;" @@ -5604,6 +5634,9 @@ msgstr "Görev iptal edildi" msgid "(LAN)" msgstr "(LAN)" +msgid "Search" +msgstr "Ara" + msgid "My Device" msgstr "Cihazım" @@ -5634,17 +5667,17 @@ msgstr "Bambu Soğuk Plaka" msgid "PLA Plate" msgstr "PLA Plaka" -msgid "Bamabu Engineering Plate" -msgstr "Bamabu Mühendislik Plakası" +msgid "Bambu Engineering Plate" +msgstr "Bambu Mühendislik Plakası" -msgid "Bamabu Smooth PEI Plate" -msgstr "" +msgid "Bambu Smooth PEI Plate" +msgstr "Bambu Pürüzsüz PEI Plaka" msgid "High temperature Plate" msgstr "Yüksek Sıcaklık Plakası" -msgid "Bamabu Textured PEI Plate" -msgstr "" +msgid "Bambu Textured PEI Plate" +msgstr "Bambu Dokulu PEI Plaka" msgid "Send print job to" msgstr "Yazdırma işini şuraya gönder" @@ -5778,6 +5811,8 @@ msgstr "" msgid "" "Timelapse is not supported because Print sequence is set to \"By object\"." msgstr "" +"Timelapse desteklenmiyor çünkü Baskı sıralaması \"Nesneye\" göre olarak " +"ayarlandı." msgid "Errors" msgstr "Hatalar" @@ -5804,20 +5839,22 @@ msgstr "" #, c-format, boost-format msgid "nozzle in preset: %s %s" -msgstr "" +msgstr "önceden ayarlanmış nozul: %s %s" #, c-format, boost-format msgid "nozzle memorized: %.1f %s" -msgstr "" +msgstr "hafızaya alınan nozul: %.1f %s" msgid "" "Your nozzle diameter in preset is not consistent with memorized nozzle " "diameter. Did you change your nozzle lately?" msgstr "" +"Ön ayardaki nozul çapınız hafızaya alınan nozul çapıyla tutarlı değil. Son " +"zamanlarda nozulunuzu değiştirdiniz mi?" #, c-format, boost-format msgid "*Printing %s material with %s may cause nozzle damage" -msgstr "" +msgstr "%s malzemesini %s ile yazdırmak püskürtme ucu hasarına neden olabilir" msgid "" "Please click the confirm button if you still want to proceed with printing." @@ -5826,10 +5863,10 @@ msgstr "" "tıklayın." msgid "Hardened Steel" -msgstr "" +msgstr "Güçlendirilmiş çelik" msgid "Stainless Steel" -msgstr "" +msgstr "Paslanmaz çelik" msgid "" "Connecting to the printer. Unable to cancel during the connection process." @@ -5872,6 +5909,12 @@ msgstr "Yazıcının Orca Slicer ile aynı LAN'da olması gerekir." msgid "The printer does not support sending to printer SD card." msgstr "Yazıcı, yazıcı SD kartına gönderimi desteklemiyor." +msgid "Slice ok." +msgstr "Dilimleme tamam." + +msgid "View all Daily tips" +msgstr "Tüm Günlük ipuçlarını görüntüleyin" + msgid "Failed to create socket" msgstr "Soket oluşturulamadı" @@ -6020,7 +6063,7 @@ msgstr "" "musunuz?" msgid "Still print by object?" -msgstr "" +msgstr "Hala nesneye göre yazdırıyor musunuz?" msgid "" "We have added an experimental style \"Tree Slim\" that features smaller " @@ -6060,11 +6103,28 @@ msgstr "" "0 üst z mesafesi, 0 arayüz aralığı, eş merkezli desen ve bağımsız destek " "katmanı yüksekliğini devre dışı bırakma" +msgid "" +"Layer height exceeds the limit in Printer Settings -> Extruder -> Layer " +"height limits ,this may cause printing quality issues." +msgstr "" +"Katman yüksekliği, Yazıcı Ayarları -> Ekstruder -> Katman yüksekliği " +"sınırları bölümündeki sınırı aşıyor bu durum baskı kalitesi sorunlarına " +"neden olabilir." + +msgid "Adjust to the set range automatically? \n" +msgstr "Ayarlanan aralığa otomatik olarak ayarlansın mı? \n" + +msgid "Adjust" +msgstr "Ayarla" + +msgid "Ignore" +msgstr "Atla" + msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" "Araç başlığı olmadan timelapse kaydederken, bir \"Timelapse Wipe Tower\" " "eklenmesi önerilir.\n" @@ -6075,13 +6135,22 @@ msgid "Line width" msgstr "Katman Genişliği" msgid "Seam" -msgstr "Dikiş (Seam)" +msgstr "Dikiş" msgid "Precision" msgstr "Hassasiyet" msgid "Wall generator" -msgstr "Duvarlar" +msgstr "Duvar Türü" + +msgid "Walls and surfaces" +msgstr "Duvarlar ve Yüzeyler" + +msgid "Bridging" +msgstr "Köprüleme" + +msgid "Overhangs" +msgstr "Çıkıntılar" msgid "Walls" msgstr "Duvarlar" @@ -6096,7 +6165,7 @@ msgid "Other layers speed" msgstr "Diğer Katmanlar" msgid "Overhang speed" -msgstr "Çıkıntılar (Overhang)" +msgstr "Çıkıntı Hızı" msgid "" "This is the speed for various overhang degrees. Overhang degrees are " @@ -6114,7 +6183,7 @@ msgid "Set speed for external and internal bridges" msgstr "Harici ve dahili köprüler için hızı ayarlayın" msgid "Travel speed" -msgstr "Seyahat hızı" +msgstr "Seyahat Hızı" msgid "Acceleration" msgstr "Hızlanma" @@ -6126,19 +6195,19 @@ msgid "Raft" msgstr "Raft" msgid "Support filament" -msgstr "Destek filamenti" +msgstr "Destek Filamenti" msgid "Tree supports" msgstr "Ağaç destekler" msgid "Prime tower" -msgstr "Prime kulesi" +msgstr "Prime Kulesi" msgid "Special mode" -msgstr "Özel mod" +msgstr "Özel Mod" msgid "G-code output" -msgstr "G kodu çıktısı" +msgstr "G Kodu Çıktısı" msgid "Post-processing Scripts" msgstr "İşlem Sonrası Komut Dosyaları" @@ -6177,7 +6246,7 @@ msgid "Retraction" msgstr "Geri çekme" msgid "Basic information" -msgstr "Temel bilgiler" +msgstr "Temel Bilgiler" msgid "Recommended nozzle temperature" msgstr "Önerilen Nozul sıcaklığı" @@ -6187,10 +6256,10 @@ msgstr "" "Bu filamentin önerilen Nozul sıcaklığı aralığı. 0 ayar yok anlamına gelir" msgid "Print chamber temperature" -msgstr "Baskı odası sıcaklığı" +msgstr "Baskı Odası Sıcaklığı" msgid "Print temperature" -msgstr "Yazdırma sıcaklığı" +msgstr "Yazdırma Sıcaklığı" msgid "Nozzle" msgstr "Nozul" @@ -6241,16 +6310,16 @@ msgstr "" "PEI Plaka üzerine yazdırmayı desteklemediği anlamına gelir" msgid "Volumetric speed limitation" -msgstr "Hacimsel hız sınırlaması" +msgstr "Hacimsel Hız Sınırlaması" msgid "Cooling" msgstr "Soğutma" msgid "Cooling for specific layer" -msgstr "Belirli katman için soğutma" +msgstr "Belirli Katman İçin Soğutma" msgid "Part cooling fan" -msgstr "Parça soğutma fanı" +msgstr "Parça Soğutma Fanı" msgid "Min fan speed threshold" msgstr "Minimum fan hızı" @@ -6277,10 +6346,10 @@ msgstr "" "maksimum olacaktır" msgid "Auxiliary part cooling fan" -msgstr "Yardımcı parça soğutma fanı" +msgstr "Yardımcı Parça Soğutma Fanı" msgid "Exhaust fan" -msgstr "Egzos fanı" +msgstr "Egzos Fanı" msgid "During print" msgstr "Baskı boyunca" @@ -6289,31 +6358,31 @@ msgid "Complete print" msgstr "Tam baskı" msgid "Filament start G-code" -msgstr "Filament başlangıç G kodu" +msgstr "Filament Başlangıç G Kodu" msgid "Filament end G-code" -msgstr "Filament bitiş G kodu" +msgstr "Filament Bitiş G Kodu" msgid "Multimaterial" msgstr "Çoklu Malzeme" msgid "Wipe tower parameters" -msgstr "Silme kulesi parametreleri" +msgstr "Silme Kulesi Parametreleri" msgid "Toolchange parameters with single extruder MM printers" -msgstr "Tek ekstruderli MM yazıcılarda araç değiştirme parametreleri" +msgstr "Tek Ekstruderli MM Yazıcılarda Araç Değiştirme Parametreleri" msgid "Ramming settings" msgstr "Sıkıştırma ayarları" msgid "Toolchange parameters with multi extruder MM printers" -msgstr "Çoklu ekstruder MM yazıcılarda araç değiştirme parametreleri" +msgstr "Çoklu Ekstruder MM Yazıcılarda Araç Değiştirme Parametreleri" msgid "Printable space" msgstr "Tabla Ayarı" msgid "Cooling Fan" -msgstr "Soğutucu fan" +msgstr "Soğutucu Fan" msgid "Fan speed-up time" msgstr "Fan hızlanma süresi" @@ -6325,31 +6394,31 @@ msgid "Accessory" msgstr "Aksesuar" msgid "Machine gcode" -msgstr "YazıcıG-kod" +msgstr "Yazıcı G-kod" msgid "Machine start G-code" -msgstr "Yazıcı başlangıç G-kod" +msgstr "Yazıcı Başlangıç G-kod" msgid "Machine end G-code" -msgstr "Yazıcı bitiş G-kod" +msgstr "Yazıcı Bitiş G-kod" msgid "Printing by object G-code" -msgstr "" +msgstr "Nesneye Göre Yazdırma G-kod" msgid "Before layer change G-code" -msgstr "Katman değişimi öncesi G-kod" +msgstr "Katman Değişimi Öncesi G-kod" msgid "Layer change G-code" -msgstr "Katman değişimi G-kod" +msgstr "Katman Değişimi G-kod" msgid "Time lapse G-code" -msgstr "Time lapse G-code" +msgstr "Time Lapse G-code" msgid "Change filament G-code" -msgstr "Filament değişimi G-kod" +msgstr "Filament Değişimi G-kod" msgid "Change extrusion role G-code" -msgstr "Ekstrüzyon rolü G-kodu değiştirme" +msgstr "Ekstrüzyon Rolü G-kodu Değiştirme" msgid "Pause G-code" msgstr "Duraklatma G-Kod" @@ -6364,31 +6433,31 @@ msgid "Normal" msgstr "Normal" msgid "Speed limitation" -msgstr "Hız sınırlaması" +msgstr "Hız Sınırlaması" msgid "Acceleration limitation" -msgstr "Hızlanma sınırlaması" +msgstr "Hızlanma Sınırlaması" msgid "Jerk limitation" -msgstr "Jerk sınırlaması" +msgstr "Jerk Sınırlaması" msgid "Single extruder multimaterial setup" -msgstr "Tek ekstruder çoklu malzeme kurulumu" +msgstr "Tek Ekstruder Çoklu Malzeme Kurulumu" msgid "Wipe tower" -msgstr "Silme kulesi" +msgstr "Silme Kulesi" msgid "Single extruder multimaterial parameters" -msgstr "Tek ekstruder çoklu malzeme parametreleri" +msgstr "Tek Ekstruder Çoklu Malzeme Parametreleri" msgid "Layer height limits" -msgstr "Katman yüksekliği sınırları" +msgstr "Katman Yüksekliği Sınırları" msgid "Lift Z Enforcement" msgstr "Z Kaldırma Uygulaması" msgid "Retraction when switching material" -msgstr "Malzemeyi değiştirirken geri çekme" +msgstr "Malzemeyi Değiştirirken Geri Çekme" msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" @@ -6410,14 +6479,16 @@ msgid "" "%d Filament Preset and %d Process Preset is attached to this printer. Those " "presets would be deleted if the printer is deleted." msgstr "" +"%d Filament Ön Ayarı ve %d İşlem Ön Ayarı bu yazıcıya eklenmiştir.Yazıcı " +"silinirse bu ön ayarlar silinir." msgid "Presets inherited by other presets can not be deleted!" -msgstr "" +msgstr "Diğer ön ayarlar tarafından devralınan ön ayarlar silinemez!" msgid "The following presets inherit this preset." msgid_plural "The following preset inherits this preset." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Aşağıdaki ön ayarlar bu ön ayarı devralır." +msgstr[1] "Aşağıdaki ön ayar bu ön ayarı devralır." #. TRN Remove/Delete #, boost-format @@ -6429,6 +6500,15 @@ msgid_plural "Following presets will be deleted too." msgstr[0] "Aşağıdaki ön ayar da silinecektir." msgstr[1] "Aşağıdaki ön ayarlar da silinecektir." +msgid "" +"Are you sure to delete the selected preset? \n" +"If the preset corresponds to a filament currently in use on your printer, " +"please reset the filament information for that slot." +msgstr "" +"Seçilen ön ayarı silmek istediğinizden emin misiniz? \n" +"Eğer ön ayar, şu anda yazıcınızda kullanılan bir filamente karşılık " +"geliyorsa, lütfen o slot için filament bilgilerini sıfırlayın." + #, boost-format msgid "Are you sure to %1% the selected preset?" msgstr "Seçilen ön ayarı %1% yaptığınızdan emin misiniz?" @@ -6455,7 +6535,7 @@ msgstr "Tanımsız" msgid "Unsaved Changes" msgstr "Kaydedilmemiş Değişiklikler" -msgid "Discard or Keep changes" +msgid "Transfer or discard changes" msgstr "Değişiklikleri Çıkart veya Sakla" msgid "Old Value" @@ -6678,20 +6758,18 @@ msgstr "Sıkıştırma hattı genişliği" msgid "Ramming line spacing" msgstr "Sıkıştırma hattı aralığı" -msgid "Auto-Calc" -msgstr "Otomatik Hesaplama" - -msgid "Re-calculate" -msgstr "" +msgid "Recalculate" +msgstr "Yeniden hesapla" msgid "Flushing volumes for filament change" msgstr "Filament değişimi için temizleme hacmi" msgid "" -"Studio would re-calculate your flushing volumes everytime the filaments " -"color changed. You could disable the auto-calculate in Bambu Studio > " -"Preferences" +"Orca recalculates your flushing volumes everytime the filament colors " +"change. You can change this behavior in Preferences." msgstr "" +"Orca, filament renkleri her değiştiğinde yıkama hacimlerinizi yeniden " +"hesaplar. Bu davranışı Tercihler'de değiştirebilirsiniz." msgid "Flushing volume (mm³) for each filament pair." msgstr "Her filament çifti için yıkama hacmi (mm³)." @@ -6707,15 +6785,6 @@ msgstr "Çarpan [%.2f, %.2f] aralığında olmalıdır." msgid "Multiplier" msgstr "Çarpan" -msgid "unloaded" -msgstr "boşaltılmış" - -msgid "loaded" -msgstr "yüklenmiş" - -msgid "Filament #" -msgstr "Filament #" - msgid "From" msgstr "İtibaren" @@ -6723,10 +6792,10 @@ msgid "To" msgstr "İle" msgid "Bambu Network plug-in not detected." -msgstr "" +msgstr "Bambu Ağı eklentisi algılanmadı." msgid "Click here to download it." -msgstr "" +msgstr "İndirmek için buraya tıklayın." msgid "Login" msgstr "Giriş yap" @@ -6762,7 +6831,7 @@ msgid "Show/Hide 3Dconnexion devices settings dialog" msgstr "3Dconnexion cihazları ayarları iletişim kutusunu Göster/Gizle" msgid "Switch table page" -msgstr "" +msgstr "Tablo sayfasını değiştir" msgid "Show keyboard shortcuts list" msgstr "Klavye kısayolları listesini göster" @@ -7016,13 +7085,13 @@ msgid "New version of Orca Slicer" msgstr "Orca Slicer'nun yeni versiyonu" msgid "Skip this Version" -msgstr "" +msgstr "Bu versiyonu atla" msgid "Done" msgstr "Tamamlandı" msgid "Confirm and Update Nozzle" -msgstr "" +msgstr "Nozulu Onaylayın ve Güncelleyin" msgid "LAN Connection Failed (Sending print file)" msgstr "LAN Bağlantısı Başarısız (Yazdırma dosyası gönderiliyor)" @@ -7050,20 +7119,24 @@ msgstr "Yazıcınızın IP'sini ve Erişim Kodunu nerede bulabilirsiniz?" msgid "Step 3: Ping the IP address to check for packet loss and latency." msgstr "" +"Adım 3: Paket kaybını ve gecikmeyi kontrol etmek için IP adresine ping atın." msgid "Test" msgstr "Test" msgid "IP and Access Code Verified! You may close the window" -msgstr "" +msgstr "IP ve Erişim Kodu Doğrulandı! Pencereyi kapatabilirsin" msgid "Connection failed, please double check IP and Access Code" msgstr "" +"Bağlantı başarısız oldu, lütfen IP'yi ve Erişim Kodunu tekrar kontrol edin" msgid "" "Connection failed! If your IP and Access Code is correct, \n" "please move to step 3 for troubleshooting network issues" msgstr "" +"Bağlantı başarısız oldu! IP'niz ve Erişim Kodunuz doğruysa \n" +"ağ sorunlarını gidermek için lütfen 3. adıma geçin" msgid "Model:" msgstr "Model:" @@ -7083,6 +7156,9 @@ msgstr "Baskı" msgid "Idle" msgstr "Boşta" +msgid "Beta version" +msgstr "" + msgid "Latest version" msgstr "Son sürüm" @@ -7243,7 +7319,7 @@ msgid "Internal solid infill" msgstr "İç katı dolgu" msgid "Top surface" -msgstr "Üst Katman" +msgstr "Üst yüzey" msgid "Bottom surface" msgstr "Alt yüzey" @@ -7409,7 +7485,7 @@ msgid "" "during printing" msgstr "" "Birlikte büyük sıcaklık farkına sahip birden fazla filament basılamaz. Aksi " -"takdirde baskı sırasında ekstruder ve nozül tıkanabilir veya hasar görebilir" +"takdirde baskı sırasında ekstruder ve nozul tıkanabilir veya hasar görebilir" msgid "No extrusions under current settings." msgstr "Mevcut ayarlarda ekstrüzyon yok." @@ -7425,8 +7501,8 @@ msgid "" "Please select \"By object\" print sequence to print multiple objects in " "spiral vase mode." msgstr "" -"Birden fazla nesneyi spiral vazo modunda yazdırmak için lütfen \"Nesneye " -"göre\" yazdırma sırasını seçin." +"Birden fazla nesneyi spiral vazo modunda yazdırmak için lütfen \"Nesneye göre" +"\" yazdırma sırasını seçin." msgid "" "The spiral vase mode does not work when an object contains more than one " @@ -7455,6 +7531,31 @@ msgstr "" msgid "Variable layer height is not supported with Organic supports." msgstr "Değişken katman yüksekliği Organik desteklerle desteklenmez." +msgid "" +"Different nozzle diameters and different filament diameters is not allowed " +"when prime tower is enabled." +msgstr "" +"Ana kule etkinleştirildiğinde farklı nozul çaplarına ve farklı filament " +"çaplarına izin verilmez." + +msgid "" +"The Wipe Tower is currently only supported with the relative extruder " +"addressing (use_relative_e_distances=1)." +msgstr "" +"Temizleme Kulesi şu anda yalnızca ilgili ekstruder adreslemesiyle " +"desteklenmektedir (use_relative_e_distances=1)." + +msgid "" +"Ooze prevention is currently not supported with the prime tower enabled." +msgstr "Sızıntı önleme şu anda ana kule etkinken desteklenmemektedir." + +msgid "" +"The prime tower is currently only supported for the Marlin, RepRap/Sprinter, " +"RepRapFirmware and Repetier G-code flavors." +msgstr "" +"Prime tower şu anda yalnızca Marlin, RepRap/Sprinter, RepRapFirmware ve " +"Repetier G kodu türleri için desteklenmektedir." + msgid "The prime tower is not supported in \"By object\" print." msgstr "Prime tower, \"Nesneye göre\" yazdırmada desteklenmez." @@ -7533,12 +7634,7 @@ msgstr "" "desteği etkinleştirin." msgid "Layer height cannot exceed nozzle diameter" -msgstr "Katman yüksekliği nozül çapını aşamaz" - -msgid "" -"Layer height cannot exceed the limit in Printer Settings -> Extruder -> " -"Layer height limits" -msgstr "" +msgstr "Katman yüksekliği nozul çapını aşamaz" msgid "" "Relative extruder addressing requires resetting the extruder position at " @@ -7639,6 +7735,13 @@ msgid "Maximum printable height which is limited by mechanism of printer" msgstr "" "Yazıcının mekanizması tarafından sınırlanan maksimum yazdırılabilir yükseklik" +msgid "Preferred orientation" +msgstr "Tercih edilen yönlendirme" + +msgid "Automatically orient stls on the Z-axis upon initial import" +msgstr "" +"İlk içe aktarma sonrasında stl'leri Z ekseninde otomatik olarak yönlendirin" + msgid "Printer preset names" msgstr "Yazıcı ön ayar adları" @@ -7914,7 +8017,7 @@ msgstr "" "Dış köprülerin yoğunluğu. %100 sağlam köprü anlamına gelir. Varsayılan " "%100'dür." -msgid "Bridge flow" +msgid "Bridge flow ratio" msgstr "Köprülerde akış oranı" msgid "" @@ -7924,6 +8027,18 @@ msgstr "" "Köprü için malzeme miktarını azaltmak ve sarkmayı iyileştirmek için bu " "değeri biraz azaltın (örneğin 0,9)" +msgid "Internal bridge flow ratio" +msgstr "İç köprü akış oranı" + +msgid "" +"This value governs the thickness of the internal bridge layer. This is the " +"first layer over sparse infill. Decrease this value slightly (for example " +"0.9) to improve surface quality over sparse infill." +msgstr "" +"Bu değer iç köprü katmanının kalınlığını belirler. Bu, seyrek dolgunun " +"üzerindeki ilk katmandır. Seyrek dolguya göre yüzey kalitesini iyileştirmek " +"için bu değeri biraz azaltın (örneğin 0,9)." + msgid "Top surface flow ratio" msgstr "Üst katı dolgu akış oranı" @@ -8017,9 +8132,15 @@ msgid "" "This setting can also help reduce part warping due to the reduction of " "stresses in the part walls." msgstr "" +"Tek katmanlarda ters yönde bir çıkıntının üzerinde bir kısmı bulunan " +"çevreleri ekstrüzyonla çıkarın. Bu alternatif desen, dik çıkıntıları büyük " +"ölçüde iyileştirebilir.\n" +"\n" +"Bu ayar aynı zamanda parça duvarlarındaki gerilimin azalması nedeniyle " +"parçanın bükülmesinin azaltılmasına da yardımcı olabilir." msgid "Reverse only internal perimeters" -msgstr "" +msgstr "Yalnızca iç çevreleri ters çevir" msgid "" "Apply the reverse perimeters logic only on internal perimeters. \n" @@ -8035,6 +8156,18 @@ msgid "" "Reverse Threshold to 0 so that all internal walls print in alternating " "directions on odd layers irrespective of their overhang degree." msgstr "" +"Ters çevre mantığını yalnızca iç çevrelere uygulayın. \n" +"\n" +"Bu ayar, parçalar artık farklı yönlerde dağıtıldığından parça gerilimlerini " +"büyük ölçüde azaltır. Bu, dış duvar kalitesini korurken parçanın bükülmesini " +"de azaltacaktır. Bu özellik, ABS/ASA gibi eğrilmeye yatkın malzemeler ve " +"ayrıca TPU ve İpek PLA gibi elastik filamentler için çok faydalı olabilir. " +"Ayrıca destekler üzerindeki yüzen bölgelerdeki bükülmenin azaltılmasına da " +"yardımcı olabilir.\n" +"\n" +"Bu ayarın en etkili olması için, tüm iç duvarların çıkıntı derecelerine " +"bakılmaksızın tek katmanlar üzerine değişen yönlerde yazdırılması için Ters " +"Eşiği 0'a ayarlamanız önerilir." msgid "Reverse threshold" msgstr "Ters eşik" @@ -8194,7 +8327,7 @@ msgstr "" "iğne ve küçük detaylar için soğutma kalitesini artırabilir" msgid "Normal printing" -msgstr "Normal Baskı" +msgstr "Normal baskı" msgid "" "The default acceleration of both normal printing and travel except initial " @@ -8271,6 +8404,18 @@ msgstr "" "köprüler daha iyi görünür ancak yalnızca daha kısa köprü mesafeleri için " "güvenilirdir." +msgid "Thick internal bridges" +msgstr "Kalın iç köprüler" + +msgid "" +"If enabled, thick internal bridges will be used. It's usually recommended to " +"have this feature turned on. However, consider turning it off if you are " +"using large nozzles." +msgstr "" +"Etkinleştirilirse kalın iç köprüler kullanılacaktır. Genellikle bu özelliğin " +"açık olması önerilir. Ancak büyük nozul uçları kullanıyorsanız kapatmayı " +"düşünün." + msgid "Max bridge length" msgstr "Maksimum köprü uzunluğu" @@ -8290,12 +8435,14 @@ msgid "End G-code when finish the whole printing" msgstr "Tüm yazdırmayı tamamladığında çalışacak olan G Kodu" msgid "Between Object Gcode" -msgstr "" +msgstr "Nesne Arası Gcode" msgid "" "Insert Gcode between objects. This parameter will only come into effect when " "you print your models object by object" msgstr "" +"Nesnelerin arasına Gcode ekleyin. Bu parametre yalnızca modellerinizi nesne " +"nesne yazdırdığınızda etkili olacaktır" msgid "End G-code when finish the printing of this filament" msgstr "Bu filament ile baskı bittiğinde çalışacak G kodu" @@ -8311,7 +8458,7 @@ msgstr "" "dolgu ekleyin (üst + alt katı katmanlar)" msgid "Top surface pattern" -msgstr "Üst katman deseni" +msgstr "Üst yüzey deseni" msgid "Line pattern of top surface infill" msgstr "Üst yüzey dolgusunun çizgi deseni" @@ -8329,19 +8476,19 @@ msgid "Monotonic line" msgstr "Monotonik çizgi" msgid "Aligned Rectilinear" -msgstr "Hizalanmış Doğrusal" +msgstr "Hizalanmış doğrusal" msgid "Hilbert Curve" -msgstr "Hilbert Eğrisi" +msgstr "Hilbert eğrisi" msgid "Archimedean Chords" -msgstr "Arşimet Akorları" +msgstr "Arşimet akorları" msgid "Octagram Spiral" -msgstr "Sekizgen Spiral" +msgstr "Sekizgen spiral" msgid "Bottom surface pattern" -msgstr "Alt katman deseni" +msgstr "Alt yüzey deseni" msgid "Line pattern of bottom surface infill, not bridge infill" msgstr "Köprü dolgusu değil, alt yüzey dolgusunun çizgi deseni" @@ -8350,7 +8497,7 @@ msgid "Internal solid infill pattern" msgstr "İç dolgu deseni" msgid "" -"Line pattern of internal solid infill. if the detect nattow internal solid " +"Line pattern of internal solid infill. if the detect narrow internal solid " "infill be enabled, the concentric pattern will be used for the small area." msgstr "" "İç katı dolgunun çizgi deseni. doğal iç katı dolguyu tespit etme " @@ -8391,26 +8538,85 @@ msgid "" "This sets the threshold for small perimeter length. Default threshold is 0mm" msgstr "Bu, küçük çevre uzunluğu için eşiği belirler. Varsayılan eşik 0 mm'dir" -msgid "Order of walls" -msgstr "" +msgid "Walls printing order" +msgstr "Duvar baskı sırası" -msgid "Print sequence of inner wall and outer wall. " +msgid "" +"Print sequence of the internal (inner) and external (outer) walls. \n" +"\n" +"Use Inner/Outer for best overhangs. This is because the overhanging walls " +"can adhere to a neighouring perimeter while printing. However, this option " +"results in slightly reduced surface quality as the external perimeter is " +"deformed by being squashed to the internal perimeter.\n" +"\n" +"Use Inner/Outer/Inner for the best external surface finish and dimensional " +"accuracy as the external wall is printed undisturbed from an internal " +"perimeter. However, overhang performance will reduce as there is no internal " +"perimeter to print the external wall against. This option requires a minimum " +"of 3 walls to be effective as it prints the internal walls from the 3rd " +"perimeter onwards first, then the external perimeter and, finally, the first " +"internal perimeter. This option is recomended against the Outer/Inner option " +"in most cases. \n" +"\n" +"Use Outer/Inner for the same external wall quality and dimensional accuracy " +"benefits of Inner/Outer/Inner option. However, the z seams will appear less " +"consistent as the first extrusion of a new layer starts on a visible " +"surface.\n" +"\n" +" " msgstr "" +"İç (iç) ve dış (dış) duvarların baskı sırası.\n" +"\n" +"En iyi çıkıntılar için İç/Dış seçeneğini kullanın. Bunun nedeni, sarkan " +"duvarların baskı sırasında komşu çevreye yapışabilmesidir. Ancak bu seçenek, " +"dış çevrenin iç çevreye sıkıştırılarak deforme olması nedeniyle yüzey " +"kalitesinin biraz düşmesine neden olur.\n" +"\n" +"Dış duvar iç çevreden rahatsız edilmeden basıldığından, en iyi dış yüzey " +"kalitesi ve boyutsal doğruluk için İç/Dış/İç seçeneğini kullanın. Ancak, dış " +"duvarın üzerine baskı yapılacak bir iç çevre olmadığından sarkma performansı " +"düşecektir. Bu seçenek, önce 3. çevreden itibaren iç duvarları, ardından dış " +"çevreyi ve son olarak da birinci iç çevreyi yazdırdığından etkili olması " +"için en az 3 duvar gerektirir. Bu seçenek çoğu durumda Dış/İç seçeneğine " +"karşı önerilir. \n" +"\n" +"İç/Dış/İç seçeneğinin aynı dış duvar kalitesi ve boyutsal doğruluk " +"avantajları için Dış/İç seçeneğini kullanın. Bununla birlikte, yeni bir " +"katmanın ilk ekstrüzyonu görünür bir yüzey üzerinde başladığından z " +"dikişleri daha az tutarlı görünecektir.\n" +"\n" +" " -msgid "inner/outer" -msgstr "" +msgid "Inner/Outer" +msgstr "İç/Dış" -msgid "outer/inner" -msgstr "" +msgid "Outer/Inner" +msgstr "Dış/İç" -msgid "inner wall/outer wall/inner wall" -msgstr "" +msgid "Inner/Outer/Inner" +msgstr "İç/Dış/İç" msgid "Print infill first" -msgstr "" +msgstr "Önce dolguyu yazdır" -msgid "Order of wall/infill. false means print wall first. " +msgid "" +"Order of wall/infill. When the tickbox is unchecked the walls are printed " +"first, which works best in most cases.\n" +"\n" +"Printing walls first may help with extreme overhangs as the walls have the " +"neighbouring infill to adhere to. However, the infill will slighly push out " +"the printed walls where it is attached to them, resulting in a worse " +"external surface finish. It can also cause the infill to shine through the " +"external surfaces of the part." msgstr "" +"Duvar/dolgu sırası. Onay kutusunun işareti kaldırıldığında ilk olarak " +"duvarlar yazdırılır ve bu çoğu durumda en iyi sonucu verir.\n" +"\n" +"Duvarların komşu dolgulara yapışması nedeniyle ilk önce duvarların basılması " +"aşırı çıkıntılara yardımcı olabilir. Ancak dolgu, baskılı duvarları " +"tutturulduğu yerden hafifçe dışarı doğru itecek ve bu da daha kötü bir dış " +"yüzey kalitesine neden olacaktır. Ayrıca dolgunun parçanın dış yüzeylerinden " +"parlamasına da neden olabilir." msgid "Height to rod" msgstr "Çubuğa kadar olan yükseklik" @@ -8482,7 +8688,7 @@ msgid "" "it will be computed over the nozzle diameter." msgstr "" "Diğer çizgi genişlikleri 0'a ayarlanmışsa varsayılan çizgi genişliği. % " -"olarak ifade edilirse nozül çapı üzerinden hesaplanacaktır." +"olarak ifade edilirse nozul çapı üzerinden hesaplanacaktır." msgid "Keep fan always on" msgstr "Fanı her zaman açık tut" @@ -8649,7 +8855,7 @@ msgid "" "object, Slic3r will always prime this amount of material into the wipe tower " "to produce successive infill or sacrificial object extrusions reliably." msgstr "" -"Bir takım değişiminden sonra, yeni yüklenen filamentin nozül içindeki kesin " +"Bir takım değişiminden sonra, yeni yüklenen filamentin nozul içindeki kesin " "konumu bilinmeyebilir ve filament basıncı muhtemelen henüz stabil değildir. " "Yazdırma kafasını bir dolguya veya kurban nesneye boşaltmadan önce Slic3r, " "ardışık dolgu veya kurban nesne ekstrüzyonlarını güvenilir bir şekilde " @@ -8779,7 +8985,7 @@ msgid "(Undefined)" msgstr "(Tanımsız)" msgid "Infill direction" -msgstr "Dolgu Açısı" +msgstr "Dolgu açısı" msgid "" "Angle for sparse infill pattern, which controls the start or main direction " @@ -8788,14 +8994,18 @@ msgstr "" "Hattın başlangıcını veya ana yönünü kontrol eden seyrek dolgu deseni açısı" msgid "Sparse infill density" -msgstr "Dolgu Yoğunluğu" +msgstr "Dolgu yoğunluğu" -#, c-format -msgid "Density of internal sparse infill, 100% means solid throughout" -msgstr "Density of internal sparse infill, 100% means solid throughout" +#, fuzzy, c-format, boost-format +msgid "" +"Density of internal sparse infill, 100% turns all sparse infill into solid " +"infill and internal solid infill pattern will be used" +msgstr "" +"İç seyrek dolgunun yoğunluğu, %100 tüm seyrek dolguyu katı dolguya " +"dönüştürür ve iç katı dolgu modeli kullanılacaktır" msgid "Sparse infill pattern" -msgstr "Dolgu Deseni" +msgstr "Dolgu deseni" msgid "Line pattern for internal sparse infill" msgstr "İç dolgu deseni" @@ -8819,19 +9029,19 @@ msgid "Honeycomb" msgstr "Bal peteği" msgid "Adaptive Cubic" -msgstr "Uyarlanabilir Kübik" +msgstr "Uyarlanabilir kübik" msgid "3D Honeycomb" -msgstr "3D Petek" +msgstr "3D petek" msgid "Support Cubic" -msgstr "Destek Kübik" +msgstr "Destek kübik" msgid "Lightning" msgstr "Yıldırım" msgid "Sparse infill anchor length" -msgstr "Dolgu Uzunluğu" +msgstr "Dolgu uzunluğu" msgid "" "Connect an infill line to an internal perimeter with a short segment of an " @@ -8946,7 +9156,7 @@ msgid "Klipper's max_accel_to_decel will be adjusted automatically" msgstr "Klipper'ın max_accel_to_decel'i otomatik olarak ayarlanacak" msgid "accel_to_decel" -msgstr "accel_to_decel" +msgstr "Accel_to_decel" #, c-format, boost-format msgid "" @@ -9025,17 +9235,16 @@ msgstr "Maksimum fan hızı" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " -"than \"close_fan_the_first_x_layers\", in which case the fan will be running " -"at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower than " +"\"close_fan_the_first_x_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." msgstr "" "Fan hızı, \"close_fan_the_first_x_layers\" katmanında sıfırdan " "\"ful_fan_speed_layer\" katmanında maksimuma doğrusal olarak artırılacaktır. " "\"full_fan_speed_layer\", \"close_fan_the_first_x_layers\" değerinden " -"düşükse göz ardı edilecektir; bu durumda fan, " -"\"close_fan_the_first_x_layers\" + 1 katmanında izin verilen maksimum hızda " -"çalışacaktır." +"düşükse göz ardı edilecektir; bu durumda fan, \"close_fan_the_first_x_layers" +"\" + 1 katmanında izin verilen maksimum hızda çalışacaktır." msgid "Support interface fan speed" msgstr "Destekler için fan hızı" @@ -9089,6 +9298,12 @@ msgid "" msgstr "" "Her çizgi parçasına eklenen rastgele noktalar arasındaki ortalama mesafe" +msgid "Apply fuzzy skin to first layer" +msgstr "Bulanık cildi ilk katmana uygulayın" + +msgid "Whether to apply fuzzy skin on the first layer" +msgstr "İlk katmana bulanık cilt uygulanıp uygulanmayacağı" + msgid "Filter out tiny gaps" msgstr "Küçük boşlukları filtrele" @@ -9360,19 +9575,23 @@ msgstr "" "ekstruder baskıları için kullanışlıdır" msgid "Maximum width of a segmented region" -msgstr "" +msgstr "Bölümlere ayrılmış bir bölgenin maksimum genişliği" msgid "Maximum width of a segmented region. Zero disables this feature." msgstr "" +"Bölümlere ayrılmış bir bölgenin maksimum genişliği. 0 bu özelliği devre dışı " +"bırakır." msgid "Interlocking depth of a segmented region" -msgstr "" +msgstr "Bölümlere ayrılmış bir bölgenin birbirine kenetlenen derinliği" msgid "Interlocking depth of a segmented region. Zero disables this feature." msgstr "" +"Bölümlere ayrılmış bir bölgenin birbirine kenetlenen derinliği. 0 bu " +"özelliği devre dışı bırakır." msgid "Ironing Type" -msgstr "Ütüleme Tipi" +msgstr "Ütüleme tipi" msgid "" "Ironing is using small flow to print on same height of surface again to make " @@ -9429,6 +9648,8 @@ msgid "" "The angle ironing is done at. A negative number disables this function and " "uses the default method." msgstr "" +"Köşebent ütüleme işlemi yapılır. Negatif bir sayı bu işlevi devre dışı " +"bırakır ve varsayılan yöntemi kullanır." msgid "This gcode part is inserted at every layer change after lift z" msgstr "" @@ -9730,7 +9951,7 @@ msgid "Nozzle volume" msgstr "Nozul hacmi" msgid "Volume of nozzle between the cutter and the end of nozzle" -msgstr "Kesici ile nozulun ucu arasındaki nozül hacmi" +msgstr "Kesici ile nozulun ucu arasındaki nozul hacmi" msgid "Cooling tube position" msgstr "Soğutma borusu konumu" @@ -9802,7 +10023,7 @@ msgstr "" "ve G kodu oluşturmayı yavaşlatır" msgid "Enable" -msgstr "Aktifle" +msgstr "Aktif et" msgid "Filename format" msgstr "Dosya adı formatı" @@ -9811,14 +10032,14 @@ msgid "User can self-define the project file name when export" msgstr "" "Kullanıcı dışa aktarma sırasında proje dosyası adını kendisi tanımlayabilir" -msgid "Make overhang printable" +msgid "Make overhangs printable" msgstr "Çıkıntılar yazdırılabilir" msgid "Modify the geometry to print overhangs without support material." msgstr "" "Destek malzemesi olmadan çıkıntıları yazdırmak için geometriyi değiştirin." -msgid "Make overhang printable maximum angle" +msgid "Make overhangs printable - Maximum angle" msgstr "Maksimum yazdırılabilir açı" msgid "" @@ -9830,7 +10051,7 @@ msgstr "" "maksimum çıkıntı açısı. 90°, modeli hiçbir şekilde değiştirmez ve herhangi " "bir çıkıntıya izin vermez, 0 ise tüm çıkıntıları konik malzemeyle değiştirir." -msgid "Make overhang printable hole area" +msgid "Make overhangs printable - Hole area" msgstr "Yazdırılabilir çıkıntı delik alanı oluşturun" msgid "" @@ -9978,7 +10199,7 @@ msgid "" "print when travel move. Using spiral line to lift z can prevent stringing" msgstr "" "Geri çekme işlemi her yapıldığında, nozul ile baskı arasında açıklık " -"oluşturmak için nozul biraz kaldırılır. Hareket halindeyken nozülün baskıya " +"oluşturmak için nozul biraz kaldırılır. Hareket halindeyken nozulun baskıya " "çarpmasını önler. Z'yi kaldırmak için spiral çizgi kullanmak çekmeyi " "önleyebilir" @@ -10072,7 +10293,7 @@ msgstr "" "ilave filament miktarını itecektir." msgid "Retraction Speed" -msgstr "Geri Çekme Hızı" +msgstr "Geri çekme hızı" msgid "Speed of retractions" msgstr "Geri çekme hızları" @@ -10101,6 +10322,9 @@ msgstr "" msgid "Show auto-calibration marks" msgstr "Otomatik kalibrasyon işaretlerini göster" +msgid "Disable set remaining print time" +msgstr "Kalan yazdırma süresini ayarlamayı devre dışı bırak" + msgid "Seam position" msgstr "Dikiş konumu" @@ -10156,7 +10380,7 @@ msgstr "" "eylemi için dış duvar ekstrüzyonunun hızı kullanılacaktır." msgid "Wipe on loops" -msgstr "Döngülerde Temizleme" +msgstr "Döngülerde temizleme" msgid "" "To minimize the visibility of the seam in a closed loop extrusion, a small " @@ -10192,7 +10416,7 @@ msgid "How many layers of skirt. Usually only one layer" msgstr "Etek katman sayısı. Genellikle tek katman" msgid "Skirt loops" -msgstr "Etek Sayısı" +msgstr "Etek sayısı" msgid "Number of loops for the skirt. Zero means disabling skirt" msgstr "" @@ -10246,6 +10470,22 @@ msgstr "" "katı alt katmanlara sahip tek duvarlı bir baskıya dönüştürür. Oluşturulan " "son modelde dikiş yok" +msgid "Smooth Spiral" +msgstr "" + +msgid "" +"Smooth Spiral smoothes out X and Y moves as wellresulting in no visible seam " +"at all, even in the XY directions on walls that are not vertical" +msgstr "" + +msgid "Max XY Smoothing" +msgstr "" + +msgid "" +"Maximum distance to move points in XY to try to achieve a smooth spiralIf " +"expressed as a %, it will be computed over nozzle diameter" +msgstr "" + msgid "" "If smooth or traditional mode is selected, a timelapse video will be " "generated for each print. After each layer is printed, a snapshot is taken " @@ -10262,7 +10502,7 @@ msgstr "" "bir video halinde birleştirilir. Düzgün modu seçilirse, her katman " "yazdırıldıktan sonra araç kafası fazla kanala hareket edecek ve ardından bir " "anlık görüntü alacaktır. Anlık görüntü alma işlemi sırasında eriyen filament " -"nozülden sızabileceğinden, nozulu silmek için düzgün modun kullanılması için " +"nozulden sızabileceğinden, nozulu silmek için düzgün modun kullanılması için " "prime tower gereklidir." msgid "Traditional" @@ -10348,7 +10588,7 @@ msgstr "" "düşürebilir, bu nedenle değerin oldukça düşük tutulması tavsiye edilir." msgid "Slicing Mode" -msgstr "Dilimleme Modu" +msgstr "Dilimleme modu" msgid "" "Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to " @@ -10465,11 +10705,14 @@ msgstr "" "belirli bir filamentin olmadığı ve mevcut filamentin kullanıldığı anlamına " "gelir" -msgid "No interface filament for body" -msgstr "" +msgid "Avoid interface filament for base" +msgstr "Taban için arayüz filamentini azaltın" -msgid "Don't use support interface filament to print support body" +msgid "" +"Avoid using support interface filament to print support base if possible." msgstr "" +"Destek tabanını yazdırmak için destek arayüzü filamentini kullanmaktan " +"kaçının" msgid "" "Line width of support. If expressed as a %, it will be computed over the " @@ -10507,10 +10750,10 @@ msgid "Bottom interface layers" msgstr "Alt arayüz katmanları" msgid "Number of bottom interface layers" -msgstr "" +msgstr "Alt arayüz katmanlarının sayısı" msgid "Same as top" -msgstr "" +msgstr "Üsttekiyle aynı" msgid "Top interface spacing" msgstr "Üst arayüz aralığı" @@ -10528,7 +10771,7 @@ msgid "Speed of support interface" msgstr "Destek arayüzünün hızı" msgid "Base pattern" -msgstr "Destek Deseni" +msgstr "Destek deseni" msgid "Line pattern of support" msgstr "Desteğin çizgi deseni" @@ -10561,7 +10804,7 @@ msgid "Spacing between support lines" msgstr "Destek hatları arasındaki boşluk" msgid "Normal Support expansion" -msgstr "Normal Destek genişletmesi" +msgstr "Normal destek genişletmesi" msgid "Expand (+) or shrink (-) the horizontal span of normal support" msgstr "Normal desteğin yatay açıklığını genişletin (+) veya daraltın (-)" @@ -10740,11 +10983,11 @@ msgstr "" "için çift duvarlı olarak basılacaktır. Çift duvar olmaması için bu değeri " "sıfır olarak ayarlayın." -msgid "Tree support wall loops" -msgstr "Ağaç desteği duvar döngüleri" +msgid "Support wall loops" +msgstr "Destek duvarı döngüleri" -msgid "This setting specify the count of walls around tree support" -msgstr "Bu ayar, ağaç desteğinin etrafındaki duvarların sayısını belirtir" +msgid "This setting specify the count of walls around support" +msgstr "Bu ayar desteğin etrafındaki duvarların sayısını belirtir" msgid "Tree support with infill" msgstr "Dolgulu ağaç desteği" @@ -10789,7 +11032,7 @@ msgstr "" "gelen 0 şiddetle tavsiye edilir" msgid "Nozzle temperature for layers after the initial one" -msgstr "İlk katmandan sonraki katmanlar için nozül sıcaklığı" +msgstr "İlk katmandan sonraki katmanlar için nozul sıcaklığı" msgid "Detect thin wall" msgstr "İnce duvarı algıla" @@ -10870,10 +11113,26 @@ msgid "Wipe Distance" msgstr "Temizleme Mesafesi" msgid "" -"Discribe how long the nozzle will move along the last path when retracting" +"Discribe how long the nozzle will move along the last path when " +"retracting. \n" +"\n" +"Depending on how long the wipe operation lasts, how fast and long the " +"extruder/filament retraction settings are, a retraction move may be needed " +"to retract the remaining filament. \n" +"\n" +"Setting a value in the retract amount before wipe setting below will perform " +"any excess retraction before the wipe, else it will be performed after." msgstr "" -"Geri çekme esnasında nozulun son hat boyunca ne kadar süre hareket edeceğini " -"belirtin" +"Geri çekilirken nozulun son yol boyunca ne kadar süre hareket edeceğini " +"açıklayın. \n" +"\n" +"Silme işleminin ne kadar sürdüğüne, ekstruder/filament geri çekme " +"ayarlarının ne kadar hızlı ve uzun olduğuna bağlı olarak, kalan filamanı " +"geri çekmek için bir geri çekme hareketine ihtiyaç duyulabilir. \n" +"\n" +"Aşağıdaki silme ayarından önce geri çekme miktarına bir değer ayarlamak, " +"silme işleminden önce aşırı geri çekme işlemini gerçekleştirecektir, aksi " +"takdirde silme işleminden sonra gerçekleştirilecektir." msgid "" "The wiping tower can be used to clean up the residue on the nozzle and " @@ -10989,7 +11248,7 @@ msgstr "Maksimum köprüleme mesafesi" msgid "Maximal distance between supports on sparse infill sections." msgstr "" "Bu nesne, filamentten tasarruf etmek ve baskı süresini azaltmak için bir " -"filament değişiminden sonra nozülü temizlemek için kullanılacaktır. Sonuç " +"filament değişiminden sonra nozulu temizlemek için kullanılacaktır. Sonuç " "olarak nesnelerin renkleri karıştırılacaktır. Prime tower " "etkinleştirilmediği sürece etkili olmayacaktır." @@ -11029,11 +11288,15 @@ msgid "" "compute the polyhole.\n" "See http://hydraraptor.blogspot.com/2011/02/polyholes.html" msgstr "" +"Birden fazla katmana yayılan neredeyse dairesel delikleri arayın ve " +"geometriyi çoklu deliklere dönüştürün. Çoklu deliği hesaplamak için nozul " +"boyutunu ve (en büyük) çapı kullanın.\n" +"Bakın http://hydraraptor.blogspot.com/2011/02/polyholes.html" msgid "Polyhole detection margin" msgstr "Çokgen delik tespiti marjı" -#, c-format, boost-format +#, fuzzy, c-format, boost-format msgid "" "Maximum defection of a point to the estimated radius of the circle.\n" "As cylinders are often exported as triangles of varying size, points may not " @@ -11041,6 +11304,11 @@ msgid "" "broaden the detection.\n" "In mm or in % of the radius." msgstr "" +"Bir noktanın dairenin tahmini yarıçapına göre maksimum sapması.\n" +"Silindirler genellikle farklı boyutlarda üçgenler olarak ihraç edildiğinden, " +"noktalar daire çevresinde olmayabilir. Bu ayar, algılamayı genişletmeniz " +"için size biraz alan sağlar.\n" +"inc mm cinsinden veya yarıçapın %'si cinsinden." msgid "Polyhole twist" msgstr "Çokgen delik eğrisi" @@ -11065,6 +11333,8 @@ msgid "" "Format of G-code thumbnails: PNG for best quality, JPG for smallest size, " "QOI for low memory firmware" msgstr "" +"G kodu küçük resimlerinin formatı: En iyi kalite için PNG, en küçük boyut " +"için JPG, düşük bellekli donanım yazılımı için QOI" msgid "Use relative E distances" msgstr "Göreceli (relative) E mesafelerini kullan" @@ -11209,10 +11479,6 @@ msgstr "" msgid "invalid value " msgstr "geçersiz değer " -#, c-format, boost-format -msgid " doesn't work at 100%% density " -msgstr " 100%% yoğunlukta çalışmıyor " - msgid "Invalid value when spiral vase mode is enabled: " msgstr "Spiral vazo modu etkinleştirildiğinde geçersiz değer: " @@ -11497,7 +11763,7 @@ msgstr "Ad boş olamaz." #, c-format, boost-format msgid "The selected preset: %s is not found." -msgstr "" +msgstr "Seçilen ön ayar: %s bulunamadı." msgid "The name cannot be the same as the system preset name." msgstr "Ad, sistem ön ayarının adıyla aynı olamaz." @@ -12180,6 +12446,814 @@ msgstr "Bölüm 2" msgid "Delete input" msgstr "Girişi sil" +msgid "Network Test" +msgstr "Ağ testi" + +msgid "Start Test Multi-Thread" +msgstr "Çoklu İş Parçacığı Testini Başlat" + +msgid "Start Test Single-Thread" +msgstr "Tek İş Parçacığı Testini Başlat" + +msgid "Export Log" +msgstr "Logu Dışa Aktar" + +msgid "Studio Version:" +msgstr "Stüdyo Sürümü:" + +msgid "System Version:" +msgstr "Sistem Versiyonu:" + +msgid "DNS Server:" +msgstr "Dns sunucusu:" + +msgid "Test BambuLab" +msgstr "BambuLab'ı test edin" + +msgid "Test BambuLab:" +msgstr "BambuLab'ı test edin" + +msgid "Test Bing.com" +msgstr "Bing.com'u test edin" + +msgid "Test bing.com:" +msgstr "Bing.com'u test edin:" + +msgid "Test HTTP" +msgstr "HTTP'yi test et" + +msgid "Test HTTP Service:" +msgstr "HTTP Hizmetini Test Edin:" + +msgid "Test storage" +msgstr "Test depolaması" + +msgid "Test Storage Upload:" +msgstr "Depolama Yüklemesini Test Et:" + +msgid "Test storage upgrade" +msgstr "Depolama yükseltmesini test edin" + +msgid "Test Storage Upgrade:" +msgstr "Depolama Yükseltmesini Test Edin:" + +msgid "Test storage download" +msgstr "Test depolama indirmesi" + +msgid "Test Storage Download:" +msgstr "Test Depolama İndirme:" + +msgid "Test plugin download" +msgstr "Test eklentisi indirme" + +msgid "Test Plugin Download:" +msgstr "Test Eklentisini İndirin:" + +msgid "Test Storage Upload" +msgstr "Depolama Yüklemesini Test Etme" + +msgid "Log Info" +msgstr "Günlük Bilgisi" + +msgid "Select filament preset" +msgstr "Filament ön ayarını seçin" + +msgid "Create Filament" +msgstr "Filament Oluştur" + +msgid "Create Based on Current Filament" +msgstr "Mevcut Filamente Göre Oluşturun" + +msgid "Copy Current Filament Preset " +msgstr "Geçerli Filament Ön Ayarını Kopyala " + +msgid "Basic Information" +msgstr "Temel Bilgiler" + +msgid "Add Filament Preset under this filament" +msgstr "Bu filamanın altına Filament Ön Ayarını ekleyin" + +msgid "We could create the filament presets for your following printer:" +msgstr "Aşağıdaki yazıcınız için filament ön ayarlarını oluşturabiliriz:" + +msgid "Select Vendor" +msgstr "Satıcıyı Seçin" + +msgid "Input Custom Vendor" +msgstr "Özel Satıcı Girin" + +msgid "Can't find vendor I want" +msgstr "İstediğim satıcıyı bulamıyorum" + +msgid "Select Type" +msgstr "Tür Seçin" + +msgid "Select Filament Preset" +msgstr "Filament Ön Ayarını Seçin" + +msgid "Serial" +msgstr "Seri" + +msgid "e.g. Basic, Matte, Silk, Marble" +msgstr "Örneğin. Basic, Mat, İpek, Mermer" + +msgid "Filament Preset" +msgstr "Filament Ön Ayarı" + +msgid "Create" +msgstr "Oluştur" + +msgid "Vendor is not selected, please reselect vendor." +msgstr "Satıcı seçilmedi, lütfen satıcıyı yeniden seçin." + +msgid "Custom vendor is not input, please input custom vendor." +msgstr "Özel satıcı girişi yapılmaz, lütfen özel satıcıyı girin." + +msgid "" +"\"Bambu\" or \"Generic\" can not be used as a Vendor for custom filaments." +msgstr "" +"\"Bambu\" veya \"Genel\" özel filamentler için Satıcı olarak kullanılamaz." + +msgid "Filament type is not selected, please reselect type." +msgstr "Filament türü seçilmedi, lütfen türünü seçin." + +msgid "Filament serial is not inputed, please input serial." +msgstr "Filamentin serisi girilmedi, lütfen seri numarasını girin." + +msgid "" +"There may be escape characters in the vendor or serial input of filament. " +"Please delete and re-enter." +msgstr "" +"Filamentin satıcı veya seri numarası girişinde kaçış karakterleri olabilir. " +"Lütfen silip tekrar giriniz." + +msgid "All inputs in the custom vendor or serial are spaces. Please re-enter." +msgstr "" +"Özel satıcı veya seri numarasındaki tüm girişler boşluklardan oluşuyor. " +"Lütfen tekrar girin." + +msgid "The vendor can not be a number. Please re-enter." +msgstr "" + +msgid "" +"You have not selected a printer or preset yet. Please select at least one." +msgstr "Henüz bir yazıcı veya ön ayar seçmediniz. Lütfen en az birini seçin." + +msgid "Some existing presets have failed to be created, as follows:\n" +msgstr "Aşağıdaki gibi bazı mevcut ön ayarlar oluşturulamadı:\n" + +msgid "" +"\n" +"Do you want to rewrite it?" +msgstr "" +"\n" +"Yeniden yazmak ister misin?" + +msgid "" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" +"To add preset for more prinetrs, Please go to printer selection" +msgstr "" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" +"To add preset for more prinetrs, Please go to printer selection" + +msgid "Create Printer/Nozzle" +msgstr "Yazıcı/Nozul Oluştur" + +msgid "Create Printer" +msgstr "Yazıcı Oluştur" + +msgid "Create Nozzle for Existing Printer" +msgstr "Mevcut Yazıcı için Nozul Oluştur" + +msgid "Create from Template" +msgstr "Şablondan oluştur" + +msgid "Create Based on Current Printer" +msgstr "Mevcut Yazıcıya Göre Oluşturun" + +msgid "wiki" +msgstr "wiki" + +msgid "Import Preset" +msgstr "Ön Ayarı İçe Aktar" + +msgid "Create Type" +msgstr "Tür Oluştur" + +msgid "The model is not fond, place reselect vendor." +msgstr "Model bulunamadı, lütfen satıcıyı seçin." + +msgid "Select Model" +msgstr "Model Seçin" + +msgid "Select Printer" +msgstr "Yazıcıyı Seçin" + +msgid "Input Custom Model" +msgstr "Özel Model Girin" + +msgid "Can't find my printer model" +msgstr "Yazıcı modelimi bulamıyorum" + +msgid "Rectangle" +msgstr "Dikdörtgen" + +msgid "Printable Space" +msgstr "Yazdırılabilir Alan" + +msgid "X" +msgstr "X" + +msgid "Y" +msgstr "Y" + +msgid "Hot Bed STL" +msgstr "Sıcak Yatak STL" + +msgid "Load stl" +msgstr "Stl'i yükle" + +msgid "Hot Bed SVG" +msgstr "Sıcak Yatak SVG" + +msgid "Load svg" +msgstr "Svg'yi yükle" + +msgid "Max Print Height" +msgstr "Maksimum Baskı Yüksekliği" + +#, c-format, boost-format +msgid "The file exceeds %d MB, please import again." +msgstr "Dosya %d MB'yi aşıyor lütfen tekrar içe aktarın." + +msgid "Exception in obtaining file size, please import again." +msgstr "Dosya boyutunun elde edilmesinde istisna, lütfen tekrar içe aktarın." + +msgid "Preset path is not find, please reselect vendor." +msgstr "Ön ayar yolu bulunamıyor, lütfen satıcıyı yeniden seçin." + +msgid "The printer model was not found, please reselect." +msgstr "Yazıcı modeli bulunamadı, lütfen yeniden seçin." + +msgid "The nozzle diameter is not fond, place reselect." +msgstr "Nozul çapı bulunamadı, lütfen yeniden seçin." + +msgid "The printer preset is not fond, place reselect." +msgstr "Yazıcı ön ayarı bulunamadı, lütfen yeniden seçin." + +msgid "Printer Preset" +msgstr "Yazıcı Ön Ayarı" + +msgid "Filament Preset Template" +msgstr "Filament Ön Ayar Şablonu" + +msgid "Deselect All" +msgstr "Hiçbirini seçme" + +msgid "Process Preset Template" +msgstr "İşleme Ön Ayarı Şablonu" + +msgid "Back Page 1" +msgstr "Arka Sayfa 1" + +msgid "" +"You have not yet chosen which printer preset to create based on. Please " +"choose the vendor and model of the printer" +msgstr "" +"Hangi yazıcı ön ayarının temel alınacağını henüz seçmediniz. Lütfen " +"yazıcının satıcısını ve modelini seçin" + +msgid "" +"You have entered an illegal input in the printable area section on the first " +"page. Please check before creating it." +msgstr "" +"İlk sayfadaki yazdırılabilir alan kısmına geçersiz bir giriş yaptınız. " +"Lütfen oluşturmadan önce kontrol edin." + +msgid "The custom printer or model is not inputed, place input." +msgstr "Özel yazıcı veya model girilmedi lütfen giriş yapın." + +msgid "" +"The printer preset you created already has a preset with the same name. Do " +"you want to overwrite it?\n" +"\tYes: Overwrite the printer preset with the same name, and filament and " +"process presets with the same preset name will be recreated \n" +"and filament and process presets without the same preset name will be " +"reserve.\n" +"\tCancel: Do not create a preset, return to the creation interface." +msgstr "" +"Oluşturduğunuz yazıcı ön ayarının zaten aynı ada sahip bir ön ayarı var. " +"Üzerine yazmak istiyor musunuz?\n" +"\tEvet: Aynı adı taşıyan yazıcı ön ayarının üzerine yazın; aynı ön ayar adı " +"taşıyan filaman ve proses ön ayarları yeniden oluşturulacak ve aynı ön " +"ayar \n" +"adı olmayan filament ve işlem ön ayarları rezerve edilecektir.\n" +"\tİptal: Ön ayar oluşturmayın, oluşturma arayüzüne dönün." + +msgid "You need to select at least one filament preset." +msgstr "En az bir filament ön ayarı seçmeniz gerekir." + +msgid "You need to select at least one process preset." +msgstr "En az bir işlem ön ayarı seçmeniz gerekir." + +msgid "Create filament presets failed. As follows:\n" +msgstr "Filament ön ayarları oluşturulamadı. Şu şekilde:\n" + +msgid "Create process presets failed. As follows:\n" +msgstr "İşlem ön ayarları oluşturulamadı. Şu şekilde:\n" + +msgid "Vendor is not find, please reselect." +msgstr "Satıcı bulunamadı, lütfen yeniden seçin." + +msgid "Current vendor has no models, please reselect." +msgstr "Mevcut satıcının modeli yok, lütfen yeniden seçin." + +msgid "" +"You have not selected the vendor and model or inputed the custom vendor and " +"model." +msgstr "Satıcıyı ve modeli seçmediniz veya özel satıcıyı ve modeli girmediniz." + +msgid "" +"There may be escape characters in the custom printer vendor or model. Please " +"delete and re-enter." +msgstr "" +"Özel yazıcı satıcısında veya modelinde kaçış karakterleri olabilir. Lütfen " +"silip tekrar giriniz." + +msgid "" +"All inputs in the custom printer vendor or model are spaces. Please re-enter." +msgstr "" +"Özel yazıcı satıcısı veya modelindeki tüm girişler boşluklardan oluşuyor. " +"Lütfen tekrar girin." + +msgid "Please check bed printable shape and origin input." +msgstr "" +"Lütfen baskı yapılabilir şekil ve başlangıç ​​noktası girişini kontrol edin." + +msgid "" +"You have not yet selected the printer to replace the nozzle, please choose." +msgstr "" +"Hala nozulu değiştirmek için yazıcı seçmediniz, lütfen bir seçim yapın." + +msgid "Create Printer Successful" +msgstr "Yazıcı Oluşturma Başarılı" + +msgid "Create Filament Successful" +msgstr "Filament Oluşturma Başarılı" + +msgid "Printer Created" +msgstr "Yazıcı Oluşturuldu" + +msgid "Please go to printer settings to edit your presets" +msgstr "Ön ayarlarınızı düzenlemek için lütfen yazıcı ayarlarına gidin" + +msgid "Filament Created" +msgstr "Filament Oluşturuldu" + +msgid "" +"Please go to filament setting to edit your presets if you need.\n" +"Please note that nozzle temperature, hot bed temperature, and maximum " +"volumetric speed have a significant impact on printing quality. Please set " +"them carefully." +msgstr "" +"İhtiyacınız olursa ön ayarlarınızı düzenlemek için lütfen filament ayarına " +"gidin.\n" +"Lütfen püskürtme ucu sıcaklığının, sıcak yatak sıcaklığının ve maksimum " +"hacimsel hızın yazdırma kalitesi üzerinde önemli bir etkiye sahip olduğunu " +"unutmayın. Lütfen bunları dikkatlice ayarlayın." + +msgid "Printer Setting" +msgstr "Yazıcı Ayarı" + +msgid "Export Configs" +msgstr "Yapılandırmaları Dışa Aktar" + +msgid "Printer config bundle(.bbscfg)" +msgstr "Yazıcı yapılandırma paketi(.bbscfg)" + +msgid "Filament bundle(.bbsflmt)" +msgstr "Filament demeti(.bbsflmt)" + +msgid "Printer presets(.zip)" +msgstr "Yazıcı ön ayarları (.zip)" + +msgid "Filament presets(.zip)" +msgstr "Filament ön ayarları (.zip)" + +msgid "Process presets(.zip)" +msgstr "İşlem ön ayarları (.zip)" + +msgid "initialize fail" +msgstr "başarısız başlatma" + +msgid "add file fail" +msgstr "dosya ekleme başarısız" + +msgid "add bundle structure file fail" +msgstr "paket yapısı dosyası ekle başarısız" + +msgid "finalize fail" +msgstr "Tamamlama başarısız" + +msgid "open zip written fail" +msgstr "ZIP dosyasını açma başarısız" + +msgid "Export successful" +msgstr "Dışa aktarma başarılı" + +#, c-format, boost-format +msgid "" +"The '%s' folder already exists in the current directory. Do you want to " +"clear it and rebuild it.\n" +"If not, a time suffix will be added, and you can modify the name after " +"creation." +msgstr "" +"'%s' klasörü mevcut dizinde zaten mevcut. Onu temizleyip yeniden oluşturmak " +"mı istiyorsunuz?\n" +"Değilse, bir zaman son eki eklenecektir ve oluşturulduktan sonra adı " +"değiştirebilirsiniz." + +msgid "" +"Printer and all the filament&process presets that belongs to the printer. \n" +"Can be shared with others." +msgstr "" +"Yazıcı ve yazıcıya ait tüm filament ve işlem ön ayarları. \n" +"Başkalarıyla paylaşılabilir." + +msgid "" +"User's fillment preset set. \n" +"Can be shared with others." +msgstr "" +"Kullanıcının filament ön ayarı. \n" +"Başkalarıyla paylaşılabilir." + +msgid "" +"Only display printer names with changes to printer, filament, and process " +"presets." +msgstr "" +"Yazıcı adlarını yalnızca yazıcı, filament ve işlem ön ayarlarında yapılan " +"değişikliklerle görüntüleyin." + +msgid "Only display the filament names with changes to filament presets." +msgstr "" +"Filament adlarını yalnızca filament ön ayarlarında yapılan değişikliklerle " +"görüntüleyin." + +msgid "" +"Only printer names with user printer presets will be displayed, and each " +"preset you choose will be exported as a zip." +msgstr "" +"Yalnızca kullanıcı yazıcı ön ayarlarına sahip yazıcı adları görüntülenecek " +"ve seçtiğiniz her ön ayar zip olarak dışa aktarılacaktır." + +msgid "" +"Only the filament names with user filament presets will be displayed, \n" +"and all user filament presets in each filament name you select will be " +"exported as a zip." +msgstr "" +"Yalnızca kullanıcı filamenti ön ayarlarına sahip filament adları \n" +"görüntülenecek ve seçtiğiniz her filament adındaki tüm kullanıcı filamenti " +"ön ayarları zip olarak dışa aktarılacaktır." + +msgid "" +"Only printer names with changed process presets will be displayed, \n" +"and all user process presets in each printer name you select will be " +"exported as a zip." +msgstr "" +"Yalnızca işlem ön ayarları değiştirilen yazıcı adları görüntülenecek \n" +"ve seçtiğiniz her yazıcı adındaki tüm kullanıcı işlem ön ayarları zip olarak " +"dışa aktarılacaktır." + +msgid "Please select at least one printer or filament." +msgstr "Lütfen en az bir yazıcı veya filament seçin." + +msgid "Please select a type you want to export" +msgstr "Lütfen dışa aktarmak istediğiniz türü seçin" + +msgid "Edit Filament" +msgstr "Filamenti Düzenle" + +msgid "Filament presets under this filament" +msgstr "Bu filamentin altındaki filament ön ayarları" + +msgid "" +"Note: If the only preset under this filament is deleted, the filament will " +"be deleted after exiting the dialog." +msgstr "" +"Not: Bu filamentin altındaki tek ön ayar silinirse, diyalogdan çıkıldıktan " +"sonra filament silinecektir." + +msgid "Presets inherited by other presets can not be deleted" +msgstr "Diğer ön ayarlar tarafından devralınan ön ayarlar silinemez" + +msgid "The following presets inherits this preset." +msgid_plural "The following preset inherits this preset." +msgstr[0] "Aşağıdaki ön ayarlar bu ön ayarı devralır." +msgstr[1] "Aşağıdaki ön ayar bu ön ayarı devralır." + +msgid "Delete Preset" +msgstr "Ön Ayarı Sil" + +msgid "Are you sure to delete the selected preset?" +msgstr "Seçilen ön ayarı sildiğinizden emin misiniz?" + +msgid "Delete preset" +msgstr "Ön ayarı sil" + +msgid "+ Add Preset" +msgstr "+ Ön Ayar Ekle" + +msgid "Delete Filament" +msgstr "Filamenti Sil" + +msgid "" +"All the filament presets belong to this filament would be deleted. \n" +"If you are using this filament on your printer, please reset the filament " +"information for that slot." +msgstr "" +"Bu filamente ait tüm filaman ön ayarları silinecektir. \n" +"Yazıcınızda bu filamenti kullanıyorsanız lütfen o yuvanın filament bilgisini " +"sıfırlayın." + +msgid "Delete filament" +msgstr "Filamenti sil" + +msgid "Add Preset" +msgstr "Ön Ayar Ekle" + +msgid "Add preset for new printer" +msgstr "Yeni yazıcı için ön ayar ekleyin" + +msgid "Copy preset from filament" +msgstr "Ön ayarı filamentten kopyala" + +msgid "The filament choice not find filament preset, please reselect it" +msgstr "Filament seçimi filament ön ayarını bulamıyor, lütfen yeniden seçin" + +msgid "Edit Preset" +msgstr "Ön Ayarı Düzenle" + +msgid "For more information, please check out Wiki" +msgstr "Daha fazla bilgi için lütfen Wiki'ye göz atın" + +msgid "Collapse" +msgstr "Çökme" + +msgid "Daily Tips" +msgstr "Günlük İpuçları" + +msgid "Need select printer" +msgstr "Yazıcı seçmeniz gerekiyor" + +msgid "The start, end or step is not valid value." +msgstr "Başlangıç, bitiş veya adım geçerli bir değer değildir." + +msgid "" +"Unable to calibrate: maybe because the set calibration value range is too " +"large, or the step is too small" +msgstr "" +"Kalibre edilemiyor: ayarlanan kalibrasyon değeri aralığı çok büyük veya adım " +"çok küçük olduğu için olabilir" + +msgid "Physical Printer" +msgstr "Fiziksel Yazıcı" + +msgid "Print Host upload" +msgstr "Yazıcı Bağlantı Ayarları" + +msgid "Could not get a valid Printer Host reference" +msgstr "Geçerli bir Yazıcı Ana Bilgisayarı referansı alınamadı" + +msgid "Success!" +msgstr "Başarılı!" + +msgid "Refresh Printers" +msgstr "Yazıcıları Yenile" + +msgid "" +"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" +"signed certificate." +msgstr "" +"HTTPS CA dosyası isteğe bağlıdır. Yalnızca HTTPS'yi kendinden imzalı bir " +"sertifikayla kullanıyorsanız gereklidir." + +msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" +msgstr "Sertifika dosyaları (*.crt, *.pem)|*.crt;*.pem|Tüm dosyalar|*.*" + +msgid "Open CA certificate file" +msgstr "CA sertifika dosyasını aç" + +#, c-format, boost-format +msgid "" +"On this system, %s uses HTTPS certificates from the system Certificate Store " +"or Keychain." +msgstr "" +"Bu sistemde %s, sistem Sertifika Deposu veya Anahtar Zincirinden alınan " +"HTTPS sertifikalarını kullanıyor." + +msgid "" +"To use a custom CA file, please import your CA file into Certificate Store / " +"Keychain." +msgstr "" +"Özel bir CA dosyası kullanmak için lütfen CA dosyanızı Sertifika Deposuna/" +"Anahtarlığa aktarın." + +msgid "Connection to printers connected via the print host failed." +msgstr "" +"Yazdırma ana bilgisayarı aracılığıyla bağlanan yazıcılara bağlantı başarısız " +"oldu." + +#, c-format, boost-format +msgid "Mismatched type of print host: %s" +msgstr "Eşleşmeyen yazdırma ana bilgisayarı türü: %s" + +msgid "Connection to AstroBox works correctly." +msgstr "AstroBox'a bağlantı düzgün çalışıyor." + +msgid "Could not connect to AstroBox" +msgstr "AstroBox'a bağlanılamadı" + +msgid "Note: AstroBox version at least 1.1.0 is required." +msgstr "Not: AstroBox sürümünün en az 1.1.0 olması gerekmektedir." + +msgid "Connection to Duet works correctly." +msgstr "Duet'e bağlantı düzgün çalışıyor." + +msgid "Could not connect to Duet" +msgstr "Duet'e bağlanılamadı" + +msgid "Unknown error occured" +msgstr "Bilinmeyen hata oluştu" + +msgid "Wrong password" +msgstr "Wrong password" + +msgid "Could not get resources to create a new connection" +msgstr "Yeni bir bağlantı oluşturmak için kaynaklar alınamadı" + +msgid "Upload not enabled on FlashAir card." +msgstr "FlashAir kartında yükleme etkin değil." + +msgid "Connection to FlashAir works correctly and upload is enabled." +msgstr "FlashAir bağlantısı düzgün çalışıyor ve yükleme etkin." + +msgid "Could not connect to FlashAir" +msgstr "FlashAir'e bağlanılamadı" + +msgid "" +"Note: FlashAir with firmware 2.00.02 or newer and activated upload function " +"is required." +msgstr "" +"Not: Firmware 2.00.02 veya daha yeni ve etkinleştirilmiş yükleme işlevine " +"sahip FlashAir gereklidir." + +msgid "Connection to MKS works correctly." +msgstr "MKS'ye bağlantı düzgün çalışıyor." + +msgid "Could not connect to MKS" +msgstr "MKS'ye bağlanılamadı" + +msgid "Connection to OctoPrint works correctly." +msgstr "OctoPrint'e bağlantı düzgün çalışıyor." + +msgid "Could not connect to OctoPrint" +msgstr "OctoPrint'e bağlanılamadı" + +msgid "Note: OctoPrint version at least 1.1.0 is required." +msgstr "Not: OctoPrint sürümü en az 1.1.0 gereklidir." + +msgid "Connection to Prusa SL1 / SL1S works correctly." +msgstr "Prusa SL1 / SL1S bağlantısı düzgün çalışıyor." + +msgid "Could not connect to Prusa SLA" +msgstr "Prusa SLA'ya bağlanılamadı" + +msgid "Connection to PrusaLink works correctly." +msgstr "PrusaLink'e bağlantı düzgün çalışıyor." + +msgid "Could not connect to PrusaLink" +msgstr "PrusaLink'e bağlanılamadı" + +msgid "Storages found" +msgstr "Depolar bulundu" + +#. TRN %1% = storage path +#, boost-format +msgid "%1% : read only" +msgstr "%1% : sadece okuma" + +#. TRN %1% = storage path +#, boost-format +msgid "%1% : no free space" +msgstr "%1% : boş alan yok" + +#. TRN %1% = host +#, boost-format +msgid "Upload has failed. There is no suitable storage found at %1%." +msgstr "Yükleme başarısız oldu. %1%'de uygun depolama alanı bulunamadı." + +msgid "Connection to Prusa Connect works correctly." +msgstr "Prusa Connect'e bağlantı düzgün çalışıyor." + +msgid "Could not connect to Prusa Connect" +msgstr "Prusa Connect'e bağlanılamadı" + +msgid "Connection to Repetier works correctly." +msgstr "Repetier'e bağlantı düzgün çalışıyor." + +msgid "Could not connect to Repetier" +msgstr "Repetier'a bağlanılamadı" + +msgid "Note: Repetier version at least 0.90.0 is required." +msgstr "Not: Repetier sürümü en az 0.90.0 gereklidir." + +#, boost-format +msgid "" +"HTTP status: %1%\n" +"Message body: \"%2%\"" +msgstr "" +"HTTP durumu: %1%\n" +"Mesaj gövdesi: \"%2%\"" + +#, boost-format +msgid "" +"Parsing of host response failed.\n" +"Message body: \"%1%\"\n" +"Error: \"%2%\"" +msgstr "" +"Ana bilgisayar yanıtının ayrıştırılması başarısız oldu.\n" +"Mesaj gövdesi: \"%1%\"\n" +"Hata: \"%2%\"" + +#, boost-format +msgid "" +"Enumeration of host printers failed.\n" +"Message body: \"%1%\"\n" +"Error: \"%2%\"" +msgstr "" +"Ana yazıcıların numaralandırılması başarısız oldu.\n" +"Mesaj gövdesi: \"%1%\"\n" +"Hata: \"%2%\"" + +#: resources/data/hints.ini: [hint:Precise wall] +msgid "" +"Precise wall\n" +"Did you know that turning on precise wall can improve precision and layer " +"consistency?" +msgstr "" +"Hassas duvar\n" +"Hassas duvarı açmanın hassasiyeti ve katman tutarlılığını artırabileceğini " +"biliyor muydunuz?" + +#: resources/data/hints.ini: [hint:Sandwich mode] +msgid "" +"Sandwich mode\n" +"Did you know that you can use sandwich mode (inner-outer-inner) to improve " +"precision and layer consistency if your model doesn't have very steep " +"overhangs?" +msgstr "" +"Sandviç modu\n" +"Modelinizde çok dik çıkıntılar yoksa hassasiyeti ve katman tutarlılığını " +"artırmak için sandviç modunu (iç-dış-iç) kullanabileceğinizi biliyor " +"muydunuz?" + +#: resources/data/hints.ini: [hint:Chamber temperature] +msgid "" +"Chamber temperature\n" +"Did you know that OrcaSlicer supports chamber temperature?" +msgstr "" +"Oda sıcaklığı\n" +"OrcaSlicer'ın hazne sıcaklığını desteklediğini biliyor muydunuz?" + +#: resources/data/hints.ini: [hint:Calibration] +msgid "" +"Calibration\n" +"Did you know that calibrating your printer can do wonders? Check out our " +"beloved calibration solution in OrcaSlicer." +msgstr "" +"Kalibrasyon\n" +"Yazıcınızı kalibre etmenin harikalar yaratabileceğini biliyor muydunuz? " +"OrcaSlicer'daki sevilen kalibrasyon çözümümüze göz atın." + +#: resources/data/hints.ini: [hint:Auxiliary fan] +msgid "" +"Auxiliary fan\n" +"Did you know that OrcaSlicer supports Auxiliary part cooling fan?" +msgstr "" +"Yardımcı fan\n" +"OrcaSlicer'ın Yardımcı parça soğutma fanını desteklediğini biliyor muydunuz?" + +#: resources/data/hints.ini: [hint:Air filtration] +msgid "" +"Air filtration/Exhuast Fan\n" +"Did you know that OrcaSlicer can support Air filtration/Exhuast Fan?" +msgstr "" +"Hava filtreleme/Egzoz Fanı\n" +"OrcaSlicer'ın Hava filtreleme/Egzoz Fanını destekleyebileceğini biliyor " +"muydunuz?" + #: resources/data/hints.ini: [hint:How to use keyboard shortcuts] msgid "" "How to use keyboard shortcuts\n" @@ -12193,9 +13267,6 @@ msgid "" "Did you know that you can cut a model at any angle and position with the " "cutting tool?" msgstr "" -"Kesme Aleti\n" -"Kesici aletle bir modeli istediğiniz açıda ve konumda kesebileceğinizi " -"biliyor muydunuz?" #: resources/data/hints.ini: [hint:Fix Model] msgid "" @@ -12209,17 +13280,12 @@ msgid "" "Timelapse\n" "Did you know that you can generate a timelapse video during each print?" msgstr "" -"Hızlandırılmış\n" -"Her baskı sırasında timelapse video oluşturabileceğinizi biliyor muydunuz?" #: resources/data/hints.ini: [hint:Auto-Arrange] msgid "" "Auto-Arrange\n" "Did you know that you can auto-arrange all objects in your project?" msgstr "" -"Otomatik düzenleme\n" -"Projenizdeki tüm nesneleri otomatik olarak düzenleyebileceğinizi biliyor " -"muydunuz?" #: resources/data/hints.ini: [hint:Auto-Orient] msgid "" @@ -12227,9 +13293,6 @@ msgid "" "Did you know that you can rotate objects to an optimal orientation for " "printing by a simple click?" msgstr "" -"Otomatik Yönlendirme\n" -"Basit bir tıklamayla nesneleri yazdırma için en uygun yöne " -"döndürebileceğinizi biliyor muydunuz?" #: resources/data/hints.ini: [hint:Lay on Face] msgid "" @@ -12259,18 +13322,20 @@ msgid "" "Did you know that you use the Search tool to quickly find a specific Orca " "Slicer setting?" msgstr "" +"Arama İşlevselliği\n" +"Belirli bir Orca Dilimleyici ayarını hızla bulmak için Arama aracını " +"kullandığınızı biliyor muydunuz?" #: resources/data/hints.ini: [hint:Simplify Model] msgid "" "Simplify Model\n" "Did you know that you can reduce the number of triangles in a mesh using the " -"Simplify mesh feature? Right-click the model and select Simplify model. Read " -"more in the documentation." +"Simplify mesh feature? Right-click the model and select Simplify model." msgstr "" "Modeli Basitleştir\n" "Mesh basitleştirme özelliğini kullanarak bir ağdaki üçgen sayısını " "azaltabileceğinizi biliyor muydunuz? Modele sağ tıklayın ve Modeli " -"basitleştir'i seçin. Daha fazlasını belgelerde okuyun." +"basitleştir'i seçin." #: resources/data/hints.ini: [hint:Slicing Parameter Table] msgid "" @@ -12297,13 +13362,12 @@ msgid "" "Subtract a Part\n" "Did you know that you can subtract one mesh from another using the Negative " "part modifier? That way you can, for example, create easily resizable holes " -"directly in Orca Slicer. Read more in the documentation." +"directly in Orca Slicer." msgstr "" "Bir Parçayı Çıkar\n" "Negatif parça değiştiriciyi kullanarak bir ağı diğerinden çıkarabileceğinizi " "biliyor muydunuz? Bu şekilde örneğin doğrudan Orca Slicer'da kolayca yeniden " -"boyutlandırılabilen delikler oluşturabilirsiniz. Daha fazlasını belgelerde " -"okuyun." +"boyutlandırılabilen delikler oluşturabilirsiniz." #: resources/data/hints.ini: [hint:STEP] msgid "" @@ -12362,9 +13426,6 @@ msgid "" "Did you know that you can print a model even faster, by using the Adaptive " "Layer Height option? Check it out!" msgstr "" -"Uyarlanabilir Katman Yüksekliği ile baskınızı hızlandırın\n" -"Uyarlanabilir Katman Yüksekliği seçeneğini kullanarak bir modeli daha da " -"hızlı yazdırabileceğinizi biliyor muydunuz? Buna bir bak!" #: resources/data/hints.ini: [hint:Support painting] msgid "" @@ -12397,10 +13458,6 @@ msgid "" "successfully? Higher temperature and lower speed are always recommended for " "the best results." msgstr "" -"İpek Filament Baskı\n" -"İpek filamentin başarılı bir şekilde basılabilmesi için özel dikkat " -"gösterilmesi gerektiğini biliyor muydunuz? En iyi sonuçlar için her zaman " -"daha yüksek sıcaklık ve daha düşük hız önerilir." #: resources/data/hints.ini: [hint:Brim for better adhesion] msgid "" @@ -12458,6 +13515,11 @@ msgid "" "extruder/hotend clogging when printing lower temperature filament with a " "higher enclosure temperature. More info about this in the Wiki." msgstr "" +"Yazıcı kapısı açıkken yazdırmanız gerektiğinde\n" +"Yazıcı kapısının açılmasının, daha yüksek muhafaza sıcaklığıyla daha düşük " +"sıcaklıktaki filamenti yazdırırken ekstrüder/sıcak ucun tıkanma olasılığını " +"azaltabileceğini biliyor muydunuz? Bununla ilgili daha fazla bilgiyi Wiki'de " +"bulabilirsiniz." #: resources/data/hints.ini: [hint:Avoid warping] msgid "" @@ -12466,6 +13528,157 @@ msgid "" "ABS, appropriately increasing the heatbed temperature can reduce the " "probability of warping." msgstr "" +"Eğilmeyi önleyin\n" +"ABS gibi bükülmeye yatkın malzemelere baskı yaparken, ısıtma yatağı " +"sıcaklığının uygun şekilde arttırılmasının bükülme olasılığını " +"azaltabileceğini biliyor muydunuz?" + +#~ msgid "" +#~ "The printer timed out while receiving a print job. Please check if the " +#~ "network is functioning properly and send the print again." +#~ msgstr "" +#~ "Yazıcı bir yazdırma işi alırken zaman aşımına uğradı. Lütfen ağ " +#~ "bağlantısının düzgün çalışıp çalışmadığını kontrol edin ve baskıyı tekrar " +#~ "gönderin." + +#~ msgid "The beginning of the vendor can not be a number. Please re-enter." +#~ msgstr "Satıcının başlangıcı sayı olamaz. Lütfen tekrar girin." + +#~ msgid "Edit Text" +#~ msgstr "Metni düzenle" + +#~ msgid "Error! Unable to create thread!" +#~ msgstr "Hata! Konu oluşturulamıyor!" + +#~ msgid "Exception" +#~ msgstr "Hata" + +#~ msgid "Choose SLA archive:" +#~ msgstr "SLA arşivini seçin:" + +#~ msgid "Import file" +#~ msgstr "Dosyayı içe aktar" + +#~ msgid "Import model and profile" +#~ msgstr "Modeli ve profili içe aktar" + +#~ msgid "Import profile only" +#~ msgstr "Yalnızca profili içe aktar" + +#~ msgid "Import model only" +#~ msgstr "Yalnızca modeli içe aktar" + +#~ msgid "Accurate" +#~ msgstr "Doğru" + +#~ msgid "Balanced" +#~ msgstr "Dengeli" + +#~ msgid "Quick" +#~ msgstr "Hızlı" + +#~ msgid "Auto-Calc" +#~ msgstr "Otomatik Hesaplama" + +#~ msgid "Re-calculate" +#~ msgstr "Tekrar Hesaplama" + +#~ msgid "" +#~ "Studio would re-calculate your flushing volumes everytime the filaments " +#~ "color changed. You could disable the auto-calculate in Bambu Studio > " +#~ "Preferences" +#~ msgstr "" +#~ "Studio, filamentlerin rengi her değiştiğinde yıkama hacimlerinizi yeniden " +#~ "hesaplar. Otomatik hesaplamayı Bambu Studio > Tercihler bölümünden devre " +#~ "dışı bırakabilirsiniz." + +#~ msgid "unloaded" +#~ msgstr "boşaltılmış" + +#~ msgid "loaded" +#~ msgstr "yüklenmiş" + +#~ msgid "Filament #" +#~ msgstr "Filament #" + +#~ msgid "Print sequence of inner wall and outer wall. " +#~ msgstr "İç duvar ve dış duvarın yazdırma sırası." + +#~ msgid "Order of wall/infill. false means print wall first. " +#~ msgstr "Duvar/dolgu sırası. kapalı önce duvarı yazdır anlamına gelir." + +#~ msgid "" +#~ "Discribe how long the nozzle will move along the last path when retracting" +#~ msgstr "" +#~ "Geri çekme esnasında nozulun son hat boyunca ne kadar süre hareket " +#~ "edeceğini belirtin" + +#~ msgid "" +#~ "Simplify Model\n" +#~ "Did you know that you can reduce the number of triangles in a mesh using " +#~ "the Simplify mesh feature? Right-click the model and select Simplify " +#~ "model. Read more in the documentation." +#~ msgstr "" +#~ "Modeli Basitleştir\n" +#~ "Mesh basitleştirme özelliğini kullanarak bir ağdaki üçgen sayısını " +#~ "azaltabileceğinizi biliyor muydunuz? Modele sağ tıklayın ve Modeli " +#~ "basitleştir'i seçin. Daha fazlasını belgelerde okuyun." + +#~ msgid "" +#~ "Subtract a Part\n" +#~ "Did you know that you can subtract one mesh from another using the " +#~ "Negative part modifier? That way you can, for example, create easily " +#~ "resizable holes directly in Orca Slicer. Read more in the documentation." +#~ msgstr "" +#~ "Bir Parçayı Çıkar\n" +#~ "Negatif parça değiştiriciyi kullanarak bir ağı diğerinden " +#~ "çıkarabileceğinizi biliyor muydunuz? Bu şekilde örneğin doğrudan Orca " +#~ "Slicer'da kolayca yeniden boyutlandırılabilen delikler " +#~ "oluşturabilirsiniz. Daha fazlasını belgelerde okuyun." + +#~ msgid "Filling bed " +#~ msgstr "Yatak doldurma " + +#, boost-format +#~ msgid "%1% infill pattern doesn't support 100%% density." +#~ msgstr "%1% dolgu deseni 100%% yoğunluğu desteklemiyor." + +#~ msgid "" +#~ "Switch to rectilinear pattern?\n" +#~ "Yes - switch to rectilinear pattern automaticlly\n" +#~ "No - reset density to default non 100% value automaticlly" +#~ msgstr "" +#~ "Doğrusal desene geçilsin mi?\n" +#~ "Evet - otomatik olarak doğrusal desene geçin\n" +#~ "Hayır - yoğunluğu otomatik olarak %100 olmayan varsayılan değere " +#~ "sıfırlayın" + +#~ msgid "Please heat the nozzle to above 170 degree before loading filament." +#~ msgstr "" +#~ "Filamenti yüklemeden önce lütfen Nozulu 170 derecenin üzerine ısıtın." + +#~ msgid "Newer 3mf version" +#~ msgstr "Daha yeni 3mf sürümü" + +#~ msgid "Show g-code window" +#~ msgstr "G kodu penceresini göster" + +#~ msgid "If enabled, g-code window will be displayed." +#~ msgstr "Etkinleştirilirse g kodu penceresi görüntülenecektir." + +#, c-format +#~ msgid "Density of internal sparse infill, 100% means solid throughout" +#~ msgstr "Density of internal sparse infill, 100% means solid throughout" + +#~ msgid "Tree support wall loops" +#~ msgstr "Ağaç desteği duvar döngüleri" + +#~ msgid "This setting specify the count of walls around tree support" +#~ msgstr "Bu ayar, ağaç desteğinin etrafındaki duvarların sayısını belirtir" + +#, c-format, boost-format +#~ msgid " doesn't work at 100%% density " +#~ msgstr " 100%% yoğunlukta çalışmıyor " #~ msgid "Ctrl + Shift + Enter" #~ msgstr "Ctrl + Üst Karakter + Enter" @@ -12488,9 +13701,6 @@ msgstr "" #~ msgid "Export all objects as STL" #~ msgstr "Tüm nesneleri STL olarak dışa aktar" -#~ msgid "Slice ok." -#~ msgstr "Dilimleme tamam." - #, c-format, boost-format #~ msgid "" #~ "The 3mf's version %s is newer than %s's version %s, Found following keys " @@ -12519,15 +13729,6 @@ msgstr "" #~ msgid "Add/Remove printers" #~ msgstr "Yazıcı Ekle/Kaldır" -#~ msgid "Bambu Engineering Plate" -#~ msgstr "Bambu Mühendislik Plakası" - -#~ msgid "Bambu Smooth PEI Plate" -#~ msgstr "Bambu Pürüzsüz PEI Plaka" - -#~ msgid "Bambu Textured PEI Plate" -#~ msgstr "Bambu Dokulu PEI Plaka" - #~ msgid "" #~ "When print by object, machines with I3 structure will not generate " #~ "timelapse videos." @@ -12736,67 +13937,6 @@ msgstr "" #~ msgid "The selected preset: %1% is not found." #~ msgstr "Seçilen ön ayar: %1% bulunamadı." -#~ msgid "Physical Printer" -#~ msgstr "Fiziksel Yazıcı" - -#~ msgid "Print Host upload" -#~ msgstr "Yazıcı Bağlantı Ayarları" - -#~ msgid "Could not get a valid Printer Host reference" -#~ msgstr "Geçerli bir Yazıcı Ana Bilgisayarı referansı alınamadı" - -#~ msgid "Success!" -#~ msgstr "Başarılı!" - -#~ msgid "Refresh Printers" -#~ msgstr "Yazıcıları Yenile" - -#~ msgid "" -#~ "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" -#~ "signed certificate." -#~ msgstr "" -#~ "HTTPS CA dosyası isteğe bağlıdır. Yalnızca HTTPS'yi kendinden imzalı bir " -#~ "sertifikayla kullanıyorsanız gereklidir." - -#~ msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" -#~ msgstr "Sertifika dosyaları (*.crt, *.pem)|*.crt;*.pem|Tüm dosyalar|*.*" - -#~ msgid "Open CA certificate file" -#~ msgstr "CA sertifika dosyasını aç" - -#, c-format, boost-format -#~ msgid "" -#~ "On this system, %s uses HTTPS certificates from the system Certificate " -#~ "Store or Keychain." -#~ msgstr "" -#~ "Bu sistemde %s, sistem Sertifika Deposu veya Anahtar Zincirinden alınan " -#~ "HTTPS sertifikalarını kullanıyor." - -#~ msgid "" -#~ "To use a custom CA file, please import your CA file into Certificate " -#~ "Store / Keychain." -#~ msgstr "" -#~ "Özel bir CA dosyası kullanmak için lütfen CA dosyanızı Sertifika Deposuna/" -#~ "Anahtarlığa aktarın." - -#~ msgid "Connection to printers connected via the print host failed." -#~ msgstr "" -#~ "Yazdırma ana bilgisayarı aracılığıyla bağlanan yazıcılara bağlantı " -#~ "başarısız oldu." - -#~ msgid "The start, end or step is not valid value." -#~ msgstr "Başlangıç, bitiş veya adım geçerli bir değer değildir." - -#~ msgid "" -#~ "Unable to calibrate: maybe because the set calibration value range is too " -#~ "large, or the step is too small" -#~ msgstr "" -#~ "Kalibre edilemiyor: ayarlanan kalibrasyon değeri aralığı çok büyük veya " -#~ "adım çok küçük olduğu için olabilir" - -#~ msgid "Need select printer" -#~ msgstr "Yazıcı seçmeniz gerekiyor" - #~ msgid "" #~ "3D Scene Operations\n" #~ "Did you know how to control view and object/part selection with mouse and " diff --git a/localization/i18n/uk/OrcaSlicer_uk.po b/localization/i18n/uk/OrcaSlicer_uk.po index 2a502898f2..06014bc408 100644 --- a/localization/i18n/uk/OrcaSlicer_uk.po +++ b/localization/i18n/uk/OrcaSlicer_uk.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-24 18:09+0100\n" +"POT-Creation-Date: 2023-12-19 22:09+0800\n" "PO-Revision-Date: 2023-08-10 20:25-0400\n" "Last-Translator: \n" "Language-Team: \n" @@ -15,8 +15,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" "X-Generator: Poedit 3.3.2\n" msgid "Supports Painting" @@ -299,6 +299,12 @@ msgstr "Виберіть усі з'єднувачі" msgid "Cut" msgstr "Вирізати" +msgid "non-mainifold edges be caused by cut tool, do you want to fix it now?" +msgstr "" + +msgid "Repairing model object" +msgstr "Відновлення об'єкта моделі" + msgid "Connector" msgstr "З'єднувач" @@ -850,6 +856,24 @@ msgstr "Додати блокувальник підтримки" msgid "Add support enforcer" msgstr "Додати засіб примусової підтримки" +msgid "Add text" +msgstr "" + +msgid "Add negative text" +msgstr "" + +msgid "Add text modifier" +msgstr "" + +msgid "Add SVG part" +msgstr "" + +msgid "Add negative SVG" +msgstr "" + +msgid "Add SVG modifier" +msgstr "" + msgid "Select settings" msgstr "Виберіть налаштування" @@ -865,9 +889,6 @@ msgstr "Видалити" msgid "Delete the selected object" msgstr "Видалити вибраний об'єкт" -msgid "Edit Text" -msgstr "Редагувати текст" - msgid "Load..." msgstr "Завантажити..." @@ -892,6 +913,12 @@ msgstr "Циліндр" msgid "Cone" msgstr "Конус" +msgid "Text" +msgstr "" + +msgid "SVG" +msgstr "" + msgid "Height range Modifier" msgstr "Модифікатор діапазону висот" @@ -1025,6 +1052,18 @@ msgstr "Дзеркально" msgid "Mirror object" msgstr "Дзеркальний об'єкт" +msgid "Edit text" +msgstr "" + +msgid "Ability to change text, font, size, ..." +msgstr "" + +msgid "Edit SVG" +msgstr "" + +msgid "Change SVG source file, projection, size, ..." +msgstr "" + msgid "Invalidate cut info" msgstr "Недійсна інформація про вирізування" @@ -1183,9 +1222,6 @@ msgstr "Клацніть значок, щоб відредагувати кол msgid "Click the icon to shift this object to the bed" msgstr "Клацніть значок, щоб перемістити цей об'єкт на столі" -msgid " search results" -msgstr "" - msgid "Loading file" msgstr "Завантаження файлу" @@ -1337,9 +1373,6 @@ msgstr "Введіть нове ім'я" msgid "Renaming" msgstr "Перейменування" -msgid "Repairing model object" -msgstr "Відновлення об'єкта моделі" - msgid "Following model object has been repaired" msgid_plural "Following model objects have been repaired" msgstr[0] "Наступний об'єкт моделі було відновлено" @@ -1673,11 +1706,6 @@ msgstr "" msgid "Arranging..." msgstr "Організація..." -msgid "" -"Arrange failed. Found some exceptions when processing object geometries." -msgstr "" -"Влаштувати не вдалося. Знайдено деякі винятки при обробці геометріїоб'єктів." - msgid "Arranging" msgstr "Організація" @@ -1693,6 +1721,11 @@ msgstr "" msgid "Arranging done." msgstr "Організація зроблена." +msgid "" +"Arrange failed. Found some exceptions when processing object geometries." +msgstr "" +"Влаштувати не вдалося. Знайдено деякі винятки при обробці геометріїоб'єктів." + #, c-format, boost-format msgid "" "Arrangement ignored the following objects which can't fit into a single " @@ -1723,7 +1756,10 @@ msgstr "Орієнтування..." msgid "Orienting" msgstr "Орієнтація" -msgid "Filling bed " +msgid "Orienting canceled." +msgstr "" + +msgid "Filling" msgstr "" msgid "Bed filling canceled." @@ -1732,11 +1768,14 @@ msgstr "" msgid "Bed filling done." msgstr "" -msgid "Error! Unable to create thread!" -msgstr "Помилка! Неможливо створити тему!" +msgid "Searching for optimal orientation" +msgstr "" -msgid "Exception" -msgstr "Виняток" +msgid "Orientation search canceled." +msgstr "" + +msgid "Orientation found." +msgstr "" msgid "Logging in" msgstr "Вхід до системи" @@ -1800,11 +1839,6 @@ msgstr "Надсилання завдання на друк через хмар msgid "Print task sending times out." msgstr "" -msgid "" -"The printer timed out while receiving a print job. Please check if the " -"network is functioning properly and send the print again." -msgstr "" - msgid "Service Unavailable" msgstr "Сервіс недоступний" @@ -1838,30 +1872,6 @@ msgstr "Успішно надіслано. Закрити поточну сто msgid "An SD card needs to be inserted before sending to printer." msgstr "Перед надсиланням на принтер необхідно вставити картку SD." -msgid "Choose SLA archive:" -msgstr "Виберіть архів SLA:" - -msgid "Import file" -msgstr "Імпортувати файл" - -msgid "Import model and profile" -msgstr "Імпорт моделі та профілю" - -msgid "Import profile only" -msgstr "Імпортувати лише профіль" - -msgid "Import model only" -msgstr "Тільки модель імпорту" - -msgid "Accurate" -msgstr "Точний" - -msgid "Balanced" -msgstr "Збалансований" - -msgid "Quick" -msgstr "Швидкий" - msgid "Importing SLA archive" msgstr "Імпорт архіву SLA" @@ -2615,20 +2625,6 @@ msgstr "" "ТАК - Зберегти Башту Очистки\n" "НІ - Зберегти незалежну висоту опорного шару" -#, boost-format -msgid "%1% infill pattern doesn't support 100%% density." -msgstr "Шаблон заповнення %1% не підтримує щільність 100%%." - -msgid "" -"Switch to rectilinear pattern?\n" -"Yes - switch to rectilinear pattern automaticlly\n" -"No - reset density to default non 100% value automaticlly" -msgstr "" -"Переключити на прямолінійний шаблон?\n" -"Так - автоматично перемикатися на прямолінійний шаблон\n" -"Ні - автоматично скинути щільність до значення за замовчуванням, " -"відмінноговід 100%" - msgid "" "While printing by Object, the extruder may collide skirt.\n" "Thus, reset the skirt layer to 1 to avoid that." @@ -2729,6 +2725,18 @@ msgstr "" msgid "Motor noise showoff" msgstr "" +msgid "Nozzle filament covered detected pause" +msgstr "" + +msgid "Cutter error pause" +msgstr "" + +msgid "First layer error pause" +msgstr "" + +msgid "Nozzle clog pause" +msgstr "" + msgid "MC" msgstr "MC" @@ -3191,7 +3199,7 @@ msgstr "Об'єм:" msgid "Size:" msgstr "Розмір:" -#, boost-format +#, c-format, boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -3569,6 +3577,18 @@ msgstr "Використовуйте вигляд у перспективі" msgid "Use Orthogonal View" msgstr "Використовувати ортогональний вигляд" +msgid "Show &G-code Window" +msgstr "" + +msgid "Show g-code window in Previce scene" +msgstr "" + +msgid "Reset Window Layout" +msgstr "" + +msgid "Reset to default window layout" +msgstr "" + msgid "Show &Labels" msgstr "Показати &Ярлики" @@ -3955,6 +3975,9 @@ msgstr "Завантаження %d%%..." msgid "Connection lost. Please retry." msgstr "" +msgid "The device cannot handle more conversations. Please retry later." +msgstr "" + msgid "File not exists." msgstr "" @@ -4110,10 +4133,10 @@ msgstr "Шар: %s" msgid "Layer: %d/%d" msgstr "Шар: %d/%d" -msgid "Please heat the nozzle to above 170 degree before loading filament." +msgid "" +"Please heat the nozzle to above 170 degree before loading or unloading " +"filament." msgstr "" -"Будь ласка, нагрійте сопло до температури вище 170 градусів перед " -"завантаженням нитки." msgid "Still unload" msgstr "Ще розвантажити" @@ -4464,7 +4487,7 @@ msgstr "Автоматичне відновлення після втрати к msgid "Allow Prompt Sound" msgstr "" -msgid "Fliament Tangle Detect" +msgid "Filament Tangle Detect" msgstr "" msgid "Global" @@ -4648,6 +4671,12 @@ msgid "" "It is recommended to change to smooth mode." msgstr "" +msgid "Expand sidebar" +msgstr "" + +msgid "Collapse sidebar" +msgstr "" + #, c-format, boost-format msgid "Loading file: %s" msgstr "Завантаження файлу: %s" @@ -4665,31 +4694,6 @@ msgid "The 3mf is generated by old Orca Slicer, load geometry data only." msgstr "" "3mf генерується старим слайсером Orca, завантажувати лише дані геометрії." -#, c-format, boost-format -msgid "This slicer file version %s is newer than %s's version:" -msgstr "" - -msgid "" -"Would you like to update your Bambu Studio software to enable all " -"functionality in this slicer file?\n" -msgstr "" - -msgid "Newer 3mf version" -msgstr "Нова версія 3mf" - -msgid "" -"you can always update Bambu Studio at your convenience. The slicer file will " -"now be loaded without full functionality." -msgstr "" - -#, c-format, boost-format -msgid "" -"This slicer file version %s is newer than %s's version.\n" -"\n" -"Would you like to update your Bambu Studio software to enable all " -"functionality in this slicer file?" -msgstr "" - msgid "Invalid values found in the 3mf:" msgstr "У 3mf знайдено неприпустимі значення:" @@ -4925,6 +4929,9 @@ msgid "" "import it." msgstr "" +msgid "Import SLA archive" +msgstr "" + msgid "The selected file" msgstr "Вибраний файл" @@ -5004,6 +5011,15 @@ msgid "" "will be exported." msgstr "" +msgid "" +"Are you sure you want to store original SVGs with their local paths into the " +"3MF file?\n" +"If you hit 'NO', all SVGs in the project will not be editable any more." +msgstr "" + +msgid "Private protection" +msgstr "" + msgid "Is the printer ready? Is the print sheet in place, empty and clean?" msgstr "" @@ -5028,6 +5044,9 @@ msgid "Custom supports and color painting were removed before repairing." msgstr "" "Нестандартні опори та кольорове забарвлення були видалені перед ремонтом." +msgid "Optimize Rotation" +msgstr "" + msgid "Invalid number" msgstr "Неправильний номер" @@ -5190,12 +5209,6 @@ msgstr "Показувати повідомлення \"Рада дня\" піс msgid "If enabled, useful hints are displayed at startup." msgstr "Якщо увімкнено, під час запуску відображаються корисні підказки." -msgid "Show g-code window" -msgstr "Показати вікно g-коду" - -msgid "If enabled, g-code window will be displayed." -msgstr "Якщо увімкнено, з'явиться вікно g-коду." - msgid "Flushing volumes: Auto-calculate everytime the color changed." msgstr "" @@ -5496,7 +5509,7 @@ msgstr "Зберегти %s як" msgid "User Preset" msgstr "Установка користувача" -msgid "Project Inside Preset" +msgid "Preset Inside Project" msgstr "Налаштування проекту всередині" msgid "Name is invalid;" @@ -5570,6 +5583,9 @@ msgstr "Завдання скасовано" msgid "(LAN)" msgstr "(LAN)" +msgid "Search" +msgstr "" + msgid "My Device" msgstr "Мій пристрій" @@ -5600,16 +5616,16 @@ msgstr "Холодний стіл" msgid "PLA Plate" msgstr "" -msgid "Bamabu Engineering Plate" +msgid "Bambu Engineering Plate" msgstr "Інженерний стіл" -msgid "Bamabu Smooth PEI Plate" +msgid "Bambu Smooth PEI Plate" msgstr "" msgid "High temperature Plate" msgstr "" -msgid "Bamabu Textured PEI Plate" +msgid "Bambu Textured PEI Plate" msgstr "" msgid "Send print job to" @@ -5832,6 +5848,12 @@ msgstr "" msgid "The printer does not support sending to printer SD card." msgstr "Принтер не підтримує надсилання на картку SD принтера." +msgid "Slice ok." +msgstr "Нарізка прибл." + +msgid "View all Daily tips" +msgstr "" + msgid "Failed to create socket" msgstr "" @@ -6003,11 +6025,25 @@ msgstr "" "0 відстань між вершинами z, 0 відстань між підтримкою, концентричний малюнок " "та відключення висота незалежного опорного шару" +msgid "" +"Layer height exceeds the limit in Printer Settings -> Extruder -> Layer " +"height limits ,this may cause printing quality issues." +msgstr "" + +msgid "Adjust to the set range automatically? \n" +msgstr "" + +msgid "Adjust" +msgstr "" + +msgid "Ignore" +msgstr "" + msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" "При записі таймлапсу без інструментальної головки рекомендується додати " "“Timelapse Wipe Tower” \n" @@ -6026,6 +6062,15 @@ msgstr "Точність" msgid "Wall generator" msgstr "Генерація периметрів" +msgid "Walls and surfaces" +msgstr "" + +msgid "Bridging" +msgstr "" + +msgid "Overhangs" +msgstr "" + msgid "Walls" msgstr "Периметр" @@ -6375,6 +6420,12 @@ msgstr[0] "Наступне попереднє встановлення тако msgstr[1] "Наступні стилі також будуть видалені." msgstr[2] "Наступні стилі також будуть видалені." +msgid "" +"Are you sure to delete the selected preset? \n" +"If the preset corresponds to a filament currently in use on your printer, " +"please reset the filament information for that slot." +msgstr "" + #, boost-format msgid "Are you sure to %1% the selected preset?" msgstr "Ви впевнені, що %1% вибраної установки?" @@ -6403,7 +6454,7 @@ msgstr "Undef" msgid "Unsaved Changes" msgstr "Незбережені зміни" -msgid "Discard or Keep changes" +msgid "Transfer or discard changes" msgstr "Відкинути або зберегти зміни" msgid "Old Value" @@ -6616,19 +6667,15 @@ msgstr "" msgid "Ramming line spacing" msgstr "" -msgid "Auto-Calc" -msgstr "Автокалькулятор" - -msgid "Re-calculate" +msgid "Recalculate" msgstr "" msgid "Flushing volumes for filament change" msgstr "Обсяги промивання для зміни Філаменту" msgid "" -"Studio would re-calculate your flushing volumes everytime the filaments " -"color changed. You could disable the auto-calculate in Bambu Studio > " -"Preferences" +"Orca recalculates your flushing volumes everytime the filament colors " +"change. You can change this behavior in Preferences." msgstr "" msgid "Flushing volume (mm³) for each filament pair." @@ -6645,15 +6692,6 @@ msgstr "Множина повинна знаходитися в діапазон msgid "Multiplier" msgstr "Множина" -msgid "unloaded" -msgstr "вивантажено" - -msgid "loaded" -msgstr "завантажено" - -msgid "Filament #" -msgstr "Філамент #" - msgid "From" msgstr "Від" @@ -7019,6 +7057,9 @@ msgstr "Друк" msgid "Idle" msgstr "Холостий хід" +msgid "Beta version" +msgstr "" + msgid "Latest version" msgstr "Остання версія" @@ -7386,6 +7427,25 @@ msgstr "" msgid "Variable layer height is not supported with Organic supports." msgstr "" +msgid "" +"Different nozzle diameters and different filament diameters is not allowed " +"when prime tower is enabled." +msgstr "" + +msgid "" +"The Wipe Tower is currently only supported with the relative extruder " +"addressing (use_relative_e_distances=1)." +msgstr "" + +msgid "" +"Ooze prevention is currently not supported with the prime tower enabled." +msgstr "" + +msgid "" +"The prime tower is currently only supported for the Marlin, RepRap/Sprinter, " +"RepRapFirmware and Repetier G-code flavors." +msgstr "" + msgid "The prime tower is not supported in \"By object\" print." msgstr "Під час друку \"По об'єкту\" праймер не підтримується." @@ -7457,11 +7517,6 @@ msgstr "" msgid "Layer height cannot exceed nozzle diameter" msgstr "Висота шару не може перевищувати діаметр сопла" -msgid "" -"Layer height cannot exceed the limit in Printer Settings -> Extruder -> " -"Layer height limits" -msgstr "" - msgid "" "Relative extruder addressing requires resetting the extruder position at " "each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to " @@ -7550,6 +7605,12 @@ msgstr "Висота друку" msgid "Maximum printable height which is limited by mechanism of printer" msgstr "Максимальна висота друку, яка обмежена механізмом принтера" +msgid "Preferred orientation" +msgstr "" + +msgid "Automatically orient stls on the Z-axis upon initial import" +msgstr "" + msgid "Printer preset names" msgstr "Імена налаштувань принтера" @@ -7829,7 +7890,7 @@ msgstr "" "Щільність зовнішніх мостів. 100% означає суцільний міст. Значення по за " "замовчуванням - 100%." -msgid "Bridge flow" +msgid "Bridge flow ratio" msgstr "Потік мосту" msgid "" @@ -7839,6 +7900,15 @@ msgstr "" "Трохи зменшіть це значення (наприклад, 0.9), щоб зменшити кількість " "матеріалу для мосту, щоб покращити провисання" +msgid "Internal bridge flow ratio" +msgstr "" + +msgid "" +"This value governs the thickness of the internal bridge layer. This is the " +"first layer over sparse infill. Decrease this value slightly (for example " +"0.9) to improve surface quality over sparse infill." +msgstr "" + msgid "Top surface flow ratio" msgstr "Коефіцієнт потоку верхньої поверхні" @@ -8161,6 +8231,15 @@ msgstr "" "великівідстань, але можуть виглядати гірше. Якщо відключити, мости " "виглядають краще,Але надійні лише для більш коротких мостових відстаней." +msgid "Thick internal bridges" +msgstr "" + +msgid "" +"If enabled, thick internal bridges will be used. It's usually recommended to " +"have this feature turned on. However, consider turning it off if you are " +"using large nozzles." +msgstr "" + msgid "Max bridge length" msgstr "Максимальна довжина мосту" @@ -8240,7 +8319,7 @@ msgid "Internal solid infill pattern" msgstr "" msgid "" -"Line pattern of internal solid infill. if the detect nattow internal solid " +"Line pattern of internal solid infill. if the detect narrow internal solid " "infill be enabled, the concentric pattern will be used for the small area." msgstr "" @@ -8281,25 +8360,55 @@ msgstr "" "При цьому встановлюється поріг для невеликої довжини периметра. Порігове за " "замовчуванням - 0 мм" -msgid "Order of walls" +msgid "Walls printing order" msgstr "" -msgid "Print sequence of inner wall and outer wall. " +msgid "" +"Print sequence of the internal (inner) and external (outer) walls. \n" +"\n" +"Use Inner/Outer for best overhangs. This is because the overhanging walls " +"can adhere to a neighouring perimeter while printing. However, this option " +"results in slightly reduced surface quality as the external perimeter is " +"deformed by being squashed to the internal perimeter.\n" +"\n" +"Use Inner/Outer/Inner for the best external surface finish and dimensional " +"accuracy as the external wall is printed undisturbed from an internal " +"perimeter. However, overhang performance will reduce as there is no internal " +"perimeter to print the external wall against. This option requires a minimum " +"of 3 walls to be effective as it prints the internal walls from the 3rd " +"perimeter onwards first, then the external perimeter and, finally, the first " +"internal perimeter. This option is recomended against the Outer/Inner option " +"in most cases. \n" +"\n" +"Use Outer/Inner for the same external wall quality and dimensional accuracy " +"benefits of Inner/Outer/Inner option. However, the z seams will appear less " +"consistent as the first extrusion of a new layer starts on a visible " +"surface.\n" +"\n" +" " msgstr "" -msgid "inner/outer" +msgid "Inner/Outer" msgstr "" -msgid "outer/inner" +msgid "Outer/Inner" msgstr "" -msgid "inner wall/outer wall/inner wall" +msgid "Inner/Outer/Inner" msgstr "" msgid "Print infill first" msgstr "" -msgid "Order of wall/infill. false means print wall first. " +msgid "" +"Order of wall/infill. When the tickbox is unchecked the walls are printed " +"first, which works best in most cases.\n" +"\n" +"Printing walls first may help with extreme overhangs as the walls have the " +"neighbouring infill to adhere to. However, the infill will slighly push out " +"the printed walls where it is attached to them, resulting in a worse " +"external surface finish. It can also cause the infill to shine through the " +"external surfaces of the part." msgstr "" msgid "Height to rod" @@ -8648,11 +8757,11 @@ msgstr "" msgid "Sparse infill density" msgstr "Щільність заповнення" -#, c-format -msgid "Density of internal sparse infill, 100% means solid throughout" +#, c-format, boost-format +msgid "" +"Density of internal sparse infill, 100% turns all sparse infill into solid " +"infill and internal solid infill pattern will be used" msgstr "" -"Щільність внутрішнього розрідженого заповнення, 100%% означає суцільне " -"заповнення по всій площі" msgid "Sparse infill pattern" msgstr "Малюнок заповнення" @@ -8889,10 +8998,10 @@ msgstr "Повна швидкість вентилятора на шарі" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " -"than \"close_fan_the_first_x_layers\", in which case the fan will be running " -"at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower than " +"\"close_fan_the_first_x_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." msgstr "" "Швидкість вентилятора лінійно збільшується від нуля на " "рівні«close_fan_the_first_x_layers» до максимуму на рівні " @@ -8954,6 +9063,12 @@ msgid "" msgstr "" "Середня відстань між випадковими точками, введеними на кожному відрізкулінії" +msgid "Apply fuzzy skin to first layer" +msgstr "" + +msgid "Whether to apply fuzzy skin on the first layer" +msgstr "" + msgid "Filter out tiny gaps" msgstr "Відфільтрувати крихітні зазори" @@ -9609,13 +9724,13 @@ msgid "User can self-define the project file name when export" msgstr "" "Користувач може самостійно визначити ім'я файлу проекту під час експорту" -msgid "Make overhang printable" +msgid "Make overhangs printable" msgstr "" msgid "Modify the geometry to print overhangs without support material." msgstr "" -msgid "Make overhang printable maximum angle" +msgid "Make overhangs printable - Maximum angle" msgstr "" msgid "" @@ -9624,7 +9739,7 @@ msgid "" "0 will replace all overhangs with conical material." msgstr "" -msgid "Make overhang printable hole area" +msgid "Make overhangs printable - Hole area" msgstr "" msgid "" @@ -9880,6 +9995,9 @@ msgstr "" msgid "Show auto-calibration marks" msgstr "Показати мітки автоматичного калібрування" +msgid "Disable set remaining print time" +msgstr "" + msgid "Seam position" msgstr "Положення шва" @@ -10023,6 +10141,22 @@ msgstr "" "твердотільна модель в одностінний друк із суцільними нижніми шарами.Кінічна " "згенерована модель не має шва" +msgid "Smooth Spiral" +msgstr "" + +msgid "" +"Smooth Spiral smoothes out X and Y moves as wellresulting in no visible seam " +"at all, even in the XY directions on walls that are not vertical" +msgstr "" + +msgid "Max XY Smoothing" +msgstr "" + +msgid "" +"Maximum distance to move points in XY to try to achieve a smooth spiralIf " +"expressed as a %, it will be computed over nozzle diameter" +msgstr "" + msgid "" "If smooth or traditional mode is selected, a timelapse video will be " "generated for each print. After each layer is printed, a snapshot is taken " @@ -10227,10 +10361,11 @@ msgstr "" "відсутність конкретного філаменту для опори та використання поточного " "філаменту" -msgid "No interface filament for body" +msgid "Avoid interface filament for base" msgstr "" -msgid "Don't use support interface filament to print support body" +msgid "" +"Avoid using support interface filament to print support base if possible." msgstr "" msgid "" @@ -10477,11 +10612,11 @@ msgid "" "double walls." msgstr "" -msgid "Tree support wall loops" -msgstr "Контури опорної стінки дерева" +msgid "Support wall loops" +msgstr "" -msgid "This setting specify the count of walls around tree support" -msgstr "Цей параметр визначає кількість периметрів навколо опори дерева" +msgid "This setting specify the count of walls around support" +msgstr "" msgid "Tree support with infill" msgstr "Підтримка дерева із заповненням" @@ -10596,9 +10731,16 @@ msgid "Wipe Distance" msgstr "Відстань очищення" msgid "" -"Discribe how long the nozzle will move along the last path when retracting" +"Discribe how long the nozzle will move along the last path when " +"retracting. \n" +"\n" +"Depending on how long the wipe operation lasts, how fast and long the " +"extruder/filament retraction settings are, a retraction move may be needed " +"to retract the remaining filament. \n" +"\n" +"Setting a value in the retract amount before wipe setting below will perform " +"any excess retraction before the wipe, else it will be performed after." msgstr "" -"Визначте як далеко сопло рухатиметься вздовж останнього шляху при відкаті" msgid "" "The wiping tower can be used to clean up the residue on the nozzle and " @@ -10907,10 +11049,6 @@ msgstr "" msgid "invalid value " msgstr "неправильне значення " -#, c-format, boost-format -msgid " doesn't work at 100%% density " -msgstr " не працює на 100%% щільності " - msgid "Invalid value when spiral vase mode is enabled: " msgstr "Неприпустиме значення при увімкненому режимі спіральної вази: " @@ -11767,6 +11905,727 @@ msgstr "" msgid "Delete input" msgstr "" +msgid "Network Test" +msgstr "" + +msgid "Start Test Multi-Thread" +msgstr "" + +msgid "Start Test Single-Thread" +msgstr "" + +msgid "Export Log" +msgstr "" + +msgid "Studio Version:" +msgstr "" + +msgid "System Version:" +msgstr "" + +msgid "DNS Server:" +msgstr "" + +msgid "Test BambuLab" +msgstr "" + +msgid "Test BambuLab:" +msgstr "" + +msgid "Test Bing.com" +msgstr "" + +msgid "Test bing.com:" +msgstr "" + +msgid "Test HTTP" +msgstr "" + +msgid "Test HTTP Service:" +msgstr "" + +msgid "Test storage" +msgstr "" + +msgid "Test Storage Upload:" +msgstr "" + +msgid "Test storage upgrade" +msgstr "" + +msgid "Test Storage Upgrade:" +msgstr "" + +msgid "Test storage download" +msgstr "" + +msgid "Test Storage Download:" +msgstr "" + +msgid "Test plugin download" +msgstr "" + +msgid "Test Plugin Download:" +msgstr "" + +msgid "Test Storage Upload" +msgstr "" + +msgid "Log Info" +msgstr "" + +msgid "Select filament preset" +msgstr "" + +msgid "Create Filament" +msgstr "" + +msgid "Create Based on Current Filament" +msgstr "" + +msgid "Copy Current Filament Preset " +msgstr "" + +msgid "Basic Information" +msgstr "" + +msgid "Add Filament Preset under this filament" +msgstr "" + +msgid "We could create the filament presets for your following printer:" +msgstr "" + +msgid "Select Vendor" +msgstr "" + +msgid "Input Custom Vendor" +msgstr "" + +msgid "Can't find vendor I want" +msgstr "" + +msgid "Select Type" +msgstr "" + +msgid "Select Filament Preset" +msgstr "" + +msgid "Serial" +msgstr "" + +msgid "e.g. Basic, Matte, Silk, Marble" +msgstr "" + +msgid "Filament Preset" +msgstr "" + +msgid "Create" +msgstr "" + +msgid "Vendor is not selected, please reselect vendor." +msgstr "" + +msgid "Custom vendor is not input, please input custom vendor." +msgstr "" + +msgid "" +"\"Bambu\" or \"Generic\" can not be used as a Vendor for custom filaments." +msgstr "" + +msgid "Filament type is not selected, please reselect type." +msgstr "" + +msgid "Filament serial is not inputed, please input serial." +msgstr "" + +msgid "" +"There may be escape characters in the vendor or serial input of filament. " +"Please delete and re-enter." +msgstr "" + +msgid "All inputs in the custom vendor or serial are spaces. Please re-enter." +msgstr "" + +msgid "The vendor can not be a number. Please re-enter." +msgstr "" + +msgid "" +"You have not selected a printer or preset yet. Please select at least one." +msgstr "" + +msgid "Some existing presets have failed to be created, as follows:\n" +msgstr "" + +msgid "" +"\n" +"Do you want to rewrite it?" +msgstr "" + +msgid "" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" +"To add preset for more prinetrs, Please go to printer selection" +msgstr "" + +msgid "Create Printer/Nozzle" +msgstr "" + +msgid "Create Printer" +msgstr "" + +msgid "Create Nozzle for Existing Printer" +msgstr "" + +msgid "Create from Template" +msgstr "" + +msgid "Create Based on Current Printer" +msgstr "" + +msgid "wiki" +msgstr "" + +msgid "Import Preset" +msgstr "" + +msgid "Create Type" +msgstr "" + +msgid "The model is not fond, place reselect vendor." +msgstr "" + +msgid "Select Model" +msgstr "" + +msgid "Select Printer" +msgstr "" + +msgid "Input Custom Model" +msgstr "" + +msgid "Can't find my printer model" +msgstr "" + +msgid "Rectangle" +msgstr "" + +msgid "Printable Space" +msgstr "" + +msgid "X" +msgstr "" + +msgid "Y" +msgstr "" + +msgid "Hot Bed STL" +msgstr "" + +msgid "Load stl" +msgstr "" + +msgid "Hot Bed SVG" +msgstr "" + +msgid "Load svg" +msgstr "" + +msgid "Max Print Height" +msgstr "" + +#, c-format, boost-format +msgid "The file exceeds %d MB, please import again." +msgstr "" + +msgid "Exception in obtaining file size, please import again." +msgstr "" + +msgid "Preset path is not find, please reselect vendor." +msgstr "" + +msgid "The printer model was not found, please reselect." +msgstr "" + +msgid "The nozzle diameter is not fond, place reselect." +msgstr "" + +msgid "The printer preset is not fond, place reselect." +msgstr "" + +msgid "Printer Preset" +msgstr "" + +msgid "Filament Preset Template" +msgstr "" + +msgid "Deselect All" +msgstr "" + +msgid "Process Preset Template" +msgstr "" + +msgid "Back Page 1" +msgstr "" + +msgid "" +"You have not yet chosen which printer preset to create based on. Please " +"choose the vendor and model of the printer" +msgstr "" + +msgid "" +"You have entered an illegal input in the printable area section on the first " +"page. Please check before creating it." +msgstr "" + +msgid "The custom printer or model is not inputed, place input." +msgstr "" + +msgid "" +"The printer preset you created already has a preset with the same name. Do " +"you want to overwrite it?\n" +"\tYes: Overwrite the printer preset with the same name, and filament and " +"process presets with the same preset name will be recreated \n" +"and filament and process presets without the same preset name will be " +"reserve.\n" +"\tCancel: Do not create a preset, return to the creation interface." +msgstr "" + +msgid "You need to select at least one filament preset." +msgstr "" + +msgid "You need to select at least one process preset." +msgstr "" + +msgid "Create filament presets failed. As follows:\n" +msgstr "" + +msgid "Create process presets failed. As follows:\n" +msgstr "" + +msgid "Vendor is not find, please reselect." +msgstr "" + +msgid "Current vendor has no models, please reselect." +msgstr "" + +msgid "" +"You have not selected the vendor and model or inputed the custom vendor and " +"model." +msgstr "" + +msgid "" +"There may be escape characters in the custom printer vendor or model. Please " +"delete and re-enter." +msgstr "" + +msgid "" +"All inputs in the custom printer vendor or model are spaces. Please re-enter." +msgstr "" + +msgid "Please check bed printable shape and origin input." +msgstr "" + +msgid "" +"You have not yet selected the printer to replace the nozzle, please choose." +msgstr "" + +msgid "Create Printer Successful" +msgstr "" + +msgid "Create Filament Successful" +msgstr "" + +msgid "Printer Created" +msgstr "" + +msgid "Please go to printer settings to edit your presets" +msgstr "" + +msgid "Filament Created" +msgstr "" + +msgid "" +"Please go to filament setting to edit your presets if you need.\n" +"Please note that nozzle temperature, hot bed temperature, and maximum " +"volumetric speed have a significant impact on printing quality. Please set " +"them carefully." +msgstr "" + +msgid "Printer Setting" +msgstr "" + +msgid "Export Configs" +msgstr "" + +msgid "Printer config bundle(.bbscfg)" +msgstr "" + +msgid "Filament bundle(.bbsflmt)" +msgstr "" + +msgid "Printer presets(.zip)" +msgstr "" + +msgid "Filament presets(.zip)" +msgstr "" + +msgid "Process presets(.zip)" +msgstr "" + +msgid "initialize fail" +msgstr "" + +msgid "add file fail" +msgstr "" + +msgid "add bundle structure file fail" +msgstr "" + +msgid "finalize fail" +msgstr "" + +msgid "open zip written fail" +msgstr "" + +msgid "Export successful" +msgstr "" + +#, c-format, boost-format +msgid "" +"The '%s' folder already exists in the current directory. Do you want to " +"clear it and rebuild it.\n" +"If not, a time suffix will be added, and you can modify the name after " +"creation." +msgstr "" + +msgid "" +"Printer and all the filament&process presets that belongs to the printer. \n" +"Can be shared with others." +msgstr "" + +msgid "" +"User's fillment preset set. \n" +"Can be shared with others." +msgstr "" + +msgid "" +"Only display printer names with changes to printer, filament, and process " +"presets." +msgstr "" + +msgid "Only display the filament names with changes to filament presets." +msgstr "" + +msgid "" +"Only printer names with user printer presets will be displayed, and each " +"preset you choose will be exported as a zip." +msgstr "" + +msgid "" +"Only the filament names with user filament presets will be displayed, \n" +"and all user filament presets in each filament name you select will be " +"exported as a zip." +msgstr "" + +msgid "" +"Only printer names with changed process presets will be displayed, \n" +"and all user process presets in each printer name you select will be " +"exported as a zip." +msgstr "" + +msgid "Please select at least one printer or filament." +msgstr "" + +msgid "Please select a type you want to export" +msgstr "" + +msgid "Edit Filament" +msgstr "" + +msgid "Filament presets under this filament" +msgstr "" + +msgid "" +"Note: If the only preset under this filament is deleted, the filament will " +"be deleted after exiting the dialog." +msgstr "" + +msgid "Presets inherited by other presets can not be deleted" +msgstr "" + +msgid "The following presets inherits this preset." +msgid_plural "The following preset inherits this preset." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +msgid "Delete Preset" +msgstr "" + +msgid "Are you sure to delete the selected preset?" +msgstr "" + +msgid "Delete preset" +msgstr "" + +msgid "+ Add Preset" +msgstr "" + +msgid "Delete Filament" +msgstr "" + +msgid "" +"All the filament presets belong to this filament would be deleted. \n" +"If you are using this filament on your printer, please reset the filament " +"information for that slot." +msgstr "" + +msgid "Delete filament" +msgstr "" + +msgid "Add Preset" +msgstr "" + +msgid "Add preset for new printer" +msgstr "" + +msgid "Copy preset from filament" +msgstr "" + +msgid "The filament choice not find filament preset, please reselect it" +msgstr "" + +msgid "Edit Preset" +msgstr "" + +msgid "For more information, please check out Wiki" +msgstr "" + +msgid "Collapse" +msgstr "" + +msgid "Daily Tips" +msgstr "" + +msgid "Need select printer" +msgstr "" + +msgid "The start, end or step is not valid value." +msgstr "" + +msgid "" +"Unable to calibrate: maybe because the set calibration value range is too " +"large, or the step is too small" +msgstr "" + +msgid "Physical Printer" +msgstr "Фізичний принтер" + +msgid "Print Host upload" +msgstr "Завантаження хоста друку" + +msgid "Could not get a valid Printer Host reference" +msgstr "Неможливо отримати дійсне посилання на хост принтера" + +msgid "Success!" +msgstr "Успіх!" + +msgid "Refresh Printers" +msgstr "Оновити принтери" + +msgid "" +"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" +"signed certificate." +msgstr "" +"Файл HTTPS CA є необов'язковим. Він необхідний лише під час використання " +"HTTPS із сертифікатом." + +msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" +msgstr "Файли сертифікатів (*.crt, *.pem)|*.crt;*.pem|Всі файли|*.*" + +msgid "Open CA certificate file" +msgstr "Відкрити файл сертифіката ЦС" + +#, c-format, boost-format +msgid "" +"On this system, %s uses HTTPS certificates from the system Certificate Store " +"or Keychain." +msgstr "" +"У цій системі %s використовує HTTPS-сертифікати із системного сховища " +"сертифікатів або Keychain." + +msgid "" +"To use a custom CA file, please import your CA file into Certificate Store / " +"Keychain." +msgstr "" +"Щоб використовувати власний файл ЦС, імпортуйте файл ЦС в сховище " +"сертифікатів/Keychain." + +msgid "Connection to printers connected via the print host failed." +msgstr "Не вдалося підключитися до принтерів, підключених через вузол друку." + +#, c-format, boost-format +msgid "Mismatched type of print host: %s" +msgstr "" + +msgid "Connection to AstroBox works correctly." +msgstr "" + +msgid "Could not connect to AstroBox" +msgstr "" + +msgid "Note: AstroBox version at least 1.1.0 is required." +msgstr "" + +msgid "Connection to Duet works correctly." +msgstr "" + +msgid "Could not connect to Duet" +msgstr "" + +msgid "Unknown error occured" +msgstr "" + +msgid "Wrong password" +msgstr "" + +msgid "Could not get resources to create a new connection" +msgstr "" + +msgid "Upload not enabled on FlashAir card." +msgstr "" + +msgid "Connection to FlashAir works correctly and upload is enabled." +msgstr "" + +msgid "Could not connect to FlashAir" +msgstr "" + +msgid "" +"Note: FlashAir with firmware 2.00.02 or newer and activated upload function " +"is required." +msgstr "" + +msgid "Connection to MKS works correctly." +msgstr "" + +msgid "Could not connect to MKS" +msgstr "" + +msgid "Connection to OctoPrint works correctly." +msgstr "" + +msgid "Could not connect to OctoPrint" +msgstr "" + +msgid "Note: OctoPrint version at least 1.1.0 is required." +msgstr "" + +msgid "Connection to Prusa SL1 / SL1S works correctly." +msgstr "" + +msgid "Could not connect to Prusa SLA" +msgstr "" + +msgid "Connection to PrusaLink works correctly." +msgstr "" + +msgid "Could not connect to PrusaLink" +msgstr "" + +msgid "Storages found" +msgstr "" + +#. TRN %1% = storage path +#, boost-format +msgid "%1% : read only" +msgstr "" + +#. TRN %1% = storage path +#, boost-format +msgid "%1% : no free space" +msgstr "" + +#. TRN %1% = host +#, boost-format +msgid "Upload has failed. There is no suitable storage found at %1%." +msgstr "" + +msgid "Connection to Prusa Connect works correctly." +msgstr "" + +msgid "Could not connect to Prusa Connect" +msgstr "" + +msgid "Connection to Repetier works correctly." +msgstr "" + +msgid "Could not connect to Repetier" +msgstr "" + +msgid "Note: Repetier version at least 0.90.0 is required." +msgstr "" + +#, boost-format +msgid "" +"HTTP status: %1%\n" +"Message body: \"%2%\"" +msgstr "" + +#, boost-format +msgid "" +"Parsing of host response failed.\n" +"Message body: \"%1%\"\n" +"Error: \"%2%\"" +msgstr "" + +#, boost-format +msgid "" +"Enumeration of host printers failed.\n" +"Message body: \"%1%\"\n" +"Error: \"%2%\"" +msgstr "" + +#: resources/data/hints.ini: [hint:Precise wall] +msgid "" +"Precise wall\n" +"Did you know that turning on precise wall can improve precision and layer " +"consistency?" +msgstr "" + +#: resources/data/hints.ini: [hint:Sandwich mode] +msgid "" +"Sandwich mode\n" +"Did you know that you can use sandwich mode (inner-outer-inner) to improve " +"precision and layer consistency if your model doesn't have very steep " +"overhangs?" +msgstr "" + +#: resources/data/hints.ini: [hint:Chamber temperature] +msgid "" +"Chamber temperature\n" +"Did you know that OrcaSlicer supports chamber temperature?" +msgstr "" + +#: resources/data/hints.ini: [hint:Calibration] +msgid "" +"Calibration\n" +"Did you know that calibrating your printer can do wonders? Check out our " +"beloved calibration solution in OrcaSlicer." +msgstr "" + +#: resources/data/hints.ini: [hint:Auxiliary fan] +msgid "" +"Auxiliary fan\n" +"Did you know that OrcaSlicer supports Auxiliary part cooling fan?" +msgstr "" + +#: resources/data/hints.ini: [hint:Air filtration] +msgid "" +"Air filtration/Exhuast Fan\n" +"Did you know that OrcaSlicer can support Air filtration/Exhuast Fan?" +msgstr "" + #: resources/data/hints.ini: [hint:How to use keyboard shortcuts] msgid "" "How to use keyboard shortcuts\n" @@ -11850,14 +12709,8 @@ msgstr "" msgid "" "Simplify Model\n" "Did you know that you can reduce the number of triangles in a mesh using the " -"Simplify mesh feature? Right-click the model and select Simplify model. Read " -"more in the documentation." +"Simplify mesh feature? Right-click the model and select Simplify model." msgstr "" -"Спрощення моделі\n" -"Чи знаєте ви, що можна зменшити кількість трикутників у мережі за допомогою " -"Елемент Спростити мережу (Simplify mesh)? Клацніть модель правою кнопкою " -"миші і виберіть «Спростити модель». Додаткову інформацію наведено в " -"документації." #: resources/data/hints.ini: [hint:Slicing Parameter Table] msgid "" @@ -11884,13 +12737,8 @@ msgid "" "Subtract a Part\n" "Did you know that you can subtract one mesh from another using the Negative " "part modifier? That way you can, for example, create easily resizable holes " -"directly in Orca Slicer. Read more in the documentation." +"directly in Orca Slicer." msgstr "" -"Відняти деталь\n" -"Чи знаєте ви, що можна віднімати одну мережу з іншої за допомогою " -"модифікаторанегативної деталі? Таким чином можна, наприклад, створити " -"легкоотвори, що змінюються безпосередньо в Orca Slicer. Додаткова інформацію " -"наведено в документації." #: resources/data/hints.ini: [hint:STEP] msgid "" @@ -12049,6 +12897,124 @@ msgid "" "probability of warping." msgstr "" +#~ msgid "Edit Text" +#~ msgstr "Редагувати текст" + +#~ msgid "Error! Unable to create thread!" +#~ msgstr "Помилка! Неможливо створити тему!" + +#~ msgid "Exception" +#~ msgstr "Виняток" + +#~ msgid "Choose SLA archive:" +#~ msgstr "Виберіть архів SLA:" + +#~ msgid "Import file" +#~ msgstr "Імпортувати файл" + +#~ msgid "Import model and profile" +#~ msgstr "Імпорт моделі та профілю" + +#~ msgid "Import profile only" +#~ msgstr "Імпортувати лише профіль" + +#~ msgid "Import model only" +#~ msgstr "Тільки модель імпорту" + +#~ msgid "Accurate" +#~ msgstr "Точний" + +#~ msgid "Balanced" +#~ msgstr "Збалансований" + +#~ msgid "Quick" +#~ msgstr "Швидкий" + +#~ msgid "Auto-Calc" +#~ msgstr "Автокалькулятор" + +#~ msgid "unloaded" +#~ msgstr "вивантажено" + +#~ msgid "loaded" +#~ msgstr "завантажено" + +#~ msgid "Filament #" +#~ msgstr "Філамент #" + +#~ msgid "" +#~ "Discribe how long the nozzle will move along the last path when retracting" +#~ msgstr "" +#~ "Визначте як далеко сопло рухатиметься вздовж останнього шляху при відкаті" + +#~ msgid "" +#~ "Simplify Model\n" +#~ "Did you know that you can reduce the number of triangles in a mesh using " +#~ "the Simplify mesh feature? Right-click the model and select Simplify " +#~ "model. Read more in the documentation." +#~ msgstr "" +#~ "Спрощення моделі\n" +#~ "Чи знаєте ви, що можна зменшити кількість трикутників у мережі за " +#~ "допомогою Елемент Спростити мережу (Simplify mesh)? Клацніть модель " +#~ "правою кнопкою миші і виберіть «Спростити модель». Додаткову інформацію " +#~ "наведено в документації." + +#~ msgid "" +#~ "Subtract a Part\n" +#~ "Did you know that you can subtract one mesh from another using the " +#~ "Negative part modifier? That way you can, for example, create easily " +#~ "resizable holes directly in Orca Slicer. Read more in the documentation." +#~ msgstr "" +#~ "Відняти деталь\n" +#~ "Чи знаєте ви, що можна віднімати одну мережу з іншої за допомогою " +#~ "модифікаторанегативної деталі? Таким чином можна, наприклад, створити " +#~ "легкоотвори, що змінюються безпосередньо в Orca Slicer. Додаткова " +#~ "інформацію наведено в документації." + +#, boost-format +#~ msgid "%1% infill pattern doesn't support 100%% density." +#~ msgstr "Шаблон заповнення %1% не підтримує щільність 100%%." + +#~ msgid "" +#~ "Switch to rectilinear pattern?\n" +#~ "Yes - switch to rectilinear pattern automaticlly\n" +#~ "No - reset density to default non 100% value automaticlly" +#~ msgstr "" +#~ "Переключити на прямолінійний шаблон?\n" +#~ "Так - автоматично перемикатися на прямолінійний шаблон\n" +#~ "Ні - автоматично скинути щільність до значення за замовчуванням, " +#~ "відмінноговід 100%" + +#~ msgid "Please heat the nozzle to above 170 degree before loading filament." +#~ msgstr "" +#~ "Будь ласка, нагрійте сопло до температури вище 170 градусів перед " +#~ "завантаженням нитки." + +#~ msgid "Newer 3mf version" +#~ msgstr "Нова версія 3mf" + +#~ msgid "Show g-code window" +#~ msgstr "Показати вікно g-коду" + +#~ msgid "If enabled, g-code window will be displayed." +#~ msgstr "Якщо увімкнено, з'явиться вікно g-коду." + +#, c-format +#~ msgid "Density of internal sparse infill, 100% means solid throughout" +#~ msgstr "" +#~ "Щільність внутрішнього розрідженого заповнення, 100%% означає суцільне " +#~ "заповнення по всій площі" + +#~ msgid "Tree support wall loops" +#~ msgstr "Контури опорної стінки дерева" + +#~ msgid "This setting specify the count of walls around tree support" +#~ msgstr "Цей параметр визначає кількість периметрів навколо опори дерева" + +#, c-format, boost-format +#~ msgid " doesn't work at 100%% density " +#~ msgstr " не працює на 100%% щільності " + #~ msgid "Ctrl + Shift + Enter" #~ msgstr "Ctrl + Shift + Enter" @@ -12068,9 +13034,6 @@ msgstr "" #~ msgid "Export all objects as STL" #~ msgstr "Експортувати всі об'єкти у форматі STL" -#~ msgid "Slice ok." -#~ msgstr "Нарізка прибл." - #, c-format, boost-format #~ msgid "" #~ "The 3mf's version %s is newer than %s's version %s, Found following keys " @@ -12248,53 +13211,6 @@ msgstr "" #~ "Встановлює рівень реєстрації налагодження. 0: непереборний, 1: помилка, " #~ "2: попередження, 3: інформація, 4: налагодження, 5: трасування\n" -#~ msgid "Physical Printer" -#~ msgstr "Фізичний принтер" - -#~ msgid "Print Host upload" -#~ msgstr "Завантаження хоста друку" - -#~ msgid "Could not get a valid Printer Host reference" -#~ msgstr "Неможливо отримати дійсне посилання на хост принтера" - -#~ msgid "Success!" -#~ msgstr "Успіх!" - -#~ msgid "Refresh Printers" -#~ msgstr "Оновити принтери" - -#~ msgid "" -#~ "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" -#~ "signed certificate." -#~ msgstr "" -#~ "Файл HTTPS CA є необов'язковим. Він необхідний лише під час використання " -#~ "HTTPS із сертифікатом." - -#~ msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" -#~ msgstr "Файли сертифікатів (*.crt, *.pem)|*.crt;*.pem|Всі файли|*.*" - -#~ msgid "Open CA certificate file" -#~ msgstr "Відкрити файл сертифіката ЦС" - -#, c-format, boost-format -#~ msgid "" -#~ "On this system, %s uses HTTPS certificates from the system Certificate " -#~ "Store or Keychain." -#~ msgstr "" -#~ "У цій системі %s використовує HTTPS-сертифікати із системного сховища " -#~ "сертифікатів або Keychain." - -#~ msgid "" -#~ "To use a custom CA file, please import your CA file into Certificate " -#~ "Store / Keychain." -#~ msgstr "" -#~ "Щоб використовувати власний файл ЦС, імпортуйте файл ЦС в сховище " -#~ "сертифікатів/Keychain." - -#~ msgid "Connection to printers connected via the print host failed." -#~ msgstr "" -#~ "Не вдалося підключитися до принтерів, підключених через вузол друку." - #~ msgid "" #~ "3D Scene Operations\n" #~ "Did you know how to control view and object/part selection with mouse and " @@ -12399,7 +13315,7 @@ msgstr "" #~ msgid "Resonance frequency identification" #~ msgstr "Ідентифікація резонансної частоти" -#~ msgid "Bamabu High Temperature Plate" +#~ msgid "Bambu High Temperature Plate" #~ msgstr "Високотемпературна пластина" #~ msgid "Recommended temperature range" diff --git a/localization/i18n/zh_CN/OrcaSlicer_zh_CN.po b/localization/i18n/zh_CN/OrcaSlicer_zh_CN.po index a3ac14c6dd..f85e391d1f 100644 --- a/localization/i18n/zh_CN/OrcaSlicer_zh_CN.po +++ b/localization/i18n/zh_CN/OrcaSlicer_zh_CN.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Slic3rPE\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-24 18:09+0100\n" +"POT-Creation-Date: 2023-12-19 22:09+0800\n" "PO-Revision-Date: 2023-04-01 13:21+0800\n" "Last-Translator: SoftFever \n" "Language-Team: \n" @@ -296,6 +296,12 @@ msgstr "选择所有连接件" msgid "Cut" msgstr "剪切" +msgid "non-mainifold edges be caused by cut tool, do you want to fix it now?" +msgstr "" + +msgid "Repairing model object" +msgstr "修复模型对象" + msgid "Connector" msgstr "连接件" @@ -839,6 +845,24 @@ msgstr "添加支撑屏蔽" msgid "Add support enforcer" msgstr "添加支撑生成器" +msgid "Add text" +msgstr "" + +msgid "Add negative text" +msgstr "" + +msgid "Add text modifier" +msgstr "" + +msgid "Add SVG part" +msgstr "" + +msgid "Add negative SVG" +msgstr "" + +msgid "Add SVG modifier" +msgstr "" + msgid "Select settings" msgstr "选择设置" @@ -854,9 +878,6 @@ msgstr "删除" msgid "Delete the selected object" msgstr "删除所选对象" -msgid "Edit Text" -msgstr "编辑文字" - msgid "Load..." msgstr "加载..." @@ -881,6 +902,12 @@ msgstr "圆柱体" msgid "Cone" msgstr "锥体" +msgid "Text" +msgstr "" + +msgid "SVG" +msgstr "" + msgid "Height range Modifier" msgstr "高度范围修改器" @@ -1014,6 +1041,18 @@ msgstr "镜像" msgid "Mirror object" msgstr "镜像对象" +msgid "Edit text" +msgstr "" + +msgid "Ability to change text, font, size, ..." +msgstr "" + +msgid "Edit SVG" +msgstr "" + +msgid "Change SVG source file, projection, size, ..." +msgstr "" + msgid "Invalidate cut info" msgstr "解除切割关系" @@ -1164,9 +1203,6 @@ msgstr "点击此图标可编辑这个对象的颜色绘制" msgid "Click the icon to shift this object to the bed" msgstr "点击这个图标可将对象移动到热床上" -msgid " search results" -msgstr "" - msgid "Loading file" msgstr "载入文件中" @@ -1305,9 +1341,6 @@ msgstr "输入新名称" msgid "Renaming" msgstr "重命名" -msgid "Repairing model object" -msgstr "修复模型对象" - msgid "Following model object has been repaired" msgid_plural "Following model objects have been repaired" msgstr[0] "以下模型对象已被修复" @@ -1627,10 +1660,6 @@ msgstr "该盘处于锁定状态,无法对其进行自动摆盘。" msgid "Arranging..." msgstr "自动摆放中..." -msgid "" -"Arrange failed. Found some exceptions when processing object geometries." -msgstr "自动摆放失败,处理对象几何数据时遇到异常。" - msgid "Arranging" msgstr "自动摆放" @@ -1644,6 +1673,10 @@ msgstr "已完成自动摆放,但是有未被摆到盘内的项,可在减小 msgid "Arranging done." msgstr "已完成自动摆放。" +msgid "" +"Arrange failed. Found some exceptions when processing object geometries." +msgstr "自动摆放失败,处理对象几何数据时遇到异常。" + #, c-format, boost-format msgid "" "Arrangement ignored the following objects which can't fit into a single " @@ -1673,8 +1706,11 @@ msgstr "自动朝向中..." msgid "Orienting" msgstr "自动朝向中..." -msgid "Filling bed " -msgstr "填充热床" +msgid "Orienting canceled." +msgstr "" + +msgid "Filling" +msgstr "" msgid "Bed filling canceled." msgstr "填充热床已取消。" @@ -1682,11 +1718,14 @@ msgstr "填充热床已取消。" msgid "Bed filling done." msgstr "填充热床已完成。" -msgid "Error! Unable to create thread!" -msgstr "发生错误,无法创建线程。" +msgid "Searching for optimal orientation" +msgstr "" -msgid "Exception" -msgstr "异常" +msgid "Orientation search canceled." +msgstr "" + +msgid "Orientation found." +msgstr "" msgid "Logging in" msgstr "登录中" @@ -1749,11 +1788,6 @@ msgstr "正在通过云端服务发送打印任务" msgid "Print task sending times out." msgstr "" -msgid "" -"The printer timed out while receiving a print job. Please check if the " -"network is functioning properly and send the print again." -msgstr "" - msgid "Service Unavailable" msgstr "服务不可用" @@ -1787,30 +1821,6 @@ msgstr "成功发送。即将关闭当前页面(%s秒)" msgid "An SD card needs to be inserted before sending to printer." msgstr "需要插入SD卡后方可发送到打印机。" -msgid "Choose SLA archive:" -msgstr "选择SLA存档:" - -msgid "Import file" -msgstr "导入文件" - -msgid "Import model and profile" -msgstr "导入模型和配置" - -msgid "Import profile only" -msgstr "仅导入配置" - -msgid "Import model only" -msgstr "仅导入模型" - -msgid "Accurate" -msgstr "精确的" - -msgid "Balanced" -msgstr "均衡的" - -msgid "Quick" -msgstr "快速的" - msgid "Importing SLA archive" msgstr "导入SLA存档" @@ -2494,19 +2504,6 @@ msgstr "" "是 - 选择开启擦拭塔\n" "否 - 选择保留支撑独立层高" -#, boost-format -msgid "%1% infill pattern doesn't support 100%% density." -msgstr "%1% 填充图案不支持 100%% 密度。" - -msgid "" -"Switch to rectilinear pattern?\n" -"Yes - switch to rectilinear pattern automaticlly\n" -"No - reset density to default non 100% value automaticlly" -msgstr "" -"切换到直线图案?\n" -"是 - 自动切换到直线图案\n" -"否 - 自动将密度重置为默认的非100%值" - msgid "" "While printing by Object, the extruder may collide skirt.\n" "Thus, reset the skirt layer to 1 to avoid that." @@ -2605,6 +2602,18 @@ msgstr "暂停,由于用户插入的Gcode" msgid "Motor noise showoff" msgstr "" +msgid "Nozzle filament covered detected pause" +msgstr "" + +msgid "Cutter error pause" +msgstr "" + +msgid "First layer error pause" +msgstr "" + +msgid "Nozzle clog pause" +msgstr "" + msgid "MC" msgstr "" @@ -3073,7 +3082,7 @@ msgstr "体积:" msgid "Size:" msgstr "尺寸:" -#, boost-format +#, c-format, boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -3449,6 +3458,18 @@ msgstr "使用透视视角" msgid "Use Orthogonal View" msgstr "使用正交视角" +msgid "Show &G-code Window" +msgstr "" + +msgid "Show g-code window in Previce scene" +msgstr "" + +msgid "Reset Window Layout" +msgstr "" + +msgid "Reset to default window layout" +msgstr "" + msgid "Show &Labels" msgstr "显示名称" @@ -3817,6 +3838,9 @@ msgstr "下载中 %d%%..." msgid "Connection lost. Please retry." msgstr "" +msgid "The device cannot handle more conversations. Please retry later." +msgstr "" + msgid "File not exists." msgstr "" @@ -3972,8 +3996,10 @@ msgstr "层: %s" msgid "Layer: %d/%d" msgstr "层: %d/%d" -msgid "Please heat the nozzle to above 170 degree before loading filament." -msgstr "请在进料前把喷嘴升温到170℃" +msgid "" +"Please heat the nozzle to above 170 degree before loading or unloading " +"filament." +msgstr "" msgid "Still unload" msgstr "继续退料" @@ -4316,7 +4342,7 @@ msgstr "自动从丢步中恢复" msgid "Allow Prompt Sound" msgstr "允许提示音" -msgid "Fliament Tangle Detect" +msgid "Filament Tangle Detect" msgstr "" msgid "Global" @@ -4489,6 +4515,12 @@ msgid "" "It is recommended to change to smooth mode." msgstr "启用传统的延时摄影可能会导致表面瑕疵。建议更改为平滑模式。" +msgid "Expand sidebar" +msgstr "" + +msgid "Collapse sidebar" +msgstr "" + #, c-format, boost-format msgid "Loading file: %s" msgstr "加载文件:%s" @@ -4505,31 +4537,6 @@ msgstr "配置无法加载。" msgid "The 3mf is generated by old Orca Slicer, load geometry data only." msgstr "该3mf文件来自旧版本的逆戟鲸切片,将只加载几何数据。" -#, c-format, boost-format -msgid "This slicer file version %s is newer than %s's version:" -msgstr "" - -msgid "" -"Would you like to update your Bambu Studio software to enable all " -"functionality in this slicer file?\n" -msgstr "" - -msgid "Newer 3mf version" -msgstr "较新的3mf版本" - -msgid "" -"you can always update Bambu Studio at your convenience. The slicer file will " -"now be loaded without full functionality." -msgstr "" - -#, c-format, boost-format -msgid "" -"This slicer file version %s is newer than %s's version.\n" -"\n" -"Would you like to update your Bambu Studio software to enable all " -"functionality in this slicer file?" -msgstr "" - msgid "Invalid values found in the 3mf:" msgstr "在3mf文件中发现无效值:" @@ -4753,6 +4760,9 @@ msgid "" "import it." msgstr "" +msgid "Import SLA archive" +msgstr "" + msgid "The selected file" msgstr "已选择的文件" @@ -4830,6 +4840,15 @@ msgid "" "will be exported." msgstr "无法对模型网格执行布尔运算。只有正面部分将被导出。" +msgid "" +"Are you sure you want to store original SVGs with their local paths into the " +"3MF file?\n" +"If you hit 'NO', all SVGs in the project will not be editable any more." +msgstr "" + +msgid "Private protection" +msgstr "" + msgid "Is the printer ready? Is the print sheet in place, empty and clean?" msgstr "打印机是否就绪?打印平台是否在正确的位置、有没有异物、是否干净?" @@ -4852,6 +4871,9 @@ msgstr "发送到打印机" msgid "Custom supports and color painting were removed before repairing." msgstr "自定义的支撑和涂色在模型修复之前将被清除。" +msgid "Optimize Rotation" +msgstr "" + msgid "Invalid number" msgstr "无效数字" @@ -5010,12 +5032,6 @@ msgstr "启动后显示“每日小贴士”通知" msgid "If enabled, useful hints are displayed at startup." msgstr "如果启用,将在启动时显示有用的提示。" -msgid "Show g-code window" -msgstr "显示g-code窗口" - -msgid "If enabled, g-code window will be displayed." -msgstr "如果启用,将显示g-code窗口。" - msgid "Flushing volumes: Auto-calculate everytime the color changed." msgstr "" @@ -5306,7 +5322,7 @@ msgstr "另存%s为" msgid "User Preset" msgstr "用户预设" -msgid "Project Inside Preset" +msgid "Preset Inside Project" msgstr "项目预设" msgid "Name is invalid;" @@ -5380,6 +5396,9 @@ msgstr "任务已取消" msgid "(LAN)" msgstr "(局域网)" +msgid "Search" +msgstr "" + msgid "My Device" msgstr "我的设备" @@ -5410,16 +5429,16 @@ msgstr "低温打印热床" msgid "PLA Plate" msgstr "PLA打印板" -msgid "Bamabu Engineering Plate" +msgid "Bambu Engineering Plate" msgstr "工程打印热床" -msgid "Bamabu Smooth PEI Plate" +msgid "Bambu Smooth PEI Plate" msgstr "" msgid "High temperature Plate" msgstr "高温打印热床" -msgid "Bamabu Textured PEI Plate" +msgid "Bambu Textured PEI Plate" msgstr "" msgid "Send print job to" @@ -5629,6 +5648,12 @@ msgstr "打印机需要与Orca Slicer在同一个局域网内。" msgid "The printer does not support sending to printer SD card." msgstr "该打印机不支持发送到打印机SD卡。" +msgid "Slice ok." +msgstr "切片完成." + +msgid "View all Daily tips" +msgstr "" + msgid "Failed to create socket" msgstr "无法创建套接字" @@ -5800,11 +5825,25 @@ msgstr "" "当使用支持界面的支持材料时,我们推荐以下设置:\n" "0顶层z距离,0接触层间距,同心图案,并且禁用独立支撑层高" +msgid "" +"Layer height exceeds the limit in Printer Settings -> Extruder -> Layer " +"height limits ,this may cause printing quality issues." +msgstr "" + +msgid "Adjust to the set range automatically? \n" +msgstr "" + +msgid "Adjust" +msgstr "" + +msgid "Ignore" +msgstr "" + msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" "在录制无工具头延时摄影视频时,建议添加“延时摄影擦料塔”\n" "右键单击打印板的空白位置,选择“添加标准模型”->“延时摄影擦料塔”。" @@ -5821,6 +5860,15 @@ msgstr "精度" msgid "Wall generator" msgstr "墙生成器" +msgid "Walls and surfaces" +msgstr "" + +msgid "Bridging" +msgstr "" + +msgid "Overhangs" +msgstr "" + msgid "Walls" msgstr "墙" @@ -6146,6 +6194,12 @@ msgid "Following preset will be deleted too." msgid_plural "Following presets will be deleted too." msgstr[0] "下列预设将被一起删除。" +msgid "" +"Are you sure to delete the selected preset? \n" +"If the preset corresponds to a filament currently in use on your printer, " +"please reset the filament information for that slot." +msgstr "" + #, boost-format msgid "Are you sure to %1% the selected preset?" msgstr "确定要%1%所选预设吗?" @@ -6171,7 +6225,7 @@ msgstr "未定义" msgid "Unsaved Changes" msgstr "未保存的更改" -msgid "Discard or Keep changes" +msgid "Transfer or discard changes" msgstr "放弃或保留更改" msgid "Old Value" @@ -6380,19 +6434,15 @@ msgstr "尖端成型线宽" msgid "Ramming line spacing" msgstr "尖端成型线间距" -msgid "Auto-Calc" -msgstr "自动计算" - -msgid "Re-calculate" +msgid "Recalculate" msgstr "" msgid "Flushing volumes for filament change" msgstr "耗材丝更换时的冲刷体积" msgid "" -"Studio would re-calculate your flushing volumes everytime the filaments " -"color changed. You could disable the auto-calculate in Bambu Studio > " -"Preferences" +"Orca recalculates your flushing volumes everytime the filament colors " +"change. You can change this behavior in Preferences." msgstr "" msgid "Flushing volume (mm³) for each filament pair." @@ -6409,15 +6459,6 @@ msgstr "乘数的取值范围是[%.2f, %.2f]" msgid "Multiplier" msgstr "乘数" -msgid "unloaded" -msgstr "卸载" - -msgid "loaded" -msgstr "装载" - -msgid "Filament #" -msgstr "耗材丝#" - msgid "From" msgstr "从" @@ -6779,6 +6820,9 @@ msgstr "打印中" msgid "Idle" msgstr "空闲" +msgid "Beta version" +msgstr "" + msgid "Latest version" msgstr "最新版本" @@ -7123,6 +7167,25 @@ msgstr "或许您想要缩小模型的尺寸,或者更改当前打印设置, msgid "Variable layer height is not supported with Organic supports." msgstr "Organic支撑不支持可变层高。" +msgid "" +"Different nozzle diameters and different filament diameters is not allowed " +"when prime tower is enabled." +msgstr "" + +msgid "" +"The Wipe Tower is currently only supported with the relative extruder " +"addressing (use_relative_e_distances=1)." +msgstr "" + +msgid "" +"Ooze prevention is currently not supported with the prime tower enabled." +msgstr "" + +msgid "" +"The prime tower is currently only supported for the Marlin, RepRap/Sprinter, " +"RepRapFirmware and Repetier G-code flavors." +msgstr "" + msgid "The prime tower is not supported in \"By object\" print." msgstr "擦拭塔不支持在逐件打印模式下使用。" @@ -7184,11 +7247,6 @@ msgstr "使用了支撑添加器但没有打开支撑。请打开支撑。" msgid "Layer height cannot exceed nozzle diameter" msgstr "层高不能超过喷嘴直径" -msgid "" -"Layer height cannot exceed the limit in Printer Settings -> Extruder -> " -"Layer height limits" -msgstr "" - msgid "" "Relative extruder addressing requires resetting the extruder position at " "each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to " @@ -7273,6 +7331,12 @@ msgstr "可打印高度" msgid "Maximum printable height which is limited by mechanism of printer" msgstr "由打印机结构约束的最大可打印高度" +msgid "Preferred orientation" +msgstr "" + +msgid "Automatically orient stls on the Z-axis upon initial import" +msgstr "" + msgid "Printer preset names" msgstr "打印机预设名" @@ -7513,7 +7577,7 @@ msgstr "搭桥密度" msgid "Density of external bridges. 100% means solid bridge. Default is 100%." msgstr "外部桥接的密度。100%意味着实心桥。默认值为100%。" -msgid "Bridge flow" +msgid "Bridge flow ratio" msgstr "桥接流量" msgid "" @@ -7521,6 +7585,15 @@ msgid "" "material for bridge, to improve sag" msgstr "稍微减小这个数值(比如0.9)可以减小桥接的材料量,来改善下垂。" +msgid "Internal bridge flow ratio" +msgstr "" + +msgid "" +"This value governs the thickness of the internal bridge layer. This is the " +"first layer over sparse infill. Decrease this value slightly (for example " +"0.9) to improve surface quality over sparse infill." +msgstr "" + msgid "Top surface flow ratio" msgstr "顶部表面流量比例" @@ -7834,6 +7907,15 @@ msgstr "" "如果启用,桥接会更可靠,可以桥接更长的距离,但可能看起来更糟。如果关闭,桥梁" "看起来更好,但只适用于较短的桥接距离。" +msgid "Thick internal bridges" +msgstr "" + +msgid "" +"If enabled, thick internal bridges will be used. It's usually recommended to " +"have this feature turned on. However, consider turning it off if you are " +"using large nozzles." +msgstr "" + msgid "Max bridge length" msgstr "最大桥接长度" @@ -7910,7 +7992,7 @@ msgid "Internal solid infill pattern" msgstr "内部实心填充图案" msgid "" -"Line pattern of internal solid infill. if the detect nattow internal solid " +"Line pattern of internal solid infill. if the detect narrow internal solid " "infill be enabled, the concentric pattern will be used for the small area." msgstr "" "内部实心填充的线型图案。如果启用了检测狭窄的内部实心填充,将使用同心圆图案来" @@ -7943,25 +8025,55 @@ msgid "" "This sets the threshold for small perimeter length. Default threshold is 0mm" msgstr "这将设置微小部位周长的阈值。默认阈值为0mm" -msgid "Order of walls" +msgid "Walls printing order" msgstr "" -msgid "Print sequence of inner wall and outer wall. " +msgid "" +"Print sequence of the internal (inner) and external (outer) walls. \n" +"\n" +"Use Inner/Outer for best overhangs. This is because the overhanging walls " +"can adhere to a neighouring perimeter while printing. However, this option " +"results in slightly reduced surface quality as the external perimeter is " +"deformed by being squashed to the internal perimeter.\n" +"\n" +"Use Inner/Outer/Inner for the best external surface finish and dimensional " +"accuracy as the external wall is printed undisturbed from an internal " +"perimeter. However, overhang performance will reduce as there is no internal " +"perimeter to print the external wall against. This option requires a minimum " +"of 3 walls to be effective as it prints the internal walls from the 3rd " +"perimeter onwards first, then the external perimeter and, finally, the first " +"internal perimeter. This option is recomended against the Outer/Inner option " +"in most cases. \n" +"\n" +"Use Outer/Inner for the same external wall quality and dimensional accuracy " +"benefits of Inner/Outer/Inner option. However, the z seams will appear less " +"consistent as the first extrusion of a new layer starts on a visible " +"surface.\n" +"\n" +" " msgstr "" -msgid "inner/outer" +msgid "Inner/Outer" msgstr "" -msgid "outer/inner" +msgid "Outer/Inner" msgstr "" -msgid "inner wall/outer wall/inner wall" +msgid "Inner/Outer/Inner" msgstr "" msgid "Print infill first" msgstr "" -msgid "Order of wall/infill. false means print wall first. " +msgid "" +"Order of wall/infill. When the tickbox is unchecked the walls are printed " +"first, which works best in most cases.\n" +"\n" +"Printing walls first may help with extreme overhangs as the walls have the " +"neighbouring infill to adhere to. However, the infill will slighly push out " +"the printed walls where it is attached to them, resulting in a worse " +"external surface finish. It can also cause the infill to shine through the " +"external surfaces of the part." msgstr "" msgid "Height to rod" @@ -8293,9 +8405,11 @@ msgstr "稀疏填充图案的角度,决定走线的开始或整体方向。" msgid "Sparse infill density" msgstr "稀疏填充密度" -#, c-format -msgid "Density of internal sparse infill, 100% means solid throughout" -msgstr "稀疏填充密度, 100%% 意味着完全实心。" +#, c-format, boost-format +msgid "" +"Density of internal sparse infill, 100% turns all sparse infill into solid " +"infill and internal solid infill pattern will be used" +msgstr "" msgid "Sparse infill pattern" msgstr "稀疏填充图案" @@ -8506,10 +8620,10 @@ msgstr "满速风扇在" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " -"than \"close_fan_the_first_x_layers\", in which case the fan will be running " -"at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower than " +"\"close_fan_the_first_x_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." msgstr "" "风扇速度将从“禁用第一层”的零线性上升到“全风扇速度层”的最大。如果低于“禁用风扇" "第一层”,则“全风扇速度第一层”将被忽略,在这种情况下,风扇将在“禁用风扇第一" @@ -8558,6 +8672,12 @@ msgid "" "segment" msgstr "产生绒毛表面时,插入的随机点之间的平均距离" +msgid "Apply fuzzy skin to first layer" +msgstr "" + +msgid "Whether to apply fuzzy skin on the first layer" +msgstr "" + msgid "Filter out tiny gaps" msgstr "忽略微小间隙" @@ -9192,13 +9312,13 @@ msgstr "文件名格式" msgid "User can self-define the project file name when export" msgstr "用户可以自定义导出项目文件的名称。" -msgid "Make overhang printable" +msgid "Make overhangs printable" msgstr "悬垂可打印化" msgid "Modify the geometry to print overhangs without support material." msgstr "修改几何形状使得悬垂部分无需支撑材料或者搭桥打印。" -msgid "Make overhang printable maximum angle" +msgid "Make overhangs printable - Maximum angle" msgstr "悬垂可打印化的最大角度" msgid "" @@ -9209,7 +9329,7 @@ msgstr "" "在使悬垂可打印化后,允许的悬垂最大角度。90°将完全不改变模型并允许任何悬垂,而" "0°将用圆锥形材料替换所有悬垂部分。" -msgid "Make overhang printable hole area" +msgid "Make overhangs printable - Hole area" msgstr "最大孔洞面积" msgid "" @@ -9445,6 +9565,9 @@ msgstr "" msgid "Show auto-calibration marks" msgstr "显示雷达标定线" +msgid "Disable set remaining print time" +msgstr "" + msgid "Seam position" msgstr "接缝位置" @@ -9569,6 +9692,22 @@ msgstr "" "沿着对象的外轮廓螺旋上升,将实体模型转变为只有底面实心层和侧面单层墙壁的打" "印。最后生成的打印件没有接缝。" +msgid "Smooth Spiral" +msgstr "" + +msgid "" +"Smooth Spiral smoothes out X and Y moves as wellresulting in no visible seam " +"at all, even in the XY directions on walls that are not vertical" +msgstr "" + +msgid "Max XY Smoothing" +msgstr "" + +msgid "" +"Maximum distance to move points in XY to try to achieve a smooth spiralIf " +"expressed as a %, it will be computed over nozzle diameter" +msgstr "" + msgid "" "If smooth or traditional mode is selected, a timelapse video will be " "generated for each print. After each layer is printed, a snapshot is taken " @@ -9763,10 +9902,11 @@ msgid "" msgstr "" "打印支撑主体和筏层的耗材丝。\"缺省\"代表不指定特定的耗材丝,并使用当前耗材" -msgid "No interface filament for body" +msgid "Avoid interface filament for base" msgstr "" -msgid "Don't use support interface filament to print support body" +msgid "" +"Avoid using support interface filament to print support base if possible." msgstr "" msgid "" @@ -10009,11 +10149,11 @@ msgstr "" "该值大于以分支直径得到的圆形面积时,将打印双层墙,以保持稳定性。如不使用双层" "墙,请将该值设置为0。" -msgid "Tree support wall loops" -msgstr "树状支撑外墙层数" +msgid "Support wall loops" +msgstr "" -msgid "This setting specify the count of walls around tree support" -msgstr "树状支撑外墙层数" +msgid "This setting specify the count of walls around support" +msgstr "" msgid "Tree support with infill" msgstr "树状支撑生成填充" @@ -10119,8 +10259,16 @@ msgid "Wipe Distance" msgstr "擦拭距离" msgid "" -"Discribe how long the nozzle will move along the last path when retracting" -msgstr "表示回抽时擦拭的移动距离。" +"Discribe how long the nozzle will move along the last path when " +"retracting. \n" +"\n" +"Depending on how long the wipe operation lasts, how fast and long the " +"extruder/filament retraction settings are, a retraction move may be needed " +"to retract the remaining filament. \n" +"\n" +"Setting a value in the retract amount before wipe setting below will perform " +"any excess retraction before the wipe, else it will be performed after." +msgstr "" msgid "" "The wiping tower can be used to clean up the residue on the nozzle and " @@ -10425,10 +10573,6 @@ msgstr "" msgid "invalid value " msgstr "非法的值 " -#, c-format, boost-format -msgid " doesn't work at 100%% density " -msgstr " 填充图案不支持 100%% 密度" - msgid "Invalid value when spiral vase mode is enabled: " msgstr "旋转花瓶模式下非法的值" @@ -11342,6 +11486,719 @@ msgstr "零件 2" msgid "Delete input" msgstr "删除输入" +msgid "Network Test" +msgstr "" + +msgid "Start Test Multi-Thread" +msgstr "" + +msgid "Start Test Single-Thread" +msgstr "" + +msgid "Export Log" +msgstr "" + +msgid "Studio Version:" +msgstr "" + +msgid "System Version:" +msgstr "" + +msgid "DNS Server:" +msgstr "" + +msgid "Test BambuLab" +msgstr "" + +msgid "Test BambuLab:" +msgstr "" + +msgid "Test Bing.com" +msgstr "" + +msgid "Test bing.com:" +msgstr "" + +msgid "Test HTTP" +msgstr "" + +msgid "Test HTTP Service:" +msgstr "" + +msgid "Test storage" +msgstr "" + +msgid "Test Storage Upload:" +msgstr "" + +msgid "Test storage upgrade" +msgstr "" + +msgid "Test Storage Upgrade:" +msgstr "" + +msgid "Test storage download" +msgstr "" + +msgid "Test Storage Download:" +msgstr "" + +msgid "Test plugin download" +msgstr "" + +msgid "Test Plugin Download:" +msgstr "" + +msgid "Test Storage Upload" +msgstr "" + +msgid "Log Info" +msgstr "" + +msgid "Select filament preset" +msgstr "" + +msgid "Create Filament" +msgstr "" + +msgid "Create Based on Current Filament" +msgstr "" + +msgid "Copy Current Filament Preset " +msgstr "" + +msgid "Basic Information" +msgstr "" + +msgid "Add Filament Preset under this filament" +msgstr "" + +msgid "We could create the filament presets for your following printer:" +msgstr "" + +msgid "Select Vendor" +msgstr "" + +msgid "Input Custom Vendor" +msgstr "" + +msgid "Can't find vendor I want" +msgstr "" + +msgid "Select Type" +msgstr "" + +msgid "Select Filament Preset" +msgstr "" + +msgid "Serial" +msgstr "" + +msgid "e.g. Basic, Matte, Silk, Marble" +msgstr "" + +msgid "Filament Preset" +msgstr "" + +msgid "Create" +msgstr "" + +msgid "Vendor is not selected, please reselect vendor." +msgstr "" + +msgid "Custom vendor is not input, please input custom vendor." +msgstr "" + +msgid "" +"\"Bambu\" or \"Generic\" can not be used as a Vendor for custom filaments." +msgstr "" + +msgid "Filament type is not selected, please reselect type." +msgstr "" + +msgid "Filament serial is not inputed, please input serial." +msgstr "" + +msgid "" +"There may be escape characters in the vendor or serial input of filament. " +"Please delete and re-enter." +msgstr "" + +msgid "All inputs in the custom vendor or serial are spaces. Please re-enter." +msgstr "" + +msgid "The vendor can not be a number. Please re-enter." +msgstr "" + +msgid "" +"You have not selected a printer or preset yet. Please select at least one." +msgstr "" + +msgid "Some existing presets have failed to be created, as follows:\n" +msgstr "" + +msgid "" +"\n" +"Do you want to rewrite it?" +msgstr "" + +msgid "" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" +"To add preset for more prinetrs, Please go to printer selection" +msgstr "" + +msgid "Create Printer/Nozzle" +msgstr "" + +msgid "Create Printer" +msgstr "" + +msgid "Create Nozzle for Existing Printer" +msgstr "" + +msgid "Create from Template" +msgstr "" + +msgid "Create Based on Current Printer" +msgstr "" + +msgid "wiki" +msgstr "" + +msgid "Import Preset" +msgstr "" + +msgid "Create Type" +msgstr "" + +msgid "The model is not fond, place reselect vendor." +msgstr "" + +msgid "Select Model" +msgstr "" + +msgid "Select Printer" +msgstr "" + +msgid "Input Custom Model" +msgstr "" + +msgid "Can't find my printer model" +msgstr "" + +msgid "Rectangle" +msgstr "" + +msgid "Printable Space" +msgstr "" + +msgid "X" +msgstr "" + +msgid "Y" +msgstr "" + +msgid "Hot Bed STL" +msgstr "" + +msgid "Load stl" +msgstr "" + +msgid "Hot Bed SVG" +msgstr "" + +msgid "Load svg" +msgstr "" + +msgid "Max Print Height" +msgstr "" + +#, c-format, boost-format +msgid "The file exceeds %d MB, please import again." +msgstr "" + +msgid "Exception in obtaining file size, please import again." +msgstr "" + +msgid "Preset path is not find, please reselect vendor." +msgstr "" + +msgid "The printer model was not found, please reselect." +msgstr "" + +msgid "The nozzle diameter is not fond, place reselect." +msgstr "" + +msgid "The printer preset is not fond, place reselect." +msgstr "" + +msgid "Printer Preset" +msgstr "" + +msgid "Filament Preset Template" +msgstr "" + +msgid "Deselect All" +msgstr "" + +msgid "Process Preset Template" +msgstr "" + +msgid "Back Page 1" +msgstr "" + +msgid "" +"You have not yet chosen which printer preset to create based on. Please " +"choose the vendor and model of the printer" +msgstr "" + +msgid "" +"You have entered an illegal input in the printable area section on the first " +"page. Please check before creating it." +msgstr "" + +msgid "The custom printer or model is not inputed, place input." +msgstr "" + +msgid "" +"The printer preset you created already has a preset with the same name. Do " +"you want to overwrite it?\n" +"\tYes: Overwrite the printer preset with the same name, and filament and " +"process presets with the same preset name will be recreated \n" +"and filament and process presets without the same preset name will be " +"reserve.\n" +"\tCancel: Do not create a preset, return to the creation interface." +msgstr "" + +msgid "You need to select at least one filament preset." +msgstr "" + +msgid "You need to select at least one process preset." +msgstr "" + +msgid "Create filament presets failed. As follows:\n" +msgstr "" + +msgid "Create process presets failed. As follows:\n" +msgstr "" + +msgid "Vendor is not find, please reselect." +msgstr "" + +msgid "Current vendor has no models, please reselect." +msgstr "" + +msgid "" +"You have not selected the vendor and model or inputed the custom vendor and " +"model." +msgstr "" + +msgid "" +"There may be escape characters in the custom printer vendor or model. Please " +"delete and re-enter." +msgstr "" + +msgid "" +"All inputs in the custom printer vendor or model are spaces. Please re-enter." +msgstr "" + +msgid "Please check bed printable shape and origin input." +msgstr "" + +msgid "" +"You have not yet selected the printer to replace the nozzle, please choose." +msgstr "" + +msgid "Create Printer Successful" +msgstr "" + +msgid "Create Filament Successful" +msgstr "" + +msgid "Printer Created" +msgstr "" + +msgid "Please go to printer settings to edit your presets" +msgstr "" + +msgid "Filament Created" +msgstr "" + +msgid "" +"Please go to filament setting to edit your presets if you need.\n" +"Please note that nozzle temperature, hot bed temperature, and maximum " +"volumetric speed have a significant impact on printing quality. Please set " +"them carefully." +msgstr "" + +msgid "Printer Setting" +msgstr "" + +msgid "Export Configs" +msgstr "" + +msgid "Printer config bundle(.bbscfg)" +msgstr "" + +msgid "Filament bundle(.bbsflmt)" +msgstr "" + +msgid "Printer presets(.zip)" +msgstr "" + +msgid "Filament presets(.zip)" +msgstr "" + +msgid "Process presets(.zip)" +msgstr "" + +msgid "initialize fail" +msgstr "" + +msgid "add file fail" +msgstr "" + +msgid "add bundle structure file fail" +msgstr "" + +msgid "finalize fail" +msgstr "" + +msgid "open zip written fail" +msgstr "" + +msgid "Export successful" +msgstr "" + +#, c-format, boost-format +msgid "" +"The '%s' folder already exists in the current directory. Do you want to " +"clear it and rebuild it.\n" +"If not, a time suffix will be added, and you can modify the name after " +"creation." +msgstr "" + +msgid "" +"Printer and all the filament&process presets that belongs to the printer. \n" +"Can be shared with others." +msgstr "" + +msgid "" +"User's fillment preset set. \n" +"Can be shared with others." +msgstr "" + +msgid "" +"Only display printer names with changes to printer, filament, and process " +"presets." +msgstr "" + +msgid "Only display the filament names with changes to filament presets." +msgstr "" + +msgid "" +"Only printer names with user printer presets will be displayed, and each " +"preset you choose will be exported as a zip." +msgstr "" + +msgid "" +"Only the filament names with user filament presets will be displayed, \n" +"and all user filament presets in each filament name you select will be " +"exported as a zip." +msgstr "" + +msgid "" +"Only printer names with changed process presets will be displayed, \n" +"and all user process presets in each printer name you select will be " +"exported as a zip." +msgstr "" + +msgid "Please select at least one printer or filament." +msgstr "" + +msgid "Please select a type you want to export" +msgstr "" + +msgid "Edit Filament" +msgstr "" + +msgid "Filament presets under this filament" +msgstr "" + +msgid "" +"Note: If the only preset under this filament is deleted, the filament will " +"be deleted after exiting the dialog." +msgstr "" + +msgid "Presets inherited by other presets can not be deleted" +msgstr "" + +msgid "The following presets inherits this preset." +msgid_plural "The following preset inherits this preset." +msgstr[0] "" + +msgid "Delete Preset" +msgstr "" + +msgid "Are you sure to delete the selected preset?" +msgstr "" + +msgid "Delete preset" +msgstr "" + +msgid "+ Add Preset" +msgstr "" + +msgid "Delete Filament" +msgstr "" + +msgid "" +"All the filament presets belong to this filament would be deleted. \n" +"If you are using this filament on your printer, please reset the filament " +"information for that slot." +msgstr "" + +msgid "Delete filament" +msgstr "" + +msgid "Add Preset" +msgstr "" + +msgid "Add preset for new printer" +msgstr "" + +msgid "Copy preset from filament" +msgstr "" + +msgid "The filament choice not find filament preset, please reselect it" +msgstr "" + +msgid "Edit Preset" +msgstr "" + +msgid "For more information, please check out Wiki" +msgstr "" + +msgid "Collapse" +msgstr "" + +msgid "Daily Tips" +msgstr "" + +msgid "Need select printer" +msgstr "需要选择打印机" + +msgid "The start, end or step is not valid value." +msgstr "" + +msgid "" +"Unable to calibrate: maybe because the set calibration value range is too " +"large, or the step is too small" +msgstr "" + +msgid "Physical Printer" +msgstr "物理打印机" + +msgid "Print Host upload" +msgstr "" + +msgid "Could not get a valid Printer Host reference" +msgstr "" + +msgid "Success!" +msgstr "成功!" + +msgid "Refresh Printers" +msgstr "刷新打印机" + +msgid "" +"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" +"signed certificate." +msgstr "" + +msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" +msgstr "" + +msgid "Open CA certificate file" +msgstr "" + +#, c-format, boost-format +msgid "" +"On this system, %s uses HTTPS certificates from the system Certificate Store " +"or Keychain." +msgstr "" + +msgid "" +"To use a custom CA file, please import your CA file into Certificate Store / " +"Keychain." +msgstr "" + +msgid "Connection to printers connected via the print host failed." +msgstr "" + +#, c-format, boost-format +msgid "Mismatched type of print host: %s" +msgstr "" + +msgid "Connection to AstroBox works correctly." +msgstr "" + +msgid "Could not connect to AstroBox" +msgstr "" + +msgid "Note: AstroBox version at least 1.1.0 is required." +msgstr "" + +msgid "Connection to Duet works correctly." +msgstr "" + +msgid "Could not connect to Duet" +msgstr "" + +msgid "Unknown error occured" +msgstr "" + +msgid "Wrong password" +msgstr "" + +msgid "Could not get resources to create a new connection" +msgstr "" + +msgid "Upload not enabled on FlashAir card." +msgstr "" + +msgid "Connection to FlashAir works correctly and upload is enabled." +msgstr "" + +msgid "Could not connect to FlashAir" +msgstr "" + +msgid "" +"Note: FlashAir with firmware 2.00.02 or newer and activated upload function " +"is required." +msgstr "" + +msgid "Connection to MKS works correctly." +msgstr "" + +msgid "Could not connect to MKS" +msgstr "" + +msgid "Connection to OctoPrint works correctly." +msgstr "" + +msgid "Could not connect to OctoPrint" +msgstr "" + +msgid "Note: OctoPrint version at least 1.1.0 is required." +msgstr "" + +msgid "Connection to Prusa SL1 / SL1S works correctly." +msgstr "" + +msgid "Could not connect to Prusa SLA" +msgstr "" + +msgid "Connection to PrusaLink works correctly." +msgstr "" + +msgid "Could not connect to PrusaLink" +msgstr "" + +msgid "Storages found" +msgstr "" + +#. TRN %1% = storage path +#, boost-format +msgid "%1% : read only" +msgstr "" + +#. TRN %1% = storage path +#, boost-format +msgid "%1% : no free space" +msgstr "" + +#. TRN %1% = host +#, boost-format +msgid "Upload has failed. There is no suitable storage found at %1%." +msgstr "" + +msgid "Connection to Prusa Connect works correctly." +msgstr "" + +msgid "Could not connect to Prusa Connect" +msgstr "" + +msgid "Connection to Repetier works correctly." +msgstr "" + +msgid "Could not connect to Repetier" +msgstr "" + +msgid "Note: Repetier version at least 0.90.0 is required." +msgstr "" + +#, boost-format +msgid "" +"HTTP status: %1%\n" +"Message body: \"%2%\"" +msgstr "" + +#, boost-format +msgid "" +"Parsing of host response failed.\n" +"Message body: \"%1%\"\n" +"Error: \"%2%\"" +msgstr "" + +#, boost-format +msgid "" +"Enumeration of host printers failed.\n" +"Message body: \"%1%\"\n" +"Error: \"%2%\"" +msgstr "" + +#: resources/data/hints.ini: [hint:Precise wall] +msgid "" +"Precise wall\n" +"Did you know that turning on precise wall can improve precision and layer " +"consistency?" +msgstr "" + +#: resources/data/hints.ini: [hint:Sandwich mode] +msgid "" +"Sandwich mode\n" +"Did you know that you can use sandwich mode (inner-outer-inner) to improve " +"precision and layer consistency if your model doesn't have very steep " +"overhangs?" +msgstr "" + +#: resources/data/hints.ini: [hint:Chamber temperature] +msgid "" +"Chamber temperature\n" +"Did you know that OrcaSlicer supports chamber temperature?" +msgstr "" + +#: resources/data/hints.ini: [hint:Calibration] +msgid "" +"Calibration\n" +"Did you know that calibrating your printer can do wonders? Check out our " +"beloved calibration solution in OrcaSlicer." +msgstr "" + +#: resources/data/hints.ini: [hint:Auxiliary fan] +msgid "" +"Auxiliary fan\n" +"Did you know that OrcaSlicer supports Auxiliary part cooling fan?" +msgstr "" + +#: resources/data/hints.ini: [hint:Air filtration] +msgid "" +"Air filtration/Exhuast Fan\n" +"Did you know that OrcaSlicer can support Air filtration/Exhuast Fan?" +msgstr "" + #: resources/data/hints.ini: [hint:How to use keyboard shortcuts] msgid "" "How to use keyboard shortcuts\n" @@ -11422,12 +12279,8 @@ msgstr "" msgid "" "Simplify Model\n" "Did you know that you can reduce the number of triangles in a mesh using the " -"Simplify mesh feature? Right-click the model and select Simplify model. Read " -"more in the documentation." +"Simplify mesh feature? Right-click the model and select Simplify model." msgstr "" -"简化模型\n" -"您知道吗,您可以使用“简化模型”功能减少模型的三角形数。在模型上单击鼠标右键," -"然后选择“简化模型”。" #: resources/data/hints.ini: [hint:Slicing Parameter Table] msgid "" @@ -11452,11 +12305,8 @@ msgid "" "Subtract a Part\n" "Did you know that you can subtract one mesh from another using the Negative " "part modifier? That way you can, for example, create easily resizable holes " -"directly in Orca Slicer. Read more in the documentation." +"directly in Orca Slicer." msgstr "" -"减去部分几何体\n" -"您知道吗,您可以使用负零件从另一个几何体中减去另一个几何体。例如,可以直接在" -"逆戟鲸中创建可轻松调整大小的孔。" #: resources/data/hints.ini: [hint:STEP] msgid "" @@ -11607,6 +12457,117 @@ msgid "" "probability of warping." msgstr "" +#~ msgid "Edit Text" +#~ msgstr "编辑文字" + +#~ msgid "Error! Unable to create thread!" +#~ msgstr "发生错误,无法创建线程。" + +#~ msgid "Exception" +#~ msgstr "异常" + +#~ msgid "Choose SLA archive:" +#~ msgstr "选择SLA存档:" + +#~ msgid "Import file" +#~ msgstr "导入文件" + +#~ msgid "Import model and profile" +#~ msgstr "导入模型和配置" + +#~ msgid "Import profile only" +#~ msgstr "仅导入配置" + +#~ msgid "Import model only" +#~ msgstr "仅导入模型" + +#~ msgid "Accurate" +#~ msgstr "精确的" + +#~ msgid "Balanced" +#~ msgstr "均衡的" + +#~ msgid "Quick" +#~ msgstr "快速的" + +#~ msgid "Auto-Calc" +#~ msgstr "自动计算" + +#~ msgid "unloaded" +#~ msgstr "卸载" + +#~ msgid "loaded" +#~ msgstr "装载" + +#~ msgid "Filament #" +#~ msgstr "耗材丝#" + +#~ msgid "" +#~ "Discribe how long the nozzle will move along the last path when retracting" +#~ msgstr "表示回抽时擦拭的移动距离。" + +#~ msgid "" +#~ "Simplify Model\n" +#~ "Did you know that you can reduce the number of triangles in a mesh using " +#~ "the Simplify mesh feature? Right-click the model and select Simplify " +#~ "model. Read more in the documentation." +#~ msgstr "" +#~ "简化模型\n" +#~ "您知道吗,您可以使用“简化模型”功能减少模型的三角形数。在模型上单击鼠标右" +#~ "键,然后选择“简化模型”。" + +#~ msgid "" +#~ "Subtract a Part\n" +#~ "Did you know that you can subtract one mesh from another using the " +#~ "Negative part modifier? That way you can, for example, create easily " +#~ "resizable holes directly in Orca Slicer. Read more in the documentation." +#~ msgstr "" +#~ "减去部分几何体\n" +#~ "您知道吗,您可以使用负零件从另一个几何体中减去另一个几何体。例如,可以直接" +#~ "在逆戟鲸中创建可轻松调整大小的孔。" + +#~ msgid "Filling bed " +#~ msgstr "填充热床" + +#, boost-format +#~ msgid "%1% infill pattern doesn't support 100%% density." +#~ msgstr "%1% 填充图案不支持 100%% 密度。" + +#~ msgid "" +#~ "Switch to rectilinear pattern?\n" +#~ "Yes - switch to rectilinear pattern automaticlly\n" +#~ "No - reset density to default non 100% value automaticlly" +#~ msgstr "" +#~ "切换到直线图案?\n" +#~ "是 - 自动切换到直线图案\n" +#~ "否 - 自动将密度重置为默认的非100%值" + +#~ msgid "Please heat the nozzle to above 170 degree before loading filament." +#~ msgstr "请在进料前把喷嘴升温到170℃" + +#~ msgid "Newer 3mf version" +#~ msgstr "较新的3mf版本" + +#~ msgid "Show g-code window" +#~ msgstr "显示g-code窗口" + +#~ msgid "If enabled, g-code window will be displayed." +#~ msgstr "如果启用,将显示g-code窗口。" + +#, c-format +#~ msgid "Density of internal sparse infill, 100% means solid throughout" +#~ msgstr "稀疏填充密度, 100%% 意味着完全实心。" + +#~ msgid "Tree support wall loops" +#~ msgstr "树状支撑外墙层数" + +#~ msgid "This setting specify the count of walls around tree support" +#~ msgstr "树状支撑外墙层数" + +#, c-format, boost-format +#~ msgid " doesn't work at 100%% density " +#~ msgstr " 填充图案不支持 100%% 密度" + #~ msgid "Tool-Lay on Face" #~ msgstr "工具-选择底面" @@ -11625,9 +12586,6 @@ msgstr "" #~ msgid "Export all objects as STL" #~ msgstr "导出所有对象为STL" -#~ msgid "Slice ok." -#~ msgstr "切片完成." - #, c-format, boost-format #~ msgid "" #~ "The 3mf's version %s is newer than %s's version %s, Found following keys " @@ -11652,15 +12610,6 @@ msgstr "" #~ msgid "Add/Remove printers" #~ msgstr "添加/删除打印机" -#~ msgid "Bambu Engineering Plate" -#~ msgstr "Bambu工程材料热床" - -#~ msgid "Bambu Smooth PEI Plate" -#~ msgstr "Bambu光滑PEI热床" - -#~ msgid "Bambu Textured PEI Plate" -#~ msgstr "Bambu纹理PEI热床" - #~ msgid "" #~ "When print by object, machines with I3 structure will not generate " #~ "timelapse videos." @@ -11850,18 +12799,6 @@ msgstr "" #~ msgid "The selected preset: %1% is not found." #~ msgstr "未找到选定的预设:%1%。" -#~ msgid "Physical Printer" -#~ msgstr "物理打印机" - -#~ msgid "Success!" -#~ msgstr "成功!" - -#~ msgid "Refresh Printers" -#~ msgstr "刷新打印机" - -#~ msgid "Need select printer" -#~ msgstr "需要选择打印机" - #~ msgid "" #~ "3D Scene Operations\n" #~ "Did you know how to control view and object/part selection with mouse and " @@ -11997,7 +12934,7 @@ msgstr "" #~ msgid "Score" #~ msgstr "打分" -#~ msgid "Bamabu High Temperature Plate" +#~ msgid "Bambu High Temperature Plate" #~ msgstr "高温打印热床" #~ msgid "Can't connect to the printer" diff --git a/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po b/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po index 0d657c5310..2762dd26ed 100644 --- a/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po +++ b/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Orca Slicer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-24 18:09+0100\n" +"POT-Creation-Date: 2023-12-19 22:09+0800\n" "PO-Revision-Date: 2023-11-06 14:37+0800\n" "Last-Translator: ablegods \n" "Language-Team: \n" @@ -315,6 +315,12 @@ msgstr "選擇所有連接件" msgid "Cut" msgstr "切割" +msgid "non-mainifold edges be caused by cut tool, do you want to fix it now?" +msgstr "" + +msgid "Repairing model object" +msgstr "修復模型物件" + msgid "Connector" msgstr "連接件" @@ -887,6 +893,24 @@ msgstr "新增支撐遮蔽" msgid "Add support enforcer" msgstr "新增支撐產生器" +msgid "Add text" +msgstr "" + +msgid "Add negative text" +msgstr "" + +msgid "Add text modifier" +msgstr "" + +msgid "Add SVG part" +msgstr "" + +msgid "Add negative SVG" +msgstr "" + +msgid "Add SVG modifier" +msgstr "" + msgid "Select settings" msgstr "選擇設定" @@ -902,9 +926,6 @@ msgstr "刪除" msgid "Delete the selected object" msgstr "刪除所選物件" -msgid "Edit Text" -msgstr "編輯文字" - msgid "Load..." msgstr "載入..." @@ -929,6 +950,12 @@ msgstr "圓柱體" msgid "Cone" msgstr "錐體" +msgid "Text" +msgstr "" + +msgid "SVG" +msgstr "" + msgid "Height range Modifier" msgstr "高度範圍修改器" @@ -1069,6 +1096,18 @@ msgstr "鏡像" msgid "Mirror object" msgstr "鏡像物件" +msgid "Edit text" +msgstr "" + +msgid "Ability to change text, font, size, ..." +msgstr "" + +msgid "Edit SVG" +msgstr "" + +msgid "Change SVG source file, projection, size, ..." +msgstr "" + msgid "Invalidate cut info" msgstr "解除切割關係" @@ -1236,9 +1275,6 @@ msgstr "滑鼠左鍵點擊此圖示可編輯這個物件的顏色繪製" msgid "Click the icon to shift this object to the bed" msgstr "滑鼠左鍵點擊這個圖示可將物件移動到列印板上" -msgid " search results" -msgstr "" - msgid "Loading file" msgstr "載入檔案中" @@ -1380,9 +1416,6 @@ msgstr "輸入新名稱" msgid "Renaming" msgstr "重新命名" -msgid "Repairing model object" -msgstr "修復模型物件" - msgid "Following model object has been repaired" msgid_plural "Following model objects have been repaired" msgstr[0] "以下模型物件已被修復" @@ -1716,10 +1749,6 @@ msgstr "該列印板處於鎖定狀態,無法對其進行自動擺放。" msgid "Arranging..." msgstr "自動擺放中..." -msgid "" -"Arrange failed. Found some exceptions when processing object geometries." -msgstr "自動擺放失敗,處理物件位置時遇到異常。" - msgid "Arranging" msgstr "自動擺放" @@ -1734,6 +1763,10 @@ msgstr "已完成自動擺放,但是有未被擺到列印板內的物件,可 msgid "Arranging done." msgstr "已完成自動擺放。" +msgid "" +"Arrange failed. Found some exceptions when processing object geometries." +msgstr "自動擺放失敗,處理物件位置時遇到異常。" + #, fuzzy, c-format, boost-format msgid "" "Arrangement ignored the following objects which can't fit into a single " @@ -1765,8 +1798,11 @@ msgstr "自動旋轉方向..." msgid "Orienting" msgstr "自動旋轉方向..." -msgid "Filling bed " -msgstr "填充自動朝向" +msgid "Orienting canceled." +msgstr "" + +msgid "Filling" +msgstr "" msgid "Bed filling canceled." msgstr "填充列印板已取消。" @@ -1774,11 +1810,14 @@ msgstr "填充列印板已取消。" msgid "Bed filling done." msgstr "填充列印板已完成。" -msgid "Error! Unable to create thread!" -msgstr "發生錯誤,無法建立執行緒。" +msgid "Searching for optimal orientation" +msgstr "" -msgid "Exception" -msgstr "異常" +msgid "Orientation search canceled." +msgstr "" + +msgid "Orientation found." +msgstr "" msgid "Logging in" msgstr "登入中" @@ -1843,11 +1882,6 @@ msgstr "正在通過雲端服務傳送列印作業" msgid "Print task sending times out." msgstr "" -msgid "" -"The printer timed out while receiving a print job. Please check if the " -"network is functioning properly and send the print again." -msgstr "" - msgid "Service Unavailable" msgstr "暫停服務" @@ -1882,30 +1916,6 @@ msgstr "傳送成功。即將關閉目前頁面(%s秒)" msgid "An SD card needs to be inserted before sending to printer." msgstr "傳送到列印設備前需要先插入 SD 記憶卡。" -msgid "Choose SLA archive:" -msgstr "選擇 SLA 存檔:" - -msgid "Import file" -msgstr "匯入檔案" - -msgid "Import model and profile" -msgstr "匯入模型和設定檔" - -msgid "Import profile only" -msgstr "僅匯入設定檔" - -msgid "Import model only" -msgstr "僅匯入模型" - -msgid "Accurate" -msgstr "準確的" - -msgid "Balanced" -msgstr "平衡的" - -msgid "Quick" -msgstr "快速的" - msgid "Importing SLA archive" msgstr "匯入 SLA 存檔" @@ -2639,19 +2649,6 @@ msgstr "" "是 - 選擇開啟擦拭塔\n" "否 - 選擇保留支撐獨立層高" -#, boost-format -msgid "%1% infill pattern doesn't support 100%% density." -msgstr "%1% 填充圖案不支援 100%% 密度。" - -msgid "" -"Switch to rectilinear pattern?\n" -"Yes - switch to rectilinear pattern automaticlly\n" -"No - reset density to default non 100% value automaticlly" -msgstr "" -"切換到直線圖案?\n" -"是 - 自動切換到直線圖案\n" -"否 - 自動將密度重設為預設的非 100% 值" - #, fuzzy msgid "" "While printing by Object, the extruder may collide skirt.\n" @@ -2756,6 +2753,18 @@ msgstr "使用者插入的 Gcode 導致暫停" msgid "Motor noise showoff" msgstr "電機噪音" +msgid "Nozzle filament covered detected pause" +msgstr "" + +msgid "Cutter error pause" +msgstr "" + +msgid "First layer error pause" +msgstr "" + +msgid "Nozzle clog pause" +msgstr "" + msgid "MC" msgstr "" @@ -3249,7 +3258,7 @@ msgstr "體積:" msgid "Size:" msgstr "尺寸:" -#, fuzzy, boost-format +#, fuzzy, c-format, boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -3646,6 +3655,18 @@ msgstr "使用透視視角" msgid "Use Orthogonal View" msgstr "使用正交視角" +msgid "Show &G-code Window" +msgstr "" + +msgid "Show g-code window in Previce scene" +msgstr "" + +msgid "Reset Window Layout" +msgstr "" + +msgid "Reset to default window layout" +msgstr "" + msgid "Show &Labels" msgstr "顯示名稱" @@ -4026,6 +4047,9 @@ msgstr "下載中 %d%%..." msgid "Connection lost. Please retry." msgstr "" +msgid "The device cannot handle more conversations. Please retry later." +msgstr "" + msgid "File not exists." msgstr "" @@ -4186,8 +4210,10 @@ msgstr "%s 層" msgid "Layer: %d/%d" msgstr "%d/%d 層" -msgid "Please heat the nozzle to above 170 degree before loading filament." -msgstr "請在進料前把噴嘴升溫到 170℃" +msgid "" +"Please heat the nozzle to above 170 degree before loading or unloading " +"filament." +msgstr "" msgid "Still unload" msgstr "繼續退料" @@ -4546,7 +4572,7 @@ msgstr "自動從丟步中恢復" msgid "Allow Prompt Sound" msgstr "允許提示音效" -msgid "Fliament Tangle Detect" +msgid "Filament Tangle Detect" msgstr "" msgid "Global" @@ -4741,6 +4767,12 @@ msgid "" "It is recommended to change to smooth mode." msgstr "使用傳統模式的縮時攝影可能會導致表面缺陷。建議改為平滑模式。" +msgid "Expand sidebar" +msgstr "" + +msgid "Collapse sidebar" +msgstr "" + #, c-format, boost-format msgid "Loading file: %s" msgstr "載入檔案:%s" @@ -4758,31 +4790,6 @@ msgstr "設定檔無法載入。" msgid "The 3mf is generated by old Orca Slicer, load geometry data only." msgstr "該 3mf 檔案來自舊版本的 Orca Slicer" -#, c-format, boost-format -msgid "This slicer file version %s is newer than %s's version:" -msgstr "" - -msgid "" -"Would you like to update your Bambu Studio software to enable all " -"functionality in this slicer file?\n" -msgstr "" - -msgid "Newer 3mf version" -msgstr "較新的 3mf 版本" - -msgid "" -"you can always update Bambu Studio at your convenience. The slicer file will " -"now be loaded without full functionality." -msgstr "" - -#, c-format, boost-format -msgid "" -"This slicer file version %s is newer than %s's version.\n" -"\n" -"Would you like to update your Bambu Studio software to enable all " -"functionality in this slicer file?" -msgstr "" - msgid "Invalid values found in the 3mf:" msgstr "在 3mf 檔案中發現無效值:" @@ -5014,6 +5021,9 @@ msgid "" "import it." msgstr "匯入 Orca Slicer 失敗。 請下載該檔案並手動匯入。" +msgid "Import SLA archive" +msgstr "" + msgid "The selected file" msgstr "已選擇的檔案" @@ -5095,6 +5105,15 @@ msgid "" "will be exported." msgstr "無法對模型網格執行布林運算。只有正面部分將被導出。" +msgid "" +"Are you sure you want to store original SVGs with their local paths into the " +"3MF file?\n" +"If you hit 'NO', all SVGs in the project will not be editable any more." +msgstr "" + +msgid "Private protection" +msgstr "" + #, fuzzy msgid "Is the printer ready? Is the print sheet in place, empty and clean?" msgstr "列印設備是否準備完成?列印平台是否在正確的位置、有沒有異物、是否乾淨?" @@ -5121,6 +5140,9 @@ msgstr "傳送到列印設備" msgid "Custom supports and color painting were removed before repairing." msgstr "自訂的支撐和上色在模型修復之前將被清除。" +msgid "Optimize Rotation" +msgstr "" + msgid "Invalid number" msgstr "無效數字" @@ -5284,14 +5306,6 @@ msgstr "啟動後顯示\"每日小提示\"通知" msgid "If enabled, useful hints are displayed at startup." msgstr "如果啟用,將在啟動時顯示有用的提示。" -#, fuzzy -msgid "Show g-code window" -msgstr "顯示 G-code 視窗" - -#, fuzzy -msgid "If enabled, g-code window will be displayed." -msgstr "如果啟用,將顯示 G-Code 視窗。" - msgid "Flushing volumes: Auto-calculate everytime the color changed." msgstr "" @@ -5607,7 +5621,7 @@ msgstr "另存 %s 為" msgid "User Preset" msgstr "使用者預設" -msgid "Project Inside Preset" +msgid "Preset Inside Project" msgstr "項目預設" msgid "Name is invalid;" @@ -5681,6 +5695,9 @@ msgstr "任務已取消" msgid "(LAN)" msgstr "(區域網路)" +msgid "Search" +msgstr "" + msgid "My Device" msgstr "我的設備" @@ -5712,17 +5729,17 @@ msgstr "低溫列印版" msgid "PLA Plate" msgstr "PLA 列印板" -msgid "Bamabu Engineering Plate" +msgid "Bambu Engineering Plate" msgstr "工程列印熱床" -msgid "Bamabu Smooth PEI Plate" +msgid "Bambu Smooth PEI Plate" msgstr "" #, fuzzy msgid "High temperature Plate" msgstr "高溫列印板" -msgid "Bamabu Textured PEI Plate" +msgid "Bambu Textured PEI Plate" msgstr "" msgid "Send print job to" @@ -5958,6 +5975,12 @@ msgstr "列印設備需要與 Orca Slicer 在同一個區域網路內。" msgid "The printer does not support sending to printer SD card." msgstr "該列印設備不支援傳送到 SD 記憶卡。" +msgid "Slice ok." +msgstr "切片完成." + +msgid "View all Daily tips" +msgstr "" + msgid "Failed to create socket" msgstr "建立網路端點連線失敗" @@ -6145,12 +6168,26 @@ msgstr "" "當使用專用的支撐線材時,我們推薦以下設定:\n" "0 頂層z距離,0 接觸層間距,同心圖案,並且禁用獨立支撐層高" +msgid "" +"Layer height exceeds the limit in Printer Settings -> Extruder -> Layer " +"height limits ,this may cause printing quality issues." +msgstr "" + +msgid "Adjust to the set range automatically? \n" +msgstr "" + +msgid "Adjust" +msgstr "" + +msgid "Ignore" +msgstr "" + #, fuzzy msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add " -"Primitive\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add Primitive" +"\"->\"Timelapse Wipe Tower\"." msgstr "" "在錄製無工具頭縮時錄影影片時,建議增加“縮時錄影擦拭塔”\n" "右鍵單擊列印板的空白位置,選擇“新增標準模型”->“縮時錄影擦拭塔”。" @@ -6167,6 +6204,15 @@ msgstr "精度" msgid "Wall generator" msgstr "牆產生器" +msgid "Walls and surfaces" +msgstr "" + +msgid "Bridging" +msgstr "" + +msgid "Overhangs" +msgstr "" + msgid "Walls" msgstr "牆" @@ -6523,6 +6569,12 @@ msgid "Following preset will be deleted too." msgid_plural "Following presets will be deleted too." msgstr[0] "下列預設將被一起刪除。" +msgid "" +"Are you sure to delete the selected preset? \n" +"If the preset corresponds to a filament currently in use on your printer, " +"please reset the filament information for that slot." +msgstr "" + #, fuzzy, boost-format msgid "Are you sure to %1% the selected preset?" msgstr "確定要 %1% 所選預設嗎?" @@ -6551,7 +6603,7 @@ msgstr "未定義" msgid "Unsaved Changes" msgstr "未儲存的更改" -msgid "Discard or Keep changes" +msgid "Transfer or discard changes" msgstr "放棄或保留更改" msgid "Old Value" @@ -6778,19 +6830,15 @@ msgstr "尖端成型線寬" msgid "Ramming line spacing" msgstr "尖端成型線間距" -msgid "Auto-Calc" -msgstr "自動計算" - -msgid "Re-calculate" +msgid "Recalculate" msgstr "" msgid "Flushing volumes for filament change" msgstr "線材更換時產生的廢料體積" msgid "" -"Studio would re-calculate your flushing volumes everytime the filaments " -"color changed. You could disable the auto-calculate in Bambu Studio > " -"Preferences" +"Orca recalculates your flushing volumes everytime the filament colors " +"change. You can change this behavior in Preferences." msgstr "" msgid "Flushing volume (mm³) for each filament pair." @@ -6808,15 +6856,6 @@ msgstr "倍數的數值範圍是[%.2f, %.2f]" msgid "Multiplier" msgstr "倍數" -msgid "unloaded" -msgstr "退料" - -msgid "loaded" -msgstr "進料" - -msgid "Filament #" -msgstr "線材#" - msgid "From" msgstr "從" @@ -7203,6 +7242,9 @@ msgstr "列印中" msgid "Idle" msgstr "閒置" +msgid "Beta version" +msgstr "" + msgid "Latest version" msgstr "最新版本" @@ -7555,6 +7597,25 @@ msgstr "您可能想要減小模型的尺寸或更改目前的列印設定並重 msgid "Variable layer height is not supported with Organic supports." msgstr "有機樹支撐不支持可變層高。" +msgid "" +"Different nozzle diameters and different filament diameters is not allowed " +"when prime tower is enabled." +msgstr "" + +msgid "" +"The Wipe Tower is currently only supported with the relative extruder " +"addressing (use_relative_e_distances=1)." +msgstr "" + +msgid "" +"Ooze prevention is currently not supported with the prime tower enabled." +msgstr "" + +msgid "" +"The prime tower is currently only supported for the Marlin, RepRap/Sprinter, " +"RepRapFirmware and Repetier G-code flavors." +msgstr "" + #, fuzzy msgid "The prime tower is not supported in \"By object\" print." msgstr "逐件列印模式下無法使用擦拭塔。" @@ -7621,11 +7682,6 @@ msgstr "使用支撐添加器但沒有打開支撐。請打開支撐。" msgid "Layer height cannot exceed nozzle diameter" msgstr "層高不能超過噴嘴直徑" -msgid "" -"Layer height cannot exceed the limit in Printer Settings -> Extruder -> " -"Layer height limits" -msgstr "" - #, fuzzy msgid "" "Relative extruder addressing requires resetting the extruder position at " @@ -7722,6 +7778,12 @@ msgstr "可列印高度" msgid "Maximum printable height which is limited by mechanism of printer" msgstr "最大可列印高度受列印設備硬體限制" +msgid "Preferred orientation" +msgstr "" + +msgid "Automatically orient stls on the Z-axis upon initial import" +msgstr "" + #, fuzzy msgid "Printer preset names" msgstr "列印設備預設名稱" @@ -7989,7 +8051,7 @@ msgstr "橋接密度" msgid "Density of external bridges. 100% means solid bridge. Default is 100%." msgstr "外部橋接的密度。 100% 意味著堅固的橋樑。 預設值為 100%。" -msgid "Bridge flow" +msgid "Bridge flow ratio" msgstr "橋接流量" #, fuzzy @@ -7998,6 +8060,15 @@ msgid "" "material for bridge, to improve sag" msgstr "稍微減小這個數值(比如 0.9)可以減小橋接的線材量,來改善下垂。" +msgid "Internal bridge flow ratio" +msgstr "" + +msgid "" +"This value governs the thickness of the internal bridge layer. This is the " +"first layer over sparse infill. Decrease this value slightly (for example " +"0.9) to improve surface quality over sparse infill." +msgstr "" + msgid "Top surface flow ratio" msgstr "頂部表面流量比例" @@ -8347,6 +8418,15 @@ msgstr "" "如果啟用,橋接會更可靠,可以橋接更長的距離,但可能看起來更糟。如果關閉,橋梁" "看起來更好,但只適用於較短的橋接距離。" +msgid "Thick internal bridges" +msgstr "" + +msgid "" +"If enabled, thick internal bridges will be used. It's usually recommended to " +"have this feature turned on. However, consider turning it off if you are " +"using large nozzles." +msgstr "" + msgid "Max bridge length" msgstr "最大橋接長度" @@ -8427,7 +8507,7 @@ msgid "Internal solid infill pattern" msgstr "內部實心填充圖案" msgid "" -"Line pattern of internal solid infill. if the detect nattow internal solid " +"Line pattern of internal solid infill. if the detect narrow internal solid " "infill be enabled, the concentric pattern will be used for the small area." msgstr "" "內部實心填充的線型圖案。如果啟用了偵測狹窄的內部實心填充,將使用同心圓圖案來" @@ -8464,25 +8544,55 @@ msgid "" "This sets the threshold for small perimeter length. Default threshold is 0mm" msgstr "這設定了微小部位周長的臨界值。 預設臨界值是 0mm" -msgid "Order of walls" +msgid "Walls printing order" msgstr "" -msgid "Print sequence of inner wall and outer wall. " +msgid "" +"Print sequence of the internal (inner) and external (outer) walls. \n" +"\n" +"Use Inner/Outer for best overhangs. This is because the overhanging walls " +"can adhere to a neighouring perimeter while printing. However, this option " +"results in slightly reduced surface quality as the external perimeter is " +"deformed by being squashed to the internal perimeter.\n" +"\n" +"Use Inner/Outer/Inner for the best external surface finish and dimensional " +"accuracy as the external wall is printed undisturbed from an internal " +"perimeter. However, overhang performance will reduce as there is no internal " +"perimeter to print the external wall against. This option requires a minimum " +"of 3 walls to be effective as it prints the internal walls from the 3rd " +"perimeter onwards first, then the external perimeter and, finally, the first " +"internal perimeter. This option is recomended against the Outer/Inner option " +"in most cases. \n" +"\n" +"Use Outer/Inner for the same external wall quality and dimensional accuracy " +"benefits of Inner/Outer/Inner option. However, the z seams will appear less " +"consistent as the first extrusion of a new layer starts on a visible " +"surface.\n" +"\n" +" " msgstr "" -msgid "inner/outer" +msgid "Inner/Outer" msgstr "" -msgid "outer/inner" +msgid "Outer/Inner" msgstr "" -msgid "inner wall/outer wall/inner wall" +msgid "Inner/Outer/Inner" msgstr "" msgid "Print infill first" msgstr "" -msgid "Order of wall/infill. false means print wall first. " +msgid "" +"Order of wall/infill. When the tickbox is unchecked the walls are printed " +"first, which works best in most cases.\n" +"\n" +"Printing walls first may help with extreme overhangs as the walls have the " +"neighbouring infill to adhere to. However, the infill will slighly push out " +"the printed walls where it is attached to them, resulting in a worse " +"external surface finish. It can also cause the infill to shine through the " +"external surfaces of the part." msgstr "" msgid "Height to rod" @@ -8832,9 +8942,11 @@ msgstr "稀疏填充圖案的角度,決定走線的開始或整體方向。" msgid "Sparse infill density" msgstr "稀疏填充密度" -#, fuzzy, c-format -msgid "Density of internal sparse infill, 100% means solid throughout" -msgstr "內部稀疏填充密度,100%% 表示整體實心" +#, c-format, boost-format +msgid "" +"Density of internal sparse infill, 100% turns all sparse infill into solid " +"infill and internal solid infill pattern will be used" +msgstr "" msgid "Sparse infill pattern" msgstr "稀疏填充圖案" @@ -9052,10 +9164,10 @@ msgstr "滿速風扇在" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer " -"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " -"than \"close_fan_the_first_x_layers\", in which case the fan will be running " -"at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" +"\". \"full_fan_speed_layer\" will be ignored if lower than " +"\"close_fan_the_first_x_layers\", in which case the fan will be running at " +"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." msgstr "" "風扇速度將從“禁用第一層”的零線性上升到“全風扇速度層”的最大。如果低於“禁用風扇" "第一層”,則“全風扇速度第一層”將被忽略,在這種情況下,風扇將在“禁用風扇第一" @@ -9110,6 +9222,12 @@ msgid "" "segment" msgstr "產生絨毛表面時,插入的隨機點之間的平均距離" +msgid "Apply fuzzy skin to first layer" +msgstr "" + +msgid "Whether to apply fuzzy skin on the first layer" +msgstr "" + msgid "Filter out tiny gaps" msgstr "忽略微小間隙" @@ -9782,7 +9900,7 @@ msgid "User can self-define the project file name when export" msgstr "使用者可以自訂匯出項目檔案的名稱。" #, fuzzy -msgid "Make overhang printable" +msgid "Make overhangs printable" msgstr "懸空可列印" #, fuzzy @@ -9790,7 +9908,7 @@ msgid "Modify the geometry to print overhangs without support material." msgstr "修改幾何形狀使得懸空部分無需支撐材料或者橋接列印。" #, fuzzy -msgid "Make overhang printable maximum angle" +msgid "Make overhangs printable - Maximum angle" msgstr "懸空可列印的最大角度" msgid "" @@ -9801,7 +9919,7 @@ msgstr "" "開啟使懸空可列印後,允許的懸空最大角度。90° 將完全不改變模型並允許任何懸空," "而0° 將用圓錐形材料替換所有懸空部分。" -msgid "Make overhang printable hole area" +msgid "Make overhangs printable - Hole area" msgstr "最大孔洞面積" msgid "" @@ -10042,6 +10160,9 @@ msgstr "" msgid "Show auto-calibration marks" msgstr "顯示雷達校準線" +msgid "Disable set remaining print time" +msgstr "" + msgid "Seam position" msgstr "接縫位置" @@ -10168,6 +10289,22 @@ msgstr "" "沿著物件的外輪廓螺旋上升,將實體模型轉變為只有底面實心層和側面單層牆壁的列" "印。最後產生的列印物件沒有接縫。" +msgid "Smooth Spiral" +msgstr "" + +msgid "" +"Smooth Spiral smoothes out X and Y moves as wellresulting in no visible seam " +"at all, even in the XY directions on walls that are not vertical" +msgstr "" + +msgid "Max XY Smoothing" +msgstr "" + +msgid "" +"Maximum distance to move points in XY to try to achieve a smooth spiralIf " +"expressed as a %, it will be computed over nozzle diameter" +msgstr "" + msgid "" "If smooth or traditional mode is selected, a timelapse video will be " "generated for each print. After each layer is printed, a snapshot is taken " @@ -10371,10 +10508,11 @@ msgid "" "filament for support and current filament is used" msgstr "列印支撐主體和筏層的線材。\"預設\"代表不指定特定的線材,並使用目前線材" -msgid "No interface filament for body" +msgid "Avoid interface filament for base" msgstr "" -msgid "Don't use support interface filament to print support body" +msgid "" +"Avoid using support interface filament to print support base if possible." msgstr "" msgid "" @@ -10630,11 +10768,11 @@ msgstr "" "該數值大於以分支直徑得到的圓形面積時,將列印雙層牆以確保穩定性。 如果不使用雙" "層牆體,請將此值設為 0。" -msgid "Tree support wall loops" -msgstr "樹狀支撐外牆層數" +msgid "Support wall loops" +msgstr "" -msgid "This setting specify the count of walls around tree support" -msgstr "樹狀支撐外牆層數" +msgid "This setting specify the count of walls around support" +msgstr "" msgid "Tree support with infill" msgstr "樹狀支撐產生填充" @@ -10746,8 +10884,16 @@ msgid "Wipe Distance" msgstr "擦拭距離" msgid "" -"Discribe how long the nozzle will move along the last path when retracting" -msgstr "表示回抽時擦拭的移動距離。" +"Discribe how long the nozzle will move along the last path when " +"retracting. \n" +"\n" +"Depending on how long the wipe operation lasts, how fast and long the " +"extruder/filament retraction settings are, a retraction move may be needed " +"to retract the remaining filament. \n" +"\n" +"Setting a value in the retract amount before wipe setting below will perform " +"any excess retraction before the wipe, else it will be performed after." +msgstr "" msgid "" "The wiping tower can be used to clean up the residue on the nozzle and " @@ -11058,10 +11204,6 @@ msgstr "" msgid "invalid value " msgstr "無效值" -#, c-format, boost-format -msgid " doesn't work at 100%% density " -msgstr " 填充圖案不支援 100%% 密度" - #, fuzzy msgid "Invalid value when spiral vase mode is enabled: " msgstr "花瓶模式時無效值:" @@ -12024,6 +12166,725 @@ msgstr "零件 2" msgid "Delete input" msgstr "刪除輸入" +msgid "Network Test" +msgstr "" + +msgid "Start Test Multi-Thread" +msgstr "" + +msgid "Start Test Single-Thread" +msgstr "" + +msgid "Export Log" +msgstr "" + +msgid "Studio Version:" +msgstr "" + +msgid "System Version:" +msgstr "" + +msgid "DNS Server:" +msgstr "" + +msgid "Test BambuLab" +msgstr "" + +msgid "Test BambuLab:" +msgstr "" + +msgid "Test Bing.com" +msgstr "" + +msgid "Test bing.com:" +msgstr "" + +msgid "Test HTTP" +msgstr "" + +msgid "Test HTTP Service:" +msgstr "" + +msgid "Test storage" +msgstr "" + +msgid "Test Storage Upload:" +msgstr "" + +msgid "Test storage upgrade" +msgstr "" + +msgid "Test Storage Upgrade:" +msgstr "" + +msgid "Test storage download" +msgstr "" + +msgid "Test Storage Download:" +msgstr "" + +msgid "Test plugin download" +msgstr "" + +msgid "Test Plugin Download:" +msgstr "" + +msgid "Test Storage Upload" +msgstr "" + +msgid "Log Info" +msgstr "" + +msgid "Select filament preset" +msgstr "" + +msgid "Create Filament" +msgstr "" + +msgid "Create Based on Current Filament" +msgstr "" + +msgid "Copy Current Filament Preset " +msgstr "" + +msgid "Basic Information" +msgstr "" + +msgid "Add Filament Preset under this filament" +msgstr "" + +msgid "We could create the filament presets for your following printer:" +msgstr "" + +msgid "Select Vendor" +msgstr "" + +msgid "Input Custom Vendor" +msgstr "" + +msgid "Can't find vendor I want" +msgstr "" + +msgid "Select Type" +msgstr "" + +msgid "Select Filament Preset" +msgstr "" + +msgid "Serial" +msgstr "" + +msgid "e.g. Basic, Matte, Silk, Marble" +msgstr "" + +msgid "Filament Preset" +msgstr "" + +msgid "Create" +msgstr "" + +msgid "Vendor is not selected, please reselect vendor." +msgstr "" + +msgid "Custom vendor is not input, please input custom vendor." +msgstr "" + +msgid "" +"\"Bambu\" or \"Generic\" can not be used as a Vendor for custom filaments." +msgstr "" + +msgid "Filament type is not selected, please reselect type." +msgstr "" + +msgid "Filament serial is not inputed, please input serial." +msgstr "" + +msgid "" +"There may be escape characters in the vendor or serial input of filament. " +"Please delete and re-enter." +msgstr "" + +msgid "All inputs in the custom vendor or serial are spaces. Please re-enter." +msgstr "" + +msgid "The vendor can not be a number. Please re-enter." +msgstr "" + +msgid "" +"You have not selected a printer or preset yet. Please select at least one." +msgstr "" + +msgid "Some existing presets have failed to be created, as follows:\n" +msgstr "" + +msgid "" +"\n" +"Do you want to rewrite it?" +msgstr "" + +msgid "" +"We would rename the presets as \"Vendor Type Serial @printer you selected" +"\". \n" +"To add preset for more prinetrs, Please go to printer selection" +msgstr "" + +msgid "Create Printer/Nozzle" +msgstr "" + +msgid "Create Printer" +msgstr "" + +msgid "Create Nozzle for Existing Printer" +msgstr "" + +msgid "Create from Template" +msgstr "" + +msgid "Create Based on Current Printer" +msgstr "" + +msgid "wiki" +msgstr "" + +msgid "Import Preset" +msgstr "" + +msgid "Create Type" +msgstr "" + +msgid "The model is not fond, place reselect vendor." +msgstr "" + +msgid "Select Model" +msgstr "" + +msgid "Select Printer" +msgstr "" + +msgid "Input Custom Model" +msgstr "" + +msgid "Can't find my printer model" +msgstr "" + +msgid "Rectangle" +msgstr "" + +msgid "Printable Space" +msgstr "" + +msgid "X" +msgstr "" + +msgid "Y" +msgstr "" + +msgid "Hot Bed STL" +msgstr "" + +msgid "Load stl" +msgstr "" + +msgid "Hot Bed SVG" +msgstr "" + +msgid "Load svg" +msgstr "" + +msgid "Max Print Height" +msgstr "" + +#, c-format, boost-format +msgid "The file exceeds %d MB, please import again." +msgstr "" + +msgid "Exception in obtaining file size, please import again." +msgstr "" + +msgid "Preset path is not find, please reselect vendor." +msgstr "" + +msgid "The printer model was not found, please reselect." +msgstr "" + +msgid "The nozzle diameter is not fond, place reselect." +msgstr "" + +msgid "The printer preset is not fond, place reselect." +msgstr "" + +msgid "Printer Preset" +msgstr "" + +msgid "Filament Preset Template" +msgstr "" + +msgid "Deselect All" +msgstr "" + +msgid "Process Preset Template" +msgstr "" + +msgid "Back Page 1" +msgstr "" + +msgid "" +"You have not yet chosen which printer preset to create based on. Please " +"choose the vendor and model of the printer" +msgstr "" + +msgid "" +"You have entered an illegal input in the printable area section on the first " +"page. Please check before creating it." +msgstr "" + +msgid "The custom printer or model is not inputed, place input." +msgstr "" + +msgid "" +"The printer preset you created already has a preset with the same name. Do " +"you want to overwrite it?\n" +"\tYes: Overwrite the printer preset with the same name, and filament and " +"process presets with the same preset name will be recreated \n" +"and filament and process presets without the same preset name will be " +"reserve.\n" +"\tCancel: Do not create a preset, return to the creation interface." +msgstr "" + +msgid "You need to select at least one filament preset." +msgstr "" + +msgid "You need to select at least one process preset." +msgstr "" + +msgid "Create filament presets failed. As follows:\n" +msgstr "" + +msgid "Create process presets failed. As follows:\n" +msgstr "" + +msgid "Vendor is not find, please reselect." +msgstr "" + +msgid "Current vendor has no models, please reselect." +msgstr "" + +msgid "" +"You have not selected the vendor and model or inputed the custom vendor and " +"model." +msgstr "" + +msgid "" +"There may be escape characters in the custom printer vendor or model. Please " +"delete and re-enter." +msgstr "" + +msgid "" +"All inputs in the custom printer vendor or model are spaces. Please re-enter." +msgstr "" + +msgid "Please check bed printable shape and origin input." +msgstr "" + +msgid "" +"You have not yet selected the printer to replace the nozzle, please choose." +msgstr "" + +msgid "Create Printer Successful" +msgstr "" + +msgid "Create Filament Successful" +msgstr "" + +msgid "Printer Created" +msgstr "" + +msgid "Please go to printer settings to edit your presets" +msgstr "" + +msgid "Filament Created" +msgstr "" + +msgid "" +"Please go to filament setting to edit your presets if you need.\n" +"Please note that nozzle temperature, hot bed temperature, and maximum " +"volumetric speed have a significant impact on printing quality. Please set " +"them carefully." +msgstr "" + +msgid "Printer Setting" +msgstr "" + +msgid "Export Configs" +msgstr "" + +msgid "Printer config bundle(.bbscfg)" +msgstr "" + +msgid "Filament bundle(.bbsflmt)" +msgstr "" + +msgid "Printer presets(.zip)" +msgstr "" + +msgid "Filament presets(.zip)" +msgstr "" + +msgid "Process presets(.zip)" +msgstr "" + +msgid "initialize fail" +msgstr "" + +msgid "add file fail" +msgstr "" + +msgid "add bundle structure file fail" +msgstr "" + +msgid "finalize fail" +msgstr "" + +msgid "open zip written fail" +msgstr "" + +msgid "Export successful" +msgstr "" + +#, c-format, boost-format +msgid "" +"The '%s' folder already exists in the current directory. Do you want to " +"clear it and rebuild it.\n" +"If not, a time suffix will be added, and you can modify the name after " +"creation." +msgstr "" + +msgid "" +"Printer and all the filament&process presets that belongs to the printer. \n" +"Can be shared with others." +msgstr "" + +msgid "" +"User's fillment preset set. \n" +"Can be shared with others." +msgstr "" + +msgid "" +"Only display printer names with changes to printer, filament, and process " +"presets." +msgstr "" + +msgid "Only display the filament names with changes to filament presets." +msgstr "" + +msgid "" +"Only printer names with user printer presets will be displayed, and each " +"preset you choose will be exported as a zip." +msgstr "" + +msgid "" +"Only the filament names with user filament presets will be displayed, \n" +"and all user filament presets in each filament name you select will be " +"exported as a zip." +msgstr "" + +msgid "" +"Only printer names with changed process presets will be displayed, \n" +"and all user process presets in each printer name you select will be " +"exported as a zip." +msgstr "" + +msgid "Please select at least one printer or filament." +msgstr "" + +msgid "Please select a type you want to export" +msgstr "" + +msgid "Edit Filament" +msgstr "" + +msgid "Filament presets under this filament" +msgstr "" + +msgid "" +"Note: If the only preset under this filament is deleted, the filament will " +"be deleted after exiting the dialog." +msgstr "" + +msgid "Presets inherited by other presets can not be deleted" +msgstr "" + +msgid "The following presets inherits this preset." +msgid_plural "The following preset inherits this preset." +msgstr[0] "" + +msgid "Delete Preset" +msgstr "" + +msgid "Are you sure to delete the selected preset?" +msgstr "" + +msgid "Delete preset" +msgstr "" + +msgid "+ Add Preset" +msgstr "" + +msgid "Delete Filament" +msgstr "" + +msgid "" +"All the filament presets belong to this filament would be deleted. \n" +"If you are using this filament on your printer, please reset the filament " +"information for that slot." +msgstr "" + +msgid "Delete filament" +msgstr "" + +msgid "Add Preset" +msgstr "" + +msgid "Add preset for new printer" +msgstr "" + +msgid "Copy preset from filament" +msgstr "" + +msgid "The filament choice not find filament preset, please reselect it" +msgstr "" + +msgid "Edit Preset" +msgstr "" + +msgid "For more information, please check out Wiki" +msgstr "" + +msgid "Collapse" +msgstr "" + +msgid "Daily Tips" +msgstr "" + +#, fuzzy +msgid "Need select printer" +msgstr "需要選擇列印設備" + +msgid "The start, end or step is not valid value." +msgstr "開始、結束或步距不是有效值。" + +msgid "" +"Unable to calibrate: maybe because the set calibration value range is too " +"large, or the step is too small" +msgstr "無法校準:可能是設定的校準值範圍太大,或步距太小" + +#, fuzzy +msgid "Physical Printer" +msgstr "實體列印設備" + +msgid "Print Host upload" +msgstr "" + +msgid "Could not get a valid Printer Host reference" +msgstr "" + +msgid "Success!" +msgstr "成功!" + +#, fuzzy +msgid "Refresh Printers" +msgstr "重新整理列印設備" + +#, fuzzy +msgid "" +"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" +"signed certificate." +msgstr "" +"HTTPS CA 憑證檔案是可選的。 僅當您使用具有自帶簽名憑證的 HTTPS 時才需要它。" + +#, fuzzy +msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" +msgstr "憑證檔(*.crt, *.pem)|*.crt;*.pem|All files|*.*" + +msgid "Open CA certificate file" +msgstr "開啟 CA憑證檔" + +#, fuzzy, c-format, boost-format +msgid "" +"On this system, %s uses HTTPS certificates from the system Certificate Store " +"or Keychain." +msgstr "在此系統上,%s 使用系統憑證儲存庫或鑰匙圈中的 HTTPS 憑證。" + +msgid "" +"To use a custom CA file, please import your CA file into Certificate Store / " +"Keychain." +msgstr "若要使用自訂 CA 憑證檔,請將您的 CA 憑證檔匯入到憑證儲存庫/鑰匙圈中。" + +msgid "Connection to printers connected via the print host failed." +msgstr "" + +#, c-format, boost-format +msgid "Mismatched type of print host: %s" +msgstr "" + +msgid "Connection to AstroBox works correctly." +msgstr "" + +msgid "Could not connect to AstroBox" +msgstr "" + +msgid "Note: AstroBox version at least 1.1.0 is required." +msgstr "" + +msgid "Connection to Duet works correctly." +msgstr "" + +msgid "Could not connect to Duet" +msgstr "" + +msgid "Unknown error occured" +msgstr "" + +msgid "Wrong password" +msgstr "" + +msgid "Could not get resources to create a new connection" +msgstr "" + +msgid "Upload not enabled on FlashAir card." +msgstr "" + +msgid "Connection to FlashAir works correctly and upload is enabled." +msgstr "" + +msgid "Could not connect to FlashAir" +msgstr "" + +msgid "" +"Note: FlashAir with firmware 2.00.02 or newer and activated upload function " +"is required." +msgstr "" + +msgid "Connection to MKS works correctly." +msgstr "" + +msgid "Could not connect to MKS" +msgstr "" + +msgid "Connection to OctoPrint works correctly." +msgstr "" + +msgid "Could not connect to OctoPrint" +msgstr "" + +msgid "Note: OctoPrint version at least 1.1.0 is required." +msgstr "" + +msgid "Connection to Prusa SL1 / SL1S works correctly." +msgstr "" + +msgid "Could not connect to Prusa SLA" +msgstr "" + +msgid "Connection to PrusaLink works correctly." +msgstr "" + +msgid "Could not connect to PrusaLink" +msgstr "" + +msgid "Storages found" +msgstr "" + +#. TRN %1% = storage path +#, boost-format +msgid "%1% : read only" +msgstr "" + +#. TRN %1% = storage path +#, boost-format +msgid "%1% : no free space" +msgstr "" + +#. TRN %1% = host +#, boost-format +msgid "Upload has failed. There is no suitable storage found at %1%." +msgstr "" + +msgid "Connection to Prusa Connect works correctly." +msgstr "" + +msgid "Could not connect to Prusa Connect" +msgstr "" + +msgid "Connection to Repetier works correctly." +msgstr "" + +msgid "Could not connect to Repetier" +msgstr "" + +msgid "Note: Repetier version at least 0.90.0 is required." +msgstr "" + +#, boost-format +msgid "" +"HTTP status: %1%\n" +"Message body: \"%2%\"" +msgstr "" + +#, boost-format +msgid "" +"Parsing of host response failed.\n" +"Message body: \"%1%\"\n" +"Error: \"%2%\"" +msgstr "" + +#, boost-format +msgid "" +"Enumeration of host printers failed.\n" +"Message body: \"%1%\"\n" +"Error: \"%2%\"" +msgstr "" + +#: resources/data/hints.ini: [hint:Precise wall] +msgid "" +"Precise wall\n" +"Did you know that turning on precise wall can improve precision and layer " +"consistency?" +msgstr "" + +#: resources/data/hints.ini: [hint:Sandwich mode] +msgid "" +"Sandwich mode\n" +"Did you know that you can use sandwich mode (inner-outer-inner) to improve " +"precision and layer consistency if your model doesn't have very steep " +"overhangs?" +msgstr "" + +#: resources/data/hints.ini: [hint:Chamber temperature] +msgid "" +"Chamber temperature\n" +"Did you know that OrcaSlicer supports chamber temperature?" +msgstr "" + +#: resources/data/hints.ini: [hint:Calibration] +msgid "" +"Calibration\n" +"Did you know that calibrating your printer can do wonders? Check out our " +"beloved calibration solution in OrcaSlicer." +msgstr "" + +#: resources/data/hints.ini: [hint:Auxiliary fan] +msgid "" +"Auxiliary fan\n" +"Did you know that OrcaSlicer supports Auxiliary part cooling fan?" +msgstr "" + +#: resources/data/hints.ini: [hint:Air filtration] +msgid "" +"Air filtration/Exhuast Fan\n" +"Did you know that OrcaSlicer can support Air filtration/Exhuast Fan?" +msgstr "" + #: resources/data/hints.ini: [hint:How to use keyboard shortcuts] msgid "" "How to use keyboard shortcuts\n" @@ -12108,12 +12969,8 @@ msgstr "" msgid "" "Simplify Model\n" "Did you know that you can reduce the number of triangles in a mesh using the " -"Simplify mesh feature? Right-click the model and select Simplify model. Read " -"more in the documentation." +"Simplify mesh feature? Right-click the model and select Simplify model." msgstr "" -"簡化模型\n" -"您知道嗎,您可以使用“簡化模型”功能減少模型的三角形數。在模型上單擊滑鼠右鍵," -"然後選擇“簡化模型”。" #: resources/data/hints.ini: [hint:Slicing Parameter Table] #, fuzzy @@ -12136,16 +12993,12 @@ msgstr "" "您知道嗎,您可以把一個大物件分割成多個小物件/零件以便著色或列印。" #: resources/data/hints.ini: [hint:Subtract a Part] -#, fuzzy msgid "" "Subtract a Part\n" "Did you know that you can subtract one mesh from another using the Negative " "part modifier? That way you can, for example, create easily resizable holes " -"directly in Orca Slicer. Read more in the documentation." +"directly in Orca Slicer." msgstr "" -"減去部分幾何體\n" -"您知道嗎,您可以使用負零件從另一個幾何體中減去另一個幾何體。例如,可以直接在 " -"Orca Slicer 中建立可輕鬆調整大小的孔。" #: resources/data/hints.ini: [hint:STEP] #, fuzzy @@ -12302,6 +13155,120 @@ msgid "" "probability of warping." msgstr "" +#~ msgid "Edit Text" +#~ msgstr "編輯文字" + +#~ msgid "Error! Unable to create thread!" +#~ msgstr "發生錯誤,無法建立執行緒。" + +#~ msgid "Exception" +#~ msgstr "異常" + +#~ msgid "Choose SLA archive:" +#~ msgstr "選擇 SLA 存檔:" + +#~ msgid "Import file" +#~ msgstr "匯入檔案" + +#~ msgid "Import model and profile" +#~ msgstr "匯入模型和設定檔" + +#~ msgid "Import profile only" +#~ msgstr "僅匯入設定檔" + +#~ msgid "Import model only" +#~ msgstr "僅匯入模型" + +#~ msgid "Accurate" +#~ msgstr "準確的" + +#~ msgid "Balanced" +#~ msgstr "平衡的" + +#~ msgid "Quick" +#~ msgstr "快速的" + +#~ msgid "Auto-Calc" +#~ msgstr "自動計算" + +#~ msgid "unloaded" +#~ msgstr "退料" + +#~ msgid "loaded" +#~ msgstr "進料" + +#~ msgid "Filament #" +#~ msgstr "線材#" + +#~ msgid "" +#~ "Discribe how long the nozzle will move along the last path when retracting" +#~ msgstr "表示回抽時擦拭的移動距離。" + +#~ msgid "" +#~ "Simplify Model\n" +#~ "Did you know that you can reduce the number of triangles in a mesh using " +#~ "the Simplify mesh feature? Right-click the model and select Simplify " +#~ "model. Read more in the documentation." +#~ msgstr "" +#~ "簡化模型\n" +#~ "您知道嗎,您可以使用“簡化模型”功能減少模型的三角形數。在模型上單擊滑鼠右" +#~ "鍵,然後選擇“簡化模型”。" + +#, fuzzy +#~ msgid "" +#~ "Subtract a Part\n" +#~ "Did you know that you can subtract one mesh from another using the " +#~ "Negative part modifier? That way you can, for example, create easily " +#~ "resizable holes directly in Orca Slicer. Read more in the documentation." +#~ msgstr "" +#~ "減去部分幾何體\n" +#~ "您知道嗎,您可以使用負零件從另一個幾何體中減去另一個幾何體。例如,可以直接" +#~ "在 Orca Slicer 中建立可輕鬆調整大小的孔。" + +#~ msgid "Filling bed " +#~ msgstr "填充自動朝向" + +#, boost-format +#~ msgid "%1% infill pattern doesn't support 100%% density." +#~ msgstr "%1% 填充圖案不支援 100%% 密度。" + +#~ msgid "" +#~ "Switch to rectilinear pattern?\n" +#~ "Yes - switch to rectilinear pattern automaticlly\n" +#~ "No - reset density to default non 100% value automaticlly" +#~ msgstr "" +#~ "切換到直線圖案?\n" +#~ "是 - 自動切換到直線圖案\n" +#~ "否 - 自動將密度重設為預設的非 100% 值" + +#~ msgid "Please heat the nozzle to above 170 degree before loading filament." +#~ msgstr "請在進料前把噴嘴升溫到 170℃" + +#~ msgid "Newer 3mf version" +#~ msgstr "較新的 3mf 版本" + +#, fuzzy +#~ msgid "Show g-code window" +#~ msgstr "顯示 G-code 視窗" + +#, fuzzy +#~ msgid "If enabled, g-code window will be displayed." +#~ msgstr "如果啟用,將顯示 G-Code 視窗。" + +#, fuzzy, c-format +#~ msgid "Density of internal sparse infill, 100% means solid throughout" +#~ msgstr "內部稀疏填充密度,100%% 表示整體實心" + +#~ msgid "Tree support wall loops" +#~ msgstr "樹狀支撐外牆層數" + +#~ msgid "This setting specify the count of walls around tree support" +#~ msgstr "樹狀支撐外牆層數" + +#, c-format, boost-format +#~ msgid " doesn't work at 100%% density " +#~ msgstr " 填充圖案不支援 100%% 密度" + #~ msgid "Ctrl + Shift + Enter" #~ msgstr "Ctrl + Shift + Enter" @@ -12326,9 +13293,6 @@ msgstr "" #~ msgid "Export all objects as STL" #~ msgstr "匯出所有物件為 STL" -#~ msgid "Slice ok." -#~ msgstr "切片完成." - #, fuzzy, c-format, boost-format #~ msgid "" #~ "The 3mf's version %s is newer than %s's version %s, Found following keys " @@ -12354,17 +13318,6 @@ msgstr "" #~ msgid "Add/Remove printers" #~ msgstr "新增/刪除列印設備" -#, fuzzy -#~ msgid "Bambu Engineering Plate" -#~ msgstr "Bambu 高溫工程列印板" - -#, fuzzy -#~ msgid "Bambu Smooth PEI Plate" -#~ msgstr "Bambu 光滑面列印板" - -#~ msgid "Bambu Textured PEI Plate" -#~ msgstr "Bambu 金屬紋理列印板" - #, fuzzy #~ msgid "" #~ "When print by object, machines with I3 structure will not generate " @@ -12578,56 +13531,6 @@ msgstr "" #~ msgid "The selected preset: %1% is not found." #~ msgstr "未找到選定的預設值:%1%。" -#, fuzzy -#~ msgid "Physical Printer" -#~ msgstr "實體列印設備" - -#~ msgid "Success!" -#~ msgstr "成功!" - -#, fuzzy -#~ msgid "Refresh Printers" -#~ msgstr "重新整理列印設備" - -#, fuzzy -#~ msgid "" -#~ "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" -#~ "signed certificate." -#~ msgstr "" -#~ "HTTPS CA 憑證檔案是可選的。 僅當您使用具有自帶簽名憑證的 HTTPS 時才需要" -#~ "它。" - -#, fuzzy -#~ msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" -#~ msgstr "憑證檔(*.crt, *.pem)|*.crt;*.pem|All files|*.*" - -#~ msgid "Open CA certificate file" -#~ msgstr "開啟 CA憑證檔" - -#, fuzzy, c-format, boost-format -#~ msgid "" -#~ "On this system, %s uses HTTPS certificates from the system Certificate " -#~ "Store or Keychain." -#~ msgstr "在此系統上,%s 使用系統憑證儲存庫或鑰匙圈中的 HTTPS 憑證。" - -#~ msgid "" -#~ "To use a custom CA file, please import your CA file into Certificate " -#~ "Store / Keychain." -#~ msgstr "" -#~ "若要使用自訂 CA 憑證檔,請將您的 CA 憑證檔匯入到憑證儲存庫/鑰匙圈中。" - -#~ msgid "The start, end or step is not valid value." -#~ msgstr "開始、結束或步距不是有效值。" - -#~ msgid "" -#~ "Unable to calibrate: maybe because the set calibration value range is too " -#~ "large, or the step is too small" -#~ msgstr "無法校準:可能是設定的校準值範圍太大,或步距太小" - -#, fuzzy -#~ msgid "Need select printer" -#~ msgstr "需要選擇列印設備" - #, fuzzy #~ msgid "" #~ "3D Scene Operations\n" @@ -12779,7 +13682,7 @@ msgstr "" #~ msgid "Score" #~ msgstr "打分" -#~ msgid "Bamabu High Temperature Plate" +#~ msgid "Bambu High Temperature Plate" #~ msgstr "高溫列印熱床" #~ msgid "Can't connect to the printer" diff --git a/resources/data/hints.ini b/resources/data/hints.ini index 53315be6d0..79cf15785a 100644 --- a/resources/data/hints.ini +++ b/resources/data/hints.ini @@ -62,12 +62,34 @@ # Weight must be larger or equal to 1. Default weight is 1. # Weight defines probability as weight : sum_of_all_weights. +[hint:Precise wall] +text = Precise wall\nDid you know that turning on precise wall can improve precision and layer consistency? +documentation_link = https://github.com/SoftFever/OrcaSlicer/wiki/Precise-wall + +[hint:Sandwich mode] +text = Sandwich mode\nDid you know that you can use sandwich mode (inner-outer-inner) to improve precision and layer consistency if your model doesn't have very steep overhangs? + +[hint:Chamber temperature] +text = Chamber temperature\nDid you know that OrcaSlicer supports chamber temperature? +documentation_link = https://github.com/SoftFever/OrcaSlicer/wiki/Chamber-temperature + +[hint:Calibration] +text = Calibration\nDid you know that calibrating your printer can do wonders? Check out our beloved calibration solution in OrcaSlicer. +documentation_link = https://github.com/SoftFever/OrcaSlicer/wiki/Calibration + +[hint:Auxiliary fan] +text = Auxiliary fan\nDid you know that OrcaSlicer supports Auxiliary part cooling fan? +documentation_link = https://github.com/SoftFever/OrcaSlicer/wiki/Auxiliary-fan + +[hint:Air filtration] +text = Air filtration/Exhuast Fan\nDid you know that OrcaSlicer can support Air filtration/Exhuast Fan? +documentation_link = https://github.com/SoftFever/OrcaSlicer/wiki/air-filtration + [hint:How to use keyboard shortcuts] text = How to use keyboard shortcuts\nDid you know that Orca Slicer offers a wide range of keyboard shortcuts and 3D scene operations. [hint:Cut Tool] text = Cut Tool\nDid you know that you can cut a model at any angle and position with the cutting tool? -image = images/dailytips_CutTool.PNG [hint:Fix Model] text = Fix Model\nDid you know that you can fix a corrupted 3D model to avoid a lot of slicing problems on the Windows system? @@ -77,50 +99,42 @@ text = Timelapse\nDid you know that you can generate a timelapse video during ea [hint:Auto-Arrange] text = Auto-Arrange\nDid you know that you can auto-arrange all objects in your project? -image = images/dailytips_AutoArrange.PNG [hint:Auto-Orient] text = Auto-Orient\nDid you know that you can rotate objects to an optimal orientation for printing by a simple click? [hint:Lay on Face] text = Lay on Face\nDid you know that you can quickly orient a model so that one of its faces sits on the print bed? Select the \"Place on face\" function or press the F key. -image = images/dailytips_LayOnFace.PNG [hint:Object List] text = Object List\nDid you know that you can view all objects/parts in a list and change settings for each object/part? -image = images/dailytips_ObjectList.PNG [hint:Search Functionality] text = Search Functionality\nDid you know that you use the Search tool to quickly find a specific Orca Slicer setting? [hint:Simplify Model] -text = Simplify Model\nDid you know that you can reduce the number of triangles in a mesh using the Simplify mesh feature? Right-click the model and select Simplify model. Read more in the documentation. -image = images/dailytips_SimplifyModel.PNG +text = Simplify Model\nDid you know that you can reduce the number of triangles in a mesh using the Simplify mesh feature? Right-click the model and select Simplify model. [hint:Slicing Parameter Table] text = Slicing Parameter Table\nDid you know that you can view all objects/parts on a table and change settings for each object/part? -image = images/dailytips_SlicingParamTable.PNG [hint:Split to Objects/Parts] text = Split to Objects/Parts\nDid you know that you can split a big object into small ones for easy colorizing or printing? [hint:Subtract a Part] -text = Subtract a Part\nDid you know that you can subtract one mesh from another using the Negative part modifier? That way you can, for example, create easily resizable holes directly in Orca Slicer. Read more in the documentation. -image = images/dailytips_SubtractPart.png +text = Subtract a Part\nDid you know that you can subtract one mesh from another using the Negative part modifier? That way you can, for example, create easily resizable holes directly in Orca Slicer. [hint:STEP] text = STEP\nDid you know that you can improve your print quality by slicing a STEP file instead of an STL?\nOrca Slicer supports slicing STEP files, providing smoother results than a lower resolution STL. Give it a try! [hint:Z seam location] text = Z seam location\nDid you know that you can customize the location of the Z seam, and even paint it on your print, to have it in a less visible location? This improves the overall look of your model. Check it out! -image = images/dailytips_ZSeamLocation.png [hint:Fine-tuning for flow rate] text = Fine-tuning for flow rate\nDid you know that flow rate can be fine-tuned for even better-looking prints? Depending on the material, you can improve the overall finish of the printed model by doing some fine-tuning. [hint:Split your prints into plates] text = Split your prints into plates\nDid you know that you can split a model that has a lot of parts into individual plates ready to print? This will simplify the process of keeping track of all the parts. -image = images/dailytips_SplitIntoPlates.png [hint:Speed up your print with Adaptive Layer Height] text = Speed up your print with Adaptive Layer Height\nDid you know that you can print a model even faster, by using the Adaptive Layer Height option? Check it out! @@ -130,21 +144,18 @@ text = Support painting\nDid you know that you can paint the location of your su [hint:Different types of supports] text = Different types of supports\nDid you know that you can choose from multiple types of supports? Tree supports work great for organic models, while saving filament and improving print speed. Check them out! -image = images/dailytips_TypesOfSupports.png [hint:Printing Silk Filament] text = Printing Silk Filament\nDid you know that Silk filament needs special consideration to print it successfully? Higher temperature and lower speed are always recommended for the best results. [hint:Brim for better adhesion] text = Brim for better adhesion\nDid you know that when printing models have a small contact interface with the printing surface, it's recommended to use a brim? -image = images/dailytips_Brim.png [hint:Set parameters for multiple objects] text = Set parameters for multiple objects\nDid you know that you can set slicing parameters for all selected objects at one time? [hint:Stack objects] text = Stack objects\nDid you know that you can stack objects as a whole one? -image = images/dailytips_StackObject.png [hint:Flush into support/objects/infill] text = Flush into support/objects/infill\nDid you know that you can save the wasted filament by flushing them into support/objects/infill during filament change? diff --git a/resources/images/add_copies.svg b/resources/images/add_copies.svg index 45b1d27cf9..7eb75471ef 100644 --- a/resources/images/add_copies.svg +++ b/resources/images/add_copies.svg @@ -8,11 +8,11 @@ S11.87,1,8,1L8,1z"/> - - diff --git a/resources/images/add_text_modifier.svg b/resources/images/add_text_modifier.svg new file mode 100644 index 0000000000..d79499eff8 --- /dev/null +++ b/resources/images/add_text_modifier.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/images/add_text_negative.svg b/resources/images/add_text_negative.svg new file mode 100644 index 0000000000..2cf4456925 --- /dev/null +++ b/resources/images/add_text_negative.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/images/add_text_part.svg b/resources/images/add_text_part.svg new file mode 100644 index 0000000000..c4972e6cbe --- /dev/null +++ b/resources/images/add_text_part.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/images/align_horizontal_center.svg b/resources/images/align_horizontal_center.svg new file mode 100644 index 0000000000..a91ab70ac6 --- /dev/null +++ b/resources/images/align_horizontal_center.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/resources/images/align_horizontal_left.svg b/resources/images/align_horizontal_left.svg new file mode 100644 index 0000000000..fc72e75cf0 --- /dev/null +++ b/resources/images/align_horizontal_left.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/resources/images/align_horizontal_right.svg b/resources/images/align_horizontal_right.svg new file mode 100644 index 0000000000..2e83ee635a --- /dev/null +++ b/resources/images/align_horizontal_right.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/resources/images/align_vertical_bottom.svg b/resources/images/align_vertical_bottom.svg new file mode 100644 index 0000000000..9f65196ed7 --- /dev/null +++ b/resources/images/align_vertical_bottom.svg @@ -0,0 +1,60 @@ + + + + + + + + + + + + diff --git a/resources/images/align_vertical_center.svg b/resources/images/align_vertical_center.svg new file mode 100644 index 0000000000..348c08a981 --- /dev/null +++ b/resources/images/align_vertical_center.svg @@ -0,0 +1,60 @@ + + + + + + + + + + + + diff --git a/resources/images/align_vertical_top.svg b/resources/images/align_vertical_top.svg new file mode 100644 index 0000000000..0bcb4b9e0b --- /dev/null +++ b/resources/images/align_vertical_top.svg @@ -0,0 +1,60 @@ + + + + + + + + + + + + diff --git a/resources/images/burn.svg b/resources/images/burn.svg new file mode 100644 index 0000000000..685999cd14 --- /dev/null +++ b/resources/images/burn.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/images/collapse.svg b/resources/images/collapse.svg new file mode 100644 index 0000000000..eb4c8e47cf --- /dev/null +++ b/resources/images/collapse.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + diff --git a/resources/images/confirm.svg b/resources/images/confirm.svg index 31a82f6e99..1351d3b6f5 100644 --- a/resources/images/confirm.svg +++ b/resources/images/confirm.svg @@ -1,3 +1,3 @@ - + diff --git a/resources/images/confirm_dark.svg b/resources/images/confirm_dark.svg index 31a82f6e99..1351d3b6f5 100644 --- a/resources/images/confirm_dark.svg +++ b/resources/images/confirm_dark.svg @@ -1,3 +1,3 @@ - + diff --git a/resources/images/create_success.svg b/resources/images/create_success.svg index 242dc57327..d49d396125 100644 --- a/resources/images/create_success.svg +++ b/resources/images/create_success.svg @@ -1,6 +1,6 @@ - + diff --git a/resources/images/dailytips_AutoArrange.PNG b/resources/images/dailytips_AutoArrange.PNG deleted file mode 100644 index a8a33f1932..0000000000 Binary files a/resources/images/dailytips_AutoArrange.PNG and /dev/null differ diff --git a/resources/images/dailytips_Brim.png b/resources/images/dailytips_Brim.png deleted file mode 100644 index 547364087c..0000000000 Binary files a/resources/images/dailytips_Brim.png and /dev/null differ diff --git a/resources/images/dailytips_CutTool.PNG b/resources/images/dailytips_CutTool.PNG deleted file mode 100644 index 2f42286ba5..0000000000 Binary files a/resources/images/dailytips_CutTool.PNG and /dev/null differ diff --git a/resources/images/dailytips_LayOnFace.PNG b/resources/images/dailytips_LayOnFace.PNG deleted file mode 100644 index bb270db60c..0000000000 Binary files a/resources/images/dailytips_LayOnFace.PNG and /dev/null differ diff --git a/resources/images/dailytips_ObjectList.PNG b/resources/images/dailytips_ObjectList.PNG deleted file mode 100644 index 7946006036..0000000000 Binary files a/resources/images/dailytips_ObjectList.PNG and /dev/null differ diff --git a/resources/images/dailytips_SimplifyModel.PNG b/resources/images/dailytips_SimplifyModel.PNG deleted file mode 100644 index 8a1330d381..0000000000 Binary files a/resources/images/dailytips_SimplifyModel.PNG and /dev/null differ diff --git a/resources/images/dailytips_SlicingParamTable.PNG b/resources/images/dailytips_SlicingParamTable.PNG deleted file mode 100644 index 511395f820..0000000000 Binary files a/resources/images/dailytips_SlicingParamTable.PNG and /dev/null differ diff --git a/resources/images/dailytips_SplitIntoPlates.png b/resources/images/dailytips_SplitIntoPlates.png deleted file mode 100644 index 7ee6eb62b8..0000000000 Binary files a/resources/images/dailytips_SplitIntoPlates.png and /dev/null differ diff --git a/resources/images/dailytips_StackObject.png b/resources/images/dailytips_StackObject.png deleted file mode 100644 index 9570f7c0f1..0000000000 Binary files a/resources/images/dailytips_StackObject.png and /dev/null differ diff --git a/resources/images/dailytips_SubtractPart.png b/resources/images/dailytips_SubtractPart.png deleted file mode 100644 index 8f8366bde2..0000000000 Binary files a/resources/images/dailytips_SubtractPart.png and /dev/null differ diff --git a/resources/images/dailytips_TypesOfSupports.png b/resources/images/dailytips_TypesOfSupports.png deleted file mode 100644 index a615ceafcc..0000000000 Binary files a/resources/images/dailytips_TypesOfSupports.png and /dev/null differ diff --git a/resources/images/dailytips_ZSeamLocation.png b/resources/images/dailytips_ZSeamLocation.png deleted file mode 100644 index 239cfa479a..0000000000 Binary files a/resources/images/dailytips_ZSeamLocation.png and /dev/null differ diff --git a/resources/images/dailytips_placeholder.png b/resources/images/dailytips_placeholder.png deleted file mode 100644 index ef9bf6fe7f..0000000000 Binary files a/resources/images/dailytips_placeholder.png and /dev/null differ diff --git a/resources/images/delete.svg b/resources/images/delete.svg new file mode 100644 index 0000000000..91d56e91d1 --- /dev/null +++ b/resources/images/delete.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + diff --git a/resources/images/exclamation.svg b/resources/images/exclamation.svg new file mode 100644 index 0000000000..5a5b631a46 --- /dev/null +++ b/resources/images/exclamation.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + diff --git a/resources/images/lock_closed.svg b/resources/images/lock_closed.svg new file mode 100644 index 0000000000..549cdba239 --- /dev/null +++ b/resources/images/lock_closed.svg @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/resources/images/lock_closed_f.svg b/resources/images/lock_closed_f.svg new file mode 100644 index 0000000000..2920ea0aae --- /dev/null +++ b/resources/images/lock_closed_f.svg @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/resources/images/lock_open.svg b/resources/images/lock_open.svg new file mode 100644 index 0000000000..3f0da9ae09 --- /dev/null +++ b/resources/images/lock_open.svg @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/resources/images/lock_open_f.svg b/resources/images/lock_open_f.svg new file mode 100644 index 0000000000..3d12d78746 --- /dev/null +++ b/resources/images/lock_open_f.svg @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/resources/images/make_bold.svg b/resources/images/make_bold.svg new file mode 100644 index 0000000000..1c39a3d23f --- /dev/null +++ b/resources/images/make_bold.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/images/make_italic.svg b/resources/images/make_italic.svg new file mode 100644 index 0000000000..5c128e6302 --- /dev/null +++ b/resources/images/make_italic.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/images/make_unbold.svg b/resources/images/make_unbold.svg new file mode 100644 index 0000000000..7a99cc227f --- /dev/null +++ b/resources/images/make_unbold.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/images/make_unitalic.svg b/resources/images/make_unitalic.svg new file mode 100644 index 0000000000..f3c4d90685 --- /dev/null +++ b/resources/images/make_unitalic.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/images/notification_slicing_complete.svg b/resources/images/notification_slicing_complete.svg index 82bc8ea17f..da677939a5 100644 --- a/resources/images/notification_slicing_complete.svg +++ b/resources/images/notification_slicing_complete.svg @@ -1,6 +1,6 @@ - + diff --git a/resources/images/open.svg b/resources/images/open.svg index 8fcddc2a61..5c7fa81be3 100644 --- a/resources/images/open.svg +++ b/resources/images/open.svg @@ -5,7 +5,7 @@ - diff --git a/resources/images/open_in_browser.svg b/resources/images/open_in_browser.svg index c445ea26ee..eb3ba07c6f 100644 --- a/resources/images/open_in_browser.svg +++ b/resources/images/open_in_browser.svg @@ -1,6 +1,6 @@ - + diff --git a/resources/images/printer_thumbnail_n2s.svg b/resources/images/printer_thumbnail_n2s.svg new file mode 100644 index 0000000000..3718a2da55 --- /dev/null +++ b/resources/images/printer_thumbnail_n2s.svg @@ -0,0 +1,3064 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/images/printer_thumbnail_n2s_dark.svg b/resources/images/printer_thumbnail_n2s_dark.svg new file mode 100644 index 0000000000..40e28a08d1 --- /dev/null +++ b/resources/images/printer_thumbnail_n2s_dark.svg @@ -0,0 +1,3060 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/images/reflection_x.svg b/resources/images/reflection_x.svg new file mode 100644 index 0000000000..fa391e6cdf --- /dev/null +++ b/resources/images/reflection_x.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/images/reflection_y.svg b/resources/images/reflection_y.svg new file mode 100644 index 0000000000..0de6a5971f --- /dev/null +++ b/resources/images/reflection_y.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/images/refresh.svg b/resources/images/refresh.svg new file mode 100644 index 0000000000..af9b336858 --- /dev/null +++ b/resources/images/refresh.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/images/step_1.svg b/resources/images/step_1.svg index 27385f06b1..bb72d6e2ac 100644 --- a/resources/images/step_1.svg +++ b/resources/images/step_1.svg @@ -1,4 +1,4 @@ - + diff --git a/resources/images/step_2.svg b/resources/images/step_2.svg index 7ea460c47d..730ef67ce1 100644 --- a/resources/images/step_2.svg +++ b/resources/images/step_2.svg @@ -1,4 +1,4 @@ - + diff --git a/resources/images/svg_modifier.svg b/resources/images/svg_modifier.svg new file mode 100644 index 0000000000..8b1ff317b4 --- /dev/null +++ b/resources/images/svg_modifier.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/images/svg_negative.svg b/resources/images/svg_negative.svg new file mode 100644 index 0000000000..c47a8fe58d --- /dev/null +++ b/resources/images/svg_negative.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/resources/images/svg_part.svg b/resources/images/svg_part.svg new file mode 100644 index 0000000000..40f907bd9f --- /dev/null +++ b/resources/images/svg_part.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/resources/images/text_B.svg b/resources/images/text_B.svg deleted file mode 100644 index c792b4be4d..0000000000 --- a/resources/images/text_B.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/images/text_B_dark.svg b/resources/images/text_B_dark.svg deleted file mode 100644 index 5fa0f1bbdc..0000000000 --- a/resources/images/text_B_dark.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/resources/images/text_T.svg b/resources/images/text_T.svg deleted file mode 100644 index fa5cb783b3..0000000000 --- a/resources/images/text_T.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/resources/images/text_T_dark.svg b/resources/images/text_T_dark.svg deleted file mode 100644 index af85448dae..0000000000 --- a/resources/images/text_T_dark.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/resources/printers/BL-P001.json b/resources/printers/BL-P001.json new file mode 100644 index 0000000000..fbdea5d750 --- /dev/null +++ b/resources/printers/BL-P001.json @@ -0,0 +1,88 @@ +{ + "00.00.00.00": { + "display_name": "Bambu Lab X1 Carbon", + "print": { + "ipcam": { + "resolution_supported": [ "720p", "1080p" ], + "virtual_camera": "enabled", + "liveview": { + "remote": "enabled" + }, + "file": { + "remote": "enabled", + "model_download": "enabled" + } + }, + "support_motor_noise_cali":false, + "support_tunnel_mqtt":false, + "support_mqtt_alive":false, + "support_command_ams_switch":false, + "support_cloud_print_only":false, + "support_1080dpi":false, + "support_prompt_sound":false, + "support_ams_humidity":false, + "support_auto_recovery_step_loss":false, + "support_auto_leveling":true, + "support_update_remain":false, + "support_timelapse":true, + "support_filament_backup":false, + "support_chamber_fan":true, + "support_aux_fan":true, + "support_send_to_sd":false, + "support_print_all":true, + "support_print_without_sd":true, + "support_flow_calibration":true, + "support_build_plate_marker_detect":false, + "support_lidar_calibration":true, + "support_ai_monitoring":false, + "support_first_layer_inspect":true, + "support_chamber_temp_edit":false, + "support_extrusion_cali":false, + "support_user_preset":false + }, + "model_id":"BL-P001", + "compatible_machine":["BL-P002", "C11", "C12", "C13"], + "printer_type":"3DPrinter-X1-Carbon", + "printer_thumbnail_image":"printer_thumbnail", + "printer_connect_help_image":"input_access_code_x1", + "printer_use_ams_image":"ams_icon", + "use_ams_type":"generic", + "printer_arch":"core_xy", + "printer_series":"series_x1", + "has_cali_line":true, + "printer_is_enclosed":true + }, + "01.01.01.00": { + "print": { + "support_1080dpi":true, + "support_ams_humidity":true, + "support_update_remain":true, + "support_auto_recovery_step_loss":true, + "support_filament_backup":true, + "support_send_to_sd":true, + "support_build_plate_marker_detect":true, + "support_ai_monitoring":true + } + }, + "01.05.06.01" : { + "print": { + "support_command_ams_switch":true + } + }, + "01.05.06.05" : { + "engineer":"00.03.10.05", + "print": { + "support_mqtt_alive":true + } + }, + "01.05.06.06": { + "print": { + "support_tunnel_mqtt":true + } + }, + "01.06.06.00": { + "print": { + "support_user_preset":true + } + } +} \ No newline at end of file diff --git a/resources/printers/BL-P002.json b/resources/printers/BL-P002.json new file mode 100644 index 0000000000..286e552716 --- /dev/null +++ b/resources/printers/BL-P002.json @@ -0,0 +1,88 @@ +{ + "00.00.00.00": { + "display_name": "Bambu Lab X1", + "print": { + "ipcam": { + "resolution_supported": [ "720p", "1080p" ], + "virtual_camera": "enabled", + "liveview": { + "remote": "enabled" + }, + "file": { + "remote": "enabled", + "model_download": "enabled" + } + }, + "support_motor_noise_cali":false, + "support_tunnel_mqtt":false, + "support_mqtt_alive":false, + "support_command_ams_switch":false, + "support_cloud_print_only":false, + "support_1080dpi":false, + "support_prompt_sound":false, + "support_ams_humidity":false, + "support_auto_recovery_step_loss":false, + "support_auto_leveling":true, + "support_update_remain":false, + "support_timelapse":true, + "support_filament_backup":false, + "support_chamber_fan":true, + "support_aux_fan":true, + "support_send_to_sd":false, + "support_print_all":true, + "support_print_without_sd":true, + "support_flow_calibration":true, + "support_build_plate_marker_detect":false, + "support_lidar_calibration":true, + "support_ai_monitoring":false, + "support_first_layer_inspect":true, + "support_chamber_temp_edit":false, + "support_extrusion_cali":false, + "support_user_preset":false + }, + "model_id": "BL-P002", + "compatible_machine":["BL-P001", "C11", "C12", "C13"], + "printer_type": "3DPrinter-X1", + "printer_thumbnail_image": "printer_thumbnail", + "printer_connect_help_image": "input_access_code_x1", + "printer_use_ams_image":"ams_icon", + "use_ams_type":"generic", + "printer_arch" : "core_xy", + "printer_series":"series_x1", + "has_cali_line":true, + "printer_is_enclosed":true + }, + "01.01.01.00": { + "print": { + "support_1080dpi":true, + "support_ams_humidity":true, + "support_update_remain":true, + "support_auto_recovery_step_loss":true, + "support_filament_backup":true, + "support_send_to_sd":true, + "support_build_plate_marker_detect":true, + "support_ai_monitoring":true + } + }, + "01.05.06.01" : { + "print": { + "support_command_ams_switch":true + } + }, + "01.05.06.05" : { + "engineer":"00.03.10.05", + "print": { + "support_mqtt_alive":true + } + }, + "01.05.06.06": { + "print": { + "support_tunnel_mqtt":true + } + }, + "01.06.06.00": { + "print": { + "support_user_preset":true + } + } +} \ No newline at end of file diff --git a/resources/printers/C11.json b/resources/printers/C11.json index d008dde8f0..5fb53b3f0f 100644 --- a/resources/printers/C11.json +++ b/resources/printers/C11.json @@ -81,7 +81,8 @@ "file": { "remote": "enabled" } - } + }, + "support_user_preset":true } } } diff --git a/resources/printers/C12.json b/resources/printers/C12.json index 06d50b9476..d3a6c6d995 100644 --- a/resources/printers/C12.json +++ b/resources/printers/C12.json @@ -73,7 +73,8 @@ "file": { "remote": "enabled" } - } + }, + "support_user_preset":true } } } diff --git a/resources/printers/C13.json b/resources/printers/C13.json new file mode 100644 index 0000000000..c8bce2ad6a --- /dev/null +++ b/resources/printers/C13.json @@ -0,0 +1,61 @@ +{ + "00.00.00.00": { + "display_name": "Bambu Lab X1E", + "print": { + "ipcam": { + "resolution_supported": [ "720p", "1080p" ], + "virtual_camera": "enabled", + "liveview": { + "remote": "enabled" + }, + "file": { + "remote": "enabled", + "model_download": "enabled" + } + }, + "support_motor_noise_cali":false, + "support_tunnel_mqtt":true, + "support_mqtt_alive":true, + "support_command_ams_switch":true, + "support_ssl_for_mqtt":true, + "support_cloud_print_only":false, + "support_1080dpi":true, + "support_prompt_sound":false, + "support_ams_humidity":true, + "support_auto_recovery_step_loss":true, + "support_auto_leveling":true, + "support_update_remain":true, + "support_timelapse":true, + "support_filament_backup":true, + "support_chamber_fan":true, + "support_aux_fan":true, + "support_send_to_sd":true, + "support_print_all":true, + "support_print_without_sd":true, + "support_flow_calibration":true, + "support_build_plate_marker_detect":true, + "support_lidar_calibration":true, + "support_ai_monitoring":true, + "support_first_layer_inspect":true, + "support_chamber_temp_edit":true, + "support_extrusion_cali":false, + "support_user_preset":false, + "bed_temperature_limit": 110, + "nozzle_max_temperature": 320 + }, + "model_id": "C13", + "compatible_machine":["BL-P001", "BL-P002", "C11", "C12"], + "printer_type": "C13", + "printer_thumbnail_image": "printer_thumbnail", + "printer_connect_help_image": "input_access_code_x1", + "printer_use_ams_image":"ams_icon", + "use_ams_type":"generic", + "printer_arch" : "core_xy", + "printer_series":"series_x1", + "has_cali_line":true, + "printer_is_enclosed":true + }, + "01.05.06.06": { + "rv2166": "00.00.21.20" + } +} \ No newline at end of file diff --git a/resources/printers/N1.json b/resources/printers/N1.json index 2c6131b678..85da862315 100644 --- a/resources/printers/N1.json +++ b/resources/printers/N1.json @@ -56,7 +56,8 @@ "file": { "remote": "enabled" } - } + }, + "support_user_preset":true } } } \ No newline at end of file diff --git a/resources/printers/N2S.json b/resources/printers/N2S.json new file mode 100644 index 0000000000..e287cd1fab --- /dev/null +++ b/resources/printers/N2S.json @@ -0,0 +1,62 @@ +{ + "00.00.00.00": { + "display_name": "Bambu Lab A1", + "print": { + "ipcam": { + "resolution_supported": [ "720p" ], + "liveview": { + "local": "local", + "remote": "enabled" + } + }, + "support_motor_noise_cali":true, + "support_tunnel_mqtt":true, + "support_mqtt_alive":true, + "support_command_ams_switch":true, + "support_cloud_print_only":true, + "support_1080dpi":true, + "support_prompt_sound":true, + "support_ams_humidity":false, + "support_auto_recovery_step_loss":true, + "support_auto_leveling":true, + "support_update_remain":false, + "support_timelapse":true, + "support_filament_backup":true, + "support_chamber_fan":false, + "support_aux_fan":false, + "support_send_to_sd":true, + "support_print_all":false, + "support_print_without_sd":false, + "support_flow_calibration":true, + "support_build_plate_marker_detect":false, + "support_lidar_calibration":false, + "support_ai_monitoring":false, + "support_first_layer_inspect":false, + "support_chamber_temp_edit":false, + "support_extrusion_cali":true, + "support_user_preset":true, + "bed_temperature_limit": 100 + }, + "model_id": "N2S", + "compatible_machine":[], + "printer_type": "N2S", + "ftp_folder" : "sdcard/", + "printer_thumbnail_image": "printer_thumbnail_n2s", + "printer_connect_help_image": "input_access_code_n1", + "printer_use_ams_image":"extra_icon", + "use_ams_type":"f1", + "printer_arch" : "i3", + "printer_series":"series_p1p", + "has_cali_line":false, + "printer_is_enclosed":false + }, + "01.01.50.01": { + "print": { + "ipcam": { + "file": { + "remote": "enabled" + } + } + } + } +} \ No newline at end of file diff --git a/resources/printers/version.txt b/resources/printers/version.txt index 8e3f706a56..5db99ab540 100644 --- a/resources/printers/version.txt +++ b/resources/printers/version.txt @@ -1 +1 @@ -01.08.00.02 \ No newline at end of file +01.08.02.01 \ No newline at end of file diff --git a/resources/profiles/Anker/machine/fdm_machine_common.json b/resources/profiles/Anker/machine/fdm_machine_common.json index cc3c93c3ad..04cd7af2e7 100644 --- a/resources/profiles/Anker/machine/fdm_machine_common.json +++ b/resources/profiles/Anker/machine/fdm_machine_common.json @@ -34,7 +34,7 @@ "6000" ], "machine_max_acceleration_z": [ - "100" + "500" ], "machine_max_speed_e": [ "50" diff --git a/resources/profiles/BBL.json b/resources/profiles/BBL.json index 49a94c4e86..21e4ba6893 100644 --- a/resources/profiles/BBL.json +++ b/resources/profiles/BBL.json @@ -1,7 +1,7 @@ { "name": "Bambulab", "url": "http://www.bambulab.com/Parameters/vendor/BBL.json", - "version": "01.08.00.06", + "version": "01.08.00.13", "force_update": "0", "description": "the initial version of BBL configurations", "machine_model_list": [ @@ -13,6 +13,10 @@ "name": "Bambu Lab X1", "sub_path": "machine/Bambu Lab X1.json" }, + { + "name": "Bambu Lab X1E", + "sub_path": "machine/Bambu Lab X1E.json" + }, { "name": "Bambu Lab P1P", "sub_path": "machine/Bambu Lab P1P.json" @@ -26,8 +30,8 @@ "sub_path": "machine/Bambu Lab A1 mini.json" }, { - "name": "Bambu Lab X1E", - "sub_path": "machine/Bambu Lab X1E.json" + "name": "Bambu Lab A1", + "sub_path": "machine/Bambu Lab A1.json" } ], "process_list": [ @@ -135,6 +139,10 @@ "name": "0.08mm Extra Fine @BBL A1M", "sub_path": "process/0.08mm Extra Fine @BBL A1M.json" }, + { + "name": "0.08mm Extra Fine @BBL A1", + "sub_path": "process/0.08mm Extra Fine @BBL A1.json" + }, { "name": "0.10mm Standard @BBL X1C 0.2 nozzle", "sub_path": "process/0.10mm Standard @BBL X1C 0.2 nozzle.json" @@ -143,6 +151,10 @@ "name": "0.10mm Standard @BBL P1P 0.2 nozzle", "sub_path": "process/0.10mm Standard @BBL P1P 0.2 nozzle.json" }, + { + "name": "0.10mm Standard @BBL A1 0.2 nozzle", + "sub_path": "process/0.10mm Standard @BBL A1 0.2 nozzle.json" + }, { "name": "0.40mm Standard @BBL X1C 0.8 nozzle", "sub_path": "process/0.40mm Standard @BBL X1C 0.8 nozzle.json" @@ -155,6 +167,10 @@ "name": "0.40mm Standard @BBL P1P 0.8 nozzle", "sub_path": "process/0.40mm Standard @BBL P1P 0.8 nozzle.json" }, + { + "name": "0.40mm Standard @BBL A1 0.8 nozzle", + "sub_path": "process/0.40mm Standard @BBL A1 0.8 nozzle.json" + }, { "name": "0.30mm Standard @BBL X1C 0.6 nozzle", "sub_path": "process/0.30mm Standard @BBL X1C 0.6 nozzle.json" @@ -179,6 +195,14 @@ "name": "0.30mm Strength @BBL P1P 0.6 nozzle", "sub_path": "process/0.30mm Strength @BBL P1P 0.6 nozzle.json" }, + { + "name": "0.30mm Standard @BBL A1 0.6 nozzle", + "sub_path": "process/0.30mm Standard @BBL A1 0.6 nozzle.json" + }, + { + "name": "0.30mm Strength @BBL A1 0.6 nozzle", + "sub_path": "process/0.30mm Strength @BBL A1 0.6 nozzle.json" + }, { "name": "0.12mm Fine @BBL X1C", "sub_path": "process/0.12mm Fine @BBL X1C.json" @@ -191,6 +215,10 @@ "name": "0.12mm Fine @BBL A1M", "sub_path": "process/0.12mm Fine @BBL A1M.json" }, + { + "name": "0.12mm Fine @BBL A1", + "sub_path": "process/0.12mm Fine @BBL A1.json" + }, { "name": "0.16mm Optimal @BBL X1C", "sub_path": "process/0.16mm Optimal @BBL X1C.json" @@ -203,6 +231,10 @@ "name": "0.16mm Optimal @BBL A1M", "sub_path": "process/0.16mm Optimal @BBL A1M.json" }, + { + "name": "0.16mm Optimal @BBL A1", + "sub_path": "process/0.16mm Optimal @BBL A1.json" + }, { "name": "0.20mm Standard @BBL X1C", "sub_path": "process/0.20mm Standard @BBL X1C.json" @@ -219,6 +251,14 @@ "name": "0.20mm Strength @BBL P1P", "sub_path": "process/0.20mm Strength @BBL P1P.json" }, + { + "name": "0.20mm Standard @BBL A1", + "sub_path": "process/0.20mm Standard @BBL A1.json" + }, + { + "name": "0.20mm Strength @BBL A1", + "sub_path": "process/0.20mm Strength @BBL A1.json" + }, { "name": "0.24mm Draft @BBL X1C", "sub_path": "process/0.24mm Draft @BBL X1C.json" @@ -231,6 +271,10 @@ "name": "0.24mm Draft @BBL A1M", "sub_path": "process/0.24mm Draft @BBL A1M.json" }, + { + "name": "0.24mm Draft @BBL A1", + "sub_path": "process/0.24mm Draft @BBL A1.json" + }, { "name": "0.28mm Extra Draft @BBL X1C", "sub_path": "process/0.28mm Extra Draft @BBL X1C.json" @@ -243,6 +287,10 @@ "name": "0.28mm Extra Draft @BBL A1M", "sub_path": "process/0.28mm Extra Draft @BBL A1M.json" }, + { + "name": "0.28mm Extra Draft @BBL A1", + "sub_path": "process/0.28mm Extra Draft @BBL A1.json" + }, { "name": "0.06mm Standard @BBL X1C 0.2 nozzle", "sub_path": "process/0.06mm Standard @BBL X1C 0.2 nozzle.json" @@ -255,6 +303,10 @@ "name": "0.06mm Fine @BBL P1P 0.2 nozzle", "sub_path": "process/0.06mm Fine @BBL P1P 0.2 nozzle.json" }, + { + "name": "0.06mm Fine @BBL A1 0.2 nozzle", + "sub_path": "process/0.06mm Fine @BBL A1 0.2 nozzle.json" + }, { "name": "0.08mm Standard @BBL X1C 0.2 nozzle", "sub_path": "process/0.08mm Standard @BBL X1C 0.2 nozzle.json" @@ -267,6 +319,10 @@ "name": "0.08mm Optimal @BBL P1P 0.2 nozzle", "sub_path": "process/0.08mm Optimal @BBL P1P 0.2 nozzle.json" }, + { + "name": "0.08mm Optimal @BBL A1 0.2 nozzle", + "sub_path": "process/0.08mm Optimal @BBL A1 0.2 nozzle.json" + }, { "name": "0.12mm Standard @BBL X1C 0.2 nozzle", "sub_path": "process/0.12mm Standard @BBL X1C 0.2 nozzle.json" @@ -279,6 +335,10 @@ "name": "0.12mm Draft @BBL P1P 0.2 nozzle", "sub_path": "process/0.12mm Draft @BBL P1P 0.2 nozzle.json" }, + { + "name": "0.12mm Draft @BBL A1 0.2 nozzle", + "sub_path": "process/0.12mm Draft @BBL A1 0.2 nozzle.json" + }, { "name": "0.14mm Standard @BBL X1C 0.2 nozzle", "sub_path": "process/0.14mm Standard @BBL X1C 0.2 nozzle.json" @@ -291,6 +351,10 @@ "name": "0.14mm Extra Draft @BBL P1P 0.2 nozzle", "sub_path": "process/0.14mm Extra Draft @BBL P1P 0.2 nozzle.json" }, + { + "name": "0.14mm Extra Draft @BBL A1 0.2 nozzle", + "sub_path": "process/0.14mm Extra Draft @BBL A1 0.2 nozzle.json" + }, { "name": "0.18mm Standard @BBL X1C 0.6 nozzle", "sub_path": "process/0.18mm Standard @BBL X1C 0.6 nozzle.json" @@ -303,6 +367,10 @@ "name": "0.18mm Fine @BBL P1P 0.6 nozzle", "sub_path": "process/0.18mm Fine @BBL P1P 0.6 nozzle.json" }, + { + "name": "0.18mm Fine @BBL A1 0.6 nozzle", + "sub_path": "process/0.18mm Fine @BBL A1 0.6 nozzle.json" + }, { "name": "0.24mm Standard @BBL X1C 0.6 nozzle", "sub_path": "process/0.24mm Standard @BBL X1C 0.6 nozzle.json" @@ -315,6 +383,10 @@ "name": "0.24mm Optimal @BBL P1P 0.6 nozzle", "sub_path": "process/0.24mm Optimal @BBL P1P 0.6 nozzle.json" }, + { + "name": "0.24mm Optimal @BBL A1 0.6 nozzle", + "sub_path": "process/0.24mm Optimal @BBL A1 0.6 nozzle.json" + }, { "name": "0.36mm Standard @BBL X1C 0.6 nozzle", "sub_path": "process/0.36mm Standard @BBL X1C 0.6 nozzle.json" @@ -327,6 +399,10 @@ "name": "0.36mm Draft @BBL P1P 0.6 nozzle", "sub_path": "process/0.36mm Draft @BBL P1P 0.6 nozzle.json" }, + { + "name": "0.36mm Draft @BBL A1 0.6 nozzle", + "sub_path": "process/0.36mm Draft @BBL A1 0.6 nozzle.json" + }, { "name": "0.42mm Standard @BBL X1C 0.6 nozzle", "sub_path": "process/0.42mm Standard @BBL X1C 0.6 nozzle.json" @@ -339,6 +415,10 @@ "name": "0.42mm Extra Draft @BBL P1P 0.6 nozzle", "sub_path": "process/0.42mm Extra Draft @BBL P1P 0.6 nozzle.json" }, + { + "name": "0.42mm Extra Draft @BBL A1 0.6 nozzle", + "sub_path": "process/0.42mm Extra Draft @BBL A1 0.6 nozzle.json" + }, { "name": "0.24mm Standard @BBL X1C 0.8 nozzle", "sub_path": "process/0.24mm Standard @BBL X1C 0.8 nozzle.json" @@ -351,6 +431,10 @@ "name": "0.24mm Fine @BBL P1P 0.8 nozzle", "sub_path": "process/0.24mm Fine @BBL P1P 0.8 nozzle.json" }, + { + "name": "0.24mm Fine @BBL A1 0.8 nozzle", + "sub_path": "process/0.24mm Fine @BBL A1 0.8 nozzle.json" + }, { "name": "0.32mm Standard @BBL X1C 0.8 nozzle", "sub_path": "process/0.32mm Standard @BBL X1C 0.8 nozzle.json" @@ -363,6 +447,10 @@ "name": "0.32mm Optimal @BBL P1P 0.8 nozzle", "sub_path": "process/0.32mm Optimal @BBL P1P 0.8 nozzle.json" }, + { + "name": "0.32mm Optimal @BBL A1 0.8 nozzle", + "sub_path": "process/0.32mm Optimal @BBL A1 0.8 nozzle.json" + }, { "name": "0.48mm Standard @BBL X1C 0.8 nozzle", "sub_path": "process/0.48mm Standard @BBL X1C 0.8 nozzle.json" @@ -375,6 +463,10 @@ "name": "0.48mm Draft @BBL P1P 0.8 nozzle", "sub_path": "process/0.48mm Draft @BBL P1P 0.8 nozzle.json" }, + { + "name": "0.48mm Draft @BBL A1 0.8 nozzle", + "sub_path": "process/0.48mm Draft @BBL A1 0.8 nozzle.json" + }, { "name": "0.56mm Standard @BBL X1C 0.8 nozzle", "sub_path": "process/0.56mm Standard @BBL X1C 0.8 nozzle.json" @@ -387,6 +479,10 @@ "name": "0.56mm Extra Draft @BBL P1P 0.8 nozzle", "sub_path": "process/0.56mm Extra Draft @BBL P1P 0.8 nozzle.json" }, + { + "name": "0.56mm Extra Draft @BBL A1 0.8 nozzle", + "sub_path": "process/0.56mm Extra Draft @BBL A1 0.8 nozzle.json" + }, { "name": "0.10mm Standard @BBL A1M 0.2 nozzle", "sub_path": "process/0.10mm Standard @BBL A1M 0.2 nozzle.json" @@ -709,6 +805,14 @@ "name": "Bambu PLA Matte @BBL A1M 0.2 nozzle", "sub_path": "filament/Bambu PLA Matte @BBL A1M 0.2 nozzle.json" }, + { + "name": "Bambu PLA Matte @BBL A1", + "sub_path": "filament/Bambu PLA Matte @BBL A1.json" + }, + { + "name": "Bambu PLA Matte @BBL A1 0.2 nozzle", + "sub_path": "filament/Bambu PLA Matte @BBL A1 0.2 nozzle.json" + }, { "name": "Bambu PLA Basic @BBL X1C", "sub_path": "filament/Bambu PLA Basic @BBL X1C.json" @@ -741,6 +845,14 @@ "name": "Bambu PLA Basic @BBL A1M 0.2 nozzle", "sub_path": "filament/Bambu PLA Basic @BBL A1M 0.2 nozzle.json" }, + { + "name": "Bambu PLA Basic @BBL A1", + "sub_path": "filament/Bambu PLA Basic @BBL A1.json" + }, + { + "name": "Bambu PLA Basic @BBL A1 0.2 nozzle", + "sub_path": "filament/Bambu PLA Basic @BBL A1 0.2 nozzle.json" + }, { "name": "Bambu PLA Tough @BBL X1C", "sub_path": "filament/Bambu PLA Tough @BBL X1C.json" @@ -769,6 +881,14 @@ "name": "Bambu PLA Tough @BBL A1M 0.2 nozzle", "sub_path": "filament/Bambu PLA Tough @BBL A1M 0.2 nozzle.json" }, + { + "name": "Bambu PLA Tough @BBL A1", + "sub_path": "filament/Bambu PLA Tough @BBL A1.json" + }, + { + "name": "Bambu PLA Tough @BBL A1 0.2 nozzle", + "sub_path": "filament/Bambu PLA Tough @BBL A1 0.2 nozzle.json" + }, { "name": "Bambu PLA Marble @BBL X1", "sub_path": "filament/Bambu PLA Marble @BBL X1.json" @@ -785,6 +905,10 @@ "name": "Bambu PLA Marble @BBL A1M", "sub_path": "filament/Bambu PLA Marble @BBL A1M.json" }, + { + "name": "Bambu PLA Marble @BBL A1", + "sub_path": "filament/Bambu PLA Marble @BBL A1.json" + }, { "name": "Bambu PLA Sparkle @BBL X1", "sub_path": "filament/Bambu PLA Sparkle @BBL X1.json" @@ -801,6 +925,10 @@ "name": "Bambu PLA Sparkle @BBL A1M", "sub_path": "filament/Bambu PLA Sparkle @BBL A1M.json" }, + { + "name": "Bambu PLA Sparkle @BBL A1", + "sub_path": "filament/Bambu PLA Sparkle @BBL A1.json" + }, { "name": "Bambu PLA Metal @BBL X1C 0.2 nozzle", "sub_path": "filament/Bambu PLA Metal @BBL X1C 0.2 nozzle.json" @@ -829,6 +957,14 @@ "name": "Bambu PLA Metal @BBL A1M 0.2 nozzle", "sub_path": "filament/Bambu PLA Metal @BBL A1M 0.2 nozzle.json" }, + { + "name": "Bambu PLA Metal @BBL A1", + "sub_path": "filament/Bambu PLA Metal @BBL A1.json" + }, + { + "name": "Bambu PLA Metal @BBL A1 0.2 nozzle", + "sub_path": "filament/Bambu PLA Metal @BBL A1 0.2 nozzle.json" + }, { "name": "Bambu PLA Silk @BBL X1", "sub_path": "filament/Bambu PLA Silk @BBL X1.json" @@ -857,6 +993,14 @@ "name": "Bambu PLA Silk @BBL A1M 0.2 nozzle", "sub_path": "filament/Bambu PLA Silk @BBL A1M 0.2 nozzle.json" }, + { + "name": "Bambu PLA Silk @BBL A1", + "sub_path": "filament/Bambu PLA Silk @BBL A1.json" + }, + { + "name": "Bambu PLA Silk @BBL A1 0.2 nozzle", + "sub_path": "filament/Bambu PLA Silk @BBL A1 0.2 nozzle.json" + }, { "name": "Bambu Support W @BBL X1C", "sub_path": "filament/Bambu Support W @BBL X1C.json" @@ -885,6 +1029,14 @@ "name": "Bambu Support W @BBL A1M 0.2 nozzle", "sub_path": "filament/Bambu Support W @BBL A1M 0.2 nozzle.json" }, + { + "name": "Bambu Support W @BBL A1", + "sub_path": "filament/Bambu Support W @BBL A1.json" + }, + { + "name": "Bambu Support W @BBL A1 0.2 nozzle", + "sub_path": "filament/Bambu Support W @BBL A1 0.2 nozzle.json" + }, { "name": "eSUN PLA+ @BBL X1C", "sub_path": "filament/eSUN PLA+ @BBL X1C.json" @@ -913,6 +1065,14 @@ "name": "eSUN PLA+ @BBL A1M 0.2 nozzle", "sub_path": "filament/eSUN PLA+ @BBL A1M 0.2 nozzle.json" }, + { + "name": "eSUN PLA+ @BBL A1", + "sub_path": "filament/eSUN PLA+ @BBL A1.json" + }, + { + "name": "eSUN PLA+ @BBL A1 0.2 nozzle", + "sub_path": "filament/eSUN PLA+ @BBL A1 0.2 nozzle.json" + }, { "name": "PolyTerra PLA @BBL X1C", "sub_path": "filament/PolyTerra PLA @BBL X1C.json" @@ -933,6 +1093,14 @@ "name": "PolyTerra PLA @BBL A1M 0.2 nozzle", "sub_path": "filament/PolyTerra PLA @BBL A1M 0.2 nozzle.json" }, + { + "name": "PolyTerra PLA @BBL A1", + "sub_path": "filament/PolyTerra PLA @BBL A1.json" + }, + { + "name": "PolyTerra PLA @BBL A1 0.2 nozzle", + "sub_path": "filament/PolyTerra PLA @BBL A1 0.2 nozzle.json" + }, { "name": "PolyLite PLA @BBL X1C", "sub_path": "filament/PolyLite PLA @BBL X1C.json" @@ -953,6 +1121,14 @@ "name": "PolyLite PLA @BBL A1M 0.2 nozzle", "sub_path": "filament/PolyLite PLA @BBL A1M 0.2 nozzle.json" }, + { + "name": "PolyLite PLA @BBL A1", + "sub_path": "filament/PolyLite PLA @BBL A1.json" + }, + { + "name": "PolyLite PLA @BBL A1 0.2 nozzle", + "sub_path": "filament/PolyLite PLA @BBL A1 0.2 nozzle.json" + }, { "name": "Generic PLA", "sub_path": "filament/Generic PLA.json" @@ -977,6 +1153,14 @@ "name": "Generic PLA @BBL A1M 0.2 nozzle", "sub_path": "filament/Generic PLA @BBL A1M 0.2 nozzle.json" }, + { + "name": "Generic PLA @BBL A1", + "sub_path": "filament/Generic PLA @BBL A1.json" + }, + { + "name": "Generic PLA @BBL A1 0.2 nozzle", + "sub_path": "filament/Generic PLA @BBL A1 0.2 nozzle.json" + }, { "name": "Generic PLA Silk", "sub_path": "filament/Generic PLA Silk.json" @@ -989,6 +1173,10 @@ "name": "Generic PLA Silk @BBL A1M", "sub_path": "filament/Generic PLA Silk @BBL A1M.json" }, + { + "name": "Generic PLA Silk @BBL A1", + "sub_path": "filament/Generic PLA Silk @BBL A1.json" + }, { "name": "Generic PLA-CF", "sub_path": "filament/Generic PLA-CF.json" @@ -1001,6 +1189,10 @@ "name": "Generic PLA-CF @BBL A1M", "sub_path": "filament/Generic PLA-CF @BBL A1M.json" }, + { + "name": "Generic PLA-CF @BBL A1", + "sub_path": "filament/Generic PLA-CF @BBL A1.json" + }, { "name": "Bambu PLA-CF @BBL X1C 0.8 nozzle", "sub_path": "filament/Bambu PLA-CF @BBL X1C 0.8 nozzle.json" @@ -1025,6 +1217,14 @@ "name": "Bambu PLA-CF @BBL A1M 0.8 nozzle", "sub_path": "filament/Bambu PLA-CF @BBL A1M 0.8 nozzle.json" }, + { + "name": "Bambu PLA-CF @BBL A1", + "sub_path": "filament/Bambu PLA-CF @BBL A1.json" + }, + { + "name": "Bambu PLA-CF @BBL A1 0.8 nozzle", + "sub_path": "filament/Bambu PLA-CF @BBL A1 0.8 nozzle.json" + }, { "name": "Bambu Support For PLA @BBL X1C 0.2 nozzle", "sub_path": "filament/Bambu Support For PLA @BBL X1C 0.2 nozzle.json" @@ -1049,6 +1249,14 @@ "name": "Bambu Support For PLA @BBL A1M 0.2 nozzle", "sub_path": "filament/Bambu Support For PLA @BBL A1M 0.2 nozzle.json" }, + { + "name": "Bambu Support For PLA @BBL A1", + "sub_path": "filament/Bambu Support For PLA @BBL A1.json" + }, + { + "name": "Bambu Support For PLA @BBL A1 0.2 nozzle", + "sub_path": "filament/Bambu Support For PLA @BBL A1 0.2 nozzle.json" + }, { "name": "Bambu PLA Aero @BBL X1", "sub_path": "filament/Bambu PLA Aero @BBL X1.json" @@ -1065,6 +1273,10 @@ "name": "Bambu PLA Aero @BBL A1M", "sub_path": "filament/Bambu PLA Aero @BBL A1M.json" }, + { + "name": "Bambu PLA Aero @BBL A1", + "sub_path": "filament/Bambu PLA Aero @BBL A1.json" + }, { "name": "Overture PLA @BBL X1C", "sub_path": "filament/Overture PLA @BBL X1C.json" @@ -1081,6 +1293,14 @@ "name": "Overture PLA @BBL A1M", "sub_path": "filament/Overture PLA @BBL A1M.json" }, + { + "name": "Overture PLA @BBL A1", + "sub_path": "filament/Overture PLA @BBL A1.json" + }, + { + "name": "Overture PLA @BBL A1 0.2 nozzle", + "sub_path": "filament/Overture PLA @BBL A1 0.2 nozzle.json" + }, { "name": "Overture Matte PLA @BBL X1C", "sub_path": "filament/Overture Matte PLA @BBL X1C.json" @@ -1097,6 +1317,14 @@ "name": "Overture Matte PLA @BBL A1M", "sub_path": "filament/Overture Matte PLA @BBL A1M.json" }, + { + "name": "Overture Matte PLA @BBL A1", + "sub_path": "filament/Overture Matte PLA @BBL A1.json" + }, + { + "name": "Overture Matte PLA @BBL A1 0.2 nozzle", + "sub_path": "filament/Overture Matte PLA @BBL A1 0.2 nozzle.json" + }, { "name": "Generic PLA High Speed @BBL X1C", "sub_path": "filament/Generic PLA High Speed @BBL X1C.json" @@ -1109,6 +1337,14 @@ "name": "Generic PLA High Speed @BBL A1M", "sub_path": "filament/Generic PLA High Speed @BBL A1M.json" }, + { + "name": "Generic PLA High Speed @BBL A1", + "sub_path": "filament/Generic PLA High Speed @BBL A1.json" + }, + { + "name": "Generic PLA High Speed @BBL A1 0.2 nozzle", + "sub_path": "filament/Generic PLA High Speed @BBL A1 0.2 nozzle.json" + }, { "name": "Bambu PLA Glow @BBL X1C", "sub_path": "filament/Bambu PLA Glow @BBL X1C.json" @@ -1125,6 +1361,14 @@ "name": "Bambu PLA Glow @BBL X1", "sub_path": "filament/Bambu PLA Glow @BBL X1.json" }, + { + "name": "Bambu PLA Glow @BBL A1 0.2 nozzle", + "sub_path": "filament/Bambu PLA Glow @BBL A1 0.2 nozzle.json" + }, + { + "name": "Bambu PLA Glow @BBL A1", + "sub_path": "filament/Bambu PLA Glow @BBL A1.json" + }, { "name": "Bambu TPU 95A @BBL X1C", "sub_path": "filament/Bambu TPU 95A @BBL X1C.json" @@ -1141,10 +1385,18 @@ "name": "Bambu TPU 95A @BBL A1M", "sub_path": "filament/Bambu TPU 95A @BBL A1M.json" }, + { + "name": "Bambu TPU 95A @BBL A1", + "sub_path": "filament/Bambu TPU 95A @BBL A1.json" + }, { "name": "Generic TPU @BBL A1M", "sub_path": "filament/Generic TPU @BBL A1M.json" }, + { + "name": "Generic TPU @BBL A1", + "sub_path": "filament/Generic TPU @BBL A1.json" + }, { "name": "Bambu TPU 95A HF @BBL X1C", "sub_path": "filament/Bambu TPU 95A HF @BBL X1C.json" @@ -1169,6 +1421,10 @@ "name": "Bambu TPU 95A HF @BBL A1M", "sub_path": "filament/Bambu TPU 95A HF @BBL A1M.json" }, + { + "name": "Bambu TPU 95A HF @BBL A1", + "sub_path": "filament/Bambu TPU 95A HF @BBL A1.json" + }, { "name": "Bambu PETG Basic @BBL X1C", "sub_path": "filament/Bambu PETG Basic @BBL X1C.json" @@ -1181,6 +1437,18 @@ "name": "Bambu PETG Basic @BBL X1C 0.8 nozzle", "sub_path": "filament/Bambu PETG Basic @BBL X1C 0.8 nozzle.json" }, + { + "name": "Bambu PETG Basic @BBL A1", + "sub_path": "filament/Bambu PETG Basic @BBL A1.json" + }, + { + "name": "Bambu PETG Basic @BBL A1 0.2 nozzle", + "sub_path": "filament/Bambu PETG Basic @BBL A1 0.2 nozzle.json" + }, + { + "name": "Bambu PETG Basic @BBL A1 0.8 nozzle", + "sub_path": "filament/Bambu PETG Basic @BBL A1 0.8 nozzle.json" + }, { "name": "Bambu PET-CF @BBL X1C", "sub_path": "filament/Bambu PET-CF @BBL X1C.json" @@ -1189,6 +1457,10 @@ "name": "Bambu PET-CF @BBL P1P", "sub_path": "filament/P1P/Bambu PET-CF @BBL P1P.json" }, + { + "name": "Bambu PET-CF @BBL A1", + "sub_path": "filament/Bambu PET-CF @BBL A1.json" + }, { "name": "Generic PETG", "sub_path": "filament/Generic PETG.json" @@ -1213,6 +1485,14 @@ "name": "Generic PETG @BBL A1M 0.2 nozzle", "sub_path": "filament/Generic PETG @BBL A1M 0.2 nozzle.json" }, + { + "name": "Generic PETG @BBL A1", + "sub_path": "filament/Generic PETG @BBL A1.json" + }, + { + "name": "Generic PETG @BBL A1 0.2 nozzle", + "sub_path": "filament/Generic PETG @BBL A1 0.2 nozzle.json" + }, { "name": "Generic PETG-CF @BBL X1C", "sub_path": "filament/Generic PETG-CF @BBL X1C.json" @@ -1221,6 +1501,10 @@ "name": "Generic PETG-CF @BBL P1P", "sub_path": "filament/P1P/Generic PETG-CF @BBL P1P.json" }, + { + "name": "Generic PETG-CF @BBL A1", + "sub_path": "filament/Generic PETG-CF @BBL A1.json" + }, { "name": "Bambu PETG-CF @BBL X1C", "sub_path": "filament/Bambu PETG-CF @BBL X1C.json" @@ -1241,6 +1525,14 @@ "name": "Bambu PETG-CF @BBL A1M", "sub_path": "filament/Bambu PETG-CF @BBL A1M.json" }, + { + "name": "Bambu PETG-CF @BBL A1 0.4 nozzle", + "sub_path": "filament/Bambu PETG-CF @BBL A1 0.4 nozzle.json" + }, + { + "name": "Bambu PETG-CF @BBL A1 0.8 nozzle", + "sub_path": "filament/Bambu PETG-CF @BBL A1 0.8 nozzle.json" + }, { "name": "PolyLite PETG @BBL X1C", "sub_path": "filament/PolyLite PETG @BBL X1C.json" @@ -1253,6 +1545,14 @@ "name": "PolyLite PETG @BBL A1M", "sub_path": "filament/PolyLite PETG @BBL A1M.json" }, + { + "name": "PolyLite PETG @BBL A1", + "sub_path": "filament/PolyLite PETG @BBL A1.json" + }, + { + "name": "PolyLite PETG @BBL A1 0.2 nozzle", + "sub_path": "filament/PolyLite PETG @BBL A1 0.2 nozzle.json" + }, { "name": "Bambu ABS @BBL X1C", "sub_path": "filament/Bambu ABS @BBL X1C.json" @@ -1273,6 +1573,14 @@ "name": "Bambu ABS @BBL P1P", "sub_path": "filament/P1P/Bambu ABS @BBL P1P.json" }, + { + "name": "Bambu ABS @BBL A1", + "sub_path": "filament/Bambu ABS @BBL A1.json" + }, + { + "name": "Bambu ABS @BBL A1 0.2 nozzle", + "sub_path": "filament/Bambu ABS @BBL A1 0.2 nozzle.json" + }, { "name": "Generic ABS", "sub_path": "filament/Generic ABS.json" @@ -1289,6 +1597,14 @@ "name": "Generic ABS @BBL P1P", "sub_path": "filament/P1P/Generic ABS @BBL P1P.json" }, + { + "name": "Generic ABS @BBL A1", + "sub_path": "filament/Generic ABS @BBL A1.json" + }, + { + "name": "Generic ABS @BBL A1 0.2 nozzle", + "sub_path": "filament/Generic ABS @BBL A1 0.2 nozzle.json" + }, { "name": "PolyLite ABS @BBL X1C", "sub_path": "filament/PolyLite ABS @BBL X1C.json" @@ -1297,6 +1613,14 @@ "name": "PolyLite ABS @BBL P1P", "sub_path": "filament/PolyLite ABS @BBL P1P.json" }, + { + "name": "PolyLite ABS @BBL A1", + "sub_path": "filament/PolyLite ABS @BBL A1.json" + }, + { + "name": "PolyLite ABS @BBL A1 0.2 nozzle", + "sub_path": "filament/PolyLite ABS @BBL A1 0.2 nozzle.json" + }, { "name": "Bambu PC @BBL X1C", "sub_path": "filament/Bambu PC @BBL X1C.json" @@ -1321,6 +1645,14 @@ "name": "Bambu PC @BBL P1P 0.2 nozzle", "sub_path": "filament/P1P/Bambu PC @BBL P1P 0.2 nozzle.json" }, + { + "name": "Bambu PC @BBL A1 0.2 nozzle", + "sub_path": "filament/Bambu PC @BBL A1 0.2 nozzle.json" + }, + { + "name": "Bambu PC @BBL A1", + "sub_path": "filament/Bambu PC @BBL A1.json" + }, { "name": "Generic PC @0.2 nozzle", "sub_path": "filament/Generic PC @0.2 nozzle.json" @@ -1337,6 +1669,14 @@ "name": "Generic PC @BBL P1P", "sub_path": "filament/P1P/Generic PC @BBL P1P.json" }, + { + "name": "Generic PC @BBL A1", + "sub_path": "filament/Generic PC @BBL A1.json" + }, + { + "name": "Generic PC @BBL A1 0.2 nozzle", + "sub_path": "filament/Generic PC @BBL A1 0.2 nozzle.json" + }, { "name": "Generic ASA @0.2 nozzle", "sub_path": "filament/Generic ASA @0.2 nozzle.json" @@ -1353,6 +1693,14 @@ "name": "Generic ASA @BBL P1P", "sub_path": "filament/P1P/Generic ASA @BBL P1P.json" }, + { + "name": "Generic ASA @BBL A1 0.2 nozzle", + "sub_path": "filament/Generic ASA @BBL A1 0.2 nozzle.json" + }, + { + "name": "Generic ASA @BBL A1", + "sub_path": "filament/Generic ASA @BBL A1.json" + }, { "name": "Bambu ASA @BBL X1 0.2 nozzle", "sub_path": "filament/Bambu ASA @BBL X1 0.2 nozzle.json" @@ -1373,6 +1721,18 @@ "name": "Bambu ASA @BBL X1C 0.4 nozzle", "sub_path": "filament/Bambu ASA @BBL X1C 0.4 nozzle.json" }, + { + "name": "Bambu ASA @BBL A1 0.6 nozzle", + "sub_path": "filament/Bambu ASA @BBL A1 0.6 nozzle.json" + }, + { + "name": "Bambu ASA @BBL A1 0.4 nozzle", + "sub_path": "filament/Bambu ASA @BBL A1 0.4 nozzle.json" + }, + { + "name": "Bambu ASA @BBL A1 0.2 nozzle", + "sub_path": "filament/Bambu ASA @BBL A1 0.2 nozzle.json" + }, { "name": "PolyLite ASA @BBL X1C", "sub_path": "filament/PolyLite ASA @BBL X1C.json" @@ -1381,6 +1741,14 @@ "name": "PolyLite ASA @BBL P1P", "sub_path": "filament/PolyLite ASA @BBL P1P.json" }, + { + "name": "PolyLite ASA @BBL A1 0.2 nozzle", + "sub_path": "filament/PolyLite ASA @BBL A1 0.2 nozzle.json" + }, + { + "name": "PolyLite ASA @BBL A1", + "sub_path": "filament/PolyLite ASA @BBL A1.json" + }, { "name": "Generic PVA @0.2 nozzle", "sub_path": "filament/Generic PVA @0.2 nozzle.json" @@ -1405,6 +1773,14 @@ "name": "Generic PVA @BBL A1M 0.2 nozzle", "sub_path": "filament/Generic PVA @BBL A1M 0.2 nozzle.json" }, + { + "name": "Generic PVA @BBL A1", + "sub_path": "filament/Generic PVA @BBL A1.json" + }, + { + "name": "Generic PVA @BBL A1 0.2 nozzle", + "sub_path": "filament/Generic PVA @BBL A1 0.2 nozzle.json" + }, { "name": "Bambu Support G @BBL X1C", "sub_path": "filament/Bambu Support G @BBL X1C.json" @@ -1413,6 +1789,10 @@ "name": "Bambu Support G @BBL P1P", "sub_path": "filament/P1P/Bambu Support G @BBL P1P.json" }, + { + "name": "Bambu Support G @BBL A1", + "sub_path": "filament/Bambu Support G @BBL A1.json" + }, { "name": "Bambu PA-CF @BBL X1C", "sub_path": "filament/Bambu PA-CF @BBL X1C.json" @@ -1421,10 +1801,22 @@ "name": "Bambu PA-CF @BBL P1P", "sub_path": "filament/P1P/Bambu PA-CF @BBL P1P.json" }, + { + "name": "Bambu PA-CF @BBL A1", + "sub_path": "filament/Bambu PA-CF @BBL A1.json" + }, + { + "name": "Generic PA @BBL A1", + "sub_path": "filament/Generic PA @BBL A1.json" + }, { "name": "Generic PA-CF @BBL X1E", "sub_path": "filament/Generic PA-CF @BBL X1E.json" }, + { + "name": "Generic PA-CF @BBL A1", + "sub_path": "filament/Generic PA-CF @BBL A1.json" + }, { "name": "Bambu PAHT-CF @BBL X1C", "sub_path": "filament/Bambu PAHT-CF @BBL X1C.json" @@ -1433,6 +1825,10 @@ "name": "Bambu PAHT-CF @BBL P1P", "sub_path": "filament/P1P/Bambu PAHT-CF @BBL P1P.json" }, + { + "name": "Bambu PAHT-CF @BBL A1", + "sub_path": "filament/Bambu PAHT-CF @BBL A1.json" + }, { "name": "Bambu Support For PA/PET @BBL P1P", "sub_path": "filament/P1P/Bambu Support For PA PET @BBL P1P.json" @@ -1441,6 +1837,10 @@ "name": "Bambu Support For PA/PET @BBL X1C", "sub_path": "filament/Bambu Support For PA PET @BBL X1C.json" }, + { + "name": "Bambu Support For PA/PET @BBL A1", + "sub_path": "filament/Bambu Support For PA PET @BBL A1.json" + }, { "name": "Bambu PA6-CF @BBL X1C", "sub_path": "filament/Bambu PA6-CF @BBL X1C.json" @@ -1449,6 +1849,10 @@ "name": "Bambu PA6-CF @BBL X1E", "sub_path": "filament/Bambu PA6-CF @BBL X1E.json" }, + { + "name": "Bambu PA6-CF @BBL A1", + "sub_path": "filament/Bambu PA6-CF @BBL A1.json" + }, { "name": "Generic HIPS @BBL X1C", "sub_path": "filament/Generic HIPS @BBL X1C.json" @@ -1465,6 +1869,14 @@ "name": "Generic HIPS @BBL A1M 0.2 nozzle", "sub_path": "filament/Generic HIPS @BBL A1M 0.2 nozzle.json" }, + { + "name": "Generic HIPS @BBL A1", + "sub_path": "filament/Generic HIPS @BBL A1.json" + }, + { + "name": "Generic HIPS @BBL A1 0.2 nozzle", + "sub_path": "filament/Generic HIPS @BBL A1 0.2 nozzle.json" + }, { "name": "Generic PPS-CF @BBL X1E", "sub_path": "filament/Generic PPS-CF @BBL X1E.json" @@ -1755,6 +2167,10 @@ "name": "Bambu Lab X1E 0.4 nozzle", "sub_path": "machine/Bambu Lab X1E 0.4 nozzle.json" }, + { + "name": "Bambu Lab A1 0.4 nozzle", + "sub_path": "machine/Bambu Lab A1 0.4 nozzle.json" + }, { "name": "Bambu Lab X1 Carbon 0.2 nozzle", "sub_path": "machine/Bambu Lab X1 Carbon 0.2 nozzle.json" @@ -1826,6 +2242,18 @@ { "name": "Bambu Lab X1E 0.8 nozzle", "sub_path": "machine/Bambu Lab X1E 0.8 nozzle.json" + }, + { + "name": "Bambu Lab A1 0.2 nozzle", + "sub_path": "machine/Bambu Lab A1 0.2 nozzle.json" + }, + { + "name": "Bambu Lab A1 0.6 nozzle", + "sub_path": "machine/Bambu Lab A1 0.6 nozzle.json" + }, + { + "name": "Bambu Lab A1 0.8 nozzle", + "sub_path": "machine/Bambu Lab A1 0.8 nozzle.json" } ] } \ No newline at end of file diff --git a/resources/profiles/BBL/Bambu Lab A1_cover.png b/resources/profiles/BBL/Bambu Lab A1_cover.png new file mode 100644 index 0000000000..93f7121ace Binary files /dev/null and b/resources/profiles/BBL/Bambu Lab A1_cover.png differ diff --git a/resources/profiles/BBL/cli_config.json b/resources/profiles/BBL/cli_config.json new file mode 100644 index 0000000000..8fd179ecc1 --- /dev/null +++ b/resources/profiles/BBL/cli_config.json @@ -0,0 +1,21 @@ +{ + "printer": { + "Bambu Lab A1": { + "cli_safe_acceleration_e": "0,0", + "cli_safe_acceleration_extruding": "0,0", + "cli_safe_acceleration_retracting": "0,0", + "cli_safe_acceleration_travel":"6000,6000", + "cli_safe_acceleration_x": "6000,6000", + "cli_safe_acceleration_y": "6000,6000", + "cli_safe_acceleration_z": "0,0", + "cli_safe_jerk_e": "0,0", + "cli_safe_jerk_x": "0,0", + "cli_safe_jerk_y": "0,0", + "cli_safe_jerk_z": "0,0", + "cli_safe_speed_e": "0,0", + "cli_safe_speed_x": "0,0", + "cli_safe_speed_y": "0,0", + "cli_safe_speed_z": "0,0" + } + } +} diff --git a/resources/profiles/BBL/filament/Bambu ABS @BBL A1 0.2 nozzle.json b/resources/profiles/BBL/filament/Bambu ABS @BBL A1 0.2 nozzle.json new file mode 100644 index 0000000000..352292b1ea --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu ABS @BBL A1 0.2 nozzle.json @@ -0,0 +1,32 @@ +{ + "type": "filament", + "name": "Bambu ABS @BBL A1 0.2 nozzle", + "inherits": "Bambu ABS @base", + "from": "system", + "setting_id": "GFSB00_08", + "instantiation": "true", + "fan_max_speed": [ + "20" + ], + "filament_max_volumetric_speed": [ + "2" + ], + "hot_plate_temp": [ + "100" + ], + "hot_plate_temp_initial_layer": [ + "100" + ], + "reduce_fan_stop_start_freq": [ + "0" + ], + "textured_plate_temp": [ + "100" + ], + "textured_plate_temp_initial_layer": [ + "100" + ], + "compatible_printers": [ + "Bambu Lab A1 0.2 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu ABS @BBL A1.json b/resources/profiles/BBL/filament/Bambu ABS @BBL A1.json new file mode 100644 index 0000000000..3358a7fc74 --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu ABS @BBL A1.json @@ -0,0 +1,34 @@ +{ + "type": "filament", + "name": "Bambu ABS @BBL A1", + "inherits": "Bambu ABS @base", + "from": "system", + "setting_id": "GFSB00_07", + "instantiation": "true", + "fan_max_speed": [ + "20" + ], + "filament_max_volumetric_speed": [ + "16" + ], + "hot_plate_temp": [ + "100" + ], + "hot_plate_temp_initial_layer": [ + "100" + ], + "reduce_fan_stop_start_freq": [ + "0" + ], + "textured_plate_temp": [ + "100" + ], + "textured_plate_temp_initial_layer": [ + "100" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu ASA @BBL A1 0.2 nozzle.json b/resources/profiles/BBL/filament/Bambu ASA @BBL A1 0.2 nozzle.json new file mode 100644 index 0000000000..e67d7d90e0 --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu ASA @BBL A1 0.2 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "name": "Bambu ASA @BBL A1 0.2 nozzle", + "inherits": "Bambu ASA @base", + "from": "system", + "setting_id": "GFSB01_10", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "2" + ], + "compatible_printers": [ + "Bambu Lab A1 0.2 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu ASA @BBL A1 0.4 nozzle.json b/resources/profiles/BBL/filament/Bambu ASA @BBL A1 0.4 nozzle.json new file mode 100644 index 0000000000..9c92e7653b --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu ASA @BBL A1 0.4 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "name": "Bambu ASA @BBL A1 0.4 nozzle", + "inherits": "Bambu ASA @base", + "from": "system", + "setting_id": "GFSB01_09", + "instantiation": "true", + "chamber_temperatures": [ + "60" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu ASA @BBL A1 0.6 nozzle.json b/resources/profiles/BBL/filament/Bambu ASA @BBL A1 0.6 nozzle.json new file mode 100644 index 0000000000..a934418ec1 --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu ASA @BBL A1 0.6 nozzle.json @@ -0,0 +1,18 @@ +{ + "type": "filament", + "name": "Bambu ASA @BBL A1 0.6 nozzle", + "inherits": "Bambu ASA @base", + "from": "system", + "setting_id": "GFSB01_08", + "instantiation": "true", + "fan_max_speed": [ + "90" + ], + "fan_min_speed": [ + "25" + ], + "compatible_printers": [ + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu ASA @base.json b/resources/profiles/BBL/filament/Bambu ASA @base.json index f2fc943a0d..4eb57181d1 100644 --- a/resources/profiles/BBL/filament/Bambu ASA @base.json +++ b/resources/profiles/BBL/filament/Bambu ASA @base.json @@ -25,5 +25,8 @@ ], "filament_max_volumetric_speed": [ "18" + ], + "filament_vendor": [ + "Bambu Lab" ] } \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu PA-CF @BBL A1.json b/resources/profiles/BBL/filament/Bambu PA-CF @BBL A1.json new file mode 100644 index 0000000000..bf7053636f --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu PA-CF @BBL A1.json @@ -0,0 +1,31 @@ +{ + "type": "filament", + "name": "Bambu PA-CF @BBL A1", + "inherits": "Bambu PA-CF @base", + "from": "system", + "setting_id": "GFSN03_01", + "instantiation": "true", + "fan_cooling_layer_time": [ + "5" + ], + "fan_max_speed": [ + "30" + ], + "fan_min_speed": [ + "10" + ], + "full_fan_speed_layer": [ + "2" + ], + "nozzle_temperature": [ + "290" + ], + "nozzle_temperature_initial_layer": [ + "290" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu PA6-CF @BBL A1.json b/resources/profiles/BBL/filament/Bambu PA6-CF @BBL A1.json new file mode 100644 index 0000000000..c8ad4d3ae3 --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu PA6-CF @BBL A1.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "name": "Bambu PA6-CF @BBL A1", + "inherits": "Bambu PA6-CF @base", + "from": "system", + "setting_id": "GFSN05_00", + "instantiation": "true", + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu PAHT-CF @BBL A1.json b/resources/profiles/BBL/filament/Bambu PAHT-CF @BBL A1.json new file mode 100644 index 0000000000..c925657b6d --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu PAHT-CF @BBL A1.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "name": "Bambu PAHT-CF @BBL A1", + "inherits": "Bambu PAHT-CF @base", + "from": "system", + "setting_id": "GFSN04_00", + "instantiation": "true", + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu PC @BBL A1 0.2 nozzle.json b/resources/profiles/BBL/filament/Bambu PC @BBL A1 0.2 nozzle.json new file mode 100644 index 0000000000..3a65f1d44c --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu PC @BBL A1 0.2 nozzle.json @@ -0,0 +1,41 @@ +{ + "type": "filament", + "name": "Bambu PC @BBL A1 0.2 nozzle", + "inherits": "Bambu PC @base", + "from": "system", + "setting_id": "GFSC00_13", + "instantiation": "true", + "eng_plate_temp": [ + "100" + ], + "eng_plate_temp_initial_layer": [ + "100" + ], + "fan_max_speed": [ + "20" + ], + "filament_max_volumetric_speed": [ + "1" + ], + "hot_plate_temp": [ + "100" + ], + "hot_plate_temp_initial_layer": [ + "100" + ], + "nozzle_temperature": [ + "260" + ], + "reduce_fan_stop_start_freq": [ + "0" + ], + "textured_plate_temp": [ + "100" + ], + "textured_plate_temp_initial_layer": [ + "100" + ], + "compatible_printers": [ + "Bambu Lab A1 0.2 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu PC @BBL A1.json b/resources/profiles/BBL/filament/Bambu PC @BBL A1.json new file mode 100644 index 0000000000..5d291b7b7c --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu PC @BBL A1.json @@ -0,0 +1,37 @@ +{ + "type": "filament", + "name": "Bambu PC @BBL A1", + "inherits": "Bambu PC @base", + "from": "system", + "setting_id": "GFSC00_14", + "instantiation": "true", + "eng_plate_temp": [ + "100" + ], + "eng_plate_temp_initial_layer": [ + "100" + ], + "fan_max_speed": [ + "20" + ], + "hot_plate_temp": [ + "100" + ], + "hot_plate_temp_initial_layer": [ + "100" + ], + "reduce_fan_stop_start_freq": [ + "0" + ], + "textured_plate_temp": [ + "100" + ], + "textured_plate_temp_initial_layer": [ + "100" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu PET-CF @BBL A1.json b/resources/profiles/BBL/filament/Bambu PET-CF @BBL A1.json new file mode 100644 index 0000000000..2c7f479a0e --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu PET-CF @BBL A1.json @@ -0,0 +1,19 @@ +{ + "type": "filament", + "name": "Bambu PET-CF @BBL A1", + "inherits": "Bambu PET-CF @base", + "from": "system", + "setting_id": "GFST01_01", + "instantiation": "true", + "reduce_fan_stop_start_freq": [ + "0" + ], + "slow_down_min_speed": [ + "20" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.8 nozzle", + "Bambu Lab A1 0.6 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu PETG Basic @BBL A1 0.2 nozzle.json b/resources/profiles/BBL/filament/Bambu PETG Basic @BBL A1 0.2 nozzle.json new file mode 100644 index 0000000000..c2a39079f4 --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu PETG Basic @BBL A1 0.2 nozzle.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "name": "Bambu PETG Basic @BBL A1 0.2 nozzle", + "inherits": "Bambu PETG Basic @base", + "from": "system", + "setting_id": "GFSG00_07", + "instantiation": "true", + "filament_flow_ratio": [ + "0.94" + ], + "filament_max_volumetric_speed": [ + "1" + ], + "compatible_printers": [ + "Bambu Lab A1 0.2 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu PETG Basic @BBL A1 0.8 nozzle.json b/resources/profiles/BBL/filament/Bambu PETG Basic @BBL A1 0.8 nozzle.json new file mode 100644 index 0000000000..3256722e2f --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu PETG Basic @BBL A1 0.8 nozzle.json @@ -0,0 +1,24 @@ +{ + "type": "filament", + "name": "Bambu PETG Basic @BBL A1 0.8 nozzle", + "inherits": "Bambu PETG Basic @base", + "from": "system", + "setting_id": "GFSG00_08", + "instantiation": "true", + "fan_max_speed": [ + "60" + ], + "fan_min_speed": [ + "20" + ], + "filament_flow_ratio": [ + "0.94" + ], + "filament_max_volumetric_speed": [ + "12" + ], + "compatible_printers": [ + "Bambu Lab A1 0.8 nozzle", + "Bambu Lab A1 0.6 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu PETG Basic @BBL A1.json b/resources/profiles/BBL/filament/Bambu PETG Basic @BBL A1.json new file mode 100644 index 0000000000..8870faf842 --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu PETG Basic @BBL A1.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "name": "Bambu PETG Basic @BBL A1", + "inherits": "Bambu PETG Basic @base", + "from": "system", + "setting_id": "GFSG00_06", + "instantiation": "true", + "filament_flow_ratio": [ + "0.94" + ], + "filament_max_volumetric_speed": [ + "9" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu PETG-CF @BBL A1 0.4 nozzle.json b/resources/profiles/BBL/filament/Bambu PETG-CF @BBL A1 0.4 nozzle.json new file mode 100644 index 0000000000..3313b34267 --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu PETG-CF @BBL A1 0.4 nozzle.json @@ -0,0 +1,26 @@ +{ + "type": "filament", + "name": "Bambu PETG-CF @BBL A1 0.4 nozzle", + "inherits": "Bambu PETG-CF @base", + "from": "system", + "setting_id": "GFSG50_05", + "instantiation": "true", + "fan_cooling_layer_time": [ + "30" + ], + "fan_max_speed": [ + "40" + ], + "fan_min_speed": [ + "5" + ], + "filament_max_volumetric_speed": [ + "11.5" + ], + "overhang_fan_speed": [ + "100" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu PETG-CF @BBL A1 0.8 nozzle.json b/resources/profiles/BBL/filament/Bambu PETG-CF @BBL A1 0.8 nozzle.json new file mode 100644 index 0000000000..7c1e1d67b8 --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu PETG-CF @BBL A1 0.8 nozzle.json @@ -0,0 +1,27 @@ +{ + "type": "filament", + "name": "Bambu PETG-CF @BBL A1 0.8 nozzle", + "inherits": "Bambu PETG-CF @base", + "from": "system", + "setting_id": "GFSG50_06", + "instantiation": "true", + "fan_cooling_layer_time": [ + "30" + ], + "fan_max_speed": [ + "40" + ], + "fan_min_speed": [ + "5" + ], + "filament_max_volumetric_speed": [ + "11.5" + ], + "overhang_fan_speed": [ + "100" + ], + "compatible_printers": [ + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu PLA Aero @BBL A1.json b/resources/profiles/BBL/filament/Bambu PLA Aero @BBL A1.json new file mode 100644 index 0000000000..14def75264 --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu PLA Aero @BBL A1.json @@ -0,0 +1,40 @@ +{ + "type": "filament", + "name": "Bambu PLA Aero @BBL A1", + "inherits": "Bambu PLA Aero @base", + "from": "system", + "setting_id": "GFSA11_04", + "instantiation": "true", + "additional_cooling_fan_speed": [ + "0" + ], + "fan_cooling_layer_time": [ + "80" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "60" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "slow_down_layer_time": [ + "8" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu PLA Basic @BBL A1 0.2 nozzle.json b/resources/profiles/BBL/filament/Bambu PLA Basic @BBL A1 0.2 nozzle.json new file mode 100644 index 0000000000..df3036b34c --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu PLA Basic @BBL A1 0.2 nozzle.json @@ -0,0 +1,38 @@ +{ + "type": "filament", + "name": "Bambu PLA Basic @BBL A1 0.2 nozzle", + "inherits": "Bambu PLA Basic @base", + "from": "system", + "setting_id": "GFSA00_06", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "60" + ], + "filament_max_volumetric_speed": [ + "2" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "slow_down_layer_time": [ + "6" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "compatible_printers": [ + "Bambu Lab A1 0.2 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu PLA Basic @BBL A1.json b/resources/profiles/BBL/filament/Bambu PLA Basic @BBL A1.json new file mode 100644 index 0000000000..4e3b6cc6dc --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu PLA Basic @BBL A1.json @@ -0,0 +1,37 @@ +{ + "type": "filament", + "name": "Bambu PLA Basic @BBL A1", + "inherits": "Bambu PLA Basic @base", + "from": "system", + "setting_id": "GFSA00_04", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "60" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "slow_down_layer_time": [ + "6" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu PLA Glow @BBL A1 0.2 nozzle.json b/resources/profiles/BBL/filament/Bambu PLA Glow @BBL A1 0.2 nozzle.json new file mode 100644 index 0000000000..5eae9e1e1a --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu PLA Glow @BBL A1 0.2 nozzle.json @@ -0,0 +1,35 @@ +{ + "type": "filament", + "name": "Bambu PLA Glow @BBL A1 0.2 nozzle", + "inherits": "Bambu PLA Glow @base", + "from": "system", + "setting_id": "GFSA12_10", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_min_speed": [ + "50" + ], + "filament_max_volumetric_speed": [ + "1" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "slow_down_layer_time": [ + "8" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "compatible_printers": [ + "Bambu Lab A1 0.2 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu PLA Glow @BBL A1.json b/resources/profiles/BBL/filament/Bambu PLA Glow @BBL A1.json new file mode 100644 index 0000000000..b4949148dd --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu PLA Glow @BBL A1.json @@ -0,0 +1,34 @@ +{ + "type": "filament", + "name": "Bambu PLA Glow @BBL A1", + "inherits": "Bambu PLA Glow @base", + "from": "system", + "setting_id": "GFSA12_11", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_min_speed": [ + "50" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "slow_down_layer_time": [ + "8" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu PLA Marble @BBL A1.json b/resources/profiles/BBL/filament/Bambu PLA Marble @BBL A1.json new file mode 100644 index 0000000000..c4eaac7e47 --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu PLA Marble @BBL A1.json @@ -0,0 +1,37 @@ +{ + "type": "filament", + "name": "Bambu PLA Marble @BBL A1", + "inherits": "Bambu PLA Marble @base", + "from": "system", + "setting_id": "GFSA07_03", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "60" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "slow_down_layer_time": [ + "6" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu PLA Matte @BBL A1 0.2 nozzle.json b/resources/profiles/BBL/filament/Bambu PLA Matte @BBL A1 0.2 nozzle.json new file mode 100644 index 0000000000..55bcf1e9b0 --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu PLA Matte @BBL A1 0.2 nozzle.json @@ -0,0 +1,38 @@ +{ + "type": "filament", + "name": "Bambu PLA Matte @BBL A1 0.2 nozzle", + "inherits": "Bambu PLA Matte @base", + "from": "system", + "setting_id": "GFSA01_06", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "60" + ], + "filament_max_volumetric_speed": [ + "2" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "slow_down_layer_time": [ + "6" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "compatible_printers": [ + "Bambu Lab A1 0.2 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu PLA Matte @BBL A1.json b/resources/profiles/BBL/filament/Bambu PLA Matte @BBL A1.json new file mode 100644 index 0000000000..7b877ed611 --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu PLA Matte @BBL A1.json @@ -0,0 +1,40 @@ +{ + "type": "filament", + "name": "Bambu PLA Matte @BBL A1", + "inherits": "Bambu PLA Matte @base", + "from": "system", + "setting_id": "GFSA01_04", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "60" + ], + "filament_max_volumetric_speed": [ + "22" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "slow_down_layer_time": [ + "6" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu PLA Matte @base.json b/resources/profiles/BBL/filament/Bambu PLA Matte @base.json index a9a337c6a4..36156e0af8 100644 --- a/resources/profiles/BBL/filament/Bambu PLA Matte @base.json +++ b/resources/profiles/BBL/filament/Bambu PLA Matte @base.json @@ -5,9 +5,6 @@ "from": "system", "filament_id": "GFA01", "instantiation": "false", - "filament_vendor": [ - "Bambu Lab" - ], "filament_cost": [ "24.99" ], @@ -17,6 +14,9 @@ "filament_flow_ratio": [ "0.98" ], + "filament_vendor": [ + "Bambu Lab" + ], "filament_start_gcode": [ "; filament start gcode\n{if (bed_temperature[current_extruder] >55)||(bed_temperature_initial_layer[current_extruder] >55)}M106 P3 S200\n{elsif(bed_temperature[current_extruder] >50)||(bed_temperature_initial_layer[current_extruder] >50)}M106 P3 S150\n{elsif(bed_temperature[current_extruder] >45)||(bed_temperature_initial_layer[current_extruder] >45)}M106 P3 S50\n{endif}\n\n{if activate_air_filtration[current_extruder] && support_air_filtration}\nM106 P3 S{during_print_exhaust_fan_speed_num[current_extruder]} \n{endif}" ] diff --git a/resources/profiles/BBL/filament/Bambu PLA Metal @BBL A1 0.2 nozzle.json b/resources/profiles/BBL/filament/Bambu PLA Metal @BBL A1 0.2 nozzle.json new file mode 100644 index 0000000000..06e56bced1 --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu PLA Metal @BBL A1 0.2 nozzle.json @@ -0,0 +1,38 @@ +{ + "type": "filament", + "name": "Bambu PLA Metal @BBL A1 0.2 nozzle", + "inherits": "Bambu PLA Metal @base", + "from": "system", + "setting_id": "GFSA02_05", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "60" + ], + "filament_max_volumetric_speed": [ + "2" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "slow_down_layer_time": [ + "6" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "compatible_printers": [ + "Bambu Lab A1 0.2 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu PLA Metal @BBL A1.json b/resources/profiles/BBL/filament/Bambu PLA Metal @BBL A1.json new file mode 100644 index 0000000000..b4fcb8fcb5 --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu PLA Metal @BBL A1.json @@ -0,0 +1,40 @@ +{ + "type": "filament", + "name": "Bambu PLA Metal @BBL A1", + "inherits": "Bambu PLA Metal @base", + "from": "system", + "setting_id": "GFSA02_04", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "60" + ], + "filament_max_volumetric_speed": [ + "21" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "slow_down_layer_time": [ + "6" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu PLA Silk @BBL A1 0.2 nozzle.json b/resources/profiles/BBL/filament/Bambu PLA Silk @BBL A1 0.2 nozzle.json new file mode 100644 index 0000000000..f032c62b6c --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu PLA Silk @BBL A1 0.2 nozzle.json @@ -0,0 +1,38 @@ +{ + "type": "filament", + "name": "Bambu PLA Silk @BBL A1 0.2 nozzle", + "inherits": "Bambu PLA Silk @base", + "from": "system", + "setting_id": "GFSA05_06", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "60" + ], + "filament_max_volumetric_speed": [ + "2" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "slow_down_layer_time": [ + "8" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "compatible_printers": [ + "Bambu Lab A1 0.2 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu PLA Silk @BBL A1.json b/resources/profiles/BBL/filament/Bambu PLA Silk @BBL A1.json new file mode 100644 index 0000000000..73a96884a5 --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu PLA Silk @BBL A1.json @@ -0,0 +1,37 @@ +{ + "type": "filament", + "name": "Bambu PLA Silk @BBL A1", + "inherits": "Bambu PLA Silk @base", + "from": "system", + "setting_id": "GFSA05_05", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "60" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "slow_down_layer_time": [ + "8" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu PLA Sparkle @BBL A1.json b/resources/profiles/BBL/filament/Bambu PLA Sparkle @BBL A1.json new file mode 100644 index 0000000000..04ac842952 --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu PLA Sparkle @BBL A1.json @@ -0,0 +1,37 @@ +{ + "type": "filament", + "name": "Bambu PLA Sparkle @BBL A1", + "inherits": "Bambu PLA Sparkle @base", + "from": "system", + "setting_id": "GFSA08_03", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "60" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "slow_down_layer_time": [ + "6" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu PLA Tough @BBL A1 0.2 nozzle.json b/resources/profiles/BBL/filament/Bambu PLA Tough @BBL A1 0.2 nozzle.json new file mode 100644 index 0000000000..0f24a3f006 --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu PLA Tough @BBL A1 0.2 nozzle.json @@ -0,0 +1,38 @@ +{ + "type": "filament", + "name": "Bambu PLA Tough @BBL A1 0.2 nozzle", + "inherits": "Bambu PLA Tough @base", + "from": "system", + "setting_id": "GFSA09_07", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "60" + ], + "filament_max_volumetric_speed": [ + "2" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "slow_down_layer_time": [ + "6" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "compatible_printers": [ + "Bambu Lab A1 0.2 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu PLA Tough @BBL A1.json b/resources/profiles/BBL/filament/Bambu PLA Tough @BBL A1.json new file mode 100644 index 0000000000..1261a47f52 --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu PLA Tough @BBL A1.json @@ -0,0 +1,40 @@ +{ + "type": "filament", + "name": "Bambu PLA Tough @BBL A1", + "inherits": "Bambu PLA Tough @base", + "from": "system", + "setting_id": "GFSA09_05", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "60" + ], + "filament_max_volumetric_speed": [ + "21" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "slow_down_layer_time": [ + "6" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu PLA-CF @BBL A1 0.8 nozzle.json b/resources/profiles/BBL/filament/Bambu PLA-CF @BBL A1 0.8 nozzle.json new file mode 100644 index 0000000000..48fdfde08f --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu PLA-CF @BBL A1 0.8 nozzle.json @@ -0,0 +1,45 @@ +{ + "type": "filament", + "name": "Bambu PLA-CF @BBL A1 0.8 nozzle", + "inherits": "Bambu PLA-CF @base", + "from": "system", + "setting_id": "GFSA50_05", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "60" + ], + "filament_max_volumetric_speed": [ + "18" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "nozzle_temperature": [ + "230" + ], + "nozzle_temperature_initial_layer": [ + "230" + ], + "slow_down_layer_time": [ + "6" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "compatible_printers": [ + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu PLA-CF @BBL A1.json b/resources/profiles/BBL/filament/Bambu PLA-CF @BBL A1.json new file mode 100644 index 0000000000..f69ce39db1 --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu PLA-CF @BBL A1.json @@ -0,0 +1,44 @@ +{ + "type": "filament", + "name": "Bambu PLA-CF @BBL A1", + "inherits": "Bambu PLA-CF @base", + "from": "system", + "setting_id": "GFSA50_04", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "60" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "nozzle_temperature": [ + "230" + ], + "nozzle_temperature_initial_layer": [ + "230" + ], + "slow_down_layer_time": [ + "6" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu Support For PA PET @BBL A1.json b/resources/profiles/BBL/filament/Bambu Support For PA PET @BBL A1.json new file mode 100644 index 0000000000..8a477d87ec --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu Support For PA PET @BBL A1.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "name": "Bambu Support For PA/PET @BBL A1", + "inherits": "Bambu Support For PA/PET @base", + "from": "system", + "setting_id": "GFSS03_02", + "instantiation": "true", + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu Support For PLA @BBL A1 0.2 nozzle.json b/resources/profiles/BBL/filament/Bambu Support For PLA @BBL A1 0.2 nozzle.json new file mode 100644 index 0000000000..c6bef4c77e --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu Support For PLA @BBL A1 0.2 nozzle.json @@ -0,0 +1,41 @@ +{ + "type": "filament", + "name": "Bambu Support For PLA @BBL A1 0.2 nozzle", + "inherits": "Bambu Support For PLA @base", + "from": "system", + "setting_id": "GFSS02_05", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "60" + ], + "filament_max_volumetric_speed": [ + "0.5" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "nozzle_temperature": [ + "240" + ], + "nozzle_temperature_initial_layer": [ + "240" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "compatible_printers": [ + "Bambu Lab A1 0.2 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu Support For PLA @BBL A1.json b/resources/profiles/BBL/filament/Bambu Support For PLA @BBL A1.json new file mode 100644 index 0000000000..da962db9cb --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu Support For PLA @BBL A1.json @@ -0,0 +1,34 @@ +{ + "type": "filament", + "name": "Bambu Support For PLA @BBL A1", + "inherits": "Bambu Support For PLA @base", + "from": "system", + "setting_id": "GFSS02_04", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "60" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu Support G @BBL A1.json b/resources/profiles/BBL/filament/Bambu Support G @BBL A1.json new file mode 100644 index 0000000000..bb28afc0fa --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu Support G @BBL A1.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "name": "Bambu Support G @BBL A1", + "inherits": "Bambu Support G @base", + "from": "system", + "setting_id": "GFSS01_01", + "instantiation": "true", + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu Support W @BBL A1 0.2 nozzle.json b/resources/profiles/BBL/filament/Bambu Support W @BBL A1 0.2 nozzle.json new file mode 100644 index 0000000000..6dfc9bf96e --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu Support W @BBL A1 0.2 nozzle.json @@ -0,0 +1,41 @@ +{ + "type": "filament", + "name": "Bambu Support W @BBL A1 0.2 nozzle", + "inherits": "Bambu Support W @base", + "from": "system", + "setting_id": "GFSS00_04", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "60" + ], + "filament_max_volumetric_speed": [ + "0.5" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "nozzle_temperature": [ + "240" + ], + "nozzle_temperature_initial_layer": [ + "240" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "compatible_printers": [ + "Bambu Lab A1 0.2 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu Support W @BBL A1.json b/resources/profiles/BBL/filament/Bambu Support W @BBL A1.json new file mode 100644 index 0000000000..b5c4e7b7f8 --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu Support W @BBL A1.json @@ -0,0 +1,34 @@ +{ + "type": "filament", + "name": "Bambu Support W @BBL A1", + "inherits": "Bambu Support W @base", + "from": "system", + "setting_id": "GFSS00_03", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "60" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu TPU 95A @BBL A1.json b/resources/profiles/BBL/filament/Bambu TPU 95A @BBL A1.json new file mode 100644 index 0000000000..1210ba985d --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu TPU 95A @BBL A1.json @@ -0,0 +1,28 @@ +{ + "type": "filament", + "name": "Bambu TPU 95A @BBL A1", + "inherits": "Bambu TPU 95A @base", + "from": "system", + "setting_id": "GFSU01_01", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "3.6" + ], + "hot_plate_temp": [ + "45" + ], + "hot_plate_temp_initial_layer": [ + "45" + ], + "textured_plate_temp": [ + "45" + ], + "textured_plate_temp_initial_layer": [ + "45" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Bambu TPU 95A HF @BBL A1.json b/resources/profiles/BBL/filament/Bambu TPU 95A HF @BBL A1.json new file mode 100644 index 0000000000..a5673e7624 --- /dev/null +++ b/resources/profiles/BBL/filament/Bambu TPU 95A HF @BBL A1.json @@ -0,0 +1,25 @@ +{ + "type": "filament", + "name": "Bambu TPU 95A HF @BBL A1", + "inherits": "Bambu TPU 95A HF @base", + "from": "system", + "setting_id": "GFSU00_06", + "instantiation": "true", + "hot_plate_temp": [ + "45" + ], + "hot_plate_temp_initial_layer": [ + "45" + ], + "textured_plate_temp": [ + "45" + ], + "textured_plate_temp_initial_layer": [ + "45" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Generic ABS @BBL A1 0.2 nozzle.json b/resources/profiles/BBL/filament/Generic ABS @BBL A1 0.2 nozzle.json new file mode 100644 index 0000000000..a094891d38 --- /dev/null +++ b/resources/profiles/BBL/filament/Generic ABS @BBL A1 0.2 nozzle.json @@ -0,0 +1,32 @@ +{ + "type": "filament", + "name": "Generic ABS @BBL A1 0.2 nozzle", + "inherits": "Generic ABS @base", + "from": "system", + "setting_id": "GFSB99_06", + "instantiation": "true", + "fan_max_speed": [ + "20" + ], + "filament_max_volumetric_speed": [ + "2" + ], + "hot_plate_temp": [ + "100" + ], + "hot_plate_temp_initial_layer": [ + "100" + ], + "reduce_fan_stop_start_freq": [ + "0" + ], + "textured_plate_temp": [ + "100" + ], + "textured_plate_temp_initial_layer": [ + "100" + ], + "compatible_printers": [ + "Bambu Lab A1 0.2 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Generic ABS @BBL A1.json b/resources/profiles/BBL/filament/Generic ABS @BBL A1.json new file mode 100644 index 0000000000..1a09e5a22f --- /dev/null +++ b/resources/profiles/BBL/filament/Generic ABS @BBL A1.json @@ -0,0 +1,34 @@ +{ + "type": "filament", + "name": "Generic ABS @BBL A1", + "inherits": "Generic ABS @base", + "from": "system", + "setting_id": "GFSB99_05", + "instantiation": "true", + "fan_max_speed": [ + "20" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "hot_plate_temp": [ + "100" + ], + "hot_plate_temp_initial_layer": [ + "100" + ], + "reduce_fan_stop_start_freq": [ + "0" + ], + "textured_plate_temp": [ + "100" + ], + "textured_plate_temp_initial_layer": [ + "100" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Generic ASA @BBL A1 0.2 nozzle.json b/resources/profiles/BBL/filament/Generic ASA @BBL A1 0.2 nozzle.json new file mode 100644 index 0000000000..362c8ff378 --- /dev/null +++ b/resources/profiles/BBL/filament/Generic ASA @BBL A1 0.2 nozzle.json @@ -0,0 +1,26 @@ +{ + "type": "filament", + "name": "Generic ASA @BBL A1 0.2 nozzle", + "inherits": "Generic ASA @base", + "from": "system", + "setting_id": "GFSB98_03", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "2" + ], + "hot_plate_temp": [ + "100" + ], + "hot_plate_temp_initial_layer": [ + "100" + ], + "textured_plate_temp": [ + "100" + ], + "textured_plate_temp_initial_layer": [ + "100" + ], + "compatible_printers": [ + "Bambu Lab A1 0.2 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Generic ASA @BBL A1.json b/resources/profiles/BBL/filament/Generic ASA @BBL A1.json new file mode 100644 index 0000000000..04964b6df0 --- /dev/null +++ b/resources/profiles/BBL/filament/Generic ASA @BBL A1.json @@ -0,0 +1,25 @@ +{ + "type": "filament", + "name": "Generic ASA @BBL A1", + "inherits": "Generic ASA @base", + "from": "system", + "setting_id": "GFSB98_04", + "instantiation": "true", + "hot_plate_temp": [ + "100" + ], + "hot_plate_temp_initial_layer": [ + "100" + ], + "textured_plate_temp": [ + "100" + ], + "textured_plate_temp_initial_layer": [ + "100" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Generic HIPS @BBL A1 0.2 nozzle.json b/resources/profiles/BBL/filament/Generic HIPS @BBL A1 0.2 nozzle.json new file mode 100644 index 0000000000..9a75038819 --- /dev/null +++ b/resources/profiles/BBL/filament/Generic HIPS @BBL A1 0.2 nozzle.json @@ -0,0 +1,32 @@ +{ + "type": "filament", + "name": "Generic HIPS @BBL A1 0.2 nozzle", + "inherits": "Generic HIPS @base", + "from": "system", + "setting_id": "GFSS98_05", + "instantiation": "true", + "eng_plate_temp": [ + "70" + ], + "eng_plate_temp_initial_layer": [ + "70" + ], + "filament_max_volumetric_speed": [ + "0.5" + ], + "hot_plate_temp": [ + "70" + ], + "hot_plate_temp_initial_layer": [ + "70" + ], + "textured_plate_temp": [ + "70" + ], + "textured_plate_temp_initial_layer": [ + "70" + ], + "compatible_printers": [ + "Bambu Lab A1 0.2 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Generic HIPS @BBL A1.json b/resources/profiles/BBL/filament/Generic HIPS @BBL A1.json new file mode 100644 index 0000000000..7ca8bbc16a --- /dev/null +++ b/resources/profiles/BBL/filament/Generic HIPS @BBL A1.json @@ -0,0 +1,31 @@ +{ + "type": "filament", + "name": "Generic HIPS @BBL A1", + "inherits": "Generic HIPS @base", + "from": "system", + "setting_id": "GFSS98_04", + "instantiation": "true", + "eng_plate_temp": [ + "70" + ], + "eng_plate_temp_initial_layer": [ + "70" + ], + "hot_plate_temp": [ + "70" + ], + "hot_plate_temp_initial_layer": [ + "70" + ], + "textured_plate_temp": [ + "70" + ], + "textured_plate_temp_initial_layer": [ + "70" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Generic PA @BBL A1.json b/resources/profiles/BBL/filament/Generic PA @BBL A1.json new file mode 100644 index 0000000000..a995a42b31 --- /dev/null +++ b/resources/profiles/BBL/filament/Generic PA @BBL A1.json @@ -0,0 +1,16 @@ +{ + "type": "filament", + "name": "Generic PA @BBL A1", + "inherits": "Generic PA", + "from": "system", + "setting_id": "GFSN99_00", + "instantiation": "true", + "chamber_temperatures": [ + "0" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Generic PA-CF @BBL A1.json b/resources/profiles/BBL/filament/Generic PA-CF @BBL A1.json new file mode 100644 index 0000000000..d35160d2be --- /dev/null +++ b/resources/profiles/BBL/filament/Generic PA-CF @BBL A1.json @@ -0,0 +1,16 @@ +{ + "type": "filament", + "name": "Generic PA-CF @BBL A1", + "inherits": "Generic PA-CF", + "from": "system", + "setting_id": "GFSN98_01", + "instantiation": "true", + "temperature_vitrification": [ + "108" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Generic PC @BBL A1 0.2 nozzle.json b/resources/profiles/BBL/filament/Generic PC @BBL A1 0.2 nozzle.json new file mode 100644 index 0000000000..12484bcf7f --- /dev/null +++ b/resources/profiles/BBL/filament/Generic PC @BBL A1 0.2 nozzle.json @@ -0,0 +1,38 @@ +{ + "type": "filament", + "name": "Generic PC @BBL A1 0.2 nozzle", + "inherits": "Generic PC @base", + "from": "system", + "setting_id": "GFSC99_08", + "instantiation": "true", + "eng_plate_temp": [ + "100" + ], + "eng_plate_temp_initial_layer": [ + "100" + ], + "fan_max_speed": [ + "20" + ], + "filament_max_volumetric_speed": [ + "1" + ], + "hot_plate_temp": [ + "100" + ], + "hot_plate_temp_initial_layer": [ + "100" + ], + "reduce_fan_stop_start_freq": [ + "0" + ], + "textured_plate_temp": [ + "100" + ], + "textured_plate_temp_initial_layer": [ + "100" + ], + "compatible_printers": [ + "Bambu Lab A1 0.2 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Generic PC @BBL A1.json b/resources/profiles/BBL/filament/Generic PC @BBL A1.json new file mode 100644 index 0000000000..8da1f25885 --- /dev/null +++ b/resources/profiles/BBL/filament/Generic PC @BBL A1.json @@ -0,0 +1,37 @@ +{ + "type": "filament", + "name": "Generic PC @BBL A1", + "inherits": "Generic PC @base", + "from": "system", + "setting_id": "GFSC99_07", + "instantiation": "true", + "eng_plate_temp": [ + "100" + ], + "eng_plate_temp_initial_layer": [ + "100" + ], + "fan_max_speed": [ + "20" + ], + "hot_plate_temp": [ + "100" + ], + "hot_plate_temp_initial_layer": [ + "100" + ], + "reduce_fan_stop_start_freq": [ + "0" + ], + "textured_plate_temp": [ + "100" + ], + "textured_plate_temp_initial_layer": [ + "100" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Generic PETG @BBL A1 0.2 nozzle.json b/resources/profiles/BBL/filament/Generic PETG @BBL A1 0.2 nozzle.json new file mode 100644 index 0000000000..8be927cabe --- /dev/null +++ b/resources/profiles/BBL/filament/Generic PETG @BBL A1 0.2 nozzle.json @@ -0,0 +1,26 @@ +{ + "type": "filament", + "name": "Generic PETG @BBL A1 0.2 nozzle", + "inherits": "Generic PETG @base", + "from": "system", + "setting_id": "GFSG99_04", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "1" + ], + "hot_plate_temp": [ + "80" + ], + "hot_plate_temp_initial_layer": [ + "80" + ], + "textured_plate_temp": [ + "80" + ], + "textured_plate_temp_initial_layer": [ + "80" + ], + "compatible_printers": [ + "Bambu Lab A1 0.2 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Generic PETG @BBL A1.json b/resources/profiles/BBL/filament/Generic PETG @BBL A1.json new file mode 100644 index 0000000000..b9bdc5f892 --- /dev/null +++ b/resources/profiles/BBL/filament/Generic PETG @BBL A1.json @@ -0,0 +1,25 @@ +{ + "type": "filament", + "name": "Generic PETG @BBL A1", + "inherits": "Generic PETG @base", + "from": "system", + "setting_id": "GFSG99_03", + "instantiation": "true", + "hot_plate_temp": [ + "80" + ], + "hot_plate_temp_initial_layer": [ + "80" + ], + "textured_plate_temp": [ + "80" + ], + "textured_plate_temp_initial_layer": [ + "80" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Generic PETG-CF @BBL A1.json b/resources/profiles/BBL/filament/Generic PETG-CF @BBL A1.json new file mode 100644 index 0000000000..f7129e4442 --- /dev/null +++ b/resources/profiles/BBL/filament/Generic PETG-CF @BBL A1.json @@ -0,0 +1,28 @@ +{ + "type": "filament", + "name": "Generic PETG-CF @BBL A1", + "inherits": "Generic PETG-CF @base", + "from": "system", + "setting_id": "GFSG98_01", + "instantiation": "true", + "fan_cooling_layer_time": [ + "30" + ], + "fan_max_speed": [ + "40" + ], + "fan_min_speed": [ + "5" + ], + "filament_max_volumetric_speed": [ + "11.5" + ], + "overhang_fan_speed": [ + "100" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Generic PETG-CF @base.json b/resources/profiles/BBL/filament/Generic PETG-CF @base.json index a8aa4714a7..4e12feba51 100644 --- a/resources/profiles/BBL/filament/Generic PETG-CF @base.json +++ b/resources/profiles/BBL/filament/Generic PETG-CF @base.json @@ -39,7 +39,7 @@ "PETG-CF" ], "filament_vendor": [ - "Bambu Lab" + "Generic" ], "hot_plate_temp": [ "70" diff --git a/resources/profiles/BBL/filament/Generic PLA @BBL A1 0.2 nozzle.json b/resources/profiles/BBL/filament/Generic PLA @BBL A1 0.2 nozzle.json new file mode 100644 index 0000000000..09fcf5e6ad --- /dev/null +++ b/resources/profiles/BBL/filament/Generic PLA @BBL A1 0.2 nozzle.json @@ -0,0 +1,38 @@ +{ + "type": "filament", + "name": "Generic PLA @BBL A1 0.2 nozzle", + "inherits": "Generic PLA @base", + "from": "system", + "setting_id": "GFSL99_05", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "60" + ], + "filament_max_volumetric_speed": [ + "2" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "compatible_printers": [ + "Bambu Lab A1 0.2 nozzle" + ], + "filament_start_gcode": [ + "; filament start gcode\n{if (bed_temperature[current_extruder] >35)||(bed_temperature_initial_layer[current_extruder] >35)}M106 P3 S255\n{elsif(bed_temperature[current_extruder] >30)||(bed_temperature_initial_layer[current_extruder] >30)}M106 P3 S180\n{endif}\n\n{if activate_air_filtration[current_extruder] && support_air_filtration}\nM106 P3 S{during_print_exhaust_fan_speed_num[current_extruder]} \n{endif}" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Generic PLA @BBL A1.json b/resources/profiles/BBL/filament/Generic PLA @BBL A1.json new file mode 100644 index 0000000000..864344b169 --- /dev/null +++ b/resources/profiles/BBL/filament/Generic PLA @BBL A1.json @@ -0,0 +1,34 @@ +{ + "type": "filament", + "name": "Generic PLA @BBL A1", + "inherits": "Generic PLA @base", + "from": "system", + "setting_id": "GFSL99_04", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "60" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Generic PLA High Speed @BBL A1 0.2 nozzle.json b/resources/profiles/BBL/filament/Generic PLA High Speed @BBL A1 0.2 nozzle.json new file mode 100644 index 0000000000..5e696d1ef1 --- /dev/null +++ b/resources/profiles/BBL/filament/Generic PLA High Speed @BBL A1 0.2 nozzle.json @@ -0,0 +1,38 @@ +{ + "type": "filament", + "name": "Generic PLA High Speed @BBL A1 0.2 nozzle", + "inherits": "Generic PLA High Speed @base", + "from": "system", + "setting_id": "GFSL95_05", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "60" + ], + "filament_max_volumetric_speed": [ + "2" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "slow_down_layer_time": [ + "6" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "compatible_printers": [ + "Bambu Lab A1 0.2 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Generic PLA High Speed @BBL A1.json b/resources/profiles/BBL/filament/Generic PLA High Speed @BBL A1.json new file mode 100644 index 0000000000..08abf18047 --- /dev/null +++ b/resources/profiles/BBL/filament/Generic PLA High Speed @BBL A1.json @@ -0,0 +1,37 @@ +{ + "type": "filament", + "name": "Generic PLA High Speed @BBL A1", + "inherits": "Generic PLA High Speed @base", + "from": "system", + "setting_id": "GFSL95_04", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "60" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "slow_down_layer_time": [ + "6" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Generic PLA Silk @BBL A1.json b/resources/profiles/BBL/filament/Generic PLA Silk @BBL A1.json new file mode 100644 index 0000000000..0e6eb66ffc --- /dev/null +++ b/resources/profiles/BBL/filament/Generic PLA Silk @BBL A1.json @@ -0,0 +1,28 @@ +{ + "type": "filament", + "name": "Generic PLA Silk @BBL A1", + "inherits": "Generic PLA Silk @base", + "from": "system", + "setting_id": "GFSL96_01", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "60" + ], + "filament_max_volumetric_speed": [ + "7.5" + ], + "filament_retraction_length": [ + "0.5" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Generic PLA-CF @BBL A1.json b/resources/profiles/BBL/filament/Generic PLA-CF @BBL A1.json new file mode 100644 index 0000000000..e53f2d35c1 --- /dev/null +++ b/resources/profiles/BBL/filament/Generic PLA-CF @BBL A1.json @@ -0,0 +1,37 @@ +{ + "type": "filament", + "name": "Generic PLA-CF @BBL A1", + "inherits": "Generic PLA-CF @base", + "from": "system", + "setting_id": "GFSL98_01", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "60" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "slow_down_layer_time": [ + "8" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Generic PPA-GF @BBL X1C.json b/resources/profiles/BBL/filament/Generic PPA-GF @BBL X1C.json index 77734ba4fc..d8a71bf113 100644 --- a/resources/profiles/BBL/filament/Generic PPA-GF @BBL X1C.json +++ b/resources/profiles/BBL/filament/Generic PPA-GF @BBL X1C.json @@ -5,9 +5,6 @@ "from": "system", "setting_id": "GFSN96_00", "instantiation": "true", - "filament_vendor": [ - "Bambu Lab" - ], "compatible_printers": [ "Bambu Lab X1 Carbon 0.4 nozzle", "Bambu Lab X1 0.4 nozzle", diff --git a/resources/profiles/BBL/filament/Generic PPA-GF @BBL X1E.json b/resources/profiles/BBL/filament/Generic PPA-GF @BBL X1E.json index bc2a85caf0..a1311be8f6 100644 --- a/resources/profiles/BBL/filament/Generic PPA-GF @BBL X1E.json +++ b/resources/profiles/BBL/filament/Generic PPA-GF @BBL X1E.json @@ -8,9 +8,6 @@ "chamber_temperatures": [ "60" ], - "filament_vendor": [ - "Bambu Lab" - ], "compatible_printers": [ "Bambu Lab X1E 0.6 nozzle", "Bambu Lab X1E 0.8 nozzle", diff --git a/resources/profiles/BBL/filament/Generic PVA @BBL A1 0.2 nozzle.json b/resources/profiles/BBL/filament/Generic PVA @BBL A1 0.2 nozzle.json new file mode 100644 index 0000000000..57fca27585 --- /dev/null +++ b/resources/profiles/BBL/filament/Generic PVA @BBL A1 0.2 nozzle.json @@ -0,0 +1,38 @@ +{ + "type": "filament", + "name": "Generic PVA @BBL A1 0.2 nozzle", + "inherits": "Generic PVA @base", + "from": "system", + "setting_id": "GFSS99_04", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "60" + ], + "filament_max_volumetric_speed": [ + "0.5" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "slow_down_layer_time": [ + "8" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "compatible_printers": [ + "Bambu Lab A1 0.2 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Generic PVA @BBL A1.json b/resources/profiles/BBL/filament/Generic PVA @BBL A1.json new file mode 100644 index 0000000000..5e02d05a2e --- /dev/null +++ b/resources/profiles/BBL/filament/Generic PVA @BBL A1.json @@ -0,0 +1,37 @@ +{ + "type": "filament", + "name": "Generic PVA @BBL A1", + "inherits": "Generic PVA @base", + "from": "system", + "setting_id": "GFSS99_03", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "60" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "slow_down_layer_time": [ + "8" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Generic TPU @BBL A1.json b/resources/profiles/BBL/filament/Generic TPU @BBL A1.json new file mode 100644 index 0000000000..9fbe338a57 --- /dev/null +++ b/resources/profiles/BBL/filament/Generic TPU @BBL A1.json @@ -0,0 +1,28 @@ +{ + "type": "filament", + "name": "Generic TPU @BBL A1", + "inherits": "Generic TPU", + "from": "system", + "setting_id": "GFSU99_01", + "instantiation": "true", + "hot_plate_temp": [ + "45" + ], + "hot_plate_temp_initial_layer": [ + "45" + ], + "textured_plate_temp": [ + "45" + ], + "textured_plate_temp_initial_layer": [ + "45" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ], + "filament_start_gcode": [ + "; filament start gcode\n{if (bed_temperature[current_extruder] >35)||(bed_temperature_initial_layer[current_extruder] >35)}M106 P3 S255\n{elsif (bed_temperature[current_extruder] >30)||(bed_temperature_initial_layer[current_extruder] >30)}M106 P3 S180\n{endif} \n{if activate_air_filtration[current_extruder] && support_air_filtration}\nM106 P3 S{during_print_exhaust_fan_speed_num[current_extruder]} \n{endif}" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Overture Matte PLA @BBL A1 0.2 nozzle.json b/resources/profiles/BBL/filament/Overture Matte PLA @BBL A1 0.2 nozzle.json new file mode 100644 index 0000000000..58472767d2 --- /dev/null +++ b/resources/profiles/BBL/filament/Overture Matte PLA @BBL A1 0.2 nozzle.json @@ -0,0 +1,38 @@ +{ + "type": "filament", + "name": "Overture Matte PLA @BBL A1 0.2 nozzle", + "inherits": "Overture Matte PLA @base", + "from": "system", + "setting_id": "GFSL05_08", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "60" + ], + "filament_max_volumetric_speed": [ + "1" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "slow_down_layer_time": [ + "8" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "compatible_printers": [ + "Bambu Lab A1 0.2 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Overture Matte PLA @BBL A1.json b/resources/profiles/BBL/filament/Overture Matte PLA @BBL A1.json new file mode 100644 index 0000000000..5e362df470 --- /dev/null +++ b/resources/profiles/BBL/filament/Overture Matte PLA @BBL A1.json @@ -0,0 +1,37 @@ +{ + "type": "filament", + "name": "Overture Matte PLA @BBL A1", + "inherits": "Overture Matte PLA @base", + "from": "system", + "setting_id": "GFSL05_07", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "60" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "slow_down_layer_time": [ + "8" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Overture PLA @BBL A1 0.2 nozzle.json b/resources/profiles/BBL/filament/Overture PLA @BBL A1 0.2 nozzle.json new file mode 100644 index 0000000000..b04b23e346 --- /dev/null +++ b/resources/profiles/BBL/filament/Overture PLA @BBL A1 0.2 nozzle.json @@ -0,0 +1,26 @@ +{ + "type": "filament", + "name": "Overture PLA @BBL A1 0.2 nozzle", + "inherits": "Overture PLA @base", + "from": "system", + "setting_id": "GFSL04_08", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "60" + ], + "filament_max_volumetric_speed": [ + "1" + ], + "slow_down_layer_time": [ + "8" + ], + "compatible_printers": [ + "Bambu Lab A1 0.2 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/Overture PLA @BBL A1.json b/resources/profiles/BBL/filament/Overture PLA @BBL A1.json new file mode 100644 index 0000000000..bffa20d601 --- /dev/null +++ b/resources/profiles/BBL/filament/Overture PLA @BBL A1.json @@ -0,0 +1,25 @@ +{ + "type": "filament", + "name": "Overture PLA @BBL A1", + "inherits": "Overture PLA @base", + "from": "system", + "setting_id": "GFSL04_07", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "60" + ], + "slow_down_layer_time": [ + "8" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/PolyLite ABS @BBL A1 0.2 nozzle.json b/resources/profiles/BBL/filament/PolyLite ABS @BBL A1 0.2 nozzle.json new file mode 100644 index 0000000000..cc4c87c614 --- /dev/null +++ b/resources/profiles/BBL/filament/PolyLite ABS @BBL A1 0.2 nozzle.json @@ -0,0 +1,32 @@ +{ + "type": "filament", + "name": "PolyLite ABS @BBL A1 0.2 nozzle", + "inherits": "PolyLite ABS @base", + "from": "system", + "setting_id": "GFSB60_07", + "instantiation": "true", + "fan_max_speed": [ + "20" + ], + "filament_max_volumetric_speed": [ + "2" + ], + "hot_plate_temp": [ + "100" + ], + "hot_plate_temp_initial_layer": [ + "100" + ], + "reduce_fan_stop_start_freq": [ + "0" + ], + "textured_plate_temp": [ + "100" + ], + "textured_plate_temp_initial_layer": [ + "100" + ], + "compatible_printers": [ + "Bambu Lab A1 0.2 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/PolyLite ABS @BBL A1.json b/resources/profiles/BBL/filament/PolyLite ABS @BBL A1.json new file mode 100644 index 0000000000..a3b7e81cb0 --- /dev/null +++ b/resources/profiles/BBL/filament/PolyLite ABS @BBL A1.json @@ -0,0 +1,31 @@ +{ + "type": "filament", + "name": "PolyLite ABS @BBL A1", + "inherits": "PolyLite ABS @base", + "from": "system", + "setting_id": "GFSB60_06", + "instantiation": "true", + "fan_max_speed": [ + "20" + ], + "hot_plate_temp": [ + "100" + ], + "hot_plate_temp_initial_layer": [ + "100" + ], + "reduce_fan_stop_start_freq": [ + "0" + ], + "textured_plate_temp": [ + "100" + ], + "textured_plate_temp_initial_layer": [ + "100" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/PolyLite ASA @BBL A1 0.2 nozzle.json b/resources/profiles/BBL/filament/PolyLite ASA @BBL A1 0.2 nozzle.json new file mode 100644 index 0000000000..7d345ba9ee --- /dev/null +++ b/resources/profiles/BBL/filament/PolyLite ASA @BBL A1 0.2 nozzle.json @@ -0,0 +1,26 @@ +{ + "type": "filament", + "name": "PolyLite ASA @BBL A1 0.2 nozzle", + "inherits": "PolyLite ASA @base", + "from": "system", + "setting_id": "GFSB61_06", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "2" + ], + "hot_plate_temp": [ + "100" + ], + "hot_plate_temp_initial_layer": [ + "100" + ], + "textured_plate_temp": [ + "100" + ], + "textured_plate_temp_initial_layer": [ + "100" + ], + "compatible_printers": [ + "Bambu Lab A1 0.2 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/PolyLite ASA @BBL A1.json b/resources/profiles/BBL/filament/PolyLite ASA @BBL A1.json new file mode 100644 index 0000000000..baa3f26fb6 --- /dev/null +++ b/resources/profiles/BBL/filament/PolyLite ASA @BBL A1.json @@ -0,0 +1,25 @@ +{ + "type": "filament", + "name": "PolyLite ASA @BBL A1", + "inherits": "PolyLite ASA @base", + "from": "system", + "setting_id": "GFSB61_07", + "instantiation": "true", + "hot_plate_temp": [ + "100" + ], + "hot_plate_temp_initial_layer": [ + "100" + ], + "textured_plate_temp": [ + "100" + ], + "textured_plate_temp_initial_layer": [ + "100" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/PolyLite PETG @BBL A1 0.2 nozzle.json b/resources/profiles/BBL/filament/PolyLite PETG @BBL A1 0.2 nozzle.json new file mode 100644 index 0000000000..abf1ba8144 --- /dev/null +++ b/resources/profiles/BBL/filament/PolyLite PETG @BBL A1 0.2 nozzle.json @@ -0,0 +1,29 @@ +{ + "type": "filament", + "name": "PolyLite PETG @BBL A1 0.2 nozzle", + "inherits": "PolyLite PETG @base", + "from": "system", + "setting_id": "GFSG60_07", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "1" + ], + "hot_plate_temp": [ + "80" + ], + "hot_plate_temp_initial_layer": [ + "80" + ], + "nozzle_temperature_range_high": [ + "270" + ], + "textured_plate_temp": [ + "80" + ], + "textured_plate_temp_initial_layer": [ + "80" + ], + "compatible_printers": [ + "Bambu Lab A1 0.2 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/PolyLite PETG @BBL A1.json b/resources/profiles/BBL/filament/PolyLite PETG @BBL A1.json new file mode 100644 index 0000000000..1787b74203 --- /dev/null +++ b/resources/profiles/BBL/filament/PolyLite PETG @BBL A1.json @@ -0,0 +1,31 @@ +{ + "type": "filament", + "name": "PolyLite PETG @BBL A1", + "inherits": "PolyLite PETG @base", + "from": "system", + "setting_id": "GFSG60_06", + "instantiation": "true", + "filament_max_volumetric_speed": [ + "11.5" + ], + "hot_plate_temp": [ + "80" + ], + "hot_plate_temp_initial_layer": [ + "80" + ], + "nozzle_temperature_range_high": [ + "270" + ], + "textured_plate_temp": [ + "80" + ], + "textured_plate_temp_initial_layer": [ + "80" + ], + "compatible_printers": [ + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle", + "Bambu Lab A1 0.4 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/PolyLite PLA @BBL A1 0.2 nozzle.json b/resources/profiles/BBL/filament/PolyLite PLA @BBL A1 0.2 nozzle.json new file mode 100644 index 0000000000..e1a0176f39 --- /dev/null +++ b/resources/profiles/BBL/filament/PolyLite PLA @BBL A1 0.2 nozzle.json @@ -0,0 +1,38 @@ +{ + "type": "filament", + "name": "PolyLite PLA @BBL A1 0.2 nozzle", + "inherits": "PolyLite PLA @base", + "from": "system", + "setting_id": "GFSL00_03", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "60" + ], + "filament_max_volumetric_speed": [ + "1" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "slow_down_layer_time": [ + "8" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "compatible_printers": [ + "Bambu Lab A1 0.2 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/PolyLite PLA @BBL A1.json b/resources/profiles/BBL/filament/PolyLite PLA @BBL A1.json new file mode 100644 index 0000000000..442136617d --- /dev/null +++ b/resources/profiles/BBL/filament/PolyLite PLA @BBL A1.json @@ -0,0 +1,40 @@ +{ + "type": "filament", + "name": "PolyLite PLA @BBL A1", + "inherits": "PolyLite PLA @base", + "from": "system", + "setting_id": "GFSL00_02", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "60" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "slow_down_layer_time": [ + "8" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/PolyTerra PLA @BBL A1 0.2 nozzle.json b/resources/profiles/BBL/filament/PolyTerra PLA @BBL A1 0.2 nozzle.json new file mode 100644 index 0000000000..f92353d799 --- /dev/null +++ b/resources/profiles/BBL/filament/PolyTerra PLA @BBL A1 0.2 nozzle.json @@ -0,0 +1,38 @@ +{ + "type": "filament", + "name": "PolyTerra PLA @BBL A1 0.2 nozzle", + "inherits": "PolyTerra PLA @base", + "from": "system", + "setting_id": "GFSL01_03", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "60" + ], + "filament_max_volumetric_speed": [ + "1" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "slow_down_layer_time": [ + "8" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "compatible_printers": [ + "Bambu Lab A1 0.2 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/PolyTerra PLA @BBL A1.json b/resources/profiles/BBL/filament/PolyTerra PLA @BBL A1.json new file mode 100644 index 0000000000..85c3dc64d7 --- /dev/null +++ b/resources/profiles/BBL/filament/PolyTerra PLA @BBL A1.json @@ -0,0 +1,40 @@ +{ + "type": "filament", + "name": "PolyTerra PLA @BBL A1", + "inherits": "PolyTerra PLA @base", + "from": "system", + "setting_id": "GFSL01_02", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "60" + ], + "filament_max_volumetric_speed": [ + "22" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "slow_down_layer_time": [ + "8" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/eSUN PLA+ @BBL A1 0.2 nozzle.json b/resources/profiles/BBL/filament/eSUN PLA+ @BBL A1 0.2 nozzle.json new file mode 100644 index 0000000000..e8455eef5c --- /dev/null +++ b/resources/profiles/BBL/filament/eSUN PLA+ @BBL A1 0.2 nozzle.json @@ -0,0 +1,38 @@ +{ + "type": "filament", + "name": "eSUN PLA+ @BBL A1 0.2 nozzle", + "inherits": "eSUN PLA+ @base", + "from": "system", + "setting_id": "GFSL03_06", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "60" + ], + "filament_max_volumetric_speed": [ + "1" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "slow_down_layer_time": [ + "8" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "compatible_printers": [ + "Bambu Lab A1 0.2 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/filament/eSUN PLA+ @BBL A1.json b/resources/profiles/BBL/filament/eSUN PLA+ @BBL A1.json new file mode 100644 index 0000000000..072c2c94cc --- /dev/null +++ b/resources/profiles/BBL/filament/eSUN PLA+ @BBL A1.json @@ -0,0 +1,37 @@ +{ + "type": "filament", + "name": "eSUN PLA+ @BBL A1", + "inherits": "eSUN PLA+ @base", + "from": "system", + "setting_id": "GFSL03_05", + "instantiation": "true", + "fan_cooling_layer_time": [ + "80" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "60" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "slow_down_layer_time": [ + "8" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ], + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle", + "Bambu Lab A1 0.6 nozzle", + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab A1 0.2 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab A1 0.2 nozzle.json new file mode 100644 index 0000000000..700b24df85 --- /dev/null +++ b/resources/profiles/BBL/machine/Bambu Lab A1 0.2 nozzle.json @@ -0,0 +1,18 @@ +{ + "type": "machine", + "name": "Bambu Lab A1 0.2 nozzle", + "inherits": "Bambu Lab A1 0.4 nozzle", + "from": "system", + "setting_id": "GM029", + "instantiation": "true", + "nozzle_diameter": [ + "0.2" + ], + "printer_model": "Bambu Lab A1", + "printer_variant": "0.2", + "default_filament_profile": [ + "Bambu PLA Basic @BBL A1 0.2 nozzle" + ], + "default_print_profile": "0.10mm Standard @BBL A1 0.2 nozzle", + "upward_compatible_machine": [] +} \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab A1 0.4 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab A1 0.4 nozzle.json new file mode 100644 index 0000000000..0e156db2f3 --- /dev/null +++ b/resources/profiles/BBL/machine/Bambu Lab A1 0.4 nozzle.json @@ -0,0 +1,69 @@ +{ + "type": "machine", + "name": "Bambu Lab A1 0.4 nozzle", + "inherits": "fdm_bbl_3dp_001_common", + "from": "system", + "setting_id": "GM030", + "instantiation": "true", + "nozzle_diameter": [ + "0.4" + ], + "printer_model": "Bambu Lab A1", + "printer_variant": "0.4", + "auxiliary_fan": "0", + "bed_exclude_area": [], + "default_filament_profile": [ + "Bambu PLA Basic @BBL A1" + ], + "default_print_profile": "0.20mm Standard @BBL A1", + "extruder_clearance_height_to_lid": "256", + "extruder_clearance_height_to_rod": "25", + "extruder_clearance_max_radius": "73", + "extruder_clearance_radius": "73", + "head_wrap_detect_zone": [ + "226x224", + "256x224", + "256x256", + "226x256" + ], + "machine_load_filament_time": "25", + "machine_max_acceleration_extruding": [ + "12000", + "12000" + ], + "machine_max_acceleration_x": [ + "12000", + "12000" + ], + "machine_max_acceleration_y": [ + "12000", + "12000" + ], + "machine_max_acceleration_z": [ + "1500", + "1500" + ], + "machine_max_jerk_e": [ + "3", + "3" + ], + "machine_max_speed_z": [ + "30", + "30" + ], + "machine_unload_filament_time": "29", + "nozzle_type": "stainless_steel", + "nozzle_volume": "117", + "printable_height": "256", + "printer_structure": "i3", + "retract_lift_below": [ + "255" + ], + "scan_first_layer": "0", + "upward_compatible_machine": [], + "machine_start_gcode": ";===== machine: A1 =========================\n;===== date: 20231211 =====================\nG392 S0\n;M400\n;M73 P1.717\n\n;===== start to heat heatbead&hotend==========\nM1002 gcode_claim_action : 2\nM1002 set_filament_type:{filament_type[initial_no_support_extruder]}\nM104 S140\nM140 S[bed_temperature_initial_layer_single]\n\n;=====start printer sound ===================\nM17\nM400 S1\nM1006 S1\nM1006 A0 B10 L100 C37 D10 M60 E37 F10 N60\nM1006 A0 B10 L100 C41 D10 M60 E41 F10 N60\nM1006 A0 B10 L100 C44 D10 M60 E44 F10 N60\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N60\nM1006 A43 B10 L100 C46 D10 M70 E39 F10 N80\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N80\nM1006 A0 B10 L100 C43 D10 M60 E39 F10 N80\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N80\nM1006 A0 B10 L100 C41 D10 M80 E41 F10 N80\nM1006 A0 B10 L100 C44 D10 M80 E44 F10 N80\nM1006 A0 B10 L100 C49 D10 M80 E49 F10 N80\nM1006 A0 B10 L100 C0 D10 M80 E0 F10 N80\nM1006 A44 B10 L100 C48 D10 M60 E39 F10 N80\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N80\nM1006 A0 B10 L100 C44 D10 M80 E39 F10 N80\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N80\nM1006 A43 B10 L100 C46 D10 M60 E39 F10 N80\nM1006 W\nM18\n;=====start printer sound ===================\n\n;=====avoid end stop =================\nG91\nG380 S2 Z40 F1200\nG380 S2 Z-15 F1200\nG90\n\n;===== reset machine status =================\n;M290 X39 Y39 Z8\nM204 S6000\n\nM630 S0 P0\nG91\nM17 Z0.3 ; lower the z-motor current\n\nG90\nM17 X0.65 Y1.2 Z0.6 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\n;M211 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\n\n;====== cog noise reduction=================\nM982.2 S1 ; turn on cog noise reduction\n\nM1002 gcode_claim_action : 13\n\nG28 X\nG91\nG1 Z5 F1200\nG90\nG0 X128 Y0 F30000\nG91\nG1 Z-5 F1200\n\nM109 S10 H140\n\nM17 E0.3\nM83\nG1 E10 F1200\nG1 E-0.5 F30\nM17 D\n\nG28 Z P0 T140; home z with low precision,permit 300deg temperature\nM104 S{nozzle_temperature_initial_layer[initial_extruder]}\n\n;M400\n;M73 P1.717\n\n;===== prepare print temperature and material ==========\nM1002 gcode_claim_action : 24\n\nM400\n;G392 S1\nM211 X0 Y0 Z0 ;turn off soft endstop\nM975 S1 ; turn on\n\nG90\nG1 X-28.5 F30000\nG1 X-48.2 F3000\n\nM620 M ;enable remap\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M1002 gcode_claim_action : 4\n M400\n M1002 set_filament_type:UNKNOWN\n M109 S[nozzle_temperature_initial_layer]\n M104 S250\n M400\n T[initial_no_support_extruder]\n G1 X-48.2 F3000\n M400\n\n M620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n M109 S250 ;set nozzle to common flush temp\n M106 P1 S0\n G92 E0\n G1 E50 F200\n M400\n M1002 set_filament_type:{filament_type[initial_no_support_extruder]}\nM621 S[initial_no_support_extruder]A\n\nM109 S{nozzle_temperature_range_high[initial_no_support_extruder]} H300\nG92 E0\nG1 E50 F200 ; lower extrusion speed to avoid clog\nM400\nM106 P1 S178\nG92 E0\nG1 E5 F200\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG92 E0\nG1 E-0.5 F300\n\nG1 X-28.5 F30000\nG1 X-48.2 F3000\nG1 X-28.5 F30000 ;wipe and shake\nG1 X-48.2 F3000\nG1 X-28.5 F30000 ;wipe and shake\nG1 X-48.2 F3000\n\n;G392 S0\n\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n;M400\n;M73 P1.717\n\n;===== auto extrude cali start =========================\nM975 S1\n;G392 S1\n\nG90\nM83\nT1000\nG1 X-48.2 Y0 Z10 F10000\nM400\nM1002 set_filament_type:UNKNOWN\n\nM412 S1 ; ===turn on filament runout detection===\nM400 P10\nM620.3 W1; === turn on filament tangle detection===\nM400 S2\n\nM1002 set_filament_type:{filament_type[initial_no_support_extruder]}\n\n;M1002 set_flag extrude_cali_flag=1\nM1002 judge_flag extrude_cali_flag\n\nM622 J1\n M1002 gcode_claim_action : 8\n\n M109 S{nozzle_temperature[initial_extruder]}\n G1 E10 F{outer_wall_volumetric_speed/2.4*60}\n M983 F{outer_wall_volumetric_speed/2.4} A0.3 ; cali dynamic extrusion compensation\n\n M106 P1 S255\n M400 S5\n G1 X-28.5 F18000\n G1 X-48.2 F3000\n G1 X-28.5 F18000 ;wipe and shake\n G1 X-48.2 F3000\n G1 X-28.5 F12000 ;wipe and shake\n G1 X-48.2 F3000\n M400\n M106 P1 S0\n\n M1002 judge_last_extrude_cali_success\n M622 J0\n M983 F{outer_wall_volumetric_speed/2.4} A0.3 ; cali dynamic extrusion compensation\n M106 P1 S255\n M400 S5\n G1 X-28.5 F18000\n G1 X-48.2 F3000\n G1 X-28.5 F18000 ;wipe and shake\n G1 X-48.2 F3000\n G1 X-28.5 F12000 ;wipe and shake\n M400\n M106 P1 S0\n M623\nM623 ; end of \"draw extrinsic para cali paint\"\n\n;G392 S0\n;===== auto extrude cali end ========================\n\n;M400\n;M73 P1.717\n\nM104 S170 ; prepare to wipe nozzle\nM106 S255 ; turn on fan\n\n;===== mech mode fast check start =====================\nM1002 gcode_claim_action : 3\n\nG1 X128 Y128 F20000\nG1 Z5 F1200\nM400 P200\nM970.3 Q1 A5 K0 O3\nM974 Q1 S2 P0\n\nM970.2 Q1 K1 W58 Z0.11\nM974 S2\n\nG1 X128 Y128 F20000\nG1 Z5 F1200\nM400 P200\nM970.3 Q0 A10 K0 O1\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X0 Y5\nG28 X ; re-home XY\n\n;===== mech mode fast check end =======================\n\n;M400\n;M73 P1.717\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\n\nM975 S1\nM106 S255 ; turn on fan (G28 has turn off fan)\nM211 S; push soft endstop status\nM211 X0 Y0 Z0 ;turn off Z axis endstop\n\n;===== remove waste by touching start =====\n\nM104 S170 ; set temp down to heatbed acceptable\n\nM83\nG1 E-1 F500\nG90\nM83\n\nM109 S170\nG0 X108 Y-0.5 F30000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X110 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X112 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X114 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X116 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X118 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X120 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X122 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X124 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X126 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X128 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X130 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X132 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X134 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X136 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X138 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X140 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X142 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X144 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X146 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X148 F10000\nG380 S3 Z-5 F1200\n\nG1 Z5 F30000\n;===== remove waste by touching end =====\n\nG1 Z10 F1200\nG0 X118 Y261 F30000\nG1 Z5 F1200\nM109 S{nozzle_temperature_initial_layer[initial_extruder]-50}\n\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nM104 S140 ; prepare to abl\nG0 Z5 F20000\n\nG0 X128 Y261 F20000 ; move to exposed steel surface\nG0 Z-1.01 F1200 ; stop the nozzle\n\nG91\nG2 I1 J0 X2 Y0 F2000.1\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\n\nG90\nG1 Z10 F1200\n\n;===== brush material wipe nozzle =====\n\nG90\nG1 Y250 F30000\nG1 X55\nG1 Z1.300 F1200\nG1 Y262.5 F6000\nG91\nG1 X-35 F30000\nG1 Y-0.5\nG1 X45\nG1 Y-0.5\nG1 X-45\nG1 Y-0.5\nG1 X45\nG1 Y-0.5\nG1 X-45\nG1 Y-0.5\nG1 X45\nG1 Z5.000 F1200\n\nG90\nG1 X30 Y250.000 F30000\nG1 Z1.300 F1200\nG1 Y262.5 F6000\nG91\nG1 X35 F30000\nG1 Y-0.5\nG1 X-45\nG1 Y-0.5\nG1 X45\nG1 Y-0.5\nG1 X-45\nG1 Y-0.5\nG1 X45\nG1 Y-0.5\nG1 X-45\nG1 Z10.000 F1200\n\n;===== brush material wipe nozzle end =====\n\nG90\n;G0 X128 Y261 F20000 ; move to exposed steel surface\nG1 Y250 F30000\nG1 X138\nG1 Y261\nG0 Z-1.01 F1200 ; stop the nozzle\n\nG91\nG2 I1 J0 X2 Y0 F2000.1\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\n\nM109 S140\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM211 R; pop softend status\n\n;===== wipe nozzle end ================================\n\n;M400\n;M73 P1.717\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\n\nG90\nG1 Z5 F1200\nG1 X0 Y0 F30000\nG29.2 S1 ; turn on ABL\n\nM190 S[bed_temperature_initial_layer_single]; ensure bed temp\nM109 S140\nM106 S0 ; turn off fan , too noisy\n\nM622 J1\n M1002 gcode_claim_action : 1\n G29 A\n M400\n M500 ; save cali data\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n\n;===== home after wipe mouth end =======================\n\n;M400\n;M73 P1.717\n\nM104 S{nozzle_temperature_initial_layer[initial_extruder]} ; prepare to print\n\n;===== nozzle load line ===============================\n;G90\n;M83\n;G1 Z5 F1200\n;G1 X88 Y-0.5 F20000\n;G1 Z0.3 F1200\n\n;M109 S{nozzle_temperature_initial_layer[initial_extruder]}\n\n;G1 E2 F300\n;G1 X168 E4.989 F6000\n;G1 Z1 F1200\n;===== noozle load line end ===========================\n\n;===== extrude cali test ===============================\n\nM400\n M900 S\n\n M900 C\n G90\n M83\n G1 X78.000 Y-0.500 F30000\n G1 Z0.300 F1200\n\n M109 S{nozzle_temperature_initial_layer[initial_extruder]}\n G1 E3 F300\n\n G1 X83.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X88.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X93.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X98.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X103.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X108.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X113.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X118.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X123.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X128.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X133.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X138.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X143.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X148.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X153.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X158.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X163.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X168.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X173.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X178.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X179 Z0\n G1 X183\n G1 Z1\n M400\n\n M900 R\n G90\n M83\n G1 X78.000 Y4.500 F30000\n G1 Z0.300 F1200\n G1 E0.5 F300\n G1 X83.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X88.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X93.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X98.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X103.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X108.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X113.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X118.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X123.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X128.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X133.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X138.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X143.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X148.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X153.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X158.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X163.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X168.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X173.000 E0.3118 F{outer_wall_volumetric_speed*0.4 /(0.3*0.5) * 60}\n G1 X178.000 E0.3118 F{outer_wall_volumetric_speed*1.0 /(0.3*0.5) * 60}\n G1 X179 Z0\n G1 X183\n G1 Z1\n M400\n\nG1 Z0.2\n\n;M400\n;M73 P1.717\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.02} ; for Textured PEI Plate\n{endif}\n\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\n\nM211 X0 Y0 Z0 ;turn off soft endstop\n;G392 S1 ; turn on clog detection\nG29.4\n", + "machine_end_gcode": ";===== date: 20230922 =====================\n;turn off nozzle clog detect\nG392 S0\n\nM400 ; wait for buffer to clear\nG92 E0 ; zero the extruder\nG1 E-0.8 F1800 ; retract\nG1 Z{max_layer_z + 0.5} F900 ; lower z a little\nG1 X0 Y{first_layer_center_no_wipe_tower[1]} F18000 ; move to safe pos\nG1 X-13.0 F3000 ; move to safe pos\n{if !spiral_mode && print_sequence != \"by object\"}\nM1002 judge_flag timelapse_record_flag\nM622 J1\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM991 S0 P-1 ;end timelapse at safe pos\nM623\n{endif}\n\nM140 S0 ; turn off bed\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off remote part cooling fan\nM106 P3 S0 ; turn off chamber cooling fan\n\n;G1 X27 F15000 ; wipe\n\n; pull back filament to AMS\nM620 S255\nG1 X267 F15000\nT255\nG1 X-28.5 F18000\nG1 X-48.5 F3000\nG1 X-28.5 F18000\nG1 X-48.5 F3000\nM621 S255\n\nM104 S0 ; turn off hotend\n\nM400 ; wait all motion done\nM17 S\nM17 Z0.4 ; lower z motor current to reduce impact if there is something in the bottom\n{if (max_layer_z + 100.0) < 256}\n G1 Z{max_layer_z + 100.0} F600\n G1 Z{max_layer_z +98.0}\n{else}\n G1 Z256 F600\n G1 Z256\n{endif}\nM400 P100\nM17 R ; restore z current\n\nG90\nG1 X-48 Y180 F3600\n\nM220 S100 ; Reset feedrate magnitude\nM201.2 K1.0 ; Reset acc magnitude\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 0\n\n;=====printer finish sound=========\nM17\nM400 S1\nM1006 S1\nM1006 A0 B20 L100 C37 D20 M40 E42 F20 N60\nM1006 A0 B10 L100 C44 D10 M60 E44 F10 N60\nM1006 A0 B10 L100 C46 D10 M80 E46 F10 N80\nM1006 A44 B20 L100 C39 D20 M60 E48 F20 N60\nM1006 A0 B10 L100 C44 D10 M60 E44 F10 N60\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N60\nM1006 A0 B10 L100 C39 D10 M60 E39 F10 N60\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N60\nM1006 A0 B10 L100 C44 D10 M60 E44 F10 N60\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N60\nM1006 A0 B10 L100 C39 D10 M60 E39 F10 N60\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N60\nM1006 A0 B10 L100 C48 D10 M60 E44 F10 N80\nM1006 A0 B10 L100 C0 D10 M60 E0 F10 N80\nM1006 A44 B20 L100 C49 D20 M80 E41 F20 N80\nM1006 A0 B20 L100 C0 D20 M60 E0 F20 N80\nM1006 A0 B20 L100 C37 D20 M30 E37 F20 N60\nM1006 W\n;=====printer finish sound=========\n\n;M17 X0.8 Y0.8 Z0.5 ; lower motor current to 45% power\nM400\nM18\n", + "layer_change_gcode": "; layer num/total_layer_count: {layer_num+1}/[total_layer_count]\n; update layer progress\nM73 L{layer_num+1}\nM991 S0 P{layer_num} ;notify layer change", + "time_lapse_gcode": ";===================== date: 20231107 =====================\n{if !spiral_mode && print_sequence != \"by object\"}\n; don't support timelapse gcode in spiral_mode and by object sequence for I3 structure printer\nM622.1 S1 ; for prev firware, default turned on\nM1002 judge_flag timelapse_record_flag\nM622 J1\nG92 E0\nG17\nG2 Z{layer_z + 0.4} I0.86 J0.86 P1 F20000 ; spiral lift a little\nG1 Z{max_layer_z + 0.4}\nG1 X0 Y{first_layer_center_no_wipe_tower[1]} F18000 ; move to safe pos\nG1 X-48.2 F3000 ; move to safe pos\nM400 P300\nM971 S11 C11 O0\nG92 E0\nG1 X0 F18000\nM623\n\n; enable nozzle clog detect at 3rd layer\n{if layer_num == 2}\n M400\n G90\n M83\n M204 S5000\n G0 Z2 F4000\n G0 X-4.2 Y240 F20000\n M400 P200\n G39 S1\n G0 Z2 F4000\n G0 X128 Y128 F30000\n{endif}\n{endif}", + "change_filament_gcode": ";===== machine: A1 =========================\n;===== date: 20231012 =======================\nG392 S0\nM620 S[next_extruder]A\nM204 S9000\n{if toolchange_count > 1}\nG17\nG2 Z{max_layer_z + 0.4} I0.86 J0.86 P1 F10000 ; spiral lift a little from second lift\n{endif}\nG1 Z{max_layer_z + 3.0} F1200\n\nM400\nM106 P1 S0\nM106 P2 S0\n{if old_filament_temp > 142 && next_extruder < 255}\nM104 S[old_filament_temp]\n{endif}\n\nG1 X267 F18000\n;{if toolchange_count == 2}\n; get travel path for change filament\n;M620.1 X[travel_point_1_x] Y[travel_point_1_y] F21000 P0\n;M620.1 X[travel_point_2_x] Y[travel_point_2_y] F21000 P1\n;M620.1 X[travel_point_3_x] Y[travel_point_3_y] F21000 P2\n;{endif}\nM620.1 E F[old_filament_e_feedrate] T{nozzle_temperature_range_high[previous_extruder]}\nT[next_extruder]\nM620.1 E F[new_filament_e_feedrate] T{nozzle_temperature_range_high[next_extruder]}\n\nG1 Y128 F9000\n\n{if next_extruder < 255}\nM400\n\nG92 E0\n{if flush_length_1 > 1}\n; FLUSH_START\n; always use highest temperature to flush\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S[nozzle_temperature_range_high]\nM106 P1 S60\n{if flush_length_1 > 23.7}\nG1 E23.7 F{old_filament_e_feedrate} ; do not need pulsatile flushing for start part\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{old_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\n{else}\nG1 E{flush_length_1} F{old_filament_e_feedrate}\n{endif}\n; FLUSH_END\nG1 E-[old_retract_length_toolchange] F1800\nG1 E[old_retract_length_toolchange] F300\nM400\nM1002 set_filament_type:{filament_type[next_extruder]}\n{endif}\n\n{if flush_length_1 > 45 && flush_length_2 > 1}\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.5 F18000\nG1 X-48.5 F3000\nG1 X-38.5 F18000\nG1 X-48.5 F3000\nG1 X-38.5 F18000\nG1 X-48.5 F3000\nM400\nM106 P1 S0\n{endif}\n\n{if flush_length_2 > 1}\nM106 P1 S60\n; FLUSH_START\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_2 > 45 && flush_length_3 > 1}\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.5 F18000\nG1 X-48.5 F3000\nG1 X-38.5 F18000\nG1 X-48.5 F3000\nG1 X-38.5 F18000\nG1 X-48.5 F3000\nM400\nM106 P1 S0\n{endif}\n\n{if flush_length_3 > 1}\nM106 P1 S60\n; FLUSH_START\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_3 > 45 && flush_length_4 > 1}\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.5 F18000\nG1 X-48.5 F3000\nG1 X-38.5 F18000\nG1 X-48.5 F3000\nG1 X-38.5 F18000\nG1 X-48.5 F3000\nM400\nM106 P1 S0\n{endif}\n\n{if flush_length_4 > 1}\nM106 P1 S60\n; FLUSH_START\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\n; FLUSH_END\n{endif}\n\nM400\nM106 P1 S60\nM109 S[new_filament_temp]\nG1 E6 F{new_filament_e_feedrate} ;Compensate for filament spillage during waiting temperature\nM400\nG92 E0\nG1 E-[new_retract_length_toolchange] F1800\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.5 F18000\nG1 X-48.5 F3000\nG1 X-38.5 F18000\nG1 X-48.5 F3000\nG1 X-38.5 F18000\nG1 X-48.5 F3000\nG1 X-38.5 F18000\nM400\nG1 Z{max_layer_z + 3.0} F3000\nM106 P1 S0\n{if layer_z <= (initial_layer_print_height + 0.001)}\nM204 S[initial_layer_acceleration]\n{else}\nM204 S[default_acceleration]\n{endif}\n{else}\nG1 X[x_after_toolchange] Y[y_after_toolchange] Z[z_after_toolchange] F12000\n{endif}\nM621 S[next_extruder]A\nG392 S1\n" +} \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab A1 0.6 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab A1 0.6 nozzle.json new file mode 100644 index 0000000000..7c9e3a20ca --- /dev/null +++ b/resources/profiles/BBL/machine/Bambu Lab A1 0.6 nozzle.json @@ -0,0 +1,24 @@ +{ + "type": "machine", + "name": "Bambu Lab A1 0.6 nozzle", + "inherits": "Bambu Lab A1 0.4 nozzle", + "from": "system", + "setting_id": "GM031", + "instantiation": "true", + "nozzle_diameter": [ + "0.6" + ], + "printer_model": "Bambu Lab A1", + "printer_variant": "0.6", + "default_filament_profile": [ + "Bambu PLA Basic @BBL A1" + ], + "default_print_profile": "0.30mm Strength @BBL A1 0.6 nozzle", + "max_layer_height": [ + "0.42" + ], + "min_layer_height": [ + "0.12" + ], + "upward_compatible_machine": [] +} \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab A1 0.8 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab A1 0.8 nozzle.json new file mode 100644 index 0000000000..a2664497e4 --- /dev/null +++ b/resources/profiles/BBL/machine/Bambu Lab A1 0.8 nozzle.json @@ -0,0 +1,24 @@ +{ + "type": "machine", + "name": "Bambu Lab A1 0.8 nozzle", + "inherits": "Bambu Lab A1 0.4 nozzle", + "from": "system", + "setting_id": "GM032", + "instantiation": "true", + "nozzle_diameter": [ + "0.8" + ], + "printer_model": "Bambu Lab A1", + "printer_variant": "0.8", + "default_filament_profile": [ + "Bambu PLA Basic @BBL A1" + ], + "default_print_profile": "0.40mm Standard @BBL A1 0.8 nozzle", + "max_layer_height": [ + "0.56" + ], + "min_layer_height": [ + "0.16" + ], + "upward_compatible_machine": [] +} \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab A1 mini 0.2 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab A1 mini 0.2 nozzle.json index d6e55aa133..ebd401e800 100644 --- a/resources/profiles/BBL/machine/Bambu Lab A1 mini 0.2 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab A1 mini 0.2 nozzle.json @@ -28,6 +28,7 @@ "Bambu Lab P1P 0.2 nozzle", "Bambu Lab X1 0.2 nozzle", "Bambu Lab X1 Carbon 0.2 nozzle", - "Bambu Lab X1E 0.2 nozzle" + "Bambu Lab X1E 0.2 nozzle", + "Bambu Lab A1 0.2 nozzle" ] } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab A1 mini 0.4 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab A1 mini 0.4 nozzle.json index 15ffd096df..31110b928c 100644 --- a/resources/profiles/BBL/machine/Bambu Lab A1 mini 0.4 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab A1 mini 0.4 nozzle.json @@ -20,6 +20,12 @@ "extruder_clearance_height_to_rod": "25", "extruder_clearance_max_radius": "73", "extruder_clearance_radius": "73", + "head_wrap_detect_zone": [ + "156x152", + "180x152", + "180x180", + "156x180" + ], "machine_load_filament_time": "28", "machine_max_acceleration_z": [ "1500", @@ -57,11 +63,12 @@ "Bambu Lab P1P 0.4 nozzle", "Bambu Lab X1 0.4 nozzle", "Bambu Lab X1 Carbon 0.4 nozzle", - "Bambu Lab X1E 0.4 nozzle" + "Bambu Lab X1E 0.4 nozzle", + "Bambu Lab A1 0.4 nozzle" ], - "machine_start_gcode": ";===== machine: A1 mini =========================\n;===== date: 20231103 =====================\n\n;===== start to heat heatbead&hotend==========\nM1002 gcode_claim_action : 2\nM1002 set_filament_type:{filament_type[initial_no_support_extruder]}\nM104 S170\nM140 S[bed_temperature_initial_layer_single]\nG392 S0 ;turn off clog detect\n;=====start printer sound ===================\nM17\nM400 S1\nM1006 S1\nM1006 A0 B0 L100 C37 D10 M100 E37 F10 N100\nM1006 A0 B0 L100 C41 D10 M100 E41 F10 N100\nM1006 A0 B0 L100 C44 D10 M100 E44 F10 N100\nM1006 A0 B10 L100 C0 D10 M100 E0 F10 N100\nM1006 A43 B10 L100 C39 D10 M100 E46 F10 N100\nM1006 A0 B0 L100 C0 D10 M100 E0 F10 N100\nM1006 A0 B0 L100 C39 D10 M100 E43 F10 N100\nM1006 A0 B0 L100 C0 D10 M100 E0 F10 N100\nM1006 A0 B0 L100 C41 D10 M100 E41 F10 N100\nM1006 A0 B0 L100 C44 D10 M100 E44 F10 N100\nM1006 A0 B0 L100 C49 D10 M100 E49 F10 N100\nM1006 A0 B0 L100 C0 D10 M100 E0 F10 N100\nM1006 A44 B10 L100 C39 D10 M100 E48 F10 N100\nM1006 A0 B0 L100 C0 D10 M100 E0 F10 N100\nM1006 A0 B0 L100 C39 D10 M100 E44 F10 N100\nM1006 A0 B0 L100 C0 D10 M100 E0 F10 N100\nM1006 A43 B10 L100 C39 D10 M100 E46 F10 N100\nM1006 W\nM18\n;=====avoid end stop =================\nG91\nG380 S2 Z30 F1200\nG380 S2 Z-20 F1200\nG1 Z5 F1200\nG90\n\n;===== reset machine status =================\nM290 X39 Y39 Z8\nM204 S6000\n\nM630 S0 P0\nG91\nM17 Z0.3 ; lower the z-motor current\n\nG90\nM17 X0.7 Y0.9 Z0.5 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM83\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\n;====== cog noise reduction=================\nM982.2 S1 ; turn on cog noise reduction\n\n;===== prepare print temperature and material ==========\nM400\nM18\nM109 S100 H170\nM104 S170\nM400\nM17\nM400\nG28 X\n\nM211 X0 Y0 Z0 ;turn off soft endstop ; turn off soft endstop to prevent protential logic problem\n\nM975 S1 ; turn on\n\nG1 X0.0 F30000\nG1 X-13.5 F3000\n\nM620 M ;enable remap\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n G392 S1 ;turn on clog detect\n M1002 gcode_claim_action : 4\n M400\n M1002 set_filament_type:UNKNOWN\n M109 S[nozzle_temperature_initial_layer]\n M104 S250\n M400\n T[initial_no_support_extruder]\n G1 X-13.5 F3000\n M400\n M620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n M109 S250 ;set nozzle to common flush temp\n M106 P1 S0\n G92 E0\n G1 E50 F200\n M400\n M1002 set_filament_type:{filament_type[initial_no_support_extruder]}\n M104 S{nozzle_temperature_range_high[initial_no_support_extruder]}\n G92 E0\n G1 E50 F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60}\n M400\n M106 P1 S178\n G92 E0\n G1 E5 F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60}\n M109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\n M104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-40}\n G92 E0\n G1 E-0.5 F300\n\n G1 X0 F30000\n G1 X-13.5 F3000\n G1 X0 F30000 ;wipe and shake\n G1 X-13.5 F3000\n G1 X0 F12000 ;wipe and shake\n G1 X0 F30000\n G1 X-13.5 F3000\n M109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-40}\n G392 S0 ;turn off clog detect\nM621 S[initial_no_support_extruder]A\n\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== mech mode fast check============================\nM1002 gcode_claim_action : 3\nG0 X25 Y175 F20000 ; find a soft place to home\n;M104 S0\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nM104 S170\n\nG1 X90 Y-1 Z5 F30000\nM400 P200\nM970.3 Q1 A7 K0 O2\nM974 Q1 S2 P0\n\nG1 X90 Y0 Z5 F30000\nM400 P200\nM970 Q0 A10 B50 C90 H15 K0 M20 O3\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X-1 Y10\nG28 X ; re-home XY\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\n\nM104 S170 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\nM211 S; push soft endstop status\nM211 X0 Y0 Z0 ;turn off Z axis endstop\n\nM83\nG1 E-1 F500\nG90\nM83\n\nM109 S170\nM104 S140\nG0 X90 Y-4 F30000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X91 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X92 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X93 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X94 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X95 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X96 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X97 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X98 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X99 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X99 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X99 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X99 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X99 F10000\nG380 S3 Z-5 F1200\n\nG1 Z5 F30000\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\nG1 X25 Y175 F30000.1 ;Brush material\nG1 Z0.2 F30000.1\nG1 Y185\nG91\nG1 X-30 F30000\nG1 Y-2\nG1 X27\nG1 Y1.5\nG1 X-28\nG1 Y-2\nG1 X30\nG1 Y1.5\nG1 X-30\nG90\nM83\n\nG1 Z5 F3000\nG0 X50 Y175 F20000 ; find a soft place to home\nG28 Z P0 T300; home z with low precision, permit 300deg temperature\nG29.2 S0 ; turn off ABL\n\nG0 X85 Y185 F10000 ;move to exposed steel surface and stop the nozzle\nG0 Z-1.01 F10000\nG91\n\nG2 I1 J0 X2 Y0 F2000.1\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\n\nG90\nG1 Z5 F30000\nG1 X25 Y175 F30000.1 ;Brush material\nG1 Z0.2 F30000.1\nG1 Y185\nG91\nG1 X-30 F30000\nG1 Y-2\nG1 X27\nG1 Y1.5\nG1 X-28\nG1 Y-2\nG1 X30\nG1 Y1.5\nG1 X-30\nG90\nM83\n\nG1 Z5\nG0 X55 Y175 F20000 ; find a soft place to home\nG28 Z P0 T300; home z with low precision, permit 300deg temperature\nG29.2 S0 ; turn off ABL\n\nG1 Z10\nG1 X85 Y185\nG1 Z-1.01\nG1 X95\nG1 X90\n\nM211 R; pop softend status\n\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n\n;===== wait heatbed ====================\nM1002 gcode_claim_action : 2\nM104 S0\nM190 S[bed_temperature_initial_layer_single];set bed temp\nM109 S140\n\nG1 Z5 F3000\nG29.2 S1\nG1 X10 Y10 F20000\n\n;===== bed leveling ==================================\n;M1002 set_flag g29_before_print_flag=1\nM1002 judge_flag g29_before_print_flag\nM622 J1\n M1002 gcode_claim_action : 1\n G29 A T145;set high than the wipe temperature\n M400\n M500 ; save cali data\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28 T145\n\nM623\n\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\n\nG1 X-13.5 Y0 Z10 F10000\nG1 E1.2 F500\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S{nozzle_temperature[initial_extruder]}\nM400\n\nM412 S1 ; ===turn on filament runout detection===\nM400 P10\n\nG392 S1 ;turn on clog detect\n\nM620.3 W1; === turn on filament tangle detection===\nM400 S2\n\nM1002 set_filament_type:{filament_type[initial_no_support_extruder]}\n;M1002 set_flag extrude_cali_flag=1\nM1002 judge_flag extrude_cali_flag\nM622 J1\n M1002 gcode_claim_action : 8\n \n M400\n M900 K0.0 L1000.0 M1.0\n G90\n M83\n G0 X68 Y-4 F30000\n G0 Z0.2 F18000 ;Move to start position\n M400\n G0 X88 E10 F{outer_wall_volumetric_speed/(24/20) * 60}\n G0 X93 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\n G0 X98 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X103 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\n G0 X108 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X113 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\n G0 Y0 Z0 F20000\n M400\n \n G1 X-13.5 Y0 Z10 F10000\n M400\n \n G1 E10 F{outer_wall_volumetric_speed/2.4*60}\n M983 F{outer_wall_volumetric_speed/2.4} A0.3 ; cali dynamic extrusion compensation\n M106 P1 S178\n M400 S7\n G1 X0 F18000\n G1 X-13.5 F3000\n G1 X0 F18000 ;wipe and shake\n G1 X-13.5 F3000\n G1 X0 F12000 ;wipe and shake\n G1 X-13.5 F3000\n M400\n M106 P1 S0\n\n M1002 judge_last_extrude_cali_success\n M622 J0\n M983 F{outer_wall_volumetric_speed/2.4} A0.3 ; cali dynamic extrusion compensation\n M106 P1 S178\n M400 S7\n G1 X0 F18000\n G1 X-13.5 F3000\n G1 X0 F18000 ;wipe and shake\n G1 X-13.5 F3000\n G1 X0 F12000 ;wipe and shake\n M400\n M106 P1 S0\n M623\nM623 ; end of \"draw extrinsic para cali paint\"\n\n;===== extrude cali test ===============================\nM104 S{nozzle_temperature_initial_layer[initial_extruder]}\nG90\nM83\nG0 X68 Y-2.5 F30000\nG0 Z0.2 F18000 ;Move to start position\nG0 X88 E10 F{outer_wall_volumetric_speed/(24/20) * 60}\nG0 X93 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\nG0 X98 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 X103 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\nG0 X108 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 X113 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\nG0 X115 Z0 F20000\nG0 Z5\nM400\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\n\nM400 ; wait all motion done before implement the emprical L parameters\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.02} ; for Textured PEI Plate\n{endif}\n\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\n\nM211 X0 Y0 Z0 ;turn off soft endstop\n", - "machine_end_gcode": ";===== date: 20230922 =====================\n;turn off nozzle clog detect\nG392 S0\n\nM400 ; wait for buffer to clear\nG92 E0 ; zero the extruder\nG1 E-0.8 F1800 ; retract\nG1 Z{max_layer_z + 0.5} F900 ; lower z a little\nG1 X0 Y{first_layer_center_no_wipe_tower[1]} F18000 ; move to safe pos\nG1 X-13.0 F3000 ; move to safe pos\n{if !spiral_mode && print_sequence != \"by object\"}\nM1002 judge_flag timelapse_record_flag\nM622 J1\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM400 P100\nM971 S11 C11 O0\nM991 S0 P-1 ;end timelapse at safe pos\nM623\n{endif}\n\nM140 S0 ; turn off bed\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off remote part cooling fan\nM106 P3 S0 ; turn off chamber cooling fan\n\n;G1 X27 F15000 ; wipe\n\n; pull back filament to AMS\nM620 S255\nG1 X181 F12000\nT255\nG1 X0 F18000\nG1 X-13.0 F3000\nG1 X0 F18000 ; wipe\nM621 S255\n\nM104 S0 ; turn off hotend\n\nM400 ; wait all motion done\nM17 S\nM17 Z0.4 ; lower z motor current to reduce impact if there is something in the bottom\n{if (max_layer_z + 100.0) < 180}\n G1 Z{max_layer_z + 100.0} F600\n G1 Z{max_layer_z +98.0}\n{else}\n G1 Z180 F600\n G1 Z180\n{endif}\nM400 P100\nM17 R ; restore z current\n\nG90\nG1 X-13 Y180 F3600\n\nM220 S100 ; Reset feedrate magnitude\nM201.2 K1.0 ; Reset acc magnitude\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 0\n\n;=====printer finish sound=========\nM17\nM400 S1\nM1006 S1\nM1006 A0 B20 L100 C37 D20 M100 E42 F20 N100\nM1006 A0 B10 L100 C44 D10 M100 E44 F10 N100\nM1006 A0 B10 L100 C46 D10 M100 E46 F10 N100\nM1006 A44 B20 L100 C39 D20 M100 E48 F20 N100\nM1006 A0 B10 L100 C44 D10 M100 E44 F10 N100\nM1006 A0 B10 L100 C0 D10 M100 E0 F10 N100\nM1006 A0 B10 L100 C39 D10 M100 E39 F10 N100\nM1006 A0 B10 L100 C0 D10 M100 E0 F10 N100\nM1006 A0 B10 L100 C44 D10 M100 E44 F10 N100\nM1006 A0 B10 L100 C0 D10 M100 E0 F10 N100\nM1006 A0 B10 L100 C39 D10 M100 E39 F10 N100\nM1006 A0 B10 L100 C0 D10 M100 E0 F10 N100\nM1006 A44 B10 L100 C0 D10 M100 E48 F10 N100\nM1006 A0 B10 L100 C0 D10 M100 E0 F10 N100\nM1006 A44 B20 L100 C41 D20 M100 E49 F20 N100\nM1006 A0 B20 L100 C0 D20 M100 E0 F20 N100\nM1006 A0 B20 L100 C37 D20 M100 E37 F20 N100\nM1006 W\n;=====printer finish sound=========\nM400 S1\nM18\n", + "machine_start_gcode": ";===== machine: A1 mini =========================\n;===== date: 20231201 =====================\n\n;===== start to heat heatbead&hotend==========\nM1002 gcode_claim_action : 2\nM1002 set_filament_type:{filament_type[initial_no_support_extruder]}\nM104 S170\nM140 S[bed_temperature_initial_layer_single]\nG392 S0 ;turn off clog detect\n;=====start printer sound ===================\nM17\nM400 S1\nM1006 S1\nM1006 A0 B0 L100 C37 D10 M100 E37 F10 N100\nM1006 A0 B0 L100 C41 D10 M100 E41 F10 N100\nM1006 A0 B0 L100 C44 D10 M100 E44 F10 N100\nM1006 A0 B10 L100 C0 D10 M100 E0 F10 N100\nM1006 A43 B10 L100 C39 D10 M100 E46 F10 N100\nM1006 A0 B0 L100 C0 D10 M100 E0 F10 N100\nM1006 A0 B0 L100 C39 D10 M100 E43 F10 N100\nM1006 A0 B0 L100 C0 D10 M100 E0 F10 N100\nM1006 A0 B0 L100 C41 D10 M100 E41 F10 N100\nM1006 A0 B0 L100 C44 D10 M100 E44 F10 N100\nM1006 A0 B0 L100 C49 D10 M100 E49 F10 N100\nM1006 A0 B0 L100 C0 D10 M100 E0 F10 N100\nM1006 A44 B10 L100 C39 D10 M100 E48 F10 N100\nM1006 A0 B0 L100 C0 D10 M100 E0 F10 N100\nM1006 A0 B0 L100 C39 D10 M100 E44 F10 N100\nM1006 A0 B0 L100 C0 D10 M100 E0 F10 N100\nM1006 A43 B10 L100 C39 D10 M100 E46 F10 N100\nM1006 W\nM18\n;=====avoid end stop =================\nG91\nG380 S2 Z30 F1200\nG380 S2 Z-20 F1200\nG1 Z5 F1200\nG90\n\n;===== reset machine status =================\nM290 X39 Y39 Z8\nM204 S6000\n\nM630 S0 P0\nG91\nM17 Z0.3 ; lower the z-motor current\n\nG90\nM17 X0.7 Y0.9 Z0.5 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM83\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\n;====== cog noise reduction=================\nM982.2 S1 ; turn on cog noise reduction\n\n;===== prepare print temperature and material ==========\nM400\nM18\nM109 S100 H170\nM104 S170\nM400\nM17\nM400\nG28 X\n\nM211 X0 Y0 Z0 ;turn off soft endstop ; turn off soft endstop to prevent protential logic problem\n\nM975 S1 ; turn on\n\nG1 X0.0 F30000\nG1 X-13.5 F3000\n\nM620 M ;enable remap\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n G392 S0 ;turn on clog detect\n M1002 gcode_claim_action : 4\n M400\n M1002 set_filament_type:UNKNOWN\n M109 S[nozzle_temperature_initial_layer]\n M104 S250\n M400\n T[initial_no_support_extruder]\n G1 X-13.5 F3000\n M400\n M620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n M109 S250 ;set nozzle to common flush temp\n M106 P1 S0\n G92 E0\n G1 E50 F200\n M400\n M1002 set_filament_type:{filament_type[initial_no_support_extruder]}\n M104 S{nozzle_temperature_range_high[initial_no_support_extruder]}\n G92 E0\n G1 E50 F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60}\n M400\n M106 P1 S178\n G92 E0\n G1 E5 F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60}\n M109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\n M104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-40}\n G92 E0\n G1 E-0.5 F300\n\n G1 X0 F30000\n G1 X-13.5 F3000\n G1 X0 F30000 ;wipe and shake\n G1 X-13.5 F3000\n G1 X0 F12000 ;wipe and shake\n G1 X0 F30000\n G1 X-13.5 F3000\n M109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-40}\n G392 S0 ;turn off clog detect\nM621 S[initial_no_support_extruder]A\n\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== mech mode fast check============================\nM1002 gcode_claim_action : 3\nG0 X25 Y175 F20000 ; find a soft place to home\n;M104 S0\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nM104 S170\n\n; build plate detect\nG39.4\nM400\n\nG1 Z5 F3000\nG1 X90 Y-1 F30000\nM400 P200\nM970.3 Q1 A7 K0 O2\nM974 Q1 S2 P0\n\nG1 X90 Y0 Z5 F30000\nM400 P200\nM970 Q0 A10 B50 C90 H15 K0 M20 O3\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X-1 Y10\nG28 X ; re-home XY\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\n\nM104 S170 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\nM211 S; push soft endstop status\nM211 X0 Y0 Z0 ;turn off Z axis endstop\n\nM83\nG1 E-1 F500\nG90\nM83\n\nM109 S170\nM104 S140\nG0 X90 Y-4 F30000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X91 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X92 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X93 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X94 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X95 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X96 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X97 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X98 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X99 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X99 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X99 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X99 F10000\nG380 S3 Z-5 F1200\nG1 Z2 F1200\nG1 X99 F10000\nG380 S3 Z-5 F1200\n\nG1 Z5 F30000\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\nG1 X25 Y175 F30000.1 ;Brush material\nG1 Z0.2 F30000.1\nG1 Y185\nG91\nG1 X-30 F30000\nG1 Y-2\nG1 X27\nG1 Y1.5\nG1 X-28\nG1 Y-2\nG1 X30\nG1 Y1.5\nG1 X-30\nG90\nM83\n\nG1 Z5 F3000\nG0 X50 Y175 F20000 ; find a soft place to home\nG28 Z P0 T300; home z with low precision, permit 300deg temperature\nG29.2 S0 ; turn off ABL\n\nG0 X85 Y185 F10000 ;move to exposed steel surface and stop the nozzle\nG0 Z-1.01 F10000\nG91\n\nG2 I1 J0 X2 Y0 F2000.1\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\nG2 I1 J0 X2\nG2 I-0.75 J0 X-1.5\n\nG90\nG1 Z5 F30000\nG1 X25 Y175 F30000.1 ;Brush material\nG1 Z0.2 F30000.1\nG1 Y185\nG91\nG1 X-30 F30000\nG1 Y-2\nG1 X27\nG1 Y1.5\nG1 X-28\nG1 Y-2\nG1 X30\nG1 Y1.5\nG1 X-30\nG90\nM83\n\nG1 Z5\nG0 X55 Y175 F20000 ; find a soft place to home\nG28 Z P0 T300; home z with low precision, permit 300deg temperature\nG29.2 S0 ; turn off ABL\n\nG1 Z10\nG1 X85 Y185\nG1 Z-1.01\nG1 X95\nG1 X90\n\nM211 R; pop softend status\n\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n\n;===== wait heatbed ====================\nM1002 gcode_claim_action : 2\nM104 S0\nM190 S[bed_temperature_initial_layer_single];set bed temp\nM109 S140\n\nG1 Z5 F3000\nG29.2 S1\nG1 X10 Y10 F20000\n\n;===== bed leveling ==================================\n;M1002 set_flag g29_before_print_flag=1\nM1002 judge_flag g29_before_print_flag\nM622 J1\n M1002 gcode_claim_action : 1\n G29 A T145;set high than the wipe temperature\n M400\n M500 ; save cali data\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28 T145\n\nM623\n\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\n\nG1 X-13.5 Y0 Z10 F10000\nG1 E1.2 F500\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S{nozzle_temperature[initial_extruder]}\nM400\n\nM412 S1 ; ===turn on filament runout detection===\nM400 P10\n\nG392 S0 ;turn on clog detect\n\nM620.3 W1; === turn on filament tangle detection===\nM400 S2\n\nM1002 set_filament_type:{filament_type[initial_no_support_extruder]}\n;M1002 set_flag extrude_cali_flag=1\nM1002 judge_flag extrude_cali_flag\nM622 J1\n M1002 gcode_claim_action : 8\n \n M400\n M900 K0.0 L1000.0 M1.0\n G90\n M83\n G0 X68 Y-4 F30000\n G0 Z0.2 F18000 ;Move to start position\n M400\n G0 X88 E10 F{outer_wall_volumetric_speed/(24/20) * 60}\n G0 X93 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\n G0 X98 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X103 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\n G0 X108 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X113 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\n G0 Y0 Z0 F20000\n M400\n \n G1 X-13.5 Y0 Z10 F10000\n M400\n \n G1 E10 F{outer_wall_volumetric_speed/2.4*60}\n M983 F{outer_wall_volumetric_speed/2.4} A0.3 ; cali dynamic extrusion compensation\n M106 P1 S178\n M400 S7\n G1 X0 F18000\n G1 X-13.5 F3000\n G1 X0 F18000 ;wipe and shake\n G1 X-13.5 F3000\n G1 X0 F12000 ;wipe and shake\n G1 X-13.5 F3000\n M400\n M106 P1 S0\n\n M1002 judge_last_extrude_cali_success\n M622 J0\n M983 F{outer_wall_volumetric_speed/2.4} A0.3 ; cali dynamic extrusion compensation\n M106 P1 S178\n M400 S7\n G1 X0 F18000\n G1 X-13.5 F3000\n G1 X0 F18000 ;wipe and shake\n G1 X-13.5 F3000\n G1 X0 F12000 ;wipe and shake\n M400\n M106 P1 S0\n M623\nM623 ; end of \"draw extrinsic para cali paint\"\n\n\n;===== extrude cali test ===============================\nM104 S{nozzle_temperature_initial_layer[initial_extruder]}\nG90\nM83\nG0 X68 Y-2.5 F30000\nG0 Z0.2 F18000 ;Move to start position\nG0 X88 E10 F{outer_wall_volumetric_speed/(24/20) * 60}\nG0 X93 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\nG0 X98 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 X103 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\nG0 X108 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 X113 E.3742 F{outer_wall_volumetric_speed/(0.3*0.5)/4 * 60}\nG0 X115 Z0 F20000\nG0 Z5\nM400\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\n\nM400 ; wait all motion done before implement the emprical L parameters\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.02} ; for Textured PEI Plate\n{endif}\n\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\n\nM211 X0 Y0 Z0 ;turn off soft endstop\nM1007 S1\n\n\n\n", + "machine_end_gcode": ";===== date: 20231201 =====================\n;turn off nozzle clog detect\nG392 S0\n\n{if timelapse_type == 2}\nM991 S0 P-1 ;end timelapse immediately\n{endif}\nM400 ; wait for buffer to clear\nG92 E0 ; zero the extruder\nG1 E-0.8 F1800 ; retract\nG1 Z{max_layer_z + 0.5} F900 ; lower z a little\nG1 X0 F12000 ; move to safe pos \n{if timelapse_type == 1}\nM991 S0 P-1 ;end timelapse at safe pos\n{endif}\n\nM140 S0 ; turn off bed\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off remote part cooling fan\nM106 P3 S0 ; turn off chamber cooling fan\n\n;G1 X27 F15000 ; wipe\n\n; pull back filament to AMS\nM620 S255\nG1 X181 F12000\nT255\nG1 X0 F18000\nG1 X-13.0 F3000\nG1 X0 F18000 ; wipe\nM621 S255\n\nM104 S0 ; turn off hotend\n\nM400 ; wait all motion done\nM17 S\nM17 Z0.4 ; lower z motor current to reduce impact if there is something in the bottom\n{if (max_layer_z + 100.0) < 180}\n G1 Z{max_layer_z + 100.0} F600\n G1 Z{max_layer_z +98.0}\n{else}\n G1 Z180 F600\n G1 Z180\n{endif}\nM400 P100\nM17 R ; restore z current\n\nG90\nG1 X-13 Y180 F3600\n\nG91\nG1 Z-1 F600\nG90\nM83\n\nM220 S100 ; Reset feedrate magnitude\nM201.2 K1.0 ; Reset acc magnitude\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 0\n\n;=====printer finish sound=========\nM17\nM400 S1\nM1006 S1\nM1006 A0 B20 L100 C37 D20 M100 E42 F20 N100\nM1006 A0 B10 L100 C44 D10 M100 E44 F10 N100\nM1006 A0 B10 L100 C46 D10 M100 E46 F10 N100\nM1006 A44 B20 L100 C39 D20 M100 E48 F20 N100\nM1006 A0 B10 L100 C44 D10 M100 E44 F10 N100\nM1006 A0 B10 L100 C0 D10 M100 E0 F10 N100\nM1006 A0 B10 L100 C39 D10 M100 E39 F10 N100\nM1006 A0 B10 L100 C0 D10 M100 E0 F10 N100\nM1006 A0 B10 L100 C44 D10 M100 E44 F10 N100\nM1006 A0 B10 L100 C0 D10 M100 E0 F10 N100\nM1006 A0 B10 L100 C39 D10 M100 E39 F10 N100\nM1006 A0 B10 L100 C0 D10 M100 E0 F10 N100\nM1006 A44 B10 L100 C0 D10 M100 E48 F10 N100\nM1006 A0 B10 L100 C0 D10 M100 E0 F10 N100\nM1006 A44 B20 L100 C41 D20 M100 E49 F20 N100\nM1006 A0 B20 L100 C0 D20 M100 E0 F20 N100\nM1006 A0 B20 L100 C37 D20 M100 E37 F20 N100\nM1006 W\n;=====printer finish sound=========\nM400 S1\nM18\n", "layer_change_gcode": "; layer num/total_layer_count: {layer_num+1}/[total_layer_count]\n; update layer progress\nM73 L{layer_num+1}\nM991 S0 P{layer_num} ;notify layer change\n", - "time_lapse_gcode": ";===================== date: 20230922 =====================\n{if !spiral_mode && print_sequence != \"by object\"}\n; don't support timelapse gcode in spiral_mode and by object sequence for I3 structure printer\nM622.1 S1 ; for prev firware, default turned on\nM1002 judge_flag timelapse_record_flag\nM622 J1\nG92 E0\nG17\nG2 Z{layer_z + 0.4} I0.86 J0.86 P1 F20000 ; spiral lift a little\nG1 Z{max_layer_z + 0.4}\nG1 X0 Y{first_layer_center_no_wipe_tower[1]} F18000 ; move to safe pos\nG1 X-13.0 F3000 ; move to safe pos\nM400 P300\nM971 S11 C11 O0\nG92 E0\nG1 X0 F18000\nM623\n\n; enable nozzle clog detect at 3rd layer\n{if layer_num == 2}\n M400\n G90\n M83\n M204 S5000\n G0 Z2 F4000\n G0 X-6 Y170 F20000\n M400 P200\n G39 S1\n G0 Z2 F4000\n G0 X90 Y90 F30000\n{endif}\n{endif}\n", - "change_filament_gcode": ";===== machine: A1 mini =========================\n;===== date: 20231012 =======================\nG392 S0\nM620 S[next_extruder]A\nM204 S9000\n{if toolchange_count > 1}\nG17\nG2 Z{max_layer_z + 0.4} I0.86 J0.86 P1 F10000 ; spiral lift a little from second lift\n{endif}\nG1 Z{max_layer_z + 3.0} F1200\n\nM400\nM106 P1 S0\nM106 P2 S0\n{if old_filament_temp > 142 && next_extruder < 255}\nM104 S[old_filament_temp]\n{endif}\n\nG1 X180 F18000\n;{if toolchange_count == 2}\n; get travel path for change filament\n;M620.1 X[travel_point_1_x] Y[travel_point_1_y] F21000 P0\n;M620.1 X[travel_point_2_x] Y[travel_point_2_y] F21000 P1\n;M620.1 X[travel_point_3_x] Y[travel_point_3_y] F21000 P2\n;{endif}\nM620.1 E F[old_filament_e_feedrate] T{nozzle_temperature_range_high[previous_extruder]}\nT[next_extruder]\nM620.1 E F[new_filament_e_feedrate] T{nozzle_temperature_range_high[next_extruder]}\n\nG1 Y90 F9000\n\n{if next_extruder < 255}\nM400\n\nG92 E0\n{if flush_length_1 > 1}\n; FLUSH_START\n; always use highest temperature to flush\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S[nozzle_temperature_range_high]\nM106 P1 S60\n{if flush_length_1 > 23.7}\nG1 E23.7 F{old_filament_e_feedrate} ; do not need pulsatile flushing for start part\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{old_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\n{else}\nG1 E{flush_length_1} F{old_filament_e_feedrate}\n{endif}\n; FLUSH_END\nG1 E-[old_retract_length_toolchange] F1800\nG1 E[old_retract_length_toolchange] F300\nM400\nM1002 set_filament_type:{filament_type[next_extruder]}\n{endif}\n\n{if flush_length_1 > 45 && flush_length_2 > 1}\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n{endif}\n\n{if flush_length_2 > 1}\nM106 P1 S60\n; FLUSH_START\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_2 > 45 && flush_length_3 > 1}\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n{endif}\n\n{if flush_length_3 > 1}\nM106 P1 S60\n; FLUSH_START\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_3 > 45 && flush_length_4 > 1}\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n{endif}\n\n{if flush_length_4 > 1}\nM106 P1 S60\n; FLUSH_START\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\n; FLUSH_END\n{endif}\n\nM400\nM106 P1 S60\nM109 S[new_filament_temp]\nG1 E5 F{new_filament_e_feedrate} ;Compensate for filament spillage during waiting temperature\nM400\nG92 E0\nG1 E-[new_retract_length_toolchange] F1800\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nM400\nG1 Z{max_layer_z + 3.0} F3000\nM106 P1 S0\n{if layer_z <= (initial_layer_print_height + 0.001)}\nM204 S[initial_layer_acceleration]\n{else}\nM204 S[default_acceleration]\n{endif}\n{else}\nG1 X[x_after_toolchange] Y[y_after_toolchange] Z[z_after_toolchange] F12000\n{endif}\nM621 S[next_extruder]A\nG392 S1\n" + "time_lapse_gcode": ";===================== date: 20231201 =====================\n{if !spiral_mode && print_sequence != \"by object\"}\n; don't support timelapse gcode in spiral_mode and by object sequence for I3 structure printer\nM622.1 S1 ; for prev firware, default turned on\nM1002 judge_flag timelapse_record_flag\nM622 J1\nG92 E0\nG17\nG2 Z{layer_z + 0.4} I0.86 J0.86 P1 F20000 ; spiral lift a little\nG1 Z{max_layer_z + 0.4}\nG1 X0 Y{first_layer_center_no_wipe_tower[1]} F18000 ; move to safe pos\nG1 X-13.0 F3000 ; move to safe pos\nM400 P300\nM971 S11 C11 O0\nG92 E0\nG1 X0 F18000\nG1 Y178\nM623\n\nM622.1 S1\nM1002 judge_flag g39_detection_flag\nM622 J1\n ; enable nozzle clog detect at 3rd layer\n {if layer_num == 2}\n M400\n G90\n M83\n M204 S5000\n G0 Z2 F4000\n G0 X-6 Y170 F20000\n G39 S1 X-6 Y170\n G0 Z2 F4000\n G0 X90 Y90 F30000\n {endif}\n\n\n {if !in_head_wrap_detect_zone}\n M622.1 S0\n M1002 judge_flag g39_mass_exceed_flag\n M622 J1\n {if layer_num > 2}\n G392 S0\n M400\n G90\n M83\n M204 S5000\n G0 Z{max_layer_z + 0.4} F4000\n G39.3 S1\n G0 Z{max_layer_z + 0.4} F4000\n G392 S0\n {endif}\n M623\n {endif}\nM623\n{endif}\n\n", + "change_filament_gcode": ";===== machine: A1 mini =========================\n;===== date: 20231201 =======================\nG392 S0\nM1007 S0\nM620 S[next_extruder]A\nM204 S9000\n{if toolchange_count > 1}\nG17\nG2 Z{max_layer_z + 0.4} I0.86 J0.86 P1 F10000 ; spiral lift a little from second lift\n{endif}\nG1 Z{max_layer_z + 3.0} F1200\n\nM400\nM106 P1 S0\nM106 P2 S0\n{if old_filament_temp > 142 && next_extruder < 255}\nM104 S[old_filament_temp]\n{endif}\n\nG1 X180 F18000\n;{if toolchange_count == 2}\n; get travel path for change filament\n;M620.1 X[travel_point_1_x] Y[travel_point_1_y] F21000 P0\n;M620.1 X[travel_point_2_x] Y[travel_point_2_y] F21000 P1\n;M620.1 X[travel_point_3_x] Y[travel_point_3_y] F21000 P2\n;{endif}\nM620.1 E F[old_filament_e_feedrate] T{nozzle_temperature_range_high[previous_extruder]}\nT[next_extruder]\nM620.1 E F[new_filament_e_feedrate] T{nozzle_temperature_range_high[next_extruder]}\n\nG1 Y90 F9000\n\n{if next_extruder < 255}\nM400\n\nG92 E0\n{if flush_length_1 > 1}\n; FLUSH_START\n; always use highest temperature to flush\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S[nozzle_temperature_range_high]\nM106 P1 S60\n{if flush_length_1 > 23.7}\nG1 E23.7 F{old_filament_e_feedrate} ; do not need pulsatile flushing for start part\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{old_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\n{else}\nG1 E{flush_length_1} F{old_filament_e_feedrate}\n{endif}\n; FLUSH_END\nG1 E-[old_retract_length_toolchange] F1800\nG1 E[old_retract_length_toolchange] F300\nM400\nM1002 set_filament_type:{filament_type[next_extruder]}\n{endif}\n\n{if flush_length_1 > 45 && flush_length_2 > 1}\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n{endif}\n\n{if flush_length_2 > 1}\nM106 P1 S60\n; FLUSH_START\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_2 > 45 && flush_length_3 > 1}\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n{endif}\n\n{if flush_length_3 > 1}\nM106 P1 S60\n; FLUSH_START\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_3 > 45 && flush_length_4 > 1}\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n{endif}\n\n{if flush_length_4 > 1}\nM106 P1 S60\n; FLUSH_START\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\n; FLUSH_END\n{endif}\n\nM400\nM106 P1 S60\nM109 S[new_filament_temp]\nG1 E5 F{new_filament_e_feedrate} ;Compensate for filament spillage during waiting temperature\nM400\nG92 E0\nG1 E-[new_retract_length_toolchange] F1800\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nM400\nG1 Z{max_layer_z + 3.0} F3000\nM106 P1 S0\n{if layer_z <= (initial_layer_print_height + 0.001)}\nM204 S[initial_layer_acceleration]\n{else}\nM204 S[default_acceleration]\n{endif}\n{else}\nG1 X[x_after_toolchange] Y[y_after_toolchange] Z[z_after_toolchange] F12000\n{endif}\nM621 S[next_extruder]A\nG392 S0\nM1007 S1\n\n" } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab A1 mini 0.6 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab A1 mini 0.6 nozzle.json index 846a62c517..ed1a274802 100644 --- a/resources/profiles/BBL/machine/Bambu Lab A1 mini 0.6 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab A1 mini 0.6 nozzle.json @@ -32,6 +32,7 @@ "Bambu Lab P1P 0.6 nozzle", "Bambu Lab X1 0.6 nozzle", "Bambu Lab X1 Carbon 0.6 nozzle", - "Bambu Lab X1E 0.6 nozzle" + "Bambu Lab X1E 0.6 nozzle", + "Bambu Lab A1 0.6 nozzle" ] } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab A1 mini 0.8 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab A1 mini 0.8 nozzle.json index 2c69cd3455..09760ec4b1 100644 --- a/resources/profiles/BBL/machine/Bambu Lab A1 mini 0.8 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab A1 mini 0.8 nozzle.json @@ -32,6 +32,7 @@ "Bambu Lab P1P 0.8 nozzle", "Bambu Lab X1 0.8 nozzle", "Bambu Lab X1 Carbon 0.8 nozzle", - "Bambu Lab X1E 0.8 nozzle" + "Bambu Lab X1E 0.8 nozzle", + "Bambu Lab A1 0.8 nozzle" ] } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab A1.json b/resources/profiles/BBL/machine/Bambu Lab A1.json new file mode 100644 index 0000000000..4c4f3b0c0a --- /dev/null +++ b/resources/profiles/BBL/machine/Bambu Lab A1.json @@ -0,0 +1,12 @@ +{ + "type": "machine_model", + "name": "Bambu Lab A1", + "nozzle_diameter": "0.4;0.2;0.6;0.8", + "bed_model": "bbl-3dp-X1.stl", + "bed_texture": "bbl-3dp-logo.svg", + "family": "BBL-3DP", + "machine_tech": "FFF", + "model_id": "N2S", + "url": "http://www.bambulab.com/Parameters/printer_model/Bambu Lab X1.json", + "default_materials": "Bambu PLA Matte @BBL A1;Bambu PLA Basic @BBL A1;Bambu PLA Silk @BBL A1;Bambu Support For PA/PET @BBL A1;Bambu ABS @BBL A1;Bambu PETG Basic @BBL A1;Bambu TPU 95A @BBL A1;Bambu PLA Tough @BBL A1;Generic PLA @BBL A1;Generic PLA High Speed @BBL A1;Generic PETG @BBL A1;Generic PVA @BBL A1" +} \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab P1P 0.2 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab P1P 0.2 nozzle.json index da7b3beea7..62526620ef 100644 --- a/resources/profiles/BBL/machine/Bambu Lab P1P 0.2 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab P1P 0.2 nozzle.json @@ -27,7 +27,8 @@ "Bambu Lab P1S 0.2 nozzle", "Bambu Lab X1 0.2 nozzle", "Bambu Lab X1 Carbon 0.2 nozzle", - "Bambu Lab X1E 0.2 nozzle" + "Bambu Lab X1E 0.2 nozzle", + "Bambu Lab A1 0.2 nozzle" ], "machine_start_gcode": ";===== machine: P1P ========================\n;===== date: 20230707 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_extruder]==\"PLA\"}\n {if (bed_temperature[initial_extruder] >45)||(bed_temperature_initial_layer[initial_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_extruder] >50)||(bed_temperature_initial_layer[initial_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S250 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X230 Y15\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_extruder]==\"PLA\"}\n {if (bed_temperature[initial_extruder] >45)||(bed_temperature_initial_layer[initial_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_extruder] >50)||(bed_temperature_initial_layer[initial_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n\nM104 S{nozzle_temperature_initial_layer[initial_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== fmech mode fast check============================\n\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature_initial_layer[initial_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y11 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E0.700\nG0 X18 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z-0.04 ; for Textured PEI Plate\n{endif}\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression" } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab P1P 0.4 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab P1P 0.4 nozzle.json index 4bcd630293..31768fa8ad 100644 --- a/resources/profiles/BBL/machine/Bambu Lab P1P 0.4 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab P1P 0.4 nozzle.json @@ -32,7 +32,8 @@ "Bambu Lab P1S 0.4 nozzle", "Bambu Lab X1 0.4 nozzle", "Bambu Lab X1 Carbon 0.4 nozzle", - "Bambu Lab X1E 0.4 nozzle" + "Bambu Lab X1E 0.4 nozzle", + "Bambu Lab A1 0.4 nozzle" ], "machine_start_gcode": ";===== machine: P1P ========================\n;===== date: 20230707 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_extruder]==\"PLA\"}\n {if (bed_temperature[initial_extruder] >45)||(bed_temperature_initial_layer[initial_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_extruder] >50)||(bed_temperature_initial_layer[initial_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S250 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X230 Y15\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_extruder]==\"PLA\"}\n {if (bed_temperature[initial_extruder] >45)||(bed_temperature_initial_layer[initial_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_extruder] >50)||(bed_temperature_initial_layer[initial_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n\nM104 S{nozzle_temperature_initial_layer[initial_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== fmech mode fast check============================\n\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature_initial_layer[initial_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y11 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E0.700\nG0 X18 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression", "layer_change_gcode": "; layer num/total_layer_count: {layer_num+1}/[total_layer_count]\nM622.1 S1 ; for prev firware, default turned on\nM1002 judge_flag timelapse_record_flag\nM622 J1\n{if timelapse_type == 0} ; timelapse without wipe tower\nM971 S11 C10 O0\n{elsif timelapse_type == 1} ; timelapse with wipe tower\nG92 E0\nG1 E-[retraction_length] F1800\nG17\nG2 Z{layer_z + 0.4} I0.86 J0.86 P1 F20000 ; spiral lift a little\nG1 X65 Y245 F20000 ; move to safe pos\nG17\nG2 Z{layer_z} I0.86 J0.86 P1 F20000\nG1 Y265 F3000\nM400 P300\nM971 S11 C11 O0\nG92 E0\nG1 E[retraction_length] F300\nG1 X100 F5000\nG1 Y255 F20000\n{endif}\nM623\n; update layer progress\nM73 L{layer_num+1}\nM991 S0 P{layer_num} ;notify layer change", diff --git a/resources/profiles/BBL/machine/Bambu Lab P1P 0.6 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab P1P 0.6 nozzle.json index a9918192e1..528dcad10f 100644 --- a/resources/profiles/BBL/machine/Bambu Lab P1P 0.6 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab P1P 0.6 nozzle.json @@ -31,7 +31,8 @@ "Bambu Lab P1S 0.6 nozzle", "Bambu Lab X1 0.6 nozzle", "Bambu Lab X1 Carbon 0.6 nozzle", - "Bambu Lab X1E 0.6 nozzle" + "Bambu Lab X1E 0.6 nozzle", + "Bambu Lab A1 0.6 nozzle" ], "machine_start_gcode": ";===== machine: P1P ========================\n;===== date: 20230707 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_extruder]==\"PLA\"}\n {if (bed_temperature[initial_extruder] >45)||(bed_temperature_initial_layer[initial_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_extruder] >50)||(bed_temperature_initial_layer[initial_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S250 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X230 Y15\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_extruder]==\"PLA\"}\n {if (bed_temperature[initial_extruder] >45)||(bed_temperature_initial_layer[initial_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_extruder] >50)||(bed_temperature_initial_layer[initial_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n\nM104 S{nozzle_temperature_initial_layer[initial_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== fmech mode fast check============================\n\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature_initial_layer[initial_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E25 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y15 E1.166 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E1.166\nG0 X18 E25 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression" } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab P1P 0.8 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab P1P 0.8 nozzle.json index 9361311d89..1ae5c22b3a 100644 --- a/resources/profiles/BBL/machine/Bambu Lab P1P 0.8 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab P1P 0.8 nozzle.json @@ -31,7 +31,8 @@ "Bambu Lab P1S 0.8 nozzle", "Bambu Lab X1 0.8 nozzle", "Bambu Lab X1 Carbon 0.8 nozzle", - "Bambu Lab X1E 0.8 nozzle" + "Bambu Lab X1E 0.8 nozzle", + "Bambu Lab A1 0.8 nozzle" ], "machine_start_gcode": ";===== machine: P1P ========================\n;===== date: 20230707 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_extruder]==\"PLA\"}\n {if (bed_temperature[initial_extruder] >45)||(bed_temperature_initial_layer[initial_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_extruder] >50)||(bed_temperature_initial_layer[initial_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S250 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X230 Y15\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_extruder]==\"PLA\"}\n {if (bed_temperature[initial_extruder] >45)||(bed_temperature_initial_layer[initial_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_extruder] >50)||(bed_temperature_initial_layer[initial_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n\nM104 S{nozzle_temperature_initial_layer[initial_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== fmech mode fast check============================\n\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y0.5 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature_initial_layer[initial_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X129 E15 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\nG0 X240 E15\nG0 Y15 E1.500 F{outer_wall_volumetric_speed/(0.3*1.0)/ 4 * 60}\nG0 X239.5\nG0 E0.3\nG0 Y1.5 E1.500\nG0 X129 E15 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\nG0 X18 E15\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression" } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab P1S 0.2 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab P1S 0.2 nozzle.json index 99b02b8691..8e021245c2 100644 --- a/resources/profiles/BBL/machine/Bambu Lab P1S 0.2 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab P1S 0.2 nozzle.json @@ -27,7 +27,8 @@ "Bambu Lab P1P 0.2 nozzle", "Bambu Lab X1 0.2 nozzle", "Bambu Lab X1 Carbon 0.2 nozzle", - "Bambu Lab X1E 0.2 nozzle" + "Bambu Lab X1E 0.2 nozzle", + "Bambu Lab A1 0.2 nozzle" ], "machine_start_gcode": ";===== machine: P1S ========================\n;===== date: 20231107 =====================\n;===== turn on the HB fan & MC board fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\nM710 A1 S255 ;turn on MC fan by default(P1S)\n;===== reset machine status =================\nM290 X40 Y40 Z2.6666666\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_extruder]==\"PLA\"}\n {if (bed_temperature[initial_extruder] >45)||(bed_temperature_initial_layer[initial_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_extruder] >50)||(bed_temperature_initial_layer[initial_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S250 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X230 Y15\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_extruder]==\"PLA\"}\n {if (bed_temperature[initial_extruder] >45)||(bed_temperature_initial_layer[initial_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_extruder] >50)||(bed_temperature_initial_layer[initial_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n\nM104 S{nozzle_temperature_initial_layer[initial_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== fmech mode fast check============================\n\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature_initial_layer[initial_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y11 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E0.700\nG0 X18 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z-0.04 ; for Textured PEI Plate\n{endif}\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\n" } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab P1S 0.4 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab P1S 0.4 nozzle.json index 78a4b62505..8da15f1add 100644 --- a/resources/profiles/BBL/machine/Bambu Lab P1S 0.4 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab P1S 0.4 nozzle.json @@ -31,7 +31,8 @@ "Bambu Lab P1P 0.4 nozzle", "Bambu Lab X1 0.4 nozzle", "Bambu Lab X1 Carbon 0.4 nozzle", - "Bambu Lab X1E 0.4 nozzle" + "Bambu Lab X1E 0.4 nozzle", + "Bambu Lab A1 0.4 nozzle" ], "machine_start_gcode": ";===== machine: P1S ========================\n;===== date: 20231107 =====================\n;===== turn on the HB fan & MC board fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\nM710 A1 S255 ;turn on MC fan by default(P1S)\n;===== reset machine status =================\nM290 X40 Y40 Z2.6666666\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_extruder]==\"PLA\"}\n {if (bed_temperature[initial_extruder] >45)||(bed_temperature_initial_layer[initial_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_extruder] >50)||(bed_temperature_initial_layer[initial_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S250 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X230 Y15\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_extruder]==\"PLA\"}\n {if (bed_temperature[initial_extruder] >45)||(bed_temperature_initial_layer[initial_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_extruder] >50)||(bed_temperature_initial_layer[initial_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n\nM104 S{nozzle_temperature_initial_layer[initial_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== fmech mode fast check============================\n\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature_initial_layer[initial_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y11 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E0.700\nG0 X18 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\n", "layer_change_gcode": "; layer num/total_layer_count: {layer_num+1}/[total_layer_count]\nM622.1 S1 ; for prev firware, default turned on\nM1002 judge_flag timelapse_record_flag\nM622 J1\n{if timelapse_type == 0} ; timelapse without wipe tower\nM971 S11 C10 O0\n{elsif timelapse_type == 1} ; timelapse with wipe tower\nG92 E0\nG1 E-[retraction_length] F1800\nG17\nG2 Z{layer_z + 0.4} I0.86 J0.86 P1 F20000 ; spiral lift a little\nG1 X65 Y245 F20000 ; move to safe pos\nG17\nG2 Z{layer_z} I0.86 J0.86 P1 F20000\nG1 Y265 F3000\nM400 P300\nM971 S11 C11 O0\nG92 E0\nG1 E[retraction_length] F300\nG1 X100 F5000\nG1 Y255 F20000\n{endif}\nM623\n; update layer progress\nM73 L{layer_num+1}\nM991 S0 P{layer_num} ;notify layer change", diff --git a/resources/profiles/BBL/machine/Bambu Lab P1S 0.6 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab P1S 0.6 nozzle.json index 8b42c7b569..058eae33f2 100644 --- a/resources/profiles/BBL/machine/Bambu Lab P1S 0.6 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab P1S 0.6 nozzle.json @@ -31,7 +31,8 @@ "Bambu Lab P1P 0.6 nozzle", "Bambu Lab X1 0.6 nozzle", "Bambu Lab X1 Carbon 0.6 nozzle", - "Bambu Lab X1E 0.6 nozzle" + "Bambu Lab X1E 0.6 nozzle", + "Bambu Lab A1 0.6 nozzle" ], "machine_start_gcode": ";===== machine: P1S ========================\n;===== date: 20231107 =====================\n;===== turn on the HB fan & MC board fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\nM710 A1 S255 ;turn on MC fan by default(P1S)\n;===== reset machine status =================\nM290 X40 Y40 Z2.6666666\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_extruder]==\"PLA\"}\n {if (bed_temperature[initial_extruder] >45)||(bed_temperature_initial_layer[initial_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_extruder] >50)||(bed_temperature_initial_layer[initial_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S250 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X230 Y15\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_extruder]==\"PLA\"}\n {if (bed_temperature[initial_extruder] >45)||(bed_temperature_initial_layer[initial_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_extruder] >50)||(bed_temperature_initial_layer[initial_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n\nM104 S{nozzle_temperature_initial_layer[initial_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== fmech mode fast check============================\n\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature_initial_layer[initial_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E25 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y15 E1.166 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E1.166\nG0 X18 E25 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\n" } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab P1S 0.8 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab P1S 0.8 nozzle.json index 717857d022..ae628412cd 100644 --- a/resources/profiles/BBL/machine/Bambu Lab P1S 0.8 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab P1S 0.8 nozzle.json @@ -31,7 +31,8 @@ "Bambu Lab P1P 0.8 nozzle", "Bambu Lab X1 0.8 nozzle", "Bambu Lab X1 Carbon 0.8 nozzle", - "Bambu Lab X1E 0.8 nozzle" + "Bambu Lab X1E 0.8 nozzle", + "Bambu Lab A1 0.8 nozzle" ], "machine_start_gcode": ";===== machine: P1S ========================\n;===== date: 20231107 =====================\n;===== turn on the HB fan & MC board fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\nM710 A1 S255 ; turn on MC fan by default(P1S)\n;===== reset machine status =================\nM290 X40 Y40 Z2.6666666\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_extruder]==\"PLA\"}\n {if (bed_temperature[initial_extruder] >45)||(bed_temperature_initial_layer[initial_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_extruder] >50)||(bed_temperature_initial_layer[initial_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S250 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X230 Y15\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_extruder]==\"PLA\"}\n {if (bed_temperature[initial_extruder] >45)||(bed_temperature_initial_layer[initial_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_extruder] >50)||(bed_temperature_initial_layer[initial_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n\nM104 S{nozzle_temperature_initial_layer[initial_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== fmech mode fast check============================\n\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y0.5 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature_initial_layer[initial_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X129 E15 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\nG0 X240 E15\nG0 Y15 E1.500 F{outer_wall_volumetric_speed/(0.3*1.0)/ 4 * 60}\nG0 X239.5\nG0 E0.3\nG0 Y1.5 E1.500\nG0 X129 E15 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\nG0 X18 E15\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\n" } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab X1 0.2 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab X1 0.2 nozzle.json index c0dcb29ee2..af54617e2d 100644 --- a/resources/profiles/BBL/machine/Bambu Lab X1 0.2 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab X1 0.2 nozzle.json @@ -27,7 +27,8 @@ "Bambu Lab P1S 0.2 nozzle", "Bambu Lab P1P 0.2 nozzle", "Bambu Lab X1 Carbon 0.2 nozzle", - "Bambu Lab X1E 0.2 nozzle" + "Bambu Lab X1E 0.2 nozzle", + "Bambu Lab A1 0.2 nozzle" ], "machine_start_gcode": ";===== machine: X1 =========================\n;===== date: 20230707 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S250 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y11 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E0.700\nG0 X231 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n T1000\n\n G0 F1200.0 X231 Y15 Z0.2 E0.741\n G0 F1200.0 X226 Y15 Z0.2 E0.275\n G0 F1200.0 X226 Y8 Z0.2 E0.384\n G0 F1200.0 X216 Y8 Z0.2 E0.549\n G0 F1200.0 X216 Y1.5 Z0.2 E0.357\n\n G0 X48.0 E12.0 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E0.92 F1200.0\n G0 X35.0 Y6.0 E1.03 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n\t{if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X185.000 E9.35441 F4800\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.160\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.080\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X18 E14.3 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.080 K0.160\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.08 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*0.08}\n M623\n\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X185.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X190.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X195.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X200.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X205.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X210.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X215.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X220.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X225.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n M973 S4\n\nM623\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4" } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab X1 0.4 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab X1 0.4 nozzle.json index 85da2d84cd..2239310b94 100644 --- a/resources/profiles/BBL/machine/Bambu Lab X1 0.4 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab X1 0.4 nozzle.json @@ -32,7 +32,8 @@ "Bambu Lab P1S 0.4 nozzle", "Bambu Lab P1P 0.4 nozzle", "Bambu Lab X1 Carbon 0.4 nozzle", - "Bambu Lab X1E 0.4 nozzle" + "Bambu Lab X1E 0.4 nozzle", + "Bambu Lab A1 0.4 nozzle" ], "machine_start_gcode": ";===== machine: X1 =========================\n;===== date: 20230707 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S250 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y11 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E0.700\nG0 X231 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n T1000\n\n G0 F1200.0 X231 Y15 Z0.2 E0.741\n G0 F1200.0 X226 Y15 Z0.2 E0.275\n G0 F1200.0 X226 Y8 Z0.2 E0.384\n G0 F1200.0 X216 Y8 Z0.2 E0.549\n G0 F1200.0 X216 Y1.5 Z0.2 E0.357\n\n G0 X48.0 E12.0 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E0.92 F1200.0\n G0 X35.0 Y6.0 E1.03 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n {if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X185.000 E9.35441 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.040\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.020\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X18 E14.3 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.020 K0.040\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.02 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*0.02}\n M623\n\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X185.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X190.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X195.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X200.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X205.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X210.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X215.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X220.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X225.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n M973 S4\n\nM623\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4", "change_filament_gcode": "M620 S[next_extruder]A\nM204 S9000\n{if toolchange_count > 1 && (z_hop_types[current_extruder] == 0 || z_hop_types[current_extruder] == 3)}\nG17\nG2 Z{z_after_toolchange + 0.4} I0.86 J0.86 P1 F10000 ; spiral lift a little from second lift\n{endif}\nG1 Z{max_layer_z + 3.0} F1200\n\nG1 X70 F21000\nG1 Y245\nG1 Y265 F3000\nM400\nM106 P1 S0\nM106 P2 S0\n{if old_filament_temp > 142 && next_extruder < 255}\nM104 S[old_filament_temp]\n{endif}\nG1 X90 F3000\nG1 Y255 F4000\nG1 X100 F5000\nG1 X120 F15000\n\nG1 X20 Y50 F21000\nG1 Y-3\n{if toolchange_count == 2}\n; get travel path for change filament\nM620.1 X[travel_point_1_x] Y[travel_point_1_y] F21000 P0\nM620.1 X[travel_point_2_x] Y[travel_point_2_y] F21000 P1\nM620.1 X[travel_point_3_x] Y[travel_point_3_y] F21000 P2\n{endif}\nM620.1 E F[old_filament_e_feedrate] T{nozzle_temperature_range_high[previous_extruder]}\nT[next_extruder]\nM620.1 E F[new_filament_e_feedrate] T{nozzle_temperature_range_high[next_extruder]}\n\n{if next_extruder < 255}\nM400\n\nG92 E0\n{if flush_length_1 > 1}\n; FLUSH_START\n; always use highest temperature to flush\nM400\n{if filament_type[next_extruder] == \"PETG\"}\nM109 S220\n{else}\nM109 S[nozzle_temperature_range_high]\n{endif}\n{if flush_length_1 > 23.7}\nG1 E23.7 F{old_filament_e_feedrate} ; do not need pulsatile flushing for start part\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{old_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\n{else}\nG1 E{flush_length_1} F{old_filament_e_feedrate}\n{endif}\n; FLUSH_END\nG1 E-[old_retract_length_toolchange] F1800\n{if (flush_length_2 > 1) && (filament_type[next_extruder]==\"PLA-CF\" || filament_type[next_extruder]==\"PETG\")}\nM106 P1 S255\nM400 S3\nM106 P1 S0\nG1 X80 F15000\nG1 X60 F15000\nG1 X80 F15000\nG1 X60 F15000; shake to put down garbage\n\nG1 X70 F5000\nG1 X90 F3000\nG1 Y255 F4000\nG1 X100 F5000\nG1 Y265 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X165 F15000; wipe and shake\nG1 Y245 F21000\nG1 X65 \nG1 Y265 F3000\n{endif}\nG1 E[old_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_2 > 1}\n; FLUSH_START\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\n{if (flush_length_3 > 1) && (filament_type[next_extruder]==\"PLA-CF\" || filament_type[next_extruder]==\"PETG\")}\nM106 P1 S255\nM400 S3\nM106 P1 S0\nG1 X80 F15000\nG1 X60 F15000\nG1 X80 F15000\nG1 X60 F15000; shake to put down garbage\n\nG1 X70 F5000\nG1 X90 F3000\nG1 Y255 F4000\nG1 X100 F5000\nG1 Y265 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X165 F15000; wipe and shake\nG1 Y245 F21000\nG1 X65 \nG1 Y265 F3000\n{endif}\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_3 > 1}\n; FLUSH_START\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\n{if (flush_length_4 > 1) && (filament_type[next_extruder]==\"PLA-CF\" || filament_type[next_extruder]==\"PETG\")}\nM106 P1 S255\nM400 S3\nM106 P1 S0\nG1 X80 F15000\nG1 X60 F15000\nG1 X80 F15000\nG1 X60 F15000; shake to put down garbage\n\nG1 X70 F5000\nG1 X90 F3000\nG1 Y255 F4000\nG1 X100 F5000\nG1 Y265 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X165 F15000; wipe and shake\nG1 Y245 F21000\nG1 X65 \nG1 Y265 F3000\n{endif}\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_4 > 1}\n; FLUSH_START\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\n; FLUSH_END\n{endif}\n; FLUSH_START\nM400\nM109 S[new_filament_temp]\nG1 E2 F{new_filament_e_feedrate} ;Compensate for filament spillage during waiting temperature\n; FLUSH_END\nM400\nG92 E0\nG1 E-[new_retract_length_toolchange] F1800\nM106 P1 S255\nM400 S3\nG1 X80 F15000\nG1 X60 F15000\nG1 X80 F15000\nG1 X60 F15000; shake to put down garbage\n\nG1 X70 F5000\nG1 X90 F3000\nG1 Y255 F4000\nG1 X100 F5000\nG1 Y265 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X165 F15000; wipe and shake\nG1 Y256 ; move Y to aside, prevent collision\nM400\nG1 Z{max_layer_z + 3.0} F3000\n{if layer_z <= (initial_layer_print_height + 0.001)}\nM204 S[initial_layer_acceleration]\n{else}\nM204 S[default_acceleration]\n{endif}\n{else}\nG1 X[x_after_toolchange] Y[y_after_toolchange] Z[z_after_toolchange] F12000\n{endif}\nM621 S[next_extruder]A\n" diff --git a/resources/profiles/BBL/machine/Bambu Lab X1 0.6 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab X1 0.6 nozzle.json index 87fa2b42c7..34b6e1894c 100644 --- a/resources/profiles/BBL/machine/Bambu Lab X1 0.6 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab X1 0.6 nozzle.json @@ -31,7 +31,8 @@ "Bambu Lab P1S 0.6 nozzle", "Bambu Lab P1P 0.6 nozzle", "Bambu Lab X1 Carbon 0.6 nozzle", - "Bambu Lab X1E 0.6 nozzle" + "Bambu Lab X1E 0.6 nozzle", + "Bambu Lab A1 0.6 nozzle" ], "machine_start_gcode": ";===== machine: X1 =========================\n;===== date: 20230707 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S250 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E25 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y15 E1.166 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E1.166\nG0 X231 E1.166 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n G0 F1200.0 X231 Y15 Z0.2 E1.333\n G0 F1200.0 X226 Y15 Z0.2 E0.495\n G0 F1200.0 X226 Y8 Z0.2 E0.691\n G0 F1200.0 X216 Y8 Z0.2 E0.988\n G0 F1200.0 X216 Y1.5 Z0.2 E0.642\n\n G0 X48.0 E20.56 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E1.56 F1200.0\n G0 X35.0 Y6.0 E1.75 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n {if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X185.000 E16.9 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.030\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.015\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X18 E23.9 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.015 K0.030\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.015 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*0.015}\n M623\n\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X185.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X190.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X195.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X200.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X205.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X210.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X215.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X220.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X225.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n M973 S4\n\nM623\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4" } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab X1 0.8 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab X1 0.8 nozzle.json index 57396a8b04..06b1cdc2a1 100644 --- a/resources/profiles/BBL/machine/Bambu Lab X1 0.8 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab X1 0.8 nozzle.json @@ -31,7 +31,8 @@ "Bambu Lab P1S 0.8 nozzle", "Bambu Lab P1P 0.8 nozzle", "Bambu Lab X1 Carbon 0.8 nozzle", - "Bambu Lab X1E 0.8 nozzle" + "Bambu Lab X1E 0.8 nozzle", + "Bambu Lab A1 0.8 nozzle" ], "machine_start_gcode": ";===== machine: X1 =========================\n;===== date: 20230707 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S250 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y0.5 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X129 E15 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\nG0 X240 E15\nG0 Y11 E1.364 F{outer_wall_volumetric_speed/(0.3*1.0)/ 4 * 60}\nG0 X239.5\nG0 E0.3\nG0 Y1.5 E1.300\nG0 X231 E1.160 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n G0 F1200.0 X231 Y15 Z0.2 E1.482\n G0 F1200.0 X226 Y15 Z0.2 E0.550\n G0 F1200.0 X226 Y8 Z0.2 E0.768\n G0 F1200.0 X216 Y8 Z0.2 E1.098\n G0 F1200.0 X216 Y1.5 Z0.2 E0.714\n\n G0 X48.0 E25.0 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E1.70 F1200.0\n G0 X35.0 Y6.0 E1.90 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n {if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X110.000 E9.35441 F4800\n G0 X185.000 E9.35441 F4800\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.020\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.010\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X129 E14 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G0 X18 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.010 K0.020\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.01 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14) *0.01}\n M623\n\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X185.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X190.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X195.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X200.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X205.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X210.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X215.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X220.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X225.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n M973 S4\n\nM623\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4" } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.2 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.2 nozzle.json index 15503fa892..61bdacbbdf 100644 --- a/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.2 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.2 nozzle.json @@ -28,7 +28,8 @@ "Bambu Lab P1S 0.2 nozzle", "Bambu Lab P1P 0.2 nozzle", "Bambu Lab X1 0.2 nozzle", - "Bambu Lab X1E 0.2 nozzle" + "Bambu Lab X1E 0.2 nozzle", + "Bambu Lab A1 0.2 nozzle" ], "machine_start_gcode": ";===== machine: X1 =========================\n;===== date: 20230707 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S250 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y11 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E0.700\nG0 X231 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n T1000\n\n G0 F1200.0 X231 Y15 Z0.2 E0.741\n G0 F1200.0 X226 Y15 Z0.2 E0.275\n G0 F1200.0 X226 Y8 Z0.2 E0.384\n G0 F1200.0 X216 Y8 Z0.2 E0.549\n G0 F1200.0 X216 Y1.5 Z0.2 E0.357\n\n G0 X48.0 E12.0 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E0.92 F1200.0\n G0 X35.0 Y6.0 E1.03 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n\t{if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X185.000 E9.35441 F4800\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.160\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.080\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X18 E14.3 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.080 K0.160\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.08 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*0.08}\n M623\n\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X185.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X190.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X195.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X200.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X205.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X210.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X215.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X220.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X225.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n M973 S4\n\nM623\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4" } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.4 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.4 nozzle.json index 275a8ed234..5b13c5adba 100644 --- a/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.4 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.4 nozzle.json @@ -30,7 +30,8 @@ "Bambu Lab P1S 0.4 nozzle", "Bambu Lab P1P 0.4 nozzle", "Bambu Lab X1 0.4 nozzle", - "Bambu Lab X1E 0.4 nozzle" + "Bambu Lab X1E 0.4 nozzle", + "Bambu Lab A1 0.4 nozzle" ], "machine_start_gcode": ";===== machine: X1 =========================\n;===== date: 20230707 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S250 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y11 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E0.700\nG0 X231 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n T1000\n\n G0 F1200.0 X231 Y15 Z0.2 E0.741\n G0 F1200.0 X226 Y15 Z0.2 E0.275\n G0 F1200.0 X226 Y8 Z0.2 E0.384\n G0 F1200.0 X216 Y8 Z0.2 E0.549\n G0 F1200.0 X216 Y1.5 Z0.2 E0.357\n\n G0 X48.0 E12.0 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E0.92 F1200.0\n G0 X35.0 Y6.0 E1.03 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n {if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X185.000 E9.35441 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.040\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.020\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X18 E14.3 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.020 K0.040\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.02 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*0.02}\n M623\n\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X185.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X190.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X195.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X200.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X205.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X210.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X215.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X220.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X225.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n M973 S4\n\nM623\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4", "change_filament_gcode": "M620 S[next_extruder]A\nM204 S9000\n{if toolchange_count > 1 && (z_hop_types[current_extruder] == 0 || z_hop_types[current_extruder] == 3)}\nG17\nG2 Z{z_after_toolchange + 0.4} I0.86 J0.86 P1 F10000 ; spiral lift a little from second lift\n{endif}\nG1 Z{max_layer_z + 3.0} F1200\n\nG1 X70 F21000\nG1 Y245\nG1 Y265 F3000\nM400\nM106 P1 S0\nM106 P2 S0\n{if old_filament_temp > 142 && next_extruder < 255}\nM104 S[old_filament_temp]\n{endif}\nG1 X90 F3000\nG1 Y255 F4000\nG1 X100 F5000\nG1 X120 F15000\n\nG1 X20 Y50 F21000\nG1 Y-3\n{if toolchange_count == 2}\n; get travel path for change filament\nM620.1 X[travel_point_1_x] Y[travel_point_1_y] F21000 P0\nM620.1 X[travel_point_2_x] Y[travel_point_2_y] F21000 P1\nM620.1 X[travel_point_3_x] Y[travel_point_3_y] F21000 P2\n{endif}\nM620.1 E F[old_filament_e_feedrate] T{nozzle_temperature_range_high[previous_extruder]}\nT[next_extruder]\nM620.1 E F[new_filament_e_feedrate] T{nozzle_temperature_range_high[next_extruder]}\n\n{if next_extruder < 255}\nM400\n\nG92 E0\n{if flush_length_1 > 1}\n; FLUSH_START\n; always use highest temperature to flush\nM400\n{if filament_type[next_extruder] == \"PETG\"}\nM109 S220\n{else}\nM109 S[nozzle_temperature_range_high]\n{endif}\n{if flush_length_1 > 23.7}\nG1 E23.7 F{old_filament_e_feedrate} ; do not need pulsatile flushing for start part\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{old_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\nG1 E{(flush_length_1 - 23.7) * 0.02} F50\nG1 E{(flush_length_1 - 23.7) * 0.23} F{new_filament_e_feedrate}\n{else}\nG1 E{flush_length_1} F{old_filament_e_feedrate}\n{endif}\n; FLUSH_END\nG1 E-[old_retract_length_toolchange] F1800\n{if (flush_length_2 > 1) && (filament_type[next_extruder]==\"PLA-CF\" || filament_type[next_extruder]==\"PETG\")}\nM106 P1 S255\nM400 S3\nM106 P1 S0\nG1 X80 F15000\nG1 X60 F15000\nG1 X80 F15000\nG1 X60 F15000; shake to put down garbage\n\nG1 X70 F5000\nG1 X90 F3000\nG1 Y255 F4000\nG1 X100 F5000\nG1 Y265 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X165 F15000; wipe and shake\nG1 Y245 F21000\nG1 X65 \nG1 Y265 F3000\n{endif}\nG1 E[old_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_2 > 1}\n; FLUSH_START\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\nG1 E{flush_length_2 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_2 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\n{if (flush_length_3 > 1) && (filament_type[next_extruder]==\"PLA-CF\" || filament_type[next_extruder]==\"PETG\")}\nM106 P1 S255\nM400 S3\nM106 P1 S0\nG1 X80 F15000\nG1 X60 F15000\nG1 X80 F15000\nG1 X60 F15000; shake to put down garbage\n\nG1 X70 F5000\nG1 X90 F3000\nG1 Y255 F4000\nG1 X100 F5000\nG1 Y265 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X165 F15000; wipe and shake\nG1 Y245 F21000\nG1 X65 \nG1 Y265 F3000\n{endif}\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_3 > 1}\n; FLUSH_START\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\nG1 E{flush_length_3 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_3 * 0.02} F50\n; FLUSH_END\nG1 E-[new_retract_length_toolchange] F1800\n{if (flush_length_4 > 1) && (filament_type[next_extruder]==\"PLA-CF\" || filament_type[next_extruder]==\"PETG\")}\nM106 P1 S255\nM400 S3\nM106 P1 S0\nG1 X80 F15000\nG1 X60 F15000\nG1 X80 F15000\nG1 X60 F15000; shake to put down garbage\n\nG1 X70 F5000\nG1 X90 F3000\nG1 Y255 F4000\nG1 X100 F5000\nG1 Y265 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X165 F15000; wipe and shake\nG1 Y245 F21000\nG1 X65 \nG1 Y265 F3000\n{endif}\nG1 E[new_retract_length_toolchange] F300\n{endif}\n\n{if flush_length_4 > 1}\n; FLUSH_START\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\nG1 E{flush_length_4 * 0.18} F{new_filament_e_feedrate}\nG1 E{flush_length_4 * 0.02} F50\n; FLUSH_END\n{endif}\n; FLUSH_START\nM400\nM109 S[new_filament_temp]\nG1 E2 F{new_filament_e_feedrate} ;Compensate for filament spillage during waiting temperature\n; FLUSH_END\nM400\nG92 E0\nG1 E-[new_retract_length_toolchange] F1800\nM106 P1 S255\nM400 S3\nG1 X80 F15000\nG1 X60 F15000\nG1 X80 F15000\nG1 X60 F15000; shake to put down garbage\n\nG1 X70 F5000\nG1 X90 F3000\nG1 Y255 F4000\nG1 X100 F5000\nG1 Y265 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X165 F15000; wipe and shake\nG1 Y256 ; move Y to aside, prevent collision\nM400\nG1 Z{max_layer_z + 3.0} F3000\n{if layer_z <= (initial_layer_print_height + 0.001)}\nM204 S[initial_layer_acceleration]\n{else}\nM204 S[default_acceleration]\n{endif}\n{else}\nG1 X[x_after_toolchange] Y[y_after_toolchange] Z[z_after_toolchange] F12000\n{endif}\nM621 S[next_extruder]A\n" diff --git a/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.6 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.6 nozzle.json index 91f621db45..eb4bd945b0 100644 --- a/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.6 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.6 nozzle.json @@ -30,7 +30,8 @@ "Bambu Lab P1S 0.6 nozzle", "Bambu Lab P1P 0.6 nozzle", "Bambu Lab X1 0.6 nozzle", - "Bambu Lab X1E 0.6 nozzle" + "Bambu Lab X1E 0.6 nozzle", + "Bambu Lab A1 0.6 nozzle" ], "machine_start_gcode": ";===== machine: X1 =========================\n;===== date: 20230707 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S250 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E25 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y15 E1.166 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E1.166\nG0 X231 E1.166 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n G0 F1200.0 X231 Y15 Z0.2 E1.333\n G0 F1200.0 X226 Y15 Z0.2 E0.495\n G0 F1200.0 X226 Y8 Z0.2 E0.691\n G0 F1200.0 X216 Y8 Z0.2 E0.988\n G0 F1200.0 X216 Y1.5 Z0.2 E0.642\n\n G0 X48.0 E20.56 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E1.56 F1200.0\n G0 X35.0 Y6.0 E1.75 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n {if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X185.000 E16.9 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.030\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.015\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X18 E23.9 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.015 K0.030\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.015 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*0.015}\n M623\n\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X185.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X190.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X195.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X200.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X205.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X210.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X215.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X220.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X225.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n M973 S4\n\nM623\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4" } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.8 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.8 nozzle.json index 71730007b0..84fb5a17fd 100644 --- a/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.8 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab X1 Carbon 0.8 nozzle.json @@ -30,7 +30,8 @@ "Bambu Lab P1S 0.8 nozzle", "Bambu Lab P1P 0.8 nozzle", "Bambu Lab X1 0.8 nozzle", - "Bambu Lab X1E 0.8 nozzle" + "Bambu Lab X1E 0.8 nozzle", + "Bambu Lab A1 0.8 nozzle" ], "machine_start_gcode": ";===== machine: X1 =========================\n;===== date: 20230707 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S250 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y0.5 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X129 E15 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\nG0 X240 E15\nG0 Y11 E1.364 F{outer_wall_volumetric_speed/(0.3*1.0)/ 4 * 60}\nG0 X239.5\nG0 E0.3\nG0 Y1.5 E1.300\nG0 X231 E1.160 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n G0 F1200.0 X231 Y15 Z0.2 E1.482\n G0 F1200.0 X226 Y15 Z0.2 E0.550\n G0 F1200.0 X226 Y8 Z0.2 E0.768\n G0 F1200.0 X216 Y8 Z0.2 E1.098\n G0 F1200.0 X216 Y1.5 Z0.2 E0.714\n\n G0 X48.0 E25.0 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E1.70 F1200.0\n G0 X35.0 Y6.0 E1.90 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n {if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X110.000 E9.35441 F4800\n G0 X185.000 E9.35441 F4800\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.020\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.010\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X129 E14 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G0 X18 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.010 K0.020\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.01 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14) *0.01}\n M623\n\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X185.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X190.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X195.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X200.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X205.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X210.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X215.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X220.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X225.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n M973 S4\n\nM623\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4" } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab X1E 0.2 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab X1E 0.2 nozzle.json index 2ab1813a3a..a81d539114 100644 --- a/resources/profiles/BBL/machine/Bambu Lab X1E 0.2 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab X1E 0.2 nozzle.json @@ -28,7 +28,8 @@ "Bambu Lab P1S 0.2 nozzle", "Bambu Lab P1P 0.2 nozzle", "Bambu Lab X1 0.2 nozzle", - "Bambu Lab X1 Carbon 0.2 nozzle" + "Bambu Lab X1 Carbon 0.2 nozzle", + "Bambu Lab A1 0.2 nozzle" ], "machine_start_gcode": ";===== machine: X1E =========================\n;===== date: 20230815 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;==== if Chamber Cooling is necessary ==== \n\n{if (filament_type[initial_no_support_extruder]==\"PLA\") || (filament_type[initial_no_support_extruder]==\"PETG\") || (filament_type[initial_no_support_extruder]==\"TPU\") || (filament_type[initial_no_support_extruder]==\"PVA\") || (filament_type[initial_no_support_extruder]==\"PLA-CF\") || (filament_type[initial_no_support_extruder]==\"PETG-CF\")}\nM1002 gcode_claim_action : 29\nG28\nG90\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nG1 Z200\nM140 S0 ; stop heatbed from heating\nM106 P2 S255 ; open auxiliary fan for cooling\nM106 P3 S255 ; open chamber fan for cooling\nM191 S0 ; wait for chamber temp\nM106 P3 S0 ; reset chamber fan cmd\nM106 P2 S0; reset auxiliary fan cmd\n{endif}\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S290 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n\n;===== set chamber temperature ==========\n{if (overall_chamber_temperature >= 40)}\nM106 P2 S255 ; open big fan to help heating\nM141 S[overall_chamber_temperature] ; Let Chamber begin to heat\n{endif}\n\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y11 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E0.700\nG0 X231 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n T1000\n\n G0 F1200.0 X231 Y15 Z0.2 E0.741\n G0 F1200.0 X226 Y15 Z0.2 E0.275\n G0 F1200.0 X226 Y8 Z0.2 E0.384\n G0 F1200.0 X216 Y8 Z0.2 E0.549\n G0 F1200.0 X216 Y1.5 Z0.2 E0.357\n\n G0 X48.0 E12.0 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E0.92 F1200.0\n G0 X35.0 Y6.0 E1.03 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n\t{if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X185.000 E9.35441 F4800\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.160\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.080\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X18 E14.3 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.080 K0.160\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.08 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*0.08}\n M623\n\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X185.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X190.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X195.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X200.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X205.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X210.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X215.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X220.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X225.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n M973 S4\n\nM623\n\n;===== wait chamber temperature reaching the reference value =======\n{if (overall_chamber_temperature >= 40)}\nM191 S[overall_chamber_temperature] ; wait for chamber temp\nM106 P2 S0 ; reset chamber fan cmd\n{endif}\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4" } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab X1E 0.4 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab X1E 0.4 nozzle.json index 30a52d8824..bcbcca7a0f 100644 --- a/resources/profiles/BBL/machine/Bambu Lab X1E 0.4 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab X1E 0.4 nozzle.json @@ -32,7 +32,8 @@ "Bambu Lab P1S 0.4 nozzle", "Bambu Lab P1P 0.4 nozzle", "Bambu Lab X1 0.4 nozzle", - "Bambu Lab X1 Carbon 0.4 nozzle" + "Bambu Lab X1 Carbon 0.4 nozzle", + "Bambu Lab A1 0.4 nozzle" ], "machine_start_gcode": ";===== machine: X1E =========================\n;===== date: 20230815 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;==== if Chamber Cooling is necessary ==== \n\n{if (filament_type[initial_no_support_extruder]==\"PLA\") || (filament_type[initial_no_support_extruder]==\"PETG\") || (filament_type[initial_no_support_extruder]==\"TPU\") || (filament_type[initial_no_support_extruder]==\"PVA\") || (filament_type[initial_no_support_extruder]==\"PLA-CF\") || (filament_type[initial_no_support_extruder]==\"PETG-CF\")}\nM1002 gcode_claim_action : 29\nG28\nG90\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nG1 Z200\nM140 S0 ; stop heatbed from heating\nM106 P2 S255 ; open auxiliary fan for cooling\nM106 P3 S255 ; open chamber fan for cooling\nM191 S0 ; wait for chamber temp\nM106 P3 S0 ; reset chamber fan cmd\nM106 P2 S0; reset auxiliary fan cmd\n{endif}\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S290 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n\n;===== set chamber temperature ==========\n{if (overall_chamber_temperature >= 40)}\nM106 P2 S255 ; open big fan to help heating\nM141 S[overall_chamber_temperature] ; Let Chamber begin to heat\n{endif}\n\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y11 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E0.700\nG0 X231 E0.700 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n T1000\n\n G0 F1200.0 X231 Y15 Z0.2 E0.741\n G0 F1200.0 X226 Y15 Z0.2 E0.275\n G0 F1200.0 X226 Y8 Z0.2 E0.384\n G0 F1200.0 X216 Y8 Z0.2 E0.549\n G0 F1200.0 X216 Y1.5 Z0.2 E0.357\n\n G0 X48.0 E12.0 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E0.92 F1200.0\n G0 X35.0 Y6.0 E1.03 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n {if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X185.000 E9.35441 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.040\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.020\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X18 E14.3 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.020 K0.040\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E1.24726 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.02 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*0.02}\n M623\n\n G1 X140.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X185.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X190.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X195.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X200.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X205.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X210.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X215.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X220.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X225.000 E0.31181 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n M973 S4\n\nM623\n\n;===== wait chamber temperature reaching the reference value =======\n{if (overall_chamber_temperature >= 40)}\nM191 S[overall_chamber_temperature] ; wait for chamber temp\nM106 P2 S0 ; reset chamber fan cmd\n{endif}\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4\n\n", "machine_end_gcode": ";===== date: 20230428 =====================\nM400 ; wait for buffer to clear\nG92 E0 ; zero the extruder\nG1 E-0.8 F1800 ; retract\nG1 Z{max_layer_z + 0.5} F900 ; lower z a little\nG1 X65 Y245 F12000 ; move to safe pos \nG1 Y265 F3000\n\nG1 X65 Y245 F12000\nG1 Y265 F3000\nM141 S0 ; turn off chamber \nM140 S0 ; turn off bed\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off remote part cooling fan\nM106 P3 S0 ; turn off chamber cooling fan\n\nG1 X100 F12000 ; wipe\n; pull back filament to AMS\nM620 S255\nG1 X20 Y50 F12000\nG1 Y-3\nT255\nG1 X65 F12000\nG1 Y265\nG1 X100 F12000 ; wipe\nM621 S255\nM104 S0 ; turn off hotend\n\nM622.1 S1 ; for prev firware, default turned on\nM1002 judge_flag timelapse_record_flag\nM622 J1\n M400 ; wait all motion done\n M991 S0 P-1 ;end smooth timelapse at safe pos\n M400 S3 ;wait for last picture to be taken\nM623; end of \"timelapse_record_flag\"\n\nM400 ; wait all motion done\nM17 S\nM17 Z0.4 ; lower z motor current to reduce impact if there is something in the bottom\n{if (max_layer_z + 100.0) < 250}\n G1 Z{max_layer_z + 100.0} F600\n G1 Z{max_layer_z +98.0}\n{else}\n G1 Z250 F600\n G1 Z248\n{endif}\nM400 P100\nM17 R ; restore z current\n\nG90\nG1 X128 Y250 F3600\n\nM220 S100 ; Reset feedrate magnitude\nM201.2 K1.0 ; Reset acc magnitude\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 0\n\nM17 X0.8 Y0.8 Z0.5 ; lower motor current to 45% power\n" diff --git a/resources/profiles/BBL/machine/Bambu Lab X1E 0.6 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab X1E 0.6 nozzle.json index 1f0bf643f6..4ccc2d081b 100644 --- a/resources/profiles/BBL/machine/Bambu Lab X1E 0.6 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab X1E 0.6 nozzle.json @@ -30,7 +30,8 @@ "Bambu Lab P1S 0.6 nozzle", "Bambu Lab P1P 0.6 nozzle", "Bambu Lab X1 0.6 nozzle", - "Bambu Lab X1 Carbon 0.6 nozzle" + "Bambu Lab X1 Carbon 0.6 nozzle", + "Bambu Lab A1 0.6 nozzle" ], "machine_start_gcode": ";===== machine: X1E =========================\n;===== date: 20230815 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;==== if Chamber Cooling is necessary ==== \n\n{if (filament_type[initial_no_support_extruder]==\"PLA\") || (filament_type[initial_no_support_extruder]==\"PETG\") || (filament_type[initial_no_support_extruder]==\"TPU\") || (filament_type[initial_no_support_extruder]==\"PVA\") || (filament_type[initial_no_support_extruder]==\"PLA-CF\") || (filament_type[initial_no_support_extruder]==\"PETG-CF\")}\nM1002 gcode_claim_action : 29\nG28\nG90\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nG1 Z200\nM140 S0 ; stop heatbed from heating\nM106 P2 S255 ; open auxiliary fan for cooling\nM106 P3 S255 ; open chamber fan for cooling\nM191 S0 ; wait for chamber temp\nM106 P3 S0 ; reset chamber fan cmd\nM106 P2 S0; reset auxiliary fan cmd\n{endif}\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S290 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n\n;===== set chamber temperature ==========\n{if (overall_chamber_temperature >= 40)}\nM106 P2 S255 ; open big fan to help heating\nM141 S[overall_chamber_temperature] ; Let Chamber begin to heat\n{endif}\n\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y1.0 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X240 E25 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nG0 Y15 E1.166 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\nG0 X239.5\nG0 E0.2\nG0 Y1.5 E1.166\nG0 X231 E1.166 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n G0 F1200.0 X231 Y15 Z0.2 E1.333\n G0 F1200.0 X226 Y15 Z0.2 E0.495\n G0 F1200.0 X226 Y8 Z0.2 E0.691\n G0 F1200.0 X216 Y8 Z0.2 E0.988\n G0 F1200.0 X216 Y1.5 Z0.2 E0.642\n\n G0 X48.0 E20.56 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E1.56 F1200.0\n G0 X35.0 Y6.0 E1.75 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n {if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X185.000 E16.9 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.030\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.015\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.9) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X18 E23.9 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.015 K0.030\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E2.25000 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X70.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X75.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X80.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X85.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X90.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X95.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X100.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X105.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X110.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X115.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X120.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X125.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X130.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X135.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.015 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*0.015}\n M623\n\n G1 X140.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X145.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X150.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X155.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X160.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X165.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X170.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X175.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X180.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X185.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X190.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X195.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X200.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X205.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X210.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X215.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G1 X220.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5)/ 4 * 60}\n G1 X225.000 E0.56250 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n M973 S4\n\nM623\n\n;===== wait chamber temperature reaching the reference value =======\n{if (overall_chamber_temperature >= 40)}\nM191 S[overall_chamber_temperature] ; wait for chamber temp\nM106 P2 S0 ; reset chamber fan cmd\n{endif}\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4" } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/Bambu Lab X1E 0.8 nozzle.json b/resources/profiles/BBL/machine/Bambu Lab X1E 0.8 nozzle.json index 9d18166836..3d3a04e2a1 100644 --- a/resources/profiles/BBL/machine/Bambu Lab X1E 0.8 nozzle.json +++ b/resources/profiles/BBL/machine/Bambu Lab X1E 0.8 nozzle.json @@ -30,7 +30,8 @@ "Bambu Lab P1S 0.8 nozzle", "Bambu Lab P1P 0.8 nozzle", "Bambu Lab X1 0.8 nozzle", - "Bambu Lab X1 Carbon 0.8 nozzle" + "Bambu Lab X1 Carbon 0.8 nozzle", + "Bambu Lab A1 0.8 nozzle" ], "machine_start_gcode": ";===== machine: X1E =========================\n;===== date: 20230815 =====================\n;===== turn on the HB fan =================\nM104 S75 ;set extruder temp to turn on the HB fan and prevent filament oozing from nozzle\n;===== reset machine status =================\nM290 X40 Y40 Z2.6666666\nG91\nM17 Z0.4 ; lower the z-motor current\nG380 S2 Z30 F300 ; G380 is same as G38; lower the hotbed , to prevent the nozzle is below the hotbed\nG380 S2 Z-25 F300 ;\nG1 Z5 F300;\nG90\nM17 X1.2 Y1.2 Z0.75 ; reset motor current to default\nM960 S5 P1 ; turn on logo lamp\nG90\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nM73.2 R1.0 ;Reset left time magnitude\nM1002 set_gcode_claim_speed_level : 5\nM221 X0 Y0 Z0 ; turn off soft endstop to prevent protential logic problem\nG29.1 Z{+0.0} ; clear z-trim value first\nM204 S10000 ; init ACC set to 10m/s^2\n\n;==== if Chamber Cooling is necessary ==== \n\n{if (filament_type[initial_no_support_extruder]==\"PLA\") || (filament_type[initial_no_support_extruder]==\"PETG\") || (filament_type[initial_no_support_extruder]==\"TPU\") || (filament_type[initial_no_support_extruder]==\"PVA\") || (filament_type[initial_no_support_extruder]==\"PLA-CF\") || (filament_type[initial_no_support_extruder]==\"PETG-CF\")}\nM1002 gcode_claim_action : 29\nG28\nG90\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nG1 Z200\nM140 S0 ; stop heatbed from heating\nM106 P2 S255 ; open auxiliary fan for cooling\nM106 P3 S255 ; open chamber fan for cooling\nM191 S0 ; wait for chamber temp\nM106 P3 S0 ; reset chamber fan cmd\nM106 P2 S0; reset auxiliary fan cmd\n{endif}\n\n;===== heatbed preheat ====================\nM1002 gcode_claim_action : 2\nM140 S[bed_temperature_initial_layer_single] ;set bed temp\nM190 S[bed_temperature_initial_layer_single] ;wait for bed temp\n\n{if scan_first_layer}\n;=========register first layer scan=====\nM977 S1 P60\n{endif}\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\n;===== prepare print temperature and material ==========\nM104 S[nozzle_temperature_initial_layer] ;set extruder temp\nG91\nG0 Z10 F1200\nG90\nG28 X\nM975 S1 ; turn on\nG1 X60 F12000\nG1 Y245\nG1 Y265 F3000\nM620 M\nM620 S[initial_no_support_extruder]A ; switch material if AMS exist\n M109 S[nozzle_temperature_initial_layer]\n G1 X120 F12000\n\n G1 X20 Y50 F12000\n G1 Y-3\n T[initial_no_support_extruder]\n G1 X54 F12000\n G1 Y265\n M400\nM621 S[initial_no_support_extruder]A\nM620.1 E F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60} T{nozzle_temperature_range_high[initial_no_support_extruder]}\n\n\nM412 S1 ; ===turn on filament runout detection===\n\nM109 S290 ;set nozzle to common flush temp\nM106 P1 S0\nG92 E0\nG1 E50 F200\nM400\nM104 S[nozzle_temperature_initial_layer]\nG92 E0\nG1 E50 F200\nM400\nM106 P1 S255\nG92 E0\nG1 E5 F300\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20} ; drop nozzle temp, make filament shink a bit\nG92 E0\nG1 E-0.5 F300\n\nG1 X70 F9000\nG1 X76 F15000\nG1 X65 F15000\nG1 X76 F15000\nG1 X65 F15000; shake to put down garbage\nG1 X80 F6000\nG1 X95 F15000\nG1 X80 F15000\nG1 X165 F15000; wipe and shake\nM400\nM106 P1 S0\n\n;===== set chamber temperature ==========\n{if (overall_chamber_temperature >= 40)}\nM106 P2 S255 ; open big fan to help heating\nM141 S[overall_chamber_temperature] ; Let Chamber begin to heat\n{endif}\n\n;===== prepare print temperature and material end =====\n\n\n;===== wipe nozzle ===============================\nM1002 gcode_claim_action : 14\nM975 S1\nM106 S255\nG1 X65 Y230 F18000\nG1 Y264 F6000\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]-20}\nG1 X100 F18000 ; first wipe mouth\n\nG0 X135 Y253 F20000 ; move to exposed steel surface edge\nG28 Z P0 T300; home z with low precision,permit 300deg temperature\nG29.2 S0 ; turn off ABL\nG0 Z5 F20000\n\nG1 X60 Y265\nG92 E0\nG1 E-0.5 F300 ; retrack more\nG1 X100 F5000; second wipe mouth\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X100 F5000\nG1 X70 F15000\nG1 X90 F5000\nG0 X128 Y261 Z-1.5 F20000 ; move to exposed steel surface and stop the nozzle\nM104 S140 ; set temp down to heatbed acceptable\nM106 S255 ; turn on fan (G28 has turn off fan)\n\nM221 S; push soft endstop status\nM221 Z0 ;turn off Z axis endstop\nG0 Z0.5 F20000\nG0 X125 Y259.5 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y262.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y260.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.5\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 Z0.5 F20000\nG0 X125 Y261.0\nG0 Z-1.01\nG0 X131 F211\nG0 X124\nG0 X128\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\nG2 I0.5 J0 F300\n\nM109 S140 ; wait nozzle temp down to heatbed acceptable\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\nG2 I0.5 J0 F3000\n\nM221 R; pop softend status\nG1 Z10 F1200\nM400\nG1 Z10\nG1 F30000\nG1 X128 Y128\nG29.2 S1 ; turn on ABL\n;G28 ; home again after hard wipe mouth\nM106 S0 ; turn off fan , too noisy\n;===== wipe nozzle end ================================\n\n;===== check scanner clarity ===========================\nG1 X128 Y128 F24000\nG28 Z P0\nM972 S5 P0\nG1 X230 Y15 F24000\n;===== check scanner clarity end =======================\n\n;===== bed leveling ==================================\nM1002 judge_flag g29_before_print_flag\nM622 J1\n\n M1002 gcode_claim_action : 1\n G29 A X{first_layer_print_min[0]} Y{first_layer_print_min[1]} I{first_layer_print_size[0]} J{first_layer_print_size[1]}\n M400\n M500 ; save cali data\n\nM623\n;===== bed leveling end ================================\n\n;===== home after wipe mouth============================\nM1002 judge_flag g29_before_print_flag\nM622 J0\n\n M1002 gcode_claim_action : 13\n G28\n\nM623\n;===== home after wipe mouth end =======================\n\nM975 S1 ; turn on vibration supression\n\n;=============turn on fans to prevent PLA jamming=================\n{if filament_type[initial_no_support_extruder]==\"PLA\"}\n {if (bed_temperature[initial_no_support_extruder] >45)||(bed_temperature_initial_layer[initial_no_support_extruder] >45)}\n M106 P3 S180\n {elsif (bed_temperature[initial_no_support_extruder] >50)||(bed_temperature_initial_layer[initial_no_support_extruder] >50)}\n M106 P3 S255\n {endif};Prevent PLA from jamming\n{endif}\nM106 P2 S100 ; turn on big fan ,to cool down toolhead\n\nM104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; set extrude temp earlier, to reduce wait time\n\n;===== mech mode fast check============================\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q1 A7 B30 C80 H15 K0\nM974 Q1 S2 P0\n\nG1 X128 Y128 Z10 F20000\nM400 P200\nM970.3 Q0 A7 B30 C90 Q0 H15 K0\nM974 Q0 S2 P0\n\nM975 S1\nG1 F30000\nG1 X230 Y15\nG28 X ; re-home XY\n;===== mech mode fast check============================\n\n{if scan_first_layer}\n;start heatbed scan====================================\nM976 S2 P1\nG90\nG1 X128 Y128 F20000\nM976 S3 P2 ;register void printing detection\n{endif}\n\n;===== noozle load line ===============================\nM975 S1\nG90\nM83\nT1000\nG1 X18.0 Y0.5 Z0.8 F18000;Move to start position\nM109 S{nozzle_temperature[initial_no_support_extruder]}\nG1 Z0.2\nG0 E2 F300\nG0 X129 E15 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\nG0 X240 E15\nG0 Y11 E1.364 F{outer_wall_volumetric_speed/(0.3*1.0)/ 4 * 60}\nG0 X239.5\nG0 E0.3\nG0 Y1.5 E1.300\nG0 X231 E1.160 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM400\n\n;===== for Textured PEI Plate , lower the nozzle as the nozzle was touching topmost of the texture when homing ==\n;curr_bed_type={curr_bed_type}\n{if curr_bed_type==\"Textured PEI Plate\"}\nG29.1 Z{-0.04} ; for Textured PEI Plate\n{endif}\n\n;===== draw extrinsic para cali paint =================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M1002 gcode_claim_action : 8\n\n G0 F1200.0 X231 Y15 Z0.2 E1.482\n G0 F1200.0 X226 Y15 Z0.2 E0.550\n G0 F1200.0 X226 Y8 Z0.2 E0.768\n G0 F1200.0 X216 Y8 Z0.2 E1.098\n G0 F1200.0 X216 Y1.5 Z0.2 E0.714\n\n G0 X48.0 E25.0 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\n G0 X48.0 Y14 E1.70 F1200.0\n G0 X35.0 Y6.0 E1.90 F1200.0\n\n ;=========== extruder cali extrusion ==================\n T1000\n M83\n {if default_acceleration > 0}\n {if outer_wall_acceleration > 0}\n M204 S[outer_wall_acceleration]\n {else}\n M204 S[default_acceleration]\n {endif}\n {endif}\n G0 X35.000 Y6.000 Z0.300 F30000 E0\n G1 F1500.000 E0.800\n M106 S0 ; turn off fan\n G0 X110.000 E9.35441 F4800\n G0 X185.000 E9.35441 F4800\n G0 X187 Z0\n G1 F1500.000 E-0.800\n G0 Z1\n G0 X180 Z0.3 F18000\n\n M900 L1000.0 M1.0\n M900 K0.020\n G0 X45.000 F30000\n G0 Y8.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.010\n G0 X45.000 F30000\n G0 Y10.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n M400\n\n G0 X45.000 F30000\n M900 K0.000\n G0 X45.000 F30000\n G0 Y12.000 F30000\n G1 F1500.000 E0.800\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 F1500.000 E-0.800\n G1 X183 Z0.15 F30000\n G1 X185\n G1 Z1.0\n G0 Y6.000 F30000 ; move y to clear pos\n G1 Z0.3\n\n G0 X45.000 F30000 ; move to start point\n\nM623 ; end of \"draw extrinsic para cali paint\"\n\nM1002 judge_flag extrude_cali_flag\nM622 J0\n G0 X231 Y1.5 F30000\n G0 X129 E14 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G0 X18 E15 F{outer_wall_volumetric_speed/(0.3*0.5) * 60}\nM623\n\nM104 S140\n\n\n;=========== laser and rgb calibration ===========\nM400\nM18 E\nM500 R\n\nM973 S3 P14\n\nG1 X120 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nT1100\nG1 X235.0 Y1.0 Z0.3 F18000.0;Move to first extrude line pos\nM400 P100\nM960 S1 P1\nM400 P100\nM973 S6 P0; use auto exposure for horizontal laser by xcam\nM960 S0 P0\n\nG1 X240.0 Y6.0 Z0.3 F18000.0;Move to vertical extrude line pos\nM960 S2 P1\nM400 P100\nM973 S6 P1; use auto exposure for vertical laser by xcam\nM960 S0 P0\n\n;=========== handeye calibration ======================\nM1002 judge_flag extrude_cali_flag\nM622 J1\n\n M973 S3 P1 ; camera start stream\n M400 P500\n M973 S1\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G0 F6000 X228.500 Y4.500 Z0.000\n M960 S0 P1\n M973 S1\n M400 P800\n M971 S6 P0\n M973 S2 P0\n M400 P500\n G0 Z0.000 F12000\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P200\n M971 S5 P1\n M973 S2 P1\n M400 P500\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P3\n G0 Z0.500 F12000\n M960 S0 P0\n M960 S2 P1\n G0 X228.5 Y11.0\n M400 P200\n M971 S5 P4\n M973 S2 P0\n M400 P500\n M960 S0 P0\n M960 S1 P1\n G0 X221.00 Y4.50\n M400 P500\n M971 S5 P2\n M963 S1\n M400 P1500\n M964\n T1100\n G1 Z3 F3000\n\n M400\n M500 ; save cali data\n\n M104 S{nozzle_temperature_initial_layer[initial_no_support_extruder]} ; rise nozzle temp now ,to reduce temp waiting time.\n\n T1100\n M400 P400\n M960 S0 P0\n G0 F30000.000 Y10.000 X65.000 Z0.000\n M400 P400\n M960 S1 P1\n M400 P50\n\n M969 S1 N3 A2000\n G0 F360.000 X181.000 Z0.000\n M980.3 A70.000 B{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60/4} C5.000 D{outer_wall_volumetric_speed/(1.75*1.75/4*3.14)*60} E5.000 F175.000 H1.000 I0.000 J0.010 K0.020\n M400 P100\n G0 F20000\n G0 Z1 ; rise nozzle up\n T1000 ; change to nozzle space\n G0 X45.000 Y4.000 F30000 ; move to test line pos\n M969 S0 ; turn off scanning\n M960 S0 P0\n\n\n G1 Z2 F20000\n T1000\n G0 X45.000 Y4.000 F30000 E0\n M109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\n G0 Z0.3\n G1 F1500.000 E3.600\n G1 X65.000 E2.4945 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X70.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X75.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X80.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X85.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X90.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X95.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X100.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X105.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X110.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X115.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X120.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X125.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X130.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X135.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n\n ; see if extrude cali success, if not ,use default value\n M1002 judge_last_extrude_cali_success\n M622 J0\n M400\n M900 K0.01 M{outer_wall_volumetric_speed/(1.75*1.75/4*3.14) *0.01}\n M623\n\n G1 X140.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X145.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X150.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X155.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X160.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X165.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X170.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X175.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X180.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X185.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X190.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X195.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X200.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X205.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X210.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X215.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n G1 X220.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) / 4 * 60}\n G1 X225.000 E0.6236 F{outer_wall_volumetric_speed/(0.3*1.0) * 60}\n M973 S4\n\nM623\n\n;===== wait chamber temperature reaching the reference value =======\n{if (overall_chamber_temperature >= 40)}\nM191 S[overall_chamber_temperature] ; wait for chamber temp\nM106 P2 S0 ; reset chamber fan cmd\n{endif}\n\n;========turn off light and wait extrude temperature =============\nM1002 gcode_claim_action : 0\nM973 S4 ; turn off scanner\nM400 ; wait all motion done before implement the emprical L parameters\n;M900 L500.0 ; Empirical parameters\nM109 S[nozzle_temperature_initial_layer]\nM960 S1 P0 ; turn off laser\nM960 S2 P0 ; turn off laser\nM106 S0 ; turn off fan\nM106 P2 S0 ; turn off big fan\nM106 P3 S0 ; turn off chamber fan\n\nM975 S1 ; turn on mech mode supression\nG90\nM83\nT1000\nG1 E{-retraction_length[initial_no_support_extruder]} F1800\nG1 X128.0 Y253.0 Z0.2 F24000.0;Move to start position\nG1 E{retraction_length[initial_no_support_extruder]} F1800\nM109 S{nozzle_temperature_initial_layer[initial_no_support_extruder]}\nG0 X253 E6.4 F{outer_wall_volumetric_speed/(0.3*0.6) * 60}\nG0 Y128 E6.4\nG0 X252.5\nG0 Y252.5 E6.4\nG0 X128 E6.4" } \ No newline at end of file diff --git a/resources/profiles/BBL/machine/fdm_machine_common.json b/resources/profiles/BBL/machine/fdm_machine_common.json index 59ac9ae52f..c3b22f5612 100644 --- a/resources/profiles/BBL/machine/fdm_machine_common.json +++ b/resources/profiles/BBL/machine/fdm_machine_common.json @@ -36,7 +36,7 @@ "10000" ], "machine_max_acceleration_z": [ - "100" + "500" ], "machine_max_speed_e": [ "60" diff --git a/resources/profiles/BBL/process/0.06mm Fine @BBL A1 0.2 nozzle.json b/resources/profiles/BBL/process/0.06mm Fine @BBL A1 0.2 nozzle.json new file mode 100644 index 0000000000..ea11af4176 --- /dev/null +++ b/resources/profiles/BBL/process/0.06mm Fine @BBL A1 0.2 nozzle.json @@ -0,0 +1,15 @@ +{ + "type": "process", + "name": "0.06mm Fine @BBL A1 0.2 nozzle", + "inherits": "fdm_process_bbl_0.06_nozzle_0.2", + "from": "system", + "setting_id": "GP084", + "instantiation": "true", + "default_acceleration": "6000", + "initial_layer_infill_speed": "28", + "initial_layer_speed": "16", + "travel_speed": "700", + "compatible_printers": [ + "Bambu Lab A1 0.2 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/process/0.06mm Fine @BBL A1M 0.2 nozzle.json b/resources/profiles/BBL/process/0.06mm Fine @BBL A1M 0.2 nozzle.json index fb6886c4bf..152b44e9ab 100644 --- a/resources/profiles/BBL/process/0.06mm Fine @BBL A1M 0.2 nozzle.json +++ b/resources/profiles/BBL/process/0.06mm Fine @BBL A1M 0.2 nozzle.json @@ -6,6 +6,8 @@ "setting_id": "GP050", "instantiation": "true", "default_acceleration": "6000", + "initial_layer_infill_speed": "28", + "initial_layer_speed": "16", "travel_speed": "700", "compatible_printers": [ "Bambu Lab A1 mini 0.2 nozzle" diff --git a/resources/profiles/BBL/process/0.08mm Extra Fine @BBL A1.json b/resources/profiles/BBL/process/0.08mm Extra Fine @BBL A1.json new file mode 100644 index 0000000000..f04518bea0 --- /dev/null +++ b/resources/profiles/BBL/process/0.08mm Extra Fine @BBL A1.json @@ -0,0 +1,13 @@ +{ + "type": "process", + "name": "0.08mm Extra Fine @BBL A1", + "inherits": "fdm_process_bbl_0.08", + "from": "system", + "setting_id": "GP076", + "instantiation": "true", + "default_acceleration": "6000", + "travel_speed": "700", + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/process/0.08mm Optimal @BBL A1 0.2 nozzle.json b/resources/profiles/BBL/process/0.08mm Optimal @BBL A1 0.2 nozzle.json new file mode 100644 index 0000000000..3f330ad07c --- /dev/null +++ b/resources/profiles/BBL/process/0.08mm Optimal @BBL A1 0.2 nozzle.json @@ -0,0 +1,15 @@ +{ + "type": "process", + "name": "0.08mm Optimal @BBL A1 0.2 nozzle", + "inherits": "fdm_process_bbl_0.08_nozzle_0.2", + "from": "system", + "setting_id": "GP085", + "instantiation": "true", + "default_acceleration": "6000", + "initial_layer_infill_speed": "28", + "initial_layer_speed": "16", + "travel_speed": "700", + "compatible_printers": [ + "Bambu Lab A1 0.2 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/process/0.08mm Optimal @BBL A1M 0.2 nozzle.json b/resources/profiles/BBL/process/0.08mm Optimal @BBL A1M 0.2 nozzle.json index 85fcb88227..15a9dc636c 100644 --- a/resources/profiles/BBL/process/0.08mm Optimal @BBL A1M 0.2 nozzle.json +++ b/resources/profiles/BBL/process/0.08mm Optimal @BBL A1M 0.2 nozzle.json @@ -6,6 +6,8 @@ "setting_id": "GP051", "instantiation": "true", "default_acceleration": "6000", + "initial_layer_infill_speed": "28", + "initial_layer_speed": "16", "travel_speed": "700", "compatible_printers": [ "Bambu Lab A1 mini 0.2 nozzle" diff --git a/resources/profiles/BBL/process/0.10mm Standard @BBL A1 0.2 nozzle.json b/resources/profiles/BBL/process/0.10mm Standard @BBL A1 0.2 nozzle.json new file mode 100644 index 0000000000..2ba86c8170 --- /dev/null +++ b/resources/profiles/BBL/process/0.10mm Standard @BBL A1 0.2 nozzle.json @@ -0,0 +1,15 @@ +{ + "type": "process", + "name": "0.10mm Standard @BBL A1 0.2 nozzle", + "inherits": "fdm_process_bbl_0.10_nozzle_0.2", + "from": "system", + "setting_id": "GP083", + "instantiation": "true", + "default_acceleration": "6000", + "initial_layer_infill_speed": "28", + "initial_layer_speed": "16", + "travel_speed": "700", + "compatible_printers": [ + "Bambu Lab A1 0.2 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/process/0.10mm Standard @BBL A1M 0.2 nozzle.json b/resources/profiles/BBL/process/0.10mm Standard @BBL A1M 0.2 nozzle.json index 53895d5507..1c161ecd38 100644 --- a/resources/profiles/BBL/process/0.10mm Standard @BBL A1M 0.2 nozzle.json +++ b/resources/profiles/BBL/process/0.10mm Standard @BBL A1M 0.2 nozzle.json @@ -6,6 +6,8 @@ "setting_id": "GP039", "instantiation": "true", "default_acceleration": "6000", + "initial_layer_infill_speed": "28", + "initial_layer_speed": "16", "travel_speed": "700", "compatible_printers": [ "Bambu Lab A1 mini 0.2 nozzle" diff --git a/resources/profiles/BBL/process/0.12mm Draft @BBL A1 0.2 nozzle.json b/resources/profiles/BBL/process/0.12mm Draft @BBL A1 0.2 nozzle.json new file mode 100644 index 0000000000..51d5be064a --- /dev/null +++ b/resources/profiles/BBL/process/0.12mm Draft @BBL A1 0.2 nozzle.json @@ -0,0 +1,15 @@ +{ + "type": "process", + "name": "0.12mm Draft @BBL A1 0.2 nozzle", + "inherits": "fdm_process_bbl_0.12_nozzle_0.2", + "from": "system", + "setting_id": "GP086", + "instantiation": "true", + "default_acceleration": "6000", + "initial_layer_infill_speed": "28", + "initial_layer_speed": "16", + "travel_speed": "700", + "compatible_printers": [ + "Bambu Lab A1 0.2 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/process/0.12mm Draft @BBL A1M 0.2 nozzle.json b/resources/profiles/BBL/process/0.12mm Draft @BBL A1M 0.2 nozzle.json index 095aa87150..917812c462 100644 --- a/resources/profiles/BBL/process/0.12mm Draft @BBL A1M 0.2 nozzle.json +++ b/resources/profiles/BBL/process/0.12mm Draft @BBL A1M 0.2 nozzle.json @@ -6,6 +6,8 @@ "setting_id": "GP052", "instantiation": "true", "default_acceleration": "6000", + "initial_layer_infill_speed": "28", + "initial_layer_speed": "16", "travel_speed": "700", "compatible_printers": [ "Bambu Lab A1 mini 0.2 nozzle" diff --git a/resources/profiles/BBL/process/0.12mm Fine @BBL A1.json b/resources/profiles/BBL/process/0.12mm Fine @BBL A1.json new file mode 100644 index 0000000000..224b7755ba --- /dev/null +++ b/resources/profiles/BBL/process/0.12mm Fine @BBL A1.json @@ -0,0 +1,13 @@ +{ + "type": "process", + "name": "0.12mm Fine @BBL A1", + "inherits": "fdm_process_bbl_0.12", + "from": "system", + "setting_id": "GP077", + "instantiation": "true", + "default_acceleration": "6000", + "travel_speed": "700", + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/process/0.14mm Extra Draft @BBL A1 0.2 nozzle.json b/resources/profiles/BBL/process/0.14mm Extra Draft @BBL A1 0.2 nozzle.json new file mode 100644 index 0000000000..f8d359d573 --- /dev/null +++ b/resources/profiles/BBL/process/0.14mm Extra Draft @BBL A1 0.2 nozzle.json @@ -0,0 +1,15 @@ +{ + "type": "process", + "name": "0.14mm Extra Draft @BBL A1 0.2 nozzle", + "inherits": "fdm_process_bbl_0.14_nozzle_0.2", + "from": "system", + "setting_id": "GP087", + "instantiation": "true", + "default_acceleration": "6000", + "initial_layer_infill_speed": "28", + "initial_layer_speed": "16", + "travel_speed": "700", + "compatible_printers": [ + "Bambu Lab A1 0.2 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/process/0.14mm Extra Draft @BBL A1M 0.2 nozzle.json b/resources/profiles/BBL/process/0.14mm Extra Draft @BBL A1M 0.2 nozzle.json index 3462b6ad11..1c5b9def3f 100644 --- a/resources/profiles/BBL/process/0.14mm Extra Draft @BBL A1M 0.2 nozzle.json +++ b/resources/profiles/BBL/process/0.14mm Extra Draft @BBL A1M 0.2 nozzle.json @@ -6,6 +6,8 @@ "setting_id": "GP053", "instantiation": "true", "default_acceleration": "6000", + "initial_layer_infill_speed": "28", + "initial_layer_speed": "16", "travel_speed": "700", "compatible_printers": [ "Bambu Lab A1 mini 0.2 nozzle" diff --git a/resources/profiles/BBL/process/0.16mm Optimal @BBL A1.json b/resources/profiles/BBL/process/0.16mm Optimal @BBL A1.json new file mode 100644 index 0000000000..29cc2a8d30 --- /dev/null +++ b/resources/profiles/BBL/process/0.16mm Optimal @BBL A1.json @@ -0,0 +1,13 @@ +{ + "type": "process", + "name": "0.16mm Optimal @BBL A1", + "inherits": "fdm_process_bbl_0.16", + "from": "system", + "setting_id": "GP078", + "instantiation": "true", + "default_acceleration": "6000", + "travel_speed": "700", + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/process/0.18mm Fine @BBL A1 0.6 nozzle.json b/resources/profiles/BBL/process/0.18mm Fine @BBL A1 0.6 nozzle.json new file mode 100644 index 0000000000..391a7d4069 --- /dev/null +++ b/resources/profiles/BBL/process/0.18mm Fine @BBL A1 0.6 nozzle.json @@ -0,0 +1,13 @@ +{ + "type": "process", + "name": "0.18mm Fine @BBL A1 0.6 nozzle", + "inherits": "fdm_process_bbl_0.18_nozzle_0.6", + "from": "system", + "setting_id": "GP088", + "instantiation": "true", + "default_acceleration": "6000", + "travel_speed": "700", + "compatible_printers": [ + "Bambu Lab A1 0.6 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/process/0.20mm Standard @BBL A1.json b/resources/profiles/BBL/process/0.20mm Standard @BBL A1.json new file mode 100644 index 0000000000..1af91f1917 --- /dev/null +++ b/resources/profiles/BBL/process/0.20mm Standard @BBL A1.json @@ -0,0 +1,13 @@ +{ + "type": "process", + "name": "0.20mm Standard @BBL A1", + "inherits": "fdm_process_bbl_0.20", + "from": "system", + "setting_id": "GP079", + "instantiation": "true", + "default_acceleration": "6000", + "travel_speed": "700", + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/process/0.20mm Strength @BBL A1.json b/resources/profiles/BBL/process/0.20mm Strength @BBL A1.json new file mode 100644 index 0000000000..010245a65c --- /dev/null +++ b/resources/profiles/BBL/process/0.20mm Strength @BBL A1.json @@ -0,0 +1,16 @@ +{ + "type": "process", + "name": "0.20mm Strength @BBL A1", + "inherits": "fdm_process_bbl_0.20", + "from": "system", + "setting_id": "GP080", + "instantiation": "true", + "default_acceleration": "6000", + "outer_wall_speed": "60", + "sparse_infill_density": "25%", + "travel_speed": "700", + "wall_loops": "6", + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/process/0.24mm Draft @BBL A1.json b/resources/profiles/BBL/process/0.24mm Draft @BBL A1.json new file mode 100644 index 0000000000..8c8c7a18c9 --- /dev/null +++ b/resources/profiles/BBL/process/0.24mm Draft @BBL A1.json @@ -0,0 +1,13 @@ +{ + "type": "process", + "name": "0.24mm Draft @BBL A1", + "inherits": "fdm_process_bbl_0.24", + "from": "system", + "setting_id": "GP081", + "instantiation": "true", + "default_acceleration": "6000", + "travel_speed": "700", + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/process/0.24mm Fine @BBL A1 0.8 nozzle.json b/resources/profiles/BBL/process/0.24mm Fine @BBL A1 0.8 nozzle.json new file mode 100644 index 0000000000..0f61d97ec1 --- /dev/null +++ b/resources/profiles/BBL/process/0.24mm Fine @BBL A1 0.8 nozzle.json @@ -0,0 +1,13 @@ +{ + "type": "process", + "name": "0.24mm Fine @BBL A1 0.8 nozzle", + "inherits": "fdm_process_bbl_0.24_nozzle_0.8", + "from": "system", + "setting_id": "GP092", + "instantiation": "true", + "default_acceleration": "6000", + "travel_speed": "700", + "compatible_printers": [ + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/process/0.24mm Optimal @BBL A1 0.6 nozzle.json b/resources/profiles/BBL/process/0.24mm Optimal @BBL A1 0.6 nozzle.json new file mode 100644 index 0000000000..bb67e728ca --- /dev/null +++ b/resources/profiles/BBL/process/0.24mm Optimal @BBL A1 0.6 nozzle.json @@ -0,0 +1,13 @@ +{ + "type": "process", + "name": "0.24mm Optimal @BBL A1 0.6 nozzle", + "inherits": "fdm_process_bbl_0.24_nozzle_0.6", + "from": "system", + "setting_id": "GP089", + "instantiation": "true", + "default_acceleration": "6000", + "travel_speed": "700", + "compatible_printers": [ + "Bambu Lab A1 0.6 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/process/0.28mm Extra Draft @BBL A1.json b/resources/profiles/BBL/process/0.28mm Extra Draft @BBL A1.json new file mode 100644 index 0000000000..0d8b5b700e --- /dev/null +++ b/resources/profiles/BBL/process/0.28mm Extra Draft @BBL A1.json @@ -0,0 +1,13 @@ +{ + "type": "process", + "name": "0.28mm Extra Draft @BBL A1", + "inherits": "fdm_process_bbl_0.28", + "from": "system", + "setting_id": "GP082", + "instantiation": "true", + "default_acceleration": "6000", + "travel_speed": "700", + "compatible_printers": [ + "Bambu Lab A1 0.4 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/process/0.30mm Standard @BBL A1 0.6 nozzle.json b/resources/profiles/BBL/process/0.30mm Standard @BBL A1 0.6 nozzle.json new file mode 100644 index 0000000000..478d4fca2c --- /dev/null +++ b/resources/profiles/BBL/process/0.30mm Standard @BBL A1 0.6 nozzle.json @@ -0,0 +1,13 @@ +{ + "type": "process", + "name": "0.30mm Standard @BBL A1 0.6 nozzle", + "inherits": "fdm_process_bbl_0.30_nozzle_0.6", + "from": "system", + "setting_id": "GP096", + "instantiation": "true", + "default_acceleration": "6000", + "travel_speed": "700", + "compatible_printers": [ + "Bambu Lab A1 0.6 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/process/0.30mm Strength @BBL A1 0.6 nozzle.json b/resources/profiles/BBL/process/0.30mm Strength @BBL A1 0.6 nozzle.json new file mode 100644 index 0000000000..694da6a8c5 --- /dev/null +++ b/resources/profiles/BBL/process/0.30mm Strength @BBL A1 0.6 nozzle.json @@ -0,0 +1,15 @@ +{ + "type": "process", + "name": "0.30mm Strength @BBL A1 0.6 nozzle", + "inherits": "fdm_process_bbl_0.30_nozzle_0.6", + "from": "system", + "setting_id": "GP097", + "instantiation": "true", + "default_acceleration": "6000", + "sparse_infill_density": "25%", + "travel_speed": "700", + "wall_loops": "4", + "compatible_printers": [ + "Bambu Lab A1 0.6 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/process/0.32mm Optimal @BBL A1 0.8 nozzle.json b/resources/profiles/BBL/process/0.32mm Optimal @BBL A1 0.8 nozzle.json new file mode 100644 index 0000000000..90283885e0 --- /dev/null +++ b/resources/profiles/BBL/process/0.32mm Optimal @BBL A1 0.8 nozzle.json @@ -0,0 +1,13 @@ +{ + "type": "process", + "name": "0.32mm Optimal @BBL A1 0.8 nozzle", + "inherits": "fdm_process_bbl_0.32_nozzle_0.8", + "from": "system", + "setting_id": "GP093", + "instantiation": "true", + "default_acceleration": "6000", + "travel_speed": "700", + "compatible_printers": [ + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/process/0.36mm Draft @BBL A1 0.6 nozzle.json b/resources/profiles/BBL/process/0.36mm Draft @BBL A1 0.6 nozzle.json new file mode 100644 index 0000000000..5a105aba64 --- /dev/null +++ b/resources/profiles/BBL/process/0.36mm Draft @BBL A1 0.6 nozzle.json @@ -0,0 +1,13 @@ +{ + "type": "process", + "name": "0.36mm Draft @BBL A1 0.6 nozzle", + "inherits": "fdm_process_bbl_0.36_nozzle_0.6", + "from": "system", + "setting_id": "GP090", + "instantiation": "true", + "default_acceleration": "6000", + "travel_speed": "700", + "compatible_printers": [ + "Bambu Lab A1 0.6 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/process/0.40mm Standard @BBL A1 0.8 nozzle.json b/resources/profiles/BBL/process/0.40mm Standard @BBL A1 0.8 nozzle.json new file mode 100644 index 0000000000..41f09b4e04 --- /dev/null +++ b/resources/profiles/BBL/process/0.40mm Standard @BBL A1 0.8 nozzle.json @@ -0,0 +1,13 @@ +{ + "type": "process", + "name": "0.40mm Standard @BBL A1 0.8 nozzle", + "inherits": "fdm_process_bbl_0.40_nozzle_0.8", + "from": "system", + "setting_id": "GP098", + "instantiation": "true", + "default_acceleration": "6000", + "travel_speed": "700", + "compatible_printers": [ + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/process/0.42mm Extra Draft @BBL A1 0.6 nozzle.json b/resources/profiles/BBL/process/0.42mm Extra Draft @BBL A1 0.6 nozzle.json new file mode 100644 index 0000000000..2c48240ebf --- /dev/null +++ b/resources/profiles/BBL/process/0.42mm Extra Draft @BBL A1 0.6 nozzle.json @@ -0,0 +1,13 @@ +{ + "type": "process", + "name": "0.42mm Extra Draft @BBL A1 0.6 nozzle", + "inherits": "fdm_process_bbl_0.42_nozzle_0.6", + "from": "system", + "setting_id": "GP091", + "instantiation": "true", + "default_acceleration": "6000", + "travel_speed": "700", + "compatible_printers": [ + "Bambu Lab A1 0.6 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/process/0.48mm Draft @BBL A1 0.8 nozzle.json b/resources/profiles/BBL/process/0.48mm Draft @BBL A1 0.8 nozzle.json new file mode 100644 index 0000000000..7e0b589360 --- /dev/null +++ b/resources/profiles/BBL/process/0.48mm Draft @BBL A1 0.8 nozzle.json @@ -0,0 +1,13 @@ +{ + "type": "process", + "name": "0.48mm Draft @BBL A1 0.8 nozzle", + "inherits": "fdm_process_bbl_0.48_nozzle_0.8", + "from": "system", + "setting_id": "GP094", + "instantiation": "true", + "default_acceleration": "6000", + "travel_speed": "700", + "compatible_printers": [ + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/process/0.56mm Extra Draft @BBL A1 0.8 nozzle.json b/resources/profiles/BBL/process/0.56mm Extra Draft @BBL A1 0.8 nozzle.json new file mode 100644 index 0000000000..befd67cb91 --- /dev/null +++ b/resources/profiles/BBL/process/0.56mm Extra Draft @BBL A1 0.8 nozzle.json @@ -0,0 +1,13 @@ +{ + "type": "process", + "name": "0.56mm Extra Draft @BBL A1 0.8 nozzle", + "inherits": "fdm_process_bbl_0.56_nozzle_0.8", + "from": "system", + "setting_id": "GP095", + "instantiation": "true", + "default_acceleration": "6000", + "travel_speed": "700", + "compatible_printers": [ + "Bambu Lab A1 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/BBL/process/fdm_process_bbl_0.32_nozzle_0.8.json b/resources/profiles/BBL/process/fdm_process_bbl_0.32_nozzle_0.8.json index 12320f79f8..0f5913b2eb 100644 --- a/resources/profiles/BBL/process/fdm_process_bbl_0.32_nozzle_0.8.json +++ b/resources/profiles/BBL/process/fdm_process_bbl_0.32_nozzle_0.8.json @@ -5,7 +5,7 @@ "from": "system", "instantiation": "false", "layer_height": "0.32", - "initial_layer_print_height": "0.3", + "initial_layer_print_height": "0.4", "bridge_flow": "1", "line_width": "0.82", "outer_wall_line_width": "0.82", diff --git a/resources/profiles/BIQU/machine/BIQU Hurakan (0.4 nozzle).json b/resources/profiles/BIQU/machine/BIQU Hurakan (0.4 nozzle).json index b0fc7ffb8d..3fb4230123 100644 --- a/resources/profiles/BIQU/machine/BIQU Hurakan (0.4 nozzle).json +++ b/resources/profiles/BIQU/machine/BIQU Hurakan (0.4 nozzle).json @@ -44,8 +44,8 @@ "3000" ], "machine_max_acceleration_z": [ - "100", - "100" + "500", + "500" ], "machine_max_speed_e": [ "60", diff --git a/resources/profiles/BIQU/machine/fdm_biqu_common.json b/resources/profiles/BIQU/machine/fdm_biqu_common.json index 5da04e99c1..ce450400f1 100644 --- a/resources/profiles/BIQU/machine/fdm_biqu_common.json +++ b/resources/profiles/BIQU/machine/fdm_biqu_common.json @@ -30,8 +30,8 @@ "3000" ], "machine_max_acceleration_z": [ - "100", - "100" + "500", + "500" ], "machine_max_speed_e": [ "60", diff --git a/resources/profiles/BIQU/machine/fdm_klipper_common.json b/resources/profiles/BIQU/machine/fdm_klipper_common.json index fce1abfad4..71b1ace660 100644 --- a/resources/profiles/BIQU/machine/fdm_klipper_common.json +++ b/resources/profiles/BIQU/machine/fdm_klipper_common.json @@ -31,8 +31,8 @@ "500" ], "machine_max_acceleration_z": [ - "100", - "100" + "500", + "500" ], "machine_max_speed_e": [ "60", diff --git a/resources/profiles/BIQU/machine/fdm_machine_common.json b/resources/profiles/BIQU/machine/fdm_machine_common.json index 4fc5f26bd7..b088025274 100644 --- a/resources/profiles/BIQU/machine/fdm_machine_common.json +++ b/resources/profiles/BIQU/machine/fdm_machine_common.json @@ -31,7 +31,7 @@ "10000" ], "machine_max_acceleration_z": [ - "100" + "500" ], "machine_max_speed_e": [ "60" diff --git a/resources/profiles/Comgrow/comgrow_t500_buildplate_model.stl b/resources/profiles/Comgrow/comgrow_t500_buildplate_model.stl index 5b9acaf104..de2dfa1b64 100644 --- a/resources/profiles/Comgrow/comgrow_t500_buildplate_model.stl +++ b/resources/profiles/Comgrow/comgrow_t500_buildplate_model.stl @@ -1,2774 +1,4426 @@ -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 +solid ASCII + facet normal -0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -1.919098e+02 -2.550000e+02 -2.000000e+00 + vertex -1.930080e+02 -2.551221e+02 -2.000000e+00 + vertex -2.530000e+02 -2.550000e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -2.530000e+02 -2.550000e+02 -2.000000e+00 + vertex -1.930080e+02 -2.551221e+02 -2.000000e+00 + vertex -1.940525e+02 -2.554824e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -2.530000e+02 -2.550000e+02 -2.000000e+00 + vertex -1.940525e+02 -2.554824e+02 -2.000000e+00 + vertex -1.949923e+02 -2.560632e+02 -2.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -1.949923e+02 -2.560632e+02 -2.000000e+00 + vertex -1.957817e+02 -2.568363e+02 -2.000000e+00 + vertex -2.530000e+02 -2.550000e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -2.530000e+02 -2.550000e+02 -2.000000e+00 + vertex -1.957817e+02 -2.568363e+02 -2.000000e+00 + vertex -1.963820e+02 -2.577639e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -0.000000e+00 -1.000000e+00 + outer loop + vertex -2.530000e+02 -2.550000e+02 -2.000000e+00 + vertex -1.963820e+02 -2.577639e+02 -2.000000e+00 + vertex -2.544721e+02 -2.560557e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -2.544721e+02 -2.560557e+02 -2.000000e+00 + vertex -1.963820e+02 -2.577639e+02 -2.000000e+00 + vertex -2.513820e+02 -2.622361e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -2.513820e+02 -2.622361e+02 -2.000000e+00 + vertex -1.963820e+02 -2.577639e+02 -2.000000e+00 + vertex -1.986180e+02 -2.622361e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -2.513820e+02 -2.622361e+02 -2.000000e+00 + vertex -1.986180e+02 -2.622361e+02 -2.000000e+00 + vertex -2.507817e+02 -2.631637e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -2.507817e+02 -2.631637e+02 -2.000000e+00 + vertex -1.986180e+02 -2.622361e+02 -2.000000e+00 + vertex -1.992183e+02 -2.631637e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -2.507817e+02 -2.631637e+02 -2.000000e+00 + vertex -1.992183e+02 -2.631637e+02 -2.000000e+00 + vertex -2.469098e+02 -2.650000e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -2.469098e+02 -2.650000e+02 -2.000000e+00 + vertex -1.992183e+02 -2.631637e+02 -2.000000e+00 + vertex -2.030902e+02 -2.650000e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -2.030902e+02 -2.650000e+02 -2.000000e+00 + vertex -1.992183e+02 -2.631637e+02 -2.000000e+00 + vertex -2.000077e+02 -2.639368e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -2.030902e+02 -2.650000e+02 -2.000000e+00 + vertex -2.000077e+02 -2.639368e+02 -2.000000e+00 + vertex -2.009475e+02 -2.645176e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -2.009475e+02 -2.645176e+02 -2.000000e+00 + vertex -2.019920e+02 -2.648779e+02 -2.000000e+00 + vertex -2.030902e+02 -2.650000e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -2.480080e+02 -2.648779e+02 -2.000000e+00 + vertex -2.490525e+02 -2.645176e+02 -2.000000e+00 + vertex -2.469098e+02 -2.650000e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -2.469098e+02 -2.650000e+02 -2.000000e+00 + vertex -2.490525e+02 -2.645176e+02 -2.000000e+00 + vertex -2.499923e+02 -2.639368e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -2.469098e+02 -2.650000e+02 -2.000000e+00 + vertex -2.499923e+02 -2.639368e+02 -2.000000e+00 + vertex -2.507817e+02 -2.631637e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -2.544721e+02 -2.560557e+02 -2.000000e+00 + vertex -2.547630e+02 -2.553407e+02 -2.000000e+00 + vertex -2.530000e+02 -2.550000e+02 -2.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -2.530000e+02 -2.550000e+02 -2.000000e+00 + vertex -2.547630e+02 -2.553407e+02 -2.000000e+00 + vertex -2.535176e+02 -2.549319e+02 -2.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -2.535176e+02 -2.549319e+02 -2.000000e+00 + vertex -2.547630e+02 -2.553407e+02 -2.000000e+00 + vertex -2.540000e+02 -2.547321e+02 -2.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -2.540000e+02 -2.547321e+02 -2.000000e+00 + vertex -2.547630e+02 -2.553407e+02 -2.000000e+00 + vertex -2.549404e+02 -2.545893e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -2.540000e+02 -2.547321e+02 -2.000000e+00 + vertex -2.549404e+02 -2.545893e+02 -2.000000e+00 + vertex -2.544142e+02 -2.544142e+02 -2.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -2.544142e+02 -2.544142e+02 -2.000000e+00 + vertex -2.549404e+02 -2.545893e+02 -2.000000e+00 + vertex -2.547321e+02 -2.540000e+02 -2.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -2.547321e+02 -2.540000e+02 -2.000000e+00 + vertex -2.549404e+02 -2.545893e+02 -2.000000e+00 + vertex -2.550000e+02 -2.538197e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -2.547321e+02 -2.540000e+02 -2.000000e+00 + vertex -2.550000e+02 -2.538197e+02 -2.000000e+00 + vertex -2.549319e+02 -2.535176e+02 -2.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -2.549319e+02 -2.535176e+02 -2.000000e+00 + vertex -2.550000e+02 -2.538197e+02 -2.000000e+00 + vertex -2.550000e+02 -2.530000e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 1.919098e+02 -2.550000e+02 -2.000000e+00 + vertex 2.530000e+02 -2.550000e+02 -2.000000e+00 + vertex 1.930080e+02 -2.551221e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 1.930080e+02 -2.551221e+02 -2.000000e+00 + vertex 2.530000e+02 -2.550000e+02 -2.000000e+00 + vertex 1.940525e+02 -2.554824e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 1.940525e+02 -2.554824e+02 -2.000000e+00 + vertex 2.530000e+02 -2.550000e+02 -2.000000e+00 + vertex 1.949923e+02 -2.560632e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 1.949923e+02 -2.560632e+02 -2.000000e+00 + vertex 2.530000e+02 -2.550000e+02 -2.000000e+00 + vertex 1.957817e+02 -2.568363e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 1.957817e+02 -2.568363e+02 -2.000000e+00 + vertex 2.530000e+02 -2.550000e+02 -2.000000e+00 + vertex 1.963820e+02 -2.577639e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 1.963820e+02 -2.577639e+02 -2.000000e+00 + vertex 2.530000e+02 -2.550000e+02 -2.000000e+00 + vertex 2.544721e+02 -2.560557e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 1.963820e+02 -2.577639e+02 -2.000000e+00 + vertex 2.544721e+02 -2.560557e+02 -2.000000e+00 + vertex 2.513820e+02 -2.622361e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 2.544721e+02 -2.560557e+02 -2.000000e+00 + vertex 2.530000e+02 -2.550000e+02 -2.000000e+00 + vertex 2.547630e+02 -2.553407e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 2.547630e+02 -2.553407e+02 -2.000000e+00 + vertex 2.530000e+02 -2.550000e+02 -2.000000e+00 + vertex 2.535176e+02 -2.549319e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 2.547630e+02 -2.553407e+02 -2.000000e+00 + vertex 2.535176e+02 -2.549319e+02 -2.000000e+00 + vertex 2.540000e+02 -2.547321e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 2.547630e+02 -2.553407e+02 -2.000000e+00 + vertex 2.540000e+02 -2.547321e+02 -2.000000e+00 + vertex 2.549404e+02 -2.545893e+02 -2.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 2.549404e+02 -2.545893e+02 -2.000000e+00 + vertex 2.540000e+02 -2.547321e+02 -2.000000e+00 + vertex 2.544142e+02 -2.544142e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 2.549404e+02 -2.545893e+02 -2.000000e+00 + vertex 2.544142e+02 -2.544142e+02 -2.000000e+00 + vertex 2.547321e+02 -2.540000e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 2.549404e+02 -2.545893e+02 -2.000000e+00 + vertex 2.547321e+02 -2.540000e+02 -2.000000e+00 + vertex 2.550000e+02 -2.538197e+02 -2.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 2.550000e+02 -2.538197e+02 -2.000000e+00 + vertex 2.547321e+02 -2.540000e+02 -2.000000e+00 + vertex 2.549319e+02 -2.535176e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 2.550000e+02 -2.538197e+02 -2.000000e+00 + vertex 2.549319e+02 -2.535176e+02 -2.000000e+00 + vertex 2.550000e+02 -2.530000e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 2.507817e+02 -2.631637e+02 -2.000000e+00 + vertex 1.992183e+02 -2.631637e+02 -2.000000e+00 + vertex 2.513820e+02 -2.622361e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 2.513820e+02 -2.622361e+02 -2.000000e+00 + vertex 1.992183e+02 -2.631637e+02 -2.000000e+00 + vertex 1.986180e+02 -2.622361e+02 -2.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 2.513820e+02 -2.622361e+02 -2.000000e+00 + vertex 1.986180e+02 -2.622361e+02 -2.000000e+00 + vertex 1.963820e+02 -2.577639e+02 -2.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 2.499923e+02 -2.639368e+02 -2.000000e+00 + vertex 2.469098e+02 -2.650000e+02 -2.000000e+00 + vertex 2.507817e+02 -2.631637e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 2.507817e+02 -2.631637e+02 -2.000000e+00 + vertex 2.469098e+02 -2.650000e+02 -2.000000e+00 + vertex 2.030902e+02 -2.650000e+02 -2.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 2.507817e+02 -2.631637e+02 -2.000000e+00 + vertex 2.030902e+02 -2.650000e+02 -2.000000e+00 + vertex 1.992183e+02 -2.631637e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 1.992183e+02 -2.631637e+02 -2.000000e+00 + vertex 2.030902e+02 -2.650000e+02 -2.000000e+00 + vertex 2.000077e+02 -2.639368e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 2.000077e+02 -2.639368e+02 -2.000000e+00 + vertex 2.030902e+02 -2.650000e+02 -2.000000e+00 + vertex 2.009475e+02 -2.645176e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 2.009475e+02 -2.645176e+02 -2.000000e+00 + vertex 2.030902e+02 -2.650000e+02 -2.000000e+00 + vertex 2.019920e+02 -2.648779e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 2.499923e+02 -2.639368e+02 -2.000000e+00 + vertex 2.490525e+02 -2.645176e+02 -2.000000e+00 + vertex 2.469098e+02 -2.650000e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 2.469098e+02 -2.650000e+02 -2.000000e+00 + vertex 2.490525e+02 -2.645176e+02 -2.000000e+00 + vertex 2.480080e+02 -2.648779e+02 -2.000000e+00 + endloop + endfacet + facet normal 8.395388e-01 -5.432997e-01 0.000000e+00 + outer loop + vertex 2.513820e+02 -2.622361e+02 -2.000000e+00 + vertex 2.513820e+02 -2.622361e+02 0.000000e+00 + vertex 2.507817e+02 -2.631637e+02 -2.000000e+00 + endloop + endfacet + facet normal 8.395388e-01 -5.432997e-01 0.000000e+00 + outer loop + vertex 2.507817e+02 -2.631637e+02 -2.000000e+00 + vertex 2.513820e+02 -2.622361e+02 0.000000e+00 + vertex 2.507817e+02 -2.631637e+02 0.000000e+00 + endloop + endfacet + facet normal 6.997190e-01 -7.144182e-01 0.000000e+00 + outer loop + vertex 2.507817e+02 -2.631637e+02 -2.000000e+00 + vertex 2.507817e+02 -2.631637e+02 0.000000e+00 + vertex 2.499923e+02 -2.639368e+02 -2.000000e+00 + endloop + endfacet + facet normal 6.997190e-01 -7.144182e-01 0.000000e+00 + outer loop + vertex 2.499923e+02 -2.639368e+02 -2.000000e+00 + vertex 2.507817e+02 -2.631637e+02 0.000000e+00 + vertex 2.499923e+02 -2.639368e+02 0.000000e+00 + endloop + endfacet + facet normal 5.257311e-01 -8.506508e-01 0.000000e+00 + outer loop + vertex 2.499923e+02 -2.639368e+02 -2.000000e+00 + vertex 2.499923e+02 -2.639368e+02 0.000000e+00 + vertex 2.490525e+02 -2.645176e+02 -2.000000e+00 + endloop + endfacet + facet normal 5.257311e-01 -8.506508e-01 0.000000e+00 + outer loop + vertex 2.490525e+02 -2.645176e+02 -2.000000e+00 + vertex 2.499923e+02 -2.639368e+02 0.000000e+00 + vertex 2.490525e+02 -2.645176e+02 0.000000e+00 + endloop + endfacet + facet normal 3.260712e-01 -9.453452e-01 0.000000e+00 + outer loop + vertex 2.490525e+02 -2.645176e+02 -2.000000e+00 + vertex 2.490525e+02 -2.645176e+02 0.000000e+00 + vertex 2.480080e+02 -2.648779e+02 -2.000000e+00 + endloop + endfacet + facet normal 3.260712e-01 -9.453452e-01 0.000000e+00 + outer loop + vertex 2.480080e+02 -2.648779e+02 -2.000000e+00 + vertex 2.490525e+02 -2.645176e+02 0.000000e+00 + vertex 2.480080e+02 -2.648779e+02 0.000000e+00 + endloop + endfacet + facet normal 1.104888e-01 -9.938774e-01 0.000000e+00 + outer loop + vertex 2.480080e+02 -2.648779e+02 -2.000000e+00 + vertex 2.480080e+02 -2.648779e+02 0.000000e+00 + vertex 2.469098e+02 -2.650000e+02 -2.000000e+00 + endloop + endfacet + facet normal 1.104888e-01 -9.938774e-01 0.000000e+00 + outer loop + vertex 2.469098e+02 -2.650000e+02 -2.000000e+00 + vertex 2.480080e+02 -2.648779e+02 0.000000e+00 + vertex 2.469098e+02 -2.650000e+02 0.000000e+00 + endloop + endfacet + facet normal 8.944272e-01 -4.472136e-01 0.000000e+00 + outer loop + vertex 2.513820e+02 -2.622361e+02 -2.000000e+00 + vertex 2.544721e+02 -2.560557e+02 -2.000000e+00 + vertex 2.513820e+02 -2.622361e+02 0.000000e+00 + endloop + endfacet + facet normal 8.944272e-01 -4.472136e-01 0.000000e+00 + outer loop + vertex 2.513820e+02 -2.622361e+02 0.000000e+00 + vertex 2.544721e+02 -2.560557e+02 -2.000000e+00 + vertex 2.544721e+02 -2.560557e+02 0.000000e+00 + endloop + endfacet + facet normal 9.970158e-01 -7.719772e-02 0.000000e+00 + outer loop + vertex 2.550000e+02 -2.538197e+02 -2.000000e+00 + vertex 2.550000e+02 -2.538197e+02 0.000000e+00 + vertex 2.549404e+02 -2.545893e+02 -2.000000e+00 + endloop + endfacet + facet normal 9.970158e-01 -7.719772e-02 -1.416845e-14 + outer loop + vertex 2.549404e+02 -2.545893e+02 -2.000000e+00 + vertex 2.550000e+02 -2.538197e+02 0.000000e+00 + vertex 2.549404e+02 -2.545893e+02 0.000000e+00 + endloop + endfacet + facet normal 9.732490e-01 -2.297529e-01 -1.383070e-14 + outer loop + vertex 2.549404e+02 -2.545893e+02 -2.000000e+00 + vertex 2.549404e+02 -2.545893e+02 0.000000e+00 + vertex 2.547630e+02 -2.553407e+02 0.000000e+00 + endloop + endfacet + facet normal 9.262819e-01 -3.768313e-01 0.000000e+00 + outer loop + vertex 2.544721e+02 -2.560557e+02 0.000000e+00 + vertex 2.544721e+02 -2.560557e+02 -2.000000e+00 + vertex 2.547630e+02 -2.553407e+02 0.000000e+00 + endloop + endfacet + facet normal 9.262819e-01 -3.768313e-01 0.000000e+00 + outer loop + vertex 2.547630e+02 -2.553407e+02 0.000000e+00 + vertex 2.544721e+02 -2.560557e+02 -2.000000e+00 + vertex 2.547630e+02 -2.553407e+02 -2.000000e+00 + endloop + endfacet + facet normal 9.732490e-01 -2.297529e-01 0.000000e+00 + outer loop + vertex 2.547630e+02 -2.553407e+02 0.000000e+00 + vertex 2.547630e+02 -2.553407e+02 -2.000000e+00 + vertex 2.549404e+02 -2.545893e+02 -2.000000e+00 + endloop + endfacet + facet normal -1.104888e-01 -9.938774e-01 0.000000e+00 + outer loop + vertex 2.030902e+02 -2.650000e+02 -2.000000e+00 + vertex 2.030902e+02 -2.650000e+02 0.000000e+00 + vertex 2.019920e+02 -2.648779e+02 -2.000000e+00 + endloop + endfacet + facet normal -1.104888e-01 -9.938774e-01 0.000000e+00 + outer loop + vertex 2.019920e+02 -2.648779e+02 -2.000000e+00 + vertex 2.030902e+02 -2.650000e+02 0.000000e+00 + vertex 2.019920e+02 -2.648779e+02 0.000000e+00 + endloop + endfacet + facet normal -3.260712e-01 -9.453452e-01 0.000000e+00 + outer loop + vertex 2.019920e+02 -2.648779e+02 -2.000000e+00 + vertex 2.019920e+02 -2.648779e+02 0.000000e+00 + vertex 2.009475e+02 -2.645176e+02 -2.000000e+00 + endloop + endfacet + facet normal -3.260712e-01 -9.453452e-01 0.000000e+00 + outer loop + vertex 2.009475e+02 -2.645176e+02 -2.000000e+00 + vertex 2.019920e+02 -2.648779e+02 0.000000e+00 + vertex 2.009475e+02 -2.645176e+02 0.000000e+00 + endloop + endfacet + facet normal -5.257311e-01 -8.506508e-01 0.000000e+00 + outer loop + vertex 2.009475e+02 -2.645176e+02 -2.000000e+00 + vertex 2.009475e+02 -2.645176e+02 0.000000e+00 + vertex 2.000077e+02 -2.639368e+02 -2.000000e+00 + endloop + endfacet + facet normal -5.257311e-01 -8.506508e-01 0.000000e+00 + outer loop + vertex 2.000077e+02 -2.639368e+02 -2.000000e+00 + vertex 2.009475e+02 -2.645176e+02 0.000000e+00 + vertex 2.000077e+02 -2.639368e+02 0.000000e+00 + endloop + endfacet + facet normal -6.997190e-01 -7.144182e-01 0.000000e+00 + outer loop + vertex 2.000077e+02 -2.639368e+02 -2.000000e+00 + vertex 2.000077e+02 -2.639368e+02 0.000000e+00 + vertex 1.992183e+02 -2.631637e+02 -2.000000e+00 + endloop + endfacet + facet normal -6.997190e-01 -7.144182e-01 0.000000e+00 + outer loop + vertex 1.992183e+02 -2.631637e+02 -2.000000e+00 + vertex 2.000077e+02 -2.639368e+02 0.000000e+00 + vertex 1.992183e+02 -2.631637e+02 0.000000e+00 + endloop + endfacet + facet normal -8.395388e-01 -5.432997e-01 0.000000e+00 + outer loop + vertex 1.992183e+02 -2.631637e+02 -2.000000e+00 + vertex 1.992183e+02 -2.631637e+02 0.000000e+00 + vertex 1.986180e+02 -2.622361e+02 -2.000000e+00 + endloop + endfacet + facet normal -8.395388e-01 -5.432997e-01 0.000000e+00 + outer loop + vertex 1.986180e+02 -2.622361e+02 -2.000000e+00 + vertex 1.992183e+02 -2.631637e+02 0.000000e+00 + vertex 1.986180e+02 -2.622361e+02 0.000000e+00 + endloop + endfacet + facet normal -8.944272e-01 -4.472136e-01 -0.000000e+00 + outer loop + vertex 1.986180e+02 -2.622361e+02 0.000000e+00 + vertex 1.963820e+02 -2.577639e+02 0.000000e+00 + vertex 1.986180e+02 -2.622361e+02 -2.000000e+00 + endloop + endfacet + facet normal -8.944272e-01 -4.472136e-01 0.000000e+00 + outer loop + vertex 1.986180e+02 -2.622361e+02 -2.000000e+00 + vertex 1.963820e+02 -2.577639e+02 0.000000e+00 + vertex 1.963820e+02 -2.577639e+02 -2.000000e+00 + endloop + endfacet + facet normal -1.104888e-01 -9.938774e-01 -0.000000e+00 + outer loop + vertex 1.919098e+02 -2.550000e+02 0.000000e+00 + vertex 1.919098e+02 -2.550000e+02 -2.000000e+00 + vertex 1.930080e+02 -2.551221e+02 0.000000e+00 + endloop + endfacet + facet normal -1.104888e-01 -9.938774e-01 -0.000000e+00 + outer loop + vertex 1.930080e+02 -2.551221e+02 0.000000e+00 + vertex 1.919098e+02 -2.550000e+02 -2.000000e+00 + vertex 1.930080e+02 -2.551221e+02 -2.000000e+00 + endloop + endfacet + facet normal -3.260712e-01 -9.453452e-01 -0.000000e+00 + outer loop + vertex 1.930080e+02 -2.551221e+02 0.000000e+00 + vertex 1.930080e+02 -2.551221e+02 -2.000000e+00 + vertex 1.940525e+02 -2.554824e+02 0.000000e+00 + endloop + endfacet + facet normal -3.260712e-01 -9.453452e-01 -0.000000e+00 + outer loop + vertex 1.940525e+02 -2.554824e+02 0.000000e+00 + vertex 1.930080e+02 -2.551221e+02 -2.000000e+00 + vertex 1.940525e+02 -2.554824e+02 -2.000000e+00 + endloop + endfacet + facet normal -5.257311e-01 -8.506508e-01 -0.000000e+00 + outer loop + vertex 1.940525e+02 -2.554824e+02 0.000000e+00 + vertex 1.940525e+02 -2.554824e+02 -2.000000e+00 + vertex 1.949923e+02 -2.560632e+02 0.000000e+00 + endloop + endfacet + facet normal -5.257311e-01 -8.506508e-01 -0.000000e+00 + outer loop + vertex 1.949923e+02 -2.560632e+02 0.000000e+00 + vertex 1.940525e+02 -2.554824e+02 -2.000000e+00 + vertex 1.949923e+02 -2.560632e+02 -2.000000e+00 + endloop + endfacet + facet normal -6.997190e-01 -7.144182e-01 -0.000000e+00 + outer loop + vertex 1.949923e+02 -2.560632e+02 0.000000e+00 + vertex 1.949923e+02 -2.560632e+02 -2.000000e+00 + vertex 1.957817e+02 -2.568363e+02 0.000000e+00 + endloop + endfacet + facet normal -6.997190e-01 -7.144182e-01 -0.000000e+00 + outer loop + vertex 1.957817e+02 -2.568363e+02 0.000000e+00 + vertex 1.949923e+02 -2.560632e+02 -2.000000e+00 + vertex 1.957817e+02 -2.568363e+02 -2.000000e+00 + endloop + endfacet + facet normal -8.395388e-01 -5.432997e-01 -0.000000e+00 + outer loop + vertex 1.957817e+02 -2.568363e+02 0.000000e+00 + vertex 1.957817e+02 -2.568363e+02 -2.000000e+00 + vertex 1.963820e+02 -2.577639e+02 0.000000e+00 + endloop + endfacet + facet normal -8.395388e-01 -5.432997e-01 -0.000000e+00 + outer loop + vertex 1.963820e+02 -2.577639e+02 0.000000e+00 + vertex 1.957817e+02 -2.568363e+02 -2.000000e+00 + vertex 1.963820e+02 -2.577639e+02 -2.000000e+00 + endloop + endfacet + facet normal 8.395388e-01 -5.432997e-01 0.000000e+00 + outer loop + vertex -1.963820e+02 -2.577639e+02 0.000000e+00 + vertex -1.963820e+02 -2.577639e+02 -2.000000e+00 + vertex -1.957817e+02 -2.568363e+02 0.000000e+00 + endloop + endfacet + facet normal 8.395388e-01 -5.432997e-01 0.000000e+00 + outer loop + vertex -1.957817e+02 -2.568363e+02 0.000000e+00 + vertex -1.963820e+02 -2.577639e+02 -2.000000e+00 + vertex -1.957817e+02 -2.568363e+02 -2.000000e+00 + endloop + endfacet + facet normal 6.997190e-01 -7.144182e-01 0.000000e+00 + outer loop + vertex -1.957817e+02 -2.568363e+02 0.000000e+00 + vertex -1.957817e+02 -2.568363e+02 -2.000000e+00 + vertex -1.949923e+02 -2.560632e+02 0.000000e+00 + endloop + endfacet + facet normal 6.997190e-01 -7.144182e-01 0.000000e+00 + outer loop + vertex -1.949923e+02 -2.560632e+02 0.000000e+00 + vertex -1.957817e+02 -2.568363e+02 -2.000000e+00 + vertex -1.949923e+02 -2.560632e+02 -2.000000e+00 + endloop + endfacet + facet normal 5.257311e-01 -8.506508e-01 0.000000e+00 + outer loop + vertex -1.949923e+02 -2.560632e+02 0.000000e+00 + vertex -1.949923e+02 -2.560632e+02 -2.000000e+00 + vertex -1.940525e+02 -2.554824e+02 0.000000e+00 + endloop + endfacet + facet normal 5.257311e-01 -8.506508e-01 0.000000e+00 + outer loop + vertex -1.940525e+02 -2.554824e+02 0.000000e+00 + vertex -1.949923e+02 -2.560632e+02 -2.000000e+00 + vertex -1.940525e+02 -2.554824e+02 -2.000000e+00 + endloop + endfacet + facet normal 3.260712e-01 -9.453452e-01 0.000000e+00 + outer loop + vertex -1.940525e+02 -2.554824e+02 0.000000e+00 + vertex -1.940525e+02 -2.554824e+02 -2.000000e+00 + vertex -1.930080e+02 -2.551221e+02 0.000000e+00 + endloop + endfacet + facet normal 3.260712e-01 -9.453452e-01 0.000000e+00 + outer loop + vertex -1.930080e+02 -2.551221e+02 0.000000e+00 + vertex -1.940525e+02 -2.554824e+02 -2.000000e+00 + vertex -1.930080e+02 -2.551221e+02 -2.000000e+00 + endloop + endfacet + facet normal 1.104888e-01 -9.938774e-01 0.000000e+00 + outer loop + vertex -1.930080e+02 -2.551221e+02 0.000000e+00 + vertex -1.930080e+02 -2.551221e+02 -2.000000e+00 + vertex -1.919098e+02 -2.550000e+02 0.000000e+00 + endloop + endfacet + facet normal 1.104888e-01 -9.938774e-01 0.000000e+00 + outer loop + vertex -1.919098e+02 -2.550000e+02 0.000000e+00 + vertex -1.930080e+02 -2.551221e+02 -2.000000e+00 + vertex -1.919098e+02 -2.550000e+02 -2.000000e+00 + endloop + endfacet + facet normal 8.395388e-01 -5.432997e-01 0.000000e+00 + outer loop + vertex -1.986180e+02 -2.622361e+02 -2.000000e+00 + vertex -1.986180e+02 -2.622361e+02 0.000000e+00 + vertex -1.992183e+02 -2.631637e+02 -2.000000e+00 + endloop + endfacet + facet normal 8.395388e-01 -5.432997e-01 0.000000e+00 + outer loop + vertex -1.992183e+02 -2.631637e+02 -2.000000e+00 + vertex -1.986180e+02 -2.622361e+02 0.000000e+00 + vertex -1.992183e+02 -2.631637e+02 0.000000e+00 + endloop + endfacet + facet normal 6.997190e-01 -7.144182e-01 0.000000e+00 + outer loop + vertex -1.992183e+02 -2.631637e+02 -2.000000e+00 + vertex -1.992183e+02 -2.631637e+02 0.000000e+00 + vertex -2.000077e+02 -2.639368e+02 -2.000000e+00 + endloop + endfacet + facet normal 6.997190e-01 -7.144182e-01 0.000000e+00 + outer loop + vertex -2.000077e+02 -2.639368e+02 -2.000000e+00 + vertex -1.992183e+02 -2.631637e+02 0.000000e+00 + vertex -2.000077e+02 -2.639368e+02 0.000000e+00 + endloop + endfacet + facet normal 5.257311e-01 -8.506508e-01 0.000000e+00 + outer loop + vertex -2.000077e+02 -2.639368e+02 -2.000000e+00 + vertex -2.000077e+02 -2.639368e+02 0.000000e+00 + vertex -2.009475e+02 -2.645176e+02 -2.000000e+00 + endloop + endfacet + facet normal 5.257311e-01 -8.506508e-01 0.000000e+00 + outer loop + vertex -2.009475e+02 -2.645176e+02 -2.000000e+00 + vertex -2.000077e+02 -2.639368e+02 0.000000e+00 + vertex -2.009475e+02 -2.645176e+02 0.000000e+00 + endloop + endfacet + facet normal 3.260712e-01 -9.453452e-01 0.000000e+00 + outer loop + vertex -2.009475e+02 -2.645176e+02 -2.000000e+00 + vertex -2.009475e+02 -2.645176e+02 0.000000e+00 + vertex -2.019920e+02 -2.648779e+02 -2.000000e+00 + endloop + endfacet + facet normal 3.260712e-01 -9.453452e-01 0.000000e+00 + outer loop + vertex -2.019920e+02 -2.648779e+02 -2.000000e+00 + vertex -2.009475e+02 -2.645176e+02 0.000000e+00 + vertex -2.019920e+02 -2.648779e+02 0.000000e+00 + endloop + endfacet + facet normal 1.104888e-01 -9.938774e-01 0.000000e+00 + outer loop + vertex -2.019920e+02 -2.648779e+02 -2.000000e+00 + vertex -2.019920e+02 -2.648779e+02 0.000000e+00 + vertex -2.030902e+02 -2.650000e+02 -2.000000e+00 + endloop + endfacet + facet normal 1.104888e-01 -9.938774e-01 0.000000e+00 + outer loop + vertex -2.030902e+02 -2.650000e+02 -2.000000e+00 + vertex -2.019920e+02 -2.648779e+02 0.000000e+00 + vertex -2.030902e+02 -2.650000e+02 0.000000e+00 + endloop + endfacet + facet normal 8.944272e-01 -4.472136e-01 0.000000e+00 + outer loop + vertex -1.963820e+02 -2.577639e+02 0.000000e+00 + vertex -1.986180e+02 -2.622361e+02 0.000000e+00 + vertex -1.963820e+02 -2.577639e+02 -2.000000e+00 + endloop + endfacet + facet normal 8.944272e-01 -4.472136e-01 0.000000e+00 + outer loop + vertex -1.963820e+02 -2.577639e+02 -2.000000e+00 + vertex -1.986180e+02 -2.622361e+02 0.000000e+00 + vertex -1.986180e+02 -2.622361e+02 -2.000000e+00 + endloop + endfacet + facet normal -9.262819e-01 -3.768313e-01 0.000000e+00 + outer loop + vertex -2.544721e+02 -2.560557e+02 -2.000000e+00 + vertex -2.544721e+02 -2.560557e+02 0.000000e+00 + vertex -2.547630e+02 -2.553407e+02 -2.000000e+00 + endloop + endfacet + facet normal -9.262819e-01 -3.768313e-01 0.000000e+00 + outer loop + vertex -2.547630e+02 -2.553407e+02 -2.000000e+00 + vertex -2.544721e+02 -2.560557e+02 0.000000e+00 + vertex -2.547630e+02 -2.553407e+02 0.000000e+00 + endloop + endfacet + facet normal -9.732490e-01 -2.297529e-01 0.000000e+00 + outer loop + vertex -2.547630e+02 -2.553407e+02 -2.000000e+00 + vertex -2.547630e+02 -2.553407e+02 0.000000e+00 + vertex -2.549404e+02 -2.545893e+02 0.000000e+00 + endloop + endfacet + facet normal -9.970158e-01 -7.719772e-02 -0.000000e+00 + outer loop + vertex -2.550000e+02 -2.538197e+02 0.000000e+00 + vertex -2.550000e+02 -2.538197e+02 -2.000000e+00 + vertex -2.549404e+02 -2.545893e+02 0.000000e+00 + endloop + endfacet + facet normal -9.970158e-01 -7.719772e-02 -0.000000e+00 + outer loop + vertex -2.549404e+02 -2.545893e+02 0.000000e+00 + vertex -2.550000e+02 -2.538197e+02 -2.000000e+00 + vertex -2.549404e+02 -2.545893e+02 -2.000000e+00 + endloop + endfacet + facet normal -9.732490e-01 -2.297529e-01 -0.000000e+00 + outer loop + vertex -2.549404e+02 -2.545893e+02 0.000000e+00 + vertex -2.549404e+02 -2.545893e+02 -2.000000e+00 + vertex -2.547630e+02 -2.553407e+02 -2.000000e+00 + endloop + endfacet + facet normal -8.944272e-01 -4.472136e-01 0.000000e+00 + outer loop + vertex -2.544721e+02 -2.560557e+02 -2.000000e+00 + vertex -2.513820e+02 -2.622361e+02 -2.000000e+00 + vertex -2.544721e+02 -2.560557e+02 0.000000e+00 + endloop + endfacet + facet normal -8.944272e-01 -4.472136e-01 0.000000e+00 + outer loop + vertex -2.544721e+02 -2.560557e+02 0.000000e+00 + vertex -2.513820e+02 -2.622361e+02 -2.000000e+00 + vertex -2.513820e+02 -2.622361e+02 0.000000e+00 + endloop + endfacet + facet normal -1.104888e-01 -9.938774e-01 0.000000e+00 + outer loop + vertex -2.469098e+02 -2.650000e+02 -2.000000e+00 + vertex -2.469098e+02 -2.650000e+02 0.000000e+00 + vertex -2.480080e+02 -2.648779e+02 -2.000000e+00 + endloop + endfacet + facet normal -1.104888e-01 -9.938774e-01 0.000000e+00 + outer loop + vertex -2.480080e+02 -2.648779e+02 -2.000000e+00 + vertex -2.469098e+02 -2.650000e+02 0.000000e+00 + vertex -2.480080e+02 -2.648779e+02 0.000000e+00 + endloop + endfacet + facet normal -3.260712e-01 -9.453452e-01 0.000000e+00 + outer loop + vertex -2.480080e+02 -2.648779e+02 -2.000000e+00 + vertex -2.480080e+02 -2.648779e+02 0.000000e+00 + vertex -2.490525e+02 -2.645176e+02 -2.000000e+00 + endloop + endfacet + facet normal -3.260712e-01 -9.453452e-01 0.000000e+00 + outer loop + vertex -2.490525e+02 -2.645176e+02 -2.000000e+00 + vertex -2.480080e+02 -2.648779e+02 0.000000e+00 + vertex -2.490525e+02 -2.645176e+02 0.000000e+00 + endloop + endfacet + facet normal -5.257311e-01 -8.506508e-01 0.000000e+00 + outer loop + vertex -2.490525e+02 -2.645176e+02 -2.000000e+00 + vertex -2.490525e+02 -2.645176e+02 0.000000e+00 + vertex -2.499923e+02 -2.639368e+02 -2.000000e+00 + endloop + endfacet + facet normal -5.257311e-01 -8.506508e-01 0.000000e+00 + outer loop + vertex -2.499923e+02 -2.639368e+02 -2.000000e+00 + vertex -2.490525e+02 -2.645176e+02 0.000000e+00 + vertex -2.499923e+02 -2.639368e+02 0.000000e+00 + endloop + endfacet + facet normal -6.997190e-01 -7.144182e-01 0.000000e+00 + outer loop + vertex -2.499923e+02 -2.639368e+02 -2.000000e+00 + vertex -2.499923e+02 -2.639368e+02 0.000000e+00 + vertex -2.507817e+02 -2.631637e+02 -2.000000e+00 + endloop + endfacet + facet normal -6.997190e-01 -7.144182e-01 0.000000e+00 + outer loop + vertex -2.507817e+02 -2.631637e+02 -2.000000e+00 + vertex -2.499923e+02 -2.639368e+02 0.000000e+00 + vertex -2.507817e+02 -2.631637e+02 0.000000e+00 + endloop + endfacet + facet normal -8.395388e-01 -5.432997e-01 0.000000e+00 + outer loop + vertex -2.507817e+02 -2.631637e+02 -2.000000e+00 + vertex -2.507817e+02 -2.631637e+02 0.000000e+00 + vertex -2.513820e+02 -2.622361e+02 -2.000000e+00 + endloop + endfacet + facet normal -8.395388e-01 -5.432997e-01 0.000000e+00 + outer loop + vertex -2.513820e+02 -2.622361e+02 -2.000000e+00 + vertex -2.507817e+02 -2.631637e+02 0.000000e+00 + vertex -2.513820e+02 -2.622361e+02 0.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 -1.000000e+00 -0.000000e+00 + outer loop + vertex -2.030902e+02 -2.650000e+02 0.000000e+00 + vertex -2.469098e+02 -2.650000e+02 0.000000e+00 + vertex -2.030902e+02 -2.650000e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -1.000000e+00 0.000000e+00 + outer loop + vertex -2.030902e+02 -2.650000e+02 -2.000000e+00 + vertex -2.469098e+02 -2.650000e+02 0.000000e+00 + vertex -2.469098e+02 -2.650000e+02 -2.000000e+00 + endloop + endfacet + facet normal 9.396926e-01 3.420201e-01 -0.000000e+00 + outer loop + vertex 1.321177e+02 2.593714e+02 -2.000000e+00 + vertex 1.300691e+02 2.650000e+02 -2.000000e+00 + vertex 1.321177e+02 2.593714e+02 0.000000e+00 + endloop + endfacet + facet normal 9.396926e-01 3.420201e-01 0.000000e+00 + outer loop + vertex 1.321177e+02 2.593714e+02 0.000000e+00 + vertex 1.300691e+02 2.650000e+02 -2.000000e+00 + vertex 1.300691e+02 2.650000e+02 0.000000e+00 + endloop + endfacet + facet normal -9.434211e-01 3.315971e-01 0.000000e+00 + outer loop + vertex 1.378823e+02 2.593714e+02 0.000000e+00 + vertex 1.378823e+02 2.593714e+02 -2.000000e+00 + vertex 1.376417e+02 2.586870e+02 0.000000e+00 + endloop + endfacet + facet normal -9.434211e-01 3.315971e-01 0.000000e+00 + outer loop + vertex 1.376417e+02 2.586870e+02 0.000000e+00 + vertex 1.378823e+02 2.593714e+02 -2.000000e+00 + vertex 1.376417e+02 2.586870e+02 -2.000000e+00 + endloop + endfacet + facet normal -8.339572e-01 5.518292e-01 0.000000e+00 + outer loop + vertex 1.376417e+02 2.586870e+02 0.000000e+00 + vertex 1.376417e+02 2.586870e+02 -2.000000e+00 + vertex 1.372413e+02 2.580819e+02 0.000000e+00 + endloop + endfacet + facet normal -8.339572e-01 5.518292e-01 0.000000e+00 + outer loop + vertex 1.372413e+02 2.580819e+02 0.000000e+00 + vertex 1.376417e+02 2.586870e+02 -2.000000e+00 + vertex 1.372413e+02 2.580819e+02 -2.000000e+00 + endloop + endfacet + facet normal -6.740517e-01 7.386842e-01 0.000000e+00 + outer loop + vertex 1.372413e+02 2.580819e+02 0.000000e+00 + vertex 1.372413e+02 2.580819e+02 -2.000000e+00 + vertex 1.367054e+02 2.575929e+02 0.000000e+00 + endloop + endfacet + facet normal -6.740517e-01 7.386842e-01 0.000000e+00 + outer loop + vertex 1.367054e+02 2.575929e+02 0.000000e+00 + vertex 1.372413e+02 2.580819e+02 -2.000000e+00 + vertex 1.367054e+02 2.575929e+02 -2.000000e+00 + endloop + endfacet + facet normal -4.733766e-01 8.808601e-01 0.000000e+00 + outer loop + vertex 1.367054e+02 2.575929e+02 0.000000e+00 + vertex 1.367054e+02 2.575929e+02 -2.000000e+00 + vertex 1.360663e+02 2.572495e+02 0.000000e+00 + endloop + endfacet + facet normal -4.733766e-01 8.808601e-01 0.000000e+00 + outer loop + vertex 1.360663e+02 2.572495e+02 0.000000e+00 + vertex 1.367054e+02 2.575929e+02 -2.000000e+00 + vertex 1.360663e+02 2.572495e+02 -2.000000e+00 + endloop + endfacet + facet normal -2.440695e-01 9.697577e-01 0.000000e+00 + outer loop + vertex 1.360663e+02 2.572495e+02 0.000000e+00 + vertex 1.360663e+02 2.572495e+02 -2.000000e+00 + vertex 1.353628e+02 2.570724e+02 0.000000e+00 + endloop + endfacet + facet normal -2.440695e-01 9.697577e-01 0.000000e+00 + outer loop + vertex 1.353628e+02 2.570724e+02 0.000000e+00 + vertex 1.360663e+02 2.572495e+02 -2.000000e+00 + vertex 1.353628e+02 2.570724e+02 -2.000000e+00 + endloop + endfacet + facet normal -1.566989e-13 1.000000e+00 0.000000e+00 + outer loop + vertex 1.353628e+02 2.570724e+02 0.000000e+00 + vertex 1.353628e+02 2.570724e+02 -2.000000e+00 + vertex 1.346372e+02 2.570724e+02 0.000000e+00 + endloop + endfacet + facet normal -1.566989e-13 1.000000e+00 0.000000e+00 + outer loop + vertex 1.346372e+02 2.570724e+02 0.000000e+00 + vertex 1.353628e+02 2.570724e+02 -2.000000e+00 + vertex 1.346372e+02 2.570724e+02 -2.000000e+00 + endloop + endfacet + facet normal 2.440695e-01 9.697577e-01 0.000000e+00 + outer loop + vertex 1.346372e+02 2.570724e+02 0.000000e+00 + vertex 1.346372e+02 2.570724e+02 -2.000000e+00 + vertex 1.339337e+02 2.572495e+02 0.000000e+00 + endloop + endfacet + facet normal 2.440695e-01 9.697577e-01 0.000000e+00 + outer loop + vertex 1.339337e+02 2.572495e+02 0.000000e+00 + vertex 1.346372e+02 2.570724e+02 -2.000000e+00 + vertex 1.339337e+02 2.572495e+02 -2.000000e+00 + endloop + endfacet + facet normal 4.733766e-01 8.808601e-01 0.000000e+00 + outer loop + vertex 1.339337e+02 2.572495e+02 0.000000e+00 + vertex 1.339337e+02 2.572495e+02 -2.000000e+00 + vertex 1.332946e+02 2.575929e+02 0.000000e+00 + endloop + endfacet + facet normal 4.733766e-01 8.808601e-01 0.000000e+00 + outer loop + vertex 1.332946e+02 2.575929e+02 0.000000e+00 + vertex 1.339337e+02 2.572495e+02 -2.000000e+00 + vertex 1.332946e+02 2.575929e+02 -2.000000e+00 + endloop + endfacet + facet normal 6.740517e-01 7.386842e-01 0.000000e+00 + outer loop + vertex 1.332946e+02 2.575929e+02 0.000000e+00 + vertex 1.332946e+02 2.575929e+02 -2.000000e+00 + vertex 1.327587e+02 2.580819e+02 0.000000e+00 + endloop + endfacet + facet normal 6.740517e-01 7.386842e-01 0.000000e+00 + outer loop + vertex 1.327587e+02 2.580819e+02 0.000000e+00 + vertex 1.332946e+02 2.575929e+02 -2.000000e+00 + vertex 1.327587e+02 2.580819e+02 -2.000000e+00 + endloop + endfacet + facet normal 8.339572e-01 5.518292e-01 0.000000e+00 + outer loop + vertex 1.327587e+02 2.580819e+02 0.000000e+00 + vertex 1.327587e+02 2.580819e+02 -2.000000e+00 + vertex 1.323583e+02 2.586870e+02 0.000000e+00 + endloop + endfacet + facet normal 8.339572e-01 5.518292e-01 0.000000e+00 + outer loop + vertex 1.323583e+02 2.586870e+02 0.000000e+00 + vertex 1.327587e+02 2.580819e+02 -2.000000e+00 + vertex 1.323583e+02 2.586870e+02 -2.000000e+00 + endloop + endfacet + facet normal 9.434211e-01 3.315971e-01 0.000000e+00 + outer loop + vertex 1.323583e+02 2.586870e+02 0.000000e+00 + vertex 1.323583e+02 2.586870e+02 -2.000000e+00 + vertex 1.321177e+02 2.593714e+02 0.000000e+00 + endloop + endfacet + facet normal 9.434211e-01 3.315971e-01 0.000000e+00 + outer loop + vertex 1.321177e+02 2.593714e+02 0.000000e+00 + vertex 1.323583e+02 2.586870e+02 -2.000000e+00 + vertex 1.321177e+02 2.593714e+02 -2.000000e+00 + endloop + endfacet + facet normal -9.396926e-01 3.420201e-01 0.000000e+00 + outer loop + vertex 1.399309e+02 2.650000e+02 -2.000000e+00 + vertex 1.378823e+02 2.593714e+02 -2.000000e+00 + vertex 1.399309e+02 2.650000e+02 0.000000e+00 + endloop + endfacet + facet normal -9.396926e-01 3.420201e-01 0.000000e+00 + outer loop + vertex 1.399309e+02 2.650000e+02 0.000000e+00 + vertex 1.378823e+02 2.593714e+02 -2.000000e+00 + vertex 1.378823e+02 2.593714e+02 0.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 -1.000000e+00 -0.000000e+00 + outer loop + vertex 2.469098e+02 -2.650000e+02 0.000000e+00 + vertex 2.030902e+02 -2.650000e+02 0.000000e+00 + vertex 2.469098e+02 -2.650000e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -1.000000e+00 0.000000e+00 + outer loop + vertex 2.469098e+02 -2.650000e+02 -2.000000e+00 + vertex 2.030902e+02 -2.650000e+02 0.000000e+00 + vertex 2.030902e+02 -2.650000e+02 -2.000000e+00 + endloop + endfacet + facet normal 9.396926e-01 3.420201e-01 -1.335384e-14 + outer loop + vertex -1.378128e+02 2.591109e+02 -2.000000e+00 + vertex -1.399563e+02 2.650000e+02 -2.000000e+00 + vertex -1.378128e+02 2.591109e+02 0.000000e+00 + endloop + endfacet + facet normal 9.396926e-01 3.420201e-01 1.332176e-14 + outer loop + vertex -1.378128e+02 2.591109e+02 0.000000e+00 + vertex -1.399563e+02 2.650000e+02 -2.000000e+00 + vertex -1.399563e+02 2.650000e+02 0.000000e+00 + endloop + endfacet + facet normal -8.990516e-01 4.378427e-01 0.000000e+00 + outer loop + vertex -1.322071e+02 2.590502e+02 0.000000e+00 + vertex -1.322071e+02 2.590502e+02 -2.000000e+00 + vertex -1.325301e+02 2.583868e+02 0.000000e+00 + endloop + endfacet + facet normal -8.990516e-01 4.378427e-01 0.000000e+00 + outer loop + vertex -1.325301e+02 2.583868e+02 0.000000e+00 + vertex -1.322071e+02 2.590502e+02 -2.000000e+00 + vertex -1.325301e+02 2.583868e+02 -2.000000e+00 + endloop + endfacet + facet normal -7.622860e-01 6.472404e-01 0.000000e+00 + outer loop + vertex -1.325301e+02 2.583868e+02 0.000000e+00 + vertex -1.325301e+02 2.583868e+02 -2.000000e+00 + vertex -1.330077e+02 2.578244e+02 0.000000e+00 + endloop + endfacet + facet normal -7.622860e-01 6.472404e-01 -1.083273e-14 + outer loop + vertex -1.330077e+02 2.578244e+02 0.000000e+00 + vertex -1.325301e+02 2.583868e+02 -2.000000e+00 + vertex -1.330077e+02 2.578244e+02 -2.000000e+00 + endloop + endfacet + facet normal -5.778376e-01 8.161518e-01 -8.211566e-15 + outer loop + vertex -1.330077e+02 2.578244e+02 0.000000e+00 + vertex -1.330077e+02 2.578244e+02 -2.000000e+00 + vertex -1.336098e+02 2.573981e+02 0.000000e+00 + endloop + endfacet + facet normal -5.778376e-01 8.161518e-01 2.319643e-14 + outer loop + vertex -1.336098e+02 2.573981e+02 0.000000e+00 + vertex -1.330077e+02 2.578244e+02 -2.000000e+00 + vertex -1.336098e+02 2.573981e+02 -2.000000e+00 + endloop + endfacet + facet normal -3.572442e-01 9.340110e-01 2.654619e-14 + outer loop + vertex -1.336098e+02 2.573981e+02 0.000000e+00 + vertex -1.336098e+02 2.573981e+02 -2.000000e+00 + vertex -1.342990e+02 2.571345e+02 0.000000e+00 + endloop + endfacet + facet normal -3.572442e-01 9.340110e-01 0.000000e+00 + outer loop + vertex -1.342990e+02 2.571345e+02 0.000000e+00 + vertex -1.336098e+02 2.573981e+02 -2.000000e+00 + vertex -1.342990e+02 2.571345e+02 -2.000000e+00 + endloop + endfacet + facet normal -1.143044e-01 9.934458e-01 0.000000e+00 + outer loop + vertex -1.342990e+02 2.571345e+02 0.000000e+00 + vertex -1.342990e+02 2.571345e+02 -2.000000e+00 + vertex -1.350319e+02 2.570502e+02 0.000000e+00 + endloop + endfacet + facet normal -1.143044e-01 9.934458e-01 0.000000e+00 + outer loop + vertex -1.350319e+02 2.570502e+02 0.000000e+00 + vertex -1.342990e+02 2.571345e+02 -2.000000e+00 + vertex -1.350319e+02 2.570502e+02 -2.000000e+00 + endloop + endfacet + facet normal 1.357854e-01 9.907383e-01 0.000000e+00 + outer loop + vertex -1.350319e+02 2.570502e+02 0.000000e+00 + vertex -1.350319e+02 2.570502e+02 -2.000000e+00 + vertex -1.357629e+02 2.571504e+02 0.000000e+00 + endloop + endfacet + facet normal 1.357854e-01 9.907383e-01 0.000000e+00 + outer loop + vertex -1.357629e+02 2.571504e+02 0.000000e+00 + vertex -1.350319e+02 2.570502e+02 -2.000000e+00 + vertex -1.357629e+02 2.571504e+02 -2.000000e+00 + endloop + endfacet + facet normal 3.773816e-01 9.260579e-01 0.000000e+00 + outer loop + vertex -1.357629e+02 2.571504e+02 0.000000e+00 + vertex -1.357629e+02 2.571504e+02 -2.000000e+00 + vertex -1.364462e+02 2.574288e+02 0.000000e+00 + endloop + endfacet + facet normal 3.773816e-01 9.260579e-01 0.000000e+00 + outer loop + vertex -1.364462e+02 2.574288e+02 0.000000e+00 + vertex -1.357629e+02 2.571504e+02 -2.000000e+00 + vertex -1.364462e+02 2.574288e+02 -2.000000e+00 + endloop + endfacet + facet normal 5.953716e-01 8.034504e-01 0.000000e+00 + outer loop + vertex -1.364462e+02 2.574288e+02 0.000000e+00 + vertex -1.364462e+02 2.574288e+02 -2.000000e+00 + vertex -1.370390e+02 2.578681e+02 0.000000e+00 + endloop + endfacet + facet normal 5.953716e-01 8.034504e-01 0.000000e+00 + outer loop + vertex -1.370390e+02 2.578681e+02 0.000000e+00 + vertex -1.364462e+02 2.574288e+02 -2.000000e+00 + vertex -1.370390e+02 2.578681e+02 -2.000000e+00 + endloop + endfacet + facet normal 7.761199e-01 6.305854e-01 0.000000e+00 + outer loop + vertex -1.370390e+02 2.578681e+02 0.000000e+00 + vertex -1.370390e+02 2.578681e+02 -2.000000e+00 + vertex -1.375042e+02 2.584407e+02 0.000000e+00 + endloop + endfacet + facet normal 7.761199e-01 6.305854e-01 0.000000e+00 + outer loop + vertex -1.375042e+02 2.584407e+02 0.000000e+00 + vertex -1.370390e+02 2.578681e+02 -2.000000e+00 + vertex -1.375042e+02 2.584407e+02 -2.000000e+00 + endloop + endfacet + facet normal 9.083201e-01 4.182758e-01 0.000000e+00 + outer loop + vertex -1.375042e+02 2.584407e+02 0.000000e+00 + vertex -1.375042e+02 2.584407e+02 -2.000000e+00 + vertex -1.378128e+02 2.591109e+02 0.000000e+00 + endloop + endfacet + facet normal 9.083201e-01 4.182758e-01 -1.290800e-14 + outer loop + vertex -1.378128e+02 2.591109e+02 0.000000e+00 + vertex -1.375042e+02 2.584407e+02 -2.000000e+00 + vertex -1.378128e+02 2.591109e+02 -2.000000e+00 + endloop + endfacet + facet normal -9.396926e-01 3.420201e-01 -1.335384e-14 + outer loop + vertex -1.300415e+02 2.650000e+02 -2.000000e+00 + vertex -1.322071e+02 2.590502e+02 -2.000000e+00 + vertex -1.300415e+02 2.650000e+02 0.000000e+00 + endloop + endfacet + facet normal -9.396926e-01 3.420201e-01 0.000000e+00 + outer loop + vertex -1.300415e+02 2.650000e+02 0.000000e+00 + vertex -1.322071e+02 2.590502e+02 -2.000000e+00 + vertex -1.322071e+02 2.590502e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -0.000000e+00 1.000000e+00 + outer loop + vertex 2.480080e+02 -2.648779e+02 0.000000e+00 + vertex 2.513820e+02 -2.622361e+02 0.000000e+00 + vertex 2.469098e+02 -2.650000e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 2.469098e+02 -2.650000e+02 0.000000e+00 + vertex 2.513820e+02 -2.622361e+02 0.000000e+00 + vertex 2.544721e+02 -2.560557e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 2.469098e+02 -2.650000e+02 0.000000e+00 + vertex 2.544721e+02 -2.560557e+02 0.000000e+00 + vertex 2.550000e+02 -2.538197e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 2.550000e+02 -2.538197e+02 0.000000e+00 + vertex 2.544721e+02 -2.560557e+02 0.000000e+00 + vertex 2.547630e+02 -2.553407e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 2.550000e+02 -2.538197e+02 0.000000e+00 + vertex 2.547630e+02 -2.553407e+02 0.000000e+00 + vertex 2.549404e+02 -2.545893e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 2.480080e+02 -2.648779e+02 0.000000e+00 + vertex 2.490525e+02 -2.645176e+02 0.000000e+00 + vertex 2.513820e+02 -2.622361e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 2.513820e+02 -2.622361e+02 0.000000e+00 + vertex 2.490525e+02 -2.645176e+02 0.000000e+00 + vertex 2.499923e+02 -2.639368e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 2.513820e+02 -2.622361e+02 0.000000e+00 + vertex 2.499923e+02 -2.639368e+02 0.000000e+00 + vertex 2.507817e+02 -2.631637e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 2.550000e+02 2.630000e+02 0.000000e+00 + vertex 1.919098e+02 -2.550000e+02 0.000000e+00 + vertex 2.550000e+02 -2.538197e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 2.550000e+02 -2.538197e+02 0.000000e+00 + vertex 1.919098e+02 -2.550000e+02 0.000000e+00 + vertex 1.930080e+02 -2.551221e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 2.550000e+02 -2.538197e+02 0.000000e+00 + vertex 1.930080e+02 -2.551221e+02 0.000000e+00 + vertex 1.940525e+02 -2.554824e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 2.549319e+02 2.635176e+02 0.000000e+00 + vertex 2.547321e+02 2.640000e+02 0.000000e+00 + vertex 2.550000e+02 2.630000e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 2.550000e+02 2.630000e+02 0.000000e+00 + vertex 2.547321e+02 2.640000e+02 0.000000e+00 + vertex 2.544142e+02 2.644142e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 2.550000e+02 2.630000e+02 0.000000e+00 + vertex 2.544142e+02 2.644142e+02 0.000000e+00 + vertex 2.540000e+02 2.647321e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 2.540000e+02 2.647321e+02 0.000000e+00 + vertex 2.535176e+02 2.649319e+02 0.000000e+00 + vertex 2.550000e+02 2.630000e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 2.550000e+02 2.630000e+02 0.000000e+00 + vertex 2.535176e+02 2.649319e+02 0.000000e+00 + vertex 2.530000e+02 2.650000e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 2.550000e+02 2.630000e+02 0.000000e+00 + vertex 2.530000e+02 2.650000e+02 0.000000e+00 + vertex 1.372413e+02 2.580819e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.372413e+02 2.580819e+02 0.000000e+00 + vertex 2.530000e+02 2.650000e+02 0.000000e+00 + vertex 1.376417e+02 2.586870e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.376417e+02 2.586870e+02 0.000000e+00 + vertex 2.530000e+02 2.650000e+02 0.000000e+00 + vertex 1.378823e+02 2.593714e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.378823e+02 2.593714e+02 0.000000e+00 + vertex 2.530000e+02 2.650000e+02 0.000000e+00 + vertex 1.399309e+02 2.650000e+02 0.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.372413e+02 2.580819e+02 0.000000e+00 + vertex 1.367054e+02 2.575929e+02 0.000000e+00 + vertex 2.550000e+02 2.630000e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 2.550000e+02 2.630000e+02 0.000000e+00 + vertex 1.367054e+02 2.575929e+02 0.000000e+00 + vertex 1.360663e+02 2.572495e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 2.550000e+02 2.630000e+02 0.000000e+00 + vertex 1.360663e+02 2.572495e+02 0.000000e+00 + vertex 1.919098e+02 -2.550000e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.919098e+02 -2.550000e+02 0.000000e+00 + vertex 1.360663e+02 2.572495e+02 0.000000e+00 + vertex 1.353628e+02 2.570724e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.919098e+02 -2.550000e+02 0.000000e+00 + vertex 1.353628e+02 2.570724e+02 0.000000e+00 + vertex 1.346372e+02 2.570724e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.346372e+02 2.570724e+02 0.000000e+00 + vertex 1.339337e+02 2.572495e+02 0.000000e+00 + vertex 1.919098e+02 -2.550000e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.919098e+02 -2.550000e+02 0.000000e+00 + vertex 1.339337e+02 2.572495e+02 0.000000e+00 + vertex -1.919098e+02 -2.550000e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.919098e+02 -2.550000e+02 0.000000e+00 + vertex 1.339337e+02 2.572495e+02 0.000000e+00 + vertex -1.336098e+02 2.573981e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.919098e+02 -2.550000e+02 0.000000e+00 + vertex -1.336098e+02 2.573981e+02 0.000000e+00 + vertex -1.342990e+02 2.571345e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.339337e+02 2.572495e+02 0.000000e+00 + vertex 1.332946e+02 2.575929e+02 0.000000e+00 + vertex -1.336098e+02 2.573981e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.336098e+02 2.573981e+02 0.000000e+00 + vertex 1.332946e+02 2.575929e+02 0.000000e+00 + vertex -1.330077e+02 2.578244e+02 0.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.330077e+02 2.578244e+02 0.000000e+00 + vertex 1.332946e+02 2.575929e+02 0.000000e+00 + vertex 1.327587e+02 2.580819e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.330077e+02 2.578244e+02 0.000000e+00 + vertex 1.327587e+02 2.580819e+02 0.000000e+00 + vertex -1.325301e+02 2.583868e+02 0.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.325301e+02 2.583868e+02 0.000000e+00 + vertex 1.327587e+02 2.580819e+02 0.000000e+00 + vertex 1.323583e+02 2.586870e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.325301e+02 2.583868e+02 0.000000e+00 + vertex 1.323583e+02 2.586870e+02 0.000000e+00 + vertex -1.322071e+02 2.590502e+02 0.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.322071e+02 2.590502e+02 0.000000e+00 + vertex 1.323583e+02 2.586870e+02 0.000000e+00 + vertex 1.321177e+02 2.593714e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.322071e+02 2.590502e+02 0.000000e+00 + vertex 1.321177e+02 2.593714e+02 0.000000e+00 + vertex -1.300415e+02 2.650000e+02 0.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.300415e+02 2.650000e+02 0.000000e+00 + vertex 1.321177e+02 2.593714e+02 0.000000e+00 + vertex 1.300691e+02 2.650000e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.342990e+02 2.571345e+02 0.000000e+00 + vertex -1.350319e+02 2.570502e+02 0.000000e+00 + vertex -1.919098e+02 -2.550000e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.919098e+02 -2.550000e+02 0.000000e+00 + vertex -1.350319e+02 2.570502e+02 0.000000e+00 + vertex -1.357629e+02 2.571504e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -0.000000e+00 1.000000e+00 + outer loop + vertex -1.919098e+02 -2.550000e+02 0.000000e+00 + vertex -1.357629e+02 2.571504e+02 0.000000e+00 + vertex -2.550000e+02 2.630000e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -2.550000e+02 2.630000e+02 0.000000e+00 + vertex -1.357629e+02 2.571504e+02 0.000000e+00 + vertex -1.364462e+02 2.574288e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -2.550000e+02 2.630000e+02 0.000000e+00 + vertex -1.364462e+02 2.574288e+02 0.000000e+00 + vertex -1.370390e+02 2.578681e+02 0.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -2.550000e+02 2.630000e+02 0.000000e+00 + vertex -1.370390e+02 2.578681e+02 0.000000e+00 + vertex -2.530000e+02 2.650000e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -2.530000e+02 2.650000e+02 0.000000e+00 + vertex -1.370390e+02 2.578681e+02 0.000000e+00 + vertex -1.375042e+02 2.584407e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -2.530000e+02 2.650000e+02 0.000000e+00 + vertex -1.375042e+02 2.584407e+02 0.000000e+00 + vertex -1.378128e+02 2.591109e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.378128e+02 2.591109e+02 0.000000e+00 + vertex -1.399563e+02 2.650000e+02 0.000000e+00 + vertex -2.530000e+02 2.650000e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -2.530000e+02 2.650000e+02 0.000000e+00 + vertex -2.535176e+02 2.649319e+02 0.000000e+00 + vertex -2.550000e+02 2.630000e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -2.550000e+02 2.630000e+02 0.000000e+00 + vertex -2.535176e+02 2.649319e+02 0.000000e+00 + vertex -2.540000e+02 2.647321e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -2.550000e+02 2.630000e+02 0.000000e+00 + vertex -2.540000e+02 2.647321e+02 0.000000e+00 + vertex -2.544142e+02 2.644142e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -2.544142e+02 2.644142e+02 0.000000e+00 + vertex -2.547321e+02 2.640000e+02 0.000000e+00 + vertex -2.550000e+02 2.630000e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -2.550000e+02 2.630000e+02 0.000000e+00 + vertex -2.547321e+02 2.640000e+02 0.000000e+00 + vertex -2.549319e+02 2.635176e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -2.550000e+02 2.630000e+02 0.000000e+00 + vertex -2.550000e+02 -2.538197e+02 0.000000e+00 + vertex -1.919098e+02 -2.550000e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.919098e+02 -2.550000e+02 0.000000e+00 + vertex -2.550000e+02 -2.538197e+02 0.000000e+00 + vertex -1.930080e+02 -2.551221e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.930080e+02 -2.551221e+02 0.000000e+00 + vertex -2.550000e+02 -2.538197e+02 0.000000e+00 + vertex -1.940525e+02 -2.554824e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.940525e+02 -2.554824e+02 0.000000e+00 + vertex -2.550000e+02 -2.538197e+02 0.000000e+00 + vertex -1.949923e+02 -2.560632e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.949923e+02 -2.560632e+02 0.000000e+00 + vertex -2.550000e+02 -2.538197e+02 0.000000e+00 + vertex -1.957817e+02 -2.568363e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.957817e+02 -2.568363e+02 0.000000e+00 + vertex -2.550000e+02 -2.538197e+02 0.000000e+00 + vertex -2.030902e+02 -2.650000e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.957817e+02 -2.568363e+02 0.000000e+00 + vertex -2.030902e+02 -2.650000e+02 0.000000e+00 + vertex -1.963820e+02 -2.577639e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.963820e+02 -2.577639e+02 0.000000e+00 + vertex -2.030902e+02 -2.650000e+02 0.000000e+00 + vertex -1.986180e+02 -2.622361e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.986180e+02 -2.622361e+02 0.000000e+00 + vertex -2.030902e+02 -2.650000e+02 0.000000e+00 + vertex -2.019920e+02 -2.648779e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.986180e+02 -2.622361e+02 0.000000e+00 + vertex -2.019920e+02 -2.648779e+02 0.000000e+00 + vertex -2.009475e+02 -2.645176e+02 0.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 -0.000000e+00 1.000000e+00 + outer loop + vertex -2.549404e+02 -2.545893e+02 0.000000e+00 + vertex -2.547630e+02 -2.553407e+02 0.000000e+00 + vertex -2.550000e+02 -2.538197e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -2.550000e+02 -2.538197e+02 0.000000e+00 + vertex -2.547630e+02 -2.553407e+02 0.000000e+00 + vertex -2.544721e+02 -2.560557e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -2.550000e+02 -2.538197e+02 0.000000e+00 + vertex -2.544721e+02 -2.560557e+02 0.000000e+00 + vertex -2.469098e+02 -2.650000e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -2.469098e+02 -2.650000e+02 0.000000e+00 + vertex -2.544721e+02 -2.560557e+02 0.000000e+00 + vertex -2.513820e+02 -2.622361e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -2.469098e+02 -2.650000e+02 0.000000e+00 + vertex -2.513820e+02 -2.622361e+02 0.000000e+00 + vertex -2.480080e+02 -2.648779e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -2.480080e+02 -2.648779e+02 0.000000e+00 + vertex -2.513820e+02 -2.622361e+02 0.000000e+00 + vertex -2.490525e+02 -2.645176e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -2.490525e+02 -2.645176e+02 0.000000e+00 + vertex -2.513820e+02 -2.622361e+02 0.000000e+00 + vertex -2.499923e+02 -2.639368e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -2.499923e+02 -2.639368e+02 0.000000e+00 + vertex -2.513820e+02 -2.622361e+02 0.000000e+00 + vertex -2.507817e+02 -2.631637e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -0.000000e+00 1.000000e+00 + outer loop + vertex -2.469098e+02 -2.650000e+02 0.000000e+00 + vertex -2.030902e+02 -2.650000e+02 0.000000e+00 + vertex -2.550000e+02 -2.538197e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -2.009475e+02 -2.645176e+02 0.000000e+00 + vertex -2.000077e+02 -2.639368e+02 0.000000e+00 + vertex -1.986180e+02 -2.622361e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.986180e+02 -2.622361e+02 0.000000e+00 + vertex -2.000077e+02 -2.639368e+02 0.000000e+00 + vertex -1.992183e+02 -2.631637e+02 0.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.940525e+02 -2.554824e+02 0.000000e+00 + vertex 1.949923e+02 -2.560632e+02 0.000000e+00 + vertex 2.550000e+02 -2.538197e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 2.550000e+02 -2.538197e+02 0.000000e+00 + vertex 1.949923e+02 -2.560632e+02 0.000000e+00 + vertex 1.957817e+02 -2.568363e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 2.550000e+02 -2.538197e+02 0.000000e+00 + vertex 1.957817e+02 -2.568363e+02 0.000000e+00 + vertex 2.030902e+02 -2.650000e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 2.030902e+02 -2.650000e+02 0.000000e+00 + vertex 1.957817e+02 -2.568363e+02 0.000000e+00 + vertex 1.963820e+02 -2.577639e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 2.030902e+02 -2.650000e+02 0.000000e+00 + vertex 1.963820e+02 -2.577639e+02 0.000000e+00 + vertex 1.986180e+02 -2.622361e+02 0.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 -0.000000e+00 1.000000e+00 + outer loop + vertex 1.992183e+02 -2.631637e+02 0.000000e+00 + vertex 2.000077e+02 -2.639368e+02 0.000000e+00 + vertex 1.986180e+02 -2.622361e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.986180e+02 -2.622361e+02 0.000000e+00 + vertex 2.000077e+02 -2.639368e+02 0.000000e+00 + vertex 2.009475e+02 -2.645176e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.986180e+02 -2.622361e+02 0.000000e+00 + vertex 2.009475e+02 -2.645176e+02 0.000000e+00 + vertex 2.019920e+02 -2.648779e+02 0.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 -0.000000e+00 1.000000e+00 + outer loop + vertex 2.019920e+02 -2.648779e+02 0.000000e+00 + vertex 2.030902e+02 -2.650000e+02 0.000000e+00 + vertex 1.986180e+02 -2.622361e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 2.030902e+02 -2.650000e+02 0.000000e+00 + vertex 2.469098e+02 -2.650000e+02 0.000000e+00 + vertex 2.550000e+02 -2.538197e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -0.000000e+00 1.000000e+00 + outer loop + vertex -1.378128e+02 2.591109e+02 -2.000000e+00 + vertex -1.377500e+02 2.600000e+02 -2.000000e+00 + vertex -1.399563e+02 2.650000e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.399563e+02 2.650000e+02 -2.000000e+00 + vertex -1.377500e+02 2.600000e+02 -2.000000e+00 + vertex -1.376563e+02 2.607118e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.399563e+02 2.650000e+02 -2.000000e+00 + vertex -1.376563e+02 2.607118e+02 -2.000000e+00 + vertex -1.373816e+02 2.613750e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -0.000000e+00 1.000000e+00 + outer loop + vertex -1.375042e+02 2.584407e+02 -2.000000e+00 + vertex -1.373816e+02 2.586250e+02 -2.000000e+00 + vertex -1.378128e+02 2.591109e+02 -2.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.378128e+02 2.591109e+02 -2.000000e+00 + vertex -1.373816e+02 2.586250e+02 -2.000000e+00 + vertex -1.376563e+02 2.592882e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.378128e+02 2.591109e+02 -2.000000e+00 + vertex -1.376563e+02 2.592882e+02 -2.000000e+00 + vertex -1.377500e+02 2.600000e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.373816e+02 2.586250e+02 -2.000000e+00 + vertex -1.375042e+02 2.584407e+02 -2.000000e+00 + vertex -1.369445e+02 2.580555e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.369445e+02 2.580555e+02 -2.000000e+00 + vertex -1.375042e+02 2.584407e+02 -2.000000e+00 + vertex -1.370390e+02 2.578681e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.369445e+02 2.580555e+02 -2.000000e+00 + vertex -1.370390e+02 2.578681e+02 -2.000000e+00 + vertex -1.363750e+02 2.576184e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.363750e+02 2.576184e+02 -2.000000e+00 + vertex -1.370390e+02 2.578681e+02 -2.000000e+00 + vertex -1.364462e+02 2.574288e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.363750e+02 2.576184e+02 -2.000000e+00 + vertex -1.364462e+02 2.574288e+02 -2.000000e+00 + vertex -1.357118e+02 2.573437e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.357118e+02 2.573437e+02 -2.000000e+00 + vertex -1.364462e+02 2.574288e+02 -2.000000e+00 + vertex -1.357629e+02 2.571504e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.357118e+02 2.573437e+02 -2.000000e+00 + vertex -1.357629e+02 2.571504e+02 -2.000000e+00 + vertex -1.350319e+02 2.570502e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.357118e+02 2.573437e+02 -2.000000e+00 + vertex -1.350319e+02 2.570502e+02 -2.000000e+00 + vertex -1.350000e+02 2.572500e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.350000e+02 2.572500e+02 -2.000000e+00 + vertex -1.350319e+02 2.570502e+02 -2.000000e+00 + vertex -1.342990e+02 2.571345e+02 -2.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.350000e+02 2.572500e+02 -2.000000e+00 + vertex -1.342990e+02 2.571345e+02 -2.000000e+00 + vertex -1.342882e+02 2.573437e+02 -2.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.342882e+02 2.573437e+02 -2.000000e+00 + vertex -1.342990e+02 2.571345e+02 -2.000000e+00 + vertex -1.336098e+02 2.573981e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.342882e+02 2.573437e+02 -2.000000e+00 + vertex -1.336098e+02 2.573981e+02 -2.000000e+00 + vertex -1.336250e+02 2.576184e+02 -2.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.336250e+02 2.576184e+02 -2.000000e+00 + vertex -1.336098e+02 2.573981e+02 -2.000000e+00 + vertex -1.330077e+02 2.578244e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.336250e+02 2.576184e+02 -2.000000e+00 + vertex -1.330077e+02 2.578244e+02 -2.000000e+00 + vertex -1.330555e+02 2.580555e+02 -2.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.330555e+02 2.580555e+02 -2.000000e+00 + vertex -1.330077e+02 2.578244e+02 -2.000000e+00 + vertex -1.325301e+02 2.583868e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.330555e+02 2.580555e+02 -2.000000e+00 + vertex -1.325301e+02 2.583868e+02 -2.000000e+00 + vertex -1.326184e+02 2.586250e+02 -2.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.326184e+02 2.586250e+02 -2.000000e+00 + vertex -1.325301e+02 2.583868e+02 -2.000000e+00 + vertex -1.322071e+02 2.590502e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.326184e+02 2.586250e+02 -2.000000e+00 + vertex -1.322071e+02 2.590502e+02 -2.000000e+00 + vertex -1.323437e+02 2.592882e+02 -2.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.323437e+02 2.592882e+02 -2.000000e+00 + vertex -1.322071e+02 2.590502e+02 -2.000000e+00 + vertex -1.322500e+02 2.600000e+02 -2.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.322500e+02 2.600000e+02 -2.000000e+00 + vertex -1.322071e+02 2.590502e+02 -2.000000e+00 + vertex -1.300415e+02 2.650000e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -0.000000e+00 1.000000e+00 + outer loop + vertex -1.322500e+02 2.600000e+02 -2.000000e+00 + vertex -1.300415e+02 2.650000e+02 -2.000000e+00 + vertex -1.323437e+02 2.607118e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -0.000000e+00 1.000000e+00 + outer loop + vertex -1.323437e+02 2.607118e+02 -2.000000e+00 + vertex -1.300415e+02 2.650000e+02 -2.000000e+00 + vertex -1.326184e+02 2.613750e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -0.000000e+00 1.000000e+00 + outer loop + vertex -1.326184e+02 2.613750e+02 -2.000000e+00 + vertex -1.300415e+02 2.650000e+02 -2.000000e+00 + vertex -1.330555e+02 2.619445e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -0.000000e+00 1.000000e+00 + outer loop + vertex -1.330555e+02 2.619445e+02 -2.000000e+00 + vertex -1.300415e+02 2.650000e+02 -2.000000e+00 + vertex -1.336250e+02 2.623816e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -0.000000e+00 1.000000e+00 + outer loop + vertex -1.336250e+02 2.623816e+02 -2.000000e+00 + vertex -1.300415e+02 2.650000e+02 -2.000000e+00 + vertex -1.342882e+02 2.626563e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -0.000000e+00 1.000000e+00 + outer loop + vertex -1.342882e+02 2.626563e+02 -2.000000e+00 + vertex -1.300415e+02 2.650000e+02 -2.000000e+00 + vertex -1.350000e+02 2.627500e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -0.000000e+00 1.000000e+00 + outer loop + vertex -1.350000e+02 2.627500e+02 -2.000000e+00 + vertex -1.300415e+02 2.650000e+02 -2.000000e+00 + vertex -1.399563e+02 2.650000e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.350000e+02 2.627500e+02 -2.000000e+00 + vertex -1.399563e+02 2.650000e+02 -2.000000e+00 + vertex -1.357118e+02 2.626563e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.357118e+02 2.626563e+02 -2.000000e+00 + vertex -1.399563e+02 2.650000e+02 -2.000000e+00 + vertex -1.363750e+02 2.623816e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.363750e+02 2.623816e+02 -2.000000e+00 + vertex -1.399563e+02 2.650000e+02 -2.000000e+00 + vertex -1.369445e+02 2.619445e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.369445e+02 2.619445e+02 -2.000000e+00 + vertex -1.399563e+02 2.650000e+02 -2.000000e+00 + vertex -1.373816e+02 2.613750e+02 -2.000000e+00 + endloop + endfacet + facet normal -1.305262e-01 -9.914449e-01 0.000000e+00 + outer loop + vertex -2.530000e+02 -2.550000e+02 -6.000000e+00 + vertex -2.530000e+02 -2.550000e+02 -2.000000e+00 + vertex -2.535176e+02 -2.549319e+02 -6.000000e+00 + endloop + endfacet + facet normal -1.305262e-01 -9.914449e-01 0.000000e+00 + outer loop + vertex -2.535176e+02 -2.549319e+02 -6.000000e+00 + vertex -2.530000e+02 -2.550000e+02 -2.000000e+00 + vertex -2.535176e+02 -2.549319e+02 -2.000000e+00 + endloop + endfacet + facet normal -3.826834e-01 -9.238795e-01 0.000000e+00 + outer loop + vertex -2.535176e+02 -2.549319e+02 -6.000000e+00 + vertex -2.535176e+02 -2.549319e+02 -2.000000e+00 + vertex -2.540000e+02 -2.547321e+02 -6.000000e+00 + endloop + endfacet + facet normal -3.826834e-01 -9.238795e-01 0.000000e+00 + outer loop + vertex -2.540000e+02 -2.547321e+02 -6.000000e+00 + vertex -2.535176e+02 -2.549319e+02 -2.000000e+00 + vertex -2.540000e+02 -2.547321e+02 -2.000000e+00 + endloop + endfacet + facet normal -6.087614e-01 -7.933533e-01 0.000000e+00 + outer loop + vertex -2.540000e+02 -2.547321e+02 -6.000000e+00 + vertex -2.540000e+02 -2.547321e+02 -2.000000e+00 + vertex -2.544142e+02 -2.544142e+02 -6.000000e+00 + endloop + endfacet + facet normal -6.087614e-01 -7.933533e-01 0.000000e+00 + outer loop + vertex -2.544142e+02 -2.544142e+02 -6.000000e+00 + vertex -2.540000e+02 -2.547321e+02 -2.000000e+00 + vertex -2.544142e+02 -2.544142e+02 -2.000000e+00 + endloop + endfacet + facet normal -7.933533e-01 -6.087614e-01 0.000000e+00 + outer loop + vertex -2.544142e+02 -2.544142e+02 -6.000000e+00 + vertex -2.544142e+02 -2.544142e+02 -2.000000e+00 + vertex -2.547321e+02 -2.540000e+02 -6.000000e+00 + endloop + endfacet + facet normal -7.933533e-01 -6.087614e-01 0.000000e+00 + outer loop + vertex -2.547321e+02 -2.540000e+02 -6.000000e+00 + vertex -2.544142e+02 -2.544142e+02 -2.000000e+00 + vertex -2.547321e+02 -2.540000e+02 -2.000000e+00 + endloop + endfacet + facet normal -9.238795e-01 -3.826834e-01 0.000000e+00 + outer loop + vertex -2.547321e+02 -2.540000e+02 -6.000000e+00 + vertex -2.547321e+02 -2.540000e+02 -2.000000e+00 + vertex -2.549319e+02 -2.535176e+02 -6.000000e+00 + endloop + endfacet + facet normal -9.238795e-01 -3.826834e-01 0.000000e+00 + outer loop + vertex -2.549319e+02 -2.535176e+02 -6.000000e+00 + vertex -2.547321e+02 -2.540000e+02 -2.000000e+00 + vertex -2.549319e+02 -2.535176e+02 -2.000000e+00 + endloop + endfacet + facet normal -9.914449e-01 -1.305262e-01 0.000000e+00 + outer loop + vertex -2.549319e+02 -2.535176e+02 -6.000000e+00 + vertex -2.549319e+02 -2.535176e+02 -2.000000e+00 + vertex -2.550000e+02 -2.530000e+02 -6.000000e+00 + endloop + endfacet + facet normal -9.914449e-01 -1.305262e-01 0.000000e+00 + outer loop + vertex -2.550000e+02 -2.530000e+02 -6.000000e+00 + vertex -2.549319e+02 -2.535176e+02 -2.000000e+00 + vertex -2.550000e+02 -2.530000e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -1.000000e+00 0.000000e+00 + outer loop + vertex -2.530000e+02 -2.550000e+02 -2.000000e+00 + vertex -2.530000e+02 -2.550000e+02 -6.000000e+00 + vertex -1.919098e+02 -2.550000e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -1.000000e+00 -0.000000e+00 + outer loop + vertex -1.919098e+02 -2.550000e+02 -2.000000e+00 + vertex -2.530000e+02 -2.550000e+02 -6.000000e+00 + vertex 2.530000e+02 -2.550000e+02 -6.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -1.000000e+00 0.000000e+00 + outer loop + vertex -1.919098e+02 -2.550000e+02 -2.000000e+00 + vertex 2.530000e+02 -2.550000e+02 -6.000000e+00 + vertex 1.919098e+02 -2.550000e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -1.000000e+00 0.000000e+00 + outer loop + vertex 1.919098e+02 -2.550000e+02 -2.000000e+00 + vertex 2.530000e+02 -2.550000e+02 -6.000000e+00 + vertex 2.530000e+02 -2.550000e+02 -2.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 -1.000000e+00 -0.000000e+00 + outer loop + vertex 1.919098e+02 -2.550000e+02 0.000000e+00 + vertex -1.919098e+02 -2.550000e+02 0.000000e+00 + vertex 1.919098e+02 -2.550000e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -1.000000e+00 0.000000e+00 + outer loop + vertex 1.919098e+02 -2.550000e+02 -2.000000e+00 + vertex -1.919098e+02 -2.550000e+02 0.000000e+00 + vertex -1.919098e+02 -2.550000e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -2.535176e+02 -2.549319e+02 -6.000000e+00 + vertex -2.550000e+02 -2.530000e+02 -6.000000e+00 + vertex -2.530000e+02 -2.550000e+02 -6.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -2.530000e+02 -2.550000e+02 -6.000000e+00 + vertex -2.550000e+02 -2.530000e+02 -6.000000e+00 + vertex -2.530000e+02 2.650000e+02 -6.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -2.530000e+02 -2.550000e+02 -6.000000e+00 + vertex -2.530000e+02 2.650000e+02 -6.000000e+00 + vertex 2.530000e+02 2.650000e+02 -6.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -2.535176e+02 -2.549319e+02 -6.000000e+00 + vertex -2.540000e+02 -2.547321e+02 -6.000000e+00 + vertex -2.550000e+02 -2.530000e+02 -6.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -2.550000e+02 -2.530000e+02 -6.000000e+00 + vertex -2.540000e+02 -2.547321e+02 -6.000000e+00 + vertex -2.544142e+02 -2.544142e+02 -6.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -2.550000e+02 -2.530000e+02 -6.000000e+00 + vertex -2.544142e+02 -2.544142e+02 -6.000000e+00 + vertex -2.547321e+02 -2.540000e+02 -6.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -2.547321e+02 -2.540000e+02 -6.000000e+00 + vertex -2.549319e+02 -2.535176e+02 -6.000000e+00 + vertex -2.550000e+02 -2.530000e+02 -6.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -2.550000e+02 -2.530000e+02 -6.000000e+00 + vertex -2.550000e+02 2.630000e+02 -6.000000e+00 + vertex -2.530000e+02 2.650000e+02 -6.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -2.530000e+02 2.650000e+02 -6.000000e+00 + vertex -2.550000e+02 2.630000e+02 -6.000000e+00 + vertex -2.535176e+02 2.649319e+02 -6.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -2.535176e+02 2.649319e+02 -6.000000e+00 + vertex -2.550000e+02 2.630000e+02 -6.000000e+00 + vertex -2.540000e+02 2.647321e+02 -6.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -2.540000e+02 2.647321e+02 -6.000000e+00 + vertex -2.550000e+02 2.630000e+02 -6.000000e+00 + vertex -2.544142e+02 2.644142e+02 -6.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -2.544142e+02 2.644142e+02 -6.000000e+00 + vertex -2.550000e+02 2.630000e+02 -6.000000e+00 + vertex -2.547321e+02 2.640000e+02 -6.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex -2.547321e+02 2.640000e+02 -6.000000e+00 + vertex -2.550000e+02 2.630000e+02 -6.000000e+00 + vertex -2.549319e+02 2.635176e+02 -6.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 -0.000000e+00 -1.000000e+00 + outer loop + vertex 2.535176e+02 2.649319e+02 -6.000000e+00 + vertex 2.550000e+02 2.630000e+02 -6.000000e+00 + vertex 2.530000e+02 2.650000e+02 -6.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 2.530000e+02 2.650000e+02 -6.000000e+00 + vertex 2.550000e+02 2.630000e+02 -6.000000e+00 + vertex 2.550000e+02 -2.530000e+02 -6.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 2.530000e+02 2.650000e+02 -6.000000e+00 + vertex 2.550000e+02 -2.530000e+02 -6.000000e+00 + vertex 2.530000e+02 -2.550000e+02 -6.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 2.530000e+02 -2.550000e+02 -6.000000e+00 + vertex 2.550000e+02 -2.530000e+02 -6.000000e+00 + vertex 2.535176e+02 -2.549319e+02 -6.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 2.535176e+02 -2.549319e+02 -6.000000e+00 + vertex 2.550000e+02 -2.530000e+02 -6.000000e+00 + vertex 2.540000e+02 -2.547321e+02 -6.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 2.540000e+02 -2.547321e+02 -6.000000e+00 + vertex 2.550000e+02 -2.530000e+02 -6.000000e+00 + vertex 2.544142e+02 -2.544142e+02 -6.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 2.544142e+02 -2.544142e+02 -6.000000e+00 + vertex 2.550000e+02 -2.530000e+02 -6.000000e+00 + vertex 2.547321e+02 -2.540000e+02 -6.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 2.547321e+02 -2.540000e+02 -6.000000e+00 + vertex 2.550000e+02 -2.530000e+02 -6.000000e+00 + vertex 2.549319e+02 -2.535176e+02 -6.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 2.535176e+02 2.649319e+02 -6.000000e+00 + vertex 2.540000e+02 2.647321e+02 -6.000000e+00 + vertex 2.550000e+02 2.630000e+02 -6.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 2.550000e+02 2.630000e+02 -6.000000e+00 + vertex 2.540000e+02 2.647321e+02 -6.000000e+00 + vertex 2.544142e+02 2.644142e+02 -6.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 2.550000e+02 2.630000e+02 -6.000000e+00 + vertex 2.544142e+02 2.644142e+02 -6.000000e+00 + vertex 2.547321e+02 2.640000e+02 -6.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 2.547321e+02 2.640000e+02 -6.000000e+00 + vertex 2.549319e+02 2.635176e+02 -6.000000e+00 + vertex 2.550000e+02 2.630000e+02 -6.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 + outer loop + vertex 2.530000e+02 -2.550000e+02 -6.000000e+00 + vertex -2.530000e+02 -2.550000e+02 -6.000000e+00 + vertex 2.530000e+02 2.650000e+02 -6.000000e+00 + endloop + endfacet + facet normal 9.914449e-01 -1.305262e-01 0.000000e+00 + outer loop + vertex 2.550000e+02 -2.530000e+02 -6.000000e+00 + vertex 2.550000e+02 -2.530000e+02 -2.000000e+00 + vertex 2.549319e+02 -2.535176e+02 -6.000000e+00 + endloop + endfacet + facet normal 9.914449e-01 -1.305262e-01 0.000000e+00 + outer loop + vertex 2.549319e+02 -2.535176e+02 -6.000000e+00 + vertex 2.550000e+02 -2.530000e+02 -2.000000e+00 + vertex 2.549319e+02 -2.535176e+02 -2.000000e+00 + endloop + endfacet + facet normal 9.238795e-01 -3.826834e-01 0.000000e+00 + outer loop + vertex 2.549319e+02 -2.535176e+02 -6.000000e+00 + vertex 2.549319e+02 -2.535176e+02 -2.000000e+00 + vertex 2.547321e+02 -2.540000e+02 -6.000000e+00 + endloop + endfacet + facet normal 9.238795e-01 -3.826834e-01 0.000000e+00 + outer loop + vertex 2.547321e+02 -2.540000e+02 -6.000000e+00 + vertex 2.549319e+02 -2.535176e+02 -2.000000e+00 + vertex 2.547321e+02 -2.540000e+02 -2.000000e+00 + endloop + endfacet + facet normal 7.933533e-01 -6.087614e-01 0.000000e+00 + outer loop + vertex 2.547321e+02 -2.540000e+02 -6.000000e+00 + vertex 2.547321e+02 -2.540000e+02 -2.000000e+00 + vertex 2.544142e+02 -2.544142e+02 -6.000000e+00 + endloop + endfacet + facet normal 7.933533e-01 -6.087614e-01 0.000000e+00 + outer loop + vertex 2.544142e+02 -2.544142e+02 -6.000000e+00 + vertex 2.547321e+02 -2.540000e+02 -2.000000e+00 + vertex 2.544142e+02 -2.544142e+02 -2.000000e+00 + endloop + endfacet + facet normal 6.087614e-01 -7.933533e-01 0.000000e+00 + outer loop + vertex 2.544142e+02 -2.544142e+02 -6.000000e+00 + vertex 2.544142e+02 -2.544142e+02 -2.000000e+00 + vertex 2.540000e+02 -2.547321e+02 -6.000000e+00 + endloop + endfacet + facet normal 6.087614e-01 -7.933533e-01 0.000000e+00 + outer loop + vertex 2.540000e+02 -2.547321e+02 -6.000000e+00 + vertex 2.544142e+02 -2.544142e+02 -2.000000e+00 + vertex 2.540000e+02 -2.547321e+02 -2.000000e+00 + endloop + endfacet + facet normal 3.826834e-01 -9.238795e-01 0.000000e+00 + outer loop + vertex 2.540000e+02 -2.547321e+02 -6.000000e+00 + vertex 2.540000e+02 -2.547321e+02 -2.000000e+00 + vertex 2.535176e+02 -2.549319e+02 -6.000000e+00 + endloop + endfacet + facet normal 3.826834e-01 -9.238795e-01 0.000000e+00 + outer loop + vertex 2.535176e+02 -2.549319e+02 -6.000000e+00 + vertex 2.540000e+02 -2.547321e+02 -2.000000e+00 + vertex 2.535176e+02 -2.549319e+02 -2.000000e+00 + endloop + endfacet + facet normal 1.305262e-01 -9.914449e-01 0.000000e+00 + outer loop + vertex 2.535176e+02 -2.549319e+02 -6.000000e+00 + vertex 2.535176e+02 -2.549319e+02 -2.000000e+00 + vertex 2.530000e+02 -2.550000e+02 -6.000000e+00 + endloop + endfacet + facet normal 1.305262e-01 -9.914449e-01 0.000000e+00 + outer loop + vertex 2.530000e+02 -2.550000e+02 -6.000000e+00 + vertex 2.535176e+02 -2.549319e+02 -2.000000e+00 + vertex 2.530000e+02 -2.550000e+02 -2.000000e+00 + endloop + endfacet + facet normal 1.000000e+00 0.000000e+00 0.000000e+00 + outer loop + vertex 2.550000e+02 -2.530000e+02 -6.000000e+00 + vertex 2.550000e+02 2.630000e+02 -6.000000e+00 + vertex 2.550000e+02 -2.530000e+02 -2.000000e+00 + endloop + endfacet + facet normal 1.000000e+00 -0.000000e+00 0.000000e+00 + outer loop + vertex 2.550000e+02 -2.530000e+02 -2.000000e+00 + vertex 2.550000e+02 2.630000e+02 -6.000000e+00 + vertex 2.550000e+02 2.630000e+02 0.000000e+00 + endloop + endfacet + facet normal 1.000000e+00 0.000000e+00 -0.000000e+00 + outer loop + vertex 2.550000e+02 -2.530000e+02 -2.000000e+00 + vertex 2.550000e+02 2.630000e+02 0.000000e+00 + vertex 2.550000e+02 -2.538197e+02 0.000000e+00 + endloop + endfacet + facet normal 1.000000e+00 0.000000e+00 0.000000e+00 + outer loop + vertex 2.550000e+02 -2.538197e+02 0.000000e+00 + vertex 2.550000e+02 -2.538197e+02 -2.000000e+00 + vertex 2.550000e+02 -2.530000e+02 -2.000000e+00 + endloop + endfacet + facet normal 9.914449e-01 1.305262e-01 0.000000e+00 + outer loop + vertex 2.550000e+02 2.630000e+02 0.000000e+00 + vertex 2.550000e+02 2.630000e+02 -6.000000e+00 + vertex 2.549319e+02 2.635176e+02 0.000000e+00 + endloop + endfacet + facet normal 9.914449e-01 1.305262e-01 -4.696426e-15 + outer loop + vertex 2.549319e+02 2.635176e+02 0.000000e+00 + vertex 2.550000e+02 2.630000e+02 -6.000000e+00 + vertex 2.549319e+02 2.635176e+02 -6.000000e+00 + endloop + endfacet + facet normal 9.238795e-01 3.826834e-01 -4.376373e-15 + outer loop + vertex 2.549319e+02 2.635176e+02 0.000000e+00 + vertex 2.549319e+02 2.635176e+02 -6.000000e+00 + vertex 2.547321e+02 2.640000e+02 0.000000e+00 + endloop + endfacet + facet normal 9.238795e-01 3.826834e-01 0.000000e+00 + outer loop + vertex 2.547321e+02 2.640000e+02 0.000000e+00 + vertex 2.549319e+02 2.635176e+02 -6.000000e+00 + vertex 2.547321e+02 2.640000e+02 -6.000000e+00 + endloop + endfacet + facet normal 7.933533e-01 6.087614e-01 0.000000e+00 + outer loop + vertex 2.547321e+02 2.640000e+02 0.000000e+00 + vertex 2.547321e+02 2.640000e+02 -6.000000e+00 + vertex 2.544142e+02 2.644142e+02 0.000000e+00 + endloop + endfacet + facet normal 7.933533e-01 6.087614e-01 0.000000e+00 + outer loop + vertex 2.544142e+02 2.644142e+02 0.000000e+00 + vertex 2.547321e+02 2.640000e+02 -6.000000e+00 + vertex 2.544142e+02 2.644142e+02 -6.000000e+00 + endloop + endfacet + facet normal 6.087614e-01 7.933533e-01 0.000000e+00 + outer loop + vertex 2.544142e+02 2.644142e+02 0.000000e+00 + vertex 2.544142e+02 2.644142e+02 -6.000000e+00 + vertex 2.540000e+02 2.647321e+02 0.000000e+00 + endloop + endfacet + facet normal 6.087614e-01 7.933533e-01 -1.748806e-15 + outer loop + vertex 2.540000e+02 2.647321e+02 0.000000e+00 + vertex 2.544142e+02 2.644142e+02 -6.000000e+00 + vertex 2.540000e+02 2.647321e+02 -6.000000e+00 + endloop + endfacet + facet normal 3.826834e-01 9.238795e-01 -5.127239e-15 + outer loop + vertex 2.540000e+02 2.647321e+02 0.000000e+00 + vertex 2.540000e+02 2.647321e+02 -6.000000e+00 + vertex 2.535176e+02 2.649319e+02 0.000000e+00 + endloop + endfacet + facet normal 3.826834e-01 9.238795e-01 0.000000e+00 + outer loop + vertex 2.535176e+02 2.649319e+02 0.000000e+00 + vertex 2.540000e+02 2.647321e+02 -6.000000e+00 + vertex 2.535176e+02 2.649319e+02 -6.000000e+00 + endloop + endfacet + facet normal 1.305262e-01 9.914449e-01 0.000000e+00 + outer loop + vertex 2.535176e+02 2.649319e+02 0.000000e+00 + vertex 2.535176e+02 2.649319e+02 -6.000000e+00 + vertex 2.530000e+02 2.650000e+02 0.000000e+00 + endloop + endfacet + facet normal 1.305262e-01 9.914449e-01 0.000000e+00 + outer loop + vertex 2.530000e+02 2.650000e+02 0.000000e+00 + vertex 2.535176e+02 2.649319e+02 -6.000000e+00 + vertex 2.530000e+02 2.650000e+02 -6.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 1.000000e+00 0.000000e+00 + outer loop + vertex 1.399309e+02 2.650000e+02 0.000000e+00 + vertex 2.530000e+02 2.650000e+02 0.000000e+00 + vertex 1.399309e+02 2.650000e+02 -2.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 1.000000e+00 0.000000e+00 + outer loop + vertex 1.399309e+02 2.650000e+02 -2.000000e+00 + vertex 2.530000e+02 2.650000e+02 0.000000e+00 + vertex 2.530000e+02 2.650000e+02 -6.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 1.000000e+00 0.000000e+00 + outer loop + vertex 1.399309e+02 2.650000e+02 -2.000000e+00 + vertex 2.530000e+02 2.650000e+02 -6.000000e+00 + vertex 1.300691e+02 2.650000e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 1.000000e+00 0.000000e+00 + outer loop + vertex 1.300691e+02 2.650000e+02 -2.000000e+00 + vertex 2.530000e+02 2.650000e+02 -6.000000e+00 + vertex -1.300415e+02 2.650000e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 1.000000e+00 -0.000000e+00 + outer loop + vertex 1.300691e+02 2.650000e+02 -2.000000e+00 + vertex -1.300415e+02 2.650000e+02 -2.000000e+00 + vertex 1.300691e+02 2.650000e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 1.000000e+00 0.000000e+00 + outer loop + vertex 1.300691e+02 2.650000e+02 0.000000e+00 + vertex -1.300415e+02 2.650000e+02 -2.000000e+00 + vertex -1.300415e+02 2.650000e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 1.000000e+00 0.000000e+00 + outer loop + vertex 2.530000e+02 2.650000e+02 -6.000000e+00 + vertex -2.530000e+02 2.650000e+02 -6.000000e+00 + vertex -1.300415e+02 2.650000e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 1.000000e+00 0.000000e+00 + outer loop + vertex -1.300415e+02 2.650000e+02 -2.000000e+00 + vertex -2.530000e+02 2.650000e+02 -6.000000e+00 + vertex -1.399563e+02 2.650000e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 1.000000e+00 0.000000e+00 + outer loop + vertex -1.399563e+02 2.650000e+02 -2.000000e+00 + vertex -2.530000e+02 2.650000e+02 -6.000000e+00 + vertex -2.530000e+02 2.650000e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 1.000000e+00 0.000000e+00 + outer loop + vertex -1.399563e+02 2.650000e+02 -2.000000e+00 + vertex -2.530000e+02 2.650000e+02 0.000000e+00 + vertex -1.399563e+02 2.650000e+02 0.000000e+00 + endloop + endfacet + facet normal -1.305262e-01 9.914449e-01 0.000000e+00 + outer loop + vertex -2.530000e+02 2.650000e+02 0.000000e+00 + vertex -2.530000e+02 2.650000e+02 -6.000000e+00 + vertex -2.535176e+02 2.649319e+02 0.000000e+00 + endloop + endfacet + facet normal -1.305262e-01 9.914449e-01 -1.001115e-14 + outer loop + vertex -2.535176e+02 2.649319e+02 0.000000e+00 + vertex -2.530000e+02 2.650000e+02 -6.000000e+00 + vertex -2.535176e+02 2.649319e+02 -6.000000e+00 + endloop + endfacet + facet normal -3.826834e-01 9.238795e-01 -1.056550e-14 + outer loop + vertex -2.535176e+02 2.649319e+02 0.000000e+00 + vertex -2.535176e+02 2.649319e+02 -6.000000e+00 + vertex -2.540000e+02 2.647321e+02 0.000000e+00 + endloop + endfacet + facet normal -3.826834e-01 9.238795e-01 -3.625506e-15 + outer loop + vertex -2.540000e+02 2.647321e+02 0.000000e+00 + vertex -2.535176e+02 2.649319e+02 -6.000000e+00 + vertex -2.540000e+02 2.647321e+02 -6.000000e+00 + endloop + endfacet + facet normal -6.087614e-01 7.933533e-01 -5.767347e-15 + outer loop + vertex -2.540000e+02 2.647321e+02 0.000000e+00 + vertex -2.540000e+02 2.647321e+02 -6.000000e+00 + vertex -2.544142e+02 2.644142e+02 0.000000e+00 + endloop + endfacet + facet normal -6.087614e-01 7.933533e-01 -7.516153e-15 + outer loop + vertex -2.544142e+02 2.644142e+02 0.000000e+00 + vertex -2.540000e+02 2.647321e+02 -6.000000e+00 + vertex -2.544142e+02 2.644142e+02 -6.000000e+00 + endloop + endfacet + facet normal -7.933533e-01 6.087614e-01 -5.767347e-15 + outer loop + vertex -2.544142e+02 2.644142e+02 0.000000e+00 + vertex -2.544142e+02 2.644142e+02 -6.000000e+00 + vertex -2.547321e+02 2.640000e+02 0.000000e+00 + endloop + endfacet + facet normal -7.933533e-01 6.087614e-01 -3.758076e-15 + outer loop + vertex -2.547321e+02 2.640000e+02 0.000000e+00 + vertex -2.544142e+02 2.644142e+02 -6.000000e+00 + vertex -2.547321e+02 2.640000e+02 -6.000000e+00 + endloop + endfacet + facet normal -9.238795e-01 3.826834e-01 -4.376373e-15 + outer loop + vertex -2.547321e+02 2.640000e+02 0.000000e+00 + vertex -2.547321e+02 2.640000e+02 -6.000000e+00 + vertex -2.549319e+02 2.635176e+02 0.000000e+00 + endloop + endfacet + facet normal -9.238795e-01 3.826834e-01 0.000000e+00 + outer loop + vertex -2.549319e+02 2.635176e+02 0.000000e+00 + vertex -2.547321e+02 2.640000e+02 -6.000000e+00 + vertex -2.549319e+02 2.635176e+02 -6.000000e+00 + endloop + endfacet + facet normal -9.914449e-01 1.305262e-01 0.000000e+00 + outer loop + vertex -2.549319e+02 2.635176e+02 0.000000e+00 + vertex -2.549319e+02 2.635176e+02 -6.000000e+00 + vertex -2.550000e+02 2.630000e+02 0.000000e+00 + endloop + endfacet + facet normal -9.914449e-01 1.305262e-01 0.000000e+00 + outer loop + vertex -2.550000e+02 2.630000e+02 0.000000e+00 + vertex -2.549319e+02 2.635176e+02 -6.000000e+00 + vertex -2.550000e+02 2.630000e+02 -6.000000e+00 + endloop + endfacet + facet normal 8.660254e-01 -5.000000e-01 0.000000e+00 + outer loop + vertex 1.339608e+02 2.618000e+02 1.000000e+00 + vertex 1.329215e+02 2.600000e+02 1.000000e+00 + vertex 1.339608e+02 2.618000e+02 0.000000e+00 + endloop + endfacet + facet normal 8.660254e-01 -5.000000e-01 0.000000e+00 + outer loop + vertex 1.339608e+02 2.618000e+02 0.000000e+00 + vertex 1.329215e+02 2.600000e+02 1.000000e+00 + vertex 1.329215e+02 2.600000e+02 0.000000e+00 + endloop + endfacet + facet normal 8.660254e-01 5.000000e-01 0.000000e+00 + outer loop + vertex 1.329215e+02 2.600000e+02 1.000000e+00 + vertex 1.339608e+02 2.582000e+02 1.000000e+00 + vertex 1.329215e+02 2.600000e+02 0.000000e+00 + endloop + endfacet + facet normal 8.660254e-01 5.000000e-01 0.000000e+00 + outer loop + vertex 1.329215e+02 2.600000e+02 0.000000e+00 + vertex 1.339608e+02 2.582000e+02 1.000000e+00 + vertex 1.339608e+02 2.582000e+02 0.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 1.000000e+00 0.000000e+00 + outer loop + vertex 1.339608e+02 2.582000e+02 1.000000e+00 + vertex 1.360392e+02 2.582000e+02 1.000000e+00 + vertex 1.339608e+02 2.582000e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 1.000000e+00 0.000000e+00 + outer loop + vertex 1.339608e+02 2.582000e+02 0.000000e+00 + vertex 1.360392e+02 2.582000e+02 1.000000e+00 + vertex 1.360392e+02 2.582000e+02 0.000000e+00 + endloop + endfacet + facet normal -8.660254e-01 5.000000e-01 0.000000e+00 + outer loop + vertex 1.360392e+02 2.582000e+02 1.000000e+00 + vertex 1.370785e+02 2.600000e+02 1.000000e+00 + vertex 1.360392e+02 2.582000e+02 0.000000e+00 + endloop + endfacet + facet normal -8.660254e-01 5.000000e-01 0.000000e+00 + outer loop + vertex 1.360392e+02 2.582000e+02 0.000000e+00 + vertex 1.370785e+02 2.600000e+02 1.000000e+00 + vertex 1.370785e+02 2.600000e+02 0.000000e+00 + endloop + endfacet + facet normal -8.660254e-01 -5.000000e-01 -0.000000e+00 + outer loop + vertex 1.370785e+02 2.600000e+02 1.000000e+00 + vertex 1.360392e+02 2.618000e+02 1.000000e+00 + vertex 1.370785e+02 2.600000e+02 0.000000e+00 + endloop + endfacet + facet normal -8.660254e-01 -5.000000e-01 0.000000e+00 + outer loop + vertex 1.370785e+02 2.600000e+02 0.000000e+00 + vertex 1.360392e+02 2.618000e+02 1.000000e+00 + vertex 1.360392e+02 2.618000e+02 0.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 -1.000000e+00 -0.000000e+00 + outer loop + vertex 1.360392e+02 2.618000e+02 1.000000e+00 + vertex 1.339608e+02 2.618000e+02 1.000000e+00 + vertex 1.360392e+02 2.618000e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -1.000000e+00 0.000000e+00 + outer loop + vertex 1.360392e+02 2.618000e+02 0.000000e+00 + vertex 1.339608e+02 2.618000e+02 1.000000e+00 + vertex 1.339608e+02 2.618000e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.360392e+02 2.618000e+02 0.000000e+00 + vertex 1.339608e+02 2.618000e+02 0.000000e+00 + vertex 1.370785e+02 2.600000e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.370785e+02 2.600000e+02 0.000000e+00 + vertex 1.339608e+02 2.618000e+02 0.000000e+00 + vertex 1.329215e+02 2.600000e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.370785e+02 2.600000e+02 0.000000e+00 + vertex 1.329215e+02 2.600000e+02 0.000000e+00 + vertex 1.360392e+02 2.582000e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.360392e+02 2.582000e+02 0.000000e+00 + vertex 1.329215e+02 2.600000e+02 0.000000e+00 + vertex 1.339608e+02 2.582000e+02 0.000000e+00 + endloop + endfacet + facet normal 8.660254e-01 -5.000000e-01 0.000000e+00 + outer loop + vertex -1.360392e+02 2.618000e+02 1.000000e+00 + vertex -1.370785e+02 2.600000e+02 1.000000e+00 + vertex -1.360392e+02 2.618000e+02 0.000000e+00 + endloop + endfacet + facet normal 8.660254e-01 -5.000000e-01 0.000000e+00 + outer loop + vertex -1.360392e+02 2.618000e+02 0.000000e+00 + vertex -1.370785e+02 2.600000e+02 1.000000e+00 + vertex -1.370785e+02 2.600000e+02 0.000000e+00 + endloop + endfacet + facet normal 8.660254e-01 5.000000e-01 0.000000e+00 + outer loop + vertex -1.370785e+02 2.600000e+02 1.000000e+00 + vertex -1.360392e+02 2.582000e+02 1.000000e+00 + vertex -1.370785e+02 2.600000e+02 0.000000e+00 + endloop + endfacet + facet normal 8.660254e-01 5.000000e-01 0.000000e+00 + outer loop + vertex -1.370785e+02 2.600000e+02 0.000000e+00 + vertex -1.360392e+02 2.582000e+02 1.000000e+00 + vertex -1.360392e+02 2.582000e+02 0.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 1.000000e+00 0.000000e+00 + outer loop + vertex -1.360392e+02 2.582000e+02 1.000000e+00 + vertex -1.339608e+02 2.582000e+02 1.000000e+00 + vertex -1.360392e+02 2.582000e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 1.000000e+00 0.000000e+00 + outer loop + vertex -1.360392e+02 2.582000e+02 0.000000e+00 + vertex -1.339608e+02 2.582000e+02 1.000000e+00 + vertex -1.339608e+02 2.582000e+02 0.000000e+00 + endloop + endfacet + facet normal -8.660254e-01 5.000000e-01 0.000000e+00 + outer loop + vertex -1.339608e+02 2.582000e+02 1.000000e+00 + vertex -1.329215e+02 2.600000e+02 1.000000e+00 + vertex -1.339608e+02 2.582000e+02 0.000000e+00 + endloop + endfacet + facet normal -8.660254e-01 5.000000e-01 0.000000e+00 + outer loop + vertex -1.339608e+02 2.582000e+02 0.000000e+00 + vertex -1.329215e+02 2.600000e+02 1.000000e+00 + vertex -1.329215e+02 2.600000e+02 0.000000e+00 + endloop + endfacet + facet normal -8.660254e-01 -5.000000e-01 -0.000000e+00 + outer loop + vertex -1.329215e+02 2.600000e+02 1.000000e+00 + vertex -1.339608e+02 2.618000e+02 1.000000e+00 + vertex -1.329215e+02 2.600000e+02 0.000000e+00 + endloop + endfacet + facet normal -8.660254e-01 -5.000000e-01 0.000000e+00 + outer loop + vertex -1.329215e+02 2.600000e+02 0.000000e+00 + vertex -1.339608e+02 2.618000e+02 1.000000e+00 + vertex -1.339608e+02 2.618000e+02 0.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 -1.000000e+00 -0.000000e+00 + outer loop + vertex -1.339608e+02 2.618000e+02 1.000000e+00 + vertex -1.360392e+02 2.618000e+02 1.000000e+00 + vertex -1.339608e+02 2.618000e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -1.000000e+00 0.000000e+00 + outer loop + vertex -1.339608e+02 2.618000e+02 0.000000e+00 + vertex -1.360392e+02 2.618000e+02 1.000000e+00 + vertex -1.360392e+02 2.618000e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.339608e+02 2.618000e+02 0.000000e+00 + vertex -1.360392e+02 2.618000e+02 0.000000e+00 + vertex -1.329215e+02 2.600000e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.329215e+02 2.600000e+02 0.000000e+00 + vertex -1.360392e+02 2.618000e+02 0.000000e+00 + vertex -1.370785e+02 2.600000e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.329215e+02 2.600000e+02 0.000000e+00 + vertex -1.370785e+02 2.600000e+02 0.000000e+00 + vertex -1.339608e+02 2.582000e+02 0.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.339608e+02 2.582000e+02 0.000000e+00 + vertex -1.370785e+02 2.600000e+02 0.000000e+00 + vertex -1.360392e+02 2.582000e+02 0.000000e+00 + endloop + endfacet + facet normal 9.914449e-01 -1.305262e-01 0.000000e+00 + outer loop + vertex 1.376563e+02 2.592882e+02 1.000000e+00 + vertex 1.376563e+02 2.592882e+02 -2.000000e+00 + vertex 1.377500e+02 2.600000e+02 1.000000e+00 + endloop + endfacet + facet normal 9.914449e-01 -1.305262e-01 0.000000e+00 + outer loop + vertex 1.377500e+02 2.600000e+02 1.000000e+00 + vertex 1.376563e+02 2.592882e+02 -2.000000e+00 + vertex 1.377500e+02 2.600000e+02 -2.000000e+00 + endloop + endfacet + facet normal 9.914449e-01 1.305262e-01 0.000000e+00 + outer loop + vertex 1.377500e+02 2.600000e+02 1.000000e+00 + vertex 1.377500e+02 2.600000e+02 -2.000000e+00 + vertex 1.376563e+02 2.607118e+02 1.000000e+00 + endloop + endfacet + facet normal 9.914449e-01 1.305262e-01 0.000000e+00 + outer loop + vertex 1.376563e+02 2.607118e+02 1.000000e+00 + vertex 1.377500e+02 2.600000e+02 -2.000000e+00 + vertex 1.376563e+02 2.607118e+02 -2.000000e+00 + endloop + endfacet + facet normal 9.238795e-01 3.826834e-01 0.000000e+00 + outer loop + vertex 1.376563e+02 2.607118e+02 1.000000e+00 + vertex 1.376563e+02 2.607118e+02 -2.000000e+00 + vertex 1.373816e+02 2.613750e+02 1.000000e+00 + endloop + endfacet + facet normal 9.238795e-01 3.826834e-01 0.000000e+00 + outer loop + vertex 1.373816e+02 2.613750e+02 1.000000e+00 + vertex 1.376563e+02 2.607118e+02 -2.000000e+00 + vertex 1.373816e+02 2.613750e+02 -2.000000e+00 + endloop + endfacet + facet normal 7.933533e-01 6.087614e-01 0.000000e+00 + outer loop + vertex 1.373816e+02 2.613750e+02 1.000000e+00 + vertex 1.373816e+02 2.613750e+02 -2.000000e+00 + vertex 1.369445e+02 2.619445e+02 1.000000e+00 + endloop + endfacet + facet normal 7.933533e-01 6.087614e-01 0.000000e+00 + outer loop + vertex 1.369445e+02 2.619445e+02 1.000000e+00 + vertex 1.373816e+02 2.613750e+02 -2.000000e+00 + vertex 1.369445e+02 2.619445e+02 -2.000000e+00 + endloop + endfacet + facet normal 6.087614e-01 7.933533e-01 0.000000e+00 + outer loop + vertex 1.369445e+02 2.619445e+02 1.000000e+00 + vertex 1.369445e+02 2.619445e+02 -2.000000e+00 + vertex 1.363750e+02 2.623816e+02 1.000000e+00 + endloop + endfacet + facet normal 6.087614e-01 7.933533e-01 0.000000e+00 + outer loop + vertex 1.363750e+02 2.623816e+02 1.000000e+00 + vertex 1.369445e+02 2.619445e+02 -2.000000e+00 + vertex 1.363750e+02 2.623816e+02 -2.000000e+00 + endloop + endfacet + facet normal 3.826834e-01 9.238795e-01 0.000000e+00 + outer loop + vertex 1.363750e+02 2.623816e+02 1.000000e+00 + vertex 1.363750e+02 2.623816e+02 -2.000000e+00 + vertex 1.357118e+02 2.626563e+02 1.000000e+00 + endloop + endfacet + facet normal 3.826834e-01 9.238795e-01 0.000000e+00 + outer loop + vertex 1.357118e+02 2.626563e+02 1.000000e+00 + vertex 1.363750e+02 2.623816e+02 -2.000000e+00 + vertex 1.357118e+02 2.626563e+02 -2.000000e+00 + endloop + endfacet + facet normal 1.305262e-01 9.914449e-01 0.000000e+00 + outer loop + vertex 1.357118e+02 2.626563e+02 1.000000e+00 + vertex 1.357118e+02 2.626563e+02 -2.000000e+00 + vertex 1.350000e+02 2.627500e+02 1.000000e+00 + endloop + endfacet + facet normal 1.305262e-01 9.914449e-01 0.000000e+00 + outer loop + vertex 1.350000e+02 2.627500e+02 1.000000e+00 + vertex 1.357118e+02 2.626563e+02 -2.000000e+00 + vertex 1.350000e+02 2.627500e+02 -2.000000e+00 + endloop + endfacet + facet normal -1.305262e-01 9.914449e-01 0.000000e+00 + outer loop + vertex 1.350000e+02 2.627500e+02 1.000000e+00 + vertex 1.350000e+02 2.627500e+02 -2.000000e+00 + vertex 1.342882e+02 2.626563e+02 1.000000e+00 + endloop + endfacet + facet normal -1.305262e-01 9.914449e-01 0.000000e+00 + outer loop + vertex 1.342882e+02 2.626563e+02 1.000000e+00 + vertex 1.350000e+02 2.627500e+02 -2.000000e+00 + vertex 1.342882e+02 2.626563e+02 -2.000000e+00 + endloop + endfacet + facet normal -3.826834e-01 9.238795e-01 0.000000e+00 + outer loop + vertex 1.342882e+02 2.626563e+02 1.000000e+00 + vertex 1.342882e+02 2.626563e+02 -2.000000e+00 + vertex 1.336250e+02 2.623816e+02 1.000000e+00 + endloop + endfacet + facet normal -3.826834e-01 9.238795e-01 0.000000e+00 + outer loop + vertex 1.336250e+02 2.623816e+02 1.000000e+00 + vertex 1.342882e+02 2.626563e+02 -2.000000e+00 + vertex 1.336250e+02 2.623816e+02 -2.000000e+00 + endloop + endfacet + facet normal -6.087614e-01 7.933533e-01 0.000000e+00 + outer loop + vertex 1.336250e+02 2.623816e+02 1.000000e+00 + vertex 1.336250e+02 2.623816e+02 -2.000000e+00 + vertex 1.330555e+02 2.619445e+02 1.000000e+00 + endloop + endfacet + facet normal -6.087614e-01 7.933533e-01 0.000000e+00 + outer loop + vertex 1.330555e+02 2.619445e+02 1.000000e+00 + vertex 1.336250e+02 2.623816e+02 -2.000000e+00 + vertex 1.330555e+02 2.619445e+02 -2.000000e+00 + endloop + endfacet + facet normal -7.933533e-01 6.087614e-01 0.000000e+00 + outer loop + vertex 1.330555e+02 2.619445e+02 1.000000e+00 + vertex 1.330555e+02 2.619445e+02 -2.000000e+00 + vertex 1.326184e+02 2.613750e+02 1.000000e+00 + endloop + endfacet + facet normal -7.933533e-01 6.087614e-01 0.000000e+00 + outer loop + vertex 1.326184e+02 2.613750e+02 1.000000e+00 + vertex 1.330555e+02 2.619445e+02 -2.000000e+00 + vertex 1.326184e+02 2.613750e+02 -2.000000e+00 + endloop + endfacet + facet normal -9.238795e-01 3.826834e-01 0.000000e+00 + outer loop + vertex 1.326184e+02 2.613750e+02 1.000000e+00 + vertex 1.326184e+02 2.613750e+02 -2.000000e+00 + vertex 1.323437e+02 2.607118e+02 1.000000e+00 + endloop + endfacet + facet normal -9.238795e-01 3.826834e-01 0.000000e+00 + outer loop + vertex 1.323437e+02 2.607118e+02 1.000000e+00 + vertex 1.326184e+02 2.613750e+02 -2.000000e+00 + vertex 1.323437e+02 2.607118e+02 -2.000000e+00 + endloop + endfacet + facet normal -9.914449e-01 1.305262e-01 0.000000e+00 + outer loop + vertex 1.323437e+02 2.607118e+02 1.000000e+00 + vertex 1.323437e+02 2.607118e+02 -2.000000e+00 + vertex 1.322500e+02 2.600000e+02 1.000000e+00 + endloop + endfacet + facet normal -9.914449e-01 1.305262e-01 0.000000e+00 + outer loop + vertex 1.322500e+02 2.600000e+02 1.000000e+00 + vertex 1.323437e+02 2.607118e+02 -2.000000e+00 + vertex 1.322500e+02 2.600000e+02 -2.000000e+00 + endloop + endfacet + facet normal -9.914449e-01 -1.305262e-01 -0.000000e+00 + outer loop + vertex 1.322500e+02 2.600000e+02 1.000000e+00 + vertex 1.322500e+02 2.600000e+02 -2.000000e+00 + vertex 1.323437e+02 2.592882e+02 1.000000e+00 + endloop + endfacet + facet normal -9.914449e-01 -1.305262e-01 -0.000000e+00 + outer loop + vertex 1.323437e+02 2.592882e+02 1.000000e+00 + vertex 1.322500e+02 2.600000e+02 -2.000000e+00 + vertex 1.323437e+02 2.592882e+02 -2.000000e+00 + endloop + endfacet + facet normal -9.238795e-01 -3.826834e-01 -0.000000e+00 + outer loop + vertex 1.323437e+02 2.592882e+02 1.000000e+00 + vertex 1.323437e+02 2.592882e+02 -2.000000e+00 + vertex 1.326184e+02 2.586250e+02 1.000000e+00 + endloop + endfacet + facet normal -9.238795e-01 -3.826834e-01 -0.000000e+00 + outer loop + vertex 1.326184e+02 2.586250e+02 1.000000e+00 + vertex 1.323437e+02 2.592882e+02 -2.000000e+00 + vertex 1.326184e+02 2.586250e+02 -2.000000e+00 + endloop + endfacet + facet normal -7.933533e-01 -6.087614e-01 -0.000000e+00 + outer loop + vertex 1.326184e+02 2.586250e+02 1.000000e+00 + vertex 1.326184e+02 2.586250e+02 -2.000000e+00 + vertex 1.330555e+02 2.580555e+02 1.000000e+00 + endloop + endfacet + facet normal -7.933533e-01 -6.087614e-01 -0.000000e+00 + outer loop + vertex 1.330555e+02 2.580555e+02 1.000000e+00 + vertex 1.326184e+02 2.586250e+02 -2.000000e+00 + vertex 1.330555e+02 2.580555e+02 -2.000000e+00 + endloop + endfacet + facet normal -6.087614e-01 -7.933533e-01 -0.000000e+00 + outer loop + vertex 1.330555e+02 2.580555e+02 1.000000e+00 + vertex 1.330555e+02 2.580555e+02 -2.000000e+00 + vertex 1.336250e+02 2.576184e+02 1.000000e+00 + endloop + endfacet + facet normal -6.087614e-01 -7.933533e-01 -0.000000e+00 + outer loop + vertex 1.336250e+02 2.576184e+02 1.000000e+00 + vertex 1.330555e+02 2.580555e+02 -2.000000e+00 + vertex 1.336250e+02 2.576184e+02 -2.000000e+00 + endloop + endfacet + facet normal -3.826834e-01 -9.238795e-01 -0.000000e+00 + outer loop + vertex 1.336250e+02 2.576184e+02 1.000000e+00 + vertex 1.336250e+02 2.576184e+02 -2.000000e+00 + vertex 1.342882e+02 2.573437e+02 1.000000e+00 + endloop + endfacet + facet normal -3.826834e-01 -9.238795e-01 -0.000000e+00 + outer loop + vertex 1.342882e+02 2.573437e+02 1.000000e+00 + vertex 1.336250e+02 2.576184e+02 -2.000000e+00 + vertex 1.342882e+02 2.573437e+02 -2.000000e+00 + endloop + endfacet + facet normal -1.305262e-01 -9.914449e-01 -0.000000e+00 + outer loop + vertex 1.342882e+02 2.573437e+02 1.000000e+00 + vertex 1.342882e+02 2.573437e+02 -2.000000e+00 + vertex 1.350000e+02 2.572500e+02 1.000000e+00 + endloop + endfacet + facet normal -1.305262e-01 -9.914449e-01 -0.000000e+00 + outer loop + vertex 1.350000e+02 2.572500e+02 1.000000e+00 + vertex 1.342882e+02 2.573437e+02 -2.000000e+00 + vertex 1.350000e+02 2.572500e+02 -2.000000e+00 + endloop + endfacet + facet normal 1.305262e-01 -9.914449e-01 0.000000e+00 + outer loop + vertex 1.350000e+02 2.572500e+02 1.000000e+00 + vertex 1.350000e+02 2.572500e+02 -2.000000e+00 + vertex 1.357118e+02 2.573437e+02 1.000000e+00 + endloop + endfacet + facet normal 1.305262e-01 -9.914449e-01 0.000000e+00 + outer loop + vertex 1.357118e+02 2.573437e+02 1.000000e+00 + vertex 1.350000e+02 2.572500e+02 -2.000000e+00 + vertex 1.357118e+02 2.573437e+02 -2.000000e+00 + endloop + endfacet + facet normal 3.826834e-01 -9.238795e-01 0.000000e+00 + outer loop + vertex 1.357118e+02 2.573437e+02 1.000000e+00 + vertex 1.357118e+02 2.573437e+02 -2.000000e+00 + vertex 1.363750e+02 2.576184e+02 1.000000e+00 + endloop + endfacet + facet normal 3.826834e-01 -9.238795e-01 0.000000e+00 + outer loop + vertex 1.363750e+02 2.576184e+02 1.000000e+00 + vertex 1.357118e+02 2.573437e+02 -2.000000e+00 + vertex 1.363750e+02 2.576184e+02 -2.000000e+00 + endloop + endfacet + facet normal 6.087614e-01 -7.933533e-01 0.000000e+00 + outer loop + vertex 1.363750e+02 2.576184e+02 1.000000e+00 + vertex 1.363750e+02 2.576184e+02 -2.000000e+00 + vertex 1.369445e+02 2.580555e+02 1.000000e+00 + endloop + endfacet + facet normal 6.087614e-01 -7.933533e-01 0.000000e+00 + outer loop + vertex 1.369445e+02 2.580555e+02 1.000000e+00 + vertex 1.363750e+02 2.576184e+02 -2.000000e+00 + vertex 1.369445e+02 2.580555e+02 -2.000000e+00 + endloop + endfacet + facet normal 7.933533e-01 -6.087614e-01 0.000000e+00 + outer loop + vertex 1.369445e+02 2.580555e+02 1.000000e+00 + vertex 1.369445e+02 2.580555e+02 -2.000000e+00 + vertex 1.373816e+02 2.586250e+02 1.000000e+00 + endloop + endfacet + facet normal 7.933533e-01 -6.087614e-01 0.000000e+00 + outer loop + vertex 1.373816e+02 2.586250e+02 1.000000e+00 + vertex 1.369445e+02 2.580555e+02 -2.000000e+00 + vertex 1.373816e+02 2.586250e+02 -2.000000e+00 + endloop + endfacet + facet normal 9.238795e-01 -3.826834e-01 0.000000e+00 + outer loop + vertex 1.373816e+02 2.586250e+02 1.000000e+00 + vertex 1.373816e+02 2.586250e+02 -2.000000e+00 + vertex 1.376563e+02 2.592882e+02 1.000000e+00 + endloop + endfacet + facet normal 9.238795e-01 -3.826834e-01 0.000000e+00 + outer loop + vertex 1.376563e+02 2.592882e+02 1.000000e+00 + vertex 1.373816e+02 2.586250e+02 -2.000000e+00 + vertex 1.376563e+02 2.592882e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.339608e+02 2.618000e+02 1.000000e+00 + vertex 1.326184e+02 2.613750e+02 1.000000e+00 + vertex 1.329215e+02 2.600000e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.329215e+02 2.600000e+02 1.000000e+00 + vertex 1.326184e+02 2.613750e+02 1.000000e+00 + vertex 1.323437e+02 2.607118e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.329215e+02 2.600000e+02 1.000000e+00 + vertex 1.323437e+02 2.607118e+02 1.000000e+00 + vertex 1.322500e+02 2.600000e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.360392e+02 2.618000e+02 1.000000e+00 + vertex 1.350000e+02 2.627500e+02 1.000000e+00 + vertex 1.339608e+02 2.618000e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.339608e+02 2.618000e+02 1.000000e+00 + vertex 1.350000e+02 2.627500e+02 1.000000e+00 + vertex 1.342882e+02 2.626563e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -0.000000e+00 1.000000e+00 + outer loop + vertex 1.339608e+02 2.618000e+02 1.000000e+00 + vertex 1.342882e+02 2.626563e+02 1.000000e+00 + vertex 1.336250e+02 2.623816e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -0.000000e+00 1.000000e+00 + outer loop + vertex 1.370785e+02 2.600000e+02 1.000000e+00 + vertex 1.373816e+02 2.613750e+02 1.000000e+00 + vertex 1.360392e+02 2.618000e+02 1.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.360392e+02 2.618000e+02 1.000000e+00 + vertex 1.373816e+02 2.613750e+02 1.000000e+00 + vertex 1.369445e+02 2.619445e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.360392e+02 2.618000e+02 1.000000e+00 + vertex 1.369445e+02 2.619445e+02 1.000000e+00 + vertex 1.363750e+02 2.623816e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.360392e+02 2.582000e+02 1.000000e+00 + vertex 1.373816e+02 2.586250e+02 1.000000e+00 + vertex 1.370785e+02 2.600000e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.370785e+02 2.600000e+02 1.000000e+00 + vertex 1.373816e+02 2.586250e+02 1.000000e+00 + vertex 1.376563e+02 2.592882e+02 1.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.370785e+02 2.600000e+02 1.000000e+00 + vertex 1.376563e+02 2.592882e+02 1.000000e+00 + vertex 1.377500e+02 2.600000e+02 1.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.339608e+02 2.582000e+02 1.000000e+00 + vertex 1.350000e+02 2.572500e+02 1.000000e+00 + vertex 1.360392e+02 2.582000e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.360392e+02 2.582000e+02 1.000000e+00 + vertex 1.350000e+02 2.572500e+02 1.000000e+00 + vertex 1.357118e+02 2.573437e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.360392e+02 2.582000e+02 1.000000e+00 + vertex 1.357118e+02 2.573437e+02 1.000000e+00 + vertex 1.363750e+02 2.576184e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.329215e+02 2.600000e+02 1.000000e+00 + vertex 1.326184e+02 2.586250e+02 1.000000e+00 + vertex 1.339608e+02 2.582000e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.339608e+02 2.582000e+02 1.000000e+00 + vertex 1.326184e+02 2.586250e+02 1.000000e+00 + vertex 1.330555e+02 2.580555e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.339608e+02 2.582000e+02 1.000000e+00 + vertex 1.330555e+02 2.580555e+02 1.000000e+00 + vertex 1.336250e+02 2.576184e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.377500e+02 2.600000e+02 1.000000e+00 + vertex 1.376563e+02 2.607118e+02 1.000000e+00 + vertex 1.370785e+02 2.600000e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.370785e+02 2.600000e+02 1.000000e+00 + vertex 1.376563e+02 2.607118e+02 1.000000e+00 + vertex 1.373816e+02 2.613750e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.363750e+02 2.623816e+02 1.000000e+00 + vertex 1.357118e+02 2.626563e+02 1.000000e+00 + vertex 1.360392e+02 2.618000e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.360392e+02 2.618000e+02 1.000000e+00 + vertex 1.357118e+02 2.626563e+02 1.000000e+00 + vertex 1.350000e+02 2.627500e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.336250e+02 2.623816e+02 1.000000e+00 + vertex 1.330555e+02 2.619445e+02 1.000000e+00 + vertex 1.339608e+02 2.618000e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.339608e+02 2.618000e+02 1.000000e+00 + vertex 1.330555e+02 2.619445e+02 1.000000e+00 + vertex 1.326184e+02 2.613750e+02 1.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.322500e+02 2.600000e+02 1.000000e+00 + vertex 1.323437e+02 2.592882e+02 1.000000e+00 + vertex 1.329215e+02 2.600000e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.329215e+02 2.600000e+02 1.000000e+00 + vertex 1.323437e+02 2.592882e+02 1.000000e+00 + vertex 1.326184e+02 2.586250e+02 1.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.336250e+02 2.576184e+02 1.000000e+00 + vertex 1.342882e+02 2.573437e+02 1.000000e+00 + vertex 1.339608e+02 2.582000e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.339608e+02 2.582000e+02 1.000000e+00 + vertex 1.342882e+02 2.573437e+02 1.000000e+00 + vertex 1.350000e+02 2.572500e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -0.000000e+00 1.000000e+00 + outer loop + vertex 1.363750e+02 2.576184e+02 1.000000e+00 + vertex 1.369445e+02 2.580555e+02 1.000000e+00 + vertex 1.360392e+02 2.582000e+02 1.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.360392e+02 2.582000e+02 1.000000e+00 + vertex 1.369445e+02 2.580555e+02 1.000000e+00 + vertex 1.373816e+02 2.586250e+02 1.000000e+00 + endloop + endfacet + facet normal 9.914449e-01 -1.305262e-01 0.000000e+00 + outer loop + vertex -1.323437e+02 2.592882e+02 1.000000e+00 + vertex -1.323437e+02 2.592882e+02 -2.000000e+00 + vertex -1.322500e+02 2.600000e+02 1.000000e+00 + endloop + endfacet + facet normal 9.914449e-01 -1.305262e-01 0.000000e+00 + outer loop + vertex -1.322500e+02 2.600000e+02 1.000000e+00 + vertex -1.323437e+02 2.592882e+02 -2.000000e+00 + vertex -1.322500e+02 2.600000e+02 -2.000000e+00 + endloop + endfacet + facet normal 9.914449e-01 1.305262e-01 0.000000e+00 + outer loop + vertex -1.322500e+02 2.600000e+02 1.000000e+00 + vertex -1.322500e+02 2.600000e+02 -2.000000e+00 + vertex -1.323437e+02 2.607118e+02 1.000000e+00 + endloop + endfacet + facet normal 9.914449e-01 1.305262e-01 0.000000e+00 + outer loop + vertex -1.323437e+02 2.607118e+02 1.000000e+00 + vertex -1.322500e+02 2.600000e+02 -2.000000e+00 + vertex -1.323437e+02 2.607118e+02 -2.000000e+00 + endloop + endfacet + facet normal 9.238795e-01 3.826834e-01 0.000000e+00 + outer loop + vertex -1.323437e+02 2.607118e+02 1.000000e+00 + vertex -1.323437e+02 2.607118e+02 -2.000000e+00 + vertex -1.326184e+02 2.613750e+02 1.000000e+00 + endloop + endfacet + facet normal 9.238795e-01 3.826834e-01 0.000000e+00 + outer loop + vertex -1.326184e+02 2.613750e+02 1.000000e+00 + vertex -1.323437e+02 2.607118e+02 -2.000000e+00 + vertex -1.326184e+02 2.613750e+02 -2.000000e+00 + endloop + endfacet + facet normal 7.933533e-01 6.087614e-01 0.000000e+00 + outer loop + vertex -1.326184e+02 2.613750e+02 1.000000e+00 + vertex -1.326184e+02 2.613750e+02 -2.000000e+00 + vertex -1.330555e+02 2.619445e+02 1.000000e+00 + endloop + endfacet + facet normal 7.933533e-01 6.087614e-01 0.000000e+00 + outer loop + vertex -1.330555e+02 2.619445e+02 1.000000e+00 + vertex -1.326184e+02 2.613750e+02 -2.000000e+00 + vertex -1.330555e+02 2.619445e+02 -2.000000e+00 + endloop + endfacet + facet normal 6.087614e-01 7.933533e-01 0.000000e+00 + outer loop + vertex -1.330555e+02 2.619445e+02 1.000000e+00 + vertex -1.330555e+02 2.619445e+02 -2.000000e+00 + vertex -1.336250e+02 2.623816e+02 1.000000e+00 + endloop + endfacet + facet normal 6.087614e-01 7.933533e-01 0.000000e+00 + outer loop + vertex -1.336250e+02 2.623816e+02 1.000000e+00 + vertex -1.330555e+02 2.619445e+02 -2.000000e+00 + vertex -1.336250e+02 2.623816e+02 -2.000000e+00 + endloop + endfacet + facet normal 3.826834e-01 9.238795e-01 0.000000e+00 + outer loop + vertex -1.336250e+02 2.623816e+02 1.000000e+00 + vertex -1.336250e+02 2.623816e+02 -2.000000e+00 + vertex -1.342882e+02 2.626563e+02 1.000000e+00 + endloop + endfacet + facet normal 3.826834e-01 9.238795e-01 0.000000e+00 + outer loop + vertex -1.342882e+02 2.626563e+02 1.000000e+00 + vertex -1.336250e+02 2.623816e+02 -2.000000e+00 + vertex -1.342882e+02 2.626563e+02 -2.000000e+00 + endloop + endfacet + facet normal 1.305262e-01 9.914449e-01 0.000000e+00 + outer loop + vertex -1.342882e+02 2.626563e+02 1.000000e+00 + vertex -1.342882e+02 2.626563e+02 -2.000000e+00 + vertex -1.350000e+02 2.627500e+02 1.000000e+00 + endloop + endfacet + facet normal 1.305262e-01 9.914449e-01 0.000000e+00 + outer loop + vertex -1.350000e+02 2.627500e+02 1.000000e+00 + vertex -1.342882e+02 2.626563e+02 -2.000000e+00 + vertex -1.350000e+02 2.627500e+02 -2.000000e+00 + endloop + endfacet + facet normal -1.305262e-01 9.914449e-01 0.000000e+00 + outer loop + vertex -1.350000e+02 2.627500e+02 1.000000e+00 + vertex -1.350000e+02 2.627500e+02 -2.000000e+00 + vertex -1.357118e+02 2.626563e+02 1.000000e+00 + endloop + endfacet + facet normal -1.305262e-01 9.914449e-01 0.000000e+00 + outer loop + vertex -1.357118e+02 2.626563e+02 1.000000e+00 + vertex -1.350000e+02 2.627500e+02 -2.000000e+00 + vertex -1.357118e+02 2.626563e+02 -2.000000e+00 + endloop + endfacet + facet normal -3.826834e-01 9.238795e-01 0.000000e+00 + outer loop + vertex -1.357118e+02 2.626563e+02 1.000000e+00 + vertex -1.357118e+02 2.626563e+02 -2.000000e+00 + vertex -1.363750e+02 2.623816e+02 1.000000e+00 + endloop + endfacet + facet normal -3.826834e-01 9.238795e-01 0.000000e+00 + outer loop + vertex -1.363750e+02 2.623816e+02 1.000000e+00 + vertex -1.357118e+02 2.626563e+02 -2.000000e+00 + vertex -1.363750e+02 2.623816e+02 -2.000000e+00 + endloop + endfacet + facet normal -6.087614e-01 7.933533e-01 0.000000e+00 + outer loop + vertex -1.363750e+02 2.623816e+02 1.000000e+00 + vertex -1.363750e+02 2.623816e+02 -2.000000e+00 + vertex -1.369445e+02 2.619445e+02 1.000000e+00 + endloop + endfacet + facet normal -6.087614e-01 7.933533e-01 0.000000e+00 + outer loop + vertex -1.369445e+02 2.619445e+02 1.000000e+00 + vertex -1.363750e+02 2.623816e+02 -2.000000e+00 + vertex -1.369445e+02 2.619445e+02 -2.000000e+00 + endloop + endfacet + facet normal -7.933533e-01 6.087614e-01 0.000000e+00 + outer loop + vertex -1.369445e+02 2.619445e+02 1.000000e+00 + vertex -1.369445e+02 2.619445e+02 -2.000000e+00 + vertex -1.373816e+02 2.613750e+02 1.000000e+00 + endloop + endfacet + facet normal -7.933533e-01 6.087614e-01 0.000000e+00 + outer loop + vertex -1.373816e+02 2.613750e+02 1.000000e+00 + vertex -1.369445e+02 2.619445e+02 -2.000000e+00 + vertex -1.373816e+02 2.613750e+02 -2.000000e+00 + endloop + endfacet + facet normal -9.238795e-01 3.826834e-01 0.000000e+00 + outer loop + vertex -1.373816e+02 2.613750e+02 1.000000e+00 + vertex -1.373816e+02 2.613750e+02 -2.000000e+00 + vertex -1.376563e+02 2.607118e+02 1.000000e+00 + endloop + endfacet + facet normal -9.238795e-01 3.826834e-01 0.000000e+00 + outer loop + vertex -1.376563e+02 2.607118e+02 1.000000e+00 + vertex -1.373816e+02 2.613750e+02 -2.000000e+00 + vertex -1.376563e+02 2.607118e+02 -2.000000e+00 + endloop + endfacet + facet normal -9.914449e-01 1.305262e-01 0.000000e+00 + outer loop + vertex -1.376563e+02 2.607118e+02 1.000000e+00 + vertex -1.376563e+02 2.607118e+02 -2.000000e+00 + vertex -1.377500e+02 2.600000e+02 1.000000e+00 + endloop + endfacet + facet normal -9.914449e-01 1.305262e-01 0.000000e+00 + outer loop + vertex -1.377500e+02 2.600000e+02 1.000000e+00 + vertex -1.376563e+02 2.607118e+02 -2.000000e+00 + vertex -1.377500e+02 2.600000e+02 -2.000000e+00 + endloop + endfacet + facet normal -9.914449e-01 -1.305262e-01 -0.000000e+00 + outer loop + vertex -1.377500e+02 2.600000e+02 1.000000e+00 + vertex -1.377500e+02 2.600000e+02 -2.000000e+00 + vertex -1.376563e+02 2.592882e+02 1.000000e+00 + endloop + endfacet + facet normal -9.914449e-01 -1.305262e-01 -0.000000e+00 + outer loop + vertex -1.376563e+02 2.592882e+02 1.000000e+00 + vertex -1.377500e+02 2.600000e+02 -2.000000e+00 + vertex -1.376563e+02 2.592882e+02 -2.000000e+00 + endloop + endfacet + facet normal -9.238795e-01 -3.826834e-01 -0.000000e+00 + outer loop + vertex -1.376563e+02 2.592882e+02 1.000000e+00 + vertex -1.376563e+02 2.592882e+02 -2.000000e+00 + vertex -1.373816e+02 2.586250e+02 1.000000e+00 + endloop + endfacet + facet normal -9.238795e-01 -3.826834e-01 -0.000000e+00 + outer loop + vertex -1.373816e+02 2.586250e+02 1.000000e+00 + vertex -1.376563e+02 2.592882e+02 -2.000000e+00 + vertex -1.373816e+02 2.586250e+02 -2.000000e+00 + endloop + endfacet + facet normal -7.933533e-01 -6.087614e-01 -0.000000e+00 + outer loop + vertex -1.373816e+02 2.586250e+02 1.000000e+00 + vertex -1.373816e+02 2.586250e+02 -2.000000e+00 + vertex -1.369445e+02 2.580555e+02 1.000000e+00 + endloop + endfacet + facet normal -7.933533e-01 -6.087614e-01 -0.000000e+00 + outer loop + vertex -1.369445e+02 2.580555e+02 1.000000e+00 + vertex -1.373816e+02 2.586250e+02 -2.000000e+00 + vertex -1.369445e+02 2.580555e+02 -2.000000e+00 + endloop + endfacet + facet normal -6.087614e-01 -7.933533e-01 -0.000000e+00 + outer loop + vertex -1.369445e+02 2.580555e+02 1.000000e+00 + vertex -1.369445e+02 2.580555e+02 -2.000000e+00 + vertex -1.363750e+02 2.576184e+02 1.000000e+00 + endloop + endfacet + facet normal -6.087614e-01 -7.933533e-01 -0.000000e+00 + outer loop + vertex -1.363750e+02 2.576184e+02 1.000000e+00 + vertex -1.369445e+02 2.580555e+02 -2.000000e+00 + vertex -1.363750e+02 2.576184e+02 -2.000000e+00 + endloop + endfacet + facet normal -3.826834e-01 -9.238795e-01 -0.000000e+00 + outer loop + vertex -1.363750e+02 2.576184e+02 1.000000e+00 + vertex -1.363750e+02 2.576184e+02 -2.000000e+00 + vertex -1.357118e+02 2.573437e+02 1.000000e+00 + endloop + endfacet + facet normal -3.826834e-01 -9.238795e-01 -0.000000e+00 + outer loop + vertex -1.357118e+02 2.573437e+02 1.000000e+00 + vertex -1.363750e+02 2.576184e+02 -2.000000e+00 + vertex -1.357118e+02 2.573437e+02 -2.000000e+00 + endloop + endfacet + facet normal -1.305262e-01 -9.914449e-01 -0.000000e+00 + outer loop + vertex -1.357118e+02 2.573437e+02 1.000000e+00 + vertex -1.357118e+02 2.573437e+02 -2.000000e+00 + vertex -1.350000e+02 2.572500e+02 1.000000e+00 + endloop + endfacet + facet normal -1.305262e-01 -9.914449e-01 -0.000000e+00 + outer loop + vertex -1.350000e+02 2.572500e+02 1.000000e+00 + vertex -1.357118e+02 2.573437e+02 -2.000000e+00 + vertex -1.350000e+02 2.572500e+02 -2.000000e+00 + endloop + endfacet + facet normal 1.305262e-01 -9.914449e-01 0.000000e+00 + outer loop + vertex -1.350000e+02 2.572500e+02 1.000000e+00 + vertex -1.350000e+02 2.572500e+02 -2.000000e+00 + vertex -1.342882e+02 2.573437e+02 1.000000e+00 + endloop + endfacet + facet normal 1.305262e-01 -9.914449e-01 0.000000e+00 + outer loop + vertex -1.342882e+02 2.573437e+02 1.000000e+00 + vertex -1.350000e+02 2.572500e+02 -2.000000e+00 + vertex -1.342882e+02 2.573437e+02 -2.000000e+00 + endloop + endfacet + facet normal 3.826834e-01 -9.238795e-01 0.000000e+00 + outer loop + vertex -1.342882e+02 2.573437e+02 1.000000e+00 + vertex -1.342882e+02 2.573437e+02 -2.000000e+00 + vertex -1.336250e+02 2.576184e+02 1.000000e+00 + endloop + endfacet + facet normal 3.826834e-01 -9.238795e-01 0.000000e+00 + outer loop + vertex -1.336250e+02 2.576184e+02 1.000000e+00 + vertex -1.342882e+02 2.573437e+02 -2.000000e+00 + vertex -1.336250e+02 2.576184e+02 -2.000000e+00 + endloop + endfacet + facet normal 6.087614e-01 -7.933533e-01 0.000000e+00 + outer loop + vertex -1.336250e+02 2.576184e+02 1.000000e+00 + vertex -1.336250e+02 2.576184e+02 -2.000000e+00 + vertex -1.330555e+02 2.580555e+02 1.000000e+00 + endloop + endfacet + facet normal 6.087614e-01 -7.933533e-01 0.000000e+00 + outer loop + vertex -1.330555e+02 2.580555e+02 1.000000e+00 + vertex -1.336250e+02 2.576184e+02 -2.000000e+00 + vertex -1.330555e+02 2.580555e+02 -2.000000e+00 + endloop + endfacet + facet normal 7.933533e-01 -6.087614e-01 0.000000e+00 + outer loop + vertex -1.330555e+02 2.580555e+02 1.000000e+00 + vertex -1.330555e+02 2.580555e+02 -2.000000e+00 + vertex -1.326184e+02 2.586250e+02 1.000000e+00 + endloop + endfacet + facet normal 7.933533e-01 -6.087614e-01 0.000000e+00 + outer loop + vertex -1.326184e+02 2.586250e+02 1.000000e+00 + vertex -1.330555e+02 2.580555e+02 -2.000000e+00 + vertex -1.326184e+02 2.586250e+02 -2.000000e+00 + endloop + endfacet + facet normal 9.238795e-01 -3.826834e-01 0.000000e+00 + outer loop + vertex -1.326184e+02 2.586250e+02 1.000000e+00 + vertex -1.326184e+02 2.586250e+02 -2.000000e+00 + vertex -1.323437e+02 2.592882e+02 1.000000e+00 + endloop + endfacet + facet normal 9.238795e-01 -3.826834e-01 0.000000e+00 + outer loop + vertex -1.323437e+02 2.592882e+02 1.000000e+00 + vertex -1.326184e+02 2.586250e+02 -2.000000e+00 + vertex -1.323437e+02 2.592882e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.360392e+02 2.618000e+02 1.000000e+00 + vertex -1.373816e+02 2.613750e+02 1.000000e+00 + vertex -1.370785e+02 2.600000e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.370785e+02 2.600000e+02 1.000000e+00 + vertex -1.373816e+02 2.613750e+02 1.000000e+00 + vertex -1.376563e+02 2.607118e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.370785e+02 2.600000e+02 1.000000e+00 + vertex -1.376563e+02 2.607118e+02 1.000000e+00 + vertex -1.377500e+02 2.600000e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.339608e+02 2.618000e+02 1.000000e+00 + vertex -1.350000e+02 2.627500e+02 1.000000e+00 + vertex -1.360392e+02 2.618000e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.360392e+02 2.618000e+02 1.000000e+00 + vertex -1.350000e+02 2.627500e+02 1.000000e+00 + vertex -1.357118e+02 2.626563e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -0.000000e+00 1.000000e+00 + outer loop + vertex -1.360392e+02 2.618000e+02 1.000000e+00 + vertex -1.357118e+02 2.626563e+02 1.000000e+00 + vertex -1.363750e+02 2.623816e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -0.000000e+00 1.000000e+00 + outer loop + vertex -1.329215e+02 2.600000e+02 1.000000e+00 + vertex -1.326184e+02 2.613750e+02 1.000000e+00 + vertex -1.339608e+02 2.618000e+02 1.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.339608e+02 2.618000e+02 1.000000e+00 + vertex -1.326184e+02 2.613750e+02 1.000000e+00 + vertex -1.330555e+02 2.619445e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.339608e+02 2.618000e+02 1.000000e+00 + vertex -1.330555e+02 2.619445e+02 1.000000e+00 + vertex -1.336250e+02 2.623816e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.339608e+02 2.582000e+02 1.000000e+00 + vertex -1.326184e+02 2.586250e+02 1.000000e+00 + vertex -1.329215e+02 2.600000e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.329215e+02 2.600000e+02 1.000000e+00 + vertex -1.326184e+02 2.586250e+02 1.000000e+00 + vertex -1.323437e+02 2.592882e+02 1.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.329215e+02 2.600000e+02 1.000000e+00 + vertex -1.323437e+02 2.592882e+02 1.000000e+00 + vertex -1.322500e+02 2.600000e+02 1.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.360392e+02 2.582000e+02 1.000000e+00 + vertex -1.350000e+02 2.572500e+02 1.000000e+00 + vertex -1.339608e+02 2.582000e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.339608e+02 2.582000e+02 1.000000e+00 + vertex -1.350000e+02 2.572500e+02 1.000000e+00 + vertex -1.342882e+02 2.573437e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.339608e+02 2.582000e+02 1.000000e+00 + vertex -1.342882e+02 2.573437e+02 1.000000e+00 + vertex -1.336250e+02 2.576184e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.370785e+02 2.600000e+02 1.000000e+00 + vertex -1.373816e+02 2.586250e+02 1.000000e+00 + vertex -1.360392e+02 2.582000e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.360392e+02 2.582000e+02 1.000000e+00 + vertex -1.373816e+02 2.586250e+02 1.000000e+00 + vertex -1.369445e+02 2.580555e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.360392e+02 2.582000e+02 1.000000e+00 + vertex -1.369445e+02 2.580555e+02 1.000000e+00 + vertex -1.363750e+02 2.576184e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.322500e+02 2.600000e+02 1.000000e+00 + vertex -1.323437e+02 2.607118e+02 1.000000e+00 + vertex -1.329215e+02 2.600000e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.329215e+02 2.600000e+02 1.000000e+00 + vertex -1.323437e+02 2.607118e+02 1.000000e+00 + vertex -1.326184e+02 2.613750e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.336250e+02 2.623816e+02 1.000000e+00 + vertex -1.342882e+02 2.626563e+02 1.000000e+00 + vertex -1.339608e+02 2.618000e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.339608e+02 2.618000e+02 1.000000e+00 + vertex -1.342882e+02 2.626563e+02 1.000000e+00 + vertex -1.350000e+02 2.627500e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.363750e+02 2.623816e+02 1.000000e+00 + vertex -1.369445e+02 2.619445e+02 1.000000e+00 + vertex -1.360392e+02 2.618000e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.360392e+02 2.618000e+02 1.000000e+00 + vertex -1.369445e+02 2.619445e+02 1.000000e+00 + vertex -1.373816e+02 2.613750e+02 1.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.377500e+02 2.600000e+02 1.000000e+00 + vertex -1.376563e+02 2.592882e+02 1.000000e+00 + vertex -1.370785e+02 2.600000e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.370785e+02 2.600000e+02 1.000000e+00 + vertex -1.376563e+02 2.592882e+02 1.000000e+00 + vertex -1.373816e+02 2.586250e+02 1.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.363750e+02 2.576184e+02 1.000000e+00 + vertex -1.357118e+02 2.573437e+02 1.000000e+00 + vertex -1.360392e+02 2.582000e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.360392e+02 2.582000e+02 1.000000e+00 + vertex -1.357118e+02 2.573437e+02 1.000000e+00 + vertex -1.350000e+02 2.572500e+02 1.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -0.000000e+00 1.000000e+00 + outer loop + vertex -1.336250e+02 2.576184e+02 1.000000e+00 + vertex -1.330555e+02 2.580555e+02 1.000000e+00 + vertex -1.339608e+02 2.582000e+02 1.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex -1.339608e+02 2.582000e+02 1.000000e+00 + vertex -1.330555e+02 2.580555e+02 1.000000e+00 + vertex -1.326184e+02 2.586250e+02 1.000000e+00 + endloop + endfacet + facet normal -1.000000e+00 0.000000e+00 0.000000e+00 + outer loop + vertex -2.550000e+02 -2.530000e+02 -6.000000e+00 + vertex -2.550000e+02 -2.530000e+02 -2.000000e+00 + vertex -2.550000e+02 2.630000e+02 -6.000000e+00 + endloop + endfacet + facet normal -1.000000e+00 0.000000e+00 0.000000e+00 + outer loop + vertex -2.550000e+02 2.630000e+02 -6.000000e+00 + vertex -2.550000e+02 -2.530000e+02 -2.000000e+00 + vertex -2.550000e+02 2.630000e+02 0.000000e+00 + endloop + endfacet + facet normal -1.000000e+00 -0.000000e+00 0.000000e+00 + outer loop + vertex -2.550000e+02 2.630000e+02 0.000000e+00 + vertex -2.550000e+02 -2.530000e+02 -2.000000e+00 + vertex -2.550000e+02 -2.538197e+02 0.000000e+00 + endloop + endfacet + facet normal -1.000000e+00 0.000000e+00 0.000000e+00 + outer loop + vertex -2.550000e+02 -2.538197e+02 0.000000e+00 + vertex -2.550000e+02 -2.530000e+02 -2.000000e+00 + vertex -2.550000e+02 -2.538197e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.399309e+02 2.650000e+02 -2.000000e+00 + vertex 1.377500e+02 2.600000e+02 -2.000000e+00 + vertex 1.378823e+02 2.593714e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.378823e+02 2.593714e+02 -2.000000e+00 + vertex 1.377500e+02 2.600000e+02 -2.000000e+00 + vertex 1.376563e+02 2.592882e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.378823e+02 2.593714e+02 -2.000000e+00 + vertex 1.376563e+02 2.592882e+02 -2.000000e+00 + vertex 1.376417e+02 2.586870e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -0.000000e+00 1.000000e+00 + outer loop + vertex 1.376417e+02 2.586870e+02 -2.000000e+00 + vertex 1.376563e+02 2.592882e+02 -2.000000e+00 + vertex 1.373816e+02 2.586250e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.376417e+02 2.586870e+02 -2.000000e+00 + vertex 1.373816e+02 2.586250e+02 -2.000000e+00 + vertex 1.372413e+02 2.580819e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -0.000000e+00 1.000000e+00 + outer loop + vertex 1.372413e+02 2.580819e+02 -2.000000e+00 + vertex 1.373816e+02 2.586250e+02 -2.000000e+00 + vertex 1.369445e+02 2.580555e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.372413e+02 2.580819e+02 -2.000000e+00 + vertex 1.369445e+02 2.580555e+02 -2.000000e+00 + vertex 1.367054e+02 2.575929e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -0.000000e+00 1.000000e+00 + outer loop + vertex 1.367054e+02 2.575929e+02 -2.000000e+00 + vertex 1.369445e+02 2.580555e+02 -2.000000e+00 + vertex 1.363750e+02 2.576184e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.367054e+02 2.575929e+02 -2.000000e+00 + vertex 1.363750e+02 2.576184e+02 -2.000000e+00 + vertex 1.360663e+02 2.572495e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -0.000000e+00 1.000000e+00 + outer loop + vertex 1.360663e+02 2.572495e+02 -2.000000e+00 + vertex 1.363750e+02 2.576184e+02 -2.000000e+00 + vertex 1.357118e+02 2.573437e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.360663e+02 2.572495e+02 -2.000000e+00 + vertex 1.357118e+02 2.573437e+02 -2.000000e+00 + vertex 1.353628e+02 2.570724e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -0.000000e+00 1.000000e+00 + outer loop + vertex 1.353628e+02 2.570724e+02 -2.000000e+00 + vertex 1.357118e+02 2.573437e+02 -2.000000e+00 + vertex 1.350000e+02 2.572500e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.353628e+02 2.570724e+02 -2.000000e+00 + vertex 1.350000e+02 2.572500e+02 -2.000000e+00 + vertex 1.346372e+02 2.570724e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -0.000000e+00 1.000000e+00 + outer loop + vertex 1.346372e+02 2.570724e+02 -2.000000e+00 + vertex 1.350000e+02 2.572500e+02 -2.000000e+00 + vertex 1.342882e+02 2.573437e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.346372e+02 2.570724e+02 -2.000000e+00 + vertex 1.342882e+02 2.573437e+02 -2.000000e+00 + vertex 1.339337e+02 2.572495e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -0.000000e+00 1.000000e+00 + outer loop + vertex 1.339337e+02 2.572495e+02 -2.000000e+00 + vertex 1.342882e+02 2.573437e+02 -2.000000e+00 + vertex 1.336250e+02 2.576184e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.339337e+02 2.572495e+02 -2.000000e+00 + vertex 1.336250e+02 2.576184e+02 -2.000000e+00 + vertex 1.332946e+02 2.575929e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -0.000000e+00 1.000000e+00 + outer loop + vertex 1.332946e+02 2.575929e+02 -2.000000e+00 + vertex 1.336250e+02 2.576184e+02 -2.000000e+00 + vertex 1.330555e+02 2.580555e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.332946e+02 2.575929e+02 -2.000000e+00 + vertex 1.330555e+02 2.580555e+02 -2.000000e+00 + vertex 1.327587e+02 2.580819e+02 -2.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 -0.000000e+00 1.000000e+00 + outer loop + vertex 1.327587e+02 2.580819e+02 -2.000000e+00 + vertex 1.330555e+02 2.580555e+02 -2.000000e+00 + vertex 1.326184e+02 2.586250e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.327587e+02 2.580819e+02 -2.000000e+00 + vertex 1.326184e+02 2.586250e+02 -2.000000e+00 + vertex 1.323583e+02 2.586870e+02 -2.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 -0.000000e+00 1.000000e+00 + outer loop + vertex 1.323583e+02 2.586870e+02 -2.000000e+00 + vertex 1.326184e+02 2.586250e+02 -2.000000e+00 + vertex 1.323437e+02 2.592882e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.323583e+02 2.586870e+02 -2.000000e+00 + vertex 1.323437e+02 2.592882e+02 -2.000000e+00 + vertex 1.321177e+02 2.593714e+02 -2.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.321177e+02 2.593714e+02 -2.000000e+00 + vertex 1.323437e+02 2.592882e+02 -2.000000e+00 + vertex 1.322500e+02 2.600000e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -0.000000e+00 1.000000e+00 + outer loop + vertex 1.321177e+02 2.593714e+02 -2.000000e+00 + vertex 1.322500e+02 2.600000e+02 -2.000000e+00 + vertex 1.300691e+02 2.650000e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.300691e+02 2.650000e+02 -2.000000e+00 + vertex 1.322500e+02 2.600000e+02 -2.000000e+00 + vertex 1.323437e+02 2.607118e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.300691e+02 2.650000e+02 -2.000000e+00 + vertex 1.323437e+02 2.607118e+02 -2.000000e+00 + vertex 1.326184e+02 2.613750e+02 -2.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.300691e+02 2.650000e+02 -2.000000e+00 + vertex 1.350000e+02 2.627500e+02 -2.000000e+00 + vertex 1.399309e+02 2.650000e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.399309e+02 2.650000e+02 -2.000000e+00 + vertex 1.350000e+02 2.627500e+02 -2.000000e+00 + vertex 1.357118e+02 2.626563e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.399309e+02 2.650000e+02 -2.000000e+00 + vertex 1.357118e+02 2.626563e+02 -2.000000e+00 + vertex 1.363750e+02 2.623816e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -0.000000e+00 1.000000e+00 + outer loop + vertex 1.326184e+02 2.613750e+02 -2.000000e+00 + vertex 1.330555e+02 2.619445e+02 -2.000000e+00 + vertex 1.300691e+02 2.650000e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.300691e+02 2.650000e+02 -2.000000e+00 + vertex 1.330555e+02 2.619445e+02 -2.000000e+00 + vertex 1.336250e+02 2.623816e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.300691e+02 2.650000e+02 -2.000000e+00 + vertex 1.336250e+02 2.623816e+02 -2.000000e+00 + vertex 1.342882e+02 2.626563e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 -0.000000e+00 1.000000e+00 + outer loop + vertex 1.342882e+02 2.626563e+02 -2.000000e+00 + vertex 1.350000e+02 2.627500e+02 -2.000000e+00 + vertex 1.300691e+02 2.650000e+02 -2.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.363750e+02 2.623816e+02 -2.000000e+00 + vertex 1.369445e+02 2.619445e+02 -2.000000e+00 + vertex 1.399309e+02 2.650000e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.399309e+02 2.650000e+02 -2.000000e+00 + vertex 1.369445e+02 2.619445e+02 -2.000000e+00 + vertex 1.373816e+02 2.613750e+02 -2.000000e+00 + endloop + endfacet + facet normal 0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.399309e+02 2.650000e+02 -2.000000e+00 + vertex 1.373816e+02 2.613750e+02 -2.000000e+00 + vertex 1.376563e+02 2.607118e+02 -2.000000e+00 + endloop + endfacet + facet normal -0.000000e+00 0.000000e+00 1.000000e+00 + outer loop + vertex 1.376563e+02 2.607118e+02 -2.000000e+00 + vertex 1.377500e+02 2.600000e+02 -2.000000e+00 + vertex 1.399309e+02 2.650000e+02 -2.000000e+00 + endloop + endfacet +endsolid diff --git a/resources/profiles/Comgrow/comgrow_t500_buildplate_texture.png b/resources/profiles/Comgrow/comgrow_t500_buildplate_texture.png index efe2c318ca..e2052e48b0 100644 Binary files a/resources/profiles/Comgrow/comgrow_t500_buildplate_texture.png and b/resources/profiles/Comgrow/comgrow_t500_buildplate_texture.png differ diff --git a/resources/profiles/Comgrow/machine/fdm_machine_common.json b/resources/profiles/Comgrow/machine/fdm_machine_common.json index 8d4fb897f1..8a88de64fc 100644 --- a/resources/profiles/Comgrow/machine/fdm_machine_common.json +++ b/resources/profiles/Comgrow/machine/fdm_machine_common.json @@ -31,7 +31,7 @@ "10000" ], "machine_max_acceleration_z": [ - "100" + "500" ], "machine_max_speed_e": [ "60" diff --git a/resources/profiles/Comgrow/process/fdm_process_comgrow_common.json b/resources/profiles/Comgrow/process/fdm_process_comgrow_common.json index d8156dbfdc..41009107e5 100644 --- a/resources/profiles/Comgrow/process/fdm_process_comgrow_common.json +++ b/resources/profiles/Comgrow/process/fdm_process_comgrow_common.json @@ -1,4 +1,9 @@ { + "type": "process", + "name": "fdm_process_comgrow_common", + "from": "system", + "instantiation": "false", + "inherits": "fdm_process_common", "accel_to_decel_enable": "1", "accel_to_decel_factor": "50%", "bottom_shell_layers": "2", diff --git a/resources/profiles/Creality.json b/resources/profiles/Creality.json index a602307d82..d38ab3cd18 100644 --- a/resources/profiles/Creality.json +++ b/resources/profiles/Creality.json @@ -79,64 +79,68 @@ "sub_path": "process/fdm_process_creality_common.json" }, { - "name": "fdm_process_creality_common_0_2", - "sub_path": "process/fdm_process_creality_common_0_2.json" - }, + "name": "fdm_process_common_klipper", + "sub_path": "process/fdm_process_common_klipper.json" + }, { - "name": "fdm_process_creality_common_0_25", - "sub_path": "process/fdm_process_creality_common_0_25.json" - }, + "name": "fdm_process_creality_common_0_2", + "sub_path": "process/fdm_process_creality_common_0_2.json" + }, { - "name": "fdm_process_creality_common_0_3", - "sub_path": "process/fdm_process_creality_common_0_3.json" - }, + "name": "fdm_process_creality_common_0_25", + "sub_path": "process/fdm_process_creality_common_0_25.json" + }, { - "name": "fdm_process_creality_common_0_5", - "sub_path": "process/fdm_process_creality_common_0_5.json" - }, + "name": "fdm_process_creality_common_0_3", + "sub_path": "process/fdm_process_creality_common_0_3.json" + }, { - "name": "fdm_process_creality_common_0_6", - "sub_path": "process/fdm_process_creality_common_0_6.json" - }, + "name": "fdm_process_creality_common_0_5", + "sub_path": "process/fdm_process_creality_common_0_5.json" + }, { - "name": "fdm_process_creality_common_0_8", - "sub_path": "process/fdm_process_creality_common_0_8.json" - }, + "name": "fdm_process_creality_common_0_6", + "sub_path": "process/fdm_process_creality_common_0_6.json" + }, { - "name": "fdm_process_creality_common_1_0", - "sub_path": "process/fdm_process_creality_common_1_0.json" - }, + "name": "fdm_process_creality_common_0_8", + "sub_path": "process/fdm_process_creality_common_0_8.json" + }, + { + "name": "fdm_process_creality_common_1_0", + "sub_path": "process/fdm_process_creality_common_1_0.json" + }, { "name": "0.08mm SuperDetail @Creality CR-6 0.2", "sub_path": "process/0.08mm SuperDetail @Creality CR-6 0.2.json" }, { - "name": "0.08mm SuperDetail @Creality Ender5Pro (2019) (0.2 nozzle)", - "sub_path": "process/0.08mm SuperDetail @Creality Ender5Pro (2019) (0.2 nozzle).json" + "name": "0.08mm SuperDetail @Creality Ender5Pro (2019) 0.2", + "sub_path": "process/0.08mm SuperDetail @Creality Ender5Pro (2019) 0.2.json" }, { - "name": "0.08mm SuperDetail @Creality Ender5Pro (2019) (0.25 nozzle)", - "sub_path": "process/0.08mm SuperDetail @Creality Ender5Pro (2019) (0.25 nozzle).json" + "name": "0.08mm SuperDetail @Creality Ender5Pro (2019) 0.25", + "sub_path": "process/0.08mm SuperDetail @Creality Ender5Pro (2019) 0.25.json" }, { - "name": "0.08mm SuperDetail @Creality Ender5Pro (2019) (0.3 nozzle)", - "sub_path": "process/0.08mm SuperDetail @Creality Ender5Pro (2019) (0.3 nozzle).json" + "name": "0.08mm SuperDetail @Creality Ender5Pro (2019) 0.3", + "sub_path": "process/0.08mm SuperDetail @Creality Ender5Pro (2019) 0.3.json" }, { "name": "0.10mm HighDetail @Creality CR-6 0.4.json", "sub_path": "process/0.10mm HighDetail @Creality CR-6 0.4.json" }, { - "name": "0.10mm HighDetail @Creality Ender5Pro (2019) (0.2 nozzle)", - "sub_path": "process/0.10mm HighDetail @Creality Ender5Pro (2019) (0.2 nozzle).json" + "name": "0.10mm HighDetail @Creality Ender5Pro (2019) 0.2", + "sub_path": "process/0.10mm HighDetail @Creality Ender5Pro (2019) 0.2.json" }, { - "name": "0.10mm HighDetail @Creality Ender5Pro (2019) (0.25 nozzle)", - "sub_path": "process/0.10mm HighDetail @Creality Ender5Pro (2019) (0.25 nozzle).json" + "name": "0.10mm HighDetail @Creality Ender5Pro (2019) 0.25", + "sub_path": "process/0.10mm HighDetail @Creality Ender5Pro (2019) 0.25.json" }, { - "name": "0.10mm HighDetail @Creality Ender5Pro (2019) (0.3 nozzle)", - "sub_path": "process/0.10mm HighDetail @Creality Ender5Pro (2019) (0.3 nozzle).json" + "name": "0.10mm HighDetail @Creality Ender5Pro (2019) 0.3", + "sub_path": "process/0.10mm HighDetail @Creality Ender5Pro (2019) 0.3.json" }, { "name": "0.12mm Fine @Creality CR10Max", @@ -155,24 +159,24 @@ "sub_path": "process/0.12mm Fine @Creality Ender3V2.json" }, { - "name": "0.12mm Detail @Creality Ender5Pro (2019) (0.2 nozzle)", - "sub_path": "process/0.12mm Detail @Creality Ender5Pro (2019) (0.2 nozzle).json" + "name": "0.12mm Detail @Creality Ender5Pro (2019) 0.2", + "sub_path": "process/0.12mm Detail @Creality Ender5Pro (2019) 0.2.json" }, { - "name": "0.12mm Detail @Creality Ender5Pro (2019) (0.25 nozzle)", - "sub_path": "process/0.12mm Detail @Creality Ender5Pro (2019) (0.25 nozzle).json" + "name": "0.12mm Detail @Creality Ender5Pro (2019) 0.25", + "sub_path": "process/0.12mm Detail @Creality Ender5Pro (2019) 0.25.json" }, { - "name": "0.12mm Detail @Creality Ender5Pro (2019) (0.3 nozzle)", - "sub_path": "process/0.12mm Detail @Creality Ender5Pro (2019) (0.3 nozzle).json" + "name": "0.12mm Detail @Creality Ender5Pro (2019) 0.3", + "sub_path": "process/0.12mm Detail @Creality Ender5Pro (2019) 0.3.json" }, { - "name": "0.12mm Fine @Creality Ender5Pro (2019) (0.4 nozzle)", - "sub_path": "process/0.12mm Fine @Creality Ender5Pro (2019) (0.4 nozzle).json" + "name": "0.12mm Fine @Creality Ender5Pro (2019)", + "sub_path": "process/0.12mm Fine @Creality Ender5Pro (2019).json" }, { - "name": "0.12mm Detail @Creality Ender5Pro (2019) (0.5 nozzle)", - "sub_path": "process/0.12mm Detail @Creality Ender5Pro (2019) (0.5 nozzle).json" + "name": "0.12mm Detail @Creality Ender5Pro (2019) 0.5", + "sub_path": "process/0.12mm Detail @Creality Ender5Pro (2019) 0.5.json" }, { "name": "0.16mm Optimal @Creality CR10V2", @@ -203,28 +207,28 @@ "sub_path": "process/0.16mm Optimal @Creality Ender5Plus.json" }, { - "name": "0.16mm Optimal @Creality Ender5Pro (2019) (0.2 nozzle)", - "sub_path": "process/0.16mm Optimal @Creality Ender5Pro (2019) (0.2 nozzle).json" + "name": "0.16mm Optimal @Creality Ender5Pro (2019) 0.2", + "sub_path": "process/0.16mm Optimal @Creality Ender5Pro (2019) 0.2.json" }, { - "name": "0.16mm Optimal @Creality Ender5Pro (2019) (0.25 nozzle)", - "sub_path": "process/0.16mm Optimal @Creality Ender5Pro (2019) (0.25 nozzle).json" + "name": "0.16mm Optimal @Creality Ender5Pro (2019) 0.25", + "sub_path": "process/0.16mm Optimal @Creality Ender5Pro (2019) 0.25.json" }, { - "name": "0.16mm Optimal @Creality Ender5Pro (2019) (0.3 nozzle)", - "sub_path": "process/0.16mm Optimal @Creality Ender5Pro (2019) (0.3 nozzle).json" + "name": "0.16mm Optimal @Creality Ender5Pro (2019) 0.3", + "sub_path": "process/0.16mm Optimal @Creality Ender5Pro (2019) 0.3.json" }, { - "name": "0.15mm Optimal @Creality Ender5Pro (2019) (0.4 nozzle)", - "sub_path": "process/0.15mm Optimal @Creality Ender5Pro (2019) (0.4 nozzle).json" + "name": "0.15mm Optimal @Creality Ender5Pro (2019)", + "sub_path": "process/0.15mm Optimal @Creality Ender5Pro (2019).json" }, { - "name": "0.16mm Optimal @Creality Ender5Pro (2019) (0.5 nozzle)", - "sub_path": "process/0.16mm Optimal @Creality Ender5Pro (2019) (0.5 nozzle).json" + "name": "0.16mm Optimal @Creality Ender5Pro (2019) 0.5", + "sub_path": "process/0.16mm Optimal @Creality Ender5Pro (2019) 0.5.json" }, { - "name": "0.16mm Optimal @Creality Ender5Pro (2019) (0.6 nozzle)", - "sub_path": "process/0.16mm Optimal @Creality Ender5Pro (2019) (0.6 nozzle).json" + "name": "0.16mm Optimal @Creality Ender5Pro (2019) 0.6", + "sub_path": "process/0.16mm Optimal @Creality Ender5Pro (2019) 0.6.json" }, { "name": "0.16mm Optimal @Creality Ender5S", @@ -287,28 +291,28 @@ "sub_path": "process/0.20mm Standard @Creality Ender5Plus.json" }, { - "name": "0.20mm Standard @Creality Ender5Pro (2019) (0.25 nozzle)", - "sub_path": "process/0.20mm Standard @Creality Ender5Pro (2019) (0.25 nozzle).json" + "name": "0.20mm Standard @Creality Ender5Pro (2019) 0.25", + "sub_path": "process/0.20mm Standard @Creality Ender5Pro (2019) 0.25.json" }, { - "name": "0.20mm Standard @Creality Ender5Pro (2019) (0.3 nozzle)", - "sub_path": "process/0.20mm Standard @Creality Ender5Pro (2019) (0.3 nozzle).json" + "name": "0.20mm Standard @Creality Ender5Pro (2019) 0.3", + "sub_path": "process/0.20mm Standard @Creality Ender5Pro (2019) 0.3.json" }, { - "name": "0.20mm Standard @Creality Ender5Pro (2019) (0.4 nozzle)", - "sub_path": "process/0.20mm Standard @Creality Ender5Pro (2019) (0.4 nozzle).json" + "name": "0.20mm Standard @Creality Ender5Pro (2019)", + "sub_path": "process/0.20mm Standard @Creality Ender5Pro (2019).json" }, { - "name": "0.20mm Standard @Creality Ender5Pro (2019) (0.5 nozzle)", - "sub_path": "process/0.20mm Standard @Creality Ender5Pro (2019) (0.5 nozzle).json" + "name": "0.20mm Standard @Creality Ender5Pro (2019) 0.5", + "sub_path": "process/0.20mm Standard @Creality Ender5Pro (2019) 0.5.json" }, { - "name": "0.20mm Standard @Creality Ender5Pro (2019) (0.6 nozzle)", - "sub_path": "process/0.20mm Standard @Creality Ender5Pro (2019) (0.6 nozzle).json" + "name": "0.20mm Standard @Creality Ender5Pro (2019) 0.6", + "sub_path": "process/0.20mm Standard @Creality Ender5Pro (2019) 0.6.json" }, { - "name": "0.20mm Standard @Creality Ender5Pro (2019) (0.8 nozzle)", - "sub_path": "process/0.20mm Standard @Creality Ender5Pro (2019) (0.8 nozzle).json" + "name": "0.20mm Standard @Creality Ender5Pro (2019) 0.8", + "sub_path": "process/0.20mm Standard @Creality Ender5Pro (2019) 0.8.json" }, { "name": "0.20mm Standard @Creality Ender5S", @@ -351,24 +355,24 @@ "sub_path": "process/0.24mm Draft @Creality Ender3V2.json" }, { - "name": "0.24mm Draft @Creality Ender5Pro (2019) (0.3 nozzle)", - "sub_path": "process/0.24mm Draft @Creality Ender5Pro (2019) (0.3 nozzle).json" + "name": "0.24mm Draft @Creality Ender5Pro (2019) 0.3", + "sub_path": "process/0.24mm Draft @Creality Ender5Pro (2019) 0.3.json" }, { - "name": "0.24mm Draft @Creality Ender5Pro (2019) (0.4 nozzle)", - "sub_path": "process/0.24mm Draft @Creality Ender5Pro (2019) (0.4 nozzle).json" + "name": "0.24mm Draft @Creality Ender5Pro (2019)", + "sub_path": "process/0.24mm Draft @Creality Ender5Pro (2019).json" }, { - "name": "0.24mm Draft @Creality Ender5Pro (2019) (0.5 nozzle)", - "sub_path": "process/0.24mm Draft @Creality Ender5Pro (2019) (0.5 nozzle).json" + "name": "0.24mm Draft @Creality Ender5Pro (2019) 0.5", + "sub_path": "process/0.24mm Draft @Creality Ender5Pro (2019) 0.5.json" }, { - "name": "0.24mm Draft @Creality Ender5Pro (2019) (0.6 nozzle)", - "sub_path": "process/0.24mm Draft @Creality Ender5Pro (2019) (0.6 nozzle).json" + "name": "0.24mm Draft @Creality Ender5Pro (2019) 0.6", + "sub_path": "process/0.24mm Draft @Creality Ender5Pro (2019) 0.6.json" }, { - "name": "0.24mm Draft @Creality Ender5Pro (2019) (0.8 nozzle)", - "sub_path": "process/0.24mm Draft @Creality Ender5Pro (2019) (0.8 nozzle).json" + "name": "0.24mm Draft @Creality Ender5Pro (2019) 0.8", + "sub_path": "process/0.24mm Draft @Creality Ender5Pro (2019) 0.8.json" }, { "name": "0.28mm SuperDraft @Creality CR-6 0.4", @@ -379,20 +383,20 @@ "sub_path": "process/0.28mm SuperDraft @Creality CR-6 0.6.json" }, { - "name": "0.28mm SuperDraft @Creality Ender5Pro (2019) (0.5 nozzle)", - "sub_path": "process/0.28mm SuperDraft @Creality Ender5Pro (2019) (0.5 nozzle).json" + "name": "0.28mm SuperDraft @Creality Ender5Pro (2019) 0.5", + "sub_path": "process/0.28mm SuperDraft @Creality Ender5Pro (2019) 0.5.json" }, { - "name": "0.28mm SuperDraft @Creality Ender5Pro (2019) (0.6 nozzle)", - "sub_path": "process/0.28mm SuperDraft @Creality Ender5Pro (2019) (0.6 nozzle).json" + "name": "0.28mm SuperDraft @Creality Ender5Pro (2019) 0.6", + "sub_path": "process/0.28mm SuperDraft @Creality Ender5Pro (2019) 0.6.json" }, { - "name": "0.28mm SuperDraft @Creality Ender5Pro (2019) (0.8 nozzle)", - "sub_path": "process/0.28mm SuperDraft @Creality Ender5Pro (2019) (0.8 nozzle).json" + "name": "0.28mm SuperDraft @Creality Ender5Pro (2019) 0.8", + "sub_path": "process/0.28mm SuperDraft @Creality Ender5Pro (2019) 0.8.json" }, { - "name": "0.28mm SuperDraft @Creality Ender5Pro (2019) (1.0 nozzle)", - "sub_path": "process/0.28mm SuperDraft @Creality Ender5Pro (2019) (1.0 nozzle).json" + "name": "0.28mm SuperDraft @Creality Ender5Pro (2019) 1.0", + "sub_path": "process/0.28mm SuperDraft @Creality Ender5Pro (2019) 1.0.json" }, { "name": "0.32mm Chunky @Creality CR-6 0.6", @@ -407,20 +411,20 @@ "sub_path": "process/0.36mm SuperChunky @Creality CR-6 0.6.json" }, { - "name": "0.36mm Chunky @Creality Ender5Pro (2019) (0.5 nozzle)", - "sub_path": "process/0.36mm Chunky @Creality Ender5Pro (2019) (0.5 nozzle).json" + "name": "0.36mm Chunky @Creality Ender5Pro (2019) 0.5", + "sub_path": "process/0.36mm Chunky @Creality Ender5Pro (2019) 0.5.json" }, { - "name": "0.36mm Chunky @Creality Ender5Pro (2019) (0.6 nozzle)", - "sub_path": "process/0.36mm Chunky @Creality Ender5Pro (2019) (0.6 nozzle).json" + "name": "0.36mm Chunky @Creality Ender5Pro (2019) 0.6", + "sub_path": "process/0.36mm Chunky @Creality Ender5Pro (2019) 0.6.json" }, { - "name": "0.36mm Chunky @Creality Ender5Pro (2019) (0.8 nozzle)", - "sub_path": "process/0.36mm Chunky @Creality Ender5Pro (2019) (0.8 nozzle).json" + "name": "0.36mm Chunky @Creality Ender5Pro (2019) 0.8", + "sub_path": "process/0.36mm Chunky @Creality Ender5Pro (2019) 0.8.json" }, { - "name": "0.36mm Chunky @Creality Ender5Pro (2019) (1.0 nozzle)", - "sub_path": "process/0.36mm Chunky @Creality Ender5Pro (2019) (1.0 nozzle).json" + "name": "0.36mm Chunky @Creality Ender5Pro (2019) 1.0", + "sub_path": "process/0.36mm Chunky @Creality Ender5Pro (2019) 1.0.json" }, { "name": "0.40mm Draft @Creality CR-6 0.8", @@ -631,36 +635,36 @@ "sub_path": "machine/Creality Ender-5 Plus 0.4 nozzle.json" }, { - "name": "Creality Ender-5 Pro (2019) (0.2 nozzle)", - "sub_path": "machine/Creality Ender-5 Pro (2019) (0.2 nozzle).json" + "name": "Creality Ender-5 Pro (2019) 0.2 nozzle", + "sub_path": "machine/Creality Ender-5 Pro (2019) 0.2 nozzle.json" }, { - "name": "Creality Ender-5 Pro (2019) (0.25 nozzle)", - "sub_path": "machine/Creality Ender-5 Pro (2019) (0.25 nozzle).json" + "name": "Creality Ender-5 Pro (2019) 0.25 nozzle", + "sub_path": "machine/Creality Ender-5 Pro (2019) 0.25 nozzle.json" }, { - "name": "Creality Ender-5 Pro (2019) (0.3 nozzle)", - "sub_path": "machine/Creality Ender-5 Pro (2019) (0.3 nozzle).json" + "name": "Creality Ender-5 Pro (2019) 0.3 nozzle", + "sub_path": "machine/Creality Ender-5 Pro (2019) 0.3 nozzle.json" }, { - "name": "Creality Ender-5 Pro (2019) (0.4 nozzle)", - "sub_path": "machine/Creality Ender-5 Pro (2019) (0.4 nozzle).json" + "name": "Creality Ender-5 Pro (2019) 0.4 nozzle", + "sub_path": "machine/Creality Ender-5 Pro (2019) 0.4 nozzle.json" }, { - "name": "Creality Ender-5 Pro (2019) (0.5 nozzle)", - "sub_path": "machine/Creality Ender-5 Pro (2019) (0.5 nozzle).json" + "name": "Creality Ender-5 Pro (2019) 0.5 nozzle", + "sub_path": "machine/Creality Ender-5 Pro (2019) 0.5 nozzle.json" }, { - "name": "Creality Ender-5 Pro (2019) (0.6 nozzle)", - "sub_path": "machine/Creality Ender-5 Pro (2019) (0.6 nozzle).json" + "name": "Creality Ender-5 Pro (2019) 0.6 nozzle", + "sub_path": "machine/Creality Ender-5 Pro (2019) 0.6 nozzle.json" }, { - "name": "Creality Ender-5 Pro (2019) (0.8 nozzle)", - "sub_path": "machine/Creality Ender-5 Pro (2019) (0.8 nozzle).json" + "name": "Creality Ender-5 Pro (2019) 0.8 nozzle", + "sub_path": "machine/Creality Ender-5 Pro (2019) 0.8 nozzle.json" }, { - "name": "Creality Ender-5 Pro (2019) (1.0 nozzle)", - "sub_path": "machine/Creality Ender-5 Pro (2019) (1.0 nozzle).json" + "name": "Creality Ender-5 Pro (2019) 1.0 nozzle", + "sub_path": "machine/Creality Ender-5 Pro (2019) 1.0 nozzle.json" }, { "name": "Creality Ender-5S 0.4 nozzle", @@ -695,4 +699,4 @@ "sub_path": "machine/Creality K1 Max (0.8 nozzle).json" } ] -} +} \ No newline at end of file diff --git a/resources/profiles/Creality/filament/Creality Generic ABS.json b/resources/profiles/Creality/filament/Creality Generic ABS.json index 88526e3f07..01eec5576e 100644 --- a/resources/profiles/Creality/filament/Creality Generic ABS.json +++ b/resources/profiles/Creality/filament/Creality Generic ABS.json @@ -25,14 +25,14 @@ "Creality Ender-3 S1 Pro 0.4 nozzle", "Creality Ender-5 0.4 nozzle", "Creality Ender-5 Plus 0.4 nozzle", - "Creality Ender-5 Pro (2019) (0.2 nozzle)", - "Creality Ender-5 Pro (2019) (0.25 nozzle)", - "Creality Ender-5 Pro (2019) (0.3 nozzle)", - "Creality Ender-5 Pro (2019) (0.4 nozzle)", - "Creality Ender-5 Pro (2019) (0.5 nozzle)", - "Creality Ender-5 Pro (2019) (0.6 nozzle)", - "Creality Ender-5 Pro (2019) (0.8 nozzle)", - "Creality Ender-5 Pro (2019) (1.0 nozzle)", + "Creality Ender-5 Pro (2019) 0.2 nozzle", + "Creality Ender-5 Pro (2019) 0.25 nozzle", + "Creality Ender-5 Pro (2019) 0.3 nozzle", + "Creality Ender-5 Pro (2019) 0.4 nozzle", + "Creality Ender-5 Pro (2019) 0.5 nozzle", + "Creality Ender-5 Pro (2019) 0.6 nozzle", + "Creality Ender-5 Pro (2019) 0.8 nozzle", + "Creality Ender-5 Pro (2019) 1.0 nozzle", "Creality Ender-5S 0.4 nozzle", "Creality Ender-5 S1 0.4 nozzle", "Creality Ender-6 0.4 nozzle", diff --git a/resources/profiles/Creality/filament/Creality Generic ASA.json b/resources/profiles/Creality/filament/Creality Generic ASA.json index cfc0be665d..18a8fad19f 100644 --- a/resources/profiles/Creality/filament/Creality Generic ASA.json +++ b/resources/profiles/Creality/filament/Creality Generic ASA.json @@ -25,14 +25,14 @@ "Creality Ender-3 S1 Pro 0.4 nozzle", "Creality Ender-5 0.4 nozzle", "Creality Ender-5 Plus 0.4 nozzle", - "Creality Ender-5 Pro (2019) (0.2 nozzle)", - "Creality Ender-5 Pro (2019) (0.25 nozzle)", - "Creality Ender-5 Pro (2019) (0.3 nozzle)", - "Creality Ender-5 Pro (2019) (0.4 nozzle)", - "Creality Ender-5 Pro (2019) (0.5 nozzle)", - "Creality Ender-5 Pro (2019) (0.6 nozzle)", - "Creality Ender-5 Pro (2019) (0.8 nozzle)", - "Creality Ender-5 Pro (2019) (1.0 nozzle)", + "Creality Ender-5 Pro (2019) 0.2 nozzle", + "Creality Ender-5 Pro (2019) 0.25 nozzle", + "Creality Ender-5 Pro (2019) 0.3 nozzle", + "Creality Ender-5 Pro (2019) 0.4 nozzle", + "Creality Ender-5 Pro (2019) 0.5 nozzle", + "Creality Ender-5 Pro (2019) 0.6 nozzle", + "Creality Ender-5 Pro (2019) 0.8 nozzle", + "Creality Ender-5 Pro (2019) 1.0 nozzle", "Creality Ender-5S 0.4 nozzle", "Creality Ender-5 S1 0.4 nozzle", "Creality Ender-6 0.4 nozzle", diff --git a/resources/profiles/Creality/filament/Creality Generic PETG.json b/resources/profiles/Creality/filament/Creality Generic PETG.json index 8ef6079e0b..d1c0652f5b 100644 --- a/resources/profiles/Creality/filament/Creality Generic PETG.json +++ b/resources/profiles/Creality/filament/Creality Generic PETG.json @@ -35,14 +35,14 @@ "Creality Ender-3 S1 Pro 0.4 nozzle", "Creality Ender-5 0.4 nozzle", "Creality Ender-5 Plus 0.4 nozzle", - "Creality Ender-5 Pro (2019) (0.2 nozzle)", - "Creality Ender-5 Pro (2019) (0.25 nozzle)", - "Creality Ender-5 Pro (2019) (0.3 nozzle)", - "Creality Ender-5 Pro (2019) (0.4 nozzle)", - "Creality Ender-5 Pro (2019) (0.5 nozzle)", - "Creality Ender-5 Pro (2019) (0.6 nozzle)", - "Creality Ender-5 Pro (2019) (0.8 nozzle)", - "Creality Ender-5 Pro (2019) (1.0 nozzle)", + "Creality Ender-5 Pro (2019) 0.2 nozzle", + "Creality Ender-5 Pro (2019) 0.25 nozzle", + "Creality Ender-5 Pro (2019) 0.3 nozzle", + "Creality Ender-5 Pro (2019) 0.4 nozzle", + "Creality Ender-5 Pro (2019) 0.5 nozzle", + "Creality Ender-5 Pro (2019) 0.6 nozzle", + "Creality Ender-5 Pro (2019) 0.8 nozzle", + "Creality Ender-5 Pro (2019) 1.0 nozzle", "Creality Ender-5S 0.4 nozzle", "Creality Ender-5 S1 0.4 nozzle", "Creality Ender-6 0.4 nozzle", diff --git a/resources/profiles/Creality/filament/Creality Generic PLA.json b/resources/profiles/Creality/filament/Creality Generic PLA.json index 387f57f011..5b05a61e04 100644 --- a/resources/profiles/Creality/filament/Creality Generic PLA.json +++ b/resources/profiles/Creality/filament/Creality Generic PLA.json @@ -26,14 +26,14 @@ "Creality Ender-3 S1 Pro 0.4 nozzle", "Creality Ender-5 0.4 nozzle", "Creality Ender-5 Plus 0.4 nozzle", - "Creality Ender-5 Pro (2019) (0.2 nozzle)", - "Creality Ender-5 Pro (2019) (0.25 nozzle)", - "Creality Ender-5 Pro (2019) (0.3 nozzle)", - "Creality Ender-5 Pro (2019) (0.4 nozzle)", - "Creality Ender-5 Pro (2019) (0.5 nozzle)", - "Creality Ender-5 Pro (2019) (0.6 nozzle)", - "Creality Ender-5 Pro (2019) (0.8 nozzle)", - "Creality Ender-5 Pro (2019) (1.0 nozzle)", + "Creality Ender-5 Pro (2019) 0.2 nozzle", + "Creality Ender-5 Pro (2019) 0.25 nozzle", + "Creality Ender-5 Pro (2019) 0.3 nozzle", + "Creality Ender-5 Pro (2019) 0.4 nozzle", + "Creality Ender-5 Pro (2019) 0.5 nozzle", + "Creality Ender-5 Pro (2019) 0.6 nozzle", + "Creality Ender-5 Pro (2019) 0.8 nozzle", + "Creality Ender-5 Pro (2019) 1.0 nozzle", "Creality Ender-5S 0.4 nozzle", "Creality Ender-5 S1 0.4 nozzle", "Creality Ender-6 0.4 nozzle", diff --git a/resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) (0.2 nozzle).json b/resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) 0.2 nozzle.json similarity index 89% rename from resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) (0.2 nozzle).json rename to resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) 0.2 nozzle.json index 7252f3a347..02ec45a7db 100644 --- a/resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) (0.2 nozzle).json +++ b/resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) 0.2 nozzle.json @@ -1,7 +1,7 @@ { "type": "machine", "setting_id": "GM001", - "name": "Creality Ender-5 Pro (2019) (0.2 nozzle)", + "name": "Creality Ender-5 Pro (2019) 0.2 nozzle", "from": "system", "instantiation": "true", "inherits": "fdm_creality_common", @@ -10,7 +10,7 @@ "Creality Generic PLA" ], "printer_variant": "0.2", - "default_print_profile": "0.16mm Optimal @Creality Ender5Pro (2019) (0.2 nozzle)", + "default_print_profile": "0.16mm Optimal @Creality Ender5Pro (2019) 0.2", "max_layer_height": [ "0.16" ], diff --git a/resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) (0.25 nozzle).json b/resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) 0.25 nozzle.json similarity index 88% rename from resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) (0.25 nozzle).json rename to resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) 0.25 nozzle.json index 589ae4ef39..7afcba3e3b 100644 --- a/resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) (0.25 nozzle).json +++ b/resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) 0.25 nozzle.json @@ -1,7 +1,7 @@ { "type": "machine", "setting_id": "GM001", - "name": "Creality Ender-5 Pro (2019) (0.25 nozzle)", + "name": "Creality Ender-5 Pro (2019) 0.25 nozzle", "from": "system", "instantiation": "true", "inherits": "fdm_creality_common", @@ -10,7 +10,7 @@ "Creality Generic PLA" ], "printer_variant": "0.25", - "default_print_profile": "0.20mm Standard @Creality Ender5Pro (2019) (0.25 nozzle)", + "default_print_profile": "0.20mm Standard @Creality Ender5Pro (2019) 0.25", "max_layer_height": [ "0.2" ], diff --git a/resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) (0.3 nozzle).json b/resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) 0.3 nozzle.json similarity index 89% rename from resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) (0.3 nozzle).json rename to resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) 0.3 nozzle.json index f9f84d37bf..88ad5115d5 100644 --- a/resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) (0.3 nozzle).json +++ b/resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) 0.3 nozzle.json @@ -1,7 +1,7 @@ { "type": "machine", "setting_id": "GM001", - "name": "Creality Ender-5 Pro (2019) (0.3 nozzle)", + "name": "Creality Ender-5 Pro (2019) 0.3 nozzle", "from": "system", "instantiation": "true", "inherits": "fdm_creality_common", @@ -10,7 +10,7 @@ "Creality Generic PLA" ], "printer_variant": "0.3", - "default_print_profile": "0.20mm Standard @Creality Ender5Pro (2019) (0.3 nozzle)", + "default_print_profile": "0.20mm Standard @Creality Ender5Pro (2019) 0.3", "max_layer_height": [ "0.24" ], diff --git a/resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) (0.4 nozzle).json b/resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) 0.4 nozzle.json similarity index 87% rename from resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) (0.4 nozzle).json rename to resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) 0.4 nozzle.json index 1babc0db4c..fe029ae8d3 100644 --- a/resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) (0.4 nozzle).json +++ b/resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) 0.4 nozzle.json @@ -1,7 +1,7 @@ { "type": "machine", "setting_id": "GM001", - "name": "Creality Ender-5 Pro (2019) (0.4 nozzle)", + "name": "Creality Ender-5 Pro (2019) 0.4 nozzle", "from": "system", "instantiation": "true", "inherits": "fdm_creality_common", @@ -9,7 +9,7 @@ "default_filament_profile": [ "Creality Generic PLA" ], - "default_print_profile": "0.20mm Standard @Creality Ender5Pro (2019) (0.4 nozzle)", + "default_print_profile": "0.20mm Standard @Creality Ender5Pro (2019)", "nozzle_diameter": [ "0.4" ], diff --git a/resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) (0.5 nozzle).json b/resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) 0.5 nozzle.json similarity index 89% rename from resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) (0.5 nozzle).json rename to resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) 0.5 nozzle.json index 5bd4b6eac7..0990664546 100644 --- a/resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) (0.5 nozzle).json +++ b/resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) 0.5 nozzle.json @@ -1,7 +1,7 @@ { "type": "machine", "setting_id": "GM001", - "name": "Creality Ender-5 Pro (2019) (0.5 nozzle)", + "name": "Creality Ender-5 Pro (2019) 0.5 nozzle", "from": "system", "instantiation": "true", "inherits": "fdm_creality_common", @@ -10,7 +10,7 @@ "Creality Generic PLA" ], "printer_variant": "0.5", - "default_print_profile": "0.20mm Standard @Creality Ender5Pro (2019) (0.5 nozzle)", + "default_print_profile": "0.20mm Standard @Creality Ender5Pro (2019) 0.5", "max_layer_height": [ "0.4" ], diff --git a/resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) (0.6 nozzle).json b/resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) 0.6 nozzle.json similarity index 89% rename from resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) (0.6 nozzle).json rename to resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) 0.6 nozzle.json index be4951fece..1956e96c72 100644 --- a/resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) (0.6 nozzle).json +++ b/resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) 0.6 nozzle.json @@ -1,7 +1,7 @@ { "type": "machine", "setting_id": "GM001", - "name": "Creality Ender-5 Pro (2019) (0.6 nozzle)", + "name": "Creality Ender-5 Pro (2019) 0.6 nozzle", "from": "system", "instantiation": "true", "inherits": "fdm_creality_common", @@ -10,7 +10,7 @@ "Creality Generic PLA" ], "printer_variant": "0.6", - "default_print_profile": "0.20mm Standard @Creality Ender5Pro (2019) (0.6 nozzle)", + "default_print_profile": "0.20mm Standard @Creality Ender5Pro (2019) 0.6", "max_layer_height": [ "0.48" ], diff --git a/resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) (0.8 nozzle).json b/resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) 0.8 nozzle.json similarity index 89% rename from resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) (0.8 nozzle).json rename to resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) 0.8 nozzle.json index c1ad60e649..2191dbd7a5 100644 --- a/resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) (0.8 nozzle).json +++ b/resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) 0.8 nozzle.json @@ -1,7 +1,7 @@ { "type": "machine", "setting_id": "GM001", - "name": "Creality Ender-5 Pro (2019) (0.8 nozzle)", + "name": "Creality Ender-5 Pro (2019) 0.8 nozzle", "from": "system", "instantiation": "true", "inherits": "fdm_creality_common", @@ -10,7 +10,7 @@ "Creality Generic PLA" ], "printer_variant": "0.8", - "default_print_profile": "0.20mm Standard @Creality Ender5Pro (2019) (0.8 nozzle)", + "default_print_profile": "0.20mm Standard @Creality Ender5Pro (2019) 0.8", "max_layer_height": [ "0.64" ], diff --git a/resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) (1.0 nozzle).json b/resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) 1.0 nozzle.json similarity index 88% rename from resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) (1.0 nozzle).json rename to resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) 1.0 nozzle.json index d843420ee8..5b9d7f171e 100644 --- a/resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) (1.0 nozzle).json +++ b/resources/profiles/Creality/machine/Creality Ender-5 Pro (2019) 1.0 nozzle.json @@ -1,7 +1,7 @@ { "type": "machine", "setting_id": "GM001", - "name": "Creality Ender-5 Pro (2019) (1.0 nozzle)", + "name": "Creality Ender-5 Pro (2019) 1.0 nozzle", "from": "system", "instantiation": "true", "inherits": "fdm_creality_common", @@ -10,7 +10,7 @@ "Creality Generic PLA" ], "printer_variant": "1.0", - "default_print_profile": "0.28mm SuperDraft @Creality Ender5Pro (2019) (1.0 nozzle)", + "default_print_profile": "0.28mm SuperDraft @Creality Ender5Pro (2019) 1.0", "max_layer_height": [ "0.80" ], diff --git a/resources/profiles/Creality/machine/Creality K1 (0.4 nozzle).json b/resources/profiles/Creality/machine/Creality K1 (0.4 nozzle).json index 2c77f24220..7d7318e06e 100644 --- a/resources/profiles/Creality/machine/Creality K1 (0.4 nozzle).json +++ b/resources/profiles/Creality/machine/Creality K1 (0.4 nozzle).json @@ -26,8 +26,8 @@ "machine_max_speed_y": ["1000", "1000"], "machine_max_speed_z": ["30", "30"], "machine_max_jerk_e": ["2.5", "2.5"], - "machine_max_jerk_x": ["5", "5"], - "machine_max_jerk_y": ["5", "5"], + "machine_max_jerk_x": ["12", "12"], + "machine_max_jerk_y": ["12", "12"], "machine_max_jerk_z": ["2", "2"], "max_layer_height": ["0.3"], "min_layer_height": ["0.08"], diff --git a/resources/profiles/Creality/machine/Creality K1 (0.6 nozzle).json b/resources/profiles/Creality/machine/Creality K1 (0.6 nozzle).json index cad0890027..4dc6040ff1 100644 --- a/resources/profiles/Creality/machine/Creality K1 (0.6 nozzle).json +++ b/resources/profiles/Creality/machine/Creality K1 (0.6 nozzle).json @@ -26,8 +26,8 @@ "machine_max_speed_y": ["1000", "1000"], "machine_max_speed_z": ["30", "30"], "machine_max_jerk_e": ["2.5", "2.5"], - "machine_max_jerk_x": ["5", "5"], - "machine_max_jerk_y": ["5", "5"], + "machine_max_jerk_x": ["12", "12"], + "machine_max_jerk_y": ["12", "12"], "machine_max_jerk_z": ["2", "2"], "max_layer_height": ["0.4"], "min_layer_height": ["0.08"], diff --git a/resources/profiles/Creality/machine/Creality K1 (0.8 nozzle).json b/resources/profiles/Creality/machine/Creality K1 (0.8 nozzle).json index 5b28bfaeb3..c38bec2896 100644 --- a/resources/profiles/Creality/machine/Creality K1 (0.8 nozzle).json +++ b/resources/profiles/Creality/machine/Creality K1 (0.8 nozzle).json @@ -26,8 +26,8 @@ "machine_max_speed_y": ["1000", "1000"], "machine_max_speed_z": ["30", "30"], "machine_max_jerk_e": ["2.5", "2.5"], - "machine_max_jerk_x": ["5", "5"], - "machine_max_jerk_y": ["5", "5"], + "machine_max_jerk_x": ["12", "12"], + "machine_max_jerk_y": ["12", "12"], "machine_max_jerk_z": ["2", "2"], "max_layer_height": ["0.5"], "min_layer_height": ["0.08"], diff --git a/resources/profiles/Creality/machine/Creality K1 Max (0.4 nozzle).json b/resources/profiles/Creality/machine/Creality K1 Max (0.4 nozzle).json index ee44d5bf2d..796e8dcf60 100644 --- a/resources/profiles/Creality/machine/Creality K1 Max (0.4 nozzle).json +++ b/resources/profiles/Creality/machine/Creality K1 Max (0.4 nozzle).json @@ -13,7 +13,7 @@ "printable_area": ["0x0", "300x0", "300x300", "0x300"], "printable_height": "300", "nozzle_type": "hardened_steel", - "auxiliary_fan": "0", + "auxiliary_fan": "1", "machine_max_acceleration_e": ["5000", "5000"], "machine_max_acceleration_extruding": ["20000", "20000"], "machine_max_acceleration_retracting": ["5000", "5000"], @@ -26,8 +26,8 @@ "machine_max_speed_y": ["1000", "1000"], "machine_max_speed_z": ["30", "30"], "machine_max_jerk_e": ["2.5", "2.5"], - "machine_max_jerk_x": ["5", "5"], - "machine_max_jerk_y": ["5", "5"], + "machine_max_jerk_x": ["12", "12"], + "machine_max_jerk_y": ["12", "12"], "machine_max_jerk_z": ["2", "2"], "max_layer_height": ["0.3"], "min_layer_height": ["0.08"], diff --git a/resources/profiles/Creality/machine/Creality K1 Max (0.6 nozzle).json b/resources/profiles/Creality/machine/Creality K1 Max (0.6 nozzle).json index bd608bf6e5..545a15fd9b 100644 --- a/resources/profiles/Creality/machine/Creality K1 Max (0.6 nozzle).json +++ b/resources/profiles/Creality/machine/Creality K1 Max (0.6 nozzle).json @@ -13,7 +13,7 @@ "printable_area": ["0x0", "300x0", "300x300", "0x300"], "printable_height": "300", "nozzle_type": "hardened_steel", - "auxiliary_fan": "0", + "auxiliary_fan": "1", "machine_max_acceleration_e": ["5000", "5000"], "machine_max_acceleration_extruding": ["20000", "20000"], "machine_max_acceleration_retracting": ["5000", "5000"], @@ -26,8 +26,8 @@ "machine_max_speed_y": ["1000", "1000"], "machine_max_speed_z": ["30", "30"], "machine_max_jerk_e": ["2.5", "2.5"], - "machine_max_jerk_x": ["5", "5"], - "machine_max_jerk_y": ["5", "5"], + "machine_max_jerk_x": ["12", "12"], + "machine_max_jerk_y": ["12", "12"], "machine_max_jerk_z": ["2", "2"], "max_layer_height": ["0.4"], "min_layer_height": ["0.08"], diff --git a/resources/profiles/Creality/machine/Creality K1 Max (0.8 nozzle).json b/resources/profiles/Creality/machine/Creality K1 Max (0.8 nozzle).json index d1873d19e9..cdaccf13ea 100644 --- a/resources/profiles/Creality/machine/Creality K1 Max (0.8 nozzle).json +++ b/resources/profiles/Creality/machine/Creality K1 Max (0.8 nozzle).json @@ -13,7 +13,7 @@ "printable_area": ["0x0", "300x0", "300x300", "0x300"], "printable_height": "300", "nozzle_type": "hardened_steel", - "auxiliary_fan": "0", + "auxiliary_fan": "1", "machine_max_acceleration_e": ["5000", "5000"], "machine_max_acceleration_extruding": ["20000", "20000"], "machine_max_acceleration_retracting": ["5000", "5000"], @@ -26,8 +26,8 @@ "machine_max_speed_y": ["1000", "1000"], "machine_max_speed_z": ["30", "30"], "machine_max_jerk_e": ["2.5", "2.5"], - "machine_max_jerk_x": ["5", "5"], - "machine_max_jerk_y": ["5", "5"], + "machine_max_jerk_x": ["12", "12"], + "machine_max_jerk_y": ["12", "12"], "machine_max_jerk_z": ["2", "2"], "max_layer_height": ["0.5"], "min_layer_height": ["0.08"], diff --git a/resources/profiles/Creality/machine/fdm_creality_common.json b/resources/profiles/Creality/machine/fdm_creality_common.json index 5b392f7c9e..4b39e76fb1 100644 --- a/resources/profiles/Creality/machine/fdm_creality_common.json +++ b/resources/profiles/Creality/machine/fdm_creality_common.json @@ -30,8 +30,8 @@ "500" ], "machine_max_acceleration_z": [ - "100", - "100" + "500", + "500" ], "machine_max_speed_e": [ "60", diff --git a/resources/profiles/Creality/machine/fdm_machine_common.json b/resources/profiles/Creality/machine/fdm_machine_common.json index 1c38dd8cc5..1f9aa54cd4 100644 --- a/resources/profiles/Creality/machine/fdm_machine_common.json +++ b/resources/profiles/Creality/machine/fdm_machine_common.json @@ -31,7 +31,7 @@ "10000" ], "machine_max_acceleration_z": [ - "100" + "500" ], "machine_max_speed_e": [ "60" diff --git a/resources/profiles/Creality/process/0.08mm SuperDetail @Creality Ender5Pro (2019) (0.2 nozzle).json b/resources/profiles/Creality/process/0.08mm SuperDetail @Creality Ender5Pro (2019) 0.2.json similarity index 78% rename from resources/profiles/Creality/process/0.08mm SuperDetail @Creality Ender5Pro (2019) (0.2 nozzle).json rename to resources/profiles/Creality/process/0.08mm SuperDetail @Creality Ender5Pro (2019) 0.2.json index 8b9f027e3b..7cec18dd21 100644 --- a/resources/profiles/Creality/process/0.08mm SuperDetail @Creality Ender5Pro (2019) (0.2 nozzle).json +++ b/resources/profiles/Creality/process/0.08mm SuperDetail @Creality Ender5Pro (2019) 0.2.json @@ -1,7 +1,7 @@ { "type": "process", "setting_id": "GP004", - "name": "0.08mm SuperDetail @Creality Ender5Pro (2019) (0.2 nozzle)", + "name": "0.08mm SuperDetail @Creality Ender5Pro (2019) 0.2", "from": "system", "instantiation": "true", "inherits": "fdm_process_creality_common_0_2", diff --git a/resources/profiles/Creality/process/0.08mm SuperDetail @Creality Ender5Pro (2019) (0.25 nozzle).json b/resources/profiles/Creality/process/0.08mm SuperDetail @Creality Ender5Pro (2019) 0.25.json similarity index 78% rename from resources/profiles/Creality/process/0.08mm SuperDetail @Creality Ender5Pro (2019) (0.25 nozzle).json rename to resources/profiles/Creality/process/0.08mm SuperDetail @Creality Ender5Pro (2019) 0.25.json index 80f7962f52..549411b2c4 100644 --- a/resources/profiles/Creality/process/0.08mm SuperDetail @Creality Ender5Pro (2019) (0.25 nozzle).json +++ b/resources/profiles/Creality/process/0.08mm SuperDetail @Creality Ender5Pro (2019) 0.25.json @@ -1,7 +1,7 @@ { "type": "process", "setting_id": "GP004", - "name": "0.08mm SuperDetail @Creality Ender5Pro (2019) (0.25 nozzle)", + "name": "0.08mm SuperDetail @Creality Ender5Pro (2019) 0.25", "from": "system", "instantiation": "true", "inherits": "fdm_process_creality_common_0_25", diff --git a/resources/profiles/Creality/process/0.08mm SuperDetail @Creality Ender5Pro (2019) (0.3 nozzle).json b/resources/profiles/Creality/process/0.08mm SuperDetail @Creality Ender5Pro (2019) 0.3.json similarity index 78% rename from resources/profiles/Creality/process/0.08mm SuperDetail @Creality Ender5Pro (2019) (0.3 nozzle).json rename to resources/profiles/Creality/process/0.08mm SuperDetail @Creality Ender5Pro (2019) 0.3.json index 48a3fb6f48..793afc2a53 100644 --- a/resources/profiles/Creality/process/0.08mm SuperDetail @Creality Ender5Pro (2019) (0.3 nozzle).json +++ b/resources/profiles/Creality/process/0.08mm SuperDetail @Creality Ender5Pro (2019) 0.3.json @@ -1,7 +1,7 @@ { "type": "process", "setting_id": "GP004", - "name": "0.08mm SuperDetail @Creality Ender5Pro (2019) (0.3 nozzle)", + "name": "0.08mm SuperDetail @Creality Ender5Pro (2019) 0.3", "from": "system", "instantiation": "true", "inherits": "fdm_process_creality_common_0_3", diff --git a/resources/profiles/Creality/process/0.10mm HighDetail @Creality Ender5Pro (2019) (0.2 nozzle).json b/resources/profiles/Creality/process/0.10mm HighDetail @Creality Ender5Pro (2019) 0.2.json similarity index 78% rename from resources/profiles/Creality/process/0.10mm HighDetail @Creality Ender5Pro (2019) (0.2 nozzle).json rename to resources/profiles/Creality/process/0.10mm HighDetail @Creality Ender5Pro (2019) 0.2.json index ee580beee3..f250aea565 100644 --- a/resources/profiles/Creality/process/0.10mm HighDetail @Creality Ender5Pro (2019) (0.2 nozzle).json +++ b/resources/profiles/Creality/process/0.10mm HighDetail @Creality Ender5Pro (2019) 0.2.json @@ -1,7 +1,7 @@ { "type": "process", "setting_id": "GP004", - "name": "0.10mm HighDetail @Creality Ender5Pro (2019) (0.2 nozzle)", + "name": "0.10mm HighDetail @Creality Ender5Pro (2019) 0.2", "from": "system", "instantiation": "true", "inherits": "fdm_process_creality_common_0_2", diff --git a/resources/profiles/Creality/process/0.10mm HighDetail @Creality Ender5Pro (2019) (0.25 nozzle).json b/resources/profiles/Creality/process/0.10mm HighDetail @Creality Ender5Pro (2019) 0.25.json similarity index 78% rename from resources/profiles/Creality/process/0.10mm HighDetail @Creality Ender5Pro (2019) (0.25 nozzle).json rename to resources/profiles/Creality/process/0.10mm HighDetail @Creality Ender5Pro (2019) 0.25.json index 09e4383061..b1206a2759 100644 --- a/resources/profiles/Creality/process/0.10mm HighDetail @Creality Ender5Pro (2019) (0.25 nozzle).json +++ b/resources/profiles/Creality/process/0.10mm HighDetail @Creality Ender5Pro (2019) 0.25.json @@ -1,7 +1,7 @@ { "type": "process", "setting_id": "GP004", - "name": "0.10mm HighDetail @Creality Ender5Pro (2019) (0.25 nozzle)", + "name": "0.10mm HighDetail @Creality Ender5Pro (2019) 0.25", "from": "system", "instantiation": "true", "inherits": "fdm_process_creality_common_0_25", diff --git a/resources/profiles/Creality/process/0.10mm HighDetail @Creality Ender5Pro (2019) (0.3 nozzle).json b/resources/profiles/Creality/process/0.10mm HighDetail @Creality Ender5Pro (2019) 0.3.json similarity index 78% rename from resources/profiles/Creality/process/0.10mm HighDetail @Creality Ender5Pro (2019) (0.3 nozzle).json rename to resources/profiles/Creality/process/0.10mm HighDetail @Creality Ender5Pro (2019) 0.3.json index 3ab61528ae..9538235d08 100644 --- a/resources/profiles/Creality/process/0.10mm HighDetail @Creality Ender5Pro (2019) (0.3 nozzle).json +++ b/resources/profiles/Creality/process/0.10mm HighDetail @Creality Ender5Pro (2019) 0.3.json @@ -1,7 +1,7 @@ { "type": "process", "setting_id": "GP004", - "name": "0.10mm HighDetail @Creality Ender5Pro (2019) (0.3 nozzle)", + "name": "0.10mm HighDetail @Creality Ender5Pro (2019) 0.3", "from": "system", "instantiation": "true", "inherits": "fdm_process_creality_common_0_3", diff --git a/resources/profiles/Creality/process/0.12mm Detail @Creality Ender5Pro (2019) (0.2 nozzle).json b/resources/profiles/Creality/process/0.12mm Detail @Creality Ender5Pro (2019) 0.2.json similarity index 79% rename from resources/profiles/Creality/process/0.12mm Detail @Creality Ender5Pro (2019) (0.2 nozzle).json rename to resources/profiles/Creality/process/0.12mm Detail @Creality Ender5Pro (2019) 0.2.json index c7e669aff1..3735306232 100644 --- a/resources/profiles/Creality/process/0.12mm Detail @Creality Ender5Pro (2019) (0.2 nozzle).json +++ b/resources/profiles/Creality/process/0.12mm Detail @Creality Ender5Pro (2019) 0.2.json @@ -1,7 +1,7 @@ { "type": "process", "setting_id": "GP004", - "name": "0.12mm Detail @Creality Ender5Pro (2019) (0.2 nozzle)", + "name": "0.12mm Detail @Creality Ender5Pro (2019) 0.2", "from": "system", "instantiation": "true", "inherits": "fdm_process_creality_common_0_2", diff --git a/resources/profiles/Creality/process/0.12mm Detail @Creality Ender5Pro (2019) (0.25 nozzle).json b/resources/profiles/Creality/process/0.12mm Detail @Creality Ender5Pro (2019) 0.25.json similarity index 79% rename from resources/profiles/Creality/process/0.12mm Detail @Creality Ender5Pro (2019) (0.25 nozzle).json rename to resources/profiles/Creality/process/0.12mm Detail @Creality Ender5Pro (2019) 0.25.json index daa30bc87d..c0657fab47 100644 --- a/resources/profiles/Creality/process/0.12mm Detail @Creality Ender5Pro (2019) (0.25 nozzle).json +++ b/resources/profiles/Creality/process/0.12mm Detail @Creality Ender5Pro (2019) 0.25.json @@ -1,7 +1,7 @@ { "type": "process", "setting_id": "GP004", - "name": "0.12mm Detail @Creality Ender5Pro (2019) (0.25 nozzle)", + "name": "0.12mm Detail @Creality Ender5Pro (2019) 0.25", "from": "system", "instantiation": "true", "inherits": "fdm_process_creality_common_0_25", diff --git a/resources/profiles/Creality/process/0.12mm Detail @Creality Ender5Pro (2019) (0.3 nozzle).json b/resources/profiles/Creality/process/0.12mm Detail @Creality Ender5Pro (2019) 0.3.json similarity index 79% rename from resources/profiles/Creality/process/0.12mm Detail @Creality Ender5Pro (2019) (0.3 nozzle).json rename to resources/profiles/Creality/process/0.12mm Detail @Creality Ender5Pro (2019) 0.3.json index a9b9f144a0..02eed0a0fe 100644 --- a/resources/profiles/Creality/process/0.12mm Detail @Creality Ender5Pro (2019) (0.3 nozzle).json +++ b/resources/profiles/Creality/process/0.12mm Detail @Creality Ender5Pro (2019) 0.3.json @@ -1,7 +1,7 @@ { "type": "process", "setting_id": "GP004", - "name": "0.12mm Detail @Creality Ender5Pro (2019) (0.3 nozzle)", + "name": "0.12mm Detail @Creality Ender5Pro (2019) 0.3", "from": "system", "instantiation": "true", "inherits": "fdm_process_creality_common_0_3", diff --git a/resources/profiles/Creality/process/0.12mm Detail @Creality Ender5Pro (2019) (0.5 nozzle).json b/resources/profiles/Creality/process/0.12mm Detail @Creality Ender5Pro (2019) 0.5.json similarity index 79% rename from resources/profiles/Creality/process/0.12mm Detail @Creality Ender5Pro (2019) (0.5 nozzle).json rename to resources/profiles/Creality/process/0.12mm Detail @Creality Ender5Pro (2019) 0.5.json index 6cfc7f79ff..b8014d3bf2 100644 --- a/resources/profiles/Creality/process/0.12mm Detail @Creality Ender5Pro (2019) (0.5 nozzle).json +++ b/resources/profiles/Creality/process/0.12mm Detail @Creality Ender5Pro (2019) 0.5.json @@ -1,7 +1,7 @@ { "type": "process", "setting_id": "GP004", - "name": "0.12mm Detail @Creality Ender5Pro (2019) (0.5 nozzle)", + "name": "0.12mm Detail @Creality Ender5Pro (2019) 0.5", "from": "system", "instantiation": "true", "inherits": "fdm_process_creality_common_0_5", diff --git a/resources/profiles/Creality/process/0.12mm Fine @Creality Ender5Pro (2019) (0.4 nozzle).json b/resources/profiles/Creality/process/0.12mm Fine @Creality Ender5Pro (2019).json similarity index 96% rename from resources/profiles/Creality/process/0.12mm Fine @Creality Ender5Pro (2019) (0.4 nozzle).json rename to resources/profiles/Creality/process/0.12mm Fine @Creality Ender5Pro (2019).json index a3b3608867..95e24872c8 100644 --- a/resources/profiles/Creality/process/0.12mm Fine @Creality Ender5Pro (2019) (0.4 nozzle).json +++ b/resources/profiles/Creality/process/0.12mm Fine @Creality Ender5Pro (2019).json @@ -1,7 +1,7 @@ { "type": "process", "setting_id": "GP004", - "name": "0.12mm Fine @Creality Ender5Pro (2019) (0.4 nozzle)", + "name": "0.12mm Fine @Creality Ender5Pro (2019)", "from": "system", "inherits": "fdm_process_creality_common", "instantiation": "true", @@ -103,6 +103,6 @@ "xy_hole_compensation": "0", "xy_contour_compensation": "0", "compatible_printers": [ - "Creality Ender-5 Pro (2019) (0.4 nozzle)" + "Creality Ender-5 Pro (2019) 0.4 nozzle" ] } diff --git a/resources/profiles/Creality/process/0.15mm Optimal @Creality Ender5Pro (2019) (0.4 nozzle).json b/resources/profiles/Creality/process/0.15mm Optimal @Creality Ender5Pro (2019).json similarity index 96% rename from resources/profiles/Creality/process/0.15mm Optimal @Creality Ender5Pro (2019) (0.4 nozzle).json rename to resources/profiles/Creality/process/0.15mm Optimal @Creality Ender5Pro (2019).json index e6eace18cc..9404f9d2f8 100644 --- a/resources/profiles/Creality/process/0.15mm Optimal @Creality Ender5Pro (2019) (0.4 nozzle).json +++ b/resources/profiles/Creality/process/0.15mm Optimal @Creality Ender5Pro (2019).json @@ -1,7 +1,7 @@ { "type": "process", "setting_id": "GP004", - "name": "0.15mm Optimal @Creality Ender5Pro (2019) (0.4 nozzle)", + "name": "0.15mm Optimal @Creality Ender5Pro (2019)", "from": "system", "inherits": "fdm_process_creality_common", "instantiation": "true", @@ -103,6 +103,6 @@ "xy_hole_compensation": "0", "xy_contour_compensation": "0", "compatible_printers": [ - "Creality Ender-5 Pro (2019) (0.4 nozzle)" + "Creality Ender-5 Pro (2019) 0.4 nozzle" ] } diff --git a/resources/profiles/Creality/process/0.16mm Optimal @Creality Ender5Pro (2019) (0.2 nozzle).json b/resources/profiles/Creality/process/0.16mm Optimal @Creality Ender5Pro (2019) 0.2.json similarity index 79% rename from resources/profiles/Creality/process/0.16mm Optimal @Creality Ender5Pro (2019) (0.2 nozzle).json rename to resources/profiles/Creality/process/0.16mm Optimal @Creality Ender5Pro (2019) 0.2.json index 3ae935a983..b83910a34b 100644 --- a/resources/profiles/Creality/process/0.16mm Optimal @Creality Ender5Pro (2019) (0.2 nozzle).json +++ b/resources/profiles/Creality/process/0.16mm Optimal @Creality Ender5Pro (2019) 0.2.json @@ -1,7 +1,7 @@ { "type": "process", "setting_id": "GP004", - "name": "0.16mm Optimal @Creality Ender5Pro (2019) (0.2 nozzle)", + "name": "0.16mm Optimal @Creality Ender5Pro (2019) 0.2", "from": "system", "instantiation": "true", "inherits": "fdm_process_creality_common_0_2", diff --git a/resources/profiles/Creality/process/0.16mm Optimal @Creality Ender5Pro (2019) (0.25 nozzle).json b/resources/profiles/Creality/process/0.16mm Optimal @Creality Ender5Pro (2019) 0.25.json similarity index 79% rename from resources/profiles/Creality/process/0.16mm Optimal @Creality Ender5Pro (2019) (0.25 nozzle).json rename to resources/profiles/Creality/process/0.16mm Optimal @Creality Ender5Pro (2019) 0.25.json index 4748d4d118..81aead0251 100644 --- a/resources/profiles/Creality/process/0.16mm Optimal @Creality Ender5Pro (2019) (0.25 nozzle).json +++ b/resources/profiles/Creality/process/0.16mm Optimal @Creality Ender5Pro (2019) 0.25.json @@ -1,7 +1,7 @@ { "type": "process", "setting_id": "GP004", - "name": "0.16mm Optimal @Creality Ender5Pro (2019) (0.25 nozzle)", + "name": "0.16mm Optimal @Creality Ender5Pro (2019) 0.25", "from": "system", "instantiation": "true", "inherits": "fdm_process_creality_common_0_25", diff --git a/resources/profiles/Creality/process/0.16mm Optimal @Creality Ender5Pro (2019) (0.3 nozzle).json b/resources/profiles/Creality/process/0.16mm Optimal @Creality Ender5Pro (2019) 0.3.json similarity index 79% rename from resources/profiles/Creality/process/0.16mm Optimal @Creality Ender5Pro (2019) (0.3 nozzle).json rename to resources/profiles/Creality/process/0.16mm Optimal @Creality Ender5Pro (2019) 0.3.json index f6e198e0f3..65394ae8f2 100644 --- a/resources/profiles/Creality/process/0.16mm Optimal @Creality Ender5Pro (2019) (0.3 nozzle).json +++ b/resources/profiles/Creality/process/0.16mm Optimal @Creality Ender5Pro (2019) 0.3.json @@ -1,7 +1,7 @@ { "type": "process", "setting_id": "GP004", - "name": "0.16mm Optimal @Creality Ender5Pro (2019) (0.3 nozzle)", + "name": "0.16mm Optimal @Creality Ender5Pro (2019) 0.3", "from": "system", "instantiation": "true", "inherits": "fdm_process_creality_common_0_3", diff --git a/resources/profiles/Creality/process/0.16mm Optimal @Creality Ender5Pro (2019) (0.5 nozzle).json b/resources/profiles/Creality/process/0.16mm Optimal @Creality Ender5Pro (2019) 0.5.json similarity index 79% rename from resources/profiles/Creality/process/0.16mm Optimal @Creality Ender5Pro (2019) (0.5 nozzle).json rename to resources/profiles/Creality/process/0.16mm Optimal @Creality Ender5Pro (2019) 0.5.json index dc5cab3e6e..b665f9501d 100644 --- a/resources/profiles/Creality/process/0.16mm Optimal @Creality Ender5Pro (2019) (0.5 nozzle).json +++ b/resources/profiles/Creality/process/0.16mm Optimal @Creality Ender5Pro (2019) 0.5.json @@ -1,7 +1,7 @@ { "type": "process", "setting_id": "GP004", - "name": "0.16mm Optimal @Creality Ender5Pro (2019) (0.5 nozzle)", + "name": "0.16mm Optimal @Creality Ender5Pro (2019) 0.5", "from": "system", "instantiation": "true", "inherits": "fdm_process_creality_common_0_5", diff --git a/resources/profiles/Creality/process/0.16mm Optimal @Creality Ender5Pro (2019) (0.6 nozzle).json b/resources/profiles/Creality/process/0.16mm Optimal @Creality Ender5Pro (2019) 0.6.json similarity index 79% rename from resources/profiles/Creality/process/0.16mm Optimal @Creality Ender5Pro (2019) (0.6 nozzle).json rename to resources/profiles/Creality/process/0.16mm Optimal @Creality Ender5Pro (2019) 0.6.json index 4ecfa311b6..6df973930b 100644 --- a/resources/profiles/Creality/process/0.16mm Optimal @Creality Ender5Pro (2019) (0.6 nozzle).json +++ b/resources/profiles/Creality/process/0.16mm Optimal @Creality Ender5Pro (2019) 0.6.json @@ -1,7 +1,7 @@ { "type": "process", "setting_id": "GP004", - "name": "0.16mm Optimal @Creality Ender5Pro (2019) (0.6 nozzle)", + "name": "0.16mm Optimal @Creality Ender5Pro (2019) 0.6", "from": "system", "instantiation": "true", "inherits": "fdm_process_creality_common_0_6", diff --git a/resources/profiles/Creality/process/0.16mm Optimal @Creality K1 (0.4 nozzle).json b/resources/profiles/Creality/process/0.16mm Optimal @Creality K1 (0.4 nozzle).json index 163f47fdc8..314956dcf7 100644 --- a/resources/profiles/Creality/process/0.16mm Optimal @Creality K1 (0.4 nozzle).json +++ b/resources/profiles/Creality/process/0.16mm Optimal @Creality K1 (0.4 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.16mm Optimal @Creality K1 (0.4 nozzle)", "from": "system", - "inherits": "fdm_process_creality_common", + "inherits": "fdm_process_common_klipper", "instantiation": "true", "adaptive_layer_height": "0", "reduce_crossing_wall": "0", @@ -12,7 +12,8 @@ "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "1", - "bridge_speed": "50", + "bridge_speed": "25", + "internal_bridge_speed" : "70", "brim_width": "5", "brim_object_gap": "0.1", "compatible_printers": [ @@ -35,7 +36,7 @@ "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", "internal_bridge_support_thickness": "0.8", - "initial_layer_acceleration": "2000", + "initial_layer_acceleration": "500", "initial_layer_line_width": "0.5", "initial_layer_print_height": "0.16", "initial_layer_speed": "50", diff --git a/resources/profiles/Creality/process/0.16mm Optimal @Creality K1Max (0.4 nozzle).json b/resources/profiles/Creality/process/0.16mm Optimal @Creality K1Max (0.4 nozzle).json index 3001612377..fe78e7794a 100644 --- a/resources/profiles/Creality/process/0.16mm Optimal @Creality K1Max (0.4 nozzle).json +++ b/resources/profiles/Creality/process/0.16mm Optimal @Creality K1Max (0.4 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.16mm Optimal @Creality K1Max (0.4 nozzle)", "from": "system", - "inherits": "fdm_process_creality_common", + "inherits": "fdm_process_common_klipper", "instantiation": "true", "adaptive_layer_height": "0", "reduce_crossing_wall": "0", @@ -12,13 +12,13 @@ "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "1", - "bridge_speed": "50", + "bridge_speed": "25", + "internal_bridge_speed" : "70", "brim_width": "5", "brim_object_gap": "0.1", - "compatible_printers": [], "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "10000", + "default_acceleration": "12000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.15", @@ -98,10 +98,11 @@ "detect_thin_wall": "0", "top_surface_pattern": "monotonicline", "top_surface_line_width": "0.42", - "top_surface_acceleration": "2000", + "top_surface_acceleration": "5000", "top_surface_speed": "200", "top_shell_layers": "3", "top_shell_thickness": "0.6", + "travel_acceleration": "12000", "travel_speed": "500", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", @@ -112,4 +113,4 @@ "compatible_printers": [ "Creality K1 Max (0.4 nozzle)" ] -} \ No newline at end of file +} diff --git a/resources/profiles/Creality/process/0.20mm Standard @Creality Ender5Pro (2019) (0.25 nozzle).json b/resources/profiles/Creality/process/0.20mm Standard @Creality Ender5Pro (2019) 0.25.json similarity index 77% rename from resources/profiles/Creality/process/0.20mm Standard @Creality Ender5Pro (2019) (0.25 nozzle).json rename to resources/profiles/Creality/process/0.20mm Standard @Creality Ender5Pro (2019) 0.25.json index 115ebb0b48..d36e7a4331 100644 --- a/resources/profiles/Creality/process/0.20mm Standard @Creality Ender5Pro (2019) (0.25 nozzle).json +++ b/resources/profiles/Creality/process/0.20mm Standard @Creality Ender5Pro (2019) 0.25.json @@ -1,7 +1,7 @@ { "type": "process", "setting_id": "GP004", - "name": "0.20mm Standard @Creality Ender5Pro (2019) (0.25 nozzle)", + "name": "0.20mm Standard @Creality Ender5Pro (2019) 0.25", "from": "system", "instantiation": "true", "inherits": "fdm_process_creality_common_0_25", diff --git a/resources/profiles/Creality/process/0.20mm Standard @Creality Ender5Pro (2019) (0.3 nozzle).json b/resources/profiles/Creality/process/0.20mm Standard @Creality Ender5Pro (2019) 0.3.json similarity index 77% rename from resources/profiles/Creality/process/0.20mm Standard @Creality Ender5Pro (2019) (0.3 nozzle).json rename to resources/profiles/Creality/process/0.20mm Standard @Creality Ender5Pro (2019) 0.3.json index da2b648875..f00ede6871 100644 --- a/resources/profiles/Creality/process/0.20mm Standard @Creality Ender5Pro (2019) (0.3 nozzle).json +++ b/resources/profiles/Creality/process/0.20mm Standard @Creality Ender5Pro (2019) 0.3.json @@ -1,7 +1,7 @@ { "type": "process", "setting_id": "GP004", - "name": "0.20mm Standard @Creality Ender5Pro (2019) (0.3 nozzle)", + "name": "0.20mm Standard @Creality Ender5Pro (2019) 0.3", "from": "system", "instantiation": "true", "inherits": "fdm_process_creality_common_0_3", diff --git a/resources/profiles/Creality/process/0.20mm Standard @Creality Ender5Pro (2019) (0.5 nozzle).json b/resources/profiles/Creality/process/0.20mm Standard @Creality Ender5Pro (2019) 0.5.json similarity index 77% rename from resources/profiles/Creality/process/0.20mm Standard @Creality Ender5Pro (2019) (0.5 nozzle).json rename to resources/profiles/Creality/process/0.20mm Standard @Creality Ender5Pro (2019) 0.5.json index dae5dac6f2..6712100d90 100644 --- a/resources/profiles/Creality/process/0.20mm Standard @Creality Ender5Pro (2019) (0.5 nozzle).json +++ b/resources/profiles/Creality/process/0.20mm Standard @Creality Ender5Pro (2019) 0.5.json @@ -1,7 +1,7 @@ { "type": "process", "setting_id": "GP004", - "name": "0.20mm Standard @Creality Ender5Pro (2019) (0.5 nozzle)", + "name": "0.20mm Standard @Creality Ender5Pro (2019) 0.5", "from": "system", "instantiation": "true", "inherits": "fdm_process_creality_common_0_5", diff --git a/resources/profiles/Creality/process/0.20mm Standard @Creality Ender5Pro (2019) (0.6 nozzle).json b/resources/profiles/Creality/process/0.20mm Standard @Creality Ender5Pro (2019) 0.6.json similarity index 77% rename from resources/profiles/Creality/process/0.20mm Standard @Creality Ender5Pro (2019) (0.6 nozzle).json rename to resources/profiles/Creality/process/0.20mm Standard @Creality Ender5Pro (2019) 0.6.json index 0dc39d710a..035121965c 100644 --- a/resources/profiles/Creality/process/0.20mm Standard @Creality Ender5Pro (2019) (0.6 nozzle).json +++ b/resources/profiles/Creality/process/0.20mm Standard @Creality Ender5Pro (2019) 0.6.json @@ -1,7 +1,7 @@ { "type": "process", "setting_id": "GP004", - "name": "0.20mm Standard @Creality Ender5Pro (2019) (0.6 nozzle)", + "name": "0.20mm Standard @Creality Ender5Pro (2019) 0.6", "from": "system", "instantiation": "true", "inherits": "fdm_process_creality_common_0_6", diff --git a/resources/profiles/Creality/process/0.20mm Standard @Creality Ender5Pro (2019) (0.8 nozzle).json b/resources/profiles/Creality/process/0.20mm Standard @Creality Ender5Pro (2019) 0.8.json similarity index 77% rename from resources/profiles/Creality/process/0.20mm Standard @Creality Ender5Pro (2019) (0.8 nozzle).json rename to resources/profiles/Creality/process/0.20mm Standard @Creality Ender5Pro (2019) 0.8.json index 424ce00241..ba94de8705 100644 --- a/resources/profiles/Creality/process/0.20mm Standard @Creality Ender5Pro (2019) (0.8 nozzle).json +++ b/resources/profiles/Creality/process/0.20mm Standard @Creality Ender5Pro (2019) 0.8.json @@ -1,7 +1,7 @@ { "type": "process", "setting_id": "GP004", - "name": "0.20mm Standard @Creality Ender5Pro (2019) (0.8 nozzle)", + "name": "0.20mm Standard @Creality Ender5Pro (2019) 0.8", "from": "system", "instantiation": "true", "inherits": "fdm_process_creality_common_0_8", diff --git a/resources/profiles/Creality/process/0.20mm Standard @Creality Ender5Pro (2019) (0.4 nozzle).json b/resources/profiles/Creality/process/0.20mm Standard @Creality Ender5Pro (2019).json similarity index 96% rename from resources/profiles/Creality/process/0.20mm Standard @Creality Ender5Pro (2019) (0.4 nozzle).json rename to resources/profiles/Creality/process/0.20mm Standard @Creality Ender5Pro (2019).json index 0f363058f0..04b6b36d34 100644 --- a/resources/profiles/Creality/process/0.20mm Standard @Creality Ender5Pro (2019) (0.4 nozzle).json +++ b/resources/profiles/Creality/process/0.20mm Standard @Creality Ender5Pro (2019).json @@ -1,7 +1,7 @@ { "type": "process", "setting_id": "GP004", - "name": "0.20mm Standard @Creality Ender5Pro (2019) (0.4 nozzle)", + "name": "0.20mm Standard @Creality Ender5Pro (2019)", "from": "system", "inherits": "fdm_process_creality_common", "instantiation": "true", @@ -103,6 +103,6 @@ "xy_hole_compensation": "0", "xy_contour_compensation": "0", "compatible_printers": [ - "Creality Ender-5 Pro (2019) (0.4 nozzle)" + "Creality Ender-5 Pro (2019) 0.4 nozzle" ] } diff --git a/resources/profiles/Creality/process/0.20mm Standard @Creality K1 (0.4 nozzle).json b/resources/profiles/Creality/process/0.20mm Standard @Creality K1 (0.4 nozzle).json index 1e115ba9e4..926b6ce557 100644 --- a/resources/profiles/Creality/process/0.20mm Standard @Creality K1 (0.4 nozzle).json +++ b/resources/profiles/Creality/process/0.20mm Standard @Creality K1 (0.4 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.20mm Standard @Creality K1 (0.4 nozzle)", "from": "system", - "inherits": "fdm_process_creality_common", + "inherits": "fdm_process_common_klipper", "instantiation": "true", "adaptive_layer_height": "0", "reduce_crossing_wall": "0", @@ -12,7 +12,8 @@ "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "1", - "bridge_speed": "50", + "bridge_speed": "25", + "internal_bridge_speed" : "70", "brim_width": "5", "brim_object_gap": "0.1", "compatible_printers": [ @@ -35,7 +36,7 @@ "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", "internal_bridge_support_thickness": "0.8", - "initial_layer_acceleration": "2000", + "initial_layer_acceleration": "500", "initial_layer_line_width": "0.5", "initial_layer_print_height": "0.2", "initial_layer_speed": "50", diff --git a/resources/profiles/Creality/process/0.20mm Standard @Creality K1Max (0.4 nozzle).json b/resources/profiles/Creality/process/0.20mm Standard @Creality K1Max (0.4 nozzle).json index 725adc69ac..585d04314d 100644 --- a/resources/profiles/Creality/process/0.20mm Standard @Creality K1Max (0.4 nozzle).json +++ b/resources/profiles/Creality/process/0.20mm Standard @Creality K1Max (0.4 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.20mm Standard @Creality K1Max (0.4 nozzle)", "from": "system", - "inherits": "fdm_process_creality_common", + "inherits": "fdm_process_common_klipper", "instantiation": "true", "adaptive_layer_height": "0", "reduce_crossing_wall": "0", @@ -12,13 +12,13 @@ "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "1", - "bridge_speed": "50", + "bridge_speed": "25", + "internal_bridge_speed" : "70", "brim_width": "5", "brim_object_gap": "0.1", - "compatible_printers": [], "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "10000", + "default_acceleration": "12000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.15", @@ -98,10 +98,11 @@ "detect_thin_wall": "0", "top_surface_pattern": "monotonicline", "top_surface_line_width": "0.42", - "top_surface_acceleration": "2000", + "top_surface_acceleration": "5000", "top_surface_speed": "200", "top_shell_layers": "3", "top_shell_thickness": "0.6", + "travel_acceleration": "12000", "travel_speed": "500", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", @@ -112,4 +113,4 @@ "compatible_printers": [ "Creality K1 Max (0.4 nozzle)" ] -} \ No newline at end of file +} diff --git a/resources/profiles/Creality/process/0.24mm Draft @Creality Ender5Pro (2019) (0.3 nozzle).json b/resources/profiles/Creality/process/0.24mm Draft @Creality Ender5Pro (2019) 0.3.json similarity index 78% rename from resources/profiles/Creality/process/0.24mm Draft @Creality Ender5Pro (2019) (0.3 nozzle).json rename to resources/profiles/Creality/process/0.24mm Draft @Creality Ender5Pro (2019) 0.3.json index a6598bd7ac..29fcdd9f88 100644 --- a/resources/profiles/Creality/process/0.24mm Draft @Creality Ender5Pro (2019) (0.3 nozzle).json +++ b/resources/profiles/Creality/process/0.24mm Draft @Creality Ender5Pro (2019) 0.3.json @@ -1,7 +1,7 @@ { "type": "process", "setting_id": "GP004", - "name": "0.24mm Draft @Creality Ender5Pro (2019) (0.3 nozzle)", + "name": "0.24mm Draft @Creality Ender5Pro (2019) 0.3", "from": "system", "instantiation": "true", "inherits": "fdm_process_creality_common_0_3", diff --git a/resources/profiles/Creality/process/0.24mm Draft @Creality Ender5Pro (2019) (0.5 nozzle).json b/resources/profiles/Creality/process/0.24mm Draft @Creality Ender5Pro (2019) 0.5.json similarity index 78% rename from resources/profiles/Creality/process/0.24mm Draft @Creality Ender5Pro (2019) (0.5 nozzle).json rename to resources/profiles/Creality/process/0.24mm Draft @Creality Ender5Pro (2019) 0.5.json index 4b69460109..3f1dfc5b3d 100644 --- a/resources/profiles/Creality/process/0.24mm Draft @Creality Ender5Pro (2019) (0.5 nozzle).json +++ b/resources/profiles/Creality/process/0.24mm Draft @Creality Ender5Pro (2019) 0.5.json @@ -1,7 +1,7 @@ { "type": "process", "setting_id": "GP004", - "name": "0.24mm Draft @Creality Ender5Pro (2019) (0.5 nozzle)", + "name": "0.24mm Draft @Creality Ender5Pro (2019) 0.5", "from": "system", "instantiation": "true", "inherits": "fdm_process_creality_common_0_5", diff --git a/resources/profiles/Creality/process/0.24mm Draft @Creality Ender5Pro (2019) (0.6 nozzle).json b/resources/profiles/Creality/process/0.24mm Draft @Creality Ender5Pro (2019) 0.6.json similarity index 78% rename from resources/profiles/Creality/process/0.24mm Draft @Creality Ender5Pro (2019) (0.6 nozzle).json rename to resources/profiles/Creality/process/0.24mm Draft @Creality Ender5Pro (2019) 0.6.json index 5fb0dc077c..3b9a2fc90e 100644 --- a/resources/profiles/Creality/process/0.24mm Draft @Creality Ender5Pro (2019) (0.6 nozzle).json +++ b/resources/profiles/Creality/process/0.24mm Draft @Creality Ender5Pro (2019) 0.6.json @@ -1,7 +1,7 @@ { "type": "process", "setting_id": "GP004", - "name": "0.24mm Draft @Creality Ender5Pro (2019) (0.6 nozzle)", + "name": "0.24mm Draft @Creality Ender5Pro (2019) 0.6", "from": "system", "instantiation": "true", "inherits": "fdm_process_creality_common_0_6", diff --git a/resources/profiles/Creality/process/0.24mm Draft @Creality Ender5Pro (2019) (0.8 nozzle).json b/resources/profiles/Creality/process/0.24mm Draft @Creality Ender5Pro (2019) 0.8.json similarity index 78% rename from resources/profiles/Creality/process/0.24mm Draft @Creality Ender5Pro (2019) (0.8 nozzle).json rename to resources/profiles/Creality/process/0.24mm Draft @Creality Ender5Pro (2019) 0.8.json index d72b9bb75f..eddca346b2 100644 --- a/resources/profiles/Creality/process/0.24mm Draft @Creality Ender5Pro (2019) (0.8 nozzle).json +++ b/resources/profiles/Creality/process/0.24mm Draft @Creality Ender5Pro (2019) 0.8.json @@ -1,7 +1,7 @@ { "type": "process", "setting_id": "GP004", - "name": "0.24mm Draft @Creality Ender5Pro (2019) (0.8 nozzle)", + "name": "0.24mm Draft @Creality Ender5Pro (2019) 0.8", "from": "system", "instantiation": "true", "inherits": "fdm_process_creality_common_0_8", diff --git a/resources/profiles/Creality/process/0.24mm Draft @Creality Ender5Pro (2019) (0.4 nozzle).json b/resources/profiles/Creality/process/0.24mm Draft @Creality Ender5Pro (2019).json similarity index 96% rename from resources/profiles/Creality/process/0.24mm Draft @Creality Ender5Pro (2019) (0.4 nozzle).json rename to resources/profiles/Creality/process/0.24mm Draft @Creality Ender5Pro (2019).json index 0eaf237d7c..d6df736aba 100644 --- a/resources/profiles/Creality/process/0.24mm Draft @Creality Ender5Pro (2019) (0.4 nozzle).json +++ b/resources/profiles/Creality/process/0.24mm Draft @Creality Ender5Pro (2019).json @@ -1,7 +1,7 @@ { "type": "process", "setting_id": "GP004", - "name": "0.24mm Draft @Creality Ender5Pro (2019) (0.4 nozzle)", + "name": "0.24mm Draft @Creality Ender5Pro (2019)", "from": "system", "inherits": "fdm_process_creality_common", "instantiation": "true", @@ -103,6 +103,6 @@ "xy_hole_compensation": "0", "xy_contour_compensation": "0", "compatible_printers": [ - "Creality Ender-5 Pro (2019) (0.4 nozzle)" + "Creality Ender-5 Pro (2019) 0.4 nozzle" ] } diff --git a/resources/profiles/Creality/process/0.24mm Draft @Creality K1 (0.4 nozzle).json b/resources/profiles/Creality/process/0.24mm Draft @Creality K1 (0.4 nozzle).json index ad233c1310..93c64ecd3d 100644 --- a/resources/profiles/Creality/process/0.24mm Draft @Creality K1 (0.4 nozzle).json +++ b/resources/profiles/Creality/process/0.24mm Draft @Creality K1 (0.4 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.24mm Draft @Creality K1 (0.4 nozzle)", "from": "system", - "inherits": "fdm_process_creality_common", + "inherits": "fdm_process_common_klipper", "instantiation": "true", "adaptive_layer_height": "0", "reduce_crossing_wall": "0", @@ -12,7 +12,8 @@ "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "1", - "bridge_speed": "50", + "bridge_speed": "25", + "internal_bridge_speed" : "70", "brim_width": "5", "brim_object_gap": "0.1", "compatible_printers": [ @@ -35,7 +36,7 @@ "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", "internal_bridge_support_thickness": "0.8", - "initial_layer_acceleration": "2000", + "initial_layer_acceleration": "500", "initial_layer_line_width": "0.5", "initial_layer_print_height": "0.2", "initial_layer_speed": "50", diff --git a/resources/profiles/Creality/process/0.24mm Draft @Creality K1Max (0.4 nozzle).json b/resources/profiles/Creality/process/0.24mm Draft @Creality K1Max (0.4 nozzle).json index 7ea7a1846a..bb55483334 100644 --- a/resources/profiles/Creality/process/0.24mm Draft @Creality K1Max (0.4 nozzle).json +++ b/resources/profiles/Creality/process/0.24mm Draft @Creality K1Max (0.4 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.24mm Draft @Creality K1Max (0.4 nozzle)", "from": "system", - "inherits": "fdm_process_creality_common", + "inherits": "fdm_process_common_klipper", "instantiation": "true", "adaptive_layer_height": "0", "reduce_crossing_wall": "0", @@ -12,13 +12,13 @@ "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "1", - "bridge_speed": "50", + "bridge_speed": "25", + "internal_bridge_speed" : "70", "brim_width": "5", "brim_object_gap": "0.1", - "compatible_printers": [], "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "10000", + "default_acceleration": "12000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.15", @@ -98,10 +98,11 @@ "detect_thin_wall": "0", "top_surface_pattern": "monotonicline", "top_surface_line_width": "0.42", - "top_surface_acceleration": "2000", + "top_surface_acceleration": "5000", "top_surface_speed": "200", "top_shell_layers": "3", "top_shell_thickness": "0.6", + "travel_acceleration": "12000", "travel_speed": "500", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", @@ -112,4 +113,4 @@ "compatible_printers": [ "Creality K1 Max (0.4 nozzle)" ] -} \ No newline at end of file +} diff --git a/resources/profiles/Creality/process/0.24mm Optimal @Creality K1 (0.6 nozzle).json b/resources/profiles/Creality/process/0.24mm Optimal @Creality K1 (0.6 nozzle).json index 558d2786d6..021ffef875 100644 --- a/resources/profiles/Creality/process/0.24mm Optimal @Creality K1 (0.6 nozzle).json +++ b/resources/profiles/Creality/process/0.24mm Optimal @Creality K1 (0.6 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.24mm Optimal @Creality K1 (0.6 nozzle)", "from": "system", - "inherits": "fdm_process_creality_common", + "inherits": "fdm_process_common_klipper", "instantiation": "true", "adaptive_layer_height": "0", "reduce_crossing_wall": "0", @@ -15,10 +15,9 @@ "bridge_speed": "30", "brim_width": "5", "brim_object_gap": "0.1", - "compatible_printers": [], "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "10000", + "default_acceleration": "12000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.15", @@ -98,10 +97,11 @@ "detect_thin_wall": "0", "top_surface_pattern": "monotonicline", "top_surface_line_width": "0.62", - "top_surface_acceleration": "2000", + "top_surface_acceleration": "5000", "top_surface_speed": "150", "top_shell_layers": "3", "top_shell_thickness": "0.6", + "travel_acceleration": "12000", "travel_speed": "500", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", @@ -112,4 +112,4 @@ "compatible_printers": [ "Creality K1 (0.6 nozzle)" ] -} \ No newline at end of file +} diff --git a/resources/profiles/Creality/process/0.24mm Optimal @Creality K1Max (0.6 nozzle).json b/resources/profiles/Creality/process/0.24mm Optimal @Creality K1Max (0.6 nozzle).json index 5bc47cd737..659e4b9783 100644 --- a/resources/profiles/Creality/process/0.24mm Optimal @Creality K1Max (0.6 nozzle).json +++ b/resources/profiles/Creality/process/0.24mm Optimal @Creality K1Max (0.6 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.24mm Optimal @Creality K1Max (0.6 nozzle)", "from": "system", - "inherits": "fdm_process_creality_common", + "inherits": "fdm_process_common_klipper", "instantiation": "true", "adaptive_layer_height": "0", "reduce_crossing_wall": "0", @@ -15,10 +15,9 @@ "bridge_speed": "30", "brim_width": "5", "brim_object_gap": "0.1", - "compatible_printers": [], "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "10000", + "default_acceleration": "12000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.15", @@ -98,10 +97,11 @@ "detect_thin_wall": "0", "top_surface_pattern": "monotonicline", "top_surface_line_width": "0.62", - "top_surface_acceleration": "2000", + "top_surface_acceleration": "5000", "top_surface_speed": "150", "top_shell_layers": "3", "top_shell_thickness": "0.6", + "travel_acceleration": "12000", "travel_speed": "500", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", @@ -112,4 +112,4 @@ "compatible_printers": [ "Creality K1 Max (0.6 nozzle)" ] -} \ No newline at end of file +} diff --git a/resources/profiles/Creality/process/0.28mm SuperDraft @Creality Ender5Pro (2019) (0.5 nozzle).json b/resources/profiles/Creality/process/0.28mm SuperDraft @Creality Ender5Pro (2019) 0.5.json similarity index 76% rename from resources/profiles/Creality/process/0.28mm SuperDraft @Creality Ender5Pro (2019) (0.5 nozzle).json rename to resources/profiles/Creality/process/0.28mm SuperDraft @Creality Ender5Pro (2019) 0.5.json index 1bcc1b9375..76c4c5ede5 100644 --- a/resources/profiles/Creality/process/0.28mm SuperDraft @Creality Ender5Pro (2019) (0.5 nozzle).json +++ b/resources/profiles/Creality/process/0.28mm SuperDraft @Creality Ender5Pro (2019) 0.5.json @@ -1,7 +1,7 @@ { "type": "process", "setting_id": "GP004", - "name": "0.28mm SuperDraft @Creality Ender5Pro (2019) (0.5 nozzle)", + "name": "0.28mm SuperDraft @Creality Ender5Pro (2019) 0.5", "from": "system", "instantiation": "true", "inherits": "fdm_process_creality_common_0_5", diff --git a/resources/profiles/Creality/process/0.28mm SuperDraft @Creality Ender5Pro (2019) (0.6 nozzle).json b/resources/profiles/Creality/process/0.28mm SuperDraft @Creality Ender5Pro (2019) 0.6.json similarity index 76% rename from resources/profiles/Creality/process/0.28mm SuperDraft @Creality Ender5Pro (2019) (0.6 nozzle).json rename to resources/profiles/Creality/process/0.28mm SuperDraft @Creality Ender5Pro (2019) 0.6.json index c2ffcd3a17..837d684e25 100644 --- a/resources/profiles/Creality/process/0.28mm SuperDraft @Creality Ender5Pro (2019) (0.6 nozzle).json +++ b/resources/profiles/Creality/process/0.28mm SuperDraft @Creality Ender5Pro (2019) 0.6.json @@ -1,7 +1,7 @@ { "type": "process", "setting_id": "GP004", - "name": "0.28mm SuperDraft @Creality Ender5Pro (2019) (0.6 nozzle)", + "name": "0.28mm SuperDraft @Creality Ender5Pro (2019) 0.6", "from": "system", "instantiation": "true", "inherits": "fdm_process_creality_common_0_6", diff --git a/resources/profiles/Creality/process/0.28mm SuperDraft @Creality Ender5Pro (2019) (0.8 nozzle).json b/resources/profiles/Creality/process/0.28mm SuperDraft @Creality Ender5Pro (2019) 0.8.json similarity index 76% rename from resources/profiles/Creality/process/0.28mm SuperDraft @Creality Ender5Pro (2019) (0.8 nozzle).json rename to resources/profiles/Creality/process/0.28mm SuperDraft @Creality Ender5Pro (2019) 0.8.json index be0f9dafa0..9ffd6dbb28 100644 --- a/resources/profiles/Creality/process/0.28mm SuperDraft @Creality Ender5Pro (2019) (0.8 nozzle).json +++ b/resources/profiles/Creality/process/0.28mm SuperDraft @Creality Ender5Pro (2019) 0.8.json @@ -1,7 +1,7 @@ { "type": "process", "setting_id": "GP004", - "name": "0.28mm SuperDraft @Creality Ender5Pro (2019) (0.8 nozzle)", + "name": "0.28mm SuperDraft @Creality Ender5Pro (2019) 0.8", "from": "system", "instantiation": "true", "inherits": "fdm_process_creality_common_0_8", diff --git a/resources/profiles/Creality/process/0.28mm SuperDraft @Creality Ender5Pro (2019) (1.0 nozzle).json b/resources/profiles/Creality/process/0.28mm SuperDraft @Creality Ender5Pro (2019) 1.0.json similarity index 76% rename from resources/profiles/Creality/process/0.28mm SuperDraft @Creality Ender5Pro (2019) (1.0 nozzle).json rename to resources/profiles/Creality/process/0.28mm SuperDraft @Creality Ender5Pro (2019) 1.0.json index 2dfc5ae38b..a2d6093bbd 100644 --- a/resources/profiles/Creality/process/0.28mm SuperDraft @Creality Ender5Pro (2019) (1.0 nozzle).json +++ b/resources/profiles/Creality/process/0.28mm SuperDraft @Creality Ender5Pro (2019) 1.0.json @@ -1,7 +1,7 @@ { "type": "process", "setting_id": "GP004", - "name": "0.28mm SuperDraft @Creality Ender5Pro (2019) (1.0 nozzle)", + "name": "0.28mm SuperDraft @Creality Ender5Pro (2019) 1.0", "from": "system", "instantiation": "true", "inherits": "fdm_process_creality_common_1_0", diff --git a/resources/profiles/Creality/process/0.30mm Standard @Creality K1 (0.6 nozzle).json b/resources/profiles/Creality/process/0.30mm Standard @Creality K1 (0.6 nozzle).json index fb8ab24e95..904ff17ebd 100644 --- a/resources/profiles/Creality/process/0.30mm Standard @Creality K1 (0.6 nozzle).json +++ b/resources/profiles/Creality/process/0.30mm Standard @Creality K1 (0.6 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.30mm Standard @Creality K1 (0.6 nozzle)", "from": "system", - "inherits": "fdm_process_creality_common", + "inherits": "fdm_process_common_klipper", "instantiation": "true", "adaptive_layer_height": "0", "reduce_crossing_wall": "0", @@ -15,10 +15,9 @@ "bridge_speed": "30", "brim_width": "5", "brim_object_gap": "0.1", - "compatible_printers": [], "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "10000", + "default_acceleration": "12000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.15", @@ -98,10 +97,11 @@ "detect_thin_wall": "0", "top_surface_pattern": "monotonicline", "top_surface_line_width": "0.62", - "top_surface_acceleration": "2000", + "top_surface_acceleration": "5000", "top_surface_speed": "150", "top_shell_layers": "3", "top_shell_thickness": "0.6", + "travel_acceleration": "12000", "travel_speed": "500", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", @@ -112,4 +112,4 @@ "compatible_printers": [ "Creality K1 (0.6 nozzle)" ] -} \ No newline at end of file +} diff --git a/resources/profiles/Creality/process/0.30mm Standard @Creality K1Max (0.6 nozzle).json b/resources/profiles/Creality/process/0.30mm Standard @Creality K1Max (0.6 nozzle).json index e19704fc2a..8cd8ff9a2e 100644 --- a/resources/profiles/Creality/process/0.30mm Standard @Creality K1Max (0.6 nozzle).json +++ b/resources/profiles/Creality/process/0.30mm Standard @Creality K1Max (0.6 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.30mm Standard @Creality K1Max (0.6 nozzle)", "from": "system", - "inherits": "fdm_process_creality_common", + "inherits": "fdm_process_common_klipper", "instantiation": "true", "adaptive_layer_height": "0", "reduce_crossing_wall": "0", @@ -15,10 +15,9 @@ "bridge_speed": "30", "brim_width": "5", "brim_object_gap": "0.1", - "compatible_printers": [], "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "10000", + "default_acceleration": "12000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.15", @@ -98,10 +97,11 @@ "detect_thin_wall": "0", "top_surface_pattern": "monotonicline", "top_surface_line_width": "0.62", - "top_surface_acceleration": "2000", + "top_surface_acceleration": "5000", "top_surface_speed": "150", "top_shell_layers": "3", "top_shell_thickness": "0.6", + "travel_acceleration": "12000", "travel_speed": "500", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", @@ -112,4 +112,4 @@ "compatible_printers": [ "Creality K1 Max (0.6 nozzle)" ] -} \ No newline at end of file +} diff --git a/resources/profiles/Creality/process/0.32mm Optimal @Creality K1 (0.8 nozzle).json b/resources/profiles/Creality/process/0.32mm Optimal @Creality K1 (0.8 nozzle).json index 7e562392d5..c9bc775be1 100644 --- a/resources/profiles/Creality/process/0.32mm Optimal @Creality K1 (0.8 nozzle).json +++ b/resources/profiles/Creality/process/0.32mm Optimal @Creality K1 (0.8 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.32mm Optimal @Creality K1 (0.8 nozzle)", "from": "system", - "inherits": "fdm_process_creality_common", + "inherits": "fdm_process_common_klipper", "instantiation": "true", "adaptive_layer_height": "0", "reduce_crossing_wall": "0", @@ -15,10 +15,9 @@ "bridge_speed": "30", "brim_width": "5", "brim_object_gap": "0.1", - "compatible_printers": [], "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "10000", + "default_acceleration": "12000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.15", @@ -98,10 +97,11 @@ "detect_thin_wall": "0", "top_surface_pattern": "monotonicline", "top_surface_line_width": "0.82", - "top_surface_acceleration": "2000", + "top_surface_acceleration": "5000", "top_surface_speed": "150", "top_shell_layers": "3", "top_shell_thickness": "0.6", + "travel_acceleration": "12000", "travel_speed": "500", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", @@ -112,4 +112,4 @@ "compatible_printers": [ "Creality K1 (0.8 nozzle)" ] -} \ No newline at end of file +} diff --git a/resources/profiles/Creality/process/0.32mm Optimal @Creality K1Max (0.8 nozzle).json b/resources/profiles/Creality/process/0.32mm Optimal @Creality K1Max (0.8 nozzle).json index b449ebc101..548aac9fab 100644 --- a/resources/profiles/Creality/process/0.32mm Optimal @Creality K1Max (0.8 nozzle).json +++ b/resources/profiles/Creality/process/0.32mm Optimal @Creality K1Max (0.8 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.32mm Optimal @Creality K1Max (0.8 nozzle)", "from": "system", - "inherits": "fdm_process_creality_common", + "inherits": "fdm_process_common_klipper", "instantiation": "true", "adaptive_layer_height": "0", "reduce_crossing_wall": "0", @@ -15,10 +15,9 @@ "bridge_speed": "30", "brim_width": "5", "brim_object_gap": "0.1", - "compatible_printers": [], "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "10000", + "default_acceleration": "12000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.15", @@ -98,10 +97,11 @@ "detect_thin_wall": "0", "top_surface_pattern": "monotonicline", "top_surface_line_width": "0.82", - "top_surface_acceleration": "2000", + "top_surface_acceleration": "5000", "top_surface_speed": "150", "top_shell_layers": "3", "top_shell_thickness": "0.6", + "travel_acceleration": "12000", "travel_speed": "500", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", @@ -112,4 +112,4 @@ "compatible_printers": [ "Creality K1 Max (0.8 nozzle)" ] -} \ No newline at end of file +} diff --git a/resources/profiles/Creality/process/0.36mm Chunky @Creality Ender5Pro (2019) (0.5 nozzle).json b/resources/profiles/Creality/process/0.36mm Chunky @Creality Ender5Pro (2019) 0.5.json similarity index 77% rename from resources/profiles/Creality/process/0.36mm Chunky @Creality Ender5Pro (2019) (0.5 nozzle).json rename to resources/profiles/Creality/process/0.36mm Chunky @Creality Ender5Pro (2019) 0.5.json index 6f9756b36e..3e73410f03 100644 --- a/resources/profiles/Creality/process/0.36mm Chunky @Creality Ender5Pro (2019) (0.5 nozzle).json +++ b/resources/profiles/Creality/process/0.36mm Chunky @Creality Ender5Pro (2019) 0.5.json @@ -1,7 +1,7 @@ { "type": "process", "setting_id": "GP004", - "name": "0.36mm Chunky @Creality Ender5Pro (2019) (0.5 nozzle)", + "name": "0.36mm Chunky @Creality Ender5Pro (2019) 0.5", "from": "system", "instantiation": "true", "inherits": "fdm_process_creality_common_0_5", diff --git a/resources/profiles/Creality/process/0.36mm Chunky @Creality Ender5Pro (2019) (0.6 nozzle).json b/resources/profiles/Creality/process/0.36mm Chunky @Creality Ender5Pro (2019) 0.6.json similarity index 77% rename from resources/profiles/Creality/process/0.36mm Chunky @Creality Ender5Pro (2019) (0.6 nozzle).json rename to resources/profiles/Creality/process/0.36mm Chunky @Creality Ender5Pro (2019) 0.6.json index 9e556a7c53..7c81913a78 100644 --- a/resources/profiles/Creality/process/0.36mm Chunky @Creality Ender5Pro (2019) (0.6 nozzle).json +++ b/resources/profiles/Creality/process/0.36mm Chunky @Creality Ender5Pro (2019) 0.6.json @@ -1,7 +1,7 @@ { "type": "process", "setting_id": "GP004", - "name": "0.36mm Chunky @Creality Ender5Pro (2019) (0.6 nozzle)", + "name": "0.36mm Chunky @Creality Ender5Pro (2019) 0.6", "from": "system", "instantiation": "true", "inherits": "fdm_process_creality_common_0_6", diff --git a/resources/profiles/Creality/process/0.36mm Chunky @Creality Ender5Pro (2019) (0.8 nozzle).json b/resources/profiles/Creality/process/0.36mm Chunky @Creality Ender5Pro (2019) 0.8.json similarity index 77% rename from resources/profiles/Creality/process/0.36mm Chunky @Creality Ender5Pro (2019) (0.8 nozzle).json rename to resources/profiles/Creality/process/0.36mm Chunky @Creality Ender5Pro (2019) 0.8.json index f682e1a4a9..e1a07cf309 100644 --- a/resources/profiles/Creality/process/0.36mm Chunky @Creality Ender5Pro (2019) (0.8 nozzle).json +++ b/resources/profiles/Creality/process/0.36mm Chunky @Creality Ender5Pro (2019) 0.8.json @@ -1,7 +1,7 @@ { "type": "process", "setting_id": "GP004", - "name": "0.36mm Chunky @Creality Ender5Pro (2019) (0.8 nozzle)", + "name": "0.36mm Chunky @Creality Ender5Pro (2019) 0.8", "from": "system", "instantiation": "true", "inherits": "fdm_process_creality_common_0_8", diff --git a/resources/profiles/Creality/process/0.36mm Chunky @Creality Ender5Pro (2019) (1.0 nozzle).json b/resources/profiles/Creality/process/0.36mm Chunky @Creality Ender5Pro (2019) 1.0.json similarity index 77% rename from resources/profiles/Creality/process/0.36mm Chunky @Creality Ender5Pro (2019) (1.0 nozzle).json rename to resources/profiles/Creality/process/0.36mm Chunky @Creality Ender5Pro (2019) 1.0.json index 1d565411fb..48d513d5c2 100644 --- a/resources/profiles/Creality/process/0.36mm Chunky @Creality Ender5Pro (2019) (1.0 nozzle).json +++ b/resources/profiles/Creality/process/0.36mm Chunky @Creality Ender5Pro (2019) 1.0.json @@ -1,7 +1,7 @@ { "type": "process", "setting_id": "GP004", - "name": "0.36mm Chunky @Creality Ender5Pro (2019) (1.0 nozzle)", + "name": "0.36mm Chunky @Creality Ender5Pro (2019) 1.0", "from": "system", "instantiation": "true", "inherits": "fdm_process_creality_common_1_0", diff --git a/resources/profiles/Creality/process/0.36mm Draft @Creality K1 (0.6 nozzle).json b/resources/profiles/Creality/process/0.36mm Draft @Creality K1 (0.6 nozzle).json index 9d7d3d4ac5..826e8349c4 100644 --- a/resources/profiles/Creality/process/0.36mm Draft @Creality K1 (0.6 nozzle).json +++ b/resources/profiles/Creality/process/0.36mm Draft @Creality K1 (0.6 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.36mm Draft @Creality K1 (0.6 nozzle)", "from": "system", - "inherits": "fdm_process_creality_common", + "inherits": "fdm_process_common_klipper", "instantiation": "true", "adaptive_layer_height": "0", "reduce_crossing_wall": "0", @@ -15,10 +15,9 @@ "bridge_speed": "30", "brim_width": "5", "brim_object_gap": "0.1", - "compatible_printers": [], "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "10000", + "default_acceleration": "12000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.15", @@ -98,10 +97,11 @@ "detect_thin_wall": "0", "top_surface_pattern": "monotonicline", "top_surface_line_width": "0.62", - "top_surface_acceleration": "2000", + "top_surface_acceleration": "5000", "top_surface_speed": "150", "top_shell_layers": "3", "top_shell_thickness": "0.6", + "travel_acceleration": "12000", "travel_speed": "500", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", @@ -112,4 +112,4 @@ "compatible_printers": [ "Creality K1 (0.6 nozzle)" ] -} \ No newline at end of file +} diff --git a/resources/profiles/Creality/process/0.36mm Draft @Creality K1Max (0.6 nozzle).json b/resources/profiles/Creality/process/0.36mm Draft @Creality K1Max (0.6 nozzle).json index 63c7107e5b..261b31086e 100644 --- a/resources/profiles/Creality/process/0.36mm Draft @Creality K1Max (0.6 nozzle).json +++ b/resources/profiles/Creality/process/0.36mm Draft @Creality K1Max (0.6 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.36mm Draft @Creality K1Max (0.6 nozzle)", "from": "system", - "inherits": "fdm_process_creality_common", + "inherits": "fdm_process_common_klipper", "instantiation": "true", "adaptive_layer_height": "0", "reduce_crossing_wall": "0", @@ -15,10 +15,9 @@ "bridge_speed": "30", "brim_width": "5", "brim_object_gap": "0.1", - "compatible_printers": [], "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "10000", + "default_acceleration": "12000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.15", @@ -98,10 +97,11 @@ "detect_thin_wall": "0", "top_surface_pattern": "monotonicline", "top_surface_line_width": "0.62", - "top_surface_acceleration": "2000", + "top_surface_acceleration": "5000", "top_surface_speed": "150", "top_shell_layers": "3", "top_shell_thickness": "0.6", + "travel_acceleration": "12000", "travel_speed": "500", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", @@ -112,4 +112,4 @@ "compatible_printers": [ "Creality K1 Max (0.6 nozzle)" ] -} \ No newline at end of file +} diff --git a/resources/profiles/Creality/process/0.40mm Standard @Creality K1 (0.8 nozzle).json b/resources/profiles/Creality/process/0.40mm Standard @Creality K1 (0.8 nozzle).json index b72a91f6bf..f246ca94b7 100644 --- a/resources/profiles/Creality/process/0.40mm Standard @Creality K1 (0.8 nozzle).json +++ b/resources/profiles/Creality/process/0.40mm Standard @Creality K1 (0.8 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.40mm Standard @Creality K1 (0.8 nozzle)", "from": "system", - "inherits": "fdm_process_creality_common", + "inherits": "fdm_process_common_klipper", "instantiation": "true", "adaptive_layer_height": "0", "reduce_crossing_wall": "0", @@ -15,10 +15,9 @@ "bridge_speed": "30", "brim_width": "5", "brim_object_gap": "0.1", - "compatible_printers": [], "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "10000", + "default_acceleration": "12000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.15", @@ -98,10 +97,11 @@ "detect_thin_wall": "0", "top_surface_pattern": "monotonicline", "top_surface_line_width": "0.82", - "top_surface_acceleration": "2000", + "top_surface_acceleration": "5000", "top_surface_speed": "150", "top_shell_layers": "3", "top_shell_thickness": "0.6", + "travel_acceleration": "12000", "travel_speed": "500", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", @@ -112,4 +112,4 @@ "compatible_printers": [ "Creality K1 (0.8 nozzle)" ] -} \ No newline at end of file +} diff --git a/resources/profiles/Creality/process/0.40mm Standard @Creality K1Max (0.8 nozzle).json b/resources/profiles/Creality/process/0.40mm Standard @Creality K1Max (0.8 nozzle).json index 0afc0a0363..3d526219a3 100644 --- a/resources/profiles/Creality/process/0.40mm Standard @Creality K1Max (0.8 nozzle).json +++ b/resources/profiles/Creality/process/0.40mm Standard @Creality K1Max (0.8 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.40mm Standard @Creality K1Max (0.8 nozzle)", "from": "system", - "inherits": "fdm_process_creality_common", + "inherits": "fdm_process_common_klipper", "instantiation": "true", "adaptive_layer_height": "0", "reduce_crossing_wall": "0", @@ -15,10 +15,9 @@ "bridge_speed": "30", "brim_width": "5", "brim_object_gap": "0.1", - "compatible_printers": [], "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "10000", + "default_acceleration": "12000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.15", @@ -98,10 +97,11 @@ "detect_thin_wall": "0", "top_surface_pattern": "monotonicline", "top_surface_line_width": "0.82", - "top_surface_acceleration": "2000", + "top_surface_acceleration": "5000", "top_surface_speed": "150", "top_shell_layers": "3", "top_shell_thickness": "0.6", + "travel_acceleration": "12000", "travel_speed": "500", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", @@ -112,4 +112,4 @@ "compatible_printers": [ "Creality K1 Max (0.8 nozzle)" ] -} \ No newline at end of file +} diff --git a/resources/profiles/Creality/process/0.48mm Draft @Creality K1 (0.8 nozzle).json b/resources/profiles/Creality/process/0.48mm Draft @Creality K1 (0.8 nozzle).json index a51952a74d..cf3145d3a5 100644 --- a/resources/profiles/Creality/process/0.48mm Draft @Creality K1 (0.8 nozzle).json +++ b/resources/profiles/Creality/process/0.48mm Draft @Creality K1 (0.8 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.48mm Draft @Creality K1 (0.8 nozzle)", "from": "system", - "inherits": "fdm_process_creality_common", + "inherits": "fdm_process_common_klipper", "instantiation": "true", "adaptive_layer_height": "0", "reduce_crossing_wall": "0", @@ -15,10 +15,9 @@ "bridge_speed": "30", "brim_width": "5", "brim_object_gap": "0.1", - "compatible_printers": [], "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "10000", + "default_acceleration": "12000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.15", @@ -98,10 +97,11 @@ "detect_thin_wall": "0", "top_surface_pattern": "monotonicline", "top_surface_line_width": "0.82", - "top_surface_acceleration": "2000", + "top_surface_acceleration": "5000", "top_surface_speed": "150", "top_shell_layers": "3", "top_shell_thickness": "0.6", + "travel_acceleration": "12000", "travel_speed": "500", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", @@ -112,4 +112,4 @@ "compatible_printers": [ "Creality K1 (0.8 nozzle)" ] -} \ No newline at end of file +} diff --git a/resources/profiles/Creality/process/0.48mm Draft @Creality K1Max (0.8 nozzle).json b/resources/profiles/Creality/process/0.48mm Draft @Creality K1Max (0.8 nozzle).json index 6842de7ced..ba460aef68 100644 --- a/resources/profiles/Creality/process/0.48mm Draft @Creality K1Max (0.8 nozzle).json +++ b/resources/profiles/Creality/process/0.48mm Draft @Creality K1Max (0.8 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.48mm Draft @Creality K1Max (0.8 nozzle)", "from": "system", - "inherits": "fdm_process_creality_common", + "inherits": "fdm_process_common_klipper", "instantiation": "true", "adaptive_layer_height": "0", "reduce_crossing_wall": "0", @@ -15,10 +15,9 @@ "bridge_speed": "30", "brim_width": "5", "brim_object_gap": "0.1", - "compatible_printers": [], "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "10000", + "default_acceleration": "12000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.15", @@ -98,10 +97,11 @@ "detect_thin_wall": "0", "top_surface_pattern": "monotonicline", "top_surface_line_width": "0.82", - "top_surface_acceleration": "2000", + "top_surface_acceleration": "5000", "top_surface_speed": "150", "top_shell_layers": "3", "top_shell_thickness": "0.6", + "travel_acceleration": "12000", "travel_speed": "500", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", @@ -112,4 +112,4 @@ "compatible_printers": [ "Creality K1 Max (0.8 nozzle)" ] -} \ No newline at end of file +} diff --git a/resources/profiles/Creality/process/fdm_process_common_klipper.json b/resources/profiles/Creality/process/fdm_process_common_klipper.json new file mode 100644 index 0000000000..a8db062d3a --- /dev/null +++ b/resources/profiles/Creality/process/fdm_process_common_klipper.json @@ -0,0 +1,14 @@ +{ + "type": "process", + "name": "fdm_process_common_klipper", + "from": "system", + "inherits": "fdm_process_creality_common", + "instantiation": "false", + "default_jerk": "9", + "initial_layer_jerk": "9", + "outer_wall_jerk": "7", + "infill_jerk": "12", + "travel_jerk": "12", + "inner_wall_jerk": "7", + "top_surface_jerk": "7" +} diff --git a/resources/profiles/Creality/process/fdm_process_creality_common_0_2.json b/resources/profiles/Creality/process/fdm_process_creality_common_0_2.json index d93df94b3e..eb28a2bca8 100644 --- a/resources/profiles/Creality/process/fdm_process_creality_common_0_2.json +++ b/resources/profiles/Creality/process/fdm_process_creality_common_0_2.json @@ -14,94 +14,7 @@ "top_surface_line_width": "0.2", "initial_layer_print_height": "0.12", "wall_loops": "6", - "adaptive_layer_height": "0", - "reduce_crossing_wall": "0", - "max_travel_detour_distance": "0", - "bottom_surface_pattern": "monotonic", - "bottom_shell_layers": "3", - "bottom_shell_thickness": "0", - "bridge_flow": "0.95", - "bridge_speed": "25", - "brim_width": "5", - "brim_object_gap": "0.1", - "compatible_printers_condition": "", - "print_sequence": "by layer", - "default_acceleration": "500", - "top_surface_acceleration": "500", - "bridge_no_support": "0", - "draft_shield": "disabled", - "elefant_foot_compensation": "0", - "enable_arc_fitting": "0", - "wall_infill_order": "inner wall/outer wall/infill", - "infill_direction": "45", - "sparse_infill_density": "15%", - "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "500", - "travel_acceleration": "700", - "inner_wall_acceleration": "500", - "infill_combination": "0", - "infill_wall_overlap": "23%", - "interface_shells": "0", - "ironing_flow": "15%", - "ironing_spacing": "0.1", - "ironing_speed": "15", - "ironing_type": "no ironing", - "layer_height": "0.2", - "reduce_infill_retraction": "1", - "filename_format": "{input_filename_base}_{filament_type[initial_tool]}_{print_time}.gcode", - "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "20", - "overhang_3_4_speed": "15", - "overhang_4_4_speed": "10", - "print_settings_id": "", - "raft_layers": "0", - "seam_position": "aligned", - "skirt_distance": "2", - "skirt_height": "1", - "skirt_loops": "1", - "minimum_sparse_infill_area": "15", - "spiral_mode": "0", - "standby_temperature_delta": "-5", - "enable_support": "0", - "resolution": "0.012", - "support_type": "normal(auto)", - "support_style": "default", - "support_on_build_plate_only": "0", - "support_top_z_distance": "0.2", - "support_filament": "0", - "support_interface_loop_pattern": "0", - "support_interface_filament": "0", - "support_interface_top_layers": "2", - "support_interface_bottom_layers": "2", - "support_interface_spacing": "0.5", - "support_interface_speed": "80", - "support_base_pattern": "rectilinear", - "support_base_pattern_spacing": "2.5", - "support_speed": "150", - "support_threshold_angle": "30", - "support_object_xy_distance": "0.35", - "tree_support_branch_angle": "45", - "tree_support_wall_count": "0", - "detect_thin_wall": "0", - "top_surface_pattern": "monotonic", - "top_shell_layers": "4", - "top_shell_thickness": "0.8", - "initial_layer_speed": "15", - "initial_layer_infill_speed": "20", - "outer_wall_speed": "25", - "inner_wall_speed": "40", - "internal_solid_infill_speed": "40", - "top_surface_speed": "30", - "gap_infill_speed": "30", - "sparse_infill_speed": "50", - "travel_speed": "150", - "enable_prime_tower": "0", - "wipe_tower_no_sparse_layers": "0", - "prime_tower_width": "60", - "xy_hole_compensation": "0", - "xy_contour_compensation": "0", "compatible_printers": [ - "Creality Ender-5 Pro (2019) (0.2 nozzle)" + "Creality Ender-5 Pro (2019) 0.2 nozzle" ] } \ No newline at end of file diff --git a/resources/profiles/Creality/process/fdm_process_creality_common_0_25.json b/resources/profiles/Creality/process/fdm_process_creality_common_0_25.json index 8040cb846f..94b5cb989c 100644 --- a/resources/profiles/Creality/process/fdm_process_creality_common_0_25.json +++ b/resources/profiles/Creality/process/fdm_process_creality_common_0_25.json @@ -14,94 +14,7 @@ "top_surface_line_width": "0.25", "initial_layer_print_height": "0.12", "wall_loops": "5", - "adaptive_layer_height": "0", - "reduce_crossing_wall": "0", - "max_travel_detour_distance": "0", - "bottom_surface_pattern": "monotonic", - "bottom_shell_layers": "3", - "bottom_shell_thickness": "0", - "bridge_flow": "0.95", - "bridge_speed": "25", - "brim_width": "5", - "brim_object_gap": "0.1", - "compatible_printers_condition": "", - "print_sequence": "by layer", - "default_acceleration": "500", - "top_surface_acceleration": "500", - "bridge_no_support": "0", - "draft_shield": "disabled", - "elefant_foot_compensation": "0", - "enable_arc_fitting": "0", - "wall_infill_order": "inner wall/outer wall/infill", - "infill_direction": "45", - "sparse_infill_density": "15%", - "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "500", - "travel_acceleration": "700", - "inner_wall_acceleration": "500", - "infill_combination": "0", - "infill_wall_overlap": "23%", - "interface_shells": "0", - "ironing_flow": "15%", - "ironing_spacing": "0.1", - "ironing_speed": "15", - "ironing_type": "no ironing", - "layer_height": "0.2", - "reduce_infill_retraction": "1", - "filename_format": "{input_filename_base}_{filament_type[initial_tool]}_{print_time}.gcode", - "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "20", - "overhang_3_4_speed": "15", - "overhang_4_4_speed": "10", - "print_settings_id": "", - "raft_layers": "0", - "seam_position": "aligned", - "skirt_distance": "2", - "skirt_height": "1", - "skirt_loops": "1", - "minimum_sparse_infill_area": "15", - "spiral_mode": "0", - "standby_temperature_delta": "-5", - "enable_support": "0", - "resolution": "0.012", - "support_type": "normal(auto)", - "support_style": "default", - "support_on_build_plate_only": "0", - "support_top_z_distance": "0.2", - "support_filament": "0", - "support_interface_loop_pattern": "0", - "support_interface_filament": "0", - "support_interface_top_layers": "2", - "support_interface_bottom_layers": "2", - "support_interface_spacing": "0.5", - "support_interface_speed": "80", - "support_base_pattern": "rectilinear", - "support_base_pattern_spacing": "2.5", - "support_speed": "150", - "support_threshold_angle": "30", - "support_object_xy_distance": "0.35", - "tree_support_branch_angle": "45", - "tree_support_wall_count": "0", - "detect_thin_wall": "0", - "top_surface_pattern": "monotonic", - "top_shell_layers": "4", - "top_shell_thickness": "0.8", - "initial_layer_speed": "15", - "initial_layer_infill_speed": "20", - "outer_wall_speed": "25", - "inner_wall_speed": "40", - "internal_solid_infill_speed": "40", - "top_surface_speed": "30", - "gap_infill_speed": "30", - "sparse_infill_speed": "50", - "travel_speed": "150", - "enable_prime_tower": "0", - "wipe_tower_no_sparse_layers": "0", - "prime_tower_width": "60", - "xy_hole_compensation": "0", - "xy_contour_compensation": "0", "compatible_printers": [ - "Creality Ender-5 Pro (2019) (0.25 nozzle)" + "Creality Ender-5 Pro (2019) 0.25 nozzle" ] } \ No newline at end of file diff --git a/resources/profiles/Creality/process/fdm_process_creality_common_0_3.json b/resources/profiles/Creality/process/fdm_process_creality_common_0_3.json index 4e50dbc4b9..26d05e8228 100644 --- a/resources/profiles/Creality/process/fdm_process_creality_common_0_3.json +++ b/resources/profiles/Creality/process/fdm_process_creality_common_0_3.json @@ -13,95 +13,7 @@ "support_line_width": "0.27", "top_surface_line_width": "0.3", "wall_loops": "4", - "adaptive_layer_height": "0", - "reduce_crossing_wall": "0", - "max_travel_detour_distance": "0", - "bottom_surface_pattern": "monotonic", - "bottom_shell_layers": "3", - "bottom_shell_thickness": "0", - "bridge_flow": "0.95", - "bridge_speed": "25", - "brim_width": "5", - "brim_object_gap": "0.1", - "compatible_printers_condition": "", - "print_sequence": "by layer", - "default_acceleration": "500", - "top_surface_acceleration": "500", - "bridge_no_support": "0", - "draft_shield": "disabled", - "elefant_foot_compensation": "0", - "enable_arc_fitting": "0", - "wall_infill_order": "inner wall/outer wall/infill", - "infill_direction": "45", - "sparse_infill_density": "15%", - "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "500", - "travel_acceleration": "700", - "inner_wall_acceleration": "500", - "initial_layer_print_height": "0.2", - "infill_combination": "0", - "infill_wall_overlap": "23%", - "interface_shells": "0", - "ironing_flow": "15%", - "ironing_spacing": "0.1", - "ironing_speed": "15", - "ironing_type": "no ironing", - "layer_height": "0.2", - "reduce_infill_retraction": "1", - "filename_format": "{input_filename_base}_{filament_type[initial_tool]}_{print_time}.gcode", - "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "20", - "overhang_3_4_speed": "15", - "overhang_4_4_speed": "10", - "print_settings_id": "", - "raft_layers": "0", - "seam_position": "aligned", - "skirt_distance": "2", - "skirt_height": "1", - "skirt_loops": "1", - "minimum_sparse_infill_area": "15", - "spiral_mode": "0", - "standby_temperature_delta": "-5", - "enable_support": "0", - "resolution": "0.012", - "support_type": "normal(auto)", - "support_style": "default", - "support_on_build_plate_only": "0", - "support_top_z_distance": "0.2", - "support_filament": "0", - "support_interface_loop_pattern": "0", - "support_interface_filament": "0", - "support_interface_top_layers": "2", - "support_interface_bottom_layers": "2", - "support_interface_spacing": "0.5", - "support_interface_speed": "80", - "support_base_pattern": "rectilinear", - "support_base_pattern_spacing": "2.5", - "support_speed": "150", - "support_threshold_angle": "30", - "support_object_xy_distance": "0.35", - "tree_support_branch_angle": "45", - "tree_support_wall_count": "0", - "detect_thin_wall": "0", - "top_surface_pattern": "monotonic", - "top_shell_layers": "4", - "top_shell_thickness": "0.8", - "initial_layer_speed": "15", - "initial_layer_infill_speed": "20", - "outer_wall_speed": "25", - "inner_wall_speed": "40", - "internal_solid_infill_speed": "40", - "top_surface_speed": "30", - "gap_infill_speed": "30", - "sparse_infill_speed": "50", - "travel_speed": "150", - "enable_prime_tower": "0", - "wipe_tower_no_sparse_layers": "0", - "prime_tower_width": "60", - "xy_hole_compensation": "0", - "xy_contour_compensation": "0", "compatible_printers": [ - "Creality Ender-5 Pro (2019) (0.3 nozzle)" + "Creality Ender-5 Pro (2019) 0.3 nozzle" ] } \ No newline at end of file diff --git a/resources/profiles/Creality/process/fdm_process_creality_common_0_5.json b/resources/profiles/Creality/process/fdm_process_creality_common_0_5.json index 3c1a20b6a1..26a11b4d51 100644 --- a/resources/profiles/Creality/process/fdm_process_creality_common_0_5.json +++ b/resources/profiles/Creality/process/fdm_process_creality_common_0_5.json @@ -13,95 +13,7 @@ "support_line_width": "0.45", "top_surface_line_width": "0.5", "wall_loops": "3", - "adaptive_layer_height": "0", - "reduce_crossing_wall": "0", - "max_travel_detour_distance": "0", - "bottom_surface_pattern": "monotonic", - "bottom_shell_layers": "3", - "bottom_shell_thickness": "0", - "bridge_flow": "0.95", - "bridge_speed": "25", - "brim_width": "5", - "brim_object_gap": "0.1", - "compatible_printers_condition": "", - "print_sequence": "by layer", - "default_acceleration": "500", - "top_surface_acceleration": "500", - "bridge_no_support": "0", - "draft_shield": "disabled", - "elefant_foot_compensation": "0", - "enable_arc_fitting": "0", - "wall_infill_order": "inner wall/outer wall/infill", - "infill_direction": "45", - "sparse_infill_density": "15%", - "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "500", - "travel_acceleration": "700", - "inner_wall_acceleration": "500", - "initial_layer_print_height": "0.2", - "infill_combination": "0", - "infill_wall_overlap": "23%", - "interface_shells": "0", - "ironing_flow": "15%", - "ironing_spacing": "0.1", - "ironing_speed": "15", - "ironing_type": "no ironing", - "layer_height": "0.2", - "reduce_infill_retraction": "1", - "filename_format": "{input_filename_base}_{filament_type[initial_tool]}_{print_time}.gcode", - "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "20", - "overhang_3_4_speed": "15", - "overhang_4_4_speed": "10", - "print_settings_id": "", - "raft_layers": "0", - "seam_position": "aligned", - "skirt_distance": "2", - "skirt_height": "1", - "skirt_loops": "1", - "minimum_sparse_infill_area": "15", - "spiral_mode": "0", - "standby_temperature_delta": "-5", - "enable_support": "0", - "resolution": "0.012", - "support_type": "normal(auto)", - "support_style": "default", - "support_on_build_plate_only": "0", - "support_top_z_distance": "0.2", - "support_filament": "0", - "support_interface_loop_pattern": "0", - "support_interface_filament": "0", - "support_interface_top_layers": "2", - "support_interface_bottom_layers": "2", - "support_interface_spacing": "0.5", - "support_interface_speed": "80", - "support_base_pattern": "rectilinear", - "support_base_pattern_spacing": "2.5", - "support_speed": "150", - "support_threshold_angle": "30", - "support_object_xy_distance": "0.35", - "tree_support_branch_angle": "45", - "tree_support_wall_count": "0", - "detect_thin_wall": "0", - "top_surface_pattern": "monotonic", - "top_shell_layers": "4", - "top_shell_thickness": "0.8", - "initial_layer_speed": "15", - "initial_layer_infill_speed": "20", - "outer_wall_speed": "25", - "inner_wall_speed": "40", - "internal_solid_infill_speed": "40", - "top_surface_speed": "30", - "gap_infill_speed": "30", - "sparse_infill_speed": "50", - "travel_speed": "150", - "enable_prime_tower": "0", - "wipe_tower_no_sparse_layers": "0", - "prime_tower_width": "60", - "xy_hole_compensation": "0", - "xy_contour_compensation": "0", "compatible_printers": [ - "Creality Ender-5 Pro (2019) (0.5 nozzle)" + "Creality Ender-5 Pro (2019) 0.5 nozzle" ] } \ No newline at end of file diff --git a/resources/profiles/Creality/process/fdm_process_creality_common_0_6.json b/resources/profiles/Creality/process/fdm_process_creality_common_0_6.json index 579aa1fa7b..ca184e0616 100644 --- a/resources/profiles/Creality/process/fdm_process_creality_common_0_6.json +++ b/resources/profiles/Creality/process/fdm_process_creality_common_0_6.json @@ -13,95 +13,7 @@ "support_line_width": "0.54", "top_surface_line_width": "0.6", "wall_loops": "2", - "adaptive_layer_height": "0", - "reduce_crossing_wall": "0", - "max_travel_detour_distance": "0", - "bottom_surface_pattern": "monotonic", - "bottom_shell_layers": "3", - "bottom_shell_thickness": "0", - "bridge_flow": "0.95", - "bridge_speed": "25", - "brim_width": "5", - "brim_object_gap": "0.1", - "compatible_printers_condition": "", - "print_sequence": "by layer", - "default_acceleration": "500", - "top_surface_acceleration": "500", - "bridge_no_support": "0", - "draft_shield": "disabled", - "elefant_foot_compensation": "0", - "enable_arc_fitting": "0", - "wall_infill_order": "inner wall/outer wall/infill", - "infill_direction": "45", - "sparse_infill_density": "15%", - "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "500", - "travel_acceleration": "700", - "inner_wall_acceleration": "500", - "initial_layer_print_height": "0.2", - "infill_combination": "0", - "infill_wall_overlap": "23%", - "interface_shells": "0", - "ironing_flow": "15%", - "ironing_spacing": "0.1", - "ironing_speed": "15", - "ironing_type": "no ironing", - "layer_height": "0.2", - "reduce_infill_retraction": "1", - "filename_format": "{input_filename_base}_{filament_type[initial_tool]}_{print_time}.gcode", - "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "20", - "overhang_3_4_speed": "15", - "overhang_4_4_speed": "10", - "print_settings_id": "", - "raft_layers": "0", - "seam_position": "aligned", - "skirt_distance": "2", - "skirt_height": "1", - "skirt_loops": "1", - "minimum_sparse_infill_area": "15", - "spiral_mode": "0", - "standby_temperature_delta": "-5", - "enable_support": "0", - "resolution": "0.012", - "support_type": "normal(auto)", - "support_style": "default", - "support_on_build_plate_only": "0", - "support_top_z_distance": "0.2", - "support_filament": "0", - "support_interface_loop_pattern": "0", - "support_interface_filament": "0", - "support_interface_top_layers": "2", - "support_interface_bottom_layers": "2", - "support_interface_spacing": "0.5", - "support_interface_speed": "80", - "support_base_pattern": "rectilinear", - "support_base_pattern_spacing": "2.5", - "support_speed": "150", - "support_threshold_angle": "30", - "support_object_xy_distance": "0.35", - "tree_support_branch_angle": "45", - "tree_support_wall_count": "0", - "detect_thin_wall": "0", - "top_surface_pattern": "monotonic", - "top_shell_layers": "4", - "top_shell_thickness": "0.8", - "initial_layer_speed": "15", - "initial_layer_infill_speed": "20", - "outer_wall_speed": "25", - "inner_wall_speed": "40", - "internal_solid_infill_speed": "40", - "top_surface_speed": "30", - "gap_infill_speed": "30", - "sparse_infill_speed": "50", - "travel_speed": "150", - "enable_prime_tower": "0", - "wipe_tower_no_sparse_layers": "0", - "prime_tower_width": "60", - "xy_hole_compensation": "0", - "xy_contour_compensation": "0", "compatible_printers": [ - "Creality Ender-5 Pro (2019) (0.6 nozzle)" + "Creality Ender-5 Pro (2019) 0.6 nozzle" ] } \ No newline at end of file diff --git a/resources/profiles/Creality/process/fdm_process_creality_common_0_8.json b/resources/profiles/Creality/process/fdm_process_creality_common_0_8.json index 43959bc9dc..b7f6a48eac 100644 --- a/resources/profiles/Creality/process/fdm_process_creality_common_0_8.json +++ b/resources/profiles/Creality/process/fdm_process_creality_common_0_8.json @@ -14,94 +14,7 @@ "top_surface_line_width": "0.8", "initial_layer_print_height": "0.32", "wall_loops": "2", - "adaptive_layer_height": "0", - "reduce_crossing_wall": "0", - "max_travel_detour_distance": "0", - "bottom_surface_pattern": "monotonic", - "bottom_shell_layers": "3", - "bottom_shell_thickness": "0", - "bridge_flow": "0.95", - "bridge_speed": "25", - "brim_width": "5", - "brim_object_gap": "0.1", - "compatible_printers_condition": "", - "print_sequence": "by layer", - "default_acceleration": "500", - "top_surface_acceleration": "500", - "bridge_no_support": "0", - "draft_shield": "disabled", - "elefant_foot_compensation": "0", - "enable_arc_fitting": "0", - "wall_infill_order": "inner wall/outer wall/infill", - "infill_direction": "45", - "sparse_infill_density": "15%", - "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "500", - "travel_acceleration": "700", - "inner_wall_acceleration": "500", - "infill_combination": "0", - "infill_wall_overlap": "23%", - "interface_shells": "0", - "ironing_flow": "15%", - "ironing_spacing": "0.1", - "ironing_speed": "15", - "ironing_type": "no ironing", - "layer_height": "0.2", - "reduce_infill_retraction": "1", - "filename_format": "{input_filename_base}_{filament_type[initial_tool]}_{print_time}.gcode", - "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "20", - "overhang_3_4_speed": "15", - "overhang_4_4_speed": "10", - "print_settings_id": "", - "raft_layers": "0", - "seam_position": "aligned", - "skirt_distance": "2", - "skirt_height": "1", - "skirt_loops": "1", - "minimum_sparse_infill_area": "15", - "spiral_mode": "0", - "standby_temperature_delta": "-5", - "enable_support": "0", - "resolution": "0.012", - "support_type": "normal(auto)", - "support_style": "default", - "support_on_build_plate_only": "0", - "support_top_z_distance": "0.2", - "support_filament": "0", - "support_interface_loop_pattern": "0", - "support_interface_filament": "0", - "support_interface_top_layers": "2", - "support_interface_bottom_layers": "2", - "support_interface_spacing": "0.5", - "support_interface_speed": "80", - "support_base_pattern": "rectilinear", - "support_base_pattern_spacing": "2.5", - "support_speed": "150", - "support_threshold_angle": "30", - "support_object_xy_distance": "0.35", - "tree_support_branch_angle": "45", - "tree_support_wall_count": "0", - "detect_thin_wall": "0", - "top_surface_pattern": "monotonic", - "top_shell_layers": "4", - "top_shell_thickness": "0.8", - "initial_layer_speed": "15", - "initial_layer_infill_speed": "20", - "outer_wall_speed": "25", - "inner_wall_speed": "40", - "internal_solid_infill_speed": "40", - "top_surface_speed": "30", - "gap_infill_speed": "30", - "sparse_infill_speed": "50", - "travel_speed": "150", - "enable_prime_tower": "0", - "wipe_tower_no_sparse_layers": "0", - "prime_tower_width": "60", - "xy_hole_compensation": "0", - "xy_contour_compensation": "0", "compatible_printers": [ - "Creality Ender-5 Pro (2019) (0.8 nozzle)" + "Creality Ender-5 Pro (2019) 0.8 nozzle" ] } \ No newline at end of file diff --git a/resources/profiles/Creality/process/fdm_process_creality_common_1_0.json b/resources/profiles/Creality/process/fdm_process_creality_common_1_0.json index 72a927710d..926033c695 100644 --- a/resources/profiles/Creality/process/fdm_process_creality_common_1_0.json +++ b/resources/profiles/Creality/process/fdm_process_creality_common_1_0.json @@ -14,94 +14,7 @@ "top_surface_line_width": "1.0", "initial_layer_print_height": "0.32", "wall_loops": "1", - "adaptive_layer_height": "0", - "reduce_crossing_wall": "0", - "max_travel_detour_distance": "0", - "bottom_surface_pattern": "monotonic", - "bottom_shell_layers": "3", - "bottom_shell_thickness": "0", - "bridge_flow": "0.95", - "bridge_speed": "25", - "brim_width": "5", - "brim_object_gap": "0.1", - "compatible_printers_condition": "", - "print_sequence": "by layer", - "default_acceleration": "500", - "top_surface_acceleration": "500", - "bridge_no_support": "0", - "draft_shield": "disabled", - "elefant_foot_compensation": "0", - "enable_arc_fitting": "0", - "wall_infill_order": "inner wall/outer wall/infill", - "infill_direction": "45", - "sparse_infill_density": "15%", - "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "500", - "travel_acceleration": "700", - "inner_wall_acceleration": "500", - "infill_combination": "0", - "infill_wall_overlap": "23%", - "interface_shells": "0", - "ironing_flow": "15%", - "ironing_spacing": "0.1", - "ironing_speed": "15", - "ironing_type": "no ironing", - "layer_height": "0.2", - "reduce_infill_retraction": "1", - "filename_format": "{input_filename_base}_{filament_type[initial_tool]}_{print_time}.gcode", - "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "20", - "overhang_3_4_speed": "15", - "overhang_4_4_speed": "10", - "print_settings_id": "", - "raft_layers": "0", - "seam_position": "aligned", - "skirt_distance": "2", - "skirt_height": "1", - "skirt_loops": "1", - "minimum_sparse_infill_area": "15", - "spiral_mode": "0", - "standby_temperature_delta": "-5", - "enable_support": "0", - "resolution": "0.012", - "support_type": "normal(auto)", - "support_style": "default", - "support_on_build_plate_only": "0", - "support_top_z_distance": "0.2", - "support_filament": "0", - "support_interface_loop_pattern": "0", - "support_interface_filament": "0", - "support_interface_top_layers": "2", - "support_interface_bottom_layers": "2", - "support_interface_spacing": "0.5", - "support_interface_speed": "80", - "support_base_pattern": "rectilinear", - "support_base_pattern_spacing": "2.5", - "support_speed": "150", - "support_threshold_angle": "30", - "support_object_xy_distance": "0.35", - "tree_support_branch_angle": "45", - "tree_support_wall_count": "0", - "detect_thin_wall": "0", - "top_surface_pattern": "monotonic", - "top_shell_layers": "4", - "top_shell_thickness": "0.8", - "initial_layer_speed": "15", - "initial_layer_infill_speed": "20", - "outer_wall_speed": "25", - "inner_wall_speed": "40", - "internal_solid_infill_speed": "40", - "top_surface_speed": "30", - "gap_infill_speed": "30", - "sparse_infill_speed": "50", - "travel_speed": "150", - "enable_prime_tower": "0", - "wipe_tower_no_sparse_layers": "0", - "prime_tower_width": "60", - "xy_hole_compensation": "0", - "xy_contour_compensation": "0", "compatible_printers": [ - "Creality Ender-5 Pro (2019) (1.0 nozzle)" + "Creality Ender-5 Pro (2019) 1.0 nozzle" ] } \ No newline at end of file diff --git a/resources/profiles/Custom/machine/fdm_machine_common.json b/resources/profiles/Custom/machine/fdm_machine_common.json index 28ee8f30b5..5785f57b19 100644 --- a/resources/profiles/Custom/machine/fdm_machine_common.json +++ b/resources/profiles/Custom/machine/fdm_machine_common.json @@ -31,7 +31,7 @@ "10000" ], "machine_max_acceleration_z": [ - "100" + "500" ], "machine_max_speed_e": [ "60" diff --git a/resources/profiles/Elegoo.json b/resources/profiles/Elegoo.json index a5c0576488..e30ab95459 100644 --- a/resources/profiles/Elegoo.json +++ b/resources/profiles/Elegoo.json @@ -51,6 +51,10 @@ { "name": "Elegoo Neptune 4 Max", "sub_path": "machine/Elegoo Neptune 4 Max.json" + }, + { + "name": "Elegoo Neptune 4 Plus", + "sub_path": "machine/Elegoo Neptune 4 Plus.json" } ], "process_list": [ @@ -62,6 +66,14 @@ "name": "fdm_process_elegoo_common", "sub_path": "process/fdm_process_elegoo_common.json" }, + { + "name": "fdm_process_neptune4_common", + "sub_path": "process/fdm_process_neptune4_common.json" + }, + { + "name": "fdm_process_neptune4max_common", + "sub_path": "process/fdm_process_neptune4max_common.json" + }, { "name": "0.08mm Extra Fine @Elegoo Neptune", "sub_path": "process/0.08mm Extra Fine @Elegoo Neptune.json" @@ -310,6 +322,22 @@ "name": "0.08mm Extra Fine @Elegoo Neptune4Max (0.8 nozzle)", "sub_path": "process/0.08mm Extra Fine @Elegoo Neptune4Max (0.8 nozzle).json" }, + { + "name": "0.08mm Extra Fine @Elegoo Neptune4 Plus (0.2 nozzle)", + "sub_path": "process/0.08mm Extra Fine @Elegoo Neptune4 Plus (0.2 nozzle).json" + }, + { + "name": "0.08mm Extra Fine @Elegoo Neptune4 Plus (0.4 nozzle)", + "sub_path": "process/0.08mm Extra Fine @Elegoo Neptune4 Plus (0.4 nozzle).json" + }, + { + "name": "0.08mm Extra Fine @Elegoo Neptune4 Plus (0.6 nozzle)", + "sub_path": "process/0.08mm Extra Fine @Elegoo Neptune4 Plus (0.6 nozzle).json" + }, + { + "name": "0.08mm Extra Fine @Elegoo Neptune4 Plus (0.8 nozzle)", + "sub_path": "process/0.08mm Extra Fine @Elegoo Neptune4 Plus (0.8 nozzle).json" + }, { "name": "0.08mm Extra Fine @Elegoo Neptune4Pro (0.2 nozzle)", "sub_path": "process/0.08mm Extra Fine @Elegoo Neptune4Pro (0.2 nozzle).json" @@ -358,6 +386,22 @@ "name": "0.12mm Fine @Elegoo Neptune4Max (0.8 nozzle)", "sub_path": "process/0.12mm Fine @Elegoo Neptune4Max (0.8 nozzle).json" }, + { + "name": "0.12mm Fine @Elegoo Neptune4 Plus (0.2 nozzle)", + "sub_path": "process/0.12mm Fine @Elegoo Neptune4 Plus (0.2 nozzle).json" + }, + { + "name": "0.12mm Fine @Elegoo Neptune4 Plus (0.4 nozzle)", + "sub_path": "process/0.12mm Fine @Elegoo Neptune4 Plus (0.4 nozzle).json" + }, + { + "name": "0.12mm Fine @Elegoo Neptune4 Plus (0.6 nozzle)", + "sub_path": "process/0.12mm Fine @Elegoo Neptune4 Plus (0.6 nozzle).json" + }, + { + "name": "0.12mm Fine @Elegoo Neptune4 Plus (0.8 nozzle)", + "sub_path": "process/0.12mm Fine @Elegoo Neptune4 Plus (0.8 nozzle).json" + }, { "name": "0.12mm Fine @Elegoo Neptune4Pro (0.2 nozzle)", "sub_path": "process/0.12mm Fine @Elegoo Neptune4Pro (0.2 nozzle).json" @@ -406,6 +450,22 @@ "name": "0.16mm Optimal @Elegoo Neptune4Max (0.8 nozzle)", "sub_path": "process/0.16mm Optimal @Elegoo Neptune4Max (0.8 nozzle).json" }, + { + "name": "0.16mm Optimal @Elegoo Neptune4 Plus (0.2 nozzle)", + "sub_path": "process/0.16mm Optimal @Elegoo Neptune4 Plus (0.2 nozzle).json" + }, + { + "name": "0.16mm Optimal @Elegoo Neptune4 Plus (0.4 nozzle)", + "sub_path": "process/0.16mm Optimal @Elegoo Neptune4 Plus (0.4 nozzle).json" + }, + { + "name": "0.16mm Optimal @Elegoo Neptune4 Plus (0.6 nozzle)", + "sub_path": "process/0.16mm Optimal @Elegoo Neptune4 Plus (0.6 nozzle).json" + }, + { + "name": "0.16mm Optimal @Elegoo Neptune4 Plus (0.8 nozzle)", + "sub_path": "process/0.16mm Optimal @Elegoo Neptune4 Plus (0.8 nozzle).json" + }, { "name": "0.16mm Optimal @Elegoo Neptune4Pro (0.2 nozzle)", "sub_path": "process/0.16mm Optimal @Elegoo Neptune4Pro (0.2 nozzle).json" @@ -454,6 +514,22 @@ "name": "0.20mm Standard @Elegoo Neptune4Max (0.8 nozzle)", "sub_path": "process/0.20mm Standard @Elegoo Neptune4Max (0.8 nozzle).json" }, + { + "name": "0.20mm Standard @Elegoo Neptune4 Plus (0.2 nozzle)", + "sub_path": "process/0.20mm Standard @Elegoo Neptune4 Plus (0.2 nozzle).json" + }, + { + "name": "0.20mm Standard @Elegoo Neptune4 Plus (0.4 nozzle)", + "sub_path": "process/0.20mm Standard @Elegoo Neptune4 Plus (0.4 nozzle).json" + }, + { + "name": "0.20mm Standard @Elegoo Neptune4 Plus (0.6 nozzle)", + "sub_path": "process/0.20mm Standard @Elegoo Neptune4 Plus (0.6 nozzle).json" + }, + { + "name": "0.20mm Standard @Elegoo Neptune4 Plus (0.8 nozzle)", + "sub_path": "process/0.20mm Standard @Elegoo Neptune4 Plus (0.8 nozzle).json" + }, { "name": "0.20mm Standard @Elegoo Neptune4Pro (0.2 nozzle)", "sub_path": "process/0.20mm Standard @Elegoo Neptune4Pro (0.2 nozzle).json" @@ -502,6 +578,22 @@ "name": "0.24mm Draft @Elegoo Neptune4Max (0.8 nozzle)", "sub_path": "process/0.24mm Draft @Elegoo Neptune4Max (0.8 nozzle).json" }, + { + "name": "0.24mm Draft @Elegoo Neptune4 Plus (0.2 nozzle)", + "sub_path": "process/0.24mm Draft @Elegoo Neptune4 Plus (0.2 nozzle).json" + }, + { + "name": "0.24mm Draft @Elegoo Neptune4 Plus (0.4 nozzle)", + "sub_path": "process/0.24mm Draft @Elegoo Neptune4 Plus (0.4 nozzle).json" + }, + { + "name": "0.24mm Draft @Elegoo Neptune4 Plus (0.6 nozzle)", + "sub_path": "process/0.24mm Draft @Elegoo Neptune4 Plus (0.6 nozzle).json" + }, + { + "name": "0.24mm Draft @Elegoo Neptune4 Plus (0.8 nozzle)", + "sub_path": "process/0.24mm Draft @Elegoo Neptune4 Plus (0.8 nozzle).json" + }, { "name": "0.24mm Draft @Elegoo Neptune4Pro (0.2 nozzle)", "sub_path": "process/0.24mm Draft @Elegoo Neptune4Pro (0.2 nozzle).json" @@ -550,6 +642,22 @@ "name": "0.28mm Extra Draft @Elegoo Neptune4Max (0.8 nozzle)", "sub_path": "process/0.28mm Extra Draft @Elegoo Neptune4Max (0.8 nozzle).json" }, + { + "name": "0.28mm Extra Draft @Elegoo Neptune4 Plus (0.2 nozzle)", + "sub_path": "process/0.28mm Extra Draft @Elegoo Neptune4 Plus (0.2 nozzle).json" + }, + { + "name": "0.28mm Extra Draft @Elegoo Neptune4 Plus (0.4 nozzle)", + "sub_path": "process/0.28mm Extra Draft @Elegoo Neptune4 Plus (0.4 nozzle).json" + }, + { + "name": "0.28mm Extra Draft @Elegoo Neptune4 Plus (0.6 nozzle)", + "sub_path": "process/0.28mm Extra Draft @Elegoo Neptune4 Plus (0.6 nozzle).json" + }, + { + "name": "0.28mm Extra Draft @Elegoo Neptune4 Plus (0.8 nozzle)", + "sub_path": "process/0.28mm Extra Draft @Elegoo Neptune4 Plus (0.8 nozzle).json" + }, { "name": "0.28mm Extra Draft @Elegoo Neptune4Pro (0.2 nozzle)", "sub_path": "process/0.28mm Extra Draft @Elegoo Neptune4Pro (0.2 nozzle).json" @@ -606,6 +714,10 @@ "name": "fdm_elegoo_common", "sub_path": "machine/fdm_elegoo_common.json" }, + { + "name": "fdm_neptune_4_common", + "sub_path": "machine/fdm_neptune_4_common.json" + }, { "name": "Elegoo Neptune 0.4 nozzle", "sub_path": "machine/Elegoo Neptune 0.4 nozzle.json" @@ -674,6 +786,22 @@ "name": "Elegoo Neptune 4 Max (0.8 nozzle)", "sub_path": "machine/Elegoo Neptune 4 Max (0.8 nozzle).json" }, + { + "name": "Elegoo Neptune 4 Plus (0.2 nozzle)", + "sub_path": "machine/Elegoo Neptune 4 Plus (0.2 nozzle).json" + }, + { + "name": "Elegoo Neptune 4 Plus (0.4 nozzle)", + "sub_path": "machine/Elegoo Neptune 4 Plus (0.4 nozzle).json" + }, + { + "name": "Elegoo Neptune 4 Plus (0.6 nozzle)", + "sub_path": "machine/Elegoo Neptune 4 Plus (0.6 nozzle).json" + }, + { + "name": "Elegoo Neptune 4 Plus (0.8 nozzle)", + "sub_path": "machine/Elegoo Neptune 4 Plus (0.8 nozzle).json" + }, { "name": "Elegoo Neptune 4 Pro (0.2 nozzle)", "sub_path": "machine/Elegoo Neptune 4 Pro (0.2 nozzle).json" diff --git a/resources/profiles/Elegoo/Elegoo Neptune 4 Plus_cover.png b/resources/profiles/Elegoo/Elegoo Neptune 4 Plus_cover.png new file mode 100644 index 0000000000..a283f2834f Binary files /dev/null and b/resources/profiles/Elegoo/Elegoo Neptune 4 Plus_cover.png differ diff --git a/resources/profiles/Elegoo/elegoo_neptune4plus_buildplate_model.stl b/resources/profiles/Elegoo/elegoo_neptune4plus_buildplate_model.stl new file mode 100644 index 0000000000..7465a18db9 Binary files /dev/null and b/resources/profiles/Elegoo/elegoo_neptune4plus_buildplate_model.stl differ diff --git a/resources/profiles/Elegoo/elegoo_neptune4plus_buildplate_texture.png b/resources/profiles/Elegoo/elegoo_neptune4plus_buildplate_texture.png new file mode 100644 index 0000000000..9e1eac8772 Binary files /dev/null and b/resources/profiles/Elegoo/elegoo_neptune4plus_buildplate_texture.png differ diff --git a/resources/profiles/Elegoo/filament/Elegoo Generic ABS.json b/resources/profiles/Elegoo/filament/Elegoo Generic ABS.json index 1ba91627cc..96cbcdaabb 100644 --- a/resources/profiles/Elegoo/filament/Elegoo Generic ABS.json +++ b/resources/profiles/Elegoo/filament/Elegoo Generic ABS.json @@ -27,6 +27,10 @@ "Elegoo Neptune 4 Max (0.4 nozzle)", "Elegoo Neptune 4 Max (0.6 nozzle)", "Elegoo Neptune 4 Max (0.8 nozzle)", + "Elegoo Neptune 4 Plus (0.2 nozzle)", + "Elegoo Neptune 4 Plus (0.4 nozzle)", + "Elegoo Neptune 4 Plus (0.6 nozzle)", + "Elegoo Neptune 4 Plus (0.8 nozzle)", "Elegoo Neptune 4 Pro (0.2 nozzle)", "Elegoo Neptune 4 Pro (0.4 nozzle)", "Elegoo Neptune 4 Pro (0.6 nozzle)", diff --git a/resources/profiles/Elegoo/filament/Elegoo Generic PETG.json b/resources/profiles/Elegoo/filament/Elegoo Generic PETG.json index 4297b2515d..10cf1ae1b6 100644 --- a/resources/profiles/Elegoo/filament/Elegoo Generic PETG.json +++ b/resources/profiles/Elegoo/filament/Elegoo Generic PETG.json @@ -37,6 +37,10 @@ "Elegoo Neptune 4 Max (0.4 nozzle)", "Elegoo Neptune 4 Max (0.6 nozzle)", "Elegoo Neptune 4 Max (0.8 nozzle)", + "Elegoo Neptune 4 Plus (0.2 nozzle)", + "Elegoo Neptune 4 Plus (0.4 nozzle)", + "Elegoo Neptune 4 Plus (0.6 nozzle)", + "Elegoo Neptune 4 Plus (0.8 nozzle)", "Elegoo Neptune 4 Pro (0.2 nozzle)", "Elegoo Neptune 4 Pro (0.4 nozzle)", "Elegoo Neptune 4 Pro (0.6 nozzle)", diff --git a/resources/profiles/Elegoo/filament/Elegoo Generic PLA.json b/resources/profiles/Elegoo/filament/Elegoo Generic PLA.json index ec8b59ad0c..1a2c92df3a 100644 --- a/resources/profiles/Elegoo/filament/Elegoo Generic PLA.json +++ b/resources/profiles/Elegoo/filament/Elegoo Generic PLA.json @@ -28,6 +28,10 @@ "Elegoo Neptune 4 Max (0.4 nozzle)", "Elegoo Neptune 4 Max (0.6 nozzle)", "Elegoo Neptune 4 Max (0.8 nozzle)", + "Elegoo Neptune 4 Plus (0.2 nozzle)", + "Elegoo Neptune 4 Plus (0.4 nozzle)", + "Elegoo Neptune 4 Plus (0.6 nozzle)", + "Elegoo Neptune 4 Plus (0.8 nozzle)", "Elegoo Neptune 4 Pro (0.2 nozzle)", "Elegoo Neptune 4 Pro (0.4 nozzle)", "Elegoo Neptune 4 Pro (0.6 nozzle)", diff --git a/resources/profiles/Elegoo/machine/Elegoo Neptune 3 0.4 nozzle.json b/resources/profiles/Elegoo/machine/Elegoo Neptune 3 0.4 nozzle.json index 2797bf8141..71d7c10c97 100644 --- a/resources/profiles/Elegoo/machine/Elegoo Neptune 3 0.4 nozzle.json +++ b/resources/profiles/Elegoo/machine/Elegoo Neptune 3 0.4 nozzle.json @@ -86,7 +86,7 @@ "1" ], "retract_before_wipe": [ - "0%" + "85%" ], "retraction_length": [ "5" diff --git a/resources/profiles/Elegoo/machine/Elegoo Neptune 3 Max 0.4 nozzle.json b/resources/profiles/Elegoo/machine/Elegoo Neptune 3 Max 0.4 nozzle.json index 444ec5061d..3765a26ab3 100644 --- a/resources/profiles/Elegoo/machine/Elegoo Neptune 3 Max 0.4 nozzle.json +++ b/resources/profiles/Elegoo/machine/Elegoo Neptune 3 Max 0.4 nozzle.json @@ -86,7 +86,7 @@ "1" ], "retract_before_wipe": [ - "0%" + "85%" ], "retraction_length": [ "2.5" diff --git a/resources/profiles/Elegoo/machine/Elegoo Neptune 3 Plus 0.4 nozzle.json b/resources/profiles/Elegoo/machine/Elegoo Neptune 3 Plus 0.4 nozzle.json index 307a349215..57c50344de 100644 --- a/resources/profiles/Elegoo/machine/Elegoo Neptune 3 Plus 0.4 nozzle.json +++ b/resources/profiles/Elegoo/machine/Elegoo Neptune 3 Plus 0.4 nozzle.json @@ -86,7 +86,7 @@ "1" ], "retract_before_wipe": [ - "0%" + "85%" ], "retraction_length": [ "2.5" diff --git a/resources/profiles/Elegoo/machine/Elegoo Neptune 3 Pro 0.4 nozzle.json b/resources/profiles/Elegoo/machine/Elegoo Neptune 3 Pro 0.4 nozzle.json index 25f1a5dad6..d658345c85 100644 --- a/resources/profiles/Elegoo/machine/Elegoo Neptune 3 Pro 0.4 nozzle.json +++ b/resources/profiles/Elegoo/machine/Elegoo Neptune 3 Pro 0.4 nozzle.json @@ -86,7 +86,7 @@ "1" ], "retract_before_wipe": [ - "0%" + "85%" ], "retraction_length": [ "2.5" diff --git a/resources/profiles/Elegoo/machine/Elegoo Neptune 4 (0.2 nozzle).json b/resources/profiles/Elegoo/machine/Elegoo Neptune 4 (0.2 nozzle).json index 365566c694..38f45ed36b 100644 --- a/resources/profiles/Elegoo/machine/Elegoo Neptune 4 (0.2 nozzle).json +++ b/resources/profiles/Elegoo/machine/Elegoo Neptune 4 (0.2 nozzle).json @@ -4,7 +4,7 @@ "name": "Elegoo Neptune 4 (0.2 nozzle)", "from": "system", "instantiation": "true", - "inherits": "fdm_elegoo_common", + "inherits": "fdm_neptune_4_common", "printer_model": "Elegoo Neptune 4", "default_print_profile": "0.20mm Standard @Elegoo Neptune4 (0.2 nozzle)", "gcode_flavor": "klipper", @@ -21,21 +21,7 @@ "printable_height": "265", "nozzle_type": "hardened_steel", "auxiliary_fan": "0", - "machine_max_acceleration_e": ["5000", "5000"], - "machine_max_acceleration_extruding": ["20000", "20000"], - "machine_max_acceleration_retracting": ["5000", "5000"], - "machine_max_acceleration_travel": ["20000", "20000"], - "machine_max_acceleration_x": ["20000", "20000"], - "machine_max_acceleration_y": ["20000", "20000"], - "machine_max_acceleration_z": ["500", "200"], - "machine_max_speed_e": ["25", "25"], - "machine_max_speed_x": ["500", "200"], - "machine_max_speed_y": ["500", "200"], - "machine_max_speed_z": ["12", "12"], - "machine_max_jerk_e": ["2.5", "2.5"], - "machine_max_jerk_x": ["12", "12"], - "machine_max_jerk_y": ["12", "12"], - "machine_max_jerk_z": ["0.2", "0.4"], + "max_layer_height": [ "0.16" ], @@ -47,7 +33,7 @@ "1" ], "retract_before_wipe": [ - "0%" + "85%" ], "retraction_length": [ "5" @@ -56,7 +42,7 @@ "2" ], "deretraction_speed": [ - "0" + "45" ], "single_extruder_multi_material": "1", "change_filament_gcode": "", @@ -64,7 +50,7 @@ "default_filament_profile": [ "Elegoo Generic PLA @0.2 nozzle" ], - "machine_start_gcode": "M413 S0 ; disable Power Loss Recovery\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM140 S[bed_temperature_initial_layer_single] ; set final bed temp\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\n;G29 ; run abl mesh\nM420 S1 ; load mesh\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[nozzle_temperature_initial_layer] ; set final nozzle temp\nM190 S[bed_temperature_initial_layer_single] ; wait for bed temp to stabilize\nM109 S[nozzle_temperature_initial_layer] ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0", + "machine_start_gcode": "M413 S0 ; disable Power Loss Recovery\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM140 S[bed_temperature_initial_layer_single] ; set final bed temp\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\n;G29 ; run abl mesh\nM420 S1 ; load mesh\nG1 Z50 F240\nG1 X2 Y10 F3000\n\nM190 S[bed_temperature_initial_layer_single] ; wait for bed temp to stabilize\nM109 S[nozzle_temperature_initial_layer] ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0", "machine_end_gcode": "{if max_layer_z < printable_height}G1 Z{z_offset+min(max_layer_z+2, printable_height)} F600 ; Move print head up{endif}\nG1 X5 Y{print_bed_max[1]*0.8} F{travel_speed*60} ; present print\n{if max_layer_z < printable_height-10}G1 Z{z_offset+min(max_layer_z+70, printable_height-10)} F600 ; Move print head further up{endif}\n{if max_layer_z < printable_height*0.6}G1 Z{printable_height*0.6} F600 ; Move print head further up{endif}\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors", "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\nG92 E0\n;[layer_z]\n\n", "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]", diff --git a/resources/profiles/Elegoo/machine/Elegoo Neptune 4 (0.4 nozzle).json b/resources/profiles/Elegoo/machine/Elegoo Neptune 4 (0.4 nozzle).json index 71d0c3c3df..67797ba22b 100644 --- a/resources/profiles/Elegoo/machine/Elegoo Neptune 4 (0.4 nozzle).json +++ b/resources/profiles/Elegoo/machine/Elegoo Neptune 4 (0.4 nozzle).json @@ -4,7 +4,7 @@ "name": "Elegoo Neptune 4 (0.4 nozzle)", "from": "system", "instantiation": "true", - "inherits": "fdm_elegoo_common", + "inherits": "fdm_neptune_4_common", "printer_model": "Elegoo Neptune 4", "default_print_profile": "0.20mm Standard @Elegoo Neptune4 (0.4 nozzle)", "gcode_flavor": "klipper", @@ -21,21 +21,7 @@ "printable_height": "265", "nozzle_type": "hardened_steel", "auxiliary_fan": "0", - "machine_max_acceleration_e": ["5000", "5000"], - "machine_max_acceleration_extruding": ["20000", "20000"], - "machine_max_acceleration_retracting": ["5000", "5000"], - "machine_max_acceleration_travel": ["20000", "20000"], - "machine_max_acceleration_x": ["20000", "20000"], - "machine_max_acceleration_y": ["20000", "20000"], - "machine_max_acceleration_z": ["500", "200"], - "machine_max_speed_e": ["25", "25"], - "machine_max_speed_x": ["500", "200"], - "machine_max_speed_y": ["500", "200"], - "machine_max_speed_z": ["12", "12"], - "machine_max_jerk_e": ["2.5", "2.5"], - "machine_max_jerk_x": ["12", "12"], - "machine_max_jerk_y": ["12", "12"], - "machine_max_jerk_z": ["0.2", "0.4"], + "max_layer_height": [ "0.32" ], @@ -47,7 +33,7 @@ "1" ], "retract_before_wipe": [ - "0%" + "85%" ], "retraction_length": [ "5" @@ -56,7 +42,7 @@ "2" ], "deretraction_speed": [ - "0" + "45" ], "single_extruder_multi_material": "1", "change_filament_gcode": "", @@ -64,7 +50,7 @@ "default_filament_profile": [ "Elegoo Generic PLA @0.4 nozzle" ], - "machine_start_gcode": "M413 S0 ; disable Power Loss Recovery\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM140 S[bed_temperature_initial_layer_single] ; set final bed temp\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\n;G29 ; run abl mesh\nM420 S1 ; load mesh\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[nozzle_temperature_initial_layer] ; set final nozzle temp\nM190 S[bed_temperature_initial_layer_single] ; wait for bed temp to stabilize\nM109 S[nozzle_temperature_initial_layer] ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0", + "machine_start_gcode": "M413 S0 ; disable Power Loss Recovery\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM140 S[bed_temperature_initial_layer_single] ; set final bed temp\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\n;G29 ; run abl mesh\nM420 S1 ; load mesh\nG1 Z50 F240\nG1 X2 Y10 F3000\n\nM190 S[bed_temperature_initial_layer_single] ; wait for bed temp to stabilize\nM109 S[nozzle_temperature_initial_layer] ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0", "machine_end_gcode": "{if max_layer_z < printable_height}G1 Z{z_offset+min(max_layer_z+2, printable_height)} F600 ; Move print head up{endif}\nG1 X5 Y{print_bed_max[1]*0.8} F{travel_speed*60} ; present print\n{if max_layer_z < printable_height-10}G1 Z{z_offset+min(max_layer_z+70, printable_height-10)} F600 ; Move print head further up{endif}\n{if max_layer_z < printable_height*0.6}G1 Z{printable_height*0.6} F600 ; Move print head further up{endif}\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors", "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\nG92 E0\n;[layer_z]\n\n", "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]", diff --git a/resources/profiles/Elegoo/machine/Elegoo Neptune 4 (0.6 nozzle).json b/resources/profiles/Elegoo/machine/Elegoo Neptune 4 (0.6 nozzle).json index 493cc54567..702c41dda2 100644 --- a/resources/profiles/Elegoo/machine/Elegoo Neptune 4 (0.6 nozzle).json +++ b/resources/profiles/Elegoo/machine/Elegoo Neptune 4 (0.6 nozzle).json @@ -4,7 +4,7 @@ "name": "Elegoo Neptune 4 (0.6 nozzle)", "from": "system", "instantiation": "true", - "inherits": "fdm_elegoo_common", + "inherits": "fdm_neptune_4_common", "printer_model": "Elegoo Neptune 4", "default_print_profile": "0.20mm Standard @Elegoo Neptune4 (0.6 nozzle)", "gcode_flavor": "klipper", @@ -21,21 +21,7 @@ "printable_height": "265", "nozzle_type": "hardened_steel", "auxiliary_fan": "0", - "machine_max_acceleration_e": ["5000", "5000"], - "machine_max_acceleration_extruding": ["20000", "20000"], - "machine_max_acceleration_retracting": ["5000", "5000"], - "machine_max_acceleration_travel": ["20000", "20000"], - "machine_max_acceleration_x": ["20000", "20000"], - "machine_max_acceleration_y": ["20000", "20000"], - "machine_max_acceleration_z": ["500", "200"], - "machine_max_speed_e": ["25", "25"], - "machine_max_speed_x": ["500", "200"], - "machine_max_speed_y": ["500", "200"], - "machine_max_speed_z": ["12", "12"], - "machine_max_jerk_e": ["2.5", "2.5"], - "machine_max_jerk_x": ["12", "12"], - "machine_max_jerk_y": ["12", "12"], - "machine_max_jerk_z": ["0.2", "0.4"], + "max_layer_height": [ "0.4" ], @@ -47,7 +33,7 @@ "1" ], "retract_before_wipe": [ - "0%" + "85%" ], "retraction_length": [ "5" @@ -56,7 +42,7 @@ "2" ], "deretraction_speed": [ - "0" + "45" ], "single_extruder_multi_material": "1", "change_filament_gcode": "", @@ -64,7 +50,7 @@ "default_filament_profile": [ "Elegoo Generic PLA @0.6 nozzle" ], - "machine_start_gcode": "M413 S0 ; disable Power Loss Recovery\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM140 S[bed_temperature_initial_layer_single] ; set final bed temp\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\n;G29 ; run abl mesh\nM420 S1 ; load mesh\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[nozzle_temperature_initial_layer] ; set final nozzle temp\nM190 S[bed_temperature_initial_layer_single] ; wait for bed temp to stabilize\nM109 S[nozzle_temperature_initial_layer] ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0", + "machine_start_gcode": "M413 S0 ; disable Power Loss Recovery\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM140 S[bed_temperature_initial_layer_single] ; set final bed temp\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\n;G29 ; run abl mesh\nM420 S1 ; load mesh\nG1 Z50 F240\nG1 X2 Y10 F3000\n\nM190 S[bed_temperature_initial_layer_single] ; wait for bed temp to stabilize\nM109 S[nozzle_temperature_initial_layer] ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0", "machine_end_gcode": "{if max_layer_z < printable_height}G1 Z{z_offset+min(max_layer_z+2, printable_height)} F600 ; Move print head up{endif}\nG1 X5 Y{print_bed_max[1]*0.8} F{travel_speed*60} ; present print\n{if max_layer_z < printable_height-10}G1 Z{z_offset+min(max_layer_z+70, printable_height-10)} F600 ; Move print head further up{endif}\n{if max_layer_z < printable_height*0.6}G1 Z{printable_height*0.6} F600 ; Move print head further up{endif}\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors", "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\nG92 E0\n;[layer_z]\n\n", "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]", diff --git a/resources/profiles/Elegoo/machine/Elegoo Neptune 4 (0.8 nozzle).json b/resources/profiles/Elegoo/machine/Elegoo Neptune 4 (0.8 nozzle).json index 4dd7423fff..f3db22bf19 100644 --- a/resources/profiles/Elegoo/machine/Elegoo Neptune 4 (0.8 nozzle).json +++ b/resources/profiles/Elegoo/machine/Elegoo Neptune 4 (0.8 nozzle).json @@ -4,7 +4,7 @@ "name": "Elegoo Neptune 4 (0.8 nozzle)", "from": "system", "instantiation": "true", - "inherits": "fdm_elegoo_common", + "inherits": "fdm_neptune_4_common", "printer_model": "Elegoo Neptune 4", "default_print_profile": "0.20mm Standard @Elegoo Neptune4 (0.8 nozzle)", "gcode_flavor": "klipper", @@ -21,21 +21,7 @@ "printable_height": "265", "nozzle_type": "hardened_steel", "auxiliary_fan": "0", - "machine_max_acceleration_e": ["5000", "5000"], - "machine_max_acceleration_extruding": ["20000", "20000"], - "machine_max_acceleration_retracting": ["5000", "5000"], - "machine_max_acceleration_travel": ["20000", "20000"], - "machine_max_acceleration_x": ["20000", "20000"], - "machine_max_acceleration_y": ["20000", "20000"], - "machine_max_acceleration_z": ["500", "200"], - "machine_max_speed_e": ["25", "25"], - "machine_max_speed_x": ["500", "200"], - "machine_max_speed_y": ["500", "200"], - "machine_max_speed_z": ["12", "12"], - "machine_max_jerk_e": ["2.5", "2.5"], - "machine_max_jerk_x": ["12", "12"], - "machine_max_jerk_y": ["12", "12"], - "machine_max_jerk_z": ["0.2", "0.4"], + "max_layer_height": [ "0.6" ], @@ -47,7 +33,7 @@ "1" ], "retract_before_wipe": [ - "0%" + "85%" ], "retraction_length": [ "5" @@ -56,7 +42,7 @@ "2" ], "deretraction_speed": [ - "0" + "45" ], "single_extruder_multi_material": "1", "change_filament_gcode": "", @@ -64,7 +50,7 @@ "default_filament_profile": [ "Elegoo Generic PLA @0.8 nozzle" ], - "machine_start_gcode": "M413 S0 ; disable Power Loss Recovery\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM140 S[bed_temperature_initial_layer_single] ; set final bed temp\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\n;G29 ; run abl mesh\nM420 S1 ; load mesh\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[nozzle_temperature_initial_layer] ; set final nozzle temp\nM190 S[bed_temperature_initial_layer_single] ; wait for bed temp to stabilize\nM109 S[nozzle_temperature_initial_layer] ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0", + "machine_start_gcode": "M413 S0 ; disable Power Loss Recovery\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM140 S[bed_temperature_initial_layer_single] ; set final bed temp\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\n;G29 ; run abl mesh\nM420 S1 ; load mesh\nG1 Z50 F240\nG1 X2 Y10 F3000\n\nM190 S[bed_temperature_initial_layer_single] ; wait for bed temp to stabilize\nM109 S[nozzle_temperature_initial_layer] ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0", "machine_end_gcode": "{if max_layer_z < printable_height}G1 Z{z_offset+min(max_layer_z+2, printable_height)} F600 ; Move print head up{endif}\nG1 X5 Y{print_bed_max[1]*0.8} F{travel_speed*60} ; present print\n{if max_layer_z < printable_height-10}G1 Z{z_offset+min(max_layer_z+70, printable_height-10)} F600 ; Move print head further up{endif}\n{if max_layer_z < printable_height*0.6}G1 Z{printable_height*0.6} F600 ; Move print head further up{endif}\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors", "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\nG92 E0\n;[layer_z]\n\n", "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]", diff --git a/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Max (0.2 nozzle).json b/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Max (0.2 nozzle).json index d202ee8348..166c899a60 100644 --- a/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Max (0.2 nozzle).json +++ b/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Max (0.2 nozzle).json @@ -4,7 +4,7 @@ "name": "Elegoo Neptune 4 Max (0.2 nozzle)", "from": "system", "instantiation": "true", - "inherits": "fdm_elegoo_common", + "inherits": "fdm_neptune_4_common", "printer_model": "Elegoo Neptune 4 Max", "printer_notes": "", "default_print_profile": "0.20mm Standard @Elegoo Neptune4Max (0.6 nozzle)", @@ -18,6 +18,14 @@ "420x420", "0x420" ], + "machine_max_speed_x": [ + "300", + "300" + ], + "machine_max_speed_y": [ + "300", + "300" + ], "printable_height": "480", "nozzle_hrc": "0", "nozzle_type": "brass", @@ -41,23 +49,6 @@ "host_type": "octoprint", "machine_load_filament_time": "0", "machine_unload_filament_time": "0", - "machine_max_acceleration_e": ["3000", "5000"], - "machine_max_acceleration_extruding": ["5000", "20000"], - "machine_max_acceleration_retracting": ["2500", "5000"], - "machine_max_acceleration_travel": ["20000", "500"], - "machine_max_acceleration_x": ["5000", "20000"], - "machine_max_acceleration_y": ["5000", "20000"], - "machine_max_acceleration_z": ["2500", "200"], - "machine_max_speed_e": ["60", "25"], - "machine_max_speed_x": ["300", "200"], - "machine_max_speed_y": ["300", "200"], - "machine_max_speed_z": ["25", "12"], - "machine_max_jerk_e": ["2.5", "5"], - "machine_max_jerk_x": ["8", "12"], - "machine_max_jerk_y": ["8", "12"], - "machine_max_jerk_z": ["0.2", "0.4"], - "machine_min_extruding_rate": ["0", "0"], - "machine_min_travel_rate": ["0","0"], "max_layer_height": [ "0.15" ], @@ -65,7 +56,7 @@ "0.05" ], "printer_settings_id": "Elegoo", - "retract_before_wipe": ["0%"], + "retract_before_wipe": ["85%"], "retract_length_toolchange": ["2"], "deretraction_speed": ["45"], "retract_lift_above": ["0"], @@ -89,7 +80,7 @@ "default_filament_profile": [ "Elegoo Generic PLA @0.2 nozzle" ], - "machine_start_gcode": "M413 S0 ; disable Power Loss Recovery\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM140 S[bed_temperature_initial_layer_single] ; set final bed temp\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[nozzle_temperature_initial_layer] ; set final nozzle temp\nM190 S[bed_temperature_initial_layer_single] ; wait for bed temp to stabilize\nM109 S[nozzle_temperature_initial_layer] ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0", + "machine_start_gcode": "M413 S0 ; disable Power Loss Recovery\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM140 S[bed_temperature_initial_layer_single] ; set final bed temp\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\nG1 Z50 F240\nG1 X2 Y10 F3000\n\nM190 S[bed_temperature_initial_layer_single] ; wait for bed temp to stabilize\nM109 S[nozzle_temperature_initial_layer] ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0", "machine_end_gcode": "{if max_layer_z < printable_height}G1 Z{z_offset+min(max_layer_z+2, printable_height)} F600 ; Move print head up{endif}\nG1 X10 Y{print_bed_max[1]*0.8} F{travel_speed*60} ; present print\n{if max_layer_z < printable_height-10}G1 Z{z_offset+min(max_layer_z+10, printable_height-10)} F600 ; Move print head further up{endif}\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors", "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\nG92 E0\n;[layer_z]\n\n", "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]", diff --git a/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Max (0.4 nozzle).json b/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Max (0.4 nozzle).json index 5a2607ef99..7098e11a3a 100644 --- a/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Max (0.4 nozzle).json +++ b/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Max (0.4 nozzle).json @@ -4,7 +4,7 @@ "name": "Elegoo Neptune 4 Max (0.4 nozzle)", "from": "system", "instantiation": "true", - "inherits": "fdm_elegoo_common", + "inherits": "fdm_neptune_4_common", "printer_model": "Elegoo Neptune 4 Max", "printer_notes": "", "default_print_profile": "0.20mm Standard @Elegoo Neptune4Max (0.6 nozzle)", @@ -41,31 +41,22 @@ "host_type": "octoprint", "machine_load_filament_time": "0", "machine_unload_filament_time": "0", - "machine_max_acceleration_e": ["3000", "5000"], - "machine_max_acceleration_extruding": ["5000", "20000"], - "machine_max_acceleration_retracting": ["2500", "5000"], - "machine_max_acceleration_travel": ["20000", "500"], - "machine_max_acceleration_x": ["5000", "20000"], - "machine_max_acceleration_y": ["5000", "20000"], - "machine_max_acceleration_z": ["2500", "200"], - "machine_max_speed_e": ["60", "25"], - "machine_max_speed_x": ["300", "200"], - "machine_max_speed_y": ["300", "200"], - "machine_max_speed_z": ["25", "12"], - "machine_max_jerk_e": ["2.5", "5"], - "machine_max_jerk_x": ["8", "12"], - "machine_max_jerk_y": ["8", "12"], - "machine_max_jerk_z": ["0.2", "0.4"], - "machine_min_extruding_rate": ["0", "0"], - "machine_min_travel_rate": ["0","0"], "max_layer_height": [ "0.32" ], "min_layer_height": [ - "0.10" + "0.08" + ], + "machine_max_speed_x": [ + "300", + "300" + ], + "machine_max_speed_y": [ + "300", + "300" ], "printer_settings_id": "Elegoo", - "retract_before_wipe": ["0%"], + "retract_before_wipe": ["85%"], "retract_length_toolchange": ["2"], "deretraction_speed": ["45"], "retract_lift_above": ["0"], @@ -89,7 +80,7 @@ "default_filament_profile": [ "Elegoo Generic PLA @0.4 nozzle" ], - "machine_start_gcode": "M413 S0 ; disable Power Loss Recovery\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM140 S[bed_temperature_initial_layer_single] ; set final bed temp\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[nozzle_temperature_initial_layer] ; set final nozzle temp\nM190 S[bed_temperature_initial_layer_single] ; wait for bed temp to stabilize\nM109 S[nozzle_temperature_initial_layer] ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0", + "machine_start_gcode": "M413 S0 ; disable Power Loss Recovery\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM140 S[bed_temperature_initial_layer_single] ; set final bed temp\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\nG1 Z50 F240\nG1 X2 Y10 F3000\n\nM190 S[bed_temperature_initial_layer_single] ; wait for bed temp to stabilize\nM109 S[nozzle_temperature_initial_layer] ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0", "machine_end_gcode": "{if max_layer_z < printable_height}G1 Z{z_offset+min(max_layer_z+2, printable_height)} F600 ; Move print head up{endif}\nG1 X10 Y{print_bed_max[1]*0.8} F{travel_speed*60} ; present print\n{if max_layer_z < printable_height-10}G1 Z{z_offset+min(max_layer_z+10, printable_height-10)} F600 ; Move print head further up{endif}\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors", "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\nG92 E0\n;[layer_z]\n\n", "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]", diff --git a/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Max (0.6 nozzle).json b/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Max (0.6 nozzle).json index 4653b661a5..6e8d6d7a14 100644 --- a/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Max (0.6 nozzle).json +++ b/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Max (0.6 nozzle).json @@ -4,7 +4,7 @@ "name": "Elegoo Neptune 4 Max (0.6 nozzle)", "from": "system", "instantiation": "true", - "inherits": "fdm_elegoo_common", + "inherits": "fdm_neptune_4_common", "printer_model": "Elegoo Neptune 4 Max", "printer_notes": "", "default_print_profile": "0.20mm Standard @Elegoo Neptune4Max (0.6 nozzle)", @@ -18,6 +18,14 @@ "420x420", "0x420" ], + "machine_max_speed_x": [ + "300", + "300" + ], + "machine_max_speed_y": [ + "300", + "300" + ], "printable_height": "480", "nozzle_hrc": "0", "nozzle_type": "brass", @@ -41,23 +49,6 @@ "host_type": "octoprint", "machine_load_filament_time": "0", "machine_unload_filament_time": "0", - "machine_max_acceleration_e": ["3000", "5000"], - "machine_max_acceleration_extruding": ["5000", "20000"], - "machine_max_acceleration_retracting": ["2500", "5000"], - "machine_max_acceleration_travel": ["20000", "500"], - "machine_max_acceleration_x": ["5000", "20000"], - "machine_max_acceleration_y": ["5000", "20000"], - "machine_max_acceleration_z": ["2500", "200"], - "machine_max_speed_e": ["60", "25"], - "machine_max_speed_x": ["300", "200"], - "machine_max_speed_y": ["300", "200"], - "machine_max_speed_z": ["25", "12"], - "machine_max_jerk_e": ["2.5", "5"], - "machine_max_jerk_x": ["8", "12"], - "machine_max_jerk_y": ["8", "12"], - "machine_max_jerk_z": ["0.2", "0.4"], - "machine_min_extruding_rate": ["0", "0"], - "machine_min_travel_rate": ["0","0"], "max_layer_height": [ "0.48" ], @@ -65,7 +56,7 @@ "0.15" ], "printer_settings_id": "Elegoo", - "retract_before_wipe": ["0%"], + "retract_before_wipe": ["85%"], "retract_length_toolchange": ["2"], "deretraction_speed": ["45"], "retract_lift_above": ["0"], @@ -89,7 +80,7 @@ "default_filament_profile": [ "Elegoo Generic PLA @0.6 nozzle" ], - "machine_start_gcode": "M413 S0 ; disable Power Loss Recovery\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM140 S[bed_temperature_initial_layer_single] ; set final bed temp\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[nozzle_temperature_initial_layer] ; set final nozzle temp\nM190 S[bed_temperature_initial_layer_single] ; wait for bed temp to stabilize\nM109 S[nozzle_temperature_initial_layer] ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0", + "machine_start_gcode": "M413 S0 ; disable Power Loss Recovery\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM140 S[bed_temperature_initial_layer_single] ; set final bed temp\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\nG1 Z50 F240\nG1 X2 Y10 F3000\n\nM190 S[bed_temperature_initial_layer_single] ; wait for bed temp to stabilize\nM109 S[nozzle_temperature_initial_layer] ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0", "machine_end_gcode": "{if max_layer_z < printable_height}G1 Z{z_offset+min(max_layer_z+2, printable_height)} F600 ; Move print head up{endif}\nG1 X10 Y{print_bed_max[1]*0.8} F{travel_speed*60} ; present print\n{if max_layer_z < printable_height-10}G1 Z{z_offset+min(max_layer_z+10, printable_height-10)} F600 ; Move print head further up{endif}\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors", "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\nG92 E0\n;[layer_z]\n\n", "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]", diff --git a/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Max (0.8 nozzle).json b/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Max (0.8 nozzle).json index 6b16301f52..c76eff987a 100644 --- a/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Max (0.8 nozzle).json +++ b/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Max (0.8 nozzle).json @@ -4,7 +4,7 @@ "name": "Elegoo Neptune 4 Max (0.8 nozzle)", "from": "system", "instantiation": "true", - "inherits": "fdm_elegoo_common", + "inherits": "fdm_neptune_4_common", "printer_model": "Elegoo Neptune 4 Max", "printer_notes": "", "default_print_profile": "0.20mm Standard @Elegoo Neptune4Max (0.6 nozzle)", @@ -41,31 +41,22 @@ "host_type": "octoprint", "machine_load_filament_time": "0", "machine_unload_filament_time": "0", - "machine_max_acceleration_e": ["3000", "5000"], - "machine_max_acceleration_extruding": ["5000", "20000"], - "machine_max_acceleration_retracting": ["2500", "5000"], - "machine_max_acceleration_travel": ["20000", "500"], - "machine_max_acceleration_x": ["5000", "20000"], - "machine_max_acceleration_y": ["5000", "20000"], - "machine_max_acceleration_z": ["2500", "200"], - "machine_max_speed_e": ["60", "25"], - "machine_max_speed_x": ["300", "200"], - "machine_max_speed_y": ["300", "200"], - "machine_max_speed_z": ["25", "12"], - "machine_max_jerk_e": ["2.5", "5"], - "machine_max_jerk_x": ["8", "12"], - "machine_max_jerk_y": ["8", "12"], - "machine_max_jerk_z": ["0.2", "0.4"], - "machine_min_extruding_rate": ["0", "0"], - "machine_min_travel_rate": ["0","0"], "max_layer_height": [ "0.64" ], "min_layer_height": [ "0.20" ], + "machine_max_speed_x": [ + "300", + "300" + ], + "machine_max_speed_y": [ + "300", + "300" + ], "printer_settings_id": "Elegoo", - "retract_before_wipe": ["0%"], + "retract_before_wipe": ["85%"], "retract_length_toolchange": ["2"], "deretraction_speed": ["45"], "retract_lift_above": ["0"], @@ -89,7 +80,7 @@ "default_filament_profile": [ "Elegoo Generic PLA @0.8 nozzle" ], - "machine_start_gcode": "M413 S0 ; disable Power Loss Recovery\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM140 S[bed_temperature_initial_layer_single] ; set final bed temp\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[nozzle_temperature_initial_layer] ; set final nozzle temp\nM190 S[bed_temperature_initial_layer_single] ; wait for bed temp to stabilize\nM109 S[nozzle_temperature_initial_layer] ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0", + "machine_start_gcode": "M413 S0 ; disable Power Loss Recovery\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM140 S[bed_temperature_initial_layer_single] ; set final bed temp\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\nG1 Z50 F240\nG1 X2 Y10 F3000\n\nM190 S[bed_temperature_initial_layer_single] ; wait for bed temp to stabilize\nM109 S[nozzle_temperature_initial_layer] ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0", "machine_end_gcode": "{if max_layer_z < printable_height}G1 Z{z_offset+min(max_layer_z+2, printable_height)} F600 ; Move print head up{endif}\nG1 X10 Y{print_bed_max[1]*0.8} F{travel_speed*60} ; present print\n{if max_layer_z < printable_height-10}G1 Z{z_offset+min(max_layer_z+10, printable_height-10)} F600 ; Move print head further up{endif}\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors", "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\nG92 E0\n;[layer_z]\n\n", "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]", diff --git a/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Plus (0.2 nozzle).json b/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Plus (0.2 nozzle).json new file mode 100644 index 0000000000..60cf66c0b3 --- /dev/null +++ b/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Plus (0.2 nozzle).json @@ -0,0 +1,94 @@ +{ + "type": "machine", + "setting_id": "GM001", + "name": "Elegoo Neptune 4 Plus (0.2 nozzle)", + "from": "system", + "instantiation": "true", + "inherits": "fdm_neptune_4_common", + "printer_model": "Elegoo Neptune 4 Plus", + "printer_notes": "", + "default_print_profile": "0.20mm Standard @Elegoo Neptune4 Plus (0.2 nozzle)", + "nozzle_diameter": [ + "0.2" + ], + "printer_variant": "0.2", + "printable_area": [ + "0x0", + "320x0", + "320x320", + "0x320" + ], + "printable_height": "385", + "nozzle_hrc": "0", + "nozzle_type": "brass", + "nozzle_volume": "0", + "cooling_tube_length": "5", + "cooling_tube_retraction": "91.5", + "enable_filament_ramming": "1", + "parking_pos_retraction": "92", + "auxiliary_fan": "1", + "extra_loading_move": "-2", + "extruder_clearance_height_to_lid": "380", + "extruder_clearance_height_to_rod": "10", + "extruder_clearance_radius": "60", + "extruder_colour": ["#FCE94F"], + "extruder_offset": ["0x0"], + "fan_kickstart": "0", + "fan_speedup_overhangs": "1", + "fan_speedup_time": "0", + "gcode_flavor": "klipper", + "high_current_on_filament_swap": "0", + "host_type": "octoprint", + "machine_load_filament_time": "0", + "machine_unload_filament_time": "0", + "machine_max_acceleration_e": ["5000", "5000"], + "machine_max_acceleration_extruding": ["7000", "7000"], + "machine_max_acceleration_retracting": ["7000", "7000"], + "machine_max_acceleration_travel": ["7000", "7000"], + "machine_max_acceleration_x": ["7000", "7000"], + "machine_max_acceleration_y": ["7000", "7000"], + "machine_max_acceleration_z": ["300", "300"], + "machine_max_speed_e": ["60", "25"], + "machine_max_speed_x": ["500", "500"], + "machine_max_speed_y": ["500", "500"], + "machine_max_speed_z": ["20", "20"], + "machine_min_extruding_rate": ["0", "0"], + "machine_min_travel_rate": ["0","0"], + "max_layer_height": [ + "0.15" + ], + "min_layer_height": [ + "0.05" + ], + "printer_settings_id": "Elegoo", + "retract_before_wipe": ["85%"], + "retract_length_toolchange": ["2"], + "deretraction_speed": ["45"], + "retract_lift_above": ["0"], + "retract_lift_below": ["0"], + "retract_lift_enforce": ["All Surfaces"], + "retract_restart_extra": ["0"], + "retract_restart_extra_toolchange": ["0"], + "retract_when_changing_layer": ["1"], + "retraction_length": ["0.5"], + "retraction_minimum_travel": ["1"], + "retraction_speed": ["45"], + "use_firmwware_retraction": "0", + "single_extruder_multi_material": "1", + "manual_filament_change": "1", + "use_relative_e_distances": "1", + "wipe": ["1"], + "wipe_distance": ["1"], + "z_hop": ["0.4"], + "z_hop_types": ["Normal Lift"], + "change_filament_gcode": "", + "machine_pause_gcode": "M0", + "default_filament_profile": [ + "Elegoo Generic PLA @0.2 nozzle" + ], + "machine_start_gcode": ";ELEGOO NEPTUNE 4 PLUS\nM220 S100 ;Set the feed speed to 100%\nM221 S100 ;Set the flow rate to 100%\nM104 S140\nM190 s[first_layer_bed_temperature]\nG90\nG28 ;home\nG1 Z10 F300\nG1 X115 Y0 F6000\nG1 Z0 F300\nM109 s[first_layer_temperature]\nG92 E0 ;Reset Extruder\nG1 X115 Y0 Z0.4 F300 ;Move to start position\nG1 X215.0 E30 F400 ;Draw the first line\nG1 Z0.6 F120.0 ;Move to side a little\nG1 X210 F3000\nG92 E0 ;Reset Extruder", + "machine_end_gcode": "G91 ;Relative positionning\nG1 E-2 F2700 ;Retract a bit\nG1 E-8 X5 Y5 Z3 F3000 ;Retract\nG90 ;Absolute positionning\nG1 X10 Y300 F6000;Finish print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\nM84 X Y E ;Disable all steppers but Z", + "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\nG92 E0\n;[layer_z]\n\n", + "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]", + "scan_first_layer": "0" +} \ No newline at end of file diff --git a/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Plus (0.4 nozzle).json b/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Plus (0.4 nozzle).json new file mode 100644 index 0000000000..6e087821d8 --- /dev/null +++ b/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Plus (0.4 nozzle).json @@ -0,0 +1,94 @@ +{ + "type": "machine", + "setting_id": "GM001", + "name": "Elegoo Neptune 4 Plus (0.4 nozzle)", + "from": "system", + "instantiation": "true", + "inherits": "fdm_neptune_4_common", + "printer_model": "Elegoo Neptune 4 Plus", + "printer_notes": "", + "default_print_profile": "0.20mm Standard @Elegoo Neptune4 Plus (0.4 nozzle)", + "nozzle_diameter": [ + "0.4" + ], + "printer_variant": "0.4", + "printable_area": [ + "0x0", + "320x0", + "320x320", + "0x320" + ], + "printable_height": "385", + "nozzle_hrc": "0", + "nozzle_type": "brass", + "nozzle_volume": "0", + "cooling_tube_length": "5", + "cooling_tube_retraction": "91.5", + "enable_filament_ramming": "1", + "parking_pos_retraction": "92", + "auxiliary_fan": "1", + "extra_loading_move": "-2", + "extruder_clearance_height_to_lid": "380", + "extruder_clearance_height_to_rod": "10", + "extruder_clearance_radius": "60", + "extruder_colour": ["#FCE94F"], + "extruder_offset": ["0x0"], + "fan_kickstart": "0", + "fan_speedup_overhangs": "1", + "fan_speedup_time": "0", + "gcode_flavor": "klipper", + "high_current_on_filament_swap": "0", + "host_type": "octoprint", + "machine_load_filament_time": "0", + "machine_unload_filament_time": "0", + "machine_max_acceleration_e": ["5000", "5000"], + "machine_max_acceleration_extruding": ["7000", "7000"], + "machine_max_acceleration_retracting": ["7000", "7000"], + "machine_max_acceleration_travel": ["7000", "7000"], + "machine_max_acceleration_x": ["7000", "7000"], + "machine_max_acceleration_y": ["7000", "7000"], + "machine_max_acceleration_z": ["300", "300"], + "machine_max_speed_e": ["60", "25"], + "machine_max_speed_x": ["500", "500"], + "machine_max_speed_y": ["500", "500"], + "machine_max_speed_z": ["20", "20"], + "machine_min_extruding_rate": ["0", "0"], + "machine_min_travel_rate": ["0","0"], + "max_layer_height": [ + "0.32" + ], + "min_layer_height": [ + "0.08" + ], + "printer_settings_id": "Elegoo", + "retract_before_wipe": ["85%"], + "retract_length_toolchange": ["2"], + "deretraction_speed": ["45"], + "retract_lift_above": ["0"], + "retract_lift_below": ["0"], + "retract_lift_enforce": ["All Surfaces"], + "retract_restart_extra": ["0"], + "retract_restart_extra_toolchange": ["0"], + "retract_when_changing_layer": ["1"], + "retraction_length": ["0.5"], + "retraction_minimum_travel": ["1"], + "retraction_speed": ["45"], + "use_firmwware_retraction": "0", + "single_extruder_multi_material": "1", + "manual_filament_change": "1", + "use_relative_e_distances": "1", + "wipe": ["1"], + "wipe_distance": ["1"], + "z_hop": ["0.4"], + "z_hop_types": ["Normal Lift"], + "change_filament_gcode": "", + "machine_pause_gcode": "M0", + "default_filament_profile": [ + "Elegoo Generic PLA @0.4 nozzle" + ], + "machine_start_gcode": ";ELEGOO NEPTUNE 4 PLUS\nM220 S100 ;Set the feed speed to 100%\nM221 S100 ;Set the flow rate to 100%\nM104 S140\nM190 s[first_layer_bed_temperature]\nG90\nG28 ;home\nG1 Z10 F300\nG1 X115 Y0 F6000\nG1 Z0 F300\nM109 s[first_layer_temperature]\nG92 E0 ;Reset Extruder\nG1 X115 Y0 Z0.4 F300 ;Move to start position\nG1 X215.0 E30 F400 ;Draw the first line\nG1 Z0.6 F120.0 ;Move to side a little\nG1 X210 F3000\nG92 E0 ;Reset Extruder", + "machine_end_gcode": "G91 ;Relative positionning\nG1 E-2 F2700 ;Retract a bit\nG1 E-8 X5 Y5 Z3 F3000 ;Retract\nG90 ;Absolute positionning\nG1 X10 Y300 F6000;Finish print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\nM84 X Y E ;Disable all steppers but Z", + "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\nG92 E0\n;[layer_z]\n\n", + "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]", + "scan_first_layer": "0" +} \ No newline at end of file diff --git a/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Plus (0.6 nozzle).json b/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Plus (0.6 nozzle).json new file mode 100644 index 0000000000..c5e5fc3f8b --- /dev/null +++ b/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Plus (0.6 nozzle).json @@ -0,0 +1,94 @@ +{ + "type": "machine", + "setting_id": "GM001", + "name": "Elegoo Neptune 4 Plus (0.6 nozzle)", + "from": "system", + "instantiation": "true", + "inherits": "fdm_neptune_4_common", + "printer_model": "Elegoo Neptune 4 Plus", + "printer_notes": "", + "default_print_profile": "0.20mm Standard @Elegoo Neptune4 Plus (0.6 nozzle)", + "nozzle_diameter": [ + "0.6" + ], + "printer_variant": "0.6", + "printable_area": [ + "0x0", + "320x0", + "320x320", + "0x320" + ], + "printable_height": "385", + "nozzle_hrc": "0", + "nozzle_type": "brass", + "nozzle_volume": "0", + "cooling_tube_length": "5", + "cooling_tube_retraction": "91.5", + "enable_filament_ramming": "1", + "parking_pos_retraction": "92", + "auxiliary_fan": "1", + "extra_loading_move": "-2", + "extruder_clearance_height_to_lid": "380", + "extruder_clearance_height_to_rod": "10", + "extruder_clearance_radius": "60", + "extruder_colour": ["#FCE94F"], + "extruder_offset": ["0x0"], + "fan_kickstart": "0", + "fan_speedup_overhangs": "1", + "fan_speedup_time": "0", + "gcode_flavor": "klipper", + "high_current_on_filament_swap": "0", + "host_type": "octoprint", + "machine_load_filament_time": "0", + "machine_unload_filament_time": "0", + "machine_max_acceleration_e": ["5000", "5000"], + "machine_max_acceleration_extruding": ["7000", "7000"], + "machine_max_acceleration_retracting": ["7000", "7000"], + "machine_max_acceleration_travel": ["7000", "7000"], + "machine_max_acceleration_x": ["7000", "7000"], + "machine_max_acceleration_y": ["7000", "7000"], + "machine_max_acceleration_z": ["300", "300"], + "machine_max_speed_e": ["60", "25"], + "machine_max_speed_x": ["300", "200"], + "machine_max_speed_y": ["300", "200"], + "machine_max_speed_z": ["25", "12"], + "machine_min_extruding_rate": ["0", "0"], + "machine_min_travel_rate": ["0","0"], + "max_layer_height": [ + "0.48" + ], + "min_layer_height": [ + "0.15" + ], + "printer_settings_id": "Elegoo", + "retract_before_wipe": ["85%"], + "retract_length_toolchange": ["2"], + "deretraction_speed": ["45"], + "retract_lift_above": ["0"], + "retract_lift_below": ["0"], + "retract_lift_enforce": ["All Surfaces"], + "retract_restart_extra": ["0"], + "retract_restart_extra_toolchange": ["0"], + "retract_when_changing_layer": ["1"], + "retraction_length": ["0.5"], + "retraction_minimum_travel": ["1"], + "retraction_speed": ["45"], + "use_firmwware_retraction": "0", + "single_extruder_multi_material": "1", + "manual_filament_change": "1", + "use_relative_e_distances": "1", + "wipe": ["1"], + "wipe_distance": ["1"], + "z_hop": ["0.4"], + "z_hop_types": ["Normal Lift"], + "change_filament_gcode": "", + "machine_pause_gcode": "M0", + "default_filament_profile": [ + "Elegoo Generic PLA @0.6 nozzle" + ], + "machine_start_gcode": ";ELEGOO NEPTUNE 4 PLUS\nM220 S100 ;Set the feed speed to 100%\nM221 S100 ;Set the flow rate to 100%\nM104 S140\nM190 s[first_layer_bed_temperature]\nG90\nG28 ;home\nG1 Z10 F300\nG1 X115 Y0 F6000\nG1 Z0 F300\nM109 s[first_layer_temperature]\nG92 E0 ;Reset Extruder\nG1 X115 Y0 Z0.4 F300 ;Move to start position\nG1 X215.0 E30 F400 ;Draw the first line\nG1 Z0.6 F120.0 ;Move to side a little\nG1 X210 F3000\nG92 E0 ;Reset Extruder", + "machine_end_gcode": "G91 ;Relative positionning\nG1 E-2 F2700 ;Retract a bit\nG1 E-8 X5 Y5 Z3 F3000 ;Retract\nG90 ;Absolute positionning\nG1 X10 Y300 F6000;Finish print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\nM84 X Y E ;Disable all steppers but Z", + "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\nG92 E0\n;[layer_z]\n\n", + "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]", + "scan_first_layer": "0" +} \ No newline at end of file diff --git a/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Plus (0.8 nozzle).json b/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Plus (0.8 nozzle).json new file mode 100644 index 0000000000..0d1664faa1 --- /dev/null +++ b/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Plus (0.8 nozzle).json @@ -0,0 +1,94 @@ +{ + "type": "machine", + "setting_id": "GM001", + "name": "Elegoo Neptune 4 Plus (0.8 nozzle)", + "from": "system", + "instantiation": "true", + "inherits": "fdm_neptune_4_common", + "printer_model": "Elegoo Neptune 4 Plus", + "printer_notes": "", + "default_print_profile": "0.20mm Standard @Elegoo Neptune4 Plus (0.8 nozzle)", + "nozzle_diameter": [ + "0.8" + ], + "printer_variant": "0.8", + "printable_area": [ + "0x0", + "320x0", + "320x320", + "0x320" + ], + "printable_height": "385", + "nozzle_hrc": "0", + "nozzle_type": "brass", + "nozzle_volume": "0", + "cooling_tube_length": "5", + "cooling_tube_retraction": "91.5", + "enable_filament_ramming": "1", + "parking_pos_retraction": "92", + "auxiliary_fan": "1", + "extra_loading_move": "-2", + "extruder_clearance_height_to_lid": "380", + "extruder_clearance_height_to_rod": "10", + "extruder_clearance_radius": "60", + "extruder_colour": ["#FCE94F"], + "extruder_offset": ["0x0"], + "fan_kickstart": "0", + "fan_speedup_overhangs": "1", + "fan_speedup_time": "0", + "gcode_flavor": "klipper", + "high_current_on_filament_swap": "0", + "host_type": "octoprint", + "machine_load_filament_time": "0", + "machine_unload_filament_time": "0", + "machine_max_acceleration_e": ["5000", "5000"], + "machine_max_acceleration_extruding": ["7000", "7000"], + "machine_max_acceleration_retracting": ["7000", "7000"], + "machine_max_acceleration_travel": ["7000", "7000"], + "machine_max_acceleration_x": ["7000", "7000"], + "machine_max_acceleration_y": ["7000", "7000"], + "machine_max_acceleration_z": ["300", "300"], + "machine_max_speed_e": ["60", "25"], + "machine_max_speed_x": ["300", "200"], + "machine_max_speed_y": ["300", "200"], + "machine_max_speed_z": ["25", "12"], + "machine_min_extruding_rate": ["0", "0"], + "machine_min_travel_rate": ["0","0"], + "max_layer_height": [ + "0.64" + ], + "min_layer_height": [ + "0.20" + ], + "printer_settings_id": "Elegoo", + "retract_before_wipe": ["85%"], + "retract_length_toolchange": ["2"], + "deretraction_speed": ["45"], + "retract_lift_above": ["0"], + "retract_lift_below": ["0"], + "retract_lift_enforce": ["All Surfaces"], + "retract_restart_extra": ["0"], + "retract_restart_extra_toolchange": ["0"], + "retract_when_changing_layer": ["1"], + "retraction_length": ["0.5"], + "retraction_minimum_travel": ["1"], + "retraction_speed": ["45"], + "use_firmwware_retraction": "0", + "single_extruder_multi_material": "1", + "manual_filament_change": "1", + "use_relative_e_distances": "1", + "wipe": ["1"], + "wipe_distance": ["1"], + "z_hop": ["0.4"], + "z_hop_types": ["Normal Lift"], + "change_filament_gcode": "", + "machine_pause_gcode": "M0", + "default_filament_profile": [ + "Elegoo Generic PLA @0.8 nozzle" + ], + "machine_start_gcode": ";ELEGOO NEPTUNE 4 PLUS\nM220 S100 ;Set the feed speed to 100%\nM221 S100 ;Set the flow rate to 100%\nM104 S140\nM190 s[first_layer_bed_temperature]\nG90\nG28 ;home\nG1 Z10 F300\nG1 X115 Y0 F6000\nG1 Z0 F300\nM109 s[first_layer_temperature]\nG92 E0 ;Reset Extruder\nG1 X115 Y0 Z0.4 F300 ;Move to start position\nG1 X215.0 E30 F400 ;Draw the first line\nG1 Z0.6 F120.0 ;Move to side a little\nG1 X210 F3000\nG92 E0 ;Reset Extruder", + "machine_end_gcode": "G91 ;Relative positionning\nG1 E-2 F2700 ;Retract a bit\nG1 E-8 X5 Y5 Z3 F3000 ;Retract\nG90 ;Absolute positionning\nG1 X10 Y300 F6000;Finish print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\nM84 X Y E ;Disable all steppers but Z", + "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\nG92 E0\n;[layer_z]\n\n", + "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]", + "scan_first_layer": "0" +} \ No newline at end of file diff --git a/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Plus.json b/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Plus.json new file mode 100644 index 0000000000..9d60ea7ac9 --- /dev/null +++ b/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Plus.json @@ -0,0 +1,13 @@ +{ + "type": "machine_model", + "name": "Elegoo Neptune 4 Plus", + "model_id": "Elegoo-Neptune-4-Plus", + "nozzle_diameter": "0.2;0.4;0.6;0.8", + "machine_tech": "FFF", + "family": "Elegoo", + "bed_model": "elegoo_neptune4plus_buildplate_model.stl", + "bed_texture": "elegoo_neptune4plus_buildplate_texture.png", + "bed_exclude_area": ["0x0"], + "hotend_model": "", + "default_materials": "Elegoo Generic PLA @0.2 nozzle;Elegoo Generic PETG @0.2 nozzle;Elegoo Generic ABS @0.2 nozzle;Elegoo Generic PLA @0.4 nozzle;Elegoo Generic PETG @0.4 nozzle;Elegoo Generic ABS @0.4 nozzle;Elegoo Generic PLA @0.6 nozzle;Elegoo Generic PETG @0.6 nozzle;Elegoo Generic ABS @0.6 nozzle;Elegoo Generic PLA @0.8 nozzle;Elegoo Generic PETG @0.8 nozzle;Elegoo Generic ABS @0.8 nozzle" +} diff --git a/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Pro (0.2 nozzle).json b/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Pro (0.2 nozzle).json index 08f4a9dbdc..7fd23f6f26 100644 --- a/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Pro (0.2 nozzle).json +++ b/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Pro (0.2 nozzle).json @@ -4,7 +4,7 @@ "name": "Elegoo Neptune 4 Pro (0.2 nozzle)", "from": "system", "instantiation": "true", - "inherits": "fdm_elegoo_common", + "inherits": "fdm_neptune_4_common", "printer_model": "Elegoo Neptune 4 Pro", "default_print_profile": "0.20mm Standard @Elegoo Neptune4Pro (0.2 nozzle)", "gcode_flavor": "klipper", @@ -21,21 +21,7 @@ "printable_height": "265", "nozzle_type": "hardened_steel", "auxiliary_fan": "0", - "machine_max_acceleration_e": ["5000", "5000"], - "machine_max_acceleration_extruding": ["20000", "20000"], - "machine_max_acceleration_retracting": ["5000", "5000"], - "machine_max_acceleration_travel": ["20000", "20000"], - "machine_max_acceleration_x": ["20000", "20000"], - "machine_max_acceleration_y": ["20000", "20000"], - "machine_max_acceleration_z": ["500", "200"], - "machine_max_speed_e": ["25", "25"], - "machine_max_speed_x": ["500", "200"], - "machine_max_speed_y": ["500", "200"], - "machine_max_speed_z": ["12", "12"], - "machine_max_jerk_e": ["2.5", "2.5"], - "machine_max_jerk_x": ["12", "12"], - "machine_max_jerk_y": ["12", "12"], - "machine_max_jerk_z": ["0.2", "0.4"], + "max_layer_height": [ "0.16" ], @@ -47,19 +33,19 @@ "1" ], "retract_before_wipe": [ - "0%" + "85%" ], "retraction_length": [ - "2.5" + "0.8" ], "retraction_speed": [ - "25" + "60" ], "retract_length_toolchange": [ "2" ], "deretraction_speed": [ - "0" + "45" ], "single_extruder_multi_material": "1", "change_filament_gcode": "", @@ -67,7 +53,7 @@ "default_filament_profile": [ "Elegoo Generic PLA @0.2 nozzle" ], - "machine_start_gcode": "M413 S0 ; disable Power Loss Recovery\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM140 S[bed_temperature_initial_layer_single] ; set final bed temp\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\n;G29 ; run abl mesh\nM420 S1 ; load mesh\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[nozzle_temperature_initial_layer] ; set final nozzle temp\nM190 S[bed_temperature_initial_layer_single] ; wait for bed temp to stabilize\nM109 S[nozzle_temperature_initial_layer] ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0", + "machine_start_gcode": "M413 S0 ; disable Power Loss Recovery\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM140 S[bed_temperature_initial_layer_single] ; set final bed temp\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\n;G29 ; run abl mesh\nM420 S1 ; load mesh\nG1 Z50 F240\nG1 X2 Y10 F3000\n\nM190 S[bed_temperature_initial_layer_single] ; wait for bed temp to stabilize\nM109 S[nozzle_temperature_initial_layer] ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0", "machine_end_gcode": "{if max_layer_z < printable_height}G1 Z{z_offset+min(max_layer_z+2, printable_height)} F600 ; Move print head up{endif}\nG1 X5 Y{print_bed_max[1]*0.8} F{travel_speed*60} ; present print\n{if max_layer_z < printable_height-10}G1 Z{z_offset+min(max_layer_z+70, printable_height-10)} F600 ; Move print head further up{endif}\n{if max_layer_z < printable_height*0.6}G1 Z{printable_height*0.6} F600 ; Move print head further up{endif}\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors", "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\nG92 E0\n;[layer_z]\n\n", "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]", diff --git a/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Pro (0.4 nozzle).json b/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Pro (0.4 nozzle).json index a0583b06b8..39839831a6 100644 --- a/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Pro (0.4 nozzle).json +++ b/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Pro (0.4 nozzle).json @@ -4,7 +4,7 @@ "name": "Elegoo Neptune 4 Pro (0.4 nozzle)", "from": "system", "instantiation": "true", - "inherits": "fdm_elegoo_common", + "inherits": "fdm_neptune_4_common", "printer_model": "Elegoo Neptune 4 Pro", "default_print_profile": "0.20mm Standard @Elegoo Neptune4Pro (0.4 nozzle)", "gcode_flavor": "klipper", @@ -21,21 +21,7 @@ "printable_height": "265", "nozzle_type": "hardened_steel", "auxiliary_fan": "0", - "machine_max_acceleration_e": ["5000", "5000"], - "machine_max_acceleration_extruding": ["20000", "20000"], - "machine_max_acceleration_retracting": ["5000", "5000"], - "machine_max_acceleration_travel": ["20000", "20000"], - "machine_max_acceleration_x": ["20000", "20000"], - "machine_max_acceleration_y": ["20000", "20000"], - "machine_max_acceleration_z": ["500", "200"], - "machine_max_speed_e": ["25", "25"], - "machine_max_speed_x": ["500", "200"], - "machine_max_speed_y": ["500", "200"], - "machine_max_speed_z": ["12", "12"], - "machine_max_jerk_e": ["2.5", "2.5"], - "machine_max_jerk_x": ["12", "12"], - "machine_max_jerk_y": ["12", "12"], - "machine_max_jerk_z": ["0.2", "0.4"], + "max_layer_height": [ "0.32" ], @@ -47,19 +33,19 @@ "1" ], "retract_before_wipe": [ - "0%" + "85%" ], "retraction_length": [ - "2.5" + "0.8" ], "retraction_speed": [ - "25" + "60" ], "retract_length_toolchange": [ "2" ], "deretraction_speed": [ - "0" + "45" ], "single_extruder_multi_material": "1", "change_filament_gcode": "", @@ -67,7 +53,7 @@ "default_filament_profile": [ "Elegoo Generic PLA @0.4 nozzle" ], - "machine_start_gcode": "M413 S0 ; disable Power Loss Recovery\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM140 S[bed_temperature_initial_layer_single] ; set final bed temp\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\n;G29 ; run abl mesh\nM420 S1 ; load mesh\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[nozzle_temperature_initial_layer] ; set final nozzle temp\nM190 S[bed_temperature_initial_layer_single] ; wait for bed temp to stabilize\nM109 S[nozzle_temperature_initial_layer] ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0", + "machine_start_gcode": "M413 S0 ; disable Power Loss Recovery\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM140 S[bed_temperature_initial_layer_single] ; set final bed temp\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\n;G29 ; run abl mesh\nM420 S1 ; load mesh\nG1 Z50 F240\nG1 X2 Y10 F3000\n\nM190 S[bed_temperature_initial_layer_single] ; wait for bed temp to stabilize\nM109 S[nozzle_temperature_initial_layer] ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0", "machine_end_gcode": "{if max_layer_z < printable_height}G1 Z{z_offset+min(max_layer_z+2, printable_height)} F600 ; Move print head up{endif}\nG1 X5 Y{print_bed_max[1]*0.8} F{travel_speed*60} ; present print\n{if max_layer_z < printable_height-10}G1 Z{z_offset+min(max_layer_z+70, printable_height-10)} F600 ; Move print head further up{endif}\n{if max_layer_z < printable_height*0.6}G1 Z{printable_height*0.6} F600 ; Move print head further up{endif}\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors", "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\nG92 E0\n;[layer_z]\n\n", "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]", diff --git a/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Pro (0.6 nozzle).json b/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Pro (0.6 nozzle).json index 6078a9544b..c3fcd7f312 100644 --- a/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Pro (0.6 nozzle).json +++ b/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Pro (0.6 nozzle).json @@ -4,7 +4,7 @@ "name": "Elegoo Neptune 4 Pro (0.6 nozzle)", "from": "system", "instantiation": "true", - "inherits": "fdm_elegoo_common", + "inherits": "fdm_neptune_4_common", "printer_model": "Elegoo Neptune 4 Pro", "default_print_profile": "0.20mm Standard @Elegoo Neptune4Pro (0.6 nozzle)", "gcode_flavor": "klipper", @@ -14,35 +14,21 @@ "printable_height": "265", "nozzle_type": "hardened_steel", "auxiliary_fan": "0", - "machine_max_acceleration_e": ["5000", "5000"], - "machine_max_acceleration_extruding": ["20000", "20000"], - "machine_max_acceleration_retracting": ["5000", "5000"], - "machine_max_acceleration_travel": ["20000", "20000"], - "machine_max_acceleration_x": ["20000", "20000"], - "machine_max_acceleration_y": ["20000", "20000"], - "machine_max_acceleration_z": ["500", "200"], - "machine_max_speed_e": ["25", "25"], - "machine_max_speed_x": ["500", "200"], - "machine_max_speed_y": ["500", "200"], - "machine_max_speed_z": ["12", "12"], - "machine_max_jerk_e": ["2.5", "2.5"], - "machine_max_jerk_x": ["12", "12"], - "machine_max_jerk_y": ["12", "12"], - "machine_max_jerk_z": ["0.2", "0.4"], + "max_layer_height": ["0.4"], "min_layer_height": ["0.08"], "printer_settings_id": "Elegoo", "retraction_minimum_travel": ["1"], - "retract_before_wipe": ["0%"], + "retract_before_wipe": ["85%"], "retraction_length": ["2.5"], - "retraction_speed": ["25"], + "retraction_speed": ["60"], "retract_length_toolchange": ["2"], - "deretraction_speed": ["0"], + "deretraction_speed": ["45"], "single_extruder_multi_material": "1", "change_filament_gcode": "", "machine_pause_gcode": "M0", "default_filament_profile": ["Elegoo Generic PLA @0.6 nozzle"], - "machine_start_gcode": "M413 S0 ; disable Power Loss Recovery\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM140 S[bed_temperature_initial_layer_single] ; set final bed temp\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\n;G29 ; run abl mesh\nM420 S1 ; load mesh\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[nozzle_temperature_initial_layer] ; set final nozzle temp\nM190 S[bed_temperature_initial_layer_single] ; wait for bed temp to stabilize\nM109 S[nozzle_temperature_initial_layer] ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0", + "machine_start_gcode": "M413 S0 ; disable Power Loss Recovery\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM140 S[bed_temperature_initial_layer_single] ; set final bed temp\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\n;G29 ; run abl mesh\nM420 S1 ; load mesh\nG1 Z50 F240\nG1 X2 Y10 F3000\n\nM190 S[bed_temperature_initial_layer_single] ; wait for bed temp to stabilize\nM109 S[nozzle_temperature_initial_layer] ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0", "machine_end_gcode": "{if max_layer_z < printable_height}G1 Z{z_offset+min(max_layer_z+2, printable_height)} F600 ; Move print head up{endif}\nG1 X5 Y{print_bed_max[1]*0.8} F{travel_speed*60} ; present print\n{if max_layer_z < printable_height-10}G1 Z{z_offset+min(max_layer_z+70, printable_height-10)} F600 ; Move print head further up{endif}\n{if max_layer_z < printable_height*0.6}G1 Z{printable_height*0.6} F600 ; Move print head further up{endif}\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors", "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\nG92 E0\n;[layer_z]\n\n", "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]", diff --git a/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Pro (0.8 nozzle).json b/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Pro (0.8 nozzle).json index cd5add019d..c1b8d18645 100644 --- a/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Pro (0.8 nozzle).json +++ b/resources/profiles/Elegoo/machine/Elegoo Neptune 4 Pro (0.8 nozzle).json @@ -4,7 +4,7 @@ "name": "Elegoo Neptune 4 Pro (0.8 nozzle)", "from": "system", "instantiation": "true", - "inherits": "fdm_elegoo_common", + "inherits": "fdm_neptune_4_common", "printer_model": "Elegoo Neptune 4 Pro", "gcode_flavor": "klipper", "default_print_profile": "0.20mm Standard @Elegoo Neptune4Pro (0.8 nozzle)", @@ -33,16 +33,16 @@ "min_layer_height": ["0.08"], "printer_settings_id": "Elegoo", "retraction_minimum_travel": ["1"], - "retract_before_wipe": ["0%"], - "retraction_length": ["2.5"], - "retraction_speed": ["25"], + "retract_before_wipe": ["85%"], + "retraction_length": ["0.8"], + "retraction_speed": ["60"], "retract_length_toolchange": ["2"], - "deretraction_speed": ["0"], + "deretraction_speed": ["45"], "single_extruder_multi_material": "1", "change_filament_gcode": "", "machine_pause_gcode": "M0", "default_filament_profile": ["Elegoo Generic PLA @0.8 nozzle"], - "machine_start_gcode": "M413 S0 ; disable Power Loss Recovery\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM140 S[bed_temperature_initial_layer_single] ; set final bed temp\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\n;G29 ; run abl mesh\nM420 S1 ; load mesh\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[nozzle_temperature_initial_layer] ; set final nozzle temp\nM190 S[bed_temperature_initial_layer_single] ; wait for bed temp to stabilize\nM109 S[nozzle_temperature_initial_layer] ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0", + "machine_start_gcode": "M413 S0 ; disable Power Loss Recovery\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM140 S[bed_temperature_initial_layer_single] ; set final bed temp\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\n;G29 ; run abl mesh\nM420 S1 ; load mesh\nG1 Z50 F240\nG1 X2 Y10 F3000\n\nM190 S[bed_temperature_initial_layer_single] ; wait for bed temp to stabilize\nM109 S[nozzle_temperature_initial_layer] ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0", "machine_end_gcode": "{if max_layer_z < printable_height}G1 Z{z_offset+min(max_layer_z+2, printable_height)} F600 ; Move print head up{endif}\nG1 X5 Y{print_bed_max[1]*0.8} F{travel_speed*60} ; present print\n{if max_layer_z < printable_height-10}G1 Z{z_offset+min(max_layer_z+70, printable_height-10)} F600 ; Move print head further up{endif}\n{if max_layer_z < printable_height*0.6}G1 Z{printable_height*0.6} F600 ; Move print head further up{endif}\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors", "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\nG92 E0\n;[layer_z]\n\n", "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]", diff --git a/resources/profiles/Elegoo/machine/fdm_elegoo_common.json b/resources/profiles/Elegoo/machine/fdm_elegoo_common.json index faf8c95938..a392c821da 100644 --- a/resources/profiles/Elegoo/machine/fdm_elegoo_common.json +++ b/resources/profiles/Elegoo/machine/fdm_elegoo_common.json @@ -30,8 +30,8 @@ "500" ], "machine_max_acceleration_z": [ - "100", - "100" + "200", + "200" ], "machine_max_speed_e": [ "60", diff --git a/resources/profiles/Elegoo/machine/fdm_machine_common.json b/resources/profiles/Elegoo/machine/fdm_machine_common.json index a1dc826252..9b1e374c0e 100644 --- a/resources/profiles/Elegoo/machine/fdm_machine_common.json +++ b/resources/profiles/Elegoo/machine/fdm_machine_common.json @@ -31,7 +31,7 @@ "500" ], "machine_max_acceleration_z": [ - "100" + "500" ], "machine_max_speed_e": [ "60" diff --git a/resources/profiles/Elegoo/machine/fdm_neptune_4_common.json b/resources/profiles/Elegoo/machine/fdm_neptune_4_common.json new file mode 100644 index 0000000000..48e18c656a --- /dev/null +++ b/resources/profiles/Elegoo/machine/fdm_neptune_4_common.json @@ -0,0 +1,146 @@ +{ + "type": "machine", + "name": "fdm_neptune_4_common", + "from": "system", + "instantiation": "false", + "inherits": "fdm_elegoo_common", + "gcode_flavor": "klipper", + "machine_max_acceleration_extruding": [ + "10000", + "10000" + ], + "machine_max_acceleration_retracting": [ + "10000", + "10000" + ], + "machine_max_acceleration_x": [ + "10000", + "10000" + ], + "machine_max_acceleration_y": [ + "10000", + "10000" + ], + "machine_max_speed_z": [ + "12", + "12" + ], + "machine_max_acceleration_e": [ + "5000", + "5000" + ], + "machine_max_acceleration_travel": [ + "10000", + "10000" + ], + "machine_max_jerk_x": [ + "9", + "9" + ], + "machine_max_jerk_y": [ + "9", + "9" + ], + "machine_max_acceleration_z": [ + "500", + "500" + ], + "machine_max_speed_e": [ + "60", + "60" + ], + "machine_max_speed_x": [ + "500", + "500" + ], + "machine_max_speed_y": [ + "500", + "500" + ], + "machine_max_jerk_e": [ + "5", + "5" + ], + "machine_max_jerk_z": [ + "0.4", + "0.4" + ], + "machine_min_extruding_rate": [ + "0", + "0" + ], + "machine_min_travel_rate": [ + "0", + "0" + ], + "max_layer_height": [ + "0.32" + ], + "min_layer_height": [ + "0.08" + ], + "printable_height": "280", + "extruder_clearance_radius": "47", + "extruder_clearance_height_to_rod": "34", + "extruder_clearance_height_to_lid": "34", + "printer_settings_id": "", + "printer_technology": "FFF", + "printer_variant": "0.4", + "retraction_minimum_travel": [ + "2" + ], + "retract_before_wipe": [ + "70%" + ], + "retract_when_changing_layer": [ + "1" + ], + "retraction_length": [ + "5" + ], + "retract_length_toolchange": [ + "2" + ], + "z_hop": [ + "0.4" + ], + "retract_restart_extra": [ + "0" + ], + "retract_restart_extra_toolchange": [ + "0" + ], + "retraction_speed": [ + "60" + ], + "deretraction_speed": [ + "40" + ], + "bridge_speed": "25", + "internal_bridge_speed" : "70", + "silent_mode": "0", + "single_extruder_multi_material": "1", + "change_filament_gcode": "", + "machine_pause_gcode": "M25 ;pause print", + "wipe": [ + "1" + ], + "default_filament_profile": [ + "Elegoo Generic PLA" + ], + "default_print_profile": "", + "bed_exclude_area": [ + "0x0" + ], + "machine_start_gcode": "", + "machine_end_gcode": "", + "layer_change_gcode": "", + "scan_first_layer": "0", + "nozzle_type": "undefine", + "auxiliary_fan": "0", + "thumbnails": [ + "320x320", + "160x160" + ], + "thumbnails_format": "ColPic" +} diff --git a/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4 (0.2 nozzle).json b/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4 (0.2 nozzle).json index 4556c964c2..8c0d224646 100644 --- a/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4 (0.2 nozzle).json +++ b/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4 (0.2 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.08mm Extra Fine @Elegoo Neptune4 (0.2 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.08", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "9", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.22", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.25", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.2", "top_shell_layers": "11", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4 (0.4 nozzle).json b/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4 (0.4 nozzle).json index 84abe15401..10a5912c2c 100644 --- a/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4 (0.4 nozzle).json +++ b/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4 (0.4 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.08mm Extra Fine @Elegoo Neptune4 (0.4 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.08", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "9", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.42", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.45", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.38", "top_shell_layers": "11", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4 (0.6 nozzle).json b/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4 (0.6 nozzle).json index d46a31a17f..ef65fe8243 100644 --- a/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4 (0.6 nozzle).json +++ b/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4 (0.6 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.08mm Extra Fine @Elegoo Neptune4 (0.6 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.08", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "9", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.62", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.65", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.56", "top_shell_layers": "11", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4 (0.8 nozzle).json b/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4 (0.8 nozzle).json index 782f685d87..4706ab2596 100644 --- a/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4 (0.8 nozzle).json +++ b/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4 (0.8 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.08mm Extra Fine @Elegoo Neptune4 (0.8 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.08", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "9", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.82", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.85", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.78", "top_shell_layers": "11", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4 Plus (0.2 nozzle).json b/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4 Plus (0.2 nozzle).json new file mode 100644 index 0000000000..ad8090ce49 --- /dev/null +++ b/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4 Plus (0.2 nozzle).json @@ -0,0 +1,26 @@ +{ + "type": "process", + "setting_id": "GP004", + "name": "0.08mm Extra Fine @Elegoo Neptune4 Plus (0.2 nozzle)", + "from": "system", + "inherits": "fdm_process_neptune4_common", + "instantiation": "true", + "layer_height": "0.08", + "bottom_shell_layers": "9", + "outer_wall_line_width": "0.2", + "line_width": "0.2", + "initial_layer_line_width": "0.22", + "sparse_infill_line_width": "0.25", + "inner_wall_line_width": "0.25", + "internal_solid_infill_line_width": "0.25", + "resolution": "0.012", + "support_top_z_distance": "0.08", + "support_line_width": "0.2", + "support_interface_spacing": "0.2", + "top_surface_line_width": "0.2", + "top_shell_layers": "11", + "top_shell_thickness": "0.8", + "compatible_printers": [ + "Elegoo Neptune 4 Plus (0.2 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4 Plus (0.4 nozzle).json b/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4 Plus (0.4 nozzle).json new file mode 100644 index 0000000000..eaae92be56 --- /dev/null +++ b/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4 Plus (0.4 nozzle).json @@ -0,0 +1,26 @@ +{ + "type": "process", + "setting_id": "GP004", + "name": "0.08mm Extra Fine @Elegoo Neptune4 Plus (0.4 nozzle)", + "from": "system", + "inherits": "fdm_process_neptune4_common", + "instantiation": "true", + "layer_height": "0.08", + "bottom_shell_layers": "9", + "outer_wall_line_width": "0.4", + "line_width": "0.4", + "initial_layer_line_width": "0.42", + "sparse_infill_line_width": "0.45", + "inner_wall_line_width": "0.45", + "internal_solid_infill_line_width": "0.45", + "resolution": "0.012", + "support_top_z_distance": "0.08", + "support_line_width": "0.38", + "support_interface_spacing": "0.2", + "top_surface_line_width": "0.38", + "top_shell_layers": "11", + "top_shell_thickness": "0.8", + "compatible_printers": [ + "Elegoo Neptune 4 Plus (0.4 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4 Plus (0.6 nozzle).json b/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4 Plus (0.6 nozzle).json new file mode 100644 index 0000000000..77fc3af91e --- /dev/null +++ b/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4 Plus (0.6 nozzle).json @@ -0,0 +1,26 @@ +{ + "type": "process", + "setting_id": "GP004", + "name": "0.08mm Extra Fine @Elegoo Neptune4 Plus (0.6 nozzle)", + "from": "system", + "inherits": "fdm_process_neptune4_common", + "instantiation": "true", + "layer_height": "0.08", + "bottom_shell_layers": "9", + "outer_wall_line_width": "0.6", + "line_width": "0.6", + "initial_layer_line_width": "0.62", + "sparse_infill_line_width": "0.65", + "inner_wall_line_width": "0.65", + "internal_solid_infill_line_width": "0.65", + "resolution": "0.012", + "support_top_z_distance": "0.08", + "support_line_width": "0.55", + "support_interface_spacing": "0.2", + "top_surface_line_width": "0.56", + "top_shell_layers": "11", + "top_shell_thickness": "0.8", + "compatible_printers": [ + "Elegoo Neptune 4 Plus (0.6 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4 Plus (0.8 nozzle).json b/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4 Plus (0.8 nozzle).json new file mode 100644 index 0000000000..5128e9369c --- /dev/null +++ b/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4 Plus (0.8 nozzle).json @@ -0,0 +1,26 @@ +{ + "type": "process", + "setting_id": "GP004", + "name": "0.08mm Extra Fine @Elegoo Neptune4 Plus (0.8 nozzle)", + "from": "system", + "inherits": "fdm_process_neptune4_common", + "instantiation": "true", + "layer_height": "0.08", + "bottom_shell_layers": "9", + "outer_wall_line_width": "0.8", + "line_width": "0.8", + "initial_layer_line_width": "0.82", + "sparse_infill_line_width": "0.85", + "inner_wall_line_width": "0.85", + "internal_solid_infill_line_width": "0.85", + "resolution": "0.012", + "support_top_z_distance": "0.08", + "support_line_width": "0.78", + "support_interface_spacing": "0.2", + "top_surface_line_width": "0.78", + "top_shell_layers": "11", + "top_shell_thickness": "0.8", + "compatible_printers": [ + "Elegoo Neptune 4 Plus (0.8 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4Max (0.2 nozzle).json b/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4Max (0.2 nozzle).json index 4c8635daeb..e06676560c 100644 --- a/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4Max (0.2 nozzle).json +++ b/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4Max (0.2 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.08mm Extra Fine @Elegoo Neptune4Max (0.2 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4max_common", "instantiation": "true", "layer_height": "0.08", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "9", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.22", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -44,14 +36,11 @@ "ironing_flow": "15%", "ironing_spacing": "0.1", "ironing_speed": "15", + "travel_speed": "300", "ironing_type": "no ironing", "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.25", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +79,6 @@ "top_surface_line_width": "0.2", "top_shell_layers": "11", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4Max (0.4 nozzle).json b/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4Max (0.4 nozzle).json index d2e15d55a0..cb38d8f590 100644 --- a/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4Max (0.4 nozzle).json +++ b/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4Max (0.4 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.08mm Extra Fine @Elegoo Neptune4Max (0.4 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4max_common", "instantiation": "true", "layer_height": "0.08", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "9", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.42", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -44,14 +36,11 @@ "ironing_flow": "15%", "ironing_spacing": "0.1", "ironing_speed": "15", + "travel_speed": "300", "ironing_type": "no ironing", "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.45", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +79,6 @@ "top_surface_line_width": "0.38", "top_shell_layers": "11", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4Max (0.6 nozzle).json b/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4Max (0.6 nozzle).json index c643d51d16..21174abd99 100644 --- a/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4Max (0.6 nozzle).json +++ b/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4Max (0.6 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.08mm Extra Fine @Elegoo Neptune4Max (0.6 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4max_common", "instantiation": "true", "layer_height": "0.08", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "9", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.62", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -44,14 +36,11 @@ "ironing_flow": "15%", "ironing_spacing": "0.1", "ironing_speed": "15", + "travel_speed": "300", "ironing_type": "no ironing", "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.65", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +79,6 @@ "top_surface_line_width": "0.56", "top_shell_layers": "11", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4Max (0.8 nozzle).json b/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4Max (0.8 nozzle).json index db5bb88d2d..98b1e7aa41 100644 --- a/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4Max (0.8 nozzle).json +++ b/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4Max (0.8 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.08mm Extra Fine @Elegoo Neptune4Max (0.8 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4max_common", "instantiation": "true", "layer_height": "0.08", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "9", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.82", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -44,14 +36,11 @@ "ironing_flow": "15%", "ironing_spacing": "0.1", "ironing_speed": "15", + "travel_speed": "300", "ironing_type": "no ironing", "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.85", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +79,6 @@ "top_surface_line_width": "0.78", "top_shell_layers": "11", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4Pro (0.2 nozzle).json b/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4Pro (0.2 nozzle).json index 3cae030fc2..9f0a4e1fc3 100644 --- a/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4Pro (0.2 nozzle).json +++ b/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4Pro (0.2 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.08mm Extra Fine @Elegoo Neptune4Pro (0.2 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.08", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "9", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.22", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.25", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.2", "top_shell_layers": "11", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4Pro (0.4 nozzle).json b/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4Pro (0.4 nozzle).json index 4a12f13ef4..41fe9cbc3b 100644 --- a/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4Pro (0.4 nozzle).json +++ b/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4Pro (0.4 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.08mm Extra Fine @Elegoo Neptune4Pro (0.4 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.08", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "9", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.42", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.45", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.38", "top_shell_layers": "11", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4Pro (0.6 nozzle).json b/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4Pro (0.6 nozzle).json index e7cea8a66a..0803d18037 100644 --- a/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4Pro (0.6 nozzle).json +++ b/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4Pro (0.6 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.08mm Extra Fine @Elegoo Neptune4Pro (0.6 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.08", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "9", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.62", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.65", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.56", "top_shell_layers": "11", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4Pro (0.8 nozzle).json b/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4Pro (0.8 nozzle).json index bec352efa4..bcf08edbcc 100644 --- a/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4Pro (0.8 nozzle).json +++ b/resources/profiles/Elegoo/process/0.08mm Extra Fine @Elegoo Neptune4Pro (0.8 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.08mm Extra Fine @Elegoo Neptune4Pro (0.8 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.08", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "9", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.82", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.85", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.78", "top_shell_layers": "11", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4 (0.2 nozzle).json b/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4 (0.2 nozzle).json index 138bbdb589..ef1414f069 100644 --- a/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4 (0.2 nozzle).json +++ b/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4 (0.2 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.12mm Fine @Elegoo Neptune4 (0.2 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.12", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "6", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.22", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.25", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.2", "top_shell_layers": "7", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4 (0.4 nozzle).json b/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4 (0.4 nozzle).json index 32c6227d74..3f585caab2 100644 --- a/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4 (0.4 nozzle).json +++ b/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4 (0.4 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.12mm Fine @Elegoo Neptune4 (0.4 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.12", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "6", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.42", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.45", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.38", "top_shell_layers": "7", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4 (0.6 nozzle).json b/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4 (0.6 nozzle).json index 0ba7a4bd76..a009da29eb 100644 --- a/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4 (0.6 nozzle).json +++ b/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4 (0.6 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.12mm Fine @Elegoo Neptune4 (0.6 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.12", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "6", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.62", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.65", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.56", "top_shell_layers": "7", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4 (0.8 nozzle).json b/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4 (0.8 nozzle).json index 7da98bee3b..aaf50deefd 100644 --- a/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4 (0.8 nozzle).json +++ b/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4 (0.8 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.12mm Fine @Elegoo Neptune4 (0.8 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.12", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "6", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.82", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.85", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.78", "top_shell_layers": "7", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4 Plus (0.2 nozzle).json b/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4 Plus (0.2 nozzle).json new file mode 100644 index 0000000000..a4050cefa0 --- /dev/null +++ b/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4 Plus (0.2 nozzle).json @@ -0,0 +1,26 @@ +{ + "type": "process", + "setting_id": "GP004", + "name": "0.12mm Fine @Elegoo Neptune4 Plus (0.2 nozzle)", + "from": "system", + "inherits": "fdm_process_neptune4_common", + "instantiation": "true", + "layer_height": "0.12", + "bottom_shell_layers": "6", + "outer_wall_line_width": "0.2", + "line_width": "0.2", + "initial_layer_line_width": "0.22", + "sparse_infill_line_width": "0.25", + "inner_wall_line_width": "0.25", + "internal_solid_infill_line_width": "0.25", + "resolution": "0.012", + "support_top_z_distance": "0.12", + "support_line_width": "0.2", + "support_interface_spacing": "0.2", + "top_surface_line_width": "0.2", + "top_shell_layers": "7", + "top_shell_thickness": "0.8", + "compatible_printers": [ + "Elegoo Neptune 4 Plus (0.2 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4 Plus (0.4 nozzle).json b/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4 Plus (0.4 nozzle).json new file mode 100644 index 0000000000..6b1db1cb62 --- /dev/null +++ b/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4 Plus (0.4 nozzle).json @@ -0,0 +1,26 @@ +{ + "type": "process", + "setting_id": "GP004", + "name": "0.12mm Fine @Elegoo Neptune4 Plus (0.4 nozzle)", + "from": "system", + "inherits": "fdm_process_neptune4_common", + "instantiation": "true", + "layer_height": "0.12", + "bottom_shell_layers": "6", + "outer_wall_line_width": "0.4", + "line_width": "0.4", + "initial_layer_line_width": "0.42", + "sparse_infill_line_width": "0.45", + "inner_wall_line_width": "0.45", + "internal_solid_infill_line_width": "0.45", + "resolution": "0.012", + "support_top_z_distance": "0.12", + "support_line_width": "0.38", + "support_interface_spacing": "0.2", + "top_surface_line_width": "0.38", + "top_shell_layers": "7", + "top_shell_thickness": "0.8", + "compatible_printers": [ + "Elegoo Neptune 4 Plus (0.4 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4 Plus (0.6 nozzle).json b/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4 Plus (0.6 nozzle).json new file mode 100644 index 0000000000..84b626a899 --- /dev/null +++ b/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4 Plus (0.6 nozzle).json @@ -0,0 +1,26 @@ +{ + "type": "process", + "setting_id": "GP004", + "name": "0.12mm Fine @Elegoo Neptune4 Plus (0.6 nozzle)", + "from": "system", + "inherits": "fdm_process_neptune4_common", + "instantiation": "true", + "layer_height": "0.12", + "bottom_shell_layers": "6", + "outer_wall_line_width": "0.6", + "line_width": "0.6", + "initial_layer_line_width": "0.62", + "sparse_infill_line_width": "0.65", + "inner_wall_line_width": "0.65", + "internal_solid_infill_line_width": "0.65", + "resolution": "0.012", + "support_top_z_distance": "0.12", + "support_line_width": "0.55", + "support_interface_spacing": "0.2", + "top_surface_line_width": "0.56", + "top_shell_layers": "7", + "top_shell_thickness": "0.8", + "compatible_printers": [ + "Elegoo Neptune 4 Plus (0.6 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4 Plus (0.8 nozzle).json b/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4 Plus (0.8 nozzle).json new file mode 100644 index 0000000000..397cebf592 --- /dev/null +++ b/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4 Plus (0.8 nozzle).json @@ -0,0 +1,26 @@ +{ + "type": "process", + "setting_id": "GP004", + "name": "0.12mm Fine @Elegoo Neptune4 Plus (0.8 nozzle)", + "from": "system", + "inherits": "fdm_process_neptune4_common", + "instantiation": "true", + "layer_height": "0.12", + "bottom_shell_layers": "6", + "outer_wall_line_width": "0.8", + "line_width": "0.8", + "initial_layer_line_width": "0.82", + "sparse_infill_line_width": "0.85", + "inner_wall_line_width": "0.85", + "internal_solid_infill_line_width": "0.85", + "resolution": "0.012", + "support_top_z_distance": "0.12", + "support_line_width": "0.78", + "support_interface_spacing": "0.2", + "top_surface_line_width": "0.78", + "top_shell_layers": "7", + "top_shell_thickness": "0.8", + "compatible_printers": [ + "Elegoo Neptune 4 Plus (0.8 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4Max (0.2 nozzle).json b/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4Max (0.2 nozzle).json index 658cecab1f..41f12f0f02 100644 --- a/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4Max (0.2 nozzle).json +++ b/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4Max (0.2 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.12mm Fine @Elegoo Neptune4Max (0.2 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4max_common", "instantiation": "true", "layer_height": "0.12", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "6", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.22", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -44,14 +36,11 @@ "ironing_flow": "15%", "ironing_spacing": "0.1", "ironing_speed": "15", + "travel_speed": "300", "ironing_type": "no ironing", "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.25", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +79,6 @@ "top_surface_line_width": "0.2", "top_shell_layers": "7", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4Max (0.4 nozzle).json b/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4Max (0.4 nozzle).json index 5f825466a3..401e4fc217 100644 --- a/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4Max (0.4 nozzle).json +++ b/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4Max (0.4 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.12mm Fine @Elegoo Neptune4Max (0.4 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4max_common", "instantiation": "true", "layer_height": "0.12", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "6", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.42", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -44,14 +36,11 @@ "ironing_flow": "15%", "ironing_spacing": "0.1", "ironing_speed": "15", + "travel_speed": "300", "ironing_type": "no ironing", "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.45", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +79,6 @@ "top_surface_line_width": "0.38", "top_shell_layers": "7", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4Max (0.6 nozzle).json b/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4Max (0.6 nozzle).json index 658bd3bc10..3da84ebf49 100644 --- a/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4Max (0.6 nozzle).json +++ b/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4Max (0.6 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.12mm Fine @Elegoo Neptune4Max (0.6 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4max_common", "instantiation": "true", "layer_height": "0.12", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "6", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.62", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -44,14 +36,11 @@ "ironing_flow": "15%", "ironing_spacing": "0.1", "ironing_speed": "15", + "travel_speed": "300", "ironing_type": "no ironing", "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.65", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +79,6 @@ "top_surface_line_width": "0.56", "top_shell_layers": "7", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4Max (0.8 nozzle).json b/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4Max (0.8 nozzle).json index 300d5e2f62..4f5ffceb57 100644 --- a/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4Max (0.8 nozzle).json +++ b/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4Max (0.8 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.12mm Fine @Elegoo Neptune4Max (0.8 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4max_common", "instantiation": "true", "layer_height": "0.12", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "6", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.82", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -44,14 +36,11 @@ "ironing_flow": "15%", "ironing_spacing": "0.1", "ironing_speed": "15", + "travel_speed": "300", "ironing_type": "no ironing", "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.85", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +79,6 @@ "top_surface_line_width": "0.78", "top_shell_layers": "7", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4Pro (0.2 nozzle).json b/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4Pro (0.2 nozzle).json index c7175ac814..a3f24129ab 100644 --- a/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4Pro (0.2 nozzle).json +++ b/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4Pro (0.2 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.12mm Fine @Elegoo Neptune4Pro (0.2 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.12", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "6", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.22", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.25", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.2", "top_shell_layers": "7", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4Pro (0.4 nozzle).json b/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4Pro (0.4 nozzle).json index 81888d682f..37c42c6663 100644 --- a/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4Pro (0.4 nozzle).json +++ b/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4Pro (0.4 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.12mm Fine @Elegoo Neptune4Pro (0.4 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.12", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "6", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.42", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.45", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.38", "top_shell_layers": "7", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4Pro (0.6 nozzle).json b/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4Pro (0.6 nozzle).json index 0288331fa1..7addbe460f 100644 --- a/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4Pro (0.6 nozzle).json +++ b/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4Pro (0.6 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.12mm Fine @Elegoo Neptune4Pro (0.6 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.12", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "6", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.62", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.65", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.56", "top_shell_layers": "7", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4Pro (0.8 nozzle).json b/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4Pro (0.8 nozzle).json index c0a72cae82..e713c1dce6 100644 --- a/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4Pro (0.8 nozzle).json +++ b/resources/profiles/Elegoo/process/0.12mm Fine @Elegoo Neptune4Pro (0.8 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.12mm Fine @Elegoo Neptune4Pro (0.8 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.12", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "6", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.82", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.85", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.78", "top_shell_layers": "7", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4 (0.2 nozzle).json b/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4 (0.2 nozzle).json index 956448c979..2741157aa3 100644 --- a/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4 (0.2 nozzle).json +++ b/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4 (0.2 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.16mm Optimal @Elegoo Neptune4 (0.2 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.16", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "4", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.22", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.25", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.2", "top_shell_layers": "5", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4 (0.4 nozzle).json b/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4 (0.4 nozzle).json index 3f487722d8..05b1c10d53 100644 --- a/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4 (0.4 nozzle).json +++ b/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4 (0.4 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.16mm Optimal @Elegoo Neptune4 (0.4 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.16", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "4", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.42", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.45", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.38", "top_shell_layers": "5", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4 (0.6 nozzle).json b/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4 (0.6 nozzle).json index 963407efa1..69b4cccac1 100644 --- a/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4 (0.6 nozzle).json +++ b/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4 (0.6 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.16mm Optimal @Elegoo Neptune4 (0.6 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.16", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "4", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.62", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.65", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.56", "top_shell_layers": "5", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4 (0.8 nozzle).json b/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4 (0.8 nozzle).json index 1f5a5249ec..4a8a6a10f6 100644 --- a/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4 (0.8 nozzle).json +++ b/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4 (0.8 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.16mm Optimal @Elegoo Neptune4 (0.8 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.16", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "4", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.82", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.85", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.78", "top_shell_layers": "5", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4 Plus (0.2 nozzle).json b/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4 Plus (0.2 nozzle).json new file mode 100644 index 0000000000..d3ca633a14 --- /dev/null +++ b/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4 Plus (0.2 nozzle).json @@ -0,0 +1,26 @@ +{ + "type": "process", + "setting_id": "GP004", + "name": "0.16mm Optimal @Elegoo Neptune4 Plus (0.2 nozzle)", + "from": "system", + "inherits": "fdm_process_neptune4_common", + "instantiation": "true", + "layer_height": "0.16", + "bottom_shell_layers": "4", + "outer_wall_line_width": "0.2", + "line_width": "0.2", + "initial_layer_line_width": "0.22", + "sparse_infill_line_width": "0.25", + "inner_wall_line_width": "0.25", + "internal_solid_infill_line_width": "0.25", + "resolution": "0.012", + "support_top_z_distance": "0.16", + "support_line_width": "0.2", + "support_interface_spacing": "0.2", + "top_surface_line_width": "0.2", + "top_shell_layers": "5", + "top_shell_thickness": "0.8", + "compatible_printers": [ + "Elegoo Neptune 4 Plus (0.2 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4 Plus (0.4 nozzle).json b/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4 Plus (0.4 nozzle).json new file mode 100644 index 0000000000..aecd0bdb9b --- /dev/null +++ b/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4 Plus (0.4 nozzle).json @@ -0,0 +1,26 @@ +{ + "type": "process", + "setting_id": "GP004", + "name": "0.16mm Optimal @Elegoo Neptune4 Plus (0.4 nozzle)", + "from": "system", + "inherits": "fdm_process_neptune4_common", + "instantiation": "true", + "layer_height": "0.16", + "bottom_shell_layers": "4", + "outer_wall_line_width": "0.4", + "line_width": "0.4", + "initial_layer_line_width": "0.42", + "sparse_infill_line_width": "0.45", + "inner_wall_line_width": "0.45", + "internal_solid_infill_line_width": "0.45", + "resolution": "0.012", + "support_top_z_distance": "0.16", + "support_line_width": "0.38", + "support_interface_spacing": "0.2", + "top_surface_line_width": "0.38", + "top_shell_layers": "5", + "top_shell_thickness": "0.8", + "compatible_printers": [ + "Elegoo Neptune 4 Plus (0.4 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4 Plus (0.6 nozzle).json b/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4 Plus (0.6 nozzle).json new file mode 100644 index 0000000000..44f3e16829 --- /dev/null +++ b/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4 Plus (0.6 nozzle).json @@ -0,0 +1,26 @@ +{ + "type": "process", + "setting_id": "GP004", + "name": "0.16mm Optimal @Elegoo Neptune4 Plus (0.6 nozzle)", + "from": "system", + "inherits": "fdm_process_neptune4_common", + "instantiation": "true", + "layer_height": "0.16", + "bottom_shell_layers": "4", + "outer_wall_line_width": "0.6", + "line_width": "0.6", + "initial_layer_line_width": "0.62", + "sparse_infill_line_width": "0.65", + "inner_wall_line_width": "0.65", + "internal_solid_infill_line_width": "0.65", + "resolution": "0.012", + "support_top_z_distance": "0.16", + "support_line_width": "0.55", + "support_interface_spacing": "0.2", + "top_surface_line_width": "0.56", + "top_shell_layers": "5", + "top_shell_thickness": "0.8", + "compatible_printers": [ + "Elegoo Neptune 4 Plus (0.6 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4 Plus (0.8 nozzle).json b/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4 Plus (0.8 nozzle).json new file mode 100644 index 0000000000..78c4cf1c33 --- /dev/null +++ b/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4 Plus (0.8 nozzle).json @@ -0,0 +1,26 @@ +{ + "type": "process", + "setting_id": "GP004", + "name": "0.16mm Optimal @Elegoo Neptune4 Plus (0.8 nozzle)", + "from": "system", + "inherits": "fdm_process_neptune4_common", + "instantiation": "true", + "layer_height": "0.16", + "bottom_shell_layers": "4", + "outer_wall_line_width": "0.8", + "line_width": "0.8", + "initial_layer_line_width": "0.82", + "sparse_infill_line_width": "0.85", + "inner_wall_line_width": "0.85", + "internal_solid_infill_line_width": "0.85", + "resolution": "0.012", + "support_top_z_distance": "0.16", + "support_line_width": "0.78", + "support_interface_spacing": "0.2", + "top_surface_line_width": "0.78", + "top_shell_layers": "5", + "top_shell_thickness": "0.8", + "compatible_printers": [ + "Elegoo Neptune 4 Plus (0.8 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4Max (0.2 nozzle).json b/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4Max (0.2 nozzle).json index 1648da1e22..79fb839db3 100644 --- a/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4Max (0.2 nozzle).json +++ b/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4Max (0.2 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.16mm Optimal @Elegoo Neptune4Max (0.2 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4max_common", "instantiation": "true", "layer_height": "0.16", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "4", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.22", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -44,14 +36,11 @@ "ironing_flow": "15%", "ironing_spacing": "0.1", "ironing_speed": "15", + "travel_speed": "300", "ironing_type": "no ironing", "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.25", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +79,6 @@ "top_surface_line_width": "0.2", "top_shell_layers": "5", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4Max (0.4 nozzle).json b/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4Max (0.4 nozzle).json index 550c71182e..1587ad552b 100644 --- a/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4Max (0.4 nozzle).json +++ b/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4Max (0.4 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.16mm Optimal @Elegoo Neptune4Max (0.4 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4max_common", "instantiation": "true", "layer_height": "0.16", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "4", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.42", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -44,14 +36,11 @@ "ironing_flow": "15%", "ironing_spacing": "0.1", "ironing_speed": "15", + "travel_speed": "300", "ironing_type": "no ironing", "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.45", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +79,6 @@ "top_surface_line_width": "0.38", "top_shell_layers": "5", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4Max (0.6 nozzle).json b/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4Max (0.6 nozzle).json index a6b1220931..8f2d254baa 100644 --- a/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4Max (0.6 nozzle).json +++ b/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4Max (0.6 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.16mm Optimal @Elegoo Neptune4Max (0.6 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4max_common", "instantiation": "true", "layer_height": "0.16", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "4", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.62", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -44,14 +36,11 @@ "ironing_flow": "15%", "ironing_spacing": "0.1", "ironing_speed": "15", + "travel_speed": "300", "ironing_type": "no ironing", "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.65", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +79,6 @@ "top_surface_line_width": "0.56", "top_shell_layers": "5", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4Max (0.8 nozzle).json b/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4Max (0.8 nozzle).json index 4d97255b0a..6f37cb8756 100644 --- a/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4Max (0.8 nozzle).json +++ b/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4Max (0.8 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.16mm Optimal @Elegoo Neptune4Max (0.8 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4max_common", "instantiation": "true", "layer_height": "0.16", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "4", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.82", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -44,14 +36,11 @@ "ironing_flow": "15%", "ironing_spacing": "0.1", "ironing_speed": "15", + "travel_speed": "300", "ironing_type": "no ironing", "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.85", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +79,6 @@ "top_surface_line_width": "0.78", "top_shell_layers": "5", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4Pro (0.2 nozzle).json b/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4Pro (0.2 nozzle).json index 3c068b3ee2..510a17fda2 100644 --- a/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4Pro (0.2 nozzle).json +++ b/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4Pro (0.2 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.16mm Optimal @Elegoo Neptune4Pro (0.2 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.16", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "4", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.22", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.25", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.2", "top_shell_layers": "5", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4Pro (0.4 nozzle).json b/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4Pro (0.4 nozzle).json index d1c9d936f9..644e78490b 100644 --- a/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4Pro (0.4 nozzle).json +++ b/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4Pro (0.4 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.16mm Optimal @Elegoo Neptune4Pro (0.4 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.16", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "4", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.42", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.45", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.38", "top_shell_layers": "5", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4Pro (0.6 nozzle).json b/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4Pro (0.6 nozzle).json index 06b2ef84cd..bc8d7ecb57 100644 --- a/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4Pro (0.6 nozzle).json +++ b/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4Pro (0.6 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.16mm Optimal @Elegoo Neptune4Pro (0.6 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.16", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "4", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.62", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.65", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.56", "top_shell_layers": "5", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4Pro (0.8 nozzle).json b/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4Pro (0.8 nozzle).json index bc8cffd377..a94a77f35b 100644 --- a/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4Pro (0.8 nozzle).json +++ b/resources/profiles/Elegoo/process/0.16mm Optimal @Elegoo Neptune4Pro (0.8 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.16mm Optimal @Elegoo Neptune4Pro (0.8 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.16", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "4", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.82", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.85", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.78", "top_shell_layers": "5", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune.json b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune.json index 9669986b2c..c0ca9ac7e3 100644 --- a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune.json +++ b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune.json @@ -10,7 +10,7 @@ "reduce_crossing_wall": "0", "max_travel_detour_distance": "0", "bottom_surface_pattern": "monotonic", - "bottom_shell_layers": "4", + "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", "bridge_speed": "25", @@ -86,7 +86,7 @@ "detect_thin_wall": "0", "top_surface_pattern": "monotonic", "top_surface_line_width": "0.38", - "top_shell_layers": "5", + "top_shell_layers": "4", "top_shell_thickness": "0.8", "initial_layer_speed": "20", "initial_layer_infill_speed": "20", diff --git a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune2.json b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune2.json index cb9a62acda..37fde48d04 100644 --- a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune2.json +++ b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune2.json @@ -10,7 +10,7 @@ "reduce_crossing_wall": "0", "max_travel_detour_distance": "0", "bottom_surface_pattern": "monotonic", - "bottom_shell_layers": "4", + "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", "bridge_speed": "25", @@ -86,7 +86,7 @@ "detect_thin_wall": "0", "top_surface_pattern": "monotonic", "top_surface_line_width": "0.38", - "top_shell_layers": "5", + "top_shell_layers": "4", "top_shell_thickness": "0.8", "initial_layer_speed": "20", "initial_layer_infill_speed": "20", diff --git a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune2D.json b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune2D.json index 33aab6f6ad..fe84b11aa6 100644 --- a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune2D.json +++ b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune2D.json @@ -10,7 +10,7 @@ "reduce_crossing_wall": "0", "max_travel_detour_distance": "0", "bottom_surface_pattern": "monotonic", - "bottom_shell_layers": "4", + "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", "bridge_speed": "25", @@ -86,7 +86,7 @@ "detect_thin_wall": "0", "top_surface_pattern": "monotonic", "top_surface_line_width": "0.38", - "top_shell_layers": "5", + "top_shell_layers": "4", "top_shell_thickness": "0.8", "initial_layer_speed": "20", "initial_layer_infill_speed": "20", diff --git a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune2S.json b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune2S.json index 9ad7f54833..af3f7ad675 100644 --- a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune2S.json +++ b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune2S.json @@ -10,7 +10,7 @@ "reduce_crossing_wall": "0", "max_travel_detour_distance": "0", "bottom_surface_pattern": "monotonic", - "bottom_shell_layers": "4", + "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", "bridge_speed": "25", @@ -86,7 +86,7 @@ "detect_thin_wall": "0", "top_surface_pattern": "monotonic", "top_surface_line_width": "0.38", - "top_shell_layers": "5", + "top_shell_layers": "4", "top_shell_thickness": "0.8", "initial_layer_speed": "20", "initial_layer_infill_speed": "20", diff --git a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune3.json b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune3.json index af0576a51c..7af032bde2 100644 --- a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune3.json +++ b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune3.json @@ -10,7 +10,7 @@ "reduce_crossing_wall": "0", "max_travel_detour_distance": "0", "bottom_surface_pattern": "monotonic", - "bottom_shell_layers": "4", + "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", "bridge_speed": "25", @@ -86,7 +86,7 @@ "detect_thin_wall": "0", "top_surface_pattern": "monotonic", "top_surface_line_width": "0.38", - "top_shell_layers": "5", + "top_shell_layers": "4", "top_shell_thickness": "0.8", "initial_layer_speed": "20", "initial_layer_infill_speed": "20", diff --git a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune3Max.json b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune3Max.json index ec157e0842..419aab1794 100644 --- a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune3Max.json +++ b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune3Max.json @@ -10,7 +10,7 @@ "reduce_crossing_wall": "0", "max_travel_detour_distance": "0", "bottom_surface_pattern": "monotonic", - "bottom_shell_layers": "4", + "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", "bridge_speed": "25", @@ -86,7 +86,7 @@ "detect_thin_wall": "0", "top_surface_pattern": "monotonic", "top_surface_line_width": "0.38", - "top_shell_layers": "5", + "top_shell_layers": "4", "top_shell_thickness": "0.8", "initial_layer_speed": "20", "initial_layer_infill_speed": "20", diff --git a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune3Plus.json b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune3Plus.json index cde6fa9f1b..c1aed883be 100644 --- a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune3Plus.json +++ b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune3Plus.json @@ -10,7 +10,7 @@ "reduce_crossing_wall": "0", "max_travel_detour_distance": "0", "bottom_surface_pattern": "monotonic", - "bottom_shell_layers": "4", + "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", "bridge_speed": "25", @@ -86,7 +86,7 @@ "detect_thin_wall": "0", "top_surface_pattern": "monotonic", "top_surface_line_width": "0.38", - "top_shell_layers": "5", + "top_shell_layers": "4", "top_shell_thickness": "0.8", "initial_layer_speed": "20", "initial_layer_infill_speed": "20", diff --git a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune3Pro.json b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune3Pro.json index adb50086e7..add697439b 100644 --- a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune3Pro.json +++ b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune3Pro.json @@ -10,7 +10,7 @@ "reduce_crossing_wall": "0", "max_travel_detour_distance": "0", "bottom_surface_pattern": "monotonic", - "bottom_shell_layers": "4", + "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", "bridge_speed": "25", @@ -86,7 +86,7 @@ "detect_thin_wall": "0", "top_surface_pattern": "monotonic", "top_surface_line_width": "0.38", - "top_shell_layers": "5", + "top_shell_layers": "4", "top_shell_thickness": "0.8", "initial_layer_speed": "20", "initial_layer_infill_speed": "20", diff --git a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4 (0.2 nozzle).json b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4 (0.2 nozzle).json index f5519dd309..7dbac42615 100644 --- a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4 (0.2 nozzle).json +++ b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4 (0.2 nozzle).json @@ -3,24 +3,20 @@ "setting_id": "GP004", "name": "0.20mm Standard @Elegoo Neptune4 (0.2 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.2", "adaptive_layer_height": "1", "reduce_crossing_wall": "0", "max_travel_detour_distance": "0", "bottom_surface_pattern": "monotonic", - "bottom_shell_layers": "4", + "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.22", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.25", "wall_loops": "3", "print_settings_id": "", @@ -88,17 +76,8 @@ "detect_thin_wall": "0", "top_surface_pattern": "monotonic", "top_surface_line_width": "0.2", - "top_shell_layers": "5", + "top_shell_layers": "4", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4 (0.4 nozzle).json b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4 (0.4 nozzle).json index 471e02552d..6f50f7149b 100644 --- a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4 (0.4 nozzle).json +++ b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4 (0.4 nozzle).json @@ -3,24 +3,20 @@ "setting_id": "GP004", "name": "0.20mm Standard @Elegoo Neptune4 (0.4 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.2", "adaptive_layer_height": "1", "reduce_crossing_wall": "0", "max_travel_detour_distance": "0", "bottom_surface_pattern": "monotonic", - "bottom_shell_layers": "4", + "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.42", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.45", "wall_loops": "3", "print_settings_id": "", @@ -88,17 +76,8 @@ "detect_thin_wall": "0", "top_surface_pattern": "monotonic", "top_surface_line_width": "0.38", - "top_shell_layers": "5", + "top_shell_layers": "4", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4 (0.6 nozzle).json b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4 (0.6 nozzle).json index a65265a4b7..080770c151 100644 --- a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4 (0.6 nozzle).json +++ b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4 (0.6 nozzle).json @@ -3,24 +3,20 @@ "setting_id": "GP004", "name": "0.20mm Standard @Elegoo Neptune4 (0.6 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.2", "adaptive_layer_height": "1", "reduce_crossing_wall": "0", "max_travel_detour_distance": "0", "bottom_surface_pattern": "monotonic", - "bottom_shell_layers": "4", + "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.62", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.65", "wall_loops": "3", "print_settings_id": "", @@ -88,17 +76,8 @@ "detect_thin_wall": "0", "top_surface_pattern": "monotonic", "top_surface_line_width": "0.56", - "top_shell_layers": "5", + "top_shell_layers": "4", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4 (0.8 nozzle).json b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4 (0.8 nozzle).json index 01de03298b..5093910fda 100644 --- a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4 (0.8 nozzle).json +++ b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4 (0.8 nozzle).json @@ -3,24 +3,20 @@ "setting_id": "GP004", "name": "0.20mm Standard @Elegoo Neptune4 (0.8 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.2", "adaptive_layer_height": "1", "reduce_crossing_wall": "0", "max_travel_detour_distance": "0", "bottom_surface_pattern": "monotonic", - "bottom_shell_layers": "4", + "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.82", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.85", "wall_loops": "3", "print_settings_id": "", @@ -88,17 +76,8 @@ "detect_thin_wall": "0", "top_surface_pattern": "monotonic", "top_surface_line_width": "0.78", - "top_shell_layers": "5", + "top_shell_layers": "4", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4 Plus (0.2 nozzle).json b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4 Plus (0.2 nozzle).json new file mode 100644 index 0000000000..a7a7b83919 --- /dev/null +++ b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4 Plus (0.2 nozzle).json @@ -0,0 +1,26 @@ +{ + "type": "process", + "setting_id": "GP004", + "name": "0.20mm Standard @Elegoo Neptune4 Plus (0.2 nozzle)", + "from": "system", + "inherits": "fdm_process_neptune4_common", + "instantiation": "true", + "layer_height": "0.2", + "bottom_shell_layers": "3", + "outer_wall_line_width": "0.2", + "line_width": "0.2", + "initial_layer_line_width": "0.22", + "sparse_infill_line_width": "0.25", + "inner_wall_line_width": "0.25", + "internal_solid_infill_line_width": "0.25", + "resolution": "0.012", + "support_top_z_distance": "0.2", + "support_line_width": "0.2", + "support_interface_spacing": "0.2", + "top_surface_line_width": "0.2", + "top_shell_layers": "4", + "top_shell_thickness": "0.8", + "compatible_printers": [ + "Elegoo Neptune 4 Plus (0.2 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4 Plus (0.4 nozzle).json b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4 Plus (0.4 nozzle).json new file mode 100644 index 0000000000..661f82c94d --- /dev/null +++ b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4 Plus (0.4 nozzle).json @@ -0,0 +1,26 @@ +{ + "type": "process", + "setting_id": "GP004", + "name": "0.20mm Standard @Elegoo Neptune4 Plus (0.4 nozzle)", + "from": "system", + "inherits": "fdm_process_neptune4_common", + "instantiation": "true", + "layer_height": "0.2", + "bottom_shell_layers": "3", + "outer_wall_line_width": "0.4", + "line_width": "0.4", + "initial_layer_line_width": "0.42", + "sparse_infill_line_width": "0.45", + "inner_wall_line_width": "0.45", + "internal_solid_infill_line_width": "0.45", + "resolution": "0.012", + "support_top_z_distance": "0.2", + "support_line_width": "0.38", + "support_interface_spacing": "0.2", + "top_surface_line_width": "0.38", + "top_shell_layers": "4", + "top_shell_thickness": "0.8", + "compatible_printers": [ + "Elegoo Neptune 4 Plus (0.4 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4 Plus (0.6 nozzle).json b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4 Plus (0.6 nozzle).json new file mode 100644 index 0000000000..dd92c949c2 --- /dev/null +++ b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4 Plus (0.6 nozzle).json @@ -0,0 +1,26 @@ +{ + "type": "process", + "setting_id": "GP004", + "name": "0.20mm Standard @Elegoo Neptune4 Plus (0.6 nozzle)", + "from": "system", + "inherits": "fdm_process_neptune4_common", + "instantiation": "true", + "layer_height": "0.2", + "bottom_shell_layers": "3", + "outer_wall_line_width": "0.6", + "line_width": "0.6", + "initial_layer_line_width": "0.62", + "sparse_infill_line_width": "0.65", + "inner_wall_line_width": "0.65", + "internal_solid_infill_line_width": "0.65", + "resolution": "0.012", + "support_top_z_distance": "0.2", + "support_line_width": "0.55", + "support_interface_spacing": "0.2", + "top_surface_line_width": "0.56", + "top_shell_layers": "4", + "top_shell_thickness": "0.8", + "compatible_printers": [ + "Elegoo Neptune 4 Plus (0.6 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4 Plus (0.8 nozzle).json b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4 Plus (0.8 nozzle).json new file mode 100644 index 0000000000..c39e7e33ef --- /dev/null +++ b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4 Plus (0.8 nozzle).json @@ -0,0 +1,26 @@ +{ + "type": "process", + "setting_id": "GP004", + "name": "0.20mm Standard @Elegoo Neptune4 Plus (0.8 nozzle)", + "from": "system", + "inherits": "fdm_process_neptune4_common", + "instantiation": "true", + "layer_height": "0.2", + "bottom_shell_layers": "3", + "outer_wall_line_width": "0.8", + "line_width": "0.8", + "initial_layer_line_width": "0.82", + "sparse_infill_line_width": "0.85", + "inner_wall_line_width": "0.85", + "internal_solid_infill_line_width": "0.85", + "resolution": "0.012", + "support_top_z_distance": "0.2", + "support_line_width": "0.78", + "support_interface_spacing": "0.2", + "top_surface_line_width": "0.78", + "top_shell_layers": "4", + "top_shell_thickness": "0.8", + "compatible_printers": [ + "Elegoo Neptune 4 Plus (0.8 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4Max (0.2 nozzle).json b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4Max (0.2 nozzle).json index 0ef1aa9b91..3fe7c398a5 100644 --- a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4Max (0.2 nozzle).json +++ b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4Max (0.2 nozzle).json @@ -3,24 +3,20 @@ "setting_id": "GP004", "name": "0.20mm Standard @Elegoo Neptune4Max (0.2 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4max_common", "instantiation": "true", "layer_height": "0.2", "adaptive_layer_height": "1", "reduce_crossing_wall": "0", "max_travel_detour_distance": "0", "bottom_surface_pattern": "monotonic", - "bottom_shell_layers": "4", + "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.22", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -44,14 +36,11 @@ "ironing_flow": "15%", "ironing_spacing": "0.1", "ironing_speed": "15", + "travel_speed": "300", "ironing_type": "no ironing", "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.25", "wall_loops": "3", "print_settings_id": "", @@ -88,17 +77,8 @@ "detect_thin_wall": "0", "top_surface_pattern": "monotonic", "top_surface_line_width": "0.2", - "top_shell_layers": "5", + "top_shell_layers": "4", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4Max (0.4 nozzle).json b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4Max (0.4 nozzle).json index bc6b46ad96..89eb5ba878 100644 --- a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4Max (0.4 nozzle).json +++ b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4Max (0.4 nozzle).json @@ -3,24 +3,20 @@ "setting_id": "GP004", "name": "0.20mm Standard @Elegoo Neptune4Max (0.4 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4max_common", "instantiation": "true", "layer_height": "0.2", "adaptive_layer_height": "1", "reduce_crossing_wall": "0", "max_travel_detour_distance": "0", "bottom_surface_pattern": "monotonic", - "bottom_shell_layers": "4", + "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.42", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -44,14 +36,11 @@ "ironing_flow": "15%", "ironing_spacing": "0.1", "ironing_speed": "15", + "travel_speed": "300", "ironing_type": "no ironing", "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.45", "wall_loops": "3", "print_settings_id": "", @@ -88,17 +77,8 @@ "detect_thin_wall": "0", "top_surface_pattern": "monotonic", "top_surface_line_width": "0.38", - "top_shell_layers": "5", + "top_shell_layers": "4", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4Max (0.6 nozzle).json b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4Max (0.6 nozzle).json index 958a3fec04..318b6a396b 100644 --- a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4Max (0.6 nozzle).json +++ b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4Max (0.6 nozzle).json @@ -3,24 +3,20 @@ "setting_id": "GP004", "name": "0.20mm Standard @Elegoo Neptune4Max (0.6 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4max_common", "instantiation": "true", "layer_height": "0.2", "adaptive_layer_height": "1", "reduce_crossing_wall": "0", "max_travel_detour_distance": "0", "bottom_surface_pattern": "monotonic", - "bottom_shell_layers": "4", + "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.62", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -44,14 +36,11 @@ "ironing_flow": "15%", "ironing_spacing": "0.1", "ironing_speed": "15", + "travel_speed": "300", "ironing_type": "no ironing", "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.65", "wall_loops": "3", "print_settings_id": "", @@ -88,17 +77,8 @@ "detect_thin_wall": "0", "top_surface_pattern": "monotonic", "top_surface_line_width": "0.56", - "top_shell_layers": "5", + "top_shell_layers": "4", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4Max (0.8 nozzle).json b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4Max (0.8 nozzle).json index 90e54895ab..68615fbc10 100644 --- a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4Max (0.8 nozzle).json +++ b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4Max (0.8 nozzle).json @@ -3,24 +3,20 @@ "setting_id": "GP004", "name": "0.20mm Standard @Elegoo Neptune4Max (0.8 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4max_common", "instantiation": "true", "layer_height": "0.2", "adaptive_layer_height": "1", "reduce_crossing_wall": "0", "max_travel_detour_distance": "0", "bottom_surface_pattern": "monotonic", - "bottom_shell_layers": "4", + "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.82", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -44,14 +36,11 @@ "ironing_flow": "15%", "ironing_spacing": "0.1", "ironing_speed": "15", + "travel_speed": "300", "ironing_type": "no ironing", "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.85", "wall_loops": "3", "print_settings_id": "", @@ -88,17 +77,8 @@ "detect_thin_wall": "0", "top_surface_pattern": "monotonic", "top_surface_line_width": "0.78", - "top_shell_layers": "5", + "top_shell_layers": "4", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4Pro (0.2 nozzle).json b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4Pro (0.2 nozzle).json index 537f3ad6f5..bbf6de592c 100644 --- a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4Pro (0.2 nozzle).json +++ b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4Pro (0.2 nozzle).json @@ -3,24 +3,20 @@ "setting_id": "GP004", "name": "0.20mm Standard @Elegoo Neptune4Pro (0.2 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.2", "adaptive_layer_height": "1", "reduce_crossing_wall": "0", "max_travel_detour_distance": "0", "bottom_surface_pattern": "monotonic", - "bottom_shell_layers": "4", + "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.22", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.25", "wall_loops": "3", "print_settings_id": "", @@ -88,17 +76,8 @@ "detect_thin_wall": "0", "top_surface_pattern": "monotonic", "top_surface_line_width": "0.2", - "top_shell_layers": "5", + "top_shell_layers": "4", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4Pro (0.4 nozzle).json b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4Pro (0.4 nozzle).json index e406946546..b949da8ea4 100644 --- a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4Pro (0.4 nozzle).json +++ b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4Pro (0.4 nozzle).json @@ -3,24 +3,20 @@ "setting_id": "GP004", "name": "0.20mm Standard @Elegoo Neptune4Pro (0.4 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.2", "adaptive_layer_height": "1", "reduce_crossing_wall": "0", "max_travel_detour_distance": "0", "bottom_surface_pattern": "monotonic", - "bottom_shell_layers": "4", + "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.42", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.45", "wall_loops": "3", "print_settings_id": "", @@ -88,17 +76,8 @@ "detect_thin_wall": "0", "top_surface_pattern": "monotonic", "top_surface_line_width": "0.38", - "top_shell_layers": "5", + "top_shell_layers": "4", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4Pro (0.6 nozzle).json b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4Pro (0.6 nozzle).json index 047933baa2..0f8653e791 100644 --- a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4Pro (0.6 nozzle).json +++ b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4Pro (0.6 nozzle).json @@ -3,24 +3,20 @@ "setting_id": "GP004", "name": "0.20mm Standard @Elegoo Neptune4Pro (0.6 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.2", "adaptive_layer_height": "1", "reduce_crossing_wall": "0", "max_travel_detour_distance": "0", "bottom_surface_pattern": "monotonic", - "bottom_shell_layers": "4", + "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.62", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.65", "wall_loops": "3", "print_settings_id": "", @@ -88,17 +76,8 @@ "detect_thin_wall": "0", "top_surface_pattern": "monotonic", "top_surface_line_width": "0.56", - "top_shell_layers": "5", + "top_shell_layers": "4", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4Pro (0.8 nozzle).json b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4Pro (0.8 nozzle).json index f6269178a2..d05dfae48d 100644 --- a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4Pro (0.8 nozzle).json +++ b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo Neptune4Pro (0.8 nozzle).json @@ -3,24 +3,20 @@ "setting_id": "GP004", "name": "0.20mm Standard @Elegoo Neptune4Pro (0.8 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.2", "adaptive_layer_height": "1", "reduce_crossing_wall": "0", "max_travel_detour_distance": "0", "bottom_surface_pattern": "monotonic", - "bottom_shell_layers": "4", + "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.82", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.85", "wall_loops": "3", "print_settings_id": "", @@ -88,17 +76,8 @@ "detect_thin_wall": "0", "top_surface_pattern": "monotonic", "top_surface_line_width": "0.78", - "top_shell_layers": "5", + "top_shell_layers": "4", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo NeptuneX.json b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo NeptuneX.json index d5749bce12..6c959477f7 100644 --- a/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo NeptuneX.json +++ b/resources/profiles/Elegoo/process/0.20mm Standard @Elegoo NeptuneX.json @@ -10,7 +10,7 @@ "reduce_crossing_wall": "0", "max_travel_detour_distance": "0", "bottom_surface_pattern": "monotonic", - "bottom_shell_layers": "4", + "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", "bridge_speed": "25", @@ -86,7 +86,7 @@ "detect_thin_wall": "0", "top_surface_pattern": "monotonic", "top_surface_line_width": "0.38", - "top_shell_layers": "5", + "top_shell_layers": "4", "top_shell_thickness": "0.8", "initial_layer_speed": "20", "initial_layer_infill_speed": "20", diff --git a/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4 (0.2 nozzle).json b/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4 (0.2 nozzle).json index f1b8f803c5..fd60e63a23 100644 --- a/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4 (0.2 nozzle).json +++ b/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4 (0.2 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.24mm Draft @Elegoo Neptune4 (0.2 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.24", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.22", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.25", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.25", "top_shell_layers": "4", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4 (0.4 nozzle).json b/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4 (0.4 nozzle).json index 6b71e068a7..a71372ae75 100644 --- a/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4 (0.4 nozzle).json +++ b/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4 (0.4 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.24mm Draft @Elegoo Neptune4 (0.4 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.24", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.42", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.45", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.45", "top_shell_layers": "4", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4 (0.6 nozzle).json b/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4 (0.6 nozzle).json index 37f7fc4f50..e86310a6eb 100644 --- a/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4 (0.6 nozzle).json +++ b/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4 (0.6 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.24mm Draft @Elegoo Neptune4 (0.6 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.24", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.62", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.65", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.65", "top_shell_layers": "4", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4 (0.8 nozzle).json b/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4 (0.8 nozzle).json index bb7c56fba2..d058cd9026 100644 --- a/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4 (0.8 nozzle).json +++ b/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4 (0.8 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.24mm Draft @Elegoo Neptune4 (0.8 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.24", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.82", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.85", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.85", "top_shell_layers": "4", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4 Plus (0.2 nozzle).json b/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4 Plus (0.2 nozzle).json new file mode 100644 index 0000000000..a68fee51bf --- /dev/null +++ b/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4 Plus (0.2 nozzle).json @@ -0,0 +1,26 @@ +{ + "type": "process", + "setting_id": "GP004", + "name": "0.24mm Draft @Elegoo Neptune4 Plus (0.2 nozzle)", + "from": "system", + "inherits": "fdm_process_neptune4_common", + "instantiation": "true", + "layer_height": "0.24", + "bottom_shell_layers": "3", + "outer_wall_line_width": "0.2", + "line_width": "0.2", + "initial_layer_line_width": "0.22", + "sparse_infill_line_width": "0.25", + "inner_wall_line_width": "0.25", + "internal_solid_infill_line_width": "0.25", + "resolution": "0.012", + "support_top_z_distance": "0.24", + "support_line_width": "0.2", + "support_interface_spacing": "0.2", + "top_surface_line_width": "0.2", + "top_shell_layers": "4", + "top_shell_thickness": "0.8", + "compatible_printers": [ + "Elegoo Neptune 4 Plus (0.2 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4 Plus (0.4 nozzle).json b/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4 Plus (0.4 nozzle).json new file mode 100644 index 0000000000..7de3fdc5df --- /dev/null +++ b/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4 Plus (0.4 nozzle).json @@ -0,0 +1,26 @@ +{ + "type": "process", + "setting_id": "GP004", + "name": "0.24mm Draft @Elegoo Neptune4 Plus (0.4 nozzle)", + "from": "system", + "inherits": "fdm_process_neptune4_common", + "instantiation": "true", + "layer_height": "0.24", + "bottom_shell_layers": "3", + "outer_wall_line_width": "0.4", + "line_width": "0.4", + "initial_layer_line_width": "0.42", + "sparse_infill_line_width": "0.45", + "inner_wall_line_width": "0.45", + "internal_solid_infill_line_width": "0.45", + "resolution": "0.012", + "support_top_z_distance": "0.24", + "support_line_width": "0.38", + "support_interface_spacing": "0.2", + "top_surface_line_width": "0.38", + "top_shell_layers": "4", + "top_shell_thickness": "0.8", + "compatible_printers": [ + "Elegoo Neptune 4 Plus (0.4 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4 Plus (0.6 nozzle).json b/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4 Plus (0.6 nozzle).json new file mode 100644 index 0000000000..ee41c38afc --- /dev/null +++ b/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4 Plus (0.6 nozzle).json @@ -0,0 +1,26 @@ +{ + "type": "process", + "setting_id": "GP004", + "name": "0.24mm Draft @Elegoo Neptune4 Plus (0.6 nozzle)", + "from": "system", + "inherits": "fdm_process_neptune4_common", + "instantiation": "true", + "layer_height": "0.24", + "bottom_shell_layers": "3", + "outer_wall_line_width": "0.6", + "line_width": "0.6", + "initial_layer_line_width": "0.62", + "sparse_infill_line_width": "0.65", + "inner_wall_line_width": "0.65", + "internal_solid_infill_line_width": "0.65", + "resolution": "0.012", + "support_top_z_distance": "0.24", + "support_line_width": "0.55", + "support_interface_spacing": "0.2", + "top_surface_line_width": "0.56", + "top_shell_layers": "4", + "top_shell_thickness": "0.8", + "compatible_printers": [ + "Elegoo Neptune 4 Plus (0.6 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4 Plus (0.8 nozzle).json b/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4 Plus (0.8 nozzle).json new file mode 100644 index 0000000000..46da5f8e15 --- /dev/null +++ b/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4 Plus (0.8 nozzle).json @@ -0,0 +1,26 @@ +{ + "type": "process", + "setting_id": "GP004", + "name": "0.24mm Draft @Elegoo Neptune4 Plus (0.8 nozzle)", + "from": "system", + "inherits": "fdm_process_neptune4_common", + "instantiation": "true", + "layer_height": "0.24", + "bottom_shell_layers": "3", + "outer_wall_line_width": "0.8", + "line_width": "0.8", + "initial_layer_line_width": "0.82", + "sparse_infill_line_width": "0.85", + "inner_wall_line_width": "0.85", + "internal_solid_infill_line_width": "0.85", + "resolution": "0.012", + "support_top_z_distance": "0.24", + "support_line_width": "0.78", + "support_interface_spacing": "0.2", + "top_surface_line_width": "0.78", + "top_shell_layers": "4", + "top_shell_thickness": "0.8", + "compatible_printers": [ + "Elegoo Neptune 4 Plus (0.8 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4Max (0.2 nozzle).json b/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4Max (0.2 nozzle).json index ef5f87a492..fefb7b6b81 100644 --- a/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4Max (0.2 nozzle).json +++ b/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4Max (0.2 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.24mm Draft @Elegoo Neptune4Max (0.2 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4max_common", "instantiation": "true", "layer_height": "0.24", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.22", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -44,14 +36,11 @@ "ironing_flow": "15%", "ironing_spacing": "0.1", "ironing_speed": "15", + "travel_speed": "300", "ironing_type": "no ironing", "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.25", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +79,6 @@ "top_surface_line_width": "0.25", "top_shell_layers": "4", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4Max (0.4 nozzle).json b/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4Max (0.4 nozzle).json index b97029a186..cd0d5ab883 100644 --- a/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4Max (0.4 nozzle).json +++ b/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4Max (0.4 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.24mm Draft @Elegoo Neptune4Max (0.4 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4max_common", "instantiation": "true", "layer_height": "0.24", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.42", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -44,14 +36,11 @@ "ironing_flow": "15%", "ironing_spacing": "0.1", "ironing_speed": "15", + "travel_speed": "300", "ironing_type": "no ironing", "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.45", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +79,6 @@ "top_surface_line_width": "0.45", "top_shell_layers": "4", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4Max (0.6 nozzle).json b/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4Max (0.6 nozzle).json index 17dc83a8ec..9061cff097 100644 --- a/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4Max (0.6 nozzle).json +++ b/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4Max (0.6 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.24mm Draft @Elegoo Neptune4Max (0.6 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4max_common", "instantiation": "true", "layer_height": "0.24", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.62", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -44,14 +36,11 @@ "ironing_flow": "15%", "ironing_spacing": "0.1", "ironing_speed": "15", + "travel_speed": "300", "ironing_type": "no ironing", "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.65", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +79,6 @@ "top_surface_line_width": "0.65", "top_shell_layers": "4", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4Max (0.8 nozzle).json b/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4Max (0.8 nozzle).json index d1f919be89..4e35b2b9fc 100644 --- a/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4Max (0.8 nozzle).json +++ b/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4Max (0.8 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.24mm Draft @Elegoo Neptune4Max (0.8 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4max_common", "instantiation": "true", "layer_height": "0.24", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.82", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -44,14 +36,11 @@ "ironing_flow": "15%", "ironing_spacing": "0.1", "ironing_speed": "15", + "travel_speed": "300", "ironing_type": "no ironing", "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.85", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +79,6 @@ "top_surface_line_width": "0.85", "top_shell_layers": "4", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4Pro (0.2 nozzle).json b/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4Pro (0.2 nozzle).json index 67ee71d5c8..0b2b3bc9c1 100644 --- a/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4Pro (0.2 nozzle).json +++ b/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4Pro (0.2 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.24mm Draft @Elegoo Neptune4Pro (0.2 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.24", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.22", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.25", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.25", "top_shell_layers": "4", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4Pro (0.4 nozzle).json b/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4Pro (0.4 nozzle).json index 9fc830e0a1..cb2080be4b 100644 --- a/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4Pro (0.4 nozzle).json +++ b/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4Pro (0.4 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.24mm Draft @Elegoo Neptune4Pro (0.4 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.24", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.42", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.45", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.45", "top_shell_layers": "4", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4Pro (0.6 nozzle).json b/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4Pro (0.6 nozzle).json index 87fdba1dc3..a37af48be2 100644 --- a/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4Pro (0.6 nozzle).json +++ b/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4Pro (0.6 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.24mm Draft @Elegoo Neptune4Pro (0.6 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.24", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.62", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.65", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.65", "top_shell_layers": "4", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4Pro (0.8 nozzle).json b/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4Pro (0.8 nozzle).json index 35c95d52ba..ebda19568f 100644 --- a/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4Pro (0.8 nozzle).json +++ b/resources/profiles/Elegoo/process/0.24mm Draft @Elegoo Neptune4Pro (0.8 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.24mm Draft @Elegoo Neptune4Pro (0.8 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.24", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.82", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.85", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.85", "top_shell_layers": "4", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4 (0.2 nozzle).json b/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4 (0.2 nozzle).json index bded16e09d..21a1a10741 100644 --- a/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4 (0.2 nozzle).json +++ b/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4 (0.2 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.28mm Extra Draft @Elegoo Neptune4 (0.2 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.28", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.22", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.25", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.25", "top_shell_layers": "4", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4 (0.4 nozzle).json b/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4 (0.4 nozzle).json index 0afabc8a07..1ce0a7317e 100644 --- a/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4 (0.4 nozzle).json +++ b/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4 (0.4 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.28mm Extra Draft @Elegoo Neptune4 (0.4 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.28", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.42", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.45", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.45", "top_shell_layers": "4", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4 (0.6 nozzle).json b/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4 (0.6 nozzle).json index 9396a9afa0..987d8f78bb 100644 --- a/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4 (0.6 nozzle).json +++ b/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4 (0.6 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.28mm Extra Draft @Elegoo Neptune4 (0.6 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.28", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.62", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.65", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.65", "top_shell_layers": "4", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4 (0.8 nozzle).json b/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4 (0.8 nozzle).json index c8ce3e2866..2ad24c0a03 100644 --- a/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4 (0.8 nozzle).json +++ b/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4 (0.8 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.28mm Extra Draft @Elegoo Neptune4 (0.8 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.28", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.82", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.85", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.85", "top_shell_layers": "4", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4 Plus (0.2 nozzle).json b/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4 Plus (0.2 nozzle).json new file mode 100644 index 0000000000..a81f6f52e1 --- /dev/null +++ b/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4 Plus (0.2 nozzle).json @@ -0,0 +1,26 @@ +{ + "type": "process", + "setting_id": "GP004", + "name": "0.28mm Extra Draft @Elegoo Neptune4 Plus (0.2 nozzle)", + "from": "system", + "inherits": "fdm_process_neptune4_common", + "instantiation": "true", + "layer_height": "0.28", + "bottom_shell_layers": "3", + "outer_wall_line_width": "0.2", + "line_width": "0.2", + "initial_layer_line_width": "0.22", + "sparse_infill_line_width": "0.25", + "inner_wall_line_width": "0.25", + "internal_solid_infill_line_width": "0.25", + "resolution": "0.012", + "support_top_z_distance": "0.28", + "support_line_width": "0.2", + "support_interface_spacing": "0.2", + "top_surface_line_width": "0.2", + "top_shell_layers": "4", + "top_shell_thickness": "0.8", + "compatible_printers": [ + "Elegoo Neptune 4 Plus (0.2 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4 Plus (0.4 nozzle).json b/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4 Plus (0.4 nozzle).json new file mode 100644 index 0000000000..82f9cd4acb --- /dev/null +++ b/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4 Plus (0.4 nozzle).json @@ -0,0 +1,26 @@ +{ + "type": "process", + "setting_id": "GP004", + "name": "0.28mm Extra Draft @Elegoo Neptune4 Plus (0.4 nozzle)", + "from": "system", + "inherits": "fdm_process_neptune4_common", + "instantiation": "true", + "layer_height": "0.28", + "bottom_shell_layers": "3", + "outer_wall_line_width": "0.4", + "line_width": "0.4", + "initial_layer_line_width": "0.42", + "sparse_infill_line_width": "0.45", + "inner_wall_line_width": "0.45", + "internal_solid_infill_line_width": "0.45", + "resolution": "0.012", + "support_top_z_distance": "0.28", + "support_line_width": "0.38", + "support_interface_spacing": "0.2", + "top_surface_line_width": "0.38", + "top_shell_layers": "4", + "top_shell_thickness": "0.8", + "compatible_printers": [ + "Elegoo Neptune 4 Plus (0.4 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4 Plus (0.6 nozzle).json b/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4 Plus (0.6 nozzle).json new file mode 100644 index 0000000000..72e98d6619 --- /dev/null +++ b/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4 Plus (0.6 nozzle).json @@ -0,0 +1,26 @@ +{ + "type": "process", + "setting_id": "GP004", + "name": "0.28mm Extra Draft @Elegoo Neptune4 Plus (0.6 nozzle)", + "from": "system", + "inherits": "fdm_process_neptune4_common", + "instantiation": "true", + "layer_height": "0.28", + "bottom_shell_layers": "3", + "outer_wall_line_width": "0.6", + "line_width": "0.6", + "initial_layer_line_width": "0.62", + "sparse_infill_line_width": "0.65", + "inner_wall_line_width": "0.65", + "internal_solid_infill_line_width": "0.65", + "resolution": "0.012", + "support_top_z_distance": "0.28", + "support_line_width": "0.55", + "support_interface_spacing": "0.2", + "top_surface_line_width": "0.56", + "top_shell_layers": "4", + "top_shell_thickness": "0.8", + "compatible_printers": [ + "Elegoo Neptune 4 Plus (0.6 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4 Plus (0.8 nozzle).json b/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4 Plus (0.8 nozzle).json new file mode 100644 index 0000000000..6c79135769 --- /dev/null +++ b/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4 Plus (0.8 nozzle).json @@ -0,0 +1,26 @@ +{ + "type": "process", + "setting_id": "GP004", + "name": "0.28mm Extra Draft @Elegoo Neptune4 Plus (0.8 nozzle)", + "from": "system", + "inherits": "fdm_process_neptune4_common", + "instantiation": "true", + "layer_height": "0.28", + "bottom_shell_layers": "3", + "outer_wall_line_width": "0.8", + "line_width": "0.8", + "initial_layer_line_width": "0.82", + "sparse_infill_line_width": "0.85", + "inner_wall_line_width": "0.85", + "internal_solid_infill_line_width": "0.85", + "resolution": "0.012", + "support_top_z_distance": "0.28", + "support_line_width": "0.78", + "support_interface_spacing": "0.2", + "top_surface_line_width": "0.78", + "top_shell_layers": "4", + "top_shell_thickness": "0.8", + "compatible_printers": [ + "Elegoo Neptune 4 Plus (0.8 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4Max (0.2 nozzle).json b/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4Max (0.2 nozzle).json index 89ecef0009..29a57e8bb6 100644 --- a/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4Max (0.2 nozzle).json +++ b/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4Max (0.2 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.28mm Extra Draft @Elegoo Neptune4Max (0.2 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4max_common", "instantiation": "true", "layer_height": "0.28", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.22", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -44,14 +36,11 @@ "ironing_flow": "15%", "ironing_spacing": "0.1", "ironing_speed": "15", + "travel_speed": "300", "ironing_type": "no ironing", "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.25", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +79,6 @@ "top_surface_line_width": "0.25", "top_shell_layers": "4", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4Max (0.4 nozzle).json b/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4Max (0.4 nozzle).json index f6e08ce9b9..feb9ca7ad0 100644 --- a/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4Max (0.4 nozzle).json +++ b/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4Max (0.4 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.28mm Extra Draft @Elegoo Neptune4Max (0.4 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4max_common", "instantiation": "true", "layer_height": "0.28", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.42", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -44,14 +36,11 @@ "ironing_flow": "15%", "ironing_spacing": "0.1", "ironing_speed": "15", + "travel_speed": "300", "ironing_type": "no ironing", "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.45", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +79,6 @@ "top_surface_line_width": "0.45", "top_shell_layers": "4", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4Max (0.6 nozzle).json b/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4Max (0.6 nozzle).json index 1966486816..93b683e79d 100644 --- a/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4Max (0.6 nozzle).json +++ b/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4Max (0.6 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.28mm Extra Draft @Elegoo Neptune4Max (0.6 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4max_common", "instantiation": "true", "layer_height": "0.28", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.62", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -44,14 +36,11 @@ "ironing_flow": "15%", "ironing_spacing": "0.1", "ironing_speed": "15", + "travel_speed": "300", "ironing_type": "no ironing", "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.65", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +79,6 @@ "top_surface_line_width": "0.65", "top_shell_layers": "4", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4Max (0.8 nozzle).json b/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4Max (0.8 nozzle).json index 0db07edab9..590c53b55c 100644 --- a/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4Max (0.8 nozzle).json +++ b/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4Max (0.8 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.28mm Extra Draft @Elegoo Neptune4Max (0.8 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4max_common", "instantiation": "true", "layer_height": "0.28", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.82", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -44,14 +36,11 @@ "ironing_flow": "15%", "ironing_spacing": "0.1", "ironing_speed": "15", + "travel_speed": "300", "ironing_type": "no ironing", "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.85", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +79,6 @@ "top_surface_line_width": "0.85", "top_shell_layers": "4", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4Pro (0.2 nozzle).json b/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4Pro (0.2 nozzle).json index 8b90b64e15..d1474f68b7 100644 --- a/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4Pro (0.2 nozzle).json +++ b/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4Pro (0.2 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.28mm Extra Draft @Elegoo Neptune4Pro (0.2 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.28", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.22", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.25", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.25", "top_shell_layers": "4", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4Pro (0.4 nozzle).json b/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4Pro (0.4 nozzle).json index fdabed3fcd..a727fd9831 100644 --- a/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4Pro (0.4 nozzle).json +++ b/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4Pro (0.4 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.28mm Extra Draft @Elegoo Neptune4Pro (0.4 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.28", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.42", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.45", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.45", "top_shell_layers": "4", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4Pro (0.6 nozzle).json b/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4Pro (0.6 nozzle).json index 900ab28786..aec1d00c39 100644 --- a/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4Pro (0.6 nozzle).json +++ b/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4Pro (0.6 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.28mm Extra Draft @Elegoo Neptune4Pro (0.6 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.28", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.62", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -91,19 +83,6 @@ "xy_contour_compensation": "0", "support_interface_speed": "60", "support_speed": "60", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "compatible_printers": [ "Elegoo Neptune 4 Pro (0.6 nozzle)" ] diff --git a/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4Pro (0.8 nozzle).json b/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4Pro (0.8 nozzle).json index ba8d0c8bfa..585a66496c 100644 --- a/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4Pro (0.8 nozzle).json +++ b/resources/profiles/Elegoo/process/0.28mm Extra Draft @Elegoo Neptune4Pro (0.8 nozzle).json @@ -3,7 +3,7 @@ "setting_id": "GP004", "name": "0.28mm Extra Draft @Elegoo Neptune4Pro (0.8 nozzle)", "from": "system", - "inherits": "fdm_process_elegoo_common", + "inherits": "fdm_process_neptune4_common", "instantiation": "true", "layer_height": "0.28", "adaptive_layer_height": "1", @@ -13,14 +13,10 @@ "bottom_shell_layers": "3", "bottom_shell_thickness": "0", "bridge_flow": "0.95", - "bridge_speed": "25", - "internal_bridge_speed" : "70", "brim_width": "0", "brim_object_gap": "0.1", "compatible_printers_condition": "", "print_sequence": "by layer", - "default_acceleration": "4000", - "top_surface_acceleration": "1000", "bridge_no_support": "0", "draft_shield": "disabled", "elefant_foot_compensation": "0.1", @@ -31,10 +27,6 @@ "infill_direction": "45", "sparse_infill_density": "15%", "sparse_infill_pattern": "grid", - "initial_layer_acceleration": "700", - "travel_acceleration": "5000", - "inner_wall_acceleration": "4000", - "outer_wall_acceleration": "2500", "initial_layer_line_width": "0.82", "initial_layer_print_height": "0.2", "infill_combination": "0", @@ -48,10 +40,6 @@ "reduce_infill_retraction": "1", "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", "inner_wall_line_width": "0.85", "wall_loops": "3", "print_settings_id": "", @@ -90,15 +78,6 @@ "top_surface_line_width": "0.85", "top_shell_layers": "4", "top_shell_thickness": "0.8", - "initial_layer_speed": "50", - "initial_layer_infill_speed": "60", - "outer_wall_speed": "80", - "inner_wall_speed": "100", - "internal_solid_infill_speed": "150", - "top_surface_speed": "80", - "gap_infill_speed": "80", - "sparse_infill_speed": "150", - "travel_speed": "300", "enable_prime_tower": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "60", diff --git a/resources/profiles/Elegoo/process/fdm_process_neptune4_common.json b/resources/profiles/Elegoo/process/fdm_process_neptune4_common.json new file mode 100644 index 0000000000..c73984923d --- /dev/null +++ b/resources/profiles/Elegoo/process/fdm_process_neptune4_common.json @@ -0,0 +1,114 @@ +{ + "type": "process", + "name": "fdm_process_neptune4_common", + "from": "system", + "inherits": "fdm_process_elegoo_common", + "instantiation": "false", + "layer_height": "0.08", + "adaptive_layer_height": "1", + "reduce_crossing_wall": "0", + "max_travel_detour_distance": "0", + "bottom_surface_pattern": "monotonic", + "bottom_shell_layers": "9", + "bottom_shell_thickness": "0", + "bridge_flow": "0.95", + "bridge_speed": "25", + "internal_bridge_speed" : "70", + "brim_width": "0", + "brim_object_gap": "0.1", + "compatible_printers_condition": "", + "print_sequence": "by layer", + "bridge_no_support": "0", + "draft_shield": "disabled", + "elefant_foot_compensation": "0.1", + "enable_arc_fitting": "0", + "outer_wall_line_width": "0.2", + "wall_infill_order": "inner wall/outer wall/infill", + "line_width": "0.2", + "infill_direction": "45", + "sparse_infill_density": "15%", + "sparse_infill_pattern": "grid", + "initial_layer_line_width": "0.22", + "initial_layer_print_height": "0.2", + "infill_combination": "0", + "sparse_infill_line_width": "0.25", + "infill_wall_overlap": "25%", + "interface_shells": "0", + "ironing_flow": "15%", + "ironing_spacing": "0.1", + "ironing_speed": "15", + "ironing_type": "no ironing", + "reduce_infill_retraction": "1", + "filename_format": "{input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode", + "detect_overhang_wall": "1", + "inner_wall_line_width": "0.45", + "wall_loops": "3", + "print_settings_id": "", + "raft_layers": "0", + "seam_position": "aligned", + "skirt_distance": "1", + "skirt_height": "2", + "skirt_loops": "1", + "minimum_sparse_infill_area": "25", + "internal_solid_infill_line_width": "0.45", + "spiral_mode": "0", + "standby_temperature_delta": "-5", + "enable_support": "0", + "resolution": "0.012", + "support_type": "normal(auto)", + "support_style": "default", + "support_on_build_plate_only": "0", + "support_top_z_distance": "0.08", + "support_filament": "0", + "support_line_width": "0.2", + "support_interface_loop_pattern": "0", + "support_interface_filament": "0", + "support_interface_top_layers": "2", + "support_interface_bottom_layers": "2", + "support_interface_spacing": "0.2", + "support_interface_speed": "60", + "support_base_pattern": "rectilinear", + "support_base_pattern_spacing": "2", + "support_speed": "150", + "support_threshold_angle": "45", + "support_object_xy_distance": "0.35", + "tree_support_branch_angle": "45", + "tree_support_wall_count": "0", + "detect_thin_wall": "0", + "top_surface_pattern": "monotonic", + "top_surface_line_width": "0.2", + "top_shell_layers": "11", + "top_shell_thickness": "0.8", + "enable_prime_tower": "0", + "wipe_tower_no_sparse_layers": "0", + "prime_tower_width": "60", + "xy_hole_compensation": "0", + "xy_contour_compensation": "0", + "default_acceleration": "5000", + "top_surface_acceleration": "2000", + "initial_layer_acceleration": "1000", + "travel_acceleration": "5000", + "inner_wall_acceleration": "3000", + "outer_wall_acceleration": "3000", + "accel_to_decel_factor": "50%", + "default_jerk": "9", + "initial_layer_jerk": "7", + "outer_wall_jerk": "7", + "infill_jerk": "9", + "travel_jerk": "9", + "inner_wall_jerk": "7", + "top_surface_jerk": "7", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50", + "overhang_3_4_speed": "30", + "overhang_4_4_speed": "10", + "initial_layer_speed": "50", + "initial_layer_infill_speed": "80", + "outer_wall_speed": "120", + "inner_wall_speed": "200", + "internal_solid_infill_speed": "200", + "top_surface_speed": "120", + "gap_infill_speed": "120", + "sparse_infill_speed": "200", + "travel_speed": "350" +} diff --git a/resources/profiles/Elegoo/process/fdm_process_neptune4max_common.json b/resources/profiles/Elegoo/process/fdm_process_neptune4max_common.json new file mode 100644 index 0000000000..0b144d5bd3 --- /dev/null +++ b/resources/profiles/Elegoo/process/fdm_process_neptune4max_common.json @@ -0,0 +1,34 @@ +{ + "type": "process", + "name": "fdm_process_neptune4max_common", + "from": "system", + "inherits": "fdm_process_neptune4_common", + "instantiation": "false", + "default_acceleration": "3000", + "top_surface_acceleration": "2000", + "initial_layer_acceleration": "1000", + "inner_wall_acceleration": "2000", + "outer_wall_acceleration": "2000", + "travel_acceleration": "3000", + "accel_to_decel_factor": "50%", + "default_jerk": "7", + "initial_layer_jerk": "7", + "outer_wall_jerk": "6", + "inner_wall_jerk": "6", + "infill_jerk": "7", + "travel_jerk": "7", + "top_surface_jerk": "7", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50", + "overhang_3_4_speed": "30", + "overhang_4_4_speed": "10", + "initial_layer_speed": "50", + "initial_layer_infill_speed": "80", + "outer_wall_speed": "120", + "inner_wall_speed": "160", + "internal_solid_infill_speed": "200", + "top_surface_speed": "120", + "gap_infill_speed": "120", + "sparse_infill_speed": "200", + "travel_speed": "300" +} diff --git a/resources/profiles/Qidi/machine/fdm_qidi_x3_common.json b/resources/profiles/Qidi/machine/fdm_qidi_x3_common.json index c5b79b7e95..ec54672826 100644 --- a/resources/profiles/Qidi/machine/fdm_qidi_x3_common.json +++ b/resources/profiles/Qidi/machine/fdm_qidi_x3_common.json @@ -6,19 +6,24 @@ "inherits": "fdm_machine_common", "gcode_flavor": "klipper", "auxiliary_fan": "1", - "change_filament_gcode": "", + "change_filament_gcode": "", "machine_pause_gcode": "M0", "support_chamber_temp_control": "1", "retraction_length": [ "1" -], -"retraction_speed": [ - "30" -], -"z_hop": [ - "0.4" -], - "machine_start_gcode": "G28\nG0 Z50 F600\nM190 S[first_layer_bed_temperature]\nG28 Z\nG29 ; mesh bed leveling ,comment this code to close it\nG0 X0 Y0 Z50 F6000\nM109 S[first_layer_temperature]\nM83\nG0 Z5 F1200\nG0 X{first_layer_print_min[0]} Y{max(0, first_layer_print_min[1] - 2)} F12000\nG0 Z0.2 F600\nG1 E3 F1800\nG0 Z0.3 F600\nG1 X{min(first_layer_print_min[0] + 30,print_bed_max[0])} E6 F600", + ], + "retraction_speed": [ + "30" + ], + "z_hop": [ + "0.4" + ], + "thumbnails": [ + "380x380", + "210x210" + ], + "thumbnails_format": "ColPic", + "machine_start_gcode": "G28\nG0 Z50 F600\nM190 S[first_layer_bed_temperature]\nG28 Z\nG29 ; mesh bed leveling ,comment this code to close it\nG0 X0 Y0 Z50 F6000\nM109 S[first_layer_temperature]\nM83\nG0 Z5 F1200\nG0 X{first_layer_print_min[0]} Y{max(0, first_layer_print_min[1] - 2)} F12000\nG0 Z0.2 F600\nG1 E3 F1800\nG0 Z0.3 F600\nG1 X{min(first_layer_print_min[0] + 30,print_bed_max[0])} E6 F600", "machine_end_gcode": "M104 S0\nM140 S0\nG92 E0\nG1 E-3 F1800\nG90\n{if max_layer_z < max_print_height / 2}\nG1 Z{max_print_height / 2 + 10} F600\n{else}\nG1 Z{min(max_print_height, max_layer_z + 10)}\n{endif}\nG0 X5 Y{print_bed_max[1]-11} F12000\nM141 S0", "scan_first_layer": "0" } diff --git a/resources/profiles/Snapmaker.json b/resources/profiles/Snapmaker.json index 09ecaa09e5..d61984b260 100644 --- a/resources/profiles/Snapmaker.json +++ b/resources/profiles/Snapmaker.json @@ -1,178 +1,806 @@ { - "name": "Snapmaker", - "version": "01.08.00.00", - "force_update": "0", - "description": "Snapmaker configurations", - "machine_model_list": [ - { - "name": "Snapmaker A250", - "sub_path": "machine/Snapmaker A250.json" - }, - { - "name": "Snapmaker A350", - "sub_path": "machine/Snapmaker A350.json" - }, - { - "name": "Snapmaker J1", - "sub_path": "machine/Snapmaker J1.json" - } - ], - "process_list": [ - { - "name": "fdm_process_common", - "sub_path": "process/fdm_process_common.json" - }, - { - "name": "0.20mm Standard @Snapmaker", - "sub_path": "process/0.20mm Standard @Snapmaker.json" - }, - { - "name": "0.20mm 0.4 Standard @Snapmaker J1", - "sub_path": "process/0.20mm 0.4 Standard @Snapmaker J1.json" - }, - { - "name": "0.20mm 0.6 Standard @Snapmaker J1", - "sub_path": "process/0.20mm 0.6 Standard @Snapmaker J1.json" - } - ], - "filament_list": [ - { - "name": "fdm_filament_common", - "sub_path": "filament/fdm_filament_common.json" - }, - { - "name": "fdm_filament_pla", - "sub_path": "filament/fdm_filament_pla.json" - }, - { - "name": "fdm_filament_tpu", - "sub_path": "filament/fdm_filament_tpu.json" - }, - { - "name": "fdm_filament_pet", - "sub_path": "filament/fdm_filament_pet.json" - }, - { - "name": "fdm_filament_abs", - "sub_path": "filament/fdm_filament_abs.json" - }, - { - "name": "fdm_filament_pc", - "sub_path": "filament/fdm_filament_pc.json" - }, - { - "name": "fdm_filament_asa", - "sub_path": "filament/fdm_filament_asa.json" - }, - { - "name": "fdm_filament_pva", - "sub_path": "filament/fdm_filament_pva.json" - }, - { - "name": "fdm_filament_pa", - "sub_path": "filament/fdm_filament_pa.json" - }, - { - "name": "Snapmaker Generic PLA", - "sub_path": "filament/Snapmaker Generic PLA.json" - }, - { - "name": "Snapmaker Generic PLA-CF", - "sub_path": "filament/Snapmaker Generic PLA-CF.json" - }, - { - "name": "Snapmaker Generic PETG", - "sub_path": "filament/Snapmaker Generic PETG.json" - }, - { - "name": "Snapmaker Generic ABS", - "sub_path": "filament/Snapmaker Generic ABS.json" - }, - { - "name": "Snapmaker Generic TPU", - "sub_path": "filament/Snapmaker Generic TPU.json" - }, - { - "name": "Snapmaker Generic ASA", - "sub_path": "filament/Snapmaker Generic ASA.json" - }, - { - "name": "Snapmaker Generic PC", - "sub_path": "filament/Snapmaker Generic PC.json" - }, - { - "name": "Snapmaker Generic PVA", - "sub_path": "filament/Snapmaker Generic PVA.json" - }, - { - "name": "Snapmaker Generic PA", - "sub_path": "filament/Snapmaker Generic PA.json" - }, - { - "name": "Snapmaker Generic PA-CF", - "sub_path": "filament/Snapmaker Generic PA-CF.json" - }, - { - "name": "Snapmaker J1 PLA", - "sub_path": "filament/Snapmaker J1 PLA.json" - }, - { - "name": "Snapmaker J1 PLA-CF", - "sub_path": "filament/Snapmaker J1 PLA-CF.json" - }, - { - "name": "Snapmaker J1 PETG", - "sub_path": "filament/Snapmaker J1 PETG.json" - }, - { - "name": "Snapmaker J1 ABS", - "sub_path": "filament/Snapmaker J1 ABS.json" - }, - { - "name": "Snapmaker J1 TPU", - "sub_path": "filament/Snapmaker J1 TPU.json" - }, - { - "name": "Snapmaker J1 ASA", - "sub_path": "filament/Snapmaker J1 ASA.json" - }, - { - "name": "Snapmaker J1 PC", - "sub_path": "filament/Snapmaker J1 PC.json" - }, - { - "name": "Snapmaker J1 PVA", - "sub_path": "filament/Snapmaker J1 PVA.json" - }, - { - "name": "Snapmaker J1 PA", - "sub_path": "filament/Snapmaker J1 PA.json" - }, - { - "name": "Snapmaker J1 PA-CF", - "sub_path": "filament/Snapmaker J1 PA-CF.json" - } - ], - "machine_list": [ - { - "name": "fdm_machine_common", - "sub_path": "machine/fdm_machine_common.json" - }, - { - "name": "Snapmaker A250 0.4 nozzle", - "sub_path": "machine/Snapmaker A250 0.4 nozzle.json" - }, - { - "name": "Snapmaker A350 0.4 nozzle", - "sub_path": "machine/Snapmaker A350 0.4 nozzle.json" - }, - { - "name": "Snapmaker J1 0.4 nozzle", - "sub_path": "machine/Snapmaker J1 0.4 nozzle.json" - }, - { - "name": "Snapmaker J1 0.6 nozzle", - "sub_path": "machine/Snapmaker J1 0.6 nozzle.json" - } - ] -} + "name": "Snapmaker", + "version": "01.06.01", + "force_update": "0", + "description": "Snapmaker configurations", + "machine_model_list": [ + { + "name": "Snapmaker J1", + "sub_path": "machine/Snapmaker J1.json" + }, + { + "name": "Snapmaker A250", + "sub_path": "machine/Snapmaker A250.json" + }, + { + "name": "Snapmaker A350", + "sub_path": "machine/Snapmaker A350.json" + }, + { + "name": "Snapmaker A250 Dual", + "sub_path": "machine/Snapmaker A250 Dual.json" + }, + { + "name": "Snapmaker A350 Dual", + "sub_path": "machine/Snapmaker A350 Dual.json" + }, + { + "name": "Snapmaker A250 QSKit", + "sub_path": "machine/Snapmaker A250 QSKit.json" + }, + { + "name": "Snapmaker A350 QSKit", + "sub_path": "machine/Snapmaker A350 QSKit.json" + }, + { + "name": "Snapmaker A250 Dual QSKit", + "sub_path": "machine/Snapmaker A250 Dual QSKit.json" + }, + { + "name": "Snapmaker A350 Dual QSKit", + "sub_path": "machine/Snapmaker A350 Dual QSKit.json" + } + ], + "process_list": [ + { + "name": "fdm_process_common", + "sub_path": "process/fdm_process_common.json" + }, + { + "name": "fdm_process_idex", + "sub_path": "process/fdm_process_idex.json" + }, + { + "name": "0.06 Standard @Snapmaker (0.2 nozzle)", + "sub_path": "process/0.06 Standard @Snapmaker (0.2 nozzle).json" + }, + { + "name": "0.06 Standard @Snapmaker J1 (0.2 nozzle)", + "sub_path": "process/0.06 Standard @Snapmaker J1 (0.2 nozzle).json" + }, + { + "name": "0.08 Extra Fine @Snapmaker (0.4 nozzle)", + "sub_path": "process/0.08 Extra Fine @Snapmaker (0.4 nozzle).json" + }, + { + "name": "0.08 Extra Fine @Snapmaker J1 (0.4 nozzle)", + "sub_path": "process/0.08 Extra Fine @Snapmaker J1 (0.4 nozzle).json" + }, + { + "name": "0.10 Standard @Snapmaker (0.2 nozzle)", + "sub_path": "process/0.10 Standard @Snapmaker (0.2 nozzle).json" + }, + { + "name": "0.10 Standard @Snapmaker J1 (0.2 nozzle)", + "sub_path": "process/0.10 Standard @Snapmaker J1 (0.2 nozzle).json" + }, + { + "name": "0.12 Fine @Snapmaker (0.4 nozzle)", + "sub_path": "process/0.12 Fine @Snapmaker (0.4 nozzle).json" + }, + { + "name": "0.12 Fine @Snapmaker J1 (0.4 nozzle)", + "sub_path": "process/0.12 Fine @Snapmaker J1 (0.4 nozzle).json" + }, + { + "name": "0.14 Standard @Snapmaker (0.2 nozzle)", + "sub_path": "process/0.14 Standard @Snapmaker (0.2 nozzle).json" + }, + { + "name": "0.14 Standard @Snapmaker J1 (0.2 nozzle)", + "sub_path": "process/0.14 Standard @Snapmaker J1 (0.2 nozzle).json" + }, + { + "name": "0.16 Optimal @Snapmaker (0.4 nozzle)", + "sub_path": "process/0.16 Optimal @Snapmaker (0.4 nozzle).json" + }, + { + "name": "0.16 Optimal @Snapmaker J1 (0.4 nozzle)", + "sub_path": "process/0.16 Optimal @Snapmaker J1 (0.4 nozzle).json" + }, + { + "name": "0.18 Standard @Snapmaker (0.6 nozzle)", + "sub_path": "process/0.18 Standard @Snapmaker (0.6 nozzle).json" + }, + { + "name": "0.18 Standard @Snapmaker J1 (0.6 nozzle)", + "sub_path": "process/0.18 Standard @Snapmaker J1 (0.6 nozzle).json" + }, + { + "name": "0.20 Standard @Snapmaker (0.4 nozzle)", + "sub_path": "process/0.20 Standard @Snapmaker (0.4 nozzle).json" + }, + { + "name": "0.20 Standard @Snapmaker J1 (0.4 nozzle)", + "sub_path": "process/0.20 Standard @Snapmaker J1 (0.4 nozzle).json" + }, + { + "name": "0.20 Strength @Snapmaker (0.4 nozzle)", + "sub_path": "process/0.20 Strength @Snapmaker (0.4 nozzle).json" + }, + { + "name": "0.20 Strength @Snapmaker J1 (0.4 nozzle)", + "sub_path": "process/0.20 Strength @Snapmaker J1 (0.4 nozzle).json" + }, + { + "name": "0.24 Draft @Snapmaker (0.4 nozzle)", + "sub_path": "process/0.24 Draft @Snapmaker (0.4 nozzle).json" + }, + { + "name": "0.24 Draft @Snapmaker J1 (0.4 nozzle)", + "sub_path": "process/0.24 Draft @Snapmaker J1 (0.4 nozzle).json" + }, + { + "name": "0.25 Benchy @Snapmaker J1 (0.4 nozzle)", + "sub_path": "process/0.25 Benchy @Snapmaker J1 (0.4 nozzle).json" + }, + { + "name": "0.24 Standard @Snapmaker (0.6 nozzle)", + "sub_path": "process/0.24 Standard @Snapmaker (0.6 nozzle).json" + }, + { + "name": "0.24 Standard @Snapmaker J1 (0.6 nozzle)", + "sub_path": "process/0.24 Standard @Snapmaker J1 (0.6 nozzle).json" + }, + { + "name": "0.24 Standard @Snapmaker (0.8 nozzle)", + "sub_path": "process/0.24 Standard @Snapmaker (0.8 nozzle).json" + }, + { + "name": "0.24 Standard @Snapmaker J1 (0.8 nozzle)", + "sub_path": "process/0.24 Standard @Snapmaker J1 (0.8 nozzle).json" + }, + { + "name": "0.28 Extra Draft @Snapmaker (0.4 nozzle)", + "sub_path": "process/0.28 Extra Draft @Snapmaker (0.4 nozzle).json" + }, + { + "name": "0.28 Extra Draft @Snapmaker J1 (0.4 nozzle)", + "sub_path": "process/0.28 Extra Draft @Snapmaker J1 (0.4 nozzle).json" + }, + { + "name": "0.30 Standard @Snapmaker (0.6 nozzle)", + "sub_path": "process/0.30 Standard @Snapmaker (0.6 nozzle).json" + }, + { + "name": "0.30 Standard @Snapmaker J1 (0.6 nozzle)", + "sub_path": "process/0.30 Standard @Snapmaker J1 (0.6 nozzle).json" + }, + { + "name": "0.30 Strength @Snapmaker (0.6 nozzle)", + "sub_path": "process/0.30 Strength @Snapmaker (0.6 nozzle).json" + }, + { + "name": "0.30 Strength @Snapmaker J1 (0.6 nozzle)", + "sub_path": "process/0.30 Strength @Snapmaker J1 (0.6 nozzle).json" + }, + { + "name": "0.32 Standard @Snapmaker (0.8 nozzle)", + "sub_path": "process/0.32 Standard @Snapmaker (0.8 nozzle).json" + }, + { + "name": "0.32 Standard @Snapmaker J1 (0.8 nozzle)", + "sub_path": "process/0.32 Standard @Snapmaker J1 (0.8 nozzle).json" + }, + { + "name": "0.34 Standard @Snapmaker (0.6 nozzle)", + "sub_path": "process/0.34 Standard @Snapmaker (0.6 nozzle).json" + }, + { + "name": "0.34 Standard @Snapmaker J1 (0.6 nozzle)", + "sub_path": "process/0.34 Standard @Snapmaker J1 (0.6 nozzle).json" + }, + { + "name": "0.36 Standard @Snapmaker (0.8 nozzle)", + "sub_path": "process/0.36 Standard @Snapmaker (0.8 nozzle).json" + }, + { + "name": "0.36 Standard @Snapmaker J1 (0.8 nozzle)", + "sub_path": "process/0.36 Standard @Snapmaker J1 (0.8 nozzle).json" + }, + { + "name": "0.38 Standard @Snapmaker (0.6 nozzle)", + "sub_path": "process/0.38 Standard @Snapmaker (0.6 nozzle).json" + }, + { + "name": "0.38 Standard @Snapmaker J1 (0.6 nozzle)", + "sub_path": "process/0.38 Standard @Snapmaker J1 (0.6 nozzle).json" + }, + { + "name": "0.40 Standard @Snapmaker (0.8 nozzle)", + "sub_path": "process/0.40 Standard @Snapmaker (0.8 nozzle).json" + }, + { + "name": "0.40 Standard @Snapmaker J1 (0.8 nozzle)", + "sub_path": "process/0.40 Standard @Snapmaker J1 (0.8 nozzle).json" + }, + { + "name": "0.42 Draft @Snapmaker (0.6 nozzle)", + "sub_path": "process/0.42 Draft @Snapmaker (0.6 nozzle).json" + }, + { + "name": "0.42 Draft @Snapmaker J1 (0.6 nozzle)", + "sub_path": "process/0.42 Draft @Snapmaker J1 (0.6 nozzle).json" + }, + { + "name": "0.48 Draft @Snapmaker (0.8 nozzle)", + "sub_path": "process/0.48 Draft @Snapmaker (0.8 nozzle).json" + }, + { + "name": "0.48 Draft @Snapmaker J1 (0.8 nozzle)", + "sub_path": "process/0.48 Draft @Snapmaker J1 (0.8 nozzle).json" + } + ], + "filament_list": [ + { + "name": "fdm_filament_common", + "sub_path": "filament/fdm_filament_common.json" + }, + { + "name": "fdm_filament_abs", + "sub_path": "filament/fdm_filament_abs.json" + }, + { + "name": "fdm_filament_asa", + "sub_path": "filament/fdm_filament_asa.json" + }, + { + "name": "fdm_filament_pa", + "sub_path": "filament/fdm_filament_pa.json" + }, + { + "name": "fdm_filament_petg", + "sub_path": "filament/fdm_filament_petg.json" + }, + { + "name": "fdm_filament_pet", + "sub_path": "filament/fdm_filament_pet.json" + }, + { + "name": "fdm_filament_pla", + "sub_path": "filament/fdm_filament_pla.json" + }, + { + "name": "fdm_filament_pla_eco", + "sub_path": "filament/fdm_filament_pla_eco.json" + }, + { + "name": "fdm_filament_pva", + "sub_path": "filament/fdm_filament_pva.json" + }, + { + "name": "fdm_filament_tpu", + "sub_path": "filament/fdm_filament_tpu.json" + }, + { + "name": "Snapmaker ABS @base", + "sub_path": "filament/Snapmaker ABS @base.json" + }, + { + "name": "Snapmaker ABS", + "sub_path": "filament/Snapmaker ABS.json" + }, + { + "name": "Snapmaker ABS @0.2 nozzle", + "sub_path": "filament/Snapmaker ABS @0.2 nozzle.json" + }, + { + "name": "Snapmaker ASA @base", + "sub_path": "filament/Snapmaker ASA @base.json" + }, + { + "name": "Snapmaker ASA", + "sub_path": "filament/Snapmaker ASA.json" + }, + { + "name": "Snapmaker ASA @0.2 nozzle", + "sub_path": "filament/Snapmaker ASA @0.2 nozzle.json" + }, + { + "name": "Snapmaker PA-CF @base", + "sub_path": "filament/Snapmaker PA-CF @base.json" + }, + { + "name": "Snapmaker PA-CF", + "sub_path": "filament/Snapmaker PA-CF.json" + }, + { + "name": "Snapmaker PETG @base", + "sub_path": "filament/Snapmaker PETG @base.json" + }, + { + "name": "Snapmaker PETG", + "sub_path": "filament/Snapmaker PETG.json" + }, + { + "name": "Snapmaker PETG @0.2 nozzle", + "sub_path": "filament/Snapmaker PETG @0.2 nozzle.json" + }, + { + "name": "Snapmaker PET @base", + "sub_path": "filament/Snapmaker PET @base.json" + }, + { + "name": "Snapmaker PET", + "sub_path": "filament/Snapmaker PET.json" + }, + { + "name": "Snapmaker PET @Dual", + "sub_path": "filament/Snapmaker PET @Dual.json" + }, + { + "name": "Snapmaker PETG-CF @base", + "sub_path": "filament/Snapmaker PETG-CF @base.json" + }, + { + "name": "Snapmaker PETG-CF", + "sub_path": "filament/Snapmaker PETG-CF.json" + }, + { + "name": "Snapmaker PLA Eco @base", + "sub_path": "filament/Snapmaker PLA Eco @base.json" + }, + { + "name": "Snapmaker PLA Eco", + "sub_path": "filament/Snapmaker PLA Eco.json" + }, + { + "name": "Snapmaker PLA @base", + "sub_path": "filament/Snapmaker PLA @base.json" + }, + { + "name": "Snapmaker PLA", + "sub_path": "filament/Snapmaker PLA.json" + }, + { + "name": "Snapmaker PLA-CF @base", + "sub_path": "filament/Snapmaker PLA-CF @base.json" + }, + { + "name": "Snapmaker PLA-CF", + "sub_path": "filament/Snapmaker PLA-CF.json" + }, + { + "name": "Snapmaker PLA Silk @base", + "sub_path": "filament/Snapmaker PLA Silk @base.json" + }, + { + "name": "Snapmaker PLA Silk", + "sub_path": "filament/Snapmaker PLA Silk.json" + }, + { + "name": "Snapmaker PLA Silk @0.2 nozzle", + "sub_path": "filament/Snapmaker PLA Silk @0.2 nozzle.json" + }, + { + "name": "PolyLite PLA @base", + "sub_path": "filament/PolyLite PLA @base.json" + }, + { + "name": "PolyLite PLA", + "sub_path": "filament/PolyLite PLA.json" + }, + { + "name": "PolyLite PLA @0.2 nozzle", + "sub_path": "filament/PolyLite PLA @0.2 nozzle.json" + }, + { + "name": "PolyTerra PLA @base", + "sub_path": "filament/PolyTerra PLA @base.json" + }, + { + "name": "PolyTerra PLA", + "sub_path": "filament/PolyTerra PLA.json" + }, + { + "name": "PolyTerra PLA @0.2 nozzle", + "sub_path": "filament/PolyTerra PLA @0.2 nozzle.json" + }, + { + "name": "Snapmaker PVA @base", + "sub_path": "filament/Snapmaker PVA @base.json" + }, + { + "name": "Snapmaker PVA", + "sub_path": "filament/Snapmaker PVA.json" + }, + { + "name": "Snapmaker PVA @0.2 nozzle", + "sub_path": "filament/Snapmaker PVA @0.2 nozzle.json" + }, + { + "name": "Snapmaker TPU @base", + "sub_path": "filament/Snapmaker TPU @base.json" + }, + { + "name": "Snapmaker TPU", + "sub_path": "filament/Snapmaker TPU.json" + }, + { + "name": "Snapmaker TPE", + "sub_path": "filament/Snapmaker TPE.json" + }, + { + "name": "Snapmaker J1 ABS @base", + "sub_path": "filament/Snapmaker J1 ABS @base.json" + }, + { + "name": "Snapmaker J1 ABS", + "sub_path": "filament/Snapmaker J1 ABS.json" + }, + { + "name": "Snapmaker J1 ABS @0.2 nozzle", + "sub_path": "filament/Snapmaker J1 ABS @0.2 nozzle.json" + }, + { + "name": "Snapmaker J1 ABS @0.8 nozzle", + "sub_path": "filament/Snapmaker J1 ABS @0.8 nozzle.json" + }, + { + "name": "Snapmaker J1 ASA @base", + "sub_path": "filament/Snapmaker J1 ASA @base.json" + }, + { + "name": "Snapmaker J1 ASA", + "sub_path": "filament/Snapmaker J1 ASA.json" + }, + { + "name": "Snapmaker J1 ASA @0.2 nozzle", + "sub_path": "filament/Snapmaker J1 ASA @0.2 nozzle.json" + }, + { + "name": "Snapmaker J1 PA-CF @base", + "sub_path": "filament/Snapmaker J1 PA-CF @base.json" + }, + { + "name": "Snapmaker J1 PA-CF", + "sub_path": "filament/Snapmaker J1 PA-CF.json" + }, + { + "name": "Snapmaker J1 PETG @base", + "sub_path": "filament/Snapmaker J1 PETG @base.json" + }, + { + "name": "Snapmaker J1 PETG", + "sub_path": "filament/Snapmaker J1 PETG.json" + }, + { + "name": "Snapmaker J1 PETG @0.2 nozzle", + "sub_path": "filament/Snapmaker J1 PETG @0.2 nozzle.json" + }, + { + "name": "Snapmaker J1 PETG @0.8 nozzle", + "sub_path": "filament/Snapmaker J1 PETG @0.8 nozzle.json" + }, + { + "name": "Snapmaker J1 PET @base", + "sub_path": "filament/Snapmaker J1 PET @base.json" + }, + { + "name": "Snapmaker J1 PET", + "sub_path": "filament/Snapmaker J1 PET.json" + }, + { + "name": "Snapmaker J1 PETG-CF @base", + "sub_path": "filament/Snapmaker J1 PETG-CF @base.json" + }, + { + "name": "Snapmaker J1 PETG-CF", + "sub_path": "filament/Snapmaker J1 PETG-CF.json" + }, + { + "name": "Snapmaker J1 PLA Eco @base", + "sub_path": "filament/Snapmaker J1 PLA Eco @base.json" + }, + { + "name": "Snapmaker J1 PLA Eco", + "sub_path": "filament/Snapmaker J1 PLA Eco.json" + }, + { + "name": "Snapmaker J1 PLA Eco @0.2 nozzle", + "sub_path": "filament/Snapmaker J1 PLA Eco @0.2 nozzle.json" + }, + { + "name": "Snapmaker J1 PLA Eco @0.8 nozzle", + "sub_path": "filament/Snapmaker J1 PLA Eco @0.8 nozzle.json" + }, + { + "name": "Snapmaker J1 PLA @base", + "sub_path": "filament/Snapmaker J1 PLA @base.json" + }, + { + "name": "Snapmaker J1 PLA", + "sub_path": "filament/Snapmaker J1 PLA.json" + }, + { + "name": "Snapmaker J1 PLA Matte @base", + "sub_path": "filament/Snapmaker J1 PLA Matte @base.json" + }, + { + "name": "Snapmaker J1 PLA Matte", + "sub_path": "filament/Snapmaker J1 PLA Matte.json" + }, + { + "name": "Snapmaker J1 PLA Matte @0.2 nozzle", + "sub_path": "filament/Snapmaker J1 PLA Matte @0.2 nozzle.json" + }, + { + "name": "Snapmaker J1 PLA Matte @0.8 nozzle", + "sub_path": "filament/Snapmaker J1 PLA Matte @0.8 nozzle.json" + }, + { + "name": "Snapmaker J1 PLA Metal @base", + "sub_path": "filament/Snapmaker J1 PLA Metal @base.json" + }, + { + "name": "Snapmaker J1 PLA Metal", + "sub_path": "filament/Snapmaker J1 PLA Metal.json" + }, + { + "name": "Snapmaker J1 PLA Metal @0.2 nozzle", + "sub_path": "filament/Snapmaker J1 PLA Metal @0.2 nozzle.json" + }, + { + "name": "Snapmaker J1 PLA-CF @base", + "sub_path": "filament/Snapmaker J1 PLA-CF @base.json" + }, + { + "name": "Snapmaker J1 PLA-CF", + "sub_path": "filament/Snapmaker J1 PLA-CF.json" + }, + { + "name": "Snapmaker J1 PLA-CF @0.8 nozzle", + "sub_path": "filament/Snapmaker J1 PLA-CF @0.8 nozzle.json" + }, + { + "name": "Snapmaker J1 PLA Silk @base", + "sub_path": "filament/Snapmaker J1 PLA Silk @base.json" + }, + { + "name": "Snapmaker J1 PLA Silk", + "sub_path": "filament/Snapmaker J1 PLA Silk.json" + }, + { + "name": "Snapmaker J1 PLA Silk @0.2 nozzle", + "sub_path": "filament/Snapmaker J1 PLA Silk @0.2 nozzle.json" + }, + { + "name": "PolyLite J1 PLA", + "sub_path": "filament/PolyLite J1 PLA.json" + }, + { + "name": "PolyLite J1 PLA @0.2 nozzle", + "sub_path": "filament/PolyLite J1 PLA @0.2 nozzle.json" + }, + { + "name": "PolyTerra J1 PLA", + "sub_path": "filament/PolyTerra J1 PLA.json" + }, + { + "name": "PolyTerra J1 PLA @0.2 nozzle", + "sub_path": "filament/PolyTerra J1 PLA @0.2 nozzle.json" + }, + { + "name": "Snapmaker J1 PVA @base", + "sub_path": "filament/Snapmaker J1 PVA @base.json" + }, + { + "name": "Snapmaker J1 PVA", + "sub_path": "filament/Snapmaker J1 PVA.json" + }, + { + "name": "Snapmaker J1 PVA @0.2 nozzle", + "sub_path": "filament/Snapmaker J1 PVA @0.2 nozzle.json" + }, + { + "name": "Snapmaker J1 TPU @base", + "sub_path": "filament/Snapmaker J1 TPU @base.json" + }, + { + "name": "Snapmaker J1 TPU", + "sub_path": "filament/Snapmaker J1 TPU.json" + }, + { + "name": "Snapmaker J1 TPU High-Flow", + "sub_path": "filament/Snapmaker J1 TPU High-Flow.json" + }, + { + "name": "Snapmaker J1 TPE", + "sub_path": "filament/Snapmaker J1 TPE.json" + } + ], + "machine_list": [ + { + "name": "fdm_common", + "sub_path": "machine/fdm_common.json" + }, + { + "name": "fdm_linear2", + "sub_path": "machine/fdm_linear2.json" + }, + { + "name": "fdm_linear2_dual", + "sub_path": "machine/fdm_linear2_dual.json" + }, + { + "name": "fdm_idex", + "sub_path": "machine/fdm_idex.json" + }, + { + "name": "fdm_a250", + "sub_path": "machine/fdm_a250.json" + }, + { + "name": "fdm_a350", + "sub_path": "machine/fdm_a350.json" + }, + { + "name": "fdm_a250_dual", + "sub_path": "machine/fdm_a250_dual.json" + }, + { + "name": "fdm_a350_dual", + "sub_path": "machine/fdm_a350_dual.json" + }, + { + "name": "fdm_a250_qs", + "sub_path": "machine/fdm_a250_qs.json" + }, + { + "name": "fdm_a350_qs", + "sub_path": "machine/fdm_a350_qs.json" + }, + { + "name": "fdm_a250_dual_qs", + "sub_path": "machine/fdm_a250_dual_qs.json" + }, + { + "name": "fdm_a350_dual_qs", + "sub_path": "machine/fdm_a350_dual_qs.json" + }, + { + "name": "Snapmaker J1 (0.2 nozzle)", + "sub_path": "machine/Snapmaker J1 (0.2 nozzle).json" + }, + { + "name": "Snapmaker J1 (0.4 nozzle)", + "sub_path": "machine/Snapmaker J1 (0.4 nozzle).json" + }, + { + "name": "Snapmaker J1 (0.6 nozzle)", + "sub_path": "machine/Snapmaker J1 (0.6 nozzle).json" + }, + { + "name": "Snapmaker J1 (0.8 nozzle)", + "sub_path": "machine/Snapmaker J1 (0.8 nozzle).json" + }, + { + "name": "Snapmaker A250 (0.2 nozzle)", + "sub_path": "machine/Snapmaker A250 (0.2 nozzle).json" + }, + { + "name": "Snapmaker A250 (0.4 nozzle)", + "sub_path": "machine/Snapmaker A250 (0.4 nozzle).json" + }, + { + "name": "Snapmaker A250 (0.6 nozzle)", + "sub_path": "machine/Snapmaker A250 (0.6 nozzle).json" + }, + { + "name": "Snapmaker A250 (0.8 nozzle)", + "sub_path": "machine/Snapmaker A250 (0.8 nozzle).json" + }, + { + "name": "Snapmaker A350 (0.2 nozzle)", + "sub_path": "machine/Snapmaker A350 (0.2 nozzle).json" + }, + { + "name": "Snapmaker A350 (0.4 nozzle)", + "sub_path": "machine/Snapmaker A350 (0.4 nozzle).json" + }, + { + "name": "Snapmaker A350 (0.6 nozzle)", + "sub_path": "machine/Snapmaker A350 (0.6 nozzle).json" + }, + { + "name": "Snapmaker A350 (0.8 nozzle)", + "sub_path": "machine/Snapmaker A350 (0.8 nozzle).json" + }, + { + "name": "Snapmaker A250 Dual (0.2 nozzle)", + "sub_path": "machine/Snapmaker A250 Dual (0.2 nozzle).json" + }, + { + "name": "Snapmaker A250 Dual (0.4 nozzle)", + "sub_path": "machine/Snapmaker A250 Dual (0.4 nozzle).json" + }, + { + "name": "Snapmaker A250 Dual (0.6 nozzle)", + "sub_path": "machine/Snapmaker A250 Dual (0.6 nozzle).json" + }, + { + "name": "Snapmaker A250 Dual (0.8 nozzle)", + "sub_path": "machine/Snapmaker A250 Dual (0.8 nozzle).json" + }, + { + "name": "Snapmaker A350 Dual (0.2 nozzle)", + "sub_path": "machine/Snapmaker A350 Dual (0.2 nozzle).json" + }, + { + "name": "Snapmaker A350 Dual (0.4 nozzle)", + "sub_path": "machine/Snapmaker A350 Dual (0.4 nozzle).json" + }, + { + "name": "Snapmaker A350 Dual (0.6 nozzle)", + "sub_path": "machine/Snapmaker A350 Dual (0.6 nozzle).json" + }, + { + "name": "Snapmaker A350 Dual (0.8 nozzle)", + "sub_path": "machine/Snapmaker A350 Dual (0.8 nozzle).json" + }, + { + "name": "Snapmaker A250 QSKit (0.2 nozzle)", + "sub_path": "machine/Snapmaker A250 QSKit (0.2 nozzle).json" + }, + { + "name": "Snapmaker A250 QSKit (0.4 nozzle)", + "sub_path": "machine/Snapmaker A250 QSKit (0.4 nozzle).json" + }, + { + "name": "Snapmaker A250 QSKit (0.6 nozzle)", + "sub_path": "machine/Snapmaker A250 QSKit (0.6 nozzle).json" + }, + { + "name": "Snapmaker A250 QSKit (0.8 nozzle)", + "sub_path": "machine/Snapmaker A250 QSKit (0.8 nozzle).json" + }, + { + "name": "Snapmaker A350 QSKit (0.2 nozzle)", + "sub_path": "machine/Snapmaker A350 QSKit (0.2 nozzle).json" + }, + { + "name": "Snapmaker A350 QSKit (0.4 nozzle)", + "sub_path": "machine/Snapmaker A350 QSKit (0.4 nozzle).json" + }, + { + "name": "Snapmaker A350 QSKit (0.6 nozzle)", + "sub_path": "machine/Snapmaker A350 QSKit (0.6 nozzle).json" + }, + { + "name": "Snapmaker A350 QSKit (0.8 nozzle)", + "sub_path": "machine/Snapmaker A350 QSKit (0.8 nozzle).json" + }, + { + "name": "Snapmaker A250 Dual QSKit (0.2 nozzle)", + "sub_path": "machine/Snapmaker A250 Dual QSKit (0.2 nozzle).json" + }, + { + "name": "Snapmaker A250 Dual QSKit (0.4 nozzle)", + "sub_path": "machine/Snapmaker A250 Dual QSKit (0.4 nozzle).json" + }, + { + "name": "Snapmaker A250 Dual QSKit (0.6 nozzle)", + "sub_path": "machine/Snapmaker A250 Dual QSKit (0.6 nozzle).json" + }, + { + "name": "Snapmaker A250 Dual QSKit (0.8 nozzle)", + "sub_path": "machine/Snapmaker A250 Dual QSKit (0.8 nozzle).json" + }, + { + "name": "Snapmaker A350 Dual QSKit (0.2 nozzle)", + "sub_path": "machine/Snapmaker A350 Dual QSKit (0.2 nozzle).json" + }, + { + "name": "Snapmaker A350 Dual QSKit (0.4 nozzle)", + "sub_path": "machine/Snapmaker A350 Dual QSKit (0.4 nozzle).json" + }, + { + "name": "Snapmaker A350 Dual QSKit (0.6 nozzle)", + "sub_path": "machine/Snapmaker A350 Dual QSKit (0.6 nozzle).json" + }, + { + "name": "Snapmaker A350 Dual QSKit (0.8 nozzle)", + "sub_path": "machine/Snapmaker A350 Dual QSKit (0.8 nozzle).json" + } + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/A250_bed.stl b/resources/profiles/Snapmaker/A250_bed.stl deleted file mode 100644 index c783af9ac1..0000000000 Binary files a/resources/profiles/Snapmaker/A250_bed.stl and /dev/null differ diff --git a/resources/profiles/Snapmaker/A250_texture.svg b/resources/profiles/Snapmaker/A250_texture.svg deleted file mode 100644 index 7f20598c35..0000000000 --- a/resources/profiles/Snapmaker/A250_texture.svg +++ /dev/null @@ -1,279 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/resources/profiles/Snapmaker/A350_bed.stl b/resources/profiles/Snapmaker/A350_bed.stl deleted file mode 100644 index ee418a68d4..0000000000 Binary files a/resources/profiles/Snapmaker/A350_bed.stl and /dev/null differ diff --git a/resources/profiles/Snapmaker/A350_texture.svg b/resources/profiles/Snapmaker/A350_texture.svg deleted file mode 100644 index 8e8c47b655..0000000000 --- a/resources/profiles/Snapmaker/A350_texture.svg +++ /dev/null @@ -1,383 +0,0 @@ - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/resources/profiles/Snapmaker/J1_texture.svg b/resources/profiles/Snapmaker/J1_texture.svg deleted file mode 100644 index 1df582cd69..0000000000 --- a/resources/profiles/Snapmaker/J1_texture.svg +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/resources/profiles/Snapmaker/Snapmaker A250 Dual QSKit_cover.png b/resources/profiles/Snapmaker/Snapmaker A250 Dual QSKit_cover.png new file mode 100644 index 0000000000..da8f89dd89 Binary files /dev/null and b/resources/profiles/Snapmaker/Snapmaker A250 Dual QSKit_cover.png differ diff --git a/resources/profiles/Snapmaker/Snapmaker A250 Dual_cover.png b/resources/profiles/Snapmaker/Snapmaker A250 Dual_cover.png new file mode 100644 index 0000000000..021389d37b Binary files /dev/null and b/resources/profiles/Snapmaker/Snapmaker A250 Dual_cover.png differ diff --git a/resources/profiles/Snapmaker/Snapmaker A250 QSKit_cover.png b/resources/profiles/Snapmaker/Snapmaker A250 QSKit_cover.png new file mode 100644 index 0000000000..da8f89dd89 Binary files /dev/null and b/resources/profiles/Snapmaker/Snapmaker A250 QSKit_cover.png differ diff --git a/resources/profiles/Snapmaker/Snapmaker A250 QSKit_texture.svg b/resources/profiles/Snapmaker/Snapmaker A250 QSKit_texture.svg new file mode 100644 index 0000000000..c66f1f9cf8 --- /dev/null +++ b/resources/profiles/Snapmaker/Snapmaker A250 QSKit_texture.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/resources/profiles/Snapmaker/Snapmaker A250_bed.stl b/resources/profiles/Snapmaker/Snapmaker A250_bed.stl new file mode 100644 index 0000000000..9016f9c4f5 Binary files /dev/null and b/resources/profiles/Snapmaker/Snapmaker A250_bed.stl differ diff --git a/resources/profiles/Snapmaker/Snapmaker A250_cover.png b/resources/profiles/Snapmaker/Snapmaker A250_cover.png index 21c047fbe9..021389d37b 100644 Binary files a/resources/profiles/Snapmaker/Snapmaker A250_cover.png and b/resources/profiles/Snapmaker/Snapmaker A250_cover.png differ diff --git a/resources/profiles/Snapmaker/Snapmaker A250_texture.svg b/resources/profiles/Snapmaker/Snapmaker A250_texture.svg new file mode 100644 index 0000000000..31abbfeaa7 --- /dev/null +++ b/resources/profiles/Snapmaker/Snapmaker A250_texture.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/profiles/Snapmaker/Snapmaker A350 Dual QSKit_cover.png b/resources/profiles/Snapmaker/Snapmaker A350 Dual QSKit_cover.png new file mode 100644 index 0000000000..7b5ae53476 Binary files /dev/null and b/resources/profiles/Snapmaker/Snapmaker A350 Dual QSKit_cover.png differ diff --git a/resources/profiles/Snapmaker/Snapmaker A350 Dual_cover.png b/resources/profiles/Snapmaker/Snapmaker A350 Dual_cover.png new file mode 100644 index 0000000000..f701fd1a8d Binary files /dev/null and b/resources/profiles/Snapmaker/Snapmaker A350 Dual_cover.png differ diff --git a/resources/profiles/Snapmaker/Snapmaker A350 QSKit_cover.png b/resources/profiles/Snapmaker/Snapmaker A350 QSKit_cover.png new file mode 100644 index 0000000000..7b5ae53476 Binary files /dev/null and b/resources/profiles/Snapmaker/Snapmaker A350 QSKit_cover.png differ diff --git a/resources/profiles/Snapmaker/Snapmaker A350 QSKit_texture.svg b/resources/profiles/Snapmaker/Snapmaker A350 QSKit_texture.svg new file mode 100644 index 0000000000..27777e16db --- /dev/null +++ b/resources/profiles/Snapmaker/Snapmaker A350 QSKit_texture.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/resources/profiles/Snapmaker/Snapmaker A350_bed.stl b/resources/profiles/Snapmaker/Snapmaker A350_bed.stl new file mode 100644 index 0000000000..761efa2fc5 Binary files /dev/null and b/resources/profiles/Snapmaker/Snapmaker A350_bed.stl differ diff --git a/resources/profiles/Snapmaker/Snapmaker A350_cover.png b/resources/profiles/Snapmaker/Snapmaker A350_cover.png index 9ec55958a8..f701fd1a8d 100644 Binary files a/resources/profiles/Snapmaker/Snapmaker A350_cover.png and b/resources/profiles/Snapmaker/Snapmaker A350_cover.png differ diff --git a/resources/profiles/Snapmaker/Snapmaker A350_texture.svg b/resources/profiles/Snapmaker/Snapmaker A350_texture.svg new file mode 100644 index 0000000000..a21a139607 --- /dev/null +++ b/resources/profiles/Snapmaker/Snapmaker A350_texture.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/profiles/Snapmaker/Snapmaker J1_bed.stl b/resources/profiles/Snapmaker/Snapmaker J1_bed.stl new file mode 100644 index 0000000000..d20c38aaf7 Binary files /dev/null and b/resources/profiles/Snapmaker/Snapmaker J1_bed.stl differ diff --git a/resources/profiles/Snapmaker/Snapmaker J1_cover.png b/resources/profiles/Snapmaker/Snapmaker J1_cover.png index 43c87c8c81..efe6bb3f1d 100644 Binary files a/resources/profiles/Snapmaker/Snapmaker J1_cover.png and b/resources/profiles/Snapmaker/Snapmaker J1_cover.png differ diff --git a/resources/profiles/Snapmaker/Snapmaker J1_texture.svg b/resources/profiles/Snapmaker/Snapmaker J1_texture.svg new file mode 100644 index 0000000000..18f40548da --- /dev/null +++ b/resources/profiles/Snapmaker/Snapmaker J1_texture.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/profiles/Snapmaker/filament/PolyLite J1 PLA @0.2 nozzle.json b/resources/profiles/Snapmaker/filament/PolyLite J1 PLA @0.2 nozzle.json new file mode 100644 index 0000000000..4e2b21f785 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/PolyLite J1 PLA @0.2 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "PolyLite J1 PLA @0.2 nozzle", + "setting_id": "431382384", + "inherits": "PolyLite PLA @0.2 nozzle", + "compatible_printers": [ + "Snapmaker J1 (0.2 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/PolyLite J1 PLA.json b/resources/profiles/Snapmaker/filament/PolyLite J1 PLA.json new file mode 100644 index 0000000000..ac3cdd9ba9 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/PolyLite J1 PLA.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "PolyLite J1 PLA", + "setting_id": "116125055", + "inherits": "PolyLite PLA @base", + "compatible_printers": [ + "Snapmaker J1 (0.4 nozzle)", + "Snapmaker J1 (0.6 nozzle)", + "Snapmaker J1 (0.8 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/PolyLite PLA @0.2 nozzle.json b/resources/profiles/Snapmaker/filament/PolyLite PLA @0.2 nozzle.json new file mode 100644 index 0000000000..f2caa20861 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/PolyLite PLA @0.2 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "PolyLite PLA @0.2 nozzle", + "setting_id": "1592803578", + "inherits": "PolyLite PLA @base", + "compatible_printers": [ + "Snapmaker A250 (0.2 nozzle)", + "Snapmaker A350 (0.2 nozzle)", + "Snapmaker A250 Dual (0.2 nozzle)", + "Snapmaker A350 Dual (0.2 nozzle)", + "Snapmaker A250 Dual QSKit (0.2 nozzle)", + "Snapmaker A350 Dual QSKit (0.2 nozzle)", + "Snapmaker A250 QSKit (0.2 nozzle)", + "Snapmaker A350 QSKit (0.2 nozzle)" + ], + "filament_max_volumetric_speed": [ + "1" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/PolyLite PLA @base.json b/resources/profiles/Snapmaker/filament/PolyLite PLA @base.json new file mode 100644 index 0000000000..6fd4e2987c --- /dev/null +++ b/resources/profiles/Snapmaker/filament/PolyLite PLA @base.json @@ -0,0 +1,20 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "PolyLite PLA @base", + "filament_id": "1393866034", + "inherits": "fdm_filament_pla", + "filament_flow_ratio": [ + "0.95" + ], + "filament_cost": [ + "90" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "default_filament_colour": [ + "#8269AC" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/PolyLite PLA.json b/resources/profiles/Snapmaker/filament/PolyLite PLA.json new file mode 100644 index 0000000000..b0e4fe3ed2 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/PolyLite PLA.json @@ -0,0 +1,34 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "PolyLite PLA", + "setting_id": "599651858", + "inherits": "PolyLite PLA @base", + "compatible_printers": [ + "Snapmaker A250 (0.4 nozzle)", + "Snapmaker A250 (0.6 nozzle)", + "Snapmaker A250 (0.8 nozzle)", + "Snapmaker A350 (0.4 nozzle)", + "Snapmaker A350 (0.6 nozzle)", + "Snapmaker A350 (0.8 nozzle)", + "Snapmaker A250 Dual (0.4 nozzle)", + "Snapmaker A250 Dual (0.6 nozzle)", + "Snapmaker A250 Dual (0.8 nozzle)", + "Snapmaker A350 Dual (0.4 nozzle)", + "Snapmaker A350 Dual (0.6 nozzle)", + "Snapmaker A350 Dual (0.8 nozzle)", + "Snapmaker A250 Dual QSKit (0.4 nozzle)", + "Snapmaker A250 Dual QSKit (0.6 nozzle)", + "Snapmaker A250 Dual QSKit (0.8 nozzle)", + "Snapmaker A350 Dual QSKit (0.4 nozzle)", + "Snapmaker A350 Dual QSKit (0.6 nozzle)", + "Snapmaker A350 Dual QSKit (0.8 nozzle)", + "Snapmaker A250 QSKit (0.4 nozzle)", + "Snapmaker A250 QSKit (0.6 nozzle)", + "Snapmaker A250 QSKit (0.8 nozzle)", + "Snapmaker A350 QSKit (0.4 nozzle)", + "Snapmaker A350 QSKit (0.6 nozzle)", + "Snapmaker A350 QSKit (0.8 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/PolyTerra J1 PLA @0.2 nozzle.json b/resources/profiles/Snapmaker/filament/PolyTerra J1 PLA @0.2 nozzle.json new file mode 100644 index 0000000000..24fda4c652 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/PolyTerra J1 PLA @0.2 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "PolyTerra J1 PLA @0.2 nozzle", + "setting_id": "1072374370", + "inherits": "PolyTerra PLA @0.2 nozzle", + "compatible_printers": [ + "Snapmaker J1 (0.2 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/PolyTerra J1 PLA.json b/resources/profiles/Snapmaker/filament/PolyTerra J1 PLA.json new file mode 100644 index 0000000000..9592d5cbd0 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/PolyTerra J1 PLA.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "PolyTerra J1 PLA", + "setting_id": "3958200796", + "inherits": "PolyTerra PLA @base", + "compatible_printers": [ + "Snapmaker J1 (0.4 nozzle)", + "Snapmaker J1 (0.6 nozzle)", + "Snapmaker J1 (0.8 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/PolyTerra PLA @0.2 nozzle.json b/resources/profiles/Snapmaker/filament/PolyTerra PLA @0.2 nozzle.json new file mode 100644 index 0000000000..f2b469c764 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/PolyTerra PLA @0.2 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "PolyTerra PLA @0.2 nozzle", + "setting_id": "409934824", + "inherits": "PolyTerra PLA @base", + "compatible_printers": [ + "Snapmaker A250 (0.2 nozzle)", + "Snapmaker A350 (0.2 nozzle)", + "Snapmaker A250 Dual (0.2 nozzle)", + "Snapmaker A350 Dual (0.2 nozzle)", + "Snapmaker A250 Dual QSKit (0.2 nozzle)", + "Snapmaker A350 Dual QSKit (0.2 nozzle)", + "Snapmaker A250 QSKit (0.2 nozzle)", + "Snapmaker A350 QSKit (0.2 nozzle)" + ], + "filament_max_volumetric_speed": [ + "1" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/PolyTerra PLA @base.json b/resources/profiles/Snapmaker/filament/PolyTerra PLA @base.json new file mode 100644 index 0000000000..c09b45b79f --- /dev/null +++ b/resources/profiles/Snapmaker/filament/PolyTerra PLA @base.json @@ -0,0 +1,20 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "PolyTerra PLA @base", + "filament_id": "3789592687", + "inherits": "fdm_filament_pla", + "filament_cost": [ + "80" + ], + "filament_density": [ + "1.31" + ], + "filament_max_volumetric_speed": [ + "18" + ], + "default_filament_colour": [ + "#73CEC8" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/PolyTerra PLA.json b/resources/profiles/Snapmaker/filament/PolyTerra PLA.json new file mode 100644 index 0000000000..712fbd4c46 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/PolyTerra PLA.json @@ -0,0 +1,34 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "PolyTerra PLA", + "setting_id": "3016316214", + "inherits": "PolyTerra PLA @base", + "compatible_printers": [ + "Snapmaker A250 (0.4 nozzle)", + "Snapmaker A250 (0.6 nozzle)", + "Snapmaker A250 (0.8 nozzle)", + "Snapmaker A350 (0.4 nozzle)", + "Snapmaker A350 (0.6 nozzle)", + "Snapmaker A350 (0.8 nozzle)", + "Snapmaker A250 Dual (0.4 nozzle)", + "Snapmaker A250 Dual (0.6 nozzle)", + "Snapmaker A250 Dual (0.8 nozzle)", + "Snapmaker A350 Dual (0.4 nozzle)", + "Snapmaker A350 Dual (0.6 nozzle)", + "Snapmaker A350 Dual (0.8 nozzle)", + "Snapmaker A250 Dual QSKit (0.4 nozzle)", + "Snapmaker A250 Dual QSKit (0.6 nozzle)", + "Snapmaker A250 Dual QSKit (0.8 nozzle)", + "Snapmaker A350 Dual QSKit (0.4 nozzle)", + "Snapmaker A350 Dual QSKit (0.6 nozzle)", + "Snapmaker A350 Dual QSKit (0.8 nozzle)", + "Snapmaker A250 QSKit (0.4 nozzle)", + "Snapmaker A250 QSKit (0.6 nozzle)", + "Snapmaker A250 QSKit (0.8 nozzle)", + "Snapmaker A350 QSKit (0.4 nozzle)", + "Snapmaker A350 QSKit (0.6 nozzle)", + "Snapmaker A350 QSKit (0.8 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker ABS @0.2 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker ABS @0.2 nozzle.json new file mode 100644 index 0000000000..1588ca9e2f --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker ABS @0.2 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker ABS @0.2 nozzle", + "setting_id": "363717724", + "inherits": "Snapmaker ABS @base", + "compatible_printers": [ + "Snapmaker A250 (0.2 nozzle)", + "Snapmaker A350 (0.2 nozzle)", + "Snapmaker A250 Dual (0.2 nozzle)", + "Snapmaker A350 Dual (0.2 nozzle)", + "Snapmaker A250 QSKit (0.2 nozzle)", + "Snapmaker A350 QSKit (0.2 nozzle)", + "Snapmaker A250 Dual QSKit (0.2 nozzle)", + "Snapmaker A350 Dual QSKit (0.2 nozzle)" + ], + "filament_max_volumetric_speed": [ + "2" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker ABS @base.json b/resources/profiles/Snapmaker/filament/Snapmaker ABS @base.json new file mode 100644 index 0000000000..446aca9041 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker ABS @base.json @@ -0,0 +1,8 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "Snapmaker ABS @base", + "filament_id": "3811508002", + "inherits": "fdm_filament_abs" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker ABS.json b/resources/profiles/Snapmaker/filament/Snapmaker ABS.json new file mode 100644 index 0000000000..e6280f6b7b --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker ABS.json @@ -0,0 +1,34 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker ABS", + "setting_id": "536148164", + "inherits": "Snapmaker ABS @base", + "compatible_printers": [ + "Snapmaker A250 (0.4 nozzle)", + "Snapmaker A250 (0.6 nozzle)", + "Snapmaker A250 (0.8 nozzle)", + "Snapmaker A350 (0.4 nozzle)", + "Snapmaker A350 (0.6 nozzle)", + "Snapmaker A350 (0.8 nozzle)", + "Snapmaker A250 Dual (0.4 nozzle)", + "Snapmaker A250 Dual (0.6 nozzle)", + "Snapmaker A250 Dual (0.8 nozzle)", + "Snapmaker A350 Dual (0.4 nozzle)", + "Snapmaker A350 Dual (0.6 nozzle)", + "Snapmaker A350 Dual (0.8 nozzle)", + "Snapmaker A250 QSKit (0.4 nozzle)", + "Snapmaker A250 QSKit (0.6 nozzle)", + "Snapmaker A250 QSKit (0.8 nozzle)", + "Snapmaker A350 QSKit (0.4 nozzle)", + "Snapmaker A350 QSKit (0.6 nozzle)", + "Snapmaker A350 QSKit (0.8 nozzle)", + "Snapmaker A250 Dual QSKit (0.4 nozzle)", + "Snapmaker A250 Dual QSKit (0.6 nozzle)", + "Snapmaker A250 Dual QSKit (0.8 nozzle)", + "Snapmaker A350 Dual QSKit (0.4 nozzle)", + "Snapmaker A350 Dual QSKit (0.6 nozzle)", + "Snapmaker A350 Dual QSKit (0.8 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker ASA @0.2 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker ASA @0.2 nozzle.json new file mode 100644 index 0000000000..8df1b2ac86 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker ASA @0.2 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker ASA @0.2 nozzle", + "setting_id": "978004695", + "inherits": "Snapmaker ASA @base", + "compatible_printers": [ + "Snapmaker A250 (0.2 nozzle)", + "Snapmaker A350 (0.2 nozzle)", + "Snapmaker A250 Dual (0.2 nozzle)", + "Snapmaker A350 Dual (0.2 nozzle)", + "Snapmaker A250 QSKit (0.2 nozzle)", + "Snapmaker A350 QSKit (0.2 nozzle)", + "Snapmaker A250 Dual QSKit (0.2 nozzle)", + "Snapmaker A350 Dual QSKit (0.2 nozzle)" + ], + "filament_max_volumetric_speed": [ + "2" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker ASA @base.json b/resources/profiles/Snapmaker/filament/Snapmaker ASA @base.json new file mode 100644 index 0000000000..d9e39a0879 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker ASA @base.json @@ -0,0 +1,8 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "Snapmaker ASA @base", + "filament_id": "2742961008", + "inherits": "fdm_filament_asa" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker ASA.json b/resources/profiles/Snapmaker/filament/Snapmaker ASA.json new file mode 100644 index 0000000000..5a4c9270d7 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker ASA.json @@ -0,0 +1,34 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker ASA", + "setting_id": "3214191260", + "inherits": "Snapmaker ASA @base", + "compatible_printers": [ + "Snapmaker A250 (0.4 nozzle)", + "Snapmaker A250 (0.6 nozzle)", + "Snapmaker A250 (0.8 nozzle)", + "Snapmaker A350 (0.4 nozzle)", + "Snapmaker A350 (0.6 nozzle)", + "Snapmaker A350 (0.8 nozzle)", + "Snapmaker A250 Dual (0.4 nozzle)", + "Snapmaker A250 Dual (0.6 nozzle)", + "Snapmaker A250 Dual (0.8 nozzle)", + "Snapmaker A350 Dual (0.4 nozzle)", + "Snapmaker A350 Dual (0.6 nozzle)", + "Snapmaker A350 Dual (0.8 nozzle)", + "Snapmaker A250 QSKit (0.4 nozzle)", + "Snapmaker A250 QSKit (0.6 nozzle)", + "Snapmaker A250 QSKit (0.8 nozzle)", + "Snapmaker A350 QSKit (0.4 nozzle)", + "Snapmaker A350 QSKit (0.6 nozzle)", + "Snapmaker A350 QSKit (0.8 nozzle)", + "Snapmaker A250 Dual QSKit (0.4 nozzle)", + "Snapmaker A250 Dual QSKit (0.6 nozzle)", + "Snapmaker A250 Dual QSKit (0.8 nozzle)", + "Snapmaker A350 Dual QSKit (0.4 nozzle)", + "Snapmaker A350 Dual QSKit (0.6 nozzle)", + "Snapmaker A350 Dual QSKit (0.8 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker Generic ABS.json b/resources/profiles/Snapmaker/filament/Snapmaker Generic ABS.json deleted file mode 100644 index 8e29ec8860..0000000000 --- a/resources/profiles/Snapmaker/filament/Snapmaker Generic ABS.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "type": "filament", - "filament_id": "GFB99", - "setting_id": "GFSA04", - "name": "Snapmaker Generic ABS", - "from": "system", - "instantiation": "true", - "inherits": "fdm_filament_abs", - "filament_flow_ratio": [ - "0.926" - ], - "filament_max_volumetric_speed": [ - "12" - ], - "compatible_printers": [ - "Snapmaker A250 0.4 nozzle", - "Snapmaker A350 0.4 nozzle" - ] -} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker Generic ASA.json b/resources/profiles/Snapmaker/filament/Snapmaker Generic ASA.json deleted file mode 100644 index 371c212e59..0000000000 --- a/resources/profiles/Snapmaker/filament/Snapmaker Generic ASA.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "type": "filament", - "filament_id": "GFB98", - "setting_id": "GFSA04", - "name": "Snapmaker Generic ASA", - "from": "system", - "instantiation": "true", - "inherits": "fdm_filament_asa", - "filament_flow_ratio": [ - "0.93" - ], - "filament_max_volumetric_speed": [ - "12" - ], - "compatible_printers": [ - "Snapmaker A250 0.4 nozzle", - "Snapmaker A350 0.4 nozzle" - ] -} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker Generic PA-CF.json b/resources/profiles/Snapmaker/filament/Snapmaker Generic PA-CF.json deleted file mode 100644 index e012f78eca..0000000000 --- a/resources/profiles/Snapmaker/filament/Snapmaker Generic PA-CF.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "filament", - "filament_id": "GFN98", - "setting_id": "GFSA04", - "name": "Snapmaker Generic PA-CF", - "from": "system", - "instantiation": "true", - "inherits": "fdm_filament_pa", - "filament_type": [ - "PA-CF" - ], - "nozzle_temperature_initial_layer": [ - "280" - ], - "nozzle_temperature": [ - "280" - ], - "filament_max_volumetric_speed": [ - "8" - ], - "compatible_printers": [ - "Snapmaker A250 0.4 nozzle", - "Snapmaker A350 0.4 nozzle" - ] -} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker Generic PA.json b/resources/profiles/Snapmaker/filament/Snapmaker Generic PA.json deleted file mode 100644 index bf51d081fb..0000000000 --- a/resources/profiles/Snapmaker/filament/Snapmaker Generic PA.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "type": "filament", - "filament_id": "GFN99", - "setting_id": "GFSA04", - "name": "Snapmaker Generic PA", - "from": "system", - "instantiation": "true", - "inherits": "fdm_filament_pa", - "nozzle_temperature_initial_layer": [ - "280" - ], - "nozzle_temperature": [ - "280" - ], - "filament_max_volumetric_speed": [ - "12" - ], - "compatible_printers": [ - "Snapmaker A250 0.4 nozzle", - "Snapmaker A350 0.4 nozzle" - ] -} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker Generic PC.json b/resources/profiles/Snapmaker/filament/Snapmaker Generic PC.json deleted file mode 100644 index 7601efa827..0000000000 --- a/resources/profiles/Snapmaker/filament/Snapmaker Generic PC.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "type": "filament", - "filament_id": "GFC99", - "setting_id": "GFSA04", - "name": "Snapmaker Generic PC", - "from": "system", - "instantiation": "true", - "inherits": "fdm_filament_pc", - "filament_max_volumetric_speed": [ - "12" - ], - "filament_flow_ratio": [ - "0.94" - ], - "compatible_printers": [ - "Snapmaker A250 0.4 nozzle", - "Snapmaker A350 0.4 nozzle" - ] -} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker Generic PETG.json b/resources/profiles/Snapmaker/filament/Snapmaker Generic PETG.json deleted file mode 100644 index 7ac6d570b1..0000000000 --- a/resources/profiles/Snapmaker/filament/Snapmaker Generic PETG.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "type": "filament", - "filament_id": "GFG99", - "setting_id": "GFSA04", - "name": "Snapmaker Generic PETG", - "from": "system", - "instantiation": "true", - "inherits": "fdm_filament_pet", - "reduce_fan_stop_start_freq": [ - "1" - ], - "slow_down_for_layer_cooling": [ - "1" - ], - "fan_cooling_layer_time": [ - "30" - ], - "overhang_fan_speed": [ - "90" - ], - "overhang_fan_threshold": [ - "25%" - ], - "fan_max_speed": [ - "90" - ], - "fan_min_speed": [ - "40" - ], - "slow_down_min_speed": [ - "10" - ], - "slow_down_layer_time": [ - "8" - ], - "filament_flow_ratio": [ - "0.95" - ], - "filament_max_volumetric_speed": [ - "10" - ], - "nozzle_temperature_initial_layer": [ - "245" - ], - "nozzle_temperature": [ - "245" - ], - "nozzle_temperature_range_high": [ - "250" - ], - "filament_start_gcode": [ - "; filament start gcode\n" - ], - "compatible_printers": [ - "Snapmaker A250 0.4 nozzle", - "Snapmaker A350 0.4 nozzle" - ] -} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker Generic PLA-CF.json b/resources/profiles/Snapmaker/filament/Snapmaker Generic PLA-CF.json deleted file mode 100644 index 3d5992c24d..0000000000 --- a/resources/profiles/Snapmaker/filament/Snapmaker Generic PLA-CF.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "filament", - "filament_id": "GFL98", - "setting_id": "GFSA04", - "name": "Snapmaker Generic PLA-CF", - "from": "system", - "instantiation": "true", - "inherits": "fdm_filament_pla", - "filament_flow_ratio": [ - "0.95" - ], - "filament_type": [ - "PLA-CF" - ], - "filament_max_volumetric_speed": [ - "12" - ], - "slow_down_layer_time": [ - "7" - ], - "compatible_printers": [ - "Snapmaker A250 0.4 nozzle", - "Snapmaker A350 0.4 nozzle" - ] -} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker Generic PLA.json b/resources/profiles/Snapmaker/filament/Snapmaker Generic PLA.json deleted file mode 100644 index 5fc8a821eb..0000000000 --- a/resources/profiles/Snapmaker/filament/Snapmaker Generic PLA.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "type": "filament", - "filament_id": "GFL99", - "setting_id": "GFSA04", - "name": "Snapmaker Generic PLA", - "from": "system", - "instantiation": "true", - "inherits": "fdm_filament_pla", - "filament_flow_ratio": [ - "0.92" - ], - "filament_max_volumetric_speed": [ - "12" - ], - "slow_down_layer_time": [ - "8" - ], - "nozzle_temperature_initial_layer": [ - "205" - ], - "nozzle_temperature": [ - "200" - ], - "compatible_printers": [ - "Snapmaker A250 0.4 nozzle", - "Snapmaker A350 0.4 nozzle" - ] -} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker Generic PVA.json b/resources/profiles/Snapmaker/filament/Snapmaker Generic PVA.json deleted file mode 100644 index 7778893086..0000000000 --- a/resources/profiles/Snapmaker/filament/Snapmaker Generic PVA.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "filament", - "filament_id": "GFS99", - "setting_id": "GFSA04", - "name": "Snapmaker Generic PVA", - "from": "system", - "instantiation": "true", - "inherits": "fdm_filament_pva", - "filament_flow_ratio": [ - "0.95" - ], - "filament_max_volumetric_speed": [ - "12" - ], - "slow_down_layer_time": [ - "7" - ], - "slow_down_min_speed": [ - "10" - ], - "compatible_printers": [ - "Snapmaker A250 0.4 nozzle", - "Snapmaker A350 0.4 nozzle" - ] -} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker Generic TPU.json b/resources/profiles/Snapmaker/filament/Snapmaker Generic TPU.json deleted file mode 100644 index 6654509f2a..0000000000 --- a/resources/profiles/Snapmaker/filament/Snapmaker Generic TPU.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "type": "filament", - "filament_id": "GFU99", - "setting_id": "GFSA04", - "name": "Snapmaker Generic TPU", - "from": "system", - "instantiation": "true", - "inherits": "fdm_filament_tpu", - "filament_max_volumetric_speed": [ - "3.2" - ], - "nozzle_temperature": [ - "220" - ], - "nozzle_temperature_initial_layer": [ - "220" - ], - "compatible_printers": [ - "Snapmaker A250 0.4 nozzle", - "Snapmaker A350 0.4 nozzle" - ] -} diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 ABS @0.2 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 ABS @0.2 nozzle.json new file mode 100644 index 0000000000..40a9ff19c2 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 ABS @0.2 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker J1 ABS @0.2 nozzle", + "setting_id": "418980201", + "inherits": "Snapmaker J1 ABS @base", + "compatible_printers": [ + "Snapmaker J1 (0.2 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 ABS @0.8 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 ABS @0.8 nozzle.json new file mode 100644 index 0000000000..04a2d058d6 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 ABS @0.8 nozzle.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker J1 ABS @0.8 nozzle", + "setting_id": "2302229921", + "inherits": "Snapmaker J1 ABS @base", + "compatible_printers": [ + "Snapmaker J1 (0.8 nozzle)" + ], + "filament_max_volumetric_speed": [ + "22" + ], + "slow_down_min_speed": [ + "10" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 ABS @base.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 ABS @base.json new file mode 100644 index 0000000000..d49172be1c --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 ABS @base.json @@ -0,0 +1,23 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "Snapmaker J1 ABS @base", + "filament_id": "1223824394", + "inherits": "fdm_filament_abs", + "overhang_fan_speed": [ + "29" + ], + "filament_flow_ratio": [ + "0.95" + ], + "filament_max_volumetric_speed": [ + "18" + ], + "fan_max_speed": [ + "29" + ], + "pressure_advance": [ + "0.02" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 ABS.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 ABS.json index f8ab2e002c..1c656d9a7a 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker J1 ABS.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 ABS.json @@ -1,25 +1,12 @@ { - "type": "filament", - "filament_id": "GFB99", - "setting_id": "GFSX04", - "name": "Snapmaker J1 ABS", - "from": "system", - "instantiation": "true", - "inherits": "fdm_filament_abs", - "filament_flow_ratio": [ - "0.926" - ], - "filament_max_volumetric_speed": [ - "12" - ], - "compatible_printers": [ - "Snapmaker J1 0.4 nozzle", - "Snapmaker J1 0.6 nozzle" - ], - "filament_end_gcode": [ - "; ====================================\n;END Gcode for filament T[current_extruder] \nG92 E0\nG1 F600 E-6 ;retract\n{if current_extruder == 0}G0 X-20 F12000 {endif} ;\n{if current_extruder == 1}G0 X350 F12000 {endif} ;\nM106 S0 ; Lüfter aus\n{if has_wipe_tower and total_toolchanges > 0 and current_extruder == 0}T1 \nG0 X{wipe_tower_x[0]} Y{wipe_tower_y[0]} F{travel_speed*60}{endif} ;\n{if has_wipe_tower and total_toolchanges > 0 and current_extruder == 1}T0 \nG0 X{wipe_tower_x[0]} Y{wipe_tower_y[0]} F{travel_speed*60}{endif} ;\n;END gcode for filament T[current_extruder] (Ende) \n; =====================================" - ], - "filament_start_gcode": [ - "; ====================================\n; START gcode for filament T[current_extruder]\nM900 T[current_extruder] K0.054\nG1 F600 E5.5 \nM106 S255 ;Lüfter an\n; START gcode for filament T[current_extruder] (Ende)\n; ====================================" - ] -} + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker J1 ABS", + "setting_id": "3810006449", + "inherits": "Snapmaker J1 ABS @base", + "compatible_printers": [ + "Snapmaker J1 (0.4 nozzle)", + "Snapmaker J1 (0.6 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 ASA @0.2 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 ASA @0.2 nozzle.json new file mode 100644 index 0000000000..41f1e92077 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 ASA @0.2 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker J1 ASA @0.2 nozzle", + "setting_id": "924839906", + "inherits": "Snapmaker J1 ASA @base", + "compatible_printers": [ + "Snapmaker J1 (0.2 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 ASA @base.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 ASA @base.json new file mode 100644 index 0000000000..a38b508223 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 ASA @base.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "Snapmaker J1 ASA @base", + "filament_id": "144877656", + "inherits": "fdm_filament_asa", + "overhang_fan_speed": [ + "20" + ], + "fan_max_speed": [ + "20" + ], + "fan_min_speed": [ + "0" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 ASA.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 ASA.json index b7bd80c1a2..5f194609a8 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker J1 ASA.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 ASA.json @@ -1,25 +1,13 @@ { - "type": "filament", - "filament_id": "GFB98", - "setting_id": "GFSX04", - "name": "Snapmaker J1 ASA", - "from": "system", - "instantiation": "true", - "inherits": "fdm_filament_asa", - "filament_flow_ratio": [ - "0.93" - ], - "filament_max_volumetric_speed": [ - "12" - ], - "compatible_printers": [ - "Snapmaker J1 0.4 nozzle", - "Snapmaker J1 0.6 nozzle" - ], - "filament_end_gcode": [ - "; ====================================\n;END Gcode for filament T[current_extruder] \nG92 E0\nG1 F600 E-6 ;retract\n{if current_extruder == 0}G0 X-20 F12000 {endif} ;\n{if current_extruder == 1}G0 X350 F12000 {endif} ;\nM106 S0 ; Lüfter aus\n{if has_wipe_tower and total_toolchanges > 0 and current_extruder == 0}T1 \nG0 X{wipe_tower_x[0]} Y{wipe_tower_y[0]} F{travel_speed*60}{endif} ;\n{if has_wipe_tower and total_toolchanges > 0 and current_extruder == 1}T0 \nG0 X{wipe_tower_x[0]} Y{wipe_tower_y[0]} F{travel_speed*60}{endif} ;\n;END gcode for filament T[current_extruder] (Ende) \n; =====================================" - ], - "filament_start_gcode": [ - "; ====================================\n; START gcode for filament T[current_extruder]\nM900 T[current_extruder] K0.054\nG1 F600 E5.5 \nM106 S255 ;Lüfter an\n; START gcode for filament T[current_extruder] (Ende)\n; ====================================" - ] -} + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker J1 ASA", + "setting_id": "1131956201", + "inherits": "Snapmaker J1 ASA @base", + "compatible_printers": [ + "Snapmaker J1 (0.4 nozzle)", + "Snapmaker J1 (0.6 nozzle)", + "Snapmaker J1 (0.8 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 PA-CF @base.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 PA-CF @base.json new file mode 100644 index 0000000000..b7bda1fadc --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 PA-CF @base.json @@ -0,0 +1,20 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "Snapmaker J1 PA-CF @base", + "filament_id": "1210173120", + "inherits": "fdm_filament_pa", + "overhang_fan_speed": [ + "55" + ], + "filament_flow_ratio": [ + "0.96" + ], + "fan_max_speed": [ + "55" + ], + "fan_min_speed": [ + "29" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 PA-CF.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 PA-CF.json index b0fae488fb..a0b6cc6e02 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker J1 PA-CF.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 PA-CF.json @@ -1,25 +1,13 @@ { - "type": "filament", - "filament_id": "GFN98", - "setting_id": "GFSX04", - "name": "Snapmaker J1 PA-CF", - "from": "system", - "instantiation": "true", - "inherits": "fdm_filament_pa", - "filament_type": [ - "PA-CF" - ], - "nozzle_temperature_initial_layer": [ - "280" - ], - "nozzle_temperature": [ - "280" - ], - "filament_max_volumetric_speed": [ - "8" - ], - "compatible_printers": [ - "Snapmaker J1 0.4 nozzle", - "Snapmaker J1 0.6 nozzle" - ] + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker J1 PA-CF", + "setting_id": "2221614608", + "inherits": "Snapmaker J1 PA-CF @base", + "compatible_printers": [ + "Snapmaker J1 (0.4 nozzle)", + "Snapmaker J1 (0.6 nozzle)", + "Snapmaker J1 (0.8 nozzle)" + ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 PA.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 PA.json deleted file mode 100644 index 11ccd401e3..0000000000 --- a/resources/profiles/Snapmaker/filament/Snapmaker J1 PA.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "type": "filament", - "filament_id": "GFN99", - "setting_id": "GFSX04", - "name": "Snapmaker J1 PA", - "from": "system", - "instantiation": "true", - "inherits": "fdm_filament_pa", - "nozzle_temperature_initial_layer": [ - "280" - ], - "nozzle_temperature": [ - "280" - ], - "filament_max_volumetric_speed": [ - "12" - ], - "compatible_printers": [ - "Snapmaker J1 0.4 nozzle", - "Snapmaker J1 0.6 nozzle" - ], - "filament_end_gcode": [ - "; ====================================\n;END Gcode for filament T[current_extruder] \nG92 E0\nG1 F600 E-6 ;retract\n{if current_extruder == 0}G0 X-20 F12000 {endif} ;\n{if current_extruder == 1}G0 X350 F12000 {endif} ;\nM106 S0 ; Lüfter aus\n{if has_wipe_tower and total_toolchanges > 0 and current_extruder == 0}T1 \nG0 X{wipe_tower_x[0]} Y{wipe_tower_y[0]} F{travel_speed*60}{endif} ;\n{if has_wipe_tower and total_toolchanges > 0 and current_extruder == 1}T0 \nG0 X{wipe_tower_x[0]} Y{wipe_tower_y[0]} F{travel_speed*60}{endif} ;\n;END gcode for filament T[current_extruder] (Ende) \n; =====================================" - ], - "filament_start_gcode": [ - "; ====================================\n; START gcode for filament T[current_extruder]\nM900 T[current_extruder] K0.054\nG1 F600 E5.5 \nM106 S255 ;Lüfter an\n; START gcode for filament T[current_extruder] (Ende)\n; ====================================" - ] -} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 PC.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 PC.json deleted file mode 100644 index 61283755ec..0000000000 --- a/resources/profiles/Snapmaker/filament/Snapmaker J1 PC.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "filament", - "filament_id": "GFC99", - "setting_id": "GFSX04", - "name": "Snapmaker J1 PC", - "from": "system", - "instantiation": "true", - "inherits": "fdm_filament_pc", - "filament_max_volumetric_speed": [ - "12" - ], - "filament_flow_ratio": [ - "0.94" - ], - "compatible_printers": [ - "Snapmaker J1 0.4 nozzle", - "Snapmaker J1 0.6 nozzle" - ], - "filament_end_gcode": [ - "; ====================================\n;END Gcode for filament T[current_extruder] \nG92 E0\nG1 F600 E-6 ;retract\n{if current_extruder == 0}G0 X-20 F12000 {endif} ;\n{if current_extruder == 1}G0 X350 F12000 {endif} ;\nM106 S0 ; Lüfter aus\n{if has_wipe_tower and total_toolchanges > 0 and current_extruder == 0}T1 \nG0 X{wipe_tower_x[0]} Y{wipe_tower_y[0]} F{travel_speed*60}{endif} ;\n{if has_wipe_tower and total_toolchanges > 0 and current_extruder == 1}T0 \nG0 X{wipe_tower_x[0]} Y{wipe_tower_y[0]} F{travel_speed*60}{endif} ;\n;END gcode for filament T[current_extruder] (Ende) \n; =====================================" - ], - "filament_start_gcode": [ - "; ====================================\n; START gcode for filament T[current_extruder]\nM900 T[current_extruder] K0.054\nG1 F600 E5.5 \nM106 S255 ;Lüfter an\n; START gcode for filament T[current_extruder] (Ende)\n; ====================================" - ] -} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 PET @base.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 PET @base.json new file mode 100644 index 0000000000..a65db99924 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 PET @base.json @@ -0,0 +1,23 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "Snapmaker J1 PET @base", + "filament_id": "1009481135", + "inherits": "fdm_filament_pet", + "overhang_fan_speed": [ + "40" + ], + "filament_max_volumetric_speed": [ + "6.8" + ], + "fan_max_speed": [ + "50" + ], + "fan_min_speed": [ + "26" + ], + "slow_down_min_speed": [ + "35" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 PET.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 PET.json new file mode 100644 index 0000000000..e45ced946d --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 PET.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker J1 PET", + "setting_id": "802807698", + "inherits": "Snapmaker J1 PET @base", + "compatible_printers": [ + "Snapmaker J1 (0.4 nozzle)", + "Snapmaker J1 (0.6 nozzle)", + "Snapmaker J1 (0.8 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 PETG @0.2 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 PETG @0.2 nozzle.json new file mode 100644 index 0000000000..f8c6325bc1 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 PETG @0.2 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker J1 PETG @0.2 nozzle", + "setting_id": "1003693375", + "inherits": "Snapmaker J1 PETG @base", + "compatible_printers": [ + "Snapmaker J1 (0.2 nozzle)" + ], + "filament_max_volumetric_speed": [ + "1.2" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 PETG @0.8 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 PETG @0.8 nozzle.json new file mode 100644 index 0000000000..3860051545 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 PETG @0.8 nozzle.json @@ -0,0 +1,20 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker J1 PETG @0.8 nozzle", + "setting_id": "2853386743", + "inherits": "Snapmaker J1 PETG @base", + "compatible_printers": [ + "Snapmaker J1 (0.8 nozzle)" + ], + "filament_max_volumetric_speed": [ + "16" + ], + "fan_max_speed": [ + "60" + ], + "fan_min_speed": [ + "20" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 PETG @base.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 PETG @base.json new file mode 100644 index 0000000000..d856f8ed3e --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 PETG @base.json @@ -0,0 +1,53 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "Snapmaker J1 PETG @base", + "filament_id": "1172603684", + "inherits": "fdm_filament_petg", + "filament_density": [ + "1.25" + ], + "filament_max_volumetric_speed": [ + "14" + ], + "filament_z_hop_types": [ + "Spiral Lift" + ], + "filament_retraction_speed": [ + "35" + ], + "nozzle_temperature": [ + "255" + ], + "temperature_vitrification": [ + "178" + ], + "fan_max_speed": [ + "40" + ], + "fan_min_speed": [ + "10" + ], + "cool_plate_temp": [ + "70" + ], + "eng_plate_temp": [ + "70" + ], + "textured_plate_temp": [ + "70" + ], + "cool_plate_temp_initial_layer": [ + "70" + ], + "eng_plate_temp_initial_layer": [ + "70" + ], + "textured_plate_temp_initial_layer": [ + "70" + ], + "nozzle_temperature_range_low": [ + "240" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 PETG-CF @base.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 PETG-CF @base.json new file mode 100644 index 0000000000..30d518d9d4 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 PETG-CF @base.json @@ -0,0 +1,80 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "Snapmaker J1 PETG-CF @base", + "filament_id": "4235401834", + "inherits": "fdm_filament_petg", + "required_nozzle_HRC": [ + "40" + ], + "reduce_fan_stop_start_freq": [ + "0" + ], + "fan_cooling_layer_time": [ + "20" + ], + "filament_cost": [ + "40" + ], + "filament_density": [ + "1.25" + ], + "filament_max_volumetric_speed": [ + "14" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_retraction_length": [ + "nil" + ], + "nozzle_temperature": [ + "255" + ], + "temperature_vitrification": [ + "178" + ], + "fan_max_speed": [ + "30" + ], + "fan_min_speed": [ + "0" + ], + "slow_down_min_speed": [ + "10" + ], + "slow_down_layer_time": [ + "6" + ], + "enable_pressure_advance": [ + "0" + ], + "cool_plate_temp": [ + "70" + ], + "eng_plate_temp": [ + "70" + ], + "textured_plate_temp": [ + "70" + ], + "cool_plate_temp_initial_layer": [ + "70" + ], + "eng_plate_temp_initial_layer": [ + "70" + ], + "textured_plate_temp_initial_layer": [ + "70" + ], + "default_filament_colour": [ + "#3D3C39" + ], + "filament_type": [ + "PETG-CF" + ], + "nozzle_temperature_range_low": [ + "240" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 PETG-CF.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 PETG-CF.json new file mode 100644 index 0000000000..1eabb7aa99 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 PETG-CF.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker J1 PETG-CF", + "setting_id": "961448549", + "inherits": "Snapmaker J1 PETG-CF @base", + "compatible_printers": [ + "Snapmaker J1 (0.4 nozzle)", + "Snapmaker J1 (0.6 nozzle)", + "Snapmaker J1 (0.8 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 PETG.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 PETG.json index 2ec81e84cd..0809500ba4 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker J1 PETG.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 PETG.json @@ -1,64 +1,12 @@ { - "type": "filament", - "filament_id": "GFG99", - "setting_id": "GFSX04", - "name": "Snapmaker J1 PETG", - "from": "system", - "instantiation": "true", - "inherits": "fdm_filament_pet", - "reduce_fan_stop_start_freq": [ - "1" - ], - "slow_down_for_layer_cooling": [ - "1" - ], - "fan_cooling_layer_time": [ - "30" - ], - "overhang_fan_speed": [ - "90" - ], - "overhang_fan_threshold": [ - "25%" - ], - "fan_max_speed": [ - "90" - ], - "fan_min_speed": [ - "40" - ], - "slow_down_min_speed": [ - "10" - ], - "slow_down_layer_time": [ - "8" - ], - "filament_flow_ratio": [ - "0.95" - ], - "filament_max_volumetric_speed": [ - "10" - ], - "nozzle_temperature_initial_layer": [ - "245" - ], - "nozzle_temperature": [ - "245" - ], - "nozzle_temperature_range_high": [ - "250" - ], - "filament_start_gcode": [ - "; filament start gcode\n" - ], - "compatible_printers": [ - "Snapmaker J1 0.4 nozzle", - "Snapmaker J1 0.6 nozzle" - ], - "filament_end_gcode": [ - "; ====================================\n;END Gcode for filament T[current_extruder] \nG92 E0\nG1 F600 E-6 ;retract\n{if current_extruder == 0}G0 X-20 F12000 {endif} ;\n{if current_extruder == 1}G0 X350 F12000 {endif} ;\nM106 S0 ; Lüfter aus\n{if has_wipe_tower and total_toolchanges > 0 and current_extruder == 0}T1 \nG0 X{wipe_tower_x[0]} Y{wipe_tower_y[0]} F{travel_speed*60}{endif} ;\n{if has_wipe_tower and total_toolchanges > 0 and current_extruder == 1}T0 \nG0 X{wipe_tower_x[0]} Y{wipe_tower_y[0]} F{travel_speed*60}{endif} ;\n;END gcode for filament T[current_extruder] (Ende) \n; =====================================" - ], - "filament_start_gcode": [ - "; ====================================\n; START gcode for filament T[current_extruder]\nM900 T[current_extruder] K0.054\nG1 F600 E5.5 \nM106 S255 ;Lüfter an\n; START gcode for filament T[current_extruder] (Ende)\n; ====================================" - ] -} + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker J1 PETG", + "setting_id": "613683209", + "inherits": "Snapmaker J1 PETG @base", + "compatible_printers": [ + "Snapmaker J1 (0.4 nozzle)", + "Snapmaker J1 (0.6 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA @base.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA @base.json new file mode 100644 index 0000000000..abd1c42389 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA @base.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "Snapmaker J1 PLA @base", + "filament_id": "377675245", + "inherits": "fdm_filament_pla", + "filament_retraction_length": [ + "nil" + ], + "nozzle_temperature": [ + "220" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Eco @0.2 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Eco @0.2 nozzle.json new file mode 100644 index 0000000000..8a67ab623a --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Eco @0.2 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker J1 PLA Eco @0.2 nozzle", + "setting_id": "2482225039", + "inherits": "Snapmaker J1 PLA Eco @base", + "compatible_printers": [ + "Snapmaker J1 (0.2 nozzle)" + ], + "filament_max_volumetric_speed": [ + "2" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Eco @0.8 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Eco @0.8 nozzle.json new file mode 100644 index 0000000000..a43f177fb4 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Eco @0.8 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker J1 PLA Eco @0.8 nozzle", + "setting_id": "36938567", + "inherits": "Snapmaker J1 PLA Eco @base", + "compatible_printers": [ + "Snapmaker J1 (0.8 nozzle)" + ], + "slow_down_min_speed": [ + "20" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Eco @base.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Eco @base.json new file mode 100644 index 0000000000..f5f24aa8c0 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Eco @base.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "Snapmaker J1 PLA Eco @base", + "filament_id": "3383257822", + "inherits": "fdm_filament_pla_eco", + "filament_density": [ + "1.26" + ], + "filament_max_volumetric_speed": [ + "12" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Eco.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Eco.json new file mode 100644 index 0000000000..d93dd88aa3 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Eco.json @@ -0,0 +1,12 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker J1 PLA Eco", + "setting_id": "2168597171", + "inherits": "Snapmaker J1 PLA Eco @base", + "compatible_printers": [ + "Snapmaker J1 (0.4 nozzle)", + "Snapmaker J1 (0.6 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Matte @0.2 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Matte @0.2 nozzle.json new file mode 100644 index 0000000000..5658f30ad9 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Matte @0.2 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker J1 PLA Matte @0.2 nozzle", + "setting_id": "424999360", + "inherits": "Snapmaker J1 PLA Matte @base", + "compatible_printers": [ + "Snapmaker J1 (0.2 nozzle)" + ], + "filament_max_volumetric_speed": [ + "2" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Matte @0.8 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Matte @0.8 nozzle.json new file mode 100644 index 0000000000..b3f6fa1f3b --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Matte @0.8 nozzle.json @@ -0,0 +1,17 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker J1 PLA Matte @0.8 nozzle", + "setting_id": "2291459336", + "inherits": "Snapmaker J1 PLA Matte @base", + "compatible_printers": [ + "Snapmaker J1 (0.8 nozzle)" + ], + "filament_max_volumetric_speed": [ + "22" + ], + "slow_down_min_speed": [ + "20" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Matte @base.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Matte @base.json new file mode 100644 index 0000000000..efca77692f --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Matte @base.json @@ -0,0 +1,20 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "Snapmaker J1 PLA Matte @base", + "filament_id": "1192769348", + "inherits": "fdm_filament_pla", + "filament_density": [ + "1.32" + ], + "filament_max_volumetric_speed": [ + "19" + ], + "nozzle_temperature_initial_layer": [ + "215" + ], + "default_filament_colour": [ + "#EAC3C3" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Matte.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Matte.json new file mode 100644 index 0000000000..dcb46bbdb2 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Matte.json @@ -0,0 +1,12 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker J1 PLA Matte", + "setting_id": "2836087278", + "inherits": "Snapmaker J1 PLA Matte @base", + "compatible_printers": [ + "Snapmaker J1 (0.4 nozzle)", + "Snapmaker J1 (0.6 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Metal @0.2 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Metal @0.2 nozzle.json new file mode 100644 index 0000000000..76191c0713 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Metal @0.2 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker J1 PLA Metal @0.2 nozzle", + "setting_id": "2833378734", + "inherits": "Snapmaker J1 PLA Metal @base", + "compatible_printers": [ + "Snapmaker J1 (0.2 nozzle)" + ], + "filament_max_volumetric_speed": [ + "2" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Metal @base.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Metal @base.json new file mode 100644 index 0000000000..3d75258f56 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Metal @base.json @@ -0,0 +1,23 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "Snapmaker J1 PLA Metal @base", + "filament_id": "4012961186", + "inherits": "fdm_filament_pla", + "filament_cost": [ + "90" + ], + "filament_density": [ + "1.25" + ], + "filament_max_volumetric_speed": [ + "16" + ], + "nozzle_temperature": [ + "220" + ], + "default_filament_colour": [ + "#767A7E" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Metal.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Metal.json new file mode 100644 index 0000000000..707a3419e6 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Metal.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker J1 PLA Metal", + "setting_id": "1744865289", + "inherits": "Snapmaker J1 PLA Metal @base", + "compatible_printers": [ + "Snapmaker J1 (0.4 nozzle)", + "Snapmaker J1 (0.6 nozzle)", + "Snapmaker J1 (0.8 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Silk @0.2 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Silk @0.2 nozzle.json new file mode 100644 index 0000000000..b9593831a9 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Silk @0.2 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker J1 PLA Silk @0.2 nozzle", + "setting_id": "1135517568", + "inherits": "Snapmaker J1 PLA Silk @base", + "compatible_printers": [ + "Snapmaker J1 (0.2 nozzle)" + ], + "filament_max_volumetric_speed": [ + "2" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Silk @base.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Silk @base.json new file mode 100644 index 0000000000..e9fc62b8fc --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Silk @base.json @@ -0,0 +1,32 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "Snapmaker J1 PLA Silk @base", + "filament_id": "1528786603", + "inherits": "fdm_filament_pla", + "hot_plate_temp_initial_layer": [ + "65" + ], + "filament_cost": [ + "70" + ], + "filament_density": [ + "1.32" + ], + "filament_max_volumetric_speed": [ + "12" + ], + "filament_retraction_length": [ + "0.5" + ], + "nozzle_temperature_initial_layer": [ + "230" + ], + "nozzle_temperature": [ + "230" + ], + "default_filament_colour": [ + "#CF942B" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Silk.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Silk.json new file mode 100644 index 0000000000..a368217496 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA Silk.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker J1 PLA Silk", + "setting_id": "155396375", + "inherits": "Snapmaker J1 PLA Silk @base", + "compatible_printers": [ + "Snapmaker J1 (0.4 nozzle)", + "Snapmaker J1 (0.6 nozzle)", + "Snapmaker J1 (0.8 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA-CF @0.8 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA-CF @0.8 nozzle.json new file mode 100644 index 0000000000..e7714a602f --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA-CF @0.8 nozzle.json @@ -0,0 +1,14 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker J1 PLA-CF @0.8 nozzle", + "setting_id": "2684050537", + "inherits": "Snapmaker J1 PLA-CF @base", + "compatible_printers": [ + "Snapmaker J1 (0.8 nozzle)" + ], + "filament_max_volumetric_speed": [ + "18" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA-CF @base.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA-CF @base.json new file mode 100644 index 0000000000..699e8eee37 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA-CF @base.json @@ -0,0 +1,65 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "Snapmaker J1 PLA-CF @base", + "filament_id": "3806593857", + "inherits": "fdm_filament_pla", + "required_nozzle_HRC": [ + "40" + ], + "hot_plate_temp": [ + "55" + ], + "hot_plate_temp_initial_layer": [ + "55" + ], + "filament_density": [ + "1.22" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "nozzle_temperature_initial_layer": [ + "230" + ], + "nozzle_temperature": [ + "230" + ], + "temperature_vitrification": [ + "150" + ], + "cool_plate_temp": [ + "55" + ], + "eng_plate_temp": [ + "55" + ], + "textured_plate_temp": [ + "55" + ], + "cool_plate_temp_initial_layer": [ + "55" + ], + "eng_plate_temp_initial_layer": [ + "55" + ], + "textured_plate_temp_initial_layer": [ + "55" + ], + "default_filament_colour": [ + "#3D3C39" + ], + "filament_type": [ + "PLA-CF" + ], + "nozzle_temperature_range_low": [ + "210" + ], + "nozzle_temperature_range_high": [ + "250" + ], + "additional_cooling_fan_speed": [ + "0" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA-CF.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA-CF.json index 4a90afee34..7038ead330 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA-CF.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA-CF.json @@ -1,31 +1,12 @@ { - "type": "filament", - "filament_id": "GFL98", - "setting_id": "GFSX04", - "name": "Snapmaker J1 PLA-CF", - "from": "system", - "instantiation": "true", - "inherits": "fdm_filament_pla", - "filament_flow_ratio": [ - "0.95" - ], - "filament_type": [ - "PLA-CF" - ], - "filament_max_volumetric_speed": [ - "12" - ], - "slow_down_layer_time": [ - "7" - ], - "compatible_printers": [ - "Snapmaker J1 0.4 nozzle", - "Snapmaker J1 0.6 nozzle" - ], - "filament_end_gcode": [ - "; ====================================\n;END Gcode for filament T[current_extruder] \nG92 E0\nG1 F600 E-6 ;retract\n{if current_extruder == 0}G0 X-20 F12000 {endif} ;\n{if current_extruder == 1}G0 X350 F12000 {endif} ;\nM106 S0 ; Lüfter aus\n{if has_wipe_tower and total_toolchanges > 0 and current_extruder == 0}T1 \nG0 X{wipe_tower_x[0]} Y{wipe_tower_y[0]} F{travel_speed*60}{endif} ;\n{if has_wipe_tower and total_toolchanges > 0 and current_extruder == 1}T0 \nG0 X{wipe_tower_x[0]} Y{wipe_tower_y[0]} F{travel_speed*60}{endif} ;\n;END gcode for filament T[current_extruder] (Ende) \n; =====================================" - ], - "filament_start_gcode": [ - "; ====================================\n; START gcode for filament T[current_extruder]\nM900 T[current_extruder] K0.054\nG1 F600 E5.5 \nM106 S255 ;Lüfter an\n; START gcode for filament T[current_extruder] (Ende)\n; ====================================" - ] + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker J1 PLA-CF", + "setting_id": "3872452111", + "inherits": "Snapmaker J1 PLA-CF @base", + "compatible_printers": [ + "Snapmaker J1 (0.4 nozzle)", + "Snapmaker J1 (0.6 nozzle)" + ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA.json index e2b673778d..8fd8735e24 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 PLA.json @@ -1,34 +1,14 @@ { - "type": "filament", - "filament_id": "GFL99", - "setting_id": "GFSX04", - "name": "Snapmaker J1 PLA", - "from": "system", - "instantiation": "true", - "inherits": "fdm_filament_pla", - "filament_flow_ratio": [ - "0.92" - ], - "filament_max_volumetric_speed": [ - "12" - ], - "slow_down_layer_time": [ - "8" - ], - "nozzle_temperature_initial_layer": [ - "205" - ], - "nozzle_temperature": [ - "200" - ], - "compatible_printers": [ - "Snapmaker J1 0.4 nozzle", - "Snapmaker J1 0.6 nozzle" - ], - "filament_end_gcode": [ - "; ====================================\n;END Gcode for filament T[current_extruder] \nG92 E0\nG1 F600 E-6 ;retract\n{if current_extruder == 0}G0 X-20 F12000 {endif} ;\n{if current_extruder == 1}G0 X350 F12000 {endif} ;\nM106 S0 ; Lüfter aus\n{if has_wipe_tower and total_toolchanges > 0 and current_extruder == 0}T1 \nG0 X{wipe_tower_x[0]} Y{wipe_tower_y[0]} F{travel_speed*60}{endif} ;\n{if has_wipe_tower and total_toolchanges > 0 and current_extruder == 1}T0 \nG0 X{wipe_tower_x[0]} Y{wipe_tower_y[0]} F{travel_speed*60}{endif} ;\n;END gcode for filament T[current_extruder] (Ende) \n; =====================================" - ], - "filament_start_gcode": [ - "; ====================================\n; START gcode for filament T[current_extruder]\nM900 T[current_extruder] K0.054\nG1 F600 E5.5 \nM106 S255 ;Lüfter an\n; START gcode for filament T[current_extruder] (Ende)\n; ====================================" - ] -} + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker J1 PLA", + "setting_id": "2479259696", + "inherits": "Snapmaker J1 PLA @base", + "compatible_printers": [ + "Snapmaker J1 (0.2 nozzle)", + "Snapmaker J1 (0.4 nozzle)", + "Snapmaker J1 (0.6 nozzle)", + "Snapmaker J1 (0.8 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 PVA @0.2 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 PVA @0.2 nozzle.json new file mode 100644 index 0000000000..441ecdde35 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 PVA @0.2 nozzle.json @@ -0,0 +1,20 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker J1 PVA @0.2 nozzle", + "setting_id": "1311098152", + "inherits": "Snapmaker J1 PVA @base", + "compatible_printers": [ + "Snapmaker J1 (0.2 nozzle)" + ], + "filament_max_volumetric_speed": [ + "1.2" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature": [ + "220" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 PVA @base.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 PVA @base.json new file mode 100644 index 0000000000..e7e03c48e1 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 PVA @base.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "Snapmaker J1 PVA @base", + "filament_id": "4227461134", + "inherits": "fdm_filament_pva", + "slow_down_layer_time": [ + "8" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 PVA.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 PVA.json index c546e9874b..8bd2c3cb53 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker J1 PVA.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 PVA.json @@ -1,31 +1,13 @@ { - "type": "filament", - "filament_id": "GFS99", - "setting_id": "GFSX04", - "name": "Snapmaker J1 PVA", - "from": "system", - "instantiation": "true", - "inherits": "fdm_filament_pva", - "filament_flow_ratio": [ - "0.95" - ], - "filament_max_volumetric_speed": [ - "12" - ], - "slow_down_layer_time": [ - "7" - ], - "slow_down_min_speed": [ - "10" - ], - "compatible_printers": [ - "Snapmaker J1 0.4 nozzle", - "Snapmaker J1 0.6 nozzle" - ], - "filament_end_gcode": [ - "; ====================================\n;END Gcode for filament T[current_extruder] \nG92 E0\nG1 F600 E-6 ;retract\n{if current_extruder == 0}G0 X-20 F12000 {endif} ;\n{if current_extruder == 1}G0 X350 F12000 {endif} ;\nM106 S0 ; Lüfter aus\n{if has_wipe_tower and total_toolchanges > 0 and current_extruder == 0}T1 \nG0 X{wipe_tower_x[0]} Y{wipe_tower_y[0]} F{travel_speed*60}{endif} ;\n{if has_wipe_tower and total_toolchanges > 0 and current_extruder == 1}T0 \nG0 X{wipe_tower_x[0]} Y{wipe_tower_y[0]} F{travel_speed*60}{endif} ;\n;END gcode for filament T[current_extruder] (Ende) \n; =====================================" - ], - "filament_start_gcode": [ - "; ====================================\n; START gcode for filament T[current_extruder]\nM900 T[current_extruder] K0.054\nG1 F600 E5.5 \nM106 S255 ;Lüfter an\n; START gcode for filament T[current_extruder] (Ende)\n; ====================================" - ] -} + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker J1 PVA", + "setting_id": "602634987", + "inherits": "Snapmaker J1 PVA @base", + "compatible_printers": [ + "Snapmaker J1 (0.4 nozzle)", + "Snapmaker J1 (0.6 nozzle)", + "Snapmaker J1 (0.8 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 TPE.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 TPE.json new file mode 100644 index 0000000000..c2ae2b9c6a --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 TPE.json @@ -0,0 +1,43 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker J1 TPE", + "setting_id": "1976938920", + "inherits": "Snapmaker J1 TPU @base", + "compatible_printers": [ + "Snapmaker J1 (0.4 nozzle)", + "Snapmaker J1 (0.6 nozzle)", + "Snapmaker J1 (0.8 nozzle)" + ], + "hot_plate_temp": [ + "45" + ], + "hot_plate_temp_initial_layer": [ + "45" + ], + "overhang_fan_speed": [ + "65" + ], + "filament_flow_ratio": [ + "1.1" + ], + "filament_density": [ + "1.22" + ], + "filament_max_volumetric_speed": [ + "7.2" + ], + "fan_max_speed": [ + "65" + ], + "fan_min_speed": [ + "65" + ], + "default_filament_colour": [ + "#383737" + ], + "filament_notes": [ + "eSUN eLastic TPE-83A\n" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 TPU @base.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 TPU @base.json new file mode 100644 index 0000000000..101d1bcd19 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 TPU @base.json @@ -0,0 +1,8 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "Snapmaker J1 TPU @base", + "filament_id": "4092268632", + "inherits": "fdm_filament_tpu" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 TPU High-Flow.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 TPU High-Flow.json new file mode 100644 index 0000000000..f377e7e279 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 TPU High-Flow.json @@ -0,0 +1,31 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker J1 TPU High-Flow", + "setting_id": "4255325782", + "inherits": "Snapmaker J1 TPU @base", + "compatible_printers": [ + "Snapmaker J1 (0.4 nozzle)", + "Snapmaker J1 (0.6 nozzle)", + "Snapmaker J1 (0.8 nozzle)" + ], + "filament_flow_ratio": [ + "0.983" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_max_volumetric_speed": [ + "7.6" + ], + "filament_retraction_length": [ + "0.8" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_notes": [ + "!! It needs to be dried before use.\nSnapmaker TPU 95A High-Flow\n" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker J1 TPU.json b/resources/profiles/Snapmaker/filament/Snapmaker J1 TPU.json index a35466e545..ceb9599d6f 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker J1 TPU.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker J1 TPU.json @@ -1,28 +1,13 @@ { - "type": "filament", - "filament_id": "GFU99", - "setting_id": "GFSX04", - "name": "Snapmaker J1 TPU", - "from": "system", - "instantiation": "true", - "inherits": "fdm_filament_tpu", - "filament_max_volumetric_speed": [ - "3.2" - ], - "nozzle_temperature": [ - "220" - ], - "nozzle_temperature_initial_layer": [ - "220" - ], - "compatible_printers": [ - "Snapmaker J1 0.4 nozzle", - "Snapmaker J1 0.6 nozzle" - ], - "filament_end_gcode": [ - "; ====================================\n;END Gcode for filament T[current_extruder] \nG92 E0\nG1 F600 E-6 ;retract\n{if current_extruder == 0}G0 X-20 F12000 {endif} ;\n{if current_extruder == 1}G0 X350 F12000 {endif} ;\nM106 S0 ; Lüfter aus\n{if has_wipe_tower and total_toolchanges > 0 and current_extruder == 0}T1 \nG0 X{wipe_tower_x[0]} Y{wipe_tower_y[0]} F{travel_speed*60}{endif} ;\n{if has_wipe_tower and total_toolchanges > 0 and current_extruder == 1}T0 \nG0 X{wipe_tower_x[0]} Y{wipe_tower_y[0]} F{travel_speed*60}{endif} ;\n;END gcode for filament T[current_extruder] (Ende) \n; =====================================" - ], - "filament_start_gcode": [ - "; ====================================\n; START gcode for filament T[current_extruder]\nM900 T[current_extruder] K0.054\nG1 F600 E5.5 \nM106 S255 ;Lüfter an\n; START gcode for filament T[current_extruder] (Ende)\n; ====================================" - ] -} + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker J1 TPU", + "setting_id": "1751294412", + "inherits": "Snapmaker J1 TPU @base", + "compatible_printers": [ + "Snapmaker J1 (0.4 nozzle)", + "Snapmaker J1 (0.6 nozzle)", + "Snapmaker J1 (0.8 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PA-CF @base.json b/resources/profiles/Snapmaker/filament/Snapmaker PA-CF @base.json new file mode 100644 index 0000000000..fa98fa8e2c --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PA-CF @base.json @@ -0,0 +1,8 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "Snapmaker PA-CF @base", + "filament_id": "581236806", + "inherits": "fdm_filament_pa" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PA-CF.json b/resources/profiles/Snapmaker/filament/Snapmaker PA-CF.json new file mode 100644 index 0000000000..0a7bc640b3 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PA-CF.json @@ -0,0 +1,34 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker PA-CF", + "setting_id": "144230794", + "inherits": "Snapmaker PA-CF @base", + "compatible_printers": [ + "Snapmaker A250 (0.4 nozzle)", + "Snapmaker A250 (0.6 nozzle)", + "Snapmaker A250 (0.8 nozzle)", + "Snapmaker A350 (0.4 nozzle)", + "Snapmaker A350 (0.6 nozzle)", + "Snapmaker A350 (0.8 nozzle)", + "Snapmaker A250 Dual (0.4 nozzle)", + "Snapmaker A250 Dual (0.6 nozzle)", + "Snapmaker A250 Dual (0.8 nozzle)", + "Snapmaker A350 Dual (0.4 nozzle)", + "Snapmaker A350 Dual (0.6 nozzle)", + "Snapmaker A350 Dual (0.8 nozzle)", + "Snapmaker A250 QSKit (0.4 nozzle)", + "Snapmaker A250 QSKit (0.6 nozzle)", + "Snapmaker A250 QSKit (0.8 nozzle)", + "Snapmaker A350 QSKit (0.4 nozzle)", + "Snapmaker A350 QSKit (0.6 nozzle)", + "Snapmaker A350 QSKit (0.8 nozzle)", + "Snapmaker A250 Dual QSKit (0.4 nozzle)", + "Snapmaker A250 Dual QSKit (0.6 nozzle)", + "Snapmaker A250 Dual QSKit (0.8 nozzle)", + "Snapmaker A350 Dual QSKit (0.4 nozzle)", + "Snapmaker A350 Dual QSKit (0.6 nozzle)", + "Snapmaker A350 Dual QSKit (0.8 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PET @Dual.json b/resources/profiles/Snapmaker/filament/Snapmaker PET @Dual.json new file mode 100644 index 0000000000..aaafafde46 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PET @Dual.json @@ -0,0 +1,31 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker PET @Dual", + "setting_id": "145337790", + "inherits": "Snapmaker PET @base", + "compatible_printers": [ + "Snapmaker A250 Dual (0.4 nozzle)", + "Snapmaker A250 Dual (0.6 nozzle)", + "Snapmaker A250 Dual (0.8 nozzle)", + "Snapmaker A350 Dual (0.4 nozzle)", + "Snapmaker A350 Dual (0.6 nozzle)", + "Snapmaker A350 Dual (0.8 nozzle)", + "Snapmaker A250 Dual QSKit (0.4 nozzle)", + "Snapmaker A250 Dual QSKit (0.6 nozzle)", + "Snapmaker A250 Dual QSKit (0.8 nozzle)", + "Snapmaker A350 Dual QSKit (0.4 nozzle)", + "Snapmaker A350 Dual QSKit (0.6 nozzle)", + "Snapmaker A350 Dual QSKit (0.8 nozzle)" + ], + "overhang_fan_speed": [ + "40" + ], + "fan_max_speed": [ + "55" + ], + "fan_min_speed": [ + "20" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PET @base.json b/resources/profiles/Snapmaker/filament/Snapmaker PET @base.json new file mode 100644 index 0000000000..47594a10d7 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PET @base.json @@ -0,0 +1,8 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "Snapmaker PET @base", + "filament_id": "2549587591", + "inherits": "fdm_filament_pet" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PET.json b/resources/profiles/Snapmaker/filament/Snapmaker PET.json new file mode 100644 index 0000000000..76943095ea --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PET.json @@ -0,0 +1,34 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker PET", + "setting_id": "3543479015", + "inherits": "Snapmaker PET @base", + "compatible_printers": [ + "Snapmaker A250 (0.4 nozzle)", + "Snapmaker A250 (0.6 nozzle)", + "Snapmaker A250 (0.8 nozzle)", + "Snapmaker A350 (0.4 nozzle)", + "Snapmaker A350 (0.6 nozzle)", + "Snapmaker A350 (0.8 nozzle)", + "Snapmaker A250 Dual (0.4 nozzle)", + "Snapmaker A250 Dual (0.6 nozzle)", + "Snapmaker A250 Dual (0.8 nozzle)", + "Snapmaker A350 Dual (0.4 nozzle)", + "Snapmaker A350 Dual (0.6 nozzle)", + "Snapmaker A350 Dual (0.8 nozzle)", + "Snapmaker A250 QSKit (0.4 nozzle)", + "Snapmaker A250 QSKit (0.6 nozzle)", + "Snapmaker A250 QSKit (0.8 nozzle)", + "Snapmaker A350 QSKit (0.4 nozzle)", + "Snapmaker A350 QSKit (0.6 nozzle)", + "Snapmaker A350 QSKit (0.8 nozzle)", + "Snapmaker A250 Dual QSKit (0.4 nozzle)", + "Snapmaker A250 Dual QSKit (0.6 nozzle)", + "Snapmaker A250 Dual QSKit (0.8 nozzle)", + "Snapmaker A350 Dual QSKit (0.4 nozzle)", + "Snapmaker A350 Dual QSKit (0.6 nozzle)", + "Snapmaker A350 Dual QSKit (0.8 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PETG @0.2 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker PETG @0.2 nozzle.json new file mode 100644 index 0000000000..824fe3aeb6 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PETG @0.2 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker PETG @0.2 nozzle", + "setting_id": "1835906521", + "inherits": "Snapmaker PETG @base", + "compatible_printers": [ + "Snapmaker A250 (0.2 nozzle)", + "Snapmaker A350 (0.2 nozzle)", + "Snapmaker A250 Dual (0.2 nozzle)", + "Snapmaker A350 Dual (0.2 nozzle)", + "Snapmaker A250 QSKit (0.2 nozzle)", + "Snapmaker A350 QSKit (0.2 nozzle)", + "Snapmaker A250 Dual QSKit (0.2 nozzle)", + "Snapmaker A350 Dual QSKit (0.2 nozzle)" + ], + "filament_max_volumetric_speed": [ + "1" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PETG @base.json b/resources/profiles/Snapmaker/filament/Snapmaker PETG @base.json new file mode 100644 index 0000000000..e038808bcc --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PETG @base.json @@ -0,0 +1,8 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "Snapmaker PETG @base", + "filament_id": "1895495477", + "inherits": "fdm_filament_petg" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PETG-CF @base.json b/resources/profiles/Snapmaker/filament/Snapmaker PETG-CF @base.json new file mode 100644 index 0000000000..13a9d74895 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PETG-CF @base.json @@ -0,0 +1,74 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "Snapmaker PETG-CF @base", + "filament_id": "1355502217", + "inherits": "fdm_filament_petg", + "required_nozzle_HRC": [ + "40" + ], + "reduce_fan_stop_start_freq": [ + "0" + ], + "fan_cooling_layer_time": [ + "20" + ], + "filament_cost": [ + "40" + ], + "filament_density": [ + "1.25" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_retraction_length": [ + "nil" + ], + "temperature_vitrification": [ + "178" + ], + "fan_max_speed": [ + "30" + ], + "fan_min_speed": [ + "0" + ], + "slow_down_min_speed": [ + "10" + ], + "slow_down_layer_time": [ + "6" + ], + "enable_pressure_advance": [ + "0" + ], + "cool_plate_temp": [ + "70" + ], + "eng_plate_temp": [ + "70" + ], + "textured_plate_temp": [ + "70" + ], + "cool_plate_temp_initial_layer": [ + "70" + ], + "eng_plate_temp_initial_layer": [ + "70" + ], + "textured_plate_temp_initial_layer": [ + "70" + ], + "default_filament_colour": [ + "#3D3C39" + ], + "filament_type": [ + "PETG-CF" + ], + "nozzle_temperature_range_low": [ + "240" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PETG-CF.json b/resources/profiles/Snapmaker/filament/Snapmaker PETG-CF.json new file mode 100644 index 0000000000..25bc06a599 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PETG-CF.json @@ -0,0 +1,34 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker PETG-CF", + "setting_id": "2186648559", + "inherits": "Snapmaker PETG-CF @base", + "compatible_printers": [ + "Snapmaker A250 (0.4 nozzle)", + "Snapmaker A250 (0.6 nozzle)", + "Snapmaker A250 (0.8 nozzle)", + "Snapmaker A350 (0.4 nozzle)", + "Snapmaker A350 (0.6 nozzle)", + "Snapmaker A350 (0.8 nozzle)", + "Snapmaker A250 Dual (0.4 nozzle)", + "Snapmaker A250 Dual (0.6 nozzle)", + "Snapmaker A250 Dual (0.8 nozzle)", + "Snapmaker A350 Dual (0.4 nozzle)", + "Snapmaker A350 Dual (0.6 nozzle)", + "Snapmaker A350 Dual (0.8 nozzle)", + "Snapmaker A250 QSKit (0.4 nozzle)", + "Snapmaker A250 QSKit (0.6 nozzle)", + "Snapmaker A250 QSKit (0.8 nozzle)", + "Snapmaker A350 QSKit (0.4 nozzle)", + "Snapmaker A350 QSKit (0.6 nozzle)", + "Snapmaker A350 QSKit (0.8 nozzle)", + "Snapmaker A250 Dual QSKit (0.4 nozzle)", + "Snapmaker A250 Dual QSKit (0.6 nozzle)", + "Snapmaker A250 Dual QSKit (0.8 nozzle)", + "Snapmaker A350 Dual QSKit (0.4 nozzle)", + "Snapmaker A350 Dual QSKit (0.6 nozzle)", + "Snapmaker A350 Dual QSKit (0.8 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PETG.json b/resources/profiles/Snapmaker/filament/Snapmaker PETG.json new file mode 100644 index 0000000000..88dc72729d --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PETG.json @@ -0,0 +1,34 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker PETG", + "setting_id": "67598679", + "inherits": "Snapmaker PETG @base", + "compatible_printers": [ + "Snapmaker A250 (0.4 nozzle)", + "Snapmaker A250 (0.6 nozzle)", + "Snapmaker A250 (0.8 nozzle)", + "Snapmaker A350 (0.4 nozzle)", + "Snapmaker A350 (0.6 nozzle)", + "Snapmaker A350 (0.8 nozzle)", + "Snapmaker A250 Dual (0.4 nozzle)", + "Snapmaker A250 Dual (0.6 nozzle)", + "Snapmaker A250 Dual (0.8 nozzle)", + "Snapmaker A350 Dual (0.4 nozzle)", + "Snapmaker A350 Dual (0.6 nozzle)", + "Snapmaker A350 Dual (0.8 nozzle)", + "Snapmaker A250 QSKit (0.4 nozzle)", + "Snapmaker A250 QSKit (0.6 nozzle)", + "Snapmaker A250 QSKit (0.8 nozzle)", + "Snapmaker A350 QSKit (0.4 nozzle)", + "Snapmaker A350 QSKit (0.6 nozzle)", + "Snapmaker A350 QSKit (0.8 nozzle)", + "Snapmaker A250 Dual QSKit (0.4 nozzle)", + "Snapmaker A250 Dual QSKit (0.6 nozzle)", + "Snapmaker A250 Dual QSKit (0.8 nozzle)", + "Snapmaker A350 Dual QSKit (0.4 nozzle)", + "Snapmaker A350 Dual QSKit (0.6 nozzle)", + "Snapmaker A350 Dual QSKit (0.8 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA @base.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA @base.json new file mode 100644 index 0000000000..d2de6a6e62 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA @base.json @@ -0,0 +1,8 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "Snapmaker PLA @base", + "filament_id": "3177068229", + "inherits": "fdm_filament_pla" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Eco @base.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Eco @base.json new file mode 100644 index 0000000000..1913f9c86f --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Eco @base.json @@ -0,0 +1,8 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "Snapmaker PLA Eco @base", + "filament_id": "1695556157", + "inherits": "fdm_filament_pla_eco" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Eco.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Eco.json new file mode 100644 index 0000000000..afe83fd299 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Eco.json @@ -0,0 +1,34 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker PLA Eco", + "setting_id": "978926393", + "inherits": "Snapmaker PLA Eco @base", + "compatible_printers": [ + "Snapmaker A250 (0.2 nozzle)", + "Snapmaker A250 (0.4 nozzle)", + "Snapmaker A250 (0.6 nozzle)", + "Snapmaker A250 (0.8 nozzle)", + "Snapmaker A350 (0.2 nozzle)", + "Snapmaker A350 (0.4 nozzle)", + "Snapmaker A350 (0.6 nozzle)", + "Snapmaker A350 (0.8 nozzle)", + "Snapmaker A250 Dual (0.2 nozzle)", + "Snapmaker A250 Dual (0.4 nozzle)", + "Snapmaker A250 Dual (0.6 nozzle)", + "Snapmaker A250 Dual (0.8 nozzle)", + "Snapmaker A350 Dual (0.2 nozzle)", + "Snapmaker A350 Dual (0.4 nozzle)", + "Snapmaker A350 Dual (0.6 nozzle)", + "Snapmaker A350 Dual (0.8 nozzle)", + "Snapmaker A250 Dual QSKit (0.2 nozzle)", + "Snapmaker A250 Dual QSKit (0.4 nozzle)", + "Snapmaker A250 Dual QSKit (0.6 nozzle)", + "Snapmaker A250 Dual QSKit (0.8 nozzle)", + "Snapmaker A350 Dual QSKit (0.2 nozzle)", + "Snapmaker A350 Dual QSKit (0.4 nozzle)", + "Snapmaker A350 Dual QSKit (0.6 nozzle)", + "Snapmaker A350 Dual QSKit (0.8 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @0.2 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @0.2 nozzle.json new file mode 100644 index 0000000000..9e7b884d47 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @0.2 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker PLA Silk @0.2 nozzle", + "setting_id": "3051834979", + "inherits": "Snapmaker PLA Silk @base", + "compatible_printers": [ + "Snapmaker A250 (0.2 nozzle)", + "Snapmaker A350 (0.2 nozzle)", + "Snapmaker A250 Dual (0.2 nozzle)", + "Snapmaker A350 Dual (0.2 nozzle)", + "Snapmaker A250 Dual QSKit (0.2 nozzle)", + "Snapmaker A350 Dual QSKit (0.2 nozzle)", + "Snapmaker A250 QSKit (0.2 nozzle)", + "Snapmaker A350 QSKit (0.2 nozzle)" + ], + "filament_max_volumetric_speed": [ + "2" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @base.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @base.json new file mode 100644 index 0000000000..bc0c710e54 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @base.json @@ -0,0 +1,23 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "Snapmaker PLA Silk @base", + "filament_id": "1655727393", + "inherits": "fdm_filament_pla", + "hot_plate_temp_initial_layer": [ + "65" + ], + "filament_cost": [ + "70" + ], + "filament_max_volumetric_speed": [ + "7.5" + ], + "filament_retraction_length": [ + "0.5" + ], + "default_filament_colour": [ + "#CF942B" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk.json new file mode 100644 index 0000000000..e26c80ff7e --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk.json @@ -0,0 +1,34 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker PLA Silk", + "setting_id": "76896312", + "inherits": "Snapmaker PLA Silk @base", + "compatible_printers": [ + "Snapmaker A250 (0.4 nozzle)", + "Snapmaker A250 (0.6 nozzle)", + "Snapmaker A250 (0.8 nozzle)", + "Snapmaker A350 (0.4 nozzle)", + "Snapmaker A350 (0.6 nozzle)", + "Snapmaker A350 (0.8 nozzle)", + "Snapmaker A250 Dual (0.4 nozzle)", + "Snapmaker A250 Dual (0.6 nozzle)", + "Snapmaker A250 Dual (0.8 nozzle)", + "Snapmaker A350 Dual (0.4 nozzle)", + "Snapmaker A350 Dual (0.6 nozzle)", + "Snapmaker A350 Dual (0.8 nozzle)", + "Snapmaker A250 Dual QSKit (0.4 nozzle)", + "Snapmaker A250 Dual QSKit (0.6 nozzle)", + "Snapmaker A250 Dual QSKit (0.8 nozzle)", + "Snapmaker A350 Dual QSKit (0.4 nozzle)", + "Snapmaker A350 Dual QSKit (0.6 nozzle)", + "Snapmaker A350 Dual QSKit (0.8 nozzle)", + "Snapmaker A250 QSKit (0.4 nozzle)", + "Snapmaker A250 QSKit (0.6 nozzle)", + "Snapmaker A250 QSKit (0.8 nozzle)", + "Snapmaker A350 QSKit (0.4 nozzle)", + "Snapmaker A350 QSKit (0.6 nozzle)", + "Snapmaker A350 QSKit (0.8 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA-CF @base.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA-CF @base.json new file mode 100644 index 0000000000..52ff64362d --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA-CF @base.json @@ -0,0 +1,32 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "Snapmaker PLA-CF @base", + "filament_id": "3864371306", + "inherits": "fdm_filament_pla", + "required_nozzle_HRC": [ + "40" + ], + "filament_flow_ratio": [ + "0.95" + ], + "filament_max_volumetric_speed": [ + "12" + ], + "temperature_vitrification": [ + "150" + ], + "slow_down_layer_time": [ + "7" + ], + "default_filament_colour": [ + "#3D3C39" + ], + "filament_type": [ + "PLA-CF" + ], + "additional_cooling_fan_speed": [ + "0" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA-CF.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA-CF.json new file mode 100644 index 0000000000..5fd902e217 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA-CF.json @@ -0,0 +1,34 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker PLA-CF", + "setting_id": "4136003514", + "inherits": "Snapmaker PLA-CF @base", + "compatible_printers": [ + "Snapmaker A250 (0.4 nozzle)", + "Snapmaker A250 (0.6 nozzle)", + "Snapmaker A250 (0.8 nozzle)", + "Snapmaker A350 (0.4 nozzle)", + "Snapmaker A350 (0.6 nozzle)", + "Snapmaker A350 (0.8 nozzle)", + "Snapmaker A250 Dual (0.4 nozzle)", + "Snapmaker A250 Dual (0.6 nozzle)", + "Snapmaker A250 Dual (0.8 nozzle)", + "Snapmaker A350 Dual (0.4 nozzle)", + "Snapmaker A350 Dual (0.6 nozzle)", + "Snapmaker A350 Dual (0.8 nozzle)", + "Snapmaker A250 Dual QSKit (0.4 nozzle)", + "Snapmaker A250 Dual QSKit (0.6 nozzle)", + "Snapmaker A250 Dual QSKit (0.8 nozzle)", + "Snapmaker A350 Dual QSKit (0.4 nozzle)", + "Snapmaker A350 Dual QSKit (0.6 nozzle)", + "Snapmaker A350 Dual QSKit (0.8 nozzle)", + "Snapmaker A250 QSKit (0.4 nozzle)", + "Snapmaker A250 QSKit (0.6 nozzle)", + "Snapmaker A250 QSKit (0.8 nozzle)", + "Snapmaker A350 QSKit (0.4 nozzle)", + "Snapmaker A350 QSKit (0.6 nozzle)", + "Snapmaker A350 QSKit (0.8 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA.json new file mode 100644 index 0000000000..0deea4e936 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA.json @@ -0,0 +1,42 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker PLA", + "setting_id": "1865051461", + "inherits": "Snapmaker PLA @base", + "compatible_printers": [ + "Snapmaker A250 (0.2 nozzle)", + "Snapmaker A250 (0.4 nozzle)", + "Snapmaker A250 (0.6 nozzle)", + "Snapmaker A250 (0.8 nozzle)", + "Snapmaker A350 (0.2 nozzle)", + "Snapmaker A350 (0.4 nozzle)", + "Snapmaker A350 (0.6 nozzle)", + "Snapmaker A350 (0.8 nozzle)", + "Snapmaker A250 Dual (0.2 nozzle)", + "Snapmaker A250 Dual (0.4 nozzle)", + "Snapmaker A250 Dual (0.6 nozzle)", + "Snapmaker A250 Dual (0.8 nozzle)", + "Snapmaker A350 Dual (0.2 nozzle)", + "Snapmaker A350 Dual (0.4 nozzle)", + "Snapmaker A350 Dual (0.6 nozzle)", + "Snapmaker A350 Dual (0.8 nozzle)", + "Snapmaker A250 QSKit (0.2 nozzle)", + "Snapmaker A250 QSKit (0.4 nozzle)", + "Snapmaker A250 QSKit (0.6 nozzle)", + "Snapmaker A250 QSKit (0.8 nozzle)", + "Snapmaker A350 QSKit (0.2 nozzle)", + "Snapmaker A350 QSKit (0.4 nozzle)", + "Snapmaker A350 QSKit (0.6 nozzle)", + "Snapmaker A350 QSKit (0.8 nozzle)", + "Snapmaker A250 Dual QSKit (0.2 nozzle)", + "Snapmaker A250 Dual QSKit (0.4 nozzle)", + "Snapmaker A250 Dual QSKit (0.6 nozzle)", + "Snapmaker A250 Dual QSKit (0.8 nozzle)", + "Snapmaker A350 Dual QSKit (0.2 nozzle)", + "Snapmaker A350 Dual QSKit (0.4 nozzle)", + "Snapmaker A350 Dual QSKit (0.6 nozzle)", + "Snapmaker A350 Dual QSKit (0.8 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PVA @0.2 nozzle.json b/resources/profiles/Snapmaker/filament/Snapmaker PVA @0.2 nozzle.json new file mode 100644 index 0000000000..e983192099 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PVA @0.2 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker PVA @0.2 nozzle", + "setting_id": "1131479069", + "inherits": "Snapmaker PVA @base", + "compatible_printers": [ + "Snapmaker A250 (0.2 nozzle)", + "Snapmaker A350 (0.2 nozzle)", + "Snapmaker A250 Dual (0.2 nozzle)", + "Snapmaker A350 Dual (0.2 nozzle)", + "Snapmaker A250 Dual QSKit (0.2 nozzle)", + "Snapmaker A350 Dual QSKit (0.2 nozzle)", + "Snapmaker A250 QSKit (0.2 nozzle)", + "Snapmaker A350 QSKit (0.2 nozzle)" + ], + "filament_max_volumetric_speed": [ + "1.2" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PVA @base.json b/resources/profiles/Snapmaker/filament/Snapmaker PVA @base.json new file mode 100644 index 0000000000..e17b384590 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PVA @base.json @@ -0,0 +1,8 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "Snapmaker PVA @base", + "filament_id": "1344609062", + "inherits": "fdm_filament_pva" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PVA.json b/resources/profiles/Snapmaker/filament/Snapmaker PVA.json new file mode 100644 index 0000000000..fdd0387142 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker PVA.json @@ -0,0 +1,34 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker PVA", + "setting_id": "3741816734", + "inherits": "Snapmaker PVA @base", + "compatible_printers": [ + "Snapmaker A250 (0.4 nozzle)", + "Snapmaker A250 (0.6 nozzle)", + "Snapmaker A250 (0.8 nozzle)", + "Snapmaker A350 (0.4 nozzle)", + "Snapmaker A350 (0.6 nozzle)", + "Snapmaker A350 (0.8 nozzle)", + "Snapmaker A250 Dual (0.4 nozzle)", + "Snapmaker A250 Dual (0.6 nozzle)", + "Snapmaker A250 Dual (0.8 nozzle)", + "Snapmaker A350 Dual (0.4 nozzle)", + "Snapmaker A350 Dual (0.6 nozzle)", + "Snapmaker A350 Dual (0.8 nozzle)", + "Snapmaker A250 Dual QSKit (0.4 nozzle)", + "Snapmaker A250 Dual QSKit (0.6 nozzle)", + "Snapmaker A250 Dual QSKit (0.8 nozzle)", + "Snapmaker A350 Dual QSKit (0.4 nozzle)", + "Snapmaker A350 Dual QSKit (0.6 nozzle)", + "Snapmaker A350 Dual QSKit (0.8 nozzle)", + "Snapmaker A250 QSKit (0.4 nozzle)", + "Snapmaker A250 QSKit (0.6 nozzle)", + "Snapmaker A250 QSKit (0.8 nozzle)", + "Snapmaker A350 QSKit (0.4 nozzle)", + "Snapmaker A350 QSKit (0.6 nozzle)", + "Snapmaker A350 QSKit (0.8 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker TPE.json b/resources/profiles/Snapmaker/filament/Snapmaker TPE.json new file mode 100644 index 0000000000..846a053688 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker TPE.json @@ -0,0 +1,61 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker TPE", + "setting_id": "2302237917", + "inherits": "Snapmaker TPU @base", + "compatible_printers": [ + "Snapmaker A250 (0.4 nozzle)", + "Snapmaker A250 (0.6 nozzle)", + "Snapmaker A250 (0.8 nozzle)", + "Snapmaker A350 (0.4 nozzle)", + "Snapmaker A350 (0.6 nozzle)", + "Snapmaker A350 (0.8 nozzle)", + "Snapmaker A250 Dual (0.4 nozzle)", + "Snapmaker A250 Dual (0.6 nozzle)", + "Snapmaker A250 Dual (0.8 nozzle)", + "Snapmaker A350 Dual (0.4 nozzle)", + "Snapmaker A350 Dual (0.6 nozzle)", + "Snapmaker A350 Dual (0.8 nozzle)", + "Snapmaker A250 Dual QSKit (0.4 nozzle)", + "Snapmaker A250 Dual QSKit (0.6 nozzle)", + "Snapmaker A250 Dual QSKit (0.8 nozzle)", + "Snapmaker A350 Dual QSKit (0.4 nozzle)", + "Snapmaker A350 Dual QSKit (0.6 nozzle)", + "Snapmaker A350 Dual QSKit (0.8 nozzle)", + "Snapmaker A250 QSKit (0.4 nozzle)", + "Snapmaker A250 QSKit (0.6 nozzle)", + "Snapmaker A250 QSKit (0.8 nozzle)", + "Snapmaker A350 QSKit (0.4 nozzle)", + "Snapmaker A350 QSKit (0.6 nozzle)", + "Snapmaker A350 QSKit (0.8 nozzle)" + ], + "hot_plate_temp": [ + "45" + ], + "hot_plate_temp_initial_layer": [ + "45" + ], + "overhang_fan_speed": [ + "100" + ], + "filament_density": [ + "1.22" + ], + "filament_max_volumetric_speed": [ + "7.2" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "default_filament_colour": [ + "#383737" + ], + "filament_notes": [ + "eSUN eLastic TPE-83A\n" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker TPU @base.json b/resources/profiles/Snapmaker/filament/Snapmaker TPU @base.json new file mode 100644 index 0000000000..31380da4fc --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker TPU @base.json @@ -0,0 +1,8 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "Snapmaker TPU @base", + "filament_id": "1480063856", + "inherits": "fdm_filament_tpu" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker TPU.json b/resources/profiles/Snapmaker/filament/Snapmaker TPU.json new file mode 100644 index 0000000000..c1d56cc39b --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Snapmaker TPU.json @@ -0,0 +1,34 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "Snapmaker TPU", + "setting_id": "2492353721", + "inherits": "Snapmaker TPU @base", + "compatible_printers": [ + "Snapmaker A250 (0.4 nozzle)", + "Snapmaker A250 (0.6 nozzle)", + "Snapmaker A250 (0.8 nozzle)", + "Snapmaker A350 (0.4 nozzle)", + "Snapmaker A350 (0.6 nozzle)", + "Snapmaker A350 (0.8 nozzle)", + "Snapmaker A250 Dual (0.4 nozzle)", + "Snapmaker A250 Dual (0.6 nozzle)", + "Snapmaker A250 Dual (0.8 nozzle)", + "Snapmaker A350 Dual (0.4 nozzle)", + "Snapmaker A350 Dual (0.6 nozzle)", + "Snapmaker A350 Dual (0.8 nozzle)", + "Snapmaker A250 Dual QSKit (0.4 nozzle)", + "Snapmaker A250 Dual QSKit (0.6 nozzle)", + "Snapmaker A250 Dual QSKit (0.8 nozzle)", + "Snapmaker A350 Dual QSKit (0.4 nozzle)", + "Snapmaker A350 Dual QSKit (0.6 nozzle)", + "Snapmaker A350 Dual QSKit (0.8 nozzle)", + "Snapmaker A250 QSKit (0.4 nozzle)", + "Snapmaker A250 QSKit (0.6 nozzle)", + "Snapmaker A250 QSKit (0.8 nozzle)", + "Snapmaker A350 QSKit (0.4 nozzle)", + "Snapmaker A350 QSKit (0.6 nozzle)", + "Snapmaker A350 QSKit (0.8 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/fdm_filament_abs.json b/resources/profiles/Snapmaker/filament/fdm_filament_abs.json index 7e478a37f3..ddf59e95a3 100644 --- a/resources/profiles/Snapmaker/filament/fdm_filament_abs.json +++ b/resources/profiles/Snapmaker/filament/fdm_filament_abs.json @@ -1,82 +1,88 @@ { - "type": "filament", - "name": "fdm_filament_abs", - "from": "system", - "instantiation": "false", - "inherits": "fdm_filament_common", - "cool_plate_temp" : [ - "105" - ], - "eng_plate_temp" : [ - "105" - ], - "hot_plate_temp" : [ - "105" - ], - "cool_plate_temp_initial_layer" : [ - "105" - ], - "eng_plate_temp_initial_layer" : [ - "105" - ], - "hot_plate_temp_initial_layer" : [ - "105" - ], - "slow_down_for_layer_cooling": [ - "1" - ], - "close_fan_the_first_x_layers": [ - "3" - ], - "fan_cooling_layer_time": [ - "30" - ], - "filament_max_volumetric_speed": [ - "28.6" - ], - "filament_type": [ - "ABS" - ], - "filament_density": [ - "1.04" - ], - "filament_cost": [ - "20" - ], - "nozzle_temperature_initial_layer": [ - "260" - ], - "reduce_fan_stop_start_freq": [ - "1" - ], - "fan_max_speed": [ - "80" - ], - "fan_min_speed": [ - "10" - ], - "overhang_fan_threshold": [ - "25%" - ], - "overhang_fan_speed": [ - "80" - ], - "nozzle_temperature": [ - "260" - ], - "temperature_vitrification": [ - "110" - ], - "nozzle_temperature_range_low": [ - "240" - ], - "nozzle_temperature_range_high": [ - "270" - ], - "slow_down_min_speed": [ - "10" - ], - "slow_down_layer_time": [ - "3" - ] -} + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "fdm_filament_abs", + "inherits": "fdm_filament_common", + "hot_plate_temp": [ + "90" + ], + "hot_plate_temp_initial_layer": [ + "90" + ], + "overhang_fan_threshold": [ + "25%" + ], + "overhang_fan_speed": [ + "80" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "filament_flow_ratio": [ + "0.93" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "fan_cooling_layer_time": [ + "30" + ], + "filament_cost": [ + "50" + ], + "filament_density": [ + "1.04" + ], + "filament_max_volumetric_speed": [ + "16" + ], + "filament_retraction_length": [ + "0.6" + ], + "filament_z_hop": [ + "0.7" + ], + "nozzle_temperature_initial_layer": [ + "260" + ], + "nozzle_temperature": [ + "260" + ], + "temperature_vitrification": [ + "189" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "15" + ], + "slow_down_min_speed": [ + "20" + ], + "slow_down_layer_time": [ + "3" + ], + "enable_pressure_advance": [ + "1" + ], + "pressure_advance": [ + "0.015" + ], + "filament_type": [ + "ABS" + ], + "nozzle_temperature_range_low": [ + "240" + ], + "nozzle_temperature_range_high": [ + "280" + ], + "default_filament_colour": [ + "#682D35" + ], + "filament_notes": [ + "eSUN ABS+\nSunlu ABS+\n" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/fdm_filament_asa.json b/resources/profiles/Snapmaker/filament/fdm_filament_asa.json index 29a752a4ee..79961c53aa 100644 --- a/resources/profiles/Snapmaker/filament/fdm_filament_asa.json +++ b/resources/profiles/Snapmaker/filament/fdm_filament_asa.json @@ -1,82 +1,82 @@ { - "type": "filament", - "name": "fdm_filament_asa", - "from": "system", - "instantiation": "false", - "inherits": "fdm_filament_common", - "cool_plate_temp" : [ - "105" - ], - "eng_plate_temp" : [ - "105" - ], - "hot_plate_temp" : [ - "105" - ], - "cool_plate_temp_initial_layer" : [ - "105" - ], - "eng_plate_temp_initial_layer" : [ - "105" - ], - "hot_plate_temp_initial_layer" : [ - "105" - ], - "slow_down_for_layer_cooling": [ - "1" - ], - "close_fan_the_first_x_layers": [ - "3" - ], - "fan_cooling_layer_time": [ - "35" - ], - "filament_max_volumetric_speed": [ - "28.6" - ], - "filament_type": [ - "ASA" - ], - "filament_density": [ - "1.04" - ], - "filament_cost": [ - "20" - ], - "nozzle_temperature_initial_layer": [ - "260" - ], - "reduce_fan_stop_start_freq": [ - "1" - ], - "fan_max_speed": [ - "80" - ], - "fan_min_speed": [ - "10" - ], - "overhang_fan_threshold": [ - "25%" - ], - "overhang_fan_speed": [ - "80" - ], - "nozzle_temperature": [ - "260" - ], - "temperature_vitrification": [ - "110" - ], - "nozzle_temperature_range_low": [ - "240" - ], - "nozzle_temperature_range_high": [ - "270" - ], - "slow_down_min_speed": [ - "10" - ], - "slow_down_layer_time": [ - "3" - ] -} + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "fdm_filament_asa", + "inherits": "fdm_filament_common", + "hot_plate_temp": [ + "90" + ], + "hot_plate_temp_initial_layer": [ + "90" + ], + "overhang_fan_threshold": [ + "25%" + ], + "overhang_fan_speed": [ + "80" + ], + "close_fan_the_first_x_layers": [ + "4" + ], + "filament_flow_ratio": [ + "0.94" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "fan_cooling_layer_time": [ + "20" + ], + "filament_cost": [ + "80" + ], + "filament_density": [ + "1.04" + ], + "filament_max_volumetric_speed": [ + "7.6" + ], + "filament_retraction_length": [ + "0.6" + ], + "filament_z_hop": [ + "0.7" + ], + "nozzle_temperature_initial_layer": [ + "255" + ], + "nozzle_temperature": [ + "255" + ], + "temperature_vitrification": [ + "182" + ], + "fan_max_speed": [ + "35" + ], + "fan_min_speed": [ + "10" + ], + "slow_down_min_speed": [ + "20" + ], + "slow_down_layer_time": [ + "5" + ], + "enable_pressure_advance": [ + "1" + ], + "filament_type": [ + "ASA" + ], + "default_filament_colour": [ + "#F35887" + ], + "nozzle_temperature_range_low": [ + "240" + ], + "nozzle_temperature_range_high": [ + "280" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/fdm_filament_common.json b/resources/profiles/Snapmaker/filament/fdm_filament_common.json index 5212d445a5..e2d108845f 100644 --- a/resources/profiles/Snapmaker/filament/fdm_filament_common.json +++ b/resources/profiles/Snapmaker/filament/fdm_filament_common.json @@ -1,135 +1,189 @@ { - "type": "filament", - "name": "fdm_filament_common", - "from": "system", - "instantiation": "false", - "cool_plate_temp" : [ - "60" - ], - "eng_plate_temp" : [ - "60" - ], - "hot_plate_temp" : [ - "60" - ], - "cool_plate_temp_initial_layer" : [ - "60" - ], - "eng_plate_temp_initial_layer" : [ - "60" - ], - "hot_plate_temp_initial_layer" : [ - "60" - ], - "overhang_fan_threshold": [ - "95%" - ], - "overhang_fan_speed": [ - "100" - ], - "slow_down_for_layer_cooling": [ - "1" - ], - "close_fan_the_first_x_layers": [ - "3" - ], - "filament_end_gcode": [ - "; filament end gcode \n" - ], - "filament_flow_ratio": [ - "1" - ], - "reduce_fan_stop_start_freq": [ - "0" - ], - "fan_cooling_layer_time": [ - "60" - ], - "filament_cost": [ - "0" - ], - "filament_density": [ - "0" - ], - "filament_deretraction_speed": [ - "nil" - ], - "filament_diameter": [ - "1.75" - ], - "filament_max_volumetric_speed": [ - "0" - ], - "filament_minimal_purge_on_wipe_tower": [ - "15" - ], - "filament_retraction_minimum_travel": [ - "nil" - ], - "filament_retract_before_wipe": [ - "nil" - ], - "filament_retract_when_changing_layer": [ - "nil" - ], - "filament_retraction_length": [ - "nil" - ], - "filament_z_hop": [ - "nil" - ], - "filament_retract_restart_extra": [ - "nil" - ], - "filament_retraction_speed": [ - "nil" - ], - "filament_settings_id": [ - "" - ], - "filament_soluble": [ - "0" - ], - "filament_type": [ - "PLA" - ], - "filament_vendor": [ - "Generic" - ], - "filament_wipe": [ - "nil" - ], - "filament_wipe_distance": [ - "nil" - ], - "bed_type": [ - "Cool Plate" - ], - "nozzle_temperature_initial_layer": [ - "200" - ], - "full_fan_speed_layer": [ - "0" - ], - "fan_max_speed": [ - "100" - ], - "fan_min_speed": [ - "35" - ], - "slow_down_min_speed": [ - "10" - ], - "slow_down_layer_time": [ - "8" - ], - "filament_start_gcode": [ - "; Filament gcode\n" - ], - "nozzle_temperature": [ - "200" - ], - "temperature_vitrification": [ - "100" - ] -} + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "fdm_filament_common", + "filament_vendor": [ + "Snapmaker" + ], + "filament_start_gcode": [ + "" + ], + "filament_end_gcode": [ + "" + ], + "filament_is_support": [ + "0" + ], + "filament_soluble": [ + "0" + ], + "filament_settings_id": [ + "" + ], + "required_nozzle_HRC": [ + "3" + ], + "bed_type": [ + "Hot Plate" + ], + "hot_plate_temp": [ + "60" + ], + "hot_plate_temp_initial_layer": [ + "60" + ], + "overhang_fan_threshold": [ + "95%" + ], + "overhang_fan_speed": [ + "100" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "close_fan_the_first_x_layers": [ + "2" + ], + "filament_flow_ratio": [ + "1" + ], + "reduce_fan_stop_start_freq": [ + "0" + ], + "fan_cooling_layer_time": [ + "60" + ], + "filament_cost": [ + "0" + ], + "filament_density": [ + "0" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_diameter": [ + "1.75" + ], + "filament_max_volumetric_speed": [ + "0" + ], + "filament_minimal_purge_on_wipe_tower": [ + "3" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_retract_before_wipe": [ + "nil" + ], + "filament_retract_when_changing_layer": [ + "nil" + ], + "filament_retraction_length": [ + "nil" + ], + "filament_z_hop": [ + "nil" + ], + "filament_z_hop_types": [ + "nil" + ], + "filament_retract_restart_extra": [ + "nil" + ], + "filament_retraction_speed": [ + "nil" + ], + "filament_wipe": [ + "nil" + ], + "filament_wipe_distance": [ + "nil" + ], + "filament_loading_speed_start": [ + "3" + ], + "filament_loading_speed": [ + "25" + ], + "filament_unloading_speed_start": [ + "3" + ], + "filament_unloading_speed": [ + "25" + ], + "filament_load_time": [ + "0" + ], + "filament_unload_time": [ + "0" + ], + "filament_toolchange_delay": [ + "0" + ], + "filament_cooling_moves": [ + "0" + ], + "filament_cooling_initial_speed": [ + "2.2" + ], + "filament_cooling_final_speed": [ + "3.4" + ], + "filament_multitool_ramming": [ + "0" + ], + "filament_multitool_ramming_volume": [ + "0" + ], + "nozzle_temperature_initial_layer": [ + "200" + ], + "nozzle_temperature": [ + "200" + ], + "temperature_vitrification": [ + "140" + ], + "full_fan_speed_layer": [ + "0" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "35" + ], + "slow_down_min_speed": [ + "10" + ], + "slow_down_layer_time": [ + "8" + ], + "enable_pressure_advance": [ + "0" + ], + "pressure_advance": [ + "0.04" + ], + "cool_plate_temp": [ + "60" + ], + "eng_plate_temp": [ + "60" + ], + "textured_plate_temp": [ + "60" + ], + "cool_plate_temp_initial_layer": [ + "60" + ], + "eng_plate_temp_initial_layer": [ + "60" + ], + "textured_plate_temp_initial_layer": [ + "60" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/fdm_filament_pa.json b/resources/profiles/Snapmaker/filament/fdm_filament_pa.json index e75e2e9f6c..aa2b20a5c2 100644 --- a/resources/profiles/Snapmaker/filament/fdm_filament_pa.json +++ b/resources/profiles/Snapmaker/filament/fdm_filament_pa.json @@ -1,79 +1,106 @@ { - "type": "filament", - "name": "fdm_filament_pa", - "from": "system", - "instantiation": "false", - "inherits": "fdm_filament_common", - "cool_plate_temp" : [ - "0" - ], - "eng_plate_temp" : [ - "100" - ], - "hot_plate_temp" : [ - "100" - ], - "cool_plate_temp_initial_layer" : [ - "0" - ], - "eng_plate_temp_initial_layer" : [ - "100" - ], - "hot_plate_temp_initial_layer" : [ - "100" - ], - "slow_down_for_layer_cooling": [ - "1" - ], - "close_fan_the_first_x_layers": [ - "3" - ], - "fan_cooling_layer_time": [ - "4" - ], - "filament_max_volumetric_speed": [ - "8" - ], - "filament_type": [ - "PA" - ], - "filament_density": [ - "1.04" - ], - "filament_cost": [ - "20" - ], - "nozzle_temperature_initial_layer": [ - "290" - ], - "reduce_fan_stop_start_freq": [ - "0" - ], - "fan_max_speed": [ - "60" - ], - "fan_min_speed": [ - "0" - ], - "overhang_fan_speed": [ - "30" - ], - "nozzle_temperature": [ - "290" - ], - "temperature_vitrification": [ - "108" - ], - "nozzle_temperature_range_low": [ - "270" - ], - "nozzle_temperature_range_high": [ - "300" - ], - "slow_down_min_speed": [ - "10" - ], - "slow_down_layer_time": [ - "2" - ] -} + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "fdm_filament_pa", + "inherits": "fdm_filament_common", + "required_nozzle_HRC": [ + "40" + ], + "hot_plate_temp": [ + "90" + ], + "hot_plate_temp_initial_layer": [ + "85" + ], + "overhang_fan_threshold": [ + "0%" + ], + "overhang_fan_speed": [ + "60" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "fan_cooling_layer_time": [ + "20" + ], + "filament_cost": [ + "150" + ], + "filament_density": [ + "1.09" + ], + "filament_max_volumetric_speed": [ + "8" + ], + "filament_retraction_minimum_travel": [ + "0" + ], + "filament_retraction_length": [ + "2" + ], + "filament_retraction_speed": [ + "36" + ], + "nozzle_temperature_initial_layer": [ + "255" + ], + "nozzle_temperature": [ + "250" + ], + "temperature_vitrification": [ + "203" + ], + "full_fan_speed_layer": [ + "3" + ], + "fan_max_speed": [ + "65" + ], + "fan_min_speed": [ + "30" + ], + "slow_down_min_speed": [ + "15" + ], + "slow_down_layer_time": [ + "20" + ], + "cool_plate_temp": [ + "90" + ], + "eng_plate_temp": [ + "90" + ], + "textured_plate_temp": [ + "90" + ], + "cool_plate_temp_initial_layer": [ + "85" + ], + "eng_plate_temp_initial_layer": [ + "85" + ], + "textured_plate_temp_initial_layer": [ + "85" + ], + "default_filament_colour": [ + "#3D3C39" + ], + "filament_type": [ + "PA-CF" + ], + "nozzle_temperature_range_low": [ + "250" + ], + "nozzle_temperature_range_high": [ + "260" + ], + "filament_notes": [ + "!! It needs to be dried before use.\n" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/fdm_filament_pc.json b/resources/profiles/Snapmaker/filament/fdm_filament_pc.json deleted file mode 100644 index 89f770017e..0000000000 --- a/resources/profiles/Snapmaker/filament/fdm_filament_pc.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "type": "filament", - "name": "fdm_filament_pc", - "from": "system", - "instantiation": "false", - "inherits": "fdm_filament_common", - "cool_plate_temp" : [ - "0" - ], - "eng_plate_temp" : [ - "110" - ], - "hot_plate_temp" : [ - "110" - ], - "cool_plate_temp_initial_layer" : [ - "0" - ], - "eng_plate_temp_initial_layer" : [ - "110" - ], - "hot_plate_temp_initial_layer" : [ - "110" - ], - "slow_down_for_layer_cooling": [ - "1" - ], - "close_fan_the_first_x_layers": [ - "3" - ], - "fan_cooling_layer_time": [ - "30" - ], - "filament_max_volumetric_speed": [ - "23.2" - ], - "filament_type": [ - "PC" - ], - "filament_density": [ - "1.04" - ], - "filament_cost": [ - "20" - ], - "nozzle_temperature_initial_layer": [ - "270" - ], - "reduce_fan_stop_start_freq": [ - "1" - ], - "fan_max_speed": [ - "60" - ], - "fan_min_speed": [ - "10" - ], - "overhang_fan_threshold": [ - "25%" - ], - "overhang_fan_speed": [ - "60" - ], - "nozzle_temperature": [ - "280" - ], - "temperature_vitrification": [ - "140" - ], - "nozzle_temperature_range_low": [ - "260" - ], - "nozzle_temperature_range_high": [ - "280" - ], - "slow_down_min_speed": [ - "10" - ], - "slow_down_layer_time": [ - "2" - ] -} diff --git a/resources/profiles/Snapmaker/filament/fdm_filament_pet.json b/resources/profiles/Snapmaker/filament/fdm_filament_pet.json index 2f98be665f..78d45a587c 100644 --- a/resources/profiles/Snapmaker/filament/fdm_filament_pet.json +++ b/resources/profiles/Snapmaker/filament/fdm_filament_pet.json @@ -1,76 +1,73 @@ { - "type": "filament", - "name": "fdm_filament_pet", - "from": "system", - "instantiation": "false", - "inherits": "fdm_filament_common", - "cool_plate_temp" : [ - "60" - ], - "eng_plate_temp" : [ - "0" - ], - "hot_plate_temp" : [ - "80" - ], - "cool_plate_temp_initial_layer" : [ - "60" - ], - "eng_plate_temp_initial_layer" : [ - "0" - ], - "hot_plate_temp_initial_layer" : [ - "80" - ], - "slow_down_for_layer_cooling": [ - "1" - ], - "close_fan_the_first_x_layers": [ - "3" - ], - "fan_cooling_layer_time": [ - "20" - ], - "filament_max_volumetric_speed": [ - "25" - ], - "filament_type": [ - "PETG" - ], - "filament_density": [ - "1.27" - ], - "filament_cost": [ - "30" - ], - "nozzle_temperature_initial_layer": [ - "255" - ], - "reduce_fan_stop_start_freq": [ - "1" - ], - "fan_max_speed": [ - "100" - ], - "fan_min_speed": [ - "20" - ], - "overhang_fan_speed": [ - "100" - ], - "nozzle_temperature": [ - "255" - ], - "temperature_vitrification": [ - "80" - ], - "nozzle_temperature_range_low": [ - "220" - ], - "nozzle_temperature_range_high": [ - "260" - ], - "filament_start_gcode": [ - "; filament start gcode\n" - ] -} + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "fdm_filament_pet", + "inherits": "fdm_filament_common", + "hot_plate_temp": [ + "65" + ], + "overhang_fan_threshold": [ + "25%" + ], + "overhang_fan_speed": [ + "60" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "fan_cooling_layer_time": [ + "7" + ], + "filament_cost": [ + "8" + ], + "filament_density": [ + "1.29" + ], + "filament_max_volumetric_speed": [ + "6" + ], + "nozzle_temperature_initial_layer": [ + "275" + ], + "nozzle_temperature": [ + "278" + ], + "temperature_vitrification": [ + "230" + ], + "fan_max_speed": [ + "40" + ], + "fan_min_speed": [ + "0" + ], + "slow_down_min_speed": [ + "50" + ], + "slow_down_layer_time": [ + "2" + ], + "enable_pressure_advance": [ + "1" + ], + "pressure_advance": [ + "0.022" + ], + "default_filament_colour": [ + "#FFFFFF" + ], + "filament_type": [ + "PET" + ], + "nozzle_temperature_range_low": [ + "250" + ], + "nozzle_temperature_range_high": [ + "280" + ], + "filament_notes": [ + "JiaNong PET 1.63x1.75mm" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/fdm_filament_petg.json b/resources/profiles/Snapmaker/filament/fdm_filament_petg.json new file mode 100644 index 0000000000..407d8d3258 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/fdm_filament_petg.json @@ -0,0 +1,76 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "fdm_filament_petg", + "inherits": "fdm_filament_common", + "hot_plate_temp": [ + "70" + ], + "hot_plate_temp_initial_layer": [ + "70" + ], + "overhang_fan_threshold": [ + "25%" + ], + "overhang_fan_speed": [ + "90" + ], + "filament_flow_ratio": [ + "0.95" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "fan_cooling_layer_time": [ + "30" + ], + "filament_cost": [ + "30" + ], + "filament_density": [ + "1.27" + ], + "filament_max_volumetric_speed": [ + "10" + ], + "filament_retraction_minimum_travel": [ + "0" + ], + "filament_retraction_length": [ + "1.8" + ], + "nozzle_temperature_initial_layer": [ + "255" + ], + "nozzle_temperature": [ + "245" + ], + "temperature_vitrification": [ + "160" + ], + "fan_max_speed": [ + "90" + ], + "fan_min_speed": [ + "40" + ], + "slow_down_min_speed": [ + "20" + ], + "enable_pressure_advance": [ + "1" + ], + "default_filament_colour": [ + "#DF6734" + ], + "filament_type": [ + "PETG" + ], + "nozzle_temperature_range_low": [ + "220" + ], + "nozzle_temperature_range_high": [ + "270" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/fdm_filament_pla.json b/resources/profiles/Snapmaker/filament/fdm_filament_pla.json index de2f3c2a71..7a6824530e 100644 --- a/resources/profiles/Snapmaker/filament/fdm_filament_pla.json +++ b/resources/profiles/Snapmaker/filament/fdm_filament_pla.json @@ -1,88 +1,67 @@ { - "type": "filament", - "name": "fdm_filament_pla", - "from": "system", - "instantiation": "false", - "inherits": "fdm_filament_common", - "fan_cooling_layer_time": [ - "100" - ], - "filament_max_volumetric_speed": [ - "12" - ], - "filament_type": [ - "PLA" - ], - "filament_density": [ - "1.24" - ], - "filament_cost": [ - "20" - ], - "cool_plate_temp" : [ - "35" - ], - "eng_plate_temp" : [ - "0" - ], - "hot_plate_temp" : [ - "45" - ], - "cool_plate_temp_initial_layer" : [ - "35" - ], - "eng_plate_temp_initial_layer" : [ - "0" - ], - "hot_plate_temp_initial_layer" : [ - "45" - ], - "nozzle_temperature_initial_layer": [ - "220" - ], - "reduce_fan_stop_start_freq": [ - "1" - ], - "slow_down_for_layer_cooling": [ - "1" - ], - "fan_max_speed": [ - "100" - ], - "fan_min_speed": [ - "100" - ], - "overhang_fan_speed": [ - "100" - ], - "overhang_fan_threshold": [ - "50%" - ], - "close_fan_the_first_x_layers": [ - "1" - ], - "nozzle_temperature": [ - "220" - ], - "temperature_vitrification": [ - "60" - ], - "nozzle_temperature_range_low": [ - "190" - ], - "nozzle_temperature_range_high": [ - "230" - ], - "slow_down_min_speed": [ - "10" - ], - "slow_down_layer_time": [ - "4" - ], - "additional_cooling_fan_speed": [ - "70" - ], - "filament_start_gcode": [ - "; filament start gcode\n" - ] -} + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "fdm_filament_pla", + "inherits": "fdm_filament_common", + "overhang_fan_threshold": [ + "0%" + ], + "close_fan_the_first_x_layers": [ + "1" + ], + "filament_flow_ratio": [ + "0.98" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "fan_cooling_layer_time": [ + "100" + ], + "filament_cost": [ + "60" + ], + "filament_density": [ + "1.24" + ], + "filament_max_volumetric_speed": [ + "14" + ], + "filament_retraction_length": [ + "1.2" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature": [ + "210" + ], + "temperature_vitrification": [ + "154" + ], + "fan_min_speed": [ + "100" + ], + "slow_down_min_speed": [ + "15" + ], + "enable_pressure_advance": [ + "1" + ], + "default_filament_colour": [ + "#F8C827" + ], + "filament_type": [ + "PLA" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "additional_cooling_fan_speed": [ + "70" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/fdm_filament_pla_eco.json b/resources/profiles/Snapmaker/filament/fdm_filament_pla_eco.json new file mode 100644 index 0000000000..a2a1b86e3d --- /dev/null +++ b/resources/profiles/Snapmaker/filament/fdm_filament_pla_eco.json @@ -0,0 +1,16 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "fdm_filament_pla_eco", + "inherits": "fdm_filament_pla", + "nozzle_temperature_initial_layer": [ + "205" + ], + "nozzle_temperature": [ + "200" + ], + "default_filament_colour": [ + "#D5DDDC" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/fdm_filament_pva.json b/resources/profiles/Snapmaker/filament/fdm_filament_pva.json index f529bb39af..73717471a5 100644 --- a/resources/profiles/Snapmaker/filament/fdm_filament_pva.json +++ b/resources/profiles/Snapmaker/filament/fdm_filament_pva.json @@ -1,94 +1,91 @@ { - "type": "filament", - "name": "fdm_filament_pva", - "from": "system", - "instantiation": "false", - "inherits": "fdm_filament_common", - "cool_plate_temp" : [ - "35" - ], - "eng_plate_temp" : [ - "0" - ], - "hot_plate_temp" : [ - "45" - ], - "cool_plate_temp_initial_layer" : [ - "35" - ], - "eng_plate_temp_initial_layer" : [ - "0" - ], - "hot_plate_temp_initial_layer" : [ - "45" - ], - "fan_cooling_layer_time": [ - "100" - ], - "filament_max_volumetric_speed": [ - "15" - ], - "filament_soluble": [ - "1" - ], - "filament_is_support": [ - "1" - ], - "filament_type": [ - "PVA" - ], - "filament_density": [ - "1.24" - ], - "filament_cost": [ - "20" - ], - "nozzle_temperature_initial_layer": [ - "220" - ], - "reduce_fan_stop_start_freq": [ - "1" - ], - "slow_down_for_layer_cooling": [ - "1" - ], - "fan_max_speed": [ - "100" - ], - "fan_min_speed": [ - "100" - ], - "overhang_fan_speed": [ - "100" - ], - "overhang_fan_threshold": [ - "50%" - ], - "close_fan_the_first_x_layers": [ - "1" - ], - "nozzle_temperature": [ - "220" - ], - "temperature_vitrification": [ - "50" - ], - "nozzle_temperature_range_low": [ - "190" - ], - "nozzle_temperature_range_high": [ - "250" - ], - "slow_down_min_speed": [ - "10" - ], - "slow_down_layer_time": [ - "4" - ], - "additional_cooling_fan_speed": [ - "70" - ], - "filament_start_gcode": [ - "; filament start gcode\n" - ] -} + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "fdm_filament_pva", + "inherits": "fdm_filament_common", + "filament_is_support": [ + "1" + ], + "hot_plate_temp": [ + "50" + ], + "hot_plate_temp_initial_layer": [ + "50" + ], + "overhang_fan_threshold": [ + "50%" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "fan_cooling_layer_time": [ + "100" + ], + "filament_cost": [ + "120" + ], + "filament_density": [ + "1.37" + ], + "filament_deretraction_speed": [ + "15" + ], + "filament_max_volumetric_speed": [ + "2.4" + ], + "filament_retraction_length": [ + "2" + ], + "filament_retraction_speed": [ + "28" + ], + "nozzle_temperature_initial_layer": [ + "215" + ], + "nozzle_temperature": [ + "215" + ], + "temperature_vitrification": [ + "150" + ], + "slow_down_min_speed": [ + "20" + ], + "slow_down_layer_time": [ + "7" + ], + "cool_plate_temp": [ + "50" + ], + "eng_plate_temp": [ + "50" + ], + "textured_plate_temp": [ + "50" + ], + "cool_plate_temp_initial_layer": [ + "50" + ], + "eng_plate_temp_initial_layer": [ + "50" + ], + "textured_plate_temp_initial_layer": [ + "50" + ], + "default_filament_colour": [ + "#D9DFE3" + ], + "filament_type": [ + "PVA" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "nozzle_temperature_range_high": [ + "225" + ], + "additional_cooling_fan_speed": [ + "50" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/fdm_filament_tpu.json b/resources/profiles/Snapmaker/filament/fdm_filament_tpu.json index d5cc57fbcc..bb6a8df3a2 100644 --- a/resources/profiles/Snapmaker/filament/fdm_filament_tpu.json +++ b/resources/profiles/Snapmaker/filament/fdm_filament_tpu.json @@ -1,82 +1,88 @@ { - "type": "filament", - "name": "fdm_filament_tpu", - "from": "system", - "instantiation": "false", - "inherits": "fdm_filament_common", - "cool_plate_temp" : [ - "30" - ], - "eng_plate_temp" : [ - "30" - ], - "hot_plate_temp" : [ - "35" - ], - "cool_plate_temp_initial_layer" : [ - "30" - ], - "eng_plate_temp_initial_layer" : [ - "30" - ], - "hot_plate_temp_initial_layer" : [ - "35" - ], - "fan_cooling_layer_time": [ - "100" - ], - "filament_max_volumetric_speed": [ - "15" - ], - "filament_type": [ - "TPU" - ], - "filament_density": [ - "1.24" - ], - "filament_cost": [ - "20" - ], - "filament_retraction_length": [ - "0.4" - ], - "nozzle_temperature_initial_layer": [ - "240" - ], - "reduce_fan_stop_start_freq": [ - "1" - ], - "slow_down_for_layer_cooling": [ - "1" - ], - "fan_max_speed": [ - "100" - ], - "fan_min_speed": [ - "100" - ], - "overhang_fan_speed": [ - "100" - ], - "additional_cooling_fan_speed": [ - "70" - ], - "close_fan_the_first_x_layers": [ - "1" - ], - "nozzle_temperature": [ - "240" - ], - "temperature_vitrification": [ - "60" - ], - "nozzle_temperature_range_low": [ - "200" - ], - "nozzle_temperature_range_high": [ - "250" - ], - "filament_start_gcode": [ - "; filament start gcode\n" - ] -} + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "fdm_filament_tpu", + "inherits": "fdm_filament_common", + "hot_plate_temp": [ + "40" + ], + "hot_plate_temp_initial_layer": [ + "40" + ], + "overhang_fan_speed": [ + "70" + ], + "slow_down_for_layer_cooling": [ + "0" + ], + "close_fan_the_first_x_layers": [ + "1" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "fan_cooling_layer_time": [ + "100" + ], + "filament_cost": [ + "80" + ], + "filament_density": [ + "1.24" + ], + "filament_deretraction_speed": [ + "20" + ], + "filament_max_volumetric_speed": [ + "2.8" + ], + "filament_retract_when_changing_layer": [ + "0" + ], + "filament_retraction_length": [ + "0.6" + ], + "filament_z_hop": [ + "0" + ], + "filament_z_hop_types": [ + "Normal Lift" + ], + "filament_retraction_speed": [ + "20" + ], + "nozzle_temperature_initial_layer": [ + "240" + ], + "nozzle_temperature": [ + "240" + ], + "temperature_vitrification": [ + "138" + ], + "fan_max_speed": [ + "70" + ], + "fan_min_speed": [ + "70" + ], + "default_filament_colour": [ + "#302730" + ], + "filament_type": [ + "TPU" + ], + "additional_cooling_fan_speed": [ + "70" + ], + "nozzle_temperature_range_low": [ + "220" + ], + "nozzle_temperature_range_high": [ + "250" + ], + "filament_notes": [ + "!! It needs to be dried before use.\nSunlu TPU 95A\n" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A250 (0.2 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker A250 (0.2 nozzle).json new file mode 100644 index 0000000000..66be63e7f8 --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A250 (0.2 nozzle).json @@ -0,0 +1,20 @@ +{ + "name": "Snapmaker A250 (0.2 nozzle)", + "setting_id": "2273571854", + "type": "machine", + "from": "system", + "instantiation": "true", + "inherits": "fdm_a250", + "printer_model": "Snapmaker A250", + "default_print_profile": "0.14 Standard @Snapmaker (0.2 nozzle)", + "printer_variant": "0.2", + "max_layer_height": [ + "0.14" + ], + "min_layer_height": [ + "0.06" + ], + "nozzle_diameter": [ + "0.2" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A250 (0.4 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker A250 (0.4 nozzle).json new file mode 100644 index 0000000000..2aad4eaec5 --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A250 (0.4 nozzle).json @@ -0,0 +1,20 @@ +{ + "name": "Snapmaker A250 (0.4 nozzle)", + "setting_id": "4103703940", + "type": "machine", + "from": "system", + "instantiation": "true", + "inherits": "fdm_a250", + "printer_model": "Snapmaker A250", + "default_print_profile": "0.16 Optimal @Snapmaker (0.4 nozzle)", + "printer_variant": "0.4", + "max_layer_height": [ + "0.28" + ], + "min_layer_height": [ + "0.08" + ], + "nozzle_diameter": [ + "0.4" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A250 (0.6 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker A250 (0.6 nozzle).json new file mode 100644 index 0000000000..e07ef0eaf6 --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A250 (0.6 nozzle).json @@ -0,0 +1,20 @@ +{ + "name": "Snapmaker A250 (0.6 nozzle)", + "setting_id": "3664749826", + "type": "machine", + "from": "system", + "instantiation": "true", + "inherits": "fdm_a250", + "printer_model": "Snapmaker A250", + "default_print_profile": "0.18 Standard @Snapmaker (0.6 nozzle)", + "printer_variant": "0.6", + "max_layer_height": [ + "0.42" + ], + "min_layer_height": [ + "0.18" + ], + "nozzle_diameter": [ + "0.6" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A250 (0.8 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker A250 (0.8 nozzle).json new file mode 100644 index 0000000000..fa2ffe543f --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A250 (0.8 nozzle).json @@ -0,0 +1,20 @@ +{ + "name": "Snapmaker A250 (0.8 nozzle)", + "setting_id": "313360016", + "type": "machine", + "from": "system", + "instantiation": "true", + "inherits": "fdm_a250", + "printer_model": "Snapmaker A250", + "default_print_profile": "0.24 Standard @Snapmaker (0.8 nozzle)", + "printer_variant": "0.8", + "max_layer_height": [ + "0.48" + ], + "min_layer_height": [ + "0.24" + ], + "nozzle_diameter": [ + "0.8" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A250 0.4 nozzle.json b/resources/profiles/Snapmaker/machine/Snapmaker A250 0.4 nozzle.json deleted file mode 100644 index 18d1e42d77..0000000000 --- a/resources/profiles/Snapmaker/machine/Snapmaker A250 0.4 nozzle.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "type": "machine", - "setting_id": "GM003", - "name": "Snapmaker A250 0.4 nozzle", - "from": "system", - "instantiation": "true", - "inherits": "fdm_machine_common", - "printer_model": "Snapmaker A250", - "default_print_profile": "0.20mm Standard @Snapmaker", - "nozzle_diameter": [ - "0.4" - ], - "bed_exclude_area": [ - "0x0" - ], - "printable_area": [ - "0x0", - "230x0", - "230x250", - "0x250" - ], - "printable_height": "235", - "machine_start_gcode": "M82; M190 S[bed_temperature_initial_layer_single]\nM109 S[nozzle_temperature_initial_layer]\nPRINT_START EXTRUDER=[nozzle_temperature_initial_layer] BED=[bed_temperature_initial_layer_single]\n; You can use following code instead if your PRINT_START macro support Chamber and print area bedmesh\n; PRINT_START EXTRUDER=[nozzle_temperature_initial_layer] BED=[bed_temperature_initial_layer_single] Chamber=[chamber_temperature] PRINT_MIN={first_layer_print_min[0]},{first_layer_print_min[1]} PRINT_MAX={first_layer_print_max[0]},{first_layer_print_max[1]}", - "machine_end_gcode": "config end gcode\nM104 S0\nM140 S0\n;Retract the filament\nG92 E1\nG1 E-1 F300\nG28 X0 Y0\nM84", - "layer_change_gcode": "", - "scan_first_layer": "0", - "nozzle_type": "hardened_steel", - "auxiliary_fan": "0" - } - \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A250 Dual (0.2 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker A250 Dual (0.2 nozzle).json new file mode 100644 index 0000000000..8f0ba48440 --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A250 Dual (0.2 nozzle).json @@ -0,0 +1,21 @@ +{ + "name": "Snapmaker A250 Dual (0.2 nozzle)", + "setting_id": "3474065981", + "type": "machine", + "from": "system", + "instantiation": "true", + "inherits": "fdm_a250_dual", + "printer_model": "Snapmaker A250 Dual", + "default_print_profile": "0.14 Standard @Snapmaker (0.2 nozzle)", + "printer_variant": "0.2", + "max_layer_height": [ + "0.14" + ], + "min_layer_height": [ + "0.06" + ], + "nozzle_diameter": [ + "0.2", + "0.2" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A250 Dual (0.4 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker A250 Dual (0.4 nozzle).json new file mode 100644 index 0000000000..915866e244 --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A250 Dual (0.4 nozzle).json @@ -0,0 +1,21 @@ +{ + "name": "Snapmaker A250 Dual (0.4 nozzle)", + "setting_id": "3154670519", + "type": "machine", + "from": "system", + "instantiation": "true", + "inherits": "fdm_a250_dual", + "printer_model": "Snapmaker A250 Dual", + "default_print_profile": "0.16 Optimal @Snapmaker (0.4 nozzle)", + "printer_variant": "0.4", + "max_layer_height": [ + "0.28" + ], + "min_layer_height": [ + "0.08" + ], + "nozzle_diameter": [ + "0.4", + "0.4" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A250 Dual (0.6 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker A250 Dual (0.6 nozzle).json new file mode 100644 index 0000000000..2ea9be0800 --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A250 Dual (0.6 nozzle).json @@ -0,0 +1,21 @@ +{ + "name": "Snapmaker A250 Dual (0.6 nozzle)", + "setting_id": "2466143025", + "type": "machine", + "from": "system", + "instantiation": "true", + "inherits": "fdm_a250_dual", + "printer_model": "Snapmaker A250 Dual", + "default_print_profile": "0.18 Standard @Snapmaker (0.6 nozzle)", + "printer_variant": "0.6", + "max_layer_height": [ + "0.42" + ], + "min_layer_height": [ + "0.18" + ], + "nozzle_diameter": [ + "0.6", + "0.6" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A250 Dual (0.8 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker A250 Dual (0.8 nozzle).json new file mode 100644 index 0000000000..7312b3b419 --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A250 Dual (0.8 nozzle).json @@ -0,0 +1,21 @@ +{ + "name": "Snapmaker A250 Dual (0.8 nozzle)", + "setting_id": "1513914531", + "type": "machine", + "from": "system", + "instantiation": "true", + "inherits": "fdm_a250_dual", + "printer_model": "Snapmaker A250 Dual", + "default_print_profile": "0.24 Standard @Snapmaker (0.8 nozzle)", + "printer_variant": "0.8", + "max_layer_height": [ + "0.48" + ], + "min_layer_height": [ + "0.24" + ], + "nozzle_diameter": [ + "0.8", + "0.8" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A250 Dual QSKit (0.2 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker A250 Dual QSKit (0.2 nozzle).json new file mode 100644 index 0000000000..ce6885b619 --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A250 Dual QSKit (0.2 nozzle).json @@ -0,0 +1,21 @@ +{ + "name": "Snapmaker A250 Dual QSKit (0.2 nozzle)", + "setting_id": "2546842776", + "type": "machine", + "from": "system", + "instantiation": "true", + "inherits": "fdm_a250_dual_qs", + "printer_model": "Snapmaker A250 Dual QSKit", + "default_print_profile": "0.14 Standard @Snapmaker (0.2 nozzle)", + "printer_variant": "0.2", + "max_layer_height": [ + "0.14" + ], + "min_layer_height": [ + "0.06" + ], + "nozzle_diameter": [ + "0.2", + "0.2" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A250 Dual QSKit (0.4 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker A250 Dual QSKit (0.4 nozzle).json new file mode 100644 index 0000000000..879f2e0e37 --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A250 Dual QSKit (0.4 nozzle).json @@ -0,0 +1,21 @@ +{ + "name": "Snapmaker A250 Dual QSKit (0.4 nozzle)", + "setting_id": "3839345938", + "type": "machine", + "from": "system", + "instantiation": "true", + "inherits": "fdm_a250_dual_qs", + "printer_model": "Snapmaker A250 Dual QSKit", + "default_print_profile": "0.16 Optimal @Snapmaker (0.4 nozzle)", + "printer_variant": "0.4", + "max_layer_height": [ + "0.28" + ], + "min_layer_height": [ + "0.08" + ], + "nozzle_diameter": [ + "0.4", + "0.4" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A250 Dual QSKit (0.6 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker A250 Dual QSKit (0.6 nozzle).json new file mode 100644 index 0000000000..2cba0e7bb5 --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A250 Dual QSKit (0.6 nozzle).json @@ -0,0 +1,21 @@ +{ + "name": "Snapmaker A250 Dual QSKit (0.6 nozzle)", + "setting_id": "3391221140", + "type": "machine", + "from": "system", + "instantiation": "true", + "inherits": "fdm_a250_dual_qs", + "printer_model": "Snapmaker A250 Dual QSKit", + "default_print_profile": "0.18 Standard @Snapmaker (0.6 nozzle)", + "printer_variant": "0.6", + "max_layer_height": [ + "0.42" + ], + "min_layer_height": [ + "0.18" + ], + "nozzle_diameter": [ + "0.6", + "0.6" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A250 Dual QSKit (0.8 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker A250 Dual QSKit (0.8 nozzle).json new file mode 100644 index 0000000000..dffe1deaab --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A250 Dual QSKit (0.8 nozzle).json @@ -0,0 +1,21 @@ +{ + "name": "Snapmaker A250 Dual QSKit (0.8 nozzle)", + "setting_id": "48444934", + "type": "machine", + "from": "system", + "instantiation": "true", + "inherits": "fdm_a250_dual_qs", + "printer_model": "Snapmaker A250 Dual QSKit", + "default_print_profile": "0.24 Standard @Snapmaker (0.8 nozzle)", + "printer_variant": "0.8", + "max_layer_height": [ + "0.48" + ], + "min_layer_height": [ + "0.24" + ], + "nozzle_diameter": [ + "0.8", + "0.8" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A250 Dual QSKit.json b/resources/profiles/Snapmaker/machine/Snapmaker A250 Dual QSKit.json new file mode 100644 index 0000000000..b9393c2dc3 --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A250 Dual QSKit.json @@ -0,0 +1,11 @@ +{ + "type": "machine_model", + "machine_tech": "FFF", + "family": "Snapmaker", + "name": "Snapmaker A250 Dual QSKit", + "url": "https://github.com/macdylan", + "model_id": "2661871200", + "bed_model": "Snapmaker A250_bed.stl", + "bed_texture": "Snapmaker A250 QSKit_texture.svg", + "nozzle_diameter": "0.2;0.4;0.6;0.8" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A250 Dual.json b/resources/profiles/Snapmaker/machine/Snapmaker A250 Dual.json new file mode 100644 index 0000000000..2ec1c0ee92 --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A250 Dual.json @@ -0,0 +1,11 @@ +{ + "type": "machine_model", + "machine_tech": "FFF", + "family": "Snapmaker", + "name": "Snapmaker A250 Dual", + "url": "https://github.com/macdylan", + "model_id": "2728546690", + "bed_model": "Snapmaker A250_bed.stl", + "bed_texture": "Snapmaker A250_texture.svg", + "nozzle_diameter": "0.2;0.4;0.6;0.8" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A250 QSKit (0.2 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker A250 QSKit (0.2 nozzle).json new file mode 100644 index 0000000000..a05fcdb075 --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A250 QSKit (0.2 nozzle).json @@ -0,0 +1,20 @@ +{ + "name": "Snapmaker A250 QSKit (0.2 nozzle)", + "setting_id": "2572320030", + "type": "machine", + "from": "system", + "instantiation": "true", + "inherits": "fdm_a250_qs", + "printer_model": "Snapmaker A250 QSKit", + "default_print_profile": "0.14 Standard @Snapmaker (0.2 nozzle)", + "printer_variant": "0.2", + "max_layer_height": [ + "0.14" + ], + "min_layer_height": [ + "0.06" + ], + "nozzle_diameter": [ + "0.2" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A250 QSKit (0.4 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker A250 QSKit (0.4 nozzle).json new file mode 100644 index 0000000000..795d74095d --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A250 QSKit (0.4 nozzle).json @@ -0,0 +1,20 @@ +{ + "name": "Snapmaker A250 QSKit (0.4 nozzle)", + "setting_id": "3930588308", + "type": "machine", + "from": "system", + "instantiation": "true", + "inherits": "fdm_a250_qs", + "printer_model": "Snapmaker A250 QSKit", + "default_print_profile": "0.16 Optimal @Snapmaker (0.4 nozzle)", + "printer_variant": "0.4", + "max_layer_height": [ + "0.28" + ], + "min_layer_height": [ + "0.08" + ], + "nozzle_diameter": [ + "0.4" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A250 QSKit (0.6 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker A250 QSKit (0.6 nozzle).json new file mode 100644 index 0000000000..1da33f76b5 --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A250 QSKit (0.6 nozzle).json @@ -0,0 +1,20 @@ +{ + "name": "Snapmaker A250 QSKit (0.6 nozzle)", + "setting_id": "3300797458", + "type": "machine", + "from": "system", + "instantiation": "true", + "inherits": "fdm_a250_qs", + "printer_model": "Snapmaker A250 QSKit", + "default_print_profile": "0.18 Standard @Snapmaker (0.6 nozzle)", + "printer_variant": "0.6", + "max_layer_height": [ + "0.42" + ], + "min_layer_height": [ + "0.18" + ], + "nozzle_diameter": [ + "0.6" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A250 QSKit (0.8 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker A250 QSKit (0.8 nozzle).json new file mode 100644 index 0000000000..0004720c56 --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A250 QSKit (0.8 nozzle).json @@ -0,0 +1,20 @@ +{ + "name": "Snapmaker A250 QSKit (0.8 nozzle)", + "setting_id": "209516416", + "type": "machine", + "from": "system", + "instantiation": "true", + "inherits": "fdm_a250_qs", + "printer_model": "Snapmaker A250 QSKit", + "default_print_profile": "0.24 Standard @Snapmaker (0.8 nozzle)", + "printer_variant": "0.8", + "max_layer_height": [ + "0.48" + ], + "min_layer_height": [ + "0.24" + ], + "nozzle_diameter": [ + "0.8" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A250 QSKit.json b/resources/profiles/Snapmaker/machine/Snapmaker A250 QSKit.json new file mode 100644 index 0000000000..26a51f641c --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A250 QSKit.json @@ -0,0 +1,11 @@ +{ + "type": "machine_model", + "machine_tech": "FFF", + "family": "Snapmaker", + "name": "Snapmaker A250 QSKit", + "url": "https://github.com/macdylan", + "model_id": "3817522582", + "bed_model": "Snapmaker A250_bed.stl", + "bed_texture": "Snapmaker A250 QSKit_texture.svg", + "nozzle_diameter": "0.2;0.4;0.6;0.8" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A250.json b/resources/profiles/Snapmaker/machine/Snapmaker A250.json index 7824400213..ee02048be1 100644 --- a/resources/profiles/Snapmaker/machine/Snapmaker A250.json +++ b/resources/profiles/Snapmaker/machine/Snapmaker A250.json @@ -1,12 +1,11 @@ { - "type": "machine_model", - "name": "Snapmaker A250", - "model_id": "SnapmakerA250", - "nozzle_diameter": "0.4", - "machine_tech": "FFF", - "family": "Snapmaker", - "bed_model": "", - "bed_texture": "", - "hotend_model": "", - "default_materials": "Snapmaker Generic ABS;Snapmaker Generic PLA;Snapmaker Generic PLA-CF;Snapmaker Generic PETG;Snapmaker Generic TPU;Snapmaker Generic ASA;Snapmaker Generic PC;Snapmaker Generic PVA;Snapmaker Generic PA;Snapmaker Generic PA-CF" + "type": "machine_model", + "machine_tech": "FFF", + "family": "Snapmaker", + "name": "Snapmaker A250", + "url": "https://github.com/macdylan", + "model_id": "261851393", + "bed_model": "Snapmaker A250_bed.stl", + "bed_texture": "Snapmaker A250_texture.svg", + "nozzle_diameter": "0.2;0.4;0.6;0.8" } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A350 (0.2 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker A350 (0.2 nozzle).json new file mode 100644 index 0000000000..deb7ff42bb --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A350 (0.2 nozzle).json @@ -0,0 +1,20 @@ +{ + "name": "Snapmaker A350 (0.2 nozzle)", + "setting_id": "703292831", + "type": "machine", + "from": "system", + "instantiation": "true", + "inherits": "fdm_a350", + "printer_model": "Snapmaker A350", + "default_print_profile": "0.14 Standard @Snapmaker (0.2 nozzle)", + "printer_variant": "0.2", + "max_layer_height": [ + "0.14" + ], + "min_layer_height": [ + "0.06" + ], + "nozzle_diameter": [ + "0.2" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A350 (0.4 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker A350 (0.4 nozzle).json new file mode 100644 index 0000000000..29e402b25d --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A350 (0.4 nozzle).json @@ -0,0 +1,20 @@ +{ + "name": "Snapmaker A350 (0.4 nozzle)", + "setting_id": "1525750805", + "type": "machine", + "from": "system", + "instantiation": "true", + "inherits": "fdm_a350", + "printer_model": "Snapmaker A350", + "default_print_profile": "0.16 Optimal @Snapmaker (0.4 nozzle)", + "printer_variant": "0.4", + "max_layer_height": [ + "0.28" + ], + "min_layer_height": [ + "0.08" + ], + "nozzle_diameter": [ + "0.4" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A350 (0.6 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker A350 (0.6 nozzle).json new file mode 100644 index 0000000000..35aed17cfc --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A350 (0.6 nozzle).json @@ -0,0 +1,20 @@ +{ + "name": "Snapmaker A350 (0.6 nozzle)", + "setting_id": "1946629267", + "type": "machine", + "from": "system", + "instantiation": "true", + "inherits": "fdm_a350", + "printer_model": "Snapmaker A350", + "default_print_profile": "0.18 Standard @Snapmaker (0.6 nozzle)", + "printer_variant": "0.6", + "max_layer_height": [ + "0.42" + ], + "min_layer_height": [ + "0.18" + ], + "nozzle_diameter": [ + "0.6" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A350 (0.8 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker A350 (0.8 nozzle).json new file mode 100644 index 0000000000..83604ad267 --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A350 (0.8 nozzle).json @@ -0,0 +1,20 @@ +{ + "name": "Snapmaker A350 (0.8 nozzle)", + "setting_id": "3167088385", + "type": "machine", + "from": "system", + "instantiation": "true", + "inherits": "fdm_a350", + "printer_model": "Snapmaker A350", + "default_print_profile": "0.24 Standard @Snapmaker (0.8 nozzle)", + "printer_variant": "0.8", + "max_layer_height": [ + "0.48" + ], + "min_layer_height": [ + "0.24" + ], + "nozzle_diameter": [ + "0.8" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A350 0.4 nozzle.json b/resources/profiles/Snapmaker/machine/Snapmaker A350 0.4 nozzle.json deleted file mode 100644 index 9314067f10..0000000000 --- a/resources/profiles/Snapmaker/machine/Snapmaker A350 0.4 nozzle.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "type": "machine", - "setting_id": "GM003", - "name": "Snapmaker A350 0.4 nozzle", - "from": "system", - "instantiation": "true", - "inherits": "fdm_machine_common", - "printer_model": "Snapmaker A350", - "default_print_profile": "0.20mm Standard @Snapmaker", - "nozzle_diameter": [ - "0.4" - ], - "bed_exclude_area": [ - "0x0" - ], - "printable_area": [ - "0x0", - "320x0", - "320x350", - "0x350" - ], - "printable_height": "330", - "machine_start_gcode": "M82; M190 S[bed_temperature_initial_layer_single]\nM109 S[nozzle_temperature_initial_layer]\nPRINT_START EXTRUDER=[nozzle_temperature_initial_layer] BED=[bed_temperature_initial_layer_single]\n; You can use following code instead if your PRINT_START macro support Chamber and print area bedmesh\n; PRINT_START EXTRUDER=[nozzle_temperature_initial_layer] BED=[bed_temperature_initial_layer_single] Chamber=[chamber_temperature] PRINT_MIN={first_layer_print_min[0]},{first_layer_print_min[1]} PRINT_MAX={first_layer_print_max[0]},{first_layer_print_max[1]}", - "machine_end_gcode": "config end gcode\nM104 S0\nM140 S0\n;Retract the filament\nG92 E1\nG1 E-1 F300\nG28 X0 Y0\nM84", - "layer_change_gcode": "", - "scan_first_layer": "0", - "nozzle_type": "hardened_steel", - "auxiliary_fan": "0" - } - \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A350 Dual (0.2 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker A350 Dual (0.2 nozzle).json new file mode 100644 index 0000000000..194eb60329 --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A350 Dual (0.2 nozzle).json @@ -0,0 +1,21 @@ +{ + "name": "Snapmaker A350 Dual (0.2 nozzle)", + "setting_id": "1355319715", + "type": "machine", + "from": "system", + "instantiation": "true", + "inherits": "fdm_a350_dual", + "printer_model": "Snapmaker A350 Dual", + "default_print_profile": "0.14 Standard @Snapmaker (0.2 nozzle)", + "printer_variant": "0.2", + "max_layer_height": [ + "0.14" + ], + "min_layer_height": [ + "0.06" + ], + "nozzle_diameter": [ + "0.2", + "0.2" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A350 Dual (0.4 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker A350 Dual (0.4 nozzle).json new file mode 100644 index 0000000000..d835acf1a0 --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A350 Dual (0.4 nozzle).json @@ -0,0 +1,21 @@ +{ + "name": "Snapmaker A350 Dual (0.4 nozzle)", + "setting_id": "601026601", + "type": "machine", + "from": "system", + "instantiation": "true", + "inherits": "fdm_a350_dual", + "printer_model": "Snapmaker A350 Dual", + "default_print_profile": "0.16 Optimal @Snapmaker (0.4 nozzle)", + "printer_variant": "0.4", + "max_layer_height": [ + "0.28" + ], + "min_layer_height": [ + "0.08" + ], + "nozzle_diameter": [ + "0.4", + "0.4" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A350 Dual (0.6 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker A350 Dual (0.6 nozzle).json new file mode 100644 index 0000000000..02b9336c2e --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A350 Dual (0.6 nozzle).json @@ -0,0 +1,21 @@ +{ + "name": "Snapmaker A350 Dual (0.6 nozzle)", + "setting_id": "220518575", + "type": "machine", + "from": "system", + "instantiation": "true", + "inherits": "fdm_a350_dual", + "printer_model": "Snapmaker A350 Dual", + "default_print_profile": "0.18 Standard @Snapmaker (0.6 nozzle)", + "printer_variant": "0.6", + "max_layer_height": [ + "0.42" + ], + "min_layer_height": [ + "0.18" + ], + "nozzle_diameter": [ + "0.6", + "0.6" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A350 Dual (0.8 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker A350 Dual (0.8 nozzle).json new file mode 100644 index 0000000000..dbb4a6cade --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A350 Dual (0.8 nozzle).json @@ -0,0 +1,21 @@ +{ + "name": "Snapmaker A350 Dual (0.8 nozzle)", + "setting_id": "3320185661", + "type": "machine", + "from": "system", + "instantiation": "true", + "inherits": "fdm_a350_dual", + "printer_model": "Snapmaker A350 Dual", + "default_print_profile": "0.24 Standard @Snapmaker (0.8 nozzle)", + "printer_variant": "0.8", + "max_layer_height": [ + "0.48" + ], + "min_layer_height": [ + "0.24" + ], + "nozzle_diameter": [ + "0.8", + "0.8" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A350 Dual QSKit (0.2 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker A350 Dual QSKit (0.2 nozzle).json new file mode 100644 index 0000000000..adc4930a8b --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A350 Dual QSKit (0.2 nozzle).json @@ -0,0 +1,21 @@ +{ + "name": "Snapmaker A350 Dual QSKit (0.2 nozzle)", + "setting_id": "4181829593", + "type": "machine", + "from": "system", + "instantiation": "true", + "inherits": "fdm_a350_dual_qs", + "printer_model": "Snapmaker A350 Dual QSKit", + "default_print_profile": "0.14 Standard @Snapmaker (0.2 nozzle)", + "printer_variant": "0.2", + "max_layer_height": [ + "0.14" + ], + "min_layer_height": [ + "0.06" + ], + "nozzle_diameter": [ + "0.2", + "0.2" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A350 Dual QSKit (0.4 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker A350 Dual QSKit (0.4 nozzle).json new file mode 100644 index 0000000000..59907674d8 --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A350 Dual QSKit (0.4 nozzle).json @@ -0,0 +1,21 @@ +{ + "name": "Snapmaker A350 Dual QSKit (0.4 nozzle)", + "setting_id": "2321276499", + "type": "machine", + "from": "system", + "instantiation": "true", + "inherits": "fdm_a350_dual_qs", + "printer_model": "Snapmaker A350 Dual QSKit", + "default_print_profile": "0.16 Optimal @Snapmaker (0.4 nozzle)", + "printer_variant": "0.4", + "max_layer_height": [ + "0.28" + ], + "min_layer_height": [ + "0.08" + ], + "nozzle_diameter": [ + "0.4", + "0.4" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A350 Dual QSKit (0.6 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker A350 Dual QSKit (0.6 nozzle).json new file mode 100644 index 0000000000..42ba77b829 --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A350 Dual QSKit (0.6 nozzle).json @@ -0,0 +1,21 @@ +{ + "name": "Snapmaker A350 Dual QSKit (0.6 nozzle)", + "setting_id": "2762864341", + "type": "machine", + "from": "system", + "instantiation": "true", + "inherits": "fdm_a350_dual_qs", + "printer_model": "Snapmaker A350 Dual QSKit", + "default_print_profile": "0.18 Standard @Snapmaker (0.6 nozzle)", + "printer_variant": "0.6", + "max_layer_height": [ + "0.42" + ], + "min_layer_height": [ + "0.18" + ], + "nozzle_diameter": [ + "0.6", + "0.6" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A350 Dual QSKit (0.8 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker A350 Dual QSKit (0.8 nozzle).json new file mode 100644 index 0000000000..e5eff464b6 --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A350 Dual QSKit (0.8 nozzle).json @@ -0,0 +1,21 @@ +{ + "name": "Snapmaker A350 Dual QSKit (0.8 nozzle)", + "setting_id": "1819225415", + "type": "machine", + "from": "system", + "instantiation": "true", + "inherits": "fdm_a350_dual_qs", + "printer_model": "Snapmaker A350 Dual QSKit", + "default_print_profile": "0.24 Standard @Snapmaker (0.8 nozzle)", + "printer_variant": "0.8", + "max_layer_height": [ + "0.48" + ], + "min_layer_height": [ + "0.24" + ], + "nozzle_diameter": [ + "0.8", + "0.8" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A350 Dual QSKit.json b/resources/profiles/Snapmaker/machine/Snapmaker A350 Dual QSKit.json new file mode 100644 index 0000000000..4d3cb2f15c --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A350 Dual QSKit.json @@ -0,0 +1,11 @@ +{ + "type": "machine_model", + "machine_tech": "FFF", + "family": "Snapmaker", + "name": "Snapmaker A350 Dual QSKit", + "url": "https://github.com/macdylan", + "model_id": "61280022", + "bed_model": "Snapmaker A350_bed.stl", + "bed_texture": "Snapmaker A350 QSKit_texture.svg", + "nozzle_diameter": "0.2;0.4;0.6;0.8" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A350 Dual.json b/resources/profiles/Snapmaker/machine/Snapmaker A350 Dual.json new file mode 100644 index 0000000000..c44d84e8e3 --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A350 Dual.json @@ -0,0 +1,11 @@ +{ + "type": "machine_model", + "machine_tech": "FFF", + "family": "Snapmaker", + "name": "Snapmaker A350 Dual", + "url": "https://github.com/macdylan", + "model_id": "1846038812", + "bed_model": "Snapmaker A350_bed.stl", + "bed_texture": "Snapmaker A350_texture.svg", + "nozzle_diameter": "0.2;0.4;0.6;0.8" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A350 QSKit (0.2 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker A350 QSKit (0.2 nozzle).json new file mode 100644 index 0000000000..30fb4c4975 --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A350 QSKit (0.2 nozzle).json @@ -0,0 +1,20 @@ +{ + "name": "Snapmaker A350 QSKit (0.2 nozzle)", + "setting_id": "2390366686", + "type": "machine", + "from": "system", + "instantiation": "true", + "inherits": "fdm_a350_qs", + "printer_model": "Snapmaker A350 QSKit", + "default_print_profile": "0.14 Standard @Snapmaker (0.2 nozzle)", + "printer_variant": "0.2", + "max_layer_height": [ + "0.14" + ], + "min_layer_height": [ + "0.06" + ], + "nozzle_diameter": [ + "0.2" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A350 QSKit (0.4 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker A350 QSKit (0.4 nozzle).json new file mode 100644 index 0000000000..3150e0df8e --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A350 QSKit (0.4 nozzle).json @@ -0,0 +1,20 @@ +{ + "name": "Snapmaker A350 QSKit (0.4 nozzle)", + "setting_id": "4250951764", + "type": "machine", + "from": "system", + "instantiation": "true", + "inherits": "fdm_a350_qs", + "printer_model": "Snapmaker A350 QSKit", + "default_print_profile": "0.16 Optimal @Snapmaker (0.4 nozzle)", + "printer_variant": "0.4", + "max_layer_height": [ + "0.28" + ], + "min_layer_height": [ + "0.08" + ], + "nozzle_diameter": [ + "0.4" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A350 QSKit (0.6 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker A350 QSKit (0.6 nozzle).json new file mode 100644 index 0000000000..5f4b5abd0d --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A350 QSKit (0.6 nozzle).json @@ -0,0 +1,20 @@ +{ + "name": "Snapmaker A350 QSKit (0.6 nozzle)", + "setting_id": "3549841618", + "type": "machine", + "from": "system", + "instantiation": "true", + "inherits": "fdm_a350_qs", + "printer_model": "Snapmaker A350 QSKit", + "default_print_profile": "0.18 Standard @Snapmaker (0.6 nozzle)", + "printer_variant": "0.6", + "max_layer_height": [ + "0.42" + ], + "min_layer_height": [ + "0.18" + ], + "nozzle_diameter": [ + "0.6" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A350 QSKit (0.8 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker A350 QSKit (0.8 nozzle).json new file mode 100644 index 0000000000..bd4c9bec85 --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A350 QSKit (0.8 nozzle).json @@ -0,0 +1,20 @@ +{ + "name": "Snapmaker A350 QSKit (0.8 nozzle)", + "setting_id": "458527552", + "type": "machine", + "from": "system", + "instantiation": "true", + "inherits": "fdm_a350_qs", + "printer_model": "Snapmaker A350 QSKit", + "default_print_profile": "0.24 Standard @Snapmaker (0.8 nozzle)", + "printer_variant": "0.8", + "max_layer_height": [ + "0.48" + ], + "min_layer_height": [ + "0.24" + ], + "nozzle_diameter": [ + "0.8" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A350 QSKit.json b/resources/profiles/Snapmaker/machine/Snapmaker A350 QSKit.json new file mode 100644 index 0000000000..d944423487 --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker A350 QSKit.json @@ -0,0 +1,11 @@ +{ + "type": "machine_model", + "machine_tech": "FFF", + "family": "Snapmaker", + "name": "Snapmaker A350 QSKit", + "url": "https://github.com/macdylan", + "model_id": "4109488597", + "bed_model": "Snapmaker A350_bed.stl", + "bed_texture": "Snapmaker A350 QSKit_texture.svg", + "nozzle_diameter": "0.2;0.4;0.6;0.8" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker A350.json b/resources/profiles/Snapmaker/machine/Snapmaker A350.json index f9f89abaca..1752d80275 100644 --- a/resources/profiles/Snapmaker/machine/Snapmaker A350.json +++ b/resources/profiles/Snapmaker/machine/Snapmaker A350.json @@ -1,12 +1,11 @@ { - "type": "machine_model", - "name": "Snapmaker A350", - "model_id": "SnapmakerA350", - "nozzle_diameter": "0.4", - "machine_tech": "FFF", - "family": "Snapmaker", - "bed_model": "", - "bed_texture": "", - "hotend_model": "", - "default_materials": "Snapmaker Generic ABS;Snapmaker Generic PLA;Snapmaker Generic PLA-CF;Snapmaker Generic PETG;Snapmaker Generic TPU;Snapmaker Generic ASA;Snapmaker Generic PC;Snapmaker Generic PVA;Snapmaker Generic PA;Snapmaker Generic PA-CF" -} + "type": "machine_model", + "machine_tech": "FFF", + "family": "Snapmaker", + "name": "Snapmaker A350", + "url": "https://github.com/macdylan", + "model_id": "240771894", + "bed_model": "Snapmaker A350_bed.stl", + "bed_texture": "Snapmaker A350_texture.svg", + "nozzle_diameter": "0.2;0.4;0.6;0.8" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker J1 (0.2 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker J1 (0.2 nozzle).json new file mode 100644 index 0000000000..42443e55c4 --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker J1 (0.2 nozzle).json @@ -0,0 +1,21 @@ +{ + "name": "Snapmaker J1 (0.2 nozzle)", + "setting_id": "773945936", + "type": "machine", + "from": "system", + "instantiation": "true", + "inherits": "fdm_idex", + "printer_model": "Snapmaker J1", + "default_print_profile": "0.14 Standard @Snapmaker J1 (0.2 nozzle)", + "printer_variant": "0.2", + "max_layer_height": [ + "0.14" + ], + "min_layer_height": [ + "0.06" + ], + "nozzle_diameter": [ + "0.2", + "0.2" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker J1 (0.4 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker J1 (0.4 nozzle).json new file mode 100644 index 0000000000..4f7038976f --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker J1 (0.4 nozzle).json @@ -0,0 +1,21 @@ +{ + "name": "Snapmaker J1 (0.4 nozzle)", + "setting_id": "1564148698", + "type": "machine", + "from": "system", + "instantiation": "true", + "inherits": "fdm_idex", + "printer_model": "Snapmaker J1", + "default_print_profile": "0.16 Optimal @Snapmaker J1 (0.4 nozzle)", + "printer_variant": "0.4", + "max_layer_height": [ + "0.28" + ], + "min_layer_height": [ + "0.08" + ], + "nozzle_diameter": [ + "0.4", + "0.4" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker J1 (0.6 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker J1 (0.6 nozzle).json new file mode 100644 index 0000000000..281a17584a --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker J1 (0.6 nozzle).json @@ -0,0 +1,21 @@ +{ + "name": "Snapmaker J1 (0.6 nozzle)", + "setting_id": "1942825820", + "type": "machine", + "from": "system", + "instantiation": "true", + "inherits": "fdm_idex", + "printer_model": "Snapmaker J1", + "default_print_profile": "0.18 Standard @Snapmaker J1 (0.6 nozzle)", + "printer_variant": "0.6", + "max_layer_height": [ + "0.42" + ], + "min_layer_height": [ + "0.18" + ], + "nozzle_diameter": [ + "0.6", + "0.6" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker J1 (0.8 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker J1 (0.8 nozzle).json new file mode 100644 index 0000000000..663599db38 --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker J1 (0.8 nozzle).json @@ -0,0 +1,21 @@ +{ + "name": "Snapmaker J1 (0.8 nozzle)", + "setting_id": "3138384078", + "type": "machine", + "from": "system", + "instantiation": "true", + "inherits": "fdm_idex", + "printer_model": "Snapmaker J1", + "default_print_profile": "0.24 Standard @Snapmaker J1 (0.8 nozzle)", + "printer_variant": "0.8", + "max_layer_height": [ + "0.48" + ], + "min_layer_height": [ + "0.24" + ], + "nozzle_diameter": [ + "0.8", + "0.8" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker J1 0.4 nozzle.json b/resources/profiles/Snapmaker/machine/Snapmaker J1 0.4 nozzle.json deleted file mode 100644 index 09801c1ced..0000000000 --- a/resources/profiles/Snapmaker/machine/Snapmaker J1 0.4 nozzle.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "type": "machine", - "setting_id": "GM010", - "name": "Snapmaker J1 0.4 nozzle", - "from": "system", - "instantiation": "true", - "inherits": "fdm_machine_common", - "printer_model": "Snapmaker J1", - "default_print_profile": "0.20mm 0.4 Standard @Snapmaker J1", - "retraction_minimum_travel": [ - "3" - ], - "thumbnails": [ - "400x400" - ], - "z_hop_types": [ - "Auto Lift" - ], - "z_lift_type": [ - "SpiralLift" - ], - "nozzle_diameter": [ - "0.4" - ], - "bed_exclude_area": [ - "0x0" - ], - "printable_area": [ - "0x0", - "324x0", - "324x200", - "0x200" - ], - "printable_height": "200", - "machine_start_gcode": ";***** Snapmaker J1\n;***** Update : 20221222\n;***** Printer : [printer_preset]\n;***** Profile : [print_preset]\nM593 P1 X F35.7 \nM593 P1 Y F33.7 \nM355 S1 P16 ;------------OPTIONAL ;dim led \nM83 ;absolute extrusion mode\nM140 S[first_layer_bed_temperature] ;Start Warming Bed\nT[initial_extruder] ;switch to initial extruder\n{if total_toolchanges < 1}; Preheat one extruder (just one used)\nM104 S160 ;preheat nozzle\n{else}; Preheat both extruders used\nM104 S160 T0 ;preheat T0\nM104 S160 T1 ;preheat T1\n{endif}\nG28 ; home all axes\nG90 ;absolute positioning\nG1 Z0.8 F1800\nM201 X5000 Y5000 Z500 E5000\nM205 V5\nM900 T0 K0.02\nM900 T1 K0.02\nM190 S[first_layer_bed_temperature] ; C3 W2 Wait For Bed Temperature\n{if total_toolchanges < 1}; Heat one extruder\nM104 S[first_layer_temperature]\nM109 S[first_layer_temperature] ;Wait for Hotend Temperature\n{else}; Heat both extruders\nM104 T0 S{first_layer_temperature[0]}\nM104 T1 S{first_layer_temperature[1]}\nM109 T0 S{first_layer_temperature[0]} ;Wait for Hotend Temperature\nM109 T1 S{first_layer_temperature[1]} ;Wait for Hotend Temperature\n{endif}\n;\n{if 1==1} ;-----------OPTIONAL ;led effect\n M355 S1 P32\n G4 S1\n M355 S1 P48\n G4 S1\n M355 S1 P64\n G4 S1\n M355 S1 P96\n G4 S1\n M355 S1 P128\n G4 S1\n M355 S1 P255\n{endif}\n;\nG92 E0\n;\n{if total_toolchanges > 0 or initial_extruder == 0}; Purge line T0\nT0\nG92 E0\nG1 F1200 X5 Z0.5\nG1 F600 X100 E20\nG1 F600 Z2\nG92 E0\nG1 F1200 E-6\nG0 X-20 F12000 ; park T0\n{endif}\n{if total_toolchanges > 0 or initial_extruder == 1}; Purge line T1\nT1\nG92 E0\nG1 F1200 X295 Z0.5\nG1 F600 X200 E20\nG1 F600 Z2\nG92 E0\nG1 F1200 E-6\nG0 X350 F12000 ; park T1 (old 345)\n{endif}\n;End Start Gcode J1\n", - "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_num]\n", - "machine_end_gcode": ";End GCode J1 begin\nM140 S0 ;heated bed heater off \nG90 ;absolute positioning\nG92 E0\n;\nG1 E-6 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\n;\nM104 S0 T0 ;extruder heater off\nM104 S0 T1 ;extruder heater off\n;\nG1 Z200 F1500 ;move bed down\nG0 Y10 F3000 ;so the head is out of the way\nM84 ;steppers off\nM355 S1 P16 ;------------OPTIONAL ;dim led \nM107\n;End of Gcode\n;\n; DON'T REMOVE these lines if you're using the smfix (https://github.com/macdylan/Snapmaker2Slic3rPostProcessor)\n; min_x = [first_layer_print_min_0]\n; min_y = [first_layer_print_min_1]\n; max_x = [first_layer_print_max_0]\n; max_y = [first_layer_print_max_1]\n; max_z = [max_layer_z]\n;", - "change_filament_gcode": ";Change Filament", - "machine_max_acceleration_e": [ - "6000", - "5000" - ], - "machine_max_acceleration_extruding": [ - "5000", - "2000" - ], - "machine_max_acceleration_retracting": [ - "6000", - "5000" - ], - "machine_max_acceleration_x": [ - "5000", - "2000" - ], - "machine_max_acceleration_y": [ - "5000", - "2000" - ], - "machine_max_speed_e": [ - "60", - "25" - ], - "max_layer_height": [ - "0.30" - ], - "scan_first_layer": "0", - "nozzle_type": "hardened_steel", - "auxiliary_fan": "0" -} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker J1 0.6 nozzle.json b/resources/profiles/Snapmaker/machine/Snapmaker J1 0.6 nozzle.json deleted file mode 100644 index 578c99f5be..0000000000 --- a/resources/profiles/Snapmaker/machine/Snapmaker J1 0.6 nozzle.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "type": "machine", - "setting_id": "GM011", - "name": "Snapmaker J1 0.6 nozzle", - "from": "system", - "instantiation": "true", - "inherits": "fdm_machine_common", - "printer_model": "Snapmaker J1", - "default_print_profile": "0.20mm 0.6 Standard @Snapmaker J1", - "retraction_minimum_travel": [ - "3" - ], - "thumbnails": [ - "400x400" - ], - "z_hop_types": [ - "Auto Lift" - ], - "z_lift_type": [ - "SpiralLift" - ], - "nozzle_diameter": [ - "0.6" - ], - "bed_exclude_area": [ - "0x0" - ], - "printable_area": [ - "0x0", - "324x0", - "324x200", - "0x200" - ], - "printable_height": "200", - "machine_start_gcode": ";***** Snapmaker J1\n;***** Update : 20221222\n;***** Printer : [printer_preset]\n;***** Profile : [print_preset]\nM593 P1 X F35.7 \nM593 P1 Y F33.7 \nM355 S1 P16 ;------------OPTIONAL ;dim led \nM83 ;absolute extrusion mode\nM140 S[first_layer_bed_temperature] ;Start Warming Bed\nT[initial_extruder] ;switch to initial extruder\n{if total_toolchanges < 1}; Preheat one extruder (just one used)\nM104 S160 ;preheat nozzle\n{else}; Preheat both extruders used\nM104 S160 T0 ;preheat T0\nM104 S160 T1 ;preheat T1\n{endif}\nG28 ; home all axes\nG90 ;absolute positioning\nG1 Z0.8 F1800\nM201 X5000 Y5000 Z500 E5000\nM205 V5\nM900 T0 K0.02\nM900 T1 K0.02\nM190 S[first_layer_bed_temperature] ; C3 W2 Wait For Bed Temperature\n{if total_toolchanges < 1}; Heat one extruder\nM104 S[first_layer_temperature]\nM109 S[first_layer_temperature] ;Wait for Hotend Temperature\n{else}; Heat both extruders\nM104 T0 S{first_layer_temperature[0]}\nM104 T1 S{first_layer_temperature[1]}\nM109 T0 S{first_layer_temperature[0]} ;Wait for Hotend Temperature\nM109 T1 S{first_layer_temperature[1]} ;Wait for Hotend Temperature\n{endif}\n;\n{if 1==1} ;-----------OPTIONAL ;led effect\n M355 S1 P32\n G4 S1\n M355 S1 P48\n G4 S1\n M355 S1 P64\n G4 S1\n M355 S1 P96\n G4 S1\n M355 S1 P128\n G4 S1\n M355 S1 P255\n{endif}\n;\nG92 E0\n;\n{if total_toolchanges > 0 or initial_extruder == 0}; Purge line T0\nT0\nG92 E0\nG1 F1200 X5 Z0.5\nG1 F600 X100 E20\nG1 F600 Z2\nG92 E0\nG1 F1200 E-6\nG0 X-20 F12000 ; park T0\n{endif}\n{if total_toolchanges > 0 or initial_extruder == 1}; Purge line T1\nT1\nG92 E0\nG1 F1200 X295 Z0.5\nG1 F600 X200 E20\nG1 F600 Z2\nG92 E0\nG1 F1200 E-6\nG0 X350 F12000 ; park T1 (old 345)\n{endif}\n;End Start Gcode J1\n", - "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_num]\n", - "machine_end_gcode": ";End GCode J1 begin\nM140 S0 ;heated bed heater off \nG90 ;absolute positioning\nG92 E0\n;\nG1 E-6 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\n;\nM104 S0 T0 ;extruder heater off\nM104 S0 T1 ;extruder heater off\n;\nG1 Z200 F1500 ;move bed down\nG0 Y10 F3000 ;so the head is out of the way\nM84 ;steppers off\nM355 S1 P16 ;------------OPTIONAL ;dim led \nM107\n;End of Gcode\n;\n; DON'T REMOVE these lines if you're using the smfix (https://github.com/macdylan/Snapmaker2Slic3rPostProcessor)\n; min_x = [first_layer_print_min_0]\n; min_y = [first_layer_print_min_1]\n; max_x = [first_layer_print_max_0]\n; max_y = [first_layer_print_max_1]\n; max_z = [max_layer_z]\n;", - "change_filament_gcode": ";Change Filament", - "machine_max_acceleration_e": [ - "6000", - "5000" - ], - "machine_max_acceleration_extruding": [ - "5000", - "2000" - ], - "machine_max_acceleration_retracting": [ - "6000", - "5000" - ], - "machine_max_acceleration_x": [ - "5000", - "2000" - ], - "machine_max_acceleration_y": [ - "5000", - "2000" - ], - "machine_max_speed_e": [ - "60", - "25" - ], - "max_layer_height": [ - "0.40" - ], - "scan_first_layer": "0", - "nozzle_type": "hardened_steel", - "auxiliary_fan": "0", - "printer_variant": "0.6" -} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker J1.json b/resources/profiles/Snapmaker/machine/Snapmaker J1.json index d08865471c..15b5420309 100644 --- a/resources/profiles/Snapmaker/machine/Snapmaker J1.json +++ b/resources/profiles/Snapmaker/machine/Snapmaker J1.json @@ -1,12 +1,11 @@ { - "type": "machine_model", - "name": "Snapmaker J1", - "model_id": "SnapmakerJ1", - "nozzle_diameter": "0.4;0.6", - "machine_tech": "FFF", - "family": "Snapmaker", - "bed_model": "", - "bed_texture": "j1_texture.svg", - "hotend_model": "", - "default_materials": "Snapmaker J1 ABS;Snapmaker J1 PLA;Snapmaker J1 PLA-CF;Snapmaker J1 PETG;Snapmaker J1 TPU;Snapmaker J1 ASA;Snapmaker J1 PC;Snapmaker J1 PVA;Snapmaker J1 PA;Snapmaker J1 PA-CF" -} + "type": "machine_model", + "machine_tech": "FFF", + "family": "Snapmaker", + "name": "Snapmaker J1", + "url": "https://github.com/macdylan", + "model_id": "199828459", + "bed_model": "Snapmaker J1_bed.stl", + "bed_texture": "Snapmaker J1_texture.svg", + "nozzle_diameter": "0.2;0.4;0.6;0.8" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/fdm_a250.json b/resources/profiles/Snapmaker/machine/fdm_a250.json new file mode 100644 index 0000000000..e95e8193d4 --- /dev/null +++ b/resources/profiles/Snapmaker/machine/fdm_a250.json @@ -0,0 +1,20 @@ +{ + "type": "machine", + "from": "system", + "instantiation": "false", + "name": "fdm_a250", + "inherits": "fdm_linear2", + "bed_model": "Snapmaker A250_bed.stl", + "bed_texture": "Snapmaker A250_texture.svg", + "printable_height": "235", + "printer_notes": "PRINTER_MODEL_SNAPMAKER_A250\n", + "printable_area": [ + "0x0", + "230x0", + "230x250", + "0x250" + ], + "machine_start_gcode": "; Model: Snapmaker A250\n; Update: 20231019\n; Maintained by https://github.com/macdylan/3dp-configs\n; Printer : [printer_preset]\n; Profile : [print_preset]\n; Plate : [plate_name]\n\nT[initial_extruder]\n\nM140 S{first_layer_bed_temperature[initial_extruder]}\n\n; you can clean the nozzle\nM104 S165\nM204 S100\nG28\nG0 Z156 F960.0\nG0 Y125.0 F3420.0\nG0 X115.0\n\nM190 R{first_layer_bed_temperature[initial_extruder]}\n\nG28\nG0 X0\nG0 Z0.2 F960.0\nG0 Y0 F3420.0\nG0 X230\nG0 Y250\nG0 X0\nG0 Y0\n\nM83\n\nT[initial_extruder]\nG0 Z20 F960.0\nG0 X{if initial_extruder == 0}-10{else}240{endif} F3420.0\nG0 Y0\n\nM109 S{max(250, min(290, nozzle_temperature_initial_layer[initial_extruder] + 15))} C2 W1; common flush temp\nG0 E35 F80.0\n\nM106 S{min(255, (fan_max_speed[initial_extruder] + 10) * 2.55)}\nM104 S{nozzle_temperature_initial_layer[initial_extruder] + 5}\n\nG0 E35 F200\n\nG0 E-0.5 F200\nM107\n\nG0 Z0.1 F960.0\nG0 X{if initial_extruder == 0}10{else}220{endif} F3420.0\nG0 X{if initial_extruder == 0}-10{else}240{endif}\n\nG0 Z1.0 F960.0\n\nM109 S{nozzle_temperature_initial_layer[initial_extruder]} C3 W1\nG1 X{if initial_extruder == 0}105.0{else}125.0{endif} F3420.0\nG1 Z0.3 F960.0\nG1 E4 F200\nG1 X{if initial_extruder == 0}0{else}230{endif} E6.54809 F3420.0\nG1 Y11 E0.68599\nG1 X{if initial_extruder == 0}0.5{else}229.5{endif}\nG1 E0.4\nG1 Y0.8 E0.6361\nG1 X{if initial_extruder == 0}9.5{else}220.5{endif} E0.59245\nG1 E-0.5 F200\nG92 E0\n\n; ready [plate_name]", + "machine_end_gcode": "G92 E0\n\nG0 Z{max_layer_z + 0.5} F600\n; retract the filament to make it easier to replace\nG0 E-25 F200\nG28\n\n M104 S0\nM140 S0\nM107\nM220 S100\nM84\n\n;\n; DON'T REMOVE these lines if you're using the smfix (https://github.com/macdylan/SMFix)\n; min_x = [first_layer_print_min_0]\n; min_y = [first_layer_print_min_1]\n; max_x = [first_layer_print_max_0]\n; max_y = [first_layer_print_max_1]\n; max_z = [max_layer_z]\n; total_layer_number = [layer_num]\n;", + "before_layer_change_gcode": "; layer_num: [layer_num]\nG92 E0" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/fdm_a250_dual.json b/resources/profiles/Snapmaker/machine/fdm_a250_dual.json new file mode 100644 index 0000000000..aa1ba00f7a --- /dev/null +++ b/resources/profiles/Snapmaker/machine/fdm_a250_dual.json @@ -0,0 +1,21 @@ +{ + "type": "machine", + "from": "system", + "instantiation": "false", + "name": "fdm_a250_dual", + "inherits": "fdm_linear2_dual", + "bed_model": "Snapmaker A250_bed.stl", + "bed_texture": "Snapmaker A250_texture.svg", + "printable_height": "205", + "printer_notes": "PRINTER_MODEL_SNAPMAKER_A250_DUAL\n", + "printable_area": [ + "0x0", + "230x0", + "230x250", + "0x250" + ], + "machine_start_gcode": "; Model: Snapmaker A250 Dual ({nozzle_diameter[0]}/{nozzle_diameter[1]})\n; Update: 20231019\n; Maintained by https://github.com/macdylan/3dp-configs\n; Printer : [printer_preset]\n; Profile : [print_preset]\n; Plate : [plate_name]\n; --- initial_extruder: [initial_extruder]\n; --- has_wipe_tower: [has_wipe_tower]\n; --- total_toolchanges: [total_toolchanges]\n; --- T0: {is_extruder_used[0]}\n; --- T1: {is_extruder_used[1]}\n\nT[initial_extruder]\n\nM140 S{first_layer_bed_temperature[initial_extruder]}\n\n; you can clean the nozzle\n{if is_extruder_used[0]}M104 T0 S165{endif}\n{if is_extruder_used[1]}M104 T1 S165{endif}\nM204 S100\nG28\nG0 Z136 F960.0\nG0 Y125.0 F3420.0\nG0 X115.0\n\nM190 R{first_layer_bed_temperature[initial_extruder]}\n\nG28\nG0 X0\nG0 Z0.2 F960.0\nG0 Y0 F3420.0\nG0 X230\nG0 Y250\nG0 X0\nG0 Y0\n\nM83\n\n{if is_extruder_used[0]}M104 T0 S{max(250, min(290, nozzle_temperature_initial_layer[0] + 15))}{endif}\n{if is_extruder_used[1]}M104 T1 S{max(250, min(290, nozzle_temperature_initial_layer[1] + 15))}{endif}\n\n{if is_extruder_used[0] and initial_extruder != 0}\n T0\nG0 Z20 F960.0\nG0 X{if 0 == 0}-10{else}240{endif} F3420.0\nG0 Y0\n\nM109 S{max(250, min(290, nozzle_temperature_initial_layer[0] + 15))} C2 W1; common flush temp\nG0 E45 F80.0\n\nM106 S{min(255, (fan_max_speed[0] + 10) * 2.55)}\nM104 S{nozzle_temperature_initial_layer[0] + 5}\n\nG0 E45 F200\n\nG0 E-0.5 F200\nM107\n\nG0 Z0.1 F960.0\nG0 X{if 0 == 0}10{else}220{endif} F3420.0\nG0 X{if 0 == 0}-10{else}240{endif}\n\nG0 Z1.0 F960.0\n\nM109 S{nozzle_temperature_initial_layer[0]} C3 W1\nG1 X{if 0 == 0}105.0{else}125.0{endif} F3420.0\nG1 Z0.3 F960.0\nG1 E4 F200\nG1 X{if 0 == 0}0{else}230{endif} E6.54809 F3420.0\nG1 Y11 E0.68599\nG1 X{if 0 == 0}0.5{else}229.5{endif}\nG1 E0.4\nG1 Y0.8 E0.6361\nG1 X{if 0 == 0}9.5{else}220.5{endif} E0.59245\nG1 E-0.5 F200\nG92 E0\n\n M104 S{temperature_vitrification[0]}\n{endif}\n{if is_extruder_used[1] and initial_extruder != 1}\n T1\nG0 Z20 F960.0\nG0 X{if 1 == 0}-10{else}240{endif} F3420.0\nG0 Y0\n\nM109 S{max(250, min(290, nozzle_temperature_initial_layer[1] + 15))} C2 W1; common flush temp\nG0 E45 F80.0\n\nM106 S{min(255, (fan_max_speed[1] + 10) * 2.55)}\nM104 S{nozzle_temperature_initial_layer[1] + 5}\n\nG0 E45 F200\n\nG0 E-0.5 F200\nM107\n\nG0 Z0.1 F960.0\nG0 X{if 1 == 0}10{else}220{endif} F3420.0\nG0 X{if 1 == 0}-10{else}240{endif}\n\nG0 Z1.0 F960.0\n\nM109 S{nozzle_temperature_initial_layer[1]} C3 W1\nG1 X{if 1 == 0}105.0{else}125.0{endif} F3420.0\nG1 Z0.3 F960.0\nG1 E4 F200\nG1 X{if 1 == 0}0{else}230{endif} E6.54809 F3420.0\nG1 Y11 E0.68599\nG1 X{if 1 == 0}0.5{else}229.5{endif}\nG1 E0.4\nG1 Y0.8 E0.6361\nG1 X{if 1 == 0}9.5{else}220.5{endif} E0.59245\nG1 E-0.5 F200\nG92 E0\n\n M104 S{temperature_vitrification[1]}\n{endif}\n\nT[initial_extruder]\nG0 Z20 F960.0\nG0 X{if initial_extruder == 0}-10{else}240{endif} F3420.0\nG0 Y0\n\nM109 S{max(250, min(290, nozzle_temperature_initial_layer[initial_extruder] + 15))} C2 W1; common flush temp\nG0 E45 F80.0\n\nM106 S{min(255, (fan_max_speed[initial_extruder] + 10) * 2.55)}\nM104 S{nozzle_temperature_initial_layer[initial_extruder] + 5}\n\nG0 E45 F200\n\nG0 E-0.5 F200\nM107\n\nG0 Z0.1 F960.0\nG0 X{if initial_extruder == 0}10{else}220{endif} F3420.0\nG0 X{if initial_extruder == 0}-10{else}240{endif}\n\nG0 Z1.0 F960.0\n\nM109 S{nozzle_temperature_initial_layer[initial_extruder]} C3 W1\nG1 X{if initial_extruder == 0}105.0{else}125.0{endif} F3420.0\nG1 Z0.3 F960.0\nG1 E4 F200\nG1 X{if initial_extruder == 0}0{else}230{endif} E6.54809 F3420.0\nG1 Y11 E0.68599\nG1 X{if initial_extruder == 0}0.5{else}229.5{endif}\nG1 E0.4\nG1 Y0.8 E0.6361\nG1 X{if initial_extruder == 0}9.5{else}220.5{endif} E0.59245\nG1 E-0.5 F200\nG92 E0\n\n; ready [plate_name]", + "machine_end_gcode": "G92 E0\n\nG0 Z{max_layer_z + 0.5} F600\n; retract the filament to make it easier to replace\nG0 E-35 F200\nG28\n\n {if is_extruder_used[0]}M104 T0 S0{endif}\n {if is_extruder_used[1]}M104 T1 S0{endif}\nM140 S0\nM107\nM220 S100\nM84\n\n;\n; DON'T REMOVE these lines if you're using the smfix (https://github.com/macdylan/SMFix)\n; min_x = [first_layer_print_min_0]\n; min_y = [first_layer_print_min_1]\n; max_x = [first_layer_print_max_0]\n; max_y = [first_layer_print_max_1]\n; max_z = [max_layer_z]\n; total_layer_number = [layer_num]\n;", + "change_filament_gcode": ";***** Update: 20230923\n{if current_extruder != next_extruder}\n; Change T[current_extruder] -> T[next_extruder] (layer [layer_num]\n; layer\nT{next_extruder}\n\nM107 P[current_extruder] ;fan off T[current_extruder]\nM104 T[current_extruder] S{temperature_vitrification[current_extruder]} ;standby T[current_extruder]\n\n{if layer_num == 1 &&\n ((filament_type[current_extruder] == \"PLA\" || filament_type[current_extruder] == \"TPU\")\n || (filament_type[next_extruder] == \"PLA\" || filament_type[next_extruder] == \"TPU\"))\n}\n ; set bed temp: {filament_type[current_extruder]}({bed_temperature[current_extruder]}) -> {filament_type[next_extruder]}({bed_temperature[next_extruder]})\n M140 S{min(bed_temperature[current_extruder], bed_temperature[next_extruder])}\n{endif}\n\nM109 T[next_extruder] S{if layer_num < 1}[nozzle_temperature_initial_layer]{else}[nozzle_temperature]{endif} C3 W1 ;wait T[next_extruder]\n{if layer_num == 1}\n G1 E{retraction_length[next_extruder]} F2000;deretract\n{endif}\n{if layer_z > first_layer_height && layer_num >= close_fan_the_first_x_layers[next_extruder]}\n; M106 P[next_extruder] S{fan_min_speed[next_extruder] * 255.0 / 100.0} ;restore fan speed for T[next_extruder]\n{endif}\n; End Toolchange\n{endif}", + "before_layer_change_gcode": "; layer_num: [layer_num]\nG92 E0" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/fdm_a250_dual_qs.json b/resources/profiles/Snapmaker/machine/fdm_a250_dual_qs.json new file mode 100644 index 0000000000..2180b332c9 --- /dev/null +++ b/resources/profiles/Snapmaker/machine/fdm_a250_dual_qs.json @@ -0,0 +1,15 @@ +{ + "type": "machine", + "from": "system", + "instantiation": "false", + "name": "fdm_a250_dual_qs", + "inherits": "fdm_a250_dual", + "bed_texture": "Snapmaker A250 QSKit_texture.svg", + "printer_notes": "PRINTER_MODEL_SNAPMAKER_A250_DUAL\nPRINTER_MODEL_SNAPMAKER_A250_DUAL_QUICKSWAPKIT\n", + "bed_exclude_area": [ + "0x235", + "230x235", + "230x250", + "0x250" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/fdm_a250_qs.json b/resources/profiles/Snapmaker/machine/fdm_a250_qs.json new file mode 100644 index 0000000000..d814aba7ad --- /dev/null +++ b/resources/profiles/Snapmaker/machine/fdm_a250_qs.json @@ -0,0 +1,16 @@ +{ + "type": "machine", + "from": "system", + "instantiation": "false", + "name": "fdm_a250_qs", + "inherits": "fdm_a250", + "bed_texture": "Snapmaker A250 QSKit_texture.svg", + "printable_height": "220", + "printer_notes": "PRINTER_MODEL_SNAPMAKER_A250\nPRINTER_MODEL_SNAPMAKER_A250_QUICKSWAPKIT\n", + "bed_exclude_area": [ + "0x235", + "230x235", + "230x250", + "0x250" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/fdm_a350.json b/resources/profiles/Snapmaker/machine/fdm_a350.json new file mode 100644 index 0000000000..4398c81124 --- /dev/null +++ b/resources/profiles/Snapmaker/machine/fdm_a350.json @@ -0,0 +1,20 @@ +{ + "type": "machine", + "from": "system", + "instantiation": "false", + "name": "fdm_a350", + "inherits": "fdm_linear2", + "bed_model": "Snapmaker A350_bed.stl", + "bed_texture": "Snapmaker A350_texture.svg", + "printable_height": "330", + "printer_notes": "PRINTER_MODEL_SNAPMAKER_A350\n", + "printable_area": [ + "0x0", + "320x0", + "320x350", + "0x350" + ], + "machine_start_gcode": "; Model: Snapmaker A350\n; Update: 20231019\n; Maintained by https://github.com/macdylan/3dp-configs\n; Printer : [printer_preset]\n; Profile : [print_preset]\n; Plate : [plate_name]\n\nT[initial_extruder]\n\nM140 S{first_layer_bed_temperature[initial_extruder]}\n\n; you can clean the nozzle\nM104 S165\nM204 S100\nG28\nG0 Z220 F960.0\nG0 Y175.0 F3420.0\nG0 X160.0\n\nM190 R{first_layer_bed_temperature[initial_extruder]}\n\nG28\nG0 X0\nG0 Z0.2 F960.0\nG0 Y0 F3420.0\nG0 X320\nG0 Y350\nG0 X0\nG0 Y0\n\nM83\n\nT[initial_extruder]\nG0 Z20 F960.0\nG0 X{if initial_extruder == 0}-10{else}330{endif} F3420.0\nG0 Y0\n\nM109 S{max(250, min(290, nozzle_temperature_initial_layer[initial_extruder] + 15))} C2 W1; common flush temp\nG0 E35 F80.0\n\nM106 S{min(255, (fan_max_speed[initial_extruder] + 10) * 2.55)}\nM104 S{nozzle_temperature_initial_layer[initial_extruder] + 5}\n\nG0 E35 F200\n\nG0 E-0.5 F200\nM107\n\nG0 Z0.1 F960.0\nG0 X{if initial_extruder == 0}10{else}310{endif} F3420.0\nG0 X{if initial_extruder == 0}-10{else}330{endif}\n\nG0 Z1.0 F960.0\n\nM109 S{nozzle_temperature_initial_layer[initial_extruder]} C3 W1\nG1 X{if initial_extruder == 0}150.0{else}170.0{endif} F3420.0\nG1 Z0.3 F960.0\nG1 E4 F200\nG1 X{if initial_extruder == 0}0{else}320{endif} E9.35442 F3420.0\nG1 Y11 E0.68599\nG1 X{if initial_extruder == 0}0.5{else}319.5{endif}\nG1 E0.4\nG1 Y0.8 E0.6361\nG1 X{if initial_extruder == 0}9.5{else}310.5{endif} E0.59245\nG1 E-0.5 F200\nG92 E0\n\n; ready [plate_name]", + "machine_end_gcode": "G92 E0\n\nG0 Z{max_layer_z + 0.5} F600\n; retract the filament to make it easier to replace\nG0 E-25 F200\nG28\n\n M104 S0\nM140 S0\nM107\nM220 S100\nM84\n\n;\n; DON'T REMOVE these lines if you're using the smfix (https://github.com/macdylan/SMFix)\n; min_x = [first_layer_print_min_0]\n; min_y = [first_layer_print_min_1]\n; max_x = [first_layer_print_max_0]\n; max_y = [first_layer_print_max_1]\n; max_z = [max_layer_z]\n; total_layer_number = [layer_num]\n;", + "before_layer_change_gcode": "; layer_num: [layer_num]\nG92 E0" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/fdm_a350_dual.json b/resources/profiles/Snapmaker/machine/fdm_a350_dual.json new file mode 100644 index 0000000000..3ffbd990cd --- /dev/null +++ b/resources/profiles/Snapmaker/machine/fdm_a350_dual.json @@ -0,0 +1,21 @@ +{ + "type": "machine", + "from": "system", + "instantiation": "false", + "name": "fdm_a350_dual", + "inherits": "fdm_linear2_dual", + "bed_model": "Snapmaker A350_bed.stl", + "bed_texture": "Snapmaker A350_texture.svg", + "printable_height": "290", + "printer_notes": "PRINTER_MODEL_SNAPMAKER_A350_DUAL\n", + "printable_area": [ + "0x0", + "320x0", + "320x350", + "0x350" + ], + "machine_start_gcode": "; Model: Snapmaker A350 Dual ({nozzle_diameter[0]}/{nozzle_diameter[1]})\n; Update: 20231019\n; Maintained by https://github.com/macdylan/3dp-configs\n; Printer : [printer_preset]\n; Profile : [print_preset]\n; Plate : [plate_name]\n; --- initial_extruder: [initial_extruder]\n; --- has_wipe_tower: [has_wipe_tower]\n; --- total_toolchanges: [total_toolchanges]\n; --- T0: {is_extruder_used[0]}\n; --- T1: {is_extruder_used[1]}\n\nT[initial_extruder]\n\nM140 S{first_layer_bed_temperature[initial_extruder]}\n\n; you can clean the nozzle\n{if is_extruder_used[0]}M104 T0 S165{endif}\n{if is_extruder_used[1]}M104 T1 S165{endif}\nM204 S100\nG28\nG0 Z193 F960.0\nG0 Y175.0 F3420.0\nG0 X160.0\n\nM190 R{first_layer_bed_temperature[initial_extruder]}\n\nG28\nG0 X0\nG0 Z0.2 F960.0\nG0 Y0 F3420.0\nG0 X320\nG0 Y350\nG0 X0\nG0 Y0\n\nM83\n\n{if is_extruder_used[0]}M104 T0 S{max(250, min(290, nozzle_temperature_initial_layer[0] + 15))}{endif}\n{if is_extruder_used[1]}M104 T1 S{max(250, min(290, nozzle_temperature_initial_layer[1] + 15))}{endif}\n\n{if is_extruder_used[0] and initial_extruder != 0}\n T0\nG0 Z20 F960.0\nG0 X{if 0 == 0}-10{else}330{endif} F3420.0\nG0 Y0\n\nM109 S{max(250, min(290, nozzle_temperature_initial_layer[0] + 15))} C2 W1; common flush temp\nG0 E45 F80.0\n\nM106 S{min(255, (fan_max_speed[0] + 10) * 2.55)}\nM104 S{nozzle_temperature_initial_layer[0] + 5}\n\nG0 E45 F200\n\nG0 E-0.5 F200\nM107\n\nG0 Z0.1 F960.0\nG0 X{if 0 == 0}10{else}310{endif} F3420.0\nG0 X{if 0 == 0}-10{else}330{endif}\n\nG0 Z1.0 F960.0\n\nM109 S{nozzle_temperature_initial_layer[0]} C3 W1\nG1 X{if 0 == 0}150.0{else}170.0{endif} F3420.0\nG1 Z0.3 F960.0\nG1 E4 F200\nG1 X{if 0 == 0}0{else}320{endif} E9.35442 F3420.0\nG1 Y11 E0.68599\nG1 X{if 0 == 0}0.5{else}319.5{endif}\nG1 E0.4\nG1 Y0.8 E0.6361\nG1 X{if 0 == 0}9.5{else}310.5{endif} E0.59245\nG1 E-0.5 F200\nG92 E0\n\n M104 S{temperature_vitrification[0]}\n{endif}\n{if is_extruder_used[1] and initial_extruder != 1}\n T1\nG0 Z20 F960.0\nG0 X{if 1 == 0}-10{else}330{endif} F3420.0\nG0 Y0\n\nM109 S{max(250, min(290, nozzle_temperature_initial_layer[1] + 15))} C2 W1; common flush temp\nG0 E45 F80.0\n\nM106 S{min(255, (fan_max_speed[1] + 10) * 2.55)}\nM104 S{nozzle_temperature_initial_layer[1] + 5}\n\nG0 E45 F200\n\nG0 E-0.5 F200\nM107\n\nG0 Z0.1 F960.0\nG0 X{if 1 == 0}10{else}310{endif} F3420.0\nG0 X{if 1 == 0}-10{else}330{endif}\n\nG0 Z1.0 F960.0\n\nM109 S{nozzle_temperature_initial_layer[1]} C3 W1\nG1 X{if 1 == 0}150.0{else}170.0{endif} F3420.0\nG1 Z0.3 F960.0\nG1 E4 F200\nG1 X{if 1 == 0}0{else}320{endif} E9.35442 F3420.0\nG1 Y11 E0.68599\nG1 X{if 1 == 0}0.5{else}319.5{endif}\nG1 E0.4\nG1 Y0.8 E0.6361\nG1 X{if 1 == 0}9.5{else}310.5{endif} E0.59245\nG1 E-0.5 F200\nG92 E0\n\n M104 S{temperature_vitrification[1]}\n{endif}\n\nT[initial_extruder]\nG0 Z20 F960.0\nG0 X{if initial_extruder == 0}-10{else}330{endif} F3420.0\nG0 Y0\n\nM109 S{max(250, min(290, nozzle_temperature_initial_layer[initial_extruder] + 15))} C2 W1; common flush temp\nG0 E45 F80.0\n\nM106 S{min(255, (fan_max_speed[initial_extruder] + 10) * 2.55)}\nM104 S{nozzle_temperature_initial_layer[initial_extruder] + 5}\n\nG0 E45 F200\n\nG0 E-0.5 F200\nM107\n\nG0 Z0.1 F960.0\nG0 X{if initial_extruder == 0}10{else}310{endif} F3420.0\nG0 X{if initial_extruder == 0}-10{else}330{endif}\n\nG0 Z1.0 F960.0\n\nM109 S{nozzle_temperature_initial_layer[initial_extruder]} C3 W1\nG1 X{if initial_extruder == 0}150.0{else}170.0{endif} F3420.0\nG1 Z0.3 F960.0\nG1 E4 F200\nG1 X{if initial_extruder == 0}0{else}320{endif} E9.35442 F3420.0\nG1 Y11 E0.68599\nG1 X{if initial_extruder == 0}0.5{else}319.5{endif}\nG1 E0.4\nG1 Y0.8 E0.6361\nG1 X{if initial_extruder == 0}9.5{else}310.5{endif} E0.59245\nG1 E-0.5 F200\nG92 E0\n\n; ready [plate_name]", + "machine_end_gcode": "G92 E0\n\nG0 Z{max_layer_z + 0.5} F600\n; retract the filament to make it easier to replace\nG0 E-35 F200\nG28\n\n {if is_extruder_used[0]}M104 T0 S0{endif}\n {if is_extruder_used[1]}M104 T1 S0{endif}\nM140 S0\nM107\nM220 S100\nM84\n\n;\n; DON'T REMOVE these lines if you're using the smfix (https://github.com/macdylan/SMFix)\n; min_x = [first_layer_print_min_0]\n; min_y = [first_layer_print_min_1]\n; max_x = [first_layer_print_max_0]\n; max_y = [first_layer_print_max_1]\n; max_z = [max_layer_z]\n; total_layer_number = [layer_num]\n;", + "change_filament_gcode": ";***** Update: 20230923\n{if current_extruder != next_extruder}\n; Change T[current_extruder] -> T[next_extruder] (layer [layer_num]\n; layer\nT{next_extruder}\n\nM107 P[current_extruder] ;fan off T[current_extruder]\nM104 T[current_extruder] S{temperature_vitrification[current_extruder]} ;standby T[current_extruder]\n\n{if layer_num == 1 &&\n ((filament_type[current_extruder] == \"PLA\" || filament_type[current_extruder] == \"TPU\")\n || (filament_type[next_extruder] == \"PLA\" || filament_type[next_extruder] == \"TPU\"))\n}\n ; set bed temp: {filament_type[current_extruder]}({bed_temperature[current_extruder]}) -> {filament_type[next_extruder]}({bed_temperature[next_extruder]})\n M140 S{min(bed_temperature[current_extruder], bed_temperature[next_extruder])}\n{endif}\n\nM109 T[next_extruder] S{if layer_num < 1}[nozzle_temperature_initial_layer]{else}[nozzle_temperature]{endif} C3 W1 ;wait T[next_extruder]\n{if layer_num == 1}\n G1 E{retraction_length[next_extruder]} F2000;deretract\n{endif}\n{if layer_z > first_layer_height && layer_num >= close_fan_the_first_x_layers[next_extruder]}\n; M106 P[next_extruder] S{fan_min_speed[next_extruder] * 255.0 / 100.0} ;restore fan speed for T[next_extruder]\n{endif}\n; End Toolchange\n{endif}", + "before_layer_change_gcode": "; layer_num: [layer_num]\nG92 E0" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/fdm_a350_dual_qs.json b/resources/profiles/Snapmaker/machine/fdm_a350_dual_qs.json new file mode 100644 index 0000000000..b2505329ff --- /dev/null +++ b/resources/profiles/Snapmaker/machine/fdm_a350_dual_qs.json @@ -0,0 +1,16 @@ +{ + "type": "machine", + "from": "system", + "instantiation": "false", + "name": "fdm_a350_dual_qs", + "inherits": "fdm_a350_dual", + "bed_texture": "Snapmaker A350 QSKit_texture.svg", + "printable_height": "300", + "printer_notes": "PRINTER_MODEL_SNAPMAKER_A350_DUAL\nPRINTER_MODEL_SNAPMAKER_A350_DUAL_QUICKSWAPKIT\n", + "bed_exclude_area": [ + "0x335", + "320x335", + "320x350", + "0x350" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/fdm_a350_qs.json b/resources/profiles/Snapmaker/machine/fdm_a350_qs.json new file mode 100644 index 0000000000..590161e292 --- /dev/null +++ b/resources/profiles/Snapmaker/machine/fdm_a350_qs.json @@ -0,0 +1,16 @@ +{ + "type": "machine", + "from": "system", + "instantiation": "false", + "name": "fdm_a350_qs", + "inherits": "fdm_a350", + "bed_texture": "Snapmaker A350 QSKit_texture.svg", + "printable_height": "315", + "printer_notes": "PRINTER_MODEL_SNAPMAKER_A350\nPRINTER_MODEL_SNAPMAKER_A350_QUICKSWAPKIT\n", + "bed_exclude_area": [ + "0x335", + "320x335", + "320x350", + "0x350" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/fdm_common.json b/resources/profiles/Snapmaker/machine/fdm_common.json new file mode 100644 index 0000000000..f12ca8f131 --- /dev/null +++ b/resources/profiles/Snapmaker/machine/fdm_common.json @@ -0,0 +1,56 @@ +{ + "type": "machine", + "from": "system", + "instantiation": "false", + "name": "fdm_common", + "gcode_flavor": "marlin2", + "pause_gcode": "M600 ;pause print", + "nozzle_type": "hardened_steel", + "use_relative_e_distances": "1", + "silent_mode": "0", + "auxiliary_fan": "0", + "remaining_times": "1", + "single_extruder_multi_material": "0", + "single_extruder_multi_material_priming": "0", + "purge_in_prime_tower": "0", + "enable_filament_ramming": "0", + "nozzle_volume": "0", + "cooling_tube_retraction": "0", + "cooling_tube_length": "0", + "parking_pos_retraction": "0", + "extra_loading_move": "-2", + "high_current_on_filament_swap": "0", + "wipe": [ + "0" + ], + "wipe_distance": [ + "1" + ], + "retraction_speed": [ + "45" + ], + "deretraction_speed": [ + "45" + ], + "z_hop": [ + "0.4" + ], + "retraction_length": [ + "0.8" + ], + "retract_when_changing_layer": [ + "1" + ], + "retract_before_wipe": [ + "0%" + ], + "retraction_minimum_travel": [ + "1" + ], + "fan_speedup_overhangs": [ + "1" + ], + "z_hop_types": [ + "Auto Lift" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/fdm_idex.json b/resources/profiles/Snapmaker/machine/fdm_idex.json new file mode 100644 index 0000000000..867e6b31a5 --- /dev/null +++ b/resources/profiles/Snapmaker/machine/fdm_idex.json @@ -0,0 +1,107 @@ +{ + "type": "machine", + "from": "system", + "instantiation": "false", + "name": "fdm_idex", + "inherits": "fdm_common", + "wipe": [ + "1" + ], + "wipe_distance": [ + "2" + ], + "retraction_speed": [ + "30", + "30" + ], + "deretraction_speed": [ + "30", + "30" + ], + "bed_model": "Snapmaker J1_bed.stl", + "bed_texture": "Snapmaker J1_texture.svg", + "printable_height": "200", + "extruder_clearance_radius": "68", + "extruder_clearance_height_to_rod": "36", + "extruder_clearance_height_to_lid": "90", + "printer_notes": "PRINTER_MODEL_SNAPMAKER_J1\n", + "fan_speedup_time": [ + "0.2" + ], + "machine_max_acceleration_x": [ + "11000" + ], + "machine_max_acceleration_y": [ + "11000" + ], + "machine_max_acceleration_z": [ + "100" + ], + "machine_max_acceleration_e": [ + "6000" + ], + "machine_max_acceleration_travel": [ + "11000" + ], + "machine_max_acceleration_extruding": [ + "11000" + ], + "machine_max_acceleration_retracting": [ + "5000" + ], + "machine_max_speed_x": [ + "350" + ], + "machine_max_speed_y": [ + "350" + ], + "machine_max_speed_z": [ + "10" + ], + "machine_max_speed_e": [ + "40" + ], + "machine_max_jerk_x": [ + "8" + ], + "machine_max_jerk_y": [ + "8" + ], + "machine_max_jerk_z": [ + "3" + ], + "machine_max_jerk_e": [ + "2.5" + ], + "retract_length_toolchange": [ + "2", + "2" + ], + "printable_area": [ + "0x0", + "324x0", + "324x200", + "0x200" + ], + "bed_exclude_area": [ + "312x0", + "324x0", + "324x200", + "312x200" + ], + "thumbnails": [ + "300x300" + ], + "extruder_offset": [ + "0x0", + "0x0" + ], + "default_filament_profile": [ + "Snapmaker J1 PLA", + "Snapmaker J1 PETG" + ], + "machine_start_gcode": "; Model: Snapmaker J1 ({nozzle_diameter[0]}/{nozzle_diameter[1]})\n; Update: 20231019\n; Maintained by https://github.com/macdylan/3dp-configs\n; Printer : [printer_preset]\n; Profile : [print_preset]\n; Plate : [plate_name]\n; --- initial_extruder: [initial_extruder]\n; --- has_wipe_tower: [has_wipe_tower]\n; --- total_toolchanges: [total_toolchanges]\n; --- T0: {is_extruder_used[0]}\n; --- T1: {is_extruder_used[1]}\n\nT[initial_extruder]\n\nM205 V20 ;Junction Deviation (mm)\n\n{if plate_name =~/.*IDEXDupl.*/ || plate_name =~/.*IDEXCopy.*/ }\n M605 S2 X162 R0 ;IDEX Duplication\n{elsif plate_name =~/.*IDEXMirr.*/}\n M605 S3 ;IDEX Mirror\n{elsif plate_name =~/.*IDEXBack.*/}\n M605 S4 ;IDEX Backup\n{endif}\n\nM140 S{first_layer_bed_temperature[initial_extruder]}\n\n; you can clean the nozzle\n{if is_extruder_used[0]}M104 T0 S165{endif}\n{if is_extruder_used[1]}M104 T1 S165{endif}\nM204 S100\nG28\n\nG0 Z100.0\n{if is_extruder_used[0]}\n T0\n G0 X{if 0 == 0}80{else}240{endif} Y0 F7980.0\n {endif}\n{if is_extruder_used[1]}\n T1\n G0 X{if 1 == 0}80{else}240{endif} Y0 F7980.0\n {endif}\n\nM190 R{first_layer_bed_temperature[initial_extruder]}\n{if 1==1}; LED\n M355 S1 P64\n G4 P100\n M355 S1 P128\n G4 P100\n M355 S1 P64\n G4 P200\n M355 S1 P255\n G4 P100\n{endif}\nG28 X Y\n\nM83\n\n{if is_extruder_used[0]}M104 T0 S{max(250, min(290, nozzle_temperature_initial_layer[0] + 15))}{endif}\n{if is_extruder_used[1]}M104 T1 S{max(250, min(290, nozzle_temperature_initial_layer[1] + 15))}{endif}\n\n{if is_extruder_used[0] and initial_extruder != 0}\n T0\nG0 Z20 F240.0\nG0 X{if 0 == 0}-7{else}331{endif} F7980.0\nG0 Y0\n\nM109 S{max(250, min(290, nozzle_temperature_initial_layer[0] + 15))} C2 W1; common flush temp\nG0 E50 F80.0\n\nM106 S{min(255, (fan_max_speed[0] + 10) * 2.55)}\nM104 S{nozzle_temperature_initial_layer[0] + 5}\n\nG0 E50 F200\n\nG0 E-0.5 F200\nM107\n\nG28 X\n\nG0 Z1.0 F240.0\n\nM109 S{nozzle_temperature_initial_layer[0]} C3 W1\nG1 X{if 0 == 0}142.0{else}182.0{endif} F7980.0\nG1 Z0.3 F240.0\nG1 E4 F200\nG1 X{if 0 == 0}10{else}314{endif} E9.47915 F7980.0\nG1 Y11 E0.68599\nG1 X{if 0 == 0}10.5{else}313.5{endif}\nG1 E0.4\nG1 Y0.8 E0.6361\nG1 X{if 0 == 0}19.5{else}304.5{endif} E0.59245\nG1 E-0.5 F200\nG92 E0\n\n M104 S{temperature_vitrification[0]}\n{endif}\n{if is_extruder_used[1] and initial_extruder != 1}\n T1\nG0 Z20 F240.0\nG0 X{if 1 == 0}-7{else}331{endif} F7980.0\nG0 Y0\n\nM109 S{max(250, min(290, nozzle_temperature_initial_layer[1] + 15))} C2 W1; common flush temp\nG0 E50 F80.0\n\nM106 S{min(255, (fan_max_speed[1] + 10) * 2.55)}\nM104 S{nozzle_temperature_initial_layer[1] + 5}\n\nG0 E50 F200\n\nG0 E-0.5 F200\nM107\n\nG28 X\n\nG0 Z1.0 F240.0\n\nM109 S{nozzle_temperature_initial_layer[1]} C3 W1\nG1 X{if 1 == 0}142.0{else}182.0{endif} F7980.0\nG1 Z0.3 F240.0\nG1 E4 F200\nG1 X{if 1 == 0}10{else}314{endif} E9.47915 F7980.0\nG1 Y11 E0.68599\nG1 X{if 1 == 0}10.5{else}313.5{endif}\nG1 E0.4\nG1 Y0.8 E0.6361\nG1 X{if 1 == 0}19.5{else}304.5{endif} E0.59245\nG1 E-0.5 F200\nG92 E0\n\n M104 S{temperature_vitrification[1]}\n{endif}\n\nT[initial_extruder]\nG0 Z20 F240.0\nG0 X{if initial_extruder == 0}-7{else}331{endif} F7980.0\nG0 Y0\n\nM109 S{max(250, min(290, nozzle_temperature_initial_layer[initial_extruder] + 15))} C2 W1; common flush temp\nG0 E50 F80.0\n\nM106 S{min(255, (fan_max_speed[initial_extruder] + 10) * 2.55)}\nM104 S{nozzle_temperature_initial_layer[initial_extruder] + 5}\n\nG0 E50 F200\n\nG0 E-0.5 F200\nM107\n\nG28 X\n\nG0 Z1.0 F240.0\n\nM109 S{nozzle_temperature_initial_layer[initial_extruder]} C3 W1\nG1 X{if initial_extruder == 0}142.0{else}182.0{endif} F7980.0\nG1 Z0.3 F240.0\nG1 E4 F200\nG1 X{if initial_extruder == 0}10{else}314{endif} E9.47915 F7980.0\nG1 Y11 E0.68599\nG1 X{if initial_extruder == 0}10.5{else}313.5{endif}\nG1 E0.4\nG1 Y0.8 E0.6361\nG1 X{if initial_extruder == 0}19.5{else}304.5{endif} E0.59245\nG1 E-0.5 F200\nG92 E0\n\n; ready [plate_name]", + "machine_end_gcode": "G92 E0\n\nG0 Z{max_layer_z + 0.5} F600\n; retract the filament to make it easier to replace\nG0 E-40 F200\nG28\n\n {if is_extruder_used[0]}M104 T0 S0{endif}\n {if is_extruder_used[1]}M104 T1 S0{endif}\nM140 S0\nM107\nM220 S100\nM84\n\n;\n; DON'T REMOVE these lines if you're using the smfix (https://github.com/macdylan/SMFix)\n; min_x = [first_layer_print_min_0]\n; min_y = [first_layer_print_min_1]\n; max_x = [first_layer_print_max_0]\n; max_y = [first_layer_print_max_1]\n; max_z = [max_layer_z]\n; total_layer_number = [layer_num]\n;", + "change_filament_gcode": ";***** Update: 20230730\n{if current_extruder != next_extruder}\n; Change T[current_extruder] -> T[next_extruder] (layer [layer_num]\n; layer\nT{next_extruder}\n\nM107 P[current_extruder] ;fan off T[current_extruder]\nM104 T[current_extruder] S{temperature_vitrification[current_extruder]} ;standby T[current_extruder]\n\n{if layer_num == 1 &&\n ((filament_type[current_extruder] == \"PLA\" || filament_type[current_extruder] == \"TPU\")\n || (filament_type[next_extruder] == \"PLA\" || filament_type[next_extruder] == \"TPU\"))\n}\n; set bed temp: {filament_type[current_extruder]}({bed_temperature[current_extruder]}) -> {filament_type[next_extruder]}({bed_temperature[next_extruder]})\nM140 S{min(bed_temperature[current_extruder], bed_temperature[next_extruder])}\n{endif}\n\nM2000 S200 V[travel_speed] A[travel_acceleration] ;quick switch extruders, S:200 mode/V:speed/A:acceleration\nM109 T[next_extruder] S{if layer_num < 1}[nozzle_temperature_initial_layer]{else}[nozzle_temperature]{endif} C3 W1 ;wait T[next_extruder]\n{if layer_z > first_layer_height && layer_num >= close_fan_the_first_x_layers[next_extruder]}\n M106 P[next_extruder] S{fan_min_speed[next_extruder] * 255.0 / 100.0} ;restore fan speed for T[next_extruder]\n{endif}\n\n{endif}", + "before_layer_change_gcode": "; layer_num: [layer_num]\nG92 E0" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/fdm_linear2.json b/resources/profiles/Snapmaker/machine/fdm_linear2.json new file mode 100644 index 0000000000..3a37a7f8ec --- /dev/null +++ b/resources/profiles/Snapmaker/machine/fdm_linear2.json @@ -0,0 +1,73 @@ +{ + "type": "machine", + "from": "system", + "instantiation": "false", + "name": "fdm_linear2", + "inherits": "fdm_common", + "wipe": [ + "1" + ], + "wipe_distance": [ + "2" + ], + "z_hop_types": [ + "Normal Lift" + ], + "extruder_clearance_radius": "75", + "extruder_clearance_height_to_rod": "25", + "extruder_clearance_height_to_lid": "90", + "machine_max_acceleration_x": [ + "1000" + ], + "machine_max_acceleration_y": [ + "1000" + ], + "machine_max_acceleration_z": [ + "500" + ], + "machine_max_acceleration_e": [ + "3000" + ], + "machine_max_acceleration_travel": [ + "1000" + ], + "machine_max_acceleration_extruding": [ + "1000" + ], + "machine_max_acceleration_retracting": [ + "2000" + ], + "machine_max_speed_x": [ + "150" + ], + "machine_max_speed_y": [ + "150" + ], + "machine_max_speed_z": [ + "40" + ], + "machine_max_speed_e": [ + "45" + ], + "machine_max_jerk_x": [ + "1" + ], + "machine_max_jerk_y": [ + "1" + ], + "machine_max_jerk_z": [ + "1" + ], + "machine_max_jerk_e": [ + "3" + ], + "thumbnails": [ + "300x150" + ], + "retract_length_toolchange": [ + "2" + ], + "default_filament_profile": [ + "Snapmaker PLA" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/fdm_linear2_dual.json b/resources/profiles/Snapmaker/machine/fdm_linear2_dual.json new file mode 100644 index 0000000000..e335bdc4a0 --- /dev/null +++ b/resources/profiles/Snapmaker/machine/fdm_linear2_dual.json @@ -0,0 +1,32 @@ +{ + "type": "machine", + "from": "system", + "instantiation": "false", + "name": "fdm_linear2_dual", + "inherits": "fdm_linear2", + "retraction_speed": [ + "35", + "35" + ], + "deretraction_speed": [ + "35", + "35" + ], + "extruder_clearance_radius": "110", + "extruder_clearance_height_to_rod": "45", + "extruder_clearance_height_to_lid": "133", + "machine_max_acceleration_retracting": [ + "1000" + ], + "machine_max_speed_e": [ + "35" + ], + "retract_length_toolchange": [ + "8", + "8" + ], + "default_filament_profile": [ + "Snapmaker PLA", + "Snapmaker PETG" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/fdm_machine_common.json b/resources/profiles/Snapmaker/machine/fdm_machine_common.json deleted file mode 100644 index 89cad31412..0000000000 --- a/resources/profiles/Snapmaker/machine/fdm_machine_common.json +++ /dev/null @@ -1,139 +0,0 @@ -{ - "type": "machine", - "name": "fdm_machine_common", - "from": "system", - "instantiation": "false", - "gcode_flavor": "marlin", - "machine_start_gcode": "", - "machine_end_gcode": "", - "extruder_colour": [ - "#018001" - ], - "extruder_offset": [ - "0x0" - ], - "machine_max_acceleration_e": [ - "5000", - "5000" - ], - "machine_max_acceleration_extruding": [ - "2000", - "2000" - ], - "machine_max_acceleration_retracting": [ - "5000", - "5000" - ], - "machine_max_acceleration_travel": [ - "3000", - "3000" - ], - "machine_max_acceleration_x": [ - "2000", - "2000" - ], - "machine_max_acceleration_y": [ - "2000", - "2000" - ], - "machine_max_acceleration_z": [ - "300", - "200" - ], - "machine_max_speed_e": [ - "25", - "25" - ], - "machine_max_speed_x": [ - "300", - "200" - ], - "machine_max_speed_y": [ - "300", - "200" - ], - "machine_max_speed_z": [ - "12", - "12" - ], - "machine_max_jerk_e": [ - "2.5", - "2.5" - ], - "machine_max_jerk_x": [ - "9", - "9" - ], - "machine_max_jerk_y": [ - "9", - "9" - ], - "machine_max_jerk_z": [ - "0.2", - "0.4" - ], - "machine_min_extruding_rate": [ - "0", - "0" - ], - "machine_min_travel_rate": [ - "0", - "0" - ], - "max_layer_height": [ - "0.3" - ], - "min_layer_height": [ - "0.08" - ], - "printable_height": "250", - "extruder_clearance_radius": "65", - "extruder_clearance_height_to_rod": "36", - "extruder_clearance_height_to_lid": "140", - "nozzle_diameter": [ - "0.4" - ], - "printer_settings_id": "", - "printer_technology": "FFF", - "printer_variant": "0.4", - "retraction_minimum_travel": [ - "1" - ], - "retract_before_wipe": [ - "70%" - ], - "retract_when_changing_layer": [ - "1" - ], - "retraction_length": [ - "0.8" - ], - "retract_length_toolchange": [ - "2" - ], - "z_hop": [ - "0.4" - ], - "retract_restart_extra": [ - "0" - ], - "retract_restart_extra_toolchange": [ - "0" - ], - "retraction_speed": [ - "30" - ], - "deretraction_speed": [ - "30" - ], - "silent_mode": "0", - "single_extruder_multi_material": "1", - "change_filament_gcode": "", - "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]\nG92 E0\n", - "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]", - "machine_pause_gcode": "M400 U1\n", - "wipe": [ - "1" - ], - "z_hop_types": "Normal Lift" -} diff --git a/resources/profiles/Snapmaker/process/0.06 Standard @Snapmaker (0.2 nozzle).json b/resources/profiles/Snapmaker/process/0.06 Standard @Snapmaker (0.2 nozzle).json new file mode 100644 index 0000000000..93ce6eb0e1 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.06 Standard @Snapmaker (0.2 nozzle).json @@ -0,0 +1,44 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.06 Standard @Snapmaker (0.2 nozzle)", + "setting_id": "1495708454", + "inherits": "fdm_process_common", + "compatible_printers": [ + "Snapmaker A250 (0.2 nozzle)", + "Snapmaker A350 (0.2 nozzle)", + "Snapmaker A250 Dual (0.2 nozzle)", + "Snapmaker A350 Dual (0.2 nozzle)", + "Snapmaker A250 QSKit (0.2 nozzle)", + "Snapmaker A350 QSKit (0.2 nozzle)", + "Snapmaker A250 Dual QSKit (0.2 nozzle)", + "Snapmaker A350 Dual QSKit (0.2 nozzle)" + ], + "bottom_shell_layers": "5", + "bridge_flow": "1", + "initial_layer_line_width": "0.25", + "initial_layer_print_height": "0.1", + "inner_wall_line_width": "0.22", + "internal_solid_infill_line_width": "0.22", + "layer_height": "0.06", + "line_width": "0.22", + "outer_wall_line_width": "0.22", + "sparse_infill_line_width": "0.22", + "support_line_width": "0.22", + "top_shell_layers": "7", + "top_surface_line_width": "0.22", + "wall_loops": "4", + "initial_layer_speed": "40", + "gap_infill_speed": "85", + "inner_wall_speed": "120", + "internal_solid_infill_speed": "120", + "ironing_speed": "30", + "outer_wall_speed": "100", + "support_interface_speed": "40", + "support_speed": "100", + "travel_speed": "110", + "overhang_1_4_speed": "60", + "overhang_2_4_speed": "30", + "overhang_3_4_speed": "10" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.06 Standard @Snapmaker J1 (0.2 nozzle).json b/resources/profiles/Snapmaker/process/0.06 Standard @Snapmaker J1 (0.2 nozzle).json new file mode 100644 index 0000000000..a46f8f910e --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.06 Standard @Snapmaker J1 (0.2 nozzle).json @@ -0,0 +1,36 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.06 Standard @Snapmaker J1 (0.2 nozzle)", + "setting_id": "4149563988", + "inherits": "fdm_process_idex", + "compatible_printers": [ + "Snapmaker J1 (0.2 nozzle)" + ], + "bottom_shell_layers": "5", + "bridge_flow": "1", + "initial_layer_line_width": "0.25", + "initial_layer_print_height": "0.1", + "inner_wall_line_width": "0.22", + "internal_solid_infill_line_width": "0.22", + "layer_height": "0.06", + "line_width": "0.22", + "outer_wall_line_width": "0.22", + "sparse_infill_line_width": "0.22", + "support_line_width": "0.22", + "top_shell_layers": "7", + "top_surface_line_width": "0.22", + "wall_loops": "4", + "gap_infill_speed": "120", + "initial_layer_infill_speed": "70", + "initial_layer_speed": "40", + "inner_wall_speed": "200", + "internal_solid_infill_speed": "200", + "sparse_infill_speed": "100", + "support_interface_speed": "40", + "top_surface_speed": "150", + "overhang_1_4_speed": "60", + "overhang_2_4_speed": "30", + "overhang_3_4_speed": "10" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.08 Extra Fine @Snapmaker (0.4 nozzle).json b/resources/profiles/Snapmaker/process/0.08 Extra Fine @Snapmaker (0.4 nozzle).json new file mode 100644 index 0000000000..b53e32ce63 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.08 Extra Fine @Snapmaker (0.4 nozzle).json @@ -0,0 +1,38 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.08 Extra Fine @Snapmaker (0.4 nozzle)", + "setting_id": "3124178337", + "inherits": "fdm_process_common", + "compatible_printers": [ + "Snapmaker A250 (0.4 nozzle)", + "Snapmaker A350 (0.4 nozzle)", + "Snapmaker A250 Dual (0.4 nozzle)", + "Snapmaker A350 Dual (0.4 nozzle)", + "Snapmaker A250 QSKit (0.4 nozzle)", + "Snapmaker A350 QSKit (0.4 nozzle)", + "Snapmaker A250 Dual QSKit (0.4 nozzle)", + "Snapmaker A350 Dual QSKit (0.4 nozzle)" + ], + "bottom_shell_layers": "7", + "bridge_flow": "1", + "elefant_foot_compensation": "0.15", + "ironing_flow": "8%", + "layer_height": "0.08", + "initial_layer_print_height": "0.1", + "support_threshold_angle": "15", + "top_shell_layers": "9", + "gap_infill_speed": "85", + "initial_layer_infill_speed": "65", + "inner_wall_speed": "120", + "internal_solid_infill_speed": "120", + "overhang_1_4_speed": "55", + "overhang_2_4_speed": "30", + "overhang_3_4_speed": "10", + "sparse_infill_speed": "90", + "top_surface_speed": "70", + "ironing_speed": "30", + "support_speed": "100", + "travel_speed": "110" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.08 Extra Fine @Snapmaker J1 (0.4 nozzle).json b/resources/profiles/Snapmaker/process/0.08 Extra Fine @Snapmaker J1 (0.4 nozzle).json new file mode 100644 index 0000000000..d15aa3175e --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.08 Extra Fine @Snapmaker J1 (0.4 nozzle).json @@ -0,0 +1,27 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.08 Extra Fine @Snapmaker J1 (0.4 nozzle)", + "setting_id": "175768766", + "inherits": "fdm_process_idex", + "compatible_printers": [ + "Snapmaker J1 (0.4 nozzle)" + ], + "bottom_shell_layers": "7", + "bridge_flow": "1", + "elefant_foot_compensation": "0.15", + "ironing_flow": "8%", + "layer_height": "0.08", + "initial_layer_print_height": "0.1", + "support_threshold_angle": "15", + "top_shell_layers": "9", + "gap_infill_speed": "160", + "initial_layer_infill_speed": "65", + "inner_wall_speed": "230", + "internal_solid_infill_speed": "230", + "sparse_infill_speed": "120", + "overhang_1_4_speed": "60", + "overhang_2_4_speed": "30", + "overhang_3_4_speed": "10" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.10 Standard @Snapmaker (0.2 nozzle).json b/resources/profiles/Snapmaker/process/0.10 Standard @Snapmaker (0.2 nozzle).json new file mode 100644 index 0000000000..c7e117ba78 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.10 Standard @Snapmaker (0.2 nozzle).json @@ -0,0 +1,46 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.10 Standard @Snapmaker (0.2 nozzle)", + "setting_id": "1303724634", + "inherits": "fdm_process_common", + "compatible_printers": [ + "Snapmaker A250 (0.2 nozzle)", + "Snapmaker A350 (0.2 nozzle)", + "Snapmaker A250 Dual (0.2 nozzle)", + "Snapmaker A350 Dual (0.2 nozzle)", + "Snapmaker A250 QSKit (0.2 nozzle)", + "Snapmaker A350 QSKit (0.2 nozzle)", + "Snapmaker A250 Dual QSKit (0.2 nozzle)", + "Snapmaker A350 Dual QSKit (0.2 nozzle)" + ], + "layer_height": "0.1", + "initial_layer_print_height": "0.1", + "wall_loops": "4", + "bottom_shell_layers": "5", + "top_shell_layers": "7", + "bridge_flow": "1", + "line_width": "0.22", + "outer_wall_line_width": "0.22", + "initial_layer_line_width": "0.25", + "sparse_infill_line_width": "0.22", + "inner_wall_line_width": "0.22", + "internal_solid_infill_line_width": "0.22", + "support_line_width": "0.22", + "top_surface_line_width": "0.22", + "initial_layer_speed": "40", + "initial_layer_infill_speed": "70", + "sparse_infill_speed": "100", + "gap_infill_speed": "85", + "inner_wall_speed": "120", + "internal_solid_infill_speed": "120", + "ironing_speed": "30", + "outer_wall_speed": "100", + "support_interface_speed": "40", + "support_speed": "100", + "travel_speed": "110", + "overhang_1_4_speed": "60", + "overhang_2_4_speed": "30", + "overhang_3_4_speed": "10" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.10 Standard @Snapmaker J1 (0.2 nozzle).json b/resources/profiles/Snapmaker/process/0.10 Standard @Snapmaker J1 (0.2 nozzle).json new file mode 100644 index 0000000000..cc3a94a7bc --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.10 Standard @Snapmaker J1 (0.2 nozzle).json @@ -0,0 +1,36 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.10 Standard @Snapmaker J1 (0.2 nozzle)", + "setting_id": "3458191734", + "inherits": "fdm_process_idex", + "compatible_printers": [ + "Snapmaker J1 (0.2 nozzle)" + ], + "layer_height": "0.1", + "initial_layer_print_height": "0.1", + "wall_loops": "4", + "bottom_shell_layers": "5", + "top_shell_layers": "7", + "bridge_flow": "1", + "line_width": "0.22", + "outer_wall_line_width": "0.22", + "initial_layer_line_width": "0.25", + "sparse_infill_line_width": "0.22", + "inner_wall_line_width": "0.22", + "internal_solid_infill_line_width": "0.22", + "support_line_width": "0.22", + "top_surface_line_width": "0.22", + "initial_layer_speed": "40", + "initial_layer_infill_speed": "70", + "sparse_infill_speed": "100", + "top_surface_speed": "150", + "gap_infill_speed": "120", + "inner_wall_speed": "200", + "internal_solid_infill_speed": "200", + "support_interface_speed": "40", + "overhang_1_4_speed": "60", + "overhang_2_4_speed": "30", + "overhang_3_4_speed": "10" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.12 Fine @Snapmaker (0.4 nozzle).json b/resources/profiles/Snapmaker/process/0.12 Fine @Snapmaker (0.4 nozzle).json new file mode 100644 index 0000000000..884381d110 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.12 Fine @Snapmaker (0.4 nozzle).json @@ -0,0 +1,38 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.12 Fine @Snapmaker (0.4 nozzle)", + "setting_id": "659326512", + "inherits": "fdm_process_common", + "compatible_printers": [ + "Snapmaker A250 (0.4 nozzle)", + "Snapmaker A350 (0.4 nozzle)", + "Snapmaker A250 Dual (0.4 nozzle)", + "Snapmaker A350 Dual (0.4 nozzle)", + "Snapmaker A250 QSKit (0.4 nozzle)", + "Snapmaker A350 QSKit (0.4 nozzle)", + "Snapmaker A250 Dual QSKit (0.4 nozzle)", + "Snapmaker A350 Dual QSKit (0.4 nozzle)" + ], + "layer_height": "0.12", + "initial_layer_print_height": "0.2", + "bottom_shell_layers": "5", + "elefant_foot_compensation": "0.15", + "top_shell_layers": "5", + "top_shell_thickness": "0.6", + "bridge_flow": "1", + "support_threshold_angle": "20", + "initial_layer_infill_speed": "65", + "outer_wall_speed": "75", + "inner_wall_speed": "120", + "sparse_infill_speed": "90", + "internal_solid_infill_speed": "120", + "top_surface_speed": "70", + "gap_infill_speed": "85", + "overhang_1_4_speed": "55", + "overhang_2_4_speed": "30", + "overhang_3_4_speed": "10", + "ironing_speed": "30", + "support_speed": "100" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.12 Fine @Snapmaker J1 (0.4 nozzle).json b/resources/profiles/Snapmaker/process/0.12 Fine @Snapmaker J1 (0.4 nozzle).json new file mode 100644 index 0000000000..5fce09ed24 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.12 Fine @Snapmaker J1 (0.4 nozzle).json @@ -0,0 +1,27 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.12 Fine @Snapmaker J1 (0.4 nozzle)", + "setting_id": "2089753458", + "inherits": "fdm_process_idex", + "compatible_printers": [ + "Snapmaker J1 (0.4 nozzle)" + ], + "layer_height": "0.12", + "bottom_shell_layers": "5", + "elefant_foot_compensation": "0.15", + "top_shell_layers": "5", + "top_shell_thickness": "0.6", + "bridge_flow": "1", + "support_threshold_angle": "20", + "initial_layer_infill_speed": "60", + "inner_wall_speed": "230", + "internal_solid_infill_speed": "230", + "sparse_infill_speed": "120", + "top_surface_speed": "120", + "gap_infill_speed": "160", + "overhang_1_4_speed": "60", + "overhang_2_4_speed": "30", + "overhang_3_4_speed": "10" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.14 Standard @Snapmaker (0.2 nozzle).json b/resources/profiles/Snapmaker/process/0.14 Standard @Snapmaker (0.2 nozzle).json new file mode 100644 index 0000000000..09d5e2d93f --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.14 Standard @Snapmaker (0.2 nozzle).json @@ -0,0 +1,45 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.14 Standard @Snapmaker (0.2 nozzle)", + "setting_id": "3753641602", + "inherits": "fdm_process_common", + "compatible_printers": [ + "Snapmaker A250 (0.2 nozzle)", + "Snapmaker A350 (0.2 nozzle)", + "Snapmaker A250 Dual (0.2 nozzle)", + "Snapmaker A350 Dual (0.2 nozzle)", + "Snapmaker A250 QSKit (0.2 nozzle)", + "Snapmaker A350 QSKit (0.2 nozzle)", + "Snapmaker A250 Dual QSKit (0.2 nozzle)", + "Snapmaker A350 Dual QSKit (0.2 nozzle)" + ], + "layer_height": "0.14", + "initial_layer_print_height": "0.2", + "wall_loops": "4", + "bottom_shell_layers": "5", + "top_shell_layers": "7", + "bridge_flow": "1", + "line_width": "0.22", + "outer_wall_line_width": "0.22", + "initial_layer_line_width": "0.25", + "sparse_infill_line_width": "0.22", + "inner_wall_line_width": "0.22", + "internal_solid_infill_line_width": "0.22", + "support_line_width": "0.22", + "top_surface_line_width": "0.22", + "initial_layer_speed": "40", + "initial_layer_infill_speed": "70", + "sparse_infill_speed": "100", + "gap_infill_speed": "85", + "inner_wall_speed": "120", + "internal_solid_infill_speed": "120", + "ironing_speed": "30", + "outer_wall_speed": "100", + "support_interface_speed": "40", + "support_speed": "100", + "overhang_1_4_speed": "60", + "overhang_2_4_speed": "30", + "overhang_3_4_speed": "10" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.14 Standard @Snapmaker J1 (0.2 nozzle).json b/resources/profiles/Snapmaker/process/0.14 Standard @Snapmaker J1 (0.2 nozzle).json new file mode 100644 index 0000000000..78827b2172 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.14 Standard @Snapmaker J1 (0.2 nozzle).json @@ -0,0 +1,35 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.14 Standard @Snapmaker J1 (0.2 nozzle)", + "setting_id": "2689370057", + "inherits": "fdm_process_idex", + "compatible_printers": [ + "Snapmaker J1 (0.2 nozzle)" + ], + "layer_height": "0.14", + "wall_loops": "4", + "bottom_shell_layers": "5", + "top_shell_layers": "7", + "bridge_flow": "1", + "line_width": "0.22", + "outer_wall_line_width": "0.22", + "initial_layer_line_width": "0.25", + "sparse_infill_line_width": "0.22", + "inner_wall_line_width": "0.22", + "internal_solid_infill_line_width": "0.22", + "support_line_width": "0.22", + "top_surface_line_width": "0.22", + "initial_layer_speed": "40", + "initial_layer_infill_speed": "70", + "sparse_infill_speed": "100", + "top_surface_speed": "150", + "gap_infill_speed": "120", + "inner_wall_speed": "200", + "internal_solid_infill_speed": "200", + "support_interface_speed": "40", + "overhang_1_4_speed": "60", + "overhang_2_4_speed": "30", + "overhang_3_4_speed": "10" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.16 Optimal @Snapmaker (0.4 nozzle).json b/resources/profiles/Snapmaker/process/0.16 Optimal @Snapmaker (0.4 nozzle).json new file mode 100644 index 0000000000..0e68e7b1b0 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.16 Optimal @Snapmaker (0.4 nozzle).json @@ -0,0 +1,37 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.16 Optimal @Snapmaker (0.4 nozzle)", + "setting_id": "719207749", + "inherits": "fdm_process_common", + "compatible_printers": [ + "Snapmaker A250 (0.4 nozzle)", + "Snapmaker A350 (0.4 nozzle)", + "Snapmaker A250 Dual (0.4 nozzle)", + "Snapmaker A350 Dual (0.4 nozzle)", + "Snapmaker A250 QSKit (0.4 nozzle)", + "Snapmaker A350 QSKit (0.4 nozzle)", + "Snapmaker A250 Dual QSKit (0.4 nozzle)", + "Snapmaker A350 Dual QSKit (0.4 nozzle)" + ], + "layer_height": "0.16", + "initial_layer_print_height": "0.2", + "elefant_foot_compensation": "0.15", + "bottom_shell_layers": "4", + "top_shell_thickness": "0.6", + "bridge_flow": "1", + "support_threshold_angle": "25", + "initial_layer_infill_speed": "65", + "outer_wall_speed": "80", + "inner_wall_speed": "100", + "sparse_infill_speed": "95", + "infill_wall_overlap": "20%", + "top_surface_speed": "70", + "gap_infill_speed": "85", + "overhang_1_4_speed": "55", + "overhang_2_4_speed": "30", + "overhang_3_4_speed": "10", + "ironing_speed": "30", + "support_speed": "100" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.16 Optimal @Snapmaker J1 (0.4 nozzle).json b/resources/profiles/Snapmaker/process/0.16 Optimal @Snapmaker J1 (0.4 nozzle).json new file mode 100644 index 0000000000..3872ca6e36 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.16 Optimal @Snapmaker J1 (0.4 nozzle).json @@ -0,0 +1,27 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.16 Optimal @Snapmaker J1 (0.4 nozzle)", + "setting_id": "931476703", + "inherits": "fdm_process_idex", + "compatible_printers": [ + "Snapmaker J1 (0.4 nozzle)" + ], + "layer_height": "0.16", + "elefant_foot_compensation": "0.15", + "bottom_shell_layers": "4", + "top_shell_thickness": "0.6", + "bridge_flow": "1", + "support_threshold_angle": "25", + "initial_layer_infill_speed": "60", + "inner_wall_speed": "200", + "internal_solid_infill_speed": "200", + "outer_wall_speed": "80", + "sparse_infill_speed": "140", + "top_surface_speed": "80", + "gap_infill_speed": "160", + "overhang_1_4_speed": "60", + "overhang_2_4_speed": "30", + "overhang_3_4_speed": "10" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.18 Standard @Snapmaker (0.6 nozzle).json b/resources/profiles/Snapmaker/process/0.18 Standard @Snapmaker (0.6 nozzle).json new file mode 100644 index 0000000000..064c5a4b24 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.18 Standard @Snapmaker (0.6 nozzle).json @@ -0,0 +1,42 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.18 Standard @Snapmaker (0.6 nozzle)", + "setting_id": "4013595815", + "inherits": "fdm_process_common", + "compatible_printers": [ + "Snapmaker A250 (0.6 nozzle)", + "Snapmaker A350 (0.6 nozzle)", + "Snapmaker A250 Dual (0.6 nozzle)", + "Snapmaker A350 Dual (0.6 nozzle)", + "Snapmaker A250 QSKit (0.6 nozzle)", + "Snapmaker A350 QSKit (0.6 nozzle)", + "Snapmaker A250 Dual QSKit (0.6 nozzle)", + "Snapmaker A350 Dual QSKit (0.6 nozzle)" + ], + "layer_height": "0.18", + "initial_layer_print_height": "0.2", + "wall_loops": "2", + "top_shell_layers": "3", + "bridge_flow": "1", + "line_width": "0.62", + "outer_wall_line_width": "0.62", + "initial_layer_line_width": "0.62", + "sparse_infill_line_width": "0.62", + "inner_wall_line_width": "0.62", + "internal_solid_infill_line_width": "0.62", + "support_line_width": "0.62", + "top_surface_line_width": "0.62", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "outer_wall_speed": "90", + "inner_wall_speed": "90", + "sparse_infill_speed": "100", + "gap_infill_speed": "50", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50", + "ironing_speed": "30", + "support_interface_speed": "35", + "support_speed": "100" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.18 Standard @Snapmaker J1 (0.6 nozzle).json b/resources/profiles/Snapmaker/process/0.18 Standard @Snapmaker J1 (0.6 nozzle).json new file mode 100644 index 0000000000..822b4189be --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.18 Standard @Snapmaker J1 (0.6 nozzle).json @@ -0,0 +1,33 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.18 Standard @Snapmaker J1 (0.6 nozzle)", + "setting_id": "1330982148", + "inherits": "fdm_process_idex", + "compatible_printers": [ + "Snapmaker J1 (0.6 nozzle)" + ], + "layer_height": "0.18", + "wall_loops": "2", + "bridge_flow": "1", + "line_width": "0.62", + "outer_wall_line_width": "0.62", + "initial_layer_line_width": "0.62", + "sparse_infill_line_width": "0.62", + "inner_wall_line_width": "0.62", + "internal_solid_infill_line_width": "0.62", + "support_line_width": "0.62", + "top_surface_line_width": "0.62", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "outer_wall_speed": "120", + "inner_wall_speed": "150", + "sparse_infill_speed": "100", + "internal_solid_infill_speed": "150", + "top_surface_speed": "150", + "gap_infill_speed": "50", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50", + "support_interface_speed": "35" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.20 Standard @Snapmaker (0.4 nozzle).json b/resources/profiles/Snapmaker/process/0.20 Standard @Snapmaker (0.4 nozzle).json new file mode 100644 index 0000000000..075efd986b --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.20 Standard @Snapmaker (0.4 nozzle).json @@ -0,0 +1,29 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.20 Standard @Snapmaker (0.4 nozzle)", + "setting_id": "3044804041", + "inherits": "fdm_process_common", + "compatible_printers": [ + "Snapmaker A250 (0.4 nozzle)", + "Snapmaker A350 (0.4 nozzle)", + "Snapmaker A250 Dual (0.4 nozzle)", + "Snapmaker A350 Dual (0.4 nozzle)", + "Snapmaker A250 QSKit (0.4 nozzle)", + "Snapmaker A350 QSKit (0.4 nozzle)", + "Snapmaker A250 Dual QSKit (0.4 nozzle)", + "Snapmaker A350 Dual QSKit (0.4 nozzle)" + ], + "elefant_foot_compensation": "0.15", + "initial_layer_infill_speed": "60", + "inner_wall_speed": "90", + "sparse_infill_speed": "95", + "top_surface_speed": "70", + "gap_infill_speed": "85", + "support_speed": "100", + "ironing_speed": "30", + "overhang_1_4_speed": "40", + "overhang_2_4_speed": "20", + "overhang_3_4_speed": "10" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.20 Standard @Snapmaker J1 (0.4 nozzle).json b/resources/profiles/Snapmaker/process/0.20 Standard @Snapmaker J1 (0.4 nozzle).json new file mode 100644 index 0000000000..2e8d4d0f18 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.20 Standard @Snapmaker J1 (0.4 nozzle).json @@ -0,0 +1,21 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.20 Standard @Snapmaker J1 (0.4 nozzle)", + "setting_id": "4042107035", + "inherits": "fdm_process_idex", + "compatible_printers": [ + "Snapmaker J1 (0.4 nozzle)" + ], + "elefant_foot_compensation": "0.15", + "outer_wall_speed": "140", + "inner_wall_speed": "240", + "sparse_infill_speed": "300", + "internal_solid_infill_speed": "240", + "top_surface_speed": "140", + "gap_infill_speed": "240", + "overhang_1_4_speed": "60", + "overhang_2_4_speed": "30", + "overhang_3_4_speed": "10" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.20 Strength @Snapmaker (0.4 nozzle).json b/resources/profiles/Snapmaker/process/0.20 Strength @Snapmaker (0.4 nozzle).json new file mode 100644 index 0000000000..832d265b24 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.20 Strength @Snapmaker (0.4 nozzle).json @@ -0,0 +1,33 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.20 Strength @Snapmaker (0.4 nozzle)", + "setting_id": "3490773493", + "inherits": "fdm_process_common", + "compatible_printers": [ + "Snapmaker A250 (0.4 nozzle)", + "Snapmaker A350 (0.4 nozzle)", + "Snapmaker A250 Dual (0.4 nozzle)", + "Snapmaker A350 Dual (0.4 nozzle)", + "Snapmaker A250 QSKit (0.4 nozzle)", + "Snapmaker A350 QSKit (0.4 nozzle)", + "Snapmaker A250 Dual QSKit (0.4 nozzle)", + "Snapmaker A350 Dual QSKit (0.4 nozzle)" + ], + "elefant_foot_compensation": "0.15", + "wall_loops": "6", + "outer_wall_speed": "90", + "sparse_infill_density": "25%", + "gap_infill_speed": "85", + "initial_layer_infill_speed": "65", + "inner_wall_speed": "100", + "infill_wall_overlap": "25%", + "ironing_speed": "30", + "sparse_infill_speed": "95", + "support_speed": "100", + "top_surface_speed": "70", + "overhang_1_4_speed": "55", + "overhang_2_4_speed": "30", + "overhang_3_4_speed": "10" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.20 Strength @Snapmaker J1 (0.4 nozzle).json b/resources/profiles/Snapmaker/process/0.20 Strength @Snapmaker J1 (0.4 nozzle).json new file mode 100644 index 0000000000..4b03f36e16 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.20 Strength @Snapmaker J1 (0.4 nozzle).json @@ -0,0 +1,24 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.20 Strength @Snapmaker J1 (0.4 nozzle)", + "setting_id": "563165128", + "inherits": "fdm_process_idex", + "compatible_printers": [ + "Snapmaker J1 (0.4 nozzle)" + ], + "elefant_foot_compensation": "0.15", + "wall_loops": "6", + "outer_wall_speed": "120", + "top_surface_speed": "120", + "sparse_infill_density": "25%", + "gap_infill_speed": "160", + "initial_layer_infill_speed": "65", + "inner_wall_speed": "200", + "internal_solid_infill_speed": "200", + "sparse_infill_speed": "160", + "overhang_1_4_speed": "60", + "overhang_2_4_speed": "30", + "overhang_3_4_speed": "10" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.20mm 0.4 Standard @Snapmaker J1.json b/resources/profiles/Snapmaker/process/0.20mm 0.4 Standard @Snapmaker J1.json deleted file mode 100644 index 53d6b73b9b..0000000000 --- a/resources/profiles/Snapmaker/process/0.20mm 0.4 Standard @Snapmaker J1.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "type": "process", - "setting_id": "GP040", - "name": "0.20mm 0.4 Standard @Snapmaker J1", - "from": "system", - "instantiation": "true", - "inherits": "fdm_process_common", - "bottom_shell_layers": "4", - "bridge_acceleration": "60%", - "brim_type": "no_brim", - "default_acceleration": "5000", - "default_jerk": "3", - "elefant_foot_compensation": "0.1", - "enable_arc_fitting": "1", - "enable_support": "1", - "filename_format": "{input_filename_base}_{layer_height}mm_J1_{print_time}.gcode", - "flush_into_infill": "1", - "gap_infill_speed": "80", - "gcode_comments": "1", - "infill_jerk": "3", - "initial_layer_acceleration": "1000", - "initial_layer_infill_speed": "40", - "initial_layer_jerk": "1", - "initial_layer_speed": "35", - "initial_layer_travel_speed": "50%", - "inner_wall_acceleration": "2000", - "inner_wall_jerk": "3", - "inner_wall_line_width": "0.44", - "inner_wall_speed": "120", - "internal_solid_infill_line_width": "0.45", - "internal_solid_infill_speed": "160", - "is_custom_defined": "0", - "layer_height": "0.25", - "line_width": "0.44", - "max_travel_detour_distance": "3", - "only_one_wall_top": "1", - "outer_wall_acceleration": "2000", - "outer_wall_jerk": "2", - "outer_wall_line_width": "0.42", - "outer_wall_speed": "100", - "overhang_1_4_speed": "50", - "overhang_2_4_speed": "30", - "overhang_3_4_speed": "20", - "post_process": [ - "/Users/hliebscher/smfix_bs-darwin-arm64", - "\n/Users/hliebscher/j1x2", - "\n" - ], - "precise_outer_wall": "1", - "prime_tower_brim_width": "1", - "prime_tower_width": "10", - "prime_volume": "2", - "print_settings_id": "0.4 0.25mm Normal S2J2 Parts", - "reduce_crossing_wall": "1", - "skirt_loops": "2", - "small_perimeter_speed": "80%", - "small_perimeter_threshold": "6", - "sparse_infill_density": "35%", - "sparse_infill_line_width": "0.44", - "sparse_infill_pattern": "adaptivecubic", - "sparse_infill_speed": "130", - "support_interface_top_layers": "0", - "support_line_width": "0.45", - "support_speed": "100", - "support_top_z_distance": "0", - "support_type": "normal(manual)", - "thick_bridges": "1", - "top_shell_thickness": "0", - "top_surface_acceleration": "1000", - "top_surface_jerk": "1", - "top_surface_speed": "60", - "travel_acceleration": "2500", - "travel_jerk": "9", - "travel_speed": "150", - "tree_support_wall_count": "2", - "xy_hole_compensation": "0.08", - "compatible_printers": [ - "Snapmaker J1 0.4 nozzle" - ] -} diff --git a/resources/profiles/Snapmaker/process/0.20mm 0.6 Standard @Snapmaker J1.json b/resources/profiles/Snapmaker/process/0.20mm 0.6 Standard @Snapmaker J1.json deleted file mode 100644 index def674c97f..0000000000 --- a/resources/profiles/Snapmaker/process/0.20mm 0.6 Standard @Snapmaker J1.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "type": "process", - "setting_id": "GP041", - "name": "0.20mm 0.6 Standard @Snapmaker J1", - "from": "system", - "instantiation": "true", - "inherits": "fdm_process_common", - "bottom_shell_layers": "4", - "bridge_acceleration": "60%", - "brim_type": "no_brim", - "default_acceleration": "5000", - "default_jerk": "3", - "elefant_foot_compensation": "0.1", - "enable_arc_fitting": "1", - "enable_support": "1", - "filename_format": "{input_filename_base}_{layer_height}mm_J1_{print_time}.gcode", - "flush_into_infill": "1", - "gap_infill_speed": "80", - "gcode_comments": "1", - "infill_jerk": "3", - "initial_layer_acceleration": "1000", - "initial_layer_infill_speed": "40", - "initial_layer_jerk": "1", - "initial_layer_speed": "35", - "initial_layer_travel_speed": "50%", - "inner_wall_acceleration": "2000", - "inner_wall_jerk": "3", - "inner_wall_line_width": "0.64", - "inner_wall_speed": "120", - "internal_solid_infill_line_width": "0.65", - "internal_solid_infill_speed": "160", - "is_custom_defined": "0", - "layer_height": "0.25", - "line_width": "0.64", - "max_travel_detour_distance": "3", - "only_one_wall_top": "1", - "outer_wall_acceleration": "2000", - "outer_wall_jerk": "2", - "outer_wall_line_width": "0.62", - "outer_wall_speed": "100", - "overhang_1_4_speed": "50", - "overhang_2_4_speed": "30", - "overhang_3_4_speed": "20", - "post_process": [ - "/Users/hliebscher/smfix_bs-darwin-arm64", - "\n/Users/hliebscher/j1x1", - "\n" - ], - "precise_outer_wall": "1", - "prime_tower_brim_width": "1", - "prime_tower_width": "10", - "prime_volume": "2", - "print_settings_id": "0.6 0.25mm Normal S2J2 Parts", - "reduce_crossing_wall": "1", - "skirt_loops": "2", - "small_perimeter_speed": "80%", - "small_perimeter_threshold": "6", - "sparse_infill_density": "35%", - "sparse_infill_line_width": "0.64", - "sparse_infill_pattern": "adaptivecubic", - "sparse_infill_speed": "130", - "support_interface_top_layers": "0", - "support_line_width": "0.65", - "support_speed": "100", - "support_top_z_distance": "0", - "support_type": "normal(manual)", - "thick_bridges": "1", - "top_shell_thickness": "0", - "top_surface_acceleration": "1000", - "top_surface_jerk": "1", - "top_surface_speed": "60", - "travel_acceleration": "2500", - "travel_jerk": "9", - "travel_speed": "150", - "tree_support_wall_count": "2", - "xy_hole_compensation": "0.08", - "compatible_printers": [ - "Snapmaker J1 0.6 nozzle" - ] -} diff --git a/resources/profiles/Snapmaker/process/0.20mm Standard @Snapmaker.json b/resources/profiles/Snapmaker/process/0.20mm Standard @Snapmaker.json deleted file mode 100644 index fe6eb68e15..0000000000 --- a/resources/profiles/Snapmaker/process/0.20mm Standard @Snapmaker.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "process", - "setting_id": "GP004", - "name": "0.20mm Standard @Snapmaker", - "from": "system", - "instantiation": "true", - "inherits": "fdm_process_common", - "initial_layer_speed": "40", - "initial_layer_infill_speed": "50", - "outer_wall_speed": "35", - "inner_wall_speed": "60", - "sparse_infill_speed": "100", - "internal_solid_infill_speed": "100", - "top_surface_speed": "50", - "gap_infill_speed": "40", - "travel_speed": "120", - "compatible_printers": [ - "Snapmaker A250 0.4 nozzle", - "Snapmaker A350 0.4 nozzle" - ] -} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.24 Draft @Snapmaker (0.4 nozzle).json b/resources/profiles/Snapmaker/process/0.24 Draft @Snapmaker (0.4 nozzle).json new file mode 100644 index 0000000000..52f1e24065 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.24 Draft @Snapmaker (0.4 nozzle).json @@ -0,0 +1,35 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.24 Draft @Snapmaker (0.4 nozzle)", + "setting_id": "1966563644", + "inherits": "fdm_process_common", + "compatible_printers": [ + "Snapmaker A250 (0.4 nozzle)", + "Snapmaker A350 (0.4 nozzle)", + "Snapmaker A250 Dual (0.4 nozzle)", + "Snapmaker A350 Dual (0.4 nozzle)", + "Snapmaker A250 QSKit (0.4 nozzle)", + "Snapmaker A350 QSKit (0.4 nozzle)", + "Snapmaker A250 Dual QSKit (0.4 nozzle)", + "Snapmaker A350 Dual QSKit (0.4 nozzle)" + ], + "layer_height": "0.24", + "elefant_foot_compensation": "0.15", + "top_surface_line_width": "0.45", + "top_shell_layers": "3", + "top_shell_thickness": "0.6", + "support_threshold_angle": "35", + "initial_layer_infill_speed": "65", + "outer_wall_speed": "90", + "inner_wall_speed": "100", + "sparse_infill_speed": "100", + "top_surface_speed": "70", + "gap_infill_speed": "85", + "ironing_speed": "30", + "support_speed": "100", + "overhang_1_4_speed": "55", + "overhang_2_4_speed": "30", + "overhang_3_4_speed": "10" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.24 Draft @Snapmaker J1 (0.4 nozzle).json b/resources/profiles/Snapmaker/process/0.24 Draft @Snapmaker J1 (0.4 nozzle).json new file mode 100644 index 0000000000..a7609b7a3b --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.24 Draft @Snapmaker J1 (0.4 nozzle).json @@ -0,0 +1,26 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.24 Draft @Snapmaker J1 (0.4 nozzle)", + "setting_id": "2742890459", + "inherits": "fdm_process_idex", + "compatible_printers": [ + "Snapmaker J1 (0.4 nozzle)" + ], + "layer_height": "0.24", + "elefant_foot_compensation": "0.15", + "top_surface_line_width": "0.45", + "top_shell_layers": "3", + "top_shell_thickness": "0.6", + "support_threshold_angle": "35", + "initial_layer_infill_speed": "65", + "inner_wall_speed": "190", + "internal_solid_infill_speed": "190", + "sparse_infill_speed": "160", + "top_surface_speed": "160", + "gap_infill_speed": "160", + "overhang_1_4_speed": "60", + "overhang_2_4_speed": "30", + "overhang_3_4_speed": "10" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.24 Standard @Snapmaker (0.6 nozzle).json b/resources/profiles/Snapmaker/process/0.24 Standard @Snapmaker (0.6 nozzle).json new file mode 100644 index 0000000000..75d8c107ba --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.24 Standard @Snapmaker (0.6 nozzle).json @@ -0,0 +1,40 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.24 Standard @Snapmaker (0.6 nozzle)", + "setting_id": "159607191", + "inherits": "fdm_process_common", + "compatible_printers": [ + "Snapmaker A250 (0.6 nozzle)", + "Snapmaker A350 (0.6 nozzle)", + "Snapmaker A250 Dual (0.6 nozzle)", + "Snapmaker A350 Dual (0.6 nozzle)", + "Snapmaker A250 QSKit (0.6 nozzle)", + "Snapmaker A350 QSKit (0.6 nozzle)", + "Snapmaker A250 Dual QSKit (0.6 nozzle)", + "Snapmaker A350 Dual QSKit (0.6 nozzle)" + ], + "layer_height": "0.24", + "wall_loops": "2", + "top_shell_layers": "3", + "line_width": "0.62", + "outer_wall_line_width": "0.62", + "initial_layer_line_width": "0.62", + "sparse_infill_line_width": "0.62", + "inner_wall_line_width": "0.62", + "internal_solid_infill_line_width": "0.62", + "support_line_width": "0.62", + "top_surface_line_width": "0.62", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "outer_wall_speed": "90", + "inner_wall_speed": "85", + "sparse_infill_speed": "100", + "gap_infill_speed": "50", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50", + "ironing_speed": "30", + "support_interface_speed": "35", + "support_speed": "100" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.24 Standard @Snapmaker (0.8 nozzle).json b/resources/profiles/Snapmaker/process/0.24 Standard @Snapmaker (0.8 nozzle).json new file mode 100644 index 0000000000..fe005c6d89 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.24 Standard @Snapmaker (0.8 nozzle).json @@ -0,0 +1,43 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.24 Standard @Snapmaker (0.8 nozzle)", + "setting_id": "3242308101", + "inherits": "fdm_process_common", + "compatible_printers": [ + "Snapmaker A250 (0.8 nozzle)", + "Snapmaker A350 (0.8 nozzle)", + "Snapmaker A250 Dual (0.8 nozzle)", + "Snapmaker A350 Dual (0.8 nozzle)", + "Snapmaker A250 QSKit (0.8 nozzle)", + "Snapmaker A350 QSKit (0.8 nozzle)", + "Snapmaker A250 Dual QSKit (0.8 nozzle)", + "Snapmaker A350 Dual QSKit (0.8 nozzle)" + ], + "layer_height": "0.24", + "wall_loops": "2", + "top_shell_layers": "3", + "line_width": "0.82", + "outer_wall_line_width": "0.82", + "initial_layer_line_width": "0.82", + "sparse_infill_line_width": "0.82", + "inner_wall_line_width": "0.82", + "internal_solid_infill_line_width": "0.82", + "support_line_width": "0.82", + "top_surface_line_width": "0.82", + "top_surface_pattern": "monotonic", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "outer_wall_speed": "90", + "inner_wall_speed": "85", + "sparse_infill_speed": "100", + "gap_infill_speed": "50", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50", + "overhang_3_4_speed": "25", + "overhang_4_4_speed": "5", + "ironing_speed": "30", + "support_interface_speed": "35", + "support_speed": "100" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.24 Standard @Snapmaker J1 (0.6 nozzle).json b/resources/profiles/Snapmaker/process/0.24 Standard @Snapmaker J1 (0.6 nozzle).json new file mode 100644 index 0000000000..db6de9e9c7 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.24 Standard @Snapmaker J1 (0.6 nozzle).json @@ -0,0 +1,33 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.24 Standard @Snapmaker J1 (0.6 nozzle)", + "setting_id": "2957563554", + "inherits": "fdm_process_idex", + "compatible_printers": [ + "Snapmaker J1 (0.6 nozzle)" + ], + "layer_height": "0.24", + "wall_loops": "2", + "top_shell_layers": "3", + "line_width": "0.62", + "outer_wall_line_width": "0.62", + "initial_layer_line_width": "0.62", + "sparse_infill_line_width": "0.62", + "inner_wall_line_width": "0.62", + "internal_solid_infill_line_width": "0.62", + "support_line_width": "0.62", + "top_surface_line_width": "0.62", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "outer_wall_speed": "120", + "inner_wall_speed": "150", + "sparse_infill_speed": "100", + "internal_solid_infill_speed": "150", + "top_surface_speed": "150", + "gap_infill_speed": "50", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50", + "support_interface_speed": "35" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.24 Standard @Snapmaker J1 (0.8 nozzle).json b/resources/profiles/Snapmaker/process/0.24 Standard @Snapmaker J1 (0.8 nozzle).json new file mode 100644 index 0000000000..ae3070e3ab --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.24 Standard @Snapmaker J1 (0.8 nozzle).json @@ -0,0 +1,37 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.24 Standard @Snapmaker J1 (0.8 nozzle)", + "setting_id": "2022313264", + "inherits": "fdm_process_idex", + "compatible_printers": [ + "Snapmaker J1 (0.8 nozzle)" + ], + "layer_height": "0.24", + "initial_layer_print_height": "0.3", + "wall_loops": "2", + "top_shell_layers": "3", + "line_width": "0.82", + "outer_wall_line_width": "0.82", + "initial_layer_line_width": "0.82", + "sparse_infill_line_width": "0.82", + "inner_wall_line_width": "0.82", + "internal_solid_infill_line_width": "0.82", + "support_line_width": "0.82", + "top_surface_line_width": "0.82", + "top_surface_pattern": "monotonic", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "outer_wall_speed": "120", + "inner_wall_speed": "150", + "sparse_infill_speed": "100", + "internal_solid_infill_speed": "150", + "top_surface_speed": "150", + "gap_infill_speed": "50", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50", + "overhang_3_4_speed": "25", + "overhang_4_4_speed": "5", + "support_interface_speed": "35" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.25 Benchy @Snapmaker J1 (0.4 nozzle).json b/resources/profiles/Snapmaker/process/0.25 Benchy @Snapmaker J1 (0.4 nozzle).json new file mode 100644 index 0000000000..3aed2018f2 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.25 Benchy @Snapmaker J1 (0.4 nozzle).json @@ -0,0 +1,55 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.25 Benchy @Snapmaker J1 (0.4 nozzle)", + "setting_id": "4247211099", + "inherits": "fdm_process_idex", + "compatible_printers": [ + "Snapmaker J1 (0.4 nozzle)" + ], + "elefant_foot_compensation": "0.15", + "top_shell_thickness": "0.5", + "initial_layer_infill_speed": "60", + "outer_wall_speed": "180", + "inner_wall_speed": "280", + "sparse_infill_speed": "200", + "internal_solid_infill_speed": "280", + "top_surface_speed": "200", + "gap_infill_speed": "280", + "enable_overhang_speed": "0", + "overhang_1_4_speed": "150", + "overhang_2_4_speed": "20", + "overhang_3_4_speed": "10", + "detect_overhang_wall": "0", + "reduce_crossing_wall": "0", + "ensure_vertical_shell_thickness": "0", + "filename_format": "J1Benchy_{print_time}.gcode", + "sparse_infill_density": "10%", + "wall_generator": "classic", + "seam_position": "nearest", + "wall_loops": "2", + "only_one_wall_top": "1", + "only_one_wall_first_layer": "1", + "resolution": "0.05", + "minimum_sparse_infill_area": "0", + "infill_combination": "1", + "line_width": "0.5", + "inner_wall_line_width": "0.5", + "initial_layer_print_height": "0.25", + "internal_solid_infill_line_width": "0.5", + "outer_wall_line_width": "0.5", + "sparse_infill_line_width": "0.5", + "support_line_width": "0.5", + "top_surface_line_width": "0.5", + "bridge_acceleration": "3000", + "bridge_speed": "180", + "default_acceleration": "15000", + "inner_wall_acceleration": "15000", + "internal_solid_infill_acceleration": "20000", + "outer_wall_acceleration": "3000", + "small_perimeter_speed": "200", + "sparse_infill_acceleration": "15000", + "top_surface_acceleration": "8000", + "travel_acceleration": "28000" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.28 Extra Draft @Snapmaker (0.4 nozzle).json b/resources/profiles/Snapmaker/process/0.28 Extra Draft @Snapmaker (0.4 nozzle).json new file mode 100644 index 0000000000..7a5407da27 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.28 Extra Draft @Snapmaker (0.4 nozzle).json @@ -0,0 +1,36 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.28 Extra Draft @Snapmaker (0.4 nozzle)", + "setting_id": "3717021337", + "inherits": "fdm_process_common", + "compatible_printers": [ + "Snapmaker A250 (0.4 nozzle)", + "Snapmaker A350 (0.4 nozzle)", + "Snapmaker A250 Dual (0.4 nozzle)", + "Snapmaker A350 Dual (0.4 nozzle)", + "Snapmaker A250 QSKit (0.4 nozzle)", + "Snapmaker A350 QSKit (0.4 nozzle)", + "Snapmaker A250 Dual QSKit (0.4 nozzle)", + "Snapmaker A350 Dual QSKit (0.4 nozzle)" + ], + "layer_height": "0.28", + "elefant_foot_compensation": "0.15", + "top_surface_line_width": "0.45", + "top_shell_layers": "3", + "top_shell_thickness": "0.6", + "support_threshold_angle": "40", + "initial_layer_infill_speed": "65", + "outer_wall_speed": "85", + "inner_wall_speed": "95", + "sparse_infill_speed": "95", + "internal_solid_infill_speed": "95", + "top_surface_speed": "70", + "gap_infill_speed": "85", + "ironing_speed": "30", + "support_speed": "100", + "overhang_1_4_speed": "55", + "overhang_2_4_speed": "30", + "overhang_3_4_speed": "10" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.28 Extra Draft @Snapmaker J1 (0.4 nozzle).json b/resources/profiles/Snapmaker/process/0.28 Extra Draft @Snapmaker J1 (0.4 nozzle).json new file mode 100644 index 0000000000..b3831aaea2 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.28 Extra Draft @Snapmaker J1 (0.4 nozzle).json @@ -0,0 +1,25 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.28 Extra Draft @Snapmaker J1 (0.4 nozzle)", + "setting_id": "1784261617", + "inherits": "fdm_process_idex", + "compatible_printers": [ + "Snapmaker J1 (0.4 nozzle)" + ], + "layer_height": "0.28", + "elefant_foot_compensation": "0.15", + "top_surface_line_width": "0.45", + "top_shell_layers": "3", + "top_shell_thickness": "0.6", + "support_threshold_angle": "40", + "initial_layer_infill_speed": "65", + "inner_wall_speed": "180", + "sparse_infill_speed": "160", + "top_surface_speed": "150", + "gap_infill_speed": "160", + "overhang_1_4_speed": "60", + "overhang_2_4_speed": "30", + "overhang_3_4_speed": "10" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.30 Standard @Snapmaker (0.6 nozzle).json b/resources/profiles/Snapmaker/process/0.30 Standard @Snapmaker (0.6 nozzle).json new file mode 100644 index 0000000000..49bf34e10e --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.30 Standard @Snapmaker (0.6 nozzle).json @@ -0,0 +1,41 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.30 Standard @Snapmaker (0.6 nozzle)", + "setting_id": "1410611847", + "inherits": "fdm_process_common", + "compatible_printers": [ + "Snapmaker A250 (0.6 nozzle)", + "Snapmaker A350 (0.6 nozzle)", + "Snapmaker A250 Dual (0.6 nozzle)", + "Snapmaker A350 Dual (0.6 nozzle)", + "Snapmaker A250 QSKit (0.6 nozzle)", + "Snapmaker A350 QSKit (0.6 nozzle)", + "Snapmaker A250 Dual QSKit (0.6 nozzle)", + "Snapmaker A350 Dual QSKit (0.6 nozzle)" + ], + "layer_height": "0.3", + "top_shell_layers": "3", + "bridge_speed": "30", + "line_width": "0.62", + "outer_wall_line_width": "0.62", + "initial_layer_line_width": "0.62", + "sparse_infill_line_width": "0.62", + "inner_wall_line_width": "0.62", + "internal_solid_infill_line_width": "0.62", + "support_line_width": "0.62", + "top_surface_line_width": "0.62", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "outer_wall_speed": "75", + "inner_wall_speed": "85", + "sparse_infill_speed": "100", + "internal_solid_infill_speed": "85", + "gap_infill_speed": "50", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50", + "ironing_speed": "30", + "support_interface_speed": "35", + "support_speed": "100" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.30 Standard @Snapmaker J1 (0.6 nozzle).json b/resources/profiles/Snapmaker/process/0.30 Standard @Snapmaker J1 (0.6 nozzle).json new file mode 100644 index 0000000000..323c6ce9ae --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.30 Standard @Snapmaker J1 (0.6 nozzle).json @@ -0,0 +1,33 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.30 Standard @Snapmaker J1 (0.6 nozzle)", + "setting_id": "1402174975", + "inherits": "fdm_process_idex", + "compatible_printers": [ + "Snapmaker J1 (0.6 nozzle)" + ], + "layer_height": "0.3", + "top_shell_layers": "3", + "bridge_speed": "30", + "line_width": "0.62", + "outer_wall_line_width": "0.62", + "initial_layer_line_width": "0.62", + "sparse_infill_line_width": "0.62", + "inner_wall_line_width": "0.62", + "internal_solid_infill_line_width": "0.62", + "support_line_width": "0.62", + "top_surface_line_width": "0.62", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "outer_wall_speed": "120", + "inner_wall_speed": "150", + "sparse_infill_speed": "100", + "internal_solid_infill_speed": "150", + "top_surface_speed": "150", + "gap_infill_speed": "50", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50", + "support_interface_speed": "35" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.30 Strength @Snapmaker (0.6 nozzle).json b/resources/profiles/Snapmaker/process/0.30 Strength @Snapmaker (0.6 nozzle).json new file mode 100644 index 0000000000..72a85a87d3 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.30 Strength @Snapmaker (0.6 nozzle).json @@ -0,0 +1,43 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.30 Strength @Snapmaker (0.6 nozzle)", + "setting_id": "829998779", + "inherits": "fdm_process_common", + "compatible_printers": [ + "Snapmaker A250 (0.6 nozzle)", + "Snapmaker A350 (0.6 nozzle)", + "Snapmaker A250 Dual (0.6 nozzle)", + "Snapmaker A350 Dual (0.6 nozzle)", + "Snapmaker A250 QSKit (0.6 nozzle)", + "Snapmaker A350 QSKit (0.6 nozzle)", + "Snapmaker A250 Dual QSKit (0.6 nozzle)", + "Snapmaker A350 Dual QSKit (0.6 nozzle)" + ], + "layer_height": "0.3", + "top_shell_layers": "3", + "bridge_speed": "30", + "line_width": "0.62", + "outer_wall_line_width": "0.62", + "initial_layer_line_width": "0.62", + "sparse_infill_line_width": "0.62", + "inner_wall_line_width": "0.62", + "internal_solid_infill_line_width": "0.62", + "support_line_width": "0.62", + "top_surface_line_width": "0.62", + "wall_loops": "6", + "sparse_infill_density": "25%", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "outer_wall_speed": "75", + "inner_wall_speed": "85", + "sparse_infill_speed": "100", + "internal_solid_infill_speed": "85", + "gap_infill_speed": "50", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50", + "ironing_speed": "30", + "support_interface_speed": "35", + "support_speed": "100" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.30 Strength @Snapmaker J1 (0.6 nozzle).json b/resources/profiles/Snapmaker/process/0.30 Strength @Snapmaker J1 (0.6 nozzle).json new file mode 100644 index 0000000000..b2fc14f58e --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.30 Strength @Snapmaker J1 (0.6 nozzle).json @@ -0,0 +1,35 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.30 Strength @Snapmaker J1 (0.6 nozzle)", + "setting_id": "2196759212", + "inherits": "fdm_process_idex", + "compatible_printers": [ + "Snapmaker J1 (0.6 nozzle)" + ], + "layer_height": "0.3", + "top_shell_layers": "3", + "bridge_speed": "30", + "line_width": "0.62", + "outer_wall_line_width": "0.62", + "initial_layer_line_width": "0.62", + "sparse_infill_line_width": "0.62", + "inner_wall_line_width": "0.62", + "internal_solid_infill_line_width": "0.62", + "support_line_width": "0.62", + "top_surface_line_width": "0.62", + "wall_loops": "6", + "sparse_infill_density": "25%", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "outer_wall_speed": "120", + "inner_wall_speed": "150", + "sparse_infill_speed": "100", + "internal_solid_infill_speed": "150", + "top_surface_speed": "150", + "gap_infill_speed": "50", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50", + "support_interface_speed": "35" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.32 Standard @Snapmaker (0.8 nozzle).json b/resources/profiles/Snapmaker/process/0.32 Standard @Snapmaker (0.8 nozzle).json new file mode 100644 index 0000000000..93bb0015a1 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.32 Standard @Snapmaker (0.8 nozzle).json @@ -0,0 +1,45 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.32 Standard @Snapmaker (0.8 nozzle)", + "setting_id": "3587326841", + "inherits": "fdm_process_common", + "compatible_printers": [ + "Snapmaker A250 (0.8 nozzle)", + "Snapmaker A350 (0.8 nozzle)", + "Snapmaker A250 Dual (0.8 nozzle)", + "Snapmaker A350 Dual (0.8 nozzle)", + "Snapmaker A250 QSKit (0.8 nozzle)", + "Snapmaker A350 QSKit (0.8 nozzle)", + "Snapmaker A250 Dual QSKit (0.8 nozzle)", + "Snapmaker A350 Dual QSKit (0.8 nozzle)" + ], + "layer_height": "0.32", + "wall_loops": "2", + "top_shell_layers": "3", + "bridge_speed": "30", + "line_width": "0.82", + "outer_wall_line_width": "0.82", + "initial_layer_line_width": "0.82", + "sparse_infill_line_width": "0.82", + "inner_wall_line_width": "0.82", + "internal_solid_infill_line_width": "0.82", + "support_line_width": "0.82", + "top_surface_line_width": "0.82", + "top_surface_pattern": "monotonic", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "outer_wall_speed": "75", + "inner_wall_speed": "85", + "sparse_infill_speed": "100", + "internal_solid_infill_speed": "85", + "gap_infill_speed": "50", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50", + "overhang_3_4_speed": "25", + "overhang_4_4_speed": "5", + "ironing_speed": "30", + "support_interface_speed": "35", + "support_speed": "100" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.32 Standard @Snapmaker J1 (0.8 nozzle).json b/resources/profiles/Snapmaker/process/0.32 Standard @Snapmaker J1 (0.8 nozzle).json new file mode 100644 index 0000000000..07017dbce5 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.32 Standard @Snapmaker J1 (0.8 nozzle).json @@ -0,0 +1,37 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.32 Standard @Snapmaker J1 (0.8 nozzle)", + "setting_id": "1103138322", + "inherits": "fdm_process_idex", + "compatible_printers": [ + "Snapmaker J1 (0.8 nozzle)" + ], + "layer_height": "0.32", + "wall_loops": "2", + "top_shell_layers": "3", + "bridge_speed": "30", + "line_width": "0.82", + "outer_wall_line_width": "0.82", + "initial_layer_line_width": "0.82", + "sparse_infill_line_width": "0.82", + "inner_wall_line_width": "0.82", + "internal_solid_infill_line_width": "0.82", + "support_line_width": "0.82", + "top_surface_line_width": "0.82", + "top_surface_pattern": "monotonic", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "outer_wall_speed": "120", + "inner_wall_speed": "150", + "sparse_infill_speed": "100", + "internal_solid_infill_speed": "150", + "top_surface_speed": "150", + "gap_infill_speed": "50", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50", + "overhang_3_4_speed": "25", + "overhang_4_4_speed": "5", + "support_interface_speed": "35" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.34 Standard @Snapmaker (0.6 nozzle).json b/resources/profiles/Snapmaker/process/0.34 Standard @Snapmaker (0.6 nozzle).json new file mode 100644 index 0000000000..4449b024c9 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.34 Standard @Snapmaker (0.6 nozzle).json @@ -0,0 +1,44 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.34 Standard @Snapmaker (0.6 nozzle)", + "setting_id": "3323821663", + "inherits": "fdm_process_common", + "compatible_printers": [ + "Snapmaker A250 (0.6 nozzle)", + "Snapmaker A350 (0.6 nozzle)", + "Snapmaker A250 Dual (0.6 nozzle)", + "Snapmaker A350 Dual (0.6 nozzle)", + "Snapmaker A250 QSKit (0.6 nozzle)", + "Snapmaker A350 QSKit (0.6 nozzle)", + "Snapmaker A250 Dual QSKit (0.6 nozzle)", + "Snapmaker A350 Dual QSKit (0.6 nozzle)" + ], + "layer_height": "0.34", + "wall_loops": "2", + "top_shell_layers": "3", + "bridge_speed": "30", + "line_width": "0.82", + "outer_wall_line_width": "0.82", + "initial_layer_line_width": "0.82", + "sparse_infill_line_width": "0.82", + "inner_wall_line_width": "0.82", + "internal_solid_infill_line_width": "0.82", + "support_line_width": "0.82", + "top_surface_line_width": "0.82", + "top_surface_pattern": "monotonic", + "gap_infill_speed": "50", + "initial_layer_infill_speed": "55", + "initial_layer_speed": "35", + "inner_wall_speed": "85", + "internal_solid_infill_speed": "85", + "ironing_speed": "30", + "outer_wall_speed": "75", + "sparse_infill_speed": "100", + "support_interface_speed": "35", + "support_speed": "100", + "travel_speed": "110", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.34 Standard @Snapmaker J1 (0.6 nozzle).json b/resources/profiles/Snapmaker/process/0.34 Standard @Snapmaker J1 (0.6 nozzle).json new file mode 100644 index 0000000000..3eaae555ca --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.34 Standard @Snapmaker J1 (0.6 nozzle).json @@ -0,0 +1,35 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.34 Standard @Snapmaker J1 (0.6 nozzle)", + "setting_id": "1036004160", + "inherits": "fdm_process_idex", + "compatible_printers": [ + "Snapmaker J1 (0.6 nozzle)" + ], + "layer_height": "0.34", + "wall_loops": "2", + "top_shell_layers": "3", + "bridge_speed": "30", + "line_width": "0.82", + "outer_wall_line_width": "0.82", + "initial_layer_line_width": "0.82", + "sparse_infill_line_width": "0.82", + "inner_wall_line_width": "0.82", + "internal_solid_infill_line_width": "0.82", + "support_line_width": "0.82", + "top_surface_line_width": "0.82", + "top_surface_pattern": "monotonic", + "gap_infill_speed": "50", + "initial_layer_infill_speed": "55", + "initial_layer_speed": "35", + "inner_wall_speed": "150", + "internal_solid_infill_speed": "150", + "outer_wall_speed": "120", + "sparse_infill_speed": "100", + "support_interface_speed": "35", + "top_surface_speed": "150", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.36 Standard @Snapmaker (0.8 nozzle).json b/resources/profiles/Snapmaker/process/0.36 Standard @Snapmaker (0.8 nozzle).json new file mode 100644 index 0000000000..97b8429378 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.36 Standard @Snapmaker (0.8 nozzle).json @@ -0,0 +1,45 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.36 Standard @Snapmaker (0.8 nozzle)", + "setting_id": "1205536673", + "inherits": "fdm_process_common", + "compatible_printers": [ + "Snapmaker A250 (0.8 nozzle)", + "Snapmaker A350 (0.8 nozzle)", + "Snapmaker A250 Dual (0.8 nozzle)", + "Snapmaker A350 Dual (0.8 nozzle)", + "Snapmaker A250 QSKit (0.8 nozzle)", + "Snapmaker A350 QSKit (0.8 nozzle)", + "Snapmaker A250 Dual QSKit (0.8 nozzle)", + "Snapmaker A350 Dual QSKit (0.8 nozzle)" + ], + "layer_height": "0.36", + "wall_loops": "2", + "top_shell_layers": "3", + "bridge_speed": "30", + "line_width": "0.82", + "outer_wall_line_width": "0.82", + "initial_layer_line_width": "0.82", + "sparse_infill_line_width": "0.82", + "inner_wall_line_width": "0.82", + "internal_solid_infill_line_width": "0.82", + "support_line_width": "0.82", + "top_surface_line_width": "0.82", + "top_surface_pattern": "monotonic", + "gap_infill_speed": "50", + "initial_layer_infill_speed": "55", + "initial_layer_speed": "35", + "inner_wall_speed": "85", + "internal_solid_infill_speed": "85", + "ironing_speed": "30", + "outer_wall_speed": "75", + "sparse_infill_speed": "100", + "support_interface_speed": "35", + "support_speed": "100", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50", + "overhang_3_4_speed": "25", + "overhang_4_4_speed": "5" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.36 Standard @Snapmaker J1 (0.8 nozzle).json b/resources/profiles/Snapmaker/process/0.36 Standard @Snapmaker J1 (0.8 nozzle).json new file mode 100644 index 0000000000..7830c7cb83 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.36 Standard @Snapmaker J1 (0.8 nozzle).json @@ -0,0 +1,37 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.36 Standard @Snapmaker J1 (0.8 nozzle)", + "setting_id": "798218413", + "inherits": "fdm_process_idex", + "compatible_printers": [ + "Snapmaker J1 (0.8 nozzle)" + ], + "layer_height": "0.36", + "wall_loops": "2", + "top_shell_layers": "3", + "bridge_speed": "30", + "line_width": "0.82", + "outer_wall_line_width": "0.82", + "initial_layer_line_width": "0.82", + "sparse_infill_line_width": "0.82", + "inner_wall_line_width": "0.82", + "internal_solid_infill_line_width": "0.82", + "support_line_width": "0.82", + "top_surface_line_width": "0.82", + "top_surface_pattern": "monotonic", + "gap_infill_speed": "50", + "initial_layer_infill_speed": "55", + "initial_layer_speed": "35", + "inner_wall_speed": "150", + "internal_solid_infill_speed": "150", + "outer_wall_speed": "120", + "sparse_infill_speed": "100", + "support_interface_speed": "35", + "top_surface_speed": "150", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50", + "overhang_3_4_speed": "25", + "overhang_4_4_speed": "5" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.38 Standard @Snapmaker (0.6 nozzle).json b/resources/profiles/Snapmaker/process/0.38 Standard @Snapmaker (0.6 nozzle).json new file mode 100644 index 0000000000..d2e7d337f3 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.38 Standard @Snapmaker (0.6 nozzle).json @@ -0,0 +1,43 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.38 Standard @Snapmaker (0.6 nozzle)", + "setting_id": "2876749174", + "inherits": "fdm_process_common", + "compatible_printers": [ + "Snapmaker A250 (0.6 nozzle)", + "Snapmaker A350 (0.6 nozzle)", + "Snapmaker A250 Dual (0.6 nozzle)", + "Snapmaker A350 Dual (0.6 nozzle)", + "Snapmaker A250 QSKit (0.6 nozzle)", + "Snapmaker A350 QSKit (0.6 nozzle)", + "Snapmaker A250 Dual QSKit (0.6 nozzle)", + "Snapmaker A350 Dual QSKit (0.6 nozzle)" + ], + "layer_height": "0.38", + "wall_loops": "2", + "top_shell_layers": "3", + "bridge_speed": "30", + "line_width": "0.82", + "outer_wall_line_width": "0.82", + "initial_layer_line_width": "0.82", + "sparse_infill_line_width": "0.82", + "inner_wall_line_width": "0.82", + "internal_solid_infill_line_width": "0.82", + "support_line_width": "0.82", + "top_surface_line_width": "0.82", + "top_surface_pattern": "monotonic", + "gap_infill_speed": "50", + "initial_layer_infill_speed": "55", + "initial_layer_speed": "35", + "inner_wall_speed": "85", + "internal_solid_infill_speed": "85", + "ironing_speed": "30", + "outer_wall_speed": "75", + "sparse_infill_speed": "100", + "support_interface_speed": "35", + "support_speed": "100", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.38 Standard @Snapmaker J1 (0.6 nozzle).json b/resources/profiles/Snapmaker/process/0.38 Standard @Snapmaker J1 (0.6 nozzle).json new file mode 100644 index 0000000000..5755a88be0 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.38 Standard @Snapmaker J1 (0.6 nozzle).json @@ -0,0 +1,35 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.38 Standard @Snapmaker J1 (0.6 nozzle)", + "setting_id": "2402668673", + "inherits": "fdm_process_idex", + "compatible_printers": [ + "Snapmaker J1 (0.6 nozzle)" + ], + "layer_height": "0.38", + "wall_loops": "2", + "top_shell_layers": "3", + "bridge_speed": "30", + "line_width": "0.82", + "outer_wall_line_width": "0.82", + "initial_layer_line_width": "0.82", + "sparse_infill_line_width": "0.82", + "inner_wall_line_width": "0.82", + "internal_solid_infill_line_width": "0.82", + "support_line_width": "0.82", + "top_surface_line_width": "0.82", + "top_surface_pattern": "monotonic", + "gap_infill_speed": "50", + "initial_layer_infill_speed": "55", + "initial_layer_speed": "35", + "inner_wall_speed": "150", + "internal_solid_infill_speed": "150", + "outer_wall_speed": "120", + "sparse_infill_speed": "100", + "support_interface_speed": "35", + "top_surface_speed": "150", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.40 Standard @Snapmaker (0.8 nozzle).json b/resources/profiles/Snapmaker/process/0.40 Standard @Snapmaker (0.8 nozzle).json new file mode 100644 index 0000000000..ea1670e0c3 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.40 Standard @Snapmaker (0.8 nozzle).json @@ -0,0 +1,44 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.40 Standard @Snapmaker (0.8 nozzle)", + "setting_id": "2678033582", + "inherits": "fdm_process_common", + "compatible_printers": [ + "Snapmaker A250 (0.8 nozzle)", + "Snapmaker A350 (0.8 nozzle)", + "Snapmaker A250 Dual (0.8 nozzle)", + "Snapmaker A350 Dual (0.8 nozzle)", + "Snapmaker A250 QSKit (0.8 nozzle)", + "Snapmaker A350 QSKit (0.8 nozzle)", + "Snapmaker A250 Dual QSKit (0.8 nozzle)", + "Snapmaker A350 Dual QSKit (0.8 nozzle)" + ], + "layer_height": "0.4", + "top_shell_layers": "3", + "bridge_speed": "30", + "line_width": "0.82", + "outer_wall_line_width": "0.82", + "initial_layer_line_width": "0.82", + "sparse_infill_line_width": "0.82", + "inner_wall_line_width": "0.82", + "internal_solid_infill_line_width": "0.82", + "support_line_width": "0.82", + "top_surface_line_width": "0.82", + "top_surface_pattern": "monotonic", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "outer_wall_speed": "75", + "inner_wall_speed": "85", + "sparse_infill_speed": "100", + "internal_solid_infill_speed": "85", + "gap_infill_speed": "50", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50", + "overhang_3_4_speed": "25", + "overhang_4_4_speed": "5", + "ironing_speed": "30", + "support_interface_speed": "35", + "support_speed": "100" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.40 Standard @Snapmaker J1 (0.8 nozzle).json b/resources/profiles/Snapmaker/process/0.40 Standard @Snapmaker J1 (0.8 nozzle).json new file mode 100644 index 0000000000..74c2ab7f8b --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.40 Standard @Snapmaker J1 (0.8 nozzle).json @@ -0,0 +1,36 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.40 Standard @Snapmaker J1 (0.8 nozzle)", + "setting_id": "2366200641", + "inherits": "fdm_process_idex", + "compatible_printers": [ + "Snapmaker J1 (0.8 nozzle)" + ], + "layer_height": "0.4", + "top_shell_layers": "3", + "bridge_speed": "30", + "line_width": "0.82", + "outer_wall_line_width": "0.82", + "initial_layer_line_width": "0.82", + "sparse_infill_line_width": "0.82", + "inner_wall_line_width": "0.82", + "internal_solid_infill_line_width": "0.82", + "support_line_width": "0.82", + "top_surface_line_width": "0.82", + "top_surface_pattern": "monotonic", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "outer_wall_speed": "120", + "inner_wall_speed": "150", + "sparse_infill_speed": "100", + "internal_solid_infill_speed": "150", + "top_surface_speed": "150", + "gap_infill_speed": "50", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50", + "overhang_3_4_speed": "25", + "overhang_4_4_speed": "5", + "support_interface_speed": "35" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.42 Draft @Snapmaker (0.6 nozzle).json b/resources/profiles/Snapmaker/process/0.42 Draft @Snapmaker (0.6 nozzle).json new file mode 100644 index 0000000000..f7da29784a --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.42 Draft @Snapmaker (0.6 nozzle).json @@ -0,0 +1,42 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.42 Draft @Snapmaker (0.6 nozzle)", + "setting_id": "886975587", + "inherits": "fdm_process_common", + "compatible_printers": [ + "Snapmaker A250 (0.6 nozzle)", + "Snapmaker A350 (0.6 nozzle)", + "Snapmaker A250 Dual (0.6 nozzle)", + "Snapmaker A350 Dual (0.6 nozzle)", + "Snapmaker A250 QSKit (0.6 nozzle)", + "Snapmaker A350 QSKit (0.6 nozzle)", + "Snapmaker A250 Dual QSKit (0.6 nozzle)", + "Snapmaker A350 Dual QSKit (0.6 nozzle)" + ], + "layer_height": "0.42", + "wall_loops": "2", + "top_shell_layers": "3", + "bridge_speed": "30", + "line_width": "0.62", + "outer_wall_line_width": "0.62", + "initial_layer_line_width": "0.62", + "sparse_infill_line_width": "0.62", + "inner_wall_line_width": "0.62", + "internal_solid_infill_line_width": "0.62", + "support_line_width": "0.62", + "top_surface_line_width": "0.62", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "outer_wall_speed": "75", + "inner_wall_speed": "85", + "sparse_infill_speed": "100", + "internal_solid_infill_speed": "85", + "gap_infill_speed": "50", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50", + "ironing_speed": "30", + "support_interface_speed": "35", + "support_speed": "100" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.42 Draft @Snapmaker J1 (0.6 nozzle).json b/resources/profiles/Snapmaker/process/0.42 Draft @Snapmaker J1 (0.6 nozzle).json new file mode 100644 index 0000000000..23abeb1ed7 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.42 Draft @Snapmaker J1 (0.6 nozzle).json @@ -0,0 +1,34 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.42 Draft @Snapmaker J1 (0.6 nozzle)", + "setting_id": "2589039514", + "inherits": "fdm_process_idex", + "compatible_printers": [ + "Snapmaker J1 (0.6 nozzle)" + ], + "layer_height": "0.42", + "wall_loops": "2", + "top_shell_layers": "3", + "bridge_speed": "30", + "line_width": "0.62", + "outer_wall_line_width": "0.62", + "initial_layer_line_width": "0.62", + "sparse_infill_line_width": "0.62", + "inner_wall_line_width": "0.62", + "internal_solid_infill_line_width": "0.62", + "support_line_width": "0.62", + "top_surface_line_width": "0.62", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "outer_wall_speed": "120", + "inner_wall_speed": "150", + "sparse_infill_speed": "100", + "internal_solid_infill_speed": "150", + "top_surface_speed": "150", + "gap_infill_speed": "50", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50", + "support_interface_speed": "35" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.48 Draft @Snapmaker (0.8 nozzle).json b/resources/profiles/Snapmaker/process/0.48 Draft @Snapmaker (0.8 nozzle).json new file mode 100644 index 0000000000..733d0bc492 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.48 Draft @Snapmaker (0.8 nozzle).json @@ -0,0 +1,46 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.48 Draft @Snapmaker (0.8 nozzle)", + "setting_id": "2532073691", + "inherits": "fdm_process_common", + "compatible_printers": [ + "Snapmaker A250 (0.8 nozzle)", + "Snapmaker A350 (0.8 nozzle)", + "Snapmaker A250 Dual (0.8 nozzle)", + "Snapmaker A350 Dual (0.8 nozzle)", + "Snapmaker A250 QSKit (0.8 nozzle)", + "Snapmaker A350 QSKit (0.8 nozzle)", + "Snapmaker A250 Dual QSKit (0.8 nozzle)", + "Snapmaker A350 Dual QSKit (0.8 nozzle)" + ], + "layer_height": "0.48", + "initial_layer_print_height": "0.4", + "wall_loops": "2", + "top_shell_layers": "3", + "bridge_speed": "30", + "line_width": "0.82", + "outer_wall_line_width": "0.82", + "initial_layer_line_width": "0.82", + "sparse_infill_line_width": "0.82", + "inner_wall_line_width": "0.82", + "internal_solid_infill_line_width": "0.82", + "support_line_width": "0.82", + "top_surface_line_width": "0.82", + "top_surface_pattern": "monotonic", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "outer_wall_speed": "75", + "inner_wall_speed": "85", + "sparse_infill_speed": "100", + "internal_solid_infill_speed": "85", + "gap_infill_speed": "50", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50", + "overhang_3_4_speed": "25", + "overhang_4_4_speed": "5", + "ironing_speed": "30", + "support_interface_speed": "35", + "support_speed": "100" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/0.48 Draft @Snapmaker J1 (0.8 nozzle).json b/resources/profiles/Snapmaker/process/0.48 Draft @Snapmaker J1 (0.8 nozzle).json new file mode 100644 index 0000000000..9282498056 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.48 Draft @Snapmaker J1 (0.8 nozzle).json @@ -0,0 +1,38 @@ +{ + "type": "process", + "from": "system", + "instantiation": "true", + "name": "0.48 Draft @Snapmaker J1 (0.8 nozzle)", + "setting_id": "3841224085", + "inherits": "fdm_process_idex", + "compatible_printers": [ + "Snapmaker J1 (0.8 nozzle)" + ], + "layer_height": "0.48", + "initial_layer_print_height": "0.4", + "wall_loops": "2", + "top_shell_layers": "3", + "bridge_speed": "30", + "line_width": "0.82", + "outer_wall_line_width": "0.82", + "initial_layer_line_width": "0.82", + "sparse_infill_line_width": "0.82", + "inner_wall_line_width": "0.82", + "internal_solid_infill_line_width": "0.82", + "support_line_width": "0.82", + "top_surface_line_width": "0.82", + "top_surface_pattern": "monotonic", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "outer_wall_speed": "120", + "inner_wall_speed": "150", + "sparse_infill_speed": "100", + "internal_solid_infill_speed": "150", + "top_surface_speed": "150", + "gap_infill_speed": "50", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50", + "overhang_3_4_speed": "25", + "overhang_4_4_speed": "5", + "support_interface_speed": "35" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/fdm_process_common.json b/resources/profiles/Snapmaker/process/fdm_process_common.json index 3e9f1c8d19..af5fba9617 100644 --- a/resources/profiles/Snapmaker/process/fdm_process_common.json +++ b/resources/profiles/Snapmaker/process/fdm_process_common.json @@ -1,106 +1,179 @@ { - "type": "process", - "name": "fdm_process_common", - "from": "system", - "instantiation": "false", - "adaptive_layer_height": "0", - "reduce_crossing_wall": "0", - "max_travel_detour_distance": "0", - "bottom_surface_pattern": "monotonic", - "bottom_shell_thickness": "0", - "bridge_speed": "50", - "brim_width": "5", - "brim_object_gap": "0.1", - "compatible_printers": [], - "compatible_printers_condition": "", - "print_sequence": "by layer", - "default_acceleration": "1000", - "initial_layer_acceleration": "500", - "top_surface_acceleration": "800", - "travel_acceleration": "1000", - "inner_wall_acceleration": "900", - "outer_wall_acceleration": "700", - "bridge_no_support": "0", - "draft_shield": "disabled", - "elefant_foot_compensation": "0", - "outer_wall_line_width": "0.4", - "wall_infill_order": "inner wall/outer wall/infill", - "line_width": "0.4", - "infill_direction": "45", - "sparse_infill_density": "15%", - "sparse_infill_pattern": "grid", - "initial_layer_line_width": "0.5", - "initial_layer_print_height": "0.2", - "infill_combination": "0", - "sparse_infill_line_width": "0.45", - "infill_wall_overlap": "25%", - "interface_shells": "0", - "ironing_flow": "10%", - "ironing_spacing": "0.15", - "ironing_speed": "30", - "ironing_type": "no ironing", - "reduce_infill_retraction": "1", - "filename_format": "{input_filename_base}_{filament_type[initial_tool]}_{print_time}.gcode", - "detect_overhang_wall": "1", - "overhang_1_4_speed": "0", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "30", - "overhang_4_4_speed": "10", - "inner_wall_line_width": "0.45", - "wall_loops": "3", - "print_settings_id": "", - "raft_layers": "0", - "seam_position": "aligned", - "skirt_distance": "2", - "skirt_height": "1", - "skirt_loops": "0", - "minimum_sparse_infill_area": "15", - "internal_solid_infill_line_width": "0.4", - "spiral_mode": "0", - "standby_temperature_delta": "-5", - "enable_support": "0", - "resolution": "0.012", - "support_type": "normal(auto)", - "support_on_build_plate_only": "0", - "support_top_z_distance": "0.2", - "support_filament": "0", - "support_line_width": "0.4", - "support_interface_loop_pattern": "0", - "support_interface_filament": "0", - "support_interface_top_layers": "2", - "support_interface_bottom_layers": "2", - "support_interface_spacing": "0.5", - "support_interface_speed": "80", - "support_base_pattern": "rectilinear", - "support_base_pattern_spacing": "2.5", - "support_speed": "150", - "support_threshold_angle": "30", - "support_object_xy_distance": "0.35", - "tree_support_branch_angle": "30", - "tree_support_wall_count": "0", - "tree_support_with_infill": "0", - "detect_thin_wall": "0", - "top_surface_pattern": "monotonic", - "top_surface_line_width": "0.4", - "top_shell_thickness": "0.8", - "enable_prime_tower": "0", - "wipe_tower_no_sparse_layers": "0", - "prime_tower_width": "60", - "xy_hole_compensation": "0", - "xy_contour_compensation": "0", - "layer_height": "0.2", - "bottom_shell_layers": "3", - "top_shell_layers": "4", - "bridge_flow": "1", - "initial_layer_speed": "45", - "initial_layer_infill_speed": "45", - "outer_wall_speed": "45", - "inner_wall_speed": "80", - "sparse_infill_speed": "150", - "internal_solid_infill_speed": "150", - "top_surface_speed": "50", - "gap_infill_speed": "30", - "travel_speed": "200", - "enable_arc_fitting": "0" - -} + "type": "process", + "from": "system", + "instantiation": "false", + "name": "fdm_process_common", + "setting_id": "2598417433", + "adaptive_layer_height": "0", + "layer_height": "0.2", + "initial_layer_print_height": "0.3", + "line_width": "0.42", + "initial_layer_line_width": "0.5", + "outer_wall_line_width": "0.42", + "inner_wall_line_width": "0.45", + "top_surface_line_width": "0.42", + "sparse_infill_line_width": "0.45", + "internal_solid_infill_line_width": "0.42", + "support_line_width": "0.42", + "seam_position": "aligned", + "seam_gap": "15%", + "role_based_wipe_speed": "1", + "wipe_speed": "80%", + "wipe_on_loops": "1", + "slice_closing_radius": "0.049", + "resolution": "0.012", + "enable_arc_fitting": "0", + "xy_hole_compensation": "0", + "xy_contour_compensation": "0", + "elefant_foot_compensation": "0.1", + "precise_outer_wall": "1", + "ironing_type": "no ironing", + "ironing_flow": "10%", + "ironing_spacing": "0.15", + "wall_generator": "arachne", + "wall_transition_angle": "10", + "wall_transition_filter_deviation": "25%", + "wall_transition_length": "100%", + "wall_distribution_count": "1", + "min_bead_width": "85%", + "min_feature_size": "25%", + "wall_infill_order": "inner wall/outer wall/infill", + "bridge_flow": "0.95", + "bridge_density": "100%", + "thick_bridges": "1", + "top_solid_infill_flow_ratio": "1", + "bottom_solid_infill_flow_ratio": "1", + "only_one_wall_top": "0", + "only_one_wall_first_layer": "0", + "detect_overhang_wall": "1", + "reduce_crossing_wall": "1", + "max_travel_detour_distance": "0", + "wipe_tower_no_sparse_layers": "0", + "draft_shield": "disabled", + "independent_support_layer_height": "1", + "interface_shells": "0", + "max_bridge_length": "10", + "print_flow_ratio": "1", + "wall_loops": "3", + "detect_thin_wall": "0", + "top_surface_pattern": "monotonicline", + "top_shell_layers": "4", + "top_shell_thickness": "0.8", + "bottom_surface_pattern": "monotonic", + "bottom_shell_layers": "3", + "bottom_shell_thickness": "0", + "sparse_infill_density": "15%", + "sparse_infill_pattern": "grid", + "filter_out_gap_fill": "0", + "infill_wall_overlap": "15%", + "infill_direction": "45", + "bridge_angle": "0", + "minimum_sparse_infill_area": "15", + "infill_combination": "0", + "detect_narrow_internal_solid_infill": "1", + "ensure_vertical_shell_thickness": "1", + "internal_bridge_support_thickness": "0.8", + "initial_layer_speed": "50", + "initial_layer_infill_speed": "50", + "initial_layer_travel_speed": "80%", + "outer_wall_speed": "70", + "inner_wall_speed": "80", + "sparse_infill_speed": "85", + "internal_solid_infill_speed": "100", + "top_surface_speed": "100", + "gap_infill_speed": "100", + "support_speed": "80", + "support_interface_speed": "50", + "ironing_speed": "50", + "enable_overhang_speed": "1", + "overhang_speed_classic": "0", + "overhang_1_4_speed": "35", + "overhang_2_4_speed": "25", + "overhang_3_4_speed": "15", + "overhang_4_4_speed": "10", + "bridge_speed": "50", + "travel_speed": "120", + "default_acceleration": "2000", + "outer_wall_acceleration": "1000", + "inner_wall_acceleration": "2000", + "bridge_acceleration": "1000", + "sparse_infill_acceleration": "2000", + "internal_solid_infill_acceleration": "2000", + "initial_layer_acceleration": "500", + "top_surface_acceleration": "1000", + "travel_acceleration": "2000", + "default_jerk": "0", + "infill_jerk": "4", + "initial_layer_jerk": "4", + "inner_wall_jerk": "4", + "outer_wall_jerk": "2", + "top_surface_jerk": "2", + "travel_jerk": "4", + "enable_support": "0", + "support_type": "normal(auto)", + "support_style": "snug", + "support_threshold_angle": "30", + "support_on_build_plate_only": "1", + "support_critical_regions_only": "1", + "raft_layers": "0", + "raft_contact_distance": "0.1", + "raft_expansion": "1.5", + "raft_first_layer_density": "90%", + "raft_first_layer_expansion": "2", + "support_filament": "0", + "support_interface_filament": "0", + "tree_support_branch_distance": "5", + "tree_support_branch_diameter": "5", + "tree_support_branch_angle": "30", + "tree_support_wall_count": "2", + "tree_support_adaptive_layer_height": "1", + "tree_support_auto_brim": "1", + "tree_support_brim_width": "3", + "tree_support_with_infill": "0", + "support_top_z_distance": "0.12", + "support_bottom_z_distance": "0.12", + "support_base_pattern": "rectilinear", + "support_base_pattern_spacing": "2.5", + "support_angle": "0", + "support_interface_top_layers": "2", + "support_interface_bottom_layers": "3", + "support_interface_pattern": "auto", + "support_interface_spacing": "0.12", + "support_bottom_interface_spacing": "0.12", + "support_interface_loop_pattern": "0", + "support_expansion": "1", + "support_object_xy_distance": "0.9", + "bridge_no_support": "1", + "skirt_loops": "0", + "skirt_distance": "2", + "skirt_height": "1", + "brim_type": "auto_brim", + "brim_width": "5", + "brim_object_gap": "0.1", + "enable_prime_tower": "1", + "prime_tower_width": "25", + "prime_volume": "7.3", + "prime_tower_brim_width": "5", + "wipe_tower_cone_angle": "40", + "flush_into_infill": "0", + "flush_into_support": "1", + "flush_into_objects": "0", + "slicing_mode": "regular", + "print_sequence": "by layer", + "spiral_mode": "0", + "fuzzy_skin": "none", + "fuzzy_skin_point_distance": "0.8", + "fuzzy_skin_thickness": "0.3", + "reduce_infill_retraction": "1", + "gcode_comments": "0", + "gcode_add_line_number": "0", + "gcode_label_objects": "0", + "filename_format": "{input_filename_base}_{layer_height}mm_{print_time}.gcode", + "post_process": "", + "enforce_support_layers": "0", + "exclude_object": "1", + "standby_temperature_delta": "-45", + "timelapse_type": "0", + "single_extruder_multi_material_priming": "0", + "gap_fill_enabled": "0" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/process/fdm_process_idex.json b/resources/profiles/Snapmaker/process/fdm_process_idex.json new file mode 100644 index 0000000000..bfaa964a0c --- /dev/null +++ b/resources/profiles/Snapmaker/process/fdm_process_idex.json @@ -0,0 +1,42 @@ +{ + "type": "process", + "from": "system", + "instantiation": "false", + "name": "fdm_process_idex", + "setting_id": "2703811679", + "inherits": "fdm_process_common", + "initial_layer_print_height": "0.2", + "enable_arc_fitting": "1", + "initial_layer_infill_speed": "75", + "outer_wall_speed": "100", + "inner_wall_speed": "250", + "sparse_infill_speed": "150", + "internal_solid_infill_speed": "180", + "gap_infill_speed": "150", + "support_speed": "100", + "ironing_speed": "30", + "travel_speed": "350", + "default_acceleration": "10000", + "outer_wall_acceleration": "5000", + "inner_wall_acceleration": "10000", + "bridge_acceleration": "2000", + "sparse_infill_acceleration": "10000", + "internal_solid_infill_acceleration": "10000", + "top_surface_acceleration": "2000", + "travel_acceleration": "12000", + "infill_jerk": "9", + "initial_layer_jerk": "9", + "inner_wall_jerk": "9", + "outer_wall_jerk": "9", + "top_surface_jerk": "9", + "travel_jerk": "10", + "support_filament": "1", + "support_interface_filament": "2", + "support_top_z_distance": "0", + "support_bottom_z_distance": "0", + "support_interface_top_layers": "3", + "support_interface_pattern": "rectilinear", + "filename_format": "{input_filename_base}_{layer_height}mm_{print_time}_J1.gcode", + "small_perimeter_threshold": "0", + "support_material_synchronize_layers": "1" +} \ No newline at end of file diff --git a/resources/profiles/Voron/Voron_250_build_plate.stl b/resources/profiles/Voron/Voron_250_build_plate.stl new file mode 100644 index 0000000000..55c3d6b36f Binary files /dev/null and b/resources/profiles/Voron/Voron_250_build_plate.stl differ diff --git a/resources/profiles/Voron/Voron_300_build_plate.stl b/resources/profiles/Voron/Voron_300_build_plate.stl new file mode 100644 index 0000000000..59f876b9e2 Binary files /dev/null and b/resources/profiles/Voron/Voron_300_build_plate.stl differ diff --git a/resources/profiles/Voron/Voron_350_build_plate.stl b/resources/profiles/Voron/Voron_350_build_plate.stl new file mode 100644 index 0000000000..d1bd3a63a2 Binary files /dev/null and b/resources/profiles/Voron/Voron_350_build_plate.stl differ diff --git a/resources/profiles/Voron/machine/Voron 2.4 250.json b/resources/profiles/Voron/machine/Voron 2.4 250.json index f6756a00cb..a0936a3a8f 100644 --- a/resources/profiles/Voron/machine/Voron 2.4 250.json +++ b/resources/profiles/Voron/machine/Voron 2.4 250.json @@ -5,7 +5,7 @@ "nozzle_diameter": "0.4;0.15;0.2;0.25;0.6;0.8;1.0", "machine_tech": "FFF", "family": "VoronDesign", - "bed_model": "", + "bed_model": "Voron_250_build_plate.stl", "bed_texture": "voron_logo.png", "hotend_model": "", "default_materials": "Voron Generic ABS;Voron Generic PLA;Voron Generic PLA-CF;Voron Generic PETG;Voron Generic TPU;Voron Generic ASA;Voron Generic PC;Voron Generic PVA;Voron Generic PA;Voron Generic PA-CF" diff --git a/resources/profiles/Voron/machine/Voron 2.4 300.json b/resources/profiles/Voron/machine/Voron 2.4 300.json index 79758b69a3..5291f7a2ff 100644 --- a/resources/profiles/Voron/machine/Voron 2.4 300.json +++ b/resources/profiles/Voron/machine/Voron 2.4 300.json @@ -5,7 +5,7 @@ "nozzle_diameter": "0.4;0.15;0.2;0.25;0.6;0.8;1.0", "machine_tech": "FFF", "family": "VoronDesign", - "bed_model": "", + "bed_model": "Voron_300_build_plate.stl", "bed_texture": "voron_logo.png", "hotend_model": "", "default_materials": "Voron Generic ABS;Voron Generic PLA;Voron Generic PLA-CF;Voron Generic PETG;Voron Generic TPU;Voron Generic ASA;Voron Generic PC;Voron Generic PVA;Voron Generic PA;Voron Generic PA-CF" diff --git a/resources/profiles/Voron/machine/Voron 2.4 350.json b/resources/profiles/Voron/machine/Voron 2.4 350.json index 5f67ea76f8..ae772b063d 100644 --- a/resources/profiles/Voron/machine/Voron 2.4 350.json +++ b/resources/profiles/Voron/machine/Voron 2.4 350.json @@ -5,7 +5,7 @@ "nozzle_diameter": "0.4;0.15;0.2;0.25;0.6;0.8;1.0", "machine_tech": "FFF", "family": "VoronDesign", - "bed_model": "", + "bed_model": "Voron_350_build_plate.stl", "bed_texture": "voron_logo.png", "hotend_model": "", "default_materials": "Voron Generic ABS;Voron Generic PLA;Voron Generic PLA-CF;Voron Generic PETG;Voron Generic TPU;Voron Generic ASA;Voron Generic PC;Voron Generic PVA;Voron Generic PA;Voron Generic PA-CF" diff --git a/resources/profiles/Voron/machine/Voron Trident 250.json b/resources/profiles/Voron/machine/Voron Trident 250.json index 83872b6c98..d3fe9e5b23 100644 --- a/resources/profiles/Voron/machine/Voron Trident 250.json +++ b/resources/profiles/Voron/machine/Voron Trident 250.json @@ -5,7 +5,7 @@ "nozzle_diameter": "0.4;0.15;0.2;0.25;0.6;0.8;1.0", "machine_tech": "FFF", "family": "VoronDesign", - "bed_model": "", + "bed_model": "Voron_250_build_plate.stl", "bed_texture": "voron_logo.png", "hotend_model": "", "default_materials": "Voron Generic ABS;Voron Generic PLA;Voron Generic PLA-CF;Voron Generic PETG;Voron Generic TPU;Voron Generic ASA;Voron Generic PC;Voron Generic PVA;Voron Generic PA;Voron Generic PA-CF" diff --git a/resources/profiles/Voron/machine/Voron Trident 300.json b/resources/profiles/Voron/machine/Voron Trident 300.json index 80e055efa1..05bb448a2a 100644 --- a/resources/profiles/Voron/machine/Voron Trident 300.json +++ b/resources/profiles/Voron/machine/Voron Trident 300.json @@ -5,7 +5,7 @@ "nozzle_diameter": "0.4;0.15;0.2;0.25;0.6;0.8;1.0", "machine_tech": "FFF", "family": "VoronDesign", - "bed_model": "", + "bed_model": "Voron_300_build_plate.stl", "bed_texture": "voron_logo.png", "hotend_model": "", "default_materials": "Voron Generic ABS;Voron Generic PLA;Voron Generic PLA-CF;Voron Generic PETG;Voron Generic TPU;Voron Generic ASA;Voron Generic PC;Voron Generic PVA;Voron Generic PA;Voron Generic PA-CF" diff --git a/resources/profiles/Voron/machine/Voron Trident 350.json b/resources/profiles/Voron/machine/Voron Trident 350.json index ebb70b8d76..850c49bb97 100644 --- a/resources/profiles/Voron/machine/Voron Trident 350.json +++ b/resources/profiles/Voron/machine/Voron Trident 350.json @@ -5,7 +5,7 @@ "nozzle_diameter": "0.4;0.15;0.2;0.25;0.6;0.8;1.0", "machine_tech": "FFF", "family": "VoronDesign", - "bed_model": "", + "bed_model": "Voron_350_build_plate.stl", "bed_texture": "voron_logo.png", "hotend_model": "", "default_materials": "Voron Generic ABS;Voron Generic PLA;Voron Generic PLA-CF;Voron Generic PETG;Voron Generic TPU;Voron Generic ASA;Voron Generic PC;Voron Generic PVA;Voron Generic PA;Voron Generic PA-CF" diff --git a/resources/web/data/text.js b/resources/web/data/text.js index bb60cb152e..87a2969a11 100644 --- a/resources/web/data/text.js +++ b/resources/web/data/text.js @@ -1,892 +1,973 @@ -var LangText={ - "en":{ - "t1":"Welcome to Orca Slicer", - "t2":"Orca Slicer will be setup in several steps. Let's start!", - "t3":"User Agreement", - "t4":"Disagree", - "t5":"Agree", - "t6":"We kindly request your help to improve
everyone's printing", - "t7":"Allow sending anonymous data", - "t8":"Back", - "t9":"Next", - "t10":"Printer Selection", - "t11":"All", - "t12":"Clear all", - "t13":"mm nozzle", - "t14":"Filament Selection", - "t15":"Printer", - "t16":"Filament type", - "t17":"Vendor", - "t18":"error", - "t19":"At least one filament must be selected.", - "t20":"Do you want to use default filament ?", - "t21":"yes", - "t22":"no", - "t23":"Release note", - "t24":"Get Started", - "t25":"Finish", - "t26":"Login", - "t27":"Register", - "t28":"Recent", - "t29":"Mall", - "t30":"Manual", - "t31":"New Project", - "t32":"Create new project", - "t33":"Open Project", - "t34":"hotspot", - "t35":"Recently opened", - "t36":"ok", - "t37":"At least one printer must be selected.", - "t38":"Cancel", - "t39":"Confirm", - "t40":"Network disconnect, please check and try again later.", - "t47":"Please select your login region", - "t48":"Asia-Pacific", - "t49":"China", - "t50":"Log out", - "t52":"Skip", - "t53":"Join", - "t54":"In the 3D Printing community, we learn from each other's successes and failures to adjust our own slicing parameters and settings. Orca Slicer follows the same principle and uses machine learning to improve its performance from the successes and failures of the vast number of prints by our users. We are training Orca Slicer to be smarter by feeding them the real-world data. If you are willing, this service will access information from your error logs and usage logs, which may include information described in ", - "t55":"Privacy Policy", - "t56":". We will not collect any Personal Data by which an individual can be identified directly or indirectly, including without limitation names, addresses, payment information, or phone numbers. By enabling this service, you agree to these terms and the statement about Privacy Policy.", - "t57":"", - "t58":"", - "t59":".", - "t60":"Europe", - "t61":"North America", - "t62":"Others", - "t63":"After changing the region, your account will be logged out. Please log in again later.", - "t64":"Bambu Network plug-in", - "t65":"Sending print job via WLAN", - "t66":"Full remote control", - "t67":"Liveview streaming", - "t68":"User data synchronization", - "t69":"Install Bambu Network plug-in", - "t70":"", - "t71":"Downloading", - "t72":"Downloading failed", - "t73":"Installation successful.", - "t74":"Restart", - "t75":"Bambu Network plug-in provides the following features:", - "t76":"Bambu Network plug-in not detected. Click ", - "t77":"here", - "t78":" to install it.", - "t79":"Failed to install plug-in. ", - "t80":"Try the following steps:", - "t81":"1, Click ", - "t82":" to open the plug-in directory", - "t83":"2, Close all open Orca Slicer", - "t84":"3, Delete all files under the plug-in directory", - "t85":"4, Reopen Orca Slicer and install the plug-in again", - "t86":"Close", - "t87":"User Manual", - "t88":"Remove", - "t89":"Open Containing Folder", - "t90":"3D Model", - "t91":"Download 3D models", - "t92":"Bambu Christmas Cabin", - "t93":"Printer Connection", - "t94":"Please set up your printer connection to view the device." - }, - "es_ES":{ - "t1":"Bienvenido a Orca Slicer", - "t2":"Va a configurar Orca Slicer mediante varios pasos. ¡Vamos a comenzar!", - "t3":"Terminos de usuario", - "t4":"Estoy en desacuerdo", - "t5":"Estoy de deacuerdo", - "t6":"Le rogamos su ayuda para mejorar
la experiencia de impresión de todos", - "t7":"Permitir enviar datos anónimos", - "t8":"Volver", - "t9":"Siguiente", - "t10":"Seleccionar impresora", - "t11":"Todo", - "t12":"Limpiar todo", - "t13":"mm de boquilla", - "t14":"Seleccionar filamento", - "t15":"Impresora", - "t16":"Tipo de filamento", - "t17":"Fabricante", - "t18":"error", - "t19":"Al menos se debe seleccionar un filamento.", - "t20":"¿Desea usar el filamento por defecto?", - "t21":"sí", - "t22":"no", - "t23":"Notas de lanzamiento", - "t24":"Comencemos", - "t25":"Finalizar", - "t26":"Ingresar", - "t27":"Registro", - "t28":"Reciente", - "t29":"Tienda", - "t30":"Manual", - "t31":"Nuevo proyecto", - "t32":"Crear nuevo proyecto", - "t33":"Abrir proyecto", - "t34":"punto de acceso", - "t35":"Abiertos recientemente", - "t36":"ok", - "t37":"Al menos se debe seleccionar una impresora.", - "t38":"Cancelar", - "t39":"Confirmar", - "t40":"Desconectado, por favor compruebe la conexión de red e inténtelo de nuevo.", - "t47":"Por favor, seleccione su región:", - "t48":"Asia-Pacífico", - "t49":"China", - "t50":"Desconectarse", - "t52":"Saltar", - "t53":"Ingresar", - "t54":"En la comunidad de impresión 3D, pordemos aprender de los logros y los fallos de otros para obtener nuestros propios parametros y configuraciones de Orca Slicer follows the same principle and uses machine learning to improve its performance from the successes and failures of the vast number of prints by our users. We are training Orca Slicer to be smarter by feeding them the real-world data. If you are willing, this service will access information from your error logs and usage logs, which may include information described in ", - "t55":"Política de privacidad", - "t56":". No recolectaremos ningún tipo de dato personal con el que se le pueda identificar directa o indirectamente, incluyendo nombre, direcciones, información de pago, o números de teléfono. Activando este servicio, si está de acuerdo en estos términos y los acuerdos sobre Política y Privacidad.", - "t57":"", - "t58":"", - "t59":".", - "t60":"Europa", - "t61":"Norte América", - "t62":"Otras", - "t63":"Después de cambiar de región, su cuenta será desconectada. por favor, vuelva a ingresar.", - "t64":"Complemento de red Bambú", - "t65":"", - "t66":"Control remoto total", - "t67":"Retransmisión en vivo", - "t68":"Sincronización de datos de usuario", - "t69":"Instalar complemento de red Bambú", - "t70":"", - "t71":"Descargando", - "t72":"Descarga fallida", - "t73":"Instalación exitosa.", - "t74":"Reiniciar", - "t75":"El complemento de red Bambú proporciona las siguientes carácteristicas:", - "t76":"Complemento de red Bambú no encontrado. Presione ", - "t77":"aquí", - "t78":" para instalarlo.", - "t79":"Fallo al instalar el complemento. ", - "t80":"Intente los siguientes pasos:", - "t81":"1, Presionar ", - "t82":" para abrir el directorio de complementos", - "t83":"2, Cerrar todos los Orca Slicer abiertos", - "t84":"3, Borrar todos los archivos en el directorio de complementos", - "t85":"4, Reabrir Orca Slicer e instalar el complemento de nuevo", - "t86":"Cerrar", - "t87":"Manual de usuario", - "t88":"Borrar", - "t89":"Abrir carpeta contenedora", - "t90":"Modelo 3D", - "t91":"Descargar modelos 3D", - "t92":"Cabina Bambú de Navidad", - "t93":"Conexión de Impresora", - "t94":"Por favor, configure la conexión de red de la impresora para encontrarla." - }, - "de_DE":{ - "t1":"Willkommen im Orca Slicer", - "t2":"Das Orca Slicer wird in mehreren Schritten eingerichtet. Lass uns anfangen!", - "t3":"Nutzervereinbarung", - "t4":"Ablehnen", - "t5":"Zustimmen", - "t6":"Wir bitten um deine Hilfe, um den Druck für alle zu verbessern", - "t7":"Anonyme Daten senden erlauben", - "t8":"Zurück", - "t9":"Weiter", - "t10":"Druckerauswahl", - "t11":"Alle", - "t12":"Keinen", - "t13":"mm Düse", - "t14":"Filamentauswahl", - "t15":"Drucker", - "t16":"Filamenttyp", - "t17":"Hersteller", - "t18":"Fehler", - "t19":"Es muss mindestens ein Filament ausgewählt sein.", - "t20":"Möchten Sie das Standard-Filament verwenden?", - "t21":"Ja", - "t22":"Nein", - "t23":"Versionshinweise", - "t24":"Loslegen", - "t25":"Fertig", - "t26":"Anmelden", - "t27":"Registrieren", - "t28":"Neueste", - "t29":"Einkaufszentrum", - "t30":"Handbuch", - "t31":"Neues Projekt", - "t32":"Neues Projekt erstellen", - "t33":"Projekt öffnen", - "t34":"Hotspot", - "t35":"Zuletzt geöffnet", - "t36":"OK", - "t37":"Es muss mindestens ein Drucker ausgewählt sein.", - "t38":"Abbrechen", - "t39":"Bestätigen", - "t40":"Netzwerkunterbrechung, bitte überprüfen und später erneut versuchen.", - "t47":"Bitte wählen Sie Ihre Login-Region aus", - "t48":"Asien-Pazifik", - "t49":"China", - "t50":"Abmelden", - "t52":"Überspringen", - "t53":"Beitreten", - "t54":"In der 3D-Druck-Community lernen wir aus den Erfolgen und Misserfolgen der anderen Benutzer, um unsere eigenen Schneideparameter und Einstellungen anzupassen. Orca Slicer folgt demselben Prinzip und verbessert seine Leistung durch die Erfolge und Misserfolge der Vielzahl von Drucken unserer Benutzer mittels maschinellem Lernen. Wir trainieren Orca Slicer, indem wir ihnen die realen Daten zuführen. Wenn Sie bereit sind, greift dieser Dienst auf Informationen aus Ihren Fehler- und Nutzungsprotokollen zu, die Informationen enthalten können, die in der ", - "t55":"Datenschutzrichtlinie", - "t56": ". Wir werden keine personenbezogenen Daten sammeln, durch die eine Person direkt oder indirekt identifiziert werden kann, einschließlich, aber nicht beschränkt auf Namen, Adressen, Zahlungsinformationen oder Telefonnummern. Durch Aktivieren dieses Dienstes stimmen Sie diesen Bedingungen und der Erklärung zur Datenschutzrichtlinie zu.", - "t57": "", - "t58": "", - "t59": ".", - "t60": "Europa", - "t61": "Nordamerika", - "t62": "Andere", - "t63": "Nach Ändern der Region wird Ihr Konto abgemeldet. Bitte melden Sie sich später erneut an.", - "t64": "Bambu Network-Plug-in", - "t65": "Senden von Druckaufträgen über WLAN", - "t66": "Vollständige Fernsteuerung", - "t67": "Live-View-Streaming", - "t68": "Synchronisierung von Benutzerdaten", - "t69": "Bambu Network-Plug-in installieren", - "t70": "", - "t71": "Herunterladen", - "t72": "Herunterladen fehlgeschlagen", - "t73": "Installation erfolgreich.", - "t74": "Neustart", - "t75": "Das Bambu Network-Plug-in bietet folgende Funktionen:", - "t76": "Das Bambu Network-Plug-in wurde nicht erkannt. Klicken Sie ", - "t77": "hier", - "t78": ", um es zu installieren.", - "t79": "Fehler beim Installieren des Plug-ins. ", - "t80": "Versuchen Sie die folgenden Schritte:", - "t81": "1, Klicken Sie auf ", - "t82": ", um das Plug-in-Verzeichnis zu öffnen", - "t83": "2, Schließen Sie alle geöffneten Orca Slicer", - "t84": "3, Löschen Sie alle Dateien im Plug-in-Verzeichnis", - "t85": "4, Öffnen Sie Orca Slicer erneut und installieren Sie das Plug-in erneut", - "t86": "Schließen", - "t87": "Benutzerhandbuch", - "t88": "Entfernen", - "t89": "Enthaltenden Ordner öffnen", - "t90": "3D-Modell", - "t91": "3D-Modelle herunterladen", - "t92": "Bambu Weihnachtshütte" - }, - "cs_CZ":{ - "t1":"Vítejte v Orca Slicer", - "t2":"Orca Slicer bude nastaven v několika krocích. Začněme!", - "t3":"Uživatelská smlouva", - "t4":"Nesouhlasím", - "t5":"Souhlasím", - "t6":"Prosíme o vaši pomoc se zlepšením všech tisků", - "t7":"Povolit odesílání anonymních dat", - "t8":"Zpět", - "t9":"Další", - "t10":"Výběr tiskárny", - "t11":"Všechny", - "t12":"Vymazat vše", - "t13":"Tryska mm", - "t14":"Výběr Filamentu", - "t15":"Tiskárna", - "t16":"Typ Filamentu", - "t17":"Dodavatel", - "t18":"Chyba", - "t19":"Musí být vybraný alespoň jeden Filament.", - "t20":"Chcete použít výchozí Filament?", - "t21":"Ano", - "t22":"Ne", - "t23":"Poznámka k vydání", - "t24":"Začínáme", - "t25":"Dokončit", - "t26":"Přihlásit", - "t27":"Registrovat", - "t28":"Poslední", - "t29":"Obchodní centrum", - "t30":"Manuální", - "t31":"Nový projekt", - "t32":"Vytvořit nový projekt", - "t33":"Otevřít projekt", - "t34":"Hotspot", - "t35":"Nedávno otevřeno", - "t36":"OK", - "t37":"Musí být vybrána alespoň jedna tiskárna.", - "t38":"Zrušit", - "t39":"Potvrdit", - "t40":"Síť je odpojena, prosím zkontrolujte a zkuste to znovu později.", - "t47":"Vyberte prosím svou oblast přihlášení", - "t48":"Asie-Pacifik", - "t49":"Čína", - "t50":"Odhlásit se", - "t52":"Přeskočit", - "t53":"Připojit se", - "t54":"V komunitě 3D tisku se ze vzájemných úspěchů a neúspěchů učíme upravovat vlastní parametry a nastavení krájení. Orca Slicer se řídí stejným principem a využívá strojové učení ke zlepšení svého výkonu na základě úspěchů a neúspěchů počet výtisků našimi uživateli. Orca Slicer školíme, aby byl chytřejší tím, že jim poskytuje data z reálného světa. Pokud budete chtít, bude tato služba přistupovat k informacím z vašich protokolů chyb a protokolů použití, které mohou zahrnovat informace popsané v ", - "t55":"Zásady ochrany osobních údajů", - "t56": ". Nebudeme shromažďovat žádné osobní údaje, pomocí kterých lze přímo nebo nepřímo identifikovat jednotlivce, včetně jmen, adres, platebních údajů nebo telefonních čísel. Povolením této služby souhlasíte s těmito podmínkami a prohlášení o zásadách ochrany osobních údajů.", - "t57": "", - "t58": "", - "t59": ".", - "t60": "Evropa", - "t61": "Severní Amerika", - "t62": "Ostatní", - "t63": "Po změně regionu bude váš účet odhlášen. Přihlaste se prosím znovu později.", - "t64": "Bambu Network plug-in", - "t65": "Odesílání tiskové úlohy přes WLAN", - "t66": "Plné dálkové ovládání", - "t67": "Streamování v přímém přenosu", - "t68": "Synchronizace uživatelských dat", - "t69": "Instalovat Bambu Network plug-in", - "t70": "", - "t71": "Stahování", - "t72": "Stahování se nezdařilo", - "t73": "Instalace úspěšná.", - "t74": "Restartovat", - "t75": "Síťový plug-in Bambu poskytuje následující funkce:", - "t76": "Síťový plug-in Bambu nebyl zjištěn. Klikněte na ", - "t77": "zde", - "t78": " k instalaci.", - "t79": "Nepodařilo se nainstalovat plugin.", - "t80": "Zkuste následující kroky:", - "t81": "1, klikněte", - "t82": "otevřete adresář plug-in", - "t83": "2, Zavřete všechny otevřené Orca Slicer", - "t84": "3, Smažte všechny soubory v adresáři plug-in", - "t85": "4, znovu otevřete Orca Slicer a znovu nainstalujte zásuvný modul", - "t86": "Zavřít", - "t87": "Uživatelská příručka", - "t88": "Odstranit", - "t89": "Otevřít složku obsahující", - "t90": "3D model", - "t91": "Stáhnout 3D modely", - "t92": "Vánoční kabina Bambu" - }, - "fr_FR":{ - "t1":"Bienvenue sur Orca Slicer", - "t2":"Orca Slicer sera configuré en plusieurs étapes. Commençons !", - "t3":"Accord d'utilisation", - "t4":"Décliner", - "t5":"Accepter", - "t6":"Nous sollicitons votre aide pour améliorer
l'impression de chacun", - "t7":"Autoriser l'envoi de données anonymes", - "t8":"Retour", - "t9":"Suivant", - "t10":"Sélection de l'imprimante", - "t11":"Tous", - "t12":"Supprimer", - "t13":"mm", - "t14":"Sélection des filaments", - "t15":"Imprimante", - "t16":"Type de filament", - "t17":"Fournisseur", - "t18":"erreur", - "t19":"Au moins un filament doit être sélectionné.", - "t20":"Voulez-vous utiliser le filament par défaut ?", - "t21":"oui", - "t22":"non", - "t23":"Note de version", - "t24":"Commencer", - "t25":"Terminer", - "t26":"Connexion", - "t27":"Inscription", - "t28":"Récent", - "t29":"Mail", - "t30":"Manuel", - "t31":"Nouveau Projet", - "t32":"Créer un nouveau projet", - "t33":"Ouvrir un Projet", - "t34":"hotspot", - "t35":"Récemment ouvert", - "t36":"ok", - "t37":"Au moins une imprimante doit être sélectionnée.", - "t38":"Annuler", - "t39":"Confirmer", - "t40":"Déconnexion du réseau, veuillez vérifier et réessayer plus tard.", - "t47":"Veuillez sélectionner votre région de connexion", - "t48":"Asie-Pacifique", - "t49":"Chine", - "t50":"Se déconnecter", - "t52":"Passer", - "t53":"Rejoindre", - "t54":"Dans la communauté de l'impression 3D, nous apprenons des succès et des échecs des uns et des autres pour ajuster nos propres paramètres et paramètres de découpage. Orca Slicer suit le même principe et utilise l'apprentissage automatique pour améliorer ses performances à partir des succès et des échecs du grand nombre d'impressions de nos utilisateurs. Nous formons Orca Slicer à être plus intelligent en leur fournissant les données du monde réel. Si vous le souhaitez, ce service accédera aux informations de vos journaux d'erreurs et de vos journaux d'utilisation, qui peuvent inclure des informations décrites dans ", - "t55":"Politique de confidentialité", - "t56":". Nous ne collecterons aucune donnée personnelle par laquelle un individu peut être identifié directement ou indirectement, y compris, sans s'y limiter, les noms, adresses, informations de paiement ou numéros de téléphone. En activant ce service, vous acceptez ces conditions et la déclaration sur la politique de confidentialité.", - "t57":"", - "t58":"", - "t59":".", - "t60":"Europe", - "t61":"Amérique du Nord", - "t62":"Autres", - "t63":"Après avoir changé de région, votre compte sera déconnecté. Veuillez vous reconnecter ensuite.", - "t64":"Plug-in Bambu Network", - "t65":"Envoi du travail d'impression via WLAN", - "t66":"Commande à distance complète", - "t67":"Diffusion en direct", - "t68":"Synchronisation des données utilisateur", - "t69":"Installer Bambu Network", - "t70":"", - "t71":"Téléchargement", - "t72":"Échec du téléchargement", - "t73":"Installation réussie.", - "t74":"Redémarrer", - "t75":"Le plug-in Bambu Network offre les fonctionnalités suivantes :", - "t76":"Le plug-in Bambu Network n'est pas détecté. Cliquez ", - "t77":"ici", - "t78":" pour l'installer.", - "t79":"Échec de l'installation du plug-in. ", - "t80":"Essayez les étapes suivantes :", - "t81":"1, Cliquez ", - "t82":" pour ouvrir le répertoire des plug-ins", - "t83":"2, Fermez toutes les fenêtres de Orca Slicer", - "t84":"3, Supprimez tous les fichiers dans le répertoire du plug-in", - "t85":"4, Relancez Orca Slicer et réinstallez le plug-in.", - "t86":"Fermer", - "t87":"Manuel d'utilisation", - "t88":"Supprimer", - "t89":"Ouvrir le dossier contenant", - "t90":"Modèle 3D", - "t91":"Télécharger des modèles 3D", - "t92":"Cabane de Noël Bambu", - "t93":"Connexion à l'imprimante", - "t94":"Veuillez configurer la connexion de votre imprimante pour afficher l'interface.", - "wk1":"Démarrage rapide", - "wk2":"Cet article présente l'utilisation la plus basique de Orca Slicer. Il guide les utilisateurs pour configurer le logiciel, créer des projets et effectuer la première tâche d'impression étape par étape.", - "wk3":"Workflow basé sur des projets", - "wk4":"Orca Slicer met en avant un workflow de pointe pour véritablement réaliser un projet « tout en un ». Basé sur le format de projet 3MF grand public, il fournit une série de nouvelles fonctionnalités révolutionnaires, telles que la prise en charge de plusieurs plaques, un gestionnaire de ressources de projet et une vue d'assemblage/de pièce. Cela améliore considérablement l'efficacité des créateurs et des utilisateurs réguliers", - "wk5":"Impression haute vitesse de qualité", - "wk6":"Il est difficile d'imprimer à grande vitesse tout en maintenant une qualité élevée. Orca Slicer rend cela possible. « Arch Move » permet à la hotend de se déplacer en douceur et réduit les vibrations de la machine. Le refroidissement intelligent est basé sur des paramètres de refroidissement affinés pour chaque type de filament. Le « ralentissement automatique » pour les paroies en porte-à-faux permet d'éviter la déformation à grande vitesse.", - "wk7":"Impression multi-couleur", - "wk8":"Orca Slicer fournit des outils de colorisation polyvalents pour créer un modèle coloré. Vous pouvez librement ajouter/supprimer des filaments dans un projet et coloriser votre modèle avec différents pinceaux. Avant l'impression, chaque filament sera automatiquement mappé sur un emplacement AMS, sans avoir besoin de modifier manuellement le placement de la bobine dans l'AMS.", - "wk9":"Guide de réglage des paramètres de découpage", - "wk10":"Les fonctionnalités de gestion des paramètres de Orca Slicer offrent un contrôle très flexible et puissant sur le processus de découpage. Cet article présente l'organisation des paramètres et fournit quelques compétences pour tirer pleinement parti de ces fonctionnalités.", - "wk11":"Contrôle et surveillance à distance", - "wk12":"Orca Slicer prend en charge l'envoi du travail d'impression à votre imprimante via le réseau WAN/LAN, contrôlant et surveillant chaque aspect de votre imprimante 3D et des travaux d'impression. Si vous avez plusieurs imprimantes, vous pouvez facilement basculer entre elles dans la liste des périphériques.", - "wk13":"Format STEP", - "wk14":"Par rapport au format STL, le format STEP apporte des informations plus efficaces. Grâce à la grande précision de ce format, de nombreuses trajectoires d'extrusion peuvent être générées sous forme d'arcs. Il inclut également la relation d'assemblage de chaque pièce d'un modèle, qui peut être utilisée pour restaurer la vue d'assemblage après la coupe d'un modèle.", - "wk15":"Texte 3D", - "wk16":"Avec l'outil Texte 3D, les utilisateurs peuvent facilement créer diverses formes de texte 3D dans le projet, ce qui rend le modèle plus personnalisé. Orca Slicer fournit des dizaines de polices et prend en charge les styles gras et italique pour donner au texte une plus grande flexibilité." - }, - "zh_CN":{ - "t1":"欢迎使用Orca Slicer", - "t2":"Orca Slicer需要几步安装步骤,让我们开始吧!", - "t3":"用户使用协议", - "t4":"拒绝", - "t5":"同意", - "t6":"帮助提升Orca Slicer性能", - "t7":"允许发送匿名数据", - "t8":"上一步", - "t9":"下一步", - "t10":"选择打印机", - "t11":"全部", - "t12":"清空", - "t13":"mm 喷嘴", - "t14":"选择材料", - "t15":"打印机", - "t16":"材料类型", - "t17":"供应商", - "t18":"错误", - "t19":"至少要选择一款材料。", - "t20":"你希望使用默认的材料列表吗?", - "t21":"是", - "t22":"否", - "t23":"发布说明", - "t24":"开始", - "t25":"结束", - "t26":"登录", - "t27":"注册", - "t28":"近期", - "t29":"商城", - "t30":"使用手册", - "t31":"新建项目", - "t32":"创建一个新项目", - "t33":"打开项目", - "t34":"热点", - "t35":"近期打开文件", - "t36":"确定", - "t37":"至少需要选择一款打印机。", - "t38":"取消", - "t39":"确定", - "t40":"网络不通,请检查并稍后重试。", - "t47":"请选择登录区域", - "t48":"亚太", - "t49":"中国", - "t50":"退出登录", - "t52":"忽略", - "t53":"同意", - "t54":"在3D打印社区,我们从彼此的成功和失败中学习调整自己的切片参数和设置。Orca Slicer遵循同样的原则,通过机器学习的方式从大量用户打印的成功和失败中获取经验,从而改善打印性能。我们正在通过向Orca Slicer提供真实世界的数据来训练他们变得更聪明。如果您愿意,此服务将访问您的错误日志和使用日志中的信息,其中可能包括", - "t55":"隐私政策", - "t56":"中描述的信息。我们不会收集任何可以直接或间接识别个人的个人数据,包括但不限于姓名、地址、支付信息或电话号码。启用此服务即表示您同意这些条款和有关隐私政策的声明。", - "t57":"", - "t58":"", - "t59":"。", - "t60":"欧洲", - "t61":"北美", - "t62":"其他", - "t63":"切换区域后,你的账号会被登出。稍后请重新登录。", - "t64":"Bambu网络插件", - "t65":"通过WLAN发送打印任务", - "t66":"强大的远程控制功能", - "t67":"实时视频流", - "t68":"用户数据同步", - "t69":"安装Bambu网络插件", - "t70":"", - "t71":"正在下载", - "t72":"下载失败", - "t73":"安装成功。", - "t74":"重启", - "t75":"Bambu网络插件提供以下功能:", - "t76":"没有发现Bambu网络插件,请", - "t77":"下载", - "t78":"并安装。", - "t79":"安装插件失败。", - "t80":"请尝试如下步骤:", - "t81":"1, 点击", - "t82":"打开插件所在目录", - "t83":"2, 关闭所有Orca Slicer", - "t84":"3, 删除插件所在目录下的所有文件", - "t85":"4, 重新启动Orca Slicer并尝试安装插件", - "t86":"关闭", - "t87":"使用引导", - "t88":"移除", - "t89":"打开所在的文件夹", - "t90":"3D 模型", - "t91":"下载3D模型", - "t92":"Bambu圣诞小屋", - "wk1":"快速入门指南", - "wk2":"本文介绍了Orca Slicer的最基本用法。它指导用户配置软件,创建项目,并逐步完成第一个打印任务。", - "wk3":"基于项目的工作流", - "wk4":"Orca Slicer提出了领先的工作流程,真正实现了“一体化”项目。基于主流的3MF项目格式,它提供了一系列革命性的新功能,如支持多盘、项目资源管理器和装配/零件视图。它可以大幅提高模型创作者及普通用户的使用效率。", - "wk5":"质量卓越的高速打印", - "wk6":"在保持高质量的前提下进行高速打印是非常具有挑战性的。Orca Slicer让这一切发生。支持“圆弧移动”特性使工具头移动更加顺滑,有效减少机器振动。基于不同材料类型的精细标定过的冷却控制参数,使得冷却过程可以自动开展。在悬垂区域进行“自动减速”,可防止高速打印时在此区域的外观瑕疵。", - "wk7":"多色打印", - "wk8":"Orca Slicer提供了多种着色工具来制作彩色模型。您可以在项目中自由添加/移除打印材料,并使用不同的笔刷为模型着色。开始打印时,打印任务中的各个材料将自动映射到匹配的AMS槽位,无需手动调整AMS中的料卷位置。", - "wk9":"切片参数设置指南", - "wk10":"Orca Slicer中的参数管理功能为切片过程提供了非常灵活和强大的控制。本文介绍了切片参数的组织分类和设置方法,并提供了一些使用技巧。", - "wk11":"远程控制和监控", - "wk12":"Orca Slicer支持通过WAN/LAN网络向打印机发送打印任务,控制和查看3D打印机和打印任务的各个方面。如果您有多台打印机,还可以在设备列表中轻松切换。", - "wk13":"STEP格式", - "wk14":"与STL相比,STEP带来了更多有效的信息。由于STEP的高精度,切片时可以生成更多的圆弧路径。STEP还包括模型每个零件的装配关系,可分割模型后恢复装配视图。", - "wk15":"3D文本", - "wk16":"使用3D文本工具,用户可以轻松地在项目中创建各种3D文本形状,使模型更加个性化。Orca Slicer提供了数十种字体,并支持粗体和斜体样式,使文本具有更大的灵活性。" - }, - "zh_TW":{ - "t1":"歡迎使用 Orca Slicer", - "t2":"Orca Slicer 需要幾步安裝步驟,讓我們開始吧!", - "t3":"使用者協議", - "t4":"拒絕", - "t5":"同意", - "t6":"幫助提升 Orca Slicer 性能", - "t7":"允許傳送匿名數據", - "t8":"上一步", - "t9":"下一步", - "t10":"選擇3D列印機", - "t11":"全部", - "t12":"清空", - "t13":"mm 噴嘴", - "t14":"選擇線材", - "t15":"3D列印機", - "t16":"線材類型", - "t17":"供應商", - "t18":"錯誤", - "t19":"至少要選擇一款線材。", - "t20":"你希望使用預設的線材列表嗎?", - "t21":"是", - "t22":"否", - "t23":"發布說明", - "t24":"開始", - "t25":"結束", - "t26":"登入", - "t27":"註冊", - "t28":"最近", - "t29":"商城", - "t30":"使用手冊", - "t31":"新建項目", - "t32":"創建一個新項目", - "t33":"打開項目", - "t34":"熱點", - "t35":"最近打開文件", - "t36":"確定", - "t37":"至少需要選擇一款3D列印機。", - "t38":"取消", - "t39":"確定", - "t40":"網路不通,請檢查並稍後重試。", - "t47":"請選擇登入區域", - "t48":"亞太", - "t49":"中國", - "t50":"登出", - "t52":"忽略", - "t53":"同意", - "t54":"在3D列印社區,我們從彼此的成功和失敗中學習調整自己的切片參數和設置。Orca Slicer 遵循同樣的原則,透過機器學習的方式從大量用戶列印的成功和失敗中獲取經驗,從而改善列印性能。我們正在通過向 Orca Slicer 提供真實世界的數據來訓練他們變得更聰明。如果您願意,此服務將訪問您的錯誤日誌和使用日誌中的資訊,其中可能包括", - "t55":"隱私政策", - "t56":"中描述的資訊。我們不會收集任何可以直接或間接識別個人的個人數據,包括但不限於姓名、地址、支付資訊或電話號碼。啟用此服務即表示您同意這些條款和有關隱私政策的聲明。", - "t57":"", - "t58":"", - "t59":"。", - "t60":"歐洲", - "t61":"北美", - "t62":"其他", - "t63":"切換區域後,你的帳號會被登出。稍後請重新登入。", - "t64":"Bambu網路插件", - "t65":"通過無線網路發送列印任務", - "t66":"強大的遠端控制功能", - "t67":"即時影片串流", - "t68":"使用者數據同步", - "t69":"安裝 Bambu網路插件", - "t70":"", - "t71":"正在下載", - "t72":"下載失敗", - "t73":"安裝成功。", - "t74":"重啟", - "t75":"Bambu網路插件提供以下功能:", - "t76":"沒有發現Bambu網路插件,請", - "t77":"下載", - "t78":"並安裝。", - "t79":"安裝插件失敗。", - "t80":"請嘗試如下步驟:", - "t81":"1, 點擊", - "t82":"打開插件所在目錄", - "t83":"2, 關閉所有 Orca Slicer", - "t84":"3, 刪除插件所在目錄下的所有文件", - "t85":"4, 重新啟動 Orca Slicer 並嘗試安裝插件", - "t86":"關閉", - "t87":"使用引導", - "t88":"移除", - "t89":"打開所在的文件夾", - "t90":"3D 模型", - "t91":"下載3D模型", - "t92":"Bambu聖誕小屋", - "wk1":"快速入門指南", - "wk2":"本文介紹了 Orca Slicer 的最基本用法。它指導用戶配置軟體,創建項目,並逐步完成第一個列印任務。", - "wk3":"基於項目的工作流", - "wk4":"Orca Slicer 提出了領先的工作流程,真正實現了“一體化”項目。基於主流的3MF項目格式,它提供了一系列革命性的新功能,如支持多盤、項目資源管理器和裝配/零件視圖。它可以大幅提高模型創作者及普通用戶的使用效率。", - "wk5":"質量卓越的高速列印", - "wk6":"在保持高品質的前提下進行高速列印是非常具有挑戰性的。Orca Slicer 讓這一切發生。支持“圓弧移動”特性使工具頭移動更加順滑,有效減少機器振動。基於不同線材類型的精細標定過的冷卻控制參數,使得冷卻過程可以自動開展。在懸垂區域進行“自動減速”,可防止高速列印時在此區域的外觀瑕疵。", - "wk7":"多色列印", - "wk8":"Orca Slicer 提供了多種著色工具來製作彩色模型。您可以在項目中自由添加/移除列印材料,並使用不同的筆刷為模型著色。開始列印時,列印任務中的各個線材將自動映射對應到 AMS 槽位,無需手動調整 AMS 中的線材位置。", - "wk9":"切片參數設置指南", - "wk10":"Orca Slicer 中的參數管理功能為切片過程提供了非常靈活和強大的控制。本文介紹了切片參數的組織分類和設置方法,並提供了一些使用技巧。", - "wk11":"遠端控制和監控", - "wk12":"Orca Slicer 支持透過無線網路/區域網路向3D列印機發送列印任務,控制和查看3D列印機和列印任務的各個方面。如果您有多台3D列印機,還可以在設備清單中輕鬆切換。", - "wk13":"STEP格式", - "wk14":"與 STL 相比,STEP 帶來了更多有效的資訊。由於 STEP 的高精度,切片時可以生成更多的圓弧路徑。STEP 還包括模型每個零件的組裝關係,可分割模型後恢復裝配視圖。", - "wk15":"3D文本", - "wk16":"使用3D文字工具,使用者可以輕鬆地在項目中建立各種3D文字形狀,使模型更加個性化。Orca Slicer 提供了數十種字體,並支援粗體和斜體樣式,使文字具有更大的靈活性。" - }, - "ru_RU": { - "t1":"Приветствуем в Orca Slicer!", - "t2":"Для настройка Orca Slicer необходимо пройти несколько этапов. Давайте начнём!", - "t3":"Пользовательское соглашение", - "t4":"Отказаться", - "t5":"Принять", - "t6":"Мы просим вашей помощи,
чтобы улучшить печать", - "t7":"Разрешить отправку анонимных данных для совершенствования программы", - "t8":"Назад", - "t9":"Далее", - "t10":"Выбор принтера", - "t11":"Все", - "t12":"Очистить всё", - "t13":"мм сопло", - "t14":"Выбор пластиковой нити", - "t15":"Принтер", - "t16":"Тип прутка", - "t17":"Производитель", - "t18":"ошибка", - "t19":"Должна быть выбрана хотя бы одна пластиковая нить.", - "t20":"Выбрать пластиковые нити по умолчанию?", - "t21":"да", - "t22":"нет", - "t23":"Информация о версии", - "t24":"Начать", - "t25":"Закончить", - "t26":"Войти", - "t27":"Регистрация", - "t28":"Недавние", - "t29":"Mall", - "t30":"Инструкции", - "t31":"Новый проект", - "t32":"Создать новый проект", - "t33":"Открыть проект", - "t34":"точка доступа", - "t35":"Недавно открытые", - "t36":"OK", - "t37":"Должен быть выбран хотя бы один принтер.", - "t38":"Отмена", - "t39":"Принять", - "t40":"Сеть отключена. Пожалуйста, проверьте подключение и попробуйте снова.", - "t47":"Пожалуйста, выберите регион входа", - "t48":"Азиатско-Тихоокеанский регион", - "t49":"Китай", - "t50":"Выйти", - "t52":"Пропустить", - "t53":"Войти", - "t54":"В сообществе 3D-печатников для выявления наилучших параметров нарезки и улучшения печати мы учимся на успехах и неудачах друг друга. Orca Slicer следует тому же принципу и использует машинное обучение для улучшения своей работы на основе успешных и неудачных печатей наших пользователей. Мы обучаем Orca Slicer быть умнее на основе реальных данных. По вашему согласию эта служба получит доступ к вашим журналам ошибок и журналам использования, в которых содержатся сведения, описанные в ", - "t55":"политике конфиденциальности", - "t56":". Мы не собираем никаких личных данных, которые могут прямо или косвенно идентифицировать отдельного человека, включая, помимо прочего, имена, адреса, платежную информацию или номера телефонов. Соглашаясь с включением данной службы, вы соглашаетесь с этими условиями и заявлением о политике конфиденциальности.", - "t57":"", - "t58":"", - "t59":".", - "t60":"Европа", - "t61":"Северная Америка", - "t62":"Другой", - "t63":"После смены региона произойдёт выход из аккаунта. Пожалуйста, войдите позже.", - "t64":"Сетевой плагин Bambu", - "t65":"Отправка задания на печать через WLAN", - "t66":"Полное дистанционное управление", - "t67":"Просмотр прямой трансляции с камеры", - "t68":"Синхронизация данных пользователя", - "t69":"Установить сетевой плагин Bambu", - "t70":"", - "t71":"Загрузка", - "t72":"Загрузка не удалась", - "t73":"Установка выполнена успешно.", - "t74":"Перезагрузка", - "t75":"Сетевой плагин Bambu предоставляет следующие возможности:", - "t76":"Сетевой плагин Bambu не обнаружен. Нажмите ", - "t77":"здесь", - "t78":" чтобы установить его.", - "t79":"Ошибка установки плагина. ", - "t80":"Попробуйте выполнить следующие действия:", - "t81":"1, Нажмите ", - "t82":" чтобы открыть папку плагинов", - "t83":"2, Закрыть все открытые Orca Slicer", - "t84":"3, Удалить все файлы в папке плагина", - "t85":"4, Откройте Orca Slicer и снова установите подключаемый модуль.", - "t86":"Закрыть", - "t87":"Инструкции", - "t88":"Удалить", - "t89":"Открыть папку с содержимым", - "t90":"3D-модель", - "t91":"Скачать 3D-модели", - "t92": "Автор", - "t93": "Модифицировано", - "t94": "Поделиться", - "t95": "Информация о модели", - "t96": "Прикреплённые файлы", - "t97": "Информация о профиле", - "t98": "Имя модели", - "t100":"Описание модели", - "t101":"Список материалов", - "t102":"Памятка по сборке", - "t103":"Прочее", - "t104":"Имя профиля", - "t105":"Профиль автора", - "t106":"Описание профиля", - "t107":"Модели в сети" - }, - "ko_KR": { - "t1": "Orca Slicer에 오신 것을 환영합니다", - "t2": "Orca Slicer는 여러 단계로 설정됩니다. 시작!", - "t3": "사용자 약관", - "t4": "거부", - "t5": "동의", - "t6": "모든 사람의 출력 품질 개선을 위해
여러분의 도움이 필요합니다.", - "t7": "익명 데이터 전송 허용", - "t8": "뒤로", - "t9": "다음", - "t10": "프린터 선택", - "t11": "전체", - "t12": "전체 해제", - "t13": "mm 노즐", - "t14": "필라멘트 선택", - "t15": "프린터", - "t16": "필라멘트 종류", - "t17": "공급업체", - "t18": "오류", - "t19": "하나 이상의 필라멘트를 선택해야 합니다.", - "t20": "기본 필라멘트를 사용하시겠습니까?", - "t21": "예", - "t22": "아니오", - "t23": "릴리스 노트", - "t24": "시작", - "t25": "완료", - "t26": "로그인", - "t27": "등록", - "t28": "최근", - "t29": "상점", - "t30": "메뉴얼", - "t31": "새 프로젝트", - "t32": "새 프로젝트 생성", - "t33": "프로젝트 열기", - "t34": "핫스팟", - "t35": "최근 사용", - "t36": "예", - "t37": "하나 이상의 프린터를 선택해야 합니다.", - "t38": "취소", - "t39": "수락", - "t40": "네트워크 연결이 끊겼습니다. 확인하고 나중에 다시 시도하세요.", - "t47": "로그인 지역을 선택해주세요", - "t48": "아시아 태평양", - "t49": "중국", - "t50": "로그 아웃", - "t52": "건너뛰기", - "t53": "가입", - "t54": "3D 프린팅 커뮤니티에서 우리는 각자의 슬라이싱 매개변수와 설정을 조정하는 과정에서 서로의 성공과 실패를 통해 배웁니다. Orca Slicer는 동일한 원칙을 따르며 기계 학습을 사용하여 사용자의 방대한 출력물의 성공과 실패를 통해 성능을 향상시킵니다. 우리는 실제 데이터를 제공하여 Orca Slicer가 더욱 똑똑해지도록 교육하고 있습니다. 귀하가 원할 경우 이 서비스는 오류 로그 및 사용 로그의 정보에 액세스합니다. 여기에는 다음에 설명된 정보가 포함될 수 있습니다.", - "t55": "개인 정보 정책", - "t56": ". 당사는 이름, 주소, 결제 정보 또는 전화번호를 포함하되 이에 국한되지 않고 개인을 직간접적으로 식별할 수 있는 개인 데이터를 수집하지 않습니다. 이 서비스를 활성화함으로써 귀하는 본 약관과 개인정보 보호정책에 대한 설명에 동의하게 됩니다.", - "t57": "", - "t58": "", - "t59": ".", - "t60": "유럽", - "t61": "북미", - "t62": "다른 지역", - "t63": "지역을 변경하면 계정이 로그아웃됩니다. 나중에 다시 로그인해 주세요.", - "t64": "Bambu 네트워크 플러그인", - "t65": "WLAN을 통해 출력 작업 보내기", - "t66": "전체 원격 제어", - "t67": "라이브뷰 스트리밍", - "t68": "사용자 데이터 동기화", - "t69": "Bambu 네트워크 플러그인 설치", - "t70": "", - "t71": "다운로드 중", - "t72": "다운로드 실패", - "t73": "설치 완료.", - "t74": "재시작", - "t75": "Bambu 네트워크 플러그인은 다음 기능을 제공합니다.", - "t76": "Bambu 네트워크 플러그인이 감지되지 않습니다. 여기를 ", - "t77": "클릭", - "t78": " 하여 설치하세요.", - "t79": "플러그인을 설치하지 못했습니다. ", - "t80": "다음 단계를 시도해 보세요:", - "t81": "1, 클릭 ", - "t82": " 하여 플러그인 디렉토리를 엽니다.", - "t83": "2, 열려 있는 모든 Orca Slicer를 닫습니다.", - "t84": "3, 플러그인 디렉터리 아래의 모든 파일 삭제합니다", - "t85": "4, Orca Slicer를 다시 열고 플러그인을 다시 설치하세요.", - "t86": "닫기", - "t87": "사용자 메뉴얼", - "t88": "제거", - "t89": "포함된 폴더 열기", - "t90": "3D 모델", - "t91": "3D 모델 다운로드", - "t92": "Bambu Christmas Cabin", - "t93": "프린터 연결", - "t94": "장치를 보려면 프린터 연결을 설정하세요." - } +var LangText = { + en: { + t1: "Welcome to Orca Slicer", + t2: "Orca Slicer will be setup in several steps. Let's start!", + t3: "User Agreement", + t4: "Disagree", + t5: "Agree", + t6: "We kindly request your help to improve
everyone's printing", + t7: "Allow sending anonymous data", + t8: "Back", + t9: "Next", + t10: "Printer Selection", + t11: "All", + t12: "Clear all", + t13: "mm nozzle", + t14: "Filament Selection", + t15: "Printer", + t16: "Filament type", + t17: "Vendor", + t18: "error", + t19: "At least one filament must be selected.", + t20: "Do you want to use default filament ?", + t21: "yes", + t22: "no", + t23: "Release note", + t24: "Get Started", + t25: "Finish", + t26: "Login", + t27: "Register", + t28: "Recent", + t29: "Mall", + t30: "Manual", + t31: "New Project", + t32: "Create new project", + t33: "Open Project", + t34: "hotspot", + t35: "Recently opened", + t36: "ok", + t37: "At least one printer must be selected.", + t38: "Cancel", + t39: "Confirm", + t40: "Network disconnect, please check and try again later.", + t47: "Please select your login region", + t48: "Asia-Pacific", + t49: "China", + t50: "Log out", + t52: "Skip", + t53: "Join", + t54: "In the 3D Printing community, we learn from each other's successes and failures to adjust our own slicing parameters and settings. Orca Slicer follows the same principle and uses machine learning to improve its performance from the successes and failures of the vast number of prints by our users. We are training Orca Slicer to be smarter by feeding them the real-world data. If you are willing, this service will access information from your error logs and usage logs, which may include information described in ", + t55: "Privacy Policy", + t56: ". We will not collect any Personal Data by which an individual can be identified directly or indirectly, including without limitation names, addresses, payment information, or phone numbers. By enabling this service, you agree to these terms and the statement about Privacy Policy.", + t57: "", + t58: "", + t59: ".", + t60: "Europe", + t61: "North America", + t62: "Others", + t63: "After changing the region, your account will be logged out. Please log in again later.", + t64: "Bambu Network plug-in", + t65: "Sending print job via WLAN", + t66: "Full remote control", + t67: "Liveview streaming", + t68: "User data synchronization", + t69: "Install Bambu Network plug-in", + t70: "", + t71: "Downloading", + t72: "Downloading failed", + t73: "Installation successful.", + t74: "Restart", + t75: "Bambu Network plug-in provides the following features:", + t76: "Bambu Network plug-in not detected. Click ", + t77: "here", + t78: " to install it.", + t79: "Failed to install plug-in. ", + t80: "Try the following steps:", + t81: "1, Click ", + t82: " to open the plug-in directory", + t83: "2, Close all open Orca Slicer", + t84: "3, Delete all files under the plug-in directory", + t85: "4, Reopen Orca Slicer and install the plug-in again", + t86: "Close", + t87: "User Manual", + t88: "Remove", + t89: "Open Containing Folder", + t90: "3D Model", + t91: "Download 3D models", + t92: "Bambu Christmas Cabin", + t93: "Printer Connection", + t94: "Please set up your printer connection to view the device.", + }, + es_ES: { + t1: "Bienvenido a Orca Slicer", + t2: "Va a configurar Orca Slicer mediante varios pasos. ¡Vamos a comenzar!", + t3: "Terminos de usuario", + t4: "Estoy en desacuerdo", + t5: "Estoy de deacuerdo", + t6: "Le rogamos su ayuda para mejorar
la experiencia de impresión de todos", + t7: "Permitir enviar datos anónimos", + t8: "Volver", + t9: "Siguiente", + t10: "Seleccionar impresora", + t11: "Todo", + t12: "Limpiar todo", + t13: "mm de boquilla", + t14: "Seleccionar filamento", + t15: "Impresora", + t16: "Tipo de filamento", + t17: "Fabricante", + t18: "error", + t19: "Al menos se debe seleccionar un filamento.", + t20: "¿Desea usar el filamento por defecto?", + t21: "sí", + t22: "no", + t23: "Notas de lanzamiento", + t24: "Comencemos", + t25: "Finalizar", + t26: "Ingresar", + t27: "Registro", + t28: "Reciente", + t29: "Tienda", + t30: "Manual", + t31: "Nuevo proyecto", + t32: "Crear nuevo proyecto", + t33: "Abrir proyecto", + t34: "punto de acceso", + t35: "Abiertos recientemente", + t36: "ok", + t37: "Al menos se debe seleccionar una impresora.", + t38: "Cancelar", + t39: "Confirmar", + t40: "Desconectado, por favor compruebe la conexión de red e inténtelo de nuevo.", + t47: "Por favor, seleccione su región:", + t48: "Asia-Pacífico", + t49: "China", + t50: "Desconectarse", + t52: "Saltar", + t53: "Ingresar", + t54: "En la comunidad de impresión 3D, pordemos aprender de los logros y los fallos de otros para obtener nuestros propios parametros y configuraciones de Orca Slicer follows the same principle and uses machine learning to improve its performance from the successes and failures of the vast number of prints by our users. We are training Orca Slicer to be smarter by feeding them the real-world data. If you are willing, this service will access information from your error logs and usage logs, which may include information described in ", + t55: "Política de privacidad", + t56: ". No recolectaremos ningún tipo de dato personal con el que se le pueda identificar directa o indirectamente, incluyendo nombre, direcciones, información de pago, o números de teléfono. Activando este servicio, si está de acuerdo en estos términos y los acuerdos sobre Política y Privacidad.", + t57: "", + t58: "", + t59: ".", + t60: "Europa", + t61: "Norte América", + t62: "Otras", + t63: "Después de cambiar de región, su cuenta será desconectada. por favor, vuelva a ingresar.", + t64: "Complemento de red Bambú", + t65: "", + t66: "Control remoto total", + t67: "Retransmisión en vivo", + t68: "Sincronización de datos de usuario", + t69: "Instalar complemento de red Bambú", + t70: "", + t71: "Descargando", + t72: "Descarga fallida", + t73: "Instalación exitosa.", + t74: "Reiniciar", + t75: "El complemento de red Bambú proporciona las siguientes carácteristicas:", + t76: "Complemento de red Bambú no encontrado. Presione ", + t77: "aquí", + t78: " para instalarlo.", + t79: "Fallo al instalar el complemento. ", + t80: "Intente los siguientes pasos:", + t81: "1, Presionar ", + t82: " para abrir el directorio de complementos", + t83: "2, Cerrar todos los Orca Slicer abiertos", + t84: "3, Borrar todos los archivos en el directorio de complementos", + t85: "4, Reabrir Orca Slicer e instalar el complemento de nuevo", + t86: "Cerrar", + t87: "Manual de usuario", + t88: "Borrar", + t89: "Abrir carpeta contenedora", + t90: "Modelo 3D", + t91: "Descargar modelos 3D", + t92: "Cabina Bambú de Navidad", + t93: "Conexión de Impresora", + t94: "Por favor, configure la conexión de red de la impresora para encontrarla.", + }, + de_DE: { + t1: "Willkommen im Orca Slicer", + t2: "Das Orca Slicer wird in mehreren Schritten eingerichtet. Lass uns anfangen!", + t3: "Nutzervereinbarung", + t4: "Ablehnen", + t5: "Zustimmen", + t6: "Wir bitten um deine Hilfe, um den Druck für alle zu verbessern", + t7: "Anonyme Daten senden erlauben", + t8: "Zurück", + t9: "Weiter", + t10: "Druckerauswahl", + t11: "Alle", + t12: "Keinen", + t13: "mm Düse", + t14: "Filamentauswahl", + t15: "Drucker", + t16: "Filamenttyp", + t17: "Hersteller", + t18: "Fehler", + t19: "Es muss mindestens ein Filament ausgewählt sein.", + t20: "Möchten Sie das Standard-Filament verwenden?", + t21: "Ja", + t22: "Nein", + t23: "Versionshinweise", + t24: "Loslegen", + t25: "Fertig", + t26: "Anmelden", + t27: "Registrieren", + t28: "Neueste", + t29: "Einkaufszentrum", + t30: "Handbuch", + t31: "Neues Projekt", + t32: "Neues Projekt erstellen", + t33: "Projekt öffnen", + t34: "Hotspot", + t35: "Zuletzt geöffnet", + t36: "OK", + t37: "Es muss mindestens ein Drucker ausgewählt sein.", + t38: "Abbrechen", + t39: "Bestätigen", + t40: "Netzwerkunterbrechung, bitte überprüfen und später erneut versuchen.", + t47: "Bitte wählen Sie Ihre Login-Region aus", + t48: "Asien-Pazifik", + t49: "China", + t50: "Abmelden", + t52: "Überspringen", + t53: "Beitreten", + t54: "In der 3D-Druck-Community lernen wir aus den Erfolgen und Misserfolgen der anderen Benutzer, um unsere eigenen Schneideparameter und Einstellungen anzupassen. Orca Slicer folgt demselben Prinzip und verbessert seine Leistung durch die Erfolge und Misserfolge der Vielzahl von Drucken unserer Benutzer mittels maschinellem Lernen. Wir trainieren Orca Slicer, indem wir ihnen die realen Daten zuführen. Wenn Sie bereit sind, greift dieser Dienst auf Informationen aus Ihren Fehler- und Nutzungsprotokollen zu, die Informationen enthalten können, die in der ", + t55: "Datenschutzrichtlinie", + t56: ". Wir werden keine personenbezogenen Daten sammeln, durch die eine Person direkt oder indirekt identifiziert werden kann, einschließlich, aber nicht beschränkt auf Namen, Adressen, Zahlungsinformationen oder Telefonnummern. Durch Aktivieren dieses Dienstes stimmen Sie diesen Bedingungen und der Erklärung zur Datenschutzrichtlinie zu.", + t57: "", + t58: "", + t59: ".", + t60: "Europa", + t61: "Nordamerika", + t62: "Andere", + t63: "Nach Ändern der Region wird Ihr Konto abgemeldet. Bitte melden Sie sich später erneut an.", + t64: "Bambu Network-Plug-in", + t65: "Senden von Druckaufträgen über WLAN", + t66: "Vollständige Fernsteuerung", + t67: "Live-View-Streaming", + t68: "Synchronisierung von Benutzerdaten", + t69: "Bambu Network-Plug-in installieren", + t70: "", + t71: "Herunterladen", + t72: "Herunterladen fehlgeschlagen", + t73: "Installation erfolgreich.", + t74: "Neustart", + t75: "Das Bambu Network-Plug-in bietet folgende Funktionen:", + t76: "Das Bambu Network-Plug-in wurde nicht erkannt. Klicken Sie ", + t77: "hier", + t78: ", um es zu installieren.", + t79: "Fehler beim Installieren des Plug-ins. ", + t80: "Versuchen Sie die folgenden Schritte:", + t81: "1, Klicken Sie auf ", + t82: ", um das Plug-in-Verzeichnis zu öffnen", + t83: "2, Schließen Sie alle geöffneten Orca Slicer", + t84: "3, Löschen Sie alle Dateien im Plug-in-Verzeichnis", + t85: "4, Öffnen Sie Orca Slicer erneut und installieren Sie das Plug-in erneut", + t86: "Schließen", + t87: "Benutzerhandbuch", + t88: "Entfernen", + t89: "Enthaltenden Ordner öffnen", + t90: "3D-Modell", + t91: "3D-Modelle herunterladen", + t92: "Bambu Weihnachtshütte", + }, + cs_CZ: { + t1: "Vítejte v Orca Slicer", + t2: "Orca Slicer bude nastaven v několika krocích. Začněme!", + t3: "Uživatelská smlouva", + t4: "Nesouhlasím", + t5: "Souhlasím", + t6: "Prosíme o vaši pomoc se zlepšením všech tisků", + t7: "Povolit odesílání anonymních dat", + t8: "Zpět", + t9: "Další", + t10: "Výběr tiskárny", + t11: "Všechny", + t12: "Vymazat vše", + t13: "Tryska mm", + t14: "Výběr Filamentu", + t15: "Tiskárna", + t16: "Typ Filamentu", + t17: "Dodavatel", + t18: "Chyba", + t19: "Musí být vybraný alespoň jeden Filament.", + t20: "Chcete použít výchozí Filament?", + t21: "Ano", + t22: "Ne", + t23: "Poznámka k vydání", + t24: "Začínáme", + t25: "Dokončit", + t26: "Přihlásit", + t27: "Registrovat", + t28: "Poslední", + t29: "Obchodní centrum", + t30: "Manuální", + t31: "Nový projekt", + t32: "Vytvořit nový projekt", + t33: "Otevřít projekt", + t34: "Hotspot", + t35: "Nedávno otevřeno", + t36: "OK", + t37: "Musí být vybrána alespoň jedna tiskárna.", + t38: "Zrušit", + t39: "Potvrdit", + t40: "Síť je odpojena, prosím zkontrolujte a zkuste to znovu později.", + t47: "Vyberte prosím svou oblast přihlášení", + t48: "Asie-Pacifik", + t49: "Čína", + t50: "Odhlásit se", + t52: "Přeskočit", + t53: "Připojit se", + t54: "V komunitě 3D tisku se ze vzájemných úspěchů a neúspěchů učíme upravovat vlastní parametry a nastavení krájení. Orca Slicer se řídí stejným principem a využívá strojové učení ke zlepšení svého výkonu na základě úspěchů a neúspěchů počet výtisků našimi uživateli. Orca Slicer školíme, aby byl chytřejší tím, že jim poskytuje data z reálného světa. Pokud budete chtít, bude tato služba přistupovat k informacím z vašich protokolů chyb a protokolů použití, které mohou zahrnovat informace popsané v ", + t55: "Zásady ochrany osobních údajů", + t56: ". Nebudeme shromažďovat žádné osobní údaje, pomocí kterých lze přímo nebo nepřímo identifikovat jednotlivce, včetně jmen, adres, platebních údajů nebo telefonních čísel. Povolením této služby souhlasíte s těmito podmínkami a prohlášení o zásadách ochrany osobních údajů.", + t57: "", + t58: "", + t59: ".", + t60: "Evropa", + t61: "Severní Amerika", + t62: "Ostatní", + t63: "Po změně regionu bude váš účet odhlášen. Přihlaste se prosím znovu později.", + t64: "Bambu Network plug-in", + t65: "Odesílání tiskové úlohy přes WLAN", + t66: "Plné dálkové ovládání", + t67: "Streamování v přímém přenosu", + t68: "Synchronizace uživatelských dat", + t69: "Instalovat Bambu Network plug-in", + t70: "", + t71: "Stahování", + t72: "Stahování se nezdařilo", + t73: "Instalace úspěšná.", + t74: "Restartovat", + t75: "Síťový plug-in Bambu poskytuje následující funkce:", + t76: "Síťový plug-in Bambu nebyl zjištěn. Klikněte na ", + t77: "zde", + t78: " k instalaci.", + t79: "Nepodařilo se nainstalovat plugin.", + t80: "Zkuste následující kroky:", + t81: "1, klikněte", + t82: "otevřete adresář plug-in", + t83: "2, Zavřete všechny otevřené Orca Slicer", + t84: "3, Smažte všechny soubory v adresáři plug-in", + t85: "4, znovu otevřete Orca Slicer a znovu nainstalujte zásuvný modul", + t86: "Zavřít", + t87: "Uživatelská příručka", + t88: "Odstranit", + t89: "Otevřít složku obsahující", + t90: "3D model", + t91: "Stáhnout 3D modely", + t92: "Vánoční kabina Bambu", + }, + fr_FR: { + t1: "Bienvenue sur Orca Slicer", + t2: "Orca Slicer sera configuré en plusieurs étapes. Commençons !", + t3: "Accord d'utilisation", + t4: "Décliner", + t5: "Accepter", + t6: "Nous sollicitons votre aide pour améliorer
l'impression de chacun", + t7: "Autoriser l'envoi de données anonymes", + t8: "Retour", + t9: "Suivant", + t10: "Sélection de l'imprimante", + t11: "Tous", + t12: "Supprimer", + t13: "mm", + t14: "Sélection des filaments", + t15: "Imprimante", + t16: "Type de filament", + t17: "Fournisseur", + t18: "erreur", + t19: "Au moins un filament doit être sélectionné.", + t20: "Voulez-vous utiliser le filament par défaut ?", + t21: "oui", + t22: "non", + t23: "Note de version", + t24: "Commencer", + t25: "Terminer", + t26: "Connexion", + t27: "Inscription", + t28: "Récent", + t29: "Mail", + t30: "Manuel", + t31: "Nouveau Projet", + t32: "Créer un nouveau projet", + t33: "Ouvrir un Projet", + t34: "hotspot", + t35: "Récemment ouvert", + t36: "ok", + t37: "Au moins une imprimante doit être sélectionnée.", + t38: "Annuler", + t39: "Confirmer", + t40: "Déconnexion du réseau, veuillez vérifier et réessayer plus tard.", + t47: "Veuillez sélectionner votre région de connexion", + t48: "Asie-Pacifique", + t49: "Chine", + t50: "Se déconnecter", + t52: "Passer", + t53: "Rejoindre", + t54: "Dans la communauté de l'impression 3D, nous apprenons des succès et des échecs des uns et des autres pour ajuster nos propres paramètres et paramètres de découpage. Orca Slicer suit le même principe et utilise l'apprentissage automatique pour améliorer ses performances à partir des succès et des échecs du grand nombre d'impressions de nos utilisateurs. Nous formons Orca Slicer à être plus intelligent en leur fournissant les données du monde réel. Si vous le souhaitez, ce service accédera aux informations de vos journaux d'erreurs et de vos journaux d'utilisation, qui peuvent inclure des informations décrites dans ", + t55: "Politique de confidentialité", + t56: ". Nous ne collecterons aucune donnée personnelle par laquelle un individu peut être identifié directement ou indirectement, y compris, sans s'y limiter, les noms, adresses, informations de paiement ou numéros de téléphone. En activant ce service, vous acceptez ces conditions et la déclaration sur la politique de confidentialité.", + t57: "", + t58: "", + t59: ".", + t60: "Europe", + t61: "Amérique du Nord", + t62: "Autres", + t63: "Après avoir changé de région, votre compte sera déconnecté. Veuillez vous reconnecter ensuite.", + t64: "Plug-in Bambu Network", + t65: "Envoi du travail d'impression via WLAN", + t66: "Commande à distance complète", + t67: "Diffusion en direct", + t68: "Synchronisation des données utilisateur", + t69: "Installer Bambu Network", + t70: "", + t71: "Téléchargement", + t72: "Échec du téléchargement", + t73: "Installation réussie.", + t74: "Redémarrer", + t75: "Le plug-in Bambu Network offre les fonctionnalités suivantes :", + t76: "Le plug-in Bambu Network n'est pas détecté. Cliquez ", + t77: "ici", + t78: " pour l'installer.", + t79: "Échec de l'installation du plug-in. ", + t80: "Essayez les étapes suivantes :", + t81: "1, Cliquez ", + t82: " pour ouvrir le répertoire des plug-ins", + t83: "2, Fermez toutes les fenêtres de Orca Slicer", + t84: "3, Supprimez tous les fichiers dans le répertoire du plug-in", + t85: "4, Relancez Orca Slicer et réinstallez le plug-in.", + t86: "Fermer", + t87: "Manuel d'utilisation", + t88: "Supprimer", + t89: "Ouvrir le dossier contenant", + t90: "Modèle 3D", + t91: "Télécharger des modèles 3D", + t92: "Cabane de Noël Bambu", + t93: "Connexion à l'imprimante", + t94: "Veuillez configurer la connexion de votre imprimante pour afficher l'interface.", + wk1: "Démarrage rapide", + wk2: "Cet article présente l'utilisation la plus basique de Orca Slicer. Il guide les utilisateurs pour configurer le logiciel, créer des projets et effectuer la première tâche d'impression étape par étape.", + wk3: "Workflow basé sur des projets", + wk4: "Orca Slicer met en avant un workflow de pointe pour véritablement réaliser un projet « tout en un ». Basé sur le format de projet 3MF grand public, il fournit une série de nouvelles fonctionnalités révolutionnaires, telles que la prise en charge de plusieurs plaques, un gestionnaire de ressources de projet et une vue d'assemblage/de pièce. Cela améliore considérablement l'efficacité des créateurs et des utilisateurs réguliers", + wk5: "Impression haute vitesse de qualité", + wk6: "Il est difficile d'imprimer à grande vitesse tout en maintenant une qualité élevée. Orca Slicer rend cela possible. « Arch Move » permet à la hotend de se déplacer en douceur et réduit les vibrations de la machine. Le refroidissement intelligent est basé sur des paramètres de refroidissement affinés pour chaque type de filament. Le « ralentissement automatique » pour les paroies en porte-à-faux permet d'éviter la déformation à grande vitesse.", + wk7: "Impression multi-couleur", + wk8: "Orca Slicer fournit des outils de colorisation polyvalents pour créer un modèle coloré. Vous pouvez librement ajouter/supprimer des filaments dans un projet et coloriser votre modèle avec différents pinceaux. Avant l'impression, chaque filament sera automatiquement mappé sur un emplacement AMS, sans avoir besoin de modifier manuellement le placement de la bobine dans l'AMS.", + wk9: "Guide de réglage des paramètres de découpage", + wk10: "Les fonctionnalités de gestion des paramètres de Orca Slicer offrent un contrôle très flexible et puissant sur le processus de découpage. Cet article présente l'organisation des paramètres et fournit quelques compétences pour tirer pleinement parti de ces fonctionnalités.", + wk11: "Contrôle et surveillance à distance", + wk12: "Orca Slicer prend en charge l'envoi du travail d'impression à votre imprimante via le réseau WAN/LAN, contrôlant et surveillant chaque aspect de votre imprimante 3D et des travaux d'impression. Si vous avez plusieurs imprimantes, vous pouvez facilement basculer entre elles dans la liste des périphériques.", + wk13: "Format STEP", + wk14: "Par rapport au format STL, le format STEP apporte des informations plus efficaces. Grâce à la grande précision de ce format, de nombreuses trajectoires d'extrusion peuvent être générées sous forme d'arcs. Il inclut également la relation d'assemblage de chaque pièce d'un modèle, qui peut être utilisée pour restaurer la vue d'assemblage après la coupe d'un modèle.", + wk15: "Texte 3D", + wk16: "Avec l'outil Texte 3D, les utilisateurs peuvent facilement créer diverses formes de texte 3D dans le projet, ce qui rend le modèle plus personnalisé. Orca Slicer fournit des dizaines de polices et prend en charge les styles gras et italique pour donner au texte une plus grande flexibilité.", + }, + zh_CN: { + t1: "欢迎使用Orca Slicer", + t2: "Orca Slicer需要几步安装步骤,让我们开始吧!", + t3: "用户使用协议", + t4: "拒绝", + t5: "同意", + t6: "帮助提升Orca Slicer性能", + t7: "允许发送匿名数据", + t8: "上一步", + t9: "下一步", + t10: "选择打印机", + t11: "全部", + t12: "清空", + t13: "mm 喷嘴", + t14: "选择材料", + t15: "打印机", + t16: "材料类型", + t17: "供应商", + t18: "错误", + t19: "至少要选择一款材料。", + t20: "你希望使用默认的材料列表吗?", + t21: "是", + t22: "否", + t23: "发布说明", + t24: "开始", + t25: "结束", + t26: "登录", + t27: "注册", + t28: "近期", + t29: "商城", + t30: "使用手册", + t31: "新建项目", + t32: "创建一个新项目", + t33: "打开项目", + t34: "热点", + t35: "近期打开文件", + t36: "确定", + t37: "至少需要选择一款打印机。", + t38: "取消", + t39: "确定", + t40: "网络不通,请检查并稍后重试。", + t47: "请选择登录区域", + t48: "亚太", + t49: "中国", + t50: "退出登录", + t52: "忽略", + t53: "同意", + t54: "在3D打印社区,我们从彼此的成功和失败中学习调整自己的切片参数和设置。Orca Slicer遵循同样的原则,通过机器学习的方式从大量用户打印的成功和失败中获取经验,从而改善打印性能。我们正在通过向Orca Slicer提供真实世界的数据来训练他们变得更聪明。如果您愿意,此服务将访问您的错误日志和使用日志中的信息,其中可能包括", + t55: "隐私政策", + t56: "中描述的信息。我们不会收集任何可以直接或间接识别个人的个人数据,包括但不限于姓名、地址、支付信息或电话号码。启用此服务即表示您同意这些条款和有关隐私政策的声明。", + t57: "", + t58: "", + t59: "。", + t60: "欧洲", + t61: "北美", + t62: "其他", + t63: "切换区域后,你的账号会被登出。稍后请重新登录。", + t64: "Bambu网络插件", + t65: "通过WLAN发送打印任务", + t66: "强大的远程控制功能", + t67: "实时视频流", + t68: "用户数据同步", + t69: "安装Bambu网络插件", + t70: "", + t71: "正在下载", + t72: "下载失败", + t73: "安装成功。", + t74: "重启", + t75: "Bambu网络插件提供以下功能:", + t76: "没有发现Bambu网络插件,请", + t77: "下载", + t78: "并安装。", + t79: "安装插件失败。", + t80: "请尝试如下步骤:", + t81: "1, 点击", + t82: "打开插件所在目录", + t83: "2, 关闭所有Orca Slicer", + t84: "3, 删除插件所在目录下的所有文件", + t85: "4, 重新启动Orca Slicer并尝试安装插件", + t86: "关闭", + t87: "使用引导", + t88: "移除", + t89: "打开所在的文件夹", + t90: "3D 模型", + t91: "下载3D模型", + t92: "Bambu圣诞小屋", + wk1: "快速入门指南", + wk2: "本文介绍了Orca Slicer的最基本用法。它指导用户配置软件,创建项目,并逐步完成第一个打印任务。", + wk3: "基于项目的工作流", + wk4: "Orca Slicer提出了领先的工作流程,真正实现了“一体化”项目。基于主流的3MF项目格式,它提供了一系列革命性的新功能,如支持多盘、项目资源管理器和装配/零件视图。它可以大幅提高模型创作者及普通用户的使用效率。", + wk5: "质量卓越的高速打印", + wk6: "在保持高质量的前提下进行高速打印是非常具有挑战性的。Orca Slicer让这一切发生。支持“圆弧移动”特性使工具头移动更加顺滑,有效减少机器振动。基于不同材料类型的精细标定过的冷却控制参数,使得冷却过程可以自动开展。在悬垂区域进行“自动减速”,可防止高速打印时在此区域的外观瑕疵。", + wk7: "多色打印", + wk8: "Orca Slicer提供了多种着色工具来制作彩色模型。您可以在项目中自由添加/移除打印材料,并使用不同的笔刷为模型着色。开始打印时,打印任务中的各个材料将自动映射到匹配的AMS槽位,无需手动调整AMS中的料卷位置。", + wk9: "切片参数设置指南", + wk10: "Orca Slicer中的参数管理功能为切片过程提供了非常灵活和强大的控制。本文介绍了切片参数的组织分类和设置方法,并提供了一些使用技巧。", + wk11: "远程控制和监控", + wk12: "Orca Slicer支持通过WAN/LAN网络向打印机发送打印任务,控制和查看3D打印机和打印任务的各个方面。如果您有多台打印机,还可以在设备列表中轻松切换。", + wk13: "STEP格式", + wk14: "与STL相比,STEP带来了更多有效的信息。由于STEP的高精度,切片时可以生成更多的圆弧路径。STEP还包括模型每个零件的装配关系,可分割模型后恢复装配视图。", + wk15: "3D文本", + wk16: "使用3D文本工具,用户可以轻松地在项目中创建各种3D文本形状,使模型更加个性化。Orca Slicer提供了数十种字体,并支持粗体和斜体样式,使文本具有更大的灵活性。", + }, + zh_TW: { + t1: "歡迎使用 Orca Slicer", + t2: "Orca Slicer 需要幾步安裝步驟,讓我們開始吧!", + t3: "使用者協議", + t4: "拒絕", + t5: "同意", + t6: "幫助提升 Orca Slicer 性能", + t7: "允許傳送匿名數據", + t8: "上一步", + t9: "下一步", + t10: "選擇3D列印機", + t11: "全部", + t12: "清空", + t13: "mm 噴嘴", + t14: "選擇線材", + t15: "3D列印機", + t16: "線材類型", + t17: "供應商", + t18: "錯誤", + t19: "至少要選擇一款線材。", + t20: "你希望使用預設的線材列表嗎?", + t21: "是", + t22: "否", + t23: "發布說明", + t24: "開始", + t25: "結束", + t26: "登入", + t27: "註冊", + t28: "最近", + t29: "商城", + t30: "使用手冊", + t31: "新建項目", + t32: "創建一個新項目", + t33: "打開項目", + t34: "熱點", + t35: "最近打開文件", + t36: "確定", + t37: "至少需要選擇一款3D列印機。", + t38: "取消", + t39: "確定", + t40: "網路不通,請檢查並稍後重試。", + t47: "請選擇登入區域", + t48: "亞太", + t49: "中國", + t50: "登出", + t52: "忽略", + t53: "同意", + t54: "在3D列印社區,我們從彼此的成功和失敗中學習調整自己的切片參數和設置。Orca Slicer 遵循同樣的原則,透過機器學習的方式從大量用戶列印的成功和失敗中獲取經驗,從而改善列印性能。我們正在通過向 Orca Slicer 提供真實世界的數據來訓練他們變得更聰明。如果您願意,此服務將訪問您的錯誤日誌和使用日誌中的資訊,其中可能包括", + t55: "隱私政策", + t56: "中描述的資訊。我們不會收集任何可以直接或間接識別個人的個人數據,包括但不限於姓名、地址、支付資訊或電話號碼。啟用此服務即表示您同意這些條款和有關隱私政策的聲明。", + t57: "", + t58: "", + t59: "。", + t60: "歐洲", + t61: "北美", + t62: "其他", + t63: "切換區域後,你的帳號會被登出。稍後請重新登入。", + t64: "Bambu網路插件", + t65: "通過無線網路發送列印任務", + t66: "強大的遠端控制功能", + t67: "即時影片串流", + t68: "使用者數據同步", + t69: "安裝 Bambu網路插件", + t70: "", + t71: "正在下載", + t72: "下載失敗", + t73: "安裝成功。", + t74: "重啟", + t75: "Bambu網路插件提供以下功能:", + t76: "沒有發現Bambu網路插件,請", + t77: "下載", + t78: "並安裝。", + t79: "安裝插件失敗。", + t80: "請嘗試如下步驟:", + t81: "1, 點擊", + t82: "打開插件所在目錄", + t83: "2, 關閉所有 Orca Slicer", + t84: "3, 刪除插件所在目錄下的所有文件", + t85: "4, 重新啟動 Orca Slicer 並嘗試安裝插件", + t86: "關閉", + t87: "使用引導", + t88: "移除", + t89: "打開所在的文件夾", + t90: "3D 模型", + t91: "下載3D模型", + t92: "Bambu聖誕小屋", + wk1: "快速入門指南", + wk2: "本文介紹了 Orca Slicer 的最基本用法。它指導用戶配置軟體,創建項目,並逐步完成第一個列印任務。", + wk3: "基於項目的工作流", + wk4: "Orca Slicer 提出了領先的工作流程,真正實現了“一體化”項目。基於主流的3MF項目格式,它提供了一系列革命性的新功能,如支持多盤、項目資源管理器和裝配/零件視圖。它可以大幅提高模型創作者及普通用戶的使用效率。", + wk5: "質量卓越的高速列印", + wk6: "在保持高品質的前提下進行高速列印是非常具有挑戰性的。Orca Slicer 讓這一切發生。支持“圓弧移動”特性使工具頭移動更加順滑,有效減少機器振動。基於不同線材類型的精細標定過的冷卻控制參數,使得冷卻過程可以自動開展。在懸垂區域進行“自動減速”,可防止高速列印時在此區域的外觀瑕疵。", + wk7: "多色列印", + wk8: "Orca Slicer 提供了多種著色工具來製作彩色模型。您可以在項目中自由添加/移除列印材料,並使用不同的筆刷為模型著色。開始列印時,列印任務中的各個線材將自動映射對應到 AMS 槽位,無需手動調整 AMS 中的線材位置。", + wk9: "切片參數設置指南", + wk10: "Orca Slicer 中的參數管理功能為切片過程提供了非常靈活和強大的控制。本文介紹了切片參數的組織分類和設置方法,並提供了一些使用技巧。", + wk11: "遠端控制和監控", + wk12: "Orca Slicer 支持透過無線網路/區域網路向3D列印機發送列印任務,控制和查看3D列印機和列印任務的各個方面。如果您有多台3D列印機,還可以在設備清單中輕鬆切換。", + wk13: "STEP格式", + wk14: "與 STL 相比,STEP 帶來了更多有效的資訊。由於 STEP 的高精度,切片時可以生成更多的圓弧路徑。STEP 還包括模型每個零件的組裝關係,可分割模型後恢復裝配視圖。", + wk15: "3D文本", + wk16: "使用3D文字工具,使用者可以輕鬆地在項目中建立各種3D文字形狀,使模型更加個性化。Orca Slicer 提供了數十種字體,並支援粗體和斜體樣式,使文字具有更大的靈活性。", + }, + ru_RU: { + t1: "Приветствуем в Orca Slicer!", + t2: "Для настройка Orca Slicer необходимо пройти несколько этапов. Давайте начнём!", + t3: "Пользовательское соглашение", + t4: "Отказаться", + t5: "Принять", + t6: "Мы просим вашей помощи,
чтобы улучшить печать", + t7: "Разрешить отправку анонимных данных для совершенствования программы", + t8: "Назад", + t9: "Далее", + t10: "Выбор принтера", + t11: "Все", + t12: "Очистить всё", + t13: "мм сопло", + t14: "Выбор пластиковой нити", + t15: "Принтер", + t16: "Тип прутка", + t17: "Производитель", + t18: "ошибка", + t19: "Должна быть выбрана хотя бы одна пластиковая нить.", + t20: "Выбрать пластиковые нити по умолчанию?", + t21: "да", + t22: "нет", + t23: "Информация о версии", + t24: "Начать", + t25: "Закончить", + t26: "Войти", + t27: "Регистрация", + t28: "Недавние", + t29: "Mall", + t30: "Инструкции", + t31: "Новый проект", + t32: "Создать новый проект", + t33: "Открыть проект", + t34: "точка доступа", + t35: "Недавно открытые", + t36: "OK", + t37: "Должен быть выбран хотя бы один принтер.", + t38: "Отмена", + t39: "Принять", + t40: "Сеть отключена. Пожалуйста, проверьте подключение и попробуйте снова.", + t47: "Пожалуйста, выберите регион входа", + t48: "Азиатско-Тихоокеанский регион", + t49: "Китай", + t50: "Выйти", + t52: "Пропустить", + t53: "Войти", + t54: "В сообществе 3D-печатников для выявления наилучших параметров нарезки и улучшения печати мы учимся на успехах и неудачах друг друга. Orca Slicer следует тому же принципу и использует машинное обучение для улучшения своей работы на основе успешных и неудачных печатей наших пользователей. Мы обучаем Orca Slicer быть умнее на основе реальных данных. По вашему согласию эта служба получит доступ к вашим журналам ошибок и журналам использования, в которых содержатся сведения, описанные в ", + t55: "политике конфиденциальности", + t56: ". Мы не собираем никаких личных данных, которые могут прямо или косвенно идентифицировать отдельного человека, включая, помимо прочего, имена, адреса, платежную информацию или номера телефонов. Соглашаясь с включением данной службы, вы соглашаетесь с этими условиями и заявлением о политике конфиденциальности.", + t57: "", + t58: "", + t59: ".", + t60: "Европа", + t61: "Северная Америка", + t62: "Другой", + t63: "После смены региона произойдёт выход из аккаунта. Пожалуйста, войдите позже.", + t64: "Сетевой плагин Bambu", + t65: "Отправка задания на печать через WLAN", + t66: "Полное дистанционное управление", + t67: "Просмотр прямой трансляции с камеры", + t68: "Синхронизация данных пользователя", + t69: "Установить сетевой плагин Bambu", + t70: "", + t71: "Загрузка", + t72: "Загрузка не удалась", + t73: "Установка выполнена успешно.", + t74: "Перезагрузка", + t75: "Сетевой плагин Bambu предоставляет следующие возможности:", + t76: "Сетевой плагин Bambu не обнаружен. Нажмите ", + t77: "здесь", + t78: " чтобы установить его.", + t79: "Ошибка установки плагина. ", + t80: "Попробуйте выполнить следующие действия:", + t81: "1, Нажмите ", + t82: " чтобы открыть папку плагинов", + t83: "2, Закрыть все открытые Orca Slicer", + t84: "3, Удалить все файлы в папке плагина", + t85: "4, Откройте Orca Slicer и снова установите подключаемый модуль.", + t86: "Закрыть", + t87: "Инструкции", + t88: "Удалить", + t89: "Открыть папку с содержимым", + t90: "3D-модель", + t91: "Скачать 3D-модели", + t92: "Автор", + t93: "Модифицировано", + t94: "Поделиться", + t95: "Информация о модели", + t96: "Прикреплённые файлы", + t97: "Информация о профиле", + t98: "Имя модели", + t100: "Описание модели", + t101: "Список материалов", + t102: "Памятка по сборке", + t103: "Прочее", + t104: "Имя профиля", + t105: "Профиль автора", + t106: "Описание профиля", + t107: "Модели в сети", + }, + ko_KR: { + t1: "Orca Slicer에 오신 것을 환영합니다", + t2: "Orca Slicer는 여러 단계로 설정됩니다. 시작!", + t3: "사용자 약관", + t4: "거부", + t5: "동의", + t6: "모든 사람의 출력 품질 개선을 위해
여러분의 도움이 필요합니다.", + t7: "익명 데이터 전송 허용", + t8: "뒤로", + t9: "다음", + t10: "프린터 선택", + t11: "전체", + t12: "전체 해제", + t13: "mm 노즐", + t14: "필라멘트 선택", + t15: "프린터", + t16: "필라멘트 종류", + t17: "공급업체", + t18: "오류", + t19: "하나 이상의 필라멘트를 선택해야 합니다.", + t20: "기본 필라멘트를 사용하시겠습니까?", + t21: "예", + t22: "아니오", + t23: "릴리스 노트", + t24: "시작", + t25: "완료", + t26: "로그인", + t27: "등록", + t28: "최근", + t29: "상점", + t30: "메뉴얼", + t31: "새 프로젝트", + t32: "새 프로젝트 생성", + t33: "프로젝트 열기", + t34: "핫스팟", + t35: "최근 사용", + t36: "예", + t37: "하나 이상의 프린터를 선택해야 합니다.", + t38: "취소", + t39: "수락", + t40: "네트워크 연결이 끊겼습니다. 확인하고 나중에 다시 시도하세요.", + t47: "로그인 지역을 선택해주세요", + t48: "아시아 태평양", + t49: "중국", + t50: "로그 아웃", + t52: "건너뛰기", + t53: "가입", + t54: "3D 프린팅 커뮤니티에서 우리는 각자의 슬라이싱 매개변수와 설정을 조정하는 과정에서 서로의 성공과 실패를 통해 배웁니다. Orca Slicer는 동일한 원칙을 따르며 기계 학습을 사용하여 사용자의 방대한 출력물의 성공과 실패를 통해 성능을 향상시킵니다. 우리는 실제 데이터를 제공하여 Orca Slicer가 더욱 똑똑해지도록 교육하고 있습니다. 귀하가 원할 경우 이 서비스는 오류 로그 및 사용 로그의 정보에 액세스합니다. 여기에는 다음에 설명된 정보가 포함될 수 있습니다.", + t55: "개인 정보 정책", + t56: ". 당사는 이름, 주소, 결제 정보 또는 전화번호를 포함하되 이에 국한되지 않고 개인을 직간접적으로 식별할 수 있는 개인 데이터를 수집하지 않습니다. 이 서비스를 활성화함으로써 귀하는 본 약관과 개인정보 보호정책에 대한 설명에 동의하게 됩니다.", + t57: "", + t58: "", + t59: ".", + t60: "유럽", + t61: "북미", + t62: "다른 지역", + t63: "지역을 변경하면 계정이 로그아웃됩니다. 나중에 다시 로그인해 주세요.", + t64: "Bambu 네트워크 플러그인", + t65: "WLAN을 통해 출력 작업 보내기", + t66: "전체 원격 제어", + t67: "라이브뷰 스트리밍", + t68: "사용자 데이터 동기화", + t69: "Bambu 네트워크 플러그인 설치", + t70: "", + t71: "다운로드 중", + t72: "다운로드 실패", + t73: "설치 완료.", + t74: "재시작", + t75: "Bambu 네트워크 플러그인은 다음 기능을 제공합니다.", + t76: "Bambu 네트워크 플러그인이 감지되지 않습니다. 여기를 ", + t77: "클릭", + t78: " 하여 설치하세요.", + t79: "플러그인을 설치하지 못했습니다. ", + t80: "다음 단계를 시도해 보세요:", + t81: "1, 클릭 ", + t82: " 하여 플러그인 디렉토리를 엽니다.", + t83: "2, 열려 있는 모든 Orca Slicer를 닫습니다.", + t84: "3, 플러그인 디렉터리 아래의 모든 파일 삭제합니다", + t85: "4, Orca Slicer를 다시 열고 플러그인을 다시 설치하세요.", + t86: "닫기", + t87: "사용자 메뉴얼", + t88: "제거", + t89: "포함된 폴더 열기", + t90: "3D 모델", + t91: "3D 모델 다운로드", + t92: "Bambu Christmas Cabin", + t93: "프린터 연결", + t94: "장치를 보려면 프린터 연결을 설정하세요.", + }, + tr_TR: { + t1: "Orca Slicer'a hoş geldiniz", + t2: "Orca Dilimleyici birkaç adımda kurulacaktır. Hadi başlayalım!", + t3: "Kullanıcı Sözleşmesi", + t4: "Reddet", + t5: "Onayla", + t6: "Herkesin yazdırma işini iyileştirmek için
yardımınızı rica ediyoruz", + t7: "Anonim verilerin gönderilmesine izin ver", + t8: "Geri", + t9: "İleri", + t10: "Yazıcı Seçimi", + t11: "Hepsi", + t12: "Hepsini temizle", + t13: "mm nozul", + t14: "Filament Seçimi", + t15: "Yazıcı", + t16: "Filament türü", + t17: "Üretici", + t18: "Hata", + t19: "En az bir filament seçilmelidir.", + t20: "Varsayılan filamenti kullanmak ister misiniz ?", + t21: "Evet", + t22: "Hayır", + t23: "Sürüm notu", + t24: "Başla", + t25: "Bitir", + t26: "Giriş Yap", + t27: "Kayıt Ol", + t28: "Son", + t29: "Mağaza", + t30: "Manual", + t31: "Yeni proje", + t32: "Yeni proje oluştur", + t33: "Projeyi Aç", + t34: "Erişim noktası", + t35: "Yakın zamanda açıldı", + t36: "Ok", + t37: "En az bir yazıcı seçilmelidir.", + t38: "İptal Et", + t39: "Onayla", + t40: "Ağ bağlantısı kesildi, lütfen kontrol edin ve daha sonra tekrar deneyin.", + t47: "Lütfen giriş bölgenizi seçin", + t48: "Asya-Pasifik", + t49: "Çin", + t50: "Çıkış Yap", + t52: "Atla", + t53: "Katıl", + t54: "3D Baskı topluluğunda, kendi dilimleme parametrelerimizi ve ayarlarımızı düzenlerken birbirimizin başarılarından ve başarısızlıklarından öğreniyoruz. Orca Slicer da aynı prensibi takip ediyor ve kullanıcılarımızın yaptığı çok sayıda baskının başarı ve başarısızlıklarından performansını artırmak için makine öğrenimini kullanıyor. Orca Slicer'ı gerçek dünya verileriyle besleyerek daha akıllı olması için eğitiyoruz. İsterseniz bu hizmet, hata günlüklerinizden ve kullanım günlüklerinizden, burada açıklanan bilgileri de içerebilecek bilgilere erişecektir. ", + t55: "Gizlilik Politikası", + t56: ". İsimler, adresler, ödeme bilgileri veya telefon numaraları dahil ancak bunlarla sınırlı olmamak üzere, bir bireyin doğrudan veya dolaylı olarak tanımlanmasını sağlayacak hiçbir Kişisel Veri toplamayacağız. Bu hizmeti etkinleştirerek bu şartları ve Gizlilik Politikasına ilişkin beyanı kabul etmiş olursunuz.", + t57: "", + t58: "", + t59: ".", + t60: "Avrupa", + t61: "Kuzey Amerika", + t62: "Diğerleri", + t63: "Bölgeyi değiştirdikten sonra hesabınızdan çıkış yapılacaktır. Lütfen daha sonra tekrar giriş yapın.", + t64: "Bambu Ağı eklentisi", + t65: "Yazdırma işi WLAN aracılığıyla gönderiliyor", + t66: "Tam uzaktan kontrol", + t67: "Canlı görüntü akışı", + t68: "Kullanıcı veri senkronizasyonu", + t69: "Bambu Ağı eklentisini yükleyin", + t70: "", + t71: "İndiriliyor", + t72: "İndirme başarısız oldu", + t73: "Kurulum başarılı oldu.", + t74: "Tekrar başlat", + t75: "Bambu Network eklentisi aşağıdaki özellikleri sağlar:", + t76: "Bambu Ağı eklentisi algılanmadı. Yüklemek ", + t77: "için ", + t78: " burayı tıklayın.", + t79: "Eklenti yüklenemedi. ", + t80: "Aşağıdaki adımları deneyin:", + t81: "1, Eklenti ", + t82: " dizinini açmak için tıklayın", + t83: "2, Tüm açık Orca slicerı kapatın", + t84: "3, Eklenti dizini altındaki tüm dosyaları silin", + t85: "4, Orca Slicer'ı yeniden açın ve eklentiyi tekrar yükleyin", + t86: "Kapat", + t87: "Kullanım kılavuzu", + t88: "Kaldır", + t89: "Dosyayı içeren klasörü açınız", + t90: "3D Model", + t91: "3D modelleri indirin", + t92: "Bambu Noel Kabini", + t93: "Yazıcı Bağlantısı", + t94: "Cihazı görüntülemek için lütfen yazıcı bağlantınızı kurun.", + }, }; +var LANG_COOKIE_NAME = "BambuWebLang"; +var LANG_COOKIE_EXPIRESECOND = 365 * 86400; -var LANG_COOKIE_NAME="BambuWebLang"; -var LANG_COOKIE_EXPIRESECOND= 365*86400; +function TranslatePage() { + let strLang = GetQueryString("lang"); + if (strLang != null) { + //setCookie(LANG_COOKIE_NAME,strLang,LANG_COOKIE_EXPIRESECOND,'/'); + localStorage.setItem(LANG_COOKIE_NAME, strLang); + } else { + //strLang=getCookie(LANG_COOKIE_NAME); + strLang = localStorage.getItem(LANG_COOKIE_NAME); + } -function TranslatePage() -{ - let strLang=GetQueryString("lang"); - if(strLang!=null) - { - //setCookie(LANG_COOKIE_NAME,strLang,LANG_COOKIE_EXPIRESECOND,'/'); - localStorage.setItem(LANG_COOKIE_NAME,strLang); - } - else - { - //strLang=getCookie(LANG_COOKIE_NAME); - strLang=localStorage.getItem(LANG_COOKIE_NAME); - } - - //alert(strLang); - - if( !LangText.hasOwnProperty(strLang) ) - strLang="en"; - - let AllNode=$(".trans"); - let nTotal=AllNode.length; - for(let n=0;n \ No newline at end of file + \ No newline at end of file diff --git a/src/OrcaSlicer.cpp b/src/OrcaSlicer.cpp index 4cdc9a15cc..81ad60d418 100644 --- a/src/OrcaSlicer.cpp +++ b/src/OrcaSlicer.cpp @@ -1032,7 +1032,7 @@ int CLI::run(int argc, char **argv) Semver file_version; std::map orients_requirement; std::vector project_presets; - std::string new_printer_name, current_printer_name, new_process_name, current_process_name, current_printer_system_name, current_process_system_name, new_process_system_name, new_printer_system_name, printer_model_id;//, printer_inherits, print_inherits; + std::string new_printer_name, current_printer_name, new_process_name, current_process_name, current_printer_system_name, current_process_system_name, new_process_system_name, new_printer_system_name, printer_model_id, printer_model;//, printer_inherits, print_inherits; std::vector upward_compatible_printers, new_print_compatible_printers, current_print_compatible_printers, current_different_settings; std::vector current_filaments_name, current_filaments_system_name, current_inherits_group; DynamicPrintConfig load_process_config, load_machine_config; @@ -1563,7 +1563,7 @@ int CLI::run(int argc, char **argv) config.set("printer_settings_id", new_printer_name, true); //get printer_model_id - std::string printer_model = config.option("printer_model", true)->value; + printer_model = config.option("printer_model", true)->value; if (!printer_model.empty()) { std::string printer_model_path = resources_dir() + "/profiles/BBL/machine_full/"+printer_model+".json"; if (boost::filesystem::exists(printer_model_path)) @@ -1728,7 +1728,7 @@ int CLI::run(int argc, char **argv) if (is_bbl_3mf && (load_filament_count > 0) && (load_filaments_set.size() == 1)) { disable_wipe_tower_after_mapping = true; - BOOST_LOG_TRIVIAL(warning) << boost::format("map all the filaments to the same one, load_filament_count %1%")%load_filament_count; + BOOST_LOG_TRIVIAL(info) << boost::format("map all the filaments to the same one, load_filament_count %1%")%load_filament_count; } //load system config if needed @@ -1758,7 +1758,7 @@ int CLI::run(int argc, char **argv) config.set("printer_settings_id", config_name, true); //get printer_model_id - std::string printer_model = config.option("printer_model", true)->value; + printer_model = config.option("printer_model", true)->value; if (!printer_model.empty()) { std::string printer_model_path = resources_dir() + "/profiles/BBL/machine_full/"+printer_model+".json"; if (boost::filesystem::exists(printer_model_path)) @@ -1839,7 +1839,7 @@ int CLI::run(int argc, char **argv) config.set("printer_settings_id", config_name, true); //get printer_model_id - std::string printer_model = config.option("printer_model", true)->value; + printer_model = config.option("printer_model", true)->value; if (!printer_model.empty()) { std::string printer_model_path = resources_dir() + "/profiles/BBL/machine_full/"+printer_model+".json"; if (boost::filesystem::exists(printer_model_path)) @@ -2238,6 +2238,70 @@ int CLI::run(int argc, char **argv) else { ret = update_full_config(m_print_config, load_machine_config, different_keys_set, true); BOOST_LOG_TRIVIAL(info) << boost::format("load a new printer, update all the keys, different_settings: %1%")%different_settings[filament_count+1]; + if (new_printer_name != current_printer_name) + { + //printer safe check + BOOST_LOG_TRIVIAL(info) << boost::format("check printer cli safe params, current_printer_name %1%, new_printer_name %2%, printer_model %3%")%current_printer_name %new_printer_name %printer_model; + std::map printer_params; + std::string cli_config_file = resources_dir() + "/profiles/BBL/cli_config.json"; + boost::filesystem::path directory_path(cli_config_file); + + BOOST_LOG_TRIVIAL(info) << boost::format("line %1% , will parse file %2%")%__LINE__ % cli_config_file; + if (!fs::exists(directory_path)) { + BOOST_LOG_TRIVIAL(warning) << boost::format("file %1% not exist.")%cli_config_file; + } + else { + try { + json root_json; + boost::nowide::ifstream ifs(cli_config_file); + ifs >> root_json; + ifs.close(); + + if (root_json.contains("printer")) { + json printer_json = root_json["printer"]; + if (!printer_model.empty() && printer_json.contains(printer_model)) { + json new_printer_json = printer_json[printer_model]; + printer_params = new_printer_json.get>(); + + for (auto param_iter = printer_params.begin(); param_iter != printer_params.end(); param_iter++) + { + std::string key = param_iter->first; + //replace "cli_safe" with "machine_max" + key.replace(0, 8, "machine_max"); + + ConfigOptionFloats* option = m_print_config.option(key); + if (option) { + //de-serialize the values from param_iter->second, and do the compare here + unsigned int array_count = option->size(); + ConfigOptionFloats new_option; + new_option.deserialize(param_iter->second); + unsigned int new_array_count = new_option.size(); + for (unsigned int index = 0; index < array_count; index++) + { + if ((index < new_array_count) && new_option.values[index] != 0.f && (new_option.values[index] < option->values[index])) + { + BOOST_LOG_TRIVIAL(info) << boost::format("set key %1% index %2%, from %3% to %4%") % key %index %option->values[index] % new_option.values[index]; + option->values[index] = new_option.values[index]; + } + } + } + else + BOOST_LOG_TRIVIAL(warning) << boost::format("can not find key %1% in config") %key; + } + } + else { + BOOST_LOG_TRIVIAL(info) << boost::format("can not find key %1% in the file")%printer_model; + } + } + else { + BOOST_LOG_TRIVIAL(warning) << boost::format("can not find key printer in the file"); + } + } + catch (std::exception &err) { + BOOST_LOG_TRIVIAL(error) << __FUNCTION__<< ": parse file "< filament_color_set; + for (unsigned int color_index = 0; color_index 1) { + disable_wipe_tower_after_mapping = false; + BOOST_LOG_TRIVIAL(info) << boost::format("different filament colours, switch disable_wipe_tower_after_mapping back to false"); + } + else { + BOOST_LOG_TRIVIAL(warning) << boost::format("only %1% filament colour, finally set disable_wipe_tower_after_mapping to true")%filament_color_set.size(); + } + + } } std::vector &project_filament_colors = project_filament_colors_option->values; @@ -2696,7 +2782,8 @@ int CLI::run(int argc, char **argv) if ((old_printable_width > 0)&&(old_printable_depth > 0)&&(old_printable_height > 0)) { //check the printable size logic - if ((old_printable_width > current_printable_width) || (old_printable_depth > current_printable_depth) || (old_printable_height > current_printable_height)) + //if ((old_printable_width > current_printable_width) || (old_printable_depth > current_printable_depth) || (old_printable_height > current_printable_height)) + if ((old_printable_width > current_printable_width) || (old_printable_depth > current_printable_depth)) { BOOST_LOG_TRIVIAL(error) << boost::format("old printable size {%1%, %2%, %3%} is larger than new printable size {%4%, %5%, %6%}, can not print") %old_printable_width %old_printable_depth %old_printable_height %current_printable_width %current_printable_depth %current_printable_height; @@ -3307,6 +3394,13 @@ int CLI::run(int argc, char **argv) x = I3_WIPE_TOWER_DEFAULT_X_POS; y = I3_WIPE_TOWER_DEFAULT_Y_POS; } + if (x < WIPE_TOWER_MARGIN) { + x = WIPE_TOWER_MARGIN; + } + if (y < WIPE_TOWER_MARGIN) { + y = WIPE_TOWER_MARGIN; + } + ConfigOptionFloat wt_x_opt(x); ConfigOptionFloat wt_y_opt(y); @@ -3534,6 +3628,13 @@ int CLI::run(int argc, char **argv) x = I3_WIPE_TOWER_DEFAULT_X_POS; y = I3_WIPE_TOWER_DEFAULT_Y_POS; } + + if (x < WIPE_TOWER_MARGIN) { + x = WIPE_TOWER_MARGIN; + } + if (y < WIPE_TOWER_MARGIN) { + y = WIPE_TOWER_MARGIN; + } ConfigOptionFloat wt_x_opt(x); ConfigOptionFloat wt_y_opt(y); @@ -3604,8 +3705,22 @@ int CLI::run(int argc, char **argv) } if (m_print_config.has("wipe_tower_x") && (is_smooth_timelapse || !arrange_cfg.is_seq_print || (selected.size() <= 1))) { - float x = dynamic_cast(m_print_config.option("wipe_tower_x"))->get_at(plate_to_slice-1); - float y = dynamic_cast(m_print_config.option("wipe_tower_y"))->get_at(plate_to_slice-1); + float x; + float y; + if (duplicate_count > 0) { + auto printer_structure_opt = m_print_config.option>("printer_structure"); + x = WIPE_TOWER_DEFAULT_X_POS; + y = WIPE_TOWER_DEFAULT_Y_POS; + if (printer_structure_opt && printer_structure_opt->value == PrinterStructure::psI3) { + x = I3_WIPE_TOWER_DEFAULT_X_POS; + y = I3_WIPE_TOWER_DEFAULT_Y_POS; + } + } + else { + //keep the original + x = dynamic_cast(m_print_config.option("wipe_tower_x"))->get_at(plate_to_slice-1); + y = dynamic_cast(m_print_config.option("wipe_tower_y"))->get_at(plate_to_slice-1); + } float w = dynamic_cast(m_print_config.option("prime_tower_width"))->value; float a = dynamic_cast(m_print_config.option("wipe_tower_rotation_angle"))->value; float v = dynamic_cast(m_print_config.option("prime_volume"))->value; @@ -3654,6 +3769,20 @@ int CLI::run(int argc, char **argv) x = (float)plate_width - w - margin - wp_brim_width; BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format("arrange wipe_tower: exceeds the border, change x to %1%, plate_width=%2%")%y %plate_width; } + if (x < margin) { + x = margin; + } + if (y < margin) { + y = margin; + } + //update wipe_tower_x and wipe_tower_y + ConfigOptionFloat wt_x_opt(x); + ConfigOptionFloat wt_y_opt(y); + ConfigOptionFloats* wipe_x_option = m_print_config.option("wipe_tower_x", true); + ConfigOptionFloats* wipe_y_option = m_print_config.option("wipe_tower_y", true); + + wipe_x_option->set_at(&wt_x_opt, plate_to_slice-1, 0); + wipe_y_option->set_at(&wt_y_opt, plate_to_slice-1, 0); ArrangePolygon wipe_tower_ap; @@ -5489,15 +5618,8 @@ extern "C" { SET_DEFULTER_HANDLER(); #endif std::set_new_handler([]() { - int smallSize = 10 * 1024 * 1024; - int *test_apply = (int *) malloc(smallSize); - if (test_apply == NULL) { - throw std::bad_alloc(); - } else { - free(test_apply); - int *a = nullptr; - *a = 0; - } + int *a = nullptr; + *a = 0; }); // Call the UTF8 main. return CLI().run(argc, argv_ptrs.data()); diff --git a/src/imgui/CMakeLists.txt b/src/imgui/CMakeLists.txt index 2db32b306a..da31d76958 100644 --- a/src/imgui/CMakeLists.txt +++ b/src/imgui/CMakeLists.txt @@ -3,16 +3,19 @@ project(imgui) add_library(imgui STATIC imconfig.h + imgui.cpp imgui.h + imgui_demo.cpp + imgui_draw.cpp imgui_internal.h + imgui_stdlib.cpp + imgui_stdlib.h + imgui_tables.cpp + imgui_widgets.cpp + # imgui STB imstb_rectpack.h imstb_textedit.h imstb_truetype.h - imgui_tables.cpp - imgui.cpp - imgui_demo.cpp - imgui_draw.cpp - imgui_widgets.cpp ) if(Boost_FOUND) diff --git a/src/imgui/imgui_stdlib.cpp b/src/imgui/imgui_stdlib.cpp new file mode 100644 index 0000000000..cb1fe1743d --- /dev/null +++ b/src/imgui/imgui_stdlib.cpp @@ -0,0 +1,76 @@ +// dear imgui: wrappers for C++ standard library (STL) types (std::string, etc.) +// This is also an example of how you may wrap your own similar types. + +// Compatibility: +// - std::string support is only guaranteed to work from C++11. +// If you try to use it pre-C++11, please share your findings (w/ info about compiler/architecture) + +// Changelog: +// - v0.10: Initial version. Added InputText() / InputTextMultiline() calls with std::string + +#include "imgui.h" +#include "imgui_stdlib.h" + +struct InputTextCallback_UserData +{ + std::string* Str; + ImGuiInputTextCallback ChainCallback; + void* ChainCallbackUserData; +}; + +static int InputTextCallback(ImGuiInputTextCallbackData* data) +{ + InputTextCallback_UserData* user_data = (InputTextCallback_UserData*)data->UserData; + if (data->EventFlag == ImGuiInputTextFlags_CallbackResize) + { + // Resize string callback + // If for some reason we refuse the new length (BufTextLen) and/or capacity (BufSize) we need to set them back to what we want. + std::string* str = user_data->Str; + IM_ASSERT(data->Buf == str->c_str()); + str->resize(data->BufTextLen); + data->Buf = (char*)str->c_str(); + } + else if (user_data->ChainCallback) + { + // Forward to user callback, if any + data->UserData = user_data->ChainCallbackUserData; + return user_data->ChainCallback(data); + } + return 0; +} + +bool ImGui::InputText(const char* label, std::string* str, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data) +{ + IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0); + flags |= ImGuiInputTextFlags_CallbackResize; + + InputTextCallback_UserData cb_user_data; + cb_user_data.Str = str; + cb_user_data.ChainCallback = callback; + cb_user_data.ChainCallbackUserData = user_data; + return InputText(label, (char*)str->c_str(), str->capacity() + 1, flags, InputTextCallback, &cb_user_data); +} + +bool ImGui::InputTextMultiline(const char* label, std::string* str, const ImVec2& size, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data) +{ + IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0); + flags |= ImGuiInputTextFlags_CallbackResize; + + InputTextCallback_UserData cb_user_data; + cb_user_data.Str = str; + cb_user_data.ChainCallback = callback; + cb_user_data.ChainCallbackUserData = user_data; + return InputTextMultiline(label, (char*)str->c_str(), str->capacity() + 1, size, flags, InputTextCallback, &cb_user_data); +} + +bool ImGui::InputTextWithHint(const char* label, const char* hint, std::string* str, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data) +{ + IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0); + flags |= ImGuiInputTextFlags_CallbackResize; + + InputTextCallback_UserData cb_user_data; + cb_user_data.Str = str; + cb_user_data.ChainCallback = callback; + cb_user_data.ChainCallbackUserData = user_data; + return InputTextWithHint(label, hint, (char*)str->c_str(), str->capacity() + 1, flags, InputTextCallback, &cb_user_data); +} diff --git a/src/imgui/imgui_stdlib.h b/src/imgui/imgui_stdlib.h new file mode 100644 index 0000000000..f860b0c780 --- /dev/null +++ b/src/imgui/imgui_stdlib.h @@ -0,0 +1,22 @@ +// dear imgui: wrappers for C++ standard library (STL) types (std::string, etc.) +// This is also an example of how you may wrap your own similar types. + +// Compatibility: +// - std::string support is only guaranteed to work from C++11. +// If you try to use it pre-C++11, please share your findings (w/ info about compiler/architecture) + +// Changelog: +// - v0.10: Initial version. Added InputText() / InputTextMultiline() calls with std::string + +#pragma once + +#include + +namespace ImGui +{ + // ImGui::InputText() with std::string + // Because text input needs dynamic resizing, we need to setup a callback to grow the capacity + IMGUI_API bool InputText(const char* label, std::string* str, ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL); + IMGUI_API bool InputTextMultiline(const char* label, std::string* str, const ImVec2& size = ImVec2(0, 0), ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL); + IMGUI_API bool InputTextWithHint(const char* label, const char* hint, std::string* str, ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL); +} diff --git a/src/imgui/imgui_widgets.cpp b/src/imgui/imgui_widgets.cpp index b09b09abca..ded72f4178 100644 --- a/src/imgui/imgui_widgets.cpp +++ b/src/imgui/imgui_widgets.cpp @@ -4815,8 +4815,9 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ PushStyleColor(ImGuiCol_ChildBg, style.Colors[ImGuiCol_FrameBg]); PushStyleVar(ImGuiStyleVar_ChildRounding, style.FrameRounding); PushStyleVar(ImGuiStyleVar_ChildBorderSize, style.FrameBorderSize); + PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0)); // Ensure no clip rect so mouse hover can reach FramePadding edges bool child_visible = BeginChildEx(label, id, frame_bb.GetSize(), true, ImGuiWindowFlags_NoMove); - PopStyleVar(2); + PopStyleVar(3); PopStyleColor(); if (!child_visible) { @@ -5454,7 +5455,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_ // Test if cursor is vertically visible if (cursor_offset.y - g.FontSize < scroll_y) scroll_y = ImMax(0.0f, cursor_offset.y - g.FontSize); - else if (cursor_offset.y - inner_size.y >= scroll_y) + else if (cursor_offset.y - (inner_size.y - style.FramePadding.y * 2.0f) >= scroll_y) scroll_y = cursor_offset.y - inner_size.y + style.FramePadding.y * 2.0f; const float scroll_max_y = ImMax((text_size.y + style.FramePadding.y * 2.0f) - inner_size.y, 0.0f); scroll_y = ImClamp(scroll_y, 0.0f, scroll_max_y); diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index 665fb07718..ba0d363f7c 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -1,3 +1,7 @@ +///|/ Copyright (c) Prusa Research 2017 - 2023 Oleksandra Iushchenko @YuSanka, Vojtěch Bubník @bubnikv, Pavel Mikuš @Godrak, David Kocík @kocikdav, Lukáš Matěna @lukasmatena, Enrico Turri @enricoturri1966, Lukáš Hejl @hejllukas, Filip Sykala @Jony01, Vojtěch Král @vojtechkral +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ #include "libslic3r/libslic3r.h" #include "libslic3r/Utils.hpp" #include "AppConfig.hpp" @@ -43,6 +47,7 @@ static const std::string MODELS_STR = "models"; const std::string AppConfig::SECTION_FILAMENTS = "filaments"; const std::string AppConfig::SECTION_MATERIALS = "sla_materials"; +const std::string AppConfig::SECTION_EMBOSS_STYLE = "font"; std::string AppConfig::get_language_code() { diff --git a/src/libslic3r/AppConfig.hpp b/src/libslic3r/AppConfig.hpp index dfcc246580..1219adec9e 100644 --- a/src/libslic3r/AppConfig.hpp +++ b/src/libslic3r/AppConfig.hpp @@ -1,3 +1,7 @@ +///|/ Copyright (c) Prusa Research 2017 - 2023 Vojtěch Bubník @bubnikv, David Kocík @kocikdav, Lukáš Matěna @lukasmatena, Filip Sykala @Jony01, Enrico Turri @enricoturri1966, Oleksandra Iushchenko @YuSanka, Vojtěch Král @vojtechkral +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ #ifndef slic3r_AppConfig_hpp_ #define slic3r_AppConfig_hpp_ @@ -287,6 +291,7 @@ public: static const std::string SECTION_FILAMENTS; static const std::string SECTION_MATERIALS; + static const std::string SECTION_EMBOSS_STYLE; private: template diff --git a/src/libslic3r/Arachne/BeadingStrategy/BeadingStrategyFactory.cpp b/src/libslic3r/Arachne/BeadingStrategy/BeadingStrategyFactory.cpp index 4044c90138..97acd271ac 100644 --- a/src/libslic3r/Arachne/BeadingStrategy/BeadingStrategyFactory.cpp +++ b/src/libslic3r/Arachne/BeadingStrategy/BeadingStrategyFactory.cpp @@ -39,7 +39,9 @@ BeadingStrategyPtr BeadingStrategyFactory::makeStrategy( BOOST_LOG_TRIVIAL(debug) << "Applying the Widening Beading meta-strategy with minimum input width " << min_feature_size << " and minimum output width " << min_bead_width << "."; ret = std::make_unique(std::move(ret), min_feature_size, min_bead_width); } - if (outer_wall_offset > 0) { + // Orca: we allow negative outer_wall_offset here + if (outer_wall_offset != 0) + { BOOST_LOG_TRIVIAL(debug) << "Applying the OuterWallOffset meta-strategy with offset = " << outer_wall_offset << "."; ret = std::make_unique(outer_wall_offset, std::move(ret)); } diff --git a/src/libslic3r/Arachne/utils/ExtrusionLine.cpp b/src/libslic3r/Arachne/utils/ExtrusionLine.cpp index 30f06f21d3..fd7aed4101 100644 --- a/src/libslic3r/Arachne/utils/ExtrusionLine.cpp +++ b/src/libslic3r/Arachne/utils/ExtrusionLine.cpp @@ -44,8 +44,6 @@ void ExtrusionLine::simplify(const int64_t smallest_line_segment_squared, const if (junctions.size() <= min_path_size) return; - // TODO: allow for the first point to be removed in case of simplifying closed Extrusionlines. - /* ExtrusionLines are treated as (open) polylines, so in case an ExtrusionLine is actually a closed polygon, its * starting and ending points will be equal (or almost equal). Therefore, the simplification of the ExtrusionLine * should not touch the first and last points. As a result, start simplifying from point at index 1. @@ -54,12 +52,16 @@ void ExtrusionLine::simplify(const int64_t smallest_line_segment_squared, const // Starting junction should always exist in the simplified path new_junctions.emplace_back(junctions.front()); - /* Initially, previous_previous is always the same as previous because, for open ExtrusionLines the last junction - * cannot be taken into consideration when checking the points at index 1. For closed ExtrusionLines, the first and - * last junctions are anyway the same. - * */ - ExtrusionJunction previous_previous = junctions.front(); ExtrusionJunction previous = junctions.front(); + /* For open ExtrusionLines the last junction cannot be taken into consideration when checking the points at index 1. + * For closed ExtrusionLines, the first and last junctions are the same, so use the prior to last juction. + * */ + ExtrusionJunction previous_previous = this->is_closed ? junctions[junctions.size() - 2] : junctions.front(); + + /* TODO: When deleting, combining, or modifying junctions, it would + * probably be good to set the new junction's width to a weighted average + * of the junctions it is derived from. + */ /* When removing a vertex, we check the height of the triangle of the area being removed from the original polygon by the simplification. However, @@ -76,16 +78,20 @@ void ExtrusionLine::simplify(const int64_t smallest_line_segment_squared, const From this area we compute the height of the representative triangle using the standard formula for a triangle area: A = .5*b*h */ - const ExtrusionJunction& initial = junctions.at(1); + const ExtrusionJunction& initial = junctions[1]; int64_t accumulated_area_removed = int64_t(previous.p.x()) * int64_t(initial.p.y()) - int64_t(previous.p.y()) * int64_t(initial.p.x()); // Twice the Shoelace formula for area of polygon per line segment. - for (size_t point_idx = 1; point_idx < junctions.size() - 1; point_idx++) + // For a closed polygon we process the last point, which is the same as the first point. + for (size_t point_idx = 1; point_idx < junctions.size() - (this->is_closed ? 0 : 1); point_idx++) { - const ExtrusionJunction& current = junctions[point_idx]; + // For the last point of a closed polygon, use the first point of the new polygon in case we modified it. + const bool is_last = point_idx + 1 == junctions.size(); + const ExtrusionJunction& current = is_last ? new_junctions[0] : junctions[point_idx]; // Spill over in case of overflow, unless the [next] vertex will then be equal to [previous]. - const bool spill_over = point_idx + 1 == junctions.size() && new_junctions.size() > 1; - ExtrusionJunction& next = spill_over ? new_junctions[0] : junctions[point_idx + 1]; + const bool spill_over = this->is_closed && point_idx + 2 >= junctions.size() && + point_idx + 2 - junctions.size() < new_junctions.size(); + ExtrusionJunction& next = spill_over ? new_junctions[point_idx + 2 - junctions.size()] : junctions[point_idx + 1]; const int64_t removed_area_next = int64_t(current.p.x()) * int64_t(next.p.y()) - int64_t(current.p.y()) * int64_t(next.p.x()); // Twice the Shoelace formula for area of polygon per line segment. const int64_t negative_area_closing = int64_t(next.p.x()) * int64_t(previous.p.y()) - int64_t(next.p.y()) * int64_t(previous.p.x()); // Area between the origin and the short-cutting segment @@ -134,12 +140,18 @@ void ExtrusionLine::simplify(const int64_t smallest_line_segment_squared, const // We should instead move this point to a location where both edges are kept and then remove the previous point that we wanted to keep. // By taking the intersection of these two lines, we get a point that preserves the direction (so it makes the corner a bit more pointy). // We just need to be sure that the intersection point does not introduce an artifact itself. + // o < prev_prev + // | + // o < prev + // \ < short segment + // intersection > + o-------------------o < next + // ^ current Point intersection_point; bool has_intersection = Line(previous_previous.p, previous.p).intersection_infinite(Line(current.p, next.p), &intersection_point); if (!has_intersection || Line::distance_to_infinite_squared(intersection_point, previous.p, current.p) > double(allowed_error_distance_squared) || (intersection_point - previous.p).cast().squaredNorm() > smallest_line_segment_squared // The intersection point is way too far from the 'previous' - || (intersection_point - next.p).cast().squaredNorm() > smallest_line_segment_squared) // and 'next' points, so it shouldn't replace 'current' + || (intersection_point - current.p).cast().squaredNorm() > smallest_line_segment_squared) // and 'current' points, so it shouldn't replace 'current' { // We can't find a better spot for it, but the size of the line is more than 5 micron. // So the only thing we can do here is leave it in... @@ -175,15 +187,14 @@ void ExtrusionLine::simplify(const int64_t smallest_line_segment_squared, const new_junctions.push_back(current); } - // Ending junction (vertex) should always exist in the simplified path - new_junctions.emplace_back(junctions.back()); - - /* In case this is a closed polygon (instead of a poly-line-segments), the invariant that the first and last points are the same should be enforced. - * Since one of them didn't move, and the other can't have been moved further than the constraints, if originally equal, they can simply be equated. - */ - if ((junctions.front().p - junctions.back().p).cast().squaredNorm() == 0) - { - new_junctions.back().p = junctions.front().p; + if (this->is_closed) { + /* The first and last points should be the same for a closed polygon. + * We processed the last point above, so copy it into the first point. + */ + new_junctions.front().p = new_junctions.back().p; + } else { + // Ending junction (vertex) should always exist in the simplified path + new_junctions.emplace_back(junctions.back()); } junctions = new_junctions; diff --git a/src/libslic3r/BoundingBox.hpp b/src/libslic3r/BoundingBox.hpp index a7d092ae27..8654669eb3 100644 --- a/src/libslic3r/BoundingBox.hpp +++ b/src/libslic3r/BoundingBox.hpp @@ -1,3 +1,8 @@ +///|/ Copyright (c) Prusa Research 2016 - 2023 Tomáš Mészáros @tamasmeszaros, Vojtěch Bubník @bubnikv, Filip Sykala @Jony01, Enrico Turri @enricoturri1966 +///|/ Copyright (c) Slic3r 2014 - 2015 Alessandro Ranellucci @alranel +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ #ifndef slic3r_BoundingBox_hpp_ #define slic3r_BoundingBox_hpp_ @@ -222,6 +227,8 @@ public: friend BoundingBox get_extents_rotated(const Points &points, double angle); }; +using BoundingBoxes = std::vector; + class BoundingBox3 : public BoundingBox3Base { public: diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index d5a020e05c..37cb8ea0df 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -66,9 +66,15 @@ set(lisbslic3r_sources EdgeGrid.hpp ElephantFootCompensation.cpp ElephantFootCompensation.hpp + Emboss.cpp + Emboss.hpp + EmbossShape.hpp enum_bitmask.hpp ExPolygon.cpp ExPolygon.hpp + ExPolygonSerialize.hpp + ExPolygonsIndex.cpp + ExPolygonsIndex.hpp Extruder.cpp Extruder.hpp ExtrusionEntity.cpp @@ -224,6 +230,8 @@ set(lisbslic3r_sources MultiPoint.cpp MultiPoint.hpp MutablePriorityQueue.hpp + NSVGUtils.cpp + NSVGUtils.hpp ObjectID.cpp ObjectID.hpp PerimeterGenerator.cpp @@ -318,6 +326,7 @@ set(lisbslic3r_sources Technologies.hpp Tesselate.cpp Tesselate.hpp + TextConfiguration.hpp TriangleMesh.cpp TriangleMesh.hpp TriangleMeshSlicer.cpp @@ -329,6 +338,8 @@ set(lisbslic3r_sources Utils.hpp Time.cpp Time.hpp + Timer.cpp + Timer.hpp Thread.cpp Thread.hpp TriangleSelector.cpp @@ -457,8 +468,13 @@ cmake_policy(SET CMP0011 NEW) find_package(CGAL REQUIRED) cmake_policy(POP) -add_library(libslic3r_cgal STATIC MeshBoolean.cpp MeshBoolean.hpp TryCatchSignal.hpp - TryCatchSignal.cpp) +add_library(libslic3r_cgal STATIC + CutSurface.hpp CutSurface.cpp + IntersectionPoints.hpp IntersectionPoints.cpp + MeshBoolean.hpp MeshBoolean.cpp + TryCatchSignal.hpp TryCatchSignal.cpp + Triangulation.hpp Triangulation.cpp +) target_include_directories(libslic3r_cgal PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) # Reset compile options of libslic3r_cgal. Despite it being linked privately, CGAL options diff --git a/src/libslic3r/ClipperUtils.cpp b/src/libslic3r/ClipperUtils.cpp index ec16193fd5..eeb43f6f02 100644 --- a/src/libslic3r/ClipperUtils.cpp +++ b/src/libslic3r/ClipperUtils.cpp @@ -272,8 +272,8 @@ bool has_duplicate_points(const ClipperLib::PolyTree &polytree) // Offset CCW contours outside, CW contours (holes) inside. // Don't calculate union of the output paths. -template -static ClipperLib::Paths raw_offset(PathsProvider &&paths, float offset, ClipperLib::JoinType joinType, double miterLimit) +template +static ClipperLib::Paths raw_offset(PathsProvider &&paths, float offset, ClipperLib::JoinType joinType, double miterLimit, ClipperLib::EndType endType = ClipperLib::etClosedPolygon) { ClipperLib::ClipperOffset co; ClipperLib::Paths out; @@ -354,16 +354,16 @@ TResult clipper_union( // Perform union of input polygons using the positive rule, convert to ExPolygons. //FIXME is there any benefit of not doing the boolean / using pftEvenOdd? -ExPolygons ClipperPaths_to_Slic3rExPolygons(const ClipperLib::Paths &input, bool do_union) +inline ExPolygons ClipperPaths_to_Slic3rExPolygons(const ClipperLib::Paths &input, bool do_union) { return PolyTreeToExPolygons(clipper_union(input, do_union ? ClipperLib::pftNonZero : ClipperLib::pftEvenOdd)); } -template -static ClipperLib::Paths raw_offset_polyline(PathsProvider &&paths, float offset, ClipperLib::JoinType joinType, double miterLimit) +template +static ClipperLib::Paths raw_offset_polyline(PathsProvider &&paths, float offset, ClipperLib::JoinType joinType, double miterLimit, ClipperLib::EndType end_type = ClipperLib::etOpenButt) { assert(offset > 0); - return raw_offset(std::forward(paths), offset, joinType, miterLimit); + return raw_offset(std::forward(paths), offset, joinType, miterLimit, end_type); } template @@ -418,10 +418,17 @@ Slic3r::Polygons offset(const Slic3r::Polygons &polygons, const float delta, Cli Slic3r::ExPolygons offset_ex(const Slic3r::Polygons &polygons, const float delta, ClipperLib::JoinType joinType, double miterLimit) { return PolyTreeToExPolygons(offset_paths(ClipperUtils::PolygonsProvider(polygons), delta, joinType, miterLimit)); } -Slic3r::Polygons offset(const Slic3r::Polyline &polyline, const float delta, ClipperLib::JoinType joinType, double miterLimit) - { assert(delta > 0); return to_polygons(clipper_union(raw_offset_polyline(ClipperUtils::SinglePathProvider(polyline.points), delta, joinType, miterLimit))); } -Slic3r::Polygons offset(const Slic3r::Polylines &polylines, const float delta, ClipperLib::JoinType joinType, double miterLimit) - { assert(delta > 0); return to_polygons(clipper_union(raw_offset_polyline(ClipperUtils::PolylinesProvider(polylines), delta, joinType, miterLimit))); } +Slic3r::Polygons offset(const Slic3r::Polyline &polyline, const float delta, ClipperLib::JoinType joinType, double miterLimit, ClipperLib::EndType end_type) + { assert(delta > 0); return to_polygons(clipper_union(raw_offset_polyline(ClipperUtils::SinglePathProvider(polyline.points), delta, joinType, miterLimit, end_type))); } +Slic3r::Polygons offset(const Slic3r::Polylines &polylines, const float delta, ClipperLib::JoinType joinType, double miterLimit, ClipperLib::EndType end_type) + { assert(delta > 0); return to_polygons(clipper_union(raw_offset_polyline(ClipperUtils::PolylinesProvider(polylines), delta, joinType, miterLimit, end_type))); } + +Polygons contour_to_polygons(const Polygon &polygon, const float line_width, ClipperLib::JoinType join_type, double miter_limit){ + assert(line_width > 1.f); return to_polygons(clipper_union( + raw_offset(ClipperUtils::SinglePathProvider(polygon.points), line_width/2, join_type, miter_limit, ClipperLib::etClosedLine)));} +Polygons contour_to_polygons(const Polygons &polygons, const float line_width, ClipperLib::JoinType join_type, double miter_limit){ + assert(line_width > 1.f); return to_polygons(clipper_union( + raw_offset(ClipperUtils::PolygonsProvider(polygons), line_width/2, join_type, miter_limit, ClipperLib::etClosedLine)));} // returns number of expolygons collected (0 or 1). static int offset_expolygon_inner(const Slic3r::ExPolygon &expoly, const float delta, ClipperLib::JoinType joinType, double miterLimit, ClipperLib::Paths &out) @@ -795,6 +802,8 @@ Slic3r::ExPolygons union_ex(const Slic3r::Polygons &subject, ClipperLib::PolyFil { return _clipper_ex(ClipperLib::ctUnion, ClipperUtils::PolygonsProvider(subject), ClipperUtils::EmptyPathsProvider(), ApplySafetyOffset::No, fill_type); } Slic3r::ExPolygons union_ex(const Slic3r::ExPolygons &subject) { return PolyTreeToExPolygons(clipper_do_polytree(ClipperLib::ctUnion, ClipperUtils::ExPolygonsProvider(subject), ClipperUtils::EmptyPathsProvider(), ClipperLib::pftNonZero)); } +Slic3r::ExPolygons union_ex(const Slic3r::ExPolygons &subject, const Slic3r::Polygons &subject2) + { return PolyTreeToExPolygons(clipper_do_polytree(ClipperLib::ctUnion, ClipperUtils::ExPolygonsProvider(subject), ClipperUtils::PolygonsProvider(subject2), ClipperLib::pftNonZero)); } Slic3r::ExPolygons union_ex(const Slic3r::Surfaces &subject) { return PolyTreeToExPolygons(clipper_do_polytree(ClipperLib::ctUnion, ClipperUtils::SurfacesProvider(subject), ClipperUtils::EmptyPathsProvider(), ClipperLib::pftNonZero)); } // BBS diff --git a/src/libslic3r/ClipperUtils.hpp b/src/libslic3r/ClipperUtils.hpp index 1428b6bd0f..3607b0a69d 100644 --- a/src/libslic3r/ClipperUtils.hpp +++ b/src/libslic3r/ClipperUtils.hpp @@ -22,6 +22,9 @@ namespace Slic3r { static constexpr const float ClipperSafetyOffset = 10.f; static constexpr const Slic3r::ClipperLib::JoinType DefaultJoinType = Slic3r::ClipperLib::jtMiter; + +static constexpr const Slic3r::ClipperLib::EndType DefaultEndType = Slic3r::ClipperLib::etOpenButt; + //FIXME evaluate the default miter limit. 3 seems to be extreme, Cura uses 1.2. // Mitter Limit 3 is useful for perimeter generator, where sharp corners are extruded without needing a gap fill. // However such a high limit causes issues with large positive or negative offsets, where a sharp corner @@ -335,8 +338,8 @@ Slic3r::Polygons offset(const Slic3r::Polygon &polygon, const float delta, Clipp // offset Polylines // Wherever applicable, please use the expand() / shrink() variants instead, they convey their purpose better. // Input polygons for negative offset shall be "normalized": There must be no overlap / intersections between the input polygons. -Slic3r::Polygons offset(const Slic3r::Polyline &polyline, const float delta, ClipperLib::JoinType joinType = DefaultLineJoinType, double miterLimit = DefaultLineMiterLimit); -Slic3r::Polygons offset(const Slic3r::Polylines &polylines, const float delta, ClipperLib::JoinType joinType = DefaultLineJoinType, double miterLimit = DefaultLineMiterLimit); +Slic3r::Polygons offset(const Slic3r::Polyline &polyline, const float delta, ClipperLib::JoinType joinType = DefaultLineJoinType, double miterLimit = DefaultLineMiterLimit, ClipperLib::EndType end_type = DefaultEndType); +Slic3r::Polygons offset(const Slic3r::Polylines &polylines, const float delta, ClipperLib::JoinType joinType = DefaultLineJoinType, double miterLimit = DefaultLineMiterLimit, ClipperLib::EndType end_type = DefaultEndType); Slic3r::Polygons offset(const Slic3r::Polygons &polygons, const float delta, ClipperLib::JoinType joinType = DefaultJoinType, double miterLimit = DefaultMiterLimit); Slic3r::Polygons offset(const Slic3r::ExPolygon &expolygon, const float delta, ClipperLib::JoinType joinType = DefaultJoinType, double miterLimit = DefaultMiterLimit); Slic3r::Polygons offset(const Slic3r::ExPolygons &expolygons, const float delta, ClipperLib::JoinType joinType = DefaultJoinType, double miterLimit = DefaultMiterLimit); @@ -355,6 +358,10 @@ inline Slic3r::ExPolygons offset_ex(const Slic3r::Polygon &polygon, const float return offset_ex(temp, delta, joinType, miterLimit); } +// convert stroke to path by offsetting of contour +Polygons contour_to_polygons(const Polygon &polygon, const float line_width, ClipperLib::JoinType join_type = DefaultJoinType, double miter_limit = DefaultMiterLimit); +Polygons contour_to_polygons(const Polygons &polygon, const float line_width, ClipperLib::JoinType join_type = DefaultJoinType, double miter_limit = DefaultMiterLimit); + inline Slic3r::Polygons union_safety_offset (const Slic3r::Polygons &polygons) { return offset (polygons, ClipperSafetyOffset); } inline Slic3r::Polygons union_safety_offset (const Slic3r::ExPolygons &expolygons) { return offset (expolygons, ClipperSafetyOffset); } inline Slic3r::ExPolygons union_safety_offset_ex(const Slic3r::Polygons &polygons) { return offset_ex(polygons, ClipperSafetyOffset); } @@ -539,6 +546,7 @@ Slic3r::Polygons union_(const Slic3r::Polygons &subject, const Slic3r::Polygons // May be used to "heal" unusual models (3DLabPrints etc.) by providing fill_type (pftEvenOdd, pftNonZero, pftPositive, pftNegative). Slic3r::ExPolygons union_ex(const Slic3r::Polygons &subject, ClipperLib::PolyFillType fill_type = ClipperLib::pftNonZero); Slic3r::ExPolygons union_ex(const Slic3r::ExPolygons &subject); +Slic3r::ExPolygons union_ex(const Slic3r::ExPolygons &subject, const Slic3r::Polygons &subject2); Slic3r::ExPolygons union_ex(const Slic3r::Surfaces &subject); Slic3r::ExPolygons union_ex(const Slic3r::ExPolygons& poly1, const Slic3r::ExPolygons& poly2, bool safety_offset_ = false); diff --git a/src/libslic3r/Color.hpp b/src/libslic3r/Color.hpp index ea17328bec..a111746397 100644 --- a/src/libslic3r/Color.hpp +++ b/src/libslic3r/Color.hpp @@ -61,6 +61,7 @@ public: static const ColorRGB REDISH() { return { 1.0f, 0.5f, 0.5f }; } static const ColorRGB YELLOW() { return { 1.0f, 1.0f, 0.0f }; } static const ColorRGB WHITE() { return { 1.0f, 1.0f, 1.0f }; } + static const ColorRGB ORCA() { return {0.0f, 150.f / 255.0f, 136.0f / 255}; } static const ColorRGB X() { return { 0.75f, 0.0f, 0.0f }; } static const ColorRGB Y() { return { 0.0f, 0.75f, 0.0f }; } diff --git a/src/libslic3r/Config.cpp b/src/libslic3r/Config.cpp index 567e736e69..c303cef5ab 100644 --- a/src/libslic3r/Config.cpp +++ b/src/libslic3r/Config.cpp @@ -737,6 +737,8 @@ void ConfigBase::setenv_() const //BBS ConfigSubstitutions ConfigBase::load_string_map(std::map& key_values, ForwardCompatibilitySubstitutionRule compatibility_rule) { + CNumericLocalesSetter locales_setter; + ConfigSubstitutionContext substitutions_ctxt(compatibility_rule); std::map::iterator it; for (it = key_values.begin(); it != key_values.end(); it++) { diff --git a/src/libslic3r/CutSurface.cpp b/src/libslic3r/CutSurface.cpp new file mode 100644 index 0000000000..b2cf3d9659 --- /dev/null +++ b/src/libslic3r/CutSurface.cpp @@ -0,0 +1,4086 @@ +///|/ Copyright (c) Prusa Research 2022 - 2023 Vojtěch Bubník @bubnikv, Filip Sykala @Jony01 +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ +#include "CutSurface.hpp" + +/// models_input.obj - Check transormation of model to each others +/// projection_center.obj - circle representing center of projection with correct distance +/// {M} .. model index +/// model/model{M}.off - CGAL model created from index_triangle_set +/// model_neg/model{M}.off - CGAL model created for differenciate (multi volume object) +/// shape.off - CGAL model created from shapes +/// constrained/model{M}.off - Visualization of inside and outside triangles +/// Green - not along constrained edge +/// Red - sure that are inside +/// Purple - sure that are outside +/// (only along constrained edge) +/// filled/model{M}.off - flood fill green triangles inside of red area +/// - Same meaning of color as constrained +/// {N} .. Order of cutted Area of Interestmodel from model surface +/// model_AOIs/{M}/cutAOI{N}.obj - Extracted Area of interest from corefined model +/// model_AOIs/{M}/outline{N}.obj - Outline of Cutted Area +/// {O} .. Order number of patch +/// patches/patch{O}.off +/// result.obj - Merged result its +/// result_contours/{O}.obj - visualization of contours for result patches +//#define DEBUG_OUTPUT_DIR std::string("C:/data/temp/cutSurface/") + +using namespace Slic3r; +#include "ExPolygonsIndex.hpp" + +#include +#include +#include +#include +#include + +// libslic3r +#include "TriangleMesh.hpp" // its_merge +#include "Utils.hpp" // next_highest_power_of_2 +#include "ClipperUtils.hpp" // union_ex + offset_ex + +namespace priv { + +using Project = Emboss::IProjection; +using Project3d = Emboss::IProject3d; + +/// +/// Set true for indices out of area of interest +/// +/// Flag to convert triangle to cgal +/// model +/// Convert 2d point to pair of 3d points +/// 2d bounding box define AOI +void set_skip_for_out_of_aoi(std::vector &skip_indicies, + const indexed_triangle_set &its, + const Project &projection, + const BoundingBox &shapes_bb); + +/// +/// Set true for indicies outward and almost parallel together. +/// Note: internally calculate normals +/// +/// Flag to convert triangle to cgal +/// model +/// Direction to measure angle +/// Maximal allowed angle between opposit normal and +/// projection direction [in DEG] +void set_skip_by_angle(std::vector &skip_indicies, + const indexed_triangle_set &its, + const Project3d &projection, + double max_angle = 89.); + + +using EpicKernel = CGAL::Exact_predicates_inexact_constructions_kernel; +using CutMesh = CGAL::Surface_mesh; +using CutMeshes = std::vector; + +using VI = CGAL::SM_Vertex_index; +using HI = CGAL::SM_Halfedge_index; +using EI = CGAL::SM_Edge_index; +using FI = CGAL::SM_Face_index; +using P3 = CGAL::Epick::Point_3; + +inline Vec3d to_vec3d(const P3 &p) { return Vec3d(p.x(),p.y(),p.z()); } + +/// +/// Convert triangle mesh model to CGAL Surface_mesh +/// Filtrate out opposite triangles +/// Add property map for source face index +/// +/// Model +/// Flags that triangle should be skiped +/// When true triangle will flip normal +/// CGAL mesh - half edge mesh +CutMesh to_cgal(const indexed_triangle_set &its, + const std::vector &skip_indicies, + bool flip = false); + +/// +/// Covert 2d shape (e.g. Glyph) to CGAL model +/// NOTE: internaly create +/// edge_shape_map .. Property map to store conversion from edge to contour +/// face_shape_map .. Property map to store conversion from face to contour +/// +/// 2d shapes to project +/// Define transformation 2d point into 3d +/// CGAL model of extruded shape +CutMesh to_cgal(const ExPolygons &shapes, const Project &projection); +// function to check result of projection. 2d int32_t -> 3d double +bool exist_duplicit_vertex(const CutMesh& mesh); + + +/// +/// IntersectingElement +/// +/// Adress polygon inside of ExPolygon +/// Keep information about source of vertex: +/// - from face (one of 2 possible) +/// - from edge (one of 2 possible) +/// +/// V1~~~~~V2 +/// | f1 /: +/// | / : +/// e1| /e2: +/// | / : +/// |/ f2 : +/// V1'~~~~V2' +/// +/// | .. edge +/// / .. edge +/// : .. foreign edge - neighbor +/// ~ .. no care edge - idealy should not cross model +/// V1,V1' .. projected 2d point to 3d +/// V2,V2' .. projected 2d point to 3d +/// +/// Vertex indexing +/// V1 .. i (vertex_base + 2x index of point in polygon) +/// V1' .. i + 1 +/// V2 .. j = i + 2 || 0 (for last i in polygon) +/// V2' .. j + 1 +/// +/// f1 .. text_face_1 (triangle face made by side of shape contour) +/// f2 .. text_face_2 +/// e1 .. text_edge_1 (edge on side of face made by side of shape contour) +/// e2 .. text_edge_2 +/// +/// +struct IntersectingElement +{ + // identify source point in shapes + uint32_t shape_point_index{std::numeric_limits::max()}; + + // store together type, is_first, is_last + unsigned char attr{std::numeric_limits::max()}; + + // vertex or edge ID, where edge ID is the index of the source point. + // There are 4 consecutive indices generated for a single contour edge: + // 0th - 1st text edge (straight) + // 1th - 1st text face + // 2nd - 2nd text edge (diagonal) + // 3th - 2nd text face + // Type of intersecting element from extruded shape( 3d ) + // NOTE: type must be storable to 3bit -> max value is 7 + enum class Type: unsigned char { + edge_1 = 0, + face_1 = 1, + edge_2 = 2, + face_2 = 3, + undefined = 4 + }; + + IntersectingElement &set_type(Type t) + { + attr = static_cast( + attr + (int) t - (int) get_type()); + return *this; + } + void set_is_first(){ attr += 8; } + void set_is_last(){ attr += 16; } + Type get_type() const { return static_cast(attr % 8);} + bool is_first() const { return 8 <= attr && attr < 16; } + bool is_last() const { return attr >= 16; } +}; + +// stored in model made by shape +using EdgeShapeMap = CutMesh::Property_map; +using FaceShapeMap = CutMesh::Property_map; + +// stored in surface source - pointer to EdgeShapeMap | FaceShapeMap +using VertexShapeMap = CutMesh::Property_map; + +// stored in model made by shape +const std::string edge_shape_map_name = "e:IntersectingElement"; +const std::string face_shape_map_name = "f:IntersectingElement"; + +// stored in surface source +const std::string vert_shape_map_name = "v:IntersectingElement"; + +/// +/// Flag for faces in CGAL mesh +/// +enum class FaceType { + // face inside of the cutted shape + inside, + // face outside of the cutted shape + outside, + // face without constrained edge (In or Out) + not_constrained, + + // Helper flag that inside was processed + inside_processed +}; +using FaceTypeMap = CutMesh::Property_map; +const std::string face_type_map_name = "f:side"; + +// Conversion one vertex index to another +using CvtVI2VI = CutMesh::Property_map; +// Each Patch track outline vertex conversion to tource model +const std::string patch_source_name = "v:patch_source"; + +// For VI that should be reduced, contain VI to use instead of reduced +// Other VI are invalid +using ReductionMap = CvtVI2VI; +const std::string vertex_reduction_map_name = "v:reduction"; + +// A property map containing the constrained-or-not status of each edge +using EdgeBoolMap = CutMesh::Property_map; +const std::string is_constrained_edge_name = "e:is_constrained"; + +/// +/// Create map to reduce unnecesary triangles, +/// Triangles are made by divided quad to two triangles +/// on side of cutting shape mesh +/// Note: also use from mesh (have to be created) +/// face_type_map .. Type of shape inside / outside +/// vert_shape_map .. Source of outline vertex +/// +/// Reduction map from vertex to vertex, +/// when key == value than no reduction +/// Faces of one +/// Input object +void create_reduce_map(ReductionMap &reduction_map, const CutMesh &meshes); + +// Patch made by Cut area of interest from model +// connected faces(triangles) and outlines(halfEdges) for one surface cut +using CutAOI = std::pair, std::vector>; +// vector of Cutted Area of interest cutted from one CGAL model +using CutAOIs = std::vector; +// vector of CutAOIs for each model +using VCutAOIs = std::vector; + +/// +/// Create AOIs(area of interest) on model surface +/// +/// Input model converted to CGAL +/// NOTE: will be extended by corefine edge +/// 2d contours +/// [const]Model made by shapes +/// NOTE: Can't be definde as const because of corefine function input definition, +/// but it is. +/// Wanted projection distance +/// Convert index to shape point from ExPolygons +/// Patches from model surface +CutAOIs cut_from_model(CutMesh &cgal_model, + const ExPolygons &shapes, + /*const*/ CutMesh &cgal_shape, + float projection_ratio, + const ExPolygonsIndices &s2i); + +using Loop = std::vector; +using Loops = std::vector; + +/// +/// Create closed loops of contour vertices created from open half edges +/// +/// Unsorted half edges +/// Source mesh for half edges +/// Closed loops +Loops create_loops(const std::vector &outlines, const CutMesh &mesh); + +// To track during diff_models, +// what was cutted off, from CutAOI +struct SurfacePatch +{ + // converted cut to CGAL mesh + // Mesh is reduced. + // (do not contain divided triangles on contour - created by side Quad) + CutMesh mesh; + // CvtVI2VI cvt = mesh.property_map(patch_source_name); + // Conversion VI from this patch to source VI(model) is stored in mesh property + + // Outlines - converted CutAOI.second (half edges) + // to loops (vertex indicies) by function create_loops + Loops loops; + + // bounding box of mesh + BoundingBoxf3 bb; + + //// Data needed to find best projection distances + // index of source model in models + size_t model_id; + // index of source CutAOI + size_t aoi_id; + // index of shape from ExPolygons + size_t shape_id = 0; + + // flag that this patch contain whole CutAOI + bool is_whole_aoi = true; +}; +using SurfacePatches = std::vector; + +struct ModelCutId +{ + // index of model + uint32_t model_index; + // index of cut inside model + uint32_t cut_index; +}; + +/// +/// Keep conversion from VCutAOIs to Index and vice versa +/// Model_index .. contour(or hole) poin from ExPolygons +/// Index .. continous number +/// +class ModelCut2index +{ + std::vector m_offsets; + // for check range of index + uint32_t m_count; + +public: + ModelCut2index(const VCutAOIs &cuts); + uint32_t calc_index(const ModelCutId &id) const; + ModelCutId calc_id(uint32_t index) const; + uint32_t get_count() const { return m_count; }; + const std::vector &get_offsets() const { return m_offsets; } +}; + +/// +/// Differenciate other models +/// +/// Patches from meshes +/// Source points for Cutted AOIs +/// NOTE: Create Reduction map as mesh property - clean on end +/// Original models without cut modifications +/// used for differenciation +/// NOTE: Clip function modify Mesh +/// Define projection direction +/// Cuts differenciate by models - Patch +SurfacePatches diff_models(VCutAOIs &cuts, + /*const*/ CutMeshes &cut_models, + /*const*/ CutMeshes &models, + const Project3d &projection); + +/// +/// Checking whether patch is uninterrupted cover of whole expolygon it belongs. +/// +/// Part of surface to check +/// Source shape +/// Source of cut +/// True when cover whole expolygon otherwise false +bool is_over_whole_expoly(const CutAOI &cutAOI, + const ExPolygon &shape, + const CutMesh &mesh); + +/// +/// Checking whether patch is uninterrupted cover of whole expolygon it belongs. +/// +/// Part of surface to check +/// Source shape +/// True when cover whole expolygon otherwise false +bool is_over_whole_expoly(const SurfacePatch &patch, + const ExPolygons &shapes, + const VCutAOIs &cutAOIs, + const CutMeshes &meshes); +/// +/// Unptoject points from outline loops of patch +/// +/// Contain loops and vertices +/// Know how to project from 3d to 2d +/// Range of unprojected points x .. min, y .. max value +/// Unprojected points in loops +Polygons unproject_loops(const SurfacePatch &patch, const Project &projection, Vec2d &depth_range); + +/// +/// Unproject points from loops and create expolygons +/// +/// Patch to convert on expolygon +/// Convert 3d point to 2d +/// Range of unprojected points x .. min, y .. max value +/// Expolygon represent patch in 2d +ExPolygon to_expoly(const SurfacePatch &patch, const Project &projection, Vec2d &depth_range); + +/// +/// To select surface near projection distance +/// +struct ProjectionDistance +{ + // index of source model + uint32_t model_index = std::numeric_limits::max(); + + // index of CutAOI + uint32_t aoi_index = std::numeric_limits::max(); + + // index of Patch + uint32_t patch_index = std::numeric_limits::max(); + + // signed distance to projection + float distance = std::numeric_limits::max(); +}; +// addresed by ExPolygonsIndices +using ProjectionDistances = std::vector; + +// each point in shapes has its ProjectionDistances +using VDistances = std::vector; + +/// +/// Calculate distances for SurfacePatches outline points +/// NOTE: +/// each model has to have "vert_shape_map" .. Know source of new vertices +/// +/// Part of surface +/// Vertices position +/// Mesh created by shapes +/// Count of contour points in shapes +/// Define best distnace +/// Projection distances of cutted shape points +VDistances calc_distances(const SurfacePatches &patches, + const CutMeshes &models, + const CutMesh &shapes_mesh, + size_t count_shapes_points, + float projection_ratio); + +/// +/// Select distances in similar depth between expolygons +/// +/// All distances - Vector distances for each shape point +/// Vector of letters +/// Pivot for start projection in 2d +/// Convert index to addresss inside of shape +/// Cutted parts from surface +/// Closest distance projection indexed by points in shapes(see s2i) +ProjectionDistances choose_best_distance( + const VDistances &distances, + const ExPolygons &shapes, + const Point &start, + const ExPolygonsIndices &s2i, + const SurfacePatches &patches); + +/// +/// Create mask for patches +/// +/// For each point selected closest distance +/// All patches +/// Shape to cut +/// Bound of shapes +/// +/// +/// +/// +/// Mask of used patch +std::vector select_patches(const ProjectionDistances &best_distances, + const SurfacePatches &patches, + const ExPolygons &shapes, + const BoundingBox &shapes_bb, + const ExPolygonsIndices &s2i, + const VCutAOIs &cutAOIs, + const CutMeshes &meshes, + const Project &projection); + +/// +/// Merge two surface cuts together +/// Added surface cut will be consumed +/// +/// Surface cut to extend +/// Surface cut to consume +void append(SurfaceCut &sc, SurfaceCut &&sc_add); + +/// +/// Convert patch to indexed_triangle_set +/// +/// Part of surface +/// Converted patch +SurfaceCut patch2cut(SurfacePatch &patch); + +/// +/// Merge masked patches to one surface cut +/// +/// All patches +/// NOTE: Not const because One needs to add property for Convert indices +/// Mash for using patch +/// Result surface cut +SurfaceCut merge_patches(/*const*/ SurfacePatches &patches, + const std::vector &mask); + +#ifdef DEBUG_OUTPUT_DIR +void prepare_dir(const std::string &dir); +void initialize_store(const std::string &dir_to_clear); +/// +/// Debug purpose store of mesh with colored face by face type +/// +/// Input mesh, could add property color +/// NOTE: Not const because need to [optionaly] append color property map +/// Color source +/// File to store +void store(const CutMesh &mesh, const FaceTypeMap &face_type_map, const std::string &dir, bool is_filled = false); +void store(const ExPolygons &shapes, const std::string &svg_file); +void store(const CutMesh &mesh, const ReductionMap &reduction_map, const std::string &dir); +void store(const CutAOIs &aois, const CutMesh &mesh, const std::string &dir); +void store(const SurfacePatches &patches, const std::string &dir); +void store(const Vec3f &vertex, const Vec3f &normal, const std::string &file, float size = 2.f); +//void store(const ProjectionDistances &pds, const VCutAOIs &aois, const CutMeshes &meshes, const std::string &file, float width = 0.2f/* [in mm] */); +using Connection = std::pair; using Connections = std::vector; +void store(const ExPolygons &shapes, const std::vector &mask_distances, const Connections &connections, const std::string &file_svg); +void store(const SurfaceCut &cut, const std::string &file, const std::string &contour_dir); +void store(const std::vector &models, const std::string &obj_filename); +void store(const std::vector&models, const std::string &dir); +void store(const Emboss::IProjection &projection, const Point &point_to_project, float projection_ratio, const std::string &obj_filename); +#endif // DEBUG_OUTPUT_DIR +} // namespace privat + +#ifdef DEBUG_OUTPUT_DIR +#include "libslic3r/SVG.hpp" +#include +#include +#endif // DEBUG_OUTPUT_DIR + +SurfaceCut Slic3r::cut_surface(const ExPolygons &shapes, + const std::vector &models, + const Emboss::IProjection &projection, + float projection_ratio) +{ + assert(!models.empty()); + assert(!shapes.empty()); + if (models.empty() || shapes.empty() ) return {}; + +#ifdef DEBUG_OUTPUT_DIR + priv::initialize_store(DEBUG_OUTPUT_DIR); + priv::store(models, DEBUG_OUTPUT_DIR + "models_input.obj"); + priv::store(shapes, DEBUG_OUTPUT_DIR + "shapes.svg"); +#endif // DEBUG_OUTPUT_DIR + + // for filter out triangles out of bounding box + BoundingBox shapes_bb = get_extents(shapes); +#ifdef DEBUG_OUTPUT_DIR + priv::store(projection, shapes_bb.center(), projection_ratio, DEBUG_OUTPUT_DIR + "projection_center.obj"); +#endif // DEBUG_OUTPUT_DIR + + // for filttrate opposite triangles and a little more + const float max_angle = 89.9f; + priv::CutMeshes cgal_models; // source for patch + priv::CutMeshes cgal_neg_models; // model used for differenciate patches + cgal_models.reserve(models.size()); + for (const indexed_triangle_set &its : models) { + std::vector skip_indicies(its.indices.size(), {false}); + priv::set_skip_for_out_of_aoi(skip_indicies, its, projection, shapes_bb); + + // create model for differenciate cutted patches + bool flip = true; + cgal_neg_models.push_back(priv::to_cgal(its, skip_indicies, flip)); + + // cut out more than only opposit triangles + priv::set_skip_by_angle(skip_indicies, its, projection, max_angle); + cgal_models.push_back(priv::to_cgal(its, skip_indicies)); + } +#ifdef DEBUG_OUTPUT_DIR + priv::store(cgal_models, DEBUG_OUTPUT_DIR + "model/");// model[0-N].off + priv::store(cgal_neg_models, DEBUG_OUTPUT_DIR + "model_neg/"); // model[0-N].off +#endif // DEBUG_OUTPUT_DIR + + priv::CutMesh cgal_shape = priv::to_cgal(shapes, projection); +#ifdef DEBUG_OUTPUT_DIR + CGAL::IO::write_OFF(DEBUG_OUTPUT_DIR + "shape.off", cgal_shape); // only debug +#endif // DEBUG_OUTPUT_DIR + + // create tool for convert index to shape Point adress and vice versa + ExPolygonsIndices s2i(shapes); + priv::VCutAOIs model_cuts; + // cut shape from each cgal model + for (priv::CutMesh &cgal_model : cgal_models) { + priv::CutAOIs cutAOIs = priv::cut_from_model( + cgal_model, shapes, cgal_shape, projection_ratio, s2i); +#ifdef DEBUG_OUTPUT_DIR + size_t index = &cgal_model - &cgal_models.front(); + priv::store(cutAOIs, cgal_model, DEBUG_OUTPUT_DIR + "model_AOIs/" + std::to_string(index) + "/"); // only debug +#endif // DEBUG_OUTPUT_DIR + model_cuts.push_back(std::move(cutAOIs)); + } + + priv::SurfacePatches patches = priv::diff_models(model_cuts, cgal_models, cgal_neg_models, projection); +#ifdef DEBUG_OUTPUT_DIR + priv::store(patches, DEBUG_OUTPUT_DIR + "patches/"); +#endif // DEBUG_OUTPUT_DIR + if (patches.empty()) return {}; + + // fix - convert shape_point_id to expolygon index + // save 1 param(s2i) from diff_models call + for (priv::SurfacePatch &patch : patches) + patch.shape_id = s2i.cvt(patch.shape_id).expolygons_index; + + // calc distance to projection for all outline points of cutAOI(shape) + // it is used for distiguish the top one + uint32_t shapes_points = s2i.get_count(); + // for each point collect all projection distances + priv::VDistances distances = priv::calc_distances(patches, cgal_models, cgal_shape, shapes_points, projection_ratio); + + Point start = shapes_bb.center(); // only align center + + // Use only outline points + // for each point select best projection + priv::ProjectionDistances best_projection = priv::choose_best_distance(distances, shapes, start, s2i, patches); + std::vector use_patch = priv::select_patches(best_projection, patches, shapes, shapes_bb, s2i, model_cuts, cgal_models, projection); + SurfaceCut result = merge_patches(patches, use_patch); + //*/ + +#ifdef DEBUG_OUTPUT_DIR + priv::store(result, DEBUG_OUTPUT_DIR + "result.obj", DEBUG_OUTPUT_DIR + "result_contours/"); +#endif // DEBUG_OUTPUT_DIR + return result; +} + +indexed_triangle_set Slic3r::cut2model(const SurfaceCut &cut, + const Emboss::IProject3d &projection) +{ + assert(!cut.empty()); + size_t count_vertices = cut.vertices.size() * 2; + size_t count_indices = cut.indices.size() * 2; + + // indices from from zig zag + for (const auto &c : cut.contours) { + assert(!c.empty()); + count_indices += c.size() * 2; + } + + indexed_triangle_set result; + result.vertices.reserve(count_vertices); + result.indices.reserve(count_indices); + + // front + result.vertices.insert(result.vertices.end(), + cut.vertices.begin(), cut.vertices.end()); + result.indices.insert(result.indices.end(), + cut.indices.begin(), cut.indices.end()); + + // back + for (const Vec3f &v : cut.vertices) { + Vec3d vd = v.cast(); + Vec3d vd2 = projection.project(vd); + result.vertices.push_back(vd2.cast()); + } + + size_t back_offset = cut.vertices.size(); + for (const auto &i : cut.indices) { + // check range of indices in cut + assert(i.x() + back_offset < result.vertices.size()); + assert(i.y() + back_offset < result.vertices.size()); + assert(i.z() + back_offset < result.vertices.size()); + assert(i.x() >= 0 && i.x() < cut.vertices.size()); + assert(i.y() >= 0 && i.y() < cut.vertices.size()); + assert(i.z() >= 0 && i.z() < cut.vertices.size()); + // Y and Z is swapped CCW triangles for back side + result.indices.emplace_back(i.x() + back_offset, + i.z() + back_offset, + i.y() + back_offset); + } + + // zig zag indices + for (const auto &contour : cut.contours) { + size_t prev_front_index = contour.back(); + size_t prev_back_index = back_offset + prev_front_index; + for (size_t front_index : contour) { + assert(front_index < cut.vertices.size()); + size_t back_index = back_offset + front_index; + result.indices.emplace_back(front_index, prev_front_index, back_index); + result.indices.emplace_back(prev_front_index, prev_back_index, back_index); + prev_front_index = front_index; + prev_back_index = back_index; + } + } + + assert(count_vertices == result.vertices.size()); + assert(count_indices == result.indices.size()); + return result; +} + +// set_skip_for_out_of_aoi helping functions +namespace priv { +// define plane +using PointNormal = std::pair; +using PointNormals = std::array; + +/// +/// Check +/// +/// +/// +/// +/// +bool is_out_of(const Vec3d &v, const PointNormal &point_normal); + +using IsOnSides = std::vector>; +/// +/// Check if triangle t has all vertices out of any plane +/// +/// Triangle +/// Flag is vertex index out of plane +/// True when triangle is out of one of plane +bool is_all_on_one_side(const Vec3i &t, const IsOnSides& is_on_sides); + +} // namespace priv + +bool priv::is_out_of(const Vec3d &v, const PointNormal &point_normal) +{ + const Vec3d& p = point_normal.first; + const Vec3d& n = point_normal.second; + double signed_distance = (v - p).dot(n); + return signed_distance > 1e-5; +}; + +bool priv::is_all_on_one_side(const Vec3i &t, const IsOnSides& is_on_sides) { + for (size_t side = 0; side < 4; side++) { + bool result = true; + for (auto vi : t) { + if (!is_on_sides[vi][side]) { + result = false; + break; + } + } + if (result) return true; + } + return false; +} + +void priv::set_skip_for_out_of_aoi(std::vector &skip_indicies, + const indexed_triangle_set &its, + const Project &projection, + const BoundingBox &shapes_bb) +{ + assert(skip_indicies.size() == its.indices.size()); + // 1`*----* 2` + // / 2 /| + // 1 *----* | + // | | * 3` + // | |/ + // 0 *----* 3 + ////////////////// + std::array, 4> bb; + int index = 0; + for (Point v : + {shapes_bb.min, Point{shapes_bb.min.x(), shapes_bb.max.y()}, + shapes_bb.max, Point{shapes_bb.max.x(), shapes_bb.min.y()}}) + bb[index++] = projection.create_front_back(v); + + // define planes to test + // 0 .. under + // 1 .. left + // 2 .. above + // 3 .. right + size_t prev_i = 3; + // plane is defined by point and normal + PointNormals point_normals; + for (size_t i = 0; i < 4; i++) { + const Vec3d &p1 = bb[i].first; + const Vec3d &p2 = bb[i].second; + const Vec3d &p3 = bb[prev_i].first; + prev_i = i; + + Vec3d v1 = p2 - p1; + v1.normalize(); + Vec3d v2 = p3 - p1; + v2.normalize(); + + Vec3d normal = v2.cross(v1); + normal.normalize(); + + point_normals[i] = {p1, normal}; + } + + // check that projection is not left handed + // Fix for reflected projection + if (is_out_of(point_normals[2].first, point_normals[0])) { + // projection is reflected so normals are reflected + for (auto &pn : point_normals) + pn.second *= -1; + } + + // same meaning as point normal + IsOnSides is_on_sides(its.vertices.size(), {false,false,false,false}); + + // inspect all vertices when it is out of bounding box + tbb::parallel_for(tbb::blocked_range(0, its.vertices.size()), + [&its, &point_normals, &is_on_sides](const tbb::blocked_range &range) { + for (size_t i = range.begin(); i < range.end(); ++i) { + Vec3d v = its.vertices[i].cast(); + // under + above + for (int side : {0, 2}) { + if (is_out_of(v, point_normals[side])) { + is_on_sides[i][side] = true; + // when it is under it can't be above + break; + } + } + // left + right + for (int side : {1, 3}) { + if (is_out_of(v, point_normals[side])) { + is_on_sides[i][side] = true; + // when it is on left side it can't be on right + break; + } + } + } + }); // END parallel for + + // inspect all triangles, when it is out of bounding box + tbb::parallel_for(tbb::blocked_range(0, its.indices.size()), + [&its, &is_on_sides, &skip_indicies](const tbb::blocked_range &range) { + for (size_t i = range.begin(); i < range.end(); ++i) { + if (is_all_on_one_side(its.indices[i], is_on_sides)) + skip_indicies[i] = true; + } + }); // END parallel for +} + +indexed_triangle_set Slic3r::its_mask(const indexed_triangle_set &its, + const std::vector &mask) +{ + if (its.indices.size() != mask.size()) { + assert(false); + return {}; + } + + std::vector cvt_vetices(its.vertices.size(), {std::numeric_limits::max()}); + size_t vertices_count = 0; + size_t faces_count = 0; + for (const auto &t : its.indices) { + size_t index = &t - &its.indices.front(); + if (!mask[index]) continue; + ++faces_count; + for (const auto vi : t) { + uint32_t &cvt = cvt_vetices[vi]; + if (cvt == std::numeric_limits::max()) + cvt = vertices_count++; + } + } + if (faces_count == 0) return {}; + + indexed_triangle_set result; + result.indices.reserve(faces_count); + result.vertices = std::vector(vertices_count); + for (size_t i = 0; i < its.vertices.size(); ++i) { + uint32_t index = cvt_vetices[i]; + if (index == std::numeric_limits::max()) continue; + result.vertices[index] = its.vertices[i]; + } + + for (const stl_triangle_vertex_indices &f : its.indices) + if (mask[&f - &its.indices.front()]) + result.indices.push_back(stl_triangle_vertex_indices( + cvt_vetices[f[0]], cvt_vetices[f[1]], cvt_vetices[f[2]])); + + return result; +} + +indexed_triangle_set Slic3r::its_cut_AoI(const indexed_triangle_set &its, + const BoundingBox &bb, + const Emboss::IProjection &projection) +{ + std::vector skip_indicies(its.indices.size(), false); + priv::set_skip_for_out_of_aoi(skip_indicies, its, projection, bb); + // invert values in vector of bool + skip_indicies.flip(); + return its_mask(its, skip_indicies); +} + +void priv::set_skip_by_angle(std::vector &skip_indicies, + const indexed_triangle_set &its, + const Project3d &projection, + double max_angle) +{ + assert(max_angle < 90. && max_angle > 89.); + assert(skip_indicies.size() == its.indices.size()); + float threshold = static_cast(cos(max_angle / 180. * M_PI)); + for (const stl_triangle_vertex_indices& face : its.indices) { + size_t index = &face - &its.indices.front(); + if (skip_indicies[index]) continue; + Vec3f n = its_face_normal(its, face); + const Vec3f& v = its.vertices[face[0]]; + const Vec3d vd = v.cast(); + // Improve: For Orthogonal Projection it is same for each vertex + Vec3d projectedd = projection.project(vd); + Vec3f projected = projectedd.cast(); + Vec3f project_dir = projected - v; + project_dir.normalize(); + float cos_alpha = project_dir.dot(n); + if (cos_alpha > threshold) continue; + skip_indicies[index] = true; + } +} + +priv::CutMesh priv::to_cgal(const indexed_triangle_set &its, + const std::vector &skip_indicies, + bool flip) +{ + const std::vector &vertices = its.vertices; + const std::vector &indices = its.indices; + + std::vector use_vetices(vertices.size(), {false}); + + size_t vertices_count = 0; + size_t faces_count = 0; + size_t edges_count = 0; + + for (const auto &t : indices) { + size_t index = &t - &indices.front(); + if (skip_indicies[index]) continue; + ++faces_count; + size_t count_used_vertices = 0; + for (const auto vi : t) { + if (!use_vetices[vi]) { + ++vertices_count; + use_vetices[vi] = true; + } else { + ++count_used_vertices; + } + } + switch (count_used_vertices) { + case 3: break; // all edges are already counted + case 2: edges_count += 2; break; + case 1: + case 0: edges_count += 3; break; + default: assert(false); + } + } + assert(vertices_count <= vertices.size()); + assert(edges_count <= (indices.size() * 3)); + assert(faces_count <= indices.size()); + + CutMesh result; + result.reserve(vertices_count, edges_count, faces_count); + + std::vector to_filtrated_vertices_index(vertices.size()); + size_t filtrated_vertices_index = 0; + for (size_t i = 0; i < vertices.size(); ++i) + if (use_vetices[i]) { + to_filtrated_vertices_index[i] = VI(filtrated_vertices_index); + ++filtrated_vertices_index; + } + + for (const stl_vertex& v : vertices) { + if (!use_vetices[&v - &vertices.front()]) continue; + result.add_vertex(CutMesh::Point{v.x(), v.y(), v.z()}); + } + + if (!flip) { + for (const stl_triangle_vertex_indices &f : indices) { + if (skip_indicies[&f - &indices.front()]) continue; + result.add_face(to_filtrated_vertices_index[f[0]], + to_filtrated_vertices_index[f[1]], + to_filtrated_vertices_index[f[2]]); + } + } else { + for (const stl_triangle_vertex_indices &f : indices) { + if (skip_indicies[&f - &indices.front()]) continue; + result.add_face(to_filtrated_vertices_index[f[2]], + to_filtrated_vertices_index[f[1]], + to_filtrated_vertices_index[f[0]]); + } + } + + return result; +} + +bool priv::exist_duplicit_vertex(const CutMesh &mesh) { + std::vector points; + points.reserve(mesh.vertices().size()); + // copy points + for (VI vi : mesh.vertices()) { + const P3 &p = mesh.point(vi); + points.emplace_back(p.x(), p.y(), p.z()); + } + std::sort(points.begin(), points.end(), [](const Vec3d &v1, const Vec3d &v2) { + return v1.x() < v2.x() || + (v1.x() == v2.x() && + (v1.y() < v2.y() || + (v1.y() == v2.y() && + v1.z() < v2.z()))); + }); + // find first duplicit + auto it = std::adjacent_find(points.begin(), points.end()); + return it != points.end(); +} + +priv::CutMesh priv::to_cgal(const ExPolygons &shapes, + const Project &projection) +{ + if (shapes.empty()) return {}; + + CutMesh result; + EdgeShapeMap edge_shape_map = result.add_property_map(edge_shape_map_name).first; + FaceShapeMap face_shape_map = result.add_property_map(face_shape_map_name).first; + + std::vector indices; + auto insert_contour = [&projection, &indices, &result, + &edge_shape_map, &face_shape_map] + (const Polygon &polygon) { + indices.clear(); + indices.reserve(polygon.points.size() * 2); + size_t num_vertices_old = result.number_of_vertices(); + for (const Point &polygon_point : polygon.points) { + auto [front, back] = projection.create_front_back(polygon_point); + P3 v_front{front.x(), front.y(), front.z()}; + VI vi1 = result.add_vertex(v_front); + assert(vi1.idx() == (indices.size() + num_vertices_old)); + indices.push_back(vi1); + + P3 v_back{back.x(), back.y(), back.z()}; + VI vi2 = result.add_vertex(v_back); + assert(vi2.idx() == (indices.size() + num_vertices_old)); + indices.push_back(vi2); + } + + auto find_edge = [&result](FI fi, VI from, VI to) { + HI hi = result.halfedge(fi); + for (; result.target(hi) != to; hi = result.next(hi)); + assert(result.source(hi) == from); + assert(result.target(hi) == to); + return result.edge(hi); + }; + + uint32_t contour_index = static_cast(num_vertices_old / 2); + for (int32_t i = 0; i < int32_t(indices.size()); i += 2) { + bool is_first = i == 0; + bool is_last = size_t(i + 2) >= indices.size(); + int32_t j = is_last ? 0 : (i + 2); + + FI fi1 = result.add_face(indices[i], indices[j], indices[i + 1]); + EI ei1 = find_edge(fi1, indices[i + 1], indices[i]); + EI ei2 = find_edge(fi1, indices[j], indices[i + 1]); + FI fi2 = result.add_face(indices[j], indices[j + 1], indices[i + 1]); + IntersectingElement element {contour_index, (unsigned char)IntersectingElement::Type::undefined}; + if (is_first) element.set_is_first(); + if (is_last) element.set_is_last(); + edge_shape_map[ei1] = element.set_type(IntersectingElement::Type::edge_1); + face_shape_map[fi1] = element.set_type(IntersectingElement::Type::face_1); + edge_shape_map[ei2] = element.set_type(IntersectingElement::Type::edge_2); + face_shape_map[fi2] = element.set_type(IntersectingElement::Type::face_2); + ++contour_index; + } + }; + + size_t count_point = count_points(shapes); + result.reserve(result.number_of_vertices() + 2 * count_point, + result.number_of_edges() + 4 * count_point, + result.number_of_faces() + 2 * count_point); + + // Identify polygon + for (const ExPolygon &shape : shapes) { + insert_contour(shape.contour); + for (const Polygon &hole : shape.holes) + insert_contour(hole); + } + assert(!exist_duplicit_vertex(result)); + return result; +} + +priv::ModelCut2index::ModelCut2index(const VCutAOIs &cuts) +{ + // prepare offsets + m_offsets.reserve(cuts.size()); + uint32_t offset = 0; + for (const CutAOIs &model_cuts: cuts) { + m_offsets.push_back(offset); + offset += model_cuts.size(); + } + m_count = offset; +} + +uint32_t priv::ModelCut2index::calc_index(const ModelCutId &id) const +{ + assert(id.model_index < m_offsets.size()); + uint32_t offset = m_offsets[id.model_index]; + uint32_t res = offset + id.cut_index; + assert(((id.model_index+1) < m_offsets.size() && res < m_offsets[id.model_index+1]) || + ((id.model_index+1) == m_offsets.size() && res < m_count)); + return res; +} + +priv::ModelCutId priv::ModelCut2index::calc_id(uint32_t index) const +{ + assert(index < m_count); + ModelCutId result{0,0}; + // find shape index + for (size_t model_index = 1; model_index < m_offsets.size(); ++model_index) { + if (m_offsets[model_index] > index) break; + result.model_index = model_index; + } + result.cut_index = index - m_offsets[result.model_index]; + return result; +} + +// cut_from_model help functions +namespace priv { + +/// +/// Track source of intersection +/// Help for anotate inner and outer faces +/// +struct Visitor : public CGAL::Polygon_mesh_processing::Corefinement::Default_visitor { + Visitor(const CutMesh &object, const CutMesh &shape, EdgeShapeMap edge_shape_map, + FaceShapeMap face_shape_map, VertexShapeMap vert_shape_map, bool* is_valid) : + object(object), shape(shape), edge_shape_map(edge_shape_map), face_shape_map(face_shape_map), + vert_shape_map(vert_shape_map), is_valid(is_valid) + {} + + const CutMesh &object; + const CutMesh &shape; + + // Properties of the shape mesh: + EdgeShapeMap edge_shape_map; + FaceShapeMap face_shape_map; + + // Properties of the object mesh. + VertexShapeMap vert_shape_map; + + // check for anomalities + bool* is_valid; + + // keep source of intersection for each intersection + // used to copy data into vert_shape_map + std::vector intersections; + + /// + /// Called when a new intersection point is detected. + /// The intersection is detected using a face of tm_f and an edge of tm_e. + /// Intersecting an edge hh_edge from tm_f with a face h_e of tm_e. + /// https://doc.cgal.org/latest/Polygon_mesh_processing/classPMPCorefinementVisitor.html#a00ee0ca85db535a48726a92414acda7f + /// + /// The id of the intersection point, starting at 0. Ids are consecutive. + /// Dimension of a simplex part of face(h_e) that is intersected by edge(h_f): + /// 0 for vertex: target(h_e) + /// 1 for edge: h_e + /// 2 for the interior of face: face(h_e) + /// + /// A halfedge from tm_f indicating the simplex intersected: + /// if sdim==0 the target of h_f is the intersection point, + /// if sdim==1 the edge of h_f contains the intersection point in its interior, + /// if sdim==2 the face of h_f contains the intersection point in its interior. + /// @Vojta: Edge of tm_f, see is_target_coplanar & is_source_coplanar whether any vertex of h_f is coplanar with face(h_e). + /// + /// A halfedge from tm_e + /// @Vojta: Vertex, halfedge or face of tm_e intersected by h_f, see comment at sdim. + /// + /// Mesh containing h_f + /// Mesh containing h_e + /// True if the target of h_e is the intersection point + /// @Vojta: source(h_f) is coplanar with face(made by h_e). + /// True if the source of h_e is the intersection point + /// @Vojta: target(h_f) is coplanar with face(h_e). + void intersection_point_detected(std::size_t i_id, + int sdim, + HI h_f, + HI h_e, + const CutMesh &tm_f, + const CutMesh &tm_e, + bool is_target_coplanar, + bool is_source_coplanar); + + /// + /// Called when a new vertex is added in tm (either an edge split or a vertex inserted in the interior of a face). + /// Fill vertex_shape_map by intersections + /// + /// Order number of intersection point + /// New added vertex + /// Affected mesh + void new_vertex_added(std::size_t i_id, VI v, const CutMesh &tm); +}; + +/// +/// Distiquish face type for half edge +/// +/// Define face +/// Mesh to process +/// Vertices of mesh made by shapes +/// Keep information about source of created vertex +/// +/// Convert index to shape point from ExPolygons +/// Face type defined by hi +bool is_face_inside(HI hi, + const CutMesh &mesh, + const CutMesh &shape_mesh, + const VertexShapeMap &vertex_shape_map, + const ExPolygonsIndices &shape2index); + +/// +/// Face with constrained edge are inside/outside by type of intersection +/// Other set to not_constrained(still it could be inside/outside) +/// +/// [Output] property map with type of faces +/// Mesh to process +/// Keep information about source of created vertex +/// Dynamic Edge Constrained Map of bool +/// Vertices of mesh made by shapes +/// Convert index to shape point from ExPolygons +void set_face_type(FaceTypeMap &face_type_map, + const CutMesh &mesh, + const VertexShapeMap &vertex_shape_map, + const EdgeBoolMap &ecm, + const CutMesh &shape_mesh, + const ExPolygonsIndices &shape2index); + +/// +/// Change FaceType from not_constrained to inside +/// For neighbor(or neighbor of neighbor of ...) of inside triangles. +/// Process only not_constrained triangles +/// +/// Corefined mesh +/// In/Out map with faces type +void flood_fill_inner(const CutMesh &mesh, FaceTypeMap &face_type_map); + +/// +/// Collect connected inside faces +/// Collect outline half edges +/// +/// Queue of face to process - find connected +/// [Output] collected Face indices from mesh +/// [Output] collected Halfedge indices from mesh +/// Use flag inside / outside +/// NOTE: Modify in function: inside -> inside_processed +/// mesh to process +void collect_surface_data(std::queue &process, + std::vector &faces, + std::vector &outlines, + FaceTypeMap &face_type_map, + const CutMesh &mesh); + +/// +/// Create areas from mesh surface +/// +/// Model +/// Cutted shapes +/// Define Triangles of interest. +/// Edge between inside / outside. +/// NOTE: Not const because it need to flag proccessed faces +/// Areas of interest from mesh +CutAOIs create_cut_area_of_interests(const CutMesh &mesh, + const ExPolygons &shapes, + FaceTypeMap &face_type_map); + +} // namespace priv + +void priv::Visitor::intersection_point_detected(std::size_t i_id, + int sdim, + HI h_f, + HI h_e, + const CutMesh &tm_f, + const CutMesh &tm_e, + bool is_target_coplanar, + bool is_source_coplanar) +{ + if (i_id >= intersections.size()) { + size_t capacity = Slic3r::next_highest_power_of_2(i_id + 1); + intersections.reserve(capacity); + intersections.resize(capacity); + } + + const IntersectingElement *intersection_ptr = nullptr; + if (&tm_e == &shape) { + assert(&tm_f == &object); + switch (sdim) { + case 1: + // edge x edge intersection + intersection_ptr = &edge_shape_map[shape.edge(h_e)]; + break; + case 2: + // edge x face intersection + intersection_ptr = &face_shape_map[shape.face(h_e)]; + break; + default: assert(false); + } + if (is_target_coplanar) + vert_shape_map[object.source(h_f)] = intersection_ptr; + if (is_source_coplanar) + vert_shape_map[object.target(h_f)] = intersection_ptr; + } else { + assert(&tm_f == &shape && &tm_e == &object); + assert(!is_target_coplanar); + assert(!is_source_coplanar); + if (is_target_coplanar || is_source_coplanar) + *is_valid = false; + intersection_ptr = &edge_shape_map[shape.edge(h_f)]; + if (sdim == 0) vert_shape_map[object.target(h_e)] = intersection_ptr; + } + + if (intersection_ptr->shape_point_index == std::numeric_limits::max()) { + // there is unexpected intersection + // Top (or Bottom) shape contour edge (or vertex) intersection + // Suggest to change projection min/max limits + *is_valid = false; + } + intersections[i_id] = intersection_ptr; +} + +void priv::Visitor::new_vertex_added(std::size_t i_id, VI v, const CutMesh &tm) +{ + assert(&tm == &object); + assert(i_id < intersections.size()); + const IntersectingElement *intersection_ptr = intersections[i_id]; + assert(intersection_ptr != nullptr); + // intersection was not filled in function intersection_point_detected + //assert(intersection_ptr->point_index != std::numeric_limits::max()); + vert_shape_map[v] = intersection_ptr; +} + +bool priv::is_face_inside(HI hi, + const CutMesh &mesh, + const CutMesh &shape_mesh, + const VertexShapeMap &vertex_shape_map, + const ExPolygonsIndices &shape2index) +{ + VI vi_from = mesh.source(hi); + VI vi_to = mesh.target(hi); + // This face has a constrained edge. + const IntersectingElement &shape_from = *vertex_shape_map[vi_from]; + const IntersectingElement &shape_to = *vertex_shape_map[vi_to]; + assert(shape_from.shape_point_index != std::numeric_limits::max()); + assert(shape_from.attr != (unsigned char) IntersectingElement::Type::undefined); + assert(shape_to.shape_point_index != std::numeric_limits::max()); + assert(shape_to.attr != (unsigned char) IntersectingElement::Type::undefined); + + // index into contour + uint32_t i_from = shape_from.shape_point_index; + uint32_t i_to = shape_to.shape_point_index; + IntersectingElement::Type type_from = shape_from.get_type(); + IntersectingElement::Type type_to = shape_to.get_type(); + if (i_from == i_to && type_from == type_to) { + // intersecting element must be face + assert(type_from == IntersectingElement::Type::face_1 || + type_from == IntersectingElement::Type::face_2); + + // count of vertices is twice as count of point in the contour + uint32_t i = i_from * 2; + // j is next contour point in vertices + uint32_t j = i + 2; + if (shape_from.is_last()) { + ExPolygonsIndex point_id = shape2index.cvt(i_from); + point_id.point_index = 0; + j = shape2index.cvt(point_id)*2; + } + + // opposit point(in triangle face) to edge + const P3 &p = mesh.point(mesh.target(mesh.next(hi))); + + // abc is source triangle face + CGAL::Sign abcp = type_from == IntersectingElement::Type::face_1 ? + CGAL::orientation(shape_mesh.point(VI(i)), + shape_mesh.point(VI(i + 1)), + shape_mesh.point(VI(j)), p) : + // type_from == IntersectingElement::Type::face_2 + CGAL::orientation(shape_mesh.point(VI(j)), + shape_mesh.point(VI(i + 1)), + shape_mesh.point(VI(j + 1)), p); + return abcp == CGAL::POSITIVE; + } else if (i_from < i_to || (i_from == i_to && type_from < type_to)) { + bool is_last = shape_to.is_last() && shape_from.is_first(); + // check continuity of indicies + assert(i_from == i_to || is_last || (i_from + 1) == i_to); + return !is_last; + } else { + assert(i_from > i_to || (i_from == i_to && type_from > type_to)); + bool is_last = shape_to.is_first() && shape_from.is_last(); + // check continuity of indicies + assert(i_from == i_to || is_last || (i_to + 1) == i_from); + return is_last; + } + + assert(false); + return false; +} + +void priv::set_face_type(FaceTypeMap &face_type_map, + const CutMesh &mesh, + const VertexShapeMap &vertex_shape_map, + const EdgeBoolMap &ecm, + const CutMesh &shape_mesh, + const ExPolygonsIndices &shape2index) +{ + for (EI ei : mesh.edges()) { + if (!ecm[ei]) continue; + HI hi = mesh.halfedge(ei); + FI fi = mesh.face(hi); + bool is_inside = is_face_inside(hi, mesh, shape_mesh, vertex_shape_map, shape2index); + face_type_map[fi] = is_inside ? FaceType::inside : FaceType::outside; + HI hi_op = mesh.opposite(hi); + assert(hi_op.is_valid()); + if (!hi_op.is_valid()) continue; + FI fi_op = mesh.face(hi_op); + assert(fi_op.is_valid()); + if (!fi_op.is_valid()) continue; + face_type_map[fi_op] = (!is_inside) ? FaceType::inside : FaceType::outside; + } +} + +priv::CutAOIs priv::cut_from_model(CutMesh &cgal_model, + const ExPolygons &shapes, + CutMesh &cgal_shape, + float projection_ratio, + const ExPolygonsIndices &s2i) +{ + // pointer to edge or face shape_map + VertexShapeMap vert_shape_map = cgal_model.add_property_map(vert_shape_map_name, nullptr).first; + + // detect anomalities in visitor. + bool is_valid = true; + // NOTE: map are created when convert shapes to cgal model + const EdgeShapeMap& edge_shape_map = cgal_shape.property_map(edge_shape_map_name).first; + const FaceShapeMap& face_shape_map = cgal_shape.property_map(face_shape_map_name).first; + Visitor visitor{cgal_model, cgal_shape, edge_shape_map, face_shape_map, vert_shape_map, &is_valid}; + + // a property map containing the constrained-or-not status of each edge + EdgeBoolMap ecm = cgal_model.add_property_map(is_constrained_edge_name, false).first; + const auto &p = CGAL::parameters::visitor(visitor) + .edge_is_constrained_map(ecm) + .throw_on_self_intersection(false); + const auto& q = CGAL::parameters::do_not_modify(true); + CGAL::Polygon_mesh_processing::corefine(cgal_model, cgal_shape, p, q); + + if (!is_valid) return {}; + + FaceTypeMap face_type_map = cgal_model.add_property_map(face_type_map_name, FaceType::not_constrained).first; + + // Select inside and outside face in model + set_face_type(face_type_map, cgal_model, vert_shape_map, ecm, cgal_shape, s2i); +#ifdef DEBUG_OUTPUT_DIR + store(cgal_model, face_type_map, DEBUG_OUTPUT_DIR + "constrained/"); // only debug +#endif // DEBUG_OUTPUT_DIR + + // flood fill the other faces inside the region. + flood_fill_inner(cgal_model, face_type_map); + +#ifdef DEBUG_OUTPUT_DIR + store(cgal_model, face_type_map, DEBUG_OUTPUT_DIR + "filled/", true); // only debug +#endif // DEBUG_OUTPUT_DIR + + // IMPROVE: AOIs area could be created during flood fill + return create_cut_area_of_interests(cgal_model, shapes, face_type_map); +} + +void priv::flood_fill_inner(const CutMesh &mesh, + FaceTypeMap &face_type_map) +{ + std::vector process; + // guess count of connected not constrained triangles + size_t guess_size = 128; + process.reserve(guess_size); + + // check if neighbor(one of three in triangle) has type inside + auto has_inside_neighbor = [&mesh, &face_type_map](FI fi) { + HI hi = mesh.halfedge(fi); + HI hi_end = hi; + auto exist_next = [&hi, &hi_end, &mesh]() -> bool { + hi = mesh.next(hi); + return hi != hi_end; + }; + // loop over 3 half edges of face + do { + HI hi_opposite = mesh.opposite(hi); + // open edge doesn't have opposit half edge + if (!hi_opposite.is_valid()) continue; + FI fi_opposite = mesh.face(hi_opposite); + if (!fi_opposite.is_valid()) continue; + if (face_type_map[fi_opposite] == FaceType::inside) return true; + } while (exist_next()); + return false; + }; + + for (FI fi : mesh.faces()) { + FaceType type = face_type_map[fi]; + if (type != FaceType::not_constrained) continue; + if (!has_inside_neighbor(fi)) continue; + assert(process.empty()); + process.push_back(fi); + //store(mesh, face_type_map, DEBUG_OUTPUT_DIR + "progress.off"); + + while (!process.empty()) { + FI process_fi = process.back(); + process.pop_back(); + // Do not fill twice + FaceType& process_type = face_type_map[process_fi]; + if (process_type == FaceType::inside) continue; + process_type = FaceType::inside; + + // check neighbor triangle + HI hi = mesh.halfedge(process_fi); + HI hi_end = hi; + auto exist_next = [&hi, &hi_end, &mesh]() -> bool { + hi = mesh.next(hi); + return hi != hi_end; + }; + do { + HI hi_opposite = mesh.opposite(hi); + // open edge doesn't have opposit half edge + if (!hi_opposite.is_valid()) continue; + FI fi_opposite = mesh.face(hi_opposite); + if (!fi_opposite.is_valid()) continue; + FaceType type_opposite = face_type_map[fi_opposite]; + if (type_opposite == FaceType::not_constrained) + process.push_back(fi_opposite); + } while (exist_next()); + } + } +} + +void priv::collect_surface_data(std::queue &process, + std::vector &faces, + std::vector &outlines, + FaceTypeMap &face_type_map, + const CutMesh &mesh) +{ + assert(!process.empty()); + assert(faces.empty()); + assert(outlines.empty()); + while (!process.empty()) { + FI fi = process.front(); + process.pop(); + + FaceType &fi_type = face_type_map[fi]; + // Do not process twice + if (fi_type == FaceType::inside_processed) continue; + assert(fi_type == FaceType::inside); + // flag face as processed + fi_type = FaceType::inside_processed; + faces.push_back(fi); + + // check neighbor triangle + HI hi = mesh.halfedge(fi); + HI hi_end = hi; + do { + HI hi_opposite = mesh.opposite(hi); + // open edge doesn't have opposit half edge + if (!hi_opposite.is_valid()) { + outlines.push_back(hi); + hi = mesh.next(hi); + continue; + } + FI fi_opposite = mesh.face(hi_opposite); + if (!fi_opposite.is_valid()) { + outlines.push_back(hi); + hi = mesh.next(hi); + continue; + } + FaceType side = face_type_map[fi_opposite]; + if (side == FaceType::inside) { + process.emplace(fi_opposite); + } else if (side == FaceType::outside) { + // store outlines + outlines.push_back(hi); + } + hi = mesh.next(hi); + } while (hi != hi_end); + } +} + +void priv::create_reduce_map(ReductionMap &reduction_map, const CutMesh &mesh) +{ + const VertexShapeMap &vert_shape_map = mesh.property_map(vert_shape_map_name).first; + const EdgeBoolMap &ecm = mesh.property_map(is_constrained_edge_name).first; + + // check if vertex was made by edge_2 which is diagonal of quad + auto is_reducible_vertex = [&vert_shape_map](VI reduction_from) -> bool { + const IntersectingElement *ie = vert_shape_map[reduction_from]; + if (ie == nullptr) return false; + IntersectingElement::Type type = ie->get_type(); + return type == IntersectingElement::Type::edge_2; + }; + + /// + /// Append reduction or change existing one. + /// + /// HalEdge between outside and inside face. + /// Target vertex will be reduced, source vertex left + /// [[maybe_unused]] &face_type_map, &is_reducible_vertex are need only in debug + auto add_reduction = [&] //&reduction_map, &mesh, &face_type_map, &is_reducible_vertex + (HI hi) { + VI erase = mesh.target(hi); + VI left = mesh.source(hi); + assert(is_reducible_vertex(erase)); + assert(!is_reducible_vertex(left)); + VI &vi = reduction_map[erase]; + // check if it is first add + if (vi.is_valid()) + return; + + // check that all triangles after reduction has 'erase' and 'left' vertex + // on same side of opposite line of vertex in triangle + Vec3d v_erase = to_vec3d(mesh.point(erase)); + Vec3d v_left = to_vec3d(mesh.point(left)); + for (FI fi : mesh.faces_around_target(hi)) { + if (!fi.is_valid()) + continue; + // get vertices of rest + VI vi_a, vi_b; + for (VI vi : mesh.vertices_around_face(mesh.halfedge(fi))) { + if (!vi.is_valid()) + continue; + if (vi == erase) + continue; + if (!vi_a.is_valid()) + vi_a = vi; + else { + assert(!vi_b.is_valid()); + vi_b = vi; + } + } + assert(vi_b.is_valid()); + // do not check triangle, which will be removed + if (vi_a == left || vi_b == left) + continue; + + Vec3d v_a = to_vec3d(mesh.point(vi_a)); + Vec3d v_b = to_vec3d(mesh.point(vi_b)); + // Vectors of triangle edges + Vec3d v_ab = v_b - v_a; + Vec3d v_ae = v_erase - v_a; + Vec3d v_al = v_left - v_a; + + Vec3d n1 = v_ab.cross(v_ae); + Vec3d n2 = v_ab.cross(v_al); + // check that normal has same direction + if (((n1.x() > 0) != (n2.x() > 0)) || + ((n1.y() > 0) != (n2.y() > 0)) || + ((n1.z() > 0) != (n2.z() > 0))) + return; // this reduction will create CCW triangle + } + + reduction_map[erase] = left; + // I have no better rule than take the first + // for decide which reduction will be better + // But it could be use only one of them + }; + + for (EI ei : mesh.edges()) { + if (!ecm[ei]) continue; + HI hi = mesh.halfedge(ei); + VI vi = mesh.target(hi); + if (is_reducible_vertex(vi)) add_reduction(hi); + + HI hi_op = mesh.opposite(hi); + VI vi_op = mesh.target(hi_op); + if (is_reducible_vertex(vi_op)) add_reduction(hi_op); + } +#ifdef DEBUG_OUTPUT_DIR + store(mesh, reduction_map, DEBUG_OUTPUT_DIR + "reduces/"); +#endif // DEBUG_OUTPUT_DIR +} + +priv::CutAOIs priv::create_cut_area_of_interests(const CutMesh &mesh, + const ExPolygons &shapes, + FaceTypeMap &face_type_map) +{ + // IMPROVE: Create better heuristic for count. + size_t faces_per_cut = mesh.faces().size() / shapes.size(); + size_t outlines_per_cut = faces_per_cut / 2; + size_t cuts_per_model = shapes.size() * 2; + + CutAOIs result; + result.reserve(cuts_per_model); + + // It is faster to use one queue for all cuts + std::queue process; + for (FI fi : mesh.faces()) { + if (face_type_map[fi] != FaceType::inside) continue; + + CutAOI cut; + std::vector &faces = cut.first; + std::vector &outlines = cut.second; + + // faces for one surface cut + faces.reserve(faces_per_cut); + // outline for one surface cut + outlines.reserve(outlines_per_cut); + + assert(process.empty()); + // Process queue of faces to separate to surface_cut + process.push(fi); + collect_surface_data(process, faces, outlines, face_type_map, mesh); + assert(!faces.empty()); + assert(!outlines.empty()); + result.emplace_back(std::move(cut)); + } + return result; +} + +namespace priv { + +/// +/// Calculate projection distance of point [in mm] +/// +/// Point to calc distance +/// Index of point on contour +/// Model of cutting shape +/// Ratio for best projection distance +/// Distance of point from best projection +float calc_distance(const P3 &p, + uint32_t pi, + const CutMesh &shapes_mesh, + float projection_ratio); + +} + +float priv::calc_distance(const P3 &p, + uint32_t pi, + const CutMesh &shapes_mesh, + float projection_ratio) +{ + // It is known because shapes_mesh is created inside of private space + VI vi_start(2 * pi); + VI vi_end(2 * pi + 1); + + // Get range for intersection + const P3 &start = shapes_mesh.point(vi_start); + const P3 &end = shapes_mesh.point(vi_end); + + // find index in vector with biggest difference + size_t max_i = 0; + float max_val = 0.f; + for (size_t i = 0; i < 3; i++) { + float val = start[i] - end[i]; + // abs value + if (val < 0.f) val *= -1.f; + if (max_val < val) { + max_val = val; + max_i = i; + } + } + + float from_start = p[max_i] - start[max_i]; + float best_distance = projection_ratio * (end[max_i] - start[max_i]); + return from_start - best_distance; +} + +priv::VDistances priv::calc_distances(const SurfacePatches &patches, + const CutMeshes &models, + const CutMesh &shapes_mesh, + size_t count_shapes_points, + float projection_ratio) +{ + priv::VDistances result(count_shapes_points); + for (const SurfacePatch &patch : patches) { + // map is created during intersection by corefine visitor + const VertexShapeMap &vert_shape_map = + models[patch.model_id].property_map(vert_shape_map_name).first; + uint32_t patch_index = &patch - &patches.front(); + // map is created during patch creation / dividing + const CvtVI2VI& cvt = patch.mesh.property_map(patch_source_name).first; + // for each point on outline + for (const Loop &loop : patch.loops) + for (const VI &vi_patch : loop) { + VI vi_model = cvt[vi_patch]; + if (!vi_model.is_valid()) continue; + const IntersectingElement *ie = vert_shape_map[vi_model]; + if (ie == nullptr) continue; + assert(ie->shape_point_index != std::numeric_limits::max()); + assert(ie->attr != (unsigned char) IntersectingElement::Type::undefined); + uint32_t pi = ie->shape_point_index; + assert(pi <= count_shapes_points); + std::vector &pds = result[pi]; + uint32_t model_index = patch.model_id; + uint32_t aoi_index = patch.aoi_id; + //uint32_t hi_index = &hi - &patch.outline.front(); + const P3 &p = patch.mesh.point(vi_patch); + float distance = calc_distance(p, pi, shapes_mesh, projection_ratio); + pds.push_back({model_index, aoi_index, patch_index, distance}); + } + } + return result; +} + + +#include "libslic3r/AABBTreeLines.hpp" +#include "libslic3r/Line.hpp" +// functions for choose_best_distance +namespace priv { + +// euler square size of vector stored in Point +float calc_size_sq(const Point &p); + +// structure to store index and distance together +struct ClosePoint +{ + // index of closest point from another shape + uint32_t index = std::numeric_limits::max(); + // squere distance to index + float dist_sq = std::numeric_limits::max(); +}; + +struct SearchData{ +// IMPROVE: float lines are enough +std::vector lines; +// convert line index into Shape point index +std::vector cvt; +// contain lines from prev point to Point index +AABBTreeIndirect::Tree<2, double> tree; +}; + +SearchData create_search_data(const ExPolygons &shapes, const std::vector& mask); +uint32_t get_closest_point_index(const SearchData &sd, size_t line_idx, const Vec2d &hit_point, const ExPolygons &shapes, const ExPolygonsIndices &s2i); + +// use AABB Tree Lines to find closest point +uint32_t find_closest_point_index(const Point &p, const ExPolygons &shapes, const ExPolygonsIndices &s2i, const std::vector &mask); + +std::pair find_closest_point_pair(const ExPolygons &shapes, const std::vector &done_shapes, const ExPolygonsIndices &s2i, const std::vector &mask); + +// Search for closest projection to wanted distance +const ProjectionDistance *get_closest_projection(const ProjectionDistances &distance, float wanted_distance); + +// fill result around known index inside one polygon +void fill_polygon_distances(const ProjectionDistance &pd, uint32_t index, const ExPolygonsIndex &id, ProjectionDistances & result, const ExPolygon &shape, const VDistances &distances); + +// search for closest projection for expolygon +// choose correct cut by source point +void fill_shape_distances(uint32_t start_index, const ProjectionDistance *start_pd, ProjectionDistances &result, const ExPolygonsIndices &s2i, const ExPolygon &shape, const VDistances &distances); + +// find close points between finished and unfinished ExPolygons +ClosePoint find_close_point(const Point &p, ProjectionDistances &result, std::vector& finished_shapes,const ExPolygonsIndices &s2i, const ExPolygons &shapes); + +} + +float priv::calc_size_sq(const Point &p){ + // NOTE: p.squaredNorm() can't be use due to overflow max int value + return (float) p.x() * p.x() + (float) p.y() * p.y(); +} + +priv::SearchData priv::create_search_data(const ExPolygons &shapes, + const std::vector &mask) +{ + // IMPROVE: Use float precission (it is enough) + SearchData sd; + sd.lines.reserve(mask.size()); + sd.cvt.reserve(mask.size()); + size_t index = 0; + auto add_lines = [&sd, &index, &mask] + (const Polygon &poly) { + Vec2d prev = poly.back().cast(); + bool use_point = mask[index + poly.points.size() - 1]; + for (const Point &p : poly.points) { + if (!use_point) { + use_point = mask[index]; + if (use_point) prev = p.cast(); + } else if (!mask[index]) { + use_point = false; + } else { + Vec2d p_d = p.cast(); + sd.lines.emplace_back(prev, p_d); + sd.cvt.push_back(index); + prev = p_d; + } + ++index; + } + }; + + for (const ExPolygon &shape : shapes) { + add_lines(shape.contour); + for (const Polygon &hole : shape.holes) add_lines(hole); + } + sd.tree = AABBTreeLines::build_aabb_tree_over_indexed_lines(sd.lines); + return sd; +} + +uint32_t priv::get_closest_point_index(const SearchData &sd, + size_t line_idx, + const Vec2d &hit_point, + const ExPolygons &shapes, + const ExPolygonsIndices &s2i) +{ + const Linef &line = sd.lines[line_idx]; + Vec2d dir = line.a - line.b; + Vec2d dir_abs = dir.cwiseAbs(); + // use x coordinate + int i = (dir_abs.x() > dir_abs.y())? 0 :1; + + bool use_index = abs(line.a[i] - hit_point[i]) > + abs(line.b[i] - hit_point[i]); + size_t point_index = sd.cvt[line_idx]; + + // Lambda used only for check result + [[maybe_unused]] auto is_same = [&s2i, &shapes] + (const Vec2d &p, size_t i) -> bool { + auto id = s2i.cvt(i); + const ExPolygon &shape = shapes[id.expolygons_index]; + const Polygon &poly = (id.polygon_index == 0) ? + shape.contour : + shape.holes[id.polygon_index - 1]; + Vec2i p_ = p.cast(); + return p_ == poly[id.point_index]; + }; + + if (use_index) { + assert(is_same(line.b, point_index)); + return point_index; + } + auto id = s2i.cvt(point_index); + if (id.point_index != 0) { + assert(is_same(line.a, point_index - 1)); + return point_index - 1; + } + const ExPolygon &shape = shapes[id.expolygons_index]; + size_t count_polygon_points = (id.polygon_index == 0) ? + shape.contour.size() : + shape.holes[id.polygon_index - 1].size(); + size_t prev_point_index = point_index + (count_polygon_points - 1); + assert(is_same(line.a, prev_point_index)); + // return previous point index + return prev_point_index; +} + +// use AABB Tree Lines +uint32_t priv::find_closest_point_index(const Point &p, + const ExPolygons &shapes, + const ExPolygonsIndices &s2i, + const std::vector &mask) +{ + SearchData sd = create_search_data(shapes, mask); + if (sd.tree.nodes().size() == 0){ + // no lines in expolygon, check whether exist point to start + double closest_square_distance = INFINITY; + uint32_t closest_id = -1; + for (uint32_t i = 0; i < mask.size(); i++) + if (mask[i]){ + ExPolygonsIndex ei = s2i.cvt(i); + const Point& s_p = ei.is_contour()? + shapes[ei.expolygons_index].contour[ei.point_index]: + shapes[ei.expolygons_index].holes[ei.hole_index()][ei.point_index]; + double square_distance = (p - s_p).cast().squaredNorm(); + if (closest_id >= mask.size() || + closest_square_distance > square_distance) { + closest_id = i; + closest_square_distance = square_distance; + } + } + assert(closest_id < mask.size()); + return closest_id; + } + size_t line_idx = std::numeric_limits::max(); + Vec2d hit_point; + Vec2d p_d = p.cast(); + [[maybe_unused]] double distance_sq = + AABBTreeLines::squared_distance_to_indexed_lines( + sd.lines, sd.tree, p_d, line_idx, hit_point); + assert(distance_sq > 0); + + // IMPROVE: one could use line ratio to find closest point + return get_closest_point_index(sd, line_idx, hit_point, shapes, s2i); +} + +std::pair priv::find_closest_point_pair( + const ExPolygons &shapes, + const std::vector &done_shapes, + const ExPolygonsIndices &s2i, + const std::vector &mask) +{ + assert(mask.size() == s2i.get_count()); + assert(done_shapes.size() == shapes.size()); + std::vector unfinished_mask = mask; // copy + + size_t index = 0; + for (size_t shape_index = 0; shape_index < shapes.size(); shape_index++) { + size_t count = count_points(shapes[shape_index]); + if (done_shapes[shape_index]) { + for (size_t i = 0; i < count; ++i, ++index) + unfinished_mask[index] = false; + } else { + index += count; + } + } + assert(index == s2i.get_count()); + SearchData sd = create_search_data(shapes, unfinished_mask); + + struct ClosestPair + { + size_t finish_idx = std::numeric_limits::max(); + size_t unfinished_line_idx = std::numeric_limits::max(); + Vec2d hit_point = Vec2d(); + double distance_sq = std::numeric_limits::max(); + } cp; + + index = 0; + for (size_t shape_index = 0; shape_index < shapes.size(); shape_index++) { + const ExPolygon shape = shapes[shape_index]; + if (!done_shapes[shape_index]) { + index += count_points(shape); + continue; + } + + auto search_in_polygon = [&index, &cp, &sd, &mask](const Polygon& polygon) { + for (size_t i = 0; i < polygon.size(); ++i, ++index) { + if (mask[index] == false) continue; + Vec2d p_d = polygon[i].cast(); + size_t line_idx = std::numeric_limits::max(); + Vec2d hit_point; + double distance_sq = AABBTreeLines::squared_distance_to_indexed_lines( + sd.lines, sd.tree, p_d, line_idx, hit_point, cp.distance_sq); + if (distance_sq < 0 || + distance_sq >= cp.distance_sq) continue; + assert(line_idx < sd.lines.size()); + cp.distance_sq = distance_sq; + cp.unfinished_line_idx = line_idx; + cp.hit_point = hit_point; + cp.finish_idx = index; + } + }; + search_in_polygon(shape.contour); + for (const Polygon& hole: shape.holes) + search_in_polygon(hole); + } + assert(index == s2i.get_count()); + // check that exists result + if (cp.finish_idx == std::numeric_limits::max()) { + return std::make_pair(std::numeric_limits::max(), + std::numeric_limits::max()); + } + + size_t unfinished_idx = get_closest_point_index(sd, cp.unfinished_line_idx, cp.hit_point, shapes, s2i); + return std::make_pair(cp.finish_idx, unfinished_idx); +} + +const priv::ProjectionDistance *priv::get_closest_projection( + const ProjectionDistances &distance, float wanted_distance) +{ + // minimal distance + float min_d = std::numeric_limits::max(); + const ProjectionDistance *min_pd = nullptr; + for (const ProjectionDistance &pd : distance) { + float d = std::fabs(pd.distance - wanted_distance); + // There should be limit for maximal distance + if (min_d > d) { + min_d = d; + min_pd = &pd; + } + } + return min_pd; +} + +void priv::fill_polygon_distances(const ProjectionDistance &pd, + uint32_t index, + const ExPolygonsIndex &id, + ProjectionDistances &result, + const ExPolygon &shape, + const VDistances &distances) +{ + const Points& points = (id.polygon_index == 0) ? + shape.contour.points : + shape.holes[id.polygon_index - 1].points; + // border of indexes for Polygon + uint32_t first_index = index - id.point_index; + uint32_t last_index = first_index + points.size(); + + uint32_t act_index = index; + const ProjectionDistance* act_pd = &pd; + + // Copy starting pd to result + result[act_index] = pd; + + auto exist_next = [&distances, &act_index, &act_pd, &result] + (uint32_t nxt_index) { + const ProjectionDistance *nxt_pd = get_closest_projection(distances[nxt_index] ,act_pd->distance); + // exist next projection distance ? + if (nxt_pd == nullptr) return false; + + // check no rewrite result + assert(result[nxt_index].aoi_index == std::numeric_limits::max()); + // copy founded projection to result + result[nxt_index] = *nxt_pd; // copy + + // next + act_index = nxt_index; + act_pd = &result[nxt_index]; + return true; + }; + + // last index in circle + uint32_t finish_index = (index == first_index) ? (last_index - 1) : + (index - 1); + // Positive iteration inside polygon + do { + uint32_t nxt_index = act_index + 1; + // close loop of indexes inside of contour + if (nxt_index == last_index) nxt_index = first_index; + // check that exist next + if (!exist_next(nxt_index)) break; + } while (act_index != finish_index); + + // when all results for polygon are set no neccessary to iterate negative + if (act_index == finish_index) return; + + act_index = index; + act_pd = &pd; + // Negative iteration inside polygon + do { + uint32_t nxt_index = (act_index == first_index) ? + (last_index-1) : (act_index - 1); + // When iterate negative it must be split to parts + // and can't iterate in circle + assert(nxt_index != index); + // check that exist next + if (!exist_next(nxt_index)) break; + } while (true); +} + +// IMPROVE: when select distance fill in all distances from Patch +void priv::fill_shape_distances(uint32_t start_index, + const ProjectionDistance *start_pd, + ProjectionDistances &result, + const ExPolygonsIndices &s2i, + const ExPolygon &shape, + const VDistances &distances) +{ + uint32_t expolygons_index = s2i.cvt(start_index).expolygons_index; + uint32_t first_shape_index = s2i.cvt({expolygons_index, 0, 0}); + do { + fill_polygon_distances(*start_pd, start_index, s2i.cvt(start_index),result, shape, distances); + // seaching only inside shape, return index of closed finished point + auto find_close_finished_point = [&first_shape_index, &shape, &result] + (const Point &p) -> ClosePoint { + uint32_t index = first_shape_index; + ClosePoint cp; + auto check_finished_points = [&cp, &result, &index, &p] + (const Points& pts) { + for (const Point &p_ : pts) { + // finished point with some distances + if (result[index].aoi_index == std::numeric_limits::max()) { + ++index; + continue; + } + float distance = calc_size_sq(p_ - p); + if (cp.dist_sq > distance) { + cp.dist_sq = distance; + cp.index = index; + } + ++index; + } + }; + check_finished_points(shape.contour.points); + for (const Polygon &h : shape.holes) + check_finished_points(h.points); + return cp; + }; + + // find next closest pair of points + // (finished + unfinished) in ExPolygon + start_index = std::numeric_limits::max(); // unfinished_index + uint32_t finished_index = std::numeric_limits::max(); + float dist_sq = std::numeric_limits::max(); + + // first index in shape + uint32_t index = first_shape_index; + auto check_unfinished_points = [&index, &result, &distances, &find_close_finished_point, &dist_sq, &start_index, &finished_index] + (const Points& pts) { + for (const Point &p : pts) { + // try find unfinished + if (result[index].aoi_index != + std::numeric_limits::max() || + distances[index].empty()) { + ++index; + continue; + } + ClosePoint cp = find_close_finished_point(p); + if (dist_sq > cp.dist_sq) { + dist_sq = cp.dist_sq; + start_index = index; + finished_index = cp.index; + } + ++index; + } + }; + // for each unfinished points + check_unfinished_points(shape.contour.points); + for (const Polygon &h : shape.holes) + check_unfinished_points(h.points); + } while (start_index != std::numeric_limits::max()); +} + +priv::ClosePoint priv::find_close_point(const Point &p, + ProjectionDistances &result, + std::vector &finished_shapes, + const ExPolygonsIndices &s2i, + const ExPolygons &shapes) +{ + // result + ClosePoint cp; + // for all finished points + for (uint32_t shape_index = 0; shape_index < shapes.size(); ++shape_index) { + if (!finished_shapes[shape_index]) continue; + const ExPolygon &shape = shapes[shape_index]; + uint32_t index = s2i.cvt({shape_index, 0, 0}); + auto find_close_point_in_points = [&p, &cp, &index, &result] + (const Points &pts){ + for (const Point &p_ : pts) { + // Exist result (is finished) ? + if (result[index].aoi_index == + std::numeric_limits::max()) { + ++index; + continue; + } + float distance_sq = calc_size_sq(p - p_); + if (cp.dist_sq > distance_sq) { + cp.dist_sq = distance_sq; + cp.index = index; + } + ++index; + } + }; + find_close_point_in_points(shape.contour.points); + // shape could be inside of another shape's hole + for (const Polygon& h:shape.holes) + find_close_point_in_points(h.points); + } + return cp; +} + +// IMPROVE: when select distance fill in all distances from Patch +priv::ProjectionDistances priv::choose_best_distance( + const VDistances &distances, const ExPolygons &shapes, const Point &start, const ExPolygonsIndices &s2i, const SurfacePatches &patches) +{ + assert(distances.size() == count_points(shapes)); + + // vector of patches for shape + std::vector> shapes_patches(shapes.size()); + for (const SurfacePatch &patch : patches) + shapes_patches[patch.shape_id].push_back(&patch-&patches.front()); + + // collect one closest projection for each outline point + ProjectionDistances result(distances.size()); + + // store info about finished shapes + std::vector finished_shapes(shapes.size(), {false}); + + // wanted distance from ideal projection + // Distances are relative to projection distance + // so first wanted distance is the closest one (ZERO) + float wanted_distance = 0.f; + + std::vector mask_distances(s2i.get_count(), {true}); + for (const auto &d : distances) + if (d.empty()) mask_distances[&d - &distances.front()] = false; + + // Select point from shapes(text contour) which is closest to center (all in 2d) + uint32_t unfinished_index = find_closest_point_index(start, shapes, s2i, mask_distances); + assert(unfinished_index < s2i.get_count()); + if (unfinished_index >= s2i.get_count()) + // no point to select + return result; + +#ifdef DEBUG_OUTPUT_DIR + Connections connections; + connections.reserve(shapes.size()); + connections.emplace_back(unfinished_index, unfinished_index); +#endif // DEBUG_OUTPUT_DIR + + do { + const ProjectionDistance* pd = get_closest_projection(distances[unfinished_index], wanted_distance); + // selection of closest_id should proove that pd has value + // (functions: get_closest_point_index and find_close_point_in_points) + assert(pd != nullptr); + uint32_t expolygons_index = s2i.cvt(unfinished_index).expolygons_index; + const ExPolygon &shape = shapes[expolygons_index]; + std::vector &shape_patches = shapes_patches[expolygons_index]; + if (shape_patches.size() == 1){ + // Speed up, only one patch so copy distance from patch + uint32_t first_shape_index = s2i.cvt({expolygons_index, 0, 0}); + uint32_t laset_shape_index = first_shape_index + count_points(shape); + for (uint32_t i = first_shape_index; i < laset_shape_index; ++i) { + const ProjectionDistances &pds = distances[i]; + if (pds.empty()) continue; + // check that index belongs to patch + assert(pds.front().patch_index == shape_patches.front()); + result[i] = pds.front(); + if (pds.size() == 1) continue; + + float relative_distance = fabs(result[i].distance - pd->distance); + // patch could contain multiple value for one outline point + // so choose closest to start point + for (uint32_t pds_index = 1; pds_index < pds.size(); ++pds_index) { + // check that index still belongs to same patch + assert(pds[pds_index].patch_index == shape_patches.front()); + float relative_distance2 = fabs(pds[pds_index].distance - pd->distance); + if (relative_distance > relative_distance2) { + relative_distance = relative_distance2; + result[i] = pds[pds_index]; + } + } + } + } else { + // multiple patches for expolygon + // check that exist patch to fill shape + assert(!shape_patches.empty()); + fill_shape_distances(unfinished_index, pd, result, s2i, shape, distances); + } + + finished_shapes[expolygons_index] = true; + // The most close points between finished and unfinished shapes + auto [finished, unfinished] = find_closest_point_pair( + shapes, finished_shapes, s2i, mask_distances); + + // detection of end (best doesn't have value) + if (finished == std::numeric_limits::max()) break; + + assert(unfinished != std::numeric_limits::max()); + const ProjectionDistance &closest_pd = result[finished]; + // check that best_cp is finished and has result + assert(closest_pd.aoi_index != std::numeric_limits::max()); + wanted_distance = closest_pd.distance; + unfinished_index = unfinished; + +#ifdef DEBUG_OUTPUT_DIR + connections.emplace_back(finished, unfinished); +#endif // DEBUG_OUTPUT_DIR + } while (true); //(unfinished_index != std::numeric_limits::max()); +#ifdef DEBUG_OUTPUT_DIR + store(shapes, mask_distances, connections, DEBUG_OUTPUT_DIR + "closest_points.svg"); +#endif // DEBUG_OUTPUT_DIR + return result; +} + +// functions to help 'diff_model' +namespace priv { +const VI default_vi(std::numeric_limits::max()); + +// Keep info about intersection source +struct Source{ HI hi; int sdim=0;}; +using Sources = std::vector; +const std::string vertex_source_map_name = "v:SourceIntersecting"; +using VertexSourceMap = CutMesh::Property_map; + +/// +/// Corefine visitor +/// Store intersection source for vertices of constrained edge of tm1 +/// Must be used with corefine flag no modification of tm2 +/// +struct IntersectionSources +{ + const CutMesh *patch; // patch + const CutMesh *model; // const model + + VertexSourceMap vmap; + + // keep sources from call intersection_point_detected + // until call new_vertex_added + Sources* sources; + + // count intersections + void intersection_point_detected(std::size_t i_id, + int sdim, + HI h_f, + HI h_e, + const CutMesh &tm_f, + const CutMesh &tm_e, + bool is_target_coplanar, + bool is_source_coplanar) + { + Source source; + if (&tm_e == model) { + source = {h_e, sdim}; + // check other CGAL model that is patch + assert(&tm_f == patch); + if (is_target_coplanar) { + assert(sdim == 0); + vmap[tm_f.source(h_f)] = source; + } + if (is_source_coplanar) { + assert(sdim == 0); + vmap[tm_f.target(h_f)] = source; + } + + // clear source to be able check that this intersection source is + // not used any more + if (is_source_coplanar || is_target_coplanar) source = {}; + } else { + source = {h_f, sdim}; + assert(&tm_f == model && &tm_e == patch); + assert(!is_target_coplanar); + assert(!is_source_coplanar); + // if (is_target_coplanar) vmap[tm_e.source(h_e)] = source; + // if (is_source_coplanar) vmap[tm_e.target(h_e)] = source; + // if (sdim == 0) + // vmap[tm_e.target(h_e)] = source; + } + + // By documentation i_id is consecutive. + // check id goes in a row, without skips + assert(sources->size() == i_id); + // add source of intersection + sources->push_back(source); + } + + /// + /// Store VI to intersections by i_id + /// + /// Order number of intersection point + /// New added vertex + /// Affected mesh + void new_vertex_added(std::size_t i_id, VI v, const CutMesh &tm) + { + // check that it is first insertation into item of vmap + assert(!vmap[v].hi.is_valid()); + // check valid addresing into sources + assert(i_id < sources->size()); + // check that source has value + assert(sources->at(i_id).hi.is_valid()); + vmap[v] = sources->at(i_id); + } + + // Not used visitor functions + void before_subface_creations(FI /* f_old */, CutMesh & /* mesh */) {} + void after_subface_created(FI /* f_new */, CutMesh & /* mesh */) {} + void after_subface_creations(CutMesh &) {} + void before_subface_created(CutMesh &) {} + void before_edge_split(HI /* h */, CutMesh & /* tm */) {} + void edge_split(HI /* hnew */, CutMesh & /* tm */) {} + void after_edge_split() {} + void add_retriangulation_edge(HI /* h */, CutMesh & /* tm */) {} +}; + +/// +/// Create map1 and map2 +/// +/// Convert tm1.face to type +/// Corefined mesh +/// Source of intersection +/// Identify constrainde edge +/// Convert tm1.face to type +void create_face_types(FaceTypeMap &map, + const CutMesh &tm1, + const CutMesh &tm2, + const EdgeBoolMap &ecm, + const VertexSourceMap &sources); + +/// +/// Implement 'cut' Minus 'clipper', where clipper is reverse input Volume +/// NOTE: clipper will be modified (corefined by cut) !!! +/// +/// differ from +/// differ what +/// True on succes, otherwise FALSE +bool clip_cut(SurfacePatch &cut, CutMesh clipper); + +BoundingBoxf3 bounding_box(const CutAOI &cut, const CutMesh &mesh); +BoundingBoxf3 bounding_box(const CutMesh &mesh); +BoundingBoxf3 bounding_box(const SurfacePatch &ecut); + +/// +/// Create patch +/// +/// Define patch faces +/// Source of fis +/// NOTE: Need temporary add property map for convert vertices +/// Options to reduce vertices from fis. +/// NOTE: Used for skip vertices made by diagonal edge in rectangle of shape side +/// Patch +SurfacePatch create_surface_patch(const std::vector &fis, + /*const*/ CutMesh &mesh, + const ReductionMap *rmap = nullptr); + +} // namespace priv + +void priv::create_face_types(FaceTypeMap &map, + const CutMesh &tm1, + const CutMesh &tm2, + const EdgeBoolMap &ecm, + const VertexSourceMap &sources) +{ + auto get_intersection_source = [&tm2](const Source& s1, const Source& s2)->FI{ + // when one of sources is face than return it + FI fi1 = tm2.face(s1.hi); + if (s1.sdim == 2) return fi1; + FI fi2 = tm2.face(s2.hi); + if (s2.sdim == 2) return fi2; + // both vertices are made by same source triangle + if (fi1 == fi2) return fi1; + + // when one from sources is edge second one decide side of triangle triangle + HI hi1_opposit = tm2.opposite(s1.hi); + FI fi1_opposit; + if (hi1_opposit.is_valid()) + fi1_opposit = tm2.face(hi1_opposit); + if (fi2 == fi1_opposit) return fi2; + + HI hi2_opposit = tm2.opposite(s2.hi); + FI fi2_opposit; + if (hi2_opposit.is_valid()) + fi2_opposit = tm2.face(hi2_opposit); + if (fi1 == fi2_opposit) return fi1; + if (fi1_opposit.is_valid() && fi1_opposit == fi2_opposit) + return fi1_opposit; + + // when intersection is vertex need loop over neighbor + for (FI fi_around_hi1 : tm2.faces_around_target(s1.hi)) { + for (FI fi_around_hi2 : tm2.faces_around_target(s2.hi)) { + if (fi_around_hi1 == fi_around_hi2) + return fi_around_hi1; + } + } + + // should never rich it + // Exist case when do not know source triangle for decide side of intersection + assert(false); + return FI(); + }; + + for (FI fi : tm1.faces()) map[fi] = FaceType::not_constrained; + for (EI ei1 : tm1.edges()) { + if (!get(ecm, ei1)) continue; + + // get faces from tm1 (f1a + f1b) + HI hi1 = tm1.halfedge(ei1); + assert(hi1.is_valid()); + FI f1a = tm1.face(hi1); + assert(f1a.is_valid()); + HI hi_op = tm1.opposite(hi1); + assert(hi_op.is_valid()); + FI f1b = tm1.face(hi_op); + assert(f1b.is_valid()); + + // get faces from tm2 (f2a + f2b) + VI vi1_source = tm1.source(hi1); + assert(vi1_source.is_valid()); + VI vi1_target = tm1.target(hi1); + assert(vi1_target.is_valid()); + + const Source &s_s = sources[vi1_source]; + const Source &s_t = sources[vi1_target]; + FI fi2 = get_intersection_source(s_s, s_t); + + // in release solve situation that face was NOT deduced + if (!fi2.is_valid()) continue; + + HI hi2 = tm2.halfedge(fi2); + std::array t; + size_t ti =0; + for (VI vi2 : tm2.vertices_around_face(hi2)) + t[ti++] = &tm2.point(vi2); + + // triangle tip from face f1a + VI vi1a_tip = tm1.target(tm1.next(hi1)); + assert(vi1a_tip.is_valid()); + const P3 &p = tm1.point(vi1a_tip); + + // check if f1a is behinde f2a + // inside mean it will be used + // outside will be discarded + if (CGAL::orientation(*t[0], *t[1], *t[2], p) == CGAL::POSITIVE) { + map[f1a] = FaceType::inside; + map[f1b] = FaceType::outside; + } else { + map[f1a] = FaceType::outside; + map[f1b] = FaceType::inside; + } + } +} + +#include +#include +bool priv::clip_cut(SurfacePatch &cut, CutMesh clipper) +{ + CutMesh& tm = cut.mesh; + // create backup for case that there is no intersection + CutMesh backup_copy = tm; + + class ExistIntersectionClipVisitor: public CGAL::Polygon_mesh_processing::Corefinement::Default_visitor + { + bool* exist_intersection; + public: + ExistIntersectionClipVisitor(bool *exist_intersection): exist_intersection(exist_intersection){} + void intersection_point_detected(std::size_t, int , HI, HI, const CutMesh&, const CutMesh&, bool, bool) + { *exist_intersection = true;} + }; + bool exist_intersection = false; + ExistIntersectionClipVisitor visitor{&exist_intersection}; + + // namep parameters for model tm and function clip + const auto &np_tm = CGAL::parameters::visitor(visitor) + .throw_on_self_intersection(false); + + // name parameters for model clipper and function clip + const auto &np_c = CGAL::parameters::throw_on_self_intersection(false); + // Can't use 'do_not_modify', when Ture than clipper has to be closed !! + // .do_not_modify(true); + // .throw_on_self_intersection(false); is set automaticaly by param 'do_not_modify' + // .clip_volume(false); is set automaticaly by param 'do_not_modify' + + bool suc = CGAL::Polygon_mesh_processing::clip(tm, clipper, np_tm, np_c); + + // true if the output surface mesh is manifold. + // If false is returned tm and clipper are only corefined. + assert(suc); + // decide what TODO when can't clip source object !?! + if (!exist_intersection || !suc) { + // TODO: test if cut is fully in or fully out!! + cut.mesh = backup_copy; + return false; + } + return true; +} + +BoundingBoxf3 priv::bounding_box(const CutAOI &cut, const CutMesh &mesh) { + const P3& p_from_cut = mesh.point(mesh.target(mesh.halfedge(cut.first.front()))); + Vec3d min = to_vec3d(p_from_cut); + Vec3d max = min; + for (FI fi : cut.first) { + for(VI vi: mesh.vertices_around_face(mesh.halfedge(fi))){ + const P3& p = mesh.point(vi); + for (size_t i = 0; i < 3; ++i) { + if (min[i] > p[i]) min[i] = p[i]; + if (max[i] < p[i]) max[i] = p[i]; + } + } + } + return BoundingBoxf3(min, max); +} + +BoundingBoxf3 priv::bounding_box(const CutMesh &mesh) +{ + Vec3d min = to_vec3d(*mesh.points().begin()); + Vec3d max = min; + for (VI vi : mesh.vertices()) { + const P3 &p = mesh.point(vi); + for (size_t i = 0; i < 3; ++i) { + if (min[i] > p[i]) min[i] = p[i]; + if (max[i] < p[i]) max[i] = p[i]; + } + } + return BoundingBoxf3(min, max); +} + +BoundingBoxf3 priv::bounding_box(const SurfacePatch &ecut) { + return bounding_box(ecut.mesh); +} + +priv::SurfacePatch priv::create_surface_patch(const std::vector &fis, + /* const */ CutMesh &mesh, + const ReductionMap *rmap) +{ + auto is_counted = mesh.add_property_map("v:is_counted").first; + uint32_t count_vertices = 0; + if (rmap == nullptr) { + for (FI fi : fis) + for (VI vi : mesh.vertices_around_face(mesh.halfedge(fi))) + if (!is_counted[vi]) { + is_counted[vi] = true; + ++count_vertices; + } + } else { + for (FI fi : fis) + for (VI vi : mesh.vertices_around_face(mesh.halfedge(fi))) { + // Will vertex be reduced? + if ((*rmap)[vi].is_valid()) continue; + if (!is_counted[vi]) { + is_counted[vi] = true; + ++count_vertices; + } + } + } + mesh.remove_property_map(is_counted); + + uint32_t count_faces = fis.size(); + // IMPROVE: Value is greater than neccessary, count edges used twice + uint32_t count_edges = count_faces*3; + + CutMesh cm; + cm.reserve(count_vertices, count_edges, count_faces); + + // vertex conversion function from mesh VI to result VI + CvtVI2VI mesh2result = mesh.add_property_map("v:mesh2result").first; + + if (rmap == nullptr) { + for (FI fi : fis) { + std::array t; + int index = 0; + for (VI vi : mesh.vertices_around_face(mesh.halfedge(fi))) { + VI &vi_cvt = mesh2result[vi]; + if (!vi_cvt.is_valid()) { + vi_cvt = VI(cm.vertices().size()); + cm.add_vertex(mesh.point(vi)); + } + t[index++] = vi_cvt; + } + cm.add_face(t[0], t[1], t[2]); + } + } else { + for (FI fi :fis) { + std::array t; + int index = 0; + bool exist_reduction = false; + for (VI vi : mesh.vertices_around_face(mesh.halfedge(fi))) { + VI vi_r = (*rmap)[vi]; + if (vi_r.is_valid()) { + exist_reduction = true; + vi = vi_r; + } + VI &vi_cvt = mesh2result[vi]; + if (!vi_cvt.is_valid()) { + vi_cvt = VI(cm.vertices().size()); + cm.add_vertex(mesh.point(vi)); + } + t[index++] = vi_cvt; + } + + // prevent add reduced triangle + if (exist_reduction && + (t[0] == t[1] || + t[1] == t[2] || + t[2] == t[0])) + continue; + + cm.add_face(t[0], t[1], t[2]); + } + } + + assert(count_vertices == cm.vertices().size()); + assert((rmap == nullptr && count_faces == cm.faces().size()) || + (rmap != nullptr && count_faces >= cm.faces().size())); + assert(count_edges >= cm.edges().size()); + + // convert VI from this patch to source VI, when exist + CvtVI2VI cvt = cm.add_property_map(patch_source_name).first; + // vi_s .. VertexIndex into mesh (source) + // vi_d .. new VertexIndex in cm (destination) + for (VI vi_s : mesh.vertices()) { + VI vi_d = mesh2result[vi_s]; + if (!vi_d.is_valid()) continue; + cvt[vi_d] = vi_s; + } + mesh.remove_property_map(mesh2result); + return {std::move(cm)}; +} + +// diff_models help functions +namespace priv { + +struct SurfacePatchEx +{ + SurfacePatch patch; + + // flag that part will be deleted + bool full_inside = false; + // flag that Patch could contain more than one part + bool just_cliped = false; +}; +using SurfacePatchesEx = std::vector; + + +using BBS = std::vector; +/// +/// Create bounding boxes for AOI +/// +/// Cutted AOI from models +/// Source points of cuts +/// Bounding boxes +BBS create_bbs(const VCutAOIs &cuts, const CutMeshes &cut_models); + +using Primitive = CGAL::AABB_face_graph_triangle_primitive; +using Traits = CGAL::AABB_traits; +using Ray = EpicKernel::Ray_3; +using Tree = CGAL::AABB_tree; +using Trees = std::vector; +/// +/// Create AABB trees for check when patch is whole inside of model +/// +/// Source for trees +/// trees +Trees create_trees(const CutMeshes &models); + +/// +/// Check whether bounding box has intersection with model +/// +/// Bounding box to check +/// Model to check with +/// All bounding boxes from VCutAOIs +/// Help index into VCutAOIs +/// True when exist bounding boxes intersection +bool has_bb_intersection(const BoundingBoxf3 &bb, + size_t model_index, + const BBS &bbs, + const ModelCut2index &m2i); + +/// +/// Only for model without intersection +/// Use ray (in projection direction) from a point from patch +/// and count intersections: pair .. outside | odd .. inside +/// +/// Patch to check +/// Model converted to AABB tree +/// Define direction of projection +/// True when patch point lay inside of model defined by tree, +/// otherwise FALSE +bool is_patch_inside_of_model(const SurfacePatch &patch, + const Tree &tree, + const Project3d &projection); + +/// +/// Return some shape point index which identify shape +/// NOTE: Used to find expolygon index +/// +/// Used to search source shapes poin +/// +/// shape point index +uint32_t get_shape_point_index(const CutAOI &cut, const CutMesh &model); + +using PatchNumber = CutMesh::Property_map; +/// +/// Separate triangles singned with number n +/// +/// Face indices owned by separate patch +/// Original patch +/// NOTE: Can't be const. For indexing vetices need temporary add property map +/// conversion map +/// Just separated patch +SurfacePatch separate_patch(const std::vector &fis, + /* const*/ SurfacePatch &patch, + const CvtVI2VI &cvt_from); + +/// +/// Separate connected triangles into it's own patches +/// new patches are added to back of input patches +/// +/// index into patches +/// In/Out Patches +void divide_patch(size_t i, SurfacePatchesEx &patches); + +/// +/// Fill outline in patches by open edges +/// +/// Input/Output meshes with open edges +void collect_open_edges(SurfacePatches &patches); + +} // namespace priv + +std::vector priv::create_bbs(const VCutAOIs &cuts, + const CutMeshes &cut_models) +{ + size_t count = 0; + for (const CutAOIs &cut : cuts) count += cut.size(); + + std::vector bbs; + bbs.reserve(count); + for (size_t model_index = 0; model_index < cut_models.size(); ++model_index) { + const CutMesh &cut_model = cut_models[model_index]; + const CutAOIs &cutAOIs = cuts[model_index]; + for (size_t cut_index = 0; cut_index < cutAOIs.size(); ++cut_index) { + const CutAOI &cut = cutAOIs[cut_index]; + bbs.push_back(bounding_box(cut, cut_model)); + } + } + return bbs; +} + + +priv::Trees priv::create_trees(const CutMeshes &models) { + Trees result; + result.reserve(models.size()); + for (const CutMesh &model : models) { + Tree tree; + tree.insert(faces(model).first, faces(model).second, model); + tree.build(); + result.emplace_back(std::move(tree)); + } + return result; +} + +bool priv::has_bb_intersection(const BoundingBoxf3 &bb, + size_t model_index, + const BBS &bbs, + const ModelCut2index &m2i) +{ + const auto&offsets = m2i.get_offsets(); + // for cut index with model_index2 + size_t start = offsets[model_index]; + size_t next = model_index + 1; + size_t end = (next < offsets.size()) ? offsets[next] : m2i.get_count(); + for (size_t bb_index = start; bb_index < end; bb_index++) + if (bb.intersects(bbs[bb_index])) return true; + return false; +} + +bool priv::is_patch_inside_of_model(const SurfacePatch &patch, + const Tree &tree, + const Project3d &projection) +{ + // TODO: Solve model with hole in projection direction !!! + const P3 &a = patch.mesh.point(VI(0)); + Vec3d a_ = to_vec3d(a); + Vec3d b_ = projection.project(a_); + P3 b(b_.x(), b_.y(), b_.z()); + + Ray ray_query(a, b); + size_t count = tree.number_of_intersected_primitives(ray_query); + bool is_in = (count % 2) == 1; + + // try opposit direction result should be same, otherwise open model is used + //Vec3f c_ = a_ - (b_ - a_); // opposit direction + //P3 c(c_.x(), c_.y(), c_.z()); + //Ray ray_query2(a, b); + //size_t count2 = tree.number_of_intersected_primitives(ray_query2); + //bool is_in2 = (count2 % 2) == 1; + assert(((tree.number_of_intersected_primitives( + Ray(a, P3(2 * a.x() - b.x(), + 2 * a.y() - b.y(), + 2 * a.z() - b.z()))) % + 2) == 1) == is_in); + return is_in; +} + +uint32_t priv::get_shape_point_index(const CutAOI &cut, const CutMesh &model) +{ + // map is created during intersection by corefine visitor + const VertexShapeMap &vert_shape_map = model.property_map(vert_shape_map_name).first; + // for each half edge of outline + for (HI hi : cut.second) { + VI vi = model.source(hi); + const IntersectingElement *ie = vert_shape_map[vi]; + if (ie == nullptr) continue; + assert(ie->shape_point_index != std::numeric_limits::max()); + return ie->shape_point_index; + } + // can't found any intersecting element in cut + assert(false); + return 0; +} + +priv::SurfacePatch priv::separate_patch(const std::vector& fis, + SurfacePatch &patch, + const CvtVI2VI &cvt_from) +{ + assert(patch.mesh.is_valid()); + SurfacePatch patch_new = create_surface_patch(fis, patch.mesh); + patch_new.bb = bounding_box(patch_new.mesh); + patch_new.aoi_id = patch.aoi_id; + patch_new.model_id = patch.model_id; + patch_new.shape_id = patch.shape_id; + // fix cvt + CvtVI2VI cvt = patch_new.mesh.property_map(patch_source_name).first; + for (VI &vi : cvt) { + if (!vi.is_valid()) continue; + vi = cvt_from[vi]; + } + return patch_new; +} + +void priv::divide_patch(size_t i, SurfacePatchesEx &patches) +{ + SurfacePatchEx &patch_ex = patches[i]; + assert(patch_ex.just_cliped); + patch_ex.just_cliped = false; + + SurfacePatch& patch = patch_ex.patch; + CutMesh& cm = patch.mesh; + assert(!cm.faces().empty()); + std::string patch_number_name = "f:patch_number"; + CutMesh::Property_map is_processed = cm.add_property_map(patch_number_name, false).first; + + const CvtVI2VI& cvt_from = patch.mesh.property_map(patch_source_name).first; + + std::vector fis; + fis.reserve(cm.faces().size()); + + SurfacePatchesEx new_patches; + std::vector queue; + // IMPROVE: create groups around triangles and than connect groups + for (FI fi_cm : cm.faces()) { + if (is_processed[fi_cm]) continue; + assert(queue.empty()); + queue.push_back(fi_cm); + if (!fis.empty()) { + // Be carefull after push to patches, + // all ref on patch contain non valid values + SurfacePatchEx patch_ex_n; + patch_ex_n.patch = separate_patch(fis, patch, cvt_from); + patch_ex_n.patch.is_whole_aoi = false; + new_patches.push_back(std::move(patch_ex_n)); + fis.clear(); + } + // flood fill from triangle fi_cm to surrounding + do { + FI fi_q = queue.back(); + queue.pop_back(); + if (is_processed[fi_q]) continue; + is_processed[fi_q] = true; + fis.push_back(fi_q); + HI hi = cm.halfedge(fi_q); + for (FI fi : cm.faces_around_face(hi)) { + // by documentation The face descriptor may be the null face, and it may be several times the same face descriptor. + if (!fi.is_valid()) continue; + if (!is_processed[fi]) queue.push_back(fi); + } + } while (!queue.empty()); + } + cm.remove_property_map(is_processed); + assert(!fis.empty()); + + // speed up for only one patch - no dividing (the most common) + if (new_patches.empty()) { + patch.bb = bounding_box(cm); + patch.is_whole_aoi = false; + } else { + patch = separate_patch(fis, patch, cvt_from); + patches.insert(patches.end(), new_patches.begin(), new_patches.end()); + } +} + +void priv::collect_open_edges(SurfacePatches &patches) { + std::vector open_half_edges; + for (SurfacePatch &patch : patches) { + open_half_edges.clear(); + const CutMesh &mesh = patch.mesh; + for (FI fi : mesh.faces()) { + HI hi1 = mesh.halfedge(fi); + assert(hi1.is_valid()); + HI hi2 = mesh.next(hi1); + assert(hi2.is_valid()); + HI hi3 = mesh.next(hi2); + assert(hi3.is_valid()); + // Is fi triangle? + assert(mesh.next(hi3) == hi1); + for (HI hi : {hi1, hi2, hi3}) { + HI hi_op = mesh.opposite(hi); + FI fi_op = mesh.face(hi_op); + if (!fi_op.is_valid()) + open_half_edges.push_back(hi); + } + } + patch.loops = create_loops(open_half_edges, mesh); + } +} + +priv::SurfacePatches priv::diff_models(VCutAOIs &cuts, + /*const*/ CutMeshes &cut_models, + /*const*/ CutMeshes &models, + const Project3d &projection) +{ + // IMPROVE: when models contain ONE mesh. It is only about convert cuts to patches + // and reduce unneccessary triangles on contour + + //Convert model_index and cut_index into one index + priv::ModelCut2index m2i(cuts); + + // create bounding boxes for cuts + std::vector bbs = create_bbs(cuts, cut_models); + Trees trees(models.size()); + + SurfacePatches patches; + + // queue of patches for one AOI (permanent with respect to for loop) + SurfacePatchesEx aoi_patches; + + //SurfacePatches aoi_patches; + patches.reserve(m2i.get_count()); // only approximation of count + size_t index = 0; + for (size_t model_index = 0; model_index < models.size(); ++model_index) { + CutAOIs &model_cuts = cuts[model_index]; + CutMesh &cut_model_ = cut_models[model_index]; + const CutMesh &cut_model = cut_model_; + ReductionMap vertex_reduction_map = cut_model_.add_property_map(vertex_reduction_map_name).first; + create_reduce_map(vertex_reduction_map, cut_model); + + for (size_t cut_index = 0; cut_index < model_cuts.size(); ++cut_index, ++index) { + const CutAOI &cut = model_cuts[cut_index]; + SurfacePatchEx patch_ex; + SurfacePatch &patch = patch_ex.patch; + patch = create_surface_patch(cut.first, cut_model_, &vertex_reduction_map); + patch.bb = bbs[index]; + patch.aoi_id = cut_index; + patch.model_id = model_index; + patch.shape_id = get_shape_point_index(cut, cut_model); + patch.is_whole_aoi = true; + + aoi_patches.clear(); + aoi_patches.push_back(patch_ex); + for (size_t model_index2 = 0; model_index2 < models.size(); ++model_index2) { + // do not clip source model itself + if (model_index == model_index2) continue; + for (SurfacePatchEx &patch_ex : aoi_patches) { + SurfacePatch &patch = patch_ex.patch; + if (has_bb_intersection(patch.bb, model_index2, bbs, m2i) && + clip_cut(patch, models[model_index2])){ + patch_ex.just_cliped = true; + } else { + // build tree on demand + // NOTE: it is possible not neccessary: e.g. one model + Tree &tree = trees[model_index2]; + if (tree.empty()) { + const CutMesh &model = models[model_index2]; + auto f_range = faces(model); + tree.insert(f_range.first, f_range.second, model); + tree.build(); + } + if (is_patch_inside_of_model(patch, tree, projection)) + patch_ex.full_inside = true; + } + } + // erase full inside + for (size_t i = aoi_patches.size(); i != 0; --i) { + auto it = aoi_patches.begin() + (i - 1); + if (it->full_inside) aoi_patches.erase(it); + } + + // detection of full AOI inside of model + if (aoi_patches.empty()) break; + + // divide cliped into parts + size_t end = aoi_patches.size(); + for (size_t i = 0; i < end; ++i) + if (aoi_patches[i].just_cliped) + divide_patch(i, aoi_patches); + } + + if (!aoi_patches.empty()) { + patches.reserve(patches.size() + aoi_patches.size()); + for (SurfacePatchEx &patch : aoi_patches) + patches.push_back(std::move(patch.patch)); + + } + } + cut_model_.remove_property_map(vertex_reduction_map); + } + + // Also use outline inside of patches(made by non manifold models) + // IMPROVE: trace outline from AOIs + collect_open_edges(patches); + return patches; +} + +bool priv::is_over_whole_expoly(const SurfacePatch &patch, + const ExPolygons &shapes, + const VCutAOIs &cutAOIs, + const CutMeshes &meshes) +{ + if (!patch.is_whole_aoi) return false; + return is_over_whole_expoly(cutAOIs[patch.model_id][patch.aoi_id], + shapes[patch.shape_id], + meshes[patch.model_id]); +} + +bool priv::is_over_whole_expoly(const CutAOI &cutAOI, + const ExPolygon &shape, + const CutMesh &mesh) +{ + // NonInterupted contour is without other point and contain all from shape + const VertexShapeMap &vert_shape_map = mesh.property_map(vert_shape_map_name).first; + for (HI hi : cutAOI.second) { + const IntersectingElement *ie_s = vert_shape_map[mesh.source(hi)]; + const IntersectingElement *ie_t = vert_shape_map[mesh.target(hi)]; + if (ie_s == nullptr || ie_t == nullptr) + return false; + + assert(ie_s->attr != (unsigned char) IntersectingElement::Type::undefined); + assert(ie_t->attr != (unsigned char) IntersectingElement::Type::undefined); + + // check if it is neighbor indices + uint32_t i_s = ie_s->shape_point_index; + uint32_t i_t = ie_t->shape_point_index; + assert(i_s != std::numeric_limits::max()); + assert(i_t != std::numeric_limits::max()); + if (i_s == std::numeric_limits::max() || + i_t == std::numeric_limits::max()) + return false; + + // made by same index + if (i_s == i_t) continue; + + // order from source to target + if (i_s > i_t) { + std::swap(i_s, i_t); + std::swap(ie_s, ie_t); + } + // Must be after fix order !! + bool is_last_polygon_segment = ie_s->is_first() && ie_t->is_last(); + if (is_last_polygon_segment) { + std::swap(i_s, i_t); + std::swap(ie_s, ie_t); + } + + // Is continous indices + if (!is_last_polygon_segment && + (ie_s->is_last() || (i_s + 1) != i_t)) + return false; + + IntersectingElement::Type t_s = ie_s->get_type(); + IntersectingElement::Type t_t = ie_t->get_type(); + if (t_s == IntersectingElement::Type::undefined || + t_t == IntersectingElement::Type::undefined) + return false; + + // next segment must start with edge intersection + if (t_t != IntersectingElement::Type::edge_1) + return false; + + // After face1 must be edge2 or face2 + if (t_s == IntersectingElement::Type::face_1) + return false; + } + + // When all open edges are on contour than there is NO holes is shape + auto is_open = [&mesh](HI hi)->bool { + HI opposite = mesh.opposite(hi); + return !mesh.face(opposite).is_valid(); + }; + + std::vector opens; // copy + opens.reserve(cutAOI.second.size()); + for (HI hi : cutAOI.second) // from lower to bigger + if (is_open(hi)) opens.push_back(hi); + std::sort(opens.begin(), opens.end()); + + for (FI fi: cutAOI.first) { + HI face_hi = mesh.halfedge(fi); + for (HI hi : mesh.halfedges_around_face(face_hi)) { + if (!is_open(hi)) continue; + // open edge + auto lb = std::lower_bound(opens.begin(), opens.end(), hi); + if (lb == opens.end() || *lb != hi) + return false; // not in contour + } + } + return true; +} + +std::vector priv::select_patches(const ProjectionDistances &best_distances, + const SurfacePatches &patches, + const ExPolygons &shapes, + const BoundingBox &shapes_bb, + const ExPolygonsIndices &s2i, + const VCutAOIs &cutAOIs, + const CutMeshes &meshes, + const Project &projection) +{ + // extension to cover numerical mistake made by back projection patch from 3d to 2d + // Calculated as one percent of average size(width and height) + Point s = shapes_bb.size(); + const float extend_delta = (s.x() + s.y())/ float(2 * 100); + + // vector of patches for shape + std::vector> used_shapes_patches(shapes.size()); + std::vector in_distances(patches.size(), {false}); + for (const ProjectionDistance &d : best_distances) { + // exist valid projection for shape point? + if (d.patch_index == std::numeric_limits::max()) continue; + if (in_distances[d.patch_index]) continue; + in_distances[d.patch_index] = true; + + ExPolygonsIndex id = s2i.cvt(&d - &best_distances.front()); + used_shapes_patches[id.expolygons_index].push_back(d.patch_index); + } + + // vector of patches for shape + std::vector> shapes_patches(shapes.size()); + for (const SurfacePatch &patch : patches) + shapes_patches[patch.shape_id].push_back(&patch - &patches.front()); + +#ifdef DEBUG_OUTPUT_DIR + std::string store_dir = DEBUG_OUTPUT_DIR + "select_patches/"; + prepare_dir(store_dir); +#endif // DEBUG_OUTPUT_DIR + + for (size_t shape_index = 0; shape_index < shapes.size(); shape_index++) { + const ExPolygon &shape = shapes[shape_index]; + std::vector &used_shape_patches = used_shapes_patches[shape_index]; + if (used_shape_patches.empty()) continue; + // is used all exist patches? + if (used_shapes_patches.size() == shapes_patches[shape_index].size()) continue; + if (used_shape_patches.size() == 1) { + uint32_t patch_index = used_shape_patches.front(); + const SurfacePatch &patch = patches[patch_index]; + if (is_over_whole_expoly(patch, shapes, cutAOIs, meshes)) continue; + } + + // only shapes containing multiple patches + // or not full filled are back projected (hard processed) + + // intersection of converted patches to 2d + ExPolygons fill; + fill.reserve(used_shape_patches.size()); + + // Heuristics to predict which patch to be used need average patch depth + Vec2d used_patches_depth(std::numeric_limits::max(), std::numeric_limits::min()); + for (uint32_t patch_index : used_shape_patches) { + ExPolygon patch_area = to_expoly(patches[patch_index], projection, used_patches_depth); + //*/ + ExPolygons patch_areas = offset_ex(patch_area, extend_delta); + fill.insert(fill.end(), patch_areas.begin(), patch_areas.end()); + /*/ + // without save extension + fill.push_back(patch_area); + //*/ + } + fill = union_ex(fill); + + // not cutted area of expolygon + ExPolygons rest = diff_ex(ExPolygons{shape}, fill, ApplySafetyOffset::Yes); +#ifdef DEBUG_OUTPUT_DIR + BoundingBox shape_bb = get_extents(shape); + SVG svg(store_dir + "shape_" + std::to_string(shape_index) + ".svg", shape_bb); + svg.draw(fill, "darkgreen"); + svg.draw(rest, "green"); +#endif // DEBUG_OUTPUT_DIR + + // already filled by multiple patches + if (rest.empty()) continue; + + // find patches overlaped rest area + struct PatchShape{ + uint32_t patch_index; + ExPolygon shape; + ExPolygons intersection; + double depth_range_center_distance; // always positive + }; + using PatchShapes = std::vector; + PatchShapes patch_shapes; + + double used_patches_depth_center = (used_patches_depth[0] + used_patches_depth[1]) / 2; + + // sort used_patches for faster search + std::sort(used_shape_patches.begin(), used_shape_patches.end()); + for (uint32_t patch_index : shapes_patches[shape_index]) { + // check is patch already used + auto it = std::lower_bound(used_shape_patches.begin(), used_shape_patches.end(), patch_index); + if (it != used_shape_patches.end() && *it == patch_index) continue; + + // Heuristics to predict which patch to be used need average patch depth + Vec2d patche_depth_range(std::numeric_limits::max(), std::numeric_limits::min()); + ExPolygon patch_shape = to_expoly(patches[patch_index], projection, patche_depth_range); + double depth_center = (patche_depth_range[0] + patche_depth_range[1]) / 2; + double depth_range_center_distance = std::fabs(used_patches_depth_center - depth_center); + + ExPolygons patch_intersection = intersection_ex(ExPolygons{patch_shape}, rest); + if (patch_intersection.empty()) continue; + + patch_shapes.push_back({patch_index, patch_shape, patch_intersection, depth_range_center_distance}); + } + + // nothing to add + if (patch_shapes.empty()) continue; + // only one solution to add + if (patch_shapes.size() == 1) { + used_shape_patches.push_back(patch_shapes.front().patch_index); + continue; + } + + // Idea: Get depth range of used patches and add patches in order by distance to used depth center + std::sort(patch_shapes.begin(), patch_shapes.end(), [](const PatchShape &a, const PatchShape &b) + { return a.depth_range_center_distance < b.depth_range_center_distance; }); + +#ifdef DEBUG_OUTPUT_DIR + for (size_t i = patch_shapes.size(); i > 0; --i) { + const PatchShape &p = patch_shapes[i - 1]; + int gray_level = (i * 200) / patch_shapes.size(); + std::stringstream color; + color << "#" << std::hex << std::setfill('0') << std::setw(2) << gray_level << gray_level << gray_level; + svg.draw(p.shape, color.str()); + Point text_pos = get_extents(p.shape).center().cast(); + svg.draw_text(text_pos, std::to_string(i-1).c_str(), "orange", std::ceil(shape_bb.size().x() / 20 * 0.000001)); + //svg.draw(p.intersection, color.str()); + } +#endif // DEBUG_OUTPUT_DIR + + for (const PatchShape &patch : patch_shapes) { + // Check when exist some place to fill + ExPolygons patch_intersection = intersection_ex(patch.intersection, rest); + if (patch_intersection.empty()) continue; + + // Extend for sure + ExPolygons intersection = offset_ex(patch.intersection, extend_delta); + rest = diff_ex(rest, intersection, ApplySafetyOffset::Yes); + + used_shape_patches.push_back(patch.patch_index); + if (rest.empty()) break; + } + + // QUESTION: How to select which patch to use? How to sort them? + // Now is used back projection distance from used patches + // + // Idealy by outline depth: (need ray cast into patches) + // how to calc wanted depth - idealy by depth of outline help to overlap + // how to calc patch depth - depth in place of outline position + // Which outline to use between + + } + + std::vector result(patches.size(), {false}); + for (const std::vector &patches: used_shapes_patches) + for (uint32_t patch_index : patches) { + assert(patch_index < result.size()); + // check only onece insertation of patch + assert(!result[patch_index]); + result[patch_index] = true; + } + return result; +} + +priv::Loops priv::create_loops(const std::vector &outlines, const CutMesh& mesh) +{ + Loops loops; + Loops unclosed; + for (HI hi : outlines) { + VI vi_s = mesh.source(hi); + VI vi_t = mesh.target(hi); + Loop *loop_move = nullptr; + Loop *loop_connect = nullptr; + for (std::vector &cut : unclosed) { + if (cut.back() != vi_s) continue; + if (cut.front() == vi_t) { + // cut closing + loop_move = &cut; + } else { + loop_connect = &cut; + } + break; + } + if (loop_move != nullptr) { + // index of closed cut + size_t index = loop_move - &unclosed.front(); + // move cut to result + loops.emplace_back(std::move(*loop_move)); + // remove it from unclosed cut + unclosed.erase(unclosed.begin() + index); + } else if (loop_connect != nullptr) { + // try find tail to connect cut + Loop *loop_tail = nullptr; + for (Loop &cut : unclosed) { + if (cut.front() != vi_t) continue; + loop_tail = &cut; + break; + } + if (loop_tail != nullptr) { + // index of tail + size_t index = loop_tail - &unclosed.front(); + // move to connect vector + loop_connect->insert(loop_connect->end(), + make_move_iterator(loop_tail->begin()), + make_move_iterator(loop_tail->end())); + // remove tail from unclosed cut + unclosed.erase(unclosed.begin() + index); + } else { + loop_connect->push_back(vi_t); + } + } else { // not found + bool create_cut = true; + // try to insert to front of cut + for (Loop &cut : unclosed) { + if (cut.front() != vi_t) continue; + cut.insert(cut.begin(), vi_s); + create_cut = false; + break; + } + if (create_cut) + unclosed.emplace_back(std::vector{vi_s, vi_t}); + } + } + assert(unclosed.empty()); + return loops; +} + +Polygons priv::unproject_loops(const SurfacePatch &patch, const Project &projection, Vec2d &depth_range) +{ + assert(!patch.loops.empty()); + if (patch.loops.empty()) return {}; + + // NOTE: this method is working only when patch did not contain outward faces + Polygons polys; + polys.reserve(patch.loops.size()); + // project conture into 2d space to fillconvert outlines to + + size_t count = 0; + for (const Loop &l : patch.loops) count += l.size(); + std::vector depths; + depths.reserve(count); + + Points pts; + for (const Loop &l : patch.loops) { + pts.clear(); + pts.reserve(l.size()); + for (VI vi : l) { + const P3 &p3 = patch.mesh.point(vi); + Vec3d p = to_vec3d(p3); + double depth; + std::optional p2_opt = projection.unproject(p, &depth); + if (depth_range[0] > depth) depth_range[0] = depth; // min + if (depth_range[1] < depth) depth_range[1] = depth; // max + // Check when appear that skip is enough for poit which can't be unprojected + // - it could break contour + assert(p2_opt.has_value()); + if (!p2_opt.has_value()) continue; + + pts.push_back(p2_opt->cast()); + depths.push_back(static_cast(depth)); + } + // minimal is triangle + assert(pts.size() >= 3); + if (pts.size() < 3) continue; + + polys.emplace_back(pts); + } + + assert(!polys.empty()); + return polys; +} + +ExPolygon priv::to_expoly(const SurfacePatch &patch, const Project &projection, Vec2d &depth_range) +{ + Polygons polys = unproject_loops(patch, projection, depth_range); + // should not be used when no opposit triangle are counted so should not create overlaps + ClipperLib::PolyFillType fill_type = ClipperLib::PolyFillType::pftEvenOdd; + ExPolygons expolys = Slic3r::union_ex(polys, fill_type); + if (expolys.size() == 1) + return expolys.front(); + + // It should be one expolygon + assert(false); + + if (expolys.empty()) return {}; + // find biggest + const ExPolygon *biggest = &expolys.front(); + for (size_t index = 1; index < expolys.size(); ++index) { + const ExPolygon *current = &expolys[index]; + if (biggest->contour.size() < current->contour.size()) + biggest = current; + } + return *biggest; +} + +SurfaceCut priv::patch2cut(SurfacePatch &patch) +{ + CutMesh &mesh = patch.mesh; + + std::string convert_map_name = "v:convert"; + CutMesh::Property_map convert_map = + mesh.add_property_map(convert_map_name).first; + + size_t indices_size = mesh.faces().size(); + size_t vertices_size = mesh.vertices().size(); + + SurfaceCut sc; + sc.indices.reserve(indices_size); + sc.vertices.reserve(vertices_size); + for (VI vi : mesh.vertices()) { + // vi order is is not sorted + // assert(vi.idx() == sc.vertices.size()); + // vi is not continous + // assert(vi.idx() < vertices_size); + convert_map[vi] = sc.vertices.size(); + const P3 &p = mesh.point(vi); + sc.vertices.emplace_back(p.x(), p.y(), p.z()); + } + + for (FI fi : mesh.faces()) { + HI hi = mesh.halfedge(fi); + assert(mesh.next(hi).is_valid()); + assert(mesh.next(mesh.next(hi)).is_valid()); + // Is fi triangle? + assert(mesh.next(mesh.next(mesh.next(hi))) == hi); + + // triangle indicies + Vec3i ti; + size_t i = 0; + for (VI vi : { mesh.source(hi), + mesh.target(hi), + mesh.target(mesh.next(hi))}) + ti[i++] = convert_map[vi]; + sc.indices.push_back(ti); + } + + sc.contours.reserve(patch.loops.size()); + for (const Loop &loop : patch.loops) { + sc.contours.push_back({}); + std::vector &contour = sc.contours.back(); + contour.reserve(loop.size()); + for (VI vi : loop) contour.push_back(convert_map[vi]); + } + + // Not neccessary, clean and free memory + mesh.remove_property_map(convert_map); + return sc; +} + +void priv::append(SurfaceCut &sc, SurfaceCut &&sc_add) +{ + if (sc.empty()) { + sc = std::move(sc_add); + return; + } + + if (!sc_add.contours.empty()) { + SurfaceCut::Index offset = static_cast( + sc.vertices.size()); + size_t require = sc.contours.size() + sc_add.contours.size(); + if (sc.contours.capacity() < require) sc.contours.reserve(require); + for (std::vector &cut : sc_add.contours) + for (SurfaceCut::Index &i : cut) i += offset; + Slic3r::append(sc.contours, std::move(sc_add.contours)); + } + its_merge(sc, std::move(sc_add)); +} + +SurfaceCut priv::merge_patches(SurfacePatches &patches, const std::vector& mask) +{ + SurfaceCut result; + for (SurfacePatch &patch : patches) { + size_t index = &patch - &patches.front(); + if (!mask[index]) continue; + append(result, patch2cut(patch)); + } + return result; +} + +#ifdef DEBUG_OUTPUT_DIR +void priv::prepare_dir(const std::string &dir){ + namespace fs = std::filesystem; + if (fs::exists(dir)) { + for (auto &path : fs::directory_iterator(dir)) fs::remove_all(path); + } else { + fs::create_directories(dir); + } +} + +namespace priv{ +int reduction_order = 0; +int filled_order = 0; +int constrained_order = 0; +int diff_patch_order = 0; + +} // namespace priv + +void priv::initialize_store(const std::string& dir) +{ + // clear previous output + prepare_dir(dir); + reduction_order = 0; + filled_order = 0; + constrained_order = 0; + diff_patch_order = 0; +} + +void priv::store(const Vec3f &vertex, + const Vec3f &normal, + const std::string &file, + float size) +{ + int flatten = 20; + size_t min_i = 0; + for (size_t i = 1; i < 3; i++) + if (normal[min_i] > normal[i]) min_i = i; + Vec3f up_ = Vec3f::Zero(); + up_[min_i] = 1.f; + Vec3f side = normal.cross(up_).normalized() * size; + Vec3f up = side.cross(normal).normalized() * size; + + indexed_triangle_set its; + its.vertices.reserve(flatten + 1); + its.indices.reserve(flatten); + + its.vertices.push_back(vertex); + its.vertices.push_back(vertex + up); + size_t max_i = static_cast(flatten); + for (size_t i = 1; i < max_i; i++) { + float angle = i * 2 * M_PI / flatten; + Vec3f v = vertex + sin(angle) * side + cos(angle) * up; + its.vertices.push_back(v); + its.indices.emplace_back(0, i, i + 1); + } + its.indices.emplace_back(0, flatten, 1); + its_write_obj(its, file.c_str()); +} + +void priv::store(const CutMesh &mesh, const FaceTypeMap &face_type_map, const std::string& dir, bool is_filled) +{ + std::string off_file; + if (is_filled) { + if (filled_order == 0) prepare_dir(dir); + off_file = dir + "model" + std::to_string(filled_order++) + ".off"; + }else{ + if (constrained_order == 0) prepare_dir(dir); + off_file = dir + "model" + std::to_string(constrained_order++) + ".off"; + } + + CutMesh &mesh_ = const_cast(mesh); + auto face_colors = mesh_.add_property_map("f:color").first; + for (FI fi : mesh.faces()) { + auto &color = face_colors[fi]; + switch (face_type_map[fi]) { + case FaceType::inside: color = CGAL::Color{100, 250, 100}; break; // light green + case FaceType::inside_processed: color = CGAL::Color{170, 0, 0}; break; // dark red + case FaceType::outside: color = CGAL::Color{100, 0, 100}; break; // purple + case FaceType::not_constrained: color = CGAL::Color{127, 127, 127}; break; // gray + default: color = CGAL::Color{0, 0, 255}; // blue + } + } + CGAL::IO::write_OFF(off_file, mesh, CGAL::parameters::face_color_map(face_colors)); + mesh_.remove_property_map(face_colors); +} + +void priv::store(const ExPolygons &shapes, const std::string &svg_file) { + SVG svg(svg_file); + svg.draw(shapes); +} + +void priv::store(const CutMesh &mesh, const ReductionMap &reduction_map, const std::string& dir) +{ + if (reduction_order == 0) prepare_dir(dir); + std::string off_file = dir + "model" + std::to_string(reduction_order++) + ".off"; + + CutMesh &mesh_ = const_cast(mesh); + auto vertex_colors = mesh_.add_property_map("v:color").first; + // initialize to gray color + for (VI vi: mesh.vertices()) + vertex_colors[vi] = CGAL::Color{127, 127, 127}; + + for (VI reduction_from : mesh.vertices()) { + VI reduction_to = reduction_map[reduction_from]; + if (!reduction_to.is_valid()) continue; + vertex_colors[reduction_from] = CGAL::Color{255, 0, 0}; + vertex_colors[reduction_to] = CGAL::Color{0, 0, 255}; + } + + CGAL::IO::write_OFF(off_file, mesh, CGAL::parameters::vertex_color_map(vertex_colors)); + mesh_.remove_property_map(vertex_colors); +} + +namespace priv { +indexed_triangle_set create_indexed_triangle_set(const std::vector &faces, + const CutMesh &mesh); +} // namespace priv + +indexed_triangle_set priv::create_indexed_triangle_set( + const std::vector &faces, const CutMesh &mesh) +{ + std::vector vertices; + vertices.reserve(faces.size() * 2); + + indexed_triangle_set its; + its.indices.reserve(faces.size()); + for (FI fi : faces) { + HI hi = mesh.halfedge(fi); + HI hi_end = hi; + + int ti = 0; + Vec3i t; + + do { + VI vi = mesh.source(hi); + auto res = std::find(vertices.begin(), vertices.end(), vi); + t[ti++] = res - vertices.begin(); + if (res == vertices.end()) vertices.push_back(vi); + hi = mesh.next(hi); + } while (hi != hi_end); + + its.indices.push_back(t); + } + + its.vertices.reserve(vertices.size()); + for (VI vi : vertices) { + const auto &p = mesh.point(vi); + its.vertices.emplace_back(p.x(), p.y(), p.z()); + } + return its; +} + +void priv::store(const CutAOIs &aois, const CutMesh &mesh, const std::string &dir) { + auto create_outline_its = + [&mesh](const std::vector &outlines) -> indexed_triangle_set { + static const float line_width = 0.1f; + indexed_triangle_set its; + its.indices.reserve(2*outlines.size()); + its.vertices.reserve(outlines.size()*4); + for (HI hi : outlines) { + //FI fi = mesh.face(hi); + VI vi_a = mesh.source(hi); + VI vi_b = mesh.target(hi); + VI vi_c = mesh.target(mesh.next(hi)); + P3 p3_a = mesh.point(vi_a); + P3 p3_b = mesh.point(vi_b); + P3 p3_c = mesh.point(vi_c); + + Vec3f a(p3_a.x(), p3_a.y(), p3_a.z()); + Vec3f b(p3_b.x(), p3_b.y(), p3_b.z()); + Vec3f c(p3_c.x(), p3_c.y(), p3_c.z()); + + Vec3f v1 = b - a; // from a to b + v1.normalize(); + Vec3f v2 = c - a; // from a to c + v2.normalize(); + Vec3f norm = v1.cross(v2); + norm.normalize(); + Vec3f perp_to_edge = norm.cross(v1); + perp_to_edge.normalize(); + Vec3f dir = -perp_to_edge * line_width; + + size_t ai = its.vertices.size(); + its.vertices.push_back(a); + size_t bi = its.vertices.size(); + its.vertices.push_back(b); + size_t ai2 = its.vertices.size(); + its.vertices.push_back(a + dir); + size_t bi2 = its.vertices.size(); + its.vertices.push_back(b + dir); + + its.indices.push_back(Vec3i(ai, ai2, bi)); + its.indices.push_back(Vec3i(ai2, bi2, bi)); + } + return its; + }; + + prepare_dir(dir); + for (const auto &aoi : aois) { + size_t index = &aoi - &aois.front(); + std::string file = dir + "aoi" + std::to_string(index) + ".obj"; + indexed_triangle_set its = create_indexed_triangle_set(aoi.first, mesh); + its_write_obj(its, file.c_str()); + + // exist some outline? + if (aoi.second.empty()) continue; + std::string file_outline = dir + "outline" + std::to_string(index) + ".obj"; + indexed_triangle_set outline = create_outline_its(aoi.second); + its_write_obj(outline, file_outline.c_str()); + } +} + +void priv::store(const SurfacePatches &patches, const std::string &dir) { + prepare_dir(dir); + for (const priv::SurfacePatch &patch : patches) { + size_t index = &patch - &patches.front(); + if (patch.mesh.faces().empty()) continue; + CGAL::IO::write_OFF(dir + "patch" + std::to_string(index) + ".off", patch.mesh); + } +} +// +//void priv::store(const ProjectionDistances &pds, +// const VCutAOIs &aois, +// const CutMeshes &meshes, +// const std::string &file, +// float width) +//{ +// // create rectangle for each half edge from projection distances +// indexed_triangle_set its; +// its.vertices.reserve(4 * pds.size()); +// its.indices.reserve(2 * pds.size()); +// for (const ProjectionDistance &pd : pds) { +// if (pd.aoi_index == std::numeric_limits::max()) continue; +// HI hi = aois[pd.model_index][pd.aoi_index].second[pd.hi_index]; +// const CutMesh &mesh = meshes[pd.model_index]; +// VI vi1 = mesh.source(hi); +// VI vi2 = mesh.target(hi); +// VI vi3 = mesh.target(mesh.next(hi)); +// const P3 &p1 = mesh.point(vi1); +// const P3 &p2 = mesh.point(vi2); +// const P3 &p3 = mesh.point(vi3); +// Vec3f v1(p1.x(), p1.y(), p1.z()); +// Vec3f v2(p2.x(), p2.y(), p2.z()); +// Vec3f v3(p3.x(), p3.y(), p3.z()); +// +// Vec3f v12 = v2 - v1; +// v12.normalize(); +// Vec3f v13 = v3 - v1; +// v13.normalize(); +// Vec3f n = v12.cross(v13); +// n.normalize(); +// Vec3f side = n.cross(v12); +// side.normalize(); +// side *= -width; +// +// uint32_t i = its.vertices.size(); +// its.vertices.push_back(v1); +// its.vertices.push_back(v1+side); +// its.vertices.push_back(v2); +// its.vertices.push_back(v2+side); +// +// its.indices.emplace_back(i, i + 1, i + 2); +// its.indices.emplace_back(i + 2, i + 1, i + 3); +// } +// its_write_obj(its, file.c_str()); +//} + +void priv::store(const ExPolygons &shapes, const std::vector &mask, const Connections &connections, const std::string &file_svg) +{ + auto bb = get_extents(shapes); + int width = get_extents(shapes.front()).size().x() / 70; + + SVG svg(file_svg, bb); + svg.draw(shapes); + + ExPolygonsIndices s2i(shapes); + auto get_point = [&shapes, &s2i](size_t i)->Point { + auto id = s2i.cvt(i); + const ExPolygon &s = shapes[id.expolygons_index]; + const Polygon &p = (id.polygon_index == 0) ? + s.contour : + s.holes[id.polygon_index - 1]; + return p[id.point_index]; + }; + + bool is_first = true; + for (const Connection &c : connections) { + if (is_first) { + is_first = false; + Point p = get_point(c.first); + svg.draw(p, "purple", 4 * width); + continue; + } + Point p1 = get_point(c.first); + Point p2 = get_point(c.second); + svg.draw(Line(p1, p2), "red", width); + } + + for (size_t i = 0; i < s2i.get_count(); i++) { + Point p = get_point(i); + svg.draw(p, "black", 2*width); + if (!mask[i]) + svg.draw(p, "white", width); + } + svg.Close(); +} + +namespace priv { +/// +/// Create model consist of rectangles for each contour edge +/// +/// +/// +/// +indexed_triangle_set create_contour_its(const indexed_triangle_set& its, const std::vector &contour); + +/// +/// Getter on triangle tip (third vertex of face) +/// +/// First vertex index +/// Second vertex index +/// Source model +/// Tip Vertex index +unsigned int get_triangle_tip(unsigned int vi1, + unsigned int vi2, + const indexed_triangle_set &its); +} + + +unsigned int priv::get_triangle_tip(unsigned int vi1, + unsigned int vi2, + const indexed_triangle_set &its) +{ + assert(vi1 < its.vertices.size()); + assert(vi2 < its.vertices.size()); + for (const auto &t : its.indices) { + unsigned int tvi = std::numeric_limits::max(); + for (const auto &vi : t) { + unsigned int vi_ = static_cast(vi); + if (vi_ == vi1) continue; + if (vi_ == vi2) continue; + if (tvi == std::numeric_limits::max()) { + tvi = vi_; + } else { + tvi = std::numeric_limits::max(); + break; + } + } + if (tvi != std::numeric_limits::max()) + return tvi; + } + // triangle with indices vi1 and vi2 doesnt exist + assert(false); + return std::numeric_limits::max(); +} + +indexed_triangle_set priv::create_contour_its( + const indexed_triangle_set &its, const std::vector &contour) +{ + static const float line_width = 0.1f; + indexed_triangle_set result; + result.vertices.reserve((contour.size() + 1) * 4); + result.indices.reserve((contour.size() + 1) * 2); + unsigned int prev_vi = contour.back(); + for (unsigned int vi : contour) { + const Vec3f &a = its.vertices[vi]; + const Vec3f &b = its.vertices[prev_vi]; + const Vec3f &c = its.vertices[get_triangle_tip(vi, prev_vi, its)]; + + Vec3f v1 = b - a; // from a to b + v1.normalize(); + Vec3f v2 = c - a; // from a to c + v2.normalize(); + // triangle normal + Vec3f norm = v1.cross(v2); + norm.normalize(); + // perpendiculat to edge lay on triangle + Vec3f perp_to_edge = norm.cross(v1); + perp_to_edge.normalize(); + + Vec3f dir = -perp_to_edge * line_width; + + size_t ai = result.vertices.size(); + result.vertices.push_back(a); + size_t bi = result.vertices.size(); + result.vertices.push_back(b); + size_t ai2 = result.vertices.size(); + result.vertices.push_back(a + dir); + size_t bi2 = result.vertices.size(); + result.vertices.push_back(b + dir); + + result.indices.push_back(Vec3i(ai, bi, ai2)); + result.indices.push_back(Vec3i(ai2, bi, bi2)); + prev_vi = vi; + } + return result; +} + +//void priv::store(const SurfaceCuts &cut, const std::string &dir) { +// prepare_dir(dir); +// for (const auto &c : cut) { +// size_t index = &c - &cut.front(); +// std::string file = dir + "cut" + std::to_string(index) + ".obj"; +// its_write_obj(c, file.c_str()); +// for (const auto& contour : c.contours) { +// size_t c_index = &contour - &c.contours.front(); +// std::string c_file = dir + "cut" + std::to_string(index) + +// "contour" + std::to_string(c_index) + ".obj"; +// indexed_triangle_set c_its = create_contour_its(c, contour); +// its_write_obj(c_its, c_file.c_str()); +// } +// } +//} + +void priv::store(const SurfaceCut &cut, const std::string &file, const std::string &contour_dir) { + prepare_dir(contour_dir); + its_write_obj(cut, file.c_str()); + for (const auto& contour : cut.contours) { + size_t c_index = &contour - &cut.contours.front(); + std::string c_file = contour_dir + std::to_string(c_index) + ".obj"; + indexed_triangle_set c_its = create_contour_its(cut, contour); + its_write_obj(c_its, c_file.c_str()); + } +} + +void priv::store(const std::vector &models, + const std::string &obj_filename) +{ + indexed_triangle_set merged_model; + for (const indexed_triangle_set &model : models) + its_merge(merged_model, model); + its_write_obj(merged_model, obj_filename.c_str()); +} + +void priv::store(const std::vector &models, + const std::string &dir) +{ + prepare_dir(dir); + if (models.empty()) return; + if (models.size() == 1) { + CGAL::IO::write_OFF(dir + "model.off", models.front()); + return; + } + size_t model_index = 0; + for (const priv::CutMesh& model : models) { + std::string filename = dir + "model" + std::to_string(model_index++) + ".off"; + CGAL::IO::write_OFF(filename, model); + } +} + +// store projection center +void priv::store(const Emboss::IProjection &projection, + const Point &point_to_project, + float projection_ratio, + const std::string &obj_filename) +{ + auto [front, back] = projection.create_front_back(point_to_project); + Vec3d diff = back - front; + Vec3d pos = front + diff * projection_ratio; + priv::store(pos.cast(), diff.normalized().cast(), + DEBUG_OUTPUT_DIR + "projection_center.obj"); // only debug +} + +#endif // DEBUG_OUTPUT_DIR + +bool Slic3r::corefine_test(const std::string &model_path, const std::string &shape_path) { + priv::CutMesh model, shape; + if (!CGAL::IO::read_OFF(model_path, model)) return false; + if (!CGAL::IO::read_OFF(shape_path, shape)) return false; + + CGAL::Polygon_mesh_processing::corefine(model, shape); + return true; +} diff --git a/src/libslic3r/CutSurface.hpp b/src/libslic3r/CutSurface.hpp new file mode 100644 index 0000000000..f5b41cdaeb --- /dev/null +++ b/src/libslic3r/CutSurface.hpp @@ -0,0 +1,78 @@ +///|/ Copyright (c) Prusa Research 2022 Filip Sykala @Jony01 +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ +#ifndef slic3r_CutSurface_hpp_ +#define slic3r_CutSurface_hpp_ + +#include +#include // indexed_triangle_set +#include "ExPolygon.hpp" +#include "Emboss.hpp" // IProjection + +namespace Slic3r{ + +/// +/// Represents cutted surface from object +/// Extend index triangle set by outlines +/// +struct SurfaceCut : public indexed_triangle_set +{ + // vertex indices(index to mesh vertices) + using Index = unsigned int; + using Contour = std::vector; + using Contours = std::vector; + // list of circulated open surface + Contours contours; +}; + +/// +/// Cut surface shape from models. +/// +/// Multiple shape to cut from model +/// Multi mesh to cut, need to be in same coordinate system +/// Define transformation 2d shape into 3d +/// Define ideal ratio between front and back projection to cut +/// 0 .. means use closest to front projection +/// 1 .. means use closest to back projection +/// value from <0, 1> +/// +/// Cutted surface from model +SurfaceCut cut_surface(const ExPolygons &shapes, + const std::vector &models, + const Emboss::IProjection &projection, + float projection_ratio); + +/// +/// Create model from surface cuts by projection +/// +/// Surface from model with outlines +/// Way of emboss +/// Mesh +indexed_triangle_set cut2model(const SurfaceCut &cut, + const Emboss::IProject3d &projection); + +/// +/// Separate (A)rea (o)f (I)nterest .. AoI from model +/// NOTE: Only 2d filtration, do not filtrate by Z coordinate +/// +/// Input model +/// Bounding box to project into space +/// Define tranformation of BB into space +/// Triangles lay at least partialy inside of projected Bounding box +indexed_triangle_set its_cut_AoI(const indexed_triangle_set &its, + const BoundingBox &bb, + const Emboss::IProjection &projection); + +/// +/// Separate triangles by mask +/// +/// Input model +/// Mask - same size as its::indices +/// Copy of indices by mask(with their vertices) +indexed_triangle_set its_mask(const indexed_triangle_set &its, const std::vector &mask); + +bool corefine_test(const std::string &model_path, const std::string &shape_path); + +} // namespace Slic3r +#endif // slic3r_CutSurface_hpp_ diff --git a/src/libslic3r/CutUtils.cpp b/src/libslic3r/CutUtils.cpp index f847c7ad73..9f4dbdaacc 100644 --- a/src/libslic3r/CutUtils.cpp +++ b/src/libslic3r/CutUtils.cpp @@ -217,7 +217,7 @@ static void reset_instance_transformation(ModelObject* object, size_t src_instan auto& obj_instance = object->instances[i]; const double rot_z = obj_instance->get_rotation().z(); - Transformation inst_trafo = Transformation(obj_instance->get_transformation().get_matrix(false, false, true)); + Transformation inst_trafo = Transformation(obj_instance->get_transformation().get_matrix_no_scaling_factor()); // add respect to mirroring if (obj_instance->is_left_handed()) inst_trafo = inst_trafo * Transformation(scale_transform(Vec3d(-1, 1, 1))); @@ -320,7 +320,7 @@ const ModelObjectPtrs& Cut::perform_with_plane() // except for translation and Z-rotation on instances, which are preserved // in the transformation matrix and not applied to the mesh transform. - const auto instance_matrix = mo->instances[m_instance]->get_transformation().get_matrix(true); + const auto instance_matrix = mo->instances[m_instance]->get_transformation().get_matrix_no_offset(); const Transformation cut_transformation = Transformation(m_cut_matrix); const Transform3d inverse_cut_matrix = cut_transformation.get_rotation_matrix().inverse() * translation_transform(-1. * cut_transformation.get_offset()); diff --git a/src/libslic3r/Emboss.cpp b/src/libslic3r/Emboss.cpp new file mode 100644 index 0000000000..6af848f465 --- /dev/null +++ b/src/libslic3r/Emboss.cpp @@ -0,0 +1,2185 @@ +///|/ Copyright (c) Prusa Research 2021 - 2023 Lukáš Matěna @lukasmatena, Oleksandra Iushchenko @YuSanka, Filip Sykala @Jony01, Vojtěch Bubník @bubnikv +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ +#include +#include "Emboss.hpp" +#include +#include +#include +#include +#include +#include // union_ex + for boldness(polygon extend(offset)) +#include "IntersectionPoints.hpp" + +#define STB_TRUETYPE_IMPLEMENTATION // force following include to generate implementation +#include "imgui/imstb_truetype.h" // stbtt_fontinfo +#include "Utils.hpp" // ScopeGuard + +#include // CGAL project +#include "libslic3r.h" + +// to heal shape +#include "ExPolygonsIndex.hpp" +#include "libslic3r/AABBTreeLines.hpp" // search structure for found close points +#include "libslic3r/Line.hpp" +#include "libslic3r/BoundingBox.hpp" + +// Experimentaly suggested ration of font ascent by multiple fonts +// to get approx center of normal text line +const double ASCENT_CENTER = 1/3.; // 0.5 is above small letter + +// every glyph's shape point is divided by SHAPE_SCALE - increase precission of fixed point value +// stored in fonts (to be able represents curve by sequence of lines) +static constexpr double SHAPE_SCALE = 0.001; // SCALING_FACTOR promile is fine enough +static unsigned MAX_HEAL_ITERATION_OF_TEXT = 10; + +using namespace Slic3r; +using namespace Emboss; +using fontinfo_opt = std::optional; + +// NOTE: approach to heal shape by Clipper::Closing is not working + +// functionality to remove all spikes from shape +// Potentionaly useable for eliminate spike in layer +//#define REMOVE_SPIKES + +// function to remove useless islands and holes +// #define REMOVE_SMALL_ISLANDS +#ifdef REMOVE_SMALL_ISLANDS +namespace { void remove_small_islands(ExPolygons &shape, double minimal_area);} +#endif //REMOVE_SMALL_ISLANDS + +//#define VISUALIZE_HEAL +#ifdef VISUALIZE_HEAL +namespace { +// for debug purpose only +// NOTE: check scale when store svg !! +#include "libslic3r/SVG.hpp" // for visualize_heal +static std::string visualize_heal_svg_filepath = "C:/data/temp/heal.svg"; +void visualize_heal(const std::string &svg_filepath, const ExPolygons &expolygons) +{ + Points pts = to_points(expolygons); + BoundingBox bb(pts); + // double svg_scale = SHAPE_SCALE / unscale(1.); + // bb.scale(svg_scale); + SVG svg(svg_filepath, bb); + svg.draw(expolygons); + + Points duplicits = collect_duplicates(pts); + int black_size = std::max(bb.size().x(), bb.size().y()) / 20; + svg.draw(duplicits, "black", black_size); + + Slic3r::IntersectionsLines intersections_f = get_intersections(expolygons); + Points intersections = get_unique_intersections(intersections_f); + svg.draw(intersections, "red", black_size * 1.2); +} +} // namespace +#endif // VISUALIZE_HEAL + +// do not expose out of this file stbtt_ data types +namespace{ +using Polygon = Slic3r::Polygon; +bool is_valid(const FontFile &font, unsigned int index); +fontinfo_opt load_font_info(const unsigned char *data, unsigned int index = 0); +std::optional get_glyph(const stbtt_fontinfo &font_info, int unicode_letter, float flatness); + +// take glyph from cache +const Glyph* get_glyph(int unicode, const FontFile &font, const FontProp &font_prop, + Glyphs &cache, fontinfo_opt &font_info_opt); + +// scale and convert float to int coordinate +Point to_point(const stbtt__point &point); + +// bad is contour smaller than 3 points +void remove_bad(Polygons &polygons); +void remove_bad(ExPolygons &expolygons); + +// Try to remove self intersection by subtracting rect 2x2 px +ExPolygon create_bounding_rect(const ExPolygons &shape); + +// Heal duplicates points and self intersections +bool heal_dupl_inter(ExPolygons &shape, unsigned max_iteration); + +const Points pts_2x2({Point(0, 0), Point(1, 0), Point(1, 1), Point(0, 1)}); +const Points pts_3x3({Point(-1, -1), Point(1, -1), Point(1, 1), Point(-1, 1)}); + +struct SpikeDesc +{ + // cosinus of max spike angle + double cos_angle; // speed up to skip acos + + // Half of Wanted bevel size + double half_bevel; + + /// + /// Calculate spike description + /// + /// Size of spike width after cut of the tip, has to be grater than 2.5 + /// When spike has same or more pixels with width less than 1 pixel + SpikeDesc(double bevel_size, double pixel_spike_length = 6): + // create min angle given by spike_length + // Use it as minimal height of 1 pixel base spike + cos_angle(std::fabs(std::cos( + /*angle*/ 2. * std::atan2(pixel_spike_length, .5) + ))), + + // When remove spike this angle is set. + // Value must be grater than min_angle + half_bevel(bevel_size / 2) + {} +}; + +// return TRUE when remove point. It could create polygon with 2 points. +bool remove_when_spike(Polygon &polygon, size_t index, const SpikeDesc &spike_desc); +void remove_spikes_in_duplicates(ExPolygons &expolygons, const Points &duplicates); + +#ifdef REMOVE_SPIKES +// Remove long sharp corners aka spikes +// by adding points to bevel tip of spikes - Not printable parts +// Try to not modify long sides of spike and add points on it's side +void remove_spikes(Polygon &polygon, const SpikeDesc &spike_desc); +void remove_spikes(Polygons &polygons, const SpikeDesc &spike_desc); +void remove_spikes(ExPolygons &expolygons, const SpikeDesc &spike_desc); +#endif + +// spike ... very sharp corner - when not removed cause iteration of heal process +// index ... index of duplicit point in polygon +bool remove_when_spike(Slic3r::Polygon &polygon, size_t index, const SpikeDesc &spike_desc) { + + std::optional add; + bool do_erase = false; + Points &pts = polygon.points; + { + size_t pts_size = pts.size(); + if (pts_size < 3) + return false; + + const Point &a = (index == 0) ? pts.back() : pts[index - 1]; + const Point &b = pts[index]; + const Point &c = (index == (pts_size - 1)) ? pts.front() : pts[index + 1]; + + // calc sides + Vec2d ba = (a - b).cast(); + Vec2d bc = (c - b).cast(); + + double dot_product = ba.dot(bc); + + // sqrt together after multiplication save one sqrt + double ba_size_sq = ba.squaredNorm(); + double bc_size_sq = bc.squaredNorm(); + double norm = sqrt(ba_size_sq * bc_size_sq); + double cos_angle = dot_product / norm; + + // small angle are around 1 --> cos(0) = 1 + if (cos_angle < spike_desc.cos_angle) + return false; // not a spike + + // has to be in range <-1, 1> + // Due to preccission of floating point number could be sligtly out of range + if (cos_angle > 1.) + cos_angle = 1.; + // if (cos_angle < -1.) + // cos_angle = -1.; + + // Current Spike angle + double angle = acos(cos_angle); + double wanted_size = spike_desc.half_bevel / cos(angle / 2.); + double wanted_size_sq = wanted_size * wanted_size; + + bool is_ba_short = ba_size_sq < wanted_size_sq; + bool is_bc_short = bc_size_sq < wanted_size_sq; + + auto a_side = [&b, &ba, &ba_size_sq, &wanted_size]() -> Point { + Vec2d ba_norm = ba / sqrt(ba_size_sq); + return b + (wanted_size * ba_norm).cast(); + }; + auto c_side = [&b, &bc, &bc_size_sq, &wanted_size]() -> Point { + Vec2d bc_norm = bc / sqrt(bc_size_sq); + return b + (wanted_size * bc_norm).cast(); + }; + + if (is_ba_short && is_bc_short) { + // remove short spike + do_erase = true; + } else if (is_ba_short) { + // move point B on C-side + pts[index] = c_side(); + } else if (is_bc_short) { + // move point B on A-side + pts[index] = a_side(); + } else { + // move point B on C-side and add point on A-side(left - before) + pts[index] = c_side(); + add = a_side(); + if (*add == pts[index]) { + // should be very rare, when SpikeDesc has small base + // will be fixed by remove B point + add.reset(); + do_erase = true; + } + } + } + if (do_erase) { + pts.erase(pts.begin() + index); + return true; + } + if (add.has_value()) + pts.insert(pts.begin() + index, *add); + return false; +} + +void remove_spikes_in_duplicates(ExPolygons &expolygons, const Points &duplicates) { + if (duplicates.empty()) + return; + auto check = [](Slic3r::Polygon &polygon, const Point &d) -> bool { + double spike_bevel = 1 / SHAPE_SCALE; + double spike_length = 5.; + const static SpikeDesc sd(spike_bevel, spike_length); + Points& pts = polygon.points; + bool exist_remove = false; + for (size_t i = 0; i < pts.size(); i++) { + if (pts[i] != d) + continue; + exist_remove |= remove_when_spike(polygon, i, sd); + } + return exist_remove && pts.size() < 3; + }; + + bool exist_remove = false; + for (ExPolygon &expolygon : expolygons) { + BoundingBox bb(to_points(expolygon.contour)); + for (const Point &d : duplicates) { + if (!bb.contains(d)) + continue; + exist_remove |= check(expolygon.contour, d); + for (Polygon &hole : expolygon.holes) + exist_remove |= check(hole, d); + } + } + + if (exist_remove) + remove_bad(expolygons); +} + +bool is_valid(const FontFile &font, unsigned int index) { + if (font.data == nullptr) return false; + if (font.data->empty()) return false; + if (index >= font.infos.size()) return false; + return true; +} + +fontinfo_opt load_font_info( + const unsigned char *data, unsigned int index) +{ + int font_offset = stbtt_GetFontOffsetForIndex(data, index); + if (font_offset < 0) { + assert(false); + // "Font index(" << index << ") doesn't exist."; + return {}; + } + stbtt_fontinfo font_info; + if (stbtt_InitFont(&font_info, data, font_offset) == 0) { + // Can't initialize font. + assert(false); + return {}; + } + return font_info; +} + +void remove_bad(Polygons &polygons) { + polygons.erase( + std::remove_if(polygons.begin(), polygons.end(), + [](const Polygon &p) { return p.size() < 3; }), + polygons.end()); +} + +void remove_bad(ExPolygons &expolygons) { + expolygons.erase( + std::remove_if(expolygons.begin(), expolygons.end(), + [](const ExPolygon &p) { return p.contour.size() < 3; }), + expolygons.end()); + + for (ExPolygon &expolygon : expolygons) + remove_bad(expolygon.holes); +} +} // end namespace + +bool Emboss::divide_segments_for_close_point(ExPolygons &expolygons, double distance) +{ + if (expolygons.empty()) return false; + if (distance < 0.) return false; + + // ExPolygons can't contain same neigbours + remove_same_neighbor(expolygons); + + // IMPROVE: use int(insted of double) lines and tree + const ExPolygonsIndices ids(expolygons); + const std::vector lines = Slic3r::to_linesf(expolygons, ids.get_count()); + AABBTreeIndirect::Tree<2, double> tree = AABBTreeLines::build_aabb_tree_over_indexed_lines(lines); + using Div = std::pair; + std::vector
divs; + size_t point_index = 0; + auto check_points = [&divs, &point_index, &lines, &tree, &distance, &ids, &expolygons](const Points &pts) { + for (const Point &p : pts) { + Vec2d p_d = p.cast(); + std::vector close_lines = AABBTreeLines::all_lines_in_radius(lines, tree, p_d, distance); + for (size_t index : close_lines) { + // skip point neighbour lines indices + if (index == point_index) continue; + if (&p != &pts.front()) { + if (index == point_index - 1) continue; + } else if (index == (pts.size()-1)) continue; + + // do not doubled side point of segment + const ExPolygonsIndex id = ids.cvt(index); + const ExPolygon &expoly = expolygons[id.expolygons_index]; + const Polygon &poly = id.is_contour() ? expoly.contour : expoly.holes[id.hole_index()]; + const Points &poly_pts = poly.points; + const Point &line_a = poly_pts[id.point_index]; + const Point &line_b = (!ids.is_last_point(id)) ? poly_pts[id.point_index + 1] : poly_pts.front(); + assert(line_a == lines[index].a.cast()); + assert(line_b == lines[index].b.cast()); + if (p == line_a || p == line_b) continue; + + divs.emplace_back(p, index); + } + ++point_index; + } + }; + for (const ExPolygon &expoly : expolygons) { + check_points(expoly.contour.points); + for (const Polygon &hole : expoly.holes) + check_points(hole.points); + } + + // check if exist division + if (divs.empty()) return false; + + // sort from biggest index to zero + // to be able add points and not interupt indices + std::sort(divs.begin(), divs.end(), + [](const Div &d1, const Div &d2) { return d1.second > d2.second; }); + + auto it = divs.begin(); + // divide close line + while (it != divs.end()) { + // colect division of a line segmen + size_t index = it->second; + auto it2 = it+1; + while (it2 != divs.end() && it2->second == index) ++it2; + + ExPolygonsIndex id = ids.cvt(index); + ExPolygon &expoly = expolygons[id.expolygons_index]; + Polygon &poly = id.is_contour() ? expoly.contour : expoly.holes[id.hole_index()]; + Points &pts = poly.points; + size_t count = it2 - it; + + // add points into polygon to divide in place of near point + if (count == 1) { + pts.insert(pts.begin() + id.point_index + 1, it->first); + ++it; + } else { + // collect points to add into polygon + Points points; + points.reserve(count); + for (; it < it2; ++it) + points.push_back(it->first); + + // need sort by line direction + const Linef &line = lines[index]; + Vec2d dir = line.b - line.a; + // select mayorit direction + int axis = (abs(dir.x()) > abs(dir.y())) ? 0 : 1; + using Fnc = std::function; + Fnc fnc = (dir[axis] < 0) ? Fnc([axis](const Point &p1, const Point &p2) { return p1[axis] > p2[axis]; }) : + Fnc([axis](const Point &p1, const Point &p2) { return p1[axis] < p2[axis]; }) ; + std::sort(points.begin(), points.end(), fnc); + + // use only unique points + points.erase(std::unique(points.begin(), points.end()), points.end()); + + // divide line by adding points into polygon + pts.insert(pts.begin() + id.point_index + 1, + points.begin(), points.end()); + } + assert(it == it2); + } + return true; +} + +HealedExPolygons Emboss::heal_polygons(const Polygons &shape, bool is_non_zero, unsigned int max_iteration) +{ + const double clean_distance = 1.415; // little grater than sqrt(2) + ClipperLib::PolyFillType fill_type = is_non_zero ? + ClipperLib::pftNonZero : ClipperLib::pftEvenOdd; + + // When edit this code check that font 'ALIENATE.TTF' and glyph 'i' still work + // fix of self intersections + // http://www.angusj.com/delphi/clipper/documentation/Docs/Units/ClipperLib/Functions/SimplifyPolygon.htm + ClipperLib::Paths paths = ClipperLib::SimplifyPolygons(ClipperUtils::PolygonsProvider(shape), fill_type); + ClipperLib::CleanPolygons(paths, clean_distance); + Polygons polygons = to_polygons(paths); + polygons.erase(std::remove_if(polygons.begin(), polygons.end(), + [](const Polygon &p) { return p.size() < 3; }), polygons.end()); + + if (polygons.empty()) + return {{}, false}; + + // Do not remove all duplicates but do it better way + // Overlap all duplicit points by rectangle 3x3 + Points duplicits = collect_duplicates(to_points(polygons)); + if (!duplicits.empty()) { + polygons.reserve(polygons.size() + duplicits.size()); + for (const Point &p : duplicits) { + Polygon rect_3x3(pts_3x3); + rect_3x3.translate(p); + polygons.push_back(rect_3x3); + } + } + ExPolygons res = Slic3r::union_ex(polygons, fill_type); + bool is_healed = heal_expolygons(res, max_iteration); + return {res, is_healed}; +} + + +bool Emboss::heal_expolygons(ExPolygons &shape, unsigned max_iteration) +{ + return ::heal_dupl_inter(shape, max_iteration); +} + +namespace { + +Points get_unique_intersections(const Slic3r::IntersectionsLines &intersections) +{ + Points result; + if (intersections.empty()) + return result; + + // convert intersections into Points + result.reserve(intersections.size()); + std::transform(intersections.begin(), intersections.end(), std::back_inserter(result), + [](const Slic3r::IntersectionLines &i) { return Point( + std::floor(i.intersection.x()), + std::floor(i.intersection.y())); + }); + // intersections should be unique poits + std::sort(result.begin(), result.end()); + auto it = std::unique(result.begin(), result.end()); + result.erase(it, result.end()); + return result; +} + +Polygons get_holes_with_points(const Polygons &holes, const Points &points) +{ + Polygons result; + for (const Slic3r::Polygon &hole : holes) + for (const Point &p : points) + for (const Point &h : hole) + if (p == h) { + result.push_back(hole); + break; + } + return result; +} + +/// +/// Fill holes which create duplicits or intersections +/// When healing hole creates trouble in shape again try to heal by an union instead of diff_ex +/// +/// Holes which was substracted from shape previous +/// Current duplicates in shape +/// Current intersections in shape +/// Partialy healed shape[could be modified] +/// True when modify shape otherwise False +bool fill_trouble_holes(const Polygons &holes, const Points &duplicates, const Points &intersections, ExPolygons &shape) +{ + if (holes.empty()) + return false; + if (duplicates.empty() && intersections.empty()) + return false; + + Polygons fill = get_holes_with_points(holes, duplicates); + append(fill, get_holes_with_points(holes, intersections)); + if (fill.empty()) + return false; + + shape = union_ex(shape, fill); + return true; +} + +// extend functionality from Points.cpp --> collect_duplicates +// with address of duplicated points +struct Duplicate { + Point point; + std::vector indices; +}; +using Duplicates = std::vector; +Duplicates collect_duplicit_indices(const ExPolygons &expoly) +{ + Points pts = to_points(expoly); + + // initialize original index locations + std::vector idx(pts.size()); + std::iota(idx.begin(), idx.end(), 0); + std::sort(idx.begin(), idx.end(), + [&pts](uint32_t i1, uint32_t i2) { return pts[i1] < pts[i2]; }); + + Duplicates result; + const Point *prev = &pts[idx.front()]; + for (size_t i = 1; i < idx.size(); ++i) { + uint32_t index = idx[i]; + const Point *act = &pts[index]; + if (*prev == *act) { + // duplicit point + if (!result.empty() && result.back().point == *act) { + // more than 2 points with same coordinate + result.back().indices.push_back(index); + } else { + uint32_t prev_index = idx[i-1]; + result.push_back({*act, {prev_index, index}}); + } + continue; + } + prev = act; + } + return result; +} + +Points get_points(const Duplicates& duplicate_indices) +{ + Points result; + if (duplicate_indices.empty()) + return result; + + // convert intersections into Points + result.reserve(duplicate_indices.size()); + std::transform(duplicate_indices.begin(), duplicate_indices.end(), std::back_inserter(result), + [](const Duplicate &d) { return d.point; }); + return result; +} + +bool heal_dupl_inter(ExPolygons &shape, unsigned max_iteration) +{ + if (shape.empty()) return true; + remove_same_neighbor(shape); + + // create loop permanent memory + Polygons holes; + while (--max_iteration) { + Duplicates duplicate_indices = collect_duplicit_indices(shape); + //Points duplicates = collect_duplicates(to_points(shape)); + IntersectionsLines intersections = get_intersections(shape); + + // Check whether shape is already healed + if (intersections.empty() && duplicate_indices.empty()) + return true; + + Points duplicate_points = get_points(duplicate_indices); + Points intersection_points = get_unique_intersections(intersections); + + if (fill_trouble_holes(holes, duplicate_points, intersection_points, shape)) { + holes.clear(); + continue; + } + + holes.clear(); + holes.reserve(intersections.size() + duplicate_points.size()); + + remove_spikes_in_duplicates(shape, duplicate_points); + + // Fix self intersection in result by subtracting hole 2x2 + for (const Point &p : intersection_points) { + Polygon hole(pts_2x2); + hole.translate(p); + holes.push_back(hole); + } + + // Fix duplicit points by hole 3x3 around duplicit point + for (const Point &p : duplicate_points) { + Polygon hole(pts_3x3); + hole.translate(p); + holes.push_back(hole); + } + + shape = Slic3r::diff_ex(shape, holes, ApplySafetyOffset::No); + // ApplySafetyOffset::Yes is incompatible with function fill_trouble_holes + } + + // Create partialy healed output + Duplicates duplicates = collect_duplicit_indices(shape); + IntersectionsLines intersections = get_intersections(shape); + if (duplicates.empty() && intersections.empty()){ + // healed in the last loop + return true; + } + + #ifdef VISUALIZE_HEAL + visualize_heal(visualize_heal_svg_filepath, shape); + #endif // VISUALIZE_HEAL + + assert(false); // Can not heal this shape + // investigate how to heal better way + + ExPolygonsIndices ei(shape); + std::vector is_healed(shape.size(), {true}); + for (const Duplicate &duplicate : duplicates){ + for (uint32_t i : duplicate.indices) + is_healed[ei.cvt(i).expolygons_index] = false; + } + for (const IntersectionLines &intersection : intersections) { + is_healed[ei.cvt(intersection.line_index1).expolygons_index] = false; + is_healed[ei.cvt(intersection.line_index2).expolygons_index] = false; + } + + for (size_t shape_index = 0; shape_index < shape.size(); shape_index++) { + if (!is_healed[shape_index]) { + // exchange non healed expoly with bb rect + ExPolygon &expoly = shape[shape_index]; + expoly = create_bounding_rect({expoly}); + } + } + return false; +} + +ExPolygon create_bounding_rect(const ExPolygons &shape) { + BoundingBox bb = get_extents(shape); + Point size = bb.size(); + if (size.x() < 10) + bb.max.x() += 10; + if (size.y() < 10) + bb.max.y() += 10; + + Polygon rect({// CCW + bb.min, + {bb.max.x(), bb.min.y()}, + bb.max, + {bb.min.x(), bb.max.y()}}); + + Point offset = bb.size() * 0.1; + Polygon hole({// CW + bb.min + offset, + {bb.min.x() + offset.x(), bb.max.y() - offset.y()}, + bb.max - offset, + {bb.max.x() - offset.x(), bb.min.y() + offset.y()}}); + + return ExPolygon(rect, hole); +} + +#ifdef REMOVE_SMALL_ISLANDS +void remove_small_islands(ExPolygons &expolygons, double minimal_area) { + if (expolygons.empty()) + return; + + // remove small expolygons contours + auto expoly_it = std::remove_if(expolygons.begin(), expolygons.end(), + [&minimal_area](const ExPolygon &p) { return p.contour.area() < minimal_area; }); + expolygons.erase(expoly_it, expolygons.end()); + + // remove small holes in expolygons + for (ExPolygon &expoly : expolygons) { + Polygons& holes = expoly.holes; + auto it = std::remove_if(holes.begin(), holes.end(), + [&minimal_area](const Polygon &p) { return -p.area() < minimal_area; }); + holes.erase(it, holes.end()); + } +} +#endif // REMOVE_SMALL_ISLANDS + +std::optional get_glyph(const stbtt_fontinfo &font_info, int unicode_letter, float flatness) +{ + int glyph_index = stbtt_FindGlyphIndex(&font_info, unicode_letter); + if (glyph_index == 0) { + //wchar_t wchar = static_cast(unicode_letter); + //<< "Character unicode letter (" + //<< "decimal value = " << std::dec << unicode_letter << ", " + //<< "hexadecimal value = U+" << std::hex << unicode_letter << std::dec << ", " + //<< "wchar value = " << wchar + //<< ") is NOT defined inside of the font. \n"; + return {}; + } + + Glyph glyph; + stbtt_GetGlyphHMetrics(&font_info, glyph_index, &glyph.advance_width, &glyph.left_side_bearing); + + stbtt_vertex *vertices; + int num_verts = stbtt_GetGlyphShape(&font_info, glyph_index, &vertices); + if (num_verts <= 0) return glyph; // no shape + ScopeGuard sg1([&vertices]() { free(vertices); }); + + int *contour_lengths = NULL; + int num_countour_int = 0; + stbtt__point *points = stbtt_FlattenCurves(vertices, num_verts, + flatness, &contour_lengths, &num_countour_int, font_info.userdata); + if (!points) return glyph; // no valid flattening + ScopeGuard sg2([&contour_lengths, &points]() { + free(contour_lengths); + free(points); + }); + + size_t num_contour = static_cast(num_countour_int); + Polygons glyph_polygons; + glyph_polygons.reserve(num_contour); + size_t pi = 0; // point index + for (size_t ci = 0; ci < num_contour; ++ci) { + int length = contour_lengths[ci]; + // check minimal length for triangle + if (length < 4) { + // weird font + pi+=length; + continue; + } + // last point is first point + --length; + Points pts; + pts.reserve(length); + for (int i = 0; i < length; ++i) + pts.emplace_back(to_point(points[pi++])); + + // last point is first point --> closed contour + assert(pts.front() == to_point(points[pi])); + ++pi; + + // change outer cw to ccw and inner ccw to cw order + std::reverse(pts.begin(), pts.end()); + glyph_polygons.emplace_back(pts); + } + if (!glyph_polygons.empty()) { + unsigned max_iteration = 10; + // TrueTypeFonts use non zero winding number + // https://docs.microsoft.com/en-us/typography/opentype/spec/ttch01 + // https://developer.apple.com/fonts/TrueType-Reference-Manual/RM01/Chap1.html + bool is_non_zero = true; + glyph.shape = Emboss::heal_polygons(glyph_polygons, is_non_zero, max_iteration); + } + return glyph; +} + +const Glyph* get_glyph( + int unicode, + const FontFile & font, + const FontProp & font_prop, + Glyphs & cache, + fontinfo_opt &font_info_opt) +{ + // TODO: Use resolution by printer configuration, or add it into FontProp + const float RESOLUTION = 0.0125f; // [in mm] + auto glyph_item = cache.find(unicode); + if (glyph_item != cache.end()) return &glyph_item->second; + + unsigned int font_index = font_prop.collection_number.value_or(0); + if (!is_valid(font, font_index)) return nullptr; + + if (!font_info_opt.has_value()) { + + font_info_opt = load_font_info(font.data->data(), font_index); + // can load font info? + if (!font_info_opt.has_value()) return nullptr; + } + + float flatness = font.infos[font_index].ascent * RESOLUTION / font_prop.size_in_mm; + + // Fix for very small flatness because it create huge amount of points from curve + if (flatness < RESOLUTION) flatness = RESOLUTION; + + std::optional glyph_opt = get_glyph(*font_info_opt, unicode, flatness); + + // IMPROVE: multiple loadig glyph without data + // has definition inside of font? + if (!glyph_opt.has_value()) return nullptr; + + Glyph &glyph = *glyph_opt; + if (font_prop.char_gap.has_value()) + glyph.advance_width += *font_prop.char_gap; + + // scale glyph size + glyph.advance_width = static_cast(glyph.advance_width / SHAPE_SCALE); + glyph.left_side_bearing = static_cast(glyph.left_side_bearing / SHAPE_SCALE); + + if (!glyph.shape.empty()) { + if (font_prop.boldness.has_value()) { + float delta = static_cast(*font_prop.boldness / SHAPE_SCALE / font_prop.size_in_mm); + glyph.shape = Slic3r::union_ex(offset_ex(glyph.shape, delta)); + } + if (font_prop.skew.has_value()) { + double ratio = *font_prop.skew; + auto skew = [&ratio](Polygon &polygon) { + for (Slic3r::Point &p : polygon.points) + p.x() += static_cast(std::round(p.y() * ratio)); + }; + for (ExPolygon &expolygon : glyph.shape) { + skew(expolygon.contour); + for (Polygon &hole : expolygon.holes) skew(hole); + } + } + } + auto [it, success] = cache.try_emplace(unicode, std::move(glyph)); + assert(success); + return &it->second; +} + +Point to_point(const stbtt__point &point) { + return Point(static_cast(std::round(point.x / SHAPE_SCALE)), + static_cast(std::round(point.y / SHAPE_SCALE))); +} + +} // namespace + +#ifdef _WIN32 +#include +#include +#include +#include + +namespace { +EmbossStyle create_style(const std::wstring& name, const std::wstring& path) { + return { boost::nowide::narrow(name.c_str()), + boost::nowide::narrow(path.c_str()), + EmbossStyle::Type::file_path, FontProp() }; +} +} // namespace + +// Get system font file path +std::optional Emboss::get_font_path(const std::wstring &font_face_name) +{ +// static const LPWSTR fontRegistryPath = L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Fonts"; + static const LPCWSTR fontRegistryPath = L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Fonts"; + HKEY hKey; + LONG result; + + // Open Windows font registry key + result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, fontRegistryPath, 0, KEY_READ, &hKey); + if (result != ERROR_SUCCESS) return {}; + + DWORD maxValueNameSize, maxValueDataSize; + result = RegQueryInfoKey(hKey, 0, 0, 0, 0, 0, 0, 0, &maxValueNameSize, &maxValueDataSize, 0, 0); + if (result != ERROR_SUCCESS) return {}; + + DWORD valueIndex = 0; + LPWSTR valueName = new WCHAR[maxValueNameSize]; + LPBYTE valueData = new BYTE[maxValueDataSize]; + DWORD valueNameSize, valueDataSize, valueType; + std::wstring wsFontFile; + + // Look for a matching font name + do { + wsFontFile.clear(); + valueDataSize = maxValueDataSize; + valueNameSize = maxValueNameSize; + + result = RegEnumValue(hKey, valueIndex, valueName, &valueNameSize, 0, &valueType, valueData, &valueDataSize); + + valueIndex++; + if (result != ERROR_SUCCESS || valueType != REG_SZ) { + continue; + } + + std::wstring wsValueName(valueName, valueNameSize); + + // Found a match + if (_wcsnicmp(font_face_name.c_str(), wsValueName.c_str(), font_face_name.length()) == 0) { + + wsFontFile.assign((LPWSTR)valueData, valueDataSize); + break; + } + }while (result != ERROR_NO_MORE_ITEMS); + + delete[] valueName; + delete[] valueData; + + RegCloseKey(hKey); + + if (wsFontFile.empty()) return {}; + + // Build full font file path + WCHAR winDir[MAX_PATH]; + GetWindowsDirectory(winDir, MAX_PATH); + + std::wstringstream ss; + ss << winDir << "\\Fonts\\" << wsFontFile; + wsFontFile = ss.str(); + + return wsFontFile; +} + +EmbossStyles Emboss::get_font_list() +{ + //EmbossStyles list1 = get_font_list_by_enumeration(); + //EmbossStyles list2 = get_font_list_by_register(); + //EmbossStyles list3 = get_font_list_by_folder(); + return get_font_list_by_register(); +} + +EmbossStyles Emboss::get_font_list_by_register() { +// static const LPWSTR fontRegistryPath = L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Fonts"; + static const LPCWSTR fontRegistryPath = L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Fonts"; + HKEY hKey; + LONG result; + + // Open Windows font registry key + result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, fontRegistryPath, 0, KEY_READ, &hKey); + if (result != ERROR_SUCCESS) { + assert(false); + //std::wcerr << L"Can not Open register key (" << fontRegistryPath << ")" + // << L", function 'RegOpenKeyEx' return code: " << result << std::endl; + return {}; + } + + DWORD maxValueNameSize, maxValueDataSize; + result = RegQueryInfoKey(hKey, 0, 0, 0, 0, 0, 0, 0, &maxValueNameSize, + &maxValueDataSize, 0, 0); + if (result != ERROR_SUCCESS) { + assert(false); + // Can not earn query key, function 'RegQueryInfoKey' return code: result + return {}; + } + + // Build full font file path + WCHAR winDir[MAX_PATH]; + GetWindowsDirectory(winDir, MAX_PATH); + std::wstring font_path = std::wstring(winDir) + L"\\Fonts\\"; + + EmbossStyles font_list; + DWORD valueIndex = 0; + // Look for a matching font name + LPWSTR font_name = new WCHAR[maxValueNameSize]; + LPBYTE fileTTF_name = new BYTE[maxValueDataSize]; + DWORD font_name_size, fileTTF_name_size, valueType; + do { + fileTTF_name_size = maxValueDataSize; + font_name_size = maxValueNameSize; + + result = RegEnumValue(hKey, valueIndex, font_name, &font_name_size, 0, + &valueType, fileTTF_name, &fileTTF_name_size); + valueIndex++; + if (result != ERROR_SUCCESS || valueType != REG_SZ) continue; + std::wstring font_name_w(font_name, font_name_size); + std::wstring file_name_w((LPWSTR) fileTTF_name, fileTTF_name_size); + std::wstring path_w = font_path + file_name_w; + + // filtrate .fon from lists + size_t pos = font_name_w.rfind(L" (TrueType)"); + if (pos >= font_name_w.size()) continue; + // remove TrueType text from name + font_name_w = std::wstring(font_name_w, 0, pos); + font_list.emplace_back(create_style(font_name_w, path_w)); + } while (result != ERROR_NO_MORE_ITEMS); + delete[] font_name; + delete[] fileTTF_name; + + RegCloseKey(hKey); + return font_list; +} + +// TODO: Fix global function +bool CALLBACK EnumFamCallBack(LPLOGFONT lplf, + LPNEWTEXTMETRIC lpntm, + DWORD FontType, + LPVOID aFontList) +{ + std::vector *fontList = + (std::vector *) (aFontList); + if (FontType & TRUETYPE_FONTTYPE) { + std::wstring name = lplf->lfFaceName; + fontList->push_back(name); + } + return true; + // UNREFERENCED_PARAMETER(lplf); + UNREFERENCED_PARAMETER(lpntm); +} + +EmbossStyles Emboss::get_font_list_by_enumeration() { + + HDC hDC = GetDC(NULL); + std::vector font_names; + EnumFontFamilies(hDC, (LPCTSTR) NULL, (FONTENUMPROC) EnumFamCallBack, + (LPARAM) &font_names); + + EmbossStyles font_list; + for (const std::wstring &font_name : font_names) { + font_list.emplace_back(create_style(font_name, L"")); + } + return font_list; +} + +EmbossStyles Emboss::get_font_list_by_folder() { + EmbossStyles result; + WCHAR winDir[MAX_PATH]; + UINT winDir_size = GetWindowsDirectory(winDir, MAX_PATH); + std::wstring search_dir = std::wstring(winDir, winDir_size) + L"\\Fonts\\"; + WIN32_FIND_DATA fd; + HANDLE hFind; + // By https://en.wikipedia.org/wiki/TrueType has also suffix .tte + std::vector suffixes = {L"*.ttf", L"*.ttc", L"*.tte"}; + for (const std::wstring &suffix : suffixes) { + hFind = ::FindFirstFile((search_dir + suffix).c_str(), &fd); + if (hFind == INVALID_HANDLE_VALUE) continue; + do { + // skip folder . and .. + if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) continue; + std::wstring file_name(fd.cFileName); + // TODO: find font name instead of filename + result.emplace_back(create_style(file_name, search_dir + file_name)); + } while (::FindNextFile(hFind, &fd)); + ::FindClose(hFind); + } + return result; +} + +#else +EmbossStyles Emboss::get_font_list() { + // not implemented + return {}; +} + +std::optional Emboss::get_font_path(const std::wstring &font_face_name){ + // not implemented + return {}; +} +#endif + +std::unique_ptr Emboss::create_font_file( + std::unique_ptr> data) +{ + int collection_size = stbtt_GetNumberOfFonts(data->data()); + // at least one font must be inside collection + if (collection_size < 1) { + assert(false); + // There is no font collection inside font data + return nullptr; + } + + unsigned int c_size = static_cast(collection_size); + std::vector infos; + infos.reserve(c_size); + for (unsigned int i = 0; i < c_size; ++i) { + auto font_info = load_font_info(data->data(), i); + if (!font_info.has_value()) return nullptr; + + const stbtt_fontinfo *info = &(*font_info); + // load information about line gap + int ascent, descent, linegap; + stbtt_GetFontVMetrics(info, &ascent, &descent, &linegap); + + float pixels = 1000.; // value is irelevant + float em_pixels = stbtt_ScaleForMappingEmToPixels(info, pixels); + int units_per_em = static_cast(std::round(pixels / em_pixels)); + + infos.emplace_back(FontFile::Info{ascent, descent, linegap, units_per_em}); + } + return std::make_unique(std::move(data), std::move(infos)); +} + +std::unique_ptr Emboss::create_font_file(const char *file_path) +{ + FILE *file = std::fopen(file_path, "rb"); + if (file == nullptr) { + assert(false); + BOOST_LOG_TRIVIAL(error) << "Couldn't open " << file_path << " for reading."; + return nullptr; + } + ScopeGuard sg([&file]() { std::fclose(file); }); + + // find size of file + if (fseek(file, 0L, SEEK_END) != 0) { + assert(false); + BOOST_LOG_TRIVIAL(error) << "Couldn't fseek file " << file_path << " for size measure."; + return nullptr; + } + size_t size = ftell(file); + if (size == 0) { + assert(false); + BOOST_LOG_TRIVIAL(error) << "Size of font file is zero. Can't read."; + return nullptr; + } + rewind(file); + auto buffer = std::make_unique>(size); + size_t count_loaded_bytes = fread((void *) &buffer->front(), 1, size, file); + if (count_loaded_bytes != size) { + assert(false); + BOOST_LOG_TRIVIAL(error) << "Different loaded(from file) data size."; + return nullptr; + } + return create_font_file(std::move(buffer)); +} + + +#ifdef _WIN32 +static bool load_hfont(void* hfont, DWORD &dwTable, DWORD &dwOffset, size_t& size, HDC hdc = nullptr){ + bool del_hdc = false; + if (hdc == nullptr) { + del_hdc = true; + hdc = ::CreateCompatibleDC(NULL); + if (hdc == NULL) return false; + } + + // To retrieve the data from the beginning of the file for TrueType + // Collection files specify 'ttcf' (0x66637474). + dwTable = 0x66637474; + dwOffset = 0; + + ::SelectObject(hdc, hfont); + size = ::GetFontData(hdc, dwTable, dwOffset, NULL, 0); + if (size == GDI_ERROR) { + // HFONT is NOT TTC(collection) + dwTable = 0; + size = ::GetFontData(hdc, dwTable, dwOffset, NULL, 0); + } + + if (size == 0 || size == GDI_ERROR) { + if (del_hdc) ::DeleteDC(hdc); + return false; + } + return true; +} + +void *Emboss::can_load(void *hfont) +{ + DWORD dwTable=0, dwOffset=0; + size_t size = 0; + if (!load_hfont(hfont, dwTable, dwOffset, size)) return nullptr; + return hfont; +} + +std::unique_ptr Emboss::create_font_file(void *hfont) +{ + HDC hdc = ::CreateCompatibleDC(NULL); + if (hdc == NULL) { + assert(false); + BOOST_LOG_TRIVIAL(error) << "Can't create HDC by CreateCompatibleDC(NULL)."; + return nullptr; + } + + DWORD dwTable=0,dwOffset = 0; + size_t size; + if (!load_hfont(hfont, dwTable, dwOffset, size, hdc)) { + ::DeleteDC(hdc); + return nullptr; + } + auto buffer = std::make_unique>(size); + size_t loaded_size = ::GetFontData(hdc, dwTable, dwOffset, buffer->data(), size); + ::DeleteDC(hdc); + if (size != loaded_size) { + assert(false); + BOOST_LOG_TRIVIAL(error) << "Different loaded(from HFONT) data size."; + return nullptr; + } + return create_font_file(std::move(buffer)); +} +#endif // _WIN32 + +std::optional Emboss::letter2glyph(const FontFile &font, + unsigned int font_index, + int letter, + float flatness) +{ + if (!is_valid(font, font_index)) return {}; + auto font_info_opt = load_font_info(font.data->data(), font_index); + if (!font_info_opt.has_value()) return {}; + return get_glyph(*font_info_opt, letter, flatness); +} + +const FontFile::Info &Emboss::get_font_info(const FontFile &font, const FontProp &prop) +{ + unsigned int font_index = prop.collection_number.value_or(0); + assert(is_valid(font, font_index)); + return font.infos[font_index]; +} + +int Emboss::get_line_height(const FontFile &font, const FontProp &prop) { + const FontFile::Info &info = get_font_info(font, prop); + int line_height = info.ascent - info.descent + info.linegap; + line_height += prop.line_gap.value_or(0); + return static_cast(line_height / SHAPE_SCALE); +} + +namespace { +ExPolygons letter2shapes( + wchar_t letter, Point &cursor, FontFileWithCache &font_with_cache, const FontProp &font_prop, fontinfo_opt& font_info_cache) +{ + assert(font_with_cache.has_value()); + if (!font_with_cache.has_value()) + return {}; + + Glyphs &cache = *font_with_cache.cache; + const FontFile &font = *font_with_cache.font_file; + + if (letter == '\n') { + cursor.x() = 0; + // 2d shape has opposit direction of y + cursor.y() -= get_line_height(font, font_prop); + return {}; + } + if (letter == '\t') { + // '\t' = 4*space => same as imgui + const int count_spaces = 4; + const Glyph *space = get_glyph(int(' '), font, font_prop, cache, font_info_cache); + if (space == nullptr) + return {}; + cursor.x() += count_spaces * space->advance_width; + return {}; + } + if (letter == '\r') + return {}; + + int unicode = static_cast(letter); + auto it = cache.find(unicode); + + // Create glyph from font file and cache it + const Glyph *glyph_ptr = (it != cache.end()) ? &it->second : get_glyph(unicode, font, font_prop, cache, font_info_cache); + if (glyph_ptr == nullptr) + return {}; + + // move glyph to cursor position + ExPolygons expolygons = glyph_ptr->shape; // copy + for (ExPolygon &expolygon : expolygons) + expolygon.translate(cursor); + + cursor.x() += glyph_ptr->advance_width; + return expolygons; +} + +// Check cancel every X letters in text +// Lower number - too much checks(slows down) +// Higher number - slows down response on cancelation +const int CANCEL_CHECK = 10; +} // namespace + +namespace { +HealedExPolygons union_with_delta(const ExPolygonsWithIds &shapes, float delta, unsigned max_heal_iteration) +{ + // unify to one expolygons + ExPolygons expolygons; + for (const ExPolygonsWithId &shape : shapes) { + if (shape.expoly.empty()) + continue; + expolygons_append(expolygons, offset_ex(shape.expoly, delta)); + } + ExPolygons result = union_ex(expolygons); + result = offset_ex(result, -delta); + bool is_healed = heal_expolygons(result, max_heal_iteration); + return {result, is_healed}; +} +} // namespace + +ExPolygons Slic3r::union_with_delta(EmbossShape &shape, float delta, unsigned max_heal_iteration) +{ + if (!shape.final_shape.expolygons.empty()) + return shape.final_shape; + + shape.final_shape = ::union_with_delta(shape.shapes_with_ids, delta, max_heal_iteration); + for (const ExPolygonsWithId &e : shape.shapes_with_ids) + if (!e.is_healed) + shape.final_shape.is_healed = false; + return shape.final_shape.expolygons; +} + +void Slic3r::translate(ExPolygonsWithIds &expolygons_with_ids, const Point &p) +{ + for (ExPolygonsWithId &expolygons_with_id : expolygons_with_ids) + translate(expolygons_with_id.expoly, p); +} + +BoundingBox Slic3r::get_extents(const ExPolygonsWithIds &expolygons_with_ids) +{ + BoundingBox bb; + for (const ExPolygonsWithId &expolygons_with_id : expolygons_with_ids) + bb.merge(get_extents(expolygons_with_id.expoly)); + return bb; +} + +void Slic3r::center(ExPolygonsWithIds &e) +{ + BoundingBox bb = get_extents(e); + translate(e, -bb.center()); +} + +HealedExPolygons Emboss::text2shapes(FontFileWithCache &font_with_cache, const char *text, const FontProp &font_prop, const std::function& was_canceled) +{ + std::wstring text_w = boost::nowide::widen(text); + ExPolygonsWithIds vshapes = text2vshapes(font_with_cache, text_w, font_prop, was_canceled); + + float delta = static_cast(1. / SHAPE_SCALE); + return ::union_with_delta(vshapes, delta, MAX_HEAL_ITERATION_OF_TEXT); +} + +namespace { +/// +/// Align shape against pivot +/// +/// Shapes to align +/// Prerequisities: shapes are aligned left top +/// To detect end of lines - to be able horizontal center the line +/// Containe Horizontal and vertical alignment +/// Needed for scale and font size +void align_shape(ExPolygonsWithIds &shapes, const std::wstring &text, const FontProp &prop, const FontFile &font); +} + +ExPolygonsWithIds Emboss::text2vshapes(FontFileWithCache &font_with_cache, const std::wstring& text, const FontProp &font_prop, const std::function& was_canceled){ + assert(font_with_cache.has_value()); + const FontFile &font = *font_with_cache.font_file; + unsigned int font_index = font_prop.collection_number.value_or(0); + if (!is_valid(font, font_index)) + return {}; + + unsigned counter = 0; + Point cursor(0, 0); + + fontinfo_opt font_info_cache; + ExPolygonsWithIds result; + result.reserve(text.size()); + for (wchar_t letter : text) { + if (++counter == CANCEL_CHECK) { + counter = 0; + if (was_canceled()) + return {}; + } + unsigned id = static_cast(letter); + result.push_back({id, letter2shapes(letter, cursor, font_with_cache, font_prop, font_info_cache)}); + } + + align_shape(result, text, font_prop, font); + return result; +} + +#include +unsigned Emboss::get_count_lines(const std::wstring& ws) +{ + if (ws.empty()) + return 0; + + unsigned count = 1; + for (wchar_t wc : ws) + if (wc == '\n') + ++count; + return count; + + // unsigned prev_count = 0; + // for (wchar_t wc : ws) + // if (wc == '\n') + // ++prev_count; + // else + // break; + // + // unsigned post_count = 0; + // for (wchar_t wc : boost::adaptors::reverse(ws)) + // if (wc == '\n') + // ++post_count; + // else + // break; + //return count - prev_count - post_count; +} + +unsigned Emboss::get_count_lines(const std::string &text) +{ + std::wstring ws = boost::nowide::widen(text.c_str()); + return get_count_lines(ws); +} + +unsigned Emboss::get_count_lines(const ExPolygonsWithIds &shapes) { + if (shapes.empty()) + return 0; // no glyphs + unsigned result = 1; // one line is minimum + for (const ExPolygonsWithId &shape_id : shapes) + if (shape_id.id == ENTER_UNICODE) + ++result; + return result; +} + +void Emboss::apply_transformation(const std::optional& angle, const std::optional& distance, Transform3d &transformation) { + if (angle.has_value()) { + double angle_z = *angle; + transformation *= Eigen::AngleAxisd(angle_z, Vec3d::UnitZ()); + } + if (distance.has_value()) { + Vec3d translate = Vec3d::UnitZ() * (*distance); + transformation.translate(translate); + } +} + +bool Emboss::is_italic(const FontFile &font, unsigned int font_index) +{ + if (font_index >= font.infos.size()) return false; + fontinfo_opt font_info_opt = load_font_info(font.data->data(), font_index); + + if (!font_info_opt.has_value()) return false; + stbtt_fontinfo *info = &(*font_info_opt); + + // https://docs.microsoft.com/cs-cz/typography/opentype/spec/name + // https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6name.html + // 2 ==> Style / Subfamily name + int name_id = 2; + int length; + const char* value = stbtt_GetFontNameString(info, &length, + STBTT_PLATFORM_ID_MICROSOFT, + STBTT_MS_EID_UNICODE_BMP, + STBTT_MS_LANG_ENGLISH, + name_id); + + // value is big endian utf-16 i need extract only normal chars + std::string value_str; + value_str.reserve(length / 2); + for (int i = 1; i < length; i += 2) + value_str.push_back(value[i]); + + // lower case + std::transform(value_str.begin(), value_str.end(), value_str.begin(), + [](unsigned char c) { return std::tolower(c); }); + + const std::vector italics({"italic", "oblique"}); + for (const std::string &it : italics) { + if (value_str.find(it) != std::string::npos) { + return true; + } + } + return false; +} + +std::string Emboss::create_range_text(const std::string &text, + const FontFile &font, + unsigned int font_index, + bool *exist_unknown) +{ + if (!is_valid(font, font_index)) return {}; + + std::wstring ws = boost::nowide::widen(text); + + // need remove symbols not contained in font + std::sort(ws.begin(), ws.end()); + + auto font_info_opt = load_font_info(font.data->data(), 0); + if (!font_info_opt.has_value()) return {}; + const stbtt_fontinfo *font_info = &(*font_info_opt); + + if (exist_unknown != nullptr) *exist_unknown = false; + int prev_unicode = -1; + ws.erase(std::remove_if(ws.begin(), ws.end(), + [&prev_unicode, font_info, exist_unknown](wchar_t wc) -> bool { + int unicode = static_cast(wc); + + // skip white spaces + if (unicode == '\n' || + unicode == '\r' || + unicode == '\t') return true; + + // is duplicit? + if (prev_unicode == unicode) return true; + prev_unicode = unicode; + + // can find in font? + bool is_unknown = !stbtt_FindGlyphIndex(font_info, unicode); + if (is_unknown && exist_unknown != nullptr) + *exist_unknown = true; + return is_unknown; + }), ws.end()); + + return boost::nowide::narrow(ws); +} + +double Emboss::get_text_shape_scale(const FontProp &fp, const FontFile &ff) +{ + const FontFile::Info &info = get_font_info(ff, fp); + double scale = fp.size_in_mm / (double) info.unit_per_em; + // Shape is scaled for store point coordinate as integer + return scale * SHAPE_SCALE; +} + +namespace { + +void add_quad(uint32_t i1, + uint32_t i2, + indexed_triangle_set &result, + uint32_t count_point) +{ + // bottom indices + uint32_t i1_ = i1 + count_point; + uint32_t i2_ = i2 + count_point; + result.indices.emplace_back(i2, i2_, i1); + result.indices.emplace_back(i1_, i1, i2_); +}; + +indexed_triangle_set polygons2model_unique( + const ExPolygons &shape2d, + const IProjection &projection, + const Points &points) +{ + // CW order of triangle indices + std::vector shape_triangles=Triangulation::triangulate(shape2d, points); + uint32_t count_point = points.size(); + + indexed_triangle_set result; + result.vertices.reserve(2 * count_point); + std::vector &front_points = result.vertices; // alias + std::vector back_points; + back_points.reserve(count_point); + + for (const Point &p : points) { + auto p2 = projection.create_front_back(p); + front_points.push_back(p2.first.cast()); + back_points.push_back(p2.second.cast()); + } + + // insert back points, front are already in + result.vertices.insert(result.vertices.end(), + std::make_move_iterator(back_points.begin()), + std::make_move_iterator(back_points.end())); + result.indices.reserve(shape_triangles.size() * 2 + points.size() * 2); + // top triangles - change to CCW + for (const Vec3i &t : shape_triangles) + result.indices.emplace_back(t.x(), t.z(), t.y()); + // bottom triangles - use CW + for (const Vec3i &t : shape_triangles) + result.indices.emplace_back(t.x() + count_point, + t.y() + count_point, + t.z() + count_point); + + // quads around - zig zag by triangles + size_t polygon_offset = 0; + auto add_quads = [&polygon_offset,&result, &count_point] + (const Polygon& polygon) { + uint32_t polygon_points = polygon.points.size(); + // previous index + uint32_t prev = polygon_offset + polygon_points - 1; + for (uint32_t p = 0; p < polygon_points; ++p) { + uint32_t index = polygon_offset + p; + add_quad(prev, index, result, count_point); + prev = index; + } + polygon_offset += polygon_points; + }; + + for (const ExPolygon &expolygon : shape2d) { + add_quads(expolygon.contour); + for (const Polygon &hole : expolygon.holes) add_quads(hole); + } + + return result; +} + +indexed_triangle_set polygons2model_duplicit( + const ExPolygons &shape2d, + const IProjection &projection, + const Points &points, + const Points &duplicits) +{ + // CW order of triangle indices + std::vector changes = Triangulation::create_changes(points, duplicits); + std::vector shape_triangles = Triangulation::triangulate(shape2d, points, changes); + uint32_t count_point = *std::max_element(changes.begin(), changes.end()) + 1; + + indexed_triangle_set result; + result.vertices.reserve(2 * count_point); + std::vector &front_points = result.vertices; + std::vector back_points; + back_points.reserve(count_point); + + uint32_t max_index = std::numeric_limits::max(); + for (uint32_t i = 0; i < changes.size(); ++i) { + uint32_t index = changes[i]; + if (max_index != std::numeric_limits::max() && + index <= max_index) continue; // duplicit point + assert(index == max_index + 1); + assert(front_points.size() == index); + assert(back_points.size() == index); + max_index = index; + const Point &p = points[i]; + auto p2 = projection.create_front_back(p); + front_points.push_back(p2.first.cast()); + back_points.push_back(p2.second.cast()); + } + assert(max_index+1 == count_point); + + // insert back points, front are already in + result.vertices.insert(result.vertices.end(), + std::make_move_iterator(back_points.begin()), + std::make_move_iterator(back_points.end())); + + result.indices.reserve(shape_triangles.size() * 2 + points.size() * 2); + // top triangles - change to CCW + for (const Vec3i &t : shape_triangles) + result.indices.emplace_back(t.x(), t.z(), t.y()); + // bottom triangles - use CW + for (const Vec3i &t : shape_triangles) + result.indices.emplace_back(t.x() + count_point, t.y() + count_point, + t.z() + count_point); + + // quads around - zig zag by triangles + size_t polygon_offset = 0; + auto add_quads = [&polygon_offset, &result, count_point, &changes] + (const Polygon &polygon) { + uint32_t polygon_points = polygon.points.size(); + // previous index + uint32_t prev = changes[polygon_offset + polygon_points - 1]; + for (uint32_t p = 0; p < polygon_points; ++p) { + uint32_t index = changes[polygon_offset + p]; + if (prev == index) continue; + add_quad(prev, index, result, count_point); + prev = index; + } + polygon_offset += polygon_points; + }; + + for (const ExPolygon &expolygon : shape2d) { + add_quads(expolygon.contour); + for (const Polygon &hole : expolygon.holes) add_quads(hole); + } + return result; +} +} // namespace + +indexed_triangle_set Emboss::polygons2model(const ExPolygons &shape2d, + const IProjection &projection) +{ + Points points = to_points(shape2d); + Points duplicits = collect_duplicates(points); + return (duplicits.empty()) ? + polygons2model_unique(shape2d, projection, points) : + polygons2model_duplicit(shape2d, projection, points, duplicits); +} + +std::pair Emboss::ProjectZ::create_front_back(const Point &p) const +{ + Vec3d front(p.x(), p.y(), 0.); + return std::make_pair(front, project(front)); +} + +Vec3d Emboss::ProjectZ::project(const Vec3d &point) const +{ + Vec3d res = point; // copy + res.z() = m_depth; + return res; +} + +std::optional Emboss::ProjectZ::unproject(const Vec3d &p, double *depth) const { + return Vec2d(p.x(), p.y()); +} + + +Vec3d Emboss::suggest_up(const Vec3d normal, double up_limit) +{ + // Normal must be 1 + assert(is_approx(normal.squaredNorm(), 1.)); + + // wanted up direction of result + Vec3d wanted_up_side = + (std::fabs(normal.z()) > up_limit)? + Vec3d::UnitY() : Vec3d::UnitZ(); + + // create perpendicular unit vector to surface triangle normal vector + // lay on surface of triangle and define up vector for text + Vec3d wanted_up_dir = normal.cross(wanted_up_side).cross(normal); + // normal3d is NOT perpendicular to normal_up_dir + wanted_up_dir.normalize(); + + return wanted_up_dir; +} + +std::optional Emboss::calc_up(const Transform3d &tr, double up_limit) +{ + auto tr_linear = tr.linear(); + // z base of transformation ( tr * UnitZ ) + Vec3d normal = tr_linear.col(2); + // scaled matrix has base with different size + normal.normalize(); + Vec3d suggested = suggest_up(normal, up_limit); + assert(is_approx(suggested.squaredNorm(), 1.)); + + Vec3d up = tr_linear.col(1); // tr * UnitY() + up.normalize(); + Matrix3d m; + m.row(0) = up; + m.row(1) = suggested; + m.row(2) = normal; + double det = m.determinant(); + double dot = suggested.dot(up); + double res = -atan2(det, dot); + if (is_approx(res, 0.)) + return {}; + return res; +} + +Transform3d Emboss::create_transformation_onto_surface(const Vec3d &position, + const Vec3d &normal, + double up_limit) +{ + // is normalized ? + assert(is_approx(normal.squaredNorm(), 1.)); + + // up and emboss direction for generated model + Vec3d up_dir = Vec3d::UnitY(); + Vec3d emboss_dir = Vec3d::UnitZ(); + + // after cast from float it needs to be normalized again + Vec3d wanted_up_dir = suggest_up(normal, up_limit); + + // perpendicular to emboss vector of text and normal + Vec3d axis_view; + double angle_view; + if (normal == -Vec3d::UnitZ()) { + // text_emboss_dir has opposit direction to wanted_emboss_dir + axis_view = Vec3d::UnitY(); + angle_view = M_PI; + } else { + axis_view = emboss_dir.cross(normal); + angle_view = std::acos(emboss_dir.dot(normal)); // in rad + axis_view.normalize(); + } + + Eigen::AngleAxis view_rot(angle_view, axis_view); + Vec3d wanterd_up_rotated = view_rot.matrix().inverse() * wanted_up_dir; + wanterd_up_rotated.normalize(); + double angle_up = std::acos(up_dir.dot(wanterd_up_rotated)); + + Vec3d text_view = up_dir.cross(wanterd_up_rotated); + Vec3d diff_view = emboss_dir - text_view; + if (std::fabs(diff_view.x()) > 1. || + std::fabs(diff_view.y()) > 1. || + std::fabs(diff_view.z()) > 1.) // oposit direction + angle_up *= -1.; + + Eigen::AngleAxis up_rot(angle_up, emboss_dir); + + Transform3d transform = Transform3d::Identity(); + transform.translate(position); + transform.rotate(view_rot); + transform.rotate(up_rot); + return transform; +} + + +// OrthoProject + +std::pair Emboss::OrthoProject::create_front_back(const Point &p) const { + Vec3d front(p.x(), p.y(), 0.); + Vec3d front_tr = m_matrix * front; + return std::make_pair(front_tr, project(front_tr)); +} + +Vec3d Emboss::OrthoProject::project(const Vec3d &point) const +{ + return point + m_direction; +} + +std::optional Emboss::OrthoProject::unproject(const Vec3d &p, double *depth) const +{ + Vec3d pp = m_matrix_inv * p; + if (depth != nullptr) *depth = pp.z(); + return Vec2d(pp.x(), pp.y()); +} + +// sample slice +namespace { + +// using coor2 = int64_t; +using Coord2 = double; +using P2 = Eigen::Matrix; + +bool point_in_distance(const Coord2 &distance_sq, PolygonPoint &polygon_point, const size_t &i, const Slic3r::Polygon &polygon, bool is_first, bool is_reverse = false) +{ + size_t s = polygon.size(); + size_t ii = (i + polygon_point.index) % s; + + // second point of line + const Point &p = polygon[ii]; + Point p_d = p - polygon_point.point; + + P2 p_d2 = p_d.cast(); + Coord2 p_distance_sq = p_d2.squaredNorm(); + if (p_distance_sq < distance_sq) + return false; + + // found line + if (is_first) { + // on same line + // center also lay on line + // new point is distance moved from point by direction + polygon_point.point += p_d * sqrt(distance_sq / p_distance_sq); + return true; + } + + // line cross circle + + // start point of line + size_t ii2 = (is_reverse) ? (ii + 1) % s : (ii + s - 1) % s; + polygon_point.index = (is_reverse) ? ii : ii2; + const Point &p2 = polygon[ii2]; + + Point line_dir = p2 - p; + P2 line_dir2 = line_dir.cast(); + + Coord2 a = line_dir2.dot(line_dir2); + Coord2 b = 2 * p_d2.dot(line_dir2); + Coord2 c = p_d2.dot(p_d2) - distance_sq; + + double discriminant = b * b - 4 * a * c; + if (discriminant < 0) { + assert(false); + // no intersection + polygon_point.point = p; + return true; + } + + // ray didn't totally miss sphere, + // so there is a solution to + // the equation. + discriminant = sqrt(discriminant); + + // either solution may be on or off the ray so need to test both + // t1 is always the smaller value, because BOTH discriminant and + // a are nonnegative. + double t1 = (-b - discriminant) / (2 * a); + double t2 = (-b + discriminant) / (2 * a); + + double t = std::min(t1, t2); + if (t < 0. || t > 1.) { + // Bad intersection + assert(false); + polygon_point.point = p; + return true; + } + + polygon_point.point = p + (t * line_dir2).cast(); + return true; +} + +void point_in_distance(int32_t distance, PolygonPoint &p, const Slic3r::Polygon &polygon) +{ + Coord2 distance_sq = static_cast(distance) * distance; + bool is_first = true; + for (size_t i = 1; i < polygon.size(); ++i) { + if (point_in_distance(distance_sq, p, i, polygon, is_first)) + return; + is_first = false; + } + // There is not point on polygon with this distance +} + +void point_in_reverse_distance(int32_t distance, PolygonPoint &p, const Slic3r::Polygon &polygon) +{ + Coord2 distance_sq = static_cast(distance) * distance; + bool is_first = true; + bool is_reverse = true; + for (size_t i = polygon.size(); i > 0; --i) { + if (point_in_distance(distance_sq, p, i, polygon, is_first, is_reverse)) + return; + is_first = false; + } + // There is not point on polygon with this distance +} +} // namespace + +// calculate rotation, need copy of polygon point +double Emboss::calculate_angle(int32_t distance, PolygonPoint polygon_point, const Polygon &polygon) +{ + PolygonPoint polygon_point2 = polygon_point; // copy + point_in_distance(distance, polygon_point, polygon); + point_in_reverse_distance(distance, polygon_point2, polygon); + + Point surface_dir = polygon_point2.point - polygon_point.point; + Point norm(-surface_dir.y(), surface_dir.x()); + Vec2d norm_d = norm.cast(); + //norm_d.normalize(); + return std::atan2(norm_d.y(), norm_d.x()); +} + +std::vector Emboss::calculate_angles(int32_t distance, const PolygonPoints& polygon_points, const Polygon &polygon) +{ + std::vector result; + result.reserve(polygon_points.size()); + for(const PolygonPoint& pp: polygon_points) + result.emplace_back(calculate_angle(distance, pp, polygon)); + return result; +} + +PolygonPoints Emboss::sample_slice(const TextLine &slice, const BoundingBoxes &bbs, double scale) +{ + // find BB in center of line + size_t first_right_index = 0; + for (const BoundingBox &bb : bbs) + if (!bb.defined) // white char do not have bb + continue; + else if (bb.min.x() < 0) + ++first_right_index; + else + break; + + PolygonPoints samples(bbs.size()); + int32_t shapes_x_cursor = 0; + + PolygonPoint cursor = slice.start; //copy + + auto create_sample = [&] //polygon_cursor, &polygon_line_index, &line_bbs, &shapes_x_cursor, &shape_scale, &em_2_polygon, &line, &offsets] + (const BoundingBox &bb, bool is_reverse) { + if (!bb.defined) + return cursor; + Point letter_center = bb.center(); + int32_t shape_distance = shapes_x_cursor - letter_center.x(); + shapes_x_cursor = letter_center.x(); + double distance_mm = shape_distance * scale; + int32_t distance_polygon = static_cast(std::round(scale_(distance_mm))); + if (is_reverse) + point_in_distance(distance_polygon, cursor, slice.polygon); + else + point_in_reverse_distance(distance_polygon, cursor, slice.polygon); + return cursor; + }; + + // calc transformation for letters on the Right side from center + bool is_reverse = true; + for (size_t index = first_right_index; index < bbs.size(); ++index) + samples[index] = create_sample(bbs[index], is_reverse); + + // calc transformation for letters on the Left side from center + if (first_right_index < bbs.size()) { + shapes_x_cursor = bbs[first_right_index].center().x(); + cursor = samples[first_right_index]; + }else{ + // only left side exists + shapes_x_cursor = 0; + cursor = slice.start; // copy + } + is_reverse = false; + for (size_t index_plus_one = first_right_index; index_plus_one > 0; --index_plus_one) { + size_t index = index_plus_one - 1; + samples[index] = create_sample(bbs[index], is_reverse); + } + return samples; +} + +namespace { +float get_align_y_offset(FontProp::VerticalAlign align, unsigned count_lines, const FontFile &ff, const FontProp &fp) +{ + assert(count_lines != 0); + int line_height = get_line_height(ff, fp); + int ascent = get_font_info(ff, fp).ascent / SHAPE_SCALE; + float line_center = static_cast(std::round(ascent * ASCENT_CENTER)); + + // direction of Y in 2d is from top to bottom + // zero is on base line of first line + switch (align) { + case FontProp::VerticalAlign::bottom: return line_height * (count_lines - 1); + case FontProp::VerticalAlign::top: return -ascent; + case FontProp::VerticalAlign::center: + default: + return -line_center + line_height * (count_lines - 1) / 2.; + } +} + +int32_t get_align_x_offset(FontProp::HorizontalAlign align, const BoundingBox &shape_bb, const BoundingBox &line_bb) +{ + switch (align) { + case FontProp::HorizontalAlign::right: return -shape_bb.max.x() + (shape_bb.size().x() - line_bb.size().x()); + case FontProp::HorizontalAlign::center: return -shape_bb.center().x() + (shape_bb.size().x() - line_bb.size().x()) / 2; + case FontProp::HorizontalAlign::left: // no change + default: break; + } + return 0; +} + +void align_shape(ExPolygonsWithIds &shapes, const std::wstring &text, const FontProp &prop, const FontFile &font) +{ + // Shapes have to match letters in text + assert(shapes.size() == text.length()); + + unsigned count_lines = get_count_lines(text); + int y_offset = get_align_y_offset(prop.align.second, count_lines, font, prop); + + // Speed up for left aligned text + if (prop.align.first == FontProp::HorizontalAlign::left){ + // already horizontaly aligned + for (ExPolygonsWithId& shape : shapes) + for (ExPolygon &s : shape.expoly) + s.translate(Point(0, y_offset)); + return; + } + + BoundingBox shape_bb; + for (const ExPolygonsWithId& shape: shapes) + shape_bb.merge(get_extents(shape.expoly)); + + auto get_line_bb = [&](size_t j) { + BoundingBox line_bb; + for (; j < text.length() && text[j] != '\n'; ++j) + line_bb.merge(get_extents(shapes[j].expoly)); + return line_bb; + }; + + // Align x line by line + Point offset( + get_align_x_offset(prop.align.first, shape_bb, get_line_bb(0)), + y_offset); + for (size_t i = 0; i < shapes.size(); ++i) { + wchar_t letter = text[i]; + if (letter == '\n'){ + offset.x() = get_align_x_offset(prop.align.first, shape_bb, get_line_bb(i + 1)); + continue; + } + ExPolygons &shape = shapes[i].expoly; + for (ExPolygon &s : shape) + s.translate(offset); + } +} +} // namespace + +double Emboss::get_align_y_offset_in_mm(FontProp::VerticalAlign align, unsigned count_lines, const FontFile &ff, const FontProp &fp){ + float offset_in_font_point = get_align_y_offset(align, count_lines, ff, fp); + double scale = get_text_shape_scale(fp, ff); + return scale * offset_in_font_point; +} + +#ifdef REMOVE_SPIKES +#include +void remove_spikes(Polygon &polygon, const SpikeDesc &spike_desc) +{ + enum class Type { + add, // Move with point B on A-side and add new point on C-side + move, // Only move with point B + erase // left only points A and C without move + }; + struct SpikeHeal + { + Type type; + size_t index; + Point b; + Point add; + }; + using SpikeHeals = std::vector; + SpikeHeals heals; + + size_t count = polygon.size(); + if (count < 3) + return; + + const Point *ptr_a = &polygon[count - 2]; + const Point *ptr_b = &polygon[count - 1]; + for (const Point &c : polygon) { + const Point &a = *ptr_a; + const Point &b = *ptr_b; + ScopeGuard sg([&ptr_a, &ptr_b, &c]() { + // prepare for next loop + ptr_a = ptr_b; + ptr_b = &c; + }); + + // calc sides + Point ba = a - b; + Point bc = c - b; + + Vec2d ba_f = ba.cast(); + Vec2d bc_f = bc.cast(); + double dot_product = ba_f.dot(bc_f); + + // sqrt together after multiplication save one sqrt + double ba_size_sq = ba_f.squaredNorm(); + double bc_size_sq = bc_f.squaredNorm(); + double norm = sqrt(ba_size_sq * bc_size_sq); + double cos_angle = dot_product / norm; + + // small angle are around 1 --> cos(0) = 1 + if (cos_angle < spike_desc.cos_angle) + continue; + + SpikeHeal heal; + heal.index = &b - &polygon.points.front(); + + // has to be in range <-1, 1> + // Due to preccission of floating point number could be sligtly out of range + if (cos_angle > 1.) + cos_angle = 1.; + if (cos_angle < -1.) + cos_angle = -1.; + + // Current Spike angle + double angle = acos(cos_angle); + double wanted_size = spike_desc.half_bevel / cos(angle / 2.); + double wanted_size_sq = wanted_size * wanted_size; + + bool is_ba_short = ba_size_sq < wanted_size_sq; + bool is_bc_short = bc_size_sq < wanted_size_sq; + auto a_side = [&b, &ba_f, &ba_size_sq, &wanted_size]() { + Vec2d ba_norm = ba_f / sqrt(ba_size_sq); + return b + (wanted_size * ba_norm).cast(); + }; + auto c_side = [&b, &bc_f, &bc_size_sq, &wanted_size]() { + Vec2d bc_norm = bc_f / sqrt(bc_size_sq); + return b + (wanted_size * bc_norm).cast(); + }; + if (is_ba_short && is_bc_short) { + // remove short spike + heal.type = Type::erase; + } else if (is_ba_short){ + // move point B on C-side + heal.type = Type::move; + heal.b = c_side(); + } else if (is_bc_short) { + // move point B on A-side + heal.type = Type::move; + heal.b = a_side(); + } else { + // move point B on A-side and add point on C-side + heal.type = Type::add; + heal.b = a_side(); + heal.add = c_side(); + } + heals.push_back(heal); + } + + if (heals.empty()) + return; + + // sort index from high to low + if (heals.front().index == (count - 1)) + std::rotate(heals.begin(), heals.begin()+1, heals.end()); + std::reverse(heals.begin(), heals.end()); + + int extend = 0; + int curr_extend = 0; + for (const SpikeHeal &h : heals) + switch (h.type) { + case Type::add: + ++curr_extend; + if (extend < curr_extend) + extend = curr_extend; + break; + case Type::erase: + --curr_extend; + } + + Points &pts = polygon.points; + if (extend > 0) + pts.reserve(pts.size() + extend); + + for (const SpikeHeal &h : heals) { + switch (h.type) { + case Type::add: + pts[h.index] = h.b; + pts.insert(pts.begin() + h.index+1, h.add); + break; + case Type::erase: + pts.erase(pts.begin() + h.index); + break; + case Type::move: + pts[h.index] = h.b; + break; + default: break; + } + } +} + +void remove_spikes(Polygons &polygons, const SpikeDesc &spike_desc) +{ + for (Polygon &polygon : polygons) + remove_spikes(polygon, spike_desc); + remove_bad(polygons); +} + +void remove_spikes(ExPolygons &expolygons, const SpikeDesc &spike_desc) +{ + for (ExPolygon &expolygon : expolygons) { + remove_spikes(expolygon.contour, spike_desc); + remove_spikes(expolygon.holes, spike_desc); + } + remove_bad(expolygons); +} + +#endif // REMOVE_SPIKES diff --git a/src/libslic3r/Emboss.hpp b/src/libslic3r/Emboss.hpp new file mode 100644 index 0000000000..ded2196a7a --- /dev/null +++ b/src/libslic3r/Emboss.hpp @@ -0,0 +1,477 @@ +///|/ Copyright (c) Prusa Research 2021 - 2022 Filip Sykala @Jony01 +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ +#ifndef slic3r_Emboss_hpp_ +#define slic3r_Emboss_hpp_ + +#include +#include +#include +#include +#include // indexed_triangle_set +#include "Polygon.hpp" +#include "ExPolygon.hpp" +#include "EmbossShape.hpp" // ExPolygonsWithIds +#include "BoundingBox.hpp" +#include "TextConfiguration.hpp" + +namespace Slic3r { + +/// +/// class with only static function add ability to engraved OR raised +/// text OR polygons onto model surface +/// +namespace Emboss +{ + static const float UNION_DELTA = 50.0f; // [approx in nano meters depends on volume scale] + static const unsigned UNION_MAX_ITERATIN = 10; // [count] + + /// + /// Collect fonts registred inside OS + /// + /// OS registred TTF font files(full path) with names + EmbossStyles get_font_list(); +#ifdef _WIN32 + EmbossStyles get_font_list_by_register(); + EmbossStyles get_font_list_by_enumeration(); + EmbossStyles get_font_list_by_folder(); +#endif + + /// + /// OS dependent function to get location of font by its name descriptor + /// + /// Unique identificator for font + /// File path to font when found + std::optional get_font_path(const std::wstring &font_face_name); + + // description of one letter + struct Glyph + { + // NOTE: shape is scaled by SHAPE_SCALE + // to be able store points without floating points + ExPolygons shape; + + // values are in font points + int advance_width=0, left_side_bearing=0; + }; + // cache for glyph by unicode + using Glyphs = std::map; + + /// + /// keep information from file about font + /// (store file data itself) + /// + cache data readed from buffer + /// + struct FontFile + { + // loaded data from font file + // must store data size for imgui rasterization + // To not store data on heap and To prevent unneccesary copy + // data are stored inside unique_ptr + std::unique_ptr> data; + + struct Info + { + // vertical position is "scale*(ascent - descent + lineGap)" + int ascent, descent, linegap; + + // for convert font units to pixel + int unit_per_em; + }; + // info for each font in data + std::vector infos; + + FontFile(std::unique_ptr> data, + std::vector &&infos) + : data(std::move(data)), infos(std::move(infos)) + { + assert(this->data != nullptr); + assert(!this->data->empty()); + } + + bool operator==(const FontFile &other) const { + if (data->size() != other.data->size()) + return false; + //if(*data != *other.data) return false; + for (size_t i = 0; i < infos.size(); i++) + if (infos[i].ascent != other.infos[i].ascent || + infos[i].descent == other.infos[i].descent || + infos[i].linegap == other.infos[i].linegap) + return false; + return true; + } + }; + + /// + /// Add caching for shape of glyphs + /// + struct FontFileWithCache + { + // Pointer on data of the font file + std::shared_ptr font_file; + + // Cache for glyph shape + // IMPORTANT: accessible only in plater job thread !!! + // main thread only clear cache by set to another shared_ptr + std::shared_ptr cache; + + FontFileWithCache() : font_file(nullptr), cache(nullptr) {} + explicit FontFileWithCache(std::unique_ptr font_file) + : font_file(std::move(font_file)) + , cache(std::make_shared()) + {} + bool has_value() const { return font_file != nullptr && cache != nullptr; } + }; + + /// + /// Load font file into buffer + /// + /// Location of .ttf or .ttc font file + /// Font object when loaded. + std::unique_ptr create_font_file(const char *file_path); + // data = raw file data + std::unique_ptr create_font_file(std::unique_ptr> data); +#ifdef _WIN32 + // fix for unknown pointer HFONT is replaced with "void *" + void * can_load(void* hfont); + std::unique_ptr create_font_file(void * hfont); +#endif // _WIN32 + + /// + /// convert letter into polygons + /// + /// Define fonts + /// Index of font in collection + /// One character defined by unicode codepoint + /// Precision of lettter outline curve in conversion to lines + /// inner polygon cw(outer ccw) + std::optional letter2glyph(const FontFile &font, unsigned int font_index, int letter, float flatness); + + /// + /// Convert text into polygons + /// + /// Define fonts + cache, which could extend + /// Characters to convert + /// User defined property of the font + /// Way to interupt processing + /// Inner polygon cw(outer ccw) + HealedExPolygons text2shapes (FontFileWithCache &font, const char *text, const FontProp &font_prop, const std::function &was_canceled = []() {return false;}); + ExPolygonsWithIds text2vshapes(FontFileWithCache &font, const std::wstring& text, const FontProp &font_prop, const std::function& was_canceled = []() {return false;}); + + const unsigned ENTER_UNICODE = static_cast('\n'); + /// Sum of character '\n' + unsigned get_count_lines(const std::wstring &ws); + unsigned get_count_lines(const std::string &text); + unsigned get_count_lines(const ExPolygonsWithIds &shape); + + /// + /// Fix duplicit points and self intersections in polygons. + /// Also try to reduce amount of points and remove useless polygon parts + /// + /// Fill type ClipperLib::pftNonZero for overlapping otherwise + /// Look at heal_expolygon()::max_iteration + /// Healed shapes with flag is fully healed + HealedExPolygons heal_polygons(const Polygons &shape, bool is_non_zero = true, unsigned max_iteration = 10); + + /// + /// NOTE: call Slic3r::union_ex before this call + /// + /// Heal (read: Fix) issues in expolygons: + /// - self intersections + /// - duplicit points + /// - points close to line segments + /// + /// In/Out shape to heal + /// Heal could create another issue, + /// After healing it is checked again until shape is good or maximal count of iteration + /// True when shapes is good otherwise False + bool heal_expolygons(ExPolygons &shape, unsigned max_iteration = 10); + + /// + /// Divide line segments in place near to point + /// (which could lead to self intersection due to preccision) + /// Remove same neighbors + /// Note: Possible part of heal shape + /// + /// Expolygon to edit + /// (epsilon)Euclidean distance from point to line which divide line + /// True when some division was made otherwise false + bool divide_segments_for_close_point(ExPolygons &expolygons, double distance); + + /// + /// Use data from font property to modify transformation + /// + /// Z-rotation as angle to Y axis + /// Z-move as surface distance + /// In / Out transformation to modify by property + void apply_transformation(const std::optional &angle, const std::optional &distance, Transform3d &transformation); + + /// + /// Read information from naming table of font file + /// search for italic (or oblique), bold italic (or bold oblique) + /// + /// Selector of font + /// Index of font in collection + /// True when the font description contains italic/obligue otherwise False + bool is_italic(const FontFile &font, unsigned int font_index); + + /// + /// Create unique character set from string with filtered from text with only character from font + /// + /// Source vector of glyphs + /// Font descriptor + /// Define font in collection + /// True when text contain glyph unknown in font + /// Unique set of character from text contained in font + std::string create_range_text(const std::string &text, const FontFile &font, unsigned int font_index, bool* exist_unknown = nullptr); + + /// + /// Calculate scale for glyph shape convert from shape points to mm + /// + /// Property of font + /// Font data + /// Conversion to mm + double get_text_shape_scale(const FontProp &fp, const FontFile &ff); + + /// + /// getter of font info by collection defined in prop + /// + /// Contain infos about all fonts(collections) in file + /// Index of collection + /// Ascent, descent, line gap + const FontFile::Info &get_font_info(const FontFile &font, const FontProp &prop); + + /// + /// Read from font file and properties height of line with spacing + /// + /// Infos for collections + /// Collection index + Additional line gap + /// Line height with spacing in scaled font points (same as ExPolygons) + int get_line_height(const FontFile &font, const FontProp &prop); + + /// + /// Calculate Vertical align + /// + /// Top | Center | Bottom + /// + /// Return align Y offset in mm + double get_align_y_offset_in_mm(FontProp::VerticalAlign align, unsigned count_lines, const FontFile &ff, const FontProp &fp); + + /// + /// Project spatial point + /// + class IProject3d + { + public: + virtual ~IProject3d() = default; + /// + /// Move point with respect to projection direction + /// e.g. Orthogonal projection will move with point by direction + /// e.g. Spherical projection need to use center of projection + /// + /// Spatial point coordinate + /// Projected spatial point + virtual Vec3d project(const Vec3d &point) const = 0; + }; + + /// + /// Project 2d point into space + /// Could be plane, sphere, cylindric, ... + /// + class IProjection : public IProject3d + { + public: + virtual ~IProjection() = default; + + /// + /// convert 2d point to 3d points + /// + /// 2d coordinate + /// + /// first - front spatial point + /// second - back spatial point + /// + virtual std::pair create_front_back(const Point &p) const = 0; + + /// + /// Back projection + /// + /// Point to project + /// [optional] Depth of 2d projected point. Be careful number is in 2d scale + /// Uprojected point when it is possible + virtual std::optional unproject(const Vec3d &p, double * depth = nullptr) const = 0; + }; + + /// + /// Create triangle model for text + /// + /// text or image + /// Define transformation from 2d to 3d(orientation, position, scale, ...) + /// Projected shape into space + indexed_triangle_set polygons2model(const ExPolygons &shape2d, const IProjection& projection); + + /// + /// Suggest wanted up vector of embossed text by emboss direction + /// + /// Normalized vector of emboss direction in world + /// Is compared with normal.z to suggest up direction + /// Wanted up vector + Vec3d suggest_up(const Vec3d normal, double up_limit = 0.9); + + /// + /// By transformation calculate angle between suggested and actual up vector + /// + /// Transformation of embossed volume in world + /// Is compared with normal.z to suggest up direction + /// Rotation of suggested up-vector[in rad] in the range [-Pi, Pi], When rotation is not zero + std::optional calc_up(const Transform3d &tr, double up_limit = 0.9); + + /// + /// Create transformation for emboss text object to lay on surface point + /// + /// Position of surface point + /// Normal of surface point + /// Is compared with normal.z to suggest up direction + /// Transformation onto surface point + Transform3d create_transformation_onto_surface( + const Vec3d &position, const Vec3d &normal, double up_limit = 0.9); + + class ProjectZ : public IProjection + { + public: + explicit ProjectZ(double depth) : m_depth(depth) {} + // Inherited via IProject + std::pair create_front_back(const Point &p) const override; + Vec3d project(const Vec3d &point) const override; + std::optional unproject(const Vec3d &p, double * depth = nullptr) const override; + double m_depth; + }; + + class ProjectScale : public IProjection + { + std::unique_ptr core; + double m_scale; + public: + ProjectScale(std::unique_ptr core, double scale) + : core(std::move(core)), m_scale(scale) + {} + + // Inherited via IProject + std::pair create_front_back(const Point &p) const override + { + auto res = core->create_front_back(p); + return std::make_pair(res.first * m_scale, res.second * m_scale); + } + Vec3d project(const Vec3d &point) const override{ + return core->project(point); + } + std::optional unproject(const Vec3d &p, double *depth = nullptr) const override { + auto res = core->unproject(p / m_scale, depth); + if (depth != nullptr) *depth *= m_scale; + return res; + } + }; + + class ProjectTransform : public IProjection + { + std::unique_ptr m_core; + Transform3d m_tr; + Transform3d m_tr_inv; + double z_scale; + public: + ProjectTransform(std::unique_ptr core, const Transform3d &tr) : m_core(std::move(core)), m_tr(tr) + { + m_tr_inv = m_tr.inverse(); + z_scale = (m_tr.linear() * Vec3d::UnitZ()).norm(); + } + + // Inherited via IProject + std::pair create_front_back(const Point &p) const override + { + auto [front, back] = m_core->create_front_back(p); + return std::make_pair(m_tr * front, m_tr * back); + } + Vec3d project(const Vec3d &point) const override{ + return m_core->project(point); + } + std::optional unproject(const Vec3d &p, double *depth = nullptr) const override { + auto res = m_core->unproject(m_tr_inv * p, depth); + if (depth != nullptr) + *depth *= z_scale; + return res; + } + }; + + class OrthoProject3d : public Emboss::IProject3d + { + // size and direction of emboss for ortho projection + Vec3d m_direction; + public: + OrthoProject3d(Vec3d direction) : m_direction(direction) {} + Vec3d project(const Vec3d &point) const override{ return point + m_direction;} + }; + + class OrthoProject: public Emboss::IProjection { + Transform3d m_matrix; + // size and direction of emboss for ortho projection + Vec3d m_direction; + Transform3d m_matrix_inv; + public: + OrthoProject(Transform3d matrix, Vec3d direction) + : m_matrix(matrix), m_direction(direction), m_matrix_inv(matrix.inverse()) + {} + // Inherited via IProject + std::pair create_front_back(const Point &p) const override; + Vec3d project(const Vec3d &point) const override; + std::optional unproject(const Vec3d &p, double * depth = nullptr) const override; + }; + + /// + /// Define polygon for draw letters + /// + struct TextLine + { + // slice of object + Polygon polygon; + + // point laying on polygon closest to zero + PolygonPoint start; + + // offset of text line in volume mm + float y; + }; + using TextLines = std::vector; + + /// + /// Sample slice polygon by bounding boxes centers + /// slice start point has shape_center_x coor + /// + /// Polygon and start point[Slic3r scaled milimeters] + /// Bounding boxes of letter on one line[in font scales] + /// Scale for bbs (after multiply bb is in milimeters) + /// Sampled polygon by bounding boxes + PolygonPoints sample_slice(const TextLine &slice, const BoundingBoxes &bbs, double scale); + + /// + /// Calculate angle for polygon point + /// + /// Distance for found normal in point + /// Select point on polygon + /// Polygon know neighbor of point + /// angle(atan2) of normal in polygon point + double calculate_angle(int32_t distance, PolygonPoint polygon_point, const Polygon &polygon); + std::vector calculate_angles(int32_t distance, const PolygonPoints& polygon_points, const Polygon &polygon); + +} // namespace Emboss + +/////////////////////// +// Move to ExPolygonsWithIds Utils +void translate(ExPolygonsWithIds &e, const Point &p); +BoundingBox get_extents(const ExPolygonsWithIds &e); +void center(ExPolygonsWithIds &e); +// delta .. safe offset before union (use as boolean close) +// NOTE: remove unprintable spaces between neighbor curves (made by linearization of curve) +ExPolygons union_with_delta(EmbossShape &shape, float delta, unsigned max_heal_iteration); +} // namespace Slic3r +#endif // slic3r_Emboss_hpp_ diff --git a/src/libslic3r/EmbossShape.hpp b/src/libslic3r/EmbossShape.hpp new file mode 100644 index 0000000000..9094d2ad5d --- /dev/null +++ b/src/libslic3r/EmbossShape.hpp @@ -0,0 +1,143 @@ +#ifndef slic3r_EmbossShape_hpp_ +#define slic3r_EmbossShape_hpp_ + +#include +#include +#include // unique_ptr +#include +#include +#include +#include +#include +#include "Point.hpp" // Transform3d +#include "ExPolygon.hpp" +#include "ExPolygonSerialize.hpp" +#include "nanosvg/nanosvg.h" // NSVGimage + +namespace Slic3r { + +struct EmbossProjection{ + // Emboss depth, Size in local Z direction + double depth = 1.; // [in loacal mm] + // NOTE: User should see and modify mainly world size not local + + // Flag that result volume use surface cutted from source objects + bool use_surface = false; + + bool operator==(const EmbossProjection &other) const { + return depth == other.depth && use_surface == other.use_surface; + } + + // undo / redo stack recovery + template void serialize(Archive &ar) { ar(depth, use_surface); } +}; + +// Extend expolygons with information whether it was successfull healed +struct HealedExPolygons{ + ExPolygons expolygons; + bool is_healed; + operator ExPolygons&() { return expolygons; } +}; + +// Help structure to identify expolygons grups +// e.g. emboss -> per glyph -> identify character +struct ExPolygonsWithId +{ + // Identificator for shape + // In text it separate letters and the name is unicode value of letter + // Is svg it is id of path + unsigned id; + + // shape defined by integer point contain only lines + // Curves are converted to sequence of lines + ExPolygons expoly; + + // flag whether expolygons are fully healed(without duplication) + bool is_healed = true; +}; +using ExPolygonsWithIds = std::vector; + +/// +/// Contain plane shape information to be able emboss it and edit it +/// +struct EmbossShape +{ + // shapes to to emboss separately over surface + ExPolygonsWithIds shapes_with_ids; + + // Only cache for final shape + // It is calculated from ExPolygonsWithIds + // Flag is_healed --> whether union of shapes is healed + // Healed mean without selfintersection and point duplication + HealedExPolygons final_shape; + + // scale of shape, multiplier to get 3d point in mm from integer shape + double scale = SCALING_FACTOR; + + // Define how to emboss shape + EmbossProjection projection; + + // !!! Volume stored in .3mf has transformed vertices. + // (baked transformation into vertices position) + // Only place for fill this is when load from .3mf + // This is correction for volume transformation + // Stored_Transform3d * fix_3mf_tr = Transform3d_before_store_to_3mf + std::optional fix_3mf_tr; + + struct SvgFile { + // File(.svg) path on local computer + // When empty can't reload from disk + std::string path; + + // File path into .3mf(.zip) + // When empty svg is not stored into .3mf file yet. + // and will create dialog to delete private data on save. + std::string path_in_3mf; + + // Loaded svg file data. + // !!! It is not serialized on undo/redo stack + std::shared_ptr image = nullptr; + + // Loaded string data from file + std::shared_ptr file_data = nullptr; + + template void save(Archive &ar) const { + // Note: image is only cache it is not neccessary to store + + // Store file data as plain string + assert(file_data != nullptr); + ar(path, path_in_3mf, (file_data != nullptr) ? *file_data : std::string("")); + } + template void load(Archive &ar) { + // for restore shared pointer on file data + std::string file_data_str; + ar(path, path_in_3mf, file_data_str); + if (!file_data_str.empty()) + file_data = std::make_unique(file_data_str); + } + }; + // When embossing shape is made by svg file this is source data + std::optional svg_file; + + // undo / redo stack recovery + template void save(Archive &ar) const + { + // final_shape is not neccessary to store - it is only cache + ar(shapes_with_ids, final_shape, scale, projection, svg_file); + cereal::save(ar, fix_3mf_tr); + } + template void load(Archive &ar) + { + ar(shapes_with_ids, final_shape, scale, projection, svg_file); + cereal::load(ar, fix_3mf_tr); + } +}; +} // namespace Slic3r + +// Serialization through the Cereal library +namespace cereal { +template void serialize(Archive &ar, Slic3r::ExPolygonsWithId &o) { ar(o.id, o.expoly, o.is_healed); } +template void serialize(Archive &ar, Slic3r::HealedExPolygons &o) { ar(o.expolygons, o.is_healed); } +}; // namespace cereal + +#endif // slic3r_EmbossShape_hpp_ diff --git a/src/libslic3r/ExPolygon.cpp b/src/libslic3r/ExPolygon.cpp index 77222dc367..dee115194b 100644 --- a/src/libslic3r/ExPolygon.cpp +++ b/src/libslic3r/ExPolygon.cpp @@ -1,3 +1,15 @@ +///|/ Copyright (c) Prusa Research 2016 - 2023 Vojtěch Bubník @bubnikv, Lukáš Matěna @lukasmatena, Lukáš Hejl @hejllukas +///|/ Copyright (c) Slic3r 2013 - 2016 Alessandro Ranellucci @alranel +///|/ Copyright (c) 2015 Maksim Derbasov @ntfshard +///|/ Copyright (c) 2014 Petr Ledvina @ledvinap +///|/ +///|/ ported from lib/Slic3r/ExPolygon.pm: +///|/ Copyright (c) Prusa Research 2017 - 2022 Vojtěch Bubník @bubnikv +///|/ Copyright (c) Slic3r 2011 - 2014 Alessandro Ranellucci @alranel +///|/ Copyright (c) 2012 Mark Hindess +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ #include "BoundingBox.hpp" #include "ExPolygon.hpp" #include "Exception.hpp" @@ -475,6 +487,24 @@ bool has_duplicate_points(const ExPolygons &expolys) #endif } +bool remove_same_neighbor(ExPolygons &expolygons) +{ + if (expolygons.empty()) + return false; + bool remove_from_holes = false; + bool remove_from_contour = false; + for (ExPolygon &expoly : expolygons) { + remove_from_contour |= remove_same_neighbor(expoly.contour); + remove_from_holes |= remove_same_neighbor(expoly.holes); + } + // Removing of expolygons without contour + if (remove_from_contour) + expolygons.erase(std::remove_if(expolygons.begin(), expolygons.end(), + [](const ExPolygon &p) { return p.contour.points.size() <= 2; }), + expolygons.end()); + return remove_from_holes || remove_from_contour; +} + bool remove_sticks(ExPolygon &poly) { return remove_sticks(poly.contour) || remove_sticks(poly.holes); diff --git a/src/libslic3r/ExPolygon.hpp b/src/libslic3r/ExPolygon.hpp index c8f5a5f459..39974ab7af 100644 --- a/src/libslic3r/ExPolygon.hpp +++ b/src/libslic3r/ExPolygon.hpp @@ -1,3 +1,14 @@ +///|/ Copyright (c) Prusa Research 2016 - 2023 Pavel Mikuš @Godrak, Vojtěch Bubník @bubnikv, Lukáš Matěna @lukasmatena, Enrico Turri @enricoturri1966, Filip Sykala @Jony01, Lukáš Hejl @hejllukas, Tomáš Mészáros @tamasmeszaros +///|/ Copyright (c) 2016 Sakari Kapanen @Flannelhead +///|/ Copyright (c) Slic3r 2013 - 2016 Alessandro Ranellucci @alranel +///|/ +///|/ ported from lib/Slic3r/ExPolygon.pm: +///|/ Copyright (c) Prusa Research 2017 - 2022 Vojtěch Bubník @bubnikv +///|/ Copyright (c) Slic3r 2011 - 2014 Alessandro Ranellucci @alranel +///|/ Copyright (c) 2012 Mark Hindess +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ #ifndef slic3r_ExPolygon_hpp_ #define slic3r_ExPolygon_hpp_ @@ -142,19 +153,6 @@ inline Lines to_lines(const ExPolygons &src) return lines; } -inline Points to_points(const ExPolygons& src) -{ - Points points; - size_t count = count_points(src); - points.reserve(count); - for (const ExPolygon& expolygon : src) { - append(points, expolygon.contour.points); - for (const Polygon& hole : expolygon.holes) - append(points, hole.points); - } - return points; -} - // Line is from point index(see to_points) to next point. // Next point of last point in polygon is first polygon point. inline Linesf to_linesf(const ExPolygons &src, uint32_t count_lines = 0) @@ -205,6 +203,20 @@ inline Linesf to_unscaled_linesf(const ExPolygons &src) return lines; } + +inline Points to_points(const ExPolygons &src) +{ + Points points; + size_t count = count_points(src); + points.reserve(count); + for (const ExPolygon &expolygon : src) { + append(points, expolygon.contour.points); + for (const Polygon &hole : expolygon.holes) + append(points, hole.points); + } + return points; +} + inline Polylines to_polylines(const ExPolygon &src) { Polylines polylines; @@ -371,6 +383,11 @@ inline Points to_points(const ExPolygon &expoly) return out; } +inline void translate(ExPolygons &expolys, const Point &p) { + for (ExPolygon &expoly : expolys) + expoly.translate(p); +} + inline void polygons_append(Polygons &dst, const ExPolygon &src) { dst.reserve(dst.size() + src.holes.size() + 1); @@ -464,6 +481,9 @@ std::vector get_extents_vector(const ExPolygons &polygons); bool has_duplicate_points(const ExPolygon &expoly); bool has_duplicate_points(const ExPolygons &expolys); +// Return True when erase some otherwise False. +bool remove_same_neighbor(ExPolygons &expolys); + bool remove_sticks(ExPolygon &poly); void keep_largest_contour_only(ExPolygons &polygons); diff --git a/src/libslic3r/ExPolygonSerialize.hpp b/src/libslic3r/ExPolygonSerialize.hpp new file mode 100644 index 0000000000..712d4706d5 --- /dev/null +++ b/src/libslic3r/ExPolygonSerialize.hpp @@ -0,0 +1,28 @@ +#ifndef slic3r_ExPolygonSerialize_hpp_ +#define slic3r_ExPolygonSerialize_hpp_ + +#include "ExPolygon.hpp" +#include "Point.hpp" // Cereal serialization of Point +#include +#include + +/// +/// External Cereal serialization of ExPolygons +/// + +// Serialization through the Cereal library +#include +namespace cereal { + +template +void serialize(Archive &archive, Slic3r::Polygon &polygon) { + archive(polygon.points); +} + +template +void serialize(Archive &archive, Slic3r::ExPolygon &expoly) { + archive(expoly.contour, expoly.holes); +} + +} // namespace Slic3r +#endif // slic3r_ExPolygonSerialize_hpp_ diff --git a/src/libslic3r/ExPolygonsIndex.cpp b/src/libslic3r/ExPolygonsIndex.cpp new file mode 100644 index 0000000000..976531799f --- /dev/null +++ b/src/libslic3r/ExPolygonsIndex.cpp @@ -0,0 +1,82 @@ +#include "ExPolygonsIndex.hpp" +using namespace Slic3r; + +// IMPROVE: use one dimensional vector for polygons offset with searching by std::lower_bound +ExPolygonsIndices::ExPolygonsIndices(const ExPolygons &shapes) +{ + // prepare offsets + m_offsets.reserve(shapes.size()); + uint32_t offset = 0; + for (const ExPolygon &shape : shapes) { + assert(!shape.contour.points.empty()); + std::vector shape_offsets; + shape_offsets.reserve(shape.holes.size() + 1); + shape_offsets.push_back(offset); + offset += shape.contour.points.size(); + for (const Polygon &hole: shape.holes) { + shape_offsets.push_back(offset); + offset += hole.points.size(); + } + m_offsets.push_back(std::move(shape_offsets)); + } + m_count = offset; +} + +uint32_t ExPolygonsIndices::cvt(const ExPolygonsIndex &id) const +{ + assert(id.expolygons_index < m_offsets.size()); + const std::vector &shape_offset = m_offsets[id.expolygons_index]; + assert(id.polygon_index < shape_offset.size()); + uint32_t res = shape_offset[id.polygon_index] + id.point_index; + assert(res < m_count); + return res; +} + +ExPolygonsIndex ExPolygonsIndices::cvt(uint32_t index) const +{ + assert(index < m_count); + ExPolygonsIndex result{0, 0, 0}; + // find expolygon index + auto fn = [](const std::vector &offsets, uint32_t index) { return offsets[0] < index; }; + auto it = std::lower_bound(m_offsets.begin() + 1, m_offsets.end(), index, fn); + result.expolygons_index = it - m_offsets.begin(); + if (it == m_offsets.end() || it->at(0) != index) --result.expolygons_index; + + // find polygon index + const std::vector &shape_offset = m_offsets[result.expolygons_index]; + auto it2 = std::lower_bound(shape_offset.begin() + 1, shape_offset.end(), index); + result.polygon_index = it2 - shape_offset.begin(); + if (it2 == shape_offset.end() || *it2 != index) --result.polygon_index; + + // calculate point index + uint32_t polygon_offset = shape_offset[result.polygon_index]; + assert(index >= polygon_offset); + result.point_index = index - polygon_offset; + return result; +} + +bool ExPolygonsIndices::is_last_point(const ExPolygonsIndex &id) const { + assert(id.expolygons_index < m_offsets.size()); + const std::vector &shape_offset = m_offsets[id.expolygons_index]; + assert(id.polygon_index < shape_offset.size()); + uint32_t index = shape_offset[id.polygon_index] + id.point_index; + assert(index < m_count); + // next index + uint32_t next_point_index = index + 1; + uint32_t next_poly_index = id.polygon_index + 1; + uint32_t next_expoly_index = id.expolygons_index + 1; + // is last expoly? + if (next_expoly_index == m_offsets.size()) { + // is last expoly last poly? + if (next_poly_index == shape_offset.size()) + return next_point_index == m_count; + } else { + // (not last expoly) is expoly last poly? + if (next_poly_index == shape_offset.size()) + return next_point_index == m_offsets[next_expoly_index][0]; + } + // Not last polygon in expolygon + return next_point_index == shape_offset[next_poly_index]; +} + +uint32_t ExPolygonsIndices::get_count() const { return m_count; } diff --git a/src/libslic3r/ExPolygonsIndex.hpp b/src/libslic3r/ExPolygonsIndex.hpp new file mode 100644 index 0000000000..b46fd50890 --- /dev/null +++ b/src/libslic3r/ExPolygonsIndex.hpp @@ -0,0 +1,74 @@ +#ifndef slic3r_ExPolygonsIndex_hpp_ +#define slic3r_ExPolygonsIndex_hpp_ + +#include "ExPolygon.hpp" +namespace Slic3r { + +/// +/// Index into ExPolygons +/// Identify expolygon, its contour (or hole) and point +/// +struct ExPolygonsIndex +{ + // index of ExPolygons + uint32_t expolygons_index; + + // index of Polygon + // 0 .. contour + // N .. hole[N-1] + uint32_t polygon_index; + + // index of point in polygon + uint32_t point_index; + + bool is_contour() const { return polygon_index == 0; } + bool is_hole() const { return polygon_index != 0; } + uint32_t hole_index() const { return polygon_index - 1; } +}; + +/// +/// Keep conversion from ExPolygonsIndex to Index and vice versa +/// ExPolygonsIndex .. contour(or hole) point from ExPolygons +/// Index .. continous number +/// +/// index is used to address lines and points as result from function +/// Slic3r::to_lines, Slic3r::to_points +/// +class ExPolygonsIndices +{ + std::vector> m_offsets; + // for check range of index + uint32_t m_count; // count of points +public: + ExPolygonsIndices(const ExPolygons &shapes); + + /// + /// Convert to one index number + /// + /// Compose of adress into expolygons + /// Index + uint32_t cvt(const ExPolygonsIndex &id) const; + + /// + /// Separate to multi index + /// + /// adress into expolygons + /// + ExPolygonsIndex cvt(uint32_t index) const; + + /// + /// Check whether id is last point in polygon + /// + /// Identify point in expolygon + /// True when id is last point in polygon otherwise false + bool is_last_point(const ExPolygonsIndex &id) const; + + /// + /// Count of points in expolygons + /// + /// Count of points in expolygons + uint32_t get_count() const; +}; + +} // namespace Slic3r +#endif // slic3r_ExPolygonsIndex_hpp_ diff --git a/src/libslic3r/Extruder.cpp b/src/libslic3r/Extruder.cpp index 6b4d58eb3c..0b5d68b688 100644 --- a/src/libslic3r/Extruder.cpp +++ b/src/libslic3r/Extruder.cpp @@ -54,11 +54,11 @@ double Extruder::retract(double length, double restart_extra) if (m_config->use_relative_e_distances) m_share_E = 0.; double to_retract = std::max(0., length - m_share_retracted); + m_restart_extra = restart_extra; if (to_retract > 0.) { m_share_E -= to_retract; m_absolute_E -= to_retract; m_share_retracted += to_retract; - m_restart_extra = restart_extra; } return to_retract; } else { @@ -66,11 +66,11 @@ double Extruder::retract(double length, double restart_extra) if (m_config->use_relative_e_distances) m_E = 0.; double to_retract = std::max(0., length - m_retracted); + m_restart_extra = restart_extra; if (to_retract > 0.) { m_E -= to_retract; m_absolute_E -= to_retract; m_retracted += to_retract; - m_restart_extra = restart_extra; } return to_retract; } diff --git a/src/libslic3r/Fill/Fill.cpp b/src/libslic3r/Fill/Fill.cpp index ea7b24709d..d68c14ce51 100644 --- a/src/libslic3r/Fill/Fill.cpp +++ b/src/libslic3r/Fill/Fill.cpp @@ -485,9 +485,10 @@ std::vector group_fills(const Layer &layer) // Calculate the actual flow we'll be using for this infill. params.bridge = is_bridge || Fill::use_bridge_flow(params.pattern); + const bool is_thick_bridge = surface.is_bridge() && (surface.is_internal_bridge() ? object_config.thick_internal_bridges : object_config.thick_bridges); params.flow = params.bridge ? - //BBS: always enable thick bridge for internal bridge - layerm.bridging_flow(extrusion_role, (surface.is_bridge() && !surface.is_external()) || object_config.thick_bridges, params.extrusion_role == erInternalBridgeInfill) : + //Orca: enable thick bridge based on config + layerm.bridging_flow(extrusion_role, is_thick_bridge) : layerm.flow(extrusion_role, (surface.thickness == -1) ? layer.height : surface.thickness); // Calculate flow spacing for infill pattern generation. diff --git a/src/libslic3r/Format/SL1.cpp b/src/libslic3r/Format/SL1.cpp index 9604a43dd8..91aa7bbfcc 100644 --- a/src/libslic3r/Format/SL1.cpp +++ b/src/libslic3r/Format/SL1.cpp @@ -1,3 +1,7 @@ +///|/ Copyright (c) Prusa Research 2020 - 2023 Tomáš Mészáros @tamasmeszaros, Oleksandra Iushchenko @YuSanka, Lukáš Matěna @lukasmatena, Vojtěch Bubník @bubnikv +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ #include "SL1.hpp" #include "GCode/ThumbnailData.hpp" #include "libslic3r/Time.hpp" @@ -442,8 +446,8 @@ void fill_slicerconf(ConfMap &m, const SLAPrint &print) std::unique_ptr SL1Archive::create_raster() const { - sla::RasterBase::Resolution res; - sla::RasterBase::PixelDim pxdim; + sla::Resolution res; + sla::PixelDim pxdim; std::array mirror; double w = m_cfg.display_width.getFloat(); @@ -464,8 +468,8 @@ std::unique_ptr SL1Archive::create_raster() const std::swap(pw, ph); } - res = sla::RasterBase::Resolution{pw, ph}; - pxdim = sla::RasterBase::PixelDim{w / pw, h / ph}; + res = sla::Resolution{pw, ph}; + pxdim = sla::PixelDim{w / pw, h / ph}; sla::RasterBase::Trafo tr{orientation, mirror}; double gamma = m_cfg.gamma_correction.getFloat(); diff --git a/src/libslic3r/Format/bbs_3mf.cpp b/src/libslic3r/Format/bbs_3mf.cpp index 3e35e5e07c..17bb4972d1 100644 --- a/src/libslic3r/Format/bbs_3mf.cpp +++ b/src/libslic3r/Format/bbs_3mf.cpp @@ -23,6 +23,9 @@ #include #include +#include +#include + #include #include #include @@ -48,6 +51,13 @@ namespace pt = boost::property_tree; #include #include "miniz_extension.hpp" #include "nlohmann/json.hpp" + +#include "TextConfiguration.hpp" +#include "EmbossShape.hpp" +#include "ExPolygonSerialize.hpp" + +#include "NSVGUtils.hpp" + #include // Slightly faster than sprintf("%.9g"), but there is an issue with the karma floating point formatter, @@ -211,7 +221,7 @@ static constexpr const char* ASSEMBLE_ITEM_TAG = "assemble_item"; static constexpr const char* SLICE_HEADER_TAG = "header"; static constexpr const char* SLICE_HEADER_ITEM_TAG = "header_item"; -// text_info +// Deprecated: text_info static constexpr const char* TEXT_INFO_TAG = "text_info"; static constexpr const char* TEXT_ATTR = "text"; static constexpr const char* FONT_NAME_ATTR = "font_name"; @@ -325,6 +335,42 @@ static constexpr const char* MESH_STAT_FACETS_REMOVED = "facets_removed"; static constexpr const char* MESH_STAT_FACETS_RESERVED = "facets_reversed"; static constexpr const char* MESH_STAT_BACKWARDS_EDGES = "backwards_edges"; +// Store / load of TextConfiguration +static constexpr const char *TEXT_TAG = "slic3rpe:text"; +static constexpr const char *TEXT_DATA_ATTR = "text"; +// TextConfiguration::EmbossStyle +static constexpr const char *STYLE_NAME_ATTR = "style_name"; +static constexpr const char *FONT_DESCRIPTOR_ATTR = "font_descriptor"; +static constexpr const char *FONT_DESCRIPTOR_TYPE_ATTR = "font_descriptor_type"; + +// TextConfiguration::FontProperty +static constexpr const char *CHAR_GAP_ATTR = "char_gap"; +static constexpr const char *LINE_GAP_ATTR = "line_gap"; +static constexpr const char *LINE_HEIGHT_ATTR = "line_height"; +static constexpr const char *BOLDNESS_ATTR = "boldness"; +static constexpr const char *SKEW_ATTR = "skew"; +static constexpr const char *PER_GLYPH_ATTR = "per_glyph"; +static constexpr const char *HORIZONTAL_ALIGN_ATTR = "horizontal"; +static constexpr const char *VERTICAL_ALIGN_ATTR = "vertical"; +static constexpr const char *COLLECTION_NUMBER_ATTR = "collection"; + +static constexpr const char *FONT_FAMILY_ATTR = "family"; +static constexpr const char *FONT_FACE_NAME_ATTR = "face_name"; +static constexpr const char *FONT_STYLE_ATTR = "style"; +static constexpr const char *FONT_WEIGHT_ATTR = "weight"; + +// Store / load of EmbossShape +static constexpr const char *SHAPE_TAG = "slic3rpe:shape"; +static constexpr const char *SHAPE_SCALE_ATTR = "scale"; +static constexpr const char *UNHEALED_ATTR = "unhealed"; +static constexpr const char *SVG_FILE_PATH_ATTR = "filepath"; +static constexpr const char *SVG_FILE_PATH_IN_3MF_ATTR = "filepath3mf"; + +// EmbossProjection +static constexpr const char *DEPTH_ATTR = "depth"; +static constexpr const char *USE_SURFACE_ATTR = "use_surface"; +// static constexpr const char *FIX_TRANSFORMATION_ATTR = "transform"; + const unsigned int BBS_VALID_OBJECT_TYPES_COUNT = 2; const char* BBS_VALID_OBJECT_TYPES[] = @@ -718,8 +764,8 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) MetadataList metadata; RepairedMeshErrors mesh_stats; ModelVolumeType part_type; - TextInfo text_info; - + std::optional text_configuration; + std::optional shape_configuration; VolumeMetadata(unsigned int first_triangle_id, unsigned int last_triangle_id, ModelVolumeType type = ModelVolumeType::MODEL_PART) : first_triangle_id(first_triangle_id) , last_triangle_id(last_triangle_id) @@ -770,6 +816,7 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) typedef std::map IdToCutObjectInfoMap; /*typedef std::map> IdToSlaSupportPointsMap; typedef std::map> IdToSlaDrainHolesMap;*/ + using PathToEmbossShapeFileMap = std::map>; struct ObjectImporter { @@ -962,6 +1009,7 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) IdToLayerConfigRangesMap m_layer_config_ranges; /*IdToSlaSupportPointsMap m_sla_support_points; IdToSlaDrainHolesMap m_sla_drain_holes;*/ + PathToEmbossShapeFileMap m_path_to_emboss_shape_files; std::string m_curr_metadata_name; std::string m_curr_characters; std::string m_name; @@ -1015,6 +1063,7 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) // add backup & restore logic bool _load_model_from_file(std::string filename, Model& model, PlateDataPtrs& plate_data_list, std::vector& project_presets, DynamicPrintConfig& config, ConfigSubstitutionContext& config_substitutions, Import3mfProgressFn proFn = nullptr, BBLProject* project = nullptr, int plate_id = 0); + bool _is_svg_shape_file(const std::string &filename) const; bool _extract_from_archive(mz_zip_archive& archive, std::string const & path, std::function, bool restore = false); bool _extract_xml_from_archive(mz_zip_archive& archive, std::string const & path, XML_StartElementHandler start_handler, XML_EndElementHandler end_handler); bool _extract_xml_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat, XML_StartElementHandler start_handler, XML_EndElementHandler end_handler); @@ -1035,6 +1084,7 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) void _extract_auxiliary_file_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat, Model& model); void _extract_file_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat); + void _extract_embossed_svg_shape_file(const std::string &filename, mz_zip_archive &archive, const mz_zip_archive_file_stat &stat); // handlers to parse the .model file void _handle_start_model_xml_element(const char* name, const char** attributes); @@ -1090,6 +1140,9 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) bool _handle_start_metadata(const char** attributes, unsigned int num_attributes); bool _handle_end_metadata(); + bool _handle_start_text_configuration(const char** attributes, unsigned int num_attributes); + bool _handle_start_shape_configuration(const char **attributes, unsigned int num_attributes); + bool _create_object_instance(std::string const & path, int object_id, const Transform3d& transform, const bool printable, unsigned int recur_counter); void _apply_transform(ModelInstance& instance, const Transform3d& transform); @@ -1141,7 +1194,7 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) void _generate_current_object_list(std::vector &sub_objects, Id object_id, IdToCurrentObjectMap& current_objects); bool _generate_volumes_new(ModelObject& object, const std::vector &sub_objects, const ObjectMetadata::VolumeMetadataList& volumes, ConfigSubstitutionContext& config_substitutions); - bool _generate_volumes(ModelObject& object, const Geometry& geometry, const ObjectMetadata::VolumeMetadataList& volumes, ConfigSubstitutionContext& config_substitutions); + //bool _generate_volumes(ModelObject& object, const Geometry& geometry, const ObjectMetadata::VolumeMetadataList& volumes, ConfigSubstitutionContext& config_substitutions); // callbacks to parse the .model file static void XMLCALL _handle_start_model_xml_element(void* userData, const char* name, const char** attributes); @@ -1757,6 +1810,9 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) return false; } } + else if (_is_svg_shape_file(name)) { + _extract_embossed_svg_shape_file(name, archive, stat); + } else if (!dont_load_config && boost::algorithm::iequals(name, SLICE_INFO_CONFIG_FILE)) { m_parsing_slice_info = true; //extract slice info from archive @@ -2156,6 +2212,10 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) return true; } + bool _BBS_3MF_Importer::_is_svg_shape_file(const std::string &name) const { + return boost::starts_with(name, MODEL_FOLDER) && boost::ends_with(name, ".svg"); + } + bool _BBS_3MF_Importer::_extract_from_archive(mz_zip_archive& archive, std::string const & path, std::function extract, bool restore) { mz_uint num_entries = mz_zip_reader_get_num_files(&archive); @@ -2870,6 +2930,32 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) } }*/ + void _BBS_3MF_Importer::_extract_embossed_svg_shape_file(const std::string &filename, mz_zip_archive &archive, const mz_zip_archive_file_stat &stat){ + assert(m_path_to_emboss_shape_files.find(filename) == m_path_to_emboss_shape_files.end()); + auto file = std::make_unique(stat.m_uncomp_size, '\0'); + mz_bool res = mz_zip_reader_extract_to_mem(&archive, stat.m_file_index, (void *) file->data(), stat.m_uncomp_size, 0); + if (res == 0) { + add_error("Error while reading svg shape for emboss"); + return; + } + + // store for case svg is loaded before volume + m_path_to_emboss_shape_files[filename] = std::move(file); + + // find embossed volume, for case svg is loaded after volume + for (const ModelObject* object : m_model->objects) + for (ModelVolume *volume : object->volumes) { + std::optional &es = volume->emboss_shape; + if (!es.has_value()) + continue; + std::optional &svg = es->svg_file; + if (!svg.has_value()) + continue; + if (filename.compare(svg->path_in_3mf) == 0) + svg->file_data = m_path_to_emboss_shape_files[filename]; + } + } + void _BBS_3MF_Importer::_extract_custom_gcode_per_print_z_from_archive(::mz_zip_archive &archive, const mz_zip_archive_file_stat &stat) { //BBS: add plate tree related logic @@ -3066,6 +3152,10 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) res = _handle_start_config_volume_mesh(attributes, num_attributes); else if (::strcmp(METADATA_TAG, name) == 0) res = _handle_start_config_metadata(attributes, num_attributes); + else if (::strcmp(SHAPE_TAG, name) == 0) + res = _handle_start_shape_configuration(attributes, num_attributes); + else if (::strcmp(TEXT_TAG, name) == 0) + res = _handle_start_text_configuration(attributes, num_attributes); else if (::strcmp(PLATE_TAG, name) == 0) res = _handle_start_config_plater(attributes, num_attributes); else if (::strcmp(INSTANCE_TAG, name) == 0) @@ -3632,6 +3722,104 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) return true; } + struct TextConfigurationSerialization + { + public: + TextConfigurationSerialization() = delete; + + using TypeToName = boost::bimap; + static const TypeToName type_to_name; + + using HorizontalAlignToName = boost::bimap; + static const HorizontalAlignToName horizontal_align_to_name; + + using VerticalAlignToName = boost::bimap; + static const VerticalAlignToName vertical_align_to_name; + + static EmbossStyle::Type get_type(std::string_view type) { + const auto& to_type = TextConfigurationSerialization::type_to_name.right; + auto type_item = to_type.find(type); + assert(type_item != to_type.end()); + if (type_item == to_type.end()) return EmbossStyle::Type::undefined; + return type_item->second; + } + + static std::string_view get_name(EmbossStyle::Type type) { + const auto& to_name = TextConfigurationSerialization::type_to_name.left; + auto type_name = to_name.find(type); + assert(type_name != to_name.end()); + if (type_name == to_name.end()) return "unknown type"; + return type_name->second; + } + + static void to_xml(std::stringstream &stream, const TextConfiguration &tc); + static std::optional read(const char **attributes, unsigned int num_attributes); + static EmbossShape read_old(const char **attributes, unsigned int num_attributes); + }; + + bool _BBS_3MF_Importer::_handle_start_text_configuration(const char **attributes, unsigned int num_attributes) + { + IdToMetadataMap::iterator object = m_objects_metadata.find(m_curr_config.object_id); + if (object == m_objects_metadata.end()) { + add_error("Can not assign volume mesh to a valid object"); + return false; + } + if (object->second.volumes.empty()) { + add_error("Can not assign mesh to a valid volume"); + return false; + } + ObjectMetadata::VolumeMetadata& volume = object->second.volumes.back(); + volume.text_configuration = TextConfigurationSerialization::read(attributes, num_attributes); + if (!volume.text_configuration.has_value()) + return false; + + // Is 3mf version with shapes? + if (volume.shape_configuration.has_value()) + return true; + + // Back compatibility for 3mf version without shapes + volume.shape_configuration = TextConfigurationSerialization::read_old(attributes, num_attributes); + return true; + } + + // Definition of read/write method for EmbossShape + static void to_xml(std::stringstream &stream, const EmbossShape &es, const ModelVolume &volume, mz_zip_archive &archive); + static std::optional read_emboss_shape(const char **attributes, unsigned int num_attributes); + + bool _BBS_3MF_Importer::_handle_start_shape_configuration(const char **attributes, unsigned int num_attributes) + { + IdToMetadataMap::iterator object = m_objects_metadata.find(m_curr_config.object_id); + if (object == m_objects_metadata.end()) { + add_error("Can not assign volume mesh to a valid object"); + return false; + } + auto &volumes = object->second.volumes; + if (volumes.empty()) { + add_error("Can not assign mesh to a valid volume"); + return false; + } + ObjectMetadata::VolumeMetadata &volume = volumes.back(); + volume.shape_configuration = read_emboss_shape(attributes, num_attributes); + if (!volume.shape_configuration.has_value()) + return false; + + // Fill svg file content into shape_configuration + std::optional &svg = volume.shape_configuration->svg_file; + if (!svg.has_value()) + return true; // do not contain svg file + + const std::string &path = svg->path_in_3mf; + if (path.empty()) + return true; // do not contain svg file + + auto it = m_path_to_emboss_shape_files.find(path); + if (it == m_path_to_emboss_shape_files.end()) + return true; // svg file is not loaded yet + + svg->file_data = it->second; + return true; + } + bool _BBS_3MF_Importer::_create_object_instance(std::string const & path, int object_id, const Transform3d& transform, const bool printable, unsigned int recur_counter) { static const unsigned int MAX_RECURSIONS = 10; @@ -4169,6 +4357,13 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) ObjectMetadata::VolumeMetadata &volume = object->second.volumes[m_curr_config.volume_id]; + if (volume.text_configuration.has_value()) { + add_error("Both text_info and text_configuration found, ignore legacy text_info"); + return true; + } + + // TODO: Orca: support legacy text info + /* TextInfo text_info; text_info.m_text = xml_unescape(bbs_get_attribute_value_string(attributes, num_attributes, TEXT_ATTR)); text_info.m_font_name = bbs_get_attribute_value_string(attributes, num_attributes, FONT_NAME_ATTR); @@ -4196,7 +4391,7 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) if (!hit_normal.empty()) text_info.m_rr.normal = get_vec3_from_string(hit_normal); - volume.text_info = text_info; + volume.text_info = text_info;*/ return true; } @@ -4473,9 +4668,11 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) } volume->set_type(volume_data->part_type); - - if (!volume_data->text_info.m_text.empty()) - volume->set_text_info(volume_data->text_info); + + if (auto &es = volume_data->shape_configuration; es.has_value()) + volume->emboss_shape = std::move(es); + if (auto &tc = volume_data->text_configuration; tc.has_value()) + volume->text_configuration = std::move(tc); // apply the remaining volume's metadata for (const Metadata& metadata : volume_data->metadata) { @@ -4519,7 +4716,7 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) return true; } - + /* bool _BBS_3MF_Importer::_generate_volumes(ModelObject& object, const Geometry& geometry, const ObjectMetadata::VolumeMetadataList& volumes, ConfigSubstitutionContext& config_substitutions) { if (!object.volumes.empty()) { @@ -4667,7 +4864,7 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) return true; } - + */ void XMLCALL _BBS_3MF_Importer::_handle_start_model_xml_element(void* userData, const char* name, const char** attributes) { _BBS_3MF_Importer* importer = (_BBS_3MF_Importer*)userData; @@ -5242,6 +5439,7 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) bool save_model_to_file(StoreParams& store_params); // add backup logic bool save_object_mesh(const std::string& temp_path, ModelObject const & object, int obj_id); + static void add_transformation(std::stringstream &stream, const Transform3d &tr); private: //BBS: add plate data related logic @@ -6687,6 +6885,16 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) return flush(output_buffer, true); } + void _BBS_3MF_Exporter::add_transformation(std::stringstream &stream, const Transform3d &tr) + { + for (unsigned c = 0; c < 4; ++c) { + for (unsigned r = 0; r < 3; ++r) { + stream << tr(r, c); + if (r != 2 || c != 3) stream << " "; + } + } + } + bool _BBS_3MF_Exporter::_add_build_to_model_stream(std::stringstream& stream, const BuildItemsList& build_items) const { // This happens for empty projects @@ -6707,13 +6915,7 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) if (!item.path.empty()) stream << "\" " << PPATH_ATTR << "=\"" << xml_escape(item.path); stream << "\" " << TRANSFORM_ATTR << "=\""; - for (unsigned c = 0; c < 4; ++c) { - for (unsigned r = 0; r < 3; ++r) { - stream << item.transform(r, c); - if (r != 2 || c != 3) - stream << " "; - } - } + add_transformation(stream, item.transform); stream << "\" " << PRINTABLE_ATTR << "=\"" << item.printable << "\"/>\n"; } @@ -7041,38 +7243,6 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) return true; } - void _add_text_info_to_archive(std::stringstream& stream, const TextInfo& text_info) { - stream << " <" << TEXT_INFO_TAG << " "; - - stream << TEXT_ATTR << "=\"" << xml_escape(text_info.m_text) << "\" "; - stream << FONT_NAME_ATTR << "=\"" << text_info.m_font_name << "\" "; - - stream << FONT_INDEX_ATTR << "=\"" << text_info.m_curr_font_idx << "\" "; - - stream << FONT_SIZE_ATTR << "=\"" << text_info.m_font_size << "\" "; - stream << THICKNESS_ATTR << "=\"" << text_info.m_thickness << "\" "; - stream << EMBEDED_DEPTH_ATTR << "=\"" << text_info.m_embeded_depth << "\" "; - stream << ROTATE_ANGLE_ATTR << "=\"" << text_info.m_rotate_angle << "\" "; - stream << TEXT_GAP_ATTR << "=\"" << text_info.m_text_gap << "\" "; - - stream << BOLD_ATTR << "=\"" << (text_info.m_bold ? 1 : 0) << "\" "; - stream << ITALIC_ATTR << "=\"" << (text_info.m_italic ? 1 : 0) << "\" "; - stream << SURFACE_TEXT_ATTR << "=\"" << (text_info.m_is_surface_text ? 1 : 0) << "\" "; - stream << KEEP_HORIZONTAL_ATTR << "=\"" << (text_info.m_keep_horizontal ? 1 : 0) << "\" "; - - stream << HIT_MESH_ATTR << "=\"" << text_info.m_rr.mesh_id << "\" "; - - stream << HIT_POSITION_ATTR << "=\""; - add_vec3(stream, text_info.m_rr.hit); - stream << "\" "; - - stream << HIT_NORMAL_ATTR << "=\""; - add_vec3(stream, text_info.m_rr.normal); - stream << "\" "; - - stream << "/>\n"; - } - bool _BBS_3MF_Exporter::_add_model_config_file_to_archive(mz_zip_archive& archive, const Model& model, PlateDataPtrs& plate_data_list, const ObjectToObjectDataMap &objects_data, int export_plate_idx, bool save_gcode, bool use_loaded_id) { std::stringstream stream; @@ -7170,9 +7340,13 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) stream << " <" << METADATA_TAG << " "<< KEY_ATTR << "=\"" << key << "\" " << VALUE_ATTR << "=\"" << volume->config.opt_serialize(key) << "\"/>\n"; } - const TextInfo &text_info = volume->get_text_info(); - if (!text_info.m_text.empty()) - _add_text_info_to_archive(stream, text_info); + if (const std::optional &es = volume->emboss_shape; + es.has_value()) + to_xml(stream, *es, *volume, archive); + + if (const std::optional &tc = volume->text_configuration; + tc.has_value()) + TextConfigurationSerialization::to_xml(stream, *tc); // stores mesh's statistics const RepairedMeshErrors& stats = volume->mesh().stats().repaired_errors; @@ -8163,4 +8337,335 @@ SaveObjectGaurd::~SaveObjectGaurd() _BBS_Backup_Manager::get().pop_object_gaurd(); } +namespace{ + +// Conversion with bidirectional map +// F .. first, S .. second +template +F bimap_cvt(const boost::bimap &bmap, S s, const F & def_value) { + const auto &map = bmap.right; + auto found_item = map.find(s); + + // only for back and forward compatibility + assert(found_item != map.end()); + if (found_item == map.end()) + return def_value; + + return found_item->second; +} + +template +S bimap_cvt(const boost::bimap &bmap, F f, const S &def_value) +{ + const auto &map = bmap.left; + auto found_item = map.find(f); + + // only for back and forward compatibility + assert(found_item != map.end()); + if (found_item == map.end()) + return def_value; + + return found_item->second; +} + +} // namespace + +/// +/// TextConfiguration serialization +/// +const TextConfigurationSerialization::TypeToName TextConfigurationSerialization::type_to_name = + boost::assign::list_of + (EmbossStyle::Type::file_path, "file_name") + (EmbossStyle::Type::wx_win_font_descr, "wxFontDescriptor_Windows") + (EmbossStyle::Type::wx_lin_font_descr, "wxFontDescriptor_Linux") + (EmbossStyle::Type::wx_mac_font_descr, "wxFontDescriptor_MacOsX"); + +const TextConfigurationSerialization::HorizontalAlignToName TextConfigurationSerialization::horizontal_align_to_name = + boost::assign::list_of + (FontProp::HorizontalAlign::left, "left") + (FontProp::HorizontalAlign::center, "center") + (FontProp::HorizontalAlign::right, "right"); + +const TextConfigurationSerialization::VerticalAlignToName TextConfigurationSerialization::vertical_align_to_name = + boost::assign::list_of + (FontProp::VerticalAlign::top, "top") + (FontProp::VerticalAlign::center, "middle") + (FontProp::VerticalAlign::bottom, "bottom"); + + +void TextConfigurationSerialization::to_xml(std::stringstream &stream, const TextConfiguration &tc) +{ + stream << " <" << TEXT_TAG << " "; + + stream << TEXT_DATA_ATTR << "=\"" << xml_escape_double_quotes_attribute_value(tc.text) << "\" "; + // font item + const EmbossStyle &style = tc.style; + stream << STYLE_NAME_ATTR << "=\"" << xml_escape_double_quotes_attribute_value(style.name) << "\" "; + stream << FONT_DESCRIPTOR_ATTR << "=\"" << xml_escape_double_quotes_attribute_value(style.path) << "\" "; + constexpr std::string_view dafault_type{"undefined"}; + std::string_view style_type = bimap_cvt(type_to_name, style.type, dafault_type); + stream << FONT_DESCRIPTOR_TYPE_ATTR << "=\"" << style_type << "\" "; + + // font property + const FontProp &fp = tc.style.prop; + if (fp.char_gap.has_value()) + stream << CHAR_GAP_ATTR << "=\"" << *fp.char_gap << "\" "; + if (fp.line_gap.has_value()) + stream << LINE_GAP_ATTR << "=\"" << *fp.line_gap << "\" "; + + stream << LINE_HEIGHT_ATTR << "=\"" << fp.size_in_mm << "\" "; + if (fp.boldness.has_value()) + stream << BOLDNESS_ATTR << "=\"" << *fp.boldness << "\" "; + if (fp.skew.has_value()) + stream << SKEW_ATTR << "=\"" << *fp.skew << "\" "; + if (fp.per_glyph) + stream << PER_GLYPH_ATTR << "=\"" << 1 << "\" "; + stream << HORIZONTAL_ALIGN_ATTR << "=\"" << bimap_cvt(horizontal_align_to_name, fp.align.first, dafault_type) << "\" "; + stream << VERTICAL_ALIGN_ATTR << "=\"" << bimap_cvt(vertical_align_to_name, fp.align.second, dafault_type) << "\" "; + if (fp.collection_number.has_value()) + stream << COLLECTION_NUMBER_ATTR << "=\"" << *fp.collection_number << "\" "; + // font descriptor + if (fp.family.has_value()) + stream << FONT_FAMILY_ATTR << "=\"" << *fp.family << "\" "; + if (fp.face_name.has_value()) + stream << FONT_FACE_NAME_ATTR << "=\"" << *fp.face_name << "\" "; + if (fp.style.has_value()) + stream << FONT_STYLE_ATTR << "=\"" << *fp.style << "\" "; + if (fp.weight.has_value()) + stream << FONT_WEIGHT_ATTR << "=\"" << *fp.weight << "\" "; + + stream << "/>\n"; // end TEXT_TAG +} +namespace { + +FontProp::HorizontalAlign read_horizontal_align(const char **attributes, unsigned int num_attributes, const TextConfigurationSerialization::HorizontalAlignToName& horizontal_align_to_name){ + std::string horizontal_align_str = bbs_get_attribute_value_string(attributes, num_attributes, HORIZONTAL_ALIGN_ATTR); + + // Back compatibility + // PS 2.6.0 do not have align + if (horizontal_align_str.empty()) + return FontProp::HorizontalAlign::center; + + // Back compatibility + // PS 2.6.1 store indices(0|1|2) instead of text for align + if (horizontal_align_str.length() == 1) { + int horizontal_align_int = 0; + if(boost::spirit::qi::parse(horizontal_align_str.c_str(), horizontal_align_str.c_str() + 1, boost::spirit::qi::int_, horizontal_align_int)) + return static_cast(horizontal_align_int); + } + + return bimap_cvt(horizontal_align_to_name, std::string_view(horizontal_align_str), FontProp::HorizontalAlign::center); +} + + +FontProp::VerticalAlign read_vertical_align(const char **attributes, unsigned int num_attributes, const TextConfigurationSerialization::VerticalAlignToName& vertical_align_to_name){ + std::string vertical_align_str = bbs_get_attribute_value_string(attributes, num_attributes, VERTICAL_ALIGN_ATTR); + + // Back compatibility + // PS 2.6.0 do not have align + if (vertical_align_str.empty()) + return FontProp::VerticalAlign::center; + + // Back compatibility + // PS 2.6.1 store indices(0|1|2) instead of text for align + if (vertical_align_str.length() == 1) { + int vertical_align_int = 0; + if(boost::spirit::qi::parse(vertical_align_str.c_str(), vertical_align_str.c_str() + 1, boost::spirit::qi::int_, vertical_align_int)) + return static_cast(vertical_align_int); + } + + return bimap_cvt(vertical_align_to_name, std::string_view(vertical_align_str), FontProp::VerticalAlign::center); +} + +} // namespace + +std::optional TextConfigurationSerialization::read(const char **attributes, unsigned int num_attributes) +{ + FontProp fp; + int char_gap = bbs_get_attribute_value_int(attributes, num_attributes, CHAR_GAP_ATTR); + if (char_gap != 0) fp.char_gap = char_gap; + int line_gap = bbs_get_attribute_value_int(attributes, num_attributes, LINE_GAP_ATTR); + if (line_gap != 0) fp.line_gap = line_gap; + float boldness = bbs_get_attribute_value_float(attributes, num_attributes, BOLDNESS_ATTR); + if (std::fabs(boldness) > std::numeric_limits::epsilon()) + fp.boldness = boldness; + float skew = bbs_get_attribute_value_float(attributes, num_attributes, SKEW_ATTR); + if (std::fabs(skew) > std::numeric_limits::epsilon()) + fp.skew = skew; + int per_glyph = bbs_get_attribute_value_int(attributes, num_attributes, PER_GLYPH_ATTR); + if (per_glyph == 1) fp.per_glyph = true; + + fp.align = FontProp::Align( + read_horizontal_align(attributes, num_attributes, horizontal_align_to_name), + read_vertical_align(attributes, num_attributes, vertical_align_to_name)); + + int collection_number = bbs_get_attribute_value_int(attributes, num_attributes, COLLECTION_NUMBER_ATTR); + if (collection_number > 0) fp.collection_number = static_cast(collection_number); + + fp.size_in_mm = bbs_get_attribute_value_float(attributes, num_attributes, LINE_HEIGHT_ATTR); + + std::string family = bbs_get_attribute_value_string(attributes, num_attributes, FONT_FAMILY_ATTR); + if (!family.empty()) fp.family = family; + std::string face_name = bbs_get_attribute_value_string(attributes, num_attributes, FONT_FACE_NAME_ATTR); + if (!face_name.empty()) fp.face_name = face_name; + std::string style = bbs_get_attribute_value_string(attributes, num_attributes, FONT_STYLE_ATTR); + if (!style.empty()) fp.style = style; + std::string weight = bbs_get_attribute_value_string(attributes, num_attributes, FONT_WEIGHT_ATTR); + if (!weight.empty()) fp.weight = weight; + + std::string style_name = bbs_get_attribute_value_string(attributes, num_attributes, STYLE_NAME_ATTR); + std::string font_descriptor = bbs_get_attribute_value_string(attributes, num_attributes, FONT_DESCRIPTOR_ATTR); + std::string type_str = bbs_get_attribute_value_string(attributes, num_attributes, FONT_DESCRIPTOR_TYPE_ATTR); + EmbossStyle::Type type = bimap_cvt(type_to_name, std::string_view{type_str}, EmbossStyle::Type::undefined); + + std::string text = bbs_get_attribute_value_string(attributes, num_attributes, TEXT_DATA_ATTR); + EmbossStyle es{style_name, std::move(font_descriptor), type, std::move(fp)}; + return TextConfiguration{std::move(es), std::move(text)}; +} + +EmbossShape TextConfigurationSerialization::read_old(const char **attributes, unsigned int num_attributes) +{ + EmbossShape es; + std::string fix_tr_mat_str = bbs_get_attribute_value_string(attributes, num_attributes, TRANSFORM_ATTR); + if (!fix_tr_mat_str.empty()) + es.fix_3mf_tr = bbs_get_transform_from_3mf_specs_string(fix_tr_mat_str); + + + if (bbs_get_attribute_value_int(attributes, num_attributes, USE_SURFACE_ATTR) == 1) + es.projection.use_surface = true; + + es.projection.depth = bbs_get_attribute_value_float(attributes, num_attributes, DEPTH_ATTR); + + int use_surface = bbs_get_attribute_value_int(attributes, num_attributes, USE_SURFACE_ATTR); + if (use_surface == 1) + es.projection.use_surface = true; + + return es; +} + +namespace { +Transform3d create_fix(const std::optional &prev, const ModelVolume &volume) +{ + // IMPROVE: check if volume was modified (translated, rotated OR scaled) + // when no change do not calculate transformation only store original fix matrix + + // Create transformation used after load actual stored volume + // Orca: do not bake volume transformation into meshes + // const Transform3d &actual_trmat = volume.get_matrix(); + const Transform3d& actual_trmat = Transform3d::Identity(); + + const auto &vertices = volume.mesh().its.vertices; + Vec3d min = actual_trmat * vertices.front().cast(); + Vec3d max = min; + for (const Vec3f &v : vertices) { + Vec3d vd = actual_trmat * v.cast(); + for (size_t i = 0; i < 3; ++i) { + if (min[i] > vd[i]) + min[i] = vd[i]; + if (max[i] < vd[i]) + max[i] = vd[i]; + } + } + Vec3d center = (max + min) / 2; + Transform3d post_trmat = Transform3d::Identity(); + post_trmat.translate(center); + + Transform3d fix_trmat = actual_trmat.inverse() * post_trmat; + if (!prev.has_value()) + return fix_trmat; + + // check whether fix somehow differ previous + if (fix_trmat.isApprox(Transform3d::Identity(), 1e-5)) + return *prev; + + return *prev * fix_trmat; +} + +bool to_xml(std::stringstream &stream, const EmbossShape::SvgFile &svg, const ModelVolume &volume, mz_zip_archive &archive){ + if (svg.path_in_3mf.empty()) + return true; // EmbossedText OR unwanted store .svg file into .3mf (protection of copyRight) + + if (!svg.path.empty()) + stream << SVG_FILE_PATH_ATTR << "=\"" << xml_escape_double_quotes_attribute_value(svg.path) << "\" "; + stream << SVG_FILE_PATH_IN_3MF_ATTR << "=\"" << xml_escape_double_quotes_attribute_value(svg.path_in_3mf) << "\" "; + + std::shared_ptr file_data = svg.file_data; + assert(file_data != nullptr); + if (file_data == nullptr && !svg.path.empty()) + file_data = read_from_disk(svg.path); + if (file_data == nullptr) { + BOOST_LOG_TRIVIAL(warning) << "Can't write svg file no filedata"; + return false; + } + const std::string &file_data_str = *file_data; + + return mz_zip_writer_add_mem(&archive, svg.path_in_3mf.c_str(), + (const void *) file_data_str.c_str(), file_data_str.size(), MZ_DEFAULT_COMPRESSION); +} + +} // namespace + +void to_xml(std::stringstream &stream, const EmbossShape &es, const ModelVolume &volume, mz_zip_archive &archive) +{ + stream << " <" << SHAPE_TAG << " "; + if (es.svg_file.has_value()) + if(!to_xml(stream, *es.svg_file, volume, archive)) + BOOST_LOG_TRIVIAL(warning) << "Can't write svg file defiden embossed shape into 3mf"; + + stream << SHAPE_SCALE_ATTR << "=\"" << es.scale << "\" "; + + if (!es.final_shape.is_healed) + stream << UNHEALED_ATTR << "=\"" << 1 << "\" "; + + // projection + const EmbossProjection &p = es.projection; + stream << DEPTH_ATTR << "=\"" << p.depth << "\" "; + if (p.use_surface) + stream << USE_SURFACE_ATTR << "=\"" << 1 << "\" "; + + // FIX of baked transformation + Transform3d fix = create_fix(es.fix_3mf_tr, volume); + stream << TRANSFORM_ATTR << "=\""; + _BBS_3MF_Exporter::add_transformation(stream, fix); + stream << "\" "; + + stream << "/>\n"; // end SHAPE_TAG +} + +std::optional read_emboss_shape(const char **attributes, unsigned int num_attributes) { + double scale = bbs_get_attribute_value_float(attributes, num_attributes, SHAPE_SCALE_ATTR); + int unhealed = bbs_get_attribute_value_int(attributes, num_attributes, UNHEALED_ATTR); + bool is_healed = unhealed != 1; + + EmbossProjection projection; + projection.depth = bbs_get_attribute_value_float(attributes, num_attributes, DEPTH_ATTR); + if (is_approx(projection.depth, 0.)) + projection.depth = 10.; + + int use_surface = bbs_get_attribute_value_int(attributes, num_attributes, USE_SURFACE_ATTR); + if (use_surface == 1) + projection.use_surface = true; + + std::optional fix_tr_mat; + std::string fix_tr_mat_str = bbs_get_attribute_value_string(attributes, num_attributes, TRANSFORM_ATTR); + if (!fix_tr_mat_str.empty()) { + fix_tr_mat = bbs_get_transform_from_3mf_specs_string(fix_tr_mat_str); + } + + std::string file_path = bbs_get_attribute_value_string(attributes, num_attributes, SVG_FILE_PATH_ATTR); + std::string file_path_3mf = bbs_get_attribute_value_string(attributes, num_attributes, SVG_FILE_PATH_IN_3MF_ATTR); + + // MayBe: store also shapes to not store svg + // But be carefull curve will be lost -> scale will not change sampling + // shapes could be loaded from SVG + ExPolygonsWithIds shapes; + // final shape could be calculated from shapes + HealedExPolygons final_shape; + final_shape.is_healed = is_healed; + + EmbossShape::SvgFile svg{file_path, file_path_3mf}; + return EmbossShape{std::move(shapes), std::move(final_shape), scale, std::move(projection), std::move(fix_tr_mat), std::move(svg)}; +} + + } // namespace Slic3r diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 6b0c6f632d..8c0e8bb4f5 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -295,7 +295,65 @@ static std::vector get_path_of_change_filament(const Print& print) : gcodegen.config().nozzle_temperature.get_at(gcodegen.writer().extruder()->id()); } - std::string Wipe::wipe(GCode& gcodegen, bool toolchange, bool is_last) + // Ioannis Giannakas: + // Function to calculate the excess retraction length that should be retracted either before or after wiping + // in order for the wipe operation to respect the filament retraction speed + Wipe::RetractionValues Wipe::calculateWipeRetractionLengths(GCode& gcodegen, bool toolchange) { + auto& writer = gcodegen.writer(); + auto& config = gcodegen.config(); + auto extruder = writer.extruder(); + auto extruder_id = extruder->id(); + auto last_pos = gcodegen.last_pos(); + + // Declare & initialize retraction lengths + double retraction_length_remaining = 0, + retractionBeforeWipe = 0, + retractionDuringWipe = 0; + + // initialise the remaining retraction amount with the full retraction amount. + retraction_length_remaining = toolchange ? extruder->retract_length_toolchange() : extruder->retraction_length(); + + // nothing to retract - return early + if(retraction_length_remaining <=EPSILON) return {0.f,0.f}; + + // calculate retraction before wipe distance from the user setting. Keep adding to this variable any excess retraction needed + // to be performed before the wipe. + retractionBeforeWipe = retraction_length_remaining * extruder->retract_before_wipe(); + retraction_length_remaining -= retractionBeforeWipe; // subtract it from the remaining retraction length + + // all of the retraction is to be done before the wipe + if(retraction_length_remaining <=EPSILON) return {retractionBeforeWipe,0.f}; + + // Calculate wipe speed + double wipe_speed = config.role_based_wipe_speed ? writer.get_current_speed() / 60.0 : config.get_abs_value("wipe_speed"); + wipe_speed = std::max(wipe_speed, 10.0); + + // Process wipe path & calculate wipe path length + double wipe_dist = scale_(config.wipe_distance.get_at(extruder_id)); + Polyline wipe_path = {last_pos}; + wipe_path.append(this->path.points.begin() + 1, this->path.points.end()); + double wipe_path_length = std::min(wipe_path.length(), wipe_dist); + + // Calculate the maximum retraction amount during wipe + retractionDuringWipe = config.retraction_speed.get_at(extruder_id) * unscale_(wipe_path_length) / wipe_speed; + // If the maximum retraction amount during wipe is too small, return 0 and retract everything prior to the wipe. + if(retractionDuringWipe <= EPSILON) return {retractionBeforeWipe,0.f}; + + // If the maximum retraction amount during wipe is greater than any remaining retraction length + // return the remaining retraction length to be retracted during the wipe + if (retractionDuringWipe - retraction_length_remaining > EPSILON) return {retractionBeforeWipe,retraction_length_remaining}; + + // If the user has requested any retract before wipe, proceed with incrementing the retraction amount before wiping with the difference + // and return the maximum allowed wipe amount to be retracted during the wipe move + // If the user has not requested any retract before wipe, the retraction amount before wiping should not be incremented and left to the parent + // function to retract after wipe is done. + if(gcodegen.config().retract_before_wipe.get_at(gcodegen.writer().extruder()->id()) > EPSILON){ + retractionBeforeWipe += retraction_length_remaining - retractionDuringWipe; + } + return {retractionBeforeWipe, retractionDuringWipe}; + } + + std::string Wipe::wipe(GCode& gcodegen,double length, bool toolchange, bool is_last) { std::string gcode; @@ -307,12 +365,6 @@ static std::vector get_path_of_change_filament(const Print& print) if(_wipe_speed < 10) _wipe_speed = 10; - // get the retraction length - double length = toolchange - ? gcodegen.writer().extruder()->retract_length_toolchange() - : gcodegen.writer().extruder()->retraction_length(); - // Shorten the retraction length by the amount already retracted before wipe. - length *= (1. - gcodegen.writer().extruder()->retract_before_wipe()); //SoftFever: allow 100% retract before wipe if (length >= 0) @@ -322,7 +374,7 @@ static std::vector get_path_of_change_filament(const Print& print) for the time needed to consume retraction_length at retraction_speed? */ // BBS double wipe_dist = scale_(gcodegen.config().wipe_distance.get_at(gcodegen.writer().extruder()->id())); - + /* Take the stored wipe path and replace first point with the current actual position (they might be different, for example, in case of loop clipping). */ Polyline wipe_path; @@ -346,7 +398,7 @@ static std::vector get_path_of_change_filament(const Print& print) // add tag for processor gcode += ";" + GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Wipe_Start) + "\n"; //BBS: don't need to enable cooling makers when this is the last wipe. Because no more cooling layer will clean this "_WIPE" - //Softfever: + //Softfever: std::string cooling_mark = ""; if (gcodegen.enable_cooling_markers() && !is_last) cooling_mark = /*gcodegen.config().role_based_wipe_speed ? ";_EXTERNAL_PERIMETER" : */";_WIPE"; @@ -1998,12 +2050,15 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato print.config().nozzle_temperature_initial_layer.get_at(0)); file.write("; CONFIG_BLOCK_END\n\n"); } else { - if (m_gcode_thumbnail_format != GCodeThumbnailsFormat::BTT_TFT) + if (m_gcode_thumbnail_format != GCodeThumbnailsFormat::BTT_TFT) { + auto thumbnaim_fmt = m_gcode_thumbnail_format; + // Orca: if the thumbnail format is ColPic, we write PNG in the beginning of gcode file and ColPic in the end of gcode file. + if(m_gcode_thumbnail_format == GCodeThumbnailsFormat::ColPic) + thumbnaim_fmt = GCodeThumbnailsFormat::PNG; GCodeThumbnails::export_thumbnails_to_file( thumbnail_cb, print.get_plate_index(), print.full_print_config().option("thumbnails")->values, - m_gcode_thumbnail_format, - [&file](const char *sz) { file.write(sz); }, - [&print]() { print.throw_if_canceled(); }); + thumbnaim_fmt, [&file](const char* sz) { file.write(sz); }, [&print]() { print.throw_if_canceled(); }); + } } } @@ -2029,7 +2084,7 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato file.write_format("; EXECUTABLE_BLOCK_START\n"); // SoftFever - if( m_config.gcode_flavor.value == gcfKlipper && m_enable_exclude_object) + if( m_enable_exclude_object) file.write(set_object_info(&print)); // adds tags for time estimators @@ -2228,12 +2283,12 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato pts->values.emplace_back(print.translate_to_print_space(pt)); bbox = BoundingBoxf((pts->values)); } - + BoundingBoxf bbox_head_wrap_zone (print.config().head_wrap_detect_zone.values); this->placeholder_parser().set("first_layer_print_convex_hull", pts.release()); this->placeholder_parser().set("first_layer_print_min", new ConfigOptionFloats({bbox.min.x(), bbox.min.y()})); this->placeholder_parser().set("first_layer_print_max", new ConfigOptionFloats({bbox.max.x(), bbox.max.y()})); this->placeholder_parser().set("first_layer_print_size", new ConfigOptionFloats({ bbox.size().x(), bbox.size().y() })); - + this->placeholder_parser().set("in_head_wrap_detect_zone",bbox_head_wrap_zone.overlap(bbox)); // get center without wipe tower BoundingBoxf bbox_wo_wt; // bounding box without wipe tower for (auto &objPtr : print.objects()) { @@ -2241,7 +2296,7 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato bbox_wo_wt.merge(unscaled(objPtr->get_first_layer_bbox(data.area, data.layer_height, data.name))); } auto center = bbox_wo_wt.center(); - this->placeholder_parser().set("first_layer_center_no_wipe_tower", new ConfigOptionFloats({center.x(), center.y()})); + this->placeholder_parser().set("first_layer_center_no_wipe_tower", new ConfigOptionFloats{ {center.x(),center.y()}}); } bool activate_chamber_temp_control = false; auto max_chamber_temp = 0; @@ -2268,7 +2323,7 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato this->placeholder_parser().set("first_layer_bed_temperature", new ConfigOptionInts(*first_bed_temp_opt)); this->placeholder_parser().set("first_layer_temperature", new ConfigOptionInts(m_config.nozzle_temperature_initial_layer)); this->placeholder_parser().set("max_print_height",new ConfigOptionInt(m_config.printable_height)); -this->placeholder_parser().set("z_offset", new ConfigOptionFloat(m_config.z_offset)); + this->placeholder_parser().set("z_offset", new ConfigOptionFloat(m_config.z_offset)); this->placeholder_parser().set("plate_name", new ConfigOptionString(print.get_plate_name())); this->placeholder_parser().set("first_layer_height", new ConfigOptionFloat(m_config.initial_layer_print_height.value)); @@ -2279,14 +2334,14 @@ this->placeholder_parser().set("z_offset", new ConfigOptionFloat(m_config.z_offs during_print_exhaust_fan_speed_num.emplace_back((int)(item / 100.0 * 255)); this->placeholder_parser().set("during_print_exhaust_fan_speed_num",new ConfigOptionInts(during_print_exhaust_fan_speed_num)); - // calculate the volumetric speed of outer wall. Ignore pre-object setting and multi-filament, and just use the default setting + // calculate the volumetric speed of outer wall. Ignore per-object setting and multi-filament, and just use the default setting { float filament_max_volumetric_speed = m_config.option("filament_max_volumetric_speed")->get_at(initial_non_support_extruder_id); const double nozzle_diameter = m_config.nozzle_diameter.get_at(initial_non_support_extruder_id); - float outer_wall_line_width = this->config().get_abs_value("outer_wall_line_width", nozzle_diameter); + float outer_wall_line_width = print.default_region_config().get_abs_value("outer_wall_line_width", nozzle_diameter); if (outer_wall_line_width == 0.0) { - float default_line_width = this->config().get_abs_value("line_width", nozzle_diameter); + float default_line_width = print.default_object_config().get_abs_value("line_width", nozzle_diameter); outer_wall_line_width = default_line_width == 0.0 ? nozzle_diameter : default_line_width; } Flow outer_wall_flow = Flow(outer_wall_line_width, m_config.layer_height, m_config.nozzle_diameter.get_at(initial_non_support_extruder_id)); @@ -2297,6 +2352,9 @@ this->placeholder_parser().set("z_offset", new ConfigOptionFloat(m_config.z_offs this->placeholder_parser().set("outer_wall_volumetric_speed", new ConfigOptionFloat(outer_wall_volumetric_speed)); } + if (print.calib_params().mode == CalibMode::Calib_PA_Line) { + this->placeholder_parser().set("scan_first_layer", new ConfigOptionBool(false)); + } } std::string machine_start_gcode = this->placeholder_parser_process("machine_start_gcode", print.config().machine_start_gcode.value, initial_extruder_id); if (print.config().gcode_flavor != gcfKlipper) { @@ -2392,12 +2450,12 @@ this->placeholder_parser().set("z_offset", new ConfigOptionFloat(m_config.z_offs // SoftFever: calib if (print.calib_params().mode == CalibMode::Calib_PA_Line) { std::string gcode; - if ((m_config.default_acceleration.value > 0 && m_config.outer_wall_acceleration.value > 0)) { - gcode += m_writer.set_print_acceleration((unsigned int)floor(m_config.outer_wall_acceleration.value + 0.5)); + if ((print.default_object_config().outer_wall_acceleration.value > 0 && print.default_object_config().outer_wall_acceleration.value > 0)) { + gcode += m_writer.set_print_acceleration((unsigned int)floor(print.default_object_config().outer_wall_acceleration.value + 0.5)); } - if (m_config.default_jerk.value > 0) { - double jerk = m_config.outer_wall_jerk.value; + if (print.default_object_config().outer_wall_jerk.value > 0) { + double jerk = print.default_object_config().outer_wall_jerk.value; gcode += m_writer.set_jerk_xy(jerk); } @@ -2410,8 +2468,7 @@ this->placeholder_parser().set("z_offset", new ConfigOptionFloat(m_config.z_offs pa_test.set_speed(fast_speed, slow_speed); pa_test.draw_numbers() = print.calib_params().print_numbers; - - gcode += pa_test.generate_test(params.start, params.step, std::llround(std::ceil((params.end - params.start) / params.step))); + gcode += pa_test.generate_test(params.start, params.step, std::llround(std::ceil((params.end - params.start) / params.step)) + 1); file.write(gcode); } else { @@ -2647,6 +2704,11 @@ this->placeholder_parser().set("z_offset", new ConfigOptionFloat(m_config.z_offs GCodeProcessor::ETags::Estimated_Printing_Time_Placeholder) .c_str()); file.write("\n"); + if (m_gcode_thumbnail_format == GCodeThumbnailsFormat::ColPic) + GCodeThumbnails::export_thumbnails_to_file( + thumbnail_cb, print.get_plate_index(), print.full_print_config().option("thumbnails")->values, + m_gcode_thumbnail_format, [&file](const char* sz) { file.write(sz); }, [&print]() { print.throw_if_canceled(); }); + file.write("; CONFIG_BLOCK_START\n"); std::string full_config; append_full_config(print, full_config); @@ -2720,14 +2782,19 @@ void GCode::process_layers( return this->process_layer(print, layer.second, layer_tools, &layer == &layers_to_print.back(), &print_object_instances_ordering, size_t(-1)); } }); - + if (m_spiral_vase) { + float nozzle_diameter = EXTRUDER_CONFIG(nozzle_diameter); + float max_xy_smoothing = m_config.get_abs_value("spiral_mode_max_xy_smoothing", nozzle_diameter); + this->m_spiral_vase->set_max_xy_smoothing(max_xy_smoothing); + } const auto spiral_mode = tbb::make_filter(slic3r_tbb_filtermode::serial_in_order, - [&spiral_mode = *this->m_spiral_vase.get()](LayerResult in) -> LayerResult { + [&spiral_mode = *this->m_spiral_vase.get(), &layers_to_print](LayerResult in) -> LayerResult { if (in.nop_layer_result) return in; spiral_mode.enable(in.spiral_vase_enable); - return { spiral_mode.process_layer(std::move(in.gcode)), in.layer_id, in.spiral_vase_enable, in.cooling_buffer_flush }; + bool last_layer = in.layer_id == layers_to_print.size() - 1; + return { spiral_mode.process_layer(std::move(in.gcode), last_layer), in.layer_id, in.spiral_vase_enable, in.cooling_buffer_flush}; }); const auto pressure_equalizer = tbb::make_filter(slic3r_tbb_filtermode::serial_in_order, [pressure_equalizer = this->m_pressure_equalizer.get()](LayerResult in) -> LayerResult { @@ -2802,10 +2869,16 @@ void GCode::process_layers( return this->process_layer(print, { std::move(layer) }, tool_ordering.tools_for_layer(layer.print_z()), &layer == &layers_to_print.back(), nullptr, single_object_idx, prime_extruder); } }); + if (m_spiral_vase) { + float nozzle_diameter = EXTRUDER_CONFIG(nozzle_diameter); + float max_xy_smoothing = m_config.get_abs_value("spiral_mode_max_xy_smoothing", nozzle_diameter); + this->m_spiral_vase->set_max_xy_smoothing(max_xy_smoothing); + } const auto spiral_mode = tbb::make_filter(slic3r_tbb_filtermode::serial_in_order, - [&spiral_mode = *this->m_spiral_vase.get()](LayerResult in)->LayerResult { + [&spiral_mode = *this->m_spiral_vase.get(), &layers_to_print](LayerResult in)->LayerResult { spiral_mode.enable(in.spiral_vase_enable); - return { spiral_mode.process_layer(std::move(in.gcode)), in.layer_id, in.spiral_vase_enable, in.cooling_buffer_flush }; + bool last_layer = in.layer_id == layers_to_print.size() - 1; + return { spiral_mode.process_layer(std::move(in.gcode), last_layer), in.layer_id, in.spiral_vase_enable, in.cooling_buffer_flush }; }); const auto cooling = tbb::make_filter(slic3r_tbb_filtermode::serial_in_order, [&cooling_buffer = *this->m_cooling_buffer.get()](LayerResult in)->std::string { @@ -3966,10 +4039,16 @@ LayerResult GCode::process_layer( std::string("; start printing object, unique label id: ") + std::to_string(instance_to_print.label_object_id) + "\n" + "M624 " + _encode_label_ids_to_base64({instance_to_print.label_object_id}) + "\n"); - } else if (print.config().gcode_flavor.value == gcfKlipper) { - m_writer.set_object_start_str(std::string("EXCLUDE_OBJECT_START NAME=") + - get_instance_name(&instance_to_print.print_object, inst.id) + - "\n"); + } else { + const auto gflavor = print.config().gcode_flavor.value; + if (gflavor == gcfKlipper) { + m_writer.set_object_start_str(std::string("EXCLUDE_OBJECT_START NAME=") + + get_instance_name(&instance_to_print.print_object, inst.id) + "\n"); + } + else if (gflavor == gcfMarlinLegacy || gflavor == gcfMarlinFirmware || gflavor == gcfRepRapFirmware) { + std::string str = std::string("M486 S") + std::to_string(inst.unique_id) + "\n"; + m_writer.set_object_start_str(str); + } } } @@ -4117,9 +4196,14 @@ LayerResult GCode::process_layer( m_writer.set_object_end_str(std::string("; stop printing object, unique label id: ") + std::to_string(instance_to_print.label_object_id) + "\n" + "M625\n"); - } else if (print.config().gcode_flavor.value == gcfKlipper) { - m_writer.set_object_end_str(std::string("EXCLUDE_OBJECT_END NAME=") + - get_instance_name(&instance_to_print.print_object, inst.id) + "\n"); + } else { + const auto gflavor = print.config().gcode_flavor.value; + if (gflavor == gcfKlipper) { + m_writer.set_object_end_str(std::string("EXCLUDE_OBJECT_END NAME=") + + get_instance_name(&instance_to_print.print_object, inst.id) + "\n"); + } else if (gflavor == gcfMarlinLegacy || gflavor == gcfMarlinFirmware || gflavor == gcfRepRapFirmware) { + m_writer.set_object_end_str(std::string("M486 S-1\n")); + } } } } @@ -4715,6 +4799,8 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description, _mm3_per_mm *= m_config.top_solid_infill_flow_ratio; else if (path.role() == erBottomSurface) _mm3_per_mm *= m_config.bottom_solid_infill_flow_ratio; + else if (path.role() == erInternalBridgeInfill) + _mm3_per_mm *= m_config.internal_bridge_flow; double e_per_mm = m_writer.extruder()->e_per_mm3() * _mm3_per_mm; @@ -4818,68 +4904,68 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description, if (m_config.enable_overhang_speed && !m_config.overhang_speed_classic && !this->on_first_layer() && (is_bridge(path.role()) || is_perimeter(path.role()))) { - - double out_wall_ref_speed = m_config.get_abs_value("outer_wall_speed"); - ConfigOptionPercents overhang_overlap_levels({75, 50, 25, 13, 12.99, 0}); + bool is_external = is_external_perimeter(path.role()); + double ref_speed = is_external ? m_config.get_abs_value("outer_wall_speed") : m_config.get_abs_value("inner_wall_speed"); + ConfigOptionPercents overhang_overlap_levels({75, 50, 25, 13, 12.99, 0}); if (m_config.slowdown_for_curled_perimeters){ ConfigOptionFloatsOrPercents dynamic_overhang_speeds( - {(m_config.get_abs_value("overhang_1_4_speed") < 0.5) ? + {(m_config.get_abs_value("overhang_1_4_speed", ref_speed) < 0.5) ? FloatOrPercent{100, true} : - FloatOrPercent{m_config.get_abs_value("overhang_1_4_speed") * 100 / out_wall_ref_speed, true}, - (m_config.get_abs_value("overhang_2_4_speed") < 0.5) ? + FloatOrPercent{m_config.get_abs_value("overhang_1_4_speed", ref_speed) * 100 / ref_speed, true}, + (m_config.get_abs_value("overhang_2_4_speed", ref_speed) < 0.5) ? FloatOrPercent{100, true} : - FloatOrPercent{m_config.get_abs_value("overhang_2_4_speed") * 100 / out_wall_ref_speed, true}, - (m_config.get_abs_value("overhang_3_4_speed") < 0.5) ? + FloatOrPercent{m_config.get_abs_value("overhang_2_4_speed", ref_speed) * 100 / ref_speed, true}, + (m_config.get_abs_value("overhang_3_4_speed", ref_speed) < 0.5) ? FloatOrPercent{100, true} : - FloatOrPercent{m_config.get_abs_value("overhang_3_4_speed") * 100 / out_wall_ref_speed, true}, - (m_config.get_abs_value("overhang_4_4_speed") < 0.5) ? + FloatOrPercent{m_config.get_abs_value("overhang_3_4_speed", ref_speed) * 100 / ref_speed, true}, + (m_config.get_abs_value("overhang_4_4_speed", ref_speed) < 0.5) ? FloatOrPercent{100, true} : - FloatOrPercent{m_config.get_abs_value("overhang_4_4_speed") * 100 / out_wall_ref_speed, true}, - (m_config.get_abs_value("overhang_4_4_speed") < 0.5) ? + FloatOrPercent{m_config.get_abs_value("overhang_4_4_speed", ref_speed) * 100 / ref_speed, true}, + (m_config.get_abs_value("overhang_4_4_speed", ref_speed) < 0.5) ? FloatOrPercent{100, true} : - FloatOrPercent{m_config.get_abs_value("overhang_4_4_speed") * 100 / out_wall_ref_speed, true}, - (m_config.get_abs_value("overhang_4_4_speed") < 0.5) ? + FloatOrPercent{m_config.get_abs_value("overhang_4_4_speed", ref_speed) * 100 / ref_speed, true}, + (m_config.get_abs_value("overhang_4_4_speed", ref_speed) < 0.5) ? FloatOrPercent{100, true} : - FloatOrPercent{m_config.get_abs_value("overhang_4_4_speed") * 100 / out_wall_ref_speed, true}}); - if (out_wall_ref_speed == 0) - out_wall_ref_speed = EXTRUDER_CONFIG(filament_max_volumetric_speed) / _mm3_per_mm; + FloatOrPercent{m_config.get_abs_value("overhang_4_4_speed", ref_speed) * 100 / ref_speed, true}}); + if (ref_speed == 0) + ref_speed = EXTRUDER_CONFIG(filament_max_volumetric_speed) / _mm3_per_mm; if (EXTRUDER_CONFIG(filament_max_volumetric_speed) > 0) { - out_wall_ref_speed = std::min(out_wall_ref_speed, EXTRUDER_CONFIG(filament_max_volumetric_speed) / path.mm3_per_mm); + ref_speed = std::min(ref_speed, EXTRUDER_CONFIG(filament_max_volumetric_speed) / path.mm3_per_mm); } new_points = m_extrusion_quality_estimator.estimate_extrusion_quality(path, overhang_overlap_levels, dynamic_overhang_speeds, - out_wall_ref_speed, speed, m_config.slowdown_for_curled_perimeters); + ref_speed, speed, m_config.slowdown_for_curled_perimeters); }else{ ConfigOptionFloatsOrPercents dynamic_overhang_speeds( - {(m_config.get_abs_value("overhang_1_4_speed") < 0.5) ? + {(m_config.get_abs_value("overhang_1_4_speed", ref_speed) < 0.5) ? FloatOrPercent{100, true} : - FloatOrPercent{m_config.get_abs_value("overhang_1_4_speed") * 100 / out_wall_ref_speed, true}, - (m_config.get_abs_value("overhang_2_4_speed") < 0.5) ? + FloatOrPercent{m_config.get_abs_value("overhang_1_4_speed", ref_speed) * 100 / ref_speed, true}, + (m_config.get_abs_value("overhang_2_4_speed", ref_speed) < 0.5) ? FloatOrPercent{100, true} : - FloatOrPercent{m_config.get_abs_value("overhang_2_4_speed") * 100 / out_wall_ref_speed, true}, - (m_config.get_abs_value("overhang_3_4_speed") < 0.5) ? + FloatOrPercent{m_config.get_abs_value("overhang_2_4_speed", ref_speed) * 100 / ref_speed, true}, + (m_config.get_abs_value("overhang_3_4_speed", ref_speed) < 0.5) ? FloatOrPercent{100, true} : - FloatOrPercent{m_config.get_abs_value("overhang_3_4_speed") * 100 / out_wall_ref_speed, true}, - (m_config.get_abs_value("overhang_4_4_speed") < 0.5) ? + FloatOrPercent{m_config.get_abs_value("overhang_3_4_speed", ref_speed) * 100 / ref_speed, true}, + (m_config.get_abs_value("overhang_4_4_speed", ref_speed) < 0.5) ? FloatOrPercent{100, true} : - FloatOrPercent{m_config.get_abs_value("overhang_4_4_speed") * 100 / out_wall_ref_speed, true}, - FloatOrPercent{m_config.get_abs_value("bridge_speed") * 100 / out_wall_ref_speed, true}, - FloatOrPercent{m_config.get_abs_value("bridge_speed") * 100 / out_wall_ref_speed, true}}); + FloatOrPercent{m_config.get_abs_value("overhang_4_4_speed", ref_speed) * 100 / ref_speed, true}, + FloatOrPercent{m_config.get_abs_value("bridge_speed") * 100 / ref_speed, true}, + FloatOrPercent{m_config.get_abs_value("bridge_speed") * 100 / ref_speed, true}}); - if (out_wall_ref_speed == 0) - out_wall_ref_speed = EXTRUDER_CONFIG(filament_max_volumetric_speed) / _mm3_per_mm; + if (ref_speed == 0) + ref_speed = EXTRUDER_CONFIG(filament_max_volumetric_speed) / _mm3_per_mm; if (EXTRUDER_CONFIG(filament_max_volumetric_speed) > 0) { - out_wall_ref_speed = std::min(out_wall_ref_speed, EXTRUDER_CONFIG(filament_max_volumetric_speed) / path.mm3_per_mm); + ref_speed = std::min(ref_speed, EXTRUDER_CONFIG(filament_max_volumetric_speed) / path.mm3_per_mm); } new_points = m_extrusion_quality_estimator.estimate_extrusion_quality(path, overhang_overlap_levels, dynamic_overhang_speeds, - out_wall_ref_speed, speed, m_config.slowdown_for_curled_perimeters); + ref_speed, speed, m_config.slowdown_for_curled_perimeters); } - variable_speed = std::any_of(new_points.begin(), new_points.end(), [speed](const ProcessedPoint &p) { return p.speed != speed; }); - + variable_speed = std::any_of(new_points.begin(), new_points.end(), + [speed](const ProcessedPoint &p) { return fabs(double(p.speed) - speed) > EPSILON; }); } double F = speed * 60; // convert mm/sec to mm/min @@ -5454,8 +5540,9 @@ std::string GCode::retract(bool toolchange, bool is_last_retraction, LiftType li // wipe (if it's enabled for this extruder and we have a stored wipe path and no-zero wipe distance) if (EXTRUDER_CONFIG(wipe) && m_wipe.has_path() && scale_(EXTRUDER_CONFIG(wipe_distance)) > SCALED_EPSILON) { - gcode += toolchange ? m_writer.retract_for_toolchange(true) : m_writer.retract(true); - gcode += m_wipe.wipe(*this, toolchange, is_last_retraction); + Wipe::RetractionValues wipeRetractions = m_wipe.calculateWipeRetractionLengths(*this, toolchange); + gcode += toolchange ? m_writer.retract_for_toolchange(true,wipeRetractions.retractLengthBeforeWipe) : m_writer.retract(true, wipeRetractions.retractLengthBeforeWipe); + gcode += m_wipe.wipe(*this,wipeRetractions.retractLengthDuringWipe, toolchange, is_last_retraction); } /* The parent class will decide whether we need to perform an actual retraction @@ -5730,6 +5817,9 @@ inline std::string polygon_to_string(const Polygon &polygon, Print *print, bool // this function iterator PrintObject and assign a seqential id to each object. // this id is used to generate unique object id for each object. std::string GCode::set_object_info(Print *print) { + const auto gflavor = print->config().gcode_flavor.value; + if (gflavor != gcfKlipper && gflavor != gcfMarlinLegacy && gflavor != gcfMarlinFirmware && gflavor != gcfRepRapFirmware) + return ""; std::ostringstream gcode; size_t object_id = 0; // Orca: check if we are in pa calib mode @@ -5745,18 +5835,27 @@ std::string GCode::set_object_info(Print *print) { << "Orca-PA-Calibration-Test" << " CENTER=" << 0 << "," << 0 << " POLYGON=" << polygon_to_string(polygon_bed, print, true) << "\n"; } else { - for (PrintObject *object : print->objects()) { + size_t unique_id = 0; + for (PrintObject* object : print->objects()) { object->set_id(object_id++); size_t inst_id = 0; - for (PrintInstance &inst : object->instances()) { - inst.id = inst_id++; - if (this->config().exclude_object && print->config().gcode_flavor.value == gcfKlipper) { - auto bbox = inst.get_bounding_box(); - auto center = print->translate_to_print_space(Vec2d(bbox.center().x(), bbox.center().y())); - - gcode << "EXCLUDE_OBJECT_DEFINE NAME=" << get_instance_name(object, inst) - << " CENTER=" << center.x() << "," << center.y() + for (PrintInstance& inst : object->instances()) { + inst.unique_id = unique_id++; + inst.id = inst_id++; + auto bbox = inst.get_bounding_box(); + auto center = print->translate_to_print_space(Vec2d(bbox.center().x(), bbox.center().y())); + auto inst_name = get_instance_name(object, inst); + if (gflavor == gcfKlipper) { + gcode << "EXCLUDE_OBJECT_DEFINE NAME=" << inst_name << " CENTER=" << center.x() << "," << center.y() << " POLYGON=" << polygon_to_string(inst.get_convex_hull_2d(), print) << "\n"; + } else if (gflavor == gcfMarlinLegacy || gflavor == gcfMarlinFirmware || gflavor == gcfRepRapFirmware) { + gcode << "M486 S" << std::to_string(inst.unique_id); + if (gflavor == gcfRepRapFirmware) + gcode << " A" + << "\"" << inst_name << "\""; + else + gcode << "\nM486 A" << inst_name; + gcode << "\nM486 S-1\n"; } } } diff --git a/src/libslic3r/GCode.hpp b/src/libslic3r/GCode.hpp index 708df1c5f1..481a005d55 100644 --- a/src/libslic3r/GCode.hpp +++ b/src/libslic3r/GCode.hpp @@ -55,11 +55,16 @@ class Wipe { public: bool enable; Polyline path; + struct RetractionValues{ + double retractLengthBeforeWipe; + double retractLengthDuringWipe; + }; Wipe() : enable(false) {} bool has_path() const { return !this->path.points.empty(); } void reset_path() { this->path = Polyline(); } - std::string wipe(GCode &gcodegen, bool toolchange = false, bool is_last = false); + std::string wipe(GCode &gcodegen, double length, bool toolchange = false, bool is_last = false); + RetractionValues calculateWipeRetractionLengths(GCode& gcodegen, bool toolchange); }; class WipeTowerIntegration { diff --git a/src/libslic3r/GCode/CoolingBuffer.cpp b/src/libslic3r/GCode/CoolingBuffer.cpp index edb5b67915..812e71f714 100644 --- a/src/libslic3r/GCode/CoolingBuffer.cpp +++ b/src/libslic3r/GCode/CoolingBuffer.cpp @@ -736,8 +736,8 @@ std::string CoolingBuffer::apply_layer_cooldown( int supp_interface_fan_speed = 0; auto change_extruder_set_fan = [ this, layer_id, layer_time, &new_gcode, &overhang_fan_control, &overhang_fan_speed, &supp_interface_fan_control, &supp_interface_fan_speed](bool immediately_apply) { #define EXTRUDER_CONFIG(OPT) m_config.OPT.get_at(m_current_extruder) - int fan_min_speed = EXTRUDER_CONFIG(fan_min_speed); - int fan_speed_new = EXTRUDER_CONFIG(reduce_fan_stop_start_freq) ? fan_min_speed : 0; + float fan_min_speed = EXTRUDER_CONFIG(fan_min_speed); + float fan_speed_new = EXTRUDER_CONFIG(reduce_fan_stop_start_freq) ? fan_min_speed : 0; //BBS int additional_fan_speed_new = EXTRUDER_CONFIG(additional_cooling_fan_speed); int close_fan_the_first_x_layers = EXTRUDER_CONFIG(close_fan_the_first_x_layers); @@ -751,7 +751,7 @@ std::string CoolingBuffer::apply_layer_cooldown( close_fan_the_first_x_layers = 1; } if (int(layer_id) >= close_fan_the_first_x_layers) { - int fan_max_speed = EXTRUDER_CONFIG(fan_max_speed); + float fan_max_speed = EXTRUDER_CONFIG(fan_max_speed); float slow_down_layer_time = float(EXTRUDER_CONFIG(slow_down_layer_time)); float fan_cooling_layer_time = float(EXTRUDER_CONFIG(fan_cooling_layer_time)); //BBS: always enable the fan speed interpolation according to layer time diff --git a/src/libslic3r/GCode/ExtrusionProcessor.hpp b/src/libslic3r/GCode/ExtrusionProcessor.hpp index 08a0694e3e..c6c1c102de 100644 --- a/src/libslic3r/GCode/ExtrusionProcessor.hpp +++ b/src/libslic3r/GCode/ExtrusionProcessor.hpp @@ -27,125 +27,81 @@ namespace Slic3r { -class SlidingWindowCurvatureAccumulator -{ - float window_size; - float total_distance = 0; // accumulated distance - float total_curvature = 0; // accumulated signed ccw angles - deque distances; - deque angles; - -public: - SlidingWindowCurvatureAccumulator(float window_size) : window_size(window_size) {} - - void add_point(float distance, float angle) - { - total_distance += distance; - total_curvature += angle; - distances.push_back(distance); - angles.push_back(angle); - - while (distances.size() > 1 && total_distance > window_size) { - total_distance -= distances.front(); - total_curvature -= angles.front(); - distances.pop_front(); - angles.pop_front(); - } - } - - float get_curvature() const - { - return total_curvature / window_size; - } - - void reset() - { - total_curvature = 0; - total_distance = 0; - distances.clear(); - angles.clear(); - } -}; - -class CurvatureEstimator -{ - static const size_t sliders_count = 3; - SlidingWindowCurvatureAccumulator sliders[sliders_count] = {{3.0},{9.0}, {16.0}}; - -public: - void add_point(float distance, float angle) - { - if (distance < EPSILON) - return; - for (SlidingWindowCurvatureAccumulator &slider : sliders) { - slider.add_point(distance, angle); - } - } - float get_curvature() - { - float max_curvature = 0.0f; - for (const SlidingWindowCurvatureAccumulator &slider : sliders) { - if (abs(slider.get_curvature()) > abs(max_curvature)) { - max_curvature = slider.get_curvature(); - } - } - return max_curvature; - } - void reset() - { - for (SlidingWindowCurvatureAccumulator &slider : sliders) { - slider.reset(); - } - } -}; - struct ExtendedPoint { - ExtendedPoint(Vec2d position, float distance = 0.0, size_t nearest_prev_layer_line = size_t(-1), float curvature = 0.0) - : position(position), distance(distance), nearest_prev_layer_line(nearest_prev_layer_line), curvature(curvature) - {} - - Vec2d position; - float distance; - size_t nearest_prev_layer_line; - float curvature; + Vec2d position; + float distance; + float curvature; }; -template -std::vector estimate_points_properties(const std::vector

&input_points, +template +std::vector estimate_points_properties(const POINTS &input_points, const AABBTreeLines::LinesDistancer &unscaled_prev_layer, float flow_width, float max_line_length = -1.0f) { + bool looped = input_points.front() == input_points.back(); + std::function get_prev_index = [](size_t idx, size_t count) { + if (idx > 0) { + return idx - 1; + } else + return idx; + }; + if (looped) { + get_prev_index = [](size_t idx, size_t count) { + if (idx == 0) + idx = count; + return --idx; + }; + }; + std::function get_next_index = [](size_t idx, size_t size) { + if (idx + 1 < size) { + return idx + 1; + } else + return idx; + }; + if (looped) { + get_next_index = [](size_t idx, size_t count) { + if (++idx == count) + idx = 0; + return idx; + }; + }; + + using P = typename POINTS::value_type; + using AABBScalar = typename AABBTreeLines::LinesDistancer::Scalar; if (input_points.empty()) return {}; - float boundary_offset = PREV_LAYER_BOUNDARY_OFFSET ? 0.5 * flow_width : 0.0f; - CurvatureEstimator cestim; - auto maybe_unscale = [](const P &p) { return SCALED_INPUT ? unscaled(p) : p.template cast(); }; + float boundary_offset = PREV_LAYER_BOUNDARY_OFFSET ? 0.5 * flow_width : 0.0f; + auto maybe_unscale = [](const P &p) { return SCALED_INPUT ? unscaled(p) : p.template cast(); }; std::vector points; points.reserve(input_points.size() * (ADD_INTERSECTIONS ? 1.5 : 1)); { ExtendedPoint start_point{maybe_unscale(input_points.front())}; - auto [distance, nearest_line, x] = unscaled_prev_layer.template distance_from_lines_extra(start_point.position.cast()); - start_point.distance = distance + boundary_offset; - start_point.nearest_prev_layer_line = nearest_line; + auto [distance, nearest_line, + x] = unscaled_prev_layer.template distance_from_lines_extra(start_point.position.cast()); + start_point.distance = distance + boundary_offset; points.push_back(start_point); } for (size_t i = 1; i < input_points.size(); i++) { ExtendedPoint next_point{maybe_unscale(input_points[i])}; - auto [distance, nearest_line, x] = unscaled_prev_layer.template distance_from_lines_extra(next_point.position.cast()); - next_point.distance = distance + boundary_offset; - next_point.nearest_prev_layer_line = nearest_line; + auto [distance, nearest_line, + x] = unscaled_prev_layer.template distance_from_lines_extra(next_point.position.cast()); + next_point.distance = distance + boundary_offset; if (ADD_INTERSECTIONS && ((points.back().distance > boundary_offset + EPSILON) != (next_point.distance > boundary_offset + EPSILON))) { - const ExtendedPoint &prev_point = points.back(); - auto intersections = unscaled_prev_layer.template intersections_with_line(L{prev_point.position.cast(), next_point.position.cast()}); + const ExtendedPoint &prev_point = points.back(); + auto intersections = unscaled_prev_layer.template intersections_with_line( + L{prev_point.position.cast(), next_point.position.cast()}); for (const auto &intersection : intersections) { - points.emplace_back(intersection.first.template cast(), boundary_offset, intersection.second); + ExtendedPoint p{}; + p.position = intersection.first.template cast(); + p.distance = boundary_offset; + points.push_back(p); } } points.push_back(next_point); @@ -153,41 +109,49 @@ std::vector estimate_points_properties(const std::vector

if (PREV_LAYER_BOUNDARY_OFFSET && ADD_INTERSECTIONS) { std::vector new_points; - new_points.reserve(points.size()*2); + new_points.reserve(points.size() * 2); new_points.push_back(points.front()); for (int point_idx = 0; point_idx < int(points.size()) - 1; ++point_idx) { const ExtendedPoint &curr = points[point_idx]; const ExtendedPoint &next = points[point_idx + 1]; - if ((curr.distance > 0 && curr.distance < boundary_offset + 2.0f) || - (next.distance > 0 && next.distance < boundary_offset + 2.0f)) { + if ((curr.distance > -boundary_offset && curr.distance < boundary_offset + 2.0f) || + (next.distance > -boundary_offset && next.distance < boundary_offset + 2.0f)) { double line_len = (next.position - curr.position).norm(); if (line_len > 4.0f) { - double a0 = std::clamp((curr.distance + 2 * boundary_offset) / line_len, 0.0, 1.0); - double a1 = std::clamp(1.0f - (next.distance + 2 * boundary_offset) / line_len, 0.0, 1.0); + double a0 = std::clamp((curr.distance + 3 * boundary_offset) / line_len, 0.0, 1.0); + double a1 = std::clamp(1.0f - (next.distance + 3 * boundary_offset) / line_len, 0.0, 1.0); double t0 = std::min(a0, a1); double t1 = std::max(a0, a1); if (t0 < 1.0) { - auto p0 = curr.position + t0 * (next.position - curr.position); - auto [p0_dist, p0_near_l, p0_x] = unscaled_prev_layer.template distance_from_lines_extra(p0.cast()); - new_points.push_back(ExtendedPoint{p0, float(p0_dist + boundary_offset), p0_near_l}); + auto p0 = curr.position + t0 * (next.position - curr.position); + auto [p0_dist, p0_near_l, + p0_x] = unscaled_prev_layer.template distance_from_lines_extra(p0.cast()); + ExtendedPoint new_p{}; + new_p.position = p0; + new_p.distance = float(p0_dist + boundary_offset); + new_points.push_back(new_p); } if (t1 > 0.0) { - auto p1 = curr.position + t1 * (next.position - curr.position); - auto [p1_dist, p1_near_l, p1_x] = unscaled_prev_layer.template distance_from_lines_extra(p1.cast()); - new_points.push_back(ExtendedPoint{p1, float(p1_dist + boundary_offset), p1_near_l}); + auto p1 = curr.position + t1 * (next.position - curr.position); + auto [p1_dist, p1_near_l, + p1_x] = unscaled_prev_layer.template distance_from_lines_extra(p1.cast()); + ExtendedPoint new_p{}; + new_p.position = p1; + new_p.distance = float(p1_dist + boundary_offset); + new_points.push_back(new_p); } } } new_points.push_back(next); } - points = new_points; + points = std::move(new_points); } if (max_line_length > 0) { std::vector new_points; - new_points.reserve(points.size()*2); + new_points.reserve(points.size() * 2); { for (size_t i = 0; i + 1 < points.size(); i++) { const ExtendedPoint &curr = points[i]; @@ -200,39 +164,79 @@ std::vector estimate_points_properties(const std::vector

Vec2d pos = curr.position * (1.0 - j * t) + next.position * (j * t); auto [p_dist, p_near_l, p_x] = unscaled_prev_layer.template distance_from_lines_extra(pos.cast()); - new_points.push_back(ExtendedPoint{pos, float(p_dist + boundary_offset), p_near_l}); + ExtendedPoint new_p{}; + new_p.position = pos; + new_p.distance = float(p_dist + boundary_offset); + new_points.push_back(new_p); } } new_points.push_back(points.back()); } - points = new_points; + points = std::move(new_points); } - for (int point_idx = 0; point_idx < int(points.size()); ++point_idx) { - ExtendedPoint &a = points[point_idx]; - ExtendedPoint &prev = points[point_idx > 0 ? point_idx - 1 : point_idx]; + float accumulated_distance = 0; + std::vector distances_for_curvature(points.size()); + for (size_t point_idx = 0; point_idx < points.size(); ++point_idx) { + const ExtendedPoint &a = points[point_idx]; + const ExtendedPoint &b = points[get_prev_index(point_idx, points.size())]; - int prev_point_idx = point_idx; - while (prev_point_idx > 0) { - prev_point_idx--; - if ((a.position - points[prev_point_idx].position).squaredNorm() > EPSILON) { break; } - } - - int next_point_index = point_idx; - while (next_point_index < int(points.size()) - 1) { - next_point_index++; - if ((a.position - points[next_point_index].position).squaredNorm() > EPSILON) { break; } - } - - if (prev_point_idx != point_idx && next_point_index != point_idx) { - float distance = (prev.position - a.position).norm(); - float alfa = angle(a.position - points[prev_point_idx].position, points[next_point_index].position - a.position); - cestim.add_point(distance, alfa); - } - - a.curvature = cestim.get_curvature(); + distances_for_curvature[point_idx] = (b.position - a.position).norm(); + accumulated_distance += distances_for_curvature[point_idx]; } + if (accumulated_distance > EPSILON) + for (float window_size : {3.0f, 9.0f, 16.0f}) { + for (int point_idx = 0; point_idx < int(points.size()); ++point_idx) { + ExtendedPoint ¤t = points[point_idx]; + + Vec2d back_position = current.position; + { + size_t back_point_index = point_idx; + float dist_backwards = 0; + while (dist_backwards < window_size * 0.5 && back_point_index != get_prev_index(back_point_index, points.size())) { + float line_dist = distances_for_curvature[get_prev_index(back_point_index, points.size())]; + if (dist_backwards + line_dist > window_size * 0.5) { + back_position = points[back_point_index].position + + (window_size * 0.5 - dist_backwards) * + (points[get_prev_index(back_point_index, points.size())].position - + points[back_point_index].position) + .normalized(); + dist_backwards += window_size * 0.5 - dist_backwards + EPSILON; + } else { + dist_backwards += line_dist; + back_point_index = get_prev_index(back_point_index, points.size()); + } + } + } + + Vec2d front_position = current.position; + { + size_t front_point_index = point_idx; + float dist_forwards = 0; + while (dist_forwards < window_size * 0.5 && front_point_index != get_next_index(front_point_index, points.size())) { + float line_dist = distances_for_curvature[front_point_index]; + if (dist_forwards + line_dist > window_size * 0.5) { + front_position = points[front_point_index].position + + (window_size * 0.5 - dist_forwards) * + (points[get_next_index(front_point_index, points.size())].position - + points[front_point_index].position) + .normalized(); + dist_forwards += window_size * 0.5 - dist_forwards + EPSILON; + } else { + dist_forwards += line_dist; + front_point_index = get_next_index(front_point_index, points.size()); + } + } + } + + float new_curvature = angle(current.position - back_position, front_position - current.position) / window_size; + if (abs(current.curvature) < abs(new_curvature)) { + current.curvature = new_curvature; + } + } + } + return points; } @@ -377,11 +381,11 @@ public: float extrusion_speed = std::min(calculate_speed(curr.distance), calculate_speed(next.distance)); if(slowdown_for_curled_edges) { - float curled_speed = calculate_speed(artificial_distance_to_curled_lines); + float curled_speed = calculate_speed(artificial_distance_to_curled_lines); extrusion_speed = std::min(curled_speed, extrusion_speed); // adjust extrusion speed based on what is smallest - the calculated overhang speed or the artificial curled speed } - float overlap = std::min(1 - curr.distance * width_inv, 1 - next.distance * width_inv); + float overlap = std::min(1 - (curr.distance+artificial_distance_to_curled_lines) * width_inv, 1 - (next.distance+artificial_distance_to_curled_lines) * width_inv); processed_points.push_back({ scaled(curr.position), extrusion_speed, overlap }); } diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp index 88d4fb189e..71e5148240 100644 --- a/src/libslic3r/GCode/GCodeProcessor.cpp +++ b/src/libslic3r/GCode/GCodeProcessor.cpp @@ -403,6 +403,8 @@ void GCodeProcessor::TimeProcessor::post_process(const std::string& filename, st if (in.f == nullptr) throw Slic3r::RuntimeError(std::string("Time estimator post process export failed.\nCannot open file for reading.\n")); + const bool disable_m73 = this->disable_m73; + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(": before process %1%")%filename.c_str(); // temporary file to contain modified gcode std::string out_path = filename + ".postprocess"; @@ -473,7 +475,7 @@ void GCodeProcessor::TimeProcessor::post_process(const std::string& filename, st // replace placeholder lines with the proper final value // gcode_line is in/out parameter, to reduce expensive memory allocation auto process_placeholders = [&](std::string& gcode_line) { - unsigned int extra_lines_count = 0; + int extra_lines_count = 0; // remove trailing '\n' auto line = std::string_view(gcode_line).substr(0, gcode_line.length() - 1); @@ -482,6 +484,12 @@ void GCodeProcessor::TimeProcessor::post_process(const std::string& filename, st if (line.length() > 1) { line = line.substr(1); if (line == reserved_tag(ETags::First_Line_M73_Placeholder) || line == reserved_tag(ETags::Last_Line_M73_Placeholder)) { + if (disable_m73) { + // Remove current line + gcode_line = ""; + return std::tuple(true, -1); + } + for (size_t i = 0; i < static_cast(PrintEstimatedStatistics::ETimeMode::Count); ++i) { const TimeMachine& machine = machines[i]; if (machine.enabled) { @@ -679,9 +687,10 @@ void GCodeProcessor::TimeProcessor::post_process(const std::string& filename, st gcode_line += '\n'; // replace placeholder lines auto [processed, lines_added_count] = process_placeholders(gcode_line); - if (processed && lines_added_count > 0) + if (processed && lines_added_count != 0) offsets.push_back({ line_id, lines_added_count }); - if (! processed && ! is_temporary_decoration(gcode_line) && + + if (!disable_m73 && !processed &&!is_temporary_decoration(gcode_line) && (GCodeReader::GCodeLine::cmd_is(gcode_line, "G1") || GCodeReader::GCodeLine::cmd_is(gcode_line, "G2") || GCodeReader::GCodeLine::cmd_is(gcode_line, "G3"))) { @@ -691,6 +700,12 @@ void GCodeProcessor::TimeProcessor::post_process(const std::string& filename, st offsets.push_back({ line_id, extra_lines_count }); } + if (disable_m73 && !processed && GCodeReader::GCodeLine::cmd_is(gcode_line, "M73")) { + // Remove any existing M73 command + gcode_line = ""; + offsets.push_back({line_id, -1}); + } + export_line += gcode_line; if (export_line.length() > 65535) write_string(export_line); @@ -1041,6 +1056,8 @@ void GCodeProcessor::apply_config(const PrintConfig& config) DEFAULT_TRAVEL_ACCELERATION; } + m_time_processor.disable_m73 = config.disable_m73; + const ConfigOptionFloat* initial_layer_print_height = config.option("initial_layer_print_height"); if (initial_layer_print_height != nullptr) m_first_layer_height = std::abs(initial_layer_print_height->value); diff --git a/src/libslic3r/GCode/GCodeProcessor.hpp b/src/libslic3r/GCode/GCodeProcessor.hpp index f831b5c26f..98e618d6ce 100644 --- a/src/libslic3r/GCode/GCodeProcessor.hpp +++ b/src/libslic3r/GCode/GCodeProcessor.hpp @@ -478,6 +478,7 @@ namespace Slic3r { // Additional load / unload times for a filament exchange sequence. float filament_load_times; float filament_unload_times; + bool disable_m73; std::array(PrintEstimatedStatistics::ETimeMode::Count)> machines; diff --git a/src/libslic3r/GCode/SeamPlacer.cpp b/src/libslic3r/GCode/SeamPlacer.cpp index 7d8bdf3e80..cf5b9c5080 100644 --- a/src/libslic3r/GCode/SeamPlacer.cpp +++ b/src/libslic3r/GCode/SeamPlacer.cpp @@ -1,5 +1,7 @@ #include "SeamPlacer.hpp" +#include "Polygon.hpp" +#include "PrintConfig.hpp" #include "tbb/parallel_for.h" #include "tbb/blocked_range.h" #include "tbb/parallel_reduce.h" @@ -33,958 +35,1059 @@ namespace Slic3r { namespace SeamPlacerImpl { -// ************ FOR BACKPORT COMPATIBILITY ONLY *************** -// Color mapping of a value into RGB false colors. -inline Vec3f value_to_rgbf(float minimum, float maximum, float value) -{ - float ratio = 2.0f * (value - minimum) / (maximum - minimum); - float b = std::max(0.0f, (1.0f - ratio)); - float r = std::max(0.0f, (ratio - 1.0f)); - float g = 1.0f - b - r; - return Vec3f{r, g, b}; +template int sgn(T val) { + return int(T(0) < val) - int(val < T(0)); } -// Color mapping of a value into RGB false colors. -inline Vec3i value_to_rgbi(float minimum, float maximum, float value) { return (value_to_rgbf(minimum, maximum, value) * 255).cast(); } -// *************************** - -template int sgn(T val) { return int(T(0) < val) - int(val < T(0)); } - // base function: ((e^(((1)/(x^(2)+1)))-1)/(e-1)) // checkout e.g. here: https://www.geogebra.org/calculator -float gauss(float value, float mean_x_coord, float mean_value, float falloff_speed) -{ - float shifted = value - mean_x_coord; - float denominator = falloff_speed * shifted * shifted + 1.0f; - float exponent = 1.0f / denominator; - return mean_value * (std::exp(exponent) - 1.0f) / (std::exp(1.0f) - 1.0f); +float gauss(float value, float mean_x_coord, float mean_value, float falloff_speed) { + float shifted = value - mean_x_coord; + float denominator = falloff_speed * shifted * shifted + 1.0f; + float exponent = 1.0f / denominator; + return mean_value * (std::exp(exponent) - 1.0f) / (std::exp(1.0f) - 1.0f); } -float compute_angle_penalty(float ccw_angle) -{ - // This function is used: - // ((ℯ^(((1)/(x^(2)*3+1)))-1)/(ℯ-1))*1+((1)/(2+ℯ^(-x))) - // looks scary, but it is gaussian combined with sigmoid, - // so that concave points have much smaller penalty over convex ones - // https://github.com/prusa3d/PrusaSlicer/tree/master/doc/seam_placement/corner_penalty_function.png - return gauss(ccw_angle, 0.0f, 1.0f, 3.0f) + 1.0f / (2 + std::exp(-ccw_angle)); +float compute_angle_penalty(float ccw_angle) { + // This function is used: + // ((ℯ^(((1)/(x^(2)*3+1)))-1)/(ℯ-1))*1+((1)/(2+ℯ^(-x))) + // looks scary, but it is gaussian combined with sigmoid, + // so that concave points have much smaller penalty over convex ones + // https://github.com/prusa3d/PrusaSlicer/tree/master/doc/seam_placement/corner_penalty_function.png + return gauss(ccw_angle, 0.0f, 1.0f, 3.0f) + + 1.0f / (2 + std::exp(-ccw_angle)); } /// Coordinate frame -class Frame -{ +class Frame { public: - Frame() - { - mX = Vec3f(1, 0, 0); - mY = Vec3f(0, 1, 0); - mZ = Vec3f(0, 0, 1); - } + Frame() { + mX = Vec3f(1, 0, 0); + mY = Vec3f(0, 1, 0); + mZ = Vec3f(0, 0, 1); + } - Frame(const Vec3f &x, const Vec3f &y, const Vec3f &z) : mX(x), mY(y), mZ(z) {} + Frame(const Vec3f &x, const Vec3f &y, const Vec3f &z) : + mX(x), mY(y), mZ(z) { + } - void set_from_z(const Vec3f &z) - { - mZ = z.normalized(); - Vec3f tmpZ = mZ; - Vec3f tmpX = (std::abs(tmpZ.x()) > 0.99f) ? Vec3f(0, 1, 0) : Vec3f(1, 0, 0); - mY = (tmpZ.cross(tmpX)).normalized(); - mX = mY.cross(tmpZ); - } + void set_from_z(const Vec3f &z) { + mZ = z.normalized(); + Vec3f tmpZ = mZ; + Vec3f tmpX = (std::abs(tmpZ.x()) > 0.99f) ? Vec3f(0, 1, 0) : Vec3f(1, 0, 0); + mY = (tmpZ.cross(tmpX)).normalized(); + mX = mY.cross(tmpZ); + } - Vec3f to_world(const Vec3f &a) const { return a.x() * mX + a.y() * mY + a.z() * mZ; } + Vec3f to_world(const Vec3f &a) const { + return a.x() * mX + a.y() * mY + a.z() * mZ; + } - Vec3f to_local(const Vec3f &a) const { return Vec3f(mX.dot(a), mY.dot(a), mZ.dot(a)); } + Vec3f to_local(const Vec3f &a) const { + return Vec3f(mX.dot(a), mY.dot(a), mZ.dot(a)); + } - const Vec3f &binormal() const { return mX; } + const Vec3f& binormal() const { + return mX; + } - const Vec3f &tangent() const { return mY; } + const Vec3f& tangent() const { + return mY; + } - const Vec3f &normal() const { return mZ; } + const Vec3f& normal() const { + return mZ; + } private: - Vec3f mX, mY, mZ; + Vec3f mX, mY, mZ; }; -Vec3f sample_sphere_uniform(const Vec2f &samples) -{ - float term1 = 2.0f * float(PI) * samples.x(); - float term2 = 2.0f * sqrt(samples.y() - samples.y() * samples.y()); - return {cos(term1) * term2, sin(term1) * term2, 1.0f - 2.0f * samples.y()}; +Vec3f sample_sphere_uniform(const Vec2f &samples) { + float term1 = 2.0f * float(PI) * samples.x(); + float term2 = 2.0f * sqrt(samples.y() - samples.y() * samples.y()); + return {cos(term1) * term2, sin(term1) * term2, + 1.0f - 2.0f * samples.y()}; } -Vec3f sample_hemisphere_uniform(const Vec2f &samples) -{ - float term1 = 2.0f * float(PI) * samples.x(); - float term2 = 2.0f * sqrt(samples.y() - samples.y() * samples.y()); - return {cos(term1) * term2, sin(term1) * term2, abs(1.0f - 2.0f * samples.y())}; +Vec3f sample_hemisphere_uniform(const Vec2f &samples) { + float term1 = 2.0f * float(PI) * samples.x(); + float term2 = 2.0f * sqrt(samples.y() - samples.y() * samples.y()); + return {cos(term1) * term2, sin(term1) * term2, + abs(1.0f - 2.0f * samples.y())}; } -Vec3f sample_power_cosine_hemisphere(const Vec2f &samples, float power) -{ - float term1 = 2.f * float(PI) * samples.x(); - float term2 = pow(samples.y(), 1.f / (power + 1.f)); - float term3 = sqrt(1.f - term2 * term2); +Vec3f sample_power_cosine_hemisphere(const Vec2f &samples, float power) { + float term1 = 2.f * float(PI) * samples.x(); + float term2 = pow(samples.y(), 1.f / (power + 1.f)); + float term3 = sqrt(1.f - term2 * term2); - return Vec3f(cos(term1) * term3, sin(term1) * term3, term2); + return Vec3f(cos(term1) * term3, sin(term1) * term3, term2); } std::vector raycast_visibility(const AABBTreeIndirect::Tree<3, float> &raycasting_tree, - const indexed_triangle_set & triangles, - const TriangleSetSamples & samples, - size_t negative_volumes_start_index) -{ - BOOST_LOG_TRIVIAL(debug) << "SeamPlacer: raycast visibility of " << samples.positions.size() << " samples over " << triangles.indices.size() << " triangles: end"; + const indexed_triangle_set &triangles, + const TriangleSetSamples &samples, + size_t negative_volumes_start_index) { + BOOST_LOG_TRIVIAL(debug) + << "SeamPlacer: raycast visibility of " << samples.positions.size() << " samples over " << triangles.indices.size() + << " triangles: end"; - // prepare uniform samples of a hemisphere - float step_size = 1.0f / SeamPlacer::sqr_rays_per_sample_point; - std::vector precomputed_sample_directions(SeamPlacer::sqr_rays_per_sample_point * SeamPlacer::sqr_rays_per_sample_point); - for (size_t x_idx = 0; x_idx < SeamPlacer::sqr_rays_per_sample_point; ++x_idx) { - float sample_x = x_idx * step_size + step_size / 2.0; - for (size_t y_idx = 0; y_idx < SeamPlacer::sqr_rays_per_sample_point; ++y_idx) { - size_t dir_index = x_idx * SeamPlacer::sqr_rays_per_sample_point + y_idx; - float sample_y = y_idx * step_size + step_size / 2.0; - precomputed_sample_directions[dir_index] = sample_hemisphere_uniform({sample_x, sample_y}); - } + //prepare uniform samples of a hemisphere + float step_size = 1.0f / SeamPlacer::sqr_rays_per_sample_point; + std::vector precomputed_sample_directions( + SeamPlacer::sqr_rays_per_sample_point * SeamPlacer::sqr_rays_per_sample_point); + for (size_t x_idx = 0; x_idx < SeamPlacer::sqr_rays_per_sample_point; ++x_idx) { + float sample_x = x_idx * step_size + step_size / 2.0; + for (size_t y_idx = 0; y_idx < SeamPlacer::sqr_rays_per_sample_point; ++y_idx) { + size_t dir_index = x_idx * SeamPlacer::sqr_rays_per_sample_point + y_idx; + float sample_y = y_idx * step_size + step_size / 2.0; + precomputed_sample_directions[dir_index] = sample_hemisphere_uniform( { sample_x, sample_y }); } + } - bool model_contains_negative_parts = negative_volumes_start_index < triangles.indices.size(); + bool model_contains_negative_parts = negative_volumes_start_index < triangles.indices.size(); - std::vector result(samples.positions.size()); - tbb::parallel_for(tbb::blocked_range(0, result.size()), [&triangles, &precomputed_sample_directions, model_contains_negative_parts, negative_volumes_start_index, - &raycasting_tree, &result, &samples](tbb::blocked_range r) { - // Maintaining hits memory outside of the loop, so it does not have to be reallocated for each query. - std::vector hits; - for (size_t s_idx = r.begin(); s_idx < r.end(); ++s_idx) { - result[s_idx] = 1.0f; - constexpr float decrease_step = 1.0f / (SeamPlacer::sqr_rays_per_sample_point * SeamPlacer::sqr_rays_per_sample_point); + std::vector result(samples.positions.size()); + tbb::parallel_for(tbb::blocked_range(0, result.size()), + [&triangles, &precomputed_sample_directions, model_contains_negative_parts, negative_volumes_start_index, + &raycasting_tree, &result, &samples](tbb::blocked_range r) { + // Maintaining hits memory outside of the loop, so it does not have to be reallocated for each query. + std::vector hits; + for (size_t s_idx = r.begin(); s_idx < r.end(); ++s_idx) { + result[s_idx] = 1.0f; + constexpr float decrease_step = 1.0f + / (SeamPlacer::sqr_rays_per_sample_point * SeamPlacer::sqr_rays_per_sample_point); - const Vec3f ¢er = samples.positions[s_idx]; - const Vec3f &normal = samples.normals[s_idx]; - // apply the local direction via Frame struct - the local_dir is with respect to +Z being forward - Frame f; - f.set_from_z(normal); + const Vec3f ¢er = samples.positions[s_idx]; + const Vec3f &normal = samples.normals[s_idx]; + // apply the local direction via Frame struct - the local_dir is with respect to +Z being forward + Frame f; + f.set_from_z(normal); - for (const auto &dir : precomputed_sample_directions) { - Vec3f final_ray_dir = (f.to_world(dir)); - if (!model_contains_negative_parts) { - igl::Hit hitpoint; - // FIXME: This AABBTTreeIndirect query will not compile for float ray origin and - // direction. - Vec3d final_ray_dir_d = final_ray_dir.cast(); - Vec3d ray_origin_d = (center + normal * 0.01f).cast(); // start above surface. - bool hit = AABBTreeIndirect::intersect_ray_first_hit(triangles.vertices, triangles.indices, raycasting_tree, ray_origin_d, final_ray_dir_d, hitpoint); - if (hit && its_face_normal(triangles, hitpoint.id).dot(final_ray_dir) <= 0) { result[s_idx] -= decrease_step; } - } else { // TODO improve logic for order based boolean operations - consider order of volumes - bool casting_from_negative_volume = samples.triangle_indices[s_idx] >= negative_volumes_start_index; - - Vec3d ray_origin_d = (center + normal * 0.01f).cast(); // start above surface. - if (casting_from_negative_volume) { // if casting from negative volume face, invert direction, change start pos - final_ray_dir = -1.0 * final_ray_dir; - ray_origin_d = (center - normal * 0.01f).cast(); - } - Vec3d final_ray_dir_d = final_ray_dir.cast(); - bool some_hit = AABBTreeIndirect::intersect_ray_all_hits(triangles.vertices, triangles.indices, raycasting_tree, ray_origin_d, final_ray_dir_d, hits); - if (some_hit) { - int counter = 0; - // NOTE: iterating in reverse, from the last hit for one simple reason: We know the state of the ray at that point; - // It cannot be inside model, and it cannot be inside negative volume - for (int hit_index = int(hits.size()) - 1; hit_index >= 0; --hit_index) { - Vec3f face_normal = its_face_normal(triangles, hits[hit_index].id); - if (hits[hit_index].id >= int(negative_volumes_start_index)) { // negative volume hit - counter -= sgn(face_normal.dot(final_ray_dir)); // if volume face aligns with ray dir, we are leaving negative space - // which in reverse hit analysis means, that we are entering negative space :) and vice versa - } else { - counter += sgn(face_normal.dot(final_ray_dir)); + for (const auto &dir : precomputed_sample_directions) { + Vec3f final_ray_dir = (f.to_world(dir)); + if (!model_contains_negative_parts) { + igl::Hit hitpoint; + // FIXME: This AABBTTreeIndirect query will not compile for float ray origin and + // direction. + Vec3d final_ray_dir_d = final_ray_dir.cast(); + Vec3d ray_origin_d = (center + normal * 0.01f).cast(); // start above surface. + bool hit = AABBTreeIndirect::intersect_ray_first_hit(triangles.vertices, + triangles.indices, raycasting_tree, ray_origin_d, final_ray_dir_d, hitpoint); + if (hit && its_face_normal(triangles, hitpoint.id).dot(final_ray_dir) <= 0) { + result[s_idx] -= decrease_step; } + } else { //TODO improve logic for order based boolean operations - consider order of volumes + bool casting_from_negative_volume = samples.triangle_indices[s_idx] + >= negative_volumes_start_index; + + Vec3d ray_origin_d = (center + normal * 0.01f).cast(); // start above surface. + if (casting_from_negative_volume) { // if casting from negative volume face, invert direction, change start pos + final_ray_dir = -1.0 * final_ray_dir; + ray_origin_d = (center - normal * 0.01f).cast(); + } + Vec3d final_ray_dir_d = final_ray_dir.cast(); + bool some_hit = AABBTreeIndirect::intersect_ray_all_hits(triangles.vertices, + triangles.indices, raycasting_tree, + ray_origin_d, final_ray_dir_d, hits); + if (some_hit) { + int counter = 0; + // NOTE: iterating in reverse, from the last hit for one simple reason: We know the state of the ray at that point; + // It cannot be inside model, and it cannot be inside negative volume + for (int hit_index = int(hits.size()) - 1; hit_index >= 0; --hit_index) { + Vec3f face_normal = its_face_normal(triangles, hits[hit_index].id); + if (hits[hit_index].id >= int(negative_volumes_start_index)) { //negative volume hit + counter -= sgn(face_normal.dot(final_ray_dir)); // if volume face aligns with ray dir, we are leaving negative space + // which in reverse hit analysis means, that we are entering negative space :) and vice versa + } else { + counter += sgn(face_normal.dot(final_ray_dir)); + } + } + if (counter == 0) { + result[s_idx] -= decrease_step; + } + } + } } - if (counter == 0) { result[s_idx] -= decrease_step; } - } - } - } - } - }); + } + }); - BOOST_LOG_TRIVIAL(debug) << "SeamPlacer: raycast visibility of " << samples.positions.size() << " samples over " << triangles.indices.size() << " triangles: end"; + BOOST_LOG_TRIVIAL(debug) + << "SeamPlacer: raycast visibility of " << samples.positions.size() << " samples over " << triangles.indices.size() + << " triangles: end"; - return result; + return result; } -std::vector calculate_polygon_angles_at_vertices(const Polygon &polygon, const std::vector &lengths, float min_arm_length) -{ - std::vector result(polygon.size()); +std::vector calculate_polygon_angles_at_vertices(const Polygon &polygon, const std::vector &lengths, + float min_arm_length) { + std::vector result(polygon.size()); - if (polygon.size() == 1) { result[0] = 0.0f; } + if (polygon.size() == 1) { + result[0] = 0.0f; + } - size_t idx_prev = 0; - size_t idx_curr = 0; - size_t idx_next = 0; + size_t idx_prev = 0; + size_t idx_curr = 0; + size_t idx_next = 0; - float distance_to_prev = 0; - float distance_to_next = 0; + float distance_to_prev = 0; + float distance_to_next = 0; - // push idx_prev far enough back as initialization - while (distance_to_prev < min_arm_length) { - idx_prev = Slic3r::prev_idx_modulo(idx_prev, polygon.size()); - distance_to_prev += lengths[idx_prev]; + //push idx_prev far enough back as initialization + while (distance_to_prev < min_arm_length) { + idx_prev = Slic3r::prev_idx_modulo(idx_prev, polygon.size()); + distance_to_prev += lengths[idx_prev]; + } + + for (size_t _i = 0; _i < polygon.size(); ++_i) { + // pull idx_prev to current as much as possible, while respecting the min_arm_length + while (distance_to_prev - lengths[idx_prev] > min_arm_length) { + distance_to_prev -= lengths[idx_prev]; + idx_prev = Slic3r::next_idx_modulo(idx_prev, polygon.size()); } - for (size_t _i = 0; _i < polygon.size(); ++_i) { - // pull idx_prev to current as much as possible, while respecting the min_arm_length - while (distance_to_prev - lengths[idx_prev] > min_arm_length) { - distance_to_prev -= lengths[idx_prev]; - idx_prev = Slic3r::next_idx_modulo(idx_prev, polygon.size()); - } - - // push idx_next forward as far as needed - while (distance_to_next < min_arm_length) { - distance_to_next += lengths[idx_next]; - idx_next = Slic3r::next_idx_modulo(idx_next, polygon.size()); - } - - // Calculate angle between idx_prev, idx_curr, idx_next. - const Point &p0 = polygon.points[idx_prev]; - const Point &p1 = polygon.points[idx_curr]; - const Point &p2 = polygon.points[idx_next]; - result[idx_curr] = float(angle(p1 - p0, p2 - p1)); - - // increase idx_curr by one - float curr_distance = lengths[idx_curr]; - idx_curr++; - distance_to_prev += curr_distance; - distance_to_next -= curr_distance; + //push idx_next forward as far as needed + while (distance_to_next < min_arm_length) { + distance_to_next += lengths[idx_next]; + idx_next = Slic3r::next_idx_modulo(idx_next, polygon.size()); } - return result; + // Calculate angle between idx_prev, idx_curr, idx_next. + const Point &p0 = polygon.points[idx_prev]; + const Point &p1 = polygon.points[idx_curr]; + const Point &p2 = polygon.points[idx_next]; + result[idx_curr] = float(angle(p1 - p0, p2 - p1)); + + // increase idx_curr by one + float curr_distance = lengths[idx_curr]; + idx_curr++; + distance_to_prev += curr_distance; + distance_to_next -= curr_distance; + } + + return result; } -struct CoordinateFunctor -{ - const std::vector *coordinates; - CoordinateFunctor(const std::vector *coords) : coordinates(coords) {} - CoordinateFunctor() : coordinates(nullptr) {} +struct CoordinateFunctor { + const std::vector *coordinates; + CoordinateFunctor(const std::vector *coords) : + coordinates(coords) { + } + CoordinateFunctor() : + coordinates(nullptr) { + } - const float &operator()(size_t idx, size_t dim) const { return coordinates->operator[](idx)[dim]; } + const float& operator()(size_t idx, size_t dim) const { + return coordinates->operator [](idx)[dim]; + } }; // structure to store global information about the model - occlusion hits, enforcers, blockers -struct GlobalModelInfo -{ - TriangleSetSamples mesh_samples; - std::vector mesh_samples_visibility; - CoordinateFunctor mesh_samples_coordinate_functor; - KDTreeIndirect<3, float, CoordinateFunctor> mesh_samples_tree{CoordinateFunctor{}}; - float mesh_samples_radius; +struct GlobalModelInfo { + TriangleSetSamples mesh_samples; + std::vector mesh_samples_visibility; + CoordinateFunctor mesh_samples_coordinate_functor; + KDTreeIndirect<3, float, CoordinateFunctor> mesh_samples_tree { CoordinateFunctor { } }; + float mesh_samples_radius; - indexed_triangle_set enforcers; - indexed_triangle_set blockers; - AABBTreeIndirect::Tree<3, float> enforcers_tree; - AABBTreeIndirect::Tree<3, float> blockers_tree; + indexed_triangle_set enforcers; + indexed_triangle_set blockers; + AABBTreeIndirect::Tree<3, float> enforcers_tree; + AABBTreeIndirect::Tree<3, float> blockers_tree; - bool is_enforced(const Vec3f &position, float radius) const - { - if (enforcers.empty()) { return false; } - float radius_sqr = radius * radius; - return AABBTreeIndirect::is_any_triangle_in_radius(enforcers.vertices, enforcers.indices, enforcers_tree, position, radius_sqr); + bool is_enforced(const Vec3f &position, float radius) const { + if (enforcers.empty()) { + return false; + } + float radius_sqr = radius * radius; + return AABBTreeIndirect::is_any_triangle_in_radius(enforcers.vertices, enforcers.indices, + enforcers_tree, position, radius_sqr); + } + + bool is_blocked(const Vec3f &position, float radius) const { + if (blockers.empty()) { + return false; + } + float radius_sqr = radius * radius; + return AABBTreeIndirect::is_any_triangle_in_radius(blockers.vertices, blockers.indices, + blockers_tree, position, radius_sqr); + } + + float calculate_point_visibility(const Vec3f &position) const { + std::vector points = find_nearby_points(mesh_samples_tree, position, mesh_samples_radius); + if (points.empty()) { + return 1.0f; } - bool is_blocked(const Vec3f &position, float radius) const - { - if (blockers.empty()) { return false; } - float radius_sqr = radius * radius; - return AABBTreeIndirect::is_any_triangle_in_radius(blockers.vertices, blockers.indices, blockers_tree, position, radius_sqr); + auto compute_dist_to_plane = [](const Vec3f &position, const Vec3f &plane_origin, const Vec3f &plane_normal) { + Vec3f orig_to_point = position - plane_origin; + return std::abs(orig_to_point.dot(plane_normal)); + }; + + float total_weight = 0; + float total_visibility = 0; + for (size_t i = 0; i < points.size(); ++i) { + size_t sample_idx = points[i]; + + Vec3f sample_point = this->mesh_samples.positions[sample_idx]; + Vec3f sample_normal = this->mesh_samples.normals[sample_idx]; + + float weight = mesh_samples_radius - compute_dist_to_plane(position, sample_point, sample_normal); + weight += (mesh_samples_radius - (position - sample_point).norm()); + total_visibility += weight * mesh_samples_visibility[sample_idx]; + total_weight += weight; } - float calculate_point_visibility(const Vec3f &position) const - { - std::vector points = find_nearby_points(mesh_samples_tree, position, mesh_samples_radius); - if (points.empty()) { return 1.0f; } + return total_visibility / total_weight; - auto compute_dist_to_plane = [](const Vec3f &position, const Vec3f &plane_origin, const Vec3f &plane_normal) { - Vec3f orig_to_point = position - plane_origin; - return std::abs(orig_to_point.dot(plane_normal)); - }; - - float total_weight = 0; - float total_visibility = 0; - for (size_t i = 0; i < points.size(); ++i) { - size_t sample_idx = points[i]; - - Vec3f sample_point = this->mesh_samples.positions[sample_idx]; - Vec3f sample_normal = this->mesh_samples.normals[sample_idx]; - - float weight = mesh_samples_radius - compute_dist_to_plane(position, sample_point, sample_normal); - weight += (mesh_samples_radius - (position - sample_point).norm()); - total_visibility += weight * mesh_samples_visibility[sample_idx]; - total_weight += weight; - } - - return total_visibility / total_weight; - } + } #ifdef DEBUG_FILES - void debug_export(const indexed_triangle_set &obj_mesh) const + void debug_export(const indexed_triangle_set &obj_mesh) const { + + indexed_triangle_set divided_mesh = obj_mesh; + Slic3r::CNumericLocalesSetter locales_setter; + { - indexed_triangle_set divided_mesh = obj_mesh; - Slic3r::CNumericLocalesSetter locales_setter; + auto filename = debug_out_path("visiblity.obj"); + FILE *fp = boost::nowide::fopen(filename.c_str(), "w"); + if (fp == nullptr) { + BOOST_LOG_TRIVIAL(error) + << "stl_write_obj: Couldn't open " << filename << " for writing"; + return; + } - { - auto filename = debug_out_path("visiblity.obj"); - FILE *fp = boost::nowide::fopen(filename.c_str(), "w"); - if (fp == nullptr) { - BOOST_LOG_TRIVIAL(error) << "stl_write_obj: Couldn't open " << filename << " for writing"; - return; - } - - for (size_t i = 0; i < divided_mesh.vertices.size(); ++i) { - float visibility = calculate_point_visibility(divided_mesh.vertices[i]); - Vec3f color = value_to_rgbf(0.0f, 1.0f, visibility); - fprintf(fp, "v %f %f %f %f %f %f\n", divided_mesh.vertices[i](0), divided_mesh.vertices[i](1), divided_mesh.vertices[i](2), color(0), color(1), color(2)); - } - for (size_t i = 0; i < divided_mesh.indices.size(); ++i) - fprintf(fp, "f %d %d %d\n", divided_mesh.indices[i][0] + 1, divided_mesh.indices[i][1] + 1, divided_mesh.indices[i][2] + 1); - fclose(fp); - } - - { - auto filename = debug_out_path("visiblity_samples.obj"); - FILE *fp = boost::nowide::fopen(filename.c_str(), "w"); - if (fp == nullptr) { - BOOST_LOG_TRIVIAL(error) << "stl_write_obj: Couldn't open " << filename << " for writing"; - return; - } - - for (size_t i = 0; i < mesh_samples.positions.size(); ++i) { - float visibility = mesh_samples_visibility[i]; - Vec3f color = value_to_rgbf(0.0f, 1.0f, visibility); - fprintf(fp, "v %f %f %f %f %f %f\n", mesh_samples.positions[i](0), mesh_samples.positions[i](1), mesh_samples.positions[i](2), color(0), color(1), color(2)); - } - fclose(fp); - } + for (size_t i = 0; i < divided_mesh.vertices.size(); ++i) { + float visibility = calculate_point_visibility(divided_mesh.vertices[i]); + Vec3f color = value_to_rgbf(0.0f, 1.0f, visibility); + fprintf(fp, "v %f %f %f %f %f %f\n", + divided_mesh.vertices[i](0), divided_mesh.vertices[i](1), divided_mesh.vertices[i](2), + color(0), color(1), color(2)); + } + for (size_t i = 0; i < divided_mesh.indices.size(); ++i) + fprintf(fp, "f %d %d %d\n", divided_mesh.indices[i][0] + 1, divided_mesh.indices[i][1] + 1, + divided_mesh.indices[i][2] + 1); + fclose(fp); } + + { + auto filename = debug_out_path("visiblity_samples.obj"); + FILE *fp = boost::nowide::fopen(filename.c_str(), "w"); + if (fp == nullptr) { + BOOST_LOG_TRIVIAL(error) + << "stl_write_obj: Couldn't open " << filename << " for writing"; + return; + } + + for (size_t i = 0; i < mesh_samples.positions.size(); ++i) { + float visibility = mesh_samples_visibility[i]; + Vec3f color = value_to_rgbf(0.0f, 1.0f, visibility); + fprintf(fp, "v %f %f %f %f %f %f\n", + mesh_samples.positions[i](0), mesh_samples.positions[i](1), mesh_samples.positions[i](2), + color(0), color(1), color(2)); + } + fclose(fp); + } + + } #endif -}; +} +; -// Extract perimeter polygons of the given layer -Polygons extract_perimeter_polygons(const Layer *layer, const SeamPosition configured_seam_preference, std::vector &corresponding_regions_out) -{ - Polygons polygons; - for (const LayerRegion *layer_region : layer->regions()) { - for (const ExtrusionEntity *ex_entity : layer_region->perimeters.entities) { - if (ex_entity->is_collection()) { // collection of inner, outer, and overhang perimeters - for (const ExtrusionEntity *perimeter : static_cast(ex_entity)->entities) { - ExtrusionRole role = perimeter->role(); - if (perimeter->is_loop()) { - for (const ExtrusionPath &path : static_cast(perimeter)->paths) { - if (path.role() == ExtrusionRole::erExternalPerimeter) { role = ExtrusionRole::erExternalPerimeter; } - } - } - - if (role == ExtrusionRole::erExternalPerimeter || - (is_perimeter(role) && configured_seam_preference == spRandom)) { // for random seam alignment, extract all perimeters - Points p; - perimeter->collect_points(p); - polygons.emplace_back(std::move(p)); - corresponding_regions_out.push_back(layer_region); - } - } - if (polygons.empty()) { - Points p; - ex_entity->collect_points(p); - polygons.emplace_back(std::move(p)); - corresponding_regions_out.push_back(layer_region); - } - } else { - Points p; - ex_entity->collect_points(p); - polygons.emplace_back(std::move(p)); - corresponding_regions_out.push_back(layer_region); +//Extract perimeter polygons of the given layer +Polygons extract_perimeter_polygons(const Layer *layer, std::vector &corresponding_regions_out) { + Polygons polygons; + for (const LayerRegion *layer_region : layer->regions()) { + for (const ExtrusionEntity *ex_entity : layer_region->perimeters.entities) { + if (ex_entity->is_collection()) { //collection of inner, outer, and overhang perimeters + for (const ExtrusionEntity *perimeter : static_cast(ex_entity)->entities) { + ExtrusionRole role = perimeter->role(); + if (perimeter->is_loop()) { + for (const ExtrusionPath &path : static_cast(perimeter)->paths) { + if (path.role() == ExtrusionRole::erExternalPerimeter) { + role = ExtrusionRole::erExternalPerimeter; + } } + } + + if (role == ExtrusionRole::erExternalPerimeter) { + Points p; + perimeter->collect_points(p); + polygons.emplace_back(std::move(p)); + corresponding_regions_out.push_back(layer_region); + } } + if (polygons.empty()) { + Points p; + ex_entity->collect_points(p); + polygons.emplace_back(std::move(p)); + corresponding_regions_out.push_back(layer_region); + } + } else { + Points p; + ex_entity->collect_points(p); + polygons.emplace_back(std::move(p)); + corresponding_regions_out.push_back(layer_region); + } } + } - if (polygons.empty()) { // If there are no perimeter polygons for whatever reason (disabled perimeters .. ) insert dummy point - // it is easier than checking everywhere if the layer is not emtpy, no seam will be placed to this layer anyway - polygons.emplace_back(std::vector{Point{0, 0}}); - corresponding_regions_out.push_back(nullptr); - } + if (polygons.empty()) { // If there are no perimeter polygons for whatever reason (disabled perimeters .. ) insert dummy point + // it is easier than checking everywhere if the layer is not emtpy, no seam will be placed to this layer anyway + polygons.emplace_back(Points{ { 0, 0 } }); + corresponding_regions_out.push_back(nullptr); + } - return polygons; + return polygons; } // Insert SeamCandidates created from perimeter polygons in to the result vector. // Compute its type (Enfrocer,Blocker), angle, and position -// each SeamCandidate also contains pointer to shared Perimeter structure representing the polygon +//each SeamCandidate also contains pointer to shared Perimeter structure representing the polygon // if Custom Seam modifiers are present, oversamples the polygon if necessary to better fit user intentions -void process_perimeter_polygon( - const Polygon &orig_polygon, float z_coord, const LayerRegion *region, const GlobalModelInfo &global_model_info, PrintObjectSeamData::LayerSeams &result) -{ - if (orig_polygon.size() == 0) { return; } - Polygon polygon = orig_polygon; - bool was_clockwise = polygon.make_counter_clockwise(); - float angle_arm_len = region != nullptr ? region->flow(FlowRole::frExternalPerimeter).nozzle_diameter() : 0.5f; +void process_perimeter_polygon(const Polygon &orig_polygon, float z_coord, const LayerRegion *region, + const GlobalModelInfo &global_model_info, PrintObjectSeamData::LayerSeams &result) { + if (orig_polygon.size() == 0) { + return; + } + Polygon polygon = orig_polygon; + bool was_clockwise = polygon.make_counter_clockwise(); + float angle_arm_len = region != nullptr ? region->flow(FlowRole::frExternalPerimeter).nozzle_diameter() : 0.5f; - std::vector lengths{}; - for (size_t point_idx = 0; point_idx < polygon.size() - 1; ++point_idx) { lengths.push_back((unscale(polygon[point_idx]) - unscale(polygon[point_idx + 1])).norm()); } - lengths.push_back(std::max((unscale(polygon[0]) - unscale(polygon[polygon.size() - 1])).norm(), 0.1)); - std::vector polygon_angles = calculate_polygon_angles_at_vertices(polygon, lengths, angle_arm_len); + std::vector lengths { }; + for (size_t point_idx = 0; point_idx < polygon.size() - 1; ++point_idx) { + lengths.push_back((unscale(polygon[point_idx]) - unscale(polygon[point_idx + 1])).norm()); + } + lengths.push_back(std::max((unscale(polygon[0]) - unscale(polygon[polygon.size() - 1])).norm(), 0.1)); + std::vector polygon_angles = calculate_polygon_angles_at_vertices(polygon, lengths, + angle_arm_len); - result.perimeters.push_back({}); - Perimeter &perimeter = result.perimeters.back(); + result.perimeters.push_back( { }); + Perimeter &perimeter = result.perimeters.back(); - std::queue orig_polygon_points{}; - for (size_t index = 0; index < polygon.size(); ++index) { - Vec2f unscaled_p = unscale(polygon[index]).cast(); - orig_polygon_points.emplace(unscaled_p.x(), unscaled_p.y(), z_coord); + std::queue orig_polygon_points { }; + for (size_t index = 0; index < polygon.size(); ++index) { + Vec2f unscaled_p = unscale(polygon[index]).cast(); + orig_polygon_points.emplace(unscaled_p.x(), unscaled_p.y(), z_coord); + } + Vec3f first = orig_polygon_points.front(); + std::queue oversampled_points { }; + size_t orig_angle_index = 0; + perimeter.start_index = result.points.size(); + perimeter.flow_width = region != nullptr ? region->flow(FlowRole::frExternalPerimeter).width() : 0.0f; + bool some_point_enforced = false; + while (!orig_polygon_points.empty() || !oversampled_points.empty()) { + EnforcedBlockedSeamPoint type = EnforcedBlockedSeamPoint::Neutral; + Vec3f position; + float local_ccw_angle = 0; + bool orig_point = false; + if (!oversampled_points.empty()) { + position = oversampled_points.front(); + oversampled_points.pop(); + } else { + position = orig_polygon_points.front(); + orig_polygon_points.pop(); + local_ccw_angle = was_clockwise ? -polygon_angles[orig_angle_index] : polygon_angles[orig_angle_index]; + orig_angle_index++; + orig_point = true; } - Vec3f first = orig_polygon_points.front(); - std::queue oversampled_points{}; - size_t orig_angle_index = 0; - perimeter.start_index = result.points.size(); - perimeter.flow_width = region != nullptr ? region->flow(FlowRole::frExternalPerimeter).width() : 0.0f; - bool some_point_enforced = false; - while (!orig_polygon_points.empty() || !oversampled_points.empty()) { - EnforcedBlockedSeamPoint type = EnforcedBlockedSeamPoint::Neutral; - Vec3f position; - float local_ccw_angle = 0; - bool orig_point = false; - if (!oversampled_points.empty()) { - position = oversampled_points.front(); - oversampled_points.pop(); + + if (global_model_info.is_enforced(position, perimeter.flow_width)) { + type = EnforcedBlockedSeamPoint::Enforced; + } + + if (global_model_info.is_blocked(position, perimeter.flow_width)) { + type = EnforcedBlockedSeamPoint::Blocked; + } + some_point_enforced = some_point_enforced || type == EnforcedBlockedSeamPoint::Enforced; + + if (orig_point) { + Vec3f pos_of_next = orig_polygon_points.empty() ? first : orig_polygon_points.front(); + float distance_to_next = (position - pos_of_next).norm(); + if (global_model_info.is_enforced(position, distance_to_next)) { + Vec3f vec_to_next = (pos_of_next - position).normalized(); + float step_size = SeamPlacer::enforcer_oversampling_distance; + float step = step_size; + while (step < distance_to_next) { + oversampled_points.push(position + vec_to_next * step); + step += step_size; + } + } + } + + result.points.emplace_back(position, perimeter, local_ccw_angle, type); + } + + perimeter.end_index = result.points.size(); + + if (some_point_enforced) { + // We will patches of enforced points (patch: continuous section of enforced points), choose + // the longest patch, and select the middle point or sharp point (depending on the angle) + // this point will have high priority on this perimeter + size_t perimeter_size = perimeter.end_index - perimeter.start_index; + const auto next_index = [&](size_t idx) { + return perimeter.start_index + Slic3r::next_idx_modulo(idx - perimeter.start_index, perimeter_size); + }; + + std::vector patches_starts_ends; + for (size_t i = perimeter.start_index; i < perimeter.end_index; ++i) { + if (result.points[i].type != EnforcedBlockedSeamPoint::Enforced && + result.points[next_index(i)].type == EnforcedBlockedSeamPoint::Enforced) { + patches_starts_ends.push_back(next_index(i)); + } + if (result.points[i].type == EnforcedBlockedSeamPoint::Enforced && + result.points[next_index(i)].type != EnforcedBlockedSeamPoint::Enforced) { + patches_starts_ends.push_back(next_index(i)); + } + } + //if patches_starts_ends are empty, it means that the whole perimeter is enforced.. don't do anything in that case + if (!patches_starts_ends.empty()) { + //if the first point in the patches is not enforced, it marks a patch end. in that case, put it to the end and start on next + // to simplify the processing + assert(patches_starts_ends.size() % 2 == 0); + bool start_on_second = false; + if (result.points[patches_starts_ends[0]].type != EnforcedBlockedSeamPoint::Enforced) { + start_on_second = true; + patches_starts_ends.push_back(patches_starts_ends[0]); + } + //now pick the longest patch + std::pair longest_patch { 0, 0 }; + auto patch_len = [perimeter_size](const std::pair &start_end) { + if (start_end.second < start_end.first) { + return start_end.first + (perimeter_size - start_end.second); } else { - position = orig_polygon_points.front(); - orig_polygon_points.pop(); - local_ccw_angle = was_clockwise ? -polygon_angles[orig_angle_index] : polygon_angles[orig_angle_index]; - orig_angle_index++; - orig_point = true; + return start_end.second - start_end.first; } - - if (global_model_info.is_enforced(position, perimeter.flow_width)) { type = EnforcedBlockedSeamPoint::Enforced; } - - if (global_model_info.is_blocked(position, perimeter.flow_width)) { type = EnforcedBlockedSeamPoint::Blocked; } - some_point_enforced = some_point_enforced || type == EnforcedBlockedSeamPoint::Enforced; - - if (orig_point) { - Vec3f pos_of_next = orig_polygon_points.empty() ? first : orig_polygon_points.front(); - float distance_to_next = (position - pos_of_next).norm(); - if (distance_to_next > perimeter.flow_width * perimeter.flow_width * 4) - oversampled_points.push((position + pos_of_next) / 2); - if (global_model_info.is_enforced(position, distance_to_next)) { - Vec3f vec_to_next = (pos_of_next - position).normalized(); - float step_size = SeamPlacer::enforcer_oversampling_distance; - float step = step_size; - while (step < distance_to_next) { - oversampled_points.push(position + vec_to_next * step); - step += step_size; - } - } + }; + for (size_t patch_idx = start_on_second ? 1 : 0; patch_idx < patches_starts_ends.size(); patch_idx += 2) { + std::pair current_patch { patches_starts_ends[patch_idx], patches_starts_ends[patch_idx + + 1] }; + if (patch_len(longest_patch) < patch_len(current_patch)) { + longest_patch = current_patch; } - - result.points.emplace_back(position, perimeter, local_ccw_angle, type); + } + std::vector viable_points_indices; + std::vector large_angle_points_indices; + for (size_t point_idx = longest_patch.first; point_idx != longest_patch.second; + point_idx = next_index(point_idx)) { + viable_points_indices.push_back(point_idx); + if (std::abs(result.points[point_idx].local_ccw_angle) + > SeamPlacer::sharp_angle_snapping_threshold) { + large_angle_points_indices.push_back(point_idx); + } + } + assert(viable_points_indices.size() > 0); + if (large_angle_points_indices.empty()) { + size_t central_idx = viable_points_indices[viable_points_indices.size() / 2]; + result.points[central_idx].central_enforcer = true; + } else { + size_t central_idx = large_angle_points_indices.size() / 2; + result.points[large_angle_points_indices[central_idx]].central_enforcer = true; + } } + } - perimeter.end_index = result.points.size(); - - if (some_point_enforced) { - // We will patches of enforced points (patch: continuous section of enforced points), choose - // the longest patch, and select the middle point or sharp point (depending on the angle) - // this point will have high priority on this perimeter - size_t perimeter_size = perimeter.end_index - perimeter.start_index; - const auto next_index = [&](size_t idx) { return perimeter.start_index + Slic3r::next_idx_modulo(idx - perimeter.start_index, perimeter_size); }; - - std::vector patches_starts_ends; - for (size_t i = perimeter.start_index; i < perimeter.end_index; ++i) { - if (result.points[i].type != EnforcedBlockedSeamPoint::Enforced && result.points[next_index(i)].type == EnforcedBlockedSeamPoint::Enforced) { - patches_starts_ends.push_back(next_index(i)); - } - if (result.points[i].type == EnforcedBlockedSeamPoint::Enforced && result.points[next_index(i)].type != EnforcedBlockedSeamPoint::Enforced) { - patches_starts_ends.push_back(next_index(i)); - } - } - // if patches_starts_ends are empty, it means that the whole perimeter is enforced.. don't do anything in that case - if (!patches_starts_ends.empty()) { - // if the first point in the patches is not enforced, it marks a patch end. in that case, put it to the end and start on next - // to simplify the processing - assert(patches_starts_ends.size() % 2 == 0); - bool start_on_second = false; - if (result.points[patches_starts_ends[0]].type != EnforcedBlockedSeamPoint::Enforced) { - start_on_second = true; - patches_starts_ends.push_back(patches_starts_ends[0]); - } - // now pick the longest patch - std::pair longest_patch{0, 0}; - auto patch_len = [perimeter_size](const std::pair &start_end) { - if (start_end.second < start_end.first) { - return start_end.first + (perimeter_size - start_end.second); - } else { - return start_end.second - start_end.first; - } - }; - for (size_t patch_idx = start_on_second ? 1 : 0; patch_idx < patches_starts_ends.size(); patch_idx += 2) { - std::pair current_patch{patches_starts_ends[patch_idx], patches_starts_ends[patch_idx + 1]}; - if (patch_len(longest_patch) < patch_len(current_patch)) { longest_patch = current_patch; } - } - std::vector viable_points_indices; - std::vector large_angle_points_indices; - for (size_t point_idx = longest_patch.first; point_idx != longest_patch.second; point_idx = next_index(point_idx)) { - viable_points_indices.push_back(point_idx); - if (std::abs(result.points[point_idx].local_ccw_angle) > SeamPlacer::sharp_angle_snapping_threshold) { large_angle_points_indices.push_back(point_idx); } - } - assert(viable_points_indices.size() > 0); - if (large_angle_points_indices.empty()) { - size_t central_idx = viable_points_indices[viable_points_indices.size() / 2]; - result.points[central_idx].central_enforcer = true; - } else { - size_t central_idx = large_angle_points_indices.size() / 2; - result.points[large_angle_points_indices[central_idx]].central_enforcer = true; - } - } - } } // Get index of previous and next perimeter point of the layer. Because SeamCandidates of all polygons of the given layer // are sequentially stored in the vector, each perimeter contains info about start and end index. These vales are used to // deduce index of previous and next neigbour in the corresponding perimeter. -std::pair find_previous_and_next_perimeter_point(const std::vector &perimeter_points, size_t point_index) -{ - const SeamCandidate ¤t = perimeter_points[point_index]; - int prev = point_index - 1; // for majority of points, it is true that neighbours lie behind and in front of them in the vector - int next = point_index + 1; +std::pair find_previous_and_next_perimeter_point(const std::vector &perimeter_points, + size_t point_index) { + const SeamCandidate ¤t = perimeter_points[point_index]; + int prev = point_index - 1; //for majority of points, it is true that neighbours lie behind and in front of them in the vector + int next = point_index + 1; - if (point_index == current.perimeter.start_index) { - // if point_index is equal to start, it means that the previous neighbour is at the end - prev = current.perimeter.end_index; - } + if (point_index == current.perimeter.start_index) { + // if point_index is equal to start, it means that the previous neighbour is at the end + prev = current.perimeter.end_index; + } - if (point_index == current.perimeter.end_index - 1) { - // if point_index is equal to end, than next neighbour is at the start - next = current.perimeter.start_index; - } + if (point_index == current.perimeter.end_index - 1) { + // if point_index is equal to end, than next neighbour is at the start + next = current.perimeter.start_index; + } - assert(prev >= 0); - assert(next >= 0); - return {size_t(prev), size_t(next)}; + assert(prev >= 0); + assert(next >= 0); + return {size_t(prev),size_t(next)}; } // Computes all global model info - transforms object, performs raycasting -void compute_global_occlusion(GlobalModelInfo &result, const PrintObject *po, std::function throw_if_canceled) -{ - BOOST_LOG_TRIVIAL(debug) << "SeamPlacer: gather occlusion meshes: start"; - auto obj_transform = po->trafo_centered(); - indexed_triangle_set triangle_set; - indexed_triangle_set negative_volumes_set; - // add all parts - for (const ModelVolume *model_volume : po->model_object()->volumes) { - if (model_volume->type() == ModelVolumeType::MODEL_PART || model_volume->type() == ModelVolumeType::NEGATIVE_VOLUME) { - auto model_transformation = model_volume->get_matrix(); - indexed_triangle_set model_its = model_volume->mesh().its; - its_transform(model_its, model_transformation); - if (model_volume->type() == ModelVolumeType::MODEL_PART) { - its_merge(triangle_set, model_its); - } else { - its_merge(negative_volumes_set, model_its); - } - } +void compute_global_occlusion(GlobalModelInfo &result, const PrintObject *po, + std::function throw_if_canceled) { + BOOST_LOG_TRIVIAL(debug) + << "SeamPlacer: gather occlusion meshes: start"; + auto obj_transform = po->trafo_centered(); + indexed_triangle_set triangle_set; + indexed_triangle_set negative_volumes_set; + //add all parts + for (const ModelVolume *model_volume : po->model_object()->volumes) { + if (model_volume->type() == ModelVolumeType::MODEL_PART + || model_volume->type() == ModelVolumeType::NEGATIVE_VOLUME) { + auto model_transformation = model_volume->get_matrix(); + indexed_triangle_set model_its = model_volume->mesh().its; + its_transform(model_its, model_transformation); + if (model_volume->type() == ModelVolumeType::MODEL_PART) { + its_merge(triangle_set, model_its); + } else { + its_merge(negative_volumes_set, model_its); + } } - throw_if_canceled(); + } + throw_if_canceled(); - BOOST_LOG_TRIVIAL(debug) << "SeamPlacer: gather occlusion meshes: end"; + BOOST_LOG_TRIVIAL(debug) + << "SeamPlacer: gather occlusion meshes: end"; - BOOST_LOG_TRIVIAL(debug) - << "SeamPlacer: decimate: start"; - its_short_edge_collpase(triangle_set, SeamPlacer::fast_decimation_triangle_count_target); - its_short_edge_collpase(negative_volumes_set, SeamPlacer::fast_decimation_triangle_count_target); + BOOST_LOG_TRIVIAL(debug) + << "SeamPlacer: decimate: start"; + its_short_edge_collpase(triangle_set, SeamPlacer::fast_decimation_triangle_count_target); + its_short_edge_collpase(negative_volumes_set, SeamPlacer::fast_decimation_triangle_count_target); - size_t negative_volumes_start_index = triangle_set.indices.size(); - its_merge(triangle_set, negative_volumes_set); - its_transform(triangle_set, obj_transform); - BOOST_LOG_TRIVIAL(debug) << "SeamPlacer: decimate: end"; + size_t negative_volumes_start_index = triangle_set.indices.size(); + its_merge(triangle_set, negative_volumes_set); + its_transform(triangle_set, obj_transform); + BOOST_LOG_TRIVIAL(debug) + << "SeamPlacer: decimate: end"; - BOOST_LOG_TRIVIAL(debug) << "SeamPlacer: Compute visibility sample points: start"; + BOOST_LOG_TRIVIAL(debug) + << "SeamPlacer: Compute visibility sample points: start"; - result.mesh_samples = sample_its_uniform_parallel(SeamPlacer::raycasting_visibility_samples_count, triangle_set); - result.mesh_samples_coordinate_functor = CoordinateFunctor(&result.mesh_samples.positions); - result.mesh_samples_tree = KDTreeIndirect<3, float, CoordinateFunctor>(result.mesh_samples_coordinate_functor, result.mesh_samples.positions.size()); + result.mesh_samples = sample_its_uniform_parallel(SeamPlacer::raycasting_visibility_samples_count, + triangle_set); + result.mesh_samples_coordinate_functor = CoordinateFunctor(&result.mesh_samples.positions); + result.mesh_samples_tree = KDTreeIndirect<3, float, CoordinateFunctor>(result.mesh_samples_coordinate_functor, + result.mesh_samples.positions.size()); - // The following code determines search area for random visibility samples on the mesh when calculating visibility of each perimeter point - // number of random samples in the given radius (area) is approximately poisson distribution - // to compute ideal search radius (area), we use exponential distribution (complementary distr to poisson) - // parameters of exponential distribution to compute area that will have with probability="probability" more than given number of samples="samples" - float probability = 0.9f; - float samples = 4; - float density = SeamPlacer::raycasting_visibility_samples_count / result.mesh_samples.total_area; - // exponential probability distrubtion function is : f(x) = P(X > x) = e^(l*x) where l is the rate parameter (computed as 1/u where u is mean value) - // probability that sampled area A with S samples contains more than samples count: - // P(S > samples in A) = e^-(samples/(density*A)); express A: - float search_area = samples / (-logf(probability) * density); - float search_radius = sqrt(search_area / PI); - result.mesh_samples_radius = search_radius; + // The following code determines search area for random visibility samples on the mesh when calculating visibility of each perimeter point + // number of random samples in the given radius (area) is approximately poisson distribution + // to compute ideal search radius (area), we use exponential distribution (complementary distr to poisson) + // parameters of exponential distribution to compute area that will have with probability="probability" more than given number of samples="samples" + float probability = 0.9f; + float samples = 4; + float density = SeamPlacer::raycasting_visibility_samples_count / result.mesh_samples.total_area; + // exponential probability distrubtion function is : f(x) = P(X > x) = e^(l*x) where l is the rate parameter (computed as 1/u where u is mean value) + // probability that sampled area A with S samples contains more than samples count: + // P(S > samples in A) = e^-(samples/(density*A)); express A: + float search_area = samples / (-logf(probability) * density); + float search_radius = sqrt(search_area / PI); + result.mesh_samples_radius = search_radius; - BOOST_LOG_TRIVIAL(debug) << "SeamPlacer: Compute visiblity sample points: end"; - throw_if_canceled(); + BOOST_LOG_TRIVIAL(debug) + << "SeamPlacer: Compute visiblity sample points: end"; + throw_if_canceled(); - BOOST_LOG_TRIVIAL(debug) << "SeamPlacer: Mesh sample raidus: " << result.mesh_samples_radius; + BOOST_LOG_TRIVIAL(debug) + << "SeamPlacer: Mesh sample raidus: " << result.mesh_samples_radius; - BOOST_LOG_TRIVIAL(debug) << "SeamPlacer: build AABB tree: start"; - auto raycasting_tree = AABBTreeIndirect::build_aabb_tree_over_indexed_triangle_set(triangle_set.vertices, triangle_set.indices); + BOOST_LOG_TRIVIAL(debug) + << "SeamPlacer: build AABB tree: start"; + auto raycasting_tree = AABBTreeIndirect::build_aabb_tree_over_indexed_triangle_set(triangle_set.vertices, + triangle_set.indices); - throw_if_canceled(); - BOOST_LOG_TRIVIAL(debug) << "SeamPlacer: build AABB tree: end"; - result.mesh_samples_visibility = raycast_visibility(raycasting_tree, triangle_set, result.mesh_samples, negative_volumes_start_index); - throw_if_canceled(); + throw_if_canceled(); + BOOST_LOG_TRIVIAL(debug) + << "SeamPlacer: build AABB tree: end"; + result.mesh_samples_visibility = raycast_visibility(raycasting_tree, triangle_set, result.mesh_samples, + negative_volumes_start_index); + throw_if_canceled(); #ifdef DEBUG_FILES - result.debug_export(triangle_set); + result.debug_export(triangle_set); #endif } -void gather_enforcers_blockers(GlobalModelInfo &result, const PrintObject *po) -{ - BOOST_LOG_TRIVIAL(debug) << "SeamPlacer: build AABB trees for raycasting enforcers/blockers: start"; +void gather_enforcers_blockers(GlobalModelInfo &result, const PrintObject *po) { + BOOST_LOG_TRIVIAL(debug) + << "SeamPlacer: build AABB trees for raycasting enforcers/blockers: start"; - auto obj_transform = po->trafo_centered(); + auto obj_transform = po->trafo_centered(); - for (const ModelVolume *mv : po->model_object()->volumes) { - if (mv->is_seam_painted()) { - auto model_transformation = obj_transform * mv->get_matrix(); + for (const ModelVolume *mv : po->model_object()->volumes) { + if (mv->is_seam_painted()) { + auto model_transformation = obj_transform * mv->get_matrix(); - indexed_triangle_set enforcers = mv->seam_facets.get_facets(*mv, EnforcerBlockerType::ENFORCER); - its_transform(enforcers, model_transformation); - its_merge(result.enforcers, enforcers); + indexed_triangle_set enforcers = mv->seam_facets.get_facets(*mv, EnforcerBlockerType::ENFORCER); + its_transform(enforcers, model_transformation); + its_merge(result.enforcers, enforcers); - indexed_triangle_set blockers = mv->seam_facets.get_facets(*mv, EnforcerBlockerType::BLOCKER); - its_transform(blockers, model_transformation); - its_merge(result.blockers, blockers); - } + indexed_triangle_set blockers = mv->seam_facets.get_facets(*mv, EnforcerBlockerType::BLOCKER); + its_transform(blockers, model_transformation); + its_merge(result.blockers, blockers); } + } - result.enforcers_tree = AABBTreeIndirect::build_aabb_tree_over_indexed_triangle_set(result.enforcers.vertices, result.enforcers.indices); - result.blockers_tree = AABBTreeIndirect::build_aabb_tree_over_indexed_triangle_set(result.blockers.vertices, result.blockers.indices); + result.enforcers_tree = AABBTreeIndirect::build_aabb_tree_over_indexed_triangle_set(result.enforcers.vertices, + result.enforcers.indices); + result.blockers_tree = AABBTreeIndirect::build_aabb_tree_over_indexed_triangle_set(result.blockers.vertices, + result.blockers.indices); - BOOST_LOG_TRIVIAL(debug) << "SeamPlacer: build AABB trees for raycasting enforcers/blockers: end"; + BOOST_LOG_TRIVIAL(debug) + << "SeamPlacer: build AABB trees for raycasting enforcers/blockers: end"; } -struct SeamComparator -{ - SeamPosition setup; - float angle_importance; - explicit SeamComparator(SeamPosition setup) : setup(setup) - { - angle_importance = setup == spNearest ? SeamPlacer::angle_importance_nearest : SeamPlacer::angle_importance_aligned; +struct SeamComparator { + SeamPosition setup; + float angle_importance; + explicit SeamComparator(SeamPosition setup) : + setup(setup) { + angle_importance = + setup == spNearest ? SeamPlacer::angle_importance_nearest : SeamPlacer::angle_importance_aligned; + } + + // Standard comparator, must respect the requirements of comparators (e.g. give same result on same inputs) for sorting usage + // should return if a is better seamCandidate than b + bool is_first_better(const SeamCandidate &a, const SeamCandidate &b, const Vec2f &preffered_location = Vec2f { 0.0f, + 0.0f }) const { + if (setup == SeamPosition::spAligned && a.central_enforcer != b.central_enforcer) { + return a.central_enforcer; } - // Standard comparator, must respect the requirements of comparators (e.g. give same result on same inputs) for sorting usage - // should return if a is better seamCandidate than b - bool is_first_better(const SeamCandidate &a, const SeamCandidate &b, const Vec2f &preffered_location = Vec2f{0.0f, 0.0f}) const - { - if (setup == SeamPosition::spAligned && a.central_enforcer != b.central_enforcer) { return a.central_enforcer; } - - // Blockers/Enforcers discrimination, top priority - if (a.type != b.type) { return a.type > b.type; } - - // avoid overhangs - if (a.overhang > 0.0f || b.overhang > 0.0f) { return a.overhang < b.overhang; } - - // prefer hidden points (more than 0.5 mm inside) - if (a.embedded_distance < -0.5f && b.embedded_distance > -0.5f) { return true; } - if (b.embedded_distance < -0.5f && a.embedded_distance > -0.5f) { return false; } - - if (setup == SeamPosition::spRear && a.position.y() != b.position.y()) { return a.position.y() > b.position.y(); } - - float distance_penalty_a = 0.0f; - float distance_penalty_b = 0.0f; - if (setup == spNearest) { - distance_penalty_a = 1.0f - gauss((a.position.head<2>() - preffered_location).norm(), 0.0f, 1.0f, 0.005f); - distance_penalty_b = 1.0f - gauss((b.position.head<2>() - preffered_location).norm(), 0.0f, 1.0f, 0.005f); - } - - // the penalites are kept close to range [0-1.x] however, it should not be relied upon - float penalty_a = a.overhang + a.visibility + angle_importance * compute_angle_penalty(a.local_ccw_angle) + distance_penalty_a; - float penalty_b = b.overhang + b.visibility + angle_importance * compute_angle_penalty(b.local_ccw_angle) + distance_penalty_b; - - return penalty_a < penalty_b; + // Blockers/Enforcers discrimination, top priority + if (a.type != b.type) { + return a.type > b.type; } - // Comparator used during alignment. If there is close potential aligned point, it is compared to the current - // seam point of the perimeter, to find out if the aligned point is not much worse than the current seam - // Also used by the random seam generator. - bool is_first_not_much_worse(const SeamCandidate &a, const SeamCandidate &b) const - { - // Blockers/Enforcers discrimination, top priority - if (setup == SeamPosition::spAligned && a.central_enforcer != b.central_enforcer) { - // Prefer centers of enforcers. - return a.central_enforcer; - } - - if (a.type == EnforcedBlockedSeamPoint::Enforced) { return true; } - - if (a.type == EnforcedBlockedSeamPoint::Blocked) { return false; } - - if (a.type != b.type) { return a.type > b.type; } - - // avoid overhangs - if ((a.overhang > 0.0f || b.overhang > 0.0f) && abs(a.overhang - b.overhang) > (0.1f * a.perimeter.flow_width)) { return a.overhang < b.overhang; } - - // prefer hidden points (more than 0.5 mm inside) - if (a.embedded_distance < -0.5f && b.embedded_distance > -0.5f) { return true; } - if (b.embedded_distance < -0.5f && a.embedded_distance > -0.5f) { return false; } - - if (setup == SeamPosition::spRandom) { return true; } - - if (setup == SeamPosition::spRear) { return a.position.y() + SeamPlacer::seam_align_score_tolerance * 5.0f > b.position.y(); } - - float penalty_a = a.overhang + a.visibility + angle_importance * compute_angle_penalty(a.local_ccw_angle); - float penalty_b = b.overhang + b.visibility + angle_importance * compute_angle_penalty(b.local_ccw_angle); - - return penalty_a <= penalty_b || penalty_a - penalty_b < SeamPlacer::seam_align_score_tolerance; + //avoid overhangs + if (a.overhang > 0.0f || b.overhang > 0.0f) { + return a.overhang < b.overhang; } - bool are_similar(const SeamCandidate &a, const SeamCandidate &b) const { return is_first_not_much_worse(a, b) && is_first_not_much_worse(b, a); } + // prefer hidden points (more than 0.5 mm inside) + if (a.embedded_distance < -0.5f && b.embedded_distance > -0.5f) { + return true; + } + if (b.embedded_distance < -0.5f && a.embedded_distance > -0.5f) { + return false; + } + + if (setup == SeamPosition::spRear && a.position.y() != b.position.y()) { + return a.position.y() > b.position.y(); + } + + float distance_penalty_a = 0.0f; + float distance_penalty_b = 0.0f; + if (setup == spNearest) { + distance_penalty_a = 1.0f - gauss((a.position.head<2>() - preffered_location).norm(), 0.0f, 1.0f, 0.005f); + distance_penalty_b = 1.0f - gauss((b.position.head<2>() - preffered_location).norm(), 0.0f, 1.0f, 0.005f); + } + + // the penalites are kept close to range [0-1.x] however, it should not be relied upon + float penalty_a = a.overhang + a.visibility + + angle_importance * compute_angle_penalty(a.local_ccw_angle) + + distance_penalty_a; + float penalty_b = b.overhang + b.visibility + + angle_importance * compute_angle_penalty(b.local_ccw_angle) + + distance_penalty_b; + + return penalty_a < penalty_b; + } + + // Comparator used during alignment. If there is close potential aligned point, it is compared to the current + // seam point of the perimeter, to find out if the aligned point is not much worse than the current seam + // Also used by the random seam generator. + bool is_first_not_much_worse(const SeamCandidate &a, const SeamCandidate &b) const { + // Blockers/Enforcers discrimination, top priority + if (setup == SeamPosition::spAligned && a.central_enforcer != b.central_enforcer) { + // Prefer centers of enforcers. + return a.central_enforcer; + } + + if (a.type == EnforcedBlockedSeamPoint::Enforced) { + return true; + } + + if (a.type == EnforcedBlockedSeamPoint::Blocked) { + return false; + } + + if (a.type != b.type) { + return a.type > b.type; + } + + //avoid overhangs + if ((a.overhang > 0.0f || b.overhang > 0.0f) + && abs(a.overhang - b.overhang) > (0.1f * a.perimeter.flow_width)) { + return a.overhang < b.overhang; + } + + // prefer hidden points (more than 0.5 mm inside) + if (a.embedded_distance < -0.5f && b.embedded_distance > -0.5f) { + return true; + } + if (b.embedded_distance < -0.5f && a.embedded_distance > -0.5f) { + return false; + } + + if (setup == SeamPosition::spRandom) { + return true; + } + + if (setup == SeamPosition::spRear) { + return a.position.y() + SeamPlacer::seam_align_score_tolerance * 5.0f > b.position.y(); + } + + float penalty_a = a.overhang + a.visibility + + angle_importance * compute_angle_penalty(a.local_ccw_angle); + float penalty_b = b.overhang + b.visibility + + angle_importance * compute_angle_penalty(b.local_ccw_angle); + + return penalty_a <= penalty_b || penalty_a - penalty_b < SeamPlacer::seam_align_score_tolerance; + } + + bool are_similar(const SeamCandidate &a, const SeamCandidate &b) const { + return is_first_not_much_worse(a, b) && is_first_not_much_worse(b, a); + } }; #ifdef DEBUG_FILES -void debug_export_points(const std::vector &layers, const BoundingBox &bounding_box, const SeamComparator &comparator) -{ - for (size_t layer_idx = 0; layer_idx < layers.size(); ++layer_idx) { - std::string angles_file_name = debug_out_path(("angles_" + std::to_string(layer_idx) + ".svg").c_str()); - SVG angles_svg{angles_file_name, bounding_box}; - float min_vis = 0; - float max_vis = min_vis; +void debug_export_points(const std::vector &layers, + const BoundingBox &bounding_box, const SeamComparator &comparator) { + for (size_t layer_idx = 0; layer_idx < layers.size(); ++layer_idx) { + std::string angles_file_name = debug_out_path( + ("angles_" + std::to_string(layer_idx) + ".svg").c_str()); + SVG angles_svg { angles_file_name, bounding_box }; + float min_vis = 0; + float max_vis = min_vis; - float min_weight = std::numeric_limits::min(); - float max_weight = min_weight; + float min_weight = std::numeric_limits::min(); + float max_weight = min_weight; - for (const SeamCandidate &point : layers[layer_idx].points) { - Vec3i color = value_to_rgbi(-PI, PI, point.local_ccw_angle); - std::string fill = "rgb(" + std::to_string(color.x()) + "," + std::to_string(color.y()) + "," + std::to_string(color.z()) + ")"; - angles_svg.draw(scaled(Vec2f(point.position.head<2>())), fill); - min_vis = std::min(min_vis, point.visibility); - max_vis = std::max(max_vis, point.visibility); + for (const SeamCandidate &point : layers[layer_idx].points) { + Vec3i color = value_to_rgbi(-PI, PI, point.local_ccw_angle); + std::string fill = "rgb(" + std::to_string(color.x()) + "," + std::to_string(color.y()) + "," + + std::to_string(color.z()) + ")"; + angles_svg.draw(scaled(Vec2f(point.position.head<2>())), fill); + min_vis = std::min(min_vis, point.visibility); + max_vis = std::max(max_vis, point.visibility); - min_weight = std::min(min_weight, -compute_angle_penalty(point.local_ccw_angle)); - max_weight = std::max(max_weight, -compute_angle_penalty(point.local_ccw_angle)); - } + min_weight = std::min(min_weight, -compute_angle_penalty(point.local_ccw_angle)); + max_weight = std::max(max_weight, -compute_angle_penalty(point.local_ccw_angle)); - std::string visiblity_file_name = debug_out_path(("visibility_" + std::to_string(layer_idx) + ".svg").c_str()); - SVG visibility_svg{visiblity_file_name, bounding_box}; - std::string weights_file_name = debug_out_path(("weight_" + std::to_string(layer_idx) + ".svg").c_str()); - SVG weight_svg{weights_file_name, bounding_box}; - std::string overhangs_file_name = debug_out_path(("overhang_" + std::to_string(layer_idx) + ".svg").c_str()); - SVG overhangs_svg{overhangs_file_name, bounding_box}; - - for (const SeamCandidate &point : layers[layer_idx].points) { - Vec3i color = value_to_rgbi(min_vis, max_vis, point.visibility); - std::string visibility_fill = "rgb(" + std::to_string(color.x()) + "," + std::to_string(color.y()) + "," + std::to_string(color.z()) + ")"; - visibility_svg.draw(scaled(Vec2f(point.position.head<2>())), visibility_fill); - - Vec3i weight_color = value_to_rgbi(min_weight, max_weight, -compute_angle_penalty(point.local_ccw_angle)); - std::string weight_fill = "rgb(" + std::to_string(weight_color.x()) + "," + std::to_string(weight_color.y()) + "," + std::to_string(weight_color.z()) + ")"; - weight_svg.draw(scaled(Vec2f(point.position.head<2>())), weight_fill); - - Vec3i overhang_color = value_to_rgbi(-0.5, 0.5, std::clamp(point.overhang, -0.5f, 0.5f)); - std::string overhang_fill = "rgb(" + std::to_string(overhang_color.x()) + "," + std::to_string(overhang_color.y()) + "," + std::to_string(overhang_color.z()) + ")"; - overhangs_svg.draw(scaled(Vec2f(point.position.head<2>())), overhang_fill); - } } + + std::string visiblity_file_name = debug_out_path( + ("visibility_" + std::to_string(layer_idx) + ".svg").c_str()); + SVG visibility_svg { visiblity_file_name, bounding_box }; + std::string weights_file_name = debug_out_path( + ("weight_" + std::to_string(layer_idx) + ".svg").c_str()); + SVG weight_svg { weights_file_name, bounding_box }; + std::string overhangs_file_name = debug_out_path( + ("overhang_" + std::to_string(layer_idx) + ".svg").c_str()); + SVG overhangs_svg { overhangs_file_name, bounding_box }; + + for (const SeamCandidate &point : layers[layer_idx].points) { + Vec3i color = value_to_rgbi(min_vis, max_vis, point.visibility); + std::string visibility_fill = "rgb(" + std::to_string(color.x()) + "," + std::to_string(color.y()) + "," + + std::to_string(color.z()) + ")"; + visibility_svg.draw(scaled(Vec2f(point.position.head<2>())), visibility_fill); + + Vec3i weight_color = value_to_rgbi(min_weight, max_weight, + -compute_angle_penalty(point.local_ccw_angle)); + std::string weight_fill = "rgb(" + std::to_string(weight_color.x()) + "," + std::to_string(weight_color.y()) + + "," + + std::to_string(weight_color.z()) + ")"; + weight_svg.draw(scaled(Vec2f(point.position.head<2>())), weight_fill); + + Vec3i overhang_color = value_to_rgbi(-0.5, 0.5, std::clamp(point.overhang, -0.5f, 0.5f)); + std::string overhang_fill = "rgb(" + std::to_string(overhang_color.x()) + "," + + std::to_string(overhang_color.y()) + + "," + + std::to_string(overhang_color.z()) + ")"; + overhangs_svg.draw(scaled(Vec2f(point.position.head<2>())), overhang_fill); + } + } } #endif // Pick best seam point based on the given comparator -void pick_seam_point(std::vector &perimeter_points, size_t start_index, const SeamComparator &comparator) -{ - size_t end_index = perimeter_points[start_index].perimeter.end_index; +void pick_seam_point(std::vector &perimeter_points, size_t start_index, + const SeamComparator &comparator) { + size_t end_index = perimeter_points[start_index].perimeter.end_index; - size_t seam_index = start_index; - for (size_t index = start_index; index < end_index; ++index) { - if (comparator.is_first_better(perimeter_points[index], perimeter_points[seam_index])) { seam_index = index; } + size_t seam_index = start_index; + for (size_t index = start_index; index < end_index; ++index) { + if (comparator.is_first_better(perimeter_points[index], perimeter_points[seam_index])) { + seam_index = index; } - perimeter_points[start_index].perimeter.seam_index = seam_index; + } + perimeter_points[start_index].perimeter.seam_index = seam_index; } -size_t pick_nearest_seam_point_index(const std::vector &perimeter_points, size_t start_index, const Vec2f &preffered_location) -{ - size_t end_index = perimeter_points[start_index].perimeter.end_index; - SeamComparator comparator{spNearest}; +size_t pick_nearest_seam_point_index(const std::vector &perimeter_points, size_t start_index, + const Vec2f &preffered_location) { + size_t end_index = perimeter_points[start_index].perimeter.end_index; + SeamComparator comparator { spNearest }; - size_t seam_index = start_index; - for (size_t index = start_index; index < end_index; ++index) { - if (comparator.is_first_better(perimeter_points[index], perimeter_points[seam_index], preffered_location)) { seam_index = index; } + size_t seam_index = start_index; + for (size_t index = start_index; index < end_index; ++index) { + if (comparator.is_first_better(perimeter_points[index], perimeter_points[seam_index], preffered_location)) { + seam_index = index; } - return seam_index; + } + return seam_index; } // picks random seam point uniformly, respecting enforcers blockers and overhang avoidance. -void pick_random_seam_point(const std::vector &perimeter_points, size_t start_index) -{ - SeamComparator comparator{spRandom}; +void pick_random_seam_point(const std::vector &perimeter_points, size_t start_index) { + SeamComparator comparator { spRandom }; - // algorithm keeps a list of viable points and their lengths. If it finds a point - // that is much better than the viable_example_index (e.g. better type, no overhang; see is_first_not_much_worse) - // then it throws away stored lists and starts from start - // in the end, the list should contain points with same type (Enforced > Neutral > Blocked) and also only those which are not - // big overhang. - size_t viable_example_index = start_index; - size_t end_index = perimeter_points[start_index].perimeter.end_index; - struct Viable - { - // Candidate seam point index. - size_t index; - float edge_length; - Vec3f edge; - }; - std::vector viables; + // algorithm keeps a list of viable points and their lengths. If it finds a point + // that is much better than the viable_example_index (e.g. better type, no overhang; see is_first_not_much_worse) + // then it throws away stored lists and starts from start + // in the end, the list should contain points with same type (Enforced > Neutral > Blocked) and also only those which are not + // big overhang. + size_t viable_example_index = start_index; + size_t end_index = perimeter_points[start_index].perimeter.end_index; + struct Viable { + // Candidate seam point index. + size_t index; + float edge_length; + Vec3f edge; + }; + std::vector viables; - const Vec3f pseudornd_seed = perimeter_points[viable_example_index].position; - float rand = std::abs(sin(pseudornd_seed.dot(Vec3f(12.9898f, 78.233f, 133.3333f))) * 43758.5453f); - rand = rand - (int) rand; + const Vec3f pseudornd_seed = perimeter_points[viable_example_index].position; + float rand = std::abs(sin(pseudornd_seed.dot(Vec3f(12.9898f,78.233f, 133.3333f))) * 43758.5453f); + rand = rand - (int) rand; - for (size_t index = start_index; index < end_index; ++index) { - if (comparator.are_similar(perimeter_points[index], perimeter_points[viable_example_index])) { - // index ok, push info into viables - Vec3f edge_to_next{perimeter_points[index == end_index - 1 ? start_index : index + 1].position - perimeter_points[index].position}; - float dist_to_next = edge_to_next.norm(); - viables.push_back({index, dist_to_next, edge_to_next}); - } else if (comparator.is_first_not_much_worse(perimeter_points[viable_example_index], perimeter_points[index])) { - // index is worse then viable_example_index, skip this point - } else { - // index is better than viable example index, update example, clear gathered info, start again - // clear up all gathered info, start from scratch, update example index - viable_example_index = index; - viables.clear(); + for (size_t index = start_index; index < end_index; ++index) { + if (comparator.are_similar(perimeter_points[index], perimeter_points[viable_example_index])) { + // index ok, push info into viables + Vec3f edge_to_next { perimeter_points[index == end_index - 1 ? start_index : index + 1].position + - perimeter_points[index].position }; + float dist_to_next = edge_to_next.norm(); + viables.push_back( { index, dist_to_next, edge_to_next }); + } else if (comparator.is_first_not_much_worse(perimeter_points[viable_example_index], + perimeter_points[index])) { + // index is worse then viable_example_index, skip this point + } else { + // index is better than viable example index, update example, clear gathered info, start again + // clear up all gathered info, start from scratch, update example index + viable_example_index = index; + viables.clear(); - Vec3f edge_to_next = (perimeter_points[index == end_index - 1 ? start_index : index + 1].position - perimeter_points[index].position); - float dist_to_next = edge_to_next.norm(); - viables.push_back({index, dist_to_next, edge_to_next}); - } + Vec3f edge_to_next = (perimeter_points[index == end_index - 1 ? start_index : index + 1].position + - perimeter_points[index].position); + float dist_to_next = edge_to_next.norm(); + viables.push_back( { index, dist_to_next, edge_to_next }); } + } - // now pick random point from the stored options - float len_sum = std::accumulate(viables.begin(), viables.end(), 0.0f, [](const float acc, const Viable &v) { return acc + v.edge_length; }); - float picked_len = len_sum * rand; + // now pick random point from the stored options + float len_sum = std::accumulate(viables.begin(), viables.end(), 0.0f, [](const float acc, const Viable &v) { + return acc + v.edge_length; + }); + float picked_len = len_sum * rand; - size_t point_idx = 0; - while (picked_len - viables[point_idx].edge_length > 0) { - picked_len = picked_len - viables[point_idx].edge_length; - point_idx++; - } + size_t point_idx = 0; + while (picked_len - viables[point_idx].edge_length > 0) { + picked_len = picked_len - viables[point_idx].edge_length; + point_idx++; + } - Perimeter &perimeter = perimeter_points[start_index].perimeter; - perimeter.seam_index = viables[point_idx].index; - perimeter.final_seam_position = perimeter_points[perimeter.seam_index].position + viables[point_idx].edge.normalized() * picked_len; - perimeter.finalized = true; + Perimeter &perimeter = perimeter_points[start_index].perimeter; + perimeter.seam_index = viables[point_idx].index; + perimeter.final_seam_position = perimeter_points[perimeter.seam_index].position + + viables[point_idx].edge.normalized() * picked_len; + perimeter.finalized = true; } -class PerimeterDistancer -{ - std::vector lines; - AABBTreeIndirect::Tree<2, double> tree; - -public: - PerimeterDistancer(const Layer *layer) - { - ExPolygons layer_outline = layer->lslices; - for (const ExPolygon &island : layer_outline) { - assert(island.contour.is_counter_clockwise()); - for (const auto &line : island.contour.lines()) { lines.emplace_back(unscale(line.a), unscale(line.b)); } - for (const Polygon &hole : island.holes) { - assert(hole.is_clockwise()); - for (const auto &line : hole.lines()) { lines.emplace_back(unscale(line.a), unscale(line.b)); } - } - } - tree = AABBTreeLines::build_aabb_tree_over_indexed_lines(lines); - } - - float distance_from_perimeter(const Vec2f &point) const - { - Vec2d p = point.cast(); - size_t hit_idx_out{}; - Vec2d hit_point_out = Vec2d::Zero(); - auto distance = AABBTreeLines::squared_distance_to_indexed_lines(lines, tree, p, hit_idx_out, hit_point_out); - if (distance < 0) { return std::numeric_limits::max(); } - - distance = sqrt(distance); - const Linef &line = lines[hit_idx_out]; - Vec2d v1 = line.b - line.a; - Vec2d v2 = p - line.a; - if ((v1.x() * v2.y()) - (v1.y() * v2.x()) > 0.0) { distance *= -1; } - return distance; - } -}; - } // namespace SeamPlacerImpl // Parallel process and extract each perimeter polygon of the given print object. // Gather SeamCandidates of each layer into vector and build KDtree over them // Store results in the SeamPlacer variables m_seam_per_object -void SeamPlacer::gather_seam_candidates(const PrintObject *po, const SeamPlacerImpl::GlobalModelInfo &global_model_info, const SeamPosition configured_seam_preference) -{ - using namespace SeamPlacerImpl; - PrintObjectSeamData &seam_data = m_seam_per_object.emplace(po, PrintObjectSeamData{}).first->second; - seam_data.layers.resize(po->layer_count()); +void SeamPlacer::gather_seam_candidates(const PrintObject *po, const SeamPlacerImpl::GlobalModelInfo &global_model_info) { + using namespace SeamPlacerImpl; + PrintObjectSeamData &seam_data = m_seam_per_object.emplace(po, PrintObjectSeamData { }).first->second; + seam_data.layers.resize(po->layer_count()); - tbb::parallel_for(tbb::blocked_range(0, po->layers().size()), [po, configured_seam_preference, &global_model_info, &seam_data](tbb::blocked_range r) { - for (size_t layer_idx = r.begin(); layer_idx < r.end(); ++layer_idx) { - PrintObjectSeamData::LayerSeams &layer_seams = seam_data.layers[layer_idx]; - const Layer * layer = po->get_layer(layer_idx); - auto unscaled_z = layer->slice_z; - std::vector regions; - // NOTE corresponding region ptr may be null, if the layer has zero perimeters - Polygons polygons = extract_perimeter_polygons(layer, configured_seam_preference, regions); - for (size_t poly_index = 0; poly_index < polygons.size(); ++poly_index) { - process_perimeter_polygon(polygons[poly_index], unscaled_z, regions[poly_index], global_model_info, layer_seams); - } - auto functor = SeamCandidateCoordinateFunctor{layer_seams.points}; - seam_data.layers[layer_idx].points_tree = std::make_unique(functor, layer_seams.points.size()); - } - }); + tbb::parallel_for(tbb::blocked_range(0, po->layers().size()), + [po, &global_model_info, &seam_data] + (tbb::blocked_range r) { + for (size_t layer_idx = r.begin(); layer_idx < r.end(); ++layer_idx) { + PrintObjectSeamData::LayerSeams &layer_seams = seam_data.layers[layer_idx]; + const Layer *layer = po->get_layer(layer_idx); + auto unscaled_z = layer->slice_z; + std::vector regions; + //NOTE corresponding region ptr may be null, if the layer has zero perimeters + Polygons polygons = extract_perimeter_polygons(layer, regions); + for (size_t poly_index = 0; poly_index < polygons.size(); ++poly_index) { + process_perimeter_polygon(polygons[poly_index], unscaled_z, + regions[poly_index], global_model_info, layer_seams); + } + auto functor = SeamCandidateCoordinateFunctor { layer_seams.points }; + seam_data.layers[layer_idx].points_tree = + std::make_unique(functor, + layer_seams.points.size()); + } + } + ); } -void SeamPlacer::calculate_candidates_visibility(const PrintObject *po, const SeamPlacerImpl::GlobalModelInfo &global_model_info) -{ - using namespace SeamPlacerImpl; +void SeamPlacer::calculate_candidates_visibility(const PrintObject *po, + const SeamPlacerImpl::GlobalModelInfo &global_model_info) { + using namespace SeamPlacerImpl; - std::vector &layers = m_seam_per_object[po].layers; - tbb::parallel_for(tbb::blocked_range(0, layers.size()), [&layers, &global_model_info](tbb::blocked_range r) { - for (size_t layer_idx = r.begin(); layer_idx < r.end(); ++layer_idx) { - for (auto &perimeter_point : layers[layer_idx].points) { perimeter_point.visibility = global_model_info.calculate_point_visibility(perimeter_point.position); } - } - }); + std::vector &layers = m_seam_per_object[po].layers; + tbb::parallel_for(tbb::blocked_range(0, layers.size()), + [&layers, &global_model_info](tbb::blocked_range r) { + for (size_t layer_idx = r.begin(); layer_idx < r.end(); ++layer_idx) { + for (auto &perimeter_point : layers[layer_idx].points) { + perimeter_point.visibility = global_model_info.calculate_point_visibility( + perimeter_point.position); + } + } + }); } -void SeamPlacer::calculate_overhangs_and_layer_embedding(const PrintObject *po) -{ - using namespace SeamPlacerImpl; +void SeamPlacer::calculate_overhangs_and_layer_embedding(const PrintObject *po) { + using namespace SeamPlacerImpl; + using PerimeterDistancer = AABBTreeLines::LinesDistancer; - std::vector &layers = m_seam_per_object[po].layers; - tbb::parallel_for(tbb::blocked_range(0, layers.size()), [po, &layers](tbb::blocked_range r) { - std::unique_ptr prev_layer_distancer; - if (r.begin() > 0) { // previous layer exists - prev_layer_distancer = std::make_unique(po->layers()[r.begin() - 1]); - } + std::vector &layers = m_seam_per_object[po].layers; + tbb::parallel_for(tbb::blocked_range(0, layers.size()), + [po, &layers](tbb::blocked_range r) { + std::unique_ptr prev_layer_distancer; + if (r.begin() > 0) { // previous layer exists + prev_layer_distancer = std::make_unique(to_unscaled_linesf(po->layers()[r.begin() - 1]->lslices)); + } - for (size_t layer_idx = r.begin(); layer_idx < r.end(); ++layer_idx) { - size_t regions_with_perimeter = 0; - for (const LayerRegion *region : po->layers()[layer_idx]->regions()) { - if (region->perimeters.entities.size() > 0) { regions_with_perimeter++; } - }; - bool should_compute_layer_embedding = regions_with_perimeter > 1; - std::unique_ptr current_layer_distancer = std::make_unique(po->layers()[layer_idx]); + for (size_t layer_idx = r.begin(); layer_idx < r.end(); ++layer_idx) { + size_t regions_with_perimeter = 0; + for (const LayerRegion *region : po->layers()[layer_idx]->regions()) { + if (region->perimeters.entities.size() > 0) { + regions_with_perimeter++; + } + }; + bool should_compute_layer_embedding = regions_with_perimeter > 1; + std::unique_ptr current_layer_distancer = std::make_unique( + to_unscaled_linesf(po->layers()[layer_idx]->lslices)); - for (SeamCandidate &perimeter_point : layers[layer_idx].points) { - Vec2f point = Vec2f{perimeter_point.position.head<2>()}; - if (prev_layer_distancer.get() != nullptr) { - perimeter_point.overhang = prev_layer_distancer->distance_from_perimeter(point) + 0.6f * perimeter_point.perimeter.flow_width - - tan(SeamPlacer::overhang_angle_threshold) * po->layers()[layer_idx]->height; - perimeter_point.overhang = perimeter_point.overhang < 0.0f ? 0.0f : perimeter_point.overhang; - } + for (SeamCandidate &perimeter_point : layers[layer_idx].points) { + Vec2f point = Vec2f { perimeter_point.position.head<2>() }; + if (prev_layer_distancer.get() != nullptr) { + perimeter_point.overhang = prev_layer_distancer->distance_from_lines(point.cast()) + + 0.6f * perimeter_point.perimeter.flow_width + - tan(SeamPlacer::overhang_angle_threshold) + * po->layers()[layer_idx]->height; + perimeter_point.overhang = + perimeter_point.overhang < 0.0f ? 0.0f : perimeter_point.overhang; + } - if (should_compute_layer_embedding) { // search for embedded perimeter points (points hidden inside the print ,e.g. multimaterial join, best position for seam) - perimeter_point.embedded_distance = current_layer_distancer->distance_from_perimeter(point) + 0.6f * perimeter_point.perimeter.flow_width; - } - } + if (should_compute_layer_embedding) { // search for embedded perimeter points (points hidden inside the print ,e.g. multimaterial join, best position for seam) + perimeter_point.embedded_distance = current_layer_distancer->distance_from_lines(point.cast()) + + 0.6f * perimeter_point.perimeter.flow_width; + } + } - prev_layer_distancer.swap(current_layer_distancer); - } - }); + prev_layer_distancer.swap(current_layer_distancer); + } + } + ); } // Estimates, if there is good seam point in the layer_idx which is close to last_point_pos @@ -994,107 +1097,122 @@ void SeamPlacer::calculate_overhangs_and_layer_embedding(const PrintObject *po) // If the closest point is good enough to replace current chosen seam, it is stored in potential_string_seams, returns true and updates last_point_pos // Otherwise does nothing, returns false // Used by align_seam_points(). -std::optional> SeamPlacer::find_next_seam_in_layer(const std::vector &layers, - const Vec3f & projected_position, - const size_t layer_idx, - const float max_distance, - const SeamPlacerImpl::SeamComparator & comparator) const -{ - using namespace SeamPlacerImpl; - std::vector nearby_points_indices = find_nearby_points(*layers[layer_idx].points_tree, projected_position, max_distance); - - if (nearby_points_indices.empty()) { return {}; } - - size_t best_nearby_point_index = nearby_points_indices[0]; - size_t nearest_point_index = nearby_points_indices[0]; - - // Now find best nearby point, nearest point, and corresponding indices - for (const size_t &nearby_point_index : nearby_points_indices) { - const SeamCandidate &point = layers[layer_idx].points[nearby_point_index]; - if (point.perimeter.finalized) { - continue; // skip over finalized perimeters, try to find some that is not finalized - } - if (comparator.is_first_better(point, layers[layer_idx].points[best_nearby_point_index], projected_position.head<2>()) || - layers[layer_idx].points[best_nearby_point_index].perimeter.finalized) { - best_nearby_point_index = nearby_point_index; - } - if ((point.position - projected_position).squaredNorm() < (layers[layer_idx].points[nearest_point_index].position - projected_position).squaredNorm() || - layers[layer_idx].points[nearest_point_index].perimeter.finalized) { - nearest_point_index = nearby_point_index; - } - } - - const SeamCandidate &best_nearby_point = layers[layer_idx].points[best_nearby_point_index]; - const SeamCandidate &nearest_point = layers[layer_idx].points[nearest_point_index]; - - if (nearest_point.perimeter.finalized) { - // all points are from already finalized perimeter, skip - return {}; - } - - // from the nearest_point, deduce index of seam in the next layer - const SeamCandidate &next_layer_seam = layers[layer_idx].points[nearest_point.perimeter.seam_index]; - - // First try to pick central enforcer if any present - if (next_layer_seam.central_enforcer && (next_layer_seam.position - projected_position).squaredNorm() < sqr(3 * max_distance)) { - return {std::pair{layer_idx, nearest_point.perimeter.seam_index}}; - } - - // First try to align the nearest, then try the best nearby - if (comparator.is_first_not_much_worse(nearest_point, next_layer_seam)) { return {std::pair{layer_idx, nearest_point_index}}; } - // If nearest point is not good enough, try it with the best nearby point. - if (comparator.is_first_not_much_worse(best_nearby_point, next_layer_seam)) { return {std::pair{layer_idx, best_nearby_point_index}}; } +std::optional> SeamPlacer::find_next_seam_in_layer( + const std::vector &layers, + const Vec3f &projected_position, + const size_t layer_idx, const float max_distance, + const SeamPlacerImpl::SeamComparator &comparator) const { + using namespace SeamPlacerImpl; + std::vector nearby_points_indices = find_nearby_points(*layers[layer_idx].points_tree, projected_position, + max_distance); + if (nearby_points_indices.empty()) { return {}; + } + + size_t best_nearby_point_index = nearby_points_indices[0]; + size_t nearest_point_index = nearby_points_indices[0]; + + // Now find best nearby point, nearest point, and corresponding indices + for (const size_t &nearby_point_index : nearby_points_indices) { + const SeamCandidate &point = layers[layer_idx].points[nearby_point_index]; + if (point.perimeter.finalized) { + continue; // skip over finalized perimeters, try to find some that is not finalized + } + if (comparator.is_first_better(point, layers[layer_idx].points[best_nearby_point_index], + projected_position.head<2>()) + || layers[layer_idx].points[best_nearby_point_index].perimeter.finalized) { + best_nearby_point_index = nearby_point_index; + } + if ((point.position - projected_position).squaredNorm() + < (layers[layer_idx].points[nearest_point_index].position - projected_position).squaredNorm() + || layers[layer_idx].points[nearest_point_index].perimeter.finalized) { + nearest_point_index = nearby_point_index; + } + } + + const SeamCandidate &best_nearby_point = layers[layer_idx].points[best_nearby_point_index]; + const SeamCandidate &nearest_point = layers[layer_idx].points[nearest_point_index]; + + if (nearest_point.perimeter.finalized) { + //all points are from already finalized perimeter, skip + return {}; + } + + //from the nearest_point, deduce index of seam in the next layer + const SeamCandidate &next_layer_seam = layers[layer_idx].points[nearest_point.perimeter.seam_index]; + + // First try to pick central enforcer if any present + if (next_layer_seam.central_enforcer + && (next_layer_seam.position - projected_position).squaredNorm() + < sqr(3 * max_distance)) { + return {std::pair {layer_idx, nearest_point.perimeter.seam_index}}; + } + + // First try to align the nearest, then try the best nearby + if (comparator.is_first_not_much_worse(nearest_point, next_layer_seam)) { + return {std::pair {layer_idx, nearest_point_index}}; + } + // If nearest point is not good enough, try it with the best nearby point. + if (comparator.is_first_not_much_worse(best_nearby_point, next_layer_seam)) { + return {std::pair {layer_idx, best_nearby_point_index}}; + } + + return {}; } -std::vector> SeamPlacer::find_seam_string(const PrintObject * po, - std::pair start_seam, - const SeamPlacerImpl::SeamComparator &comparator) const -{ - const std::vector &layers = m_seam_per_object.find(po)->second.layers; - int layer_idx = start_seam.first; +std::vector> SeamPlacer::find_seam_string(const PrintObject *po, + std::pair start_seam, const SeamPlacerImpl::SeamComparator &comparator) const { + const std::vector &layers = m_seam_per_object.find(po)->second.layers; + int layer_idx = start_seam.first; - // initialize searching for seam string - cluster of nearby seams on previous and next layers - int next_layer = layer_idx + 1; - int step = 1; - std::pair prev_point_index = start_seam; - std::vector> seam_string{start_seam}; + //initialize searching for seam string - cluster of nearby seams on previous and next layers + int next_layer = layer_idx + 1; + int step = 1; + std::pair prev_point_index = start_seam; + std::vector> seam_string { start_seam }; - auto reverse_lookup_direction = [&]() { - step = -1; - prev_point_index = start_seam; - next_layer = layer_idx - 1; - }; + auto reverse_lookup_direction = [&]() { + step = -1; + prev_point_index = start_seam; + next_layer = layer_idx - 1; + }; - while (next_layer >= 0) { - if (next_layer >= int(layers.size())) { - reverse_lookup_direction(); - if (next_layer < 0) { break; } - } - float max_distance = SeamPlacer::seam_align_tolerable_dist_factor * layers[start_seam.first].points[start_seam.second].perimeter.flow_width; - Vec3f prev_position = layers[prev_point_index.first].points[prev_point_index.second].position; - Vec3f projected_position = prev_position; - projected_position.z() = float(po->get_layer(next_layer)->slice_z); - - std::optional> maybe_next_seam = find_next_seam_in_layer(layers, projected_position, next_layer, max_distance, comparator); - - if (maybe_next_seam.has_value()) { - // For old macOS (pre 10.14), std::optional does not have .value() method, so the code is using operator*() instead. - seam_string.push_back(maybe_next_seam.operator*()); - prev_point_index = seam_string.back(); - // String added, prev_point_index updated - } else { - if (step == 1) { - reverse_lookup_direction(); - if (next_layer < 0) { break; } - } else { - break; - } - } - next_layer += step; + while (next_layer >= 0) { + if (next_layer >= int(layers.size())) { + reverse_lookup_direction(); + if (next_layer < 0) { + break; + } } - return seam_string; + float max_distance = SeamPlacer::seam_align_tolerable_dist_factor * + layers[start_seam.first].points[start_seam.second].perimeter.flow_width; + Vec3f prev_position = layers[prev_point_index.first].points[prev_point_index.second].position; + Vec3f projected_position = prev_position; + projected_position.z() = float(po->get_layer(next_layer)->slice_z); + + std::optional> maybe_next_seam = find_next_seam_in_layer(layers, projected_position, + next_layer, + max_distance, comparator); + + if (maybe_next_seam.has_value()) { + // For old macOS (pre 10.14), std::optional does not have .value() method, so the code is using operator*() instead. + seam_string.push_back(maybe_next_seam.operator*()); + prev_point_index = seam_string.back(); + //String added, prev_point_index updated + } else { + if (step == 1) { + reverse_lookup_direction(); + if (next_layer < 0) { + break; + } + } else { + break; + } + } + next_layer += step; + } + return seam_string; } // clusters already chosen seam points into strings across multiple layers, and then @@ -1102,284 +1220,398 @@ std::vector> SeamPlacer::find_seam_string(const PrintO // Does not change the positions of the SeamCandidates themselves, instead stores // the new aligned position into the shared Perimeter structure of each perimeter // Note that this position does not necesarilly lay on the perimeter. -void SeamPlacer::align_seam_points(const PrintObject *po, const SeamPlacerImpl::SeamComparator &comparator) -{ - using namespace SeamPlacerImpl; +void SeamPlacer::align_seam_points(const PrintObject *po, const SeamPlacerImpl::SeamComparator &comparator) { + using namespace SeamPlacerImpl; - // Prepares Debug files for writing. + // Prepares Debug files for writing. #ifdef DEBUG_FILES - Slic3r::CNumericLocalesSetter locales_setter; - auto clusters_f = debug_out_path("seam_clusters.obj"); - FILE * clusters = boost::nowide::fopen(clusters_f.c_str(), "w"); - if (clusters == nullptr) { - BOOST_LOG_TRIVIAL(error) << "stl_write_obj: Couldn't open " << clusters_f << " for writing"; - return; - } - auto aligned_f = debug_out_path("aligned_clusters.obj"); - FILE *aligns = boost::nowide::fopen(aligned_f.c_str(), "w"); - if (aligns == nullptr) { - BOOST_LOG_TRIVIAL(error) << "stl_write_obj: Couldn't open " << clusters_f << " for writing"; - return; - } + Slic3r::CNumericLocalesSetter locales_setter; + auto clusters_f = debug_out_path("seam_clusters.obj"); + FILE *clusters = boost::nowide::fopen(clusters_f.c_str(), "w"); + if (clusters == nullptr) { + BOOST_LOG_TRIVIAL(error) + << "stl_write_obj: Couldn't open " << clusters_f << " for writing"; + return; + } + auto aligned_f = debug_out_path("aligned_clusters.obj"); + FILE *aligns = boost::nowide::fopen(aligned_f.c_str(), "w"); + if (aligns == nullptr) { + BOOST_LOG_TRIVIAL(error) + << "stl_write_obj: Couldn't open " << clusters_f << " for writing"; + return; + } #endif - // gather vector of all seams on the print_object - pair of layer_index and seam__index within that layer - const std::vector &layers = m_seam_per_object[po].layers; - std::vector> seams; - for (size_t layer_idx = 0; layer_idx < layers.size(); ++layer_idx) { - const std::vector &layer_perimeter_points = layers[layer_idx].points; - size_t current_point_index = 0; - while (current_point_index < layer_perimeter_points.size()) { - seams.emplace_back(layer_idx, layer_perimeter_points[current_point_index].perimeter.seam_index); - current_point_index = layer_perimeter_points[current_point_index].perimeter.end_index; - } + //gather vector of all seams on the print_object - pair of layer_index and seam__index within that layer + const std::vector &layers = m_seam_per_object[po].layers; + std::vector> seams; + for (size_t layer_idx = 0; layer_idx < layers.size(); ++layer_idx) { + const std::vector &layer_perimeter_points = layers[layer_idx].points; + size_t current_point_index = 0; + while (current_point_index < layer_perimeter_points.size()) { + seams.emplace_back(layer_idx, layer_perimeter_points[current_point_index].perimeter.seam_index); + current_point_index = layer_perimeter_points[current_point_index].perimeter.end_index; } + } - // sort them before alignment. Alignment is sensitive to initializaion, this gives it better chance to choose something nice - std::stable_sort(seams.begin(), seams.end(), [&comparator, &layers](const std::pair &left, const std::pair &right) { - return comparator.is_first_better(layers[left.first].points[left.second], layers[right.first].points[right.second]); - }); + //sort them before alignment. Alignment is sensitive to initializaion, this gives it better chance to choose something nice + std::stable_sort(seams.begin(), seams.end(), + [&comparator, &layers](const std::pair &left, + const std::pair &right) { + return comparator.is_first_better(layers[left.first].points[left.second], + layers[right.first].points[right.second]); + } + ); - // align the seam points - start with the best, and check if they are aligned, if yes, skip, else start alignment - // Keeping the vectors outside, so with a bit of luck they will not get reallocated after couple of for loop iterations. - std::vector> seam_string; - std::vector> alternative_seam_string; - std::vector observations; - std::vector observation_points; - std::vector weights; + //align the seam points - start with the best, and check if they are aligned, if yes, skip, else start alignment + // Keeping the vectors outside, so with a bit of luck they will not get reallocated after couple of for loop iterations. + std::vector> seam_string; + std::vector> alternative_seam_string; + std::vector observations; + std::vector observation_points; + std::vector weights; - int global_index = 0; - while (global_index < int(seams.size())) { - size_t layer_idx = seams[global_index].first; - size_t seam_index = seams[global_index].second; - global_index++; - const std::vector &layer_perimeter_points = layers[layer_idx].points; - if (layer_perimeter_points[seam_index].perimeter.finalized) { - // This perimeter is already aligned, skip seam - continue; - } else { - seam_string = this->find_seam_string(po, {layer_idx, seam_index}, comparator); - size_t step_size = 1 + seam_string.size() / 20; - for (size_t alternative_start = 0; alternative_start < seam_string.size(); alternative_start += step_size) { - size_t start_layer_idx = seam_string[alternative_start].first; - size_t seam_idx = layers[start_layer_idx].points[seam_string[alternative_start].second].perimeter.seam_index; - alternative_seam_string = this->find_seam_string(po, std::pair(start_layer_idx, seam_idx), comparator); - if (alternative_seam_string.size() > seam_string.size()) { seam_string = std::move(alternative_seam_string); } - } - if (seam_string.size() < seam_align_minimum_string_seams) { - // string NOT long enough to be worth aligning, skip - continue; - } - - // String is long enough, all string seams and potential string seams gathered, now do the alignment - // sort by layer index - std::sort(seam_string.begin(), seam_string.end(), - [](const std::pair &left, const std::pair &right) { return left.first < right.first; }); - - // repeat the alignment for the current seam, since it could be skipped due to alternative path being aligned. - global_index--; - - // gather all positions of seams and their weights - observations.resize(seam_string.size()); - observation_points.resize(seam_string.size()); - weights.resize(seam_string.size()); - - auto angle_3d = [](const Vec3f &a, const Vec3f &b) { return std::abs(acosf(a.normalized().dot(b.normalized()))); }; - - auto angle_weight = [](float angle) { return 1.0f / (0.1f + compute_angle_penalty(angle)); }; - - // gather points positions and weights - float total_length = 0.0f; - Vec3f last_point_pos = layers[seam_string[0].first].points[seam_string[0].second].position; - for (size_t index = 0; index < seam_string.size(); ++index) { - const SeamCandidate ¤t = layers[seam_string[index].first].points[seam_string[index].second]; - float layer_angle = 0.0f; - if (index > 0 && index < seam_string.size() - 1) { - layer_angle = angle_3d(current.position - layers[seam_string[index - 1].first].points[seam_string[index - 1].second].position, - layers[seam_string[index + 1].first].points[seam_string[index + 1].second].position - current.position); - } - observations[index] = current.position.head<2>(); - observation_points[index] = current.position.z(); - weights[index] = angle_weight(current.local_ccw_angle); - float sign = layer_angle > 2.0 * std::abs(current.local_ccw_angle) ? -0.8f : 1.0f; - if (current.type == EnforcedBlockedSeamPoint::Enforced) { - sign = 1.0f; - weights[index] += 3.0f; - } - total_length += sign * (last_point_pos - current.position).norm(); - last_point_pos = current.position; - } - - // Curve Fitting - size_t number_of_segments = std::max(size_t(1), size_t(std::max(0.0f, total_length) / SeamPlacer::seam_align_mm_per_segment)); - auto curve = Geometry::fit_cubic_bspline(observations, observation_points, weights, number_of_segments); - - // Do alignment - compute fitted point for each point in the string from its Z coord, and store the position into - // Perimeter structure of the point; also set flag aligned to true - for (size_t index = 0; index < seam_string.size(); ++index) { - const auto &pair = seam_string[index]; - float t = std::min(1.0f, std::pow(std::abs(layers[pair.first].points[pair.second].local_ccw_angle) / SeamPlacer::sharp_angle_snapping_threshold, 3.0f)); - if (layers[pair.first].points[pair.second].type == EnforcedBlockedSeamPoint::Enforced) { t = std::max(0.4f, t); } - - Vec3f current_pos = layers[pair.first].points[pair.second].position; - Vec2f fitted_pos = curve.get_fitted_value(current_pos.z()); - - // interpolate between current and fitted position, prefer current pos for large weights. - Vec3f final_position = t * current_pos + (1.0f - t) * to_3d(fitted_pos, current_pos.z()); - - Perimeter &perimeter = layers[pair.first].points[pair.second].perimeter; - perimeter.seam_index = pair.second; - perimeter.final_seam_position = final_position; - perimeter.finalized = true; - } - -#ifdef DEBUG_FILES - auto randf = []() { return float(rand()) / float(RAND_MAX); }; - Vec3f color{randf(), randf(), randf()}; - for (size_t i = 0; i < seam_string.size(); ++i) { - auto orig_seam = layers[seam_string[i].first].points[seam_string[i].second]; - fprintf(clusters, "v %f %f %f %f %f %f \n", orig_seam.position[0], orig_seam.position[1], orig_seam.position[2], color[0], color[1], color[2]); - } - - color = Vec3f{randf(), randf(), randf()}; - for (size_t i = 0; i < seam_string.size(); ++i) { - const Perimeter &perimeter = layers[seam_string[i].first].points[seam_string[i].second].perimeter; - fprintf(aligns, "v %f %f %f %f %f %f \n", perimeter.final_seam_position[0], perimeter.final_seam_position[1], perimeter.final_seam_position[2], color[0], - color[1], color[2]); - } -#endif - } - } - -#ifdef DEBUG_FILES - fclose(clusters); - fclose(aligns); -#endif -} - -void SeamPlacer::init(const Print &print, std::function throw_if_canceled_func) -{ - using namespace SeamPlacerImpl; - m_seam_per_object.clear(); - - for (const PrintObject *po : print.objects()) { - throw_if_canceled_func(); - SeamPosition configured_seam_preference = po->config().seam_position.value; - SeamComparator comparator{configured_seam_preference}; - - { - GlobalModelInfo global_model_info{}; - gather_enforcers_blockers(global_model_info, po); - throw_if_canceled_func(); - if (configured_seam_preference == spAligned || configured_seam_preference == spNearest) { compute_global_occlusion(global_model_info, po, throw_if_canceled_func); } - throw_if_canceled_func(); - BOOST_LOG_TRIVIAL(debug) << "SeamPlacer: gather_seam_candidates: start"; - gather_seam_candidates(po, global_model_info, configured_seam_preference); - BOOST_LOG_TRIVIAL(debug) << "SeamPlacer: gather_seam_candidates: end"; - throw_if_canceled_func(); - if (configured_seam_preference == spAligned || configured_seam_preference == spNearest) { - BOOST_LOG_TRIVIAL(debug) << "SeamPlacer: calculate_candidates_visibility : start"; - calculate_candidates_visibility(po, global_model_info); - BOOST_LOG_TRIVIAL(debug) << "SeamPlacer: calculate_candidates_visibility : end"; - } - } // destruction of global_model_info (large structure, no longer needed) - throw_if_canceled_func(); - BOOST_LOG_TRIVIAL(debug) << "SeamPlacer: calculate_overhangs and layer embdedding : start"; - calculate_overhangs_and_layer_embedding(po); - BOOST_LOG_TRIVIAL(debug) << "SeamPlacer: calculate_overhangs and layer embdedding: end"; - throw_if_canceled_func(); - if (configured_seam_preference != spNearest) { // For spNearest, the seam is picked in the place_seam method with actual nozzle position information - BOOST_LOG_TRIVIAL(debug) << "SeamPlacer: pick_seam_point : start"; - // pick seam point - std::vector &layers = m_seam_per_object[po].layers; - tbb::parallel_for(tbb::blocked_range(0, layers.size()), [&layers, configured_seam_preference, comparator](tbb::blocked_range r) { - for (size_t layer_idx = r.begin(); layer_idx < r.end(); ++layer_idx) { - std::vector &layer_perimeter_points = layers[layer_idx].points; - for (size_t current = 0; current < layer_perimeter_points.size(); current = layer_perimeter_points[current].perimeter.end_index) - if (configured_seam_preference == spRandom) - pick_random_seam_point(layer_perimeter_points, current); - else - pick_seam_point(layer_perimeter_points, current, comparator); - } - }); - BOOST_LOG_TRIVIAL(debug) << "SeamPlacer: pick_seam_point : end"; - } - throw_if_canceled_func(); - if (configured_seam_preference == spAligned || configured_seam_preference == spRear) { - BOOST_LOG_TRIVIAL(debug) << "SeamPlacer: align_seam_points : start"; - align_seam_points(po, comparator); - BOOST_LOG_TRIVIAL(debug) << "SeamPlacer: align_seam_points : end"; - } - -#ifdef DEBUG_FILES - debug_export_points(m_seam_per_object[po].layers, po->bounding_box(), comparator); -#endif - } -} - -void SeamPlacer::place_seam(const Layer *layer, ExtrusionLoop &loop, bool external_first, const Point &last_pos) const -{ - using namespace SeamPlacerImpl; - const PrintObject *po = layer->object(); - // Must not be called with supprot layer. - assert(dynamic_cast(layer) == nullptr); - // Object layer IDs are incremented by the number of raft layers. - assert(layer->id() >= po->slicing_parameters().raft_layers()); - const size_t layer_index = layer->id() - po->slicing_parameters().raft_layers(); - const double unscaled_z = layer->slice_z; - - const PrintObjectSeamData::LayerSeams &layer_perimeters = m_seam_per_object.find(layer->object())->second.layers[layer_index]; - - // Find the closest perimeter in the SeamPlacer to the first point of this loop. - size_t closest_perimeter_point_index; - { - const Point &fp = loop.first_point(); - Vec2f unscaled_p = unscaled(fp); - closest_perimeter_point_index = find_closest_point(*layer_perimeters.points_tree.get(), to_3d(unscaled_p, float(unscaled_z))); - } - - Vec3f seam_position; - size_t seam_index; - if (const Perimeter &perimeter = layer_perimeters.points[closest_perimeter_point_index].perimeter; perimeter.finalized) { - seam_position = perimeter.final_seam_position; - seam_index = perimeter.seam_index; + int global_index = 0; + while (global_index < int(seams.size())) { + size_t layer_idx = seams[global_index].first; + size_t seam_index = seams[global_index].second; + global_index++; + const std::vector &layer_perimeter_points = layers[layer_idx].points; + if (layer_perimeter_points[seam_index].perimeter.finalized) { + // This perimeter is already aligned, skip seam + continue; } else { - seam_index = po->config().seam_position == spNearest ? pick_nearest_seam_point_index(layer_perimeters.points, perimeter.start_index, unscaled(last_pos)) : - perimeter.seam_index; - seam_position = layer_perimeters.points[seam_index].position; + seam_string = this->find_seam_string(po, { layer_idx, seam_index }, comparator); + size_t step_size = 1 + seam_string.size() / 20; + for (size_t alternative_start = 0; alternative_start < seam_string.size(); alternative_start += step_size) { + size_t start_layer_idx = seam_string[alternative_start].first; + size_t seam_idx = + layers[start_layer_idx].points[seam_string[alternative_start].second].perimeter.seam_index; + alternative_seam_string = this->find_seam_string(po, + std::pair(start_layer_idx, seam_idx), comparator); + if (alternative_seam_string.size() > seam_string.size()) { + seam_string = std::move(alternative_seam_string); + } + } + if (seam_string.size() < seam_align_minimum_string_seams) { + //string NOT long enough to be worth aligning, skip + continue; + } + + // String is long enough, all string seams and potential string seams gathered, now do the alignment + //sort by layer index + std::sort(seam_string.begin(), seam_string.end(), + [](const std::pair &left, const std::pair &right) { + return left.first < right.first; + }); + + //repeat the alignment for the current seam, since it could be skipped due to alternative path being aligned. + global_index--; + + // gather all positions of seams and their weights + observations.resize(seam_string.size()); + observation_points.resize(seam_string.size()); + weights.resize(seam_string.size()); + + auto angle_3d = [](const Vec3f& a, const Vec3f& b){ + return std::abs(acosf(a.normalized().dot(b.normalized()))); + }; + + auto angle_weight = [](float angle){ + return 1.0f / (0.1f + compute_angle_penalty(angle)); + }; + + //gather points positions and weights + float total_length = 0.0f; + Vec3f last_point_pos = layers[seam_string[0].first].points[seam_string[0].second].position; + for (size_t index = 0; index < seam_string.size(); ++index) { + const SeamCandidate ¤t = layers[seam_string[index].first].points[seam_string[index].second]; + float layer_angle = 0.0f; + if (index > 0 && index < seam_string.size() - 1) { + layer_angle = angle_3d( + current.position + - layers[seam_string[index - 1].first].points[seam_string[index - 1].second].position, + layers[seam_string[index + 1].first].points[seam_string[index + 1].second].position + - current.position + ); + } + observations[index] = current.position.head<2>(); + observation_points[index] = current.position.z(); + weights[index] = angle_weight(current.local_ccw_angle); + float curling_influence = layer_angle > 2.0 * std::abs(current.local_ccw_angle) ? -0.8f : 1.0f; + if (current.type == EnforcedBlockedSeamPoint::Enforced) { + curling_influence = 1.0f; + weights[index] += 3.0f; + } + total_length += curling_influence * (last_point_pos - current.position).norm(); + last_point_pos = current.position; + } + + if (comparator.setup == spRear) { + total_length *= 0.3f; + } + + // Curve Fitting + size_t number_of_segments = std::max(size_t(1), + size_t(std::max(0.0f,total_length) / SeamPlacer::seam_align_mm_per_segment)); + auto curve = Geometry::fit_cubic_bspline(observations, observation_points, weights, number_of_segments); + + // Do alignment - compute fitted point for each point in the string from its Z coord, and store the position into + // Perimeter structure of the point; also set flag aligned to true + for (size_t index = 0; index < seam_string.size(); ++index) { + const auto &pair = seam_string[index]; + float t = std::min(1.0f, std::pow(std::abs(layers[pair.first].points[pair.second].local_ccw_angle) + / SeamPlacer::sharp_angle_snapping_threshold, 3.0f)); + if (layers[pair.first].points[pair.second].type == EnforcedBlockedSeamPoint::Enforced){ + t = std::max(0.4f, t); + } + + Vec3f current_pos = layers[pair.first].points[pair.second].position; + Vec2f fitted_pos = curve.get_fitted_value(current_pos.z()); + + //interpolate between current and fitted position, prefer current pos for large weights. + Vec3f final_position = t * current_pos + (1.0f - t) * to_3d(fitted_pos, current_pos.z()); + + Perimeter &perimeter = layers[pair.first].points[pair.second].perimeter; + perimeter.seam_index = pair.second; + perimeter.final_seam_position = final_position; + perimeter.finalized = true; + } + +#ifdef DEBUG_FILES + auto randf = []() { + return float(rand()) / float(RAND_MAX); + }; + Vec3f color { randf(), randf(), randf() }; + for (size_t i = 0; i < seam_string.size(); ++i) { + auto orig_seam = layers[seam_string[i].first].points[seam_string[i].second]; + fprintf(clusters, "v %f %f %f %f %f %f \n", orig_seam.position[0], + orig_seam.position[1], + orig_seam.position[2], color[0], color[1], + color[2]); + } + + color = Vec3f { randf(), randf(), randf() }; + for (size_t i = 0; i < seam_string.size(); ++i) { + const Perimeter &perimeter = layers[seam_string[i].first].points[seam_string[i].second].perimeter; + fprintf(aligns, "v %f %f %f %f %f %f \n", perimeter.final_seam_position[0], + perimeter.final_seam_position[1], + perimeter.final_seam_position[2], color[0], color[1], + color[2]); + } +#endif + } + } + +#ifdef DEBUG_FILES + fclose(clusters); + fclose(aligns); +#endif + +} + +void SeamPlacer::init(const Print &print, std::function throw_if_canceled_func) { + using namespace SeamPlacerImpl; + m_seam_per_object.clear(); + + for (const PrintObject *po : print.objects()) { + throw_if_canceled_func(); + SeamPosition configured_seam_preference = po->config().seam_position.value; + SeamComparator comparator { configured_seam_preference }; + + { + GlobalModelInfo global_model_info { }; + gather_enforcers_blockers(global_model_info, po); + throw_if_canceled_func(); + if (configured_seam_preference == spAligned || configured_seam_preference == spNearest) { + compute_global_occlusion(global_model_info, po, throw_if_canceled_func); + } + throw_if_canceled_func(); + BOOST_LOG_TRIVIAL(debug) + << "SeamPlacer: gather_seam_candidates: start"; + gather_seam_candidates(po, global_model_info); + BOOST_LOG_TRIVIAL(debug) + << "SeamPlacer: gather_seam_candidates: end"; + throw_if_canceled_func(); + if (configured_seam_preference == spAligned || configured_seam_preference == spNearest) { + BOOST_LOG_TRIVIAL(debug) + << "SeamPlacer: calculate_candidates_visibility : start"; + calculate_candidates_visibility(po, global_model_info); + BOOST_LOG_TRIVIAL(debug) + << "SeamPlacer: calculate_candidates_visibility : end"; + } + } // destruction of global_model_info (large structure, no longer needed) + throw_if_canceled_func(); + BOOST_LOG_TRIVIAL(debug) + << "SeamPlacer: calculate_overhangs and layer embdedding : start"; + calculate_overhangs_and_layer_embedding(po); + BOOST_LOG_TRIVIAL(debug) + << "SeamPlacer: calculate_overhangs and layer embdedding: end"; + throw_if_canceled_func(); + if (configured_seam_preference != spNearest) { // For spNearest, the seam is picked in the place_seam method with actual nozzle position information + BOOST_LOG_TRIVIAL(debug) + << "SeamPlacer: pick_seam_point : start"; + //pick seam point + std::vector &layers = m_seam_per_object[po].layers; + tbb::parallel_for(tbb::blocked_range(0, layers.size()), + [&layers, configured_seam_preference, comparator](tbb::blocked_range r) { + for (size_t layer_idx = r.begin(); layer_idx < r.end(); ++layer_idx) { + std::vector &layer_perimeter_points = layers[layer_idx].points; + for (size_t current = 0; current < layer_perimeter_points.size(); + current = layer_perimeter_points[current].perimeter.end_index) + if (configured_seam_preference == spRandom) + pick_random_seam_point(layer_perimeter_points, current); + else + pick_seam_point(layer_perimeter_points, current, comparator); + } + }); + BOOST_LOG_TRIVIAL(debug) + << "SeamPlacer: pick_seam_point : end"; + } + throw_if_canceled_func(); + if (configured_seam_preference == spAligned || configured_seam_preference == spRear) { + BOOST_LOG_TRIVIAL(debug) + << "SeamPlacer: align_seam_points : start"; + align_seam_points(po, comparator); + BOOST_LOG_TRIVIAL(debug) + << "SeamPlacer: align_seam_points : end"; } - Point seam_point = Point::new_scale(seam_position.x(), seam_position.y()); +#ifdef DEBUG_FILES + debug_export_points(m_seam_per_object[po].layers, po->bounding_box(), comparator); +#endif + } +} - if (const SeamCandidate &perimeter_point = layer_perimeters.points[seam_index]; - (po->config().seam_position == spNearest || po->config().seam_position == spAligned) && loop.role() == ExtrusionRole::erPerimeter && // Hopefully internal perimeter - (seam_position - perimeter_point.position).squaredNorm() < 4.0f && // seam is on perimeter point - perimeter_point.local_ccw_angle < -EPSILON // In concave angles +void SeamPlacer::place_seam(const Layer *layer, ExtrusionLoop &loop, bool external_first, + const Point &last_pos) const { + using namespace SeamPlacerImpl; + const PrintObject *po = layer->object(); + // Must not be called with supprot layer. + assert(dynamic_cast(layer) == nullptr); + // Object layer IDs are incremented by the number of raft layers. + assert(layer->id() >= po->slicing_parameters().raft_layers()); + const size_t layer_index = layer->id() - po->slicing_parameters().raft_layers(); + const double unscaled_z = layer->slice_z; + + auto get_next_loop_point = [loop](ExtrusionLoop::ClosestPathPoint current) { + current.segment_idx += 1; + if (current.segment_idx >= loop.paths[current.path_idx].polyline.points.size()) { + current.path_idx = next_idx_modulo(current.path_idx, loop.paths.size()); + current.segment_idx = 0; + } + current.foot_pt = loop.paths[current.path_idx].polyline.points[current.segment_idx]; + return current; + }; + + const PrintObjectSeamData::LayerSeams &layer_perimeters = + m_seam_per_object.find(layer->object())->second.layers[layer_index]; + + // Find the closest perimeter in the SeamPlacer to this loop. + // Repeat search until two consecutive points of the loop are found, that result in the same closest_perimeter + // This is beacuse with arachne, T-Junctions may exist and sometimes the wrong perimeter was chosen + size_t closest_perimeter_point_index = 0; + { // local space for the closest_perimeter_point_index + Perimeter *closest_perimeter = nullptr; + ExtrusionLoop::ClosestPathPoint closest_point{0,0,loop.paths[0].polyline.points[0]}; + size_t points_count = std::accumulate(loop.paths.begin(), loop.paths.end(), 0, [](size_t acc,const ExtrusionPath& p) { + return acc + p.polyline.points.size(); + }); + for (size_t i = 0; i < points_count; ++i) { + Vec2f unscaled_p = unscaled(closest_point.foot_pt); + closest_perimeter_point_index = find_closest_point(*layer_perimeters.points_tree.get(), + to_3d(unscaled_p, float(unscaled_z))); + if (closest_perimeter != &layer_perimeters.points[closest_perimeter_point_index].perimeter) { + closest_perimeter = &layer_perimeters.points[closest_perimeter_point_index].perimeter; + closest_point = get_next_loop_point(closest_point); + } else { + break; + } + } + } + + Vec3f seam_position; + size_t seam_index; + if (const Perimeter &perimeter = layer_perimeters.points[closest_perimeter_point_index].perimeter; + perimeter.finalized) { + seam_position = perimeter.final_seam_position; + seam_index = perimeter.seam_index; + } else { + seam_index = + po->config().seam_position == spNearest ? + pick_nearest_seam_point_index(layer_perimeters.points, perimeter.start_index, + unscaled(last_pos)) : + perimeter.seam_index; + seam_position = layer_perimeters.points[seam_index].position; + } + + Point seam_point = Point::new_scale(seam_position.x(), seam_position.y()); + + if (loop.role() == ExtrusionRole::erPerimeter) { //Hopefully inner perimeter + const SeamCandidate &perimeter_point = layer_perimeters.points[seam_index]; + ExtrusionLoop::ClosestPathPoint projected_point = loop.get_closest_path_and_point(seam_point, false); + // determine depth of the seam point. + float depth = (float) unscale(Point(seam_point - projected_point.foot_pt)).norm(); + float beta_angle = cos(perimeter_point.local_ccw_angle / 2.0f); + size_t index_of_prev = + seam_index == perimeter_point.perimeter.start_index ? + perimeter_point.perimeter.end_index - 1 : + seam_index - 1; + size_t index_of_next = + seam_index == perimeter_point.perimeter.end_index - 1 ? + perimeter_point.perimeter.start_index : + seam_index + 1; + + if ((seam_position - perimeter_point.position).squaredNorm() < depth && // seam is on perimeter point + perimeter_point.local_ccw_angle < -EPSILON // In concave angles ) { // In this case, we are at internal perimeter, where the external perimeter has seam in concave angle. We want to align - // the internal seam into the concave corner, and not on the perpendicular projection on the closest edge (which is what the split_at function does) - size_t index_of_prev = seam_index == perimeter_point.perimeter.start_index ? perimeter_point.perimeter.end_index - 1 : seam_index - 1; - size_t index_of_next = seam_index == perimeter_point.perimeter.end_index - 1 ? perimeter_point.perimeter.start_index : seam_index + 1; - - Vec2f dir_to_middle = ((perimeter_point.position - layer_perimeters.points[index_of_prev].position).head<2>().normalized() + - (perimeter_point.position - layer_perimeters.points[index_of_next].position).head<2>().normalized()) * - 0.5; - - ExtrusionLoop::ClosestPathPoint projected_point = loop.get_closest_path_and_point(seam_point, true); - // get closest projected point, determine depth of the seam point. - float depth = (float) unscale(Point(seam_point - projected_point.foot_pt)).norm(); - float angle_factor = cos(-perimeter_point.local_ccw_angle / 2.0f); // There are some nice geometric identities in determination of the correct depth of new seam point. - // overshoot the target depth, in concave angles it will correctly snap to the corner; TODO: find out why such big overshoot is needed. - Vec2f final_pos = perimeter_point.position.head<2>() + (1.4142 * depth / angle_factor) * dir_to_middle; - seam_point = Point::new_scale(final_pos.x(), final_pos.y()); + // the internal seam into the concave corner, and not on the perpendicular projection on the closest edge (which is what the split_at function does) + Vec2f dir_to_middle = + ((perimeter_point.position - layer_perimeters.points[index_of_prev].position).head<2>().normalized() + + (perimeter_point.position - layer_perimeters.points[index_of_next].position).head<2>().normalized()) + * 0.5; + depth = 1.4142 * depth / beta_angle; + // There are some nice geometric identities in determination of the correct depth of new seam point. + //overshoot the target depth, in concave angles it will correctly snap to the corner; TODO: find out why such big overshoot is needed. + Vec2f final_pos = perimeter_point.position.head<2>() + depth * dir_to_middle; + projected_point = loop.get_closest_path_and_point(Point::new_scale(final_pos.x(), final_pos.y()), false); + } else { // not concave angle, in that case the nearest point is the good candidate + // but for staggering, we also need to recompute depth of the inner perimter, because in convex corners, the distance is larger than layer width + // we want the perpendicular depth, not distance to nearest point + depth = depth * beta_angle / 1.4142; } - // Because the G-code export has 1um resolution, don't generate segments shorter than 1.5 microns, - // thus empty path segments will not be produced by G-code export. - if (!loop.split_at_vertex(seam_point, scaled(0.0015))) { - // The point is not in the original loop. - // Insert it. - loop.split_at(seam_point, true); + seam_point = projected_point.foot_pt; + + //lastly, for internal perimeters, do the staggering if requested + if (po->config().staggered_inner_seams && loop.length() > 0.0) { + //fix depth, it is sometimes strongly underestimated + depth = std::max(loop.paths[projected_point.path_idx].width, depth); + + while (depth > 0.0f) { + auto next_point = get_next_loop_point(projected_point); + Vec2f a = unscale(projected_point.foot_pt).cast(); + Vec2f b = unscale(next_point.foot_pt).cast(); + float dist = (a - b).norm(); + if (dist > depth) { + Vec2f final_pos = a + (b - a) * depth / dist; + next_point.foot_pt = Point::new_scale(final_pos.x(), final_pos.y()); + } + depth -= dist; + projected_point = next_point; + } + seam_point = projected_point.foot_pt; } + } + + // Because the G-code export has 1um resolution, don't generate segments shorter than 1.5 microns, + // thus empty path segments will not be produced by G-code export. + if (!loop.split_at_vertex(seam_point, scaled(0.0015))) { + // The point is not in the original loop. + // Insert it. + loop.split_at(seam_point, true); + } + } } // namespace Slic3r diff --git a/src/libslic3r/GCode/SeamPlacer.hpp b/src/libslic3r/GCode/SeamPlacer.hpp index 0c431202e1..a7bb12f4f4 100644 --- a/src/libslic3r/GCode/SeamPlacer.hpp +++ b/src/libslic3r/GCode/SeamPlacer.hpp @@ -27,139 +27,136 @@ class Grid; namespace SeamPlacerImpl { -// ************ FOR BACKPORT COMPATIBILITY ONLY *************** -// Angle from v1 to v2, returning double atan2(y, x) normalized to <-PI, PI>. -template inline double angle(const Eigen::MatrixBase &v1, const Eigen::MatrixBase &v2) -{ - static_assert(Derived::IsVectorAtCompileTime && int(Derived::SizeAtCompileTime) == 2, "angle(): first parameter is not a 2D vector"); - static_assert(Derived2::IsVectorAtCompileTime && int(Derived2::SizeAtCompileTime) == 2, "angle(): second parameter is not a 2D vector"); - auto v1d = v1.template cast(); - auto v2d = v2.template cast(); - return atan2(cross2(v1d, v2d), v1d.dot(v2d)); -} -// *************************** struct GlobalModelInfo; struct SeamComparator; enum class EnforcedBlockedSeamPoint { - Blocked = 0, - Neutral = 1, - Enforced = 2, + Blocked = 0, + Neutral = 1, + Enforced = 2, }; // struct representing single perimeter loop -struct Perimeter -{ - size_t start_index{}; - size_t end_index{}; // inclusive! - size_t seam_index{}; - float flow_width{}; +struct Perimeter { + size_t start_index{}; + size_t end_index{}; //inclusive! + size_t seam_index{}; + float flow_width{}; - // During alignment, a final position may be stored here. In that case, finalized is set to true. - // Note that final seam position is not limited to points of the perimeter loop. In theory it can be any position - // Random position also uses this flexibility to set final seam point position - bool finalized = false; - Vec3f final_seam_position = Vec3f::Zero(); + // During alignment, a final position may be stored here. In that case, finalized is set to true. + // Note that final seam position is not limited to points of the perimeter loop. In theory it can be any position + // Random position also uses this flexibility to set final seam point position + bool finalized = false; + Vec3f final_seam_position = Vec3f::Zero(); }; -// Struct over which all processing of perimeters is done. For each perimeter point, its respective candidate is created, +//Struct over which all processing of perimeters is done. For each perimeter point, its respective candidate is created, // then all the needed attributes are computed and finally, for each perimeter one point is chosen as seam. // This seam position can be then further aligned -struct SeamCandidate -{ - SeamCandidate(const Vec3f &pos, Perimeter &perimeter, float local_ccw_angle, EnforcedBlockedSeamPoint type) - : position(pos), perimeter(perimeter), visibility(0.0f), overhang(0.0f), embedded_distance(0.0f), local_ccw_angle(local_ccw_angle), type(type), central_enforcer(false) - {} - const Vec3f position; - // pointer to Perimeter loop of this point. It is shared across all points of the loop - Perimeter &perimeter; - float visibility; - float overhang; - // distance inside the merged layer regions, for detecting perimeter points which are hidden indside the print (e.g. multimaterial join) - // Negative sign means inside the print, comes from EdgeGrid structure - float embedded_distance; - float local_ccw_angle; - EnforcedBlockedSeamPoint type; - bool central_enforcer; // marks this candidate as central point of enforced segment on the perimeter - important for alignment +struct SeamCandidate { + SeamCandidate(const Vec3f &pos, Perimeter &perimeter, + float local_ccw_angle, + EnforcedBlockedSeamPoint type) : + position(pos), perimeter(perimeter), visibility(0.0f), overhang(0.0f), embedded_distance(0.0f), local_ccw_angle( + local_ccw_angle), type(type), central_enforcer(false) { + } + const Vec3f position; + // pointer to Perimeter loop of this point. It is shared across all points of the loop + Perimeter &perimeter; + float visibility; + float overhang; + // distance inside the merged layer regions, for detecting perimeter points which are hidden indside the print (e.g. multimaterial join) + // Negative sign means inside the print, comes from EdgeGrid structure + float embedded_distance; + float local_ccw_angle; + EnforcedBlockedSeamPoint type; + bool central_enforcer; //marks this candidate as central point of enforced segment on the perimeter - important for alignment }; -struct SeamCandidateCoordinateFunctor -{ - SeamCandidateCoordinateFunctor(const std::vector &seam_candidates) : seam_candidates(seam_candidates) {} - const std::vector &seam_candidates; - float operator()(size_t index, size_t dim) const { return seam_candidates[index].position[dim]; } +struct SeamCandidateCoordinateFunctor { + SeamCandidateCoordinateFunctor(const std::vector &seam_candidates) : + seam_candidates(seam_candidates) { + } + const std::vector &seam_candidates; + float operator()(size_t index, size_t dim) const { + return seam_candidates[index].position[dim]; + } }; } // namespace SeamPlacerImpl struct PrintObjectSeamData { - using SeamCandidatesTree = KDTreeIndirect<3, float, SeamPlacerImpl::SeamCandidateCoordinateFunctor>; + using SeamCandidatesTree = KDTreeIndirect<3, float, SeamPlacerImpl::SeamCandidateCoordinateFunctor>; - struct LayerSeams - { - Slic3r::deque perimeters; - std::vector points; - std::unique_ptr points_tree; - }; - // Map of PrintObjects (PO) -> vector of layers of PO -> vector of perimeter - std::vector layers; - // Map of PrintObjects (PO) -> vector of layers of PO -> unique_ptr to KD - // tree of all points of the given layer + struct LayerSeams + { + Slic3r::deque perimeters; + std::vector points; + std::unique_ptr points_tree; + }; + // Map of PrintObjects (PO) -> vector of layers of PO -> vector of perimeter + std::vector layers; + // Map of PrintObjects (PO) -> vector of layers of PO -> unique_ptr to KD + // tree of all points of the given layer - void clear() { layers.clear(); } + void clear() + { + layers.clear(); + } }; -class SeamPlacer -{ +class SeamPlacer { public: - // Number of samples generated on the mesh. There are sqr_rays_per_sample_point*sqr_rays_per_sample_point rays casted from each samples - static constexpr size_t raycasting_visibility_samples_count = 30000; - static constexpr size_t fast_decimation_triangle_count_target = 16000; - //square of number of rays per sample point - static constexpr size_t sqr_rays_per_sample_point = 5; + // Number of samples generated on the mesh. There are sqr_rays_per_sample_point*sqr_rays_per_sample_point rays casted from each samples + static constexpr size_t raycasting_visibility_samples_count = 30000; + static constexpr size_t fast_decimation_triangle_count_target = 16000; + //square of number of rays per sample point + static constexpr size_t sqr_rays_per_sample_point = 5; - // snapping angle - angles larger than this value will be snapped to during seam painting - static constexpr float sharp_angle_snapping_threshold = 55.0f * float(PI) / 180.0f; - // overhang angle for seam placement that still yields good results, in degrees, measured from vertical direction - //BBS - static constexpr float overhang_angle_threshold = 45.0f * float(PI) / 180.0f; + // snapping angle - angles larger than this value will be snapped to during seam painting + static constexpr float sharp_angle_snapping_threshold = 55.0f * float(PI) / 180.0f; + // overhang angle for seam placement that still yields good results, in degrees, measured from vertical direction + static constexpr float overhang_angle_threshold = 50.0f * float(PI) / 180.0f; - // determines angle importance compared to visibility ( neutral value is 1.0f. ) - static constexpr float angle_importance_aligned = 0.6f; - static constexpr float angle_importance_nearest = 1.0f; // use much higher angle importance for nearest mode, to combat the visibility info noise + // determines angle importance compared to visibility ( neutral value is 1.0f. ) + static constexpr float angle_importance_aligned = 0.6f; + static constexpr float angle_importance_nearest = 1.0f; // use much higher angle importance for nearest mode, to combat the visibility info noise - // For long polygon sides, if they are close to the custom seam drawings, they are oversampled with this step size - static constexpr float enforcer_oversampling_distance = 0.2f; + // For long polygon sides, if they are close to the custom seam drawings, they are oversampled with this step size + static constexpr float enforcer_oversampling_distance = 0.2f; - // When searching for seam clusters for alignment: - // following value describes, how much worse score can point have and still be picked into seam cluster instead of original seam point on the same layer - static constexpr float seam_align_score_tolerance = 0.3f; - // seam_align_tolerable_dist_factor - how far to search for seam from current position, final dist is seam_align_tolerable_dist_factor * flow_width - static constexpr float seam_align_tolerable_dist_factor = 4.0f; - // minimum number of seams needed in cluster to make alignment happen - static constexpr size_t seam_align_minimum_string_seams = 6; - // millimeters covered by spline; determines number of splines for the given string - static constexpr size_t seam_align_mm_per_segment = 4.0f; + // When searching for seam clusters for alignment: + // following value describes, how much worse score can point have and still be picked into seam cluster instead of original seam point on the same layer + static constexpr float seam_align_score_tolerance = 0.3f; + // seam_align_tolerable_dist_factor - how far to search for seam from current position, final dist is seam_align_tolerable_dist_factor * flow_width + static constexpr float seam_align_tolerable_dist_factor = 4.0f; + // minimum number of seams needed in cluster to make alignment happen + static constexpr size_t seam_align_minimum_string_seams = 6; + // millimeters covered by spline; determines number of splines for the given string + static constexpr size_t seam_align_mm_per_segment = 4.0f; - // The following data structures hold all perimeter points for all PrintObject. - std::unordered_map m_seam_per_object; + //The following data structures hold all perimeter points for all PrintObject. + std::unordered_map m_seam_per_object; - void init(const Print &print, std::function throw_if_canceled_func); + void init(const Print &print, std::function throw_if_canceled_func); - void place_seam(const Layer *layer, ExtrusionLoop &loop, bool external_first, const Point &last_pos) const; + void place_seam(const Layer *layer, ExtrusionLoop &loop, bool external_first, const Point &last_pos) const; private: - void gather_seam_candidates(const PrintObject *po, const SeamPlacerImpl::GlobalModelInfo &global_model_info, const SeamPosition configured_seam_preference); - void calculate_candidates_visibility(const PrintObject *po, const SeamPlacerImpl::GlobalModelInfo &global_model_info); - void calculate_overhangs_and_layer_embedding(const PrintObject *po); - void align_seam_points(const PrintObject *po, const SeamPlacerImpl::SeamComparator &comparator); - std::vector> find_seam_string(const PrintObject *po, std::pair start_seam, const SeamPlacerImpl::SeamComparator &comparator) const; - std::optional> find_next_seam_in_layer(const std::vector &layers, - const Vec3f & projected_position, - const size_t layer_idx, - const float max_distance, - const SeamPlacerImpl::SeamComparator & comparator) const; + void gather_seam_candidates(const PrintObject *po, const SeamPlacerImpl::GlobalModelInfo &global_model_info); + void calculate_candidates_visibility(const PrintObject *po, + const SeamPlacerImpl::GlobalModelInfo &global_model_info); + void calculate_overhangs_and_layer_embedding(const PrintObject *po); + void align_seam_points(const PrintObject *po, const SeamPlacerImpl::SeamComparator &comparator); + std::vector> find_seam_string(const PrintObject *po, + std::pair start_seam, + const SeamPlacerImpl::SeamComparator &comparator) const; + std::optional> find_next_seam_in_layer( + const std::vector &layers, + const Vec3f& projected_position, + const size_t layer_idx, const float max_distance, + const SeamPlacerImpl::SeamComparator &comparator) const; }; } // namespace Slic3r diff --git a/src/libslic3r/GCode/SpiralVase.cpp b/src/libslic3r/GCode/SpiralVase.cpp index c3caee2dc4..0650f7f781 100644 --- a/src/libslic3r/GCode/SpiralVase.cpp +++ b/src/libslic3r/GCode/SpiralVase.cpp @@ -1,10 +1,69 @@ #include "SpiralVase.hpp" #include "GCode.hpp" #include +#include +#include namespace Slic3r { -std::string SpiralVase::process_layer(const std::string &gcode) +namespace SpiralVaseHelpers { +/** == Smooth Spiral Helpers == */ +/** Distance between a and b */ +float distance(SpiralVase::SpiralPoint a, SpiralVase::SpiralPoint b) { return sqrt(pow(a.x - b.x, 2) + pow(a.y - b.y, 2)); } + +SpiralVase::SpiralPoint subtract(SpiralVase::SpiralPoint a, SpiralVase::SpiralPoint b) +{ + return SpiralVase::SpiralPoint(a.x - b.x, a.y - b.y); +} + +SpiralVase::SpiralPoint add(SpiralVase::SpiralPoint a, SpiralVase::SpiralPoint b) { return SpiralVase::SpiralPoint(a.x + b.x, a.y + b.y); } + +SpiralVase::SpiralPoint scale(SpiralVase::SpiralPoint a, float factor) { return SpiralVase::SpiralPoint(a.x * factor, a.y * factor); } + +/** dot product */ +float dot(SpiralVase::SpiralPoint a, SpiralVase::SpiralPoint b) { return a.x * b.x + a.y * b.y; } + +/** Find the point on line ab closes to point c */ +SpiralVase::SpiralPoint nearest_point_on_line(SpiralVase::SpiralPoint c, SpiralVase::SpiralPoint a, SpiralVase::SpiralPoint b, float& dist) +{ + SpiralVase::SpiralPoint ab = subtract(b, a); + SpiralVase::SpiralPoint ca = subtract(c, a); + float t = dot(ca, ab) / dot(ab, ab); + t = t > 1 ? 1 : t; + t = t < 0 ? 0 : t; + SpiralVase::SpiralPoint closest = SpiralVase::SpiralPoint(add(a, scale(ab, t))); + dist = distance(c, closest); + return closest; +} + +/** Given a set of lines defined by points such as line[n] is the line from points[n] to points[n+1], + * find the closest point to p that falls on any of the lines */ +SpiralVase::SpiralPoint nearest_point_on_lines(SpiralVase::SpiralPoint p, + std::vector* points, + bool& found, + float& dist) +{ + if (points->size() < 2) { + found = false; + return SpiralVase::SpiralPoint(0, 0); + } + float min = std::numeric_limits::max(); + SpiralVase::SpiralPoint closest(0, 0); + for (unsigned long i = 0; i < points->size() - 1; i++) { + float currentDist = 0; + SpiralVase::SpiralPoint current = nearest_point_on_line(p, points->at(i), points->at(i + 1), currentDist); + if (currentDist < min) { + min = currentDist; + closest = current; + found = true; + } + } + dist = min; + return closest; +} +} // namespace SpiralVase + +std::string SpiralVase::process_layer(const std::string &gcode, bool last_layer) { /* This post-processor relies on several assumptions: - all layers are processed through it, including those that are not supposed @@ -45,19 +104,26 @@ std::string SpiralVase::process_layer(const std::string &gcode) } }); } - + // Remove layer height from initial Z. z -= layer_height; - + + std::vector* current_layer = new std::vector(); + std::vector* previous_layer = m_previous_layer; + + bool smooth_spiral = m_smooth_spiral; std::string new_gcode; + std::string transition_gcode; + float max_xy_dist_for_smoothing = m_max_xy_smoothing; //FIXME Tapering of the transition layer only works reliably with relative extruder distances. // For absolute extruder distances it will be switched off. // Tapering the absolute extruder distances requires to process every extrusion value after the first transition // layer. - bool transition = m_transition_layer && m_config.use_relative_e_distances.value; - float layer_height_factor = layer_height / total_layer_length; + bool transition_in = m_transition_layer && m_config.use_relative_e_distances.value; + bool transition_out = last_layer && m_config.use_relative_e_distances.value; float len = 0.f; - m_reader.parse_buffer(gcode, [&new_gcode, &z, total_layer_length, layer_height_factor, transition, &len] + SpiralVase::SpiralPoint last_point = previous_layer != NULL && previous_layer->size() >0? previous_layer->at(previous_layer->size()-1): SpiralVase::SpiralPoint(0,0); + m_reader.parse_buffer(gcode, [&new_gcode, &z, total_layer_length, layer_height, transition_in, &len, ¤t_layer, &previous_layer, &transition_gcode, transition_out, smooth_spiral, &max_xy_dist_for_smoothing, &last_point] (GCodeReader &reader, GCodeReader::GCodeLine line) { if (line.cmd_is("G1")) { if (line.has_z()) { @@ -68,30 +134,69 @@ std::string SpiralVase::process_layer(const std::string &gcode) return; } else { float dist_XY = line.dist_XY(reader); - if (dist_XY > 0) { - // horizontal move - if (line.extruding(reader)) { + if (line.has_x() || line.has_y()) { // Sometimes lines have X/Y but the move is to the last position + if (dist_XY > 0 && line.extruding(reader)) { // Exclude wipe and retract len += dist_XY; - line.set(reader, Z, z + len * layer_height_factor); - if (transition && line.has(E)) - // Transition layer, modulate the amount of extrusion from zero to the final value. - line.set(reader, E, line.value(E) * len / total_layer_length); + float factor = len / total_layer_length; + if (transition_in) + // Transition layer, interpolate the amount of extrusion from zero to the final value. + line.set(reader, E, line.e() * factor, 5 /*decimal_digits*/); + else if (transition_out) { + // We want the last layer to ramp down extrusion, but without changing z height! + // So clone the line before we mess with its Z and duplicate it into a new layer that ramps down E + // We add this new layer at the very end + GCodeReader::GCodeLine transitionLine(line); + transitionLine.set(reader, E, line.e() * (1 - factor), 5 /*decimal_digits*/); + transition_gcode += transitionLine.raw() + '\n'; + } + // This line is the core of Spiral Vase mode, ramp up the Z smoothly + line.set(reader, Z, z + factor * layer_height); + if (smooth_spiral) { + // Now we also need to try to interpolate X and Y + SpiralVase::SpiralPoint p(line.x(), line.y()); // Get current x/y coordinates + current_layer->push_back(p); // Store that point for later use on the next layer + if (previous_layer != NULL) { + bool found = false; + float dist = 0; + SpiralVase::SpiralPoint nearestp = SpiralVaseHelpers::nearest_point_on_lines(p, previous_layer, found, dist); + if (found && dist < max_xy_dist_for_smoothing) { + // Interpolate between the point on this layer and the point on the previous layer + SpiralVase::SpiralPoint target = SpiralVaseHelpers::add(SpiralVaseHelpers::scale(nearestp, 1 - factor), SpiralVaseHelpers::scale(p, factor)); + line.set(reader, X, target.x); + line.set(reader, Y, target.y); + // We need to figure out the distance of this new line! + float modified_dist_XY = SpiralVaseHelpers::distance(last_point, target); + // Scale the extrusion amount according to change in length + line.set(reader, E, line.e() * modified_dist_XY / dist_XY, 5 /*decimal_digits*/); + last_point = target; + } else { + last_point = p; + } + } + } new_gcode += line.raw() + '\n'; } return; - /* Skip travel moves: the move to first perimeter point will cause a visible seam when loops are not aligned in XY; by skipping it we blend the first loop move in the XY plane (although the smoothness of such blend depend on how long the first segment is; maybe we should - enforce some minimum length?). */ + enforce some minimum length?). + When smooth_spiral is enabled, we're gonna end up exactly where the next layer should + start anyway, so we don't need the travel move */ } } } new_gcode += line.raw() + '\n'; + if(transition_out) { + transition_gcode += line.raw() + '\n'; + } }); + + delete m_previous_layer; + m_previous_layer = current_layer; - return new_gcode; + return new_gcode + transition_gcode; } } diff --git a/src/libslic3r/GCode/SpiralVase.hpp b/src/libslic3r/GCode/SpiralVase.hpp index fb461c2015..f28b4c5f55 100644 --- a/src/libslic3r/GCode/SpiralVase.hpp +++ b/src/libslic3r/GCode/SpiralVase.hpp @@ -6,12 +6,23 @@ namespace Slic3r { -class SpiralVase { +class SpiralVase +{ public: + class SpiralPoint + { + public: + SpiralPoint(float paramx, float paramy) : x(paramx), y(paramy) {} + + public: + float x, y; + }; SpiralVase(const PrintConfig &config) : m_config(config) { m_reader.z() = (float)m_config.z_offset; m_reader.apply_config(m_config); + m_previous_layer = NULL; + m_smooth_spiral = config.spiral_mode_smooth; }; void enable(bool en) { @@ -19,17 +30,22 @@ public: m_enabled = en; } - std::string process_layer(const std::string &gcode); - + std::string process_layer(const std::string &gcode, bool last_layer); + void set_max_xy_smoothing(float max) { + m_max_xy_smoothing = max; + } private: const PrintConfig &m_config; GCodeReader m_reader; + float m_max_xy_smoothing = 0.f; bool m_enabled = false; // First spiral vase layer. Layer height has to be ramped up from zero to the target layer height. bool m_transition_layer = false; + // Whether to interpolate XY coordinates with the previous layer. Results in no seam at layer changes + bool m_smooth_spiral = false; + std::vector * m_previous_layer; }; - } #endif // slic3r_SpiralVase_hpp_ diff --git a/src/libslic3r/GCode/Thumbnails.cpp b/src/libslic3r/GCode/Thumbnails.cpp index 22788967ec..3d1ae9eec4 100644 --- a/src/libslic3r/GCode/Thumbnails.cpp +++ b/src/libslic3r/GCode/Thumbnails.cpp @@ -8,6 +8,7 @@ #include #include #include +#include namespace Slic3r::GCodeThumbnails { @@ -37,6 +38,12 @@ struct CompressedBIQU : CompressedImageBuffer std::string_view tag() const override { return "thumbnail_BIQU"sv; } }; +struct CompressedColPic : CompressedImageBuffer +{ + ~CompressedColPic() override { free(data); } + std::string_view tag() const override { return "thumbnail_QIDI"sv; } +}; + std::unique_ptr compress_thumbnail_png(const ThumbnailData &data) { auto out = std::make_unique(); @@ -113,6 +120,64 @@ std::unique_ptr compress_thumbnail_qoi(const ThumbnailDat return out; } +int ColPic_EncodeStr(unsigned short* fromcolor16, int picw, int pich, unsigned char* outputdata, int outputmaxtsize, int colorsmax); + +std::unique_ptr compress_thumbnail_colpic(const ThumbnailData &data) +{ + const int MAX_SIZE = 512; + int width = int(data.width); + int height = int(data.height); + + // Orca: cap data size to MAX_SIZE while maintaining aspect ratio + if (width > MAX_SIZE || height > MAX_SIZE) { + double aspectRatio = static_cast(width) / height; + if (aspectRatio > 1.0) { + width = MAX_SIZE; + height = static_cast(MAX_SIZE / aspectRatio); + } else { + height = MAX_SIZE; + width = static_cast(MAX_SIZE * aspectRatio); + } + } + + std::vector color16_buf(width * height); + std::vector output_buf(height * width * 10); + + std::vector rgba_pixels(data.pixels.size() * 4); + size_t row_size = width * 4; + for (size_t y = 0; y < height; ++y) + memcpy(rgba_pixels.data() + y * row_size, data.pixels.data() + y * row_size, row_size); + const unsigned char* pixels; + pixels = (const unsigned char*) rgba_pixels.data(); + int r = 0, g = 0, b = 0, a = 0, rgb = 0; + int time = width * height - 1; + for (int row = 0; row < height; ++row) { + int rr = row * width; + for (int col = 0; col < width; ++col) { + const int pix_idx = 4 * (rr + width - col - 1); + r = int(pixels[pix_idx]) >> 3; + g = int(pixels[pix_idx + 1]) >> 2; + b = int(pixels[pix_idx + 2]) >> 3; + a = int(pixels[pix_idx + 3]); + if (a == 0) { + r = 239 >> 3; + g = 243 >> 2; + b = 247 >> 3; + } + rgb = (r << 11) | (g << 5) | b; + color16_buf[time--] = rgb; + } + } + + ColPic_EncodeStr(color16_buf.data(), width, height, output_buf.data(), output_buf.size(), 1024); + + auto out = std::make_unique(); + out->size = output_buf.size(); + out->data = malloc(out->size); + ::memcpy(out->data, output_buf.data(), out->size); + return out; +} + std::unique_ptr compress_thumbnail_btt_tft(const ThumbnailData &data) { // Take vector of RGBA pixels and flip the image vertically @@ -133,10 +198,10 @@ std::unique_ptr compress_thumbnail_btt_tft(const Thumbnai std::stringstream out_data; typedef struct {unsigned char r, g, b, a;} pixel; pixel px; - for (int ypos = 0; ypos < data.height; ypos++) { + for (unsigned int ypos = 0; ypos < data.height; ypos++) { std::stringstream line; line << ";"; - for (int xpos = 0; xpos < row_size; xpos+=4) { + for (unsigned int xpos = 0; xpos < row_size; xpos+=4) { px.r = rgba_pixels[ypos * row_size + xpos]; px.g = rgba_pixels[ypos * row_size + xpos + 1]; px.b = rgba_pixels[ypos * row_size + xpos + 2]; @@ -190,7 +255,278 @@ std::unique_ptr compress_thumbnail(const ThumbnailData &d return compress_thumbnail_qoi(data); case GCodeThumbnailsFormat::BTT_TFT: return compress_thumbnail_btt_tft(data); + case GCodeThumbnailsFormat::ColPic: + return compress_thumbnail_colpic(data); } } +typedef struct +{ + unsigned short colo16; + unsigned char A0; + unsigned char A1; + unsigned char A2; + unsigned char res0; + unsigned short res1; + unsigned int qty; +} U16HEAD; +typedef struct +{ + unsigned char encodever; + unsigned char res0; + unsigned short oncelistqty; + unsigned int PicW; + unsigned int PicH; + unsigned int mark; + unsigned int ListDataSize; + unsigned int ColorDataSize; + unsigned int res1; + unsigned int res2; +} ColPicHead3; + +static void colmemmove(unsigned char* dec, unsigned char* src, int lenth) +{ + if (src < dec) { + dec += lenth - 1; + src += lenth - 1; + while (lenth > 0) { + *(dec--) = *(src--); + lenth--; + } + } else { + while (lenth > 0) { + *(dec++) = *(src++); + lenth--; + } + } +} +static void colmemcpy(unsigned char* dec, unsigned char* src, int lenth) +{ + while (lenth > 0) { + *(dec++) = *(src++); + lenth--; + } +} +static void colmemset(unsigned char* dec, unsigned char val, int lenth) +{ + while (lenth > 0) { + *(dec++) = val; + lenth--; + } +} + +static void ADList0(unsigned short val, U16HEAD* listu16, int* listqty, int maxqty) +{ + unsigned char A0; + unsigned char A1; + unsigned char A2; + int qty = *listqty; + if (qty >= maxqty) + return; + for (int i = 0; i < qty; i++) { + if (listu16[i].colo16 == val) { + listu16[i].qty++; + return; + } + } + A0 = (unsigned char) (val >> 11); + A1 = (unsigned char) ((val << 5) >> 10); + A2 = (unsigned char) ((val << 11) >> 11); + U16HEAD* a = &listu16[qty]; + a->colo16 = val; + a->A0 = A0; + a->A1 = A1; + a->A2 = A2; + a->qty = 1; + *listqty = qty + 1; +} + +static int Byte8bitEncode( + unsigned short* fromcolor16, unsigned short* listu16, int listqty, int dotsqty, unsigned char* outputdata, int decMaxBytesize) +{ + unsigned char tid, sid; + int dots = 0; + int srcindex = 0; + int decindex = 0; + int lastid = 0; + int temp = 0; + while (dotsqty > 0) { + dots = 1; + for (int i = 0; i < (dotsqty - 1); i++) { + if (fromcolor16[srcindex + i] != fromcolor16[srcindex + i + 1]) + break; + dots++; + if (dots == 255) + break; + } + temp = 0; + for (int i = 0; i < listqty; i++) { + if (listu16[i] == fromcolor16[srcindex]) { + temp = i; + break; + } + } + tid = (unsigned char) (temp % 32); + sid = (unsigned char) (temp / 32); + if (lastid != sid) { + if (decindex >= decMaxBytesize) + goto IL_END; + outputdata[decindex] = 7; + outputdata[decindex] <<= 5; + outputdata[decindex] += sid; + decindex++; + lastid = sid; + } + if (dots <= 6) { + if (decindex >= decMaxBytesize) + goto IL_END; + outputdata[decindex] = (unsigned char) dots; + outputdata[decindex] <<= 5; + outputdata[decindex] += tid; + decindex++; + } else { + if (decindex >= decMaxBytesize) + goto IL_END; + outputdata[decindex] = 0; + outputdata[decindex] += tid; + decindex++; + if (decindex >= decMaxBytesize) + goto IL_END; + outputdata[decindex] = (unsigned char) dots; + decindex++; + } + srcindex += dots; + dotsqty -= dots; + } +IL_END: + return decindex; +} + +static int ColPicEncode(unsigned short* fromcolor16, int picw, int pich, unsigned char* outputdata, int outputmaxtsize, int colorsmax) +{ + U16HEAD l0; + int cha0, cha1, cha2, fid, minval; + ColPicHead3* Head0 = nullptr; + U16HEAD Listu16[1024]; + int ListQty = 0; + int enqty = 0; + int dotsqty = picw * pich; + if (colorsmax > 1024) + colorsmax = 1024; + for (int i = 0; i < dotsqty; i++) { + int ch = (int) fromcolor16[i]; + ADList0(ch, Listu16, &ListQty, 1024); + } + + for (int index = 1; index < ListQty; index++) { + l0 = Listu16[index]; + for (int i = 0; i < index; i++) { + if (l0.qty >= Listu16[i].qty) { + colmemmove((unsigned char*) &Listu16[i + 1], (unsigned char*) &Listu16[i], (index - i) * sizeof(U16HEAD)); + colmemcpy((unsigned char*) &Listu16[i], (unsigned char*) &l0, sizeof(U16HEAD)); + break; + } + } + } + while (ListQty > colorsmax) { + l0 = Listu16[ListQty - 1]; + minval = 255; + fid = -1; + for (int i = 0; i < colorsmax; i++) { + cha0 = Listu16[i].A0 - l0.A0; + if (cha0 < 0) + cha0 = 0 - cha0; + cha1 = Listu16[i].A1 - l0.A1; + if (cha1 < 0) + cha1 = 0 - cha1; + cha2 = Listu16[i].A2 - l0.A2; + if (cha2 < 0) + cha2 = 0 - cha2; + int chall = cha0 + cha1 + cha2; + if (chall < minval) { + minval = chall; + fid = i; + } + } + for (int i = 0; i < dotsqty; i++) { + if (fromcolor16[i] == l0.colo16) + fromcolor16[i] = Listu16[fid].colo16; + } + ListQty = ListQty - 1; + } + Head0 = ((ColPicHead3*) outputdata); + colmemset(outputdata, 0, sizeof(ColPicHead3)); + Head0->encodever = 3; + Head0->oncelistqty = 0; + Head0->mark = 0x05DDC33C; + Head0->ListDataSize = ListQty * 2; + for (int i = 0; i < ListQty; i++) { + unsigned short* l0 = (unsigned short*) &outputdata[sizeof(ColPicHead3)]; + l0[i] = Listu16[i].colo16; + } + enqty = Byte8bitEncode(fromcolor16, (unsigned short*) &outputdata[sizeof(ColPicHead3)], Head0->ListDataSize >> 1, dotsqty, + &outputdata[sizeof(ColPicHead3) + Head0->ListDataSize], + outputmaxtsize - sizeof(ColPicHead3) - Head0->ListDataSize); + Head0->ColorDataSize = enqty; + Head0->PicW = picw; + Head0->PicH = pich; + return sizeof(ColPicHead3) + Head0->ListDataSize + Head0->ColorDataSize; +} + +int ColPic_EncodeStr(unsigned short* fromcolor16, int picw, int pich, unsigned char* outputdata, int outputmaxtsize, int colorsmax) +{ + int qty = 0; + int temp = 0; + int strindex = 0; + int hexindex = 0; + unsigned char TempBytes[4]; + qty = ColPicEncode(fromcolor16, picw, pich, outputdata, outputmaxtsize, colorsmax); + if (qty == 0) + return 0; + temp = 3 - (qty % 3); + while (temp > 0) { + outputdata[qty] = 0; + qty++; + temp--; + } + if ((qty * 4 / 3) >= outputmaxtsize) + return 0; + hexindex = qty; + strindex = (qty * 4 / 3); + while (hexindex > 0) { + hexindex -= 3; + strindex -= 4; + + TempBytes[0] = (unsigned char) (outputdata[hexindex] >> 2); + TempBytes[1] = (unsigned char) (outputdata[hexindex] & 3); + TempBytes[1] <<= 4; + TempBytes[1] += ((unsigned char) (outputdata[hexindex + 1] >> 4)); + TempBytes[2] = (unsigned char) (outputdata[hexindex + 1] & 15); + TempBytes[2] <<= 2; + TempBytes[2] += ((unsigned char) (outputdata[hexindex + 2] >> 6)); + TempBytes[3] = (unsigned char) (outputdata[hexindex + 2] & 63); + + TempBytes[0] += 48; + if (TempBytes[0] == (unsigned char) '\\') + TempBytes[0] = 126; + TempBytes[0 + 1] += 48; + if (TempBytes[0 + 1] == (unsigned char) '\\') + TempBytes[0 + 1] = 126; + TempBytes[0 + 2] += 48; + if (TempBytes[0 + 2] == (unsigned char) '\\') + TempBytes[0 + 2] = 126; + TempBytes[0 + 3] += 48; + if (TempBytes[0 + 3] == (unsigned char) '\\') + TempBytes[0 + 3] = 126; + + outputdata[strindex] = TempBytes[0]; + outputdata[strindex + 1] = TempBytes[1]; + outputdata[strindex + 2] = TempBytes[2]; + outputdata[strindex + 3] = TempBytes[3]; + } + qty = qty * 4 / 3; + outputdata[qty] = 0; + return qty; +} + } // namespace Slic3r::GCodeThumbnails \ No newline at end of file diff --git a/src/libslic3r/GCode/Thumbnails.hpp b/src/libslic3r/GCode/Thumbnails.hpp index 772e63dd40..0d6e3f1bcb 100644 --- a/src/libslic3r/GCode/Thumbnails.hpp +++ b/src/libslic3r/GCode/Thumbnails.hpp @@ -7,6 +7,7 @@ #include "../Point.hpp" #include "../PrintConfig.hpp" +#include "PrintConfig.hpp" #include "ThumbnailData.hpp" #include @@ -44,7 +45,6 @@ inline void export_thumbnails_to_file(ThumbnailsGeneratorCallback &thumbnail_cb, short i = 0; for (const ThumbnailData &data : thumbnails) { if (data.is_valid()) { - output("; THUMBNAIL_BLOCK_START\n"); auto compressed = compress_thumbnail(data, format); if (compressed->data && compressed->size) { if (format == GCodeThumbnailsFormat::BTT_TFT) { @@ -53,7 +53,16 @@ inline void export_thumbnails_to_file(ThumbnailsGeneratorCallback &thumbnail_cb, output((char *) compressed->data); if (i == (thumbnails.size() - 1)) output("; bigtree thumbnail end\r\n\r\n"); - } else { + } + else if (format == GCodeThumbnailsFormat::ColPic) { + if (i == 0) { + output((boost::format("\n\n;gimage:%s\n\n") % reinterpret_cast(compressed->data)).str().c_str()); + } else { + output((boost::format("\n\n;simage:%s\n\n") % reinterpret_cast(compressed->data)).str().c_str()); + } + } + else { + output("; THUMBNAIL_BLOCK_START\n"); std::string encoded; encoded.resize(boost::beast::detail::base64::encoded_size(compressed->size)); encoded.resize(boost::beast::detail::base64::encode((void *) encoded.data(), (const void *) compressed->data, @@ -71,10 +80,10 @@ inline void export_thumbnails_to_file(ThumbnailsGeneratorCallback &thumbnail_cb, output((boost::format("; %s\n") % encoded).str().c_str()); output((boost::format("; %s end\n") % compressed->tag()).str().c_str()); + output("; THUMBNAIL_BLOCK_END\n\n"); } throw_if_canceled(); } - output("; THUMBNAIL_BLOCK_END\n\n"); i++; } diff --git a/src/libslic3r/GCode/ToolOrdering.cpp b/src/libslic3r/GCode/ToolOrdering.cpp index ee46300447..f5680decef 100644 --- a/src/libslic3r/GCode/ToolOrdering.cpp +++ b/src/libslic3r/GCode/ToolOrdering.cpp @@ -123,6 +123,7 @@ static double calc_max_layer_height(const PrintConfig &config, double max_object // (print->config().print_sequence == PrintSequence::ByObject is true). ToolOrdering::ToolOrdering(const PrintObject &object, unsigned int first_extruder, bool prime_multi_material) { + m_print_object_ptr = &object; if (object.layers().empty()) return; @@ -743,11 +744,16 @@ void ToolOrdering::collect_extruder_statistics(bool prime_multi_material) void ToolOrdering::reorder_extruders_for_minimum_flush_volume() { - if (!m_print_config_ptr || m_layer_tools.empty()) + const PrintConfig *print_config = m_print_config_ptr; + if (!print_config && m_print_object_ptr) { + print_config = &(m_print_object_ptr->print()->config()); + } + + if (!print_config || m_layer_tools.empty()) return; // Get wiping matrix to get number of extruders and convert vector to vector: - std::vector flush_matrix(cast(m_print_config_ptr->flush_volumes_matrix.values)); + std::vector flush_matrix(cast(print_config->flush_volumes_matrix.values)); const unsigned int number_of_extruders = (unsigned int) (sqrt(flush_matrix.size()) + EPSILON); // Extract purging volumes for each extruder pair: std::vector> wipe_volumes; diff --git a/src/libslic3r/GCode/ToolOrdering.hpp b/src/libslic3r/GCode/ToolOrdering.hpp index 53c6603c63..728fa4e74b 100644 --- a/src/libslic3r/GCode/ToolOrdering.hpp +++ b/src/libslic3r/GCode/ToolOrdering.hpp @@ -209,6 +209,7 @@ private: std::vector m_all_printing_extruders; const PrintConfig* m_print_config_ptr = nullptr; + const PrintObject* m_print_object_ptr = nullptr; }; } // namespace SLic3r diff --git a/src/libslic3r/GCodeWriter.cpp b/src/libslic3r/GCodeWriter.cpp index 76ac289ae7..39fba8747f 100644 --- a/src/libslic3r/GCodeWriter.cpp +++ b/src/libslic3r/GCodeWriter.cpp @@ -341,6 +341,10 @@ std::string GCodeWriter::update_progress(unsigned int num, unsigned int tot, boo { if (FLAVOR_IS_NOT(gcfMakerWare) && FLAVOR_IS_NOT(gcfSailfish)) return ""; + + if (config.disable_m73) { + return ""; + } unsigned int percent = (unsigned int)floor(100.0 * num / tot + 0.5); if (!allow_100) percent = std::min(percent, (unsigned int)99); @@ -678,23 +682,23 @@ std::string GCodeWriter::extrude_to_xyz(const Vec3d &point, double dE, const std return w.string(); } -std::string GCodeWriter::retract(bool before_wipe) +std::string GCodeWriter::retract(bool before_wipe, double retract_length) { double factor = before_wipe ? m_extruder->retract_before_wipe() : 1.; assert(factor >= 0. && factor <= 1. + EPSILON); return this->_retract( - factor * m_extruder->retraction_length(), + retract_length > EPSILON ? retract_length : factor * m_extruder->retraction_length(), factor * m_extruder->retract_restart_extra(), "retract" ); } -std::string GCodeWriter::retract_for_toolchange(bool before_wipe) +std::string GCodeWriter::retract_for_toolchange(bool before_wipe, double retract_length) { double factor = before_wipe ? m_extruder->retract_before_wipe() : 1.; assert(factor >= 0. && factor <= 1. + EPSILON); return this->_retract( - factor * m_extruder->retract_length_toolchange(), + retract_length > EPSILON ? retract_length : factor * m_extruder->retract_length_toolchange(), factor * m_extruder->retract_restart_extra_toolchange(), "retract for toolchange" ); diff --git a/src/libslic3r/GCodeWriter.hpp b/src/libslic3r/GCodeWriter.hpp index bbaa069da0..27c58a0702 100644 --- a/src/libslic3r/GCodeWriter.hpp +++ b/src/libslic3r/GCodeWriter.hpp @@ -74,8 +74,8 @@ public: //BBS: generate G2 or G3 extrude which moves by arc std::string extrude_arc_to_xy(const Vec2d &point, const Vec2d ¢er_offset, double dE, const bool is_ccw, const std::string &comment = std::string(), bool force_no_extrusion = false); std::string extrude_to_xyz(const Vec3d &point, double dE, const std::string &comment = std::string(), bool force_no_extrusion = false); - std::string retract(bool before_wipe = false); - std::string retract_for_toolchange(bool before_wipe = false); + std::string retract(bool before_wipe = false, double retract_length = 0); + std::string retract_for_toolchange(bool before_wipe = false, double retract_length = 0); std::string unretract(); std::string lift(LiftType lift_type = LiftType::NormalLift, bool spiral_vase = false); std::string unlift(); diff --git a/src/libslic3r/Geometry.cpp b/src/libslic3r/Geometry.cpp index e57b774f34..b19445b79f 100644 --- a/src/libslic3r/Geometry.cpp +++ b/src/libslic3r/Geometry.cpp @@ -397,42 +397,12 @@ Transform3d scale_transform(const Vec3d& scale) Vec3d extract_euler_angles(const Eigen::Matrix& rotation_matrix) { - // reference: http://www.gregslabaugh.net/publications/euler.pdf - Vec3d angles1 = Vec3d::Zero(); - Vec3d angles2 = Vec3d::Zero(); - // BBS: rotation_matrix(2, 0) may be slighterly larger than 1 due to numerical accuracy - if (std::abs(std::abs(rotation_matrix(2, 0)) - 1.0) < 1e-5 || std::abs(rotation_matrix(2, 0))>1) { - angles1.z() = 0.0; - if (rotation_matrix(2, 0) < 0.0) { // == -1.0 - angles1.y() = 0.5 * double(PI); - angles1.x() = angles1.z() + ::atan2(rotation_matrix(0, 1), rotation_matrix(0, 2)); - } - else { // == 1.0 - angles1.y() = - 0.5 * double(PI); - angles1.x() = - angles1.y() + ::atan2(- rotation_matrix(0, 1), - rotation_matrix(0, 2)); - } - angles2 = angles1; - } - else { - angles1.y() = -::asin(rotation_matrix(2, 0)); - const double inv_cos1 = 1.0 / ::cos(angles1.y()); - angles1.x() = ::atan2(rotation_matrix(2, 1) * inv_cos1, rotation_matrix(2, 2) * inv_cos1); - angles1.z() = ::atan2(rotation_matrix(1, 0) * inv_cos1, rotation_matrix(0, 0) * inv_cos1); - - angles2.y() = double(PI) - angles1.y(); - const double inv_cos2 = 1.0 / ::cos(angles2.y()); - angles2.x() = ::atan2(rotation_matrix(2, 1) * inv_cos2, rotation_matrix(2, 2) * inv_cos2); - angles2.z() = ::atan2(rotation_matrix(1, 0) * inv_cos2, rotation_matrix(0, 0) * inv_cos2); - } - - // The following euristic is the best found up to now (in the sense that it works fine with the greatest number of edge use-cases) - // but there are other use-cases were it does not - // We need to improve it - const double min_1 = angles1.cwiseAbs().minCoeff(); - const double min_2 = angles2.cwiseAbs().minCoeff(); - const bool use_1 = (min_1 < min_2) || (is_approx(min_1, min_2) && (angles1.norm() <= angles2.norm())); - - return use_1 ? angles1 : angles2; + // The extracted "rotation" is a triplet of numbers such that Geometry::rotation_transform + // returns the original transform. Because of the chosen order of rotations, the triplet + // is not equivalent to Euler angles in the usual sense. + Vec3d angles = rotation_matrix.eulerAngles(2,1,0); + std::swap(angles(0), angles(2)); + return angles; } Vec3d extract_euler_angles(const Transform3d& transform) @@ -446,14 +416,6 @@ Vec3d extract_euler_angles(const Transform3d& transform) return extract_euler_angles(m); } -static Transform3d extract_rotation_matrix(const Transform3d& trafo) -{ - Matrix3d rotation; - Matrix3d scale; - trafo.computeRotationScaling(&rotation, &scale); - return Transform3d(rotation); -} - void rotation_from_two_vectors(Vec3d from, Vec3d to, Vec3d& rotation_axis, double& phi, Matrix3d* rotation_matrix) { double epsilon = 1e-5; @@ -488,42 +450,65 @@ void rotation_from_two_vectors(Vec3d from, Vec3d to, Vec3d& rotation_axis, doubl } } -bool Transformation::Flags::needs_update(bool dont_translate, bool dont_rotate, bool dont_scale, bool dont_mirror) const +Transform3d Transformation::get_offset_matrix() const { - return (this->dont_translate != dont_translate) || (this->dont_rotate != dont_rotate) || (this->dont_scale != dont_scale) || (this->dont_mirror != dont_mirror); + return translation_transform(get_offset()); } -void Transformation::Flags::set(bool dont_translate, bool dont_rotate, bool dont_scale, bool dont_mirror) +static Transform3d extract_rotation_matrix(const Transform3d& trafo) { - this->dont_translate = dont_translate; - this->dont_rotate = dont_rotate; - this->dont_scale = dont_scale; - this->dont_mirror = dont_mirror; + Matrix3d rotation; + Matrix3d scale; + trafo.computeRotationScaling(&rotation, &scale); + return Transform3d(rotation); } -Transformation::Transformation() +static Transform3d extract_scale(const Transform3d& trafo) { - reset(); + Matrix3d rotation; + Matrix3d scale; + trafo.computeRotationScaling(&rotation, &scale); + return Transform3d(scale); } -Transformation::Transformation(const Transform3d& transform) +static std::pair extract_rotation_scale(const Transform3d& trafo) { - set_from_transform(transform); + Matrix3d rotation; + Matrix3d scale; + trafo.computeRotationScaling(&rotation, &scale); + return { Transform3d(rotation), Transform3d(scale) }; } -void Transformation::set_offset(const Vec3d& offset) +static bool contains_skew(const Transform3d& trafo) { - set_offset(X, offset.x()); - set_offset(Y, offset.y()); - set_offset(Z, offset.z()); + Matrix3d rotation; + Matrix3d scale; + trafo.computeRotationScaling(&rotation, &scale); + + if (scale.isDiagonal()) + return false; + + if (scale.determinant() >= 0.0) + return true; + + // the matrix contains mirror + const Matrix3d ratio = scale.cwiseQuotient(trafo.matrix().block<3,3>(0,0)); + + auto check_skew = [&ratio](int i, int j, bool& skew) { + if (!std::isnan(ratio(i, j)) && !std::isnan(ratio(j, i))) + skew |= std::abs(ratio(i, j) * ratio(j, i) - 1.0) > EPSILON; + }; + + bool has_skew = false; + check_skew(0, 1, has_skew); + check_skew(0, 2, has_skew); + check_skew(1, 2, has_skew); + return has_skew; } -void Transformation::set_offset(Axis axis, double offset) +Vec3d Transformation::get_rotation() const { - if (m_offset(axis) != offset) { - m_offset(axis) = offset; - m_dirty = true; - } + return extract_euler_angles(extract_rotation_matrix(m_matrix)); } Transform3d Transformation::get_rotation_matrix() const @@ -533,9 +518,9 @@ Transform3d Transformation::get_rotation_matrix() const void Transformation::set_rotation(const Vec3d& rotation) { - set_rotation(X, rotation.x()); - set_rotation(Y, rotation.y()); - set_rotation(Z, rotation.z()); + const Vec3d offset = get_offset(); + m_matrix = rotation_transform(rotation) * extract_scale(m_matrix); + m_matrix.translation() = offset; } void Transformation::set_rotation(Axis axis, double rotation) @@ -544,32 +529,88 @@ void Transformation::set_rotation(Axis axis, double rotation) if (is_approx(std::abs(rotation), 2.0 * double(PI))) rotation = 0.0; - if (m_rotation(axis) != rotation) { - m_rotation(axis) = rotation; - m_dirty = true; - } + auto [curr_rotation, scale] = extract_rotation_scale(m_matrix); + Vec3d angles = extract_euler_angles(curr_rotation); + angles[axis] = rotation; + + const Vec3d offset = get_offset(); + m_matrix = rotation_transform(angles) * scale; + m_matrix.translation() = offset; +} + +Vec3d Transformation::get_scaling_factor() const +{ + const Transform3d scale = extract_scale(m_matrix); + return { std::abs(scale(0, 0)), std::abs(scale(1, 1)), std::abs(scale(2, 2)) }; +} + +Transform3d Transformation::get_scaling_factor_matrix() const +{ + Transform3d scale = extract_scale(m_matrix); + scale(0, 0) = std::abs(scale(0, 0)); + scale(1, 1) = std::abs(scale(1, 1)); + scale(2, 2) = std::abs(scale(2, 2)); + return scale; } void Transformation::set_scaling_factor(const Vec3d& scaling_factor) { - set_scaling_factor(X, scaling_factor.x()); - set_scaling_factor(Y, scaling_factor.y()); - set_scaling_factor(Z, scaling_factor.z()); + assert(scaling_factor.x() > 0.0 && scaling_factor.y() > 0.0 && scaling_factor.z() > 0.0); + + const Vec3d offset = get_offset(); + m_matrix = extract_rotation_matrix(m_matrix) * scale_transform(scaling_factor); + m_matrix.translation() = offset; } void Transformation::set_scaling_factor(Axis axis, double scaling_factor) { - if (m_scaling_factor(axis) != std::abs(scaling_factor)) { - m_scaling_factor(axis) = std::abs(scaling_factor); - m_dirty = true; - } + assert(scaling_factor > 0.0); + + auto [rotation, scale] = extract_rotation_scale(m_matrix); + scale(axis, axis) = scaling_factor; + + const Vec3d offset = get_offset(); + m_matrix = rotation * scale; + m_matrix.translation() = offset; +} + +Vec3d Transformation::get_mirror() const +{ + const Transform3d scale = extract_scale(m_matrix); + return { scale(0, 0) / std::abs(scale(0, 0)), scale(1, 1) / std::abs(scale(1, 1)), scale(2, 2) / std::abs(scale(2, 2)) }; +} + +Transform3d Transformation::get_mirror_matrix() const +{ + Transform3d scale = extract_scale(m_matrix); + scale(0, 0) = scale(0, 0) / std::abs(scale(0, 0)); + scale(1, 1) = scale(1, 1) / std::abs(scale(1, 1)); + scale(2, 2) = scale(2, 2) / std::abs(scale(2, 2)); + return scale; } void Transformation::set_mirror(const Vec3d& mirror) { - set_mirror(X, mirror.x()); - set_mirror(Y, mirror.y()); - set_mirror(Z, mirror.z()); + Vec3d copy(mirror); + const Vec3d abs_mirror = copy.cwiseAbs(); + for (int i = 0; i < 3; ++i) { + if (abs_mirror(i) == 0.0) + copy(i) = 1.0; + else if (abs_mirror(i) != 1.0) + copy(i) /= abs_mirror(i); + } + + auto [rotation, scale] = extract_rotation_scale(m_matrix); + const Vec3d curr_scales = { scale(0, 0), scale(1, 1), scale(2, 2) }; + const Vec3d signs = curr_scales.cwiseProduct(copy); + + if (signs[0] < 0.0) scale(0, 0) = -scale(0, 0); + if (signs[1] < 0.0) scale(1, 1) = -scale(1, 1); + if (signs[2] < 0.0) scale(2, 2) = -scale(2, 2); + + const Vec3d offset = get_offset(); + m_matrix = rotation * scale; + m_matrix.translation() = offset; } void Transformation::set_mirror(Axis axis, double mirror) @@ -580,75 +621,61 @@ void Transformation::set_mirror(Axis axis, double mirror) else if (abs_mirror != 1.0) mirror /= abs_mirror; - if (m_mirror(axis) != mirror) { - m_mirror(axis) = mirror; - m_dirty = true; - } + auto [rotation, scale] = extract_rotation_scale(m_matrix); + const double curr_scale = scale(axis, axis); + const double sign = curr_scale * mirror; + + if (sign < 0.0) scale(axis, axis) = -scale(axis, axis); + + const Vec3d offset = get_offset(); + m_matrix = rotation * scale; + m_matrix.translation() = offset; } -void Transformation::set_from_transform(const Transform3d& transform) +bool Transformation::has_skew() const { - // offset - set_offset(transform.matrix().block(0, 3, 3, 1)); - - Eigen::Matrix m3x3 = transform.matrix().block(0, 0, 3, 3); - - // mirror - // it is impossible to reconstruct the original mirroring factors from a matrix, - // we can only detect if the matrix contains a left handed reference system - // in which case we reorient it back to right handed by mirroring the x axis - Vec3d mirror = Vec3d::Ones(); - if (m3x3.col(0).dot(m3x3.col(1).cross(m3x3.col(2))) < 0.0) { - mirror.x() = -1.0; - // remove mirror - m3x3.col(0) *= -1.0; - } - set_mirror(mirror); - - // scale - set_scaling_factor(Vec3d(m3x3.col(0).norm(), m3x3.col(1).norm(), m3x3.col(2).norm())); - - // remove scale - m3x3.col(0).normalize(); - m3x3.col(1).normalize(); - m3x3.col(2).normalize(); - - // rotation - set_rotation(extract_euler_angles(m3x3)); - - // forces matrix recalculation matrix - m_matrix = get_matrix(); - -// // debug check -// if (!m_matrix.isApprox(transform)) -// std::cout << "something went wrong in extracting data from matrix" << std::endl; + return contains_skew(m_matrix); } void Transformation::reset() { - m_offset = Vec3d::Zero(); - m_rotation = Vec3d::Zero(); - m_scaling_factor = Vec3d::Ones(); - m_mirror = Vec3d::Ones(); m_matrix = Transform3d::Identity(); - m_dirty = false; } -const Transform3d& Transformation::get_matrix(bool dont_translate, bool dont_rotate, bool dont_scale, bool dont_mirror) const +void Transformation::reset_rotation() { - if (m_dirty || m_flags.needs_update(dont_translate, dont_rotate, dont_scale, dont_mirror)) { - m_matrix = Geometry::assemble_transform( - dont_translate ? Vec3d::Zero() : m_offset, - dont_rotate ? Vec3d::Zero() : m_rotation, - dont_scale ? Vec3d::Ones() : m_scaling_factor, - dont_mirror ? Vec3d::Ones() : m_mirror - ); + const Geometry::TransformationSVD svd(*this); + m_matrix = get_offset_matrix() * Transform3d(svd.v * svd.s * svd.v.transpose()) * svd.mirror_matrix(); +} - m_flags.set(dont_translate, dont_rotate, dont_scale, dont_mirror); - m_dirty = false; - } +void Transformation::reset_scaling_factor() +{ + const Geometry::TransformationSVD svd(*this); + m_matrix = get_offset_matrix() * Transform3d(svd.u) * Transform3d(svd.v.transpose()) * svd.mirror_matrix(); +} - return m_matrix; +void Transformation::reset_skew() +{ + auto new_scale_factor = [](const Matrix3d& s) { + return pow(s(0, 0) * s(1, 1) * s(2, 2), 1. / 3.); // scale average + }; + + const Geometry::TransformationSVD svd(*this); + m_matrix = get_offset_matrix() * Transform3d(svd.u) * scale_transform(new_scale_factor(svd.s)) * Transform3d(svd.v.transpose()) * svd.mirror_matrix(); +} + +Transform3d Transformation::get_matrix_no_offset() const +{ + Transformation copy(*this); + copy.reset_offset(); + return copy.get_matrix(); +} + +Transform3d Transformation::get_matrix_no_scaling_factor() const +{ + Transformation copy(*this); + copy.reset_scaling_factor(); + return copy.get_matrix(); } Transformation Transformation::operator * (const Transformation& other) const @@ -663,7 +690,7 @@ Transformation Transformation::volume_to_bed_transformation(const Transformation if (instance_transformation.is_scaling_uniform()) { // No need to run the non-linear least squares fitting for uniform scaling. // Just set the inverse. - out.set_from_transform(instance_transformation.get_matrix(true).inverse()); + out.set_matrix(instance_transformation.get_matrix_no_offset().inverse()); } else if (is_rotation_ninety_degrees(instance_transformation.get_rotation())) { // Anisotropic scaling, rotation by multiples of ninety degrees. @@ -712,6 +739,53 @@ Transformation Transformation::volume_to_bed_transformation(const Transformation return out; } +TransformationSVD::TransformationSVD(const Transform3d& trafo) +{ + const auto &m0 = trafo.matrix().block<3, 3>(0, 0); + mirror = m0.determinant() < 0.0; + + Matrix3d m; + if (mirror) + m = m0 * Eigen::DiagonalMatrix(-1.0, 1.0, 1.0); + else + m = m0; + const Eigen::JacobiSVD svd(m, Eigen::ComputeFullU | Eigen::ComputeFullV); + u = svd.matrixU(); + v = svd.matrixV(); + s = svd.singularValues().asDiagonal(); + + scale = !s.isApprox(Matrix3d::Identity()); + anisotropic_scale = ! is_approx(s(0, 0), s(1, 1)) || ! is_approx(s(1, 1), s(2, 2)); + rotation = !v.isApprox(u); + + if (anisotropic_scale) { + rotation_90_degrees = true; + for (int i = 0; i < 3; ++i) { + const Vec3d row = v.row(i).cwiseAbs(); + const size_t num_zeros = is_approx(row[0], 0.) + is_approx(row[1], 0.) + is_approx(row[2], 0.); + const size_t num_ones = is_approx(row[0], 1.) + is_approx(row[1], 1.) + is_approx(row[2], 1.); + if (num_zeros != 2 || num_ones != 1) { + rotation_90_degrees = false; + break; + } + } + // Detect skew by brute force: check if the axes are still orthogonal after transformation + const Matrix3d trafo_linear = trafo.linear(); + const std::array axes = { Vec3d::UnitX(), Vec3d::UnitY(), Vec3d::UnitZ() }; + std::array transformed_axes; + for (int i = 0; i < 3; ++i) { + transformed_axes[i] = trafo_linear * axes[i]; + } + skew = std::abs(transformed_axes[0].dot(transformed_axes[1])) > EPSILON || + std::abs(transformed_axes[1].dot(transformed_axes[2])) > EPSILON || + std::abs(transformed_axes[2].dot(transformed_axes[0])) > EPSILON; + + // This following old code does not work under all conditions. The v matrix can become non diagonal (see SPE-1492) +// skew = ! rotation_90_degrees; + } else + skew = false; +} + // For parsing a transformation matrix from 3MF / AMF. Transform3d transform3d_from_string(const std::string& transform_str) { diff --git a/src/libslic3r/Geometry.hpp b/src/libslic3r/Geometry.hpp index 4f6511ff6f..616fb56495 100644 --- a/src/libslic3r/Geometry.hpp +++ b/src/libslic3r/Geometry.hpp @@ -51,9 +51,9 @@ enum Orientation static inline Orientation orient(const Point &a, const Point &b, const Point &c) { static_assert(sizeof(coord_t) * 2 == sizeof(int64_t), "orient works with 32 bit coordinates"); - int64_t u = int64_t(b(0)) * int64_t(c(1)) - int64_t(b(1)) * int64_t(c(0)); - int64_t v = int64_t(a(0)) * int64_t(c(1)) - int64_t(a(1)) * int64_t(c(0)); - int64_t w = int64_t(a(0)) * int64_t(b(1)) - int64_t(a(1)) * int64_t(b(0)); + int64_t u = int64_t(b.x()) * int64_t(c.y()) - int64_t(b.y()) * int64_t(c.x()); + int64_t v = int64_t(a.x()) * int64_t(c.y()) - int64_t(a.y()) * int64_t(c.x()); + int64_t w = int64_t(a.x()) * int64_t(b.y()) - int64_t(a.y()) * int64_t(b.x()); int64_t d = u - v + w; return (d > 0) ? ORIENTATION_CCW : ((d == 0) ? ORIENTATION_COLINEAR : ORIENTATION_CW); } @@ -322,6 +322,13 @@ template T angle_to_0_2PI(T angle) return angle; } +template void to_range_pi_pi(T &angle){ + if (angle > T(PI) || angle <= -T(PI)) { + int count = static_cast(std::round(angle / (2 * PI))); + angle -= static_cast(count * 2 * PI); + assert(angle <= T(PI) && angle > -T(PI)); + } +} void simplify_polygons(const Polygons &polygons, double tolerance, Polygons* retval); @@ -404,66 +411,67 @@ void rotation_from_two_vectors(Vec3d from, Vec3d to, Vec3d &rotation_axis, doubl class Transformation { - struct Flags - { - bool dont_translate{ true }; - bool dont_rotate{ true }; - bool dont_scale{ true }; - bool dont_mirror{ true }; - - bool needs_update(bool dont_translate, bool dont_rotate, bool dont_scale, bool dont_mirror) const; - void set(bool dont_translate, bool dont_rotate, bool dont_scale, bool dont_mirror); - }; - - Vec3d m_offset{ Vec3d::Zero() }; // In unscaled coordinates - Vec3d m_rotation{ Vec3d::Zero() }; // Rotation around the three axes, in radians around mesh center point - Vec3d m_scaling_factor{ Vec3d::Ones() }; // Scaling factors along the three axes - Vec3d m_mirror{ Vec3d::Ones() }; // Mirroring along the three axes - - mutable Transform3d m_matrix{ Transform3d::Identity() }; - mutable Flags m_flags; - mutable bool m_dirty{ false }; + Transform3d m_matrix{ Transform3d::Identity() }; public: - Transformation(); - explicit Transformation(const Transform3d& transform); + Transformation() = default; + explicit Transformation(const Transform3d& transform) : m_matrix(transform) {} - //BBS: add get dirty function - bool is_dirty() { return m_dirty; } + Vec3d get_offset() const { return m_matrix.translation(); } + double get_offset(Axis axis) const { return get_offset()[axis]; } - const Vec3d& get_offset() const { return m_offset; } - double get_offset(Axis axis) const { return m_offset(axis); } + Transform3d get_offset_matrix() const; - void set_offset(const Vec3d& offset); - void set_offset(Axis axis, double offset); + void set_offset(const Vec3d& offset) { m_matrix.translation() = offset; } + void set_offset(Axis axis, double offset) { m_matrix.translation()[axis] = offset; } - const Vec3d& get_rotation() const { return m_rotation; } - double get_rotation(Axis axis) const { return m_rotation(axis); } + Vec3d get_rotation() const; + double get_rotation(Axis axis) const { return get_rotation()[axis]; } Transform3d get_rotation_matrix() const; void set_rotation(const Vec3d& rotation); void set_rotation(Axis axis, double rotation); - const Vec3d& get_scaling_factor() const { return m_scaling_factor; } - double get_scaling_factor(Axis axis) const { return m_scaling_factor(axis); } + Vec3d get_scaling_factor() const; + double get_scaling_factor(Axis axis) const { return get_scaling_factor()[axis]; } + + Transform3d get_scaling_factor_matrix() const; + + bool is_scaling_uniform() const { + const Vec3d scale = get_scaling_factor(); + return std::abs(scale.x() - scale.y()) < 1e-8 && std::abs(scale.x() - scale.z()) < 1e-8; + } void set_scaling_factor(const Vec3d& scaling_factor); void set_scaling_factor(Axis axis, double scaling_factor); - bool is_scaling_uniform() const { return std::abs(m_scaling_factor.x() - m_scaling_factor.y()) < 1e-8 && std::abs(m_scaling_factor.x() - m_scaling_factor.z()) < 1e-8; } - const Vec3d& get_mirror() const { return m_mirror; } - double get_mirror(Axis axis) const { return m_mirror(axis); } - bool is_left_handed() const { return m_mirror.x() * m_mirror.y() * m_mirror.z() < 0.; } + Vec3d get_mirror() const; + double get_mirror(Axis axis) const { return get_mirror()[axis]; } + + Transform3d get_mirror_matrix() const; + + bool is_left_handed() const { + return m_matrix.linear().determinant() < 0; + } void set_mirror(const Vec3d& mirror); void set_mirror(Axis axis, double mirror); - void set_from_transform(const Transform3d& transform); + bool has_skew() const; void reset(); + void reset_offset() { set_offset(Vec3d::Zero()); } + void reset_rotation(); + void reset_scaling_factor(); + void reset_mirror() { set_mirror(Vec3d::Ones()); } + void reset_skew(); - const Transform3d& get_matrix(bool dont_translate = false, bool dont_rotate = false, bool dont_scale = false, bool dont_mirror = false) const; + const Transform3d& get_matrix() const { return m_matrix; } + Transform3d get_matrix_no_offset() const; + Transform3d get_matrix_no_scaling_factor() const; + + void set_matrix(const Transform3d& transform) { m_matrix = transform; } Transformation operator * (const Transformation& other) const; @@ -474,19 +482,43 @@ public: // BBS: backup use this compare friend bool operator==(Transformation const& l, Transformation const& r) { - return l.m_offset == r.m_offset && l.m_rotation == r.m_rotation && l.m_scaling_factor == r.m_scaling_factor && l.m_mirror == r.m_mirror; + return l.m_matrix.isApprox(r.m_matrix); + } + + friend bool operator!=(Transformation const &l, Transformation const &r) + { + return !(l == r); } private: friend class cereal::access; - template void serialize(Archive & ar) { ar(m_offset, m_rotation, m_scaling_factor, m_mirror); } - explicit Transformation(int) : m_dirty(true) {} - template static void load_and_construct(Archive &ar, cereal::construct &construct) - { - // Calling a private constructor with special "int" parameter to indicate that no construction is necessary. - construct(1); - ar(construct.ptr()->m_offset, construct.ptr()->m_rotation, construct.ptr()->m_scaling_factor, construct.ptr()->m_mirror); - } + template void serialize(Archive& ar) { ar(m_matrix); } + explicit Transformation(int) {} + template static void load_and_construct(Archive& ar, cereal::construct& construct) + { + // Calling a private constructor with special "int" parameter to indicate that no construction is necessary. + construct(1); + ar(construct.ptr()->m_matrix); + } +}; + +struct TransformationSVD +{ + Matrix3d u{ Matrix3d::Identity() }; + Matrix3d s{ Matrix3d::Identity() }; + Matrix3d v{ Matrix3d::Identity() }; + + bool mirror{ false }; + bool scale{ false }; + bool anisotropic_scale{ false }; + bool rotation{ false }; + bool rotation_90_degrees{ false }; + bool skew{ false }; + + explicit TransformationSVD(const Transformation& trafo) : TransformationSVD(trafo.get_matrix()) {} + explicit TransformationSVD(const Transform3d& trafo); + + Eigen::DiagonalMatrix mirror_matrix() const { return Eigen::DiagonalMatrix(this->mirror ? -1. : 1., 1., 1.); } }; // For parsing a transformation matrix from 3MF / AMF. diff --git a/src/libslic3r/IntersectionPoints.cpp b/src/libslic3r/IntersectionPoints.cpp new file mode 100644 index 0000000000..bdf66d5905 --- /dev/null +++ b/src/libslic3r/IntersectionPoints.cpp @@ -0,0 +1,49 @@ +///|/ Copyright (c) Prusa Research 2023 Vojtěch Bubník @bubnikv +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ +#include "IntersectionPoints.hpp" +#include + +//NOTE: using CGAL SweepLines is slower !!! (example in git history) + +namespace { +using namespace Slic3r; +IntersectionsLines compute_intersections(const Lines &lines) +{ + if (lines.size() < 3) + return {}; + + auto tree = AABBTreeLines::build_aabb_tree_over_indexed_lines(lines); + IntersectionsLines result; + for (uint32_t li = 0; li < lines.size()-1; ++li) { + const Line &l = lines[li]; + auto intersections = AABBTreeLines::get_intersections_with_line(lines, tree, l); + for (const auto &[p, node_index] : intersections) { + if (node_index - 1 <= li) + continue; + if (const Line &l_ = lines[node_index]; + l_.a == l.a || + l_.a == l.b || + l_.b == l.a || + l_.b == l.b ) + // it is duplicit point not intersection + continue; + + // NOTE: fix AABBTree to compute intersection with double preccission!! + Vec2d intersection_point = p.cast(); + + result.push_back(IntersectionLines{li, static_cast(node_index), intersection_point}); + } + } + return result; +} +} // namespace + +namespace Slic3r { +IntersectionsLines get_intersections(const Lines &lines) { return compute_intersections(lines); } +IntersectionsLines get_intersections(const Polygon &polygon) { return compute_intersections(to_lines(polygon)); } +IntersectionsLines get_intersections(const Polygons &polygons) { return compute_intersections(to_lines(polygons)); } +IntersectionsLines get_intersections(const ExPolygon &expolygon) { return compute_intersections(to_lines(expolygon)); } +IntersectionsLines get_intersections(const ExPolygons &expolygons) { return compute_intersections(to_lines(expolygons)); } +} diff --git a/src/libslic3r/IntersectionPoints.hpp b/src/libslic3r/IntersectionPoints.hpp new file mode 100644 index 0000000000..cf06c718a0 --- /dev/null +++ b/src/libslic3r/IntersectionPoints.hpp @@ -0,0 +1,27 @@ +///|/ Copyright (c) Prusa Research 2023 Vojtěch Bubník @bubnikv +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ +#ifndef slic3r_IntersectionPoints_hpp_ +#define slic3r_IntersectionPoints_hpp_ + +#include "ExPolygon.hpp" + +namespace Slic3r { + +struct IntersectionLines { + uint32_t line_index1; + uint32_t line_index2; + Vec2d intersection; +}; +using IntersectionsLines = std::vector; + +// collect all intersecting points +IntersectionsLines get_intersections(const Lines &lines); +IntersectionsLines get_intersections(const Polygon &polygon); +IntersectionsLines get_intersections(const Polygons &polygons); +IntersectionsLines get_intersections(const ExPolygon &expolygon); +IntersectionsLines get_intersections(const ExPolygons &expolygons); + +} // namespace Slic3r +#endif // slic3r_IntersectionPoints_hpp_ \ No newline at end of file diff --git a/src/libslic3r/Layer.hpp b/src/libslic3r/Layer.hpp index 6c66579d5a..52c48dfcd2 100644 --- a/src/libslic3r/Layer.hpp +++ b/src/libslic3r/Layer.hpp @@ -72,7 +72,7 @@ public: Flow flow(FlowRole role) const; Flow flow(FlowRole role, double layer_height) const; - Flow bridging_flow(FlowRole role, bool thick_bridge = false, bool internal_bridge = false) const; + Flow bridging_flow(FlowRole role, bool thick_bridge = false) const; void slices_to_fill_surfaces_clipped(); void prepare_fill_surfaces(); diff --git a/src/libslic3r/LayerRegion.cpp b/src/libslic3r/LayerRegion.cpp index a89dd3cfa7..69ac1824cc 100644 --- a/src/libslic3r/LayerRegion.cpp +++ b/src/libslic3r/LayerRegion.cpp @@ -32,16 +32,14 @@ Flow LayerRegion::flow(FlowRole role, double layer_height) const return m_region->flow(*m_layer->object(), role, layer_height, m_layer->id() == 0); } -Flow LayerRegion::bridging_flow(FlowRole role, bool thick_bridge, bool internal_bridge) const +Flow LayerRegion::bridging_flow(FlowRole role, bool thick_bridge) const { const PrintRegion ®ion = this->region(); const PrintRegionConfig ®ion_config = region.config(); const PrintObject &print_object = *this->layer()->object(); Flow bridge_flow; auto nozzle_diameter = float(print_object.print()->config().nozzle_diameter.get_at(region.extruder(role) - 1)); - if(internal_bridge) { // internal bridge is using the thick bridge logic with the internal bridge flow ratio - bridge_flow = Flow::bridging_flow(float(sqrt(region_config.internal_bridge_flow)) * nozzle_diameter, nozzle_diameter); - } else if (thick_bridge) { + if (thick_bridge) { // The old Slic3r way (different from all other slicers): Use rounded extrusions. // Get the configured nozzle_diameter for the extruder associated to the flow role requested. // Here this->extruder(role) - 1 may underflow to MAX_INT, but then the get_at() will follback to zero'th element, so everything is all right. diff --git a/src/libslic3r/MeshBoolean.cpp b/src/libslic3r/MeshBoolean.cpp index 50bbc099e8..b05245d396 100644 --- a/src/libslic3r/MeshBoolean.cpp +++ b/src/libslic3r/MeshBoolean.cpp @@ -200,12 +200,12 @@ indexed_triangle_set cgal_to_indexed_triangle_set(const _Mesh &cgalmesh) const auto &vertices = cgalmesh.vertices(); int vsize = int(vertices.size()); - for (auto &vi : vertices) { + for (const auto &vi : vertices) { auto &v = cgalmesh.point(vi); // Don't ask... its.vertices.emplace_back(to_vec3f(v)); } - for (auto &face : faces) { + for (const auto &face : faces) { auto vtc = cgalmesh.vertices_around_face(cgalmesh.halfedge(face)); int i = 0; diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index 3fc6693a78..a8aecf178a 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -1368,7 +1368,7 @@ indexed_triangle_set ModelObject::raw_indexed_triangle_set() const size_t j = out.indices.size(); append(out.vertices, v->mesh().its.vertices); append(out.indices, v->mesh().its.indices); - auto m = v->get_matrix(); + const Transform3d& m = v->get_matrix(); for (; i < out.vertices.size(); ++ i) out.vertices[i] = (m * out.vertices[i].cast()).cast().eval(); if (v->is_left_handed()) { @@ -1410,7 +1410,7 @@ const BoundingBoxf3& ModelObject::raw_bounding_box() const if (this->instances.empty()) throw Slic3r::InvalidArgument("Can't call raw_bounding_box() with no instances"); - const Transform3d& inst_matrix = this->instances.front()->get_transformation().get_matrix(true); + const Transform3d inst_matrix = this->instances.front()->get_transformation().get_matrix_no_offset(); for (const ModelVolume *v : this->volumes) if (v->is_model_part()) m_raw_bounding_box.merge(v->mesh().transformed_bounding_box(inst_matrix * v->get_matrix())); @@ -1423,14 +1423,18 @@ BoundingBoxf3 ModelObject::instance_bounding_box(size_t instance_idx, bool dont_ return instance_bounding_box(*this->instances[instance_idx], dont_translate); } -BoundingBoxf3 ModelObject::instance_bounding_box(const ModelInstance &instance, bool dont_translate) const { - BoundingBoxf3 bbox; - const auto& inst_mat = instance.get_transformation().get_matrix(dont_translate); - for (auto vol : this->volumes) { - if (vol->is_model_part()) - bbox.merge(vol->mesh().transformed_bounding_box(inst_mat * vol->get_matrix())); +BoundingBoxf3 ModelObject::instance_bounding_box(const ModelInstance &instance, bool dont_translate) const +{ + BoundingBoxf3 bb; + const Transform3d inst_matrix = dont_translate ? + instance.get_transformation().get_matrix_no_offset() : + instance.get_transformation().get_matrix(); + + for (ModelVolume *v : this->volumes) { + if (v->is_model_part()) + bb.merge(v->mesh().transformed_bounding_box(inst_matrix * v->get_matrix())); } - return bbox; + return bb; } @@ -1438,7 +1442,9 @@ BoundingBoxf3 ModelObject::instance_bounding_box(const ModelInstance &instance, BoundingBoxf3 ModelObject::instance_convex_hull_bounding_box(size_t instance_idx, bool dont_translate) const { BoundingBoxf3 bb; - const Transform3d& inst_matrix = this->instances[instance_idx]->get_transformation().get_matrix(dont_translate); + const Transform3d& inst_matrix = dont_translate ? + this->instances[instance_idx]->get_transformation().get_matrix_no_offset() : + this->instances[instance_idx]->get_transformation().get_matrix(); for (ModelVolume *v : this->volumes) { if (v->is_model_part()) @@ -1739,6 +1745,25 @@ void ModelObject::clone_for_cut(ModelObject **obj) (*obj)->input_file.clear(); } +bool ModelVolume::is_the_only_one_part() const +{ + if (m_type != ModelVolumeType::MODEL_PART) + return false; + if (object == nullptr) + return false; + for (const ModelVolume *v : object->volumes) { + if (v == nullptr) + continue; + // is this volume? + if (v->id() == this->id()) + continue; + // exist another model part in object? + if (v->type() == ModelVolumeType::MODEL_PART) + return false; + } + return true; +} + void ModelVolume::reset_extra_facets() { this->supported_facets.reset(); @@ -1759,67 +1784,6 @@ static void invalidate_translations(ModelObject* object, const ModelInstance* sr } } -static void reset_instance_transformation(ModelObject* object, size_t src_instance_idx, const Transform3d& cut_matrix, - bool place_on_cut = false, bool flip = false, Vec3d local_displace = Vec3d::Zero()) -{ - using namespace Geometry; - - // Reset instance transformation except offset and Z-rotation - - for (size_t i = 0; i < object->instances.size(); ++i) { - auto& obj_instance = object->instances[i]; - - Geometry::Transformation instance_transformation_copy = obj_instance->get_transformation(); - instance_transformation_copy.set_offset(Vec3d(0, 0, 0)); - if (object->volumes.size() == 1) { - instance_transformation_copy.set_offset(-object->volumes[0]->get_offset()); - } - - if (i == src_instance_idx && object->volumes.size() == 1) - invalidate_translations(object, obj_instance); - - const Vec3d offset = obj_instance->get_offset(); - const double rot_z = obj_instance->get_rotation().z(); - - obj_instance->set_transformation(Transformation()); - - const Vec3d displace = local_displace.isApprox(Vec3d::Zero()) ? Vec3d::Zero() : - rotation_transform(obj_instance->get_rotation()) * local_displace; - obj_instance->set_offset(offset + displace); - - Vec3d rotation = Vec3d::Zero(); - if (!flip && !place_on_cut) { - if ( i != src_instance_idx) - rotation[Z] = rot_z; - } - else { - Transform3d rotation_matrix = Transform3d::Identity(); - if (flip) - rotation_matrix = rotation_transform(PI * Vec3d::UnitX()); - - if (place_on_cut) - rotation_matrix = rotation_matrix * Transformation(cut_matrix).get_matrix(true, false, true, true).inverse(); - - if (i != src_instance_idx) - rotation_matrix = rotation_transform(rot_z * Vec3d::UnitZ()) * rotation_matrix; - - rotation = Transformation(rotation_matrix).get_rotation(); - } - - obj_instance->set_rotation(rotation); - - // update the assemble matrix - const Transform3d &assemble_matrix = obj_instance->get_assemble_transformation().get_matrix(); - const Transform3d &instance_inverse_matrix = instance_transformation_copy.get_matrix().inverse(); - Transform3d new_instance_inverse_matrix = instance_inverse_matrix * obj_instance->get_transformation().get_matrix(true).inverse(); - if (place_on_cut) { // reset the rotation of cut plane - new_instance_inverse_matrix = new_instance_inverse_matrix * Transformation(cut_matrix).get_matrix(true, false, true, true).inverse(); - } - Transform3d new_assemble_transform = assemble_matrix * new_instance_inverse_matrix; - obj_instance->set_assemble_from_transform(new_assemble_transform); - } -} - void ModelObject::split(ModelObjectPtrs* new_objects) { std::vector all_meshes; @@ -1833,6 +1797,10 @@ void ModelObject::split(ModelObjectPtrs* new_objects) if (volume->type() != ModelVolumeType::MODEL_PART) continue; + // splited volume should not be text object + if (volume->text_configuration.has_value()) + volume->text_configuration.reset(); + if (!is_multi_volume_object) { //BBS: not multi volume object, then split mesh. std::vector volume_meshes = volume->mesh().split(); @@ -1912,7 +1880,7 @@ void ModelObject::split(ModelObjectPtrs* new_objects) for (ModelInstance* model_instance : new_object->instances) { - Vec3d shift = model_instance->get_transformation().get_matrix(true) * new_vol->get_offset(); + const Vec3d shift = model_instance->get_transformation().get_matrix_no_offset() * new_vol->get_offset(); model_instance->set_offset(model_instance->get_offset() + shift); //BBS: add assemble_view related logic @@ -1920,7 +1888,7 @@ void ModelObject::split(ModelObjectPtrs* new_objects) instance_transformation_copy.set_offset(-new_vol->get_offset()); const Transform3d &assemble_matrix = model_instance->get_assemble_transformation().get_matrix(); const Transform3d &instance_inverse_matrix = instance_transformation_copy.get_matrix().inverse(); - Transform3d new_instance_inverse_matrix = instance_inverse_matrix * model_instance->get_transformation().get_matrix(true).inverse(); + Transform3d new_instance_inverse_matrix = instance_inverse_matrix * model_instance->get_transformation().get_matrix_no_offset().inverse(); Transform3d new_assemble_transform = assemble_matrix * new_instance_inverse_matrix; model_instance->set_assemble_from_transform(new_assemble_transform); model_instance->set_offset_to_assembly(new_vol->get_offset()); @@ -2037,8 +2005,14 @@ void ModelObject::bake_xy_rotation_into_meshes(size_t instance_idx) // Adjust the meshes. // Transformation to be applied to the meshes. - Eigen::Matrix3d mesh_trafo_3x3 = reference_trafo.get_matrix(true, false, uniform_scaling, ! has_mirrorring).matrix().block<3, 3>(0, 0); - Transform3d volume_offset_correction = this->instances[instance_idx]->get_transformation().get_matrix().inverse() * reference_trafo.get_matrix(); + Geometry::Transformation reference_trafo_mod = reference_trafo; + reference_trafo_mod.reset_offset(); + if (uniform_scaling) + reference_trafo_mod.reset_scaling_factor(); + if (!has_mirrorring) + reference_trafo_mod.reset_mirror(); + Eigen::Matrix3d mesh_trafo_3x3 = reference_trafo_mod.get_matrix().matrix().block<3, 3>(0, 0); + Transform3d volume_offset_correction = this->instances[instance_idx]->get_transformation().get_matrix().inverse() * reference_trafo.get_matrix(); for (ModelVolume *model_volume : this->volumes) { const Geometry::Transformation volume_trafo = model_volume->get_transformation(); bool volume_left_handed = volume_trafo.is_left_handed(); @@ -2047,9 +2021,15 @@ void ModelObject::bake_xy_rotation_into_meshes(size_t instance_idx) std::abs(volume_trafo.get_scaling_factor().x() - volume_trafo.get_scaling_factor().z()) < EPSILON; double volume_new_scaling_factor = volume_uniform_scaling ? volume_trafo.get_scaling_factor().x() : 1.; // Transform the mesh. - Matrix3d volume_trafo_3x3 = volume_trafo.get_matrix(true, false, volume_uniform_scaling, !volume_has_mirrorring).matrix().block<3, 3>(0, 0); + Geometry::Transformation volume_trafo_mod = volume_trafo; + volume_trafo_mod.reset_offset(); + if (volume_uniform_scaling) + volume_trafo_mod.reset_scaling_factor(); + if (!volume_has_mirrorring) + volume_trafo_mod.reset_mirror(); + Eigen::Matrix3d volume_trafo_3x3 = volume_trafo_mod.get_matrix().matrix().block<3, 3>(0, 0); // Following method creates a new shared_ptr - model_volume->transform_this_mesh(mesh_trafo_3x3 * volume_trafo_3x3, left_handed != volume_left_handed); + model_volume->transform_this_mesh(mesh_trafo_3x3 * volume_trafo_3x3, left_handed != volume_left_handed); // Reset the rotation, scaling and mirroring. model_volume->set_rotation(Vec3d(0., 0., 0.)); model_volume->set_scaling_factor(Vec3d(volume_new_scaling_factor, volume_new_scaling_factor, volume_new_scaling_factor)); @@ -2094,7 +2074,7 @@ double ModelObject::get_instance_min_z(size_t instance_idx) const double min_z = DBL_MAX; const ModelInstance* inst = instances[instance_idx]; - const Transform3d& mi = inst->get_matrix(true); + const Transform3d mi = inst->get_matrix_no_offset(); for (const ModelVolume* v : volumes) { if (!v->is_model_part()) @@ -2130,7 +2110,7 @@ double ModelObject::get_instance_max_z(size_t instance_idx) const double max_z = -DBL_MAX; const ModelInstance* inst = instances[instance_idx]; - const Transform3d& mi = inst->get_matrix(true); + const Transform3d mi = inst->get_matrix_no_offset(); for (const ModelVolume* v : volumes) { if (!v->is_model_part()) @@ -2553,6 +2533,10 @@ size_t ModelVolume::split(unsigned int max_extruders) if (meshes.size() <= 1) return 1; + // splited volume should not be text object + if (text_configuration.has_value()) + text_configuration.reset(); + size_t idx = 0; size_t ivolume = std::find(this->object->volumes.begin(), this->object->volumes.end(), this) - this->object->volumes.begin(); const std::string name = this->name; @@ -2723,44 +2707,17 @@ void ModelVolume::convert_from_meters() void ModelInstance::transform_mesh(TriangleMesh* mesh, bool dont_translate) const { - mesh->transform(get_matrix(dont_translate)); -} - -BoundingBoxf3 ModelInstance::transform_mesh_bounding_box(const TriangleMesh& mesh, bool dont_translate) const -{ - // Rotate around mesh origin. - TriangleMesh copy(mesh); - copy.transform(get_matrix(true, false, true, true)); - BoundingBoxf3 bbox = copy.bounding_box(); - - if (!empty(bbox)) { - // Scale the bounding box along the three axes. - for (unsigned int i = 0; i < 3; ++i) - { - if (std::abs(get_scaling_factor((Axis)i)-1.0) > EPSILON) - { - bbox.min(i) *= get_scaling_factor((Axis)i); - bbox.max(i) *= get_scaling_factor((Axis)i); - } - } - - // Translate the bounding box. - if (! dont_translate) { - bbox.min += get_offset(); - bbox.max += get_offset(); - } - } - return bbox; + mesh->transform(dont_translate ? get_matrix_no_offset() : get_matrix()); } BoundingBoxf3 ModelInstance::transform_bounding_box(const BoundingBoxf3 &bbox, bool dont_translate) const { - return bbox.transformed(get_matrix(dont_translate)); + return bbox.transformed(dont_translate ? get_matrix_no_offset() : get_matrix()); } Vec3d ModelInstance::transform_vector(const Vec3d& v, bool dont_translate) const { - return get_matrix(dont_translate) * v; + return dont_translate ? get_matrix_no_offset() * v : get_matrix() * v; } void ModelInstance::transform_polygon(Polygon* polygon) const @@ -2952,7 +2909,7 @@ Polygon ModelInstance::convex_hull_2d() //BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(": name %1%, is_valid %2%")% this->object->name.c_str()% convex_hull.is_valid(); //if (!convex_hull.is_valid()) { // this logic is not working right now, as moving instance doesn't update convex_hull - const Transform3d& trafo_instance = get_matrix(false); + const Transform3d& trafo_instance = get_matrix(); convex_hull = get_object()->convex_hull_2d(trafo_instance); } //int size = convex_hull.size(); diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index 219d5b19a4..2b4fa14e4b 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -26,6 +26,8 @@ #include "CustomGCode.hpp" #include "calib.hpp" #include "enum_bitmask.hpp" +#include "TextConfiguration.hpp" +#include "EmbossShape.hpp" //BBS: add bbs 3mf #include "Format/bbs_3mf.hpp" @@ -41,6 +43,7 @@ #include #include #include +#include namespace cereal { class BinaryInputArchive; @@ -779,38 +782,6 @@ private: friend class ModelVolume; }; -struct RaycastResult -{ - Vec2d mouse_position = Vec2d::Zero(); - int mesh_id = -1; - Vec3f hit = Vec3f::Zero(); - Vec3f normal = Vec3f::Zero(); - - template void serialize(Archive &ar) { ar(mouse_position, mesh_id, hit, normal); } -}; - -struct TextInfo -{ - std::string m_font_name; - float m_font_size = 16.f; - int m_curr_font_idx = 0; - bool m_bold = true; - bool m_italic = false; - float m_thickness = 2.f; - float m_embeded_depth = 0.f; - float m_rotate_angle = 0; - float m_text_gap = 0.f; - bool m_is_surface_text = false; - bool m_keep_horizontal = false; - std::string m_text; - - RaycastResult m_rr; - - template void serialize(Archive &ar) { - ar(m_font_name, m_font_size, m_curr_font_idx, m_bold, m_italic, m_thickness, m_embeded_depth, m_rotate_angle, m_text_gap, m_is_surface_text, m_keep_horizontal, m_text, m_rr); - } -}; - // An object STL, or a modifier volume, over which a different set of parameters shall be applied. // ModelVolume instances are owned by a ModelObject. class ModelVolume final : public ObjectBase @@ -829,7 +800,7 @@ public: bool is_converted_from_meters{ false }; bool is_from_builtin_objects{ false }; - template void serialize(Archive& ar) { + template void serialize(Archive& ar) { //FIXME Vojtech: Serialize / deserialize only if the Source is set. // likely testing input_file or object_idx would be sufficient. ar(input_file, object_idx, volume_idx, mesh_offset, transform, is_converted_from_inches, is_converted_from_meters, is_from_builtin_objects); @@ -883,7 +854,8 @@ public: void set_mesh(std::shared_ptr &mesh) { m_mesh = mesh; } void set_mesh(std::unique_ptr &&mesh) { m_mesh = std::move(mesh); } void reset_mesh() { m_mesh = std::make_shared(); } - // Configuration parameters specific to an object model geometry or a modifier volume, + const std::shared_ptr& get_mesh_shared_ptr() const { return m_mesh; } + // Configuration parameters specific to an object model geometry or a modifier volume, // overriding the global Slic3r settings and the ModelObject settings. ModelConfigObject config; @@ -903,6 +875,14 @@ public: // List of exterior faces FacetsAnnotation exterior_facets; + // Is set only when volume is Embossed Text type + // Contain information how to re-create volume + std::optional text_configuration; + + // Is set only when volume is Embossed Shape + // Contain 2d information about embossed shape to be editabled + std::optional emboss_shape; + // A parent object owning this modifier volume. ModelObject* get_object() const { return this->object; } ModelVolumeType type() const { return m_type; } @@ -913,6 +893,9 @@ public: bool is_support_enforcer() const { return m_type == ModelVolumeType::SUPPORT_ENFORCER; } bool is_support_blocker() const { return m_type == ModelVolumeType::SUPPORT_BLOCKER; } bool is_support_modifier() const { return m_type == ModelVolumeType::SUPPORT_BLOCKER || m_type == ModelVolumeType::SUPPORT_ENFORCER; } + bool is_text() const { return text_configuration.has_value(); } + bool is_svg() const { return emboss_shape.has_value() && !text_configuration.has_value(); } + bool is_the_only_one_part() const; // behave like an object t_model_material_id material_id() const { return m_material_id; } void set_material_id(t_model_material_id material_id); void reset_extra_facets(); @@ -968,15 +951,16 @@ public: const Geometry::Transformation& get_transformation() const { return m_transformation; } void set_transformation(const Geometry::Transformation& transformation) { m_transformation = transformation; } - void set_transformation(const Transform3d &trafo) { m_transformation.set_from_transform(trafo); } + void set_transformation(const Transform3d& trafo) { m_transformation.set_matrix(trafo); } + + Vec3d get_offset() const { return m_transformation.get_offset(); } - const Vec3d& get_offset() const { return m_transformation.get_offset(); } double get_offset(Axis axis) const { return m_transformation.get_offset(axis); } void set_offset(const Vec3d& offset) { m_transformation.set_offset(offset); } void set_offset(Axis axis, double offset) { m_transformation.set_offset(axis, offset); } - const Vec3d& get_rotation() const { return m_transformation.get_rotation(); } + Vec3d get_rotation() const { return m_transformation.get_rotation(); } double get_rotation(Axis axis) const { return m_transformation.get_rotation(axis); } void set_rotation(const Vec3d& rotation) { m_transformation.set_rotation(rotation); } @@ -988,7 +972,7 @@ public: void set_scaling_factor(const Vec3d& scaling_factor) { m_transformation.set_scaling_factor(scaling_factor); } void set_scaling_factor(Axis axis, double scaling_factor) { m_transformation.set_scaling_factor(axis, scaling_factor); } - const Vec3d& get_mirror() const { return m_transformation.get_mirror(); } + Vec3d get_mirror() const { return m_transformation.get_mirror(); } double get_mirror(Axis axis) const { return m_transformation.get_mirror(axis); } bool is_left_handed() const { return m_transformation.is_left_handed(); } @@ -997,10 +981,8 @@ public: void convert_from_imperial_units(); void convert_from_meters(); - void set_text_info(const TextInfo& text_info) { m_text_info = text_info; } - const TextInfo& get_text_info() const { return m_text_info; } - - 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); } + const Transform3d& get_matrix() const { return m_transformation.get_matrix(); } + Transform3d get_matrix_no_offset() const { return m_transformation.get_matrix_no_offset(); } void set_new_unique_id() { ObjectBase::set_new_unique_id(); @@ -1044,8 +1026,6 @@ private: mutable Polygon m_cached_2d_polygon; //BBS, used for convex_hell_2d acceleration Geometry::Transformation m_transformation; - TextInfo m_text_info; - //BBS: add convex_hell_2d related logic void calculate_convex_hull_2d(const Geometry::Transformation &transformation) const; @@ -1100,10 +1080,10 @@ private: 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), supported_facets(other.supported_facets), seam_facets(other.seam_facets), mmu_segmentation_facets(other.mmu_segmentation_facets), - m_text_info(other.m_text_info) + cut_info(other.cut_info), text_configuration(other.text_configuration), emboss_shape(other.emboss_shape) { - assert(this->id().valid()); - assert(this->config.id().valid()); + assert(this->id().valid()); + assert(this->config.id().valid()); assert(this->supported_facets.id().valid()); assert(this->seam_facets.id().valid()); assert(this->mmu_segmentation_facets.id().valid()); @@ -1119,11 +1099,12 @@ private: 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) + ModelVolume(ModelObject *object, const ModelVolume &other, TriangleMesh &&mesh) : + name(other.name), source(other.source), config(other.config), object(object), m_mesh(new TriangleMesh(std::move(mesh))), m_type(other.m_type), m_transformation(other.m_transformation), + cut_info(other.cut_info), text_configuration(other.text_configuration), emboss_shape(other.emboss_shape) { - assert(this->id().valid()); - assert(this->config.id().valid()); + assert(this->id().valid()); + assert(this->config.id().valid()); assert(this->supported_facets.id().valid()); assert(this->seam_facets.id().valid()); assert(this->mmu_segmentation_facets.id().valid()); @@ -1135,10 +1116,10 @@ private: assert(this->config.id() == other.config.id()); this->set_material_id(other.material_id()); this->config.set_new_unique_id(); - if (mesh.facets_count() > 1) + if (m_mesh->facets_count() > 1) calculate_convex_hull(); - assert(this->config.id().valid()); - assert(this->config.id() != other.config.id()); + 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->mmu_segmentation_facets.id() != other.mmu_segmentation_facets.id()); @@ -1165,9 +1146,8 @@ private: // BBS: add backup, check modify bool mesh_changed = false; auto tr = m_transformation; - ar(name, source, m_mesh, m_type, m_material_id, m_transformation, m_is_splittable, has_convex_hull, m_text_info, cut_info); + ar(name, source, m_mesh, m_type, m_material_id, m_transformation, m_is_splittable, has_convex_hull, cut_info); mesh_changed |= !(tr == m_transformation); - if (mesh_changed) m_transformation.get_matrix(true, true, true, true); // force dirty auto t = supported_facets.timestamp(); cereal::load_by_value(ar, supported_facets); mesh_changed |= t != supported_facets.timestamp(); @@ -1178,6 +1158,8 @@ private: cereal::load_by_value(ar, mmu_segmentation_facets); mesh_changed |= t != mmu_segmentation_facets.timestamp(); cereal::load_by_value(ar, config); + cereal::load(ar, text_configuration); + cereal::load(ar, emboss_shape); assert(m_mesh); if (has_convex_hull) { cereal::load_optional(ar, m_convex_hull); @@ -1191,11 +1173,13 @@ 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, m_text_info, cut_info); + ar(name, source, m_mesh, m_type, m_material_id, m_transformation, m_is_splittable, has_convex_hull, cut_info); cereal::save_by_value(ar, supported_facets); cereal::save_by_value(ar, seam_facets); cereal::save_by_value(ar, mmu_segmentation_facets); cereal::save_by_value(ar, config); + cereal::save(ar, text_configuration); + cereal::save(ar, emboss_shape); if (has_convex_hull) cereal::save_optional(ar, m_convex_hull); } @@ -1259,7 +1243,7 @@ public: } void set_assemble_from_transform(Transform3d& transform) { m_assemble_initialized = true; - m_assemble_transformation.set_from_transform(transform); + m_assemble_transformation.set_matrix(transform); } void set_assemble_offset(const Vec3d& offset) { m_assemble_transformation.set_offset(offset); } void rotate_assemble(double angle, const Vec3d& axis) { @@ -1270,13 +1254,13 @@ public: void set_offset_to_assembly(const Vec3d& offset) { m_offset_to_assembly = offset; } Vec3d get_offset_to_assembly() const { return m_offset_to_assembly; } - const Vec3d& get_offset() const { return m_transformation.get_offset(); } + Vec3d get_offset() const { return m_transformation.get_offset(); } double get_offset(Axis axis) const { return m_transformation.get_offset(axis); } void set_offset(const Vec3d& offset) { m_transformation.set_offset(offset); } void set_offset(Axis axis, double offset) { m_transformation.set_offset(axis, offset); } - const Vec3d& get_rotation() const { return m_transformation.get_rotation(); } + Vec3d get_rotation() const { return m_transformation.get_rotation(); } double get_rotation(Axis axis) const { return m_transformation.get_rotation(axis); } void set_rotation(const Vec3d& rotation) { m_transformation.set_rotation(rotation); } @@ -1284,38 +1268,36 @@ public: // BBS void rotate(Matrix3d rotation_matrix) { - // note: must remove scaling from transformation, otherwise auto-orientation with scaled objects will have problem - auto R = get_matrix(true,false,true).matrix().block<3, 3>(0, 0); + auto R = m_transformation.get_rotation_matrix().matrix().block<3, 3>(0, 0); auto R_new = rotation_matrix * R; auto euler_angles = Geometry::extract_euler_angles(R_new); set_rotation(euler_angles); } - const Vec3d& get_scaling_factor() const { return m_transformation.get_scaling_factor(); } + Vec3d get_scaling_factor() const { return m_transformation.get_scaling_factor(); } double get_scaling_factor(Axis axis) const { return m_transformation.get_scaling_factor(axis); } void set_scaling_factor(const Vec3d& scaling_factor) { m_transformation.set_scaling_factor(scaling_factor); } void set_scaling_factor(Axis axis, double scaling_factor) { m_transformation.set_scaling_factor(axis, scaling_factor); } - const Vec3d& get_mirror() const { return m_transformation.get_mirror(); } + Vec3d get_mirror() const { return m_transformation.get_mirror(); } double get_mirror(Axis axis) const { return m_transformation.get_mirror(axis); } - bool is_left_handed() const { return m_transformation.is_left_handed(); } + bool is_left_handed() const { return m_transformation.is_left_handed(); } void set_mirror(const Vec3d& mirror) { m_transformation.set_mirror(mirror); } void set_mirror(Axis axis, double mirror) { m_transformation.set_mirror(axis, mirror); } // To be called on an external mesh void transform_mesh(TriangleMesh* mesh, bool dont_translate = false) const; - // Calculate a bounding box of a transformed mesh. To be called on an external mesh. - BoundingBoxf3 transform_mesh_bounding_box(const TriangleMesh& mesh, bool dont_translate = false) const; - // Transform an external bounding box. + // Transform an external bounding box, thus the resulting bounding box is no more snug. BoundingBoxf3 transform_bounding_box(const BoundingBoxf3 &bbox, bool dont_translate = false) const; // Transform an external vector. Vec3d transform_vector(const Vec3d& v, bool dont_translate = false) const; // To be called on an external polygon. It does not translate the polygon, only rotates and scales. void transform_polygon(Polygon* polygon) const; - 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); } + const Transform3d& get_matrix() const { return m_transformation.get_matrix(); } + Transform3d get_matrix_no_offset() const { return m_transformation.get_matrix_no_offset(); } bool is_printable() const { return object->printable && printable && (print_volume_state == ModelInstancePVS_Inside); } bool is_assemble_initialized() { return m_assemble_initialized; } diff --git a/src/libslic3r/NSVGUtils.cpp b/src/libslic3r/NSVGUtils.cpp new file mode 100644 index 0000000000..6bfb89b74e --- /dev/null +++ b/src/libslic3r/NSVGUtils.cpp @@ -0,0 +1,547 @@ +///|/ Copyright (c) Prusa Research 2021 - 2022 Filip Sykala @Jony01 +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ +#include "NSVGUtils.hpp" +#include +#include // to_chars + +#include +#include +#include "ClipperUtils.hpp" +#include "Emboss.hpp" // heal for shape + +namespace { +using namespace Slic3r; // Polygon +// see function nsvg__lineTo(NSVGparser* p, float x, float y) +bool is_line(const float *p, float precision = 1e-4f); +// convert curve in path to lines +struct LinesPath{ + Polygons polygons; + Polylines polylines; }; +LinesPath linearize_path(NSVGpath *first_path, const NSVGLineParams ¶m); +HealedExPolygons fill_to_expolygons(const LinesPath &lines_path, const NSVGshape &shape, const NSVGLineParams ¶m); +HealedExPolygons stroke_to_expolygons(const LinesPath &lines_path, const NSVGshape &shape, const NSVGLineParams ¶m); +} // namespace + +namespace Slic3r { + +ExPolygonsWithIds create_shape_with_ids(const NSVGimage &image, const NSVGLineParams ¶m) +{ + ExPolygonsWithIds result; + size_t shape_id = 0; + for (NSVGshape *shape_ptr = image.shapes; shape_ptr != NULL; shape_ptr = shape_ptr->next, ++shape_id) { + const NSVGshape &shape = *shape_ptr; + if (!(shape.flags & NSVG_FLAGS_VISIBLE)) + continue; + + bool is_fill_used = shape.fill.type != NSVG_PAINT_NONE; + bool is_stroke_used = + shape.stroke.type != NSVG_PAINT_NONE && + shape.strokeWidth > 1e-5f; + + if (!is_fill_used && !is_stroke_used) + continue; + + const LinesPath lines_path = linearize_path(shape.paths, param); + + if (is_fill_used) { + unsigned unique_id = static_cast(2 * shape_id); + HealedExPolygons expoly = fill_to_expolygons(lines_path, shape, param); + result.push_back({unique_id, expoly.expolygons, expoly.is_healed}); + } + if (is_stroke_used) { + unsigned unique_id = static_cast(2 * shape_id + 1); + HealedExPolygons expoly = stroke_to_expolygons(lines_path, shape, param); + result.push_back({unique_id, expoly.expolygons, expoly.is_healed}); + } + } + + // SVG is used as centered + // Do not disturb user by settings of pivot position + center(result); + return result; +} + +Polygons to_polygons(const NSVGimage &image, const NSVGLineParams ¶m) +{ + Polygons result; + for (NSVGshape *shape = image.shapes; shape != NULL; shape = shape->next) { + if (!(shape->flags & NSVG_FLAGS_VISIBLE)) + continue; + if (shape->fill.type == NSVG_PAINT_NONE) + continue; + const LinesPath lines_path = linearize_path(shape->paths, param); + polygons_append(result, lines_path.polygons); + // close polyline to create polygon + polygons_append(result, to_polygons(lines_path.polylines)); + } + return result; +} + +void bounds(const NSVGimage &image, Vec2f& min, Vec2f &max) +{ + for (const NSVGshape *shape = image.shapes; shape != NULL; shape = shape->next) + for (const NSVGpath *path = shape->paths; path != NULL; path = path->next) { + if (min.x() > path->bounds[0]) + min.x() = path->bounds[0]; + if (min.y() > path->bounds[1]) + min.y() = path->bounds[1]; + if (max.x() < path->bounds[2]) + max.x() = path->bounds[2]; + if (max.y() < path->bounds[3]) + max.y() = path->bounds[3]; + } +} + +NSVGimage_ptr nsvgParseFromFile(const std::string &filename, const char *units, float dpi) +{ + NSVGimage *image = ::nsvgParseFromFile(filename.c_str(), units, dpi); + return {image, &nsvgDelete}; +} + +std::unique_ptr read_from_disk(const std::string &path) +{ + boost::nowide::ifstream fs{path}; + if (!fs.is_open()) + return nullptr; + std::stringstream ss; + ss << fs.rdbuf(); + return std::make_unique(ss.str()); +} + +NSVGimage_ptr nsvgParse(const std::string& file_data, const char *units, float dpi){ + // NOTE: nsvg parser consume data from input(char *) + size_t size = file_data.size(); + // file data could be big, so it is allocated on heap + std::unique_ptr data_copy(new char[size+1]); + memcpy(data_copy.get(), file_data.c_str(), size); + data_copy[size] = '\0'; // data for nsvg must be null terminated + NSVGimage *image = ::nsvgParse(data_copy.get(), units, dpi); + return {image, &nsvgDelete}; +} + +NSVGimage *init_image(EmbossShape::SvgFile &svg_file){ + // is already initialized? + if (svg_file.image.get() != nullptr) + return svg_file.image.get(); + + if (svg_file.file_data == nullptr) { + // chech if path is known + if (svg_file.path.empty()) + return nullptr; + svg_file.file_data = read_from_disk(svg_file.path); + if (svg_file.file_data == nullptr) + return nullptr; + } + + // init svg image + svg_file.image = nsvgParse(*svg_file.file_data); + if (svg_file.image.get() == NULL) + return nullptr; + + return svg_file.image.get(); +} + +size_t get_shapes_count(const NSVGimage &image) +{ + size_t count = 0; + for (NSVGshape * s = image.shapes; s != NULL; s = s->next) + ++count; + return count; +} + +//void save(const NSVGimage &image, std::ostream &data) +//{ +// data << ""; +// +// // tl .. top left +// Vec2f tl(std::numeric_limits::max(), std::numeric_limits::max()); +// // br .. bottom right +// Vec2f br(std::numeric_limits::min(), std::numeric_limits::min()); +// bounds(image, tl, br); +// +// tl.x() = std::floor(tl.x()); +// tl.y() = std::floor(tl.y()); +// +// br.x() = std::ceil(br.x()); +// br.y() = std::ceil(br.y()); +// Vec2f s = br - tl; +// Point size = s.cast(); +// +// data << "\n"; +// data << "\n"; +// +// std::array buffer; +// auto write_point = [&tl, &buffer](std::string &d, const float *p) { +// float x = p[0] - tl.x(); +// float y = p[1] - tl.y(); +// auto to_string = [&buffer](float f) -> std::string { +// auto [ptr, ec] = std::to_chars(buffer.data(), buffer.data() + buffer.size(), f); +// if (ec != std::errc{}) +// return "0"; +// return std::string(buffer.data(), ptr); +// }; +// d += to_string(x) + "," + to_string(y) + " "; +// }; +// +// for (const NSVGshape *shape = image.shapes; shape != NULL; shape = shape->next) { +// enum struct Type { move, line, curve, close }; // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/d +// Type type = Type::move; +// std::string d = "M "; // move on start point +// for (const NSVGpath *path = shape->paths; path != NULL; path = path->next) { +// if (path->npts <= 1) +// continue; +// +// if (type == Type::close) { +// type = Type::move; +// // NOTE: After close must be a space +// d += " M "; // move on start point +// } +// write_point(d, path->pts); +// size_t path_size = static_cast(path->npts - 1); +// +// if (path->closed) { +// // Do not use last point in path it is duplicit +// if (path->npts <= 4) +// continue; +// path_size = static_cast(path->npts - 4); +// } +// +// for (size_t i = 0; i < path_size; i += 3) { +// const float *p = &path->pts[i * 2]; +// if (!::is_line(p)) { +// if (type != Type::curve) { +// type = Type::curve; +// d += "C "; // start sequence of triplets defining curves +// } +// write_point(d, &p[2]); +// write_point(d, &p[4]); +// } else { +// +// if (type != Type::line) { +// type = Type::line; +// d += "L "; // start sequence of line points +// } +// } +// write_point(d, &p[6]); +// } +// if (path->closed) { +// type = Type::close; +// d += "Z"; // start sequence of line points +// } +// } +// if (type != Type::close) { +// //type = Type::close; +// d += "Z"; // closed path +// } +// data << "\n"; +// } +// data << "\n"; +//} +// +//bool save(const NSVGimage &image, const std::string &svg_file_path) +//{ +// std::ofstream file{svg_file_path}; +// if (!file.is_open()) +// return false; +// save(image, file); +// return true; +//} +} // namespace Slic3r + +namespace { +using namespace Slic3r; // Polygon + Vec2f + +Point::coord_type to_coor(float val, double scale) { return static_cast(std::round(val * scale)); } + +bool need_flattening(float tessTol, const Vec2f &p1, const Vec2f &p2, const Vec2f &p3, const Vec2f &p4) { + // f .. first + // s .. second + auto det = [](const Vec2f &f, const Vec2f &s) { + return std::fabs(f.x() * s.y() - f.y() * s.x()); + }; + + Vec2f pd = (p4 - p1); + Vec2f pd2 = (p2 - p4); + float d2 = det(pd2, pd); + Vec2f pd3 = (p3 - p4); + float d3 = det(pd3, pd); + float d23 = d2 + d3; + + return (d23 * d23) >= tessTol * pd.squaredNorm(); +} + +// see function nsvg__lineTo(NSVGparser* p, float x, float y) +bool is_line(const float *p, float precision){ + //Vec2f p1(p[0], p[1]); + //Vec2f p2(p[2], p[3]); + //Vec2f p3(p[4], p[5]); + //Vec2f p4(p[6], p[7]); + float dx_3 = (p[6] - p[0]) / 3.f; + float dy_3 = (p[7] - p[1]) / 3.f; + + return + is_approx(p[2], p[0] + dx_3, precision) && + is_approx(p[4], p[6] - dx_3, precision) && + is_approx(p[3], p[1] + dy_3, precision) && + is_approx(p[5], p[7] - dy_3, precision); +} + +///

+/// Convert cubic curve to lines +/// Inspired by nanosvgrast.h function nsvgRasterize -> nsvg__flattenShape -> nsvg__flattenCubicBez +/// https://github.com/memononen/nanosvg/blob/f0a3e1034dd22e2e87e5db22401e44998383124e/src/nanosvgrast.h#L335 +/// +/// Result points +/// Tesselation tolerance +/// Curve point +/// Curve point +/// Curve point +/// Curve point +/// Actual depth of recursion +void flatten_cubic_bez(Points &points, float tessTol, const Vec2f& p1, const Vec2f& p2, const Vec2f& p3, const Vec2f& p4, int level) +{ + if (!need_flattening(tessTol, p1, p2, p3, p4)) { + Point::coord_type x = static_cast(std::round(p4.x())); + Point::coord_type y = static_cast(std::round(p4.y())); + points.emplace_back(x, y); + return; + } + + --level; + if (level == 0) + return; + + Vec2f p12 = (p1 + p2) * 0.5f; + Vec2f p23 = (p2 + p3) * 0.5f; + Vec2f p34 = (p3 + p4) * 0.5f; + Vec2f p123 = (p12 + p23) * 0.5f; + Vec2f p234 = (p23 + p34) * 0.5f; + Vec2f p1234 = (p123 + p234) * 0.5f; + flatten_cubic_bez(points, tessTol, p1, p12, p123, p1234, level); + flatten_cubic_bez(points, tessTol, p1234, p234, p34, p4, level); +} + +LinesPath linearize_path(NSVGpath *first_path, const NSVGLineParams ¶m) +{ + LinesPath result; + Polygons &polygons = result.polygons; + Polylines &polylines = result.polylines; + + // multiple use of allocated memmory for points between paths + Points points; + for (NSVGpath *path = first_path; path != NULL; path = path->next) { + // Flatten path + Point::coord_type x = to_coor(path->pts[0], param.scale); + Point::coord_type y = to_coor(path->pts[1], param.scale); + points.emplace_back(x, y); + size_t path_size = (path->npts > 1) ? static_cast(path->npts - 1) : 0; + for (size_t i = 0; i < path_size; i += 3) { + const float *p = &path->pts[i * 2]; + if (is_line(p)) { + // point p4 + Point::coord_type xx = to_coor(p[6], param.scale); + Point::coord_type yy = to_coor(p[7], param.scale); + points.emplace_back(xx, yy); + continue; + } + Vec2f p1(p[0], p[1]); + Vec2f p2(p[2], p[3]); + Vec2f p3(p[4], p[5]); + Vec2f p4(p[6], p[7]); + flatten_cubic_bez(points, param.tesselation_tolerance, + p1 * param.scale, p2 * param.scale, p3 * param.scale, p4 * param.scale, + param.max_level); + } + assert(!points.empty()); + if (points.empty()) + continue; + + if (param.is_y_negative) + for (Point &p : points) + p.y() = -p.y(); + + if (path->closed) { + polygons.emplace_back(points); + } else { + polylines.emplace_back(points); + } + // prepare for new path - recycle alocated memory + points.clear(); + } + remove_same_neighbor(polygons); + remove_same_neighbor(polylines); + return result; +} + +HealedExPolygons fill_to_expolygons(const LinesPath &lines_path, const NSVGshape &shape, const NSVGLineParams ¶m) +{ + Polygons fill = lines_path.polygons; // copy + + // close polyline to create polygon + polygons_append(fill, to_polygons(lines_path.polylines)); + if (fill.empty()) + return {}; + + // if (shape->fillRule == NSVGfillRule::NSVG_FILLRULE_NONZERO) + bool is_non_zero = true; + if (shape.fillRule == NSVGfillRule::NSVG_FILLRULE_EVENODD) + is_non_zero = false; + + return Emboss::heal_polygons(fill, is_non_zero, param.max_heal_iteration); +} + +struct DashesParam{ + // first dash length + float dash_length = 1.f; // scaled + + // is current dash .. true + // is current space .. false + bool is_line = true; + + // current index to array + unsigned char dash_index = 0; + static constexpr size_t max_dash_array_size = 8; // limitation of nanosvg strokeDashArray + std::array dash_array; // scaled + unsigned char dash_count = 0; // count of values in array + + explicit DashesParam(const NSVGshape &shape, double scale) : + dash_count(shape.strokeDashCount) + { + assert(dash_count > 0); + assert(dash_count <= max_dash_array_size); // limitation of nanosvg strokeDashArray + for (size_t i = 0; i < dash_count; ++i) + dash_array[i] = static_cast(shape.strokeDashArray[i] * scale); + + // Figure out dash offset. + float all_dash_length = 0; + for (unsigned char j = 0; j < dash_count; ++j) + all_dash_length += dash_array[j]; + + if (dash_count%2 == 1) // (shape.strokeDashCount & 1) + all_dash_length *= 2.0f; + + // Find location inside pattern + float dash_offset = fmodf(static_cast(shape.strokeDashOffset * scale), all_dash_length); + if (dash_offset < 0.0f) + dash_offset += all_dash_length; + + while (dash_offset > dash_array[dash_index]) { + dash_offset -= dash_array[dash_index]; + dash_index = (dash_index + 1) % shape.strokeDashCount; + is_line = !is_line; + } + + dash_length = dash_array[dash_index] - dash_offset; + } +}; + +Polylines to_dashes(const Polyline &polyline, const DashesParam& param) +{ + Polylines dashes; + Polyline dash; // cache for one dash in dashed line + Point prev_point; + + bool is_line = param.is_line; + unsigned char dash_index = param.dash_index; + float dash_length = param.dash_length; // current rest of dash distance + for (const Point &point : polyline.points) { + if (&point == &polyline.points.front()) { + // is first point + prev_point = point; // copy + continue; + } + + Point diff = point - prev_point; + float line_segment_length = diff.cast().norm(); + while (dash_length < line_segment_length) { + // Calculate intermediate point + float d = dash_length / line_segment_length; + Point move_point = diff * d; + Point intermediate = prev_point + move_point; + + // add Dash in stroke + if (is_line) { + if (dash.empty()) { + dashes.emplace_back(Points{prev_point, intermediate}); + } else { + dash.append(prev_point); + dash.append(intermediate); + dashes.push_back(dash); + dash.clear(); + } + } + + diff -= move_point; + line_segment_length -= dash_length; + prev_point = intermediate; + + // Advance dash pattern + is_line = !is_line; + dash_index = (dash_index + 1) % param.dash_count; + dash_length = param.dash_array[dash_index]; + } + + if (is_line) + dash.append(prev_point); + dash_length -= line_segment_length; + prev_point = point; // copy + } + + // add last dash + if (is_line){ + assert(!dash.empty()); + dash.append(prev_point); // prev_point == polyline.points.back() + dashes.push_back(dash); + } + return dashes; +} + +HealedExPolygons stroke_to_expolygons(const LinesPath &lines_path, const NSVGshape &shape, const NSVGLineParams ¶m) +{ + // convert stroke to polygon + ClipperLib::JoinType join_type = ClipperLib::JoinType::jtSquare; + switch (static_cast(shape.strokeLineJoin)) { + case NSVGlineJoin::NSVG_JOIN_BEVEL: join_type = ClipperLib::JoinType::jtSquare; break; + case NSVGlineJoin::NSVG_JOIN_MITER: join_type = ClipperLib::JoinType::jtMiter; break; + case NSVGlineJoin::NSVG_JOIN_ROUND: join_type = ClipperLib::JoinType::jtRound; break; + } + + double mitter = shape.miterLimit * param.scale; + if (join_type == ClipperLib::JoinType::jtRound) { + // mitter is used as ArcTolerance + // http://www.angusj.com/delphi/clipper/documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Properties/ArcTolerance.htm + mitter = std::pow(param.tesselation_tolerance, 1/3.); + } + float stroke_width = static_cast(shape.strokeWidth * param.scale); + + ClipperLib::EndType end_type = ClipperLib::EndType::etOpenButt; + switch (static_cast(shape.strokeLineCap)) { + case NSVGlineCap::NSVG_CAP_BUTT: end_type = ClipperLib::EndType::etOpenButt; break; + case NSVGlineCap::NSVG_CAP_ROUND: end_type = ClipperLib::EndType::etOpenRound; break; + case NSVGlineCap::NSVG_CAP_SQUARE: end_type = ClipperLib::EndType::etOpenSquare; break; + } + + Polygons result; + if (shape.strokeDashCount > 0) { + DashesParam params(shape, param.scale); + Polylines dashes; + for (const Polyline &polyline : lines_path.polylines) + polylines_append(dashes, to_dashes(polyline, params)); + for (const Polygon &polygon : lines_path.polygons) + polylines_append(dashes, to_dashes(to_polyline(polygon), params)); + result = offset(dashes, stroke_width / 2, join_type, mitter, end_type); + } else { + result = contour_to_polygons(lines_path.polygons, stroke_width, join_type, mitter); + polygons_append(result, offset(lines_path.polylines, stroke_width / 2, join_type, mitter, end_type)); + } + + bool is_non_zero = true; + return Emboss::heal_polygons(result, is_non_zero, param.max_heal_iteration); +} + +} // namespace diff --git a/src/libslic3r/NSVGUtils.hpp b/src/libslic3r/NSVGUtils.hpp new file mode 100644 index 0000000000..fe76fa0459 --- /dev/null +++ b/src/libslic3r/NSVGUtils.hpp @@ -0,0 +1,86 @@ +///|/ Copyright (c) Prusa Research 2021 Filip Sykala @Jony01 +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ +#ifndef slic3r_NSVGUtils_hpp_ +#define slic3r_NSVGUtils_hpp_ + +#include +#include +#include +#include "Polygon.hpp" +#include "ExPolygon.hpp" +#include "EmbossShape.hpp" // ExPolygonsWithIds +#include "nanosvg/nanosvg.h" // load SVG file + +// Helper function to work with nano svg +namespace Slic3r { + +/// +/// Paramreters for conversion curve from SVG to lines in Polygon +/// +struct NSVGLineParams +{ + // Smaller will divide curve to more lines + // NOTE: Value is in image scale + double tesselation_tolerance = 10.f; + + // Maximal depth of recursion for conversion curve to lines + int max_level = 10; + + // Multiplicator of point coors + // NOTE: Every point coor from image(float) is multiplied by scale and rounded to integer --> Slic3r::Point + double scale = 1. / SCALING_FACTOR; + + // Flag wether y is negative, when true than y coor is multiplied by -1 + bool is_y_negative = true; + + // Is used only with rounded Stroke + double arc_tolerance = 1.; + + // Maximal count of heal iteration + unsigned max_heal_iteration = 10; + + explicit NSVGLineParams(double tesselation_tolerance): + tesselation_tolerance(tesselation_tolerance), + arc_tolerance(std::pow(tesselation_tolerance, 1/3.)) + {} +}; + +/// +/// Convert .svg opened by nanoSvg to shapes stored in expolygons with ids +/// +/// Parsed svg file by NanoSvg +/// Smaller will divide curve to more lines +/// NOTE: Value is in image scale +/// Maximal depth for conversion curve to lines +/// Multiplicator of point coors +/// NOTE: Every point coor from image(float) is multiplied by scale and rounded to integer +/// Shapes from svg image - fill + stroke +ExPolygonsWithIds create_shape_with_ids(const NSVGimage &image, const NSVGLineParams ¶m); + +// help functions - prepare to be tested +/// Flag is y negative, when true than y coor is multiplied by -1 +Polygons to_polygons(const NSVGimage &image, const NSVGLineParams ¶m); + +void bounds(const NSVGimage &image, Vec2f &min, Vec2f &max); + +// read text data from file +std::unique_ptr read_from_disk(const std::string &path); + +using NSVGimage_ptr = std::unique_ptr; +NSVGimage_ptr nsvgParseFromFile(const std::string &svg_file_path, const char *units = "mm", float dpi = 96.0f); +NSVGimage_ptr nsvgParse(const std::string& file_data, const char *units = "mm", float dpi = 96.0f); +NSVGimage *init_image(EmbossShape::SvgFile &svg_file); + +/// +/// Iterate over shapes and calculate count +/// +/// Contain pointer to first shape +/// Count of shapes +size_t get_shapes_count(const NSVGimage &image); + +//void save(const NSVGimage &image, std::ostream &data); +//bool save(const NSVGimage &image, const std::string &svg_file_path); +} // namespace Slic3r +#endif // slic3r_NSVGUtils_hpp_ diff --git a/src/libslic3r/PerimeterGenerator.cpp b/src/libslic3r/PerimeterGenerator.cpp index 1a06c939bd..4adf705665 100644 --- a/src/libslic3r/PerimeterGenerator.cpp +++ b/src/libslic3r/PerimeterGenerator.cpp @@ -1729,9 +1729,7 @@ void PerimeterGenerator::process_classic() // if brim will be printed, reverse the order of perimeters so that // we continue inwards after having finished the brim // TODO: add test for perimeter order - bool is_outer_wall_first = - this->object_config->wall_sequence == WallSequence::OuterInner || - this->object_config->wall_sequence == WallSequence::InnerOuterInner; + bool is_outer_wall_first = this->object_config->wall_sequence == WallSequence::OuterInner; if (is_outer_wall_first || //BBS: always print outer wall first when there indeed has brim. (this->layer_id == 0 && @@ -1937,24 +1935,22 @@ void PerimeterGenerator::process_arachne() // extra perimeters for each one for (const Surface& surface : this->slices->surfaces) { coord_t bead_width_0 = ext_perimeter_spacing; - if (config->precise_outer_wall) - bead_width_0 = ext_perimeter_width + this->perimeter_flow.scaled_width() - perimeter_spacing; // detect how many perimeters must be generated for this island int loop_number = this->config->wall_loops + surface.extra_perimeters - 1; // 0-indexed loops if (this->layer_id == 0 && this->config->only_one_wall_first_layer) loop_number = 0; - // BBS: set the topmost layer to be one wall + // Orca: set the topmost layer to be one wall according to the config if (loop_number > 0 && config->only_one_wall_top && this->upper_slices == nullptr) loop_number = 0; + // Orca: properly adjust offset for the outer wall if precise_outer_wall is enabled. ExPolygons last = offset_ex(surface.expolygon.simplify_p(surface_simplify_resolution), - config->precise_outer_wall ? -float(ext_perimeter_width / 2. - bead_width_0 / 2.) + config->precise_outer_wall ? -float(ext_perimeter_width - ext_perimeter_spacing ) : -float(ext_perimeter_width / 2. - ext_perimeter_spacing / 2.)); Arachne::WallToolPathsParams input_params = Arachne::make_paths_params(this->layer_id, *object_config, *print_config); coord_t wall_0_inset = 0; - //if (config->precise_outer_wall) - // wall_0_inset = 0.5 * (ext_perimeter_width + this->perimeter_flow.scaled_width() - ext_perimeter_spacing - - // perimeter_spacing); + if (config->precise_outer_wall) + wall_0_inset = -coord_t(ext_perimeter_width / 2 - ext_perimeter_spacing / 2); std::vector out_shell; ExPolygons top_fills; @@ -2169,7 +2165,7 @@ void PerimeterGenerator::process_arachne() } // printf("New Layer: Layer ID %d\n",layer_id); //debug - new layer - if (this->config->wall_infill_order == WallInfillOrder::InnerOuterInnerInfill && layer_id > 0) { // only enable inner outer inner algorithm after first layer + if (this->object_config->wall_sequence == WallSequence::InnerOuterInner && layer_id > 0) { // only enable inner outer inner algorithm after first layer if (ordered_extrusions.size() > 2) { // 3 walls minimum needed to do inner outer inner ordering int position = 0; // index to run the re-ordering for multiple external perimeters in a single island. int arr_i, arr_j = 0; // indexes to run through the walls in the for loops diff --git a/src/libslic3r/Point.cpp b/src/libslic3r/Point.cpp index 09a7398ae7..38c813d098 100644 --- a/src/libslic3r/Point.cpp +++ b/src/libslic3r/Point.cpp @@ -59,65 +59,12 @@ Pointf3s transform(const Pointf3s& points, const Transform3d& t) void Point::rotate(double angle, const Point ¢er) { - double cur_x = (double)(*this)(0); - double cur_y = (double)(*this)(1); - double s = ::sin(angle); - double c = ::cos(angle); - double dx = cur_x - (double)center(0); - double dy = cur_y - (double)center(1); - (*this)(0) = (coord_t)round( (double)center(0) + c * dx - s * dy ); - (*this)(1) = (coord_t)round( (double)center(1) + c * dy + s * dx ); -} - -int Point::nearest_point_index(const Points &points) const -{ - PointConstPtrs p; - p.reserve(points.size()); - for (Points::const_iterator it = points.begin(); it != points.end(); ++it) - p.push_back(&*it); - return this->nearest_point_index(p); -} - -int Point::nearest_point_index(const PointConstPtrs &points) const -{ - int idx = -1; - double distance = -1; // double because long is limited to 2147483647 on some platforms and it's not enough - - for (PointConstPtrs::const_iterator it = points.begin(); it != points.end(); ++it) { - /* If the X distance of the candidate is > than the total distance of the - best previous candidate, we know we don't want it */ - double d = sqr((*this)(0) - (*it)->x()); - if (distance != -1 && d > distance) continue; - - /* If the Y distance of the candidate is > than the total distance of the - best previous candidate, we know we don't want it */ - d += sqr((*this)(1) - (*it)->y()); - if (distance != -1 && d > distance) continue; - - idx = it - points.begin(); - distance = d; - - if (distance < EPSILON) break; - } - - return idx; -} - -int Point::nearest_point_index(const PointPtrs &points) const -{ - PointConstPtrs p; - p.reserve(points.size()); - for (PointPtrs::const_iterator it = points.begin(); it != points.end(); ++it) - p.push_back(*it); - return this->nearest_point_index(p); -} - -bool Point::nearest_point(const Points &points, Point* point) const -{ - int idx = this->nearest_point_index(points); - if (idx == -1) return false; - *point = points.at(idx); - return true; + Vec2d cur = this->cast(); + double s = ::sin(angle); + double c = ::cos(angle); + auto d = cur - center.cast(); + this->x() = fast_round_up(center.x() + c * d.x() - s * d.y()); + this->y() = fast_round_up(center.y() + s * d.x() + c * d.y()); } /* Three points are a counter-clockwise turn if ccw > 0, clockwise if @@ -191,7 +138,7 @@ Point Point::projection_onto(const Line &line) const return ((line.a - *this).cast().squaredNorm() < (line.b - *this).cast().squaredNorm()) ? line.a : line.b; } -bool has_duplicate_points(std::vector &&pts) +bool has_duplicate_points(Points &&pts) { std::sort(pts.begin(), pts.end()); for (size_t i = 1; i < pts.size(); ++ i) @@ -200,6 +147,24 @@ bool has_duplicate_points(std::vector &&pts) return false; } +Points collect_duplicates(Points pts /* Copy */) +{ + std::sort(pts.begin(), pts.end()); + Points duplicits; + const Point *prev = &pts.front(); + for (size_t i = 1; i < pts.size(); ++i) { + const Point *act = &pts[i]; + if (*prev == *act) { + // duplicit point + if (!duplicits.empty() && duplicits.back() == *act) + continue; // only unique duplicits + duplicits.push_back(*act); + } + prev = act; + } + return duplicits; +} + template BoundingBox get_extents(const Points &pts) { @@ -231,6 +196,58 @@ BoundingBoxf get_extents(const std::vector &pts) return bbox; } + +int Point::nearest_point_index(const Points &points) const +{ + PointConstPtrs p; + p.reserve(points.size()); + for (Points::const_iterator it = points.begin(); it != points.end(); ++it) + p.push_back(&*it); + return this->nearest_point_index(p); +} + +int Point::nearest_point_index(const PointConstPtrs &points) const +{ + int idx = -1; + double distance = -1; // double because long is limited to 2147483647 on some platforms and it's not enough + + for (PointConstPtrs::const_iterator it = points.begin(); it != points.end(); ++it) { + /* If the X distance of the candidate is > than the total distance of the + best previous candidate, we know we don't want it */ + double d = sqr((*this)(0) - (*it)->x()); + if (distance != -1 && d > distance) continue; + + /* If the Y distance of the candidate is > than the total distance of the + best previous candidate, we know we don't want it */ + d += sqr((*this)(1) - (*it)->y()); + if (distance != -1 && d > distance) continue; + + idx = it - points.begin(); + distance = d; + + if (distance < EPSILON) break; + } + + return idx; +} + +int Point::nearest_point_index(const PointPtrs &points) const +{ + PointConstPtrs p; + p.reserve(points.size()); + for (PointPtrs::const_iterator it = points.begin(); it != points.end(); ++it) + p.push_back(*it); + return this->nearest_point_index(p); +} + +bool Point::nearest_point(const Points &points, Point* point) const +{ + int idx = this->nearest_point_index(points); + if (idx == -1) return false; + *point = points.at(idx); + return true; +} + std::ostream& operator<<(std::ostream &stm, const Vec2d &pointf) { return stm << pointf(0) << "," << pointf(1); diff --git a/src/libslic3r/Point.hpp b/src/libslic3r/Point.hpp index 8bb0a6a41e..b3498e308d 100644 --- a/src/libslic3r/Point.hpp +++ b/src/libslic3r/Point.hpp @@ -53,9 +53,9 @@ using Vec3i64 = Eigen::Matrix; // Vector types with a double coordinate base type. using Vec2f = Eigen::Matrix; using Vec3f = Eigen::Matrix; +using Vec4f = Eigen::Matrix; using Vec2d = Eigen::Matrix; using Vec3d = Eigen::Matrix; -using Vec4f = Eigen::Matrix; using Vec4d = Eigen::Matrix; using Points = std::vector; @@ -116,9 +116,8 @@ inline Eigen::Matrix perp(cons } // Angle from v1 to v2, returning double atan2(y, x) normalized to <-PI, PI>. -template -inline double angle(const Eigen::MatrixBase& v1, const Eigen::MatrixBase& v2) -{ +template +inline double angle(const Eigen::MatrixBase &v1, const Eigen::MatrixBase &v2) { static_assert(Derived::IsVectorAtCompileTime && int(Derived::SizeAtCompileTime) == 2, "angle(): first parameter is not a 2D vector"); static_assert(Derived2::IsVectorAtCompileTime && int(Derived2::SizeAtCompileTime) == 2, "angle(): second parameter is not a 2D vector"); auto v1d = v1.template cast(); @@ -153,6 +152,29 @@ inline std::string to_string(const Vec3d &pt) { return std::string("[") + floa std::vector transform(const std::vector& points, const Transform3f& t); Pointf3s transform(const Pointf3s& points, const Transform3d& t); +/// +/// Check whether transformation matrix contains odd number of mirroring. +/// NOTE: In code is sometime function named is_left_handed +/// +/// Transformation to check +/// Is positive determinant +inline bool has_reflection(const Transform3d &transform) { return transform.matrix().determinant() < 0; } + +/// +/// Getter on base of transformation matrix +/// +/// column index +/// source transformation +/// Base of transformation matrix +inline const Vec3d get_base(unsigned index, const Transform3d &transform) { return transform.linear().col(index); } +inline const Vec3d get_x_base(const Transform3d &transform) { return get_base(0, transform); } +inline const Vec3d get_y_base(const Transform3d &transform) { return get_base(1, transform); } +inline const Vec3d get_z_base(const Transform3d &transform) { return get_base(2, transform); } +inline const Vec3d get_base(unsigned index, const Transform3d::LinearPart &transform) { return transform.col(index); } +inline const Vec3d get_x_base(const Transform3d::LinearPart &transform) { return get_base(0, transform); } +inline const Vec3d get_y_base(const Transform3d::LinearPart &transform) { return get_base(1, transform); } +inline const Vec3d get_z_base(const Transform3d::LinearPart &transform) { return get_base(2, transform); } + template using Vec = Eigen::Matrix; class Point : public Vec2crd @@ -163,15 +185,16 @@ public: Point() : Vec2crd(0, 0) {} Point(int32_t x, int32_t y) : Vec2crd(coord_t(x), coord_t(y)) {} Point(int64_t x, int64_t y) : Vec2crd(coord_t(x), coord_t(y)) {} - Point(double x, double y) : Vec2crd(coord_t(lrint(x)), coord_t(lrint(y))) {} + Point(double x, double y) : Vec2crd(coord_t(std::round(x)), coord_t(std::round(y))) {} Point(const Point &rhs) { *this = rhs; } - explicit Point(const Vec2d& rhs) : Vec2crd(coord_t(lrint(rhs.x())), coord_t(lrint(rhs.y()))) {} + explicit Point(const Vec2d& rhs) : Vec2crd(coord_t(std::round(rhs.x())), coord_t(std::round(rhs.y()))) {} // This constructor allows you to construct Point from Eigen expressions + // This constructor has to be implicit (non-explicit) to allow implicit conversion from Eigen expressions. template Point(const Eigen::MatrixBase &other) : Vec2crd(other) {} static Point new_scale(coordf_t x, coordf_t y) { return Point(coord_t(scale_(x)), coord_t(scale_(y))); } - static Point new_scale(const Vec2d &v) { return Point(coord_t(scale_(v.x())), coord_t(scale_(v.y()))); } - static Point new_scale(const Vec2f &v) { return Point(coord_t(scale_(v.x())), coord_t(scale_(v.y()))); } + template + static Point new_scale(const Eigen::MatrixBase &v) { return Point(coord_t(scale_(v.x())), coord_t(scale_(v.y()))); } // This method allows you to assign Eigen expressions to MyVectorType template @@ -297,16 +320,16 @@ BoundingBoxf get_extents(const std::vector &pts); // Test for duplicate points in a vector of points. // The points are copied, sorted and checked for duplicates globally. -bool has_duplicate_points(std::vector &&pts); -inline bool has_duplicate_points(const std::vector &pts) +bool has_duplicate_points(Points &&pts); +inline bool has_duplicate_points(const Points &pts) { - std::vector cpy = pts; + Points cpy = pts; return has_duplicate_points(std::move(cpy)); } // Test for duplicate points in a vector of points. // Only successive points are checked for equality. -inline bool has_duplicate_successive_points(const std::vector &pts) +inline bool has_duplicate_successive_points(const Points &pts) { for (size_t i = 1; i < pts.size(); ++ i) if (pts[i - 1] == pts[i]) @@ -316,11 +339,14 @@ inline bool has_duplicate_successive_points(const std::vector &pts) // Test for duplicate points in a vector of points. // Only successive points are checked for equality. Additionally, first and last points are compared for equality. -inline bool has_duplicate_successive_points_closed(const std::vector &pts) +inline bool has_duplicate_successive_points_closed(const Points &pts) { return has_duplicate_successive_points(pts) || (pts.size() >= 2 && pts.front() == pts.back()); } +// Collect adjecent(duplicit points) +Points collect_duplicates(Points pts /* Copy */); + inline bool shorter_then(const Point& p0, const coord_t len) { if (p0.x() > len || p0.x() < -len) @@ -341,7 +367,7 @@ namespace int128 { // To be used by std::unordered_map, std::unordered_multimap and friends. struct PointHash { - size_t operator()(const Vec2crd &pt) const { + size_t operator()(const Vec2crd &pt) const noexcept { return coord_t((89 * 31 + int64_t(pt.x())) * 31 + pt.y()); } }; @@ -570,6 +596,27 @@ inline coord_t align_to_grid(coord_t coord, coord_t spacing, coord_t base) inline Point align_to_grid(Point coord, Point spacing, Point base) { return Point(align_to_grid(coord.x(), spacing.x(), base.x()), align_to_grid(coord.y(), spacing.y(), base.y())); } +// MinMaxLimits +template struct MinMax { T min; T max;}; +template +static bool apply(std::optional &val, const MinMax &limit) { + if (!val.has_value()) return false; + return apply(*val, limit); +} +template +static bool apply(T &val, const MinMax &limit) +{ + if (val > limit.max) { + val = limit.max; + return true; + } + if (val < limit.min) { + val = limit.min; + return true; + } + return false; +} + } // namespace Slic3r // start Boost diff --git a/src/libslic3r/Polygon.cpp b/src/libslic3r/Polygon.cpp index 18a20586a4..697def1f5b 100644 --- a/src/libslic3r/Polygon.cpp +++ b/src/libslic3r/Polygon.cpp @@ -1,3 +1,14 @@ +///|/ Copyright (c) Prusa Research 2016 - 2023 Vojtěch Bubník @bubnikv, Filip Sykala @Jony01, Lukáš Matěna @lukasmatena, Tomáš Mészáros @tamasmeszaros, Enrico Turri @enricoturri1966 +///|/ Copyright (c) Slic3r 2013 - 2015 Alessandro Ranellucci @alranel +///|/ Copyright (c) 2014 Petr Ledvina @ledvinap +///|/ +///|/ ported from lib/Slic3r/Polygon.pm: +///|/ Copyright (c) Prusa Research 2017 - 2022 Vojtěch Bubník @bubnikv +///|/ Copyright (c) Slic3r 2011 - 2014 Alessandro Ranellucci @alranel +///|/ Copyright (c) 2012 Mark Hindess +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ #include "BoundingBox.hpp" #include "ClipperUtils.hpp" #include "Exception.hpp" @@ -454,6 +465,38 @@ bool has_duplicate_points(const Polygons &polys) #endif } +bool remove_same_neighbor(Polygon &polygon) +{ + Points &points = polygon.points; + if (points.empty()) + return false; + auto last = std::unique(points.begin(), points.end()); + + // remove first and last neighbor duplication + if (const Point &last_point = *(last - 1); last_point == points.front()) { + --last; + } + + // no duplicits + if (last == points.end()) + return false; + + points.erase(last, points.end()); + return true; +} + +bool remove_same_neighbor(Polygons &polygons) +{ + if (polygons.empty()) + return false; + bool exist = false; + for (Polygon &polygon : polygons) + exist |= remove_same_neighbor(polygon); + // remove empty polygons + polygons.erase(std::remove_if(polygons.begin(), polygons.end(), [](const Polygon &p) { return p.points.size() <= 2; }), polygons.end()); + return exist; +} + static inline bool is_stick(const Point &p1, const Point &p2, const Point &p3) { Point v1 = p2 - p1; diff --git a/src/libslic3r/Polygon.hpp b/src/libslic3r/Polygon.hpp index d09d7bae7c..848e37c0ad 100644 --- a/src/libslic3r/Polygon.hpp +++ b/src/libslic3r/Polygon.hpp @@ -1,3 +1,13 @@ +///|/ Copyright (c) Prusa Research 2016 - 2023 Tomáš Mészáros @tamasmeszaros, Vojtěch Bubník @bubnikv, Lukáš Matěna @lukasmatena, Lukáš Hejl @hejllukas, Filip Sykala @Jony01, Oleksandra Iushchenko @YuSanka +///|/ Copyright (c) Slic3r 2013 - 2016 Alessandro Ranellucci @alranel +///|/ +///|/ ported from lib/Slic3r/Polygon.pm: +///|/ Copyright (c) Prusa Research 2017 - 2022 Vojtěch Bubník @bubnikv +///|/ Copyright (c) Slic3r 2011 - 2014 Alessandro Ranellucci @alranel +///|/ Copyright (c) 2012 Mark Hindess +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ #ifndef slic3r_Polygon_hpp_ #define slic3r_Polygon_hpp_ @@ -5,6 +15,7 @@ #include #include #include "Line.hpp" +#include "Point.hpp" #include "MultiPoint.hpp" #include "Polyline.hpp" @@ -112,6 +123,10 @@ inline bool has_duplicate_points(Polygon &&poly) { return has_duplicate_poi inline bool has_duplicate_points(const Polygon &poly) { return has_duplicate_points(poly.points); } bool has_duplicate_points(const Polygons &polys); +// Return True when erase some otherwise False. +bool remove_same_neighbor(Polygon &polygon); +bool remove_same_neighbor(Polygons &polygons); + inline double total_length(const Polygons &polylines) { double total = 0; for (Polygons::const_iterator it = polylines.begin(); it != polylines.end(); ++it) @@ -245,7 +260,19 @@ inline Polylines to_polylines(Polygons &&polys) return polylines; } -inline Polygons to_polygons(const std::vector &paths) +// close polyline to polygon (connect first and last point in polyline) +inline Polygons to_polygons(const Polylines &polylines) +{ + Polygons out; + out.reserve(polylines.size()); + for (const Polyline &polyline : polylines) { + if (polyline.size()) + out.emplace_back(polyline.points); + } + return out; +} + +inline Polygons to_polygons(const VecOfPoints &paths) { Polygons out; out.reserve(paths.size()); @@ -254,7 +281,7 @@ inline Polygons to_polygons(const std::vector &paths) return out; } -inline Polygons to_polygons(std::vector &&paths) +inline Polygons to_polygons(VecOfPoints &&paths) { Polygons out; out.reserve(paths.size()); @@ -270,6 +297,21 @@ bool polygons_match(const Polygon &l, const Polygon &r); Polygon make_circle(double radius, double error); Polygon make_circle_num_segments(double radius, size_t num_segments); +/// +/// Define point laying on polygon +/// keep index of polygon line and point coordinate +/// +struct PolygonPoint +{ + // index of line inside of polygon + // 0 .. from point polygon[0] to polygon[1] + size_t index; + + // Point, which lay on line defined by index + Point point; +}; +using PolygonPoints = std::vector; + bool overlaps(const Polygons& polys1, const Polygons& polys2); } // Slic3r diff --git a/src/libslic3r/Polyline.cpp b/src/libslic3r/Polyline.cpp index a9bf48f508..2e867b0df5 100644 --- a/src/libslic3r/Polyline.cpp +++ b/src/libslic3r/Polyline.cpp @@ -497,6 +497,33 @@ BoundingBox get_extents(const Polylines &polylines) return bb; } +// Return True when erase some otherwise False. +bool remove_same_neighbor(Polyline &polyline) { + Points &points = polyline.points; + if (points.empty()) + return false; + auto last = std::unique(points.begin(), points.end()); + + // no duplicits + if (last == points.end()) + return false; + + points.erase(last, points.end()); + return true; +} + +bool remove_same_neighbor(Polylines &polylines){ + if (polylines.empty()) + return false; + bool exist = false; + for (Polyline &polyline : polylines) + exist |= remove_same_neighbor(polyline); + // remove empty polylines + polylines.erase(std::remove_if(polylines.begin(), polylines.end(), [](const Polyline &p) { return p.points.size() <= 1; }), polylines.end()); + return exist; +} + + const Point& leftmost_point(const Polylines &polylines) { if (polylines.empty()) diff --git a/src/libslic3r/Polyline.hpp b/src/libslic3r/Polyline.hpp index 8879988bd1..580e463d15 100644 --- a/src/libslic3r/Polyline.hpp +++ b/src/libslic3r/Polyline.hpp @@ -164,6 +164,10 @@ public: extern BoundingBox get_extents(const Polyline &polyline); extern BoundingBox get_extents(const Polylines &polylines); +// Return True when erase some otherwise False. +bool remove_same_neighbor(Polyline &polyline); +bool remove_same_neighbor(Polylines &polylines); + inline double total_length(const Polylines &polylines) { double total = 0; for (const Polyline &pl : polylines) diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 6e8f86e16d..3f18aa8443 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -766,7 +766,7 @@ bool Preset::has_cali_lines(PresetBundle* preset_bundle) } static std::vector s_Preset_print_options { - "layer_height", "initial_layer_print_height", "wall_loops", "slice_closing_radius", "spiral_mode", "slicing_mode", + "layer_height", "initial_layer_print_height", "wall_loops", "slice_closing_radius", "spiral_mode", "spiral_mode_smooth", "spiral_mode_max_xy_smoothing", "slicing_mode", "top_shell_layers", "top_shell_thickness", "bottom_shell_layers", "bottom_shell_thickness", "extra_perimeters_on_overhangs", "ensure_vertical_shell_thickness", "reduce_crossing_wall", "detect_thin_wall", "detect_overhang_wall", "overhang_reverse", "overhang_reverse_threshold","overhang_reverse_internal_only", "seam_position", "staggered_inner_seams", "wall_sequence", "is_infill_first", "sparse_infill_density", "sparse_infill_pattern", "top_surface_pattern", "bottom_surface_pattern", @@ -786,7 +786,7 @@ static std::vector s_Preset_print_options { "independent_support_layer_height", "support_angle", "support_interface_top_layers", "support_interface_bottom_layers", "support_interface_pattern", "support_interface_spacing", "support_interface_loop_pattern", - "support_top_z_distance", "support_on_build_plate_only","support_critical_regions_only", "bridge_no_support", "thick_bridges", "max_bridge_length", "print_sequence", "support_remove_small_overhang", + "support_top_z_distance", "support_on_build_plate_only","support_critical_regions_only", "bridge_no_support", "thick_bridges", "thick_internal_bridges", "max_bridge_length", "print_sequence", "support_remove_small_overhang", "filename_format", "wall_filament", "support_bottom_z_distance", "sparse_infill_filament", "solid_infill_filament", "support_filament", "support_interface_filament","support_interface_not_for_body", "ooze_prevention", "standby_temperature_delta", "interface_shells", "line_width", "initial_layer_line_width", @@ -868,7 +868,7 @@ static std::vector s_Preset_printer_options { // BBS "scan_first_layer", "machine_load_filament_time", "machine_unload_filament_time","time_cost", "machine_pause_gcode", "template_custom_gcode", "nozzle_type", "nozzle_hrc","auxiliary_fan", "nozzle_volume","upward_compatible_machine", "z_hop_types", "retract_lift_enforce","support_chamber_temp_control","support_air_filtration","printer_structure", - "best_object_pos", + "best_object_pos","head_wrap_detect_zone", //SoftFever "host_type", "print_host", "printhost_apikey", "print_host_webui", @@ -877,7 +877,8 @@ static std::vector s_Preset_printer_options { "use_firmware_retraction", "use_relative_e_distances", "printer_notes", "cooling_tube_retraction", "cooling_tube_length", "high_current_on_filament_swap", "parking_pos_retraction", "extra_loading_move", "purge_in_prime_tower", "enable_filament_ramming", - "z_offset" + "z_offset", + "disable_m73", "preferred_orientation" }; static std::vector s_Preset_sla_print_options { @@ -1287,6 +1288,7 @@ int PresetCollection::get_differed_values_to_update(Preset& preset, std::mapfilament_presets.size(); if (n > old_filament_count && old_filament_count != 0) - filament_presets.resize(n, filament_presets.front()); + filament_presets.resize(n, filament_presets.back()); else { filament_presets.resize(n); } diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 4510890c3c..25c4619480 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -206,8 +206,8 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n "during_print_exhaust_fan_speed", "complete_print_exhaust_fan_speed", "activate_chamber_temp_control", - "manual_filament_change" - + "manual_filament_change", + "disable_m73", }; static std::unordered_set steps_ignore; diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index 440d72e05e..231761f957 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -204,6 +204,8 @@ struct PrintInstance // // instance id size_t id; + // Orca: unique id used by marlin/rrf cancel object feature + size_t unique_id; //BBS: instance_shift is too large because of multi-plate, apply without plate offset. Point shift_without_plate_offset() const; diff --git a/src/libslic3r/PrintApply.cpp b/src/libslic3r/PrintApply.cpp index 9804dd45c3..6664b28a3e 100644 --- a/src/libslic3r/PrintApply.cpp +++ b/src/libslic3r/PrintApply.cpp @@ -839,7 +839,7 @@ void update_volume_bboxes( layer_range.volumes.emplace_back(*it); } else layer_range.volumes.push_back({ model_volume->id(), - transformed_its_bbox2d(model_volume->mesh().its, trafo_for_bbox(object_trafo, model_volume->get_matrix(false)), offset) }); + transformed_its_bbox2d(model_volume->mesh().its, trafo_for_bbox(object_trafo, model_volume->get_matrix()), offset) }); } } else { std::vector> volumes_old; @@ -871,7 +871,7 @@ void update_volume_bboxes( layer_range.volumes.emplace_back(*it); } } else { - transformed_its_bboxes_in_z_ranges(model_volume->mesh().its, trafo_for_bbox(object_trafo, model_volume->get_matrix(false)), ranges, bboxes, offset); + transformed_its_bboxes_in_z_ranges(model_volume->mesh().its, trafo_for_bbox(object_trafo, model_volume->get_matrix()), ranges, bboxes, offset); for (PrintObjectRegions::LayerRangeRegions &layer_range : layer_ranges) if (auto &bbox = bboxes[&layer_range - layer_ranges.data()]; bbox.second) layer_range.volumes.push_back({ model_volume->id(), bbox.first }); diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index bc6321771a..f31620f17e 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -368,7 +368,8 @@ static const t_config_enum_values s_keys_map_GCodeThumbnailsFormat = { { "PNG", int(GCodeThumbnailsFormat::PNG) }, { "JPG", int(GCodeThumbnailsFormat::JPG) }, { "QOI", int(GCodeThumbnailsFormat::QOI) }, - { "BTT_TFT", int(GCodeThumbnailsFormat::BTT_TFT) } + { "BTT_TFT", int(GCodeThumbnailsFormat::BTT_TFT) }, + { "ColPic", int(GCodeThumbnailsFormat::ColPic) } }; CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(GCodeThumbnailsFormat) @@ -467,6 +468,15 @@ void PrintConfigDef::init_common_params() def->mode = comSimple; def->set_default_value(new ConfigOptionFloat(100.0)); + def = this->add("preferred_orientation", coFloat); + def->label = L("Preferred orientation"); + def->tooltip = L("Automatically orient stls on the Z-axis upon initial import"); + def->sidetext = L("°"); + def->max = 360; + def->min = -360; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionFloat(0.0)); + // Options used by physical printers def = this->add("preset_names", coStrings); @@ -796,7 +806,7 @@ void PrintConfigDef::init_fff_params() def->set_default_value(new ConfigOptionPercent(100)); def = this->add("bridge_flow", coFloat); - def->label = L("Bridge flow"); + def->label = L("Bridge flow ratio"); def->category = L("Quality"); def->tooltip = L("Decrease this value slightly(for example 0.9) to reduce the amount of material for bridge, " "to improve sag"); @@ -806,7 +816,7 @@ void PrintConfigDef::init_fff_params() def->set_default_value(new ConfigOptionFloat(1)); def = this->add("internal_bridge_flow", coFloat); - def->label = L("Internal bridge flow"); + def->label = L("Internal bridge flow ratio"); def->category = L("Quality"); def->tooltip = L("This value governs the thickness of the internal bridge layer. This is the first layer over sparse infill. Decrease this value slightly (for example 0.9) to improve surface quality over sparse infill."); def->min = 0; @@ -1202,6 +1212,15 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvanced; def->set_default_value(new ConfigOptionBool(false)); + def = this->add("thick_internal_bridges", coBool); + def->label = L("Thick internal bridges"); + def->category = L("Quality"); + def->tooltip = L("If enabled, thick internal bridges will be used. It's usually recommended to have this feature turned on. However, " + "consider turning it off if you are using large nozzles."); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionBool(true)); + + def = this->add("max_bridge_length", coFloat); def->label = L("Max bridge length"); def->category = L("Support"); @@ -1281,7 +1300,7 @@ void PrintConfigDef::init_fff_params() def = this->add("internal_solid_infill_pattern", coEnum); def->label = L("Internal solid infill pattern"); def->category = L("Strength"); - def->tooltip = L("Line pattern of internal solid infill. if the detect nattow internal solid infill be enabled, the concentric pattern will be used for the small area."); + def->tooltip = L("Line pattern of internal solid infill. if the detect narrow internal solid infill be enabled, the concentric pattern will be used for the small area."); def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); def->enum_values = def_top_fill_pattern->enum_values; def->enum_labels = def_top_fill_pattern->enum_labels; @@ -1331,22 +1350,22 @@ void PrintConfigDef::init_fff_params() def->set_default_value(new ConfigOptionFloat(0)); def = this->add("wall_sequence", coEnum); - def->label = L("Order of walls"); + def->label = L("Walls printing order"); def->category = L("Quality"); - def->tooltip = L("Print sequence of inner wall and outer wall. "); + def->tooltip = L("Print sequence of the internal (inner) and external (outer) walls. \n\nUse Inner/Outer for best overhangs. This is because the overhanging walls can adhere to a neighouring perimeter while printing. However, this option results in slightly reduced surface quality as the external perimeter is deformed by being squashed to the internal perimeter.\n\nUse Inner/Outer/Inner for the best external surface finish and dimensional accuracy as the external wall is printed undisturbed from an internal perimeter. However, overhang performance will reduce as there is no internal perimeter to print the external wall against. This option requires a minimum of 3 walls to be effective as it prints the internal walls from the 3rd perimeter onwards first, then the external perimeter and, finally, the first internal perimeter. This option is recomended against the Outer/Inner option in most cases. \n\nUse Outer/Inner for the same external wall quality and dimensional accuracy benefits of Inner/Outer/Inner option. However, the z seams will appear less consistent as the first extrusion of a new layer starts on a visible surface.\n\n "); def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); def->enum_values.push_back("inner wall/outer wall"); def->enum_values.push_back("outer wall/inner wall"); def->enum_values.push_back("inner-outer-inner wall"); - def->enum_labels.push_back(L("inner/outer")); - def->enum_labels.push_back(L("outer/inner")); - def->enum_labels.push_back(L("inner wall/outer wall/inner wall")); + def->enum_labels.push_back(L("Inner/Outer")); + def->enum_labels.push_back(L("Outer/Inner")); + def->enum_labels.push_back(L("Inner/Outer/Inner")); def->mode = comAdvanced; def->set_default_value(new ConfigOptionEnum(WallSequence::InnerOuter)); def = this->add("is_infill_first",coBool); def->label = L("Print infill first"); - def->tooltip = L("Order of wall/infill. false means print wall first. "); + def->tooltip = L("Order of wall/infill. When the tickbox is unchecked the walls are printed first, which works best in most cases.\n\nPrinting walls first may help with extreme overhangs as the walls have the neighbouring infill to adhere to. However, the infill will slighly push out the printed walls where it is attached to them, resulting in a worse external surface finish. It can also cause the infill to shine through the external surfaces of the part."); def->category = L("Quality"); def->mode = comAdvanced; def->set_default_value(new ConfigOptionBool{false}); @@ -2692,7 +2711,7 @@ def = this->add("filament_loading_speed", coFloats); def->mode = comAdvanced; def->set_default_value(new ConfigOptionFloats{ 0., 0. }); - def = this->add("fan_max_speed", coInts); + def = this->add("fan_max_speed", coFloats); def->label = L("Fan speed"); def->tooltip = L("Part cooling fan speed may be increased when auto cooling is enabled. " "This is the maximum speed limitation of part cooling fan"); @@ -2700,7 +2719,7 @@ def = this->add("filament_loading_speed", coFloats); def->min = 0; def->max = 100; def->mode = comSimple; - def->set_default_value(new ConfigOptionInts { 100 }); + def->set_default_value(new ConfigOptionFloats { 100 }); def = this->add("max_layer_height", coFloats); def->label = L("Max"); @@ -2743,14 +2762,14 @@ def = this->add("filament_loading_speed", coFloats); def->mode = comAdvanced; def->set_default_value(new ConfigOptionInt(3)); - def = this->add("fan_min_speed", coInts); + def = this->add("fan_min_speed", coFloats); def->label = L("Fan speed"); def->tooltip = L("Minimum speed for part cooling fan"); def->sidetext = L("%"); def->min = 0; def->max = 100; def->mode = comSimple; - def->set_default_value(new ConfigOptionInts { 20 }); + def->set_default_value(new ConfigOptionFloats { 20 }); def = this->add("additional_cooling_fan_speed", coInts); def->label = L("Fan speed"); @@ -2905,14 +2924,14 @@ def = this->add("filament_loading_speed", coFloats); def->set_default_value(new ConfigOptionString("{input_filename_base}_{filament_type[initial_tool]}_{print_time}.gcode")); def = this->add("make_overhang_printable", coBool); - def->label = L("Make overhang printable"); + def->label = L("Make overhangs printable"); def->category = L("Quality"); def->tooltip = L("Modify the geometry to print overhangs without support material."); def->mode = comAdvanced; def->set_default_value(new ConfigOptionBool(false)); def = this->add("make_overhang_printable_angle", coFloat); - def->label = L("Make overhang printable maximum angle"); + def->label = L("Make overhangs printable - Maximum angle"); def->category = L("Quality"); def->tooltip = L("Maximum angle of overhangs to allow after making more steep overhangs printable." "90° will not change the model at all and allow any overhang, while 0 will " @@ -2924,7 +2943,7 @@ def = this->add("filament_loading_speed", coFloats); def->set_default_value(new ConfigOptionFloat(55.)); def = this->add("make_overhang_printable_hole_size", coFloat); - def->label = L("Make overhang printable hole area"); + def->label = L("Make overhangs printable - Hole area"); def->category = L("Quality"); def->tooltip = L("Maximum area of a hole in the base of the model before it's filled by conical material." "A value of 0 will fill all the holes in the model base."); @@ -3244,6 +3263,12 @@ def = this->add("filament_loading_speed", coFloats); def->mode = comAdvanced; def->set_default_value(new ConfigOptionBool(true)); + def = this->add("disable_m73", coBool); + def->label = L("Disable set remaining print time"); + def->tooltip = "Disable generating of the M73: Set remaining print time in the final gcode"; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionBool(false)); + def = this->add("seam_position", coEnum); def->label = L("Seam position"); def->category = L("Quality"); @@ -3411,6 +3436,25 @@ def = this->add("filament_loading_speed", coFloats); def->mode = comSimple; def->set_default_value(new ConfigOptionBool(false)); + def = this->add("spiral_mode_smooth", coBool); + def->label = L("Smooth Spiral"); + def->tooltip = L("Smooth Spiral smoothes out X and Y moves as well" + "resulting in no visible seam at all, even in the XY directions on walls that are not vertical"); + def->mode = comSimple; + def->set_default_value(new ConfigOptionBool(false)); + + def = this->add("spiral_mode_max_xy_smoothing", coFloatOrPercent); + def->label = L("Max XY Smoothing"); + def->tooltip = L("Maximum distance to move points in XY to try to achieve a smooth spiral" + "If expressed as a %, it will be computed over nozzle diameter"); + def->sidetext = L("mm or %"); + def->ratio_over = "nozzle_diameter"; + def->min = 0; + def->max = 1000; + def->max_literal = 10; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionFloatOrPercent(200, true)); + def = this->add("timelapse_type", coEnum); def->label = L("Timelapse"); def->tooltip = L("If smooth or traditional mode is selected, a timelapse video will be generated for each print. " @@ -3654,9 +3698,9 @@ def = this->add("filament_loading_speed", coFloats); def->set_default_value(new ConfigOptionInt(0)); def = this->add("support_interface_not_for_body",coBool); - def->label = L("Reduce interface filament for base"); + def->label = L("Avoid interface filament for base"); def->category = L("Support"); - def->tooltip = L("Avoid using support interface filament to print support base"); + def->tooltip = L("Avoid using support interface filament to print support base if possible."); def->mode = comSimple; def->set_default_value(new ConfigOptionBool(true)); @@ -4062,6 +4106,10 @@ def = this->add("filament_loading_speed", coFloats); def->max = max_temp; def->set_default_value(new ConfigOptionInts { 240 }); + def = this->add("head_wrap_detect_zone", coPoints); + def->label ="Head wrap detect zone"; //do not need translation + def->mode = comDevelop; + def->set_default_value(new ConfigOptionPoints{}); def = this->add("detect_thin_wall", coBool); def->label = L("Detect thin wall"); @@ -4158,7 +4206,7 @@ def = this->add("filament_loading_speed", coFloats); def = this->add("wipe_distance", coFloats); def->label = L("Wipe Distance"); - def->tooltip = L("Discribe how long the nozzle will move along the last path when retracting"); + def->tooltip = L("Discribe how long the nozzle will move along the last path when retracting. \n\nDepending on how long the wipe operation lasts, how fast and long the extruder/filament retraction settings are, a retraction move may be needed to retract the remaining filament. \n\nSetting a value in the retract amount before wipe setting below will perform any excess retraction before the wipe, else it will be performed after."); def->sidetext = L("mm"); def->min = 0; def->mode = comAdvanced; @@ -4375,7 +4423,13 @@ def = this->add("filament_loading_speed", coFloats); def->enum_values.push_back("PNG"); def->enum_values.push_back("JPG"); def->enum_values.push_back("QOI"); - def->enum_values.push_back("BTT TFT"); + def->enum_values.push_back("BTT_TFT"); + def->enum_values.push_back("ColPic"); + def->enum_labels.push_back("PNG"); + def->enum_labels.push_back("JPG"); + def->enum_labels.push_back("QOI"); + def->enum_labels.push_back("BTT TT"); + def->enum_labels.push_back("ColPic"); def->set_default_value(new ConfigOptionEnum(GCodeThumbnailsFormat::PNG)); def = this->add("use_relative_e_distances", coBool); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index b9f877ac50..8738d13247 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -272,7 +272,7 @@ enum RetractLiftEnforceType { }; enum class GCodeThumbnailsFormat { - PNG, JPG, QOI, BTT_TFT + PNG, JPG, QOI, BTT_TFT, ColPic }; static std::string bed_type_to_gcode_string(const BedType type) @@ -741,7 +741,9 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionEnum, support_style)) // BBS //((ConfigOptionBool, independent_support_layer_height)) + // Orca internal thick bridge ((ConfigOptionBool, thick_bridges)) + ((ConfigOptionBool, thick_internal_bridges)) // Overhang angle threshold. ((ConfigOptionInt, support_threshold_angle)) ((ConfigOptionFloat, support_object_xy_distance)) @@ -1014,6 +1016,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionPercent, accel_to_decel_factor)) ((ConfigOptionFloatOrPercent, initial_layer_travel_speed)) ((ConfigOptionBool, bbl_calib_mark_logo)) + ((ConfigOptionBool, disable_m73)) // Orca: mmu ((ConfigOptionFloat, cooling_tube_retraction)) @@ -1056,6 +1059,7 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionPoints, printable_area)) //BBS: add bed_exclude_area ((ConfigOptionPoints, bed_exclude_area)) + ((ConfigOptionPoints, head_wrap_detect_zone)) // BBS ((ConfigOptionString, bed_custom_texture)) ((ConfigOptionString, bed_custom_model)) @@ -1095,9 +1099,9 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionFloat, initial_layer_infill_speed)) ((ConfigOptionInts, nozzle_temperature_initial_layer)) ((ConfigOptionInts, full_fan_speed_layer)) - ((ConfigOptionInts, fan_max_speed)) + ((ConfigOptionFloats, fan_max_speed)) ((ConfigOptionFloats, max_layer_height)) - ((ConfigOptionInts, fan_min_speed)) + ((ConfigOptionFloats, fan_min_speed)) ((ConfigOptionFloats, min_layer_height)) ((ConfigOptionFloat, printable_height)) ((ConfigOptionPoint, best_object_pos)) @@ -1117,6 +1121,8 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionFloat, skirt_speed)) ((ConfigOptionFloats, slow_down_layer_time)) ((ConfigOptionBool, spiral_mode)) + ((ConfigOptionBool, spiral_mode_smooth)) + ((ConfigOptionFloatOrPercent, spiral_mode_max_xy_smoothing)) ((ConfigOptionInt, standby_temperature_delta)) ((ConfigOptionInts, nozzle_temperature)) ((ConfigOptionBools, wipe)) @@ -1170,7 +1176,8 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionBools, activate_chamber_temp_control)) ((ConfigOptionInts , chamber_temperature)) ((ConfigOptionBool, is_infill_first)) - + + ((ConfigOptionFloat, preferred_orientation)) ) diff --git a/src/libslic3r/SLA/AGGRaster.hpp b/src/libslic3r/SLA/AGGRaster.hpp index 2243a3c1b5..8d86962fcc 100644 --- a/src/libslic3r/SLA/AGGRaster.hpp +++ b/src/libslic3r/SLA/AGGRaster.hpp @@ -1,9 +1,12 @@ +///|/ Copyright (c) Prusa Research 2020 - 2022 Tomáš Mészáros @tamasmeszaros, Vojtěch Bubník @bubnikv +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ #ifndef AGGRASTER_HPP #define AGGRASTER_HPP #include #include "libslic3r/ExPolygon.hpp" -#include "libslic3r/MTUtils.hpp" // For rasterizing #include @@ -42,7 +45,7 @@ public: using TValue = typename TColor::value_type; using TPixel = typename PixelRenderer::pixel_type; using TRawBuffer = agg::rendering_buffer; - + protected: Resolution m_resolution; @@ -154,8 +157,8 @@ public: } Trafo trafo() const override { return m_trafo; } - Resolution resolution() const override { return m_resolution; } - PixelDim pixel_dimensions() const override + Resolution resolution() const { return m_resolution; } + PixelDim pixel_dimensions() const { return {SCALING_FACTOR / m_pxdim_scaled.w_mm, SCALING_FACTOR / m_pxdim_scaled.h_mm}; @@ -187,11 +190,15 @@ class RasterGrayscaleAA : public _RasterGrayscaleAA { using typename Base::TValue; public: template - RasterGrayscaleAA(const RasterBase::Resolution &res, - const RasterBase::PixelDim & pd, - const RasterBase::Trafo & trafo, - GammaFn && fn) - : Base(res, pd, trafo, Colors::White, Colors::Black, + RasterGrayscaleAA(const Resolution &res, + const PixelDim &pd, + const RasterBase::Trafo &trafo, + GammaFn &&fn) + : Base(res, + pd, + trafo, + Colors::White, + Colors::Black, std::forward(fn)) {} @@ -209,10 +216,10 @@ public: class RasterGrayscaleAAGammaPower: public RasterGrayscaleAA { public: - RasterGrayscaleAAGammaPower(const RasterBase::Resolution &res, - const RasterBase::PixelDim & pd, - const RasterBase::Trafo & trafo, - double gamma = 1.) + RasterGrayscaleAAGammaPower(const Resolution &res, + const PixelDim &pd, + const RasterBase::Trafo &trafo, + double gamma = 1.) : RasterGrayscaleAA(res, pd, trafo, agg::gamma_power(gamma)) {} }; diff --git a/src/libslic3r/SLA/RasterBase.cpp b/src/libslic3r/SLA/RasterBase.cpp index 581e84880b..9f599e0486 100644 --- a/src/libslic3r/SLA/RasterBase.cpp +++ b/src/libslic3r/SLA/RasterBase.cpp @@ -1,3 +1,8 @@ +///|/ Copyright (c) Prusa Research 2020 - 2022 Tomáš Mészáros @tamasmeszaros +///|/ Copyright (c) 2022 ole00 @ole00 +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ #ifndef SLARASTER_CPP #define SLARASTER_CPP @@ -11,11 +16,6 @@ namespace Slic3r { namespace sla { -const RasterBase::TMirroring RasterBase::NoMirror = {false, false}; -const RasterBase::TMirroring RasterBase::MirrorX = {true, false}; -const RasterBase::TMirroring RasterBase::MirrorY = {false, true}; -const RasterBase::TMirroring RasterBase::MirrorXY = {true, true}; - EncodedRaster PNGRasterEncoder::operator()(const void *ptr, size_t w, size_t h, size_t num_components) { @@ -68,15 +68,17 @@ EncodedRaster PPMRasterEncoder::operator()(const void *ptr, size_t w, size_t h, } std::unique_ptr create_raster_grayscale_aa( - const RasterBase::Resolution &res, - const RasterBase::PixelDim & pxdim, - double gamma, - const RasterBase::Trafo & tr) + const Resolution &res, + const PixelDim &pxdim, + double gamma, + const RasterBase::Trafo &tr) { std::unique_ptr rst; if (gamma > 0) rst = std::make_unique(res, pxdim, tr, gamma); + else if (std::abs(gamma - 1.) < 1e-6) + rst = std::make_unique(res, pxdim, tr, agg::gamma_none()); else rst = std::make_unique(res, pxdim, tr, agg::gamma_threshold(.5)); diff --git a/src/libslic3r/SLA/RasterBase.hpp b/src/libslic3r/SLA/RasterBase.hpp index 1eba360e31..5f2826aec4 100644 --- a/src/libslic3r/SLA/RasterBase.hpp +++ b/src/libslic3r/SLA/RasterBase.hpp @@ -1,3 +1,8 @@ +///|/ Copyright (c) Prusa Research 2020 - 2022 Tomáš Mészáros @tamasmeszaros, Vojtěch Bubník @bubnikv +///|/ Copyright (c) 2022 ole00 @ole00 +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ #ifndef SLA_RASTERBASE_HPP #define SLA_RASTERBASE_HPP @@ -9,7 +14,6 @@ #include #include -#include namespace Slic3r { @@ -31,6 +35,27 @@ public: const char * extension() const { return m_ext.c_str(); } }; +/// Type that represents a resolution in pixels. +struct Resolution { + size_t width_px = 0; + size_t height_px = 0; + + Resolution() = default; + Resolution(size_t w, size_t h) : width_px(w), height_px(h) {} + size_t pixels() const { return width_px * height_px; } +}; + +/// Types that represents the dimension of a pixel in millimeters. +struct PixelDim { + double w_mm = 1.; + double h_mm = 1.; + + PixelDim() = default; + PixelDim(double px_width_mm, double px_height_mm) + : w_mm(px_width_mm), h_mm(px_height_mm) + {} +}; + using RasterEncoder = std::function; @@ -40,10 +65,10 @@ public: enum Orientation { roLandscape, roPortrait }; using TMirroring = std::array; - static const TMirroring NoMirror; - static const TMirroring MirrorX; - static const TMirroring MirrorY; - static const TMirroring MirrorXY; + static const constexpr TMirroring NoMirror = {false, false}; + static const constexpr TMirroring MirrorX = {true, false}; + static const constexpr TMirroring MirrorY = {false, true}; + static const constexpr TMirroring MirrorXY = {true, true}; struct Trafo { bool mirror_x = false, mirror_y = false, flipXY = false; @@ -63,35 +88,14 @@ public: Point get_center() const { return {center_x, center_y}; } }; - /// Type that represents a resolution in pixels. - struct Resolution { - size_t width_px = 0; - size_t height_px = 0; - - Resolution() = default; - Resolution(size_t w, size_t h) : width_px(w), height_px(h) {} - size_t pixels() const { return width_px * height_px; } - }; - - /// Types that represents the dimension of a pixel in millimeters. - struct PixelDim { - double w_mm = 1.; - double h_mm = 1.; - - PixelDim() = default; - PixelDim(double px_width_mm, double px_height_mm) - : w_mm(px_width_mm), h_mm(px_height_mm) - {} - }; - virtual ~RasterBase() = default; /// Draw a polygon with holes. virtual void draw(const ExPolygon& poly) = 0; /// Get the resolution of the raster. - virtual Resolution resolution() const = 0; - virtual PixelDim pixel_dimensions() const = 0; +// virtual Resolution resolution() const = 0; +// virtual PixelDim pixel_dimensions() const = 0; virtual Trafo trafo() const = 0; virtual EncodedRaster encode(RasterEncoder encoder) const = 0; @@ -109,10 +113,10 @@ std::ostream& operator<<(std::ostream &stream, const EncodedRaster &bytes); // If gamma is zero, thresholding will be performed which disables AA. std::unique_ptr create_raster_grayscale_aa( - const RasterBase::Resolution &res, - const RasterBase::PixelDim & pxdim, - double gamma = 1.0, - const RasterBase::Trafo & tr = {}); + const Resolution &res, + const PixelDim &pxdim, + double gamma = 1.0, + const RasterBase::Trafo &tr = {}); }} // namespace Slic3r::sla diff --git a/src/libslic3r/SLAPrint.hpp b/src/libslic3r/SLAPrint.hpp index 3fa6757d59..887942c9cf 100644 --- a/src/libslic3r/SLAPrint.hpp +++ b/src/libslic3r/SLAPrint.hpp @@ -6,6 +6,7 @@ #include "PrintBase.hpp" #include "SLA/RasterBase.hpp" #include "SLA/SupportTree.hpp" +#include "Execution/ExecutionTBB.hpp" #include "Point.hpp" #include "MTUtils.hpp" #include "Zipper.hpp" diff --git a/src/libslic3r/SVG.cpp b/src/libslic3r/SVG.cpp index c951380f63..6377f405ed 100644 --- a/src/libslic3r/SVG.cpp +++ b/src/libslic3r/SVG.cpp @@ -5,8 +5,25 @@ namespace Slic3r { +void create_dir(const std::string& filePath) +{ + boost::filesystem::path path(filePath); + boost::filesystem::path dir = path.parent_path(); + + if (!dir.empty()) { + if (!boost::filesystem::exists(dir)) { + try { + boost::filesystem::create_directories(dir); + } catch (const boost::filesystem::filesystem_error& e) { + std::cerr << e.what() << std::endl; + } + } + } +} + bool SVG::open(const char* afilename) { + create_dir(afilename); this->filename = afilename; this->f = boost::nowide::fopen(afilename, "w"); if (this->f == NULL) @@ -25,6 +42,7 @@ bool SVG::open(const char* afilename) bool SVG::open(const char* afilename, const BoundingBox &bbox, const coord_t bbox_offset, bool aflipY) { + create_dir(afilename); this->filename = afilename; this->origin = bbox.min - Point(bbox_offset, bbox_offset); this->flipY = aflipY; diff --git a/src/libslic3r/SupportSpotsGenerator.cpp b/src/libslic3r/SupportSpotsGenerator.cpp index 52f3424d35..c7c205fc45 100644 --- a/src/libslic3r/SupportSpotsGenerator.cpp +++ b/src/libslic3r/SupportSpotsGenerator.cpp @@ -105,15 +105,10 @@ float estimate_curled_up_height( float curled_up_height = 0; if (fabs(distance) < 3.0 * flow_width) { curled_up_height = std::max(prev_line_curled_height - layer_height * 0.75f, 0.0f); - //printf("If 1 %d\n",curled_up_height); } - - //printf("distance %f, params.malformation_distance_factors.first %f, params.malformation_distance_factors.second %f, flow_width %f\n", distance, params.malformation_distance_factors.first, params.malformation_distance_factors.second, flow_width); - //printf("distance %f,params.malformation_distance_factors.first * flow_width %f, params.malformation_distance_factors.second * flow_width %f\n", distance, params.malformation_distance_factors.first * flow_width, params.malformation_distance_factors.second * flow_width); if (distance > params.malformation_distance_factors.first * flow_width && distance < params.malformation_distance_factors.second * flow_width) { - // imagine the extrusion profile. The part that has been glued (melted) with the previous layer will be called anchored section // and the rest will be called curling section // float anchored_section = flow_width - point.distance; @@ -145,49 +140,79 @@ float estimate_curled_up_height( void estimate_malformations(LayerPtrs &layers, const Params ¶ms) { - LD prev_layer_lines{}; - for (Layer *l : layers) { +#ifdef DEBUG_FILES + FILE *debug_file = boost::nowide::fopen(debug_out_path("object_malformations.obj").c_str(), "w"); + FILE *full_file = boost::nowide::fopen(debug_out_path("object_full.obj").c_str(), "w"); +#endif + + LD prev_layer_lines{}; + + for (Layer *l : layers) { l->curled_lines.clear(); std::vector boundary_lines = l->lower_layer != nullptr ? to_unscaled_linesf(l->lower_layer->lslices) : std::vector(); AABBTreeLines::LinesDistancer prev_layer_boundary{std::move(boundary_lines)}; std::vector current_layer_lines; for (const LayerRegion *layer_region : l->regions()) { - for (const ExtrusionEntity *extrusion : layer_region->perimeters.flatten().entities) { - if (extrusion->role() != Slic3r::erExternalPerimeter) + for (const ExtrusionEntity *extrusion : layer_region->perimeters.flatten().entities) { + if (extrusion->role() != Slic3r::erExternalPerimeter) continue; - Points extrusion_pts; + + Points extrusion_pts; extrusion->collect_points(extrusion_pts); - float flow_width = get_flow_width(layer_region, extrusion->role()); - auto annotated_points = estimate_points_properties(extrusion_pts, prev_layer_lines, flow_width, - params.bridge_distance); + float flow_width = get_flow_width(layer_region, extrusion->role()); + auto annotated_points = estimate_points_properties(extrusion_pts, + prev_layer_lines, + flow_width, + params.bridge_distance); for (size_t i = 0; i < annotated_points.size(); ++i) { - const ExtendedPoint &a = i > 0 ? annotated_points[i - 1] : annotated_points[i]; + const ExtendedPoint &a = i > 0 ? annotated_points[i - 1] : annotated_points[i]; const ExtendedPoint &b = annotated_points[i]; ExtrusionLine line_out{a.position.cast(), b.position.cast(), float((a.position - b.position).norm()), extrusion}; + Vec2f middle = 0.5 * (line_out.a + line_out.b); auto [middle_distance, bottom_line_idx, x] = prev_layer_lines.distance_from_lines_extra(middle); ExtrusionLine bottom_line = prev_layer_lines.get_lines().empty() ? ExtrusionLine{} : prev_layer_lines.get_line(bottom_line_idx); // correctify the distance sign using slice polygons - float sign = (prev_layer_boundary.distance_from_lines(middle.cast()) + 0.5f * flow_width) < 0.0f ? -1.0f : 1.0f; + float sign = (prev_layer_boundary.distance_from_lines(middle.cast()) + 0.5f * flow_width) < 0.0f ? -1.0f : + 1.0f; - line_out.curled_up_height = estimate_curled_up_height(middle_distance * sign, 0.5 * (a.curvature + b.curvature), + line_out.curled_up_height = estimate_curled_up_height(middle_distance * sign * params.curled_distance_expansion, 0.5 * (a.curvature + b.curvature), l->height, flow_width, bottom_line.curled_up_height, params); current_layer_lines.push_back(line_out); } - } + } } + for (const ExtrusionLine &line : current_layer_lines) { if (line.curled_up_height > params.curling_tolerance_limit) { l->curled_lines.push_back(CurledLine{Point::new_scale(line.a), Point::new_scale(line.b), line.curled_up_height}); } } - + +#ifdef DEBUG_FILES + for (const ExtrusionLine &line : current_layer_lines) { + if (line.curled_up_height > params.curling_tolerance_limit) { + Vec3f color = value_to_rgbf(-EPSILON, l->height * params.max_curled_height_factor, line.curled_up_height); + fprintf(debug_file, "v %f %f %f %f %f %f\n", line.b[0], line.b[1], l->print_z, color[0], color[1], color[2]); + } + } + for (const ExtrusionLine &line : current_layer_lines) { + Vec3f color = value_to_rgbf(-EPSILON, l->height * params.max_curled_height_factor, line.curled_up_height); + fprintf(full_file, "v %f %f %f %f %f %f\n", line.b[0], line.b[1], l->print_z, color[0], color[1], color[2]); + } +#endif + prev_layer_lines = LD{current_layer_lines}; } + +#ifdef DEBUG_FILES + fclose(debug_file); + fclose(full_file); +#endif } /* diff --git a/src/libslic3r/SupportSpotsGenerator.hpp b/src/libslic3r/SupportSpotsGenerator.hpp index eed2351f82..73a3419067 100644 --- a/src/libslic3r/SupportSpotsGenerator.hpp +++ b/src/libslic3r/SupportSpotsGenerator.hpp @@ -43,8 +43,9 @@ struct Params BrimType brim_type; const float brim_width; - const std::pair malformation_distance_factors = std::pair { 0.33, 0.7 }; + const std::pair malformation_distance_factors = std::pair { 0.2, 1.1 }; const float max_curled_height_factor = 10.0f; + const float curled_distance_expansion = 1.0f; // controls the spread of the area where slow down for curled overhangs is applied const float curling_tolerance_limit = 0.1f; const float min_distance_between_support_points = 3.0f; //mm diff --git a/src/libslic3r/TextConfiguration.hpp b/src/libslic3r/TextConfiguration.hpp new file mode 100644 index 0000000000..8da67cdd0a --- /dev/null +++ b/src/libslic3r/TextConfiguration.hpp @@ -0,0 +1,191 @@ +///|/ Copyright (c) Prusa Research 2021 - 2022 Filip Sykala @Jony01, Vojtěch Bubník @bubnikv +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ +#ifndef slic3r_TextConfiguration_hpp_ +#define slic3r_TextConfiguration_hpp_ + +#include +#include +#include +#include +#include +#include +#include +#include "Point.hpp" // Transform3d + +namespace Slic3r { + +/// +/// User modifiable property of text style +/// NOTE: OnEdit fix serializations: EmbossStylesSerializable, TextConfigurationSerialization +/// +struct FontProp +{ + // define extra space between letters, negative mean closer letter + // When not set value is zero and is not stored + std::optional char_gap; // [in font point] + + // define extra space between lines, negative mean closer lines + // When not set value is zero and is not stored + std::optional line_gap; // [in font point] + + // positive value mean wider character shape + // negative value mean tiner character shape + // When not set value is zero and is not stored + std::optional boldness; // [in mm] + + // positive value mean italic of character (CW) + // negative value mean CCW skew (unItalic) + // When not set value is zero and is not stored + std::optional skew; // [ration x:y] + + // Parameter for True Type Font collections + // Select index of font in collection + std::optional collection_number; + + // Distiguish projection per glyph + bool per_glyph; + + // NOTE: way of serialize to 3mf force that zero must be default value + enum class HorizontalAlign { left = 0, center, right }; + enum class VerticalAlign { top = 0, center, bottom }; + using Align = std::pair; + // change pivot of text + // When not set, center is used and is not stored + Align align = Align(HorizontalAlign::center, VerticalAlign::center); + + ////// + // Duplicit data to wxFontDescriptor + // used for store/load .3mf file + ////// + + // Height of text line (letters) + // duplicit to wxFont::PointSize + float size_in_mm; // [in mm] + + // Additional data about font to be able to find substitution, + // when same font is not installed + std::optional family; + std::optional face_name; + std::optional style; + std::optional weight; + + /// + /// Only constructor with restricted values + /// + /// Y size of text [in mm] + /// Z size of text [in mm] + FontProp(float line_height = 10.f) : size_in_mm(line_height), per_glyph(false) + {} + + bool operator==(const FontProp& other) const { + return + char_gap == other.char_gap && + line_gap == other.line_gap && + per_glyph == other.per_glyph && + align == other.align && + is_approx(size_in_mm, other.size_in_mm) && + is_approx(boldness, other.boldness) && + is_approx(skew, other.skew); + } + + // undo / redo stack recovery + template void save(Archive &ar) const + { + ar(size_in_mm, per_glyph, align.first, align.second); + cereal::save(ar, char_gap); + cereal::save(ar, line_gap); + cereal::save(ar, boldness); + cereal::save(ar, skew); + cereal::save(ar, collection_number); + } + template void load(Archive &ar) + { + ar(size_in_mm, per_glyph, align.first, align.second); + cereal::load(ar, char_gap); + cereal::load(ar, line_gap); + cereal::load(ar, boldness); + cereal::load(ar, skew); + cereal::load(ar, collection_number); + } +}; + +/// +/// Style of embossed text +/// (Path + Type) must define how to open font for using on different OS +/// NOTE: OnEdit fix serializations: EmbossStylesSerializable, TextConfigurationSerialization +/// +struct EmbossStyle +{ + // Human readable name of style it is shown in GUI + std::string name; + + // Define how to open font + // Meaning depend on type + std::string path; + + enum class Type; + // Define what is stored in path + Type type { Type::undefined }; + + // User modification of font style + FontProp prop; + + // when name is empty than Font item was loaded from .3mf file + // and potentionaly it is not reproducable + // define data stored in path + // when wx change way of storing add new descriptor Type + enum class Type { + undefined = 0, + + // wx font descriptors are platform dependent + // path is font descriptor generated by wxWidgets + wx_win_font_descr, // on Windows + wx_lin_font_descr, // on Linux + wx_mac_font_descr, // on Max OS + + // TrueTypeFont file loacation on computer + // for privacy: only filename is stored into .3mf + file_path + }; + + bool operator==(const EmbossStyle &other) const + { + return + type == other.type && + prop == other.prop && + name == other.name && + path == other.path + ; + } + + // undo / redo stack recovery + template void serialize(Archive &ar){ ar(name, path, type, prop); } +}; + +// Emboss style name inside vector is unique +// It is not map beacuse items has own order (view inside of slect) +// It is stored into AppConfig by EmbossStylesSerializable +using EmbossStyles = std::vector; + +/// +/// Define how to create 'Text volume' +/// It is stored into .3mf by TextConfigurationSerialization +/// It is part of ModelVolume optional data +/// +struct TextConfiguration +{ + // Style of embossed text + EmbossStyle style; + + // Embossed text value + std::string text = "None"; + + // undo / redo stack recovery + template void serialize(Archive &ar) { ar(style, text); } +}; + +} // namespace Slic3r + +#endif // slic3r_TextConfiguration_hpp_ diff --git a/src/libslic3r/Timer.cpp b/src/libslic3r/Timer.cpp new file mode 100644 index 0000000000..18dd844bc8 --- /dev/null +++ b/src/libslic3r/Timer.cpp @@ -0,0 +1,25 @@ +///|/ Copyright (c) Prusa Research 2023 Vojtěch Bubník @bubnikv +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ +#include "Timer.hpp" +#include + +using namespace std::chrono; + +Slic3r::Timer::Timer(const std::string &name) : m_name(name), m_start(steady_clock::now()) {} + +Slic3r::Timer::~Timer() +{ + BOOST_LOG_TRIVIAL(debug) << "Timer '" << m_name << "' spend " << + duration_cast(steady_clock::now() - m_start).count() << "ms"; +} + + +namespace Slic3r::Timing { + +void TimeLimitAlarm::report_time_exceeded() const { + BOOST_LOG_TRIVIAL(error) << "Time limit exceeded for " << m_limit_exceeded_message << ": " << m_timer.elapsed_seconds() << "s"; +} + +} diff --git a/src/libslic3r/Timer.hpp b/src/libslic3r/Timer.hpp new file mode 100644 index 0000000000..2fd63f234e --- /dev/null +++ b/src/libslic3r/Timer.hpp @@ -0,0 +1,96 @@ +///|/ Copyright (c) Prusa Research 2023 Vojtěch Bubník @bubnikv +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ +#ifndef libslic3r_Timer_hpp_ +#define libslic3r_Timer_hpp_ + +#include +#include + +namespace Slic3r { + +/// +/// Instance of this class is used for measure time consumtion +/// of block code until instance is alive and write result to debug output +/// +class Timer +{ + std::string m_name; + std::chrono::steady_clock::time_point m_start; +public: + /// + /// name describe timer + /// + /// Describe timer in consol log + Timer(const std::string& name); + + /// + /// name describe timer + /// + ~Timer(); +}; + +namespace Timing { + + // Timing code from Catch2 unit testing library + static inline uint64_t nanoseconds_since_epoch() { + return std::chrono::duration_cast(std::chrono::high_resolution_clock::now().time_since_epoch()).count(); + } + + // Timing code from Catch2 unit testing library + class Timer { + public: + void start() { + m_nanoseconds = nanoseconds_since_epoch(); + } + uint64_t elapsed_nanoseconds() const { + return nanoseconds_since_epoch() - m_nanoseconds; + } + uint64_t elapsed_microseconds() const { + return elapsed_nanoseconds() / 1000; + } + unsigned int elapsed_milliseconds() const { + return static_cast(elapsed_microseconds()/1000); + } + double elapsed_seconds() const { + return elapsed_microseconds() / 1000000.0; + } + private: + uint64_t m_nanoseconds = 0; + }; + + // Emits a Boost::log error if the life time of this timing object exceeds a limit. + class TimeLimitAlarm { + public: + TimeLimitAlarm(uint64_t time_limit_nanoseconds, std::string_view limit_exceeded_message) : + m_time_limit_nanoseconds(time_limit_nanoseconds), m_limit_exceeded_message(limit_exceeded_message) { + m_timer.start(); + } + ~TimeLimitAlarm() { + auto elapsed = m_timer.elapsed_nanoseconds(); + if (elapsed > m_time_limit_nanoseconds) + this->report_time_exceeded(); + } + static TimeLimitAlarm new_nanos(uint64_t time_limit_nanoseconds, std::string_view limit_exceeded_message) { + return TimeLimitAlarm(time_limit_nanoseconds, limit_exceeded_message); + } + static TimeLimitAlarm new_milis(uint64_t time_limit_milis, std::string_view limit_exceeded_message) { + return TimeLimitAlarm(uint64_t(time_limit_milis) * 1000000l, limit_exceeded_message); + } + static TimeLimitAlarm new_seconds(uint64_t time_limit_seconds, std::string_view limit_exceeded_message) { + return TimeLimitAlarm(uint64_t(time_limit_seconds) * 1000000000l, limit_exceeded_message); + } + private: + void report_time_exceeded() const; + + Timer m_timer; + uint64_t m_time_limit_nanoseconds; + std::string_view m_limit_exceeded_message; + }; + +} // namespace Catch + +} // namespace Slic3r + +#endif // libslic3r_Timer_hpp_ diff --git a/src/libslic3r/TriangleMeshSlicer.cpp b/src/libslic3r/TriangleMeshSlicer.cpp index ea99f13eb9..ac01d0e0c9 100644 --- a/src/libslic3r/TriangleMeshSlicer.cpp +++ b/src/libslic3r/TriangleMeshSlicer.cpp @@ -2235,6 +2235,7 @@ static void triangulate_slice( [&v](const std::pair &l) { return l.first.x() < v.x() || (is_equal_for_sort(l.first.x(), v.x()) && l.first.y() < v.y()); }); + auto back_it = it; int idx = -1; bool exist = false; for (auto iter = section_vertices_map.begin(); iter != section_vertices_map.end(); iter++) { @@ -2256,6 +2257,7 @@ static void triangulate_slice( } // go on finding if (!exist) { + it = back_it; for (; it != map_vertex_to_index.begin(); it--) { if (is_equal(it->first.x(), v.x()) && is_equal(it->first.y(), v.y())) { idx = it->second; diff --git a/src/libslic3r/Triangulation.cpp b/src/libslic3r/Triangulation.cpp new file mode 100644 index 0000000000..c75a531973 --- /dev/null +++ b/src/libslic3r/Triangulation.cpp @@ -0,0 +1,332 @@ +///|/ Copyright (c) Prusa Research 2021 - 2022 Filip Sykala @Jony01, Vojtěch Bubník @bubnikv +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ +#include "Triangulation.hpp" +#include "IntersectionPoints.hpp" +#include +#include +#include +#include + +using namespace Slic3r; +namespace priv{ +inline void insert_edges(Triangulation::HalfEdges &edges, uint32_t &offset, const Polygon &polygon, const Triangulation::Changes& changes) { + const Points &pts = polygon.points; + uint32_t size = static_cast(pts.size()); + uint32_t last_index = offset + size - 1; + uint32_t prev_index = changes[last_index]; + for (uint32_t i = 0; i < size; ++i) { + uint32_t index = changes[offset + i]; + // when duplicit points are neighbor + if (prev_index == index) continue; + edges.push_back({prev_index, index}); + prev_index = index; + } + offset += size; +} + +inline void insert_edges(Triangulation::HalfEdges &edges, uint32_t &offset, const Polygon &polygon) { + const Points &pts = polygon.points; + uint32_t size = static_cast(pts.size()); + uint32_t prev_index = offset + size - 1; + for (uint32_t i = 0; i < size; ++i) { + uint32_t index = offset + i; + edges.push_back({prev_index, index}); + prev_index = index; + } + offset += size; +} + +inline bool has_bidirectional_constrained( + const Triangulation::HalfEdges &constrained) +{ + for (const auto &c : constrained) { + auto key = std::make_pair(c.second, c.first); + auto it = std::lower_bound(constrained.begin(), constrained.end(), + key); + if (it != constrained.end() && *it == key) return true; + } + return false; +} + +inline bool is_unique(const Points &points) { + Points pts = points; // copy + std::sort(pts.begin(), pts.end()); + auto it = std::adjacent_find(pts.begin(), pts.end()); + return it == pts.end(); +} + +inline bool has_self_intersection( + const Points &points, + const Triangulation::HalfEdges &constrained_half_edges) +{ + Lines lines; + lines.reserve(constrained_half_edges.size()); + for (const auto &he : constrained_half_edges) + lines.emplace_back(points[he.first], points[he.second]); + return !get_intersections(lines).empty(); +} + +} // namespace priv + +//#define VISUALIZE_TRIANGULATION +#ifdef VISUALIZE_TRIANGULATION +#include "admesh/stl.h" // indexed triangle set +static void visualize(const Points &points, + const Triangulation::Indices &indices, + const char *filename) +{ + // visualize + indexed_triangle_set its; + its.vertices.reserve(points.size()); + for (const Point &p : points) its.vertices.emplace_back(p.x(), p.y(), 0.); + its.indices = indices; + its_write_obj(its, filename); +} +#endif // VISUALIZE_TRIANGULATION + +Triangulation::Indices Triangulation::triangulate(const Points &points, + const HalfEdges &constrained_half_edges) +{ + assert(!points.empty()); + assert(!constrained_half_edges.empty()); + // constrained must be sorted + assert(std::is_sorted(constrained_half_edges.begin(), + constrained_half_edges.end())); + // check that there is no duplicit constrained edge + assert(std::adjacent_find(constrained_half_edges.begin(), constrained_half_edges.end()) == constrained_half_edges.end()); + // edges can NOT contain bidirectional constrained + assert(!priv::has_bidirectional_constrained(constrained_half_edges)); + // check that there is only unique poistion of points + assert(priv::is_unique(points)); + assert(!priv::has_self_intersection(points, constrained_half_edges)); + // use cgal triangulation + using K = CGAL::Exact_predicates_inexact_constructions_kernel; + using Vb = CGAL::Triangulation_vertex_base_with_info_2; + using Fb = CGAL::Constrained_triangulation_face_base_2; + using Tds = CGAL::Triangulation_data_structure_2; + using CDT = CGAL::Constrained_Delaunay_triangulation_2; + + // construct a constrained triangulation + CDT cdt; + { + std::vector vertices_handle(points.size()); // for constriants + using Point_with_ord = std::pair; + using SearchTrait = CGAL::Spatial_sort_traits_adapter_2 + >; + + std::vector cdt_points; + cdt_points.reserve(points.size()); + size_t ord = 0; + for (const auto &p : points) + cdt_points.emplace_back(std::make_pair(CDT::Point{p.x(), p.y()}, ord++)); + + SearchTrait st; + CGAL::spatial_sort(cdt_points.begin(), cdt_points.end(), st); + CDT::Face_handle f; + for (const auto& p : cdt_points) { + auto handle = cdt.insert(p.first, f); + handle->info() = p.second; + vertices_handle[p.second] = handle; + f = handle->face(); + } + + // Constrain the triangulation. + for (const HalfEdge &edge : constrained_half_edges) + cdt.insert_constraint(vertices_handle[edge.first], vertices_handle[edge.second]); + } + + auto faces = cdt.finite_face_handles(); + + // Unmark constrained edges of outside faces. + size_t num_faces = 0; + for (CDT::Face_handle fh : faces) { + for (int i = 0; i < 3; ++i) { + if (!fh->is_constrained(i)) continue; + auto key = std::make_pair(fh->vertex((i + 2) % 3)->info(), fh->vertex((i + 1) % 3)->info()); + auto it = std::lower_bound(constrained_half_edges.begin(), constrained_half_edges.end(), key); + if (it == constrained_half_edges.end() || *it != key) continue; + // This face contains a constrained edge and it is outside. + for (int j = 0; j < 3; ++ j) + fh->set_constraint(j, false); + --num_faces; + break; + } + ++num_faces; + } + + auto inside = [](CDT::Face_handle &fh) { + return fh->neighbor(0) != fh && + (fh->is_constrained(0) || + fh->is_constrained(1) || + fh->is_constrained(2)); + }; + +#ifdef VISUALIZE_TRIANGULATION + std::vector indices2; + indices2.reserve(num_faces); + for (CDT::Face_handle fh : faces) + if (inside(fh)) indices2.emplace_back(fh->vertex(0)->info(), fh->vertex(1)->info(), fh->vertex(2)->info()); + visualize(points, indices2, "C:/data/temp/triangulation_without_floodfill.obj"); +#endif // VISUALIZE_TRIANGULATION + + // Propagate inside the constrained regions. + std::vector queue; + queue.reserve(num_faces); + for (CDT::Face_handle seed : faces){ + if (!inside(seed)) continue; + // Seed fill to neighbor faces. + queue.emplace_back(seed); + while (! queue.empty()) { + CDT::Face_handle fh = queue.back(); + queue.pop_back(); + for (int i = 0; i < 3; ++i) { + if (fh->is_constrained(i)) continue; + // Propagate along this edge. + fh->set_constraint(i, true); + CDT::Face_handle nh = fh->neighbor(i); + bool was_inside = inside(nh); + // Mark the other side of this edge. + nh->set_constraint(nh->index(fh), true); + if (! was_inside) + queue.push_back(nh); + } + } + } + + std::vector indices; + indices.reserve(num_faces); + for (CDT::Face_handle fh : faces) + if (inside(fh)) + indices.emplace_back(fh->vertex(0)->info(), fh->vertex(1)->info(), fh->vertex(2)->info()); + +#ifdef VISUALIZE_TRIANGULATION + visualize(points, indices, "C:/data/temp/triangulation.obj"); +#endif // VISUALIZE_TRIANGULATION + + return indices; +} + +Triangulation::Indices Triangulation::triangulate(const Polygon &polygon) +{ + const Points &pts = polygon.points; + HalfEdges edges; + edges.reserve(pts.size()); + uint32_t offset = 0; + priv::insert_edges(edges, offset, polygon); + std::sort(edges.begin(), edges.end()); + return triangulate(pts, edges); +} + +Triangulation::Indices Triangulation::triangulate(const Polygons &polygons) +{ + size_t count = count_points(polygons); + Points points; + points.reserve(count); + + HalfEdges edges; + edges.reserve(count); + uint32_t offset = 0; + + for (const Polygon &polygon : polygons) { + Slic3r::append(points, polygon.points); + priv::insert_edges(edges, offset, polygon); + } + + std::sort(edges.begin(), edges.end()); + return triangulate(points, edges); +} + +Triangulation::Indices Triangulation::triangulate(const ExPolygon &expolygon){ + ExPolygons expolys({expolygon}); + return triangulate(expolys); +} + +Triangulation::Indices Triangulation::triangulate(const ExPolygons &expolygons){ + Points pts = to_points(expolygons); + Points d_pts = collect_duplicates(pts); + if (d_pts.empty()) return triangulate(expolygons, pts); + + Changes changes = create_changes(pts, d_pts); + Indices indices = triangulate(expolygons, pts, changes); + // reverse map for changes + Changes changes2(changes.size(), std::numeric_limits::max()); + for (size_t i = 0; i < changes.size(); ++i) + changes2[changes[i]] = i; + + // convert indices into expolygons indicies + for (Vec3i &t : indices) + for (size_t ti = 0; ti < 3; ti++) t[ti] = changes2[t[ti]]; + + return indices; +} + +Triangulation::Indices Triangulation::triangulate(const ExPolygons &expolygons, const Points &points) +{ + assert(count_points(expolygons) == points.size()); + // when contain duplicit coordinate in points will not work properly + assert(collect_duplicates(points).empty()); + + HalfEdges edges; + edges.reserve(points.size()); + uint32_t offset = 0; + for (const ExPolygon &expolygon : expolygons) { + priv::insert_edges(edges, offset, expolygon.contour); + for (const Polygon &hole : expolygon.holes) + priv::insert_edges(edges, offset, hole); + } + std::sort(edges.begin(), edges.end()); + return triangulate(points, edges); +} + +Triangulation::Indices Triangulation::triangulate(const ExPolygons &expolygons, const Points& points, const Changes& changes) +{ + assert(!points.empty()); + assert(count_points(expolygons) == points.size()); + assert(changes.size() == points.size()); + // IMPROVE: search from end and somehow distiquish that value is not a change + uint32_t count_points = *std::max_element(changes.begin(), changes.end())+1; + Points pts(count_points); + for (size_t i = 0; i < changes.size(); i++) + pts[changes[i]] = points[i]; + + HalfEdges edges; + edges.reserve(points.size()); + uint32_t offset = 0; + for (const ExPolygon &expolygon : expolygons) { + priv::insert_edges(edges, offset, expolygon.contour, changes); + for (const Polygon &hole : expolygon.holes) + priv::insert_edges(edges, offset, hole, changes); + } + + std::sort(edges.begin(), edges.end()); + return triangulate(pts, edges); +} + +Triangulation::Changes Triangulation::create_changes(const Points &points, const Points &duplicits) +{ + assert(!duplicits.empty()); + assert(duplicits.size() < points.size()/2); + std::vector duplicit_indices(duplicits.size(), std::numeric_limits::max()); + Changes changes; + changes.reserve(points.size()); + uint32_t index = 0; + for (const Point &p: points) { + auto it = std::lower_bound(duplicits.begin(), duplicits.end(), p); + if (it == duplicits.end() || *it != p) { + changes.push_back(index); + ++index; + continue; + } + uint32_t &d_index = duplicit_indices[it - duplicits.begin()]; + if (d_index == std::numeric_limits::max()) { + d_index = index; + changes.push_back(index); + ++index; + } else { + changes.push_back(d_index); + } + } + return changes; +} diff --git a/src/libslic3r/Triangulation.hpp b/src/libslic3r/Triangulation.hpp new file mode 100644 index 0000000000..1fb7b67824 --- /dev/null +++ b/src/libslic3r/Triangulation.hpp @@ -0,0 +1,76 @@ +///|/ Copyright (c) Prusa Research 2021 - 2022 Vojtěch Bubník @bubnikv, Filip Sykala @Jony01 +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ +#ifndef libslic3r_Triangulation_hpp_ +#define libslic3r_Triangulation_hpp_ + +#include +#include +#include +#include +#include + +namespace Slic3r { + +class Triangulation +{ +public: + Triangulation() = delete; + + // define oriented connection of 2 vertices(defined by its index) + using HalfEdge = std::pair; + using HalfEdges = std::vector; + using Indices = std::vector; + + /// + /// Connect points by triangulation to create filled surface by triangles + /// Input points have to be unique + /// Inspiration for make unique points is Emboss::dilate_to_unique_points + /// + /// Points to connect + /// Constraint for edges, pair is from point(first) to + /// point(second), sorted lexicographically + /// Triangles + static Indices triangulate(const Points &points, + const HalfEdges &half_edges); + static Indices triangulate(const Polygon &polygon); + static Indices triangulate(const Polygons &polygons); + static Indices triangulate(const ExPolygon &expolygon); + static Indices triangulate(const ExPolygons &expolygons); + + // Map for convert original index to set without duplication + // from_index + using Changes = std::vector; + + /// + /// Create conversion map from original index into new + /// with respect of duplicit point + /// + /// input set of points + /// duplicit points collected from points + /// Conversion map for point index + static Changes create_changes(const Points &points, const Points &duplicits); + + /// + /// Triangulation for expolygons, speed up when points are already collected + /// NOTE: Not working properly for ExPolygons with multiple point on same coordinate + /// You should check it by "collect_changes" + /// + /// Input shape to triangulation - define edges + /// Points from expolygons + /// Triangle indices + static Indices triangulate(const ExPolygons &expolygons, const Points& points); + + /// + /// Triangulation for expolygons containing multiple points with same coordinate + /// + /// Input shape to triangulation - define edge + /// Points from expolygons + /// Changes swap for indicies into points + /// Triangle indices + static Indices triangulate(const ExPolygons &expolygons, const Points& points, const Changes& changes); +}; + +} // namespace Slic3r +#endif // libslic3r_Triangulation_hpp_ \ No newline at end of file diff --git a/src/libslic3r/Utils.hpp b/src/libslic3r/Utils.hpp index 8687a503e6..2a261476c4 100644 --- a/src/libslic3r/Utils.hpp +++ b/src/libslic3r/Utils.hpp @@ -372,6 +372,7 @@ inline typename CONTAINER_TYPE::value_type& next_value_modulo(typename CONTAINER } extern std::string xml_escape(std::string text, bool is_marked = false); +extern std::string xml_escape_double_quotes_attribute_value(std::string text); extern std::string xml_unescape(std::string text); diff --git a/src/libslic3r/calib.cpp b/src/libslic3r/calib.cpp index f392af9eb7..2ddad883c2 100644 --- a/src/libslic3r/calib.cpp +++ b/src/libslic3r/calib.cpp @@ -439,11 +439,8 @@ std::string CalibPressureAdvanceLine::generate_test(double start_pa /*= 0*/, dou m_length_long = 40 + std::min(w - 120.0, 0.0); - auto startx = (w - m_length_short * 2 - m_length_long - 20) / 2; - auto starty = (h - count * m_space_y) / 2; - if (is_delta()) { - CalibPressureAdvanceLine::delta_modify_start(startx, starty, count); - } + auto startx = bed_ext.min.x() + (w - m_length_short * 2 - m_length_long - 20) / 2; + auto starty = bed_ext.min.y() + (h - count * m_space_y) / 2; return print_pa_lines(startx, starty, start_pa, step_pa, count); } @@ -501,8 +498,8 @@ std::string CalibPressureAdvanceLine::print_pa_lines(double start_x, double star DrawBoxOptArgs default_box_opt_args(2, m_height_layer, 0.6, fast); default_box_opt_args.is_filled = true; - gcode << draw_box(writer, start_x + m_length_short + m_length_long + m_length_short, start_y-m_space_y, number_spacing() * 8, - num * m_space_y, default_box_opt_args); + gcode << draw_box(writer, start_x + m_length_short + m_length_long + m_length_short, start_y - m_space_y, number_spacing() * 8, + (num + 1) * m_space_y, default_box_opt_args); gcode << writer.travel_to_z(m_height_layer*2); for (int i = 0; i < num; i += 2) { gcode << draw_number(start_x + m_length_short + m_length_long + m_length_short + 3, y_pos + i * m_space_y + m_space_y / 2, @@ -560,6 +557,9 @@ void CalibPressureAdvancePattern::generate_custom_gcodes(const DynamicPrintConfi // draw pressure advance pattern for (int i = 0; i < m_num_layers; ++i) { + const double layer_height = height_first_layer() + (i * height_layer()); + const double zhop_height = layer_height + height_layer(); + if (i > 0) { gcode << "; end pressure advance pattern for layer\n"; CustomGCode::Item item; @@ -571,7 +571,6 @@ void CalibPressureAdvancePattern::generate_custom_gcodes(const DynamicPrintConfi gcode = std::stringstream(); // reset for next layer contents gcode << "; start pressure advance pattern for layer\n"; - const double layer_height = height_first_layer() + (i * height_layer()); gcode << m_writer.travel_to_z(layer_height, "Move to layer height"); } @@ -609,7 +608,9 @@ void CalibPressureAdvancePattern::generate_custom_gcodes(const DynamicPrintConfi double initial_x = to_x; double initial_y = to_y; + gcode << m_writer.travel_to_z(zhop_height, "z-hop before move"); gcode << move_to(Vec2d(to_x, to_y), m_writer, "Move to pattern start"); + gcode << m_writer.travel_to_z(layer_height, "undo z-hop"); for (int j = 0; j < num_patterns; ++j) { // increment pressure advance @@ -634,15 +635,21 @@ void CalibPressureAdvancePattern::generate_custom_gcodes(const DynamicPrintConfi if (k != wall_count() - 1) { // perimeters not done yet. move to next perimeter to_x += line_spacing_angle(); + gcode << m_writer.travel_to_z(zhop_height, "z-hop before move"); gcode << move_to(Vec2d(to_x, to_y), m_writer, "Move to start next pattern wall"); + gcode << m_writer.travel_to_z(layer_height, "undo z-hop"); } else if (j != num_patterns - 1) { // patterns not done yet. move to next pattern to_x += m_pattern_spacing + line_width(); + gcode << m_writer.travel_to_z(zhop_height, "z-hop before move"); gcode << move_to(Vec2d(to_x, to_y), m_writer, "Move to next pattern"); + gcode << m_writer.travel_to_z(layer_height, "undo z-hop"); } else if (i != m_num_layers - 1) { // layers not done yet. move back to start to_x = initial_x; + gcode << m_writer.travel_to_z(zhop_height, "z-hop before move"); gcode << move_to(Vec2d(to_x, to_y), m_writer, "Move back to start position"); + gcode << m_writer.travel_to_z(layer_height, "undo z-hop"); } else { // everything done } diff --git a/src/libslic3r/utils.cpp b/src/libslic3r/utils.cpp index ececd0b15b..88f78f22d4 100644 --- a/src/libslic3r/utils.cpp +++ b/src/libslic3r/utils.cpp @@ -1225,6 +1225,34 @@ std::string xml_escape(std::string text, bool is_marked/* = false*/) return text; } +// Definition of escape symbols https://www.w3.org/TR/REC-xml/#AVNormalize +// During the read of xml attribute normalization of white spaces is applied +// Soo for not lose white space character it is escaped before store +std::string xml_escape_double_quotes_attribute_value(std::string text) +{ + std::string::size_type pos = 0; + for (;;) { + pos = text.find_first_of("\"&<\r\n\t", pos); + if (pos == std::string::npos) break; + + std::string replacement; + switch (text[pos]) { + case '\"': replacement = """; break; + case '&': replacement = "&"; break; + case '<': replacement = "<"; break; + case '\r': replacement = " "; break; + case '\n': replacement = " "; break; + case '\t': replacement = " "; break; + default: break; + } + + text.replace(pos, 1, replacement); + pos += replacement.size(); + } + + return text; +} + std::string xml_unescape(std::string s) { std::string ret; diff --git a/src/platform/unix/OrcaSlicer.desktop b/src/platform/unix/OrcaSlicer.desktop index c61b408885..ac44f8ba08 100644 --- a/src/platform/unix/OrcaSlicer.desktop +++ b/src/platform/unix/OrcaSlicer.desktop @@ -5,7 +5,7 @@ Icon=OrcaSlicer Exec=orca-slicer %F Terminal=false Type=Application -MimeType=model/stl;application/vnd.ms-3mfdocument;application/prs.wavefront-obj;application/x-amf; +MimeType=model/stl;model/3mf;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 diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index 8b40dc1e47..7d8e060ea7 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -124,6 +124,8 @@ set(SLIC3R_GUI_SOURCES GUI/Gizmos/GLGizmosCommon.hpp GUI/Gizmos/GLGizmoBase.cpp GUI/Gizmos/GLGizmoBase.hpp + GUI/Gizmos/GLGizmoEmboss.cpp + GUI/Gizmos/GLGizmoEmboss.hpp GUI/Gizmos/GLGizmoMove.cpp GUI/Gizmos/GLGizmoMove.hpp GUI/Gizmos/GLGizmoRotate.cpp @@ -144,6 +146,8 @@ set(SLIC3R_GUI_SOURCES GUI/Gizmos/GLGizmoPainterBase.hpp GUI/Gizmos/GLGizmoSimplify.cpp GUI/Gizmos/GLGizmoSimplify.hpp + GUI/Gizmos/GLGizmoSVG.cpp + GUI/Gizmos/GLGizmoSVG.hpp GUI/Gizmos/GLGizmoMmuSegmentation.cpp GUI/Gizmos/GLGizmoMmuSegmentation.hpp #GUI/Gizmos/GLGizmoFaceDetector.cpp @@ -152,8 +156,8 @@ set(SLIC3R_GUI_SOURCES GUI/Gizmos/GLGizmoMeasure.hpp GUI/Gizmos/GLGizmoSeam.cpp GUI/Gizmos/GLGizmoSeam.hpp - GUI/Gizmos/GLGizmoText.cpp - GUI/Gizmos/GLGizmoText.hpp + #GUI/Gizmos/GLGizmoText.cpp + #GUI/Gizmos/GLGizmoText.hpp GUI/Gizmos/GLGizmoMeshBoolean.cpp GUI/Gizmos/GLGizmoMeshBoolean.hpp GUI/GLSelectionRectangle.cpp @@ -194,6 +198,8 @@ set(SLIC3R_GUI_SOURCES GUI/GUI_Geometry.hpp GUI/I18N.cpp GUI/I18N.hpp + GUI/IconManager.cpp + GUI/IconManager.hpp GUI/MainFrame.cpp GUI/MainFrame.hpp GUI/BBLTopbar.cpp @@ -303,6 +309,10 @@ set(SLIC3R_GUI_SOURCES GUI/RemovableDriveManager.hpp GUI/SendSystemInfoDialog.cpp GUI/SendSystemInfoDialog.hpp + GUI/SurfaceDrag.cpp + GUI/SurfaceDrag.hpp + GUI/TextLines.cpp + GUI/TextLines.hpp GUI/PlateSettingsDialog.cpp GUI/PlateSettingsDialog.hpp GUI/ImGuiWrapper.hpp @@ -329,13 +339,21 @@ set(SLIC3R_GUI_SOURCES GUI/UpdateDialogs.cpp GUI/UpdateDialogs.hpp GUI/Jobs/Job.hpp - GUI/Jobs/Job.cpp - GUI/Jobs/PlaterJob.hpp - GUI/Jobs/PlaterJob.cpp + GUI/Jobs/Worker.hpp + GUI/Jobs/BoostThreadWorker.hpp + GUI/Jobs/BoostThreadWorker.cpp + GUI/Jobs/BusyCursorJob.hpp + GUI/Jobs/PlaterWorker.hpp GUI/Jobs/UpgradeNetworkJob.hpp GUI/Jobs/UpgradeNetworkJob.cpp GUI/Jobs/ArrangeJob.hpp GUI/Jobs/ArrangeJob.cpp + GUI/Jobs/CreateFontNameImageJob.cpp + GUI/Jobs/CreateFontNameImageJob.hpp + GUI/Jobs/CreateFontStyleImagesJob.cpp + GUI/Jobs/CreateFontStyleImagesJob.hpp + GUI/Jobs/EmbossJob.cpp + GUI/Jobs/EmbossJob.hpp GUI/Jobs/OrientJob.hpp GUI/Jobs/OrientJob.cpp GUI/Jobs/RotoptimizeJob.hpp @@ -353,6 +371,8 @@ set(SLIC3R_GUI_SOURCES GUI/Jobs/BindJob.cpp GUI/Jobs/NotificationProgressIndicator.hpp GUI/Jobs/NotificationProgressIndicator.cpp + GUI/Jobs/ThreadSafeQueue.hpp + GUI/Jobs/SLAImportDialog.hpp GUI/PhysicalPrinterDialog.hpp GUI/PhysicalPrinterDialog.cpp GUI/ProgressStatusBar.hpp @@ -449,6 +469,10 @@ set(SLIC3R_GUI_SOURCES Utils/Http.hpp Utils/FixModelByWin10.cpp Utils/FixModelByWin10.hpp + Utils/EmbossStyleManager.cpp + Utils/EmbossStyleManager.hpp + Utils/FontConfigHelp.cpp + Utils/FontConfigHelp.hpp Utils/Bonjour.cpp Utils/Bonjour.hpp Utils/FileHelp.cpp @@ -457,6 +481,8 @@ set(SLIC3R_GUI_SOURCES Utils/PresetUpdater.hpp Utils/Process.cpp Utils/Process.hpp + Utils/RaycastManager.cpp + Utils/RaycastManager.hpp Utils/Profile.hpp Utils/UndoRedo.cpp Utils/UndoRedo.hpp @@ -480,8 +506,10 @@ set(SLIC3R_GUI_SOURCES Utils/PrintHost.hpp Utils/Serial.cpp Utils/Serial.hpp - Utils/MKS.hpp Utils/MKS.cpp + Utils/MKS.hpp + Utils/WxFontUtils.cpp + Utils/WxFontUtils.hpp Utils/Duet.cpp Utils/Duet.hpp Utils/FlashAir.cpp @@ -591,7 +619,7 @@ endif () if (UNIX AND NOT APPLE) find_package(GTK${SLIC3R_GTK} REQUIRED) target_include_directories(libslic3r_gui PRIVATE ${GTK${SLIC3R_GTK}_INCLUDE_DIRS}) - target_link_libraries(libslic3r_gui ${GTK${SLIC3R_GTK}_LIBRARIES}) + target_link_libraries(libslic3r_gui ${GTK${SLIC3R_GTK}_LIBRARIES} fontconfig) # We add GStreamer for bambu:/// support. pkg_check_modules(GSTREAMER REQUIRED gstreamer-1.0) diff --git a/src/slic3r/GUI/3DBed.cpp b/src/slic3r/GUI/3DBed.cpp index 2dee760cbc..9d73383096 100644 --- a/src/slic3r/GUI/3DBed.cpp +++ b/src/slic3r/GUI/3DBed.cpp @@ -609,7 +609,7 @@ void Bed3D::render_system(GLCanvas3D& canvas, const Transform3d& view_matrix, co }*/ //BBS: add part plate related logic -void Bed3D::update_model_offset() const +void Bed3D::update_model_offset() { // move the model so that its origin (0.0, 0.0, 0.0) goes into the bed shape center and a bit down to avoid z-fighting with the texture quad Vec3d shift = m_extended_bounding_box.center(); @@ -626,11 +626,14 @@ void Bed3D::update_model_offset() const // update extended bounding box const_cast(m_extended_bounding_box) = calc_extended_bounding_box(); + m_triangles.reset(); } void Bed3D::update_bed_triangles() { - m_triangles.reset(); + if (m_triangles.is_initialized()) { + return; + } Vec3d shift = m_extended_bounding_box.center(); shift(2) = -0.03; @@ -708,7 +711,7 @@ void Bed3D::render_custom(GLCanvas3D& canvas, const Transform3d& view_matrix, co void Bed3D::render_default(bool bottom, const Transform3d& view_matrix, const Transform3d& projection_matrix) { - m_texture.reset(); + // m_texture.reset(); update_bed_triangles(); diff --git a/src/slic3r/GUI/3DBed.hpp b/src/slic3r/GUI/3DBed.hpp index b668b5ed61..ed19e24b53 100644 --- a/src/slic3r/GUI/3DBed.hpp +++ b/src/slic3r/GUI/3DBed.hpp @@ -98,7 +98,7 @@ private: //Polygon m_polygon; GLModel m_triangles; //GLModel m_gridlines; - GLTexture m_texture; + // GLTexture m_texture; // temporary texture shown until the main texture has still no levels compressed //GLTexture m_temp_texture; GLModel m_model; @@ -154,7 +154,7 @@ private: //BBS: add partplate related logic // Calculate an extended bounding box from axes and current model for visualization purposes. BoundingBoxf3 calc_extended_bounding_box(bool consider_model_offset = true) const; - void update_model_offset() const; + void update_model_offset(); //BBS: with offset void update_bed_triangles(); static std::tuple detect_type(const Pointfs& shape); diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index f407a999a6..2e0d224fde 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -940,9 +940,9 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); shader->set_uniform("view_normal_matrix", view_normal_matrix); //BBS: add outline related logic - if (with_outline && volume.first->selected) - volume.first->render_with_outline(view_matrix * model_matrix); - else + //if (with_outline && volume.first->selected) + // volume.first->render_with_outline(view_matrix * model_matrix); + //else volume.first->render(); #if ENABLE_ENVIRONMENT_MAP @@ -1162,13 +1162,14 @@ void GLVolumeCollection::update_colors_by_extruder(const DynamicPrintConfig *con const ColorItem& color = colors[extruder_id]; if (!color.first.empty()) { - if (!is_update_alpha) { - float old_a = color.second.a(); + if (!is_update_alpha) { + float old_a = volume->color.a(); volume->color = color.second; volume->color.a(old_a); - } - volume->color = color.second; - } + } else { + volume->color = color.second; + } + } } } diff --git a/src/slic3r/GUI/3DScene.hpp b/src/slic3r/GUI/3DScene.hpp index c3f0d95b2f..a67127739a 100644 --- a/src/slic3r/GUI/3DScene.hpp +++ b/src/slic3r/GUI/3DScene.hpp @@ -243,14 +243,15 @@ public: const Geometry::Transformation& get_instance_transformation() const { return m_instance_transformation; } void set_instance_transformation(const Geometry::Transformation& transformation) { m_instance_transformation = transformation; set_bounding_boxes_as_dirty(); } + void set_instance_transformation(const Transform3d& transform) { m_instance_transformation.set_matrix(transform); set_bounding_boxes_as_dirty(); } - const Vec3d& get_instance_offset() const { return m_instance_transformation.get_offset(); } + Vec3d get_instance_offset() const { return m_instance_transformation.get_offset(); } double get_instance_offset(Axis axis) const { return m_instance_transformation.get_offset(axis); } void set_instance_offset(const Vec3d& offset) { m_instance_transformation.set_offset(offset); set_bounding_boxes_as_dirty(); } void set_instance_offset(Axis axis, double offset) { m_instance_transformation.set_offset(axis, offset); set_bounding_boxes_as_dirty(); } - const Vec3d& get_instance_rotation() const { return m_instance_transformation.get_rotation(); } + Vec3d get_instance_rotation() const { return m_instance_transformation.get_rotation(); } double get_instance_rotation(Axis axis) const { return m_instance_transformation.get_rotation(axis); } void set_instance_rotation(const Vec3d& rotation) { m_instance_transformation.set_rotation(rotation); set_bounding_boxes_as_dirty(); } @@ -262,7 +263,7 @@ public: void set_instance_scaling_factor(const Vec3d& scaling_factor) { m_instance_transformation.set_scaling_factor(scaling_factor); set_bounding_boxes_as_dirty(); } void set_instance_scaling_factor(Axis axis, double scaling_factor) { m_instance_transformation.set_scaling_factor(axis, scaling_factor); set_bounding_boxes_as_dirty(); } - const Vec3d& get_instance_mirror() const { return m_instance_transformation.get_mirror(); } + Vec3d get_instance_mirror() const { return m_instance_transformation.get_mirror(); } double get_instance_mirror(Axis axis) const { return m_instance_transformation.get_mirror(axis); } void set_instance_mirror(const Vec3d& mirror) { m_instance_transformation.set_mirror(mirror); set_bounding_boxes_as_dirty(); } @@ -270,26 +271,27 @@ public: const Geometry::Transformation& get_volume_transformation() const { return m_volume_transformation; } void set_volume_transformation(const Geometry::Transformation& transformation) { m_volume_transformation = transformation; set_bounding_boxes_as_dirty(); } + void set_volume_transformation(const Transform3d& transform) { m_volume_transformation.set_matrix(transform); set_bounding_boxes_as_dirty(); } - const Vec3d& get_volume_offset() const { return m_volume_transformation.get_offset(); } + Vec3d get_volume_offset() const { return m_volume_transformation.get_offset(); } double get_volume_offset(Axis axis) const { return m_volume_transformation.get_offset(axis); } void set_volume_offset(const Vec3d& offset) { m_volume_transformation.set_offset(offset); set_bounding_boxes_as_dirty(); } void set_volume_offset(Axis axis, double offset) { m_volume_transformation.set_offset(axis, offset); set_bounding_boxes_as_dirty(); } - const Vec3d& get_volume_rotation() const { return m_volume_transformation.get_rotation(); } + Vec3d get_volume_rotation() const { return m_volume_transformation.get_rotation(); } double get_volume_rotation(Axis axis) const { return m_volume_transformation.get_rotation(axis); } void set_volume_rotation(const Vec3d& rotation) { m_volume_transformation.set_rotation(rotation); set_bounding_boxes_as_dirty(); } void set_volume_rotation(Axis axis, double rotation) { m_volume_transformation.set_rotation(axis, rotation); set_bounding_boxes_as_dirty(); } - const Vec3d& get_volume_scaling_factor() const { return m_volume_transformation.get_scaling_factor(); } + Vec3d get_volume_scaling_factor() const { return m_volume_transformation.get_scaling_factor(); } double get_volume_scaling_factor(Axis axis) const { return m_volume_transformation.get_scaling_factor(axis); } void set_volume_scaling_factor(const Vec3d& scaling_factor) { m_volume_transformation.set_scaling_factor(scaling_factor); set_bounding_boxes_as_dirty(); } void set_volume_scaling_factor(Axis axis, double scaling_factor) { m_volume_transformation.set_scaling_factor(axis, scaling_factor); set_bounding_boxes_as_dirty(); } - const Vec3d& get_volume_mirror() const { return m_volume_transformation.get_mirror(); } + Vec3d get_volume_mirror() const { return m_volume_transformation.get_mirror(); } double get_volume_mirror(Axis axis) const { return m_volume_transformation.get_mirror(axis); } void set_volume_mirror(const Vec3d& mirror) { m_volume_transformation.set_mirror(mirror); set_bounding_boxes_as_dirty(); } diff --git a/src/slic3r/GUI/BindDialog.cpp b/src/slic3r/GUI/BindDialog.cpp index ca0d4fd702..dd4e826ecb 100644 --- a/src/slic3r/GUI/BindDialog.cpp +++ b/src/slic3r/GUI/BindDialog.cpp @@ -13,6 +13,8 @@ #include "MainFrame.hpp" #include "GUI_App.hpp" #include "Plater.hpp" +#include "Jobs/BoostThreadWorker.hpp" +#include "Jobs/PlaterWorker.hpp" #include "Widgets/WebView.hpp" namespace Slic3r { @@ -374,6 +376,8 @@ wxString get_fail_reason(int code) m_status_bar = std::make_shared(m_simplebook); + m_worker = std::make_unique>(this, m_status_bar, "bind_worker"); + auto button_panel = new wxPanel(m_simplebook, wxID_ANY, wxDefaultPosition, BIND_DIALOG_BUTTON_PANEL_SIZE); button_panel->SetBackgroundColour(*wxWHITE); wxBoxSizer *m_sizer_button = new wxBoxSizer(wxHORIZONTAL); @@ -513,10 +517,7 @@ wxString get_fail_reason(int code) void BindMachineDialog::on_destroy() { - if (m_bind_job) { - m_bind_job->cancel(); - m_bind_job->join(); - } + m_worker.get()->cancel_all(); } void BindMachineDialog::on_close(wxCloseEvent &event) @@ -572,7 +573,7 @@ wxString get_fail_reason(int code) agent->track_update_property("dev_ota_version", m_machine_info->get_ota_version()); m_simplebook->SetSelection(0); - m_bind_job = std::make_shared(m_status_bar, wxGetApp().plater(), m_machine_info->dev_id, m_machine_info->dev_ip, m_machine_info->bind_sec_link); + auto m_bind_job = std::make_unique(m_machine_info->dev_id, m_machine_info->dev_ip, m_machine_info->bind_sec_link); if (m_machine_info && (m_machine_info->get_printer_series() == PrinterSeries::SERIES_X1)) { m_bind_job->set_improved(false); @@ -582,7 +583,7 @@ wxString get_fail_reason(int code) } m_bind_job->set_event_handle(this); - m_bind_job->start(); + replace_job(*m_worker, std::move(m_bind_job)); } void BindMachineDialog::on_dpi_changed(const wxRect &suggested_rect) diff --git a/src/slic3r/GUI/BindDialog.hpp b/src/slic3r/GUI/BindDialog.hpp index 8a8b878e36..636d088112 100644 --- a/src/slic3r/GUI/BindDialog.hpp +++ b/src/slic3r/GUI/BindDialog.hpp @@ -28,6 +28,7 @@ #include "Jobs/BindJob.hpp" #include "BBLStatusBar.hpp" #include "BBLStatusBarBind.hpp" +#include "Jobs/Worker.hpp" #define BIND_DIALOG_GREY200 wxColour(248, 248, 248) #define BIND_DIALOG_GREY800 wxColour(50, 58, 61) @@ -77,8 +78,8 @@ private: std::shared_ptr m_tocken; MachineObject * m_machine_info{nullptr}; - std::shared_ptr m_bind_job; std::shared_ptr m_status_bar; + std::unique_ptr m_worker; public: BindMachineDialog(Plater *plater = nullptr); diff --git a/src/slic3r/GUI/BitmapCache.cpp b/src/slic3r/GUI/BitmapCache.cpp index c9aaeeffb1..9eab03ddf9 100644 --- a/src/slic3r/GUI/BitmapCache.cpp +++ b/src/slic3r/GUI/BitmapCache.cpp @@ -63,6 +63,8 @@ wxBitmapBundle* BitmapCache::insert_bndl(const std::string& name, const std::vec wxVector bitmaps; std::set scales = {1.0}; +#ifndef __linux__ + #ifdef __APPLE__ scales.emplace(m_scale); #else @@ -71,12 +73,14 @@ wxBitmapBundle* BitmapCache::insert_bndl(const std::string& name, const std::vec scales.emplace(wxDisplay(disp).GetScaleFactor()); #endif +#endif // !__linux__ + for (double scale : scales) { size_t width = 0; size_t height = 0; for (const wxBitmapBundle* bmp_bndl : bmps) { #ifdef __APPLE__ - wxSize size = bmp_bndl->GetPreferredBitmapSizeAtScale(1.0); + wxSize size = bmp_bndl->GetDefaultSize(); #else wxSize size = bmp_bndl->GetPreferredBitmapSizeAtScale(scale); #endif @@ -96,7 +100,7 @@ wxBitmapBundle* BitmapCache::insert_bndl(const std::string& name, const std::vec memset(image.GetAlpha(), 0, width * height); size_t x = 0; for (const wxBitmapBundle* bmp_bndl : bmps) { - wxBitmap bmp = bmp_bndl->GetBitmap(bmp_bndl->GetPreferredBitmapSizeAtScale(scale)); + wxBitmap bmp = bmp_bndl->GetBitmap(bmp_bndl->GetDefaultSize()); if (bmp.GetWidth() > 0) { if (bmp.GetDepth() == 32) { wxAlphaPixelData data(bmp); @@ -136,7 +140,7 @@ wxBitmapBundle* BitmapCache::insert_bndl(const std::string& name, const std::vec } } } - x += bmp.GetWidth(); + x += bmp.GetScaledWidth(); } bitmaps.push_back(* this->insert(bitmap_key, wxImage_to_wxBitmap_with_alpha(std::move(image)))); @@ -154,8 +158,8 @@ wxBitmapBundle* BitmapCache::insert_bndl(const std::string& name, const std::vec if (bmp.GetWidth() > 0) memDC.DrawBitmap(bmp, x, 0, true); -#ifdef __APPLE__ // we should "move" with step equal to non-scaled width +#ifdef __APPLE__ x += bmp.GetScaledWidth(); #else x += bmp.GetWidth(); @@ -260,110 +264,6 @@ wxBitmap* BitmapCache::insert(const std::string &bitmap_key, const wxBitmap &bmp return bitmap; } -wxBitmap* BitmapCache::insert(const std::string &bitmap_key, const wxBitmap &bmp, const wxBitmap &bmp2) -{ - // Copying the wxBitmaps is cheap as the bitmap's content is reference counted. - const wxBitmap bmps[2] = { bmp, bmp2 }; - return this->insert(bitmap_key, bmps, bmps + 2); -} - -wxBitmap* BitmapCache::insert(const std::string &bitmap_key, const wxBitmap &bmp, const wxBitmap &bmp2, const wxBitmap &bmp3) -{ - // Copying the wxBitmaps is cheap as the bitmap's content is reference counted. - const wxBitmap bmps[3] = { bmp, bmp2, bmp3 }; - return this->insert(bitmap_key, bmps, bmps + 3); -} - -wxBitmap* BitmapCache::insert(const std::string &bitmap_key, const wxBitmap *begin, const wxBitmap *end) -{ - size_t width = 0; - size_t height = 0; - for (const wxBitmap *bmp = begin; bmp != end; ++ bmp) { -#ifdef __APPLE__ - width += bmp->GetScaledWidth(); - height = std::max(height, bmp->GetScaledHeight()); -#else - width += bmp->GetWidth(); - height = std::max(height, bmp->GetHeight()); -#endif - } - -#ifdef __WXGTK2__ - // Broken alpha workaround - wxImage image(width, height); - image.InitAlpha(); - // Fill in with a white color. - memset(image.GetData(), 0x0ff, width * height * 3); - // Fill in with full transparency. - memset(image.GetAlpha(), 0, width * height); - size_t x = 0; - for (const wxBitmap *bmp = begin; bmp != end; ++ bmp) { - if (bmp->GetWidth() > 0) { - if (bmp->GetDepth() == 32) { - wxAlphaPixelData data(*const_cast(bmp)); - //FIXME The following method is missing from wxWidgets 3.1.1. - // It looks like the wxWidgets 3.0.3 called the wrapped bitmap's UseAlpha(). - //data.UseAlpha(); - if (data) { - for (int r = 0; r < bmp->GetHeight(); ++ r) { - wxAlphaPixelData::Iterator src(data); - src.Offset(data, 0, r); - unsigned char *dst_pixels = image.GetData() + (x + r * width) * 3; - unsigned char *dst_alpha = image.GetAlpha() + x + r * width; - for (int c = 0; c < bmp->GetWidth(); ++ c, ++ src) { - *dst_pixels ++ = src.Red(); - *dst_pixels ++ = src.Green(); - *dst_pixels ++ = src.Blue(); - *dst_alpha ++ = src.Alpha(); - } - } - } - } else if (bmp->GetDepth() == 24) { - wxNativePixelData data(*const_cast(bmp)); - if (data) { - for (int r = 0; r < bmp->GetHeight(); ++ r) { - wxNativePixelData::Iterator src(data); - src.Offset(data, 0, r); - unsigned char *dst_pixels = image.GetData() + (x + r * width) * 3; - unsigned char *dst_alpha = image.GetAlpha() + x + r * width; - for (int c = 0; c < bmp->GetWidth(); ++ c, ++ src) { - *dst_pixels ++ = src.Red(); - *dst_pixels ++ = src.Green(); - *dst_pixels ++ = src.Blue(); - *dst_alpha ++ = wxALPHA_OPAQUE; - } - } - } - } - } - x += bmp->GetWidth(); - } - return this->insert(bitmap_key, wxImage_to_wxBitmap_with_alpha(std::move(image))); - -#else - - wxBitmap *bitmap = this->insert(bitmap_key, width, height); - wxMemoryDC memDC; - memDC.SelectObject(*bitmap); - memDC.SetBackground(*wxTRANSPARENT_BRUSH); - memDC.Clear(); - size_t x = 0; - for (const wxBitmap *bmp = begin; bmp != end; ++ bmp) { - if (bmp->GetWidth() > 0) - memDC.DrawBitmap(*bmp, x, 0, true); -#ifdef __APPLE__ - // we should "move" with step equal to non-scaled width - x += bmp->GetScaledWidth(); -#else - x += bmp->GetWidth(); -#endif - } - memDC.SelectObject(wxNullBitmap); - return bitmap; - -#endif -} - wxBitmap* BitmapCache::insert_raw_rgba(const std::string &bitmap_key, unsigned width, unsigned height, const unsigned char *raw_data, const bool grayscale/* = false*/) { wxImage image(width, height); @@ -498,7 +398,6 @@ wxBitmapBundle* BitmapCache::from_svg(const std::string& bitmap_name, unsigned t std::string bitmap_key = bitmap_name + (target_height != 0 ? "-h" + std::to_string(target_height) : "-w" + std::to_string(target_width)) -// + (m_scale != 1.0f ? "-s" + float_to_string_decimal_point(m_scale) : "") + (dark_mode ? "-dm" : "") + new_color; @@ -637,9 +536,9 @@ wxBitmap* BitmapCache::load_svg(const std::string &bitmap_name, unsigned target_ return this->insert_raw_rgba(bitmap_key, width, height, data.data(), grayscale); } - +/* //we make scaled solid bitmaps only for the cases, when its will be used with scaled SVG icon in one output bitmap -wxBitmap BitmapCache::mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency, bool suppress_scaling/* = false*/, size_t border_width /*= 0*/, bool dark_mode/* = false*/) +wxBitmap BitmapCache::mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency, bool suppress_scaling/* = false* /, size_t border_width /*= 0* /, bool dark_mode/* = false* /) { double scale = suppress_scaling ? 1.0f : m_scale; width *= scale; @@ -681,13 +580,15 @@ wxBitmap BitmapCache::mksolid(size_t width, size_t height, unsigned char r, unsi return wxImage_to_wxBitmap_with_alpha(std::move(image), scale); } - +*/ //we make scaled solid bitmaps only for the cases, when its will be used with scaled SVG icon in one output bitmap wxBitmapBundle BitmapCache::mksolid(size_t width_in, size_t height_in, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency, size_t border_width /*= 0*/, bool dark_mode/* = false*/) { wxVector bitmaps; std::set scales = { 1.0 }; +#ifndef __linux__ + #ifdef __APPLE__ scales.emplace(m_scale); #else @@ -696,6 +597,8 @@ wxBitmapBundle BitmapCache::mksolid(size_t width_in, size_t height_in, unsigned scales.emplace(wxDisplay(disp).GetScaleFactor()); #endif +#endif // !__linux__ + for (double scale : scales) { size_t width = width_in * scale; size_t height = height_in * scale; @@ -741,7 +644,7 @@ wxBitmapBundle BitmapCache::mksolid(size_t width_in, size_t height_in, unsigned wxBitmapBundle* BitmapCache::mksolid_bndl(size_t width, size_t height, const std::string& color, size_t border_width, bool dark_mode) { - std::string bitmap_key = (color.empty() ? "empty-w" : color) + "-h" + std::to_string(height) + "-w" + std::to_string(width) + (dark_mode ? "-dm" : ""); + std::string bitmap_key = (color.empty() ? "empty" : color) + "-h" + std::to_string(height) + "-w" + std::to_string(width) + (dark_mode ? "-dm" : ""); wxBitmapBundle* bndl = nullptr; auto it = m_bndl_map.find(bitmap_key); diff --git a/src/slic3r/GUI/BitmapCache.hpp b/src/slic3r/GUI/BitmapCache.hpp index 49e9faf007..54062777b4 100644 --- a/src/slic3r/GUI/BitmapCache.hpp +++ b/src/slic3r/GUI/BitmapCache.hpp @@ -36,10 +36,10 @@ public: wxBitmap* insert(const std::string &name, size_t width, size_t height, double scale = -1.0); wxBitmap* insert(const std::string &name, const wxBitmap &bmp); - wxBitmap* insert(const std::string &name, const wxBitmap &bmp, const wxBitmap &bmp2); - wxBitmap* insert(const std::string &name, const wxBitmap &bmp, const wxBitmap &bmp2, const wxBitmap &bmp3); - wxBitmap* insert(const std::string &name, const std::vector &bmps) { return this->insert(name, &bmps.front(), &bmps.front() + bmps.size()); } - wxBitmap* insert(const std::string &name, const wxBitmap *begin, const wxBitmap *end); +// wxBitmap* insert(const std::string &name, const wxBitmap &bmp, const wxBitmap &bmp2); +// wxBitmap* insert(const std::string &name, const wxBitmap &bmp, const wxBitmap &bmp2, const wxBitmap &bmp3); +// wxBitmap* insert(const std::string &name, const std::vector &bmps) { return this->insert(name, &bmps.front(), &bmps.front() + bmps.size()); } +// wxBitmap* insert(const std::string &name, const wxBitmap *begin, const wxBitmap *end); wxBitmap* insert_raw_rgba(const std::string &bitmap_key, unsigned width, unsigned height, const unsigned char *raw_data, const bool grayscale = false); // BBS: support resize by fill border (scale_in_center) @@ -58,10 +58,10 @@ public: // Load svg from resources/icons. bitmap_key is given without the .svg suffix. SVG will be rasterized to provided height/width. wxBitmap* load_svg(const std::string &bitmap_key, unsigned width = 0, unsigned height = 0, const bool grayscale = false, const bool dark_mode = false, const std::string& new_color = "", const float scale_in_center = 0.f); - wxBitmap mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency, bool suppress_scaling = false, size_t border_width = 0, bool dark_mode = false); - wxBitmap mksolid(size_t width, size_t height, const unsigned char rgb[3], bool suppress_scaling = false, size_t border_width = 0, bool dark_mode = false) { return mksolid(width, height, rgb[0], rgb[1], rgb[2], wxALPHA_OPAQUE, suppress_scaling, border_width, dark_mode); } - wxBitmap mksolid(size_t width, size_t height, const ColorRGB& rgb, bool suppress_scaling = false, size_t border_width = 0, bool dark_mode = false) { return mksolid(width, height, rgb.r_uchar(), rgb.g_uchar(), rgb.b_uchar(), wxALPHA_OPAQUE, suppress_scaling, border_width, dark_mode); } - wxBitmap mkclear(size_t width, size_t height) { return mksolid(width, height, 0, 0, 0, wxALPHA_TRANSPARENT, true, 0); } +// wxBitmap mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency, bool suppress_scaling = false, size_t border_width = 0, bool dark_mode = false); +// wxBitmap mksolid(size_t width, size_t height, const unsigned char rgb[3], bool suppress_scaling = false, size_t border_width = 0, bool dark_mode = false) { return mksolid(width, height, rgb[0], rgb[1], rgb[2], wxALPHA_OPAQUE, suppress_scaling, border_width, dark_mode); } +// wxBitmap mksolid(size_t width, size_t height, const ColorRGB& rgb, bool suppress_scaling = false, size_t border_width = 0, bool dark_mode = false) { return mksolid(width, height, rgb.r_uchar(), rgb.g_uchar(), rgb.b_uchar(), wxALPHA_OPAQUE, suppress_scaling, border_width, dark_mode); } +// wxBitmap mkclear(size_t width, size_t height) { return mksolid(width, height, 0, 0, 0, wxALPHA_TRANSPARENT, true, 0); } wxBitmapBundle mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency, size_t border_width = 0, bool dark_mode = false); wxBitmapBundle* mksolid_bndl(size_t width, size_t height, const std::string& color = std::string(), size_t border_width = 0, bool dark_mode = false); wxBitmapBundle* mkclear_bndl(size_t width, size_t height) { return mksolid_bndl(width, height); } diff --git a/src/slic3r/GUI/CaliHistoryDialog.cpp b/src/slic3r/GUI/CaliHistoryDialog.cpp index 520b2d1a3a..e1d0d8e073 100644 --- a/src/slic3r/GUI/CaliHistoryDialog.cpp +++ b/src/slic3r/GUI/CaliHistoryDialog.cpp @@ -26,16 +26,28 @@ static wxString get_preset_name_by_filament_id(std::string filament_id) if (filament_id.compare(it->filament_id) == 0) { auto preset_parent = collection->get_preset_parent(*it); if (preset_parent) { - if (!preset_parent->alias.empty()) - preset_name = from_u8(preset_parent->alias); - else - preset_name = from_u8(preset_parent->name); + if (preset_parent->is_system) { + if (!preset_parent->alias.empty()) + preset_name = from_u8(preset_parent->alias); + else + preset_name = from_u8(preset_parent->name); + } + else { // is custom created filament + std::string name_str = preset_parent->name; + preset_name = from_u8(name_str.substr(0, name_str.find(" @"))); + } } else { - if (!it->alias.empty()) - preset_name = from_u8(it->alias); - else - preset_name = from_u8(it->name); + if (it->is_system) { + if (!it->alias.empty()) + preset_name = from_u8(it->alias); + else + preset_name = from_u8(it->name); + } + else { // is custom created filament + std::string name_str = it->name; + preset_name = from_u8(name_str.substr(0, name_str.find(" @"))); + } } } } diff --git a/src/slic3r/GUI/CalibrationWizardPage.cpp b/src/slic3r/GUI/CalibrationWizardPage.cpp index 38e4235093..648ce0871c 100644 --- a/src/slic3r/GUI/CalibrationWizardPage.cpp +++ b/src/slic3r/GUI/CalibrationWizardPage.cpp @@ -472,12 +472,12 @@ void CaliPageCaption::show_help_icon(bool show) void CaliPageCaption::on_sys_color_changed() { - m_prev_btn->msw_rescale(); + m_prev_btn->sys_color_changed(); } void CaliPageCaption::msw_rescale() { - m_prev_btn->msw_rescale(); + m_prev_btn->sys_color_changed(); } CaliPageStepGuide::CaliPageStepGuide(wxWindow* parent, wxArrayString steps, @@ -611,8 +611,8 @@ PAPageHelpPanel::PAPageHelpPanel(wxWindow* parent, bool ground_panel, wxWindowID void PAPageHelpPanel::msw_rescale() { - m_help_btn->msw_rescale(); - m_bmp.msw_rescale(); + m_help_btn->sys_color_changed(); + m_bmp.sys_color_changed(); m_img->SetBitmap(m_bmp.bmp()); } diff --git a/src/slic3r/GUI/CalibrationWizardPresetPage.cpp b/src/slic3r/GUI/CalibrationWizardPresetPage.cpp index a06631939b..23e611f43b 100644 --- a/src/slic3r/GUI/CalibrationWizardPresetPage.cpp +++ b/src/slic3r/GUI/CalibrationWizardPresetPage.cpp @@ -448,7 +448,7 @@ CalibrationPresetPage::CalibrationPresetPage( void CalibrationPresetPage::msw_rescale() { CalibrationWizardPage::msw_rescale(); - m_ams_sync_button->msw_rescale(); + m_ams_sync_button->sys_color_changed(); m_virtual_tray_comboBox->msw_rescale(); for (auto& comboBox : m_filament_comboBox_list) { comboBox->msw_rescale(); @@ -458,7 +458,7 @@ void CalibrationPresetPage::msw_rescale() void CalibrationPresetPage::on_sys_color_changed() { CalibrationWizardPage::on_sys_color_changed(); - m_ams_sync_button->msw_rescale(); + m_ams_sync_button->sys_color_changed(); } void CalibrationPresetPage::create_selection_panel(wxWindow* parent) @@ -1437,12 +1437,10 @@ void CalibrationPresetPage::on_cali_finished_job() void CalibrationPresetPage::on_cali_cancel_job() { BOOST_LOG_TRIVIAL(info) << "CalibrationWizard::print_job: enter canceled"; - if (CalibUtils::print_job) { - if (CalibUtils::print_job->is_running()) { - BOOST_LOG_TRIVIAL(info) << "calibration_print_job: canceled"; - CalibUtils::print_job->cancel(); - } - CalibUtils::print_job->join(); + if (CalibUtils::print_worker) { + BOOST_LOG_TRIVIAL(info) << "calibration_print_job: canceled"; + CalibUtils::print_worker->cancel_all(); + CalibUtils::print_worker->wait_for_idle(); } m_sending_panel->reset(); diff --git a/src/slic3r/GUI/CalibrationWizardSavePage.cpp b/src/slic3r/GUI/CalibrationWizardSavePage.cpp index 42828fb902..2c8f6c6461 100644 --- a/src/slic3r/GUI/CalibrationWizardSavePage.cpp +++ b/src/slic3r/GUI/CalibrationWizardSavePage.cpp @@ -1396,12 +1396,10 @@ void CalibrationFlowCoarseSavePage::on_cali_finished_job() void CalibrationFlowCoarseSavePage::on_cali_cancel_job() { BOOST_LOG_TRIVIAL(info) << "CalibrationWizard::print_job: enter canceled"; - if (CalibUtils::print_job) { - if (CalibUtils::print_job->is_running()) { - BOOST_LOG_TRIVIAL(info) << "calibration_print_job: canceled"; - CalibUtils::print_job->cancel(); - } - CalibUtils::print_job->join(); + if (CalibUtils::print_worker) { + BOOST_LOG_TRIVIAL(info) << "calibration_print_job: canceled"; + CalibUtils::print_worker->cancel_all(); + CalibUtils::print_worker->wait_for_idle(); } m_sending_panel->reset(); diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index 9964b37df9..bb0ced4406 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -505,6 +505,8 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, co toggle_field("infill_anchor", has_infill_anchors); bool has_spiral_vase = config->opt_bool("spiral_mode"); + toggle_line("spiral_mode_smooth", has_spiral_vase); + toggle_line("spiral_mode_max_xy_smoothing", config->opt_bool("spiral_mode_smooth")); bool has_top_solid_infill = config->opt_int("top_shell_layers") > 0; bool has_bottom_solid_infill = config->opt_int("bottom_shell_layers") > 0; bool has_solid_infill = has_top_solid_infill || has_bottom_solid_infill; diff --git a/src/slic3r/GUI/CreatePresetsDialog.cpp b/src/slic3r/GUI/CreatePresetsDialog.cpp index bc545e2a3f..611602acc5 100644 --- a/src/slic3r/GUI/CreatePresetsDialog.cpp +++ b/src/slic3r/GUI/CreatePresetsDialog.cpp @@ -121,6 +121,13 @@ static std::string remove_special_key(const std::string &str) return res_str; } +static bool str_is_all_digit(const std::string &str) { + for (const char &c : str) { + if (!std::isdigit(c)) return false; + } + return true; +} + static bool delete_filament_preset_by_name(std::string delete_preset_name, std::string &selected_preset_name) { BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format("select preset, name %1%") % delete_preset_name; @@ -451,6 +458,7 @@ static std::string get_filament_id(std::string vendor_typr_serial) user_filament_id = "P" + calculate_md5(vendor_typr_serial + get_curr_time()).substr(0, 7); } } + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " filament name is: " << vendor_typr_serial << "and create filament id is: " << user_filament_id; return user_filament_id; } @@ -979,8 +987,8 @@ wxBoxSizer *CreateFilamentPresetDialog::create_button_item() dlg.ShowModal(); return; } - if (m_can_not_find_vendor_checkbox->GetValue() && vendor_name[0] >= '0' && vendor_name[0] <= '9') { - MessageDialog dlg(this, _L("The beginning of the vendor can not be a number. Please re-enter."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), + if (m_can_not_find_vendor_checkbox->GetValue() && str_is_all_digit(vendor_name)) { + MessageDialog dlg(this, _L("The vendor can not be a number. Please re-enter."), wxString(SLIC3R_APP_FULL_NAME) + " - " + _L("Info"), wxYES | wxYES_DEFAULT | wxCENTRE); dlg.ShowModal(); return; @@ -1483,8 +1491,8 @@ wxBoxSizer *CreatePrinterPresetDialog::create_step_switch_item() horizontal_sizer->Add(divider_line, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, FromDIP(3)); m_step_2 = new wxStaticBitmap(step_switch_panel, wxID_ANY, create_scaled_bitmap("step_2_ready", nullptr, FromDIP(20)), wxDefaultPosition, wxDefaultSize); horizontal_sizer->Add(m_step_2, 0, wxEXPAND | wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, FromDIP(3)); - wxStaticText *static_improt_presets_text = new wxStaticText(step_switch_panel, wxID_ANY, _L("Improt Preset"), wxDefaultPosition, wxDefaultSize); - horizontal_sizer->Add(static_improt_presets_text, 0, wxEXPAND | wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, FromDIP(3)); + wxStaticText *static_import_presets_text = new wxStaticText(step_switch_panel, wxID_ANY, _L("Import Preset"), wxDefaultPosition, wxDefaultSize); + horizontal_sizer->Add(static_import_presets_text, 0, wxEXPAND | wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, FromDIP(3)); horizontal_sizer->Add(0, 0, 1, wxEXPAND, 0); step_switch_panel->SetSizer(horizontal_sizer); @@ -4990,4 +4998,4 @@ void PresetTree::edit_preset(std::string printer_name, int need_edit_preset_inde } // namespace GUI -} // namespace Slic3r \ No newline at end of file +} // namespace Slic3r diff --git a/src/slic3r/GUI/DailyTips.cpp b/src/slic3r/GUI/DailyTips.cpp index 9558a863ba..2e5b99e8b2 100644 --- a/src/slic3r/GUI/DailyTips.cpp +++ b/src/slic3r/GUI/DailyTips.cpp @@ -98,16 +98,24 @@ void DailyTipsDataRenderer::render(const ImVec2& pos, const ImVec2& size) const ImGui::SetNextWindowPos(pos); if (ImGui::BeginChild(name.c_str(), size, false, window_flags)) { if (m_layout == DailyTipsLayout::Vertical) { - ImVec2 img_size = ImVec2(size.x, 9.0f / 16.0f * size.x); - render_img({ 0, 0 }, img_size); - float img_text_gap = ImGui::CalcTextSize("A").y; + ImVec2 img_size(0, 0); + float img_text_gap = 0.0f; + if (has_image()) { + img_size = ImVec2(size.x, 9.0f / 16.0f * size.x); + render_img({0, 0}, img_size); + img_text_gap = ImGui::CalcTextSize("A").y; + } render_text({ 0, img_size.y + img_text_gap }, size); } if (m_layout == DailyTipsLayout::Horizontal) { - ImVec2 img_size = ImVec2(16.0f / 9.0f * size.y, size.y); - render_img({ 0, 0 }, img_size); - float img_text_gap = ImGui::CalcTextSize("A").y; - render_text({ img_size.x + img_text_gap, 0 }, { size.x - img_size.x - img_text_gap, size.y }); + ImVec2 img_size(0, 0); + float img_text_gap = 0.0f; + if (has_image()) { + img_size = ImVec2(16.0f / 9.0f * size.y, size.y); + render_img({0, 0}, img_size); + img_text_gap = ImGui::CalcTextSize("A").y; + } + render_text({img_size.x + img_text_gap, 0}, {size.x - img_size.x - img_text_gap, size.y}); } } ImGui::EndChild(); @@ -132,9 +140,9 @@ void DailyTipsDataRenderer::render_img(const ImVec2& start_pos, const ImVec2& si { if (has_image()) ImGui::Image((ImTextureID)(intptr_t)m_texture->get_id(), size, ImVec2(0, 0), ImVec2(1, 1), m_is_dark ? ImVec4(0.8, 0.8, 0.8, m_fade_opacity) : ImVec4(1, 1, 1, m_fade_opacity)); - else { - ImGui::Image((ImTextureID)(intptr_t)m_placeholder_texture->get_id(), size, ImVec2(0, 0), ImVec2(1, 1), m_is_dark ? ImVec4(0.8, 0.8, 0.8, m_fade_opacity) : ImVec4(1, 1, 1, m_fade_opacity)); - } + // else { + // ImGui::Image((ImTextureID)(intptr_t)m_placeholder_texture->get_id(), size, ImVec2(0, 0), ImVec2(1, 1), m_is_dark ? ImVec4(0.8, 0.8, 0.8, m_fade_opacity) : ImVec4(1, 1, 1, m_fade_opacity)); + // } } void DailyTipsDataRenderer::render_text(const ImVec2& start_pos, const ImVec2& size) const @@ -228,7 +236,7 @@ DailyTipsPanel::DailyTipsPanel(bool can_expand, DailyTipsLayout layout) { ImGuiWrapper& imgui = *wxGetApp().imgui(); float scale = imgui.get_font_size() / 15.0f; - m_footer_height = 58.0f * scale; + m_footer_height = 30.0f * scale; m_is_expanded = wxGetApp().app_config->get("show_hints") == "true"; } diff --git a/src/slic3r/GUI/DeviceManager.cpp b/src/slic3r/GUI/DeviceManager.cpp index 6aff1dff5c..b3e9ea27ef 100644 --- a/src/slic3r/GUI/DeviceManager.cpp +++ b/src/slic3r/GUI/DeviceManager.cpp @@ -1376,6 +1376,10 @@ void MachineObject::parse_status(int flag) if(!is_support_motor_noise_cali){ is_support_motor_noise_cali = ((flag >> 21) & 0x1) != 0; } + + if (!is_support_p1s_plus) { + is_support_p1s_plus = ((flag >> 27) & 0x1) != 0; + } sdcard_state = MachineObject::SdcardState((flag >> 8) & 0x11); @@ -2732,6 +2736,8 @@ int MachineObject::parse_json(std::string payload) ver_info.sn = (*it)["sn"].get(); if ((*it).contains("hw_ver")) ver_info.hw_ver = (*it)["hw_ver"].get(); + if((*it).contains("flag")) + ver_info.firmware_status= (*it)["flag"].get(); module_vers.emplace(ver_info.name, ver_info); if (ver_info.name == "ota") { NetworkAgent* agent = GUI::wxGetApp().getAgent(); diff --git a/src/slic3r/GUI/DeviceManager.hpp b/src/slic3r/GUI/DeviceManager.hpp index 9a57ed0276..37bdb73764 100644 --- a/src/slic3r/GUI/DeviceManager.hpp +++ b/src/slic3r/GUI/DeviceManager.hpp @@ -363,6 +363,10 @@ public: std::string hw_ver; std::string sw_ver; std::string sw_new_ver; + int firmware_status; + ModuleVersionInfo() :firmware_status(0) { + + }; }; enum SdcardState { @@ -739,6 +743,7 @@ public: bool is_support_motor_noise_cali{false}; bool is_support_wait_sending_finish{false}; bool is_support_user_preset{false}; + bool is_support_p1s_plus{false}; int nozzle_max_temperature = -1; int bed_temperature_limit = -1; diff --git a/src/slic3r/GUI/DownloadProgressDialog.cpp b/src/slic3r/GUI/DownloadProgressDialog.cpp index 4a80a38cb4..542db08561 100644 --- a/src/slic3r/GUI/DownloadProgressDialog.cpp +++ b/src/slic3r/GUI/DownloadProgressDialog.cpp @@ -20,6 +20,8 @@ #include "wxExtensions.hpp" #include "slic3r/GUI/MainFrame.hpp" #include "GUI_App.hpp" +#include "Jobs/BoostThreadWorker.hpp" +#include "Jobs/PlaterWorker.hpp" #define DESIGN_INPUT_SIZE wxSize(FromDIP(100), -1) @@ -59,7 +61,8 @@ DownloadProgressDialog::DownloadProgressDialog(wxString title) m_panel_download->SetSize(wxSize(FromDIP(400), FromDIP(70))); m_panel_download->SetMinSize(wxSize(FromDIP(400), FromDIP(70))); m_panel_download->SetMaxSize(wxSize(FromDIP(400), FromDIP(70))); - + + m_worker = std::make_unique>(this, m_status_bar, "download_worker"); //mode Download Failed auto m_panel_download_failed = new wxPanel(m_simplebook_status, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); @@ -144,7 +147,7 @@ bool DownloadProgressDialog::Show(bool show) { if (show) { m_simplebook_status->SetSelection(0); - m_upgrade_job = make_job(m_status_bar); + auto m_upgrade_job = make_job(); m_upgrade_job->set_event_handle(this); m_status_bar->set_progress(0); Bind(EVT_UPGRADE_NETWORK_SUCCESS, [this](wxCommandEvent& evt) { @@ -182,23 +185,17 @@ bool DownloadProgressDialog::Show(bool show) }); m_status_bar->set_cancel_callback_fina([this]() { - if (m_upgrade_job) { - m_upgrade_job->cancel(); - //EndModal(wxID_CLOSE); - } - + m_worker->cancel_all(); }); - m_upgrade_job->start(); + + replace_job(*m_worker, std::move(m_upgrade_job)); } return DPIDialog::Show(show); } void DownloadProgressDialog::on_close(wxCloseEvent& event) { - if (m_upgrade_job) { - m_upgrade_job->cancel(); - m_upgrade_job->join(); - } + m_worker.get()->cancel_all(); event.Skip(); } @@ -208,7 +205,7 @@ void DownloadProgressDialog::on_dpi_changed(const wxRect &suggested_rect) {} void DownloadProgressDialog::update_release_note(std::string release_note, std::string version) {} -std::shared_ptr DownloadProgressDialog::make_job(std::shared_ptr pri) { return std::make_shared(pri); } +std::unique_ptr DownloadProgressDialog::make_job() { return std::make_unique(); } void DownloadProgressDialog::on_finish() { wxGetApp().restart_networking(); } diff --git a/src/slic3r/GUI/DownloadProgressDialog.hpp b/src/slic3r/GUI/DownloadProgressDialog.hpp index 938d2706a6..fa23be5245 100644 --- a/src/slic3r/GUI/DownloadProgressDialog.hpp +++ b/src/slic3r/GUI/DownloadProgressDialog.hpp @@ -16,6 +16,7 @@ #include "Widgets/Button.hpp" #include "BBLStatusBar.hpp" #include "BBLStatusBarSend.hpp" +#include "Jobs/Worker.hpp" #include "Jobs/UpgradeNetworkJob.hpp" class wxBoxSizer; @@ -47,11 +48,11 @@ public: wxSimplebook* m_simplebook_status{nullptr}; std::shared_ptr m_status_bar; - std::shared_ptr m_upgrade_job { nullptr }; + std::unique_ptr m_worker; wxPanel * m_panel_download; protected: - virtual std::shared_ptr make_job(std::shared_ptr pri); + virtual std::unique_ptr make_job(); virtual void on_finish(); }; diff --git a/src/slic3r/GUI/ExtraRenderers.cpp b/src/slic3r/GUI/ExtraRenderers.cpp index c4e4d47cb0..5c74a5e0ad 100644 --- a/src/slic3r/GUI/ExtraRenderers.cpp +++ b/src/slic3r/GUI/ExtraRenderers.cpp @@ -33,6 +33,15 @@ wxIMPLEMENT_DYNAMIC_CLASS(DataViewBitmapText, wxObject) IMPLEMENT_VARIANT_OBJECT(DataViewBitmapText) +static wxSize get_size(const wxBitmap& icon) +{ +#ifdef __WIN32__ + return icon.GetSize(); +#else + return icon.GetScaledSize(); +#endif +} + // --------------------------------------------------------- // BitmapTextRenderer // --------------------------------------------------------- @@ -124,11 +133,7 @@ bool BitmapTextRenderer::Render(wxRect rect, wxDC *dc, int state) const wxBitmap& icon = m_value.GetBitmap(); if (icon.IsOk()) { -#ifdef __APPLE__ - wxSize icon_sz = icon.GetScaledSize(); -#else - wxSize icon_sz = icon.GetSize(); -#endif + wxSize icon_sz = get_size(icon); dc->DrawBitmap(icon, rect.x, rect.y + (rect.height - icon_sz.y) / 2); xoffset = icon_sz.x + 4; } @@ -270,11 +275,12 @@ bool BitmapChoiceRenderer::Render(wxRect rect, wxDC* dc, int state) const wxBitmap& icon = m_value.GetBitmap(); if (icon.IsOk()) { - dc->DrawBitmap(icon, rect.x, rect.y + (rect.height - icon.GetHeight()) / 2); -// xoffset = icon.GetWidth() + 4; + wxSize icon_sz = get_size(icon); + dc->DrawBitmap(icon, rect.x, rect.y + (rect.height - icon_sz.GetHeight()) / 2); +// xoffset = icon_sz.GetWidth() + 4; if (rect.height == 0) - rect.height = icon.GetHeight(); + rect.height = icon_sz.GetHeight(); } #ifdef _WIN32 diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index aedc729bc0..1e607bd5f1 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -361,7 +361,7 @@ void GCodeViewer::SequentialView::Marker::render(int canvas_width, int canvas_he std::string layer_time = ImGui::ColorMarkerStart + _u8L("Layer Time: ") + ImGui::ColorMarkerEnd; std::string fanspeed = ImGui::ColorMarkerStart + _u8L("Fan: ") + ImGui::ColorMarkerEnd; std::string temperature = ImGui::ColorMarkerStart + _u8L("Temperature: ") + ImGui::ColorMarkerEnd; - const float item_size = imgui.calc_text_size("X: 000.000 ").x; + const float item_size = imgui.calc_text_size(std::string_view{"X: 000.000 "}).x; const float item_spacing = imgui.get_item_spacing().x; const float window_padding = ImGui::GetStyle().WindowPadding.x; @@ -1242,11 +1242,12 @@ void GCodeViewer::render(int canvas_width, int canvas_height, int right_margin) m_statistics.total_instances_gpu_size = 0; #endif // ENABLE_GCODE_VIEWER_STATISTICS + glsafe(::glEnable(GL_DEPTH_TEST)); + render_shells(); + if (m_roles.empty()) return; - glsafe(::glEnable(GL_DEPTH_TEST)); - render_shells(); render_toolpaths(); float legend_height = 0.0f; render_legend(legend_height, canvas_width, canvas_height, right_margin); diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 25a142b106..078625ccfd 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1588,7 +1588,6 @@ void GLCanvas3D::enable_legend_texture(bool enable) void GLCanvas3D::enable_picking(bool enable) { m_picking_enabled = enable; - m_selection.set_mode(Selection::Instance); } void GLCanvas3D::enable_moving(bool enable) @@ -1717,18 +1716,26 @@ void GLCanvas3D::update_volumes_colors_by_extruder() m_volumes.update_colors_by_extruder(m_config); } -float GLCanvas3D::get_collapse_toolbar_width() +bool GLCanvas3D::is_collapse_toolbar_on_left() const { - GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar(); - - return collapse_toolbar.is_enabled() ? collapse_toolbar.get_width() : 0; + auto state = wxGetApp().plater()->get_sidebar_docking_state(); + return state == Sidebar::Left; } -float GLCanvas3D::get_collapse_toolbar_height() +float GLCanvas3D::get_collapse_toolbar_width() const { GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar(); + const auto state = wxGetApp().plater()->get_sidebar_docking_state(); - return collapse_toolbar.is_enabled() ? collapse_toolbar.get_height() : 0; + return state != Sidebar::None ? collapse_toolbar.get_width() : 0; +} + +float GLCanvas3D::get_collapse_toolbar_height() const +{ + GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar(); + const auto state = wxGetApp().plater()->get_sidebar_docking_state(); + + return state != Sidebar::None ? collapse_toolbar.get_height() : 0; } bool GLCanvas3D::make_current_for_postinit() { @@ -2163,7 +2170,17 @@ std::vector GLCanvas3D::load_object(const Model& model, int obj_idx) void GLCanvas3D::mirror_selection(Axis axis) { - m_selection.mirror(axis); + TransformationType transformation_type; + if (wxGetApp().obj_manipul()->is_local_coordinates()) + transformation_type.set_local(); + else if (wxGetApp().obj_manipul()->is_instance_coordinates()) + transformation_type.set_instance(); + + transformation_type.set_relative(); + + m_selection.setup_cache(); + m_selection.mirror(axis, transformation_type); + do_mirror(L("Mirror Object")); // BBS //wxGetApp().obj_manipul()->set_dirty(); @@ -3356,7 +3373,9 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) else displacement = multiplier * direction; - m_selection.translate(displacement); + TransformationType trafo_type; + trafo_type.set_relative(); + m_selection.translate(displacement, trafo_type); m_dirty = true; } );} @@ -3492,10 +3511,7 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) } else if (keyCode == WXK_CONTROL) m_dirty = true; - else if (keyCode == WXK_TAB && evt.ShiftDown() && !evt.ControlDown() && !wxGetApp().is_gcode_viewer()) { - // Collapse side-panel with Shift+Tab - post_event(SimpleEvent(EVT_GLCANVAS_COLLAPSE_SIDEBAR)); - } else if (m_gizmos.is_enabled() && !m_selection.is_empty() && m_canvas_type != CanvasAssembleView) { + else if (m_gizmos.is_enabled() && !m_selection.is_empty() && m_canvas_type != CanvasAssembleView) { auto _do_rotate = [this](double angle_z_rad) { m_selection.setup_cache(); m_selection.rotate(Vec3d(0.0, 0.0, angle_z_rad), TransformationType(TransformationType::World_Relative_Joint)); @@ -4131,7 +4147,9 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) } } - m_selection.translate(cur_pos - m_mouse.drag.start_position_3D); + TransformationType trafo_type; + trafo_type.set_relative(); + m_selection.translate(cur_pos - m_mouse.drag.start_position_3D, trafo_type); if (current_printer_technology() == ptFFF && (fff_print()->config().print_sequence == PrintSequence::ByObject)) update_sequential_clearance(); // BBS @@ -4359,6 +4377,40 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) else evt.Skip(); + // Detection of doubleclick on text to open emboss edit window + auto type = m_gizmos.get_current_type(); + if (evt.LeftDClick() && !m_hover_volume_idxs.empty() && + (type == GLGizmosManager::EType::Undefined || + type == GLGizmosManager::EType::Move || + type == GLGizmosManager::EType::Rotate || + type == GLGizmosManager::EType::Scale || + type == GLGizmosManager::EType::Emboss || + type == GLGizmosManager::EType::Svg) ) { + for (int hover_volume_id : m_hover_volume_idxs) { + const GLVolume &hover_gl_volume = *m_volumes.volumes[hover_volume_id]; + int object_idx = hover_gl_volume.object_idx(); + if (object_idx < 0 || static_cast(object_idx) >= m_model->objects.size()) continue; + const ModelObject* hover_object = m_model->objects[object_idx]; + int hover_volume_idx = hover_gl_volume.volume_idx(); + if (hover_volume_idx < 0 || static_cast(hover_volume_idx) >= hover_object->volumes.size()) continue; + const ModelVolume* hover_volume = hover_object->volumes[hover_volume_idx]; + + if (hover_volume->text_configuration.has_value()) { + m_selection.add_volumes(Selection::EMode::Volume, {(unsigned) hover_volume_id}); + if (type != GLGizmosManager::EType::Emboss) + m_gizmos.open_gizmo(GLGizmosManager::EType::Emboss); + wxGetApp().obj_list()->update_selections(); + return; + } else if (hover_volume->emboss_shape.has_value()) { + m_selection.add_volumes(Selection::EMode::Volume, {(unsigned) hover_volume_id}); + if (type != GLGizmosManager::EType::Svg) + m_gizmos.open_gizmo(GLGizmosManager::EType::Svg); + wxGetApp().obj_list()->update_selections(); + return; + } + } + } + if (m_moving) show_sinking_contours(); @@ -4455,6 +4507,9 @@ void GLCanvas3D::do_move(const std::string& snapshot_type) int instance_idx = v->instance_idx(); int volume_idx = v->volume_idx(); + if (volume_idx < 0) + continue; + std::pair done_id(object_idx, instance_idx); if (0 <= object_idx && object_idx < (int)m_model->objects.size()) { @@ -4464,10 +4519,10 @@ void GLCanvas3D::do_move(const std::string& snapshot_type) ModelObject* model_object = m_model->objects[object_idx]; if (model_object != nullptr) { if (selection_mode == Selection::Instance) - model_object->instances[instance_idx]->set_offset(v->get_instance_offset()); + model_object->instances[instance_idx]->set_transformation(v->get_instance_transformation()); else if (selection_mode == Selection::Volume) { - if (model_object->volumes[volume_idx]->get_offset() != v->get_volume_offset()) { - model_object->volumes[volume_idx]->set_offset(v->get_volume_offset()); + if (model_object->volumes[volume_idx]->get_transformation() != v->get_volume_transformation()) { + model_object->volumes[volume_idx]->set_transformation(v->get_volume_transformation()); // BBS: backup Slic3r::save_object_mesh(*model_object); } @@ -4559,26 +4614,26 @@ void GLCanvas3D::do_rotate(const std::string& snapshot_type) Selection::EMode selection_mode = m_selection.get_mode(); for (const GLVolume* v : m_volumes.volumes) { - int object_idx = v->object_idx(); + const int object_idx = v->object_idx(); if (object_idx < 0 || (int)m_model->objects.size() <= object_idx) continue; - int instance_idx = v->instance_idx(); - int volume_idx = v->volume_idx(); + const int instance_idx = v->instance_idx(); + const int volume_idx = v->volume_idx(); + + if (volume_idx < 0) + continue; done.insert(std::pair(object_idx, instance_idx)); // Rotate instances/volumes. ModelObject* model_object = m_model->objects[object_idx]; if (model_object != nullptr) { - if (selection_mode == Selection::Instance) { - model_object->instances[instance_idx]->set_rotation(v->get_instance_rotation()); - model_object->instances[instance_idx]->set_offset(v->get_instance_offset()); - } + if (selection_mode == Selection::Instance) + model_object->instances[instance_idx]->set_transformation(v->get_instance_transformation()); else if (selection_mode == Selection::Volume) { - if (model_object->volumes[volume_idx]->get_rotation() != v->get_volume_rotation()) { - model_object->volumes[volume_idx]->set_rotation(v->get_volume_rotation()); - model_object->volumes[volume_idx]->set_offset(v->get_volume_offset()); + if (model_object->volumes[volume_idx]->get_transformation() != v->get_volume_transformation()) { + model_object->volumes[volume_idx]->set_transformation(v->get_volume_transformation()); // BBS: backup Slic3r::save_object_mesh(*model_object); } @@ -4640,27 +4695,27 @@ void GLCanvas3D::do_scale(const std::string& snapshot_type) Selection::EMode selection_mode = m_selection.get_mode(); for (const GLVolume* v : m_volumes.volumes) { - int object_idx = v->object_idx(); + const int object_idx = v->object_idx(); if (object_idx < 0 || (int)m_model->objects.size() <= object_idx) continue; - int instance_idx = v->instance_idx(); - int volume_idx = v->volume_idx(); + const int instance_idx = v->instance_idx(); + const int volume_idx = v->volume_idx(); + + if (volume_idx < 0) + continue; done.insert(std::pair(object_idx, instance_idx)); // Rotate instances/volumes ModelObject* model_object = m_model->objects[object_idx]; if (model_object != nullptr) { - if (selection_mode == Selection::Instance) { - model_object->instances[instance_idx]->set_scaling_factor(v->get_instance_scaling_factor()); - model_object->instances[instance_idx]->set_offset(v->get_instance_offset()); - } + if (selection_mode == Selection::Instance) + model_object->instances[instance_idx]->set_transformation(v->get_instance_transformation()); else if (selection_mode == Selection::Volume) { - if (model_object->volumes[volume_idx]->get_scaling_factor() != v->get_volume_scaling_factor()) { - model_object->instances[instance_idx]->set_offset(v->get_instance_offset()); - model_object->volumes[volume_idx]->set_scaling_factor(v->get_volume_scaling_factor()); - model_object->volumes[volume_idx]->set_offset(v->get_volume_offset()); + if (model_object->volumes[volume_idx]->get_transformation() != v->get_volume_transformation()) { + model_object->instances[instance_idx]->set_transformation(v->get_instance_transformation()); + model_object->volumes[volume_idx]->set_transformation(v->get_volume_transformation()); // BBS: backup Slic3r::save_object_mesh(*model_object); } @@ -4751,10 +4806,10 @@ void GLCanvas3D::do_mirror(const std::string& snapshot_type) ModelObject* model_object = m_model->objects[object_idx]; if (model_object != nullptr) { if (selection_mode == Selection::Instance) - model_object->instances[instance_idx]->set_mirror(v->get_instance_mirror()); + model_object->instances[instance_idx]->set_transformation(v->get_instance_transformation()); else if (selection_mode == Selection::Volume) { - if (model_object->volumes[volume_idx]->get_mirror() != v->get_volume_mirror()) { - model_object->volumes[volume_idx]->set_mirror(v->get_volume_mirror()); + if (model_object->volumes[volume_idx]->get_transformation() != v->get_volume_transformation()) { + model_object->volumes[volume_idx]->set_transformation(v->get_volume_transformation()); // BBS: backup Slic3r::save_object_mesh(*model_object); } @@ -4844,11 +4899,6 @@ void GLCanvas3D::update_ui_from_settings() _refresh_if_shown_on_screen(); } #endif // ENABLE_RETINA_GL - -#ifdef SUPPORT_COLLAPSE_BUTTON - if (wxGetApp().is_editor()) - wxGetApp().plater()->enable_collapse_toolbar(wxGetApp().app_config->get("show_collapse_button") == "1"); -#endif } // BBS: add partplate logic @@ -5210,6 +5260,14 @@ bool GLCanvas3D::is_object_sinking(int object_idx) const return false; } +void GLCanvas3D::apply_retina_scale(Vec2d &screen_coordinate) const +{ +#if ENABLE_RETINA_GL + double scale = static_cast(m_retina_helper->get_scale_factor()); + screen_coordinate *= scale; +#endif // ENABLE_RETINA_GL +} + bool GLCanvas3D::_is_shown_on_screen() const { return (m_canvas != nullptr) ? m_canvas->IsShownOnScreen() : false; @@ -5559,12 +5617,12 @@ void GLCanvas3D::render_thumbnail_internal(ThumbnailData& thumbnail_data, const double width = volumes_box.max.x() - volumes_box.min.x(); double depth = volumes_box.max.y() - volumes_box.min.y(); double height = volumes_box.max.z() - volumes_box.min.z(); - volumes_box.max.x() = volumes_box.max.x() + width * 0.1f; - volumes_box.min.x() = volumes_box.min.x() - width * 0.1f; - volumes_box.max.y() = volumes_box.max.y() + depth * 0.1f; - volumes_box.min.y() = volumes_box.min.y() - depth * 0.1f; - volumes_box.max.z() = volumes_box.max.z() + height * 0.1f; - volumes_box.min.z() = volumes_box.min.z() - height * 0.1f; + volumes_box.max.x() = volumes_box.max.x() + width * 0.01f; + volumes_box.min.x() = volumes_box.min.x() - width * 0.01f; + volumes_box.max.y() = volumes_box.max.y() + depth * 0.01f; + volumes_box.min.y() = volumes_box.min.y() - depth * 0.01f; + volumes_box.max.z() = volumes_box.max.z() + height * 0.01f; + volumes_box.min.z() = volumes_box.min.z() - height * 0.01f; Camera camera; camera.set_type(camera_type); @@ -5593,8 +5651,8 @@ void GLCanvas3D::render_thumbnail_internal(ThumbnailData& thumbnail_data, const //camera.select_view("top"); } else { - camera.zoom_to_box(volumes_box); camera.select_view("iso"); + camera.zoom_to_box(volumes_box); } const Transform3d &view_matrix = camera.get_view_matrix(); @@ -7109,6 +7167,10 @@ void GLCanvas3D::_render_selection_center() void GLCanvas3D::_check_and_update_toolbar_icon_scale() { + // Update collapse toolbar + GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar(); + collapse_toolbar.set_enabled(wxGetApp().plater()->get_sidebar_docking_state() != Sidebar::None); + // Don't update a toolbar scale, when we are on a Preview if (wxGetApp().plater()->is_preview_shown()) { IMSlider *m_layers_slider = get_gcode_viewer().get_layers_slider(); @@ -7136,31 +7198,32 @@ void GLCanvas3D::_check_and_update_toolbar_icon_scale() //float main_size = GLGizmosManager::Default_Icons_Size * scale; // Set current size for all top toolbars. It will be used for next calculations - GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar(); #if ENABLE_RETINA_GL const float sc = m_retina_helper->get_scale_factor() * scale; //BBS: GUI refactor: GLToolbar m_main_toolbar.set_scale(sc); m_assemble_view_toolbar.set_scale(sc); m_separator_toolbar.set_scale(sc); - collapse_toolbar.set_scale(sc); + collapse_toolbar.set_scale(sc / 2.0); size *= m_retina_helper->get_scale_factor(); auto* m_notification = wxGetApp().plater()->get_notification_manager(); m_notification->set_scale(sc); + m_gizmos.set_overlay_scale(sc); #else //BBS: GUI refactor: GLToolbar m_main_toolbar.set_icons_size(GLGizmosManager::Default_Icons_Size * scale); m_assemble_view_toolbar.set_icons_size(size); m_separator_toolbar.set_icons_size(size); - collapse_toolbar.set_icons_size(size); + collapse_toolbar.set_icons_size(size / 2.0); + m_gizmos.set_overlay_icon_size(size); #endif // ENABLE_RETINA_GL //BBS: GUI refactor: GLToolbar #if BBS_TOOLBAR_ON_TOP - float collapse_toolbar_width = collapse_toolbar.is_enabled() ? collapse_toolbar.get_width() : GLToolbar::Default_Icons_Size; + float collapse_toolbar_width = collapse_toolbar.is_enabled() ? collapse_toolbar.get_width() : 0; - float top_tb_width = m_main_toolbar.get_width() + m_gizmos.get_scaled_total_width() + m_assemble_view_toolbar.get_width() + m_separator_toolbar.get_width() + collapse_toolbar_width; + float top_tb_width = m_main_toolbar.get_width() + m_gizmos.get_scaled_total_width() + m_assemble_view_toolbar.get_width() + m_separator_toolbar.get_width() + collapse_toolbar_width * 2; int items_cnt = m_main_toolbar.get_visible_items_cnt() + m_gizmos.get_selectable_icons_cnt() + m_assemble_view_toolbar.get_visible_items_cnt() + m_separator_toolbar.get_visible_items_cnt() + collapse_toolbar.get_visible_items_cnt(); float noitems_width = top_tb_width - size * items_cnt; // width of separators and borders in top toolbars @@ -7207,31 +7270,6 @@ void GLCanvas3D::_render_overlays() _render_assemble_control(); _render_assemble_info(); - // main toolbar and undoredo toolbar need to be both updated before rendering because both their sizes are needed - // to correctly place them -#if ENABLE_RETINA_GL - const float scale = m_retina_helper->get_scale_factor() * wxGetApp().toolbar_icon_scale(/*true*/); - //BBS: GUI refactor: GLToolbar - m_main_toolbar.set_scale(scale); - m_assemble_view_toolbar.set_scale(scale); - m_separator_toolbar.set_scale(scale); - wxGetApp().plater()->get_collapse_toolbar().set_scale(scale); - m_gizmos.set_overlay_scale(scale); -#else - // BBS adjust display scale - const float size = int(GLToolbar::Default_Icons_Size * wxGetApp().toolbar_icon_scale(/*true*/)); - const float gizmo_size = int(GLGizmosManager::Default_Icons_Size * wxGetApp().toolbar_icon_scale()); - //const float size = int(GLToolbar::Default_Icons_Size); - //const float gizmo_size = int(GLGizmosManager::Default_Icons_Size); - - //BBS: GUI refactor: GLToolbar - m_main_toolbar.set_icons_size(gizmo_size); - m_assemble_view_toolbar.set_icons_size(gizmo_size); - m_separator_toolbar.set_icons_size(gizmo_size); - wxGetApp().plater()->get_collapse_toolbar().set_icons_size(size); - m_gizmos.set_overlay_icon_size(gizmo_size); -#endif // ENABLE_RETINA_GL - _render_separator_toolbar_right(); _render_separator_toolbar_left(); _render_main_toolbar(); @@ -7433,6 +7471,23 @@ void GLCanvas3D::_render_gizmos_overlay() } } +float GLCanvas3D::get_main_toolbar_offset() const +{ + const float cnv_width = get_canvas_size().get_width(); + const float collapse_toolbar_width = get_collapse_toolbar_width() * 2; + const float gizmo_width = m_gizmos.get_scaled_total_width(); + const float assemble_width = m_assemble_view_toolbar.get_width(); + const float separator_width = m_separator_toolbar.get_width(); + const float toolbar_total_width = m_main_toolbar.get_width() + separator_width + gizmo_width + assemble_width + collapse_toolbar_width; + + if (cnv_width < toolbar_total_width) { + return is_collapse_toolbar_on_left() ? collapse_toolbar_width : 0; + } else { + const float offset = (cnv_width - toolbar_total_width) / 2; + return is_collapse_toolbar_on_left() ? offset + collapse_toolbar_width : offset; + } +} + //BBS: GUI refactor: GLToolbar adjust //when rendering, {0, 0} is at the center, left-up is -0.5, 0.5, right-up is 0.5, -0.5 void GLCanvas3D::_render_main_toolbar() @@ -7443,12 +7498,7 @@ void GLCanvas3D::_render_main_toolbar() const Size cnv_size = get_canvas_size(); const float top = 0.5f * (float)cnv_size.get_height(); - GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar(); - const float collapse_toolbar_width = collapse_toolbar.is_enabled() ? collapse_toolbar.get_width() : 0.0f; - const float gizmo_width = m_gizmos.get_scaled_total_width(); - const float assemble_width = m_assemble_view_toolbar.get_width(); - const float separator_width = m_separator_toolbar.get_width(); - const float left = std::max(-0.5f * cnv_size.get_width(), -0.5f * (m_main_toolbar.get_width() + separator_width + gizmo_width + assemble_width - collapse_toolbar_width)); + const float left = -0.5f * cnv_size.get_width() + get_main_toolbar_offset(); m_main_toolbar.set_position(top, left); m_main_toolbar.render(*this); if (m_toolbar_highlighter.m_render_arrow) @@ -7579,7 +7629,8 @@ void GLCanvas3D::_render_imgui_select_plate_toolbar() ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 4.0f); ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f); - imgui.set_next_window_pos(canvas_w * 0, canvas_h * 0, ImGuiCond_Always, 0, 0); + const float y_offset = is_collapse_toolbar_on_left() ? (get_collapse_toolbar_height() + 5) : 0; + imgui.set_next_window_pos(canvas_w * 0, canvas_h * 0 + y_offset, ImGuiCond_Always, 0, 0); imgui.set_next_window_size(window_width, window_height, ImGuiCond_Always); if (show_scroll) @@ -7781,13 +7832,10 @@ void GLCanvas3D::_render_assemble_view_toolbar() const return; const Size cnv_size = get_canvas_size(); - GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar(); - const float collapse_toolbar_width = collapse_toolbar.is_enabled() ? collapse_toolbar.get_width() : 0.0f; const float gizmo_width = m_gizmos.get_scaled_total_width(); - const float assemble_width = m_assemble_view_toolbar.get_width(); const float separator_width = m_separator_toolbar.get_width(); const float top = 0.5f * (float)cnv_size.get_height(); - const float main_toolbar_left = std::max(-0.5f * cnv_size.get_width(), -0.5f * (m_main_toolbar.get_width() + gizmo_width + assemble_width + separator_width - collapse_toolbar_width)); + const float main_toolbar_left = -0.5f * cnv_size.get_width() + get_main_toolbar_offset(); const float left = main_toolbar_left + (m_main_toolbar.get_width() + gizmo_width + separator_width); m_assemble_view_toolbar.set_position(top, left); @@ -7809,7 +7857,7 @@ void GLCanvas3D::_render_return_toolbar() const auto canvas_h = float(cnv_size.get_height()); float window_width = real_size.x + button_icon_size.x + imgui.scaled(2.0f); float window_height = button_icon_size.y + imgui.scaled(2.0f); - float window_pos_x = 30.0f; + float window_pos_x = 30.0f + (is_collapse_toolbar_on_left() ? (get_collapse_toolbar_width() + 5.f) : 0); float window_pos_y = 14.0f; imgui.set_next_window_pos(window_pos_x, window_pos_y, ImGuiCond_Always, 0, 0); @@ -7855,13 +7903,10 @@ void GLCanvas3D::_render_separator_toolbar_right() const return; const Size cnv_size = get_canvas_size(); - GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar(); - const float collapse_toolbar_width = collapse_toolbar.is_enabled() ? collapse_toolbar.get_width() : 0.0f; const float gizmo_width = m_gizmos.get_scaled_total_width(); - const float assemble_width = m_assemble_view_toolbar.get_width(); const float separator_width = m_separator_toolbar.get_width(); const float top = 0.5f * (float)cnv_size.get_height(); - const float main_toolbar_left = std::max(-0.5f * cnv_size.get_width(), -0.5f * (m_main_toolbar.get_width() + gizmo_width + assemble_width + separator_width - collapse_toolbar_width)); + const float main_toolbar_left = -0.5f * cnv_size.get_width() + get_main_toolbar_offset(); const float left = main_toolbar_left + (m_main_toolbar.get_width() + gizmo_width + separator_width / 2); m_separator_toolbar.set_position(top, left); @@ -7874,13 +7919,8 @@ void GLCanvas3D::_render_separator_toolbar_left() const return; const Size cnv_size = get_canvas_size(); - GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar(); - const float collapse_toolbar_width = collapse_toolbar.is_enabled() ? collapse_toolbar.get_width() : 0.0f; - const float gizmo_width = m_gizmos.get_scaled_total_width(); - const float assemble_width = m_assemble_view_toolbar.get_width(); - const float separator_width = m_separator_toolbar.get_width(); const float top = 0.5f * (float)cnv_size.get_height(); - const float main_toolbar_left = std::max(-0.5f * cnv_size.get_width(), -0.5f * (m_main_toolbar.get_width() + gizmo_width + assemble_width + separator_width - collapse_toolbar_width)); + const float main_toolbar_left = -0.5f * cnv_size.get_width() + get_main_toolbar_offset(); const float left = main_toolbar_left + (m_main_toolbar.get_width()); m_separator_toolbar.set_position(top, left); @@ -7889,12 +7929,18 @@ void GLCanvas3D::_render_separator_toolbar_left() const void GLCanvas3D::_render_collapse_toolbar() const { - GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar(); + auto& plater = *wxGetApp().plater(); + const auto sidebar_docking_dir = plater.get_sidebar_docking_state(); + if (sidebar_docking_dir == Sidebar::None) { + return; + } + + GLToolbar& collapse_toolbar = plater.get_collapse_toolbar(); const Size cnv_size = get_canvas_size(); const float top = 0.5f * (float)cnv_size.get_height(); - //const float left = (0.5f * (float)cnv_size.get_width() - (float)collapse_toolbar.get_width() - band); - const float left = -0.5f * (float)cnv_size.get_width(); + const float left = sidebar_docking_dir == Sidebar::Right ? 0.5f * (float) cnv_size.get_width() - (float) collapse_toolbar.get_width() : + -0.5f * (float) cnv_size.get_width(); collapse_toolbar.set_position(top, left); collapse_toolbar.render(*this); @@ -8066,7 +8112,7 @@ void GLCanvas3D::_render_assemble_control() const const float text_size_x = std::max(imgui->calc_text_size(_L("Reset direction")).x + 2 * ImGui::GetStyle().FramePadding.x, std::max(imgui->calc_text_size(_L("Explosion Ratio")).x, imgui->calc_text_size(_L("Section View")).x)); const float slider_width = 75.0f; - const float value_size = imgui->calc_text_size("3.00").x + text_padding * 2; + const float value_size = imgui->calc_text_size(std::string_view{"3.00"}).x + text_padding * 2; const float item_spacing = imgui->get_item_spacing().x; ImVec2 window_padding = ImGui::GetStyle().WindowPadding; @@ -9500,5 +9546,108 @@ void GLCanvas3D::GizmoHighlighter::blink() invalidate(); } +const ModelVolume *get_model_volume(const GLVolume &v, const Model &model) +{ + const ModelVolume * ret = nullptr; + + if (v.object_idx() < (int)model.objects.size()) { + const ModelObject *obj = model.objects[v.object_idx()]; + if (v.volume_idx() < (int)obj->volumes.size()) + ret = obj->volumes[v.volume_idx()]; + } + + return ret; +} + +ModelVolume *get_model_volume(const ObjectID &volume_id, const ModelObjectPtrs &objects) +{ + for (const ModelObject *obj : objects) + for (ModelVolume *vol : obj->volumes) + if (vol->id() == volume_id) + return vol; + return nullptr; +} + +ModelVolume *get_model_volume(const GLVolume &v, const ModelObject& object) { + if (v.volume_idx() < 0) + return nullptr; + + size_t volume_idx = static_cast(v.volume_idx()); + if (volume_idx >= object.volumes.size()) + return nullptr; + + return object.volumes[volume_idx]; +} + +ModelVolume *get_model_volume(const GLVolume &v, const ModelObjectPtrs &objects) +{ + if (v.object_idx() < 0) + return nullptr; + size_t objext_idx = static_cast(v.object_idx()); + if (objext_idx >= objects.size()) + return nullptr; + if (objects[objext_idx] == nullptr) + return nullptr; + return get_model_volume(v, *objects[objext_idx]); +} + +GLVolume *get_first_hovered_gl_volume(const GLCanvas3D &canvas) { + int hovered_id_signed = canvas.get_first_hover_volume_idx(); + if (hovered_id_signed < 0) + return nullptr; + + size_t hovered_id = static_cast(hovered_id_signed); + const GLVolumePtrs &volumes = canvas.get_volumes().volumes; + if (hovered_id >= volumes.size()) + return nullptr; + + return volumes[hovered_id]; +} + +GLVolume *get_selected_gl_volume(const GLCanvas3D &canvas) { + const GLVolume *gl_volume = get_selected_gl_volume(canvas.get_selection()); + if (gl_volume == nullptr) + return nullptr; + + const GLVolumePtrs &gl_volumes = canvas.get_volumes().volumes; + for (GLVolume *v : gl_volumes) + if (v->composite_id == gl_volume->composite_id) + return v; + return nullptr; +} + +ModelObject *get_model_object(const GLVolume &gl_volume, const Model &model) { + return get_model_object(gl_volume, model.objects); +} + +ModelObject *get_model_object(const GLVolume &gl_volume, const ModelObjectPtrs &objects) { + if (gl_volume.object_idx() < 0) + return nullptr; + size_t objext_idx = static_cast(gl_volume.object_idx()); + if (objext_idx >= objects.size()) + return nullptr; + return objects[objext_idx]; +} + +ModelInstance *get_model_instance(const GLVolume &gl_volume, const Model& model) { + return get_model_instance(gl_volume, model.objects); +} + +ModelInstance *get_model_instance(const GLVolume &gl_volume, const ModelObjectPtrs &objects) { + if (gl_volume.instance_idx() < 0) + return nullptr; + ModelObject *object = get_model_object(gl_volume, objects); + return get_model_instance(gl_volume, *object); +} + +ModelInstance *get_model_instance(const GLVolume &gl_volume, const ModelObject &object) { + if (gl_volume.instance_idx() < 0) + return nullptr; + size_t instance_idx = static_cast(gl_volume.instance_idx()); + if (instance_idx >= object.instances.size()) + return nullptr; + return object.instances[instance_idx]; +} + } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 901ff007cd..5981eb87ac 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -858,15 +858,17 @@ public: //BBS: add part plate related logic void select_plate(); //BBS: GUI refactor: GLToolbar&&gizmo - float get_main_toolbar_height() { return m_main_toolbar.get_height();} - float get_main_toolbar_width() { return m_main_toolbar.get_width();} - float get_assemble_view_toolbar_width() { return m_assemble_view_toolbar.get_width(); } - float get_assemble_view_toolbar_height() { return m_assemble_view_toolbar.get_height(); } - float get_assembly_paint_toolbar_width() { return m_paint_toolbar_width; } - float get_separator_toolbar_width() { return m_separator_toolbar.get_width(); } - float get_separator_toolbar_height() { return m_separator_toolbar.get_height(); } - float get_collapse_toolbar_width(); - float get_collapse_toolbar_height(); + float get_main_toolbar_offset() const; + float get_main_toolbar_height() const { return m_main_toolbar.get_height(); } + float get_main_toolbar_width() const { return m_main_toolbar.get_width(); } + float get_assemble_view_toolbar_width() const { return m_assemble_view_toolbar.get_width(); } + float get_assemble_view_toolbar_height() const { return m_assemble_view_toolbar.get_height(); } + float get_assembly_paint_toolbar_width() const { return m_paint_toolbar_width; } + float get_separator_toolbar_width() const { return m_separator_toolbar.get_width(); } + float get_separator_toolbar_height() const { return m_separator_toolbar.get_height(); } + bool is_collapse_toolbar_on_left() const; + float get_collapse_toolbar_width() const; + float get_collapse_toolbar_height() const; void update_volumes_colors_by_extruder(); @@ -964,6 +966,12 @@ public: Size get_canvas_size() const; Vec2d get_local_mouse_position() const; + // store opening position of menu + std::optional m_popup_menu_positon; // position of mouse right click + void set_popup_menu_position(const Vec2d &position) { m_popup_menu_positon = position; } + const std::optional& get_popup_menu_position() const { return m_popup_menu_positon; } + void clear_popup_menu_position() { m_popup_menu_positon.reset(); } + void set_tooltip(const std::string& tooltip); // the following methods add a snapshot to the undo/redo stack, unless the given string is empty @@ -1105,6 +1113,8 @@ public: bool is_object_sinking(int object_idx) const; + void apply_retina_scale(Vec2d &screen_coordinate) const; + void _perform_layer_editing_action(wxMouseEvent* evt = nullptr); // Convert the screen space coordinate to an object space coordinate. @@ -1231,6 +1241,21 @@ private: float get_overlay_window_width() { return 0; /*LayersEditing::get_overlay_window_width();*/ } }; +const ModelVolume *get_model_volume(const GLVolume &v, const Model &model); +ModelVolume *get_model_volume(const ObjectID &volume_id, const ModelObjectPtrs &objects); +ModelVolume *get_model_volume(const GLVolume &v, const ModelObjectPtrs &objects); +ModelVolume *get_model_volume(const GLVolume &v, const ModelObject &object); + +GLVolume *get_first_hovered_gl_volume(const GLCanvas3D &canvas); +GLVolume *get_selected_gl_volume(const GLCanvas3D &canvas); + +ModelObject *get_model_object(const GLVolume &gl_volume, const Model &model); +ModelObject *get_model_object(const GLVolume &gl_volume, const ModelObjectPtrs &objects); + +ModelInstance *get_model_instance(const GLVolume &gl_volume, const Model &model); +ModelInstance *get_model_instance(const GLVolume &gl_volume, const ModelObjectPtrs &objects); +ModelInstance *get_model_instance(const GLVolume &gl_volume, const ModelObject &object); + } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 8485bfdb88..0d4c1bcda7 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -369,7 +369,7 @@ public: // See https://github.com/wxWidgets/wxWidgets/blob/master/src/msw/font.cpp // void wxNativeFontInfo::SetFractionalPointSize(float pointSizeNew) wxNativeFontInfo nfi= *font.GetNativeFontInfo(); - float pointSizeNew = scale * font.GetPointSize(); + float pointSizeNew = wxDisplay(this).GetScaleFactor() * scale * font.GetPointSize(); nfi.lf.lfHeight = nfi.GetLogFontHeightAtPPI(pointSizeNew, get_dpi_for_window(this)); nfi.pointSize = pointSizeNew; font = wxFont(nfi); @@ -4802,7 +4802,8 @@ void GUI_App::start_sync_user_preset(bool with_progress_dlg) if (total_count == 0) { CallAfter([this] { - plater()->get_notification_manager()->close_notification_of_type(NotificationType::BBLUserPresetExceedLimit); + if (!m_is_closing) + plater()->get_notification_manager()->close_notification_of_type(NotificationType::BBLUserPresetExceedLimit); }); } diff --git a/src/slic3r/GUI/GUI_Factories.cpp b/src/slic3r/GUI/GUI_Factories.cpp index 6727598aaa..4de5874175 100644 --- a/src/slic3r/GUI/GUI_Factories.cpp +++ b/src/slic3r/GUI/GUI_Factories.cpp @@ -1,3 +1,7 @@ +///|/ Copyright (c) Prusa Research 2021 - 2023 Enrico Turri @enricoturri1966, Lukáš Matěna @lukasmatena, Oleksandra Iushchenko @YuSanka, Pavel Mikuš @Godrak, Tomáš Mészáros @tamasmeszaros, Filip Sykala @Jony01, Vojtěch Bubník @bubnikv +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ #include "libslic3r/libslic3r.h" #include "libslic3r/PresetBundle.hpp" #include "libslic3r/Model.hpp" @@ -15,6 +19,8 @@ #include "format.hpp" //BBS: add partplate related logic #include "PartPlate.hpp" +#include "Gizmos/GLGizmoEmboss.hpp" +#include "Gizmos/GLGizmoSVG.hpp" #include #include "slic3r/Utils/FixModelByWin10.hpp" @@ -273,24 +279,28 @@ wxBitmapBundle* SettingsFactory::get_category_bitmap(const std::string& category //------------------------------------- // Note: id accords to type of the sub-object (adding volume), so sequence of the menu items is important -#ifdef __WINDOWS__ -const std::vector> MenuFactory::ADD_VOLUME_MENU_ITEMS = { +static const constexpr std::array, 5> ADD_VOLUME_MENU_ITEMS = {{ + // menu_item Name menu_item bitmap name {L("Add part"), "menu_add_part" }, // ~ModelVolumeType::MODEL_PART {L("Add negative part"), "menu_add_negative" }, // ~ModelVolumeType::NEGATIVE_VOLUME {L("Add modifier"), "menu_add_modifier"}, // ~ModelVolumeType::PARAMETER_MODIFIER {L("Add support blocker"), "menu_support_blocker"}, // ~ModelVolumeType::SUPPORT_BLOCKER - {L("Add support enforcer"), "menu_support_enforcer"} // ~ModelVolumeType::SUPPORT_ENFORCER -}; -#else -const std::vector> MenuFactory::ADD_VOLUME_MENU_ITEMS = { - {L("Add part"), "menu_add_part" }, // ~ModelVolumeType::MODEL_PART - {L("Add negative part"), "menu_add_negative" }, // ~ModelVolumeType::NEGATIVE_VOLUME - {L("Add modifier"), "menu_add_modifier"}, // ~ModelVolumeType::PARAMETER_MODIFIER - {L("Add support blocker"), "menu_support_blocker"}, // ~ModelVolumeType::SUPPORT_BLOCKER - {L("Add support enforcer"), "menu_support_enforcer"} // ~ModelVolumeType::SUPPORT_ENFORCER -}; + {L("Add support enforcer"), "menu_support_enforcer"}, // ~ModelVolumeType::SUPPORT_ENFORCER +}}; -#endif +// Note: id accords to type of the sub-object (adding volume), so sequence of the menu items is important +static const constexpr std::array, 3> TEXT_VOLUME_ICONS {{ +// menu_item Name menu_item bitmap name + {L("Add text"), "add_text_part"}, // ~ModelVolumeType::MODEL_PART + {L("Add negative text"), "add_text_negative" }, // ~ModelVolumeType::NEGATIVE_VOLUME + {L("Add text modifier"), "add_text_modifier"}, // ~ModelVolumeType::PARAMETER_MODIFIER +}}; +// Note: id accords to type of the sub-object (adding volume), so sequence of the menu items is important +static const constexpr std::array, 3> SVG_VOLUME_ICONS{{ + {L("Add SVG part"), "svg_part"}, // ~ModelVolumeType::MODEL_PART + {L("Add negative SVG"), "svg_negative"}, // ~ModelVolumeType::NEGATIVE_VOLUME + {L("Add SVG modifier"), "svg_modifier"}, // ~ModelVolumeType::PARAMETER_MODIFIER +}}; static Plater* plater() { @@ -428,12 +438,26 @@ std::vector MenuFactory::get_volume_bitmaps() { std::vector volume_bmps; volume_bmps.reserve(ADD_VOLUME_MENU_ITEMS.size()); - for (auto item : ADD_VOLUME_MENU_ITEMS){ - if(!item.second.empty()){ - //volume_bmps.push_back(create_menu_bitmap(item.second)); - volume_bmps.push_back(get_bmp_bundle(item.second)); - } - } + for (const auto& item : ADD_VOLUME_MENU_ITEMS) + volume_bmps.push_back(get_bmp_bundle(item.second)); + return volume_bmps; +} + +std::vector MenuFactory::get_text_volume_bitmaps() +{ + std::vector volume_bmps; + volume_bmps.reserve(TEXT_VOLUME_ICONS.size()); + for (const auto& item : TEXT_VOLUME_ICONS) + volume_bmps.push_back(get_bmp_bundle(item.second)); + return volume_bmps; +} + +std::vector MenuFactory::get_svg_volume_bitmaps() +{ + std::vector volume_bmps; + volume_bmps.reserve(SVG_VOLUME_ICONS.size()); + for (const auto &item : SVG_VOLUME_ICONS) + volume_bmps.push_back(get_bmp_bundle(item.second)); return volume_bmps; } @@ -463,19 +487,6 @@ void MenuFactory::append_menu_item_delete(wxMenu* menu) #endif } -void MenuFactory::append_menu_item_edit_text(wxMenu *menu) -{ -#ifdef __WINDOWS__ - append_menu_item( - menu, wxID_ANY, _L("Edit Text"), "", [](wxCommandEvent &) { plater()->edit_text(); }, "", nullptr, - []() { return plater()->can_edit_text(); }, m_parent); -#else - append_menu_item( - menu, wxID_ANY, _L("Edit Text"), "", [](wxCommandEvent &) { plater()->edit_text(); }, "", nullptr, - []() { return plater()->can_edit_text(); }, m_parent); -#endif -} - wxMenu* MenuFactory::append_submenu_add_generic(wxMenu* menu, ModelVolumeType type) { auto sub_menu = new wxMenu; @@ -509,6 +520,10 @@ wxMenu* MenuFactory::append_submenu_add_generic(wxMenu* menu, ModelVolumeType ty }, "", menu); } + + append_menu_item_add_text(sub_menu, type); + append_menu_item_add_svg(sub_menu, type); + sub_menu->AppendSeparator(); for (auto &item : {L("Cube"), L("Cylinder"), L("Sphere"), L("Cone")}) { append_menu_item( @@ -522,13 +537,69 @@ wxMenu* MenuFactory::append_submenu_add_generic(wxMenu* menu, ModelVolumeType ty return sub_menu; } +static void append_menu_itemm_add_(const wxString& name, GLGizmosManager::EType gizmo_type, wxMenu *menu, ModelVolumeType type, bool is_submenu_item) { + auto add_ = [type, gizmo_type](const wxCommandEvent & /*unnamed*/) { + const GLCanvas3D *canvas = plater()->canvas3D(); + const GLGizmosManager &mng = canvas->get_gizmos_manager(); + GLGizmoBase *gizmo_base = mng.get_gizmo(gizmo_type); + + ModelVolumeType volume_type = type; + // no selected object means create new object + if (volume_type == ModelVolumeType::INVALID) + volume_type = ModelVolumeType::MODEL_PART; + + auto screen_position = canvas->get_popup_menu_position(); + if (gizmo_type == GLGizmosManager::Emboss) { + auto emboss = dynamic_cast(gizmo_base); + assert(emboss != nullptr); + if (emboss == nullptr) return; + if (screen_position.has_value()) { + emboss->create_volume(volume_type, *screen_position); + } else { + emboss->create_volume(volume_type); + } + } else if (gizmo_type == GLGizmosManager::Svg) { + auto svg = dynamic_cast(gizmo_base); + assert(svg != nullptr); + if (svg == nullptr) return; + if (screen_position.has_value()) { + svg->create_volume(volume_type, *screen_position); + } else { + svg->create_volume(volume_type); + } + } + }; + + if (type == ModelVolumeType::MODEL_PART || type == ModelVolumeType::NEGATIVE_VOLUME || type == ModelVolumeType::PARAMETER_MODIFIER || + type == ModelVolumeType::INVALID // cannot use gizmo without selected object + ) { + wxString item_name = wxString(is_submenu_item ? "" : _(ADD_VOLUME_MENU_ITEMS[int(type)].first) + ": ") + name; + menu->AppendSeparator(); + const std::string icon_name = is_submenu_item ? "" : ADD_VOLUME_MENU_ITEMS[int(type)].second; + append_menu_item(menu, wxID_ANY, item_name, "", add_, icon_name, menu); + } +} + +void MenuFactory::append_menu_item_add_text(wxMenu* menu, ModelVolumeType type, bool is_submenu_item/* = true*/){ + append_menu_itemm_add_(_L("Text"), GLGizmosManager::Emboss, menu, type, is_submenu_item); +} + +void MenuFactory::append_menu_item_add_svg(wxMenu *menu, ModelVolumeType type, bool is_submenu_item /* = true*/){ + append_menu_itemm_add_(_L("SVG"), GLGizmosManager::Svg, menu, type, is_submenu_item); +} + void MenuFactory::append_menu_items_add_volume(wxMenu* menu) { // Update "add" items(delete old & create new) settings popupmenu for (auto& item : ADD_VOLUME_MENU_ITEMS) { - const auto settings_id = menu->FindItem(_(item.first)); - if (settings_id != wxNOT_FOUND) - menu->Destroy(settings_id); + const wxString item_name = _(item.first); + int item_id = menu->FindItem(item_name); + if (item_id != wxNOT_FOUND) + menu->Destroy(item_id); + + item_id = menu->FindItem(item_name + ": " + _L("Text")); + if (item_id != wxNOT_FOUND) + menu->Destroy(item_id); } for (size_t type = 0; type < ADD_VOLUME_MENU_ITEMS.size(); type++) @@ -992,6 +1063,81 @@ void MenuFactory::append_menu_items_mirror(wxMenu* menu) []() { return plater()->can_mirror(); }, m_parent); } +void MenuFactory::append_menu_item_edit_text(wxMenu *menu) +{ + wxString name = _L("Edit text"); + + auto can_edit_text = []() { + if (plater() == nullptr) + return false; + const Selection& selection = plater()->get_selection(); + if (selection.volumes_count() != 1) + return false; + const GLVolume* gl_volume = selection.get_first_volume(); + if (gl_volume == nullptr) + return false; + const ModelVolume *volume = get_model_volume(*gl_volume, selection.get_model()->objects); + if (volume == nullptr) + return false; + return volume->is_text(); + }; + + if (menu != &m_text_part_menu) { + const int menu_item_id = menu->FindItem(name); + if (menu_item_id != wxNOT_FOUND) + menu->Destroy(menu_item_id); + if (!can_edit_text()) + return; + } + + wxString description = _L("Ability to change text, font, size, ..."); + std::string icon = "cog"; + auto open_emboss = [](const wxCommandEvent &) { + GLGizmosManager &mng = plater()->get_view3D_canvas3D()->get_gizmos_manager(); + if (mng.get_current_type() == GLGizmosManager::Emboss) + mng.open_gizmo(GLGizmosManager::Emboss); // close() and reopen - move to be visible + mng.open_gizmo(GLGizmosManager::Emboss); + }; + append_menu_item(menu, wxID_ANY, name, description, open_emboss, icon, nullptr, can_edit_text, m_parent); +} + +void MenuFactory::append_menu_item_edit_svg(wxMenu *menu) +{ + wxString name = _L("Edit SVG"); + auto can_edit_svg = []() { + if (plater() == nullptr) + return false; + const Selection& selection = plater()->get_selection(); + if (selection.volumes_count() != 1) + return false; + const GLVolume* gl_volume = selection.get_first_volume(); + if (gl_volume == nullptr) + return false; + const ModelVolume *volume = get_model_volume(*gl_volume, selection.get_model()->objects); + if (volume == nullptr) + return false; + return volume->is_svg(); + }; + + if (menu != &m_svg_part_menu) { + const int menu_item_id = menu->FindItem(name); + if (menu_item_id != wxNOT_FOUND) + menu->Destroy(menu_item_id); + if (!can_edit_svg()) + return; + } + + wxString description = _L("Change SVG source file, projection, size, ..."); + std::string icon = "cog"; + auto open_svg = [](const wxCommandEvent &) { + GLGizmosManager &mng = plater()->get_view3D_canvas3D()->get_gizmos_manager(); + if (mng.get_current_type() == GLGizmosManager::Svg) + mng.open_gizmo(GLGizmosManager::Svg); // close() and reopen - move to be visible + mng.open_gizmo(GLGizmosManager::Svg); + }; + append_menu_item(menu, wxID_ANY, name, description, open_svg, icon, nullptr, can_edit_svg, m_parent); +} + void MenuFactory::append_menu_item_invalidate_cut_info(wxMenu *menu) { const wxString menu_name = _L("Invalidate cut info"); @@ -1175,6 +1321,34 @@ void MenuFactory::create_part_menu() append_menu_item_per_object_settings(&m_part_menu); } +void MenuFactory::create_text_part_menu() +{ + wxMenu* menu = &m_text_part_menu; + + append_menu_item_edit_text(menu); + append_menu_item_delete(menu); + append_menu_item_fix_through_netfabb(menu); + append_menu_item_simplify(menu); + append_menu_items_mirror(menu); + menu->AppendSeparator(); + append_menu_item_per_object_settings(menu); + append_menu_item_change_type(menu); +} + +void MenuFactory::create_svg_part_menu() +{ + wxMenu* menu = &m_svg_part_menu; + + append_menu_item_edit_svg(menu); + append_menu_item_delete(menu); + append_menu_item_fix_through_netfabb(menu); + append_menu_item_simplify(menu); + append_menu_items_mirror(menu); + menu->AppendSeparator(); + append_menu_item_per_object_settings(menu); + append_menu_item_change_type(menu); +} + void MenuFactory::create_bbl_part_menu() { wxMenu* menu = &m_part_menu; @@ -1301,7 +1475,8 @@ void MenuFactory::init(wxWindow* parent) //create_object_menu(); create_sla_object_menu(); //create_part_menu(); - + create_text_part_menu(); + create_svg_part_menu(); create_extra_object_menu(); create_bbl_part_menu(); create_bbl_assemble_object_menu(); @@ -1330,6 +1505,8 @@ wxMenu* MenuFactory::object_menu() append_menu_items_convert_unit(&m_object_menu); append_menu_items_flush_options(&m_object_menu); append_menu_item_invalidate_cut_info(&m_object_menu); + append_menu_item_edit_text(&m_object_menu); + append_menu_item_edit_svg(&m_object_menu); append_menu_item_change_filament(&m_object_menu); return &m_object_menu; } @@ -1339,6 +1516,8 @@ wxMenu* MenuFactory::sla_object_menu() append_menu_items_convert_unit(&m_sla_object_menu); append_menu_item_settings(&m_sla_object_menu); //update_menu_items_instance_manipulation(mtObjectSLA); + append_menu_item_edit_text(&m_sla_object_menu); + append_menu_item_edit_svg(&m_object_menu); return &m_sla_object_menu; } @@ -1351,6 +1530,22 @@ wxMenu* MenuFactory::part_menu() return &m_part_menu; } +wxMenu* MenuFactory::text_part_menu() +{ + append_menu_item_change_filament(&m_text_part_menu); + append_menu_item_per_object_settings(&m_text_part_menu); + + return &m_text_part_menu; +} + +wxMenu *MenuFactory::svg_part_menu() +{ + append_menu_item_change_filament(&m_svg_part_menu); + append_menu_item_per_object_settings(&m_svg_part_menu); + + return &m_svg_part_menu; +} + wxMenu* MenuFactory::instance_menu() { return &m_instance_menu; @@ -1753,12 +1948,6 @@ void MenuFactory::update_default_menu() create_default_menu(); } -void MenuFactory::msw_rescale() -{ - for (MenuWithSeparators* menu : { &m_object_menu, &m_sla_object_menu, &m_part_menu, &m_default_menu }) - sys_color_changed_menu(dynamic_cast(menu)); -} - #ifdef _WIN32 // For this class is used code from stackoverflow: // https://stackoverflow.com/questions/257288/is-it-possible-to-write-a-template-to-check-for-a-functions-existence @@ -1803,14 +1992,17 @@ void MenuFactory::sys_color_changed(wxMenuBar* menubar) #if 0 for (size_t id = 0; id < menubar->GetMenuCount(); id++) { wxMenu* menu = menubar->GetMenu(id); - msw_rescale_menu(menu); + sys_color_changed_menu(menu); +#ifndef __linux__ + menu->SetupBitmaps(); #ifdef _WIN32 // but under MSW we have to update item's bachground color for (wxMenuItem* item : menu->GetMenuItems()) update_menu_item_def_colors(item); #endif } - menubar->Refresh(); +// menubar->Refresh(); +#endif #endif } diff --git a/src/slic3r/GUI/GUI_Factories.hpp b/src/slic3r/GUI/GUI_Factories.hpp index ec76b9e4f1..70cb225af3 100644 --- a/src/slic3r/GUI/GUI_Factories.hpp +++ b/src/slic3r/GUI/GUI_Factories.hpp @@ -1,3 +1,7 @@ +///|/ Copyright (c) Prusa Research 2021 - 2022 Oleksandra Iushchenko @YuSanka, Tomáš Mészáros @tamasmeszaros, Lukáš Matěna @lukasmatena, Pavel Mikuš @Godrak, Filip Sykala @Jony01, Vojtěch Bubník @bubnikv +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ #ifndef slic3r_GUI_Factories_hpp_ #define slic3r_GUI_Factories_hpp_ @@ -47,8 +51,9 @@ struct SettingsFactory class MenuFactory { public: - static const std::vector> ADD_VOLUME_MENU_ITEMS; - static std::vector get_volume_bitmaps(); + static std::vector get_volume_bitmaps(); + static std::vector get_text_volume_bitmaps(); + static std::vector get_svg_volume_bitmaps(); MenuFactory(); ~MenuFactory() = default; @@ -57,7 +62,6 @@ public: void update(); void update_object_menu(); void update_default_menu(); - void msw_rescale(); void sys_color_changed(); static void sys_color_changed(wxMenuBar* menu_bar); @@ -66,6 +70,8 @@ public: wxMenu* object_menu(); wxMenu* sla_object_menu(); wxMenu* part_menu(); + wxMenu* text_part_menu(); + wxMenu* svg_part_menu(); wxMenu* instance_menu(); wxMenu* layer_menu(); wxMenu* multi_selection_menu(); @@ -86,6 +92,8 @@ private: MenuWithSeparators m_object_menu; MenuWithSeparators m_part_menu; + MenuWithSeparators m_text_part_menu; + MenuWithSeparators m_svg_part_menu; MenuWithSeparators m_sla_object_menu; MenuWithSeparators m_default_menu; MenuWithSeparators m_instance_menu; @@ -105,6 +113,8 @@ private: void create_object_menu(); void create_sla_object_menu(); void create_part_menu(); + void create_text_part_menu(); + void create_svg_part_menu(); //BBS: add part plate related logic void create_plate_menu(); //BBS: add bbl object menu @@ -114,6 +124,8 @@ private: void create_bbl_assemble_part_menu(); wxMenu* append_submenu_add_generic(wxMenu* menu, ModelVolumeType type); + void append_menu_item_add_text(wxMenu* menu, ModelVolumeType type, bool is_submenu_item = true); + void append_menu_item_add_svg(wxMenu *menu, ModelVolumeType type, bool is_submenu_item = true); void append_menu_items_add_volume(wxMenu* menu); wxMenuItem* append_menu_item_layers_editing(wxMenu* menu); wxMenuItem* append_menu_item_settings(wxMenu* menu); @@ -129,7 +141,6 @@ private: void append_menu_item_change_extruder(wxMenu* menu); void append_menu_item_set_visible(wxMenu* menu); void append_menu_item_delete(wxMenu* menu); - void append_menu_item_edit_text(wxMenu *menu); void append_menu_item_scale_selection_to_fit_print_volume(wxMenu* menu); void append_menu_items_convert_unit(wxMenu* menu); // Add "Conver/Revert..." menu items (from/to inches/meters) after "Reload From Disk" void append_menu_items_flush_options(wxMenu* menu); @@ -138,6 +149,8 @@ private: void append_menu_item_merge_parts_to_single_part(wxMenu *menu); void append_menu_items_mirror(wxMenu *menu); void append_menu_item_invalidate_cut_info(wxMenu *menu); + void append_menu_item_edit_text(wxMenu *menu); + void append_menu_item_edit_svg(wxMenu *menu); //void append_menu_items_instance_manipulation(wxMenu *menu); //void update_menu_items_instance_manipulation(MenuType type); diff --git a/src/slic3r/GUI/GUI_ObjectLayers.cpp b/src/slic3r/GUI/GUI_ObjectLayers.cpp index 76a0042377..cd1ff8ca28 100644 --- a/src/slic3r/GUI/GUI_ObjectLayers.cpp +++ b/src/slic3r/GUI/GUI_ObjectLayers.cpp @@ -248,40 +248,7 @@ void ObjectLayers::UpdateAndShow(const bool show) void ObjectLayers::msw_rescale() { - m_bmp_delete.sys_color_changed(); - m_bmp_add.sys_color_changed(); - - m_grid_sizer->SetHGap(wxGetApp().em_unit()); - - // rescale edit-boxes - const int cells_cnt = m_grid_sizer->GetCols() * m_grid_sizer->GetEffectiveRowsCount(); - for (int i = 0; i < cells_cnt; ++i) { - const wxSizerItem* item = m_grid_sizer->GetItem(i); - if (item->IsWindow()) { - LayerRangeEditor* editor = dynamic_cast(item->GetWindow()); - if (editor != nullptr) - editor->msw_rescale(); - } - else if (item->IsSizer()) // case when we have editor with buttons - { - wxSizerItem* e_item = item->GetSizer()->GetItem(size_t(0)); // editor - if (e_item->IsWindow()) { - LayerRangeEditor* editor = dynamic_cast(e_item->GetWindow()); - if (editor != nullptr) - editor->msw_rescale(); - } - - if (item->GetSizer()->GetItemCount() > 2) // if there are Add/Del buttons - for (size_t btn : {2, 3}) { // del_btn, add_btn - wxSizerItem* b_item = item->GetSizer()->GetItem(btn); - if (b_item->IsWindow()) { - auto button = dynamic_cast(b_item->GetWindow()); - if (button != nullptr) - button->msw_rescale(); - } - } - } - } + //Orca: deleted what PS commented out m_grid_sizer->Layout(); } @@ -300,7 +267,7 @@ void ObjectLayers::sys_color_changed() if (b_item && b_item->IsWindow()) { auto button = dynamic_cast(b_item->GetWindow()); if (button != nullptr) - button->msw_rescale(); + button->sys_color_changed(); } } } diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index ad5e2ab503..697fba968e 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -1331,11 +1331,20 @@ void ObjectList::show_context_menu(const bool evt_context_menu) const ItemType type = m_objects_model->GetItemType(item); if (!(type & (itPlate | itObject | itVolume | itInstance))) return; + if (type & itVolume) { + int obj_idx, vol_idx; + get_selected_item_indexes(obj_idx, vol_idx, item); + if (obj_idx < 0 || vol_idx < 0) + return; + const ModelVolume *volume = object(obj_idx)->volumes[vol_idx]; - menu = type & itPlate ? plater->plate_menu() : - type & itInstance ? plater->instance_menu() : - type & itVolume ? plater->part_menu() : - printer_technology() == ptFFF ? plater->object_menu() : plater->sla_object_menu(); + menu = volume->is_text() ? plater->text_part_menu() : + plater->part_menu(); + } + else + menu = type & itPlate ? plater->plate_menu() : + type & itInstance ? plater->instance_menu() : + printer_technology() == ptFFF ? plater->object_menu() : plater->sla_object_menu(); plater->SetPlateIndexByRightMenuInLeftUI(-1); if (type & itPlate) { int plate_idx = -1; @@ -1359,12 +1368,11 @@ void ObjectList::extruder_editing() if (!item || !(m_objects_model->GetItemType(item) & (itVolume | itObject))) return; - const int column_width = GetColumn(colFilament)->GetWidth() + wxSystemSettings::GetMetric(wxSYS_VSCROLL_X) + 5; - - wxPoint pos = this->get_mouse_position_in_control(); - wxSize size = wxSize(column_width, -1); - pos.x = GetColumn(colName)->GetWidth() + GetColumn(colPrint)->GetWidth() + 5; - pos.y -= GetTextExtent("m").y; + wxRect rect = this->GetItemRect(item, GetColumn(colFilament)); + wxPoint pos = rect.GetPosition(); + pos.y -= 4; + wxSize size = rect.GetSize(); + size.SetWidth(size.GetWidth() + 8); apply_extruder_selector(&m_extruder_editor, this, "1", pos, size); @@ -2000,7 +2008,7 @@ void ObjectList::load_modifier(const wxArrayString& input_files, ModelObject& mo // First (any) GLVolume of the selected instance. They all share the same instance matrix. const GLVolume* v = selection.get_first_volume(); const Geometry::Transformation inst_transform = v->get_instance_transformation(); - const Transform3d inv_inst_transform = inst_transform.get_matrix(true).inverse(); + const Transform3d inv_inst_transform = inst_transform.get_matrix_no_offset().inverse(); const Vec3d instance_offset = v->get_instance_offset(); for (size_t i = 0; i < input_files.size(); ++i) { @@ -2144,7 +2152,7 @@ void ObjectList::load_generic_subobject(const std::string& type_name, const Mode Vec3d(0., 0., 0.5 * mesh_bb.size().z() + instance_bb.min.z() - v->get_instance_offset().z()) : // Translate the new modifier to be pickable: move to the left front corner of the instance's bounding box, lift to print bed. Vec3d(instance_bb.max.x(), instance_bb.min.y(), instance_bb.min.z()) + 0.5 * mesh_bb.size() - v->get_instance_offset(); - new_volume->set_offset(v->get_instance_transformation().get_matrix(true).inverse() * offset); + new_volume->set_offset(v->get_instance_transformation().get_matrix_no_offset().inverse() * offset); // BBS: backup Slic3r::save_object_mesh(model_object); @@ -2274,56 +2282,6 @@ void ObjectList::load_mesh_object(const TriangleMesh &mesh, const wxString &name #endif /* _DEBUG */ } -int ObjectList::load_mesh_part(const TriangleMesh &mesh, const wxString &name, const TextInfo &text_info, bool is_temp) -{ - wxDataViewItem item = GetSelection(); - // we can add volumes for Object or Instance - if (!item || !(m_objects_model->GetItemType(item) & (itObject | itInstance))) - return -1; - const int obj_idx = m_objects_model->GetObjectIdByItem(item); - - if (obj_idx < 0) - return -1; - - // Get object item, if Instance is selected - if (m_objects_model->GetItemType(item) & itInstance) - item = m_objects_model->GetItemById(obj_idx); - - ModelObject* mo = (*m_objects)[obj_idx]; - - Geometry::Transformation instance_transformation = mo->instances[0]->get_transformation(); - - // apply the instance transform to all volumes and reset instance transform except the offset - apply_object_instance_transfrom_to_all_volumes(mo, !is_temp); - - ModelVolume *mv = mo->add_volume(mesh); - mv->name = name.ToStdString(); - if (!text_info.m_text.empty()) - mv->set_text_info(text_info); - - if (!is_temp) { - std::vector volumes; - volumes.push_back(mv); - wxDataViewItemArray items = reorder_volumes_and_get_selection(obj_idx, [volumes](const ModelVolume *volume) { - return std::find(volumes.begin(), volumes.end(), volume) != volumes.end(); - }); - - wxGetApp().plater()->get_view3D_canvas3D()->update_instance_printable_state_for_object((size_t) obj_idx); - - if (items.size() > 1) { - m_selection_mode = smVolume; - m_last_selected_item = wxDataViewItem(nullptr); - } - select_items(items); - - selection_changed(); - } - - //BBS: notify partplate the modify - notify_instance_updated(obj_idx); - return mo->volumes.size() - 1; -} - //BBS bool ObjectList::del_object(const int obj_idx, bool refresh_immediately) { @@ -2615,7 +2573,9 @@ void ObjectList::split() for (const ModelVolume* volume : model_object->volumes) { const wxDataViewItem& vol_item = m_objects_model->AddVolumeChild(parent, from_u8(volume->name), volume->type(),// is_modifier() ? ModelVolumeType::PARAMETER_MODIFIER : ModelVolumeType::MODEL_PART, - get_warning_icon_name(volume->mesh().stats()), + volume->is_text(), + volume->is_svg(), + get_warning_icon_name(volume->mesh().stats()), volume->config.has("extruder") ? volume->config.extruder() : 0, false); // add settings to the part, if it has those @@ -3196,6 +3156,21 @@ bool ObjectList::can_merge_to_single_object() const return (*m_objects)[obj_idx]->volumes.size() > 1; } +wxPoint ObjectList::get_mouse_position_in_control() const +{ + wxPoint pt = wxGetMousePosition() - this->GetScreenPosition(); + +#ifdef __APPLE__ + // Workaround for OSX. From wxWidgets 3.1.6 Hittest doesn't respect to the header of wxDataViewCtrl + if (wxDataViewItem top_item = this->GetTopItem(); top_item.IsOk()) { + auto rect = this->GetItemRect(top_item, this->GetColumn(0)); + pt.y -= rect.y; + } +#endif // __APPLE__ + + return pt; +} + bool ObjectList::can_mesh_boolean() const { int obj_idx = get_selected_obj_idx(); @@ -3773,6 +3748,8 @@ wxDataViewItemArray ObjectList::add_volumes_to_object_in_list(size_t obj_idx, st object_item, from_u8(volume->name), volume->type(), + volume->is_text(), + volume->is_svg(), get_warning_icon_name(volume->mesh().stats()), volume->config.has("extruder") ? volume->config.extruder() : 0, false); @@ -5505,17 +5482,17 @@ void ObjectList::msw_rescale() GetColumn(colSinking)->SetWidth(3 * em); GetColumn(colEditing )->SetWidth( 3 * em); - // rescale/update existing items with bitmaps - m_objects_model->Rescale(); - Layout(); } void ObjectList::sys_color_changed() { wxGetApp().UpdateDVCDarkUI(this, true); - - msw_rescale(); + + // rescale/update existing items with bitmaps + m_objects_model->UpdateBitmaps(); + + Layout(); if (m_objects_model) { m_objects_model->sys_color_changed(); } } @@ -5824,6 +5801,8 @@ wxDataViewItemArray ObjectList::reorder_volumes_and_get_selection(int obj_idx, s for (const ModelVolume* volume : object->volumes) { wxDataViewItem vol_item = m_objects_model->AddVolumeChild(object_item, from_u8(volume->name), volume->type(), + volume->is_text(), + volume->is_svg(), get_warning_icon_name(volume->mesh().stats()), volume->config.has("extruder") ? volume->config.extruder() : 0, false); diff --git a/src/slic3r/GUI/GUI_ObjectList.hpp b/src/slic3r/GUI/GUI_ObjectList.hpp index 0a95ecb415..1c96e3e5a3 100644 --- a/src/slic3r/GUI/GUI_ObjectList.hpp +++ b/src/slic3r/GUI/GUI_ObjectList.hpp @@ -27,7 +27,6 @@ class ModelConfig; class ModelObject; class ModelVolume; class TriangleMesh; -struct TextInfo; enum class ModelVolumeType : int; // FIXME: broken build on mac os because of this is missing: @@ -287,7 +286,6 @@ public: void load_mesh_object(const TriangleMesh &mesh, const wxString &name, bool center = true); // BBS void switch_to_object_process(); - int load_mesh_part(const TriangleMesh &mesh, const wxString &name, const TextInfo &text_info, bool is_temp); bool del_object(const int obj_idx, bool refresh_immediately = true); void del_subobject_item(wxDataViewItem& item); void del_settings_from_config(const wxDataViewItem& parent_item); @@ -321,7 +319,7 @@ public: void delete_all_connectors_for_selection(); void delete_all_connectors_for_object(int obj_idx); - wxPoint get_mouse_position_in_control() const { return wxGetMousePosition() - this->GetScreenPosition(); } + wxPoint get_mouse_position_in_control() const; int get_selected_obj_idx() const; ModelConfig& get_item_config(const wxDataViewItem& item) const; diff --git a/src/slic3r/GUI/GUI_ObjectSettings.cpp b/src/slic3r/GUI/GUI_ObjectSettings.cpp index ff9521b584..b0b59a1ac2 100644 --- a/src/slic3r/GUI/GUI_ObjectSettings.cpp +++ b/src/slic3r/GUI/GUI_ObjectSettings.cpp @@ -112,7 +112,7 @@ bool ObjectSettings::update_settings_list() btn->SetToolTip(_(L("Remove parameter"))); btn->SetBitmapFocus(m_bmp_delete_focus.bmp()); - btn->SetBitmapHover(m_bmp_delete_focus.bmp()); + btn->SetBitmapCurrent(m_bmp_delete_focus.bmp()); btn->Bind(wxEVT_BUTTON, [opt_key, config, this](wxEvent &event) { wxGetApp().plater()->take_snapshot(from_u8((boost::format("Delete Option %s") % opt_key).str()).ToStdString()); @@ -146,7 +146,7 @@ bool ObjectSettings::update_settings_list() return; ctrl->SetBitmap_(m_bmp_delete); ctrl->SetBitmapFocus(m_bmp_delete_focus.bmp()); - ctrl->SetBitmapHover(m_bmp_delete_focus.bmp()); + ctrl->SetBitmapCurrent(m_bmp_delete_focus.bmp()); }; const bool is_extruders_cat = cat.first == "Extruders"; @@ -415,21 +415,13 @@ void ObjectSettings::UpdateAndShow(const bool show) #endif } -void ObjectSettings::msw_rescale() -{ -#if !NEW_OBJECT_SETTING - m_bmp_delete.msw_rescale(); - m_bmp_delete_focus.msw_rescale(); - - for (auto group : m_og_settings) - group->msw_rescale(); -#endif -} - void ObjectSettings::sys_color_changed() { #if !NEW_OBJECT_SETTING - m_og->sys_color_changed(); + m_og->sys_color_changed(); // not in old msw_rescale. is it needed? + // moved from old msw_rescale + m_bmp_delete.sys_color_changed(); + m_bmp_delete_focus.sys_color_changed(); for (auto group : m_og_settings) group->sys_color_changed(); diff --git a/src/slic3r/GUI/GUI_ObjectSettings.hpp b/src/slic3r/GUI/GUI_ObjectSettings.hpp index 8903f8748b..0e50901b2d 100644 --- a/src/slic3r/GUI/GUI_ObjectSettings.hpp +++ b/src/slic3r/GUI/GUI_ObjectSettings.hpp @@ -68,7 +68,6 @@ public: bool add_missed_options(ModelConfig *config_to, const DynamicPrintConfig &config_from); void update_config_values(ModelConfig *config); void UpdateAndShow(const bool show); - void msw_rescale(); void sys_color_changed(); }; diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index af4dbc40fc..74d1f959da 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -1,3 +1,9 @@ +///|/ Copyright (c) Prusa Research 2018 - 2023 Enrico Turri @enricoturri1966, Oleksandra Iushchenko @YuSanka, Vojtěch Bubník @bubnikv, Lukáš Matěna @lukasmatena, Filip Sykala @Jony01, David Kocík @kocikdav, Tomáš Mészáros @tamasmeszaros, Vojtěch Král @vojtechkral +///|/ Copyright (c) 2022 André Althaus +///|/ Copyright (c) 2019 John Drake @foxox +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ //#include "stdlib.h" #include "libslic3r/libslic3r.h" #include "libslic3r/Layer.hpp" @@ -65,6 +71,7 @@ bool View3D::init(wxWindow* parent, Bed3D& bed, Model* model, DynamicPrintConfig m_canvas->allow_multisample(OpenGLManager::can_multisample()); // XXX: If have OpenGL m_canvas->enable_picking(true); + m_canvas->get_selection().set_mode(Selection::Instance); m_canvas->enable_moving(true); // XXX: more config from 3D.pm m_canvas->set_model(model); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.cpp b/src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.cpp index be0c2e1518..50c82439f4 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.cpp @@ -14,6 +14,7 @@ #include "slic3r/GUI/GUI_App.hpp" #include "slic3r/GUI/Plater.hpp" #include "libslic3r/AppConfig.hpp" +#include "../GUI/MsgDialog.hpp" #include @@ -636,20 +637,78 @@ void GLGizmoAdvancedCut::perform_cut(const Selection& selection) // update connectors pos as offset of its center before cut performing apply_connectors_in_model(mo, create_dowels_as_separate_object); - // BBS: do segment - if (m_do_segment) { - wxGetApp().plater()->segment(object_idx, instance_idx, m_segment_smoothing_alpha, m_segment_number); - } else { - wxGetApp().plater()->cut(object_idx, instance_idx, get_plane_points_world_coord(), - only_if(m_keep_upper, ModelObjectCutAttribute::KeepUpper) | - only_if(m_keep_lower, ModelObjectCutAttribute::KeepLower) | - only_if(m_cut_to_parts, ModelObjectCutAttribute::CutToParts) | - only_if(m_place_on_cut_upper, ModelObjectCutAttribute::PlaceOnCutUpper) | - only_if(m_place_on_cut_lower, ModelObjectCutAttribute::PlaceOnCutLower) | - only_if(m_rotate_upper, ModelObjectCutAttribute::FlipUpper) | - only_if(m_rotate_lower, ModelObjectCutAttribute::FlipLower) | - only_if(create_dowels_as_separate_object, ModelObjectCutAttribute::CreateDowels) | - only_if(!has_connectors, ModelObjectCutAttribute::InvalidateCutInfo)); + apply_connectors_in_model(cut_mo, dowels_count); + + wxBusyCursor wait; + + ModelObjectCutAttributes attributes = only_if(has_connectors ? true : m_keep_upper, ModelObjectCutAttribute::KeepUpper) | + only_if(has_connectors ? true : m_keep_lower, ModelObjectCutAttribute::KeepLower) | + only_if(has_connectors ? false : m_cut_to_parts, ModelObjectCutAttribute::CutToParts) | + only_if(m_place_on_cut_upper, ModelObjectCutAttribute::PlaceOnCutUpper) | + only_if(m_place_on_cut_lower, ModelObjectCutAttribute::PlaceOnCutLower) | + only_if(m_rotate_upper, ModelObjectCutAttribute::FlipUpper) | only_if(m_rotate_lower, ModelObjectCutAttribute::FlipLower) | + only_if(dowels_count > 0, ModelObjectCutAttribute::CreateDowels) | + only_if(!has_connectors && !cut_with_groove && cut_mo->cut_id.id().invalid(), ModelObjectCutAttribute::InvalidateCutInfo); + + // update cut_id for the cut object in respect to the attributes + update_object_cut_id(cut_mo->cut_id, attributes, dowels_count); + + Cut cut(cut_mo, instance_idx, get_cut_matrix(selection), attributes); + cut.set_offset_for_two_part = true; + const ModelObjectPtrs &new_objects = cut_by_contour ? cut.perform_by_contour(m_part_selection->get_cut_parts(), dowels_count) : + cut_with_groove ? cut.perform_with_groove(m_groove, m_rotate_matrix) : + cut.perform_with_plane(); + // fix_non_manifold_edges +#ifdef HAS_WIN10SDK + if (is_windows10()) { + bool is_showed_dialog = false; + bool user_fix_model = false; + for (size_t i = 0; i < new_objects.size(); i++) { + for (size_t j = 0; j < new_objects[i]->volumes.size(); j++) { + if (its_num_open_edges(new_objects[i]->volumes[j]->mesh().its) > 0) { + if (!is_showed_dialog) { + is_showed_dialog = true; + MessageDialog dlg(nullptr, _L("non-mainifold edges be caused by cut tool, do you want to fix it now?"), "", wxYES | wxCANCEL); + int ret = dlg.ShowModal(); + if (ret == wxID_YES) { + user_fix_model = true; + } + } + if (!user_fix_model) { + break; + } + // model_name + std::vector succes_models; + // model_name failing reason + std::vector> failed_models; + auto plater = wxGetApp().plater(); + auto fix_and_update_progress = [this, plater](ModelObject *model_object, const int vol_idx, const string &model_name, ProgressDialog &progress_dlg, + std::vector &succes_models, std::vector> &failed_models) { + wxString msg = _L("Repairing model object"); + msg += ": " + from_u8(model_name) + "\n"; + std::string res; + if (!fix_model_by_win10_sdk_gui(*model_object, vol_idx, progress_dlg, msg, res)) return false; + return true; + }; + ProgressDialog progress_dlg(_L("Repairing model object"), "", 100, find_toplevel_parent(plater), wxPD_AUTO_HIDE | wxPD_APP_MODAL | wxPD_CAN_ABORT, true); + + auto model_name = new_objects[i]->name; + if (!fix_and_update_progress(new_objects[i], j, model_name, progress_dlg, succes_models, failed_models)) { + BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << "run fix_and_update_progress error"; + }; + }; + } + } + } + #endif + // set offset for new_objects + + // save cut_id to post update synchronization + const CutObjectBase cut_id = cut_mo->cut_id; + + // update cut results on plater and in the model + plater->apply_cut_object_to_model(object_idx, new_objects); + } } } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index ed98b81931..1ba93df823 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -252,12 +252,17 @@ void GLGizmoBase::GizmoImguiEnd() void GLGizmoBase::GizmoImguiSetNextWIndowPos(float &x, float y, int flag, float pivot_x, float pivot_y) { - if (abs(last_input_window_width) > 0.01f) { - if (x + last_input_window_width > m_parent.get_canvas_size().get_width()) { - if (last_input_window_width > m_parent.get_canvas_size().get_width()) { + GizmoImguiSetNextWIndowPos(x, y, last_input_window_width, 0, flag, pivot_x, pivot_y); +} + +void GLGizmoBase::GizmoImguiSetNextWIndowPos(float &x, float y, float w, float h, int flag, float pivot_x, float pivot_y) +{ + if (abs(w) > 0.01f) { + if (x + w > m_parent.get_canvas_size().get_width()) { + if (w > m_parent.get_canvas_size().get_width()) { x = 0; } else { - x = m_parent.get_canvas_size().get_width() - last_input_window_width; + x = m_parent.get_canvas_size().get_width() - w; } } } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp index d60e504856..9e7aa05209 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp @@ -250,6 +250,7 @@ protected: bool GizmoImguiBegin(const std::string& name, int flags); void GizmoImguiEnd(); void GizmoImguiSetNextWIndowPos(float &x, float y, int flag, float pivot_x = 0.0f, float pivot_y = 0.0f); + void GizmoImguiSetNextWIndowPos(float &x, float y, float w, float h, int flag, float pivot_x = 0.0f, float pivot_y = 0.0f); void register_grabbers_for_picking(); void unregister_grabbers_for_picking(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp index c0267c9888..f0f221f1df 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp @@ -20,6 +20,7 @@ #include "imgui/imgui_internal.h" #include "slic3r/GUI/Field.hpp" #include "slic3r/GUI/MsgDialog.hpp" +#include "FixModelByWin10.hpp" namespace Slic3r { namespace GUI { @@ -1769,7 +1770,7 @@ BoundingBoxf3 GLGizmoCut3D::transformed_bounding_box(const Vec3d& plane_center, // respect just to the solid parts for FFF and ignore pad and supports for SLA if (!volume->is_modifier && !volume->is_sla_pad() && !volume->is_sla_support()) { - const auto instance_matrix = volume->get_instance_transformation().get_matrix(true); + const auto instance_matrix = volume->get_instance_transformation().get_matrix_no_offset(); auto volume_trafo = instance_matrix * volume->get_volume_transformation().get_matrix(); ret.merge(volume->transformed_convex_hull_bounding_box(cut_matrix * volume_trafo)); } @@ -2284,13 +2285,13 @@ void GLGizmoCut3D::render_connectors_input_window(CutConnectors &connectors, flo render_flip_plane_button(m_connectors_editing && connectors.empty()); m_imgui->text(m_labels_map["Type"]); - ImGui::PushStyleColor(ImGuiCol_CheckMark, ImVec4(0.00f, 0.00f, 0.00f, 1.00f)); + ImGuiWrapper::push_radio_style(); bool type_changed = render_connect_type_radio_button(CutConnectorType::Plug); type_changed |= render_connect_type_radio_button(CutConnectorType::Dowel); type_changed |= render_connect_type_radio_button(CutConnectorType::Snap); if (type_changed) apply_selected_connectors([this, &connectors] (size_t idx) { connectors[idx].attribs.type = CutConnectorType(m_connector_type); }); - ImGui::PopStyleColor(1); + ImGuiWrapper::pop_radio_style(); m_imgui->disabled_begin(m_connector_type != CutConnectorType::Plug); if (type_changed && m_connector_type == CutConnectorType::Dowel) { @@ -2948,7 +2949,7 @@ void GLGizmoCut3D::show_tooltip_information(float x, float y) ImTextureID normal_id = m_parent.get_gizmos_manager().get_icon_texture_id(GLGizmosManager::MENU_ICON_NAME::IC_TOOLBAR_TOOLTIP); ImTextureID hover_id = m_parent.get_gizmos_manager().get_icon_texture_id(GLGizmosManager::MENU_ICON_NAME::IC_TOOLBAR_TOOLTIP_HOVER); - caption_max += m_imgui->calc_text_size(": ").x + 35.f; + caption_max += m_imgui->calc_text_size(std::string_view{": "}).x + 35.f; float font_size = ImGui::GetFontSize(); ImVec2 button_size = ImVec2(font_size * 1.8, font_size * 1.3); @@ -3381,6 +3382,49 @@ void GLGizmoCut3D::perform_cut(const Selection& selection) cut_with_groove ? cut.perform_with_groove(m_groove, m_rotation_m) : cut.perform_with_plane(); + // fix_non_manifold_edges +#ifdef HAS_WIN10SDK + if (is_windows10()) { + bool is_showed_dialog = false; + bool user_fix_model = false; + for (size_t i = 0; i < new_objects.size(); i++) { + for (size_t j = 0; j < new_objects[i]->volumes.size(); j++) { + if (its_num_open_edges(new_objects[i]->volumes[j]->mesh().its) > 0) { + if (!is_showed_dialog) { + is_showed_dialog = true; + MessageDialog dlg(nullptr, _L("non-mainifold edges be caused by cut tool, do you want to fix it now?"), "", wxYES | wxCANCEL); + int ret = dlg.ShowModal(); + if (ret == wxID_YES) { + user_fix_model = true; + } + } + if (!user_fix_model) { + break; + } + // model_name + std::vector succes_models; + // model_name failing reason + std::vector> failed_models; + auto plater = wxGetApp().plater(); + auto fix_and_update_progress = [this, plater](ModelObject *model_object, const int vol_idx, const string &model_name, ProgressDialog &progress_dlg, + std::vector &succes_models, std::vector> &failed_models) { + wxString msg = _L("Repairing model object"); + msg += ": " + from_u8(model_name) + "\n"; + std::string res; + if (!fix_model_by_win10_sdk_gui(*model_object, vol_idx, progress_dlg, msg, res)) return false; + return true; + }; + ProgressDialog progress_dlg(_L("Repairing model object"), "", 100, find_toplevel_parent(plater), wxPD_AUTO_HIDE | wxPD_APP_MODAL | wxPD_CAN_ABORT, true); + + auto model_name = new_objects[i]->name; + if (!fix_and_update_progress(new_objects[i], j, model_name, progress_dlg, succes_models, failed_models)) { + BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << "run fix_and_update_progress error"; + }; + }; + } + } + } + #endif check_objects_after_cut(new_objects); // save cut_id to post update synchronization diff --git a/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp b/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp new file mode 100644 index 0000000000..9f5e957982 --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp @@ -0,0 +1,3664 @@ +///|/ Copyright (c) Prusa Research 2021 - 2023 Oleksandra Iushchenko @YuSanka, Enrico Turri @enricoturri1966, Lukáš Matěna @lukasmatena, Tomáš Mészáros @tamasmeszaros, Filip Sykala @Jony01, Vojtěch Bubník @bubnikv +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ +#include "GLGizmoEmboss.hpp" +#include "slic3r/GUI/GLCanvas3D.hpp" +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/GUI_ObjectList.hpp" +#include "slic3r/GUI/Gizmos/GizmoObjectManipulation.hpp" +#include "slic3r/GUI/MainFrame.hpp" // to update title when add text +#include "slic3r/GUI/NotificationManager.hpp" +#include "slic3r/GUI/Plater.hpp" +#include "slic3r/GUI/MsgDialog.hpp" +#include "slic3r/GUI/format.hpp" +#include "slic3r/GUI/I18N.hpp" +#include "slic3r/GUI/CameraUtils.hpp" +#include "slic3r/GUI/Jobs/EmbossJob.hpp" +#include "slic3r/GUI/Jobs/CreateFontNameImageJob.hpp" +#include "slic3r/GUI/Jobs/NotificationProgressIndicator.hpp" +#include "slic3r/Utils/WxFontUtils.hpp" +#include "slic3r/Utils/UndoRedo.hpp" + +#include "libslic3r/Geometry.hpp" // to range pi pi +#include "libslic3r/Timer.hpp" + +#include "libslic3r/Model.hpp" +#include "libslic3r/Preset.hpp" +#include "libslic3r/ClipperUtils.hpp" // union_ex +#include "libslic3r/AppConfig.hpp" // store/load font list +#include "libslic3r/Format/OBJ.hpp" // load obj file for default object +#include "libslic3r/BuildVolume.hpp" + +#include "imgui/imgui_stdlib.h" // using std::string for inputs +#ifndef IMGUI_DEFINE_MATH_OPERATORS +#define IMGUI_DEFINE_MATH_OPERATORS +#endif +#include + +#include +#include +#include +#include +#include // detection of change DPI +#include + +#include +#include // serialize deserialize facenames +#include +#include + +// cache font list by cereal +#include +#include +#include +#include + +#include +#include // measure enumeration of fonts + +// uncomment for easier debug +//#define ALLOW_DEBUG_MODE +#ifdef ALLOW_DEBUG_MODE +#define ALLOW_ADD_FONT_BY_FILE +#define ALLOW_ADD_FONT_BY_OS_SELECTOR +#define SHOW_WX_FONT_DESCRIPTOR // OS specific descriptor | file path --> in edit style +#define SHOW_FONT_FILE_PROPERTY // ascent, descent, line gap, cache --> in advanced +#define SHOW_CONTAIN_3MF_FIX // when contain fix matrix --> show gray '3mf' next to close button +#define SHOW_OFFSET_DURING_DRAGGING // when drag with text over surface visualize used center +#define SHOW_IMGUI_ATLAS +#define SHOW_ICONS_TEXTURE +#define SHOW_FINE_POSITION // draw convex hull around volume +#define DRAW_PLACE_TO_ADD_TEXT // Interactive draw of window position +#define ALLOW_OPEN_NEAR_VOLUME +#endif // ALLOW_DEBUG_MODE + +//#define USE_PIXEL_SIZE_IN_WX_FONT + +using namespace Slic3r; +using namespace Slic3r::Emboss; +using namespace Slic3r::GUI; +using namespace Slic3r::GUI::Emboss; + +namespace { +template struct Limit { + // Limitation for view slider range in GUI + MinMax gui; + // Real limits for setting exacts values + MinMax values; +}; +// Variable keep limits for variables +static const struct Limits +{ + MinMax emboss{0.01, 1e4}; // in mm + MinMax size_in_mm{0.1f, 1000.f}; // in mm + Limit boldness{{-200.f, 200.f}, {-2e4f, 2e4f}}; // in font points + Limit skew{{-1.f, 1.f}, {-100.f, 100.f}}; // ration without unit + MinMax char_gap{-20000, 20000}; // in font points + MinMax line_gap{-20000, 20000}; // in font points + // distance text object from surface + MinMax angle{-180.f, 180.f}; // in degrees +} limits; + +static const float SELECTABLE_INNER_OFFSET = 8.0f; + +/// +/// Prepare data for emboss +/// +/// Text to emboss +/// Keep actual selected style +/// Needed when transform per glyph +/// Needed for transform per glyph +/// Define type of volume - side of surface(in / out) +/// Cancel for previous job +/// Base data for emboss text +std::unique_ptr create_emboss_data_base( + const std::string& text, + StyleManager& style_manager, + TextLinesModel& text_lines, + const Selection& selection, + ModelVolumeType type, + std::shared_ptr>& cancel); +CreateVolumeParams create_input(GLCanvas3D &canvas, const StyleManager::Style &style, RaycastManager &raycaster, ModelVolumeType volume_type); + +/// +/// Move window for edit emboss text near to embossed object +/// NOTE: embossed object must be selected +/// +ImVec2 calc_fine_position(const Selection &selection, const ImVec2 &windows_size, const Size &canvas_size); + +struct TextDataBase : public DataBase +{ + TextDataBase(DataBase &&parent, const FontFileWithCache &font_file, + TextConfiguration &&text_configuration, const EmbossProjection& projection); + // Create shape from text + font configuration + EmbossShape &create_shape() override; + void write(ModelVolume &volume) const override; + +private: + // Keep pointer on Data of font (glyph shapes) + FontFileWithCache m_font_file; + // font item is not used for create object + TextConfiguration m_text_configuration; +}; + +// Loaded icons enum +// Have to match order of files in function GLGizmoEmboss::init_icons() +enum class IconType : unsigned { + rename = 0, + erase, + add, + save, + undo, + italic, + unitalic, + bold, + unbold, + system_selector, + open_file, + exclamation, + lock, + lock_bold, + unlock, + unlock_bold, + align_horizontal_left, + align_horizontal_center, + align_horizontal_right, + align_vertical_top, + align_vertical_center, + align_vertical_bottom, + // automatic calc of icon's count + _count +}; +// Define rendered version of icon +enum class IconState : unsigned { activable = 0, hovered /*1*/, disabled /*2*/ }; +// selector for icon by enum +const IconManager::Icon &get_icon(const IconManager::VIcons& icons, IconType type, IconState state); +// short call of Slic3r::GUI::button +bool draw_button(const IconManager::VIcons& icons, IconType type, bool disable = false); + +struct FaceName +{ + wxString wx_name; + std::string name_truncated = ""; + size_t texture_index = 0; + // State for generation of texture + // when start generate create share pointers + std::shared_ptr> cancel = nullptr; + // R/W only on main thread - finalize of job + std::shared_ptr is_created = nullptr; +}; + +// Implementation of forwarded struct +// Keep sorted list of loadable face names +struct Facenames +{ + // flag to keep need of enumeration fonts from OS + // false .. wants new enumeration check by Hash + // true .. already enumerated(During opened combo box) + bool is_init = false; + + bool has_truncated_names = false; + + // data of can_load() faces + std::vector faces = {}; + std::vector faces_names = {}; + // Sorter set of Non valid face names in OS + std::vector bad = {}; + + // Configuration of font encoding + static const wxFontEncoding encoding = wxFontEncoding::wxFONTENCODING_SYSTEM; + + // Identify if preview texture exists + GLuint texture_id = 0; + + // protection for open too much font files together + // Gtk:ERROR:../../../../gtk/gtkiconhelper.c:494:ensure_surface_for_gicon: assertion failed (error == NULL): Failed to load + // /usr/share/icons/Yaru/48x48/status/image-missing.png: Error opening file /usr/share/icons/Yaru/48x48/status/image-missing.png: Too + // many open files (g-io-error-quark, 31) This variable must exist until no CreateFontImageJob is running + unsigned int count_opened_font_files = 0; + + // Configuration for texture height + const int count_cached_textures = 32; + + // index for new generated texture index(must be lower than count_cached_textures) + size_t texture_index = 0; + + // hash created from enumerated font from OS + // check when new font was installed + size_t hash = 0; + + // filtration pattern + //std::string search = ""; + //std::vector hide; // result of filtration +}; + +bool store(const Facenames &facenames); +bool load(Facenames &facenames); +void init_face_names(Facenames &facenames); +void init_truncated_names(Facenames &face_names, float max_width); + +// This configs holds GUI layout size given by translated texts. +// etc. When language changes, GUI is recreated and this class constructed again, +// so the change takes effect. (info by GLGizmoFdmSupports.hpp) +struct GuiCfg +{ + // Detect invalid config values when change monitor DPI + double screen_scale; + bool dark_mode = false; + + // Zero means it is calculated in init function + float height_of_volume_type_selector = 0.f; + float input_width = 0.f; + float delete_pos_x = 0.f; + float max_style_name_width = 0.f; + unsigned int icon_width = 0; + float max_tooltip_width = 0.f; + + // maximal width and height of style image + Vec2i max_style_image_size = Vec2i(0, 0); + + float indent = 0.f; + float input_offset = 0.f; + float advanced_input_offset = 0.f; + float lock_offset = 0.f; + + ImVec2 text_size; + + // maximal size of face name image + Vec2i face_name_size = Vec2i(0, 0); + float face_name_texture_offset_x = 0.f; + + // maximal texture generate jobs running at once + unsigned int max_count_opened_font_files = 10; + + // Only translations needed for calc GUI size + struct Translations + { + std::string font; + std::string height; + std::string depth; + + // advanced + std::string use_surface; + std::string per_glyph; + std::string alignment; + std::string char_gap; + std::string line_gap; + std::string boldness; + std::string skew_ration; + std::string from_surface; + std::string rotation; + std::string keep_up; + std::string collection; + }; + Translations translations; +}; +GuiCfg create_gui_configuration(); + +void draw_font_preview(FaceName &face, const std::string &text, Facenames &faces, const GuiCfg &cfg, bool is_visible); +// for existing volume which is selected(could init different(to volume text) lines count when edit text) +void init_text_lines(TextLinesModel &text_lines, const Selection& selection, /* const*/ StyleManager &style_manager, unsigned count_lines=0); +} // namespace priv + +// use private definition +struct GLGizmoEmboss::Facenames: public ::Facenames{}; +struct GLGizmoEmboss::GuiCfg: public ::GuiCfg{}; + +GLGizmoEmboss::GLGizmoEmboss(GLCanvas3D &parent, const std::string &icon_filename, unsigned int sprite_id) + : GLGizmoBase(parent, icon_filename, sprite_id) + , m_gui_cfg(nullptr) + , m_style_manager(m_imgui->get_glyph_ranges(), create_default_styles) + , m_face_names(std::make_unique()) + , m_rotate_gizmo(parent, GLGizmoRotate::Axis::Z) // grab id = 2 (Z axis) +{ + m_rotate_gizmo.set_group_id(0); + m_rotate_gizmo.set_force_local_coordinate(true); + // to use https://fontawesome.com/ (copy & paste) unicode symbols from web + // paste HEX unicode into notepad move cursor after unicode press [alt] + [x] +} + +bool GLGizmoEmboss::create_volume(ModelVolumeType volume_type, const Vec2d& mouse_pos) +{ + if (!init_create(volume_type)) + return false; + + // NOTE: change style manager - be carefull with order changes + DataBasePtr base = create_emboss_data_base(m_text, m_style_manager, m_text_lines, m_parent.get_selection(), volume_type, m_job_cancel); + CreateVolumeParams input = create_input(m_parent, m_style_manager.get_style(), m_raycast_manager, volume_type); + return start_create_volume(input, std::move(base), mouse_pos); +} + +// Designed for create volume without information of mouse in scene +bool GLGizmoEmboss::create_volume(ModelVolumeType volume_type) +{ + if (!init_create(volume_type)) + return false; + + // NOTE: change style manager - be carefull with order changes + DataBasePtr base = create_emboss_data_base(m_text, m_style_manager, m_text_lines, m_parent.get_selection(), volume_type, m_job_cancel); + CreateVolumeParams input = create_input(m_parent, m_style_manager.get_style(), m_raycast_manager, volume_type); + return start_create_volume_without_position(input, std::move(base)); +} + + +void GLGizmoEmboss::on_shortcut_key() { + set_volume_by_selection(); + if (m_volume == nullptr) { + // No volume to select from selection so create volume. + // NOTE: After finish job for creation emboss Text volume, + // GLGizmoEmboss will be opened + create_volume(ModelVolumeType::MODEL_PART); + } + else { + // shortcut is pressed when text is selected soo start edit it. + auto& mng = m_parent.get_gizmos_manager(); + if (mng.get_current_type() != GLGizmosManager::Emboss) + mng.open_gizmo(GLGizmosManager::Emboss); + } +} + +bool GLGizmoEmboss::re_emboss(const ModelVolume &text_volume, std::shared_ptr> job_cancel) +{ + assert(text_volume.text_configuration.has_value()); + assert(text_volume.emboss_shape.has_value()); + if (!text_volume.text_configuration.has_value() || + !text_volume.emboss_shape.has_value()) + return false; // not valid text volume to re emboss + const TextConfiguration &tc = *text_volume.text_configuration; + const EmbossShape &es = *text_volume.emboss_shape; + const ImWchar* ranges = ImGui::GetIO().Fonts->GetGlyphRangesDefault(); + + StyleManager style_manager(ranges, create_default_styles); + StyleManager::Style style{tc.style, es.projection}; + if (!style_manager.load_style(style)) + return false; // can't load font + + TextLinesModel text_lines; + const Selection &selection = wxGetApp().plater()->canvas3D()->get_selection(); + DataBasePtr base = create_emboss_data_base(tc.text, style_manager, text_lines, selection, text_volume.type(), job_cancel); + DataUpdate data{std::move(base), text_volume.id()}; + + RaycastManager raycast_manager; // Nothing is cached now, so It need to create raycasters + return start_update_volume(std::move(data), text_volume, selection, raycast_manager); +} + +namespace{ +ModelVolumePtrs prepare_volumes_to_slice(const ModelVolume &mv) +{ + const ModelVolumePtrs &volumes = mv.get_object()->volumes; + ModelVolumePtrs result; + result.reserve(volumes.size()); + for (ModelVolume *volume : volumes) { + // only part could be surface for volumes + if (!volume->is_model_part()) + continue; + + // is selected volume + if (mv.id() == volume->id()) + continue; + + result.push_back(volume); + } + return result; +} +} // namespace + +bool GLGizmoEmboss::do_mirror(size_t axis) +{ + // is valid input + assert(axis < 3); + if (axis >= 3) + return false; + + // is gizmo opened and initialized? + assert(m_parent.get_gizmos_manager().get_current_type() == GLGizmosManager::Emboss); + if (m_parent.get_gizmos_manager().get_current_type() != GLGizmosManager::Emboss) + return false; + + const std::optional &tc = m_volume->text_configuration; + assert(tc.has_value()); + bool is_per_glyph = tc.has_value()? tc->style.prop.per_glyph : false; + + const std::optional &es = m_volume->emboss_shape; + assert(es.has_value()); + bool use_surface = es.has_value()? es->projection.use_surface : false; + if (!use_surface && !is_per_glyph) { + // do normal mirror with fix matrix + Selection &selection = m_parent.get_selection(); + selection.setup_cache(); + + auto selection_mirror_fnc = [&selection, &axis]() { selection.mirror((Axis) axis, get_drag_transformation_type(selection)); }; + selection_transform(selection, selection_mirror_fnc); + + m_parent.do_mirror(L("Set Mirror")); + wxGetApp().obj_manipul()->UpdateAndShow(true); + return true; + } + + Vec3d scale = Vec3d::Ones(); + scale[axis] = -1.; + + Transform3d tr = m_volume->get_matrix(); + if (es.has_value()) { + const std::optional &fix_tr = es->fix_3mf_tr; + if (fix_tr.has_value()) + tr = tr * (fix_tr->inverse()); + } + + // mirror + tr = tr * Eigen::Scaling(scale); + + if (is_per_glyph) { + // init textlines before mirroring on mirrored text volume transformation + ModelVolumePtrs volumes = prepare_volumes_to_slice(*m_volume); + m_text_lines.init(tr, volumes, m_style_manager, m_text_lines.get_lines().size()); + } + + m_volume->set_transformation(tr); + // setting to volume is not visible for user(not GLVolume) + // NOTE: Staff around volume transformation change is done in job finish + return process(); +} + +namespace{ +// verify correct volume type for creation of text +bool check(ModelVolumeType volume_type) { + return volume_type == ModelVolumeType::MODEL_PART || + volume_type == ModelVolumeType::NEGATIVE_VOLUME || + volume_type == ModelVolumeType::PARAMETER_MODIFIER; +} +} + +bool GLGizmoEmboss::init_create(ModelVolumeType volume_type) +{ + // check valid volume type + if (!check(volume_type)){ + BOOST_LOG_TRIVIAL(error) << "Can't create embossed volume with this type: " << (int) volume_type; + return false; + } + + if (!is_activable()) { + BOOST_LOG_TRIVIAL(error) << "Can't create text. Gizmo is not activabled."; + return false; + } + + // Check can't be inside is_activable() cause crash + // steps to reproduce: start App -> key 't' -> key 'delete' + if (wxGetApp().obj_list()->has_selected_cut_object()) { + BOOST_LOG_TRIVIAL(error) << "Can't create text on cut object"; + return false; + } + + m_style_manager.discard_style_changes(); + + // set default text + m_text = _u8L("Embossed text"); + return true; +} + +bool GLGizmoEmboss::on_mouse_for_rotation(const wxMouseEvent &mouse_event) +{ + if (mouse_event.Moving()) return false; + + bool used = use_grabbers(mouse_event); + if (!m_dragging) return used; + + if (mouse_event.Dragging()) { + // check that style is activ + assert(m_style_manager.is_active_font()); + if (!m_style_manager.is_active_font()) + return used; + + std::optional &angle_opt = m_style_manager.get_style().angle; + dragging_rotate_gizmo(m_rotate_gizmo.get_angle(), angle_opt, m_rotate_start_angle, m_parent.get_selection()); + } + return used; +} + +bool GLGizmoEmboss::on_mouse_for_translate(const wxMouseEvent &mouse_event) +{ + // exist selected volume? + if (m_volume == nullptr) + return false; + + const Camera &camera = wxGetApp().plater()->get_camera(); + bool was_dragging = m_surface_drag.has_value(); + bool res = on_mouse_surface_drag(mouse_event, camera, m_surface_drag, m_parent, m_raycast_manager, UP_LIMIT); + bool is_dragging = m_surface_drag.has_value(); + + // End with surface dragging? + if (was_dragging && !is_dragging) + volume_transformation_changed(); + + // Start with dragging + else if (!was_dragging && is_dragging) { + // Cancel job to prevent interuption of dragging (duplicit result) + if (m_job_cancel != nullptr) + m_job_cancel->store(true); + } + + // during drag + else if (was_dragging && is_dragging) { + // update scale of selected volume --> should be approx the same + calculate_scale(); + + // Recalculate angle for GUI + if (!m_keep_up) { + const Selection &selection = m_parent.get_selection(); + const GLVolume *gl_volume = get_selected_gl_volume(selection); + assert(gl_volume != nullptr); + assert(m_style_manager.is_active_font()); + if (gl_volume == nullptr || !m_style_manager.is_active_font()) + return res; + m_style_manager.get_style().angle = calc_angle(selection); + } + + volume_transformation_changing(); + } + return res; +} + +void GLGizmoEmboss::on_mouse_change_selection(const wxMouseEvent &mouse_event) +{ + static bool was_dragging = true; + if ((mouse_event.LeftUp() || mouse_event.RightUp()) && !was_dragging) { + // is hovered volume closest hovered? + int hovered_idx = m_parent.get_first_hover_volume_idx(); + if (hovered_idx < 0) + // unselect object + return close(); + + const GLVolumePtrs &gl_volumes = m_parent.get_volumes().volumes; + auto hovered_idx_ = static_cast(hovered_idx); + if (hovered_idx_ >= gl_volumes.size()) + return close(); + + const GLVolume *gl_volume = gl_volumes[hovered_idx_]; + if (gl_volume == nullptr) + return close(); + + const ModelVolume *volume = get_model_volume(*gl_volume, m_parent.get_model()->objects); + if (volume == nullptr || !volume->text_configuration.has_value()) + // select volume without text configuration + return close(); + + // Reselection of text to another text + } + was_dragging = mouse_event.Dragging(); + + // Hook When click on object for reselection must be on event left down not up + if (mouse_event.LeftDown()) { + // is hovered volume closest hovered? + int hovered_idx = m_parent.get_first_hover_volume_idx(); + if (hovered_idx < 0) + // Potentionaly move with camera (drag) + return; + + const GLVolumePtrs &gl_volumes = m_parent.get_volumes().volumes; + auto hovered_idx_ = static_cast(hovered_idx); + if (hovered_idx_ >= gl_volumes.size()) + return; + const GLVolume *gl_volume = gl_volumes[hovered_idx_]; + if (gl_volume == nullptr) + return; + const ModelVolume *volume = get_model_volume(*gl_volume, m_parent.get_model()->objects); + if (volume == nullptr) + return; + + if (volume->text_configuration.has_value()) + return; // Reselection of text to another text + + // select volume without text configuration + return close(); + } + + // Hook When drag with scene by right mouse button + // object it is selected after drag scene !! + if (mouse_event.RightDown()) { + // is hovered volume closest hovered? + int hovered_idx = m_parent.get_first_hover_volume_idx(); + if (hovered_idx < 0) + // Potentionaly move with camera (drag) + return; + + const GLVolumePtrs &gl_volumes = m_parent.get_volumes().volumes; + auto hovered_idx_ = static_cast(hovered_idx); + if (hovered_idx_ >= gl_volumes.size()) + return; + const GLVolume *gl_volume = gl_volumes[hovered_idx_]; + if (gl_volume == nullptr) + return; + const ModelVolume *volume = get_model_volume(*gl_volume, m_parent.get_model()->objects); + if (volume == nullptr) + return; + + // is actual selected? + if (m_volume->id() == volume->id()) + return; + + // select volume without text configuration + return close(); + } +} + +bool GLGizmoEmboss::on_mouse(const wxMouseEvent &mouse_event) +{ + // not selected volume + if (m_volume == nullptr || + get_model_volume(m_volume_id, m_parent.get_selection().get_model()->objects) == nullptr || + !m_volume->text_configuration.has_value()) return false; + + if (on_mouse_for_rotation(mouse_event)) return true; + if (on_mouse_for_translate(mouse_event)) return true; + on_mouse_change_selection(mouse_event); + return false; +} + +void GLGizmoEmboss::volume_transformation_changing() +{ + if (m_volume == nullptr || !m_volume->text_configuration.has_value()) { + assert(false); + return; + } + const FontProp &prop = m_volume->text_configuration->style.prop; + if (prop.per_glyph) + init_text_lines(m_text_lines, m_parent.get_selection(), m_style_manager, m_text_lines.get_lines().size()); +} + +void GLGizmoEmboss::volume_transformation_changed() +{ + if (m_volume == nullptr || + !m_volume->text_configuration.has_value() || + !m_volume->emboss_shape.has_value() || + !m_style_manager.is_active_font()) { + assert(false); + return; + } + + if (!m_keep_up) { + // Re-Calculate current angle of up vector + m_style_manager.get_style().angle = calc_angle(m_parent.get_selection()); + } else { + // angle should be the same + assert(is_approx(m_style_manager.get_style().angle, calc_angle(m_parent.get_selection()))); + } + + const TextConfiguration &tc = *m_volume->text_configuration; + const EmbossShape &es = *m_volume->emboss_shape; + + bool per_glyph = tc.style.prop.per_glyph; + if (per_glyph) + init_text_lines(m_text_lines, m_parent.get_selection(), m_style_manager, m_text_lines.get_lines().size()); + + bool use_surface = es.projection.use_surface; + + // Update surface by new position + if (use_surface || per_glyph) + process(); + else { + // inform slicing process that model changed + // SLA supports, processing + // ensure on bed + wxGetApp().plater()->changed_object(*m_volume->get_object()); + } + + // Show correct value of height & depth inside of inputs + calculate_scale(); +} + +bool GLGizmoEmboss::wants_enter_leave_snapshots() const { return true; } +std::string GLGizmoEmboss::get_gizmo_entering_text() const { return _u8L("Enter emboss gizmo"); } +std::string GLGizmoEmboss::get_gizmo_leaving_text() const { return _u8L("Leave emboss gizmo"); } +std::string GLGizmoEmboss::get_action_snapshot_name() const { return _u8L("Embossing actions"); } + +bool GLGizmoEmboss::on_init() +{ + m_rotate_gizmo.init(); + ColorRGBA gray_color(.6f, .6f, .6f, .3f); + m_rotate_gizmo.set_highlight_color(gray_color); + + // NOTE: It has special handling in GLGizmosManager::handle_shortcut + m_shortcut_key = WXK_CONTROL_T; + + // initialize text styles + m_style_manager.init(wxGetApp().app_config); + + // Set rotation gizmo upwardrotate + m_rotate_gizmo.set_angle(PI / 2); + return true; +} + +std::string GLGizmoEmboss::on_get_name() const { return _u8L("Emboss"); } + +void GLGizmoEmboss::on_render() { + // no volume selected + const Selection &selection = m_parent.get_selection(); + if (m_volume == nullptr || + get_model_volume(m_volume_id, selection.get_model()->objects) == nullptr) + return; + if (selection.is_empty()) return; + + // prevent get local coordinate system on multi volumes + if (!selection.is_single_volume_or_modifier() && + !selection.is_single_volume_instance()) return; + + const GLVolume *gl_volume_ptr = m_parent.get_selection().get_first_volume(); + if (gl_volume_ptr == nullptr) return; + + if (m_text_lines.is_init()) { + const Transform3d& tr = gl_volume_ptr->world_matrix(); + const auto &fix = m_volume->emboss_shape->fix_3mf_tr; + if (fix.has_value()) + m_text_lines.render(tr * fix->inverse()); + else + m_text_lines.render(tr); + } + + bool is_surface_dragging = m_surface_drag.has_value(); + bool is_parent_dragging = m_parent.is_mouse_dragging(); + // Do NOT render rotation grabbers when dragging object + bool is_rotate_by_grabbers = m_dragging; + if (is_rotate_by_grabbers || + (!is_surface_dragging && !is_parent_dragging)) { + glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); + m_rotate_gizmo.render(); + } +} + +void GLGizmoEmboss::on_register_raycasters_for_picking(){ + m_rotate_gizmo.register_raycasters_for_picking(); +} +void GLGizmoEmboss::on_unregister_raycasters_for_picking(){ + m_rotate_gizmo.unregister_raycasters_for_picking(); +} + +#ifdef SHOW_FINE_POSITION +// draw suggested position of window +static void draw_fine_position(const Selection &selection, + const Size &canvas, + const ImVec2 &windows_size) +{ + const Selection::IndicesList& indices = selection.get_volume_idxs(); + // no selected volume + if (indices.empty()) return; + const GLVolume *volume = selection.get_volume(*indices.begin()); + // bad volume selected (e.g. deleted one) + if (volume == nullptr) return; + + const Camera &camera = wxGetApp().plater()->get_camera(); + Slic3r::Polygon hull = CameraUtils::create_hull2d(camera, *volume); + ImVec2 canvas_size(canvas.get_width(), canvas.get_height()); + ImVec2 offset = ImGuiWrapper::suggest_location(windows_size, hull, + canvas_size); + Slic3r::Polygon rect( + {Point(offset.x, offset.y), Point(offset.x + windows_size.x, offset.y), + Point(offset.x + windows_size.x, offset.y + windows_size.y), + Point(offset.x, offset.y + windows_size.y)}); + ImGuiWrapper::draw(hull); + ImGuiWrapper::draw(rect); +} +#endif // SHOW_FINE_POSITION + +#ifdef DRAW_PLACE_TO_ADD_TEXT +static void draw_place_to_add_text() +{ + ImVec2 mp = ImGui::GetMousePos(); + Vec2d mouse_pos(mp.x, mp.y); + const Camera &camera = wxGetApp().plater()->get_camera(); + Vec3d p1 = CameraUtils::get_z0_position(camera, mouse_pos); + std::vector rect3d{p1 + Vec3d(5, 5, 0), p1 + Vec3d(-5, 5, 0), + p1 + Vec3d(-5, -5, 0), p1 + Vec3d(5, -5, 0)}; + Points rect2d = CameraUtils::project(camera, rect3d); + ImGuiWrapper::draw(Slic3r::Polygon(rect2d)); +} +#endif // DRAW_PLACE_TO_ADD_TEXT + +#ifdef SHOW_OFFSET_DURING_DRAGGING +static void draw_mouse_offset(const std::optional &offset) +{ + if (!offset.has_value()) return; + // debug draw + auto draw_list = ImGui::GetOverlayDrawList(); + ImVec2 p1 = ImGui::GetMousePos(); + ImVec2 p2(p1.x + offset->x(), p1.y + offset->y()); + ImU32 color = ImGui::GetColorU32(ImGuiWrapper::COL_ORANGE_LIGHT); + float thickness = 3.f; + draw_list->AddLine(p1, p2, color, thickness); +} +#endif // SHOW_OFFSET_DURING_DRAGGING + +void GLGizmoEmboss::on_render_input_window(float x, float y, float bottom_limit) +{ + assert(m_volume != nullptr); + // Do not render window for not selected text volume + if (m_volume == nullptr || + get_model_volume(m_volume_id, m_parent.get_selection().get_model()->objects) == nullptr || + !m_volume->text_configuration.has_value()) { + // This closing could lead to bad behavior of undo/redo stack when unselection create snapshot before close + close(); + return; + } + + // Not known situation when could happend this is only for sure + if (!m_is_unknown_font && !m_style_manager.is_active_font()) + create_notification_not_valid_font("No active font in style. Select correct one."); + else if (!m_is_unknown_font && !m_style_manager.get_wx_font().IsOk()) + create_notification_not_valid_font("WxFont is not loaded properly."); + + double screen_scale = wxDisplay(wxGetApp().plater()).GetScaleFactor(); + + // Orca + ImGuiWrapper::push_toolbar_style(m_parent.get_scale()); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(4.0, 5.0) * screen_scale); + ImGui::PushStyleVar(ImGuiStyleVar_ScrollbarSize, 4.0f * screen_scale); + + // Configuration creation + if (m_gui_cfg == nullptr || // Exist configuration - first run + m_gui_cfg->screen_scale != screen_scale ||// change of DPI + m_gui_cfg->dark_mode != m_is_dark_mode // change of dark mode + ) { + // Create cache for gui offsets + ::GuiCfg cfg = create_gui_configuration(); + cfg.screen_scale = screen_scale; + cfg.dark_mode = m_is_dark_mode; + + GuiCfg gui_cfg{std::move(cfg)}; + m_gui_cfg = std::make_unique(std::move(gui_cfg)); + + // change resolution regenerate icons + init_icons(); + m_style_manager.clear_imgui_font(); + } + + // Draw origin position of text during dragging + if (m_surface_drag.has_value()) { + ImVec2 mouse_pos = ImGui::GetMousePos(); + ImVec2 center( + mouse_pos.x + m_surface_drag->mouse_offset.x(), + mouse_pos.y + m_surface_drag->mouse_offset.y()); + ImU32 color = ImGui::GetColorU32( + m_surface_drag->exist_hit ? + ImVec4(1.f, 1.f, 1.f, .75f) : // transparent white + ImVec4(1.f, .3f, .3f, .75f) + ); // Warning color + const float radius = 16.f; + ImGuiWrapper::draw_cross_hair(center, radius, color); + } + +#ifdef SHOW_FINE_POSITION + draw_fine_position(m_parent.get_selection(), m_parent.get_canvas_size(), min_window_size); +#endif // SHOW_FINE_POSITION +#ifdef DRAW_PLACE_TO_ADD_TEXT + draw_place_to_add_text(); +#endif // DRAW_PLACE_TO_ADD_TEXT +#ifdef SHOW_OFFSET_DURING_DRAGGING + draw_mouse_offset(m_dragging_mouse_offset); +#endif // SHOW_OFFSET_DURING_DRAGGING + + static float last_y = 0.0f; + static float last_h = 0.0f; + + // adjust window position to avoid overlap the view toolbar + const float win_h = ImGui::GetWindowHeight(); + y = std::min(y, bottom_limit - win_h); + GizmoImguiSetNextWIndowPos(x, y, ImGuiCond_Always, 0.0f, 0.0f); + if (last_h != win_h || last_y != y) { + // ask canvas for another frame to render the window in the correct position + m_imgui->set_requires_extra_frame(); + if (last_h != win_h) + last_h = win_h; + if (last_y != y) + last_y = y; + } + + GizmoImguiBegin(get_name(), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoTitleBar); + + draw_window(); + + GizmoImguiEnd(); + + // Orca + ImGui::PopStyleVar(2); + ImGuiWrapper::pop_toolbar_style(); +} + +void GLGizmoEmboss::on_set_state() +{ + // enable / disable bed from picking + // Rotation gizmo must work through bed + m_parent.set_raycaster_gizmos_on_top(m_state == GLGizmoBase::On); + + m_rotate_gizmo.set_state(m_state); + + // Closing gizmo. e.g. selecting another one + if (m_state == GLGizmoBase::Off) { + // refuse outgoing during text preview + reset_volume(); + // Store order and last activ index into app.ini + // TODO: what to do when can't store into file? + m_style_manager.store_styles_to_app_config(false); + remove_notification_not_valid_font(); + } else if (m_state == GLGizmoBase::On) { + // to reload fonts from system, when install new one + wxFontEnumerator::InvalidateCache(); + + // Immediately after set state On is called function data_changed(), + // where one could distiguish undo/redo serialization from opening by letter 'T' + // set_volume_by_selection(); + } +} + +void GLGizmoEmboss::data_changed(bool is_serializing) { + set_volume_by_selection(); + if (!is_serializing && m_volume == nullptr) + close(); +} + +void GLGizmoEmboss::on_start_dragging() { m_rotate_gizmo.start_dragging(); } +void GLGizmoEmboss::on_stop_dragging() +{ + m_rotate_gizmo.stop_dragging(); + + // This is fast fix for second try to rotate + // When fixing, move grabber above text (not on side) + m_rotate_gizmo.set_angle(PI/2); + + // apply rotation + m_parent.do_rotate(L("Text-Rotate")); + m_rotate_start_angle.reset(); + volume_transformation_changed(); +} +void GLGizmoEmboss::on_dragging(const UpdateData &data) { m_rotate_gizmo.dragging(data); } + +EmbossStyles GLGizmoEmboss::create_default_styles() +{ + wxFontEnumerator::InvalidateCache(); + wxArrayString facenames = wxFontEnumerator::GetFacenames(Facenames::encoding); + + wxFont wx_font_normal = *wxNORMAL_FONT; +#ifdef __APPLE__ + // Set normal font to helvetica when possible + for (const wxString &facename : facenames) { + if (facename.IsSameAs("Helvetica")) { + wx_font_normal = wxFont(wxFontInfo().FaceName(facename).Encoding(Facenames::encoding)); + break; + } + } +#endif // __APPLE__ + + // https://docs.wxwidgets.org/3.0/classwx_font.html + // Predefined objects/pointers: wxNullFont, wxNORMAL_FONT, wxSMALL_FONT, wxITALIC_FONT, wxSWISS_FONT + EmbossStyles styles = { + WxFontUtils::create_emboss_style(wx_font_normal, _u8L("NORMAL")), // wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT) + WxFontUtils::create_emboss_style(*wxSMALL_FONT, _u8L("SMALL")), // A font using the wxFONTFAMILY_SWISS family and 2 points smaller than wxNORMAL_FONT. + WxFontUtils::create_emboss_style(*wxITALIC_FONT, _u8L("ITALIC")), // A font using the wxFONTFAMILY_ROMAN family and wxFONTSTYLE_ITALIC style and of the same size of wxNORMAL_FONT. + WxFontUtils::create_emboss_style(*wxSWISS_FONT, _u8L("SWISS")), // A font identic to wxNORMAL_FONT except for the family used which is wxFONTFAMILY_SWISS. + WxFontUtils::create_emboss_style(wxFont(10, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD), _u8L("MODERN")), + }; + + // Not all predefined font for wx must be valid TTF, but at least one style must be loadable + styles.erase(std::remove_if(styles.begin(), styles.end(), [](const EmbossStyle& style) { + wxFont wx_font = WxFontUtils::create_wxFont(style); + + // check that face name is setabled + if (style.prop.face_name.has_value()) { + wxString face_name = wxString::FromUTF8(style.prop.face_name->c_str()); + wxFont wx_font_temp; + if (!wx_font_temp.SetFaceName(face_name)) + return true; + } + + // Check that exsit valid TrueType Font for wx font + return WxFontUtils::create_font_file(wx_font) == nullptr; + }),styles.end() + ); + + // exist some valid style? + if (!styles.empty()) + return styles; + + // No valid style in defult list + // at least one style must contain loadable font + wxFont wx_font; + for (const wxString &face : facenames) { + wx_font = wxFont(face); + if (WxFontUtils::create_font_file(wx_font) != nullptr) + break; + wx_font = wxFont(); // NotOk + } + + if (wx_font.IsOk()) { + // use first alphabetic sorted installed font + styles.push_back(WxFontUtils::create_emboss_style(wx_font, _u8L("First font"))); + } else { + // On current OS is not installed any correct TTF font + // use font packed with Slic3r + std::string font_path = Slic3r::resources_dir() + "/fonts/NotoSans-Regular.ttf"; + styles.push_back(EmbossStyle{_u8L("Default font"), font_path, EmbossStyle::Type::file_path}); + } + return styles; +} + +namespace { + +/// +/// Check installed fonts whether optional face name exist in installed fonts +/// +/// Name from style - style.prop.face_name +/// All installed good and bad fonts - not const must be possible to initialize it +/// When it could be installed it contain value(potentionaly empty string) +std::optional get_installed_face_name(const std::optional &face_name_opt, ::Facenames& face_names) +{ + // Could exist OS without getter on face_name, + // but it is able to restore font from descriptor + // Soo default value must be TRUE + if (!face_name_opt.has_value()) + return wxString(); + + wxString face_name = wxString::FromUTF8(face_name_opt->c_str()); + + // search in enumerated fonts + // refresh list of installed font in the OS. + init_face_names(face_names); + face_names.is_init = false; + + auto cmp = [](const FaceName &fn, const wxString &wx_name) { return fn.wx_name < wx_name; }; + const std::vector &faces = face_names.faces; + // is font installed? + if (auto it = std::lower_bound(faces.begin(), faces.end(), face_name, cmp); + it != faces.end() && it->wx_name == face_name) + return face_name; + + const std::vector &bad = face_names.bad; + auto it_bad = std::lower_bound(bad.begin(), bad.end(), face_name); + if (it_bad == bad.end() || *it_bad != face_name) { + // check if wx allowed to set it up - another encoding of name + wxFontEnumerator::InvalidateCache(); + wxFont wx_font_; // temporary structure + if (wx_font_.SetFaceName(face_name) && WxFontUtils::create_font_file(wx_font_) != nullptr // can load TTF file? + ) { + return wxString(); + // QUESTION: add this name to allowed faces? + // Could create twin of font face name + // When not add it will be hard to select it again when change font + } + } + return {}; // not installed +} + +void init_text_lines(TextLinesModel &text_lines, const Selection& selection, /* const*/ StyleManager &style_manager, unsigned count_lines) +{ + const GLVolume *gl_volume_ptr = selection.get_first_volume(); + if (gl_volume_ptr == nullptr) + return; + const GLVolume &gl_volume = *gl_volume_ptr; + const ModelObjectPtrs &objects = selection.get_model()->objects; + const ModelVolume *mv_ptr = get_model_volume(gl_volume, objects); + if (mv_ptr == nullptr) + return; + const ModelVolume &mv = *mv_ptr; + if (mv.is_the_only_one_part()) + return; + + const std::optional &es_opt = mv.emboss_shape; + if (!es_opt.has_value()) + return; + const EmbossShape &es = *es_opt; + + const std::optional &tc_opt = mv.text_configuration; + if (!tc_opt.has_value()) + return; + const TextConfiguration &tc = *tc_opt; + + // calculate count lines when not set + if (count_lines == 0) { + count_lines = get_count_lines(tc.text); + if (count_lines == 0) + return; + } + + // prepare volumes to slice + ModelVolumePtrs volumes = prepare_volumes_to_slice(mv); + + // For interactivity during drag over surface it must be from gl_volume not volume. + Transform3d mv_trafo = gl_volume.get_volume_transformation().get_matrix(); + if (es.fix_3mf_tr.has_value()) + mv_trafo = mv_trafo * (es.fix_3mf_tr->inverse()); + text_lines.init(mv_trafo, volumes, style_manager, count_lines); +} +} + +void GLGizmoEmboss::reinit_text_lines(unsigned count_lines) { + init_text_lines(m_text_lines, m_parent.get_selection(), m_style_manager, count_lines); +} + +void GLGizmoEmboss::set_volume_by_selection() +{ + const Selection &selection = m_parent.get_selection(); + const GLVolume *gl_volume = get_selected_gl_volume(selection); + if (gl_volume == nullptr) + return reset_volume(); + + const ModelObjectPtrs &objects = m_parent.get_model()->objects; + ModelVolume *volume = get_model_volume(*gl_volume, objects); + if (volume == nullptr) + return reset_volume(); + + // is same volume as actual selected? + if (volume->id() == m_volume_id && + m_volume != nullptr && + volume->text_configuration->style == m_volume->text_configuration->style) + return; + + // for changed volume notification is NOT valid + remove_notification_not_valid_font(); + + // Do not use focused input value when switch volume(it must swith value) + if (m_volume != nullptr && m_volume != volume) // when update volume it changed id BUT not pointer + ImGuiWrapper::left_inputs(); + + // Is selected volume text volume? + const std::optional &tc_opt = volume->text_configuration; + if (!tc_opt.has_value()) + return reset_volume(); + + // Emboss shape must be setted + assert(volume->emboss_shape.has_value()); + if (!volume->emboss_shape.has_value()) + return; + + const TextConfiguration &tc = *tc_opt; + const EmbossStyle &style = tc.style; + + std::optional installed_name = get_installed_face_name(style.prop.face_name, *m_face_names); + + wxFont wx_font; + // load wxFont from same OS when font name is installed + if (style.type == WxFontUtils::get_current_type() && installed_name.has_value()) + wx_font = WxFontUtils::load_wxFont(style.path); + + // Flag that is selected same font + bool is_exact_font = true; + // Different OS or try found on same OS + if (!wx_font.IsOk()) { + is_exact_font = false; + // Try create similar wx font by FontFamily + wx_font = WxFontUtils::create_wxFont(style); + if (installed_name.has_value() && !installed_name->empty()) + is_exact_font = wx_font.SetFaceName(*installed_name); + + // Have to use some wxFont + if (!wx_font.IsOk()) + wx_font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); + } + assert(wx_font.IsOk()); + + // Load style to style manager + const auto &styles = m_style_manager.get_styles(); + auto has_same_name = [&name = style.name](const StyleManager::Style &style_item) { return style_item.name == name; }; + + StyleManager::Style style_{style}; // copy + style_.projection = volume->emboss_shape->projection; + style_.angle = calc_angle(selection); + style_.distance = calc_distance(*gl_volume, m_raycast_manager, m_parent); + + if (auto it = std::find_if(styles.begin(), styles.end(), has_same_name); + it == styles.end()) { + // style was not found + m_style_manager.load_style(style_, wx_font); + } else { + // style name is in styles list + size_t style_index = it - styles.begin(); + if (!m_style_manager.load_style(style_index)) { + // can`t load stored style + m_style_manager.erase(style_index); + m_style_manager.load_style(style_, wx_font); + } else { + // stored style is loaded, now set modification of style + m_style_manager.get_style() = style_; + m_style_manager.set_wx_font(wx_font); + } + } + + if (!is_exact_font) + create_notification_not_valid_font(tc); + + // cancel previous job + if (m_job_cancel != nullptr) { + m_job_cancel->store(true); + m_job_cancel = nullptr; + } + + m_text = tc.text; + m_volume = volume; + m_volume_id = volume->id(); + + if (tc.style.prop.per_glyph) + reinit_text_lines(); + + // Calculate current angle of up vector + assert(m_style_manager.is_active_font()); + if (m_style_manager.is_active_font()) + m_style_manager.get_style().angle = calc_angle(selection); + + // calculate scale for height and depth inside of scaled object instance + calculate_scale(); +} + +void GLGizmoEmboss::reset_volume() +{ + if (m_volume == nullptr) + return; // already reseted + + m_volume = nullptr; + m_volume_id.id = 0; + + // No more need of current notification + remove_notification_not_valid_font(); +} + +void GLGizmoEmboss::calculate_scale() { + Transform3d to_world = m_parent.get_selection().get_first_volume()->world_matrix(); + auto to_world_linear = to_world.linear(); + auto calc = [&to_world_linear](const Vec3d &axe, std::optional& scale)->bool { + Vec3d axe_world = to_world_linear * axe; + double norm_sq = axe_world.squaredNorm(); + if (is_approx(norm_sq, 1.)) { + if (scale.has_value()) + scale.reset(); + else + return false; + } else { + scale = sqrt(norm_sq); + } + return true; + }; + + bool exist_change = calc(Vec3d::UnitY(), m_scale_height); + exist_change |= calc(Vec3d::UnitZ(), m_scale_depth); + + // Change of scale has to change font imgui font size + if (exist_change) + m_style_manager.clear_imgui_font(); +} + +namespace { +bool is_text_empty(std::string_view text) { return text.empty() || text.find_first_not_of(" \n\t\r") == std::string::npos; } +} // namespace + +bool GLGizmoEmboss::process() +{ + // no volume is selected -> selection from right panel + assert(m_volume != nullptr); + if (m_volume == nullptr) return false; + + // without text there is nothing to emboss + if (is_text_empty(m_text)) return false; + + // exist loaded font file? + if (!m_style_manager.is_active_font()) return false; + + const Selection& selection = m_parent.get_selection(); + DataBasePtr base = create_emboss_data_base(m_text, m_style_manager, m_text_lines, selection, m_volume->type(), m_job_cancel); + DataUpdate data{std::move(base), m_volume->id()}; + + // check valid count of text lines + assert(data.base->text_lines.empty() || data.base->text_lines.size() == get_count_lines(m_text)); + + if (!start_update_volume(std::move(data), *m_volume, selection, m_raycast_manager)) + return false; + + // notification is removed befor object is changed by job + remove_notification_not_valid_font(); + return true; +} + +void GLGizmoEmboss::close() +{ + // remove volume when text is empty + if (m_volume != nullptr && + m_volume->text_configuration.has_value() && + is_text_empty(m_text)) { + Plater &p = *wxGetApp().plater(); + // is the text object? + if (m_volume->is_the_only_one_part()) { + // delete whole object + p.remove(m_parent.get_selection().get_object_idx()); + } else { + // delete text volume + p.remove_selected(); + } + } + + // close gizmo == open it again + auto& mng = m_parent.get_gizmos_manager(); + if (mng.get_current_type() == GLGizmosManager::Emboss) + mng.open_gizmo(GLGizmosManager::Emboss); +} + +void GLGizmoEmboss::draw_window() +{ +#ifdef ALLOW_DEBUG_MODE + if (ImGui::Button("re-process")) process(); +#endif // ALLOW_DEBUG_MODE + + // Setter of indent must be befor disable !!! + ImGui::PushStyleVar(ImGuiStyleVar_IndentSpacing, m_gui_cfg->indent); + ScopeGuard indent_sc([](){ ImGui::PopStyleVar(/*ImGuiStyleVar_IndentSpacing*/); }); + + // Disable all except selection of font, when open text from 3mf with unknown font + m_imgui->disabled_begin(m_is_unknown_font); + ScopeGuard unknown_font_sc([imgui = m_imgui]() { imgui->disabled_end(/*m_is_unknown_font*/); }); + + draw_text_input(); + + ImGui::Indent(); + // When unknown font is inside .3mf only font selection is allowed + m_imgui->disabled_end(/*m_is_unknown_font*/); + draw_font_list_line(); + m_imgui->disabled_begin(m_is_unknown_font); + bool use_inch = wxGetApp().app_config->get_bool("use_inches"); + draw_height(use_inch); + draw_depth(use_inch); + ImGui::Unindent(); + + // close advanced style property when unknown font is selected + if (m_is_unknown_font && m_is_advanced_edit_style) + ImGui::SetNextTreeNodeOpen(false); + + if (ImGui::TreeNode(_u8L("Advanced").c_str())) { + if (!m_is_advanced_edit_style) { + m_is_advanced_edit_style = true; + m_imgui->set_requires_extra_frame(); + } else { + draw_advanced(); + } + ImGui::TreePop(); + } else if (m_is_advanced_edit_style) { + m_is_advanced_edit_style = false; + m_imgui->set_requires_extra_frame(); + } + + ImGui::Separator(); + + draw_style_list(); + + // Do not select volume type, when it is text object + if (!m_volume->is_the_only_one_part()) { + ImGui::Separator(); + draw_model_type(); + } + +#ifdef SHOW_WX_FONT_DESCRIPTOR + if (is_selected_style) + m_imgui->text_colored(ImGuiWrapper::COL_GREY_DARK, m_style_manager.get_style().path); +#endif // SHOW_WX_FONT_DESCRIPTOR + +#ifdef SHOW_CONTAIN_3MF_FIX + if (m_volume!=nullptr && + m_volume->text_configuration.has_value() && + m_volume->text_configuration->fix_3mf_tr.has_value()) { + ImGui::SameLine(); + m_imgui->text_colored(ImGuiWrapper::COL_GREY_DARK, ".3mf"); + if (ImGui::IsItemHovered()) { + Transform3d &fix = *m_volume->text_configuration->fix_3mf_tr; + std::stringstream ss; + ss << fix.matrix(); + std::string filename = (m_volume->source.input_file.empty())? "unknown.3mf" : + m_volume->source.input_file + ".3mf"; + ImGui::SetTooltip("Text configuation contain \n" + "Fix Transformation Matrix \n" + "%s\n" + "loaded from \"%s\" file.", + ss.str().c_str(), filename.c_str() + ); + } + } +#endif // SHOW_CONTAIN_3MF_FIX +#ifdef SHOW_ICONS_TEXTURE + auto &t = m_icons_texture; + ImGui::Image((void *) t.get_id(), ImVec2(t.get_width(), t.get_height())); +#endif //SHOW_ICONS_TEXTURE +#ifdef SHOW_IMGUI_ATLAS + const auto &atlas = m_style_manager.get_atlas(); + ImGui::Image(atlas.TexID, ImVec2(atlas.TexWidth, atlas.TexHeight)); +#endif // SHOW_IMGUI_ATLAS + +#ifdef ALLOW_OPEN_NEAR_VOLUME + ImGui::SameLine(); + if (ImGui::Checkbox("##ALLOW_OPEN_NEAR_VOLUME", &m_allow_open_near_volume)) { + if (m_allow_open_near_volume) + m_set_window_offset = calc_fine_position(m_parent.get_selection(), get_minimal_window_size(), m_parent.get_canvas_size()); + } else if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("%s", ((m_allow_open_near_volume) ? + "Fix settings position": + "Allow floating window near text").c_str()); + } +#endif // ALLOW_FLOAT_WINDOW + } + +#include "imgui/imgui_internal.h" // scroll bar existence + +void GLGizmoEmboss::draw_text_input() +{ + auto create_range_text_prep = [&mng = m_style_manager, &text = m_text, &exist_unknown = m_text_contain_unknown_glyph]() { + auto& ff = mng.get_font_file_with_cache(); + assert(ff.has_value()); + const auto &cn = mng.get_font_prop().collection_number; + unsigned int font_index = (cn.has_value()) ? *cn : 0; + return create_range_text(text, *ff.font_file, font_index, &exist_unknown); + }; + + double scale = m_scale_height.has_value() ? *m_scale_height : 1.; + ImFont *imgui_font = m_style_manager.get_imgui_font(); + if (imgui_font == nullptr) { + // try create new imgui font + double screen_scale = wxDisplay(wxGetApp().plater()).GetScaleFactor(); + double imgui_scale = scale * screen_scale; + m_style_manager.create_imgui_font(create_range_text_prep(), imgui_scale); + imgui_font = m_style_manager.get_imgui_font(); + } + bool exist_font = + imgui_font != nullptr && + imgui_font->IsLoaded() && + imgui_font->Scale > 0.f && + imgui_font->ContainerAtlas != nullptr; + // NOTE: Symbol fonts doesn't have atlas + // when their glyph range is out of language character range + if (exist_font) ImGui::PushFont(imgui_font); + + // show warning about incorrectness view of font + std::string warning_tool_tip; + if (!exist_font) { + warning_tool_tip = _u8L("The text cannot be written using the selected font. Please try choosing a different font."); + } else { + auto append_warning = [&warning_tool_tip](std::string t) { + if (!warning_tool_tip.empty()) + warning_tool_tip += "\n"; + warning_tool_tip += t; + }; + if (is_text_empty(m_text)) + append_warning(_u8L("Embossed text cannot contain only white spaces.")); + if (m_text_contain_unknown_glyph) + append_warning(_u8L("Text contains character glyph (represented by '?') unknown by font.")); + + const FontProp &prop = m_style_manager.get_font_prop(); + if (prop.skew.has_value()) append_warning(_u8L("Text input doesn't show font skew.")); + if (prop.boldness.has_value()) append_warning(_u8L("Text input doesn't show font boldness.")); + if (prop.line_gap.has_value()) append_warning(_u8L("Text input doesn't show gap between lines.")); + auto &ff = m_style_manager.get_font_file_with_cache(); + float imgui_size = StyleManager::get_imgui_font_size(prop, *ff.font_file, scale); + if (imgui_size > StyleManager::max_imgui_font_size) + append_warning(_u8L("Too tall, diminished font height inside text input.")); + if (imgui_size < StyleManager::min_imgui_font_size) + append_warning(_u8L("Too small, enlarged font height inside text input.")); + bool is_multiline = m_text_lines.get_lines().size() > 1; + if (is_multiline && (prop.align.first == FontProp::HorizontalAlign::center || prop.align.first == FontProp::HorizontalAlign::right)) + append_warning(_u8L("Text doesn't show current horizontal alignment.")); + } + + // flag for extend font ranges if neccessary + // ranges can't be extend during font is activ(pushed) + std::string range_text; + ImVec2 input_size(m_gui_cfg->text_size.x, m_gui_cfg->text_size.y); + const ImGuiInputTextFlags flags = ImGuiInputTextFlags_AllowTabInput | ImGuiInputTextFlags_AutoSelectAll; + if (ImGui::InputTextMultiline("##Text", &m_text, input_size, flags)) { + if (m_style_manager.get_font_prop().per_glyph) { + unsigned count_lines = get_count_lines(m_text); + if (count_lines != m_text_lines.get_lines().size()) + // Necesarry to initialize count by given number (differ from stored in volume at the moment) + reinit_text_lines(count_lines); + } + process(); + range_text = create_range_text_prep(); + } + + if (exist_font) ImGui::PopFont(); + + // warning tooltip has to be with default font + if (!warning_tool_tip.empty()) { + // Multiline input has hidden window for scrolling + const ImGuiWindow *input = ImGui::GetCurrentWindow()->DC.ChildWindows.front(); + const ImGuiStyle &style = ImGui::GetStyle(); + float scrollbar_width = (input->ScrollbarY) ? style.ScrollbarSize : 0.f; + float scrollbar_height = (input->ScrollbarX) ? style.ScrollbarSize : 0.f; + + if (ImGui::IsItemHovered()) + m_imgui->tooltip(warning_tool_tip, m_gui_cfg->max_tooltip_width); + + ImVec2 cursor = ImGui::GetCursorPos(); + float width = ImGui::GetContentRegionAvailWidth(); + const ImVec2& padding = style.FramePadding; + ImVec2 icon_pos(width - m_gui_cfg->icon_width - scrollbar_width + padding.x, + cursor.y - m_gui_cfg->icon_width - scrollbar_height - 2*padding.y); + + ImGui::SetCursorPos(icon_pos); + draw(get_icon(m_icons, IconType::exclamation, IconState::hovered)); + ImGui::SetCursorPos(cursor); + } + + // NOTE: must be after ImGui::font_pop() + // -> imgui_font has to be unused + // IMPROVE: only extend not clear + // Extend font ranges + if (!range_text.empty() && + !ImGuiWrapper::contain_all_glyphs(imgui_font, range_text) ) + m_style_manager.clear_imgui_font(); +} + +// create texture for visualization font face +void GLGizmoEmboss::init_font_name_texture() { + Timer t("init_font_name_texture"); + // check if already exists + GLuint &id = m_face_names->texture_id; + if (id != 0) return; + // create texture for font + GLenum target = GL_TEXTURE_2D; + glsafe(::glGenTextures(1, &id)); + glsafe(::glBindTexture(target, id)); + glsafe(::glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST)); + glsafe(::glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); + const Vec2i &size = m_gui_cfg->face_name_size; + GLint w = size.x(), h = m_face_names->count_cached_textures * size.y(); + std::vector data(4*w * h, {0}); + const GLenum format = GL_RGBA, type = GL_UNSIGNED_BYTE; + const GLint level = 0, internal_format = GL_RGBA, border = 0; + glsafe(::glTexImage2D(target, level, internal_format, w, h, border, format, type, data.data())); + + // bind default texture + GLuint no_texture_id = 0; + glsafe(::glBindTexture(target, no_texture_id)); + + // clear info about creation of texture - no one is initialized yet + for (FaceName &face : m_face_names->faces) { + face.cancel = nullptr; + face.is_created = nullptr; + } + + // Prepare filtration cache + //m_face_names->hide = std::vector(m_face_names->faces.size(), {false}); +} + +bool GLGizmoEmboss::select_facename(const wxString &facename) +{ + if (!wxFontEnumerator::IsValidFacename(facename)) return false; + // Select font + wxFont wx_font(wxFontInfo().FaceName(facename).Encoding(Facenames::encoding)); + if (!wx_font.IsOk()) return false; +#ifdef USE_PIXEL_SIZE_IN_WX_FONT + // wx font could change source file by size of font + int point_size = static_cast(m_style_manager.get_font_prop().size_in_mm); + wx_font.SetPointSize(point_size); +#endif // USE_PIXEL_SIZE_IN_WX_FONT + if (!m_style_manager.set_wx_font(wx_font)) return false; + process(); + return true; +} + +void GLGizmoEmboss::push_button_style(bool pressed) +{ + if (m_is_dark_mode) { + if (pressed) { + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(43 / 255.f, 64 / 255.f, 54 / 255.f, 1.f)); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(43 / 255.f, 64 / 255.f, 54 / 255.f, 1.f)); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(43 / 255.f, 64 / 255.f, 54 / 255.f, 1.f)); + ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0.f, 174 / 255.f, 66 / 255.f, 1.f)); + } + else { + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(45.f / 255.f, 45.f / 255.f, 49.f / 255.f, 1.f)); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(84 / 255.f, 84 / 255.f, 90 / 255.f, 1.f)); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(84 / 255.f, 84 / 255.f, 90 / 255.f, 1.f)); + ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(45.f / 255.f, 45.f / 255.f, 49.f / 255.f, 1.f)); + } + } + else { + if (pressed) { + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(219 / 255.f, 253 / 255.f, 231 / 255.f, 1.f)); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(219 / 255.f, 253 / 255.f, 231 / 255.f, 1.f)); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(219 / 255.f, 253 / 255.f, 231 / 255.f, 1.f)); + ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0.f, 174 / 255.f, 66 / 255.f, 1.f)); + } + else { + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(1.f, 1.f, 1.f, 1.f)); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(238 / 255.f, 238 / 255.f, 238 / 255.f, 1.f)); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(238 / 255.f, 238 / 255.f, 238 / 255.f, 1.f)); + ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(1.f, 1.f, 1.f, 1.f)); + } + + } +} + +void GLGizmoEmboss::pop_button_style() +{ + ImGui::PopStyleColor(4); +} + +void GLGizmoEmboss::draw_font_list_line() +{ + ImGui::AlignTextToFramePadding(); + + bool exist_stored_style = m_style_manager.exist_stored_style(); + bool exist_change_in_font = m_style_manager.is_font_changed(); + const std::string& font_text = m_gui_cfg->translations.font; + if (exist_change_in_font || !exist_stored_style) + ImGuiWrapper::text_colored(ImGuiWrapper::COL_ORCA, font_text); + else + ImGuiWrapper::text(font_text); + + ImGui::SameLine(m_gui_cfg->input_offset); + + draw_font_list(); + + bool exist_change = false; + if (!m_is_unknown_font) { + ImGui::SameLine(); + if (draw_italic_button()) + exist_change = true; + ImGui::SameLine(); + if (draw_bold_button()) + exist_change = true; + } else { + // when exist unknown font add confirmation button + ImGui::SameLine(); + // Apply for actual selected font + if (ImGui::Button(_u8L("Apply").c_str())) + exist_change = true; + } + + EmbossStyle &style = m_style_manager.get_style(); + if (exist_change_in_font) { + ImGui::SameLine(ImGui::GetStyle().WindowPadding.x); + if (draw_button(m_icons, IconType::undo)) { + const EmbossStyle *stored_style = m_style_manager.get_stored_style(); + + style.path = stored_style->path; + style.prop.boldness = stored_style->prop.boldness; + style.prop.skew = stored_style->prop.skew; + + wxFont new_wx_font = WxFontUtils::load_wxFont(style.path); + if (new_wx_font.IsOk() && m_style_manager.set_wx_font(new_wx_font)) + exist_change = true; + } else if (ImGui::IsItemHovered()) + m_imgui->tooltip(_u8L("Revert font changes."), m_gui_cfg->max_tooltip_width); + } + + if (exist_change) { + m_style_manager.clear_glyphs_cache(); + if (m_style_manager.get_font_prop().per_glyph) + reinit_text_lines(m_text_lines.get_lines().size()); + process(); + } +} + +void GLGizmoEmboss::draw_font_list() +{ + ImGuiWrapper::push_combo_style(m_gui_cfg->screen_scale); + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_PopupRounding, 4.0f * m_gui_cfg->screen_scale); + + wxString tooltip_name = ""; + + // Set partial + wxString actual_face_name; + if (m_style_manager.is_active_font()) { + const wxFont &wx_font = m_style_manager.get_wx_font(); + if (wx_font.IsOk()) + actual_face_name = wx_font.GetFaceName(); + } + // name of actual selected font + const char * selected = (!actual_face_name.empty()) ? + (const char *)actual_face_name.c_str() : " --- "; + + // Do not remove font face during enumeration + // When deletation of font appear this variable is set + std::optional del_index; + + ImGui::SetNextItemWidth(2 * m_gui_cfg->input_width); + std::vector filtered_items_idx; + bool is_filtered = false; + if (m_imgui->bbl_combo_with_filter("##Combo_Font", selected, m_face_names->faces_names, + &filtered_items_idx, &is_filtered, m_imgui->scaled(32.f / 15.f))) { + bool set_selection_focus = false; + if (!m_face_names->is_init) { + init_face_names(*m_face_names); + set_selection_focus = true; + } + + if (!m_face_names->has_truncated_names) + init_truncated_names(*m_face_names, m_gui_cfg->input_width); + + if (m_face_names->texture_id == 0) + init_font_name_texture(); + + int show_items_count = is_filtered ? filtered_items_idx.size() : m_face_names->faces.size(); + + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0)); + ImGui::PushStyleVar(ImGuiStyleVar_ItemInnerSpacing, ImVec2(0, 0)); + ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 0); + + for (int i = 0; i < show_items_count; i++) { + int idx = is_filtered ? filtered_items_idx[i] : i; + FaceName &face = m_face_names->faces[idx]; + const wxString &wx_face_name = face.wx_name; + + ImGui::PushID(idx); + ScopeGuard sg([]() { ImGui::PopID(); }); + bool is_selected = (actual_face_name == wx_face_name); + ImVec2 selectable_size(0, m_imgui->scaled(32.f / 15.f)); + ImGuiSelectableFlags flags = 0; + if (ImGui::BBLSelectable(face.name_truncated.c_str(), is_selected, flags, selectable_size)) { + if (!select_facename(wx_face_name)) { + del_index = idx; + MessageDialog(wxGetApp().plater(), GUI::format_wxstr(_L("Font \"%1%\" can't be selected."), wx_face_name)); + } else { + ImGui::CloseCurrentPopup(); + } + } + // tooltip as full name of font face + if (ImGui::IsItemHovered()) + tooltip_name = wx_face_name; + + if (is_selected) { + ImGui::SetItemDefaultFocus(); + } + + // on first draw set focus on selected font + if (set_selection_focus && is_selected) + ImGui::SetScrollHereY(); + ::draw_font_preview(face, m_text, *m_face_names, *m_gui_cfg, ImGui::IsItemVisible()); + } + + ImGui::PopStyleVar(3); + ImGui::EndListBox(); + ImGui::EndPopup(); + } else if (m_face_names->is_init) { + // Just one after close combo box + // free texture and set id to zero + m_face_names->is_init = false; + // cancel all process for generation of texture + for (FaceName &face : m_face_names->faces) + if (face.cancel != nullptr) + face.cancel->store(true); + glsafe(::glDeleteTextures(1, &m_face_names->texture_id)); + m_face_names->texture_id = 0; + } + + // delete unloadable face name when try to use + if (del_index.has_value()) { + auto face = m_face_names->faces.begin() + (*del_index); + std::vector& bad = m_face_names->bad; + // sorted insert into bad fonts + auto it = std::upper_bound(bad.begin(), bad.end(), face->wx_name); + bad.insert(it, face->wx_name); + m_face_names->faces.erase(face); + m_face_names->faces_names.erase(m_face_names->faces_names.begin() + (*del_index)); + // update cached file + store(*m_face_names); + } + +#ifdef ALLOW_ADD_FONT_BY_FILE + ImGui::SameLine(); + // select font file by file browser + if (draw_button(IconType::open_file)) { + if (choose_true_type_file()) { + process(); + } + } else if (ImGui::IsItemHovered()) + ImGui::SetTooltip("Add file with font(.ttf, .ttc)"); +#endif // ALLOW_ADD_FONT_BY_FILE + +#ifdef ALLOW_ADD_FONT_BY_OS_SELECTOR + ImGui::SameLine(); + if (draw_button(IconType::system_selector)) { + if (choose_font_by_wxdialog()) { + process(); + } + } else if (ImGui::IsItemHovered()) + ImGui::SetTooltip("Open dialog for choose from fonts."); +#endif // ALLOW_ADD_FONT_BY_OS_SELECTOR + + ImGui::PopStyleVar(2); + ImGuiWrapper::pop_combo_style(); + + if (!tooltip_name.IsEmpty()) + m_imgui->tooltip(tooltip_name, m_gui_cfg->max_tooltip_width); +} + +void GLGizmoEmboss::draw_model_type() +{ + ImGui::AlignTextToFramePadding(); + bool is_last_solid_part = m_volume->is_the_only_one_part(); + std::string title = _u8L("Operation"); + if (is_last_solid_part) { + ImVec4 color{.5f, .5f, .5f, 1.f}; + m_imgui->text_colored(color, title.c_str()); + } else { + ImGui::Text("%s", title.c_str()); + } + + std::optional new_type; + ModelVolumeType modifier = ModelVolumeType::PARAMETER_MODIFIER; + ModelVolumeType negative = ModelVolumeType::NEGATIVE_VOLUME; + ModelVolumeType part = ModelVolumeType::MODEL_PART; + ModelVolumeType type = m_volume->type(); + + //TRN EmbossOperation + ImGuiWrapper::push_radio_style(); + if (ImGui::RadioButton(_u8L("Join").c_str(), type == part)) + new_type = part; + else if (ImGui::IsItemHovered()) + m_imgui->tooltip(_u8L("Click to change text into object part."), m_gui_cfg->max_tooltip_width); + ImGui::SameLine(); + + std::string last_solid_part_hint = _u8L("You can't change a type of the last solid part of the object."); + if (ImGui::RadioButton(_CTX_utf8(L_CONTEXT("Cut", "EmbossOperation"), "EmbossOperation").c_str(), type == negative)) + new_type = negative; + else if (ImGui::IsItemHovered()) { + if (is_last_solid_part) + m_imgui->tooltip(last_solid_part_hint, m_gui_cfg->max_tooltip_width); + else if (type != negative) + m_imgui->tooltip(_u8L("Click to change part type into negative volume."), m_gui_cfg->max_tooltip_width); + } + + // In simple mode are not modifiers + if (wxGetApp().plater()->printer_technology() != ptSLA && wxGetApp().get_mode() != ConfigOptionMode::comSimple) { + ImGui::SameLine(); + if (ImGui::RadioButton(_u8L("Modifier").c_str(), type == modifier)) + new_type = modifier; + else if (ImGui::IsItemHovered()) { + if (is_last_solid_part) + m_imgui->tooltip(last_solid_part_hint, m_gui_cfg->max_tooltip_width); + else if (type != modifier) + m_imgui->tooltip(_u8L("Click to change part type into modifier."), m_gui_cfg->max_tooltip_width); + } + } + ImGuiWrapper::pop_radio_style(); + + if (m_volume != nullptr && new_type.has_value() && !is_last_solid_part) { + GUI_App &app = wxGetApp(); + Plater * plater = app.plater(); + Plater::TakeSnapshot snapshot(plater, _u8L("Change Text Type"), UndoRedo::SnapshotType::GizmoAction); + m_volume->set_type(*new_type); + + bool is_volume_move_inside = (type == part); + bool is_volume_move_outside = (*new_type == part); + // Update volume position when switch (from part) or (into part) + if ((is_volume_move_inside || is_volume_move_outside)) + process(); + + // inspiration in ObjectList::change_part_type() + // how to view correct side panel with objects + ObjectList *obj_list = app.obj_list(); + wxDataViewItemArray sel = obj_list->reorder_volumes_and_get_selection( + obj_list->get_selected_obj_idx(), + [volume = m_volume](const ModelVolume *vol) { return vol == volume; }); + if (!sel.IsEmpty()) obj_list->select_item(sel.front()); + + // NOTE: on linux, function reorder_volumes_and_get_selection call GLCanvas3D::reload_scene(refresh_immediately = false) + // which discard m_volume pointer and set it to nullptr also selection is cleared so gizmo is automaticaly closed + auto &mng = m_parent.get_gizmos_manager(); + if (mng.get_current_type() != GLGizmosManager::Emboss) + mng.open_gizmo(GLGizmosManager::Emboss); + // TODO: select volume back - Ask @Sasa + } +} + +void GLGizmoEmboss::draw_style_rename_popup() { + std::string& new_name = m_style_manager.get_style().name; + const std::string &old_name = m_style_manager.get_stored_style()->name; + std::string text_in_popup = GUI::format(_L("Rename style(%1%) for embossing text"), old_name) + ": "; + ImGui::Text("%s", text_in_popup.c_str()); + + bool is_unique = (new_name == old_name) || // could be same as before rename + m_style_manager.is_unique_style_name(new_name); + + bool allow_change = false; + if (new_name.empty()) { + ImGuiWrapper::text_colored(ImGuiWrapper::COL_ORANGE_DARK, _u8L("Name can't be empty.")); + }else if (!is_unique) { + ImGuiWrapper::text_colored(ImGuiWrapper::COL_ORANGE_DARK, _u8L("Name has to be unique.")); + } else { + ImGui::NewLine(); + allow_change = true; + } + + bool store = false; + ImGuiInputTextFlags flags = ImGuiInputTextFlags_EnterReturnsTrue; + if (ImGui::InputText("##rename style", &new_name, flags) && allow_change) store = true; + if (m_imgui->button(_L("OK"), ImVec2(0.f, 0.f), allow_change)) store = true; + ImGui::SameLine(); + if (ImGui::Button(_u8L("Cancel").c_str())) { + new_name = old_name; + ImGui::CloseCurrentPopup(); + } + + if (store) { + // rename style in all objects and volumes + for (const ModelObject *mo :wxGetApp().plater()->model().objects) { + for (ModelVolume *mv : mo->volumes) { + if (!mv->text_configuration.has_value()) continue; + std::string& name = mv->text_configuration->style.name; + if (name != old_name) continue; + name = new_name; + } + } + + m_style_manager.rename(new_name); + m_style_manager.store_styles_to_app_config(); + ImGui::CloseCurrentPopup(); + } +} + +void GLGizmoEmboss::draw_style_rename_button() +{ + bool can_rename = m_style_manager.exist_stored_style(); + std::string title = _u8L("Rename style"); + const char * popup_id = title.c_str(); + if (draw_button(m_icons, IconType::rename, !can_rename)) { + assert(m_style_manager.get_stored_style()); + ImGui::OpenPopup(popup_id); + } + else if (ImGui::IsItemHovered()) { + if (can_rename) m_imgui->tooltip(_u8L("Rename current style."), m_gui_cfg->max_tooltip_width); + else m_imgui->tooltip(_u8L("Can't rename temporary style."), m_gui_cfg->max_tooltip_width); + } + if (ImGui::BeginPopupModal(popup_id, 0, ImGuiWindowFlags_AlwaysAutoResize)) { + m_imgui->disable_background_fadeout_animation(); + draw_style_rename_popup(); + ImGui::EndPopup(); + } +} + +void GLGizmoEmboss::draw_style_save_button(bool is_modified) +{ + if (draw_button(m_icons, IconType::save, !is_modified)) { + // save styles to app config + m_style_manager.store_styles_to_app_config(); + }else if (ImGui::IsItemHovered()) { + std::string tooltip; + if (!m_style_manager.exist_stored_style()) { + tooltip = _u8L("First Add style to list."); + } else if (is_modified) { + tooltip = GUI::format(_L("Save %1% style"), m_style_manager.get_style().name); + } else { + tooltip = _u8L("No changes to save."); + } + m_imgui->tooltip(tooltip, m_gui_cfg->max_tooltip_width); + } +} + +void GLGizmoEmboss::draw_style_save_as_popup() { + ImGui::Text("%s", (_u8L("New name of style") +": ").c_str()); + + // use name inside of volume configuration as temporary new name + std::string &new_name = m_volume->text_configuration->style.name; + bool is_unique = m_style_manager.is_unique_style_name(new_name); + bool allow_change = false; + if (new_name.empty()) { + ImGuiWrapper::text_colored(ImGuiWrapper::COL_ORANGE_DARK, _u8L("Name can't be empty.")); + }else if (!is_unique) { + ImGuiWrapper::text_colored(ImGuiWrapper::COL_ORANGE_DARK, _u8L("Name has to be unique.")); + } else { + ImGui::NewLine(); + allow_change = true; + } + + bool save_style = false; + ImGuiInputTextFlags flags = ImGuiInputTextFlags_EnterReturnsTrue; + if (ImGui::InputText("##save as style", &new_name, flags)) + save_style = true; + + if (m_imgui->button(_L("OK"), ImVec2(0.f, 0.f), allow_change)) + save_style = true; + + ImGui::SameLine(); + if (ImGui::Button(_u8L("Cancel").c_str())){ + // write original name to volume TextConfiguration + new_name = m_style_manager.get_style().name; + ImGui::CloseCurrentPopup(); + } + + if (save_style && allow_change) { + m_style_manager.add_style(new_name); + m_style_manager.store_styles_to_app_config(); + ImGui::CloseCurrentPopup(); + } +} + +void GLGizmoEmboss::draw_style_add_button() +{ + bool only_add_style = !m_style_manager.exist_stored_style(); + bool can_add = true; + if (only_add_style && + m_volume->text_configuration->style.type != WxFontUtils::get_current_type()) + can_add = false; + + std::string title = _u8L("Save as new style"); + const char *popup_id = title.c_str(); + // save as new style + ImGui::SameLine(); + if (draw_button(m_icons, IconType::add, !can_add)) { + if (!m_style_manager.exist_stored_style()) { + m_style_manager.store_styles_to_app_config(wxGetApp().app_config); + } else { + ImGui::OpenPopup(popup_id); + } + } else if (ImGui::IsItemHovered()) { + if (!can_add) { + m_imgui->tooltip(_u8L("Only valid font can be added to style."), m_gui_cfg->max_tooltip_width); + } else if (only_add_style) { + m_imgui->tooltip(_u8L("Add style to my list."), m_gui_cfg->max_tooltip_width); + } else { + m_imgui->tooltip(_u8L("Save as new style."), m_gui_cfg->max_tooltip_width); + } + } + + if (ImGui::BeginPopupModal(popup_id, nullptr, ImGuiWindowFlags_AlwaysAutoResize)) { + m_imgui->disable_background_fadeout_animation(); + draw_style_save_as_popup(); + ImGui::EndPopup(); + } +} + +void GLGizmoEmboss::draw_delete_style_button() { + bool is_stored = m_style_manager.exist_stored_style(); + bool is_last = m_style_manager.get_styles().size() == 1; + bool can_delete = is_stored && !is_last; + + if (draw_button(m_icons, IconType::erase, !can_delete)) { + std::string style_name = m_style_manager.get_style().name; // copy + wxString dialog_title = _L("Remove style"); + size_t next_style_index = std::numeric_limits::max(); + Plater *plater = wxGetApp().plater(); + bool exist_change = false; + while (true) { + // NOTE: can't use previous loaded activ index -> erase could change index + size_t active_index = m_style_manager.get_style_index(); + next_style_index = (active_index > 0) ? active_index - 1 : + active_index + 1; + + if (next_style_index >= m_style_manager.get_styles().size()) { + MessageDialog msg(plater, _L("Can't remove the last existing style."), dialog_title, wxICON_ERROR | wxOK); + msg.ShowModal(); + break; + } + + // IMPROVE: add function can_load? + // clean unactivable styles + if (!m_style_manager.load_style(next_style_index)) { + m_style_manager.erase(next_style_index); + exist_change = true; + continue; + } + + wxString message = GUI::format_wxstr(_L("Are you sure you want to permanently remove the \"%1%\" style?"), style_name); + MessageDialog msg(plater, message, dialog_title, wxICON_WARNING | wxYES | wxNO); + if (msg.ShowModal() == wxID_YES) { + // delete style + m_style_manager.erase(active_index); + exist_change = true; + process(); + } else { + // load back style + m_style_manager.load_style(active_index); + } + break; + } + if (exist_change) + m_style_manager.store_styles_to_app_config(wxGetApp().app_config); + } + + if (ImGui::IsItemHovered()) { + const std::string &style_name = m_style_manager.get_style().name; + std::string tooltip; + if (can_delete) tooltip = GUI::format(_L("Delete \"%1%\" style."), style_name); + else if (is_last) tooltip = GUI::format(_L("Can't delete \"%1%\". It is last style."), style_name); + else/*if(!is_stored)*/ tooltip = GUI::format(_L("Can't delete temporary style \"%1%\"."), style_name); + m_imgui->tooltip(tooltip, m_gui_cfg->max_tooltip_width); + } +} + +namespace { +// FIX IT: It should not change volume position before successfull change volume by process +void fix_transformation(const StyleManager::Style &from, const StyleManager::Style &to, GLCanvas3D &canvas) { + // fix Z rotation when exists difference in styles + const std::optional &f_angle_opt = from.angle; + const std::optional &t_angle_opt = to.angle; + if (!is_approx(f_angle_opt, t_angle_opt)) { + // fix rotation + float f_angle = f_angle_opt.value_or(.0f); + float t_angle = t_angle_opt.value_or(.0f); + do_local_z_rotate(canvas, t_angle - f_angle); + } + + // fix distance (Z move) when exists difference in styles + const std::optional &f_move_opt = from.distance; + const std::optional &t_move_opt = to.distance; + if (!is_approx(f_move_opt, t_move_opt)) { + float f_move = f_move_opt.value_or(.0f); + float t_move = t_move_opt.value_or(.0f); + do_local_z_move(canvas, t_move - f_move); + } +} +} // namesapce + +void GLGizmoEmboss::draw_style_list() { + if (!m_style_manager.is_active_font()) return; + + const StyleManager::Style *stored_style = nullptr; + bool is_stored = m_style_manager.exist_stored_style(); + if (is_stored) + stored_style = m_style_manager.get_stored_style(); + const StyleManager::Style ¤t_style = m_style_manager.get_style(); + bool is_changed = (stored_style)? !(*stored_style == current_style) : true; + bool is_modified = is_stored && is_changed; + + const float &max_style_name_width = m_gui_cfg->max_style_name_width; + std::string &trunc_name = m_style_manager.get_truncated_name(); + if (trunc_name.empty()) { + // generate trunc name + std::string current_name = current_style.name; + ImGuiWrapper::escape_double_hash(current_name); + trunc_name = ImGuiWrapper::trunc(current_name, max_style_name_width); + } + + std::string title = _u8L("Style"); + if (m_style_manager.exist_stored_style()) + ImGui::Text("%s", title.c_str()); + else + ImGui::TextColored(ImGuiWrapper::COL_ORCA, "%s", title.c_str()); + + ImGui::SetNextItemWidth(m_gui_cfg->input_width); + auto add_text_modify = [&is_modified](const std::string& name) { + if (!is_modified) return name; + return name + Preset::suffix_modified(); + }; + std::optional selected_style_index; + std::string tooltip = ""; + ImGuiWrapper::push_combo_style(m_parent.get_scale()); + if (ImGui::BBLBeginCombo("##style_selector", add_text_modify(trunc_name).c_str())) { + m_style_manager.init_style_images(m_gui_cfg->max_style_image_size, m_text); + m_style_manager.init_trunc_names(max_style_name_width); + std::optional> swap_indexes; + const StyleManager::Styles &styles = m_style_manager.get_styles(); + for (const StyleManager::Style &style : styles) { + size_t index = &style - &styles.front(); + const std::string &actual_style_name = style.name; + ImGui::PushID(actual_style_name.c_str()); + bool is_selected = (index == m_style_manager.get_style_index()); + + float select_height = static_cast(m_gui_cfg->max_style_image_size.y()); + ImVec2 select_size(0.f, select_height); // 0,0 --> calculate in draw + const std::optional &img = style.image; + // allow click delete button + ImGuiSelectableFlags_ flags = ImGuiSelectableFlags_AllowItemOverlap; + if (ImGui::BBLSelectable(style.truncated_name.c_str(), is_selected, flags, select_size)) { + selected_style_index = index; + } else if (ImGui::IsItemHovered()) + tooltip = actual_style_name; + + // reorder items + if (ImGui::IsItemActive() && !ImGui::IsItemHovered()) { + if (ImGui::GetMouseDragDelta(0).y < 0.f) { + if (index > 0) + swap_indexes = {index, index - 1}; + } else if ((index + 1) < styles.size()) + swap_indexes = {index, index + 1}; + if (swap_indexes.has_value()) + ImGui::ResetMouseDragDelta(); + } + + // draw style name + if (img.has_value()) { + ImGui::SameLine(max_style_name_width); + ImVec4 tint_color = ImGui::GetStyleColorVec4(ImGuiCol_Text); + ImGui::Image(img->texture_id, img->tex_size, img->uv0, img->uv1, tint_color); + } + + ImGui::PopID(); + } + if (swap_indexes.has_value()) + m_style_manager.swap(swap_indexes->first, + swap_indexes->second); + ImGui::EndCombo(); + } else { + // do not keep in memory style images when no combo box open + m_style_manager.free_style_images(); + if (ImGui::IsItemHovered()) { + std::string style_name = add_text_modify(current_style.name); + tooltip = is_modified? + GUI::format(_L("Modified style \"%1%\""), current_style.name): + GUI::format(_L("Current style is \"%1%\""), current_style.name); + } + } + ImGuiWrapper::pop_combo_style(); + if (!tooltip.empty()) + m_imgui->tooltip(tooltip, m_gui_cfg->max_tooltip_width); + + // Check whether user wants lose actual style modification + if (selected_style_index.has_value() && is_modified) { + const std::string & style_name = m_style_manager.get_styles()[*selected_style_index].name; + wxString message = GUI::format_wxstr(_L("Changing style to \"%1%\" will discard current style modification.\n\nWould you like to continue anyway?"), style_name); + MessageDialog not_loaded_style_message(nullptr, message, _L("Warning"), wxICON_WARNING | wxYES | wxNO); + if (not_loaded_style_message.ShowModal() != wxID_YES) + selected_style_index.reset(); + } + + // selected style from combo box + if (selected_style_index.has_value()) { + const StyleManager::Style &style = m_style_manager.get_styles()[*selected_style_index]; + // create copy to be able do fix transformation only when successfully load style + StyleManager::Style cur_s = current_style; // copy + StyleManager::Style new_s = style; // copy + if (m_style_manager.load_style(*selected_style_index)) { + ::fix_transformation(cur_s, new_s, m_parent); + process(); + } else { + wxString title = _L("Not valid style."); + wxString message = GUI::format_wxstr(_L("Style \"%1%\" can't be used and will be removed from a list."), style.name); + MessageDialog not_loaded_style_message(nullptr, message, title, wxOK); + not_loaded_style_message.ShowModal(); + m_style_manager.erase(*selected_style_index); + } + } + + ImGui::SameLine(); + draw_style_rename_button(); + + ImGui::SameLine(); + draw_style_save_button(is_modified); + + ImGui::SameLine(); + draw_style_add_button(); + + // delete button + ImGui::SameLine(); + draw_delete_style_button(); +} + +bool GLGizmoEmboss::draw_italic_button() +{ + const wxFont &wx_font = m_style_manager.get_wx_font(); + const auto& ff = m_style_manager.get_font_file_with_cache(); + if (!wx_font.IsOk() || !ff.has_value()) { + draw(get_icon(m_icons, IconType::italic, IconState::disabled)); + return false; + } + + std::optional &skew = m_style_manager.get_font_prop().skew; + bool is_font_italic = skew.has_value() || WxFontUtils::is_italic(wx_font); + if (is_font_italic) { + // unset italic + if (clickable(get_icon(m_icons, IconType::italic, IconState::hovered), + get_icon(m_icons, IconType::unitalic, IconState::hovered))) { + skew.reset(); + if (wx_font.GetStyle() != wxFontStyle::wxFONTSTYLE_NORMAL) { + wxFont new_wx_font = wx_font; // copy + new_wx_font.SetStyle(wxFontStyle::wxFONTSTYLE_NORMAL); + if(!m_style_manager.set_wx_font(new_wx_font)) + return false; + } + return true; + } + if (ImGui::IsItemHovered()) + m_imgui->tooltip(_u8L("Unset italic"), m_gui_cfg->max_tooltip_width); + } else { + // set italic + if (draw_button(m_icons, IconType::italic)) { + wxFont new_wx_font = wx_font; // copy + auto new_ff = WxFontUtils::set_italic(new_wx_font, *ff.font_file); + if (new_ff != nullptr) { + if(!m_style_manager.set_wx_font(new_wx_font, std::move(new_ff))) + return false; + } else { + // italic font doesn't exist + // add skew when wxFont can't set it + skew = 0.2f; + } + return true; + } + if (ImGui::IsItemHovered()) + m_imgui->tooltip(_u8L("Set italic"), m_gui_cfg->max_tooltip_width); + } + return false; +} + +bool GLGizmoEmboss::draw_bold_button() { + const wxFont &wx_font = m_style_manager.get_wx_font(); + const auto& ff = m_style_manager.get_font_file_with_cache(); + if (!wx_font.IsOk() || !ff.has_value()) { + draw(get_icon(m_icons, IconType::bold, IconState::disabled)); + return false; + } + + std::optional &boldness = m_style_manager.get_font_prop().boldness; + bool is_font_bold = boldness.has_value() || WxFontUtils::is_bold(wx_font); + if (is_font_bold) { + // unset bold + if (clickable(get_icon(m_icons, IconType::bold, IconState::hovered), + get_icon(m_icons, IconType::unbold, IconState::hovered))) { + boldness.reset(); + if (wx_font.GetWeight() != wxFontWeight::wxFONTWEIGHT_NORMAL) { + wxFont new_wx_font = wx_font; // copy + new_wx_font.SetWeight(wxFontWeight::wxFONTWEIGHT_NORMAL); + if(!m_style_manager.set_wx_font(new_wx_font)) + return false; + } + return true; + } + if (ImGui::IsItemHovered()) + m_imgui->tooltip(_u8L("Unset bold"), m_gui_cfg->max_tooltip_width); + } else { + // set bold + if (draw_button(m_icons, IconType::bold)) { + wxFont new_wx_font = wx_font; // copy + auto new_ff = WxFontUtils::set_bold(new_wx_font, *ff.font_file); + if (new_ff != nullptr) { + if(!m_style_manager.set_wx_font(new_wx_font, std::move(new_ff))) + return false; + } else { + // bold font can't be loaded + // set up boldness + boldness = 20.f; + //font_file->cache.empty(); + } + return true; + } + if (ImGui::IsItemHovered()) + m_imgui->tooltip(_u8L("Set bold"), m_gui_cfg->max_tooltip_width); + } + return false; +} + +template bool exist_change(const T &value, const T *default_value){ + if (default_value == nullptr) return false; + return (value != *default_value); +} + +template<> bool exist_change(const std::optional &value, const std::optional *default_value){ + if (default_value == nullptr) return false; + return !is_approx(value, *default_value); +} + +template<> bool exist_change(const float &value, const float *default_value){ + if (default_value == nullptr) return false; + return !is_approx(value, *default_value); +} + +template +bool GLGizmoEmboss::revertible(const std::string &name, + T &value, + const T *default_value, + const std::string &undo_tooltip, + float undo_offset, + Draw draw) const +{ + ImGui::AlignTextToFramePadding(); + bool changed = exist_change(value, default_value); + if (changed || default_value == nullptr) + ImGuiWrapper::text_colored(ImGuiWrapper::COL_ORCA, name); + else + ImGuiWrapper::text(name); + + // render revert changes button + if (changed) { + ImGuiWindow *window = ImGui::GetCurrentWindow(); + float prev_x = window->DC.CursorPosPrevLine.x; + ImGui::SameLine(undo_offset); // change cursor postion + if (draw_button(m_icons, IconType::undo)) { + value = *default_value; + return true; + } else if (ImGui::IsItemHovered()) + m_imgui->tooltip(undo_tooltip, m_gui_cfg->max_tooltip_width); + window->DC.CursorPosPrevLine.x = prev_x; // set back previous position + } + return draw(); +} +// May be move to ImGuiWrapper +template bool imgui_input(const char *label, T *v, T step, T step_fast, const char *format, ImGuiInputTextFlags flags); +template<> bool imgui_input(const char *label, float *v, float step, float step_fast, const char *format, ImGuiInputTextFlags flags) +{ return ImGui::InputFloat(label, v, step, step_fast, format, flags); } +template<> bool imgui_input(const char *label, double *v, double step, double step_fast, const char *format, ImGuiInputTextFlags flags) +{ return ImGui::InputDouble(label, v, step, step_fast, format, flags); } + +template +bool GLGizmoEmboss::rev_input(const std::string &name, T &value, const T *default_value, + const std::string &undo_tooltip, T step, T step_fast, const char *format, ImGuiInputTextFlags flags) const +{ + // draw offseted input + auto draw_offseted_input = [&offset = m_gui_cfg->input_offset, &width = m_gui_cfg->input_width, + &name, &value, &step, &step_fast, format, flags](){ + ImGui::SameLine(offset); + ImGui::SetNextItemWidth(width); + return imgui_input(("##" + name).c_str(), + &value, step, step_fast, format, flags); + }; + float undo_offset = ImGui::GetStyle().WindowPadding.x; + return revertible(name, value, default_value, undo_tooltip, undo_offset, draw_offseted_input); +} + +template +bool GLGizmoEmboss::rev_input_mm(const std::string &name, + T &value, + const T *default_value_ptr, + const std::string &undo_tooltip, + T step, + T step_fast, + const char *format, + bool use_inch, + const std::optional &scale) const +{ + // _variable which temporary keep value + T value_ = value; + T default_value_; + if (use_inch) { + // calc value in inch + value_ *= GizmoObjectManipulation::mm_to_in; + if (default_value_ptr) { + default_value_ = GizmoObjectManipulation::mm_to_in * (*default_value_ptr); + default_value_ptr = &default_value_; + } + } + if (scale.has_value()) + value_ *= *scale; + bool use_correction = use_inch || scale.has_value(); + if (rev_input(name, use_correction ? value_ : value, default_value_ptr, undo_tooltip, step, step_fast, format)) { + if (use_correction) { + value = value_; + if (use_inch) + value *= GizmoObjectManipulation::in_to_mm; + if (scale.has_value()) + value /= *scale; + } + return true; + } + return false; +} + +bool GLGizmoEmboss::rev_checkbox(const std::string &name, + bool &value, + const bool *default_value, + const std::string &undo_tooltip) const +{ + // draw offseted input + auto draw_offseted_input = [this, &offset = m_gui_cfg->advanced_input_offset, &name, &value](){ + ImGui::SameLine(offset); + return m_imgui->bbl_checkbox(("##" + name).c_str(), value); + }; + float undo_offset = ImGui::GetStyle().WindowPadding.x; + return revertible(name, value, default_value, undo_tooltip, + undo_offset, draw_offseted_input); +} + +bool GLGizmoEmboss::set_height() { + float &value = m_style_manager.get_font_prop().size_in_mm; + + // size can't be zero or negative + apply(value, limits.size_in_mm); + + if (m_volume == nullptr || !m_volume->text_configuration.has_value()) { + assert(false); + return false; + } + + // only different value need process + if (is_approx(value, m_volume->text_configuration->style.prop.size_in_mm)) + return false; + + if (m_style_manager.get_font_prop().per_glyph) + reinit_text_lines(m_text_lines.get_lines().size()); + +#ifdef USE_PIXEL_SIZE_IN_WX_FONT + // store font size into path serialization + const wxFont &wx_font = m_style_manager.get_wx_font(); + if (wx_font.IsOk()) { + wxFont wx_font_new = wx_font; // copy + wx_font_new.SetPointSize(static_cast(value)); + m_style_manager.set_wx_font(wx_font_new); + } +#endif + return true; +} + +void GLGizmoEmboss::draw_height(bool use_inch) +{ + float &value = m_style_manager.get_font_prop().size_in_mm; + const EmbossStyle* stored_style = m_style_manager.get_stored_style(); + const float *stored = (stored_style != nullptr)? &stored_style->prop.size_in_mm : nullptr; + const char *size_format = use_inch ? "%.2f in" : "%.1f mm"; + const std::string revert_text_size = _u8L("Revert text size."); + const std::string& name = m_gui_cfg->translations.height; + if (rev_input_mm(name, value, stored, revert_text_size, 0.1f, 1.f, size_format, use_inch, m_scale_height)) + if (set_height()) + process(); +} + +void GLGizmoEmboss::draw_depth(bool use_inch) +{ + double &value = m_style_manager.get_style().projection.depth; + const StyleManager::Style * stored_style = m_style_manager.get_stored_style(); + const double *stored = ((stored_style!=nullptr)? &stored_style->projection.depth : nullptr); + const std::string revert_emboss_depth = _u8L("Revert embossed depth."); + const char *size_format = ((use_inch) ? "%.3f in" : "%.2f mm"); + const std::string name = m_gui_cfg->translations.depth; + if (rev_input_mm(name, value, stored, revert_emboss_depth, 0.1, 1., size_format, use_inch, m_scale_depth)){ + // size can't be zero or negative + apply(value, limits.emboss); + + // only different value need process + if(!is_approx(value, m_volume->emboss_shape->projection.depth)) + process(); + } +} + +bool GLGizmoEmboss::rev_slider(const std::string &name, + std::optional& value, + const std::optional *default_value, + const std::string &undo_tooltip, + int v_min, + int v_max, + const std::string& format, + const wxString &tooltip) const +{ + auto draw_slider_optional_int = [&]() -> bool { + float slider_offset = m_gui_cfg->advanced_input_offset; + float slider_width = m_gui_cfg->input_width; + ImGui::SameLine(slider_offset); + ImGui::SetNextItemWidth(slider_width); + return m_imgui->slider_optional_int( ("##" + name).c_str(), value, + v_min, v_max, format.c_str(), 1.f, false, tooltip); + }; + float undo_offset = ImGui::GetStyle().WindowPadding.x; + return revertible(name, value, default_value, + undo_tooltip, undo_offset, draw_slider_optional_int); +} + +bool GLGizmoEmboss::rev_slider(const std::string &name, + std::optional& value, + const std::optional *default_value, + const std::string &undo_tooltip, + float v_min, + float v_max, + const std::string& format, + const wxString &tooltip) const +{ + auto draw_slider_optional_float = [&]() -> bool { + float slider_offset = m_gui_cfg->advanced_input_offset; + float slider_width = m_gui_cfg->input_width; + ImGui::SameLine(slider_offset); + ImGui::SetNextItemWidth(slider_width); + return m_imgui->slider_optional_float(("##" + name).c_str(), value, + v_min, v_max, format.c_str(), 1.f, false, tooltip); + }; + float undo_offset = ImGui::GetStyle().WindowPadding.x; + return revertible(name, value, default_value, + undo_tooltip, undo_offset, draw_slider_optional_float); +} + +bool GLGizmoEmboss::rev_slider(const std::string &name, + float &value, + const float *default_value, + const std::string &undo_tooltip, + float v_min, + float v_max, + const std::string &format, + const wxString &tooltip) const +{ + auto draw_slider_float = [&]() -> bool { + float slider_offset = m_gui_cfg->advanced_input_offset; + float slider_width = m_gui_cfg->input_width; + ImGui::SameLine(slider_offset); + ImGui::SetNextItemWidth(slider_width); + return m_imgui->slider_float("##" + name, &value, v_min, v_max, + format.c_str(), 1.f, false, tooltip); + }; + float undo_offset = ImGui::GetStyle().WindowPadding.x; + return revertible(name, value, default_value, + undo_tooltip, undo_offset, draw_slider_float); +} + +void GLGizmoEmboss::draw_advanced() +{ + const auto &ff = m_style_manager.get_font_file_with_cache(); + if (!ff.has_value()) { + ImGui::Text("%s", _u8L("Advanced options cannot be changed for the selected font.\n" + "Select another font.").c_str()); + return; + } + + FontProp &font_prop = m_style_manager.get_font_prop(); + const FontFile::Info &font_info = get_font_info(*ff.font_file, font_prop); +#ifdef SHOW_FONT_FILE_PROPERTY + ImGui::SameLine(); + int cache_size = ff.has_value()? (int)ff.cache->size() : 0; + std::string ff_property = + "ascent=" + std::to_string(font_info.ascent) + + ", descent=" + std::to_string(font_info.descent) + + ", lineGap=" + std::to_string(font_info.linegap) + + ", unitPerEm=" + std::to_string(font_info.unit_per_em) + + ", cache(" + std::to_string(cache_size) + " glyphs)"; + if (font_file->infos.size() > 1) { + unsigned int collection = current_prop.collection_number.value_or(0); + ff_property += ", collect=" + std::to_string(collection+1) + "/" + std::to_string(font_file->infos.size()); + } + m_imgui->text_colored(ImGuiWrapper::COL_GREY_DARK, ff_property); +#endif // SHOW_FONT_FILE_PROPERTY + + bool exist_change = false; + auto &tr = m_gui_cfg->translations; + + const StyleManager::Style *stored_style = nullptr; + if (m_style_manager.exist_stored_style()) + stored_style = m_style_manager.get_stored_style(); + + bool is_the_only_one_part = m_volume->is_the_only_one_part(); + bool can_use_surface = (m_volume->emboss_shape->projection.use_surface)? true : // already used surface must have option to uncheck + !is_the_only_one_part; + m_imgui->disabled_begin(!can_use_surface); + const bool *def_use_surface = stored_style ? + &stored_style->projection.use_surface : nullptr; + StyleManager::Style ¤t_style = m_style_manager.get_style(); + bool &use_surface = current_style.projection.use_surface; + if (rev_checkbox(tr.use_surface, use_surface, def_use_surface, + _u8L("Revert using of model surface."))) { + if (use_surface) + // when using surface distance is not used + current_style.distance.reset(); + process(); + } + m_imgui->disabled_end(); // !can_use_surface + + bool &per_glyph = font_prop.per_glyph; + bool can_use_per_glyph = (per_glyph) ? true : // already used surface must have option to uncheck + !is_the_only_one_part; + m_imgui->disabled_begin(!can_use_per_glyph); + const bool *def_per_glyph = stored_style ? &stored_style->prop.per_glyph : nullptr; + if (rev_checkbox(tr.per_glyph, per_glyph, def_per_glyph, + _u8L("Revert Transformation per glyph."))) { + if (per_glyph && !m_text_lines.is_init()) + reinit_text_lines(); + process(); + } else if (ImGui::IsItemHovered()) { + if (per_glyph) { + m_imgui->tooltip(_u8L("Set global orientation for whole text."), m_gui_cfg->max_tooltip_width); + } else { + m_imgui->tooltip(_u8L("Set position and orientation per glyph."), m_gui_cfg->max_tooltip_width); + if (!m_text_lines.is_init()) + reinit_text_lines(); + } + } else if (!per_glyph && m_text_lines.is_init()) + m_text_lines.reset(); + m_imgui->disabled_end(); // !can_use_per_glyph + + auto draw_align = [&align = font_prop.align, input_offset = m_gui_cfg->advanced_input_offset, &icons = m_icons, &m_imgui = m_imgui, &m_gui_cfg = m_gui_cfg]() { + bool is_change = false; + ImGui::SameLine(input_offset); + if (align.first==FontProp::HorizontalAlign::left) draw(get_icon(icons, IconType::align_horizontal_left, IconState::hovered)); + else if (draw_button(icons, IconType::align_horizontal_left)) { align.first=FontProp::HorizontalAlign::left; is_change = true; } + else if (ImGui::IsItemHovered()) m_imgui->tooltip(_CTX_utf8(L_CONTEXT("Left", "Alignment"), "Alignment"), m_gui_cfg->max_tooltip_width); + ImGui::SameLine(); + if (align.first==FontProp::HorizontalAlign::center) draw(get_icon(icons, IconType::align_horizontal_center, IconState::hovered)); + else if (draw_button(icons, IconType::align_horizontal_center)) { align.first=FontProp::HorizontalAlign::center; is_change = true; } + else if (ImGui::IsItemHovered()) m_imgui->tooltip(_CTX_utf8(L_CONTEXT("Center", "Alignment"), "Alignment"), m_gui_cfg->max_tooltip_width); + ImGui::SameLine(); + if (align.first==FontProp::HorizontalAlign::right) draw(get_icon(icons, IconType::align_horizontal_right, IconState::hovered)); + else if (draw_button(icons, IconType::align_horizontal_right)) { align.first=FontProp::HorizontalAlign::right; is_change = true; } + else if (ImGui::IsItemHovered()) m_imgui->tooltip(_CTX_utf8(L_CONTEXT("Right", "Alignment"), "Alignment"), m_gui_cfg->max_tooltip_width); + + ImGui::SameLine(); + if (align.second==FontProp::VerticalAlign::top) draw(get_icon(icons, IconType::align_vertical_top, IconState::hovered)); + else if (draw_button(icons, IconType::align_vertical_top)) { align.second=FontProp::VerticalAlign::top; is_change = true; } + else if (ImGui::IsItemHovered()) m_imgui->tooltip(_CTX_utf8(L_CONTEXT("Top", "Alignment"), "Alignment"), m_gui_cfg->max_tooltip_width); + ImGui::SameLine(); + if (align.second==FontProp::VerticalAlign::center) draw(get_icon(icons, IconType::align_vertical_center, IconState::hovered)); + else if (draw_button(icons, IconType::align_vertical_center)) { align.second=FontProp::VerticalAlign::center; is_change = true; } + else if (ImGui::IsItemHovered()) m_imgui->tooltip(_CTX_utf8(L_CONTEXT("Middle", "Alignment"), "Alignment"), m_gui_cfg->max_tooltip_width); + ImGui::SameLine(); + if (align.second==FontProp::VerticalAlign::bottom) draw(get_icon(icons, IconType::align_vertical_bottom, IconState::hovered)); + else if (draw_button(icons, IconType::align_vertical_bottom)) { align.second=FontProp::VerticalAlign::bottom; is_change = true; } + else if (ImGui::IsItemHovered()) m_imgui->tooltip(_CTX_utf8(L_CONTEXT("Bottom", "Alignment"), "Alignment"), m_gui_cfg->max_tooltip_width); + return is_change; + }; + const FontProp::Align * def_align = stored_style ? &stored_style->prop.align : nullptr; + float undo_offset = ImGui::GetStyle().WindowPadding.x; + if (revertible(tr.alignment, font_prop.align, def_align, _u8L("Revert alignment."), undo_offset, draw_align)) { + if (font_prop.per_glyph) + reinit_text_lines(m_text_lines.get_lines().size()); + // TODO: move with text in finalize to not change position + process(); + } + + // TRN EmbossGizmo: font units + std::string units = _u8L("points"); + std::string units_fmt = "%.0f " + units; + + // input gap between characters + auto def_char_gap = stored_style ? + &stored_style->prop.char_gap : nullptr; + + int half_ascent = font_info.ascent / 2; + int min_char_gap = -half_ascent; + int max_char_gap = half_ascent; + FontProp ¤t_prop = current_style.prop; + if (rev_slider(tr.char_gap, current_prop.char_gap, def_char_gap, _u8L("Revert gap between characters"), + min_char_gap, max_char_gap, units_fmt, _L("Distance between characters"))){ + // Condition prevent recalculation when insertint out of limits value by imgui input + const std::optional &volume_char_gap = m_volume->text_configuration->style.prop.char_gap; + if (!apply(current_prop.char_gap, limits.char_gap) || + !volume_char_gap.has_value() || volume_char_gap != current_prop.char_gap) { + // char gap is stored inside of imgui font atlas + m_style_manager.clear_imgui_font(); + exist_change = true; + } + } + + // input gap between lines + bool is_multiline = m_text_lines.get_lines().size() > 1; + m_imgui->disabled_begin(!is_multiline); + auto def_line_gap = stored_style ? + &stored_style->prop.line_gap : nullptr; + int min_line_gap = -half_ascent; + int max_line_gap = half_ascent; + if (rev_slider(tr.line_gap, current_prop.line_gap, def_line_gap, _u8L("Revert gap between lines"), + min_line_gap, max_line_gap, units_fmt, _L("Distance between lines"))){ + // Condition prevent recalculation when insertint out of limits value by imgui input + const std::optional &volume_line_gap = m_volume->text_configuration->style.prop.line_gap; + if (!apply(current_prop.line_gap, limits.line_gap) || + !volume_line_gap.has_value() || volume_line_gap != current_prop.line_gap) { + // line gap is planed to be stored inside of imgui font atlas + m_style_manager.clear_imgui_font(); + if (font_prop.per_glyph) + reinit_text_lines(m_text_lines.get_lines().size()); + exist_change = true; + } + } + m_imgui->disabled_end(); // !is_multiline + + // input boldness + auto def_boldness = stored_style ? + &stored_style->prop.boldness : nullptr; + if (rev_slider(tr.boldness, current_prop.boldness, def_boldness, _u8L("Undo boldness"), + limits.boldness.gui.min, limits.boldness.gui.max, units_fmt, _L("Tiny / Wide glyphs"))){ + const std::optional &volume_boldness = m_volume->text_configuration->style.prop.boldness; + if (!apply(current_prop.boldness, limits.boldness.values) || + !volume_boldness.has_value() || volume_boldness != current_prop.boldness) + exist_change = true; + } + + // input italic + auto def_skew = stored_style ? + &stored_style->prop.skew : nullptr; + if (rev_slider(tr.skew_ration, current_prop.skew, def_skew, _u8L("Undo letter's skew"), + limits.skew.gui.min, limits.skew.gui.max, "%.2f", _L("Italic strength ratio"))){ + const std::optional &volume_skew = m_volume->text_configuration->style.prop.skew; + if (!apply(current_prop.skew, limits.skew.values) || + !volume_skew.has_value() ||volume_skew != current_prop.skew) + exist_change = true; + } + + // input surface distance + bool allowe_surface_distance = !use_surface && !m_volume->is_the_only_one_part(); + std::optional &distance = current_style.distance; + float prev_distance = distance.value_or(.0f); + float min_distance = static_cast(-2 * current_style.projection.depth); + float max_distance = static_cast(2 * current_style.projection.depth); + auto def_distance = stored_style ? + &stored_style->distance : nullptr; + m_imgui->disabled_begin(!allowe_surface_distance); + bool use_inch = wxGetApp().app_config->get_bool("use_inches"); + const std::string undo_move_tooltip = _u8L("Undo translation"); + const wxString move_tooltip = _L("Distance of the center of the text to the model surface."); + bool is_moved = false; + if (use_inch) { + std::optional distance_inch; + if (distance.has_value()) distance_inch = (*distance * GizmoObjectManipulation::mm_to_in); + std::optional def_distance_inch; + if (def_distance != nullptr) { + if (def_distance->has_value()) def_distance_inch = GizmoObjectManipulation::mm_to_in * (*(*def_distance)); + def_distance = &def_distance_inch; + } + min_distance *= GizmoObjectManipulation::mm_to_in; + max_distance *= GizmoObjectManipulation::mm_to_in; + if (rev_slider(tr.from_surface, distance_inch, def_distance, undo_move_tooltip, min_distance, max_distance, "%.3f in", move_tooltip)) { + if (distance_inch.has_value()) { + distance = *distance_inch * GizmoObjectManipulation::in_to_mm; + } else { + distance.reset(); + } + is_moved = true; + } + } else { + if (rev_slider(tr.from_surface, distance, def_distance, undo_move_tooltip, + min_distance, max_distance, "%.2f mm", move_tooltip)) is_moved = true; + } + + if (is_moved){ + if (font_prop.per_glyph){ + process(); + } else { + do_local_z_move(m_parent, distance.value_or(.0f) - prev_distance); + } + } + m_imgui->disabled_end(); // allowe_surface_distance + + // slider for Clock-wise angle in degress + // stored angle is optional CCW and in radians + // Convert stored value to degress + // minus create clock-wise roation from CCW + float angle = current_style.angle.value_or(0.f); + float angle_deg = static_cast(-angle * 180 / M_PI); + float def_angle_deg_val = + (!stored_style || !stored_style->angle.has_value()) ? + 0.f : (*stored_style->angle * -180 / M_PI); + float* def_angle_deg = stored_style ? + &def_angle_deg_val : nullptr; + if (rev_slider(tr.rotation, angle_deg, def_angle_deg, _u8L("Undo rotation"), + limits.angle.min, limits.angle.max, u8"%.2f °", + _L("Rotate text Clock-wise."))) { + // convert back to radians and CCW + double angle_rad = -angle_deg * M_PI / 180.0; + Geometry::to_range_pi_pi(angle_rad); + + double diff_angle = angle_rad - angle; + do_local_z_rotate(m_parent, diff_angle); + + // calc angle after rotation + const Selection &selection = m_parent.get_selection(); + const GLVolume *gl_volume = get_selected_gl_volume(selection); + assert(gl_volume != nullptr); + assert(m_style_manager.is_active_font()); + if (m_style_manager.is_active_font() && gl_volume != nullptr) + m_style_manager.get_style().angle = calc_angle(selection); + + if (font_prop.per_glyph) + reinit_text_lines(m_text_lines.get_lines().size()); + + // recalculate for surface cut + if (use_surface || font_prop.per_glyph) + process(); + } + + // Keep up - lock button icon + if (!m_volume->is_the_only_one_part()) { + ImGui::SameLine(m_gui_cfg->lock_offset); + const IconManager::Icon &icon = get_icon(m_icons, m_keep_up ? IconType::lock : IconType::unlock, IconState::activable); + const IconManager::Icon &icon_hover = get_icon(m_icons, m_keep_up ? IconType::lock_bold : IconType::unlock_bold, IconState::activable); + const IconManager::Icon &icon_disable = get_icon(m_icons, m_keep_up ? IconType::lock : IconType::unlock, IconState::disabled); + if (button(icon, icon_hover, icon_disable)) + m_keep_up = !m_keep_up; + + if (ImGui::IsItemHovered()) + m_imgui->tooltip(m_keep_up? + _u8L("Unlock the text's rotation when moving text along the object's surface."): + _u8L("Lock the text's rotation when moving text along the object's surface.") + , m_gui_cfg->max_tooltip_width); + } + + // when more collection add selector + if (ff.font_file->infos.size() > 1) { + ImGui::AlignTextToFramePadding(); + ImGui::Text("%s", tr.collection.c_str()); + ImGui::SameLine(m_gui_cfg->advanced_input_offset); + ImGui::SetNextItemWidth(m_gui_cfg->input_width); + unsigned int selected = current_prop.collection_number.value_or(0); + std::string tooltip = ""; + ImGuiWrapper::push_combo_style(m_parent.get_scale()); + if (ImGui::BBLBeginCombo("## Font collection", std::to_string(selected).c_str())) { + for (unsigned int i = 0; i < ff.font_file->infos.size(); ++i) { + ImGui::PushID(1 << (10 + i)); + bool is_selected = (i == selected); + if (ImGui::BBLSelectable(std::to_string(i).c_str(), is_selected)) { + if (i == 0) current_prop.collection_number.reset(); + else current_prop.collection_number = i; + exist_change = true; + } + ImGui::PopID(); + } + ImGui::EndCombo(); + } else if (ImGui::IsItemHovered()) { + tooltip = _u8L("Select from True Type Collection."); + } + ImGuiWrapper::pop_combo_style(); + if (!tooltip.empty()) + m_imgui->tooltip(tooltip, m_gui_cfg->max_tooltip_width); + } + + if (exist_change) { + m_style_manager.clear_glyphs_cache(); + if (m_style_manager.get_font_prop().per_glyph) + reinit_text_lines(); + else + m_text_lines.reset(); + process(); + } + + if (ImGui::Button(_u8L("Set text to face camera").c_str())) { + assert(get_selected_volume(m_parent.get_selection()) == m_volume); + const Camera &cam = wxGetApp().plater()->get_camera(); + auto wanted_up_limit = m_keep_up ? std::optional(UP_LIMIT) : std::optional{}; + if (face_selected_volume_to_camera(cam, m_parent, wanted_up_limit)) + volume_transformation_changed(); + } else if (ImGui::IsItemHovered()) { + m_imgui->tooltip(_u8L("Orient the text towards the camera."), m_gui_cfg->max_tooltip_width); + } + + //ImGui::SameLine(); if (ImGui::Button("Re-emboss")) GLGizmoEmboss::re_emboss(*m_volume); + +#ifdef ALLOW_DEBUG_MODE + ImGui::Text("family = %s", (current_prop.family.has_value() ? + current_prop.family->c_str() : + " --- ")); + ImGui::Text("face name = %s", (current_prop.face_name.has_value() ? + current_prop.face_name->c_str() : + " --- ")); + ImGui::Text("style = %s", + (current_prop.style.has_value() ? current_prop.style->c_str() : + " --- ")); + ImGui::Text("weight = %s", (current_prop.weight.has_value() ? + current_prop.weight->c_str() : + " --- ")); + + std::string descriptor = style.path; + ImGui::Text("descriptor = %s", descriptor.c_str()); +#endif // ALLOW_DEBUG_MODE +} + +#ifdef ALLOW_ADD_FONT_BY_OS_SELECTOR +bool GLGizmoEmboss::choose_font_by_wxdialog() +{ + wxFontData data; + data.EnableEffects(false); + data.RestrictSelection(wxFONTRESTRICT_SCALABLE); + // set previous selected font + EmbossStyle &selected_style = m_style_manager.get_style(); + if (selected_style.type == WxFontUtils::get_current_type()) { + std::optional selected_font = WxFontUtils::load_wxFont( + selected_style.path); + if (selected_font.has_value()) data.SetInitialFont(*selected_font); + } + + wxFontDialog font_dialog(wxGetApp().mainframe, data); + if (font_dialog.ShowModal() != wxID_OK) return false; + + data = font_dialog.GetFontData(); + wxFont wx_font = data.GetChosenFont(); + size_t font_index = m_style_manager.get_fonts().size(); + EmbossStyle emboss_style = WxFontUtils::create_emboss_style(wx_font); + + // Check that deserialization NOT influence font + // false - use direct selected wxFont in dialog + // true - use font item (serialize and deserialize wxFont) + bool use_deserialized_font = false; + + // Try load and use new added font + if ((use_deserialized_font && !m_style_manager.load_style(font_index)) || + (!use_deserialized_font && !m_style_manager.load_style(emboss_style, wx_font))) { + m_style_manager.erase(font_index); + wxString message = GUI::format_wxstr( + "Font \"%1%\" can't be used. Please select another.", + emboss_style.name); + wxString title = "Selected font is NOT True-type."; + MessageDialog not_loaded_font_message(nullptr, message, title, wxOK); + not_loaded_font_message.ShowModal(); + return choose_font_by_wxdialog(); + } + + // fix dynamic creation of italic font + const auto& cn = m_style_manager.get_font_prop().collection_number; + unsigned int font_collection = cn.has_value() ? *cn : 0; + const auto&ff = m_style_manager.get_font_file_with_cache(); + if (WxFontUtils::is_italic(wx_font) && + !Emboss::is_italic(*ff.font_file, font_collection)) { + m_style_manager.get_font_prop().skew = 0.2; + } + return true; +} +#endif // ALLOW_ADD_FONT_BY_OS_SELECTOR + +#if defined ALLOW_ADD_FONT_BY_FILE or defined ALLOW_DEBUG_MODE +namespace priv { +static std::string get_file_name(const std::string &file_path) +{ + size_t pos_last_delimiter = file_path.find_last_of("/\\"); + size_t pos_point = file_path.find_last_of('.'); + size_t offset = pos_last_delimiter + 1; + size_t count = pos_point - pos_last_delimiter - 1; + return file_path.substr(offset, count); +} +} // namespace priv +#endif // ALLOW_ADD_FONT_BY_FILE || ALLOW_DEBUG_MODE + +#ifdef ALLOW_ADD_FONT_BY_FILE +bool GLGizmoEmboss::choose_true_type_file() +{ + wxArrayString input_files; + wxString fontDir = wxEmptyString; + wxString selectedFile = wxEmptyString; + wxFileDialog dialog(nullptr, "Choose one or more files (TTF, TTC):", + fontDir, selectedFile, file_wildcards(FT_FONTS), + wxFD_OPEN | wxFD_FILE_MUST_EXIST); + if (dialog.ShowModal() == wxID_OK) dialog.GetPaths(input_files); + if (input_files.IsEmpty()) return false; + size_t index = m_style_manager.get_fonts().size(); + // use first valid font + for (auto &input_file : input_files) { + std::string path = std::string(input_file.c_str()); + std::string name = get_file_name(path); + //make_unique_name(name, m_font_list); + const FontProp& prop = m_style_manager.get_font_prop(); + EmbossStyle style{ name, path, EmbossStyle::Type::file_path, prop }; + m_style_manager.add_font(style); + // set first valid added font as active + if (m_style_manager.load_style(index)) return true; + m_style_manager.erase(index); + } + return false; +} +#endif // ALLOW_ADD_FONT_BY_FILE + +void GLGizmoEmboss::create_notification_not_valid_font( + const TextConfiguration &tc) +{ + const EmbossStyle &es = m_style_manager.get_style(); + const auto &face_name_opt = es.prop.face_name; + const std::string &face_name_3mf = tc.style.prop.face_name.value_or(tc.style.path); + + std::optional face_name_by_wx; + if (!face_name_opt.has_value()) { + const wxFont& wx_font = m_style_manager.get_wx_font(); + if (wx_font.IsOk()) { + wxString wx_face_name = wx_font.GetFaceName(); + if (!wx_face_name.empty()) + face_name_by_wx = std::string(wx_face_name.ToUTF8().data()); + } + } + const std::string &face_name = face_name_opt.value_or(face_name_by_wx.value_or(es.path)); + std::string text = + GUI::format(_L("Can't load exactly same font(\"%1%\"). " + "Aplication selected a similar one(\"%2%\"). " + "You have to specify font for enable edit text."), + face_name_3mf, face_name); + create_notification_not_valid_font(text); +} + +void GLGizmoEmboss::create_notification_not_valid_font(const std::string &text) { + // not neccessary, but for sure that old notification doesnt exist + if (m_is_unknown_font) + remove_notification_not_valid_font(); + m_is_unknown_font = true; + + auto type = NotificationType::UnknownFont; + auto level = NotificationManager::NotificationLevel::WarningNotificationLevel; + auto notification_manager = wxGetApp().plater()->get_notification_manager(); + notification_manager->push_notification(type, level, text); +} + +void GLGizmoEmboss::remove_notification_not_valid_font() +{ + if (!m_is_unknown_font) return; + m_is_unknown_font = false; + auto type = NotificationType::UnknownFont; + auto notification_manager = wxGetApp().plater()->get_notification_manager(); + notification_manager->close_notification_of_type(type); +} + +void GLGizmoEmboss::init_icons() +{ + // icon order has to match the enum IconType + std::vector filenames{ + "edit_button.svg", + "delete.svg", + "add_copies.svg", + "save.svg", + "undo.svg", + "make_italic.svg", + "make_unitalic.svg", + "make_bold.svg", + "make_unbold.svg", + "search.svg", + "open.svg", + "exclamation.svg", + "lock_closed.svg", // lock, + "lock_closed_f.svg",// lock_bold, + "lock_open.svg", // unlock, + "lock_open_f.svg", // unlock_bold, + "align_horizontal_left.svg", + "align_horizontal_center.svg", + "align_horizontal_right.svg", + "align_vertical_top.svg", + "align_vertical_center.svg", + "align_vertical_bottom.svg" + }; + assert(filenames.size() == static_cast(IconType::_count)); + std::string path = resources_dir() + "/images/"; + for (std::string &filename : filenames) filename = path + filename; + + ImVec2 size(m_gui_cfg->icon_width, m_gui_cfg->icon_width); + auto type = IconManager::RasterType::color_wite_gray; + m_icons = m_icon_manager.init(filenames, size, type); +} + +static std::size_t hash_value(wxString const &s){ + boost::hash hasher; + return hasher(s.ToStdString()); +} + +// increase number when change struct FacenamesSerializer +constexpr std::uint32_t FACENAMES_VERSION = 1; +struct FacenamesSerializer +{ + // hash number for unsorted vector of installed font into system + size_t hash = 0; + // assumption that is loadable + std::vector good; + // Can't load for some reason + std::vector bad; +}; + +template void save(Archive &archive, wxString const &d) +{ std::string s(d.ToUTF8().data()); archive(s);} +template void load(Archive &archive, wxString &d) +{ std::string s; archive(s); d = s;} +template void serialize(Archive &ar, FacenamesSerializer &t, const std::uint32_t version) +{ + // When performing a load, the version associated with the class + // is whatever it was when that data was originally serialized + // When we save, we'll use the version that is defined in the macro + if (version != FACENAMES_VERSION) return; + ar(t.hash, t.good, t.bad); +} +CEREAL_CLASS_VERSION(::FacenamesSerializer, FACENAMES_VERSION); // register class version + +///////////// +// private namespace implementation +/////////////// +namespace { + +const IconManager::Icon &get_icon(const IconManager::VIcons& icons, IconType type, IconState state) { + return *icons[(unsigned) type][(unsigned) state]; } + +bool draw_button(const IconManager::VIcons &icons, IconType type, bool disable){ + return Slic3r::GUI::button( + get_icon(icons, type, IconState::activable), + get_icon(icons, type, IconState::hovered), + get_icon(icons, type, IconState::disabled), + disable);} + +TextDataBase::TextDataBase(DataBase &&parent, + const FontFileWithCache &font_file, + TextConfiguration &&text_configuration, + const EmbossProjection &projection) + : DataBase(std::move(parent)), m_font_file(font_file) /* copy */, m_text_configuration(std::move(text_configuration)) +{ + assert(m_font_file.has_value()); + shape.projection = projection; // copy + + const FontProp &fp = m_text_configuration.style.prop; + const FontFile &ff = *m_font_file.font_file; + shape.scale = get_text_shape_scale(fp, ff); +} + +EmbossShape &TextDataBase::create_shape() +{ + if (!shape.shapes_with_ids.empty()) + return shape; + + // create shape by configuration + const char *text = m_text_configuration.text.c_str(); + std::wstring text_w = boost::nowide::widen(text); + const FontProp &fp = m_text_configuration.style.prop; + auto was_canceled = [&c = cancel](){ return c->load(); }; + + shape.shapes_with_ids = text2vshapes(m_font_file, text_w, fp, was_canceled); + return shape; +} + +void TextDataBase::write(ModelVolume &volume) const +{ + DataBase::write(volume); + volume.text_configuration = m_text_configuration; // copy + assert(volume.emboss_shape.has_value()); +} + +std::unique_ptr create_emboss_data_base(const std::string &text, + StyleManager &style_manager, + TextLinesModel &text_lines, + const Selection &selection, + ModelVolumeType type, + std::shared_ptr> &cancel) +{ + // create volume_name + std::string volume_name = text; // copy + // contain_enter? + if (volume_name.find('\n') != std::string::npos) + // change enters to space + std::replace(volume_name.begin(), volume_name.end(), '\n', ' '); + + if (!style_manager.is_active_font()) { + style_manager.load_valid_style(); + assert(style_manager.is_active_font()); + if (!style_manager.is_active_font()) + return {}; // no active font in style, should never happend !!! + } + + const StyleManager::Style &style = style_manager.get_style(); + // actualize font path - during changes in gui it could be corrupted + // volume must store valid path + assert(style_manager.get_wx_font().IsOk()); + assert(style.path.compare(WxFontUtils::store_wxFont(style_manager.get_wx_font())) == 0); + + if (style.prop.per_glyph) { + if (!text_lines.is_init()) + init_text_lines(text_lines, selection, style_manager); + } else + text_lines.reset(); + + bool is_outside = (type == ModelVolumeType::MODEL_PART); + + // Cancel previous Job, when it is in process + // worker.cancel(); --> Use less in this case I want cancel only previous EmbossJob no other jobs + // Cancel only EmbossUpdateJob no others + if (cancel != nullptr) + cancel->store(true); + // create new shared ptr to cancel new job + cancel = std::make_shared>(false); + + DataBase base(volume_name, cancel); + base.is_outside = is_outside; + base.text_lines = text_lines.get_lines(); + base.from_surface = style.distance; + + FontFileWithCache &font = style_manager.get_font_file_with_cache(); + TextConfiguration tc{static_cast(style), text}; + return std::make_unique(std::move(base), font, std::move(tc), style.projection); +} + +CreateVolumeParams create_input(GLCanvas3D &canvas, const StyleManager::Style &style, RaycastManager& raycaster, ModelVolumeType volume_type) +{ + auto gizmo = static_cast(GLGizmosManager::Emboss); + const GLVolume *gl_volume = get_first_hovered_gl_volume(canvas); + Plater *plater = wxGetApp().plater(); + return CreateVolumeParams{canvas, plater->get_camera(), plater->build_volume(), + plater->get_ui_job_worker(), volume_type, raycaster, gizmo, gl_volume, style.distance, style.angle}; +} + +ImVec2 calc_fine_position(const Selection &selection, const ImVec2 &windows_size, const Size &canvas_size) +{ + const Selection::IndicesList indices = selection.get_volume_idxs(); + // no selected volume + if (indices.empty()) + return {}; + const GLVolume *volume = selection.get_volume(*indices.begin()); + // bad volume selected (e.g. deleted one) + if (volume == nullptr) + return {}; + + const Camera &camera = wxGetApp().plater()->get_camera(); + Slic3r::Polygon hull = CameraUtils::create_hull2d(camera, *volume); + + ImVec2 c_size(canvas_size.get_width(), canvas_size.get_height()); + ImVec2 offset = ImGuiWrapper::suggest_location(windows_size, hull, c_size); + return offset; +} + +std::string concat(std::vector data) { + std::stringstream ss; + for (const auto &d : data) + ss << d.c_str() << ", "; + return ss.str(); +} + +boost::filesystem::path get_fontlist_cache_path(){ + return boost::filesystem::path(data_dir()) / "cache" / "fonts.cereal"; +} + +bool store(const Facenames &facenames) { + std::string cache_path = get_fontlist_cache_path().string(); + boost::nowide::ofstream file(cache_path, std::ios::binary); + ::cereal::BinaryOutputArchive archive(file); + std::vector good; + good.reserve(facenames.faces.size()); + for (const FaceName &face : facenames.faces) good.push_back(face.wx_name); + FacenamesSerializer data = {facenames.hash, good, facenames.bad}; + + assert(std::is_sorted(data.bad.begin(), data.bad.end())); + assert(std::is_sorted(data.good.begin(), data.good.end())); + + try { + archive(data); + } catch (const std::exception &ex) { + BOOST_LOG_TRIVIAL(error) << "Failed to write fontlist cache - " << cache_path << ex.what(); + return false; + } + return true; +} + +bool load(Facenames &facenames) { + boost::filesystem::path path = get_fontlist_cache_path(); + std::string path_str = path.string(); + if (!boost::filesystem::exists(path)) { + BOOST_LOG_TRIVIAL(warning) << "Fontlist cache - '" << path_str << "' does not exists."; + return false; + } + boost::nowide::ifstream file(path_str, std::ios::binary); + cereal::BinaryInputArchive archive(file); + + FacenamesSerializer data; + try { + archive(data); + } catch (const std::exception &ex) { + BOOST_LOG_TRIVIAL(error) << "Failed to load fontlist cache - '" << path_str << "'. Exception: " << ex.what(); + return false; + } + + assert(std::is_sorted(data.bad.begin(), data.bad.end())); + assert(std::is_sorted(data.good.begin(), data.good.end())); + + facenames.hash = data.hash; + facenames.faces.reserve(data.good.size()); + for (const wxString &face : data.good) + facenames.faces.push_back({face}); + facenames.bad = data.bad; + return true; +} + +void init_truncated_names(Facenames &face_names, float max_width) +{ + for (FaceName &face : face_names.faces) { + std::string name_str(face.wx_name.ToUTF8().data()); + face.name_truncated = ImGuiWrapper::trunc(name_str, max_width); + } + face_names.has_truncated_names = true; +} + +void init_face_names(Facenames &face_names) +{ + Timer t("enumerate_fonts"); + if (face_names.is_init) return; + face_names.is_init = true; + + // to reload fonts from system, when install new one + wxFontEnumerator::InvalidateCache(); + + // try load cache + // Only not OS enumerated face has hash value 0 + if (face_names.hash == 0) { + load(face_names); + face_names.has_truncated_names = false; + } + + using namespace std::chrono; + steady_clock::time_point enumerate_start = steady_clock::now(); + ScopeGuard sg([&enumerate_start, &face_names = face_names]() { + steady_clock::time_point enumerate_end = steady_clock::now(); + long long enumerate_duration = duration_cast(enumerate_end - enumerate_start).count(); + BOOST_LOG_TRIVIAL(info) << "OS enumerate " << face_names.faces.size() << " fonts " + << "(+ " << face_names.bad.size() << " can't load " + << "= " << face_names.faces.size() + face_names.bad.size() << " fonts) " + << "in " << enumerate_duration << " ms\n" << concat(face_names.bad); + }); + wxArrayString facenames = wxFontEnumerator::GetFacenames(face_names.encoding); + size_t hash = boost::hash_range(facenames.begin(), facenames.end()); + // Zero value is used as uninitialized hash + if (hash == 0) hash = 1; + // check if it is same as last time + if (face_names.hash == hash) { + // no new installed font + BOOST_LOG_TRIVIAL(info) << "Same FontNames hash, cache is used. " + << "For clear cache delete file: " << get_fontlist_cache_path().string(); + return; + } + + BOOST_LOG_TRIVIAL(info) << ((face_names.hash == 0) ? + "FontName list is generate from scratch." : + "Hash are different. Only previous bad fonts are used and set again as bad"); + face_names.hash = hash; + + // validation lambda + auto is_valid_font = [encoding = face_names.encoding, bad = face_names.bad /*copy*/](const wxString &name) { + if (name.empty()) return false; + + // vertical font start with @, we will filter it out + // Not sure if it is only in Windows so filtering is on all platforms + if (name[0] == '@') return false; + + // previously detected bad font + auto it = std::lower_bound(bad.begin(), bad.end(), name); + if (it != bad.end() && *it == name) return false; + + wxFont wx_font(wxFontInfo().FaceName(name).Encoding(encoding)); + //* + // Faster chech if wx_font is loadable but not 100% + // names could contain not loadable font + if (!WxFontUtils::can_load(wx_font)) return false; + + /*/ + // Slow copy of font files to try load font + // After this all files are loadable + auto font_file = WxFontUtils::create_font_file(wx_font); + if (font_file == nullptr) + return false; // can't create font file + // */ + return true; + }; + + face_names.faces.clear(); + face_names.faces_names.clear(); + face_names.bad.clear(); + face_names.faces.reserve(facenames.size()); + face_names.faces_names.reserve(facenames.size()); + std::sort(facenames.begin(), facenames.end()); + for (const wxString &name : facenames) { + if (is_valid_font(name)) { + face_names.faces.push_back({name}); + face_names.faces_names.push_back(name.utf8_string()); + }else{ + face_names.bad.push_back(name); + } + } + assert(std::is_sorted(face_names.bad.begin(), face_names.bad.end())); + face_names.has_truncated_names = false; + store(face_names); +} + +void draw_font_preview(FaceName &face, const std::string& text, Facenames &faces, const GuiCfg &cfg, bool is_visible){ + // Limit for opened font files at one moment + unsigned int &count_opened_fonts = faces.count_opened_font_files; + // Size of texture + ImVec2 size(cfg.face_name_size.x(), cfg.face_name_size.y()); + float count_cached_textures_f = static_cast(faces.count_cached_textures); + std::string state_text; + // uv0 and uv1 set to pixel 0,0 in texture + ImVec2 uv0(0.f, 0.f), uv1(1.f / size.x, 1.f / size.y / count_cached_textures_f); + if (face.is_created != nullptr) { + // not created preview + if (*face.is_created) { + // Already created preview + size_t texture_index = face.texture_index; + uv0 = ImVec2(0.f, texture_index / count_cached_textures_f); + uv1 = ImVec2(1.f, (texture_index + 1) / count_cached_textures_f); + } else { + // Not finished preview + if (is_visible) { + // when not canceled still loading + state_text = (face.cancel->load()) ? + " " + _u8L("No symbol"): + " ... " + _u8L("Loading"); + } else { + // not finished and not visible cancel job + face.is_created = nullptr; + face.cancel->store(true); + } + } + } else if (is_visible && count_opened_fonts < cfg.max_count_opened_font_files) { + ++count_opened_fonts; + face.cancel = std::make_shared(false); + face.is_created = std::make_shared(false); + + const unsigned char gray_level = 5; + // format type and level must match to texture data + const GLenum format = GL_RGBA, type = GL_UNSIGNED_BYTE; + const GLint level = 0; + // select next texture index + size_t texture_index = (faces.texture_index + 1) % faces.count_cached_textures; + + // set previous cach as deleted + for (FaceName &f : faces.faces) + if (f.texture_index == texture_index) { + if (f.cancel != nullptr) f.cancel->store(true); + f.is_created = nullptr; + } + + faces.texture_index = texture_index; + face.texture_index = texture_index; + + // render text to texture + FontImageData data{ + text, + face.wx_name, + faces.encoding, + faces.texture_id, + faces.texture_index, + cfg.face_name_size, + gray_level, + format, + type, + level, + &count_opened_fonts, + face.cancel, // copy + face.is_created // copy + }; + auto job = std::make_unique(std::move(data)); + auto &worker = wxGetApp().plater()->get_ui_job_worker(); + queue_job(worker, std::move(job)); + } else { + // cant start new thread at this moment so wait in queue + state_text = " ... " + _u8L("In queue"); + } + + if (!state_text.empty()) { + ImGui::SameLine(cfg.face_name_texture_offset_x); + ImGui::Text("%s", state_text.c_str()); + } + + ImGui::SameLine(cfg.face_name_texture_offset_x); + ImTextureID tex_id = (void *) (intptr_t) faces.texture_id; + ImVec4 tint_color = ImGui::GetStyleColorVec4(ImGuiCol_Text); + ImGui::Image(tex_id, size, uv0, uv1, tint_color); +} + +GuiCfg create_gui_configuration() +{ + GuiCfg cfg; // initialize by default values; + + float line_height = ImGui::GetTextLineHeight(); + float line_height_with_spacing = ImGui::GetTextLineHeightWithSpacing(); + float space = line_height_with_spacing - line_height; + const ImGuiStyle &style = ImGui::GetStyle(); + + cfg.max_style_name_width = ImGui::CalcTextSize("Maximal font name, extended").x; + + cfg.icon_width = static_cast(std::ceil(line_height)); + // make size pair number + if (cfg.icon_width % 2 != 0) ++cfg.icon_width; + + cfg.delete_pos_x = cfg.max_style_name_width + space; + const float count_line_of_text = 3.f; + cfg.text_size = ImVec2(-FLT_MIN, line_height_with_spacing * count_line_of_text); + ImVec2 letter_m_size = ImGui::CalcTextSize("M"); + const float count_letter_M_in_input = 12.f; + cfg.input_width = letter_m_size.x * count_letter_M_in_input; + GuiCfg::Translations &tr = cfg.translations; + + // TRN - Input label. Be short as possible + // Select look of letter shape + tr.font = _u8L("Font"); + // TRN - Input label. Be short as possible + // Height of one text line - Font Ascent + tr.height = _u8L("Height"); + // TRN - Input label. Be short as possible + // Size in emboss direction + tr.depth = _u8L("Depth"); + + float max_text_width = std::max({ + ImGui::CalcTextSize(tr.font.c_str()).x, + ImGui::CalcTextSize(tr.height.c_str()).x, + ImGui::CalcTextSize(tr.depth.c_str()).x}); + cfg.indent = static_cast(cfg.icon_width); + cfg.input_offset = style.WindowPadding.x + cfg.indent + max_text_width + space; + + // TRN - Input label. Be short as possible + // Copy surface of model on surface of the embossed text + tr.use_surface = _u8L("Use surface"); + // TRN - Input label. Be short as possible + // Option to change projection on curved surface + // for each character(glyph) in text separately + tr.per_glyph = _u8L("Per glyph"); + // TRN - Input label. Be short as possible + // Align Top|Middle|Bottom and Left|Center|Right + tr.alignment = _u8L("Alignment"); + // TRN - Input label. Be short as possible + tr.char_gap = _u8L("Char gap"); + // TRN - Input label. Be short as possible + tr.line_gap = _u8L("Line gap"); + // TRN - Input label. Be short as possible + tr.boldness = _u8L("Boldness"); + + // TRN - Input label. Be short as possible + // Like Font italic + tr.skew_ration = _u8L("Skew ratio"); + + // TRN - Input label. Be short as possible + // Distance from model surface to be able + // move text as part fully into not flat surface + // move text as modifier fully out of not flat surface + tr.from_surface = _u8L("From surface"); + + // TRN - Input label. Be short as possible + // Angle between Y axis and text line direction. + tr.rotation = _u8L("Rotation"); + + // TRN - Input label. Be short as possible + // Keep vector from bottom to top of text aligned with printer Y axis + tr.keep_up = _u8L("Keep up"); + + // TRN - Input label. Be short as possible. + // Some Font file contain multiple fonts inside and + // this is numerical selector of font inside font collections + tr.collection = _u8L("Collection"); + + float max_advanced_text_width = std::max({ + ImGui::CalcTextSize(tr.use_surface.c_str()).x, + ImGui::CalcTextSize(tr.per_glyph.c_str()).x, + ImGui::CalcTextSize(tr.alignment.c_str()).x, + ImGui::CalcTextSize(tr.char_gap.c_str()).x, + ImGui::CalcTextSize(tr.line_gap.c_str()).x, + ImGui::CalcTextSize(tr.boldness.c_str()).x, + ImGui::CalcTextSize(tr.skew_ration.c_str()).x, + ImGui::CalcTextSize(tr.from_surface.c_str()).x, + ImGui::CalcTextSize(tr.rotation.c_str()).x + cfg.icon_width + 2*space, + ImGui::CalcTextSize(tr.keep_up.c_str()).x, + ImGui::CalcTextSize(tr.collection.c_str()).x }); + cfg.advanced_input_offset = max_advanced_text_width + + 3 * space + cfg.indent; + + cfg.lock_offset = cfg.advanced_input_offset - (cfg.icon_width + space); + // calculate window size + float input_height = line_height_with_spacing + 2*style.FramePadding.y; + float separator_height = 2 + style.FramePadding.y; + + // "Text is to object" + radio buttons + cfg.height_of_volume_type_selector = separator_height + line_height_with_spacing + input_height; + + int max_style_image_width = static_cast(std::round(cfg.max_style_name_width/2 - 2 * style.FramePadding.x)); + int max_style_image_height = static_cast(std::round(input_height)); + cfg.max_style_image_size = Vec2i(max_style_image_width, line_height); + cfg.face_name_size = Vec2i(cfg.input_width, line_height_with_spacing); + cfg.face_name_texture_offset_x = cfg.face_name_size.x() + space; + + cfg.max_tooltip_width = ImGui::GetFontSize() * 20.0f; + + return cfg; +} +} // namespace diff --git a/src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp b/src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp new file mode 100644 index 0000000000..6217c3f128 --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp @@ -0,0 +1,240 @@ +///|/ Copyright (c) Prusa Research 2021 - 2023 Oleksandra Iushchenko @YuSanka, Lukáš Matěna @lukasmatena, Enrico Turri @enricoturri1966, Filip Sykala @Jony01 +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ +#ifndef slic3r_GLGizmoEmboss_hpp_ +#define slic3r_GLGizmoEmboss_hpp_ + +#include "GLGizmoBase.hpp" +#include "GLGizmoRotate.hpp" +#include "slic3r/GUI/IconManager.hpp" +#include "slic3r/GUI/SurfaceDrag.hpp" +#include "slic3r/GUI/I18N.hpp" // TODO: not needed +#include "slic3r/GUI/TextLines.hpp" +#include "slic3r/Utils/RaycastManager.hpp" +#include "slic3r/Utils/EmbossStyleManager.hpp" + +#include +#include +#include + +#include "libslic3r/Emboss.hpp" +#include "libslic3r/Point.hpp" +#include "libslic3r/TextConfiguration.hpp" + +#include +#include + +class wxFont; +namespace Slic3r{ + class AppConfig; + class GLVolume; + enum class ModelVolumeType : int; +} + +namespace Slic3r::GUI { +class GLGizmoEmboss : public GLGizmoBase +{ +public: + explicit GLGizmoEmboss(GLCanvas3D &parent, const std::string &icon_filename, unsigned int sprite_id); + + /// + /// Create new embossed text volume by type on position of mouse + /// + /// Object part / Negative volume / Modifier + /// Define position of new volume + bool create_volume(ModelVolumeType volume_type, const Vec2d &mouse_pos); + + /// + /// Create new text without given position + /// + /// Object part / Negative volume / Modifier + bool create_volume(ModelVolumeType volume_type); + + /// + /// Handle pressing of shortcut + /// + void on_shortcut_key(); + + /// + /// Mirroring from object manipulation panel + /// !! Emboss gizmo must be active + /// + /// Axis for mirroring must be one of {0,1,2} + /// True on success start job otherwise False + bool do_mirror(size_t axis); + + + /// + /// Call on change inside of object conatining projected volume + /// + /// Way to stop re_emboss job + /// True on success otherwise False + static bool re_emboss(const ModelVolume &text, std::shared_ptr> job_cancel = nullptr); + +protected: + bool on_init() override; + std::string on_get_name() const override; + void on_render() override; + void on_register_raycasters_for_picking() override; + void on_unregister_raycasters_for_picking() override; + void on_render_input_window(float x, float y, float bottom_limit) override; + void on_set_state() override; + void data_changed(bool is_serializing) override; // selection changed + void on_set_hover_id() override{ m_rotate_gizmo.set_hover_id(m_hover_id); } + void on_enable_grabber(unsigned int id) override { m_rotate_gizmo.enable_grabber(); } + void on_disable_grabber(unsigned int id) override { m_rotate_gizmo.disable_grabber(); } + void on_start_dragging() override; + void on_stop_dragging() override; + void on_dragging(const UpdateData &data) override; + void push_button_style(bool pressed); + void pop_button_style(); + + /// + /// Rotate by text on dragging rotate grabers + /// + /// Information about mouse + /// Propagete normaly return false. + bool on_mouse(const wxMouseEvent &mouse_event) override; + + bool wants_enter_leave_snapshots() const override; + std::string get_gizmo_entering_text() const override; + std::string get_gizmo_leaving_text() const override; + std::string get_action_snapshot_name() const override; + +private: + void volume_transformation_changing(); + void volume_transformation_changed(); + + static EmbossStyles create_default_styles(); + // localized default text + bool init_create(ModelVolumeType volume_type); + + void set_volume_by_selection(); + void reset_volume(); + + // create volume from text - main functionality + bool process(); + void close(); + void draw_window(); + void draw_text_input(); + void draw_model_type(); + void draw_style_list(); + void draw_delete_style_button(); + void draw_style_rename_popup(); + void draw_style_rename_button(); + void draw_style_save_button(bool is_modified); + void draw_style_save_as_popup(); + void draw_style_add_button(); + void init_font_name_texture(); + void draw_font_list_line(); + void draw_font_list(); + void draw_height(bool use_inch); + void draw_depth(bool use_inch); + + // call after set m_style_manager.get_style().prop.size_in_mm + bool set_height(); + + bool draw_italic_button(); + bool draw_bold_button(); + void draw_advanced(); + + bool select_facename(const wxString& facename); + + template bool rev_input_mm(const std::string &name, T &value, const T *default_value, + const std::string &undo_tooltip, T step, T step_fast, const char *format, bool use_inch, const std::optional& scale) const; + + /// + /// Reversible input float with option to restor default value + /// TODO: make more general, static and move to ImGuiWrapper + /// + /// True when value changed otherwise FALSE. + template bool rev_input(const std::string &name, T &value, const T *default_value, + const std::string &undo_tooltip, T step, T step_fast, const char *format, ImGuiInputTextFlags flags = 0) const; + bool rev_checkbox(const std::string &name, bool &value, const bool* default_value, const std::string &undo_tooltip) const; + bool rev_slider(const std::string &name, std::optional& value, const std::optional *default_value, + const std::string &undo_tooltip, int v_min, int v_max, const std::string &format, const wxString &tooltip) const; + bool rev_slider(const std::string &name, std::optional& value, const std::optional *default_value, + const std::string &undo_tooltip, float v_min, float v_max, const std::string &format, const wxString &tooltip) const; + bool rev_slider(const std::string &name, float &value, const float *default_value, + const std::string &undo_tooltip, float v_min, float v_max, const std::string &format, const wxString &tooltip) const; + template bool revertible(const std::string &name, T &value, const T *default_value, + const std::string &undo_tooltip, float undo_offset, Draw draw) const; + + // process mouse event + bool on_mouse_for_rotation(const wxMouseEvent &mouse_event); + bool on_mouse_for_translate(const wxMouseEvent &mouse_event); + void on_mouse_change_selection(const wxMouseEvent &mouse_event); + + // When open text loaded from .3mf it could be written with unknown font + bool m_is_unknown_font = false; + void create_notification_not_valid_font(const TextConfiguration& tc); + void create_notification_not_valid_font(const std::string& text); + void remove_notification_not_valid_font(); + + struct GuiCfg; + std::unique_ptr m_gui_cfg; + + // Is open tree with advanced options + bool m_is_advanced_edit_style = false; + + // Keep information about stored styles and loaded actual style to compare with + Emboss::StyleManager m_style_manager; + + // pImpl to hide implementation of FaceNames to .cpp file + struct Facenames; // forward declaration + std::unique_ptr m_face_names; + + // Text to emboss + std::string m_text; // Sequence of Unicode UTF8 symbols + + // When true keep up vector otherwise relative rotation + bool m_keep_up = true; + + // current selected volume + // NOTE: Be carefull could be uninitialized (removed from Model) + ModelVolume *m_volume = nullptr; + + // When work with undo redo stack there could be situation that + // m_volume point to unexisting volume so One need also objectID + ObjectID m_volume_id; + + // True when m_text contain character unknown by selected font + bool m_text_contain_unknown_glyph = false; + + // cancel for previous update of volume to cancel finalize part + std::shared_ptr> m_job_cancel = nullptr; + + // Keep information about curvature of text line around surface + TextLinesModel m_text_lines; + void reinit_text_lines(unsigned count_lines=0); + + // Rotation gizmo + GLGizmoRotate m_rotate_gizmo; + // Value is set only when dragging rotation to calculate actual angle + std::optional m_rotate_start_angle; + + // Keep data about dragging only during drag&drop + std::optional m_surface_drag; + + // Keep old scene triangle data in AABB trees, + // all the time it need actualize before use. + RaycastManager m_raycast_manager; + + // For text on scaled objects + std::optional m_scale_height; + std::optional m_scale_depth; + void calculate_scale(); + + // drawing icons + IconManager m_icon_manager; + IconManager::VIcons m_icons; + void init_icons(); + + // only temporary solution + static const std::string M_ICON_FILENAME; +}; + +} // namespace Slic3r::GUI + +#endif // slic3r_GLGizmoEmboss_hpp_ diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp index 1a6ad83ca9..ccf3956f38 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp @@ -513,7 +513,7 @@ void GLGizmoFdmSupports::show_tooltip_information(float caption_max, float x, fl ImTextureID normal_id = m_parent.get_gizmos_manager().get_icon_texture_id(GLGizmosManager::MENU_ICON_NAME::IC_TOOLBAR_TOOLTIP); ImTextureID hover_id = m_parent.get_gizmos_manager().get_icon_texture_id(GLGizmosManager::MENU_ICON_NAME::IC_TOOLBAR_TOOLTIP_HOVER); - caption_max += m_imgui->calc_text_size(": ").x + 15.f; + caption_max += m_imgui->calc_text_size(std::string_view{": "}).x + 15.f; float font_size = ImGui::GetFontSize(); ImVec2 button_size = ImVec2(font_size * 1.8, font_size * 1.3); @@ -584,7 +584,7 @@ void GLGizmoFdmSupports::select_facets_by_angle(float threshold_deg, bool block) ++mesh_id; - const Transform3d trafo_matrix = mi->get_matrix(true) * mv->get_matrix(true); + const Transform3d trafo_matrix = mi->get_matrix_no_offset() * mv->get_matrix_no_offset(); Vec3f down = (trafo_matrix.inverse() * (-Vec3d::UnitZ())).cast().normalized(); Vec3f limit = (trafo_matrix.inverse() * Vec3d(std::sin(threshold), 0, -std::cos(threshold))).cast().normalized(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp index e4a4f895e6..a3632b6ed8 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp @@ -165,7 +165,7 @@ void GLGizmoFlatten::update_planes() ch = ch.convex_hull_3d(); m_planes.clear(); on_unregister_raycasters_for_picking(); - const Transform3d& inst_matrix = mo->instances.front()->get_matrix(true); + const Transform3d &inst_matrix = mo->instances.front()->get_matrix_no_offset(); // Following constants are used for discarding too small polygons. const float minimal_area = 5.f; // in square mm (world coordinates) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp index 0c8b42fe16..9293a8187d 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp @@ -2042,7 +2042,7 @@ void GLGizmoMeasure::show_tooltip_information(float caption_max, float x, float ImTextureID normal_id = m_parent.get_gizmos_manager().get_icon_texture_id(GLGizmosManager::MENU_ICON_NAME::IC_TOOLBAR_TOOLTIP); ImTextureID hover_id = m_parent.get_gizmos_manager().get_icon_texture_id(GLGizmosManager::MENU_ICON_NAME::IC_TOOLBAR_TOOLTIP_HOVER); - caption_max += m_imgui->calc_text_size(": ").x + 35.f; + caption_max += m_imgui->calc_text_size(std::string_view{": "}).x + 35.f; float font_size = ImGui::GetFontSize(); ImVec2 button_size = ImVec2(font_size * 1.8, font_size * 1.3); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMeshBoolean.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMeshBoolean.cpp index fb19ff6459..e0af77feeb 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMeshBoolean.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMeshBoolean.cpp @@ -68,13 +68,13 @@ bool GLGizmoMeshBoolean::gizmo_event(SLAGizmoEventType action, const Vec2d& mous return true; if (get_selecting_state() == MeshBooleanSelectingState::SelectTool) { - m_tool.trafo = trafo_matrices[closest_hit_mesh_id]; + m_tool.trafo = mo->volumes[closest_hit_mesh_id]->get_matrix(); m_tool.volume_idx = closest_hit_mesh_id; set_tool_volume(mo->volumes[closest_hit_mesh_id]); return true; } if (get_selecting_state() == MeshBooleanSelectingState::SelectSource) { - m_src.trafo = trafo_matrices[closest_hit_mesh_id]; + m_src.trafo = mo->volumes[closest_hit_mesh_id]->get_matrix(); m_src.volume_idx = closest_hit_mesh_id; set_src_volume(mo->volumes[closest_hit_mesh_id]); m_selecting_state = MeshBooleanSelectingState::SelectTool; @@ -451,7 +451,7 @@ void GLGizmoMeshBoolean::generate_new_volume(bool delete_input, const TriangleMe new_volume->set_material_id(old_volume->material_id()); new_volume->set_offset(old_volume->get_transformation().get_offset()); //Vec3d translate_z = { 0,0, (new_volume->source.mesh_offset - old_volume->source.mesh_offset).z() }; - //new_volume->translate(new_volume->get_transformation().get_matrix(true) * translate_z); + //new_volume->translate(new_volume->get_transformation().get_matrix_no_offset() * translate_z); //new_volume->supported_facets.assign(old_volume->supported_facets); //new_volume->seam_facets.assign(old_volume->seam_facets); //new_volume->mmu_segmentation_facets.assign(old_volume->mmu_segmentation_facets); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp index c6ee8f4e04..e44b80cc78 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp @@ -341,7 +341,7 @@ void GLGizmoMmuSegmentation::show_tooltip_information(float caption_max, float x ImTextureID normal_id = m_parent.get_gizmos_manager().get_icon_texture_id(GLGizmosManager::MENU_ICON_NAME::IC_TOOLBAR_TOOLTIP); ImTextureID hover_id = m_parent.get_gizmos_manager().get_icon_texture_id(GLGizmosManager::MENU_ICON_NAME::IC_TOOLBAR_TOOLTIP_HOVER); - caption_max += m_imgui->calc_text_size(": ").x + 15.f; + caption_max += m_imgui->calc_text_size(std::string_view{": "}).x + 15.f; float font_size = ImGui::GetFontSize(); ImVec2 button_size = ImVec2(font_size * 1.8, font_size * 1.3); @@ -408,7 +408,7 @@ void GLGizmoMmuSegmentation::on_render_input_window(float x, float y, float bott const float filter_btn_width = m_imgui->calc_text_size(m_desc.at("perform")).x + m_imgui->scaled(1.f); const float buttons_width = remove_btn_width + filter_btn_width + m_imgui->scaled(1.f); const float minimal_slider_width = m_imgui->scaled(4.f); - const float color_button_width = m_imgui->calc_text_size("").x + m_imgui->scaled(1.75f); + const float color_button_width = m_imgui->calc_text_size(std::string_view{""}).x + m_imgui->scaled(1.75f); float caption_max = 0.f; float total_text_max = 0.f; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp index 91913914a8..1049e61f5e 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp @@ -107,7 +107,15 @@ void GLGizmoMove3D::on_dragging(const UpdateData& data) m_displacement.z() = calc_projection(data); Selection &selection = m_parent.get_selection(); - selection.translate(m_displacement); + TransformationType trafo_type; + trafo_type.set_relative(); + switch (wxGetApp().obj_manipul()->get_coordinates_type()) + { + case ECoordinatesType::Instance: { trafo_type.set_instance(); break; } + case ECoordinatesType::Local: { trafo_type.set_local(); break; } + default: { break; } + } + selection.translate(m_displacement, trafo_type); } void GLGizmoMove3D::on_render() diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp index 015e47cbda..599c49088e 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp @@ -245,7 +245,7 @@ void GLGizmoPainterBase::render_cursor_sphere(const Transform3d& trafo) const if (shader == nullptr) return; - const Transform3d complete_scaling_matrix_inverse = Geometry::Transformation(trafo).get_matrix(true, true, false, true).inverse(); + const Transform3d complete_scaling_matrix_inverse = Geometry::Transformation(trafo).get_matrix_no_scaling_factor().inverse(); // BBS ColorRGBA render_color = this->get_cursor_hover_color(); @@ -536,8 +536,8 @@ std::vector GLGizmoPainterBase::get_pr mi->get_assemble_transformation().get_matrix() : mi->get_transformation().get_matrix(); const Transform3d instance_trafo_not_translate = m_parent.get_canvas_type() == GLCanvas3D::CanvasAssembleView ? - mi->get_assemble_transformation().get_matrix(true) : - mi->get_transformation().get_matrix(true); + mi->get_assemble_transformation().get_matrix_no_offset() : + mi->get_transformation().get_matrix_no_offset(); for (int mesh_idx = 0; mesh_idx < part_volumes.size(); mesh_idx++) { if (mesh_idx == m_rr.mesh_id) @@ -605,8 +605,8 @@ bool GLGizmoPainterBase::gizmo_event(SLAGizmoEventType action, const Vec2d& mous const ModelObject *mo = m_c->selection_info()->model_object(); const ModelInstance *mi = mo->instances[selection.get_instance_idx()]; const Transform3d trafo_matrix_not_translate = m_parent.get_canvas_type() == GLCanvas3D::CanvasAssembleView ? - mi->get_assemble_transformation().get_matrix(true) * mo->volumes[m_rr.mesh_id]->get_matrix(true) : - mi->get_transformation().get_matrix(true) * mo->volumes[m_rr.mesh_id]->get_matrix(true); + mi->get_assemble_transformation().get_matrix_no_offset() * mo->volumes[m_rr.mesh_id]->get_matrix_no_offset() : + mi->get_transformation().get_matrix_no_offset() * mo->volumes[m_rr.mesh_id]->get_matrix_no_offset(); const Transform3d trafo_matrix = m_parent.get_canvas_type() == GLCanvas3D::CanvasAssembleView ? mi->get_assemble_transformation().get_matrix() * mo->volumes[m_rr.mesh_id]->get_matrix() : mi->get_transformation().get_matrix() * mo->volumes[m_rr.mesh_id]->get_matrix(); @@ -675,8 +675,8 @@ bool GLGizmoPainterBase::gizmo_event(SLAGizmoEventType action, const Vec2d& mous mi->get_assemble_transformation().get_matrix() : mi->get_transformation().get_matrix(); Transform3d instance_trafo_not_translate = m_parent.get_canvas_type() == GLCanvas3D::CanvasAssembleView ? - mi->get_assemble_transformation().get_matrix(true) : - mi->get_transformation().get_matrix(true); + mi->get_assemble_transformation().get_matrix_no_offset() : + mi->get_transformation().get_matrix_no_offset(); std::vector part_volumes; // Precalculate transformations of individual meshes. @@ -692,7 +692,7 @@ bool GLGizmoPainterBase::gizmo_event(SLAGizmoEventType action, const Vec2d& mous else { trafo_matrices.emplace_back(instance_trafo* mv->get_matrix()); } - trafo_matrices_not_translate.emplace_back(instance_trafo_not_translate * mv->get_matrix(true)); + trafo_matrices_not_translate.emplace_back(instance_trafo_not_translate * mv->get_matrix_no_offset()); part_volumes.push_back(mv); } @@ -824,8 +824,8 @@ bool GLGizmoPainterBase::gizmo_event(SLAGizmoEventType action, const Vec2d& mous mi->get_assemble_transformation().get_matrix() : mi->get_transformation().get_matrix(); const Transform3d instance_trafo_not_translate = m_parent.get_canvas_type() == GLCanvas3D::CanvasAssembleView ? - mi->get_assemble_transformation().get_matrix(true) : - mi->get_transformation().get_matrix(true); + mi->get_assemble_transformation().get_matrix_no_offset() : + mi->get_transformation().get_matrix_no_offset(); // Precalculate transformations of individual meshes. std::vector trafo_matrices; @@ -840,7 +840,7 @@ bool GLGizmoPainterBase::gizmo_event(SLAGizmoEventType action, const Vec2d& mous else { trafo_matrices.emplace_back(instance_trafo * mv->get_matrix()); } - trafo_matrices_not_translate.emplace_back(instance_trafo_not_translate * mv->get_matrix(true)); + trafo_matrices_not_translate.emplace_back(instance_trafo_not_translate * mv->get_matrix_no_offset()); } // Now "click" into all the prepared points and spill paint around them. diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp index 1b412c847c..5a02e66669 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp @@ -6,14 +6,14 @@ #include "slic3r/GUI/GLCanvas3D.hpp" #include "slic3r/GUI/ImGuiWrapper.hpp" -#include - #include "slic3r/GUI/GUI_App.hpp" #include "slic3r/GUI/GUI.hpp" #include "slic3r/GUI/Plater.hpp" +#include "slic3r/GUI/Jobs/RotoptimizeJob.hpp" + #include "libslic3r/PresetBundle.hpp" -#include "slic3r/GUI/Jobs/RotoptimizeJob.hpp" +#include namespace Slic3r { namespace GUI { @@ -28,10 +28,16 @@ const float GLGizmoRotate::ScaleLongTooth = 0.1f; // in percent of radius const unsigned int GLGizmoRotate::SnapRegionsCount = 8; const float GLGizmoRotate::GrabberOffset = 0.15f; // in percent of radius - GLGizmoRotate::GLGizmoRotate(GLCanvas3D& parent, GLGizmoRotate::Axis axis) : GLGizmoBase(parent, "", -1) , m_axis(axis) + , m_angle(0.0) + , m_center(0.0, 0.0, 0.0) + , m_radius(0.0f) + , m_snap_coarse_in_radius(0.0f) + , m_snap_coarse_out_radius(0.0f) + , m_snap_fine_in_radius(0.0f) + , m_snap_fine_out_radius(0.0f) , m_drag_color(DEFAULT_DRAG_COLOR) , m_highlight_color(DEFAULT_HIGHLIGHT_COLOR) { @@ -94,19 +100,12 @@ bool GLGizmoRotate::on_init() void GLGizmoRotate::on_start_dragging() { - const BoundingBoxf3& box = m_parent.get_selection().get_bounding_box(); - m_center = m_custom_center == Vec3d::Zero() ? box.center() : m_custom_center; - m_radius = Offset + box.radius(); - m_snap_coarse_in_radius = m_radius / 3.0f; - m_snap_coarse_out_radius = 2.0f * m_snap_coarse_in_radius; - m_snap_fine_in_radius = m_radius; - m_snap_fine_out_radius = m_snap_fine_in_radius + m_radius * ScaleLongTooth; + init_data_from_selection(m_parent.get_selection()); } void GLGizmoRotate::on_dragging(const UpdateData &data) { - const Vec2d mouse_pos = to_2d(mouse_position_in_local_plane(data.mouse_ray, m_parent.get_selection())); - + const Vec2d mouse_pos = to_2d(mouse_position_in_local_plane(data.mouse_ray)); const Vec2d orig_dir = Vec2d::UnitX(); const Vec2d new_dir = mouse_pos.normalized(); @@ -141,16 +140,8 @@ void GLGizmoRotate::on_render() return; const Selection& selection = m_parent.get_selection(); - const BoundingBoxf3& box = selection.get_bounding_box(); - - if (m_hover_id != 0 && !m_grabbers.front().dragging) { - m_center = m_custom_center == Vec3d::Zero() ? box.center() : m_custom_center; - m_radius = Offset + box.radius(); - m_snap_coarse_in_radius = m_radius / 3.0f; - m_snap_coarse_out_radius = 2.0f * m_snap_coarse_in_radius; - m_snap_fine_in_radius = m_radius; - m_snap_fine_out_radius = m_radius * (1.0f + ScaleLongTooth); - } + if (m_hover_id != 0 && !m_grabbers.front().dragging) + init_data_from_selection(selection); const double grabber_radius = (double)m_radius * (1.0 + (double)GrabberOffset); m_grabbers.front().center = Vec3d(::cos(m_angle) * grabber_radius, ::sin(m_angle) * grabber_radius, 0.0); @@ -168,15 +159,14 @@ void GLGizmoRotate::on_render() shader->start_using(); const Camera& camera = wxGetApp().plater()->get_camera(); - Transform3d view_model_matrix = camera.get_view_matrix() * m_grabbers.front().matrix; - + const Transform3d view_model_matrix = camera.get_view_matrix() * m_grabbers.front().matrix; shader->set_uniform("view_model_matrix", view_model_matrix); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); const bool radius_changed = std::abs(m_old_radius - m_radius) > EPSILON; m_old_radius = m_radius; - ColorRGBA color((m_hover_id != -1) ? m_drag_color : m_highlight_color); + const ColorRGBA color = (m_hover_id != -1) ? m_drag_color : m_highlight_color; render_circle(color, radius_changed); if (m_hover_id != -1) { const bool hover_radius_changed = std::abs(m_old_hover_radius - m_radius) > EPSILON; @@ -192,7 +182,23 @@ void GLGizmoRotate::on_render() shader->stop_using(); } - render_grabber(box); + render_grabber(m_bounding_box); +} + +void GLGizmoRotate::init_data_from_selection(const Selection& selection) +{ + const auto [box, box_trafo] = m_force_local_coordinate ? + selection.get_bounding_box_in_reference_system(ECoordinatesType::Local) : selection.get_bounding_box_in_current_reference_system(); + m_bounding_box = box; + const std::pair sphere = selection.get_bounding_sphere(); + m_center = sphere.first; + m_radius = Offset + sphere.second; + m_orient_matrix = box_trafo; + m_orient_matrix.translation() = m_center; + m_snap_coarse_in_radius = m_radius / 3.0f; + m_snap_coarse_out_radius = 2.0f * m_snap_coarse_in_radius; + m_snap_fine_in_radius = m_radius; + m_snap_fine_out_radius = m_snap_fine_in_radius + m_radius * ScaleLongTooth; } //BBS: add input window for move @@ -422,12 +428,12 @@ Transform3d GLGizmoRotate::local_transform(const Selection& selection) const { case X: { - ret = Geometry::assemble_transform(Vec3d::Zero(), 0.5 * PI * Vec3d::UnitY()) * Geometry::assemble_transform(Vec3d::Zero(), -0.5 * PI * Vec3d::UnitZ()); + ret = Geometry::rotation_transform(0.5 * PI * Vec3d::UnitY()) * Geometry::rotation_transform(-0.5 * PI * Vec3d::UnitZ()); break; } case Y: { - ret = Geometry::assemble_transform(Vec3d::Zero(), -0.5 * PI * Vec3d::UnitZ()) * Geometry::assemble_transform(Vec3d::Zero(), -0.5 * PI * Vec3d::UnitY()); + ret = Geometry::rotation_transform(-0.5 * PI * Vec3d::UnitZ()) * Geometry::rotation_transform(-0.5 * PI * Vec3d::UnitY()); break; } default: @@ -438,13 +444,10 @@ Transform3d GLGizmoRotate::local_transform(const Selection& selection) const } } - if (selection.is_single_volume() || selection.is_single_modifier() || selection.requires_local_axes()) - ret = selection.get_first_volume()->get_instance_transformation().get_matrix(true, false, true, true) * ret; - - return Geometry::assemble_transform(m_center) * ret; + return m_orient_matrix * ret; } -Vec3d GLGizmoRotate::mouse_position_in_local_plane(const Linef3& mouse_ray, const Selection& selection) const +Vec3d GLGizmoRotate::mouse_position_in_local_plane(const Linef3& mouse_ray) const { const double half_pi = 0.5 * double(PI); @@ -472,8 +475,7 @@ Vec3d GLGizmoRotate::mouse_position_in_local_plane(const Linef3& mouse_ray, cons } } - if (selection.is_single_volume() || selection.is_single_modifier() || selection.requires_local_axes()) - m = m * selection.get_first_volume()->get_instance_transformation().get_matrix(true, false, true, true).inverse(); + m = m * Geometry::Transformation(m_orient_matrix).get_matrix_no_offset().inverse(); m.translate(-m_center); @@ -496,19 +498,32 @@ Vec3d GLGizmoRotate::mouse_position_in_local_plane(const Linef3& mouse_ray, cons //BBS: GUI refactor: add obj manipulation GLGizmoRotate3D::GLGizmoRotate3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id, GizmoObjectManipulation* obj_manipulation) : GLGizmoBase(parent, icon_filename, sprite_id) - , m_gizmos({ GLGizmoRotate(parent, GLGizmoRotate::X), GLGizmoRotate(parent, GLGizmoRotate::Y), GLGizmoRotate(parent, GLGizmoRotate::Z) }) - //BBS: GUI refactor: add obj manipulation + , m_gizmos({ + GLGizmoRotate(parent, GLGizmoRotate::X), + GLGizmoRotate(parent, GLGizmoRotate::Y), + GLGizmoRotate(parent, GLGizmoRotate::Z) }) + //BBS: GUI refactor: add obj manipulation , m_object_manipulation(obj_manipulation) { load_rotoptimize_state(); } -bool GLGizmoRotate3D::on_mouse(const wxMouseEvent &mouse_event) { - +bool GLGizmoRotate3D::on_mouse(const wxMouseEvent &mouse_event) +{ if (mouse_event.Dragging() && m_dragging) { // Apply new temporary rotations - TransformationType transformation_type( - TransformationType::World_Relative_Joint); + TransformationType transformation_type; + if (m_parent.get_selection().is_wipe_tower()) + transformation_type = TransformationType::World_Relative_Joint; + else { + switch (wxGetApp().obj_manipul()->get_coordinates_type()) + { + default: + case ECoordinatesType::World: { transformation_type = TransformationType::World_Relative_Joint; break; } + case ECoordinatesType::Instance: { transformation_type = TransformationType::Instance_Relative_Joint; break; } + case ECoordinatesType::Local: { transformation_type = TransformationType::Local_Relative_Joint; break; } + } + } if (mouse_event.AltDown()) transformation_type.set_independent(); m_parent.get_selection().rotate(get_rotation(), transformation_type); @@ -669,11 +684,12 @@ GLGizmoRotate3D::RotoptimzeWindow::RotoptimzeWindow(ImGuiWrapper * imgui, ImVec2 button_sz = {btn_txt_sz.x + padding.x, btn_txt_sz.y + padding.y}; ImGui::SetCursorPosX(padding.x + sz.x - button_sz.x); - if (wxGetApp().plater()->is_any_job_running()) + if (!wxGetApp().plater()->get_ui_job_worker().is_idle()) imgui->disabled_begin(true); if ( imgui->button(btn_txt) ) { - wxGetApp().plater()->optimize_rotation(); + replace_job(wxGetApp().plater()->get_ui_job_worker(), + std::make_unique()); } imgui->disabled_end(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp index edafc5ae23..bc846f0ad0 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp @@ -6,14 +6,13 @@ #define slic3r_GLGizmoRotate_hpp_ #include "GLGizmoBase.hpp" -#include "../Jobs/RotoptimizeJob.hpp" //BBS: add size adjust related #include "GizmoObjectManipulation.hpp" - namespace Slic3r { namespace GUI { class Selection; + class GLGizmoRotate : public GLGizmoBase { static const float Offset; @@ -36,16 +35,14 @@ public: private: Axis m_axis; double m_angle{ 0.0 }; - Vec3d m_custom_center{Vec3d::Zero()}; Vec3d m_center{ Vec3d::Zero() }; float m_radius{ 0.0f }; float m_snap_coarse_in_radius{ 0.0f }; float m_snap_coarse_out_radius{ 0.0f }; float m_snap_fine_in_radius{ 0.0f }; float m_snap_fine_out_radius{ 0.0f }; - - ColorRGBA m_drag_color; - ColorRGBA m_highlight_color; + BoundingBoxf3 m_bounding_box; + Transform3d m_orient_matrix{ Transform3d::Identity() }; GLModel m_circle; GLModel m_scale; @@ -62,6 +59,12 @@ private: float m_old_hover_radius{ 0.0f }; float m_old_angle{ 0.0f }; + // emboss need to draw rotation gizmo in local coordinate systems + bool m_force_local_coordinate{ false }; + + ColorRGBA m_drag_color; + ColorRGBA m_highlight_color; + public: GLGizmoRotate(GLCanvas3D& parent, Axis axis); virtual ~GLGizmoRotate() = default; @@ -71,7 +74,8 @@ public: std::string get_tooltip() const override; - void set_center(const Vec3d &point) { m_custom_center = point; } + void set_group_id(int group_id) { m_group_id = group_id; } + void set_force_local_coordinate(bool use) { m_force_local_coordinate = use; } void start_dragging(); void stop_dragging(); @@ -109,7 +113,9 @@ private: Transform3d local_transform(const Selection& selection) const; // returns the intersection of the mouse ray with the plane perpendicular to the gizmo axis, in local coordinate - Vec3d mouse_position_in_local_plane(const Linef3& mouse_ray, const Selection& selection) const; + Vec3d mouse_position_in_local_plane(const Linef3& mouse_ray) const; + + void init_data_from_selection(const Selection& selection); }; class GLGizmoRotate3D : public GLGizmoBase @@ -138,13 +144,6 @@ public: return tooltip; } - void set_center(const Vec3d &point) - { - m_gizmos[X].set_center(point); - m_gizmos[Y].set_center(point); - m_gizmos[Z].set_center(point); - } - /// /// Postpone to Rotation /// @@ -164,7 +163,14 @@ protected: for (int i = 0; i < 3; ++i) m_gizmos[i].set_hover_id((m_hover_id == i) ? 0 : -1); } - + void on_enable_grabber(unsigned int id) override { + if (id < 3) + m_gizmos[id].enable_grabber(); + } + void on_disable_grabber(unsigned int id) override { + if (id < 3) + m_gizmos[id].disable_grabber(); + } bool on_is_activable() const override; void on_start_dragging() override; void on_stop_dragging() override; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSVG.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSVG.cpp new file mode 100644 index 0000000000..92a5e5ecd6 --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmoSVG.cpp @@ -0,0 +1,2240 @@ +#include "GLGizmoSVG.hpp" +#include "slic3r/GUI/GLCanvas3D.hpp" +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/GUI_ObjectList.hpp" +#include "slic3r/GUI/Gizmos/GizmoObjectManipulation.hpp" +#include "slic3r/GUI/MainFrame.hpp" // to update title when add text +#include "slic3r/GUI/NotificationManager.hpp" +#include "slic3r/GUI/Plater.hpp" +#include "slic3r/GUI/MsgDialog.hpp" +#include "slic3r/GUI/format.hpp" +#include "slic3r/GUI/CameraUtils.hpp" +#include "slic3r/GUI/Jobs/EmbossJob.hpp" +#include "slic3r/Utils/UndoRedo.hpp" + +#include "libslic3r/Point.hpp" +#include "libslic3r/SVG.hpp" // debug store +#include "libslic3r/Geometry.hpp" // covex hull 2d +#include "libslic3r/Timer.hpp" // covex hull 2d +#include "libslic3r/Emboss.hpp" // heal_shape + +#include "libslic3r/NSVGUtils.hpp" +#include "libslic3r/Model.hpp" +#include "libslic3r/ClipperUtils.hpp" // union_ex + +#include "imgui/imgui_stdlib.h" // using std::string for inputs +#ifndef IMGUI_DEFINE_MATH_OPERATORS +#define IMGUI_DEFINE_MATH_OPERATORS +#endif +#include +#include "nanosvg/nanosvg.h" // load SVG file + +#include // detection of change DPI +#include + +#include +#include // measure enumeration of fonts +#include // save for svg +#include +#include + +using namespace Slic3r; +using namespace Slic3r::Emboss; +using namespace Slic3r::GUI; +using namespace Slic3r::GUI::Emboss; + +GLGizmoSVG::GLGizmoSVG(GLCanvas3D &parent) + : GLGizmoBase(parent, M_ICON_FILENAME, -3) + , m_gui_cfg(nullptr) + , m_rotate_gizmo(parent, GLGizmoRotate::Axis::Z) // grab id = 2 (Z axis) +{ + m_rotate_gizmo.set_group_id(0); + m_rotate_gizmo.set_force_local_coordinate(true); +} + +// Private functions to create emboss volume +namespace{ + +// Variable keep limits for variables +const struct Limits +{ + MinMax depth{0.01, 1e4}; // in mm + MinMax size{0.01f, 1e4f}; // in mm (width + height) + MinMax ui_size{5.f, 100.f}; // in mm (width + height) - only slider values + MinMax ui_size_in{.1f, 4.f};// in inches (width + height) - only slider values + MinMax relative_scale_ratio{1e-5, 1e4}; // change size + // distance text object from surface + MinMax angle{-180.f, 180.f}; // in degrees +} limits; + +// Store path to directory with svg for import and export svg's +wxString last_used_directory = wxEmptyString; + +/// +/// Open file dialog with svg files +/// +/// File path to svg +std::string choose_svg_file(); + +constexpr double get_tesselation_tolerance(double scale){ + constexpr double tesselation_tolerance_in_mm = .1; //8e-2; + constexpr double tesselation_tolerance_scaled = (tesselation_tolerance_in_mm*tesselation_tolerance_in_mm) / SCALING_FACTOR / SCALING_FACTOR; + return tesselation_tolerance_scaled / scale / scale; +} + +/// +/// Let user to choose file with (S)calable (V)ector (G)raphics - SVG. +/// Than let select contour +/// +/// SVG file path, when empty promt user to select one +/// EmbossShape to create +EmbossShape select_shape(std::string_view filepath = "", double tesselation_tolerance_in_mm = get_tesselation_tolerance(1.)); + +/// +/// Create new embos data +/// +/// Cancel for previous job +/// To distiquish whether it is outside of model +/// SVG file path +/// Base data for emboss SVG +DataBasePtr create_emboss_data_base(std::shared_ptr> &cancel, ModelVolumeType volume_type, std::string_view filepath = ""); + +/// +/// Separate file name from file path. +/// String after last delimiter and before last point +/// +/// path return by file dialog +/// File name without directory path +std::string get_file_name(const std::string &file_path); + +/// +/// Create volume name from shape information +/// +/// File path +/// Name for volume +std::string volume_name(const EmbossShape& shape); + +/// +/// Create input for volume creation +/// +/// parent of gizmo +/// Keep scene +/// Type of volume to be created +/// Params +CreateVolumeParams create_input(GLCanvas3D &canvas, RaycastManager &raycaster, ModelVolumeType volume_type); + +enum class IconType : unsigned { + reset_value, + refresh, + change_file, + bake, + save, + exclamation, + lock, + unlock, + reflection_x, + reflection_y, + // automatic calc of icon's count + _count +}; +// Do not forgot add loading of file in funtion: +// IconManager::Icons init_icons( + +// Define rendered version of icon +enum class IconState : unsigned { activable = 0, hovered /*1*/, disabled /*2*/ }; +// selector for icon by enum +const IconManager::Icon &get_icon(const IconManager::VIcons &icons, IconType type, IconState state) { + return *icons[(unsigned) type][(unsigned) state]; } + +// This configs holds GUI layout size given by translated texts. +// etc. When language changes, GUI is recreated and this class constructed again, +// so the change takes effect. (info by GLGizmoFdmSupports.hpp) +struct GuiCfg +{ + // Detect invalid config values when change monitor DPI + double screen_scale = -1.; + bool dark_mode = false; + + // Define bigger size(width or height) + unsigned texture_max_size_px = 256; + + float input_width = 0.f; + float input_offset = 0.f; + + float icon_width = 0.f; + + float max_tooltip_width = 0.f; + + // offset for checbox for lock up vector + float lock_offset = 0.f; + // Only translations needed for calc GUI size + struct Translations + { + std::string depth; + std::string size; + std::string use_surface; + std::string rotation; + std::string distance; // from surface + std::string mirror; + }; + Translations translations; +}; +GuiCfg create_gui_configuration(); + +} // namespace + +// use private definition +struct GLGizmoSVG::GuiCfg: public ::GuiCfg{}; + +bool GLGizmoSVG::create_volume(ModelVolumeType volume_type, const Vec2d &mouse_pos) +{ + CreateVolumeParams input = create_input(m_parent, m_raycast_manager, volume_type); + DataBasePtr base = create_emboss_data_base(m_job_cancel, volume_type); + if (!base) return false; // Uninterpretable svg + return start_create_volume(input, std::move(base), mouse_pos); +} + +bool GLGizmoSVG::create_volume(ModelVolumeType volume_type) +{ + CreateVolumeParams input = create_input(m_parent, m_raycast_manager, volume_type); + DataBasePtr base = create_emboss_data_base(m_job_cancel,volume_type); + if (!base) return false; // Uninterpretable svg + return start_create_volume_without_position(input, std::move(base)); +} + +bool GLGizmoSVG::create_volume(std::string_view svg_file, ModelVolumeType volume_type){ + CreateVolumeParams input = create_input(m_parent, m_raycast_manager, volume_type); + DataBasePtr base = create_emboss_data_base(m_job_cancel, volume_type, svg_file); + if (!base) return false; // Uninterpretable svg + return start_create_volume_without_position(input, std::move(base)); +} + +bool GLGizmoSVG::create_volume(std::string_view svg_file, const Vec2d &mouse_pos, ModelVolumeType volume_type) +{ + CreateVolumeParams input = create_input(m_parent, m_raycast_manager, volume_type); + DataBasePtr base = create_emboss_data_base(m_job_cancel, volume_type, svg_file); + if (!base) return false; // Uninterpretable svg + return start_create_volume(input, std::move(base), mouse_pos); +} + +bool GLGizmoSVG::is_svg(const ModelVolume &volume) { + return volume.emboss_shape.has_value() && volume.emboss_shape->svg_file.has_value(); +} + +bool GLGizmoSVG::is_svg_object(const ModelVolume &volume) { + if (!volume.emboss_shape.has_value()) return false; + if (volume.type() != ModelVolumeType::MODEL_PART) return false; + for (const ModelVolume *v : volume.get_object()->volumes) { + if (v->id() == volume.id()) continue; + if (v->type() == ModelVolumeType::MODEL_PART) return false; + } + return true; +} + +bool GLGizmoSVG::on_mouse_for_rotation(const wxMouseEvent &mouse_event) +{ + if (mouse_event.Moving()) return false; + + bool used = use_grabbers(mouse_event); + if (!m_dragging) return used; + + if (mouse_event.Dragging()) + dragging_rotate_gizmo(m_rotate_gizmo.get_angle(), m_angle, m_rotate_start_angle, m_parent.get_selection()); + + return used; +} + +bool GLGizmoSVG::on_mouse_for_translate(const wxMouseEvent &mouse_event) +{ + // exist selected volume? + if (m_volume == nullptr) + return false; + + auto up_limit = m_keep_up ? std::optional(UP_LIMIT) : std::optional{}; + const Camera &camera = wxGetApp().plater()->get_camera(); + + bool was_dragging = m_surface_drag.has_value(); + bool res = on_mouse_surface_drag(mouse_event, camera, m_surface_drag, m_parent, m_raycast_manager, up_limit); + bool is_dragging = m_surface_drag.has_value(); + + // End with surface dragging? + if (was_dragging && !is_dragging) { + // Update surface by new position + if (m_volume->emboss_shape->projection.use_surface) + process(); + + // TODO: Remove it when it will be stable + // Distance should not change during dragging + const GLVolume *gl_volume = m_parent.get_selection().get_first_volume(); + m_distance = calc_distance(*gl_volume, m_raycast_manager, m_parent); + + // Show correct value of height & depth inside of inputs + calculate_scale(); + } + + // Start with dragging + else if (!was_dragging && is_dragging) { + // Cancel job to prevent interuption of dragging (duplicit result) + if (m_job_cancel != nullptr) + m_job_cancel->store(true); + } + + // during drag + else if (was_dragging && is_dragging) { + // update scale of selected volume --> should be approx the same + calculate_scale(); + + // Recalculate angle for GUI + if (!m_keep_up) + m_angle = calc_angle(m_parent.get_selection()); + } + return res; +} + +void GLGizmoSVG::volume_transformation_changed() +{ + if (m_volume == nullptr || + !m_volume->emboss_shape.has_value()) { + assert(false); + return; + } + + if (!m_keep_up) { + // update current style + m_angle = calc_angle(m_parent.get_selection()); + } else { + // angle should be the same + assert(is_approx(m_angle, calc_angle(m_parent.get_selection()))); + } + + // Update surface by new position + if (m_volume->emboss_shape->projection.use_surface) { + process(); + } else { + // inform slicing process that model changed + // SLA supports, processing + // ensure on bed + wxGetApp().plater()->changed_object(*m_volume->get_object()); + } + + // Show correct value of height & depth inside of inputs + calculate_scale(); +} + +bool GLGizmoSVG::on_mouse(const wxMouseEvent &mouse_event) +{ + // not selected volume + if (m_volume == nullptr || + get_model_volume(m_volume_id, m_parent.get_selection().get_model()->objects) == nullptr || + !m_volume->emboss_shape.has_value()) return false; + + if (on_mouse_for_rotation(mouse_event)) return true; + if (on_mouse_for_translate(mouse_event)) return true; + + return false; +} + +bool GLGizmoSVG::wants_enter_leave_snapshots() const { return true; } +std::string GLGizmoSVG::get_gizmo_entering_text() const { return _u8L("Enter SVG gizmo"); } +std::string GLGizmoSVG::get_gizmo_leaving_text() const { return _u8L("Leave SVG gizmo"); } +std::string GLGizmoSVG::get_action_snapshot_name() const { return _u8L("SVG actions"); } + +bool GLGizmoSVG::on_init() +{ + m_rotate_gizmo.init(); + ColorRGBA gray_color(.6f, .6f, .6f, .3f); + m_rotate_gizmo.set_highlight_color(gray_color); + // Set rotation gizmo upwardrotate + m_rotate_gizmo.set_angle(PI / 2); + return true; +} + +std::string GLGizmoSVG::on_get_name() const { return _u8L("SVG"); } + +void GLGizmoSVG::on_render() { + if (const Selection &selection = m_parent.get_selection(); + selection.volumes_count() != 1 || // only one selected volume + m_volume == nullptr || // already selected volume in gizmo + get_model_volume(m_volume_id, selection.get_model()->objects) == nullptr) // still exist model + return; + + bool is_surface_dragging = m_surface_drag.has_value(); + bool is_parent_dragging = m_parent.is_mouse_dragging(); + // Do NOT render rotation grabbers when dragging object + bool is_rotate_by_grabbers = m_dragging; + if (is_rotate_by_grabbers || + (!is_surface_dragging && !is_parent_dragging)) { + glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); + m_rotate_gizmo.render(); + } +} + +void GLGizmoSVG::on_register_raycasters_for_picking(){ + m_rotate_gizmo.register_raycasters_for_picking(); +} +void GLGizmoSVG::on_unregister_raycasters_for_picking(){ + m_rotate_gizmo.unregister_raycasters_for_picking(); +} + +namespace{ +IconManager::VIcons init_icons(IconManager &mng, const GuiCfg &cfg) +{ + mng.release(); + + ImVec2 size(cfg.icon_width, cfg.icon_width); + // icon order has to match the enum IconType + std::vector filenames{ + "undo.svg", // reset_value + "refresh.svg", // refresh + "open.svg", // changhe_file + "burn.svg", // bake + "save.svg", // save + "exclamation.svg", // exclamation + "lock_closed.svg", // lock + "lock_open.svg", // unlock + "reflection_x.svg", // reflection_x + "reflection_y.svg", // reflection_y + }; + + assert(init_types.size() == static_cast(IconType::_count)); + std::string path = resources_dir() + "/images/"; + for (std::string &filename : filenames) filename = path + filename; + + auto type = IconManager::RasterType::color_wite_gray; + return mng.init(filenames, size, type); + + //IconManager::VIcons vicons = mng.init(init_types); + // + //// flatten icons + //IconManager::Icons icons; + //icons.reserve(vicons.size()); + //for (IconManager::Icons &i : vicons) + // icons.push_back(i.front()); + //return icons; +} +bool draw_clickable(const IconManager::VIcons &icons, IconType type) +{ + return clickable(get_icon(icons, type, IconState::activable), get_icon(icons, type, IconState::hovered)); +} + +bool reset_button(const IconManager::VIcons &icons) +{ + float reset_offset = ImGui::GetStyle().WindowPadding.x; + ImGui::SameLine(reset_offset); + + // from GLGizmoCut + //std::string label_id = "neco"; + //std::string btn_label; + //btn_label += ImGui::RevertButton; + //return ImGui::Button((btn_label + "##" + label_id).c_str()); + + return draw_clickable(icons, IconType::reset_value); +} + +} // namespace + +void GLGizmoSVG::on_render_input_window(float x, float y, float bottom_limit) +{ + set_volume_by_selection(); + + double screen_scale = wxDisplay(wxGetApp().plater()).GetScaleFactor(); + + // Orca + ImGuiWrapper::push_toolbar_style(m_parent.get_scale()); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(4.0, 5.0) * screen_scale); + ImGui::PushStyleVar(ImGuiStyleVar_ScrollbarSize, 4.0f * screen_scale); + + // Configuration creation + if (m_gui_cfg == nullptr || // Exist configuration - first run + m_gui_cfg->screen_scale != screen_scale || // change of DPI + m_gui_cfg->dark_mode != m_is_dark_mode // change of dark mode + ) { + // Create cache for gui offsets + ::GuiCfg cfg = create_gui_configuration(); + cfg.screen_scale = screen_scale; + cfg.dark_mode = m_is_dark_mode; + + GuiCfg gui_cfg{std::move(cfg)}; + m_gui_cfg = std::make_unique(std::move(gui_cfg)); + + m_icons = init_icons(m_icon_manager, *m_gui_cfg); // need regeneration when change resolution(move between monitors) + } + + // Draw origin position of text during dragging + if (m_surface_drag.has_value()) { + ImVec2 mouse_pos = ImGui::GetMousePos(); + ImVec2 center( + mouse_pos.x + m_surface_drag->mouse_offset.x(), + mouse_pos.y + m_surface_drag->mouse_offset.y()); + ImU32 color = ImGui::GetColorU32( + m_surface_drag->exist_hit ? + ImVec4(1.f, 1.f, 1.f, .75f) : // transparent white + ImVec4(1.f, .3f, .3f, .75f) + ); // Warning color + const float radius = 16.f; + ImGuiWrapper::draw_cross_hair(center, radius, color); + } + + static float last_y = 0.0f; + static float last_h = 0.0f; + + // adjust window position to avoid overlap the view toolbar + const float win_h = ImGui::GetWindowHeight(); + y = std::min(y, bottom_limit - win_h); + GizmoImguiSetNextWIndowPos(x, y, ImGuiCond_Always, 0.0f, 0.0f); + if (last_h != win_h || last_y != y) { + // ask canvas for another frame to render the window in the correct position + m_imgui->set_requires_extra_frame(); + if (last_h != win_h) + last_h = win_h; + if (last_y != y) + last_y = y; + } + + GizmoImguiBegin(on_get_name(), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoTitleBar); + + draw_window(); + + GizmoImguiEnd(); + + // Orca + ImGui::PopStyleVar(2); + ImGuiWrapper::pop_toolbar_style(); +} + +void GLGizmoSVG::on_set_state() +{ + // enable / disable bed from picking + // Rotation gizmo must work through bed + m_parent.set_raycaster_gizmos_on_top(GLGizmoBase::m_state == GLGizmoBase::On); + + m_rotate_gizmo.set_state(GLGizmoBase::m_state); + + // Closing gizmo. e.g. selecting another one + if (GLGizmoBase::m_state == GLGizmoBase::Off) { + reset_volume(); + } else if (GLGizmoBase::m_state == GLGizmoBase::On) { + // Try(when exist) set text configuration by volume + set_volume_by_selection(); + } +} + +void GLGizmoSVG::data_changed(bool is_serializing) { + set_volume_by_selection(); + if (!is_serializing && m_volume == nullptr) + close(); +} + +void GLGizmoSVG::on_start_dragging() { m_rotate_gizmo.start_dragging(); } +void GLGizmoSVG::on_stop_dragging() +{ + m_rotate_gizmo.stop_dragging(); + + // TODO: when start second rotatiton previous rotation rotate draggers + // This is fast fix for second try to rotate + // When fixing, move grabber above text (not on side) + m_rotate_gizmo.set_angle(PI/2); + + // apply rotation + // TRN This is an item label in the undo-redo stack. + m_parent.do_rotate(L("SVG-Rotate")); + m_rotate_start_angle.reset(); + volume_transformation_changed(); + + // recalculate for surface cut + if (m_volume != nullptr && + m_volume->emboss_shape.has_value() && + m_volume->emboss_shape->projection.use_surface) + process(); +} +void GLGizmoSVG::on_dragging(const UpdateData &data) { m_rotate_gizmo.dragging(data); } + +#include "slic3r/GUI/BitmapCache.hpp" +#include "nanosvg/nanosvgrast.h" +#include "libslic3r/AABBTreeLines.hpp" // aabb lines for draw filled expolygon + +namespace{ + +// inspired by Xiaolin Wu's line algorithm - https://en.wikipedia.org/wiki/Xiaolin_Wu's_line_algorithm +// Draw inner part of polygon CCW line as full brightness(edge of expolygon) +void wu_draw_line_side(Linef line, + const std::function& plot) { + auto ipart = [](float x) -> int {return static_cast(std::floor(x));}; + auto round = [](float x) -> float {return std::round(x);}; + auto fpart = [](float x) -> float {return x - std::floor(x);}; + auto rfpart = [=](float x) -> float {return 1 - fpart(x);}; + + Vec2d d = line.b - line.a; + const bool steep = abs(d.y()) > abs(d.x()); + bool is_full; // identify full brightness pixel + if (steep) { + is_full = d.y() >= 0; + std::swap(line.a.x(), line.a.y()); + std::swap(line.b.x(), line.b.y()); + std::swap(d.x(), d.y()); + }else + is_full = d.x() < 0; // opposit direction of y + + if (line.a.x() > line.b.x()) { + std::swap(line.a.x(), line.b.x()); + std::swap(line.a.y(), line.b.y()); + d *= -1; + } + const float gradient = (d.x() == 0) ? 1. : d.y() / d.x(); + + int xpx11; + float intery; + { + const float xend = round(line.a.x()); + const float yend = line.a.y() + gradient * (xend - line.a.x()); + const float xgap = rfpart(line.a.x() + 0.5f); + xpx11 = int(xend); + const int ypx11 = ipart(yend); + if (steep) { + plot(ypx11, xpx11, is_full? 1.f : (rfpart(yend) * xgap)); + plot(ypx11 + 1, xpx11, !is_full? 1.f : ( fpart(yend) * xgap)); + } else { + plot(xpx11, ypx11, is_full? 1.f : (rfpart(yend) * xgap)); + plot(xpx11, ypx11 + 1,!is_full? 1.f : ( fpart(yend) * xgap)); + } + intery = yend + gradient; + } + + int xpx12; + { + const float xend = round(line.b.x()); + const float yend = line.b.y() + gradient * (xend - line.b.x()); + const float xgap = rfpart(line.b.x() + 0.5f); + xpx12 = int(xend); + const int ypx12 = ipart(yend); + if (steep) { + plot(ypx12, xpx12, is_full? 1.f : (rfpart(yend) * xgap)); + plot(ypx12 + 1, xpx12, !is_full? 1.f : ( fpart(yend) * xgap)); + } else { + plot(xpx12, ypx12, is_full? 1.f : (rfpart(yend) * xgap)); + plot(xpx12, ypx12 + 1, !is_full? 1.f : ( fpart(yend) * xgap)); + } + } + + if (steep) { + if (is_full){ + for (int x = xpx11 + 1; x < xpx12; x++) { + plot(ipart(intery), x, 1.f); + plot(ipart(intery) + 1, x, fpart(intery)); + intery += gradient; + } + } else { + for (int x = xpx11 + 1; x < xpx12; x++) { + plot(ipart(intery), x, rfpart(intery)); + plot(ipart(intery) + 1, x, 1.f ); + intery += gradient; + } + } + } else { + if (is_full){ + for (int x = xpx11 + 1; x < xpx12; x++) { + plot(x, ipart(intery), 1.f); + plot(x, ipart(intery) + 1, fpart(intery)); + intery += gradient; + } + } else { + for (int x = xpx11 + 1; x < xpx12; x++) { + plot(x, ipart(intery), rfpart(intery)); + plot(x, ipart(intery) + 1, 1.f); + intery += gradient; + } + } + } +} + +#ifdef MORE_DRAWING +// Wu's line algorithm - https://en.wikipedia.org/wiki/Xiaolin_Wu's_line_algorithm +void wu_draw_line(Linef line, + const std::function& plot) { + auto ipart = [](float x) -> int {return int(std::floor(x));}; + auto round = [](float x) -> float {return std::round(x);}; + auto fpart = [](float x) -> float {return x - std::floor(x);}; + auto rfpart = [=](float x) -> float {return 1 - fpart(x);}; + + Vec2d d = line.b - line.a; + const bool steep = abs(d.y()) > abs(d.x()); + if (steep) { + std::swap(line.a.x(), line.a.y()); + std::swap(line.b.x(), line.b.y()); + } + if (line.a.x() > line.b.x()) { + std::swap(line.a.x(), line.b.x()); + std::swap(line.a.y(), line.b.y()); + } + d = line.b - line.a; + const float gradient = (d.x() == 0) ? 1 : d.y() / d.x(); + + int xpx11; + float intery; + { + const float xend = round(line.a.x()); + const float yend = line.a.y() + gradient * (xend - line.a.x()); + const float xgap = rfpart(line.a.x() + 0.5); + xpx11 = int(xend); + const int ypx11 = ipart(yend); + if (steep) { + plot(ypx11, xpx11, rfpart(yend) * xgap); + plot(ypx11 + 1, xpx11, fpart(yend) * xgap); + } else { + plot(xpx11, ypx11, rfpart(yend) * xgap); + plot(xpx11, ypx11 + 1, fpart(yend) * xgap); + } + intery = yend + gradient; + } + + int xpx12; + { + const float xend = round(line.b.x()); + const float yend = line.b.y() + gradient * (xend - line.b.x()); + const float xgap = rfpart(line.b.x() + 0.5); + xpx12 = int(xend); + const int ypx12 = ipart(yend); + if (steep) { + plot(ypx12, xpx12, rfpart(yend) * xgap); + plot(ypx12 + 1, xpx12, fpart(yend) * xgap); + } else { + plot(xpx12, ypx12, rfpart(yend) * xgap); + plot(xpx12, ypx12 + 1, fpart(yend) * xgap); + } + } + + if (steep) { + for (int x = xpx11 + 1; x < xpx12; x++) { + plot(ipart(intery), x, rfpart(intery)); + plot(ipart(intery) + 1, x, fpart(intery)); + intery += gradient; + } + } else { + for (int x = xpx11 + 1; x < xpx12; x++) { + plot(x, ipart(intery), rfpart(intery)); + plot(x, ipart(intery) + 1, fpart(intery)); + intery += gradient; + } + } +} + +void draw(const ExPolygonsWithIds &shapes_with_ids, unsigned max_size) +{ + ImVec2 actual_pos = ImGui::GetCursorPos(); + // draw shapes + BoundingBox bb; + for (const ExPolygonsWithId &shape : shapes_with_ids) + bb.merge(get_extents(shape.expoly)); + + Point bb_size = bb.size(); + double scale = max_size / (double) std::max(bb_size.x(), bb_size.y()); + ImVec2 win_offset = ImGui::GetWindowPos(); + Point offset(win_offset.x + actual_pos.x, win_offset.y + actual_pos.y); + offset += bb_size / 2 * scale; + auto draw_polygon = [&scale, offset](Slic3r::Polygon p) { + p.scale(scale, -scale); // Y mirror + p.translate(offset); + ImGuiWrapper::draw(p); + }; + + for (const ExPolygonsWithId &shape : shapes_with_ids) { + for (const ExPolygon &expoly : shape.expoly) { + draw_polygon(expoly.contour); + for (const Slic3r::Polygon &hole : expoly.holes) + draw_polygon(hole); + } + } +} + +#endif // MORE_DRAWING + +template // N .. count of channels per pixel +void draw_side_outline(const ExPolygons &shape, const std::array &color, std::vector &data, size_t data_width, double scale) +{ + int count_lines = data.size() / (N * data_width); + size_t data_line = N * data_width; + auto get_offset = [count_lines, data_line](int x, int y) { + // NOTE: y has opposit direction in texture + return (count_lines - y - 1) * data_line + x * N; + }; + + // overlap color + auto draw = [&data, data_width, count_lines, get_offset, &color](int x, int y, float brightess) { + if (x < 0 || y < 0 || static_cast(x) >= data_width || y >= count_lines) + return; // out of image + size_t offset = get_offset(x, y); + bool change_color = false; + for (size_t i = 0; i < N - 1; ++i) { + if(data[offset + i] != color[i]){ + data[offset + i] = color[i]; + change_color = true; + } + } + + unsigned char &alpha = data[offset + N - 1]; + if (alpha == 0 || change_color){ + alpha = static_cast(std::round(brightess * 255)); + } else if (alpha != 255){ + alpha = static_cast(std::min(255, int(alpha) + static_cast(std::round(brightess * 255)))); + } + }; + + BoundingBox bb_unscaled = get_extents(shape); + Linesf lines = to_linesf(shape); + BoundingBoxf bb(bb_unscaled.min.cast(), bb_unscaled.max.cast()); + + // scale lines to pixels + if (!is_approx(scale, 1.)) { + for (Linef &line : lines) { + line.a *= scale; + line.b *= scale; + } + bb.min *= scale; + bb.max *= scale; + } + + for (const Linef &line : lines) + wu_draw_line_side(line, draw); +} + +/// +/// Draw filled ExPolygon into data +/// line by line inspired by: http://alienryderflex.com/polygon_fill/ +/// +/// Count channels for one pixel(RGBA = 4) +/// Shape to draw +/// Color of shape contain count of channels(N) +/// Image(2d) stored in 1d array +/// Count of pixel on one line(size in data = N x data_width) +/// Shape scale for conversion to pixels +template // N .. count of channels per pixel +void draw_filled(const ExPolygons &shape, const std::array& color, std::vector &data, size_t data_width, double scale){ + assert(data.size() % N == 0); + assert(data.size() % data_width == 0); + assert((data.size() % (N*data_width)) == 0); + + BoundingBox bb_unscaled = get_extents(shape); + + Linesf lines = to_linesf(shape); + BoundingBoxf bb( + bb_unscaled.min.cast(), + bb_unscaled.max.cast()); + + // scale lines to pixels + if (!is_approx(scale, 1.)) { + for (Linef &line : lines) { + line.a *= scale; + line.b *= scale; + } + bb.min *= scale; + bb.max *= scale; + } + + int count_lines = data.size() / (N * data_width); + size_t data_line = N * data_width; + auto get_offset = [count_lines, data_line](int x, int y) { + // NOTE: y has opposit direction in texture + return (count_lines - y - 1) * data_line + x * N; + }; + auto set_color = [&data, &color, get_offset](int x, int y) { + size_t offset = get_offset(x, y); + if (data[offset + N - 1] != 0) + return; // already setted by line + for (unsigned i = 0; i < N; ++i) + data[offset + i] = color[i]; + }; + + // anti aliased drawing of lines + auto draw = [&data, width = static_cast(data_width), count_lines, get_offset, &color](int x, int y, float brightess) { + if (x < 0 || y < 0 || x >= width || y >= count_lines) + return; // out of image + size_t offset = get_offset(x, y); + unsigned char &alpha = data[offset + N - 1]; + if (alpha == 0){ + alpha = static_cast(std::round(brightess * 255)); + for (size_t i = 0; i < N-1; ++i) + data[offset + i] = color[i]; + } else if (alpha != 255){ + alpha = static_cast(std::min(255, int(alpha) + static_cast(std::round(brightess * 255)))); + } + }; + + for (const Linef& line: lines) + wu_draw_line_side(line, draw); + + auto tree = Slic3r::AABBTreeLines::build_aabb_tree_over_indexed_lines(lines); + + // range for intersection line + double x1 = bb.min.x() - 1.f; + double x2 = bb.max.x() + 1.f; + + int max_y = std::min(count_lines, static_cast(std::round(bb.max.y()))); + for (int y = std::max(0, static_cast(std::round(bb.min.y()))); y < max_y; ++y){ + double y_f = y + .5; // 0.5 ... intersection in center of pixel of pixel + Linef line(Vec2d(x1, y_f), Vec2d(x2, y_f)); + using Intersection = std::pair; + using Intersections = std::vector; + // sorted .. false + // + Intersections intersections = Slic3r::AABBTreeLines::get_intersections_with_line(lines, tree, line); + if (intersections.empty()) + continue; + + assert((intersections.size() % 2) == 0); + + // sort intersections by x + std::sort(intersections.begin(), intersections.end(), + [](const Intersection &i1, const Intersection &i2) { return i1.first.x() < i2.first.x(); }); + + // draw lines + for (size_t i = 0; i < intersections.size(); i+=2) { + const Vec2d& p2 = intersections[i+1].first; + if (p2.x() < 0) + continue; // out of data + + const Vec2d& p1 = intersections[i].first; + if (p1.x() > data_width) + break; // out of data + + // clamp to data + int max_x = std::min(static_cast(data_width-1), static_cast(std::round(p2.x()))); + for (int x = std::max(0, static_cast(std::round(p1.x()))); x <= max_x; ++x) + set_color(x, y); + } + } +} + +/// Union shape defined by glyphs +ExPolygons union_ex(const ExPolygonsWithIds &shapes) +{ + // unify to one expolygon + ExPolygons result; + for (const ExPolygonsWithId &shape : shapes) { + if (shape.expoly.empty()) + continue; + expolygons_append(result, shape.expoly); + } + return union_ex(result); +} + +// init texture by draw expolygons into texture +bool init_texture(Texture &texture, const ExPolygonsWithIds& shapes_with_ids, unsigned max_size_px, const std::vector& shape_warnings){ + BoundingBox bb = get_extents(shapes_with_ids); + Point bb_size = bb.size(); + double bb_width = bb_size.x(); // [in mm] + double bb_height = bb_size.y(); // [in mm] + + bool is_widder = bb_size.x() > bb_size.y(); + double scale = 0.f; + if (is_widder) { + scale = max_size_px / bb_width; + texture.width = max_size_px; + texture.height = static_cast(std::ceil(bb_height * scale)); + } else { + scale = max_size_px / bb_height; + texture.width = static_cast(std::ceil(bb_width * scale)); + texture.height = max_size_px; + } + const int n_pixels = texture.width * texture.height; + if (n_pixels <= 0) + return false; + + constexpr int channels_count = 4; + std::vector data(n_pixels * channels_count, {0}); + + // Union All shapes + ExPolygons shape = union_ex(shapes_with_ids); + + // align to texture + translate(shape, -bb.min); + size_t texture_width = static_cast(texture.width); + unsigned char alpha = 255; // without transparency + std::array color_shape{201, 201, 201, alpha}; // from degin by @JosefZachar + std::array color_error{237, 28, 36, alpha}; // from icon: resources/icons/flag_red.svg + std::array color_warning{237, 107, 33, alpha}; // icons orange + // draw unhealedable shape + for (const ExPolygonsWithId &shapes_with_id : shapes_with_ids) + if (!shapes_with_id.is_healed) { + ExPolygons bad_shape = shapes_with_id.expoly; // copy + translate(bad_shape, -bb.min); // align to texture + draw_side_outline<4>(bad_shape, color_error, data, texture_width, scale); + } + // Draw shape with warning + if (!shape_warnings.empty()) { + for (const ExPolygonsWithId &shapes_with_id : shapes_with_ids){ + assert(shapes_with_id.id < shape_warnings.size()); + if (shapes_with_id.id >= shape_warnings.size()) + continue; + if (shape_warnings[shapes_with_id.id].empty()) + continue; // no warnings for shape + ExPolygons warn_shape = shapes_with_id.expoly; // copy + translate(warn_shape, -bb.min); // align to texture + draw_side_outline<4>(warn_shape, color_warning, data, texture_width, scale); + } + } + + // Draw rest of shape + draw_filled<4>(shape, color_shape, data, texture_width, scale); + + // sends data to gpu + glsafe(::glPixelStorei(GL_UNPACK_ALIGNMENT, 1)); + if (texture.id != 0) + glsafe(::glDeleteTextures(1, &texture.id)); + glsafe(::glGenTextures(1, &texture.id)); + glsafe(::glBindTexture(GL_TEXTURE_2D, texture.id)); + glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei) texture.width, (GLsizei) texture.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, + (const void *) data.data())); + + glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); + glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0)); + glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); + + GLuint NO_TEXTURE_ID = 0; + glsafe(::glBindTexture(GL_TEXTURE_2D, NO_TEXTURE_ID)); + return true; +} + +bool is_closed(NSVGpath *path){ + for (; path != NULL; path = path->next) + if (path->next == NULL && path->closed) + return true; + return false; +} + +void add_comma_separated(std::string &result, const std::string &add){ + if (!result.empty()) + result += ", "; + result += add; +} + +const float warning_preccission = 1e-4f; +std::string create_fill_warning(const NSVGshape &shape) { + if (!(shape.flags & NSVG_FLAGS_VISIBLE) || + shape.fill.type == NSVG_PAINT_NONE) + return {}; // not visible + + std::string warning; + if ((shape.opacity - 1.f + warning_preccission) <= 0.f) + add_comma_separated(warning, GUI::format(_L("Opacity (%1%)"), shape.opacity)); + + // if(shape->flags != NSVG_FLAGS_VISIBLE) add_warning(_u8L("Visibility flag")); + bool is_fill_gradient = shape.fillGradient[0] != '\0'; + if (is_fill_gradient) + add_comma_separated(warning, GUI::format(_L("Color gradient (%1%)"), shape.fillGradient)); + + switch (shape.fill.type) { + case NSVG_PAINT_UNDEF: add_comma_separated(warning, _u8L("Undefined fill type")); break; + case NSVG_PAINT_LINEAR_GRADIENT: + if (!is_fill_gradient) + add_comma_separated(warning, _u8L("Linear gradient")); + break; + case NSVG_PAINT_RADIAL_GRADIENT: + if (!is_fill_gradient) + add_comma_separated(warning, _u8L("Radial gradient")); + break; + // case NSVG_PAINT_NONE: + // case NSVG_PAINT_COLOR: + // default: break; + } + + // Unfilled is only line which could be opened + if (shape.fill.type != NSVG_PAINT_NONE && !is_closed(shape.paths)) + add_comma_separated(warning, _u8L("Open filled path")); + return warning; +} + +std::string create_stroke_warning(const NSVGshape &shape) { + + std::string warning; + if (!(shape.flags & NSVG_FLAGS_VISIBLE) || + shape.stroke.type == NSVG_PAINT_NONE || + shape.strokeWidth <= 1e-5f) + return {}; // not visible + + if ((shape.opacity - 1.f + warning_preccission) <= 0.f) + add_comma_separated(warning, GUI::format(_L("Opacity (%1%)"), shape.opacity)); + + bool is_stroke_gradient = shape.strokeGradient[0] != '\0'; + if (is_stroke_gradient) + add_comma_separated(warning, GUI::format(_L("Color gradient (%1%)"), shape.strokeGradient)); + + switch (shape.stroke.type) { + case NSVG_PAINT_UNDEF: add_comma_separated(warning, _u8L("Undefined stroke type")); break; + case NSVG_PAINT_LINEAR_GRADIENT: + if (!is_stroke_gradient) + add_comma_separated(warning, _u8L("Linear gradient")); + break; + case NSVG_PAINT_RADIAL_GRADIENT: + if (!is_stroke_gradient) + add_comma_separated(warning, _u8L("Radial gradient")); + break; + // case NSVG_PAINT_COLOR: + // case NSVG_PAINT_NONE: + // default: break; + } + + return warning; +} + +/// +/// Create warnings about shape +/// +/// Input svg loaded to shapes +/// Vector of warnings with same size as EmbossShape::shapes_with_ids +/// or Empty when no warnings -> for fast checking that every thing is all right(more common case) +std::vector create_shape_warnings(const EmbossShape &shape, float scale){ + const std::shared_ptr& image_ptr = shape.svg_file->image; + assert(image_ptr != nullptr); + if (image_ptr == nullptr) + return {std::string{"Uninitialized SVG image"}}; + + const NSVGimage &image = *image_ptr; + std::vector result; + auto add_warning = [&result, &image](size_t index, const std::string &message) { + if (result.empty()) + result = std::vector(get_shapes_count(image) * 2); + std::string &res = result[index]; + if (res.empty()) + res = message; + else + res += '\n' + message; + }; + + if (!shape.final_shape.is_healed) { + for (const ExPolygonsWithId &i : shape.shapes_with_ids) + if (!i.is_healed) + add_warning(i.id, _u8L("Path can't be healed from selfintersection and multiple points.")); + + // This waning is not connected to NSVGshape. It is about union of paths, but Zero index is shown first + size_t index = 0; + add_warning(index, _u8L("Final shape constains selfintersection or multiple points with same coordinate.")); + } + + size_t shape_index = 0; + for (NSVGshape *shape = image.shapes; shape != NULL; shape = shape->next, ++shape_index) { + if (!(shape->flags & NSVG_FLAGS_VISIBLE)){ + add_warning(shape_index * 2, GUI::format(_L("Shape is marked as invisible (%1%)."), shape->id)); + continue; + } + + std::string fill_warning = create_fill_warning(*shape); + if (!fill_warning.empty()) { + // TRN: The first placeholder is shape identifier, the second one is text describing the problem. + add_warning(shape_index * 2, GUI::format(_L("Fill of shape (%1%) contains unsupported: %2%."), shape->id, fill_warning)); + } + + float minimal_width_in_mm = 1e-3f; + if (shape->strokeWidth <= minimal_width_in_mm * scale) { + add_warning(shape_index * 2, GUI::format(_L("Stroke of shape (%1%) is too thin (minimal width is %2% mm)."), shape->id, minimal_width_in_mm)); + continue; + } + std::string stroke_warning = create_stroke_warning(*shape); + if (!stroke_warning.empty()) + add_warning(shape_index * 2 + 1, GUI::format(_L("Stroke of shape (%1%) contains unsupported: %2%."), shape->id, stroke_warning)); + } + return result; +} + + +} // namespace + +void GLGizmoSVG::set_volume_by_selection() +{ + const Selection &selection = m_parent.get_selection(); + const GLVolume *gl_volume = get_selected_gl_volume(selection); + if (gl_volume == nullptr) + return reset_volume(); + + const ModelObjectPtrs &objects = selection.get_model()->objects; + ModelVolume *volume =get_model_volume(*gl_volume, objects); + if (volume == nullptr) + return reset_volume(); + + // is same volume as actual selected? + if (volume->id() == m_volume_id) + return; + + // Do not use focused input value when switch volume(it must swith value) + if (m_volume != nullptr && + m_volume != volume) // when update volume it changed id BUT not pointer + ImGuiWrapper::left_inputs(); + + // is valid svg volume? + if (!is_svg(*volume)) + return reset_volume(); + + // cancel previous job + if (m_job_cancel != nullptr) { + m_job_cancel->store(true); + m_job_cancel = nullptr; + } + + // calculate scale for height and depth inside of scaled object instance + calculate_scale(); // must be before calculation of tesselation + + // checking that exist is inside of function "is_svg" + EmbossShape &es = *volume->emboss_shape; + EmbossShape::SvgFile &svg_file = *es.svg_file; + if (svg_file.image == nullptr) { + if (init_image(svg_file) == nullptr) + return reset_volume(); + } + assert(svg_file.image != nullptr); + assert(svg_file.image.get() != nullptr); + const NSVGimage &image = *svg_file.image; + ExPolygonsWithIds &shape_ids = es.shapes_with_ids; + if (shape_ids.empty()) { + NSVGLineParams params{get_tesselation_tolerance(get_scale_for_tolerance())}; + shape_ids = create_shape_with_ids(image, params); + } + + reset_volume(); // clear cached data + + m_volume = volume; + m_volume_id = volume->id(); + m_volume_shape = es; // copy + m_shape_warnings = create_shape_warnings(es, get_scale_for_tolerance()); + + // Calculate current angle of up vector + m_angle = calc_angle(selection); + m_distance = calc_distance(*gl_volume, m_raycast_manager, m_parent); + + m_shape_bb = get_extents(m_volume_shape.shapes_with_ids); +} +namespace { +void delete_texture(Texture& texture){ + if (texture.id != 0) { + glsafe(::glDeleteTextures(1, &texture.id)); + texture.id = 0; + } +} +} +void GLGizmoSVG::reset_volume() +{ + if (m_volume == nullptr) + return; // already reseted + + m_volume = nullptr; + m_volume_id.id = 0; + m_volume_shape.shapes_with_ids.clear(); + m_filename_preview.clear(); + m_shape_warnings.clear(); + // delete texture after finish imgui draw + wxGetApp().plater()->CallAfter([&texture = m_texture]() { delete_texture(texture); }); +} + +void GLGizmoSVG::calculate_scale() { + // be carefull m_volume is not set yet + const Selection &selection = m_parent.get_selection(); + const GLVolume *gl_volume = selection.get_first_volume(); + if (gl_volume == nullptr) + return; + + Transform3d to_world = gl_volume->world_matrix(); + + const ModelVolume *volume_ptr = get_model_volume(*gl_volume, selection.get_model()->objects); + assert(volume_ptr != nullptr); + assert(volume_ptr->emboss_shape.has_value()); + // Fix for volume loaded from 3mf + if (volume_ptr != nullptr && + volume_ptr->emboss_shape.has_value()) { + const std::optional &fix_tr = volume_ptr->emboss_shape->fix_3mf_tr; + if (fix_tr.has_value()) + to_world = to_world * (fix_tr->inverse()); + } + + auto to_world_linear = to_world.linear(); + auto calc = [&to_world_linear](const Vec3d &axe, std::optional& scale) { + Vec3d axe_world = to_world_linear * axe; + double norm_sq = axe_world.squaredNorm(); + if (is_approx(norm_sq, 1.)) { + if (!scale.has_value()) + return; + scale.reset(); + } else { + scale = sqrt(norm_sq); + } + }; + + calc(Vec3d::UnitX(), m_scale_width); + calc(Vec3d::UnitY(), m_scale_height); + calc(Vec3d::UnitZ(), m_scale_depth); +} + +float GLGizmoSVG::get_scale_for_tolerance(){ + return std::max(m_scale_width.value_or(1.f), m_scale_height.value_or(1.f)); } + +bool GLGizmoSVG::process() +{ + // no volume is selected -> selection from right panel + assert(m_volume != nullptr); + if (m_volume == nullptr) + return false; + + assert(m_volume->emboss_shape.has_value()); + if (!m_volume->emboss_shape.has_value()) + return false; + + // Cancel previous Job, when it is in process + // worker.cancel(); --> Use less in this case I want cancel only previous EmbossJob no other jobs + // Cancel only EmbossUpdateJob no others + if (m_job_cancel != nullptr) + m_job_cancel->store(true); + // create new shared ptr to cancel new job + m_job_cancel = std::make_shared>(false); + + EmbossShape shape = m_volume_shape; // copy + auto base = std::make_unique(m_volume->name, m_job_cancel, std::move(shape)); + base->is_outside = m_volume->type() == ModelVolumeType::MODEL_PART; + DataUpdate data{std::move(base), m_volume_id}; + return start_update_volume(std::move(data), *m_volume, m_parent.get_selection(), m_raycast_manager); +} + +void GLGizmoSVG::close() +{ + // close gizmo == open it again + auto &mng = m_parent.get_gizmos_manager(); + if (mng.get_current_type() == GLGizmosManager::Svg) + mng.open_gizmo(GLGizmosManager::Svg); + reset_volume(); +} + +void GLGizmoSVG::draw_window() +{ + assert(m_volume != nullptr); + assert(m_volume_id.valid()); + if (m_volume == nullptr || + m_volume_id.invalid()) { + ImGui::Text("Not valid state please report reproduction steps on github"); + return; + } + + assert(m_volume->emboss_shape.has_value()); + if (!m_volume->emboss_shape.has_value()) { + ImGui::Text("No embossed file"); + return; + } + + assert(m_volume->emboss_shape->svg_file.has_value()); + if (!m_volume->emboss_shape->svg_file.has_value()){ + ImGui::Text("Missing svg file in embossed shape"); + return; + } + + assert(m_volume->emboss_shape->svg_file->file_data != nullptr); + if (m_volume->emboss_shape->svg_file->file_data == nullptr){ + ImGui::Text("Missing data of svg file"); + return; + } + + draw_preview(); + draw_filename(); + + // Is SVG baked? + if (m_volume == nullptr) return; + + ImGui::Separator(); + + ImGui::Indent(m_gui_cfg->icon_width); + draw_depth(); + draw_size(); + draw_use_surface(); + + draw_distance(); + draw_rotation(); + draw_mirroring(); + draw_face_the_camera(); + + ImGui::Unindent(m_gui_cfg->icon_width); + + if (!m_volume->is_the_only_one_part()) { + ImGui::Separator(); + draw_model_type(); + } +} + +void GLGizmoSVG::draw_face_the_camera(){ + if (ImGui::Button(_u8L("Face the camera").c_str())) { + const Camera &cam = wxGetApp().plater()->get_camera(); + auto wanted_up_limit = (m_keep_up) ? std::optional(UP_LIMIT) : std::optional{}; + if (face_selected_volume_to_camera(cam, m_parent, wanted_up_limit)) + volume_transformation_changed(); + } +} + +void GLGizmoSVG::draw_preview(){ + // init texture when not initialized yet. + // drag&drop is out of rendering scope so texture must be created on this place + if (m_texture.id == 0) { + const ExPolygonsWithIds &shapes = m_volume->emboss_shape->shapes_with_ids; + init_texture(m_texture, shapes, m_gui_cfg->texture_max_size_px, m_shape_warnings); + } + + //::draw(m_volume_shape.shapes_with_ids, m_gui_cfg->texture_max_size_px); + + if (m_texture.id != 0) { + ImTextureID id = (void *) static_cast(m_texture.id); + ImVec2 s(m_texture.width, m_texture.height); + + std::optional spacing; + // is texture over full height? + if (m_texture.height != m_gui_cfg->texture_max_size_px) { + spacing = (m_gui_cfg->texture_max_size_px - m_texture.height) / 2.f; + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + *spacing); + } + // is texture over full width? + unsigned window_width = static_cast( + ImGui::GetWindowSize().x - 2*ImGui::GetStyle().WindowPadding.x); + if (window_width > m_texture.width){ + float space = (window_width - m_texture.width) / 2.f; + ImGui::SetCursorPosX(ImGui::GetCursorPosX() + space); + } + + ImGui::Image(id, s); + //if(ImGui::IsItemHovered()){ + // const EmbossShape &es = *m_volume->emboss_shape; + // size_t count_of_shapes = get_shapes_count(*es.svg_file.image); + // size_t count_of_expolygons = 0; + // size_t count_of_points = 0; + // for (const auto &shape : es.shapes_with_ids) { + // for (const ExPolygon &expoly : shape.expoly){ + // ++count_of_expolygons; + // count_of_points += count_points(expoly); + // } + // } + // // Do not translate it is only for debug + // std::string tooltip = GUI::format("%1% shapes, which create %2% polygons with %3% line segments", + // count_of_shapes, count_of_expolygons, count_of_points); + // ImGui::SetTooltip("%s", tooltip.c_str()); + //} + + if (spacing.has_value()) + ImGui::SetCursorPosY(ImGui::GetCursorPosY() + *spacing); + } +} + +void GLGizmoSVG::draw_filename(){ + const EmbossShape &es = *m_volume->emboss_shape; + const EmbossShape::SvgFile &svg = *es.svg_file; + if (m_filename_preview.empty()){ + // create filename preview + if (!svg.path.empty()) { + m_filename_preview = get_file_name(svg.path); + } else if (!svg.path_in_3mf.empty()) { + m_filename_preview = get_file_name(svg.path_in_3mf); + } + + if (m_filename_preview.empty()) + // TRN - Preview of filename after clear local filepath. + m_filename_preview = _u8L("Unknown filename"); + + m_filename_preview = ImGuiWrapper::trunc(m_filename_preview, m_gui_cfg->input_width); + } + + if (!m_shape_warnings.empty()){ + draw(get_icon(m_icons, IconType::exclamation, IconState::hovered)); + if (ImGui::IsItemHovered()) { + std::string tooltip; + for (const std::string &w: m_shape_warnings){ + if (w.empty()) + continue; + if (!tooltip.empty()) + tooltip += "\n"; + tooltip += w; + } + m_imgui->tooltip(tooltip, m_gui_cfg->max_tooltip_width); + } + ImGui::SameLine(); + } + + // Remove space between filename and gray suffix ".svg" + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0)); + ImGui::AlignTextToFramePadding(); + ImGui::Text("%s", m_filename_preview.c_str()); + bool is_hovered = ImGui::IsItemHovered(); + ImGui::SameLine(); + m_imgui->text_colored(ImGuiWrapper::COL_GREY_LIGHT, ".svg"); + ImGui::PopStyleVar(); // ImGuiStyleVar_ItemSpacing + + is_hovered |= ImGui::IsItemHovered(); + if (is_hovered) { + std::string tooltip = GUI::format(_L("SVG file path is \"%1%\""), svg.path); + m_imgui->tooltip(tooltip, m_gui_cfg->max_tooltip_width); + } + + bool file_changed = false; + + // Re-Load button + bool can_reload = !m_volume_shape.svg_file->path.empty(); + if (can_reload) { + ImGui::SameLine(); + if (draw_clickable(m_icons, IconType::refresh)) { + if (!boost::filesystem::exists(m_volume_shape.svg_file->path)) { + m_volume_shape.svg_file->path.clear(); + } else { + file_changed = true; + } + } else if (ImGui::IsItemHovered()) + m_imgui->tooltip(_u8L("Reload SVG file from disk."), m_gui_cfg->max_tooltip_width); + } + + std::string tooltip = ""; + ImGuiComboFlags flags = ImGuiComboFlags_PopupAlignLeft | ImGuiComboFlags_NoPreview; + ImGui::SameLine(); + ImGuiWrapper::push_combo_style(m_parent.get_scale()); + if (ImGui::BeginCombo("##file_options", nullptr, flags)) { + ScopeGuard combo_sg([]() { ImGui::EndCombo(); }); + + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, {ImGui::GetStyle().FramePadding.x, 0}); + draw(get_icon(m_icons, IconType::change_file, IconState::hovered)); + ImGui::SameLine(); + if (ImGui::Selectable((_L("Change file") + dots).ToUTF8().data())) { + std::string new_path = choose_svg_file(); + if (!new_path.empty()) { + file_changed = true; + m_volume_shape.svg_file = {}; // clear data + m_volume_shape.svg_file->path = new_path; + } + } else if (ImGui::IsItemHovered()) { + tooltip = _u8L("Change to another .svg file"); + } + + std::string forget_path = _u8L("Forget the file path"); + if (m_volume->emboss_shape->svg_file->path.empty()){ + draw(get_icon(m_icons, IconType::bake, IconState::disabled)); + ImGui::SameLine(); + m_imgui->text_colored(ImGuiWrapper::COL_GREY_DARK, forget_path.c_str()); + } else { + draw(get_icon(m_icons, IconType::bake, IconState::hovered)); + ImGui::SameLine(); + if (ImGui::Selectable(forget_path.c_str())) { + // set .svg_file.path_in_3mf to remember file name + m_volume->emboss_shape->svg_file->path.clear(); + m_volume_shape.svg_file->path.clear(); + m_filename_preview.clear(); + } else if (ImGui::IsItemHovered()) { + tooltip = _u8L("Do NOT save local path to 3MF file.\n" + "Also disables 'reload from disk' option."); + } + } + + //draw(get_icon(m_icons, IconType::bake)); + //ImGui::SameLine(); + //if (ImGui::Selectable(_u8L("Bake 2 ©").c_str())) { + // EmbossShape::SvgFile &svg = m_volume_shape.svg_file; + // std::stringstream ss; + // Slic3r::save(*svg.image, ss); + // svg.file_data = std::make_unique(ss.str()); + // svg.image = nsvgParse(*svg.file_data); + // assert(svg.image.get() != NULL); + // if (svg.image.get() != NULL) { + // m_volume->emboss_shape->svg_file = svg; // copy - write changes into volume + // } else { + // svg = m_volume->emboss_shape->svg_file; // revert changes + // } + //} else if (ImGui::IsItemHovered()) { + // ImGui::SetTooltip("%s", _u8L("Use only paths from svg - recreate svg").c_str()); + //} + + draw(get_icon(m_icons, IconType::bake, IconState::hovered)); + ImGui::SameLine(); + // TRN: An menu option to convert the SVG into an unmodifiable model part. + if (ImGui::Selectable(_u8L("Bake").c_str())) { + m_volume->emboss_shape.reset(); + close(); + } else if (ImGui::IsItemHovered()) { + // TRN: Tooltip for the menu item. + tooltip = _u8L("Bake into model as uneditable part"); + } + + draw(get_icon(m_icons, IconType::save, IconState::activable)); + ImGui::SameLine(); + if (ImGui::Selectable((_L("Save as") + dots).ToUTF8().data())) { + wxWindow *parent = nullptr; + GUI::FileType file_type = FT_SVG; + wxString wildcard = file_wildcards(file_type); + wxString dlg_title = _L("Save SVG file"); + const EmbossShape::SvgFile& svg = *m_volume_shape.svg_file; + wxString dlg_file = from_u8(get_file_name(((!svg.path.empty()) ? svg.path : svg.path_in_3mf))) + ".svg"; + wxFileDialog dlg(parent, dlg_title, last_used_directory, dlg_file, wildcard, wxFD_SAVE | wxFD_OVERWRITE_PROMPT); + if (dlg.ShowModal() == wxID_OK ){ + last_used_directory = dlg.GetDirectory(); + wxString out_path = dlg.GetPath(); + std::string path{out_path.c_str()}; + //Slic3r::save(*m_volume_shape.svg_file.image, path); + + std::ofstream stream(path); + if (stream.is_open()){ + stream << *svg.file_data; + + // change source file + m_filename_preview.clear(); + m_volume_shape.svg_file->path = path; + m_volume_shape.svg_file->path_in_3mf.clear(); // possible change name + m_volume->emboss_shape->svg_file = m_volume_shape.svg_file; // copy - write changes into volume + } else { + BOOST_LOG_TRIVIAL(error) << "Opening file: \"" << path << "\" Failed"; + } + + } + } else if (ImGui::IsItemHovered()) { + tooltip = _u8L("Save as '.svg' file"); + } + + //draw(get_icon(m_icons, IconType::save)); + //ImGui::SameLine(); + //if (ImGui::Selectable((_L("Save used as") + dots).ToUTF8().data())) { + // GUI::FileType file_type = FT_SVG; + // wxString wildcard = file_wildcards(file_type); + // wxString dlg_title = _L("Export SVG file:"); + // wxString dlg_dir = from_u8(wxGetApp().app_config->get_last_dir()); + // const EmbossShape::SvgFile& svg = m_volume_shape.svg_file; + // wxString dlg_file = from_u8(get_file_name(((!svg.path.empty()) ? svg.path : svg.path_in_3mf))) + ".svg"; + // wxFileDialog dlg(nullptr, dlg_title, dlg_dir, dlg_file, wildcard, wxFD_SAVE | wxFD_OVERWRITE_PROMPT); + // if (dlg.ShowModal() == wxID_OK ){ + // wxString out_path = dlg.GetPath(); + // std::string path{out_path.c_str()}; + // Slic3r::save(*m_volume_shape.svg_file.image, path); + // } + //} else if (ImGui::IsItemHovered()) { + // ImGui::SetTooltip("%s", _u8L("Save only used path as '.svg' file").c_str()); + //} + ImGui::PopStyleVar(1); + } + ImGuiWrapper::pop_combo_style(); + if (!tooltip.empty()) + m_imgui->tooltip(tooltip, m_gui_cfg->max_tooltip_width); + + if (file_changed) { + float scale = get_scale_for_tolerance(); + double tes_tol = get_tesselation_tolerance(scale); + EmbossShape es_ = select_shape(m_volume_shape.svg_file->path, tes_tol); + m_volume_shape.svg_file = std::move(es_.svg_file); + m_volume_shape.shapes_with_ids = std::move(es_.shapes_with_ids); + m_volume_shape.final_shape = {}; // clear cache + m_shape_warnings = create_shape_warnings(m_volume_shape, scale); + init_texture(m_texture, m_volume_shape.shapes_with_ids, m_gui_cfg->texture_max_size_px, m_shape_warnings); + process(); + } +} + +void GLGizmoSVG::draw_depth() +{ + ImGui::AlignTextToFramePadding(); + ImGuiWrapper::text(m_gui_cfg->translations.depth); + ImGui::SameLine(m_gui_cfg->input_offset); + ImGui::SetNextItemWidth(m_gui_cfg->input_width); + + bool use_inch = wxGetApp().app_config->get_bool("use_inches"); + double &value = m_volume_shape.projection.depth; + constexpr double step = 1.; + constexpr double step_fast = 10.; + std::optional result_scale; + const char *size_format = "%.1f mm"; + double input = value; + if (use_inch) { + size_format = "%.2f in"; + // input in inches + input *= GizmoObjectManipulation::mm_to_in * m_scale_depth.value_or(1.f); + result_scale = GizmoObjectManipulation::in_to_mm / m_scale_depth.value_or(1.f); + } else if (m_scale_depth.has_value()) { + // scale input + input *= (*m_scale_depth); + result_scale = 1. / (*m_scale_depth); + } + + if (ImGui::InputDouble("##depth", &input, step, step_fast, size_format)) { + if (result_scale.has_value()) + input *= (*result_scale); + apply(input, limits.depth); + if (!is_approx(input, value, 1e-4)){ + value = input; + process(); + } + } else if (ImGui::IsItemHovered()) + m_imgui->tooltip(_u8L("Size in emboss direction."), m_gui_cfg->max_tooltip_width); +} + +void GLGizmoSVG::draw_size() +{ + ImGui::AlignTextToFramePadding(); + ImGuiWrapper::text(m_gui_cfg->translations.size); + if (ImGui::IsItemHovered()){ + size_t count_points = 0; + for (const auto &s : m_volume_shape.shapes_with_ids) + count_points += Slic3r::count_points(s.expoly); + // TRN: The placeholder contains a number. + m_imgui->tooltip(GUI::format(_L("Scale also changes amount of curve samples (%1%)"), count_points), m_gui_cfg->max_tooltip_width); + } + + bool use_inch = wxGetApp().app_config->get_bool("use_inches"); + + Point size = m_shape_bb.size(); + double width = size.x() * m_volume_shape.scale * m_scale_width.value_or(1.f); + if (use_inch) width *= GizmoObjectManipulation::mm_to_in; + double height = size.y() * m_volume_shape.scale * m_scale_height.value_or(1.f); + if (use_inch) height *= GizmoObjectManipulation::mm_to_in; + + const auto is_valid_scale_ratio = [limit = &limits.relative_scale_ratio](double ratio) { + if (std::fabs(ratio - 1.) < limit->min) + return false; // too small ratio --> without effect + + if (ratio > limit->max) + return false; + + if (ratio < 1e-4) + return false; // negative scale is not allowed + + return true; + }; + + std::optional new_relative_scale; + if (m_keep_ratio) { + std::stringstream ss; + ss << std::setprecision(2) << std::fixed << width << " x " << height << " " << (use_inch ? "in" : "mm"); + + ImGui::SameLine(m_gui_cfg->input_offset); + ImGui::SetNextItemWidth(m_gui_cfg->input_width); + + const MinMax &minmax = use_inch ? limits.ui_size_in : limits.ui_size; + // convert to float for slider + float width_f = static_cast(width); + if (m_imgui->slider_float("##width_size_slider", &width_f, minmax.min, minmax.max, ss.str().c_str(), 1.f, false)) { + double width_ratio = width_f / width; + if (is_valid_scale_ratio(width_ratio)) { + m_scale_width = m_scale_width.value_or(1.f) * width_ratio; + m_scale_height = m_scale_height.value_or(1.f) * width_ratio; + new_relative_scale = Vec3d(width_ratio, width_ratio, 1.); + } + } + } else { + ImGuiInputTextFlags flags = 0; + + float space = m_gui_cfg->icon_width / 2; + float input_width = m_gui_cfg->input_width / 2 - space / 2; + float second_offset = m_gui_cfg->input_offset + input_width + space; + + const char *size_format = (use_inch) ? "%.2f in" : "%.1f mm"; + double step = -1.0; + double fast_step = -1.0; + + ImGui::SameLine(m_gui_cfg->input_offset); + ImGui::SetNextItemWidth(input_width); + double prev_width = width; + if (ImGui::InputDouble("##width", &width, step, fast_step, size_format, flags)) { + double width_ratio = width / prev_width; + if (is_valid_scale_ratio(width_ratio)) { + m_scale_width = m_scale_width.value_or(1.f) * width_ratio; + new_relative_scale = Vec3d(width_ratio, 1., 1.); + } + } + if (ImGui::IsItemHovered()) + m_imgui->tooltip(_u8L("Width of SVG."), m_gui_cfg->max_tooltip_width); + + ImGui::SameLine(second_offset); + ImGui::SetNextItemWidth(input_width); + double prev_height = height; + if (ImGui::InputDouble("##height", &height, step, fast_step, size_format, flags)) { + double height_ratio = height / prev_height; + if (is_valid_scale_ratio(height_ratio)) { + m_scale_height = m_scale_height.value_or(1.f) * height_ratio; + new_relative_scale = Vec3d(1., height_ratio, 1.); + } + } + if (ImGui::IsItemHovered()) + m_imgui->tooltip(_u8L("Height of SVG."), m_gui_cfg->max_tooltip_width); + } + + // Lock on ratio m_keep_ratio + ImGui::SameLine(m_gui_cfg->lock_offset); + const IconManager::Icon &icon = get_icon(m_icons, m_keep_ratio ? IconType::lock : IconType::unlock, IconState::activable); + const IconManager::Icon &icon_hover = get_icon(m_icons, m_keep_ratio ? IconType::lock : IconType::unlock, IconState::hovered); + if (button(icon, icon_hover, icon)) + m_keep_ratio = !m_keep_ratio; + if (ImGui::IsItemHovered()) + m_imgui->tooltip(_u8L("Lock/unlock the aspect ratio of the SVG."), m_gui_cfg->max_tooltip_width); + + + // reset button + bool can_reset = m_scale_width.has_value() || m_scale_height.has_value(); + if (can_reset) { + if (reset_button(m_icons)) { + new_relative_scale = Vec3d(1./m_scale_width.value_or(1.f), 1./m_scale_height.value_or(1.f), 1.); + } else if (ImGui::IsItemHovered()) + m_imgui->tooltip(_u8L("Reset scale"), m_gui_cfg->max_tooltip_width); + } + + if (new_relative_scale.has_value()){ + Selection &selection = m_parent.get_selection(); + selection.setup_cache(); + + auto selection_scale_fnc = [&selection, rel_scale = *new_relative_scale]() { + selection.scale(rel_scale, get_drag_transformation_type(selection)); + }; + selection_transform(selection, selection_scale_fnc); + + m_parent.do_scale(L("Resize")); + wxGetApp().obj_manipul()->set_dirty(); + // should be the almost same + calculate_scale(); + + NSVGimage *img = m_volume_shape.svg_file->image.get(); + assert(img != NULL); + if (img != NULL){ + NSVGLineParams params{get_tesselation_tolerance(get_scale_for_tolerance())}; + m_volume_shape.shapes_with_ids = create_shape_with_ids(*img, params); + m_volume_shape.final_shape = {}; // reset cache for final shape + process(); + } + } +} + +void GLGizmoSVG::draw_use_surface() +{ + bool can_use_surface = (m_volume->emboss_shape->projection.use_surface)? true : // already used surface must have option to uncheck + !m_volume->is_the_only_one_part(); + m_imgui->disabled_begin(!can_use_surface); + ScopeGuard sc([imgui = m_imgui]() { imgui->disabled_end(); }); + + ImGui::AlignTextToFramePadding(); + ImGuiWrapper::text(m_gui_cfg->translations.use_surface); + ImGui::SameLine(m_gui_cfg->input_offset); + + if (m_imgui->bbl_checkbox("##useSurface", m_volume_shape.projection.use_surface)) + process(); +} + +void GLGizmoSVG::draw_distance() +{ + const EmbossProjection& projection = m_volume->emboss_shape->projection; + bool use_surface = projection.use_surface; + bool allowe_surface_distance = !use_surface && !m_volume->is_the_only_one_part(); + + float prev_distance = m_distance.value_or(.0f); + float min_distance = static_cast(-2 * projection.depth); + float max_distance = static_cast(2 * projection.depth); + + m_imgui->disabled_begin(!allowe_surface_distance); + ScopeGuard sg([imgui = m_imgui]() { imgui->disabled_end(); }); + + ImGui::AlignTextToFramePadding(); + ImGuiWrapper::text(m_gui_cfg->translations.distance); + ImGui::SameLine(m_gui_cfg->input_offset); + ImGui::SetNextItemWidth(m_gui_cfg->input_width); + + bool use_inch = wxGetApp().app_config->get_bool("use_inches"); + const wxString move_tooltip = _L("Distance of the center of the SVG to the model surface."); + bool is_moved = false; + if (use_inch) { + std::optional distance_inch; + if (m_distance.has_value()) distance_inch = (*m_distance * GizmoObjectManipulation::mm_to_in); + min_distance = static_cast(min_distance * GizmoObjectManipulation::mm_to_in); + max_distance = static_cast(max_distance * GizmoObjectManipulation::mm_to_in); + if (m_imgui->slider_optional_float("##distance", m_distance, min_distance, max_distance, "%.3f in", 1.f, false, move_tooltip)) { + if (distance_inch.has_value()) { + m_distance = *distance_inch * GizmoObjectManipulation::in_to_mm; + } else { + m_distance.reset(); + } + is_moved = true; + } + } else { + if (m_imgui->slider_optional_float("##distance", m_distance, min_distance, max_distance, "%.2f mm", 1.f, false, move_tooltip)) + is_moved = true; + } + + bool can_reset = m_distance.has_value(); + if (can_reset) { + if (reset_button(m_icons)) { + m_distance.reset(); + is_moved = true; + } else if (ImGui::IsItemHovered()) + m_imgui->tooltip(_u8L("Reset distance"), m_gui_cfg->max_tooltip_width); + } + + if (is_moved) + do_local_z_move(m_parent, m_distance.value_or(.0f) - prev_distance); +} + +void GLGizmoSVG::draw_rotation() +{ + ImGui::AlignTextToFramePadding(); + ImGuiWrapper::text(m_gui_cfg->translations.rotation); + ImGui::SameLine(m_gui_cfg->input_offset); + ImGui::SetNextItemWidth(m_gui_cfg->input_width); + + // slider for Clock-wise angle in degress + // stored angle is optional CCW and in radians + // Convert stored value to degress + // minus create clock-wise roation from CCW + float angle = m_angle.value_or(0.f); + float angle_deg = static_cast(-angle * 180 / M_PI); + if (m_imgui->slider_float("##angle", &angle_deg, limits.angle.min, limits.angle.max, u8"%.2f °", 1.f, false, _L("Rotate text Clock-wise."))){ + // convert back to radians and CCW + double angle_rad = -angle_deg * M_PI / 180.0; + Geometry::to_range_pi_pi(angle_rad); + + double diff_angle = angle_rad - angle; + + do_local_z_rotate(m_parent, diff_angle); + + // calc angle after rotation + m_angle = calc_angle(m_parent.get_selection()); + + // recalculate for surface cut + if (m_volume->emboss_shape->projection.use_surface) + process(); + } + + // Reset button + if (m_angle.has_value()) { + if (reset_button(m_icons)) { + do_local_z_rotate(m_parent, -(*m_angle)); + m_angle.reset(); + + // recalculate for surface cut + if (m_volume->emboss_shape->projection.use_surface) + process(); + } else if (ImGui::IsItemHovered()) + m_imgui->tooltip(_u8L("Reset rotation"), m_gui_cfg->max_tooltip_width); + } + + // Keep up - lock button icon + if (!m_volume->is_the_only_one_part()) { + ImGui::SameLine(m_gui_cfg->lock_offset); + const IconManager::Icon &icon = get_icon(m_icons, m_keep_up ? IconType::lock : IconType::unlock, IconState::activable); + const IconManager::Icon &icon_hover = get_icon(m_icons, m_keep_up ? IconType::lock : IconType::unlock, IconState::hovered); + if (button(icon, icon_hover, icon)) + m_keep_up = !m_keep_up; + if (ImGui::IsItemHovered()) + m_imgui->tooltip(_u8L("Lock/unlock rotation angle when dragging above the surface."), m_gui_cfg->max_tooltip_width); + } +} + +void GLGizmoSVG::draw_mirroring() +{ + ImGui::AlignTextToFramePadding(); + ImGui::Text("%s", m_gui_cfg->translations.mirror.c_str()); + ImGui::SameLine(m_gui_cfg->input_offset); + Axis axis = Axis::UNKNOWN_AXIS; + if (draw_clickable(m_icons, IconType::reflection_x)) { + axis = Axis::X; + } else if (ImGui::IsItemHovered()) { + m_imgui->tooltip(_u8L("Mirror vertically"), m_gui_cfg->max_tooltip_width); + } + + ImGui::SameLine(); + if (draw_clickable(m_icons, IconType::reflection_y)) { + axis = Axis::Y; + } else if (ImGui::IsItemHovered()) { + m_imgui->tooltip(_u8L("Mirror horizontally"), m_gui_cfg->max_tooltip_width); + } + + if (axis != Axis::UNKNOWN_AXIS){ + Selection &selection = m_parent.get_selection(); + selection.setup_cache(); + + auto selection_mirror_fnc = [&selection, &axis](){ + selection.mirror(axis, get_drag_transformation_type(selection)); + }; + selection_transform(selection, selection_mirror_fnc); + m_parent.do_mirror(L("Set Mirror")); + + // Mirror is ignoring keep up !! + if (m_keep_up) + m_angle = calc_angle(selection); + + volume_transformation_changed(); + + + if (m_volume_shape.projection.use_surface) + process(); + } +} + +void GLGizmoSVG::draw_model_type() +{ + ImGui::AlignTextToFramePadding(); + bool is_last_solid_part = m_volume->is_the_only_one_part(); + std::string title = _u8L("Operation"); + if (is_last_solid_part) { + ImVec4 color{.5f, .5f, .5f, 1.f}; + m_imgui->text_colored(color, title.c_str()); + } else { + ImGui::Text("%s", title.c_str()); + } + + std::optional new_type; + ModelVolumeType modifier = ModelVolumeType::PARAMETER_MODIFIER; + ModelVolumeType negative = ModelVolumeType::NEGATIVE_VOLUME; + ModelVolumeType part = ModelVolumeType::MODEL_PART; + ModelVolumeType type = m_volume->type(); + + //TRN EmbossOperation + ImGuiWrapper::push_radio_style(); + if (ImGui::RadioButton(_u8L("Join").c_str(), type == part)) + new_type = part; + else if (ImGui::IsItemHovered()) + m_imgui->tooltip(_u8L("Click to change text into object part."), m_gui_cfg->max_tooltip_width); + ImGui::SameLine(); + + std::string last_solid_part_hint = _u8L("You can't change a type of the last solid part of the object."); + if (ImGui::RadioButton(_CTX_utf8(L_CONTEXT("Cut", "EmbossOperation"), "EmbossOperation").c_str(), type == negative)) + new_type = negative; + else if (ImGui::IsItemHovered()) { + if (is_last_solid_part) + m_imgui->tooltip(last_solid_part_hint, m_gui_cfg->max_tooltip_width); + else if (type != negative) + m_imgui->tooltip(_u8L("Click to change part type into negative volume."), m_gui_cfg->max_tooltip_width); + } + + // In simple mode are not modifiers + if (wxGetApp().plater()->printer_technology() != ptSLA && wxGetApp().get_mode() != ConfigOptionMode::comSimple) { + ImGui::SameLine(); + if (ImGui::RadioButton(_u8L("Modifier").c_str(), type == modifier)) + new_type = modifier; + else if (ImGui::IsItemHovered()) { + if (is_last_solid_part) + m_imgui->tooltip(last_solid_part_hint, m_gui_cfg->max_tooltip_width); + else if (type != modifier) + m_imgui->tooltip(_u8L("Click to change part type into modifier."), m_gui_cfg->max_tooltip_width); + } + } + ImGuiWrapper::pop_radio_style(); + + if (m_volume != nullptr && new_type.has_value() && !is_last_solid_part) { + GUI_App &app = wxGetApp(); + Plater * plater = app.plater(); + // TRN: This is the name of the action that shows in undo/redo stack (changing part type from SVG to something else). + Plater::TakeSnapshot snapshot(plater, _u8L("Change SVG Type"), UndoRedo::SnapshotType::GizmoAction); + m_volume->set_type(*new_type); + + bool is_volume_move_inside = (type == part); + bool is_volume_move_outside = (*new_type == part); + // Update volume position when switch (from part) or (into part) + if ((is_volume_move_inside || is_volume_move_outside)) + process(); + + // inspiration in ObjectList::change_part_type() + // how to view correct side panel with objects + ObjectList *obj_list = app.obj_list(); + wxDataViewItemArray sel = obj_list->reorder_volumes_and_get_selection( + obj_list->get_selected_obj_idx(), + [volume = m_volume](const ModelVolume *vol) { return vol == volume; }); + if (!sel.IsEmpty()) obj_list->select_item(sel.front()); + + // NOTE: on linux, function reorder_volumes_and_get_selection call GLCanvas3D::reload_scene(refresh_immediately = false) + // which discard m_volume pointer and set it to nullptr also selection is cleared so gizmo is automaticaly closed + auto &mng = m_parent.get_gizmos_manager(); + if (mng.get_current_type() != GLGizmosManager::Svg) + mng.open_gizmo(GLGizmosManager::Svg); + // TODO: select volume back - Ask @Sasa + } +} + + +///////////// +// private namespace implementation +/////////////// +namespace { + +std::string get_file_name(const std::string &file_path) +{ + if (file_path.empty()) + return file_path; + + size_t pos_last_delimiter = file_path.find_last_of("/\\"); + if (pos_last_delimiter == std::string::npos) { + // should not happend that in path is not delimiter + assert(false); + pos_last_delimiter = 0; + } + + size_t pos_point = file_path.find_last_of('.'); + if (pos_point == std::string::npos || pos_point < pos_last_delimiter // last point is inside of directory path + ) { + // there is no extension + assert(false); + pos_point = file_path.size(); + } + + size_t offset = pos_last_delimiter + 1; // result should not contain last delimiter ( +1 ) + size_t count = pos_point - pos_last_delimiter - 1; // result should not contain extension point ( -1 ) + return file_path.substr(offset, count); +} + +std::string volume_name(const EmbossShape &shape) +{ + std::string file_name = get_file_name(shape.svg_file->path); + if (!file_name.empty()) + return file_name; + return "SVG shape"; +} + +CreateVolumeParams create_input(GLCanvas3D &canvas, RaycastManager& raycaster, ModelVolumeType volume_type) +{ + auto gizmo = static_cast(GLGizmosManager::Svg); + const GLVolume *gl_volume = get_first_hovered_gl_volume(canvas); + Plater *plater = wxGetApp().plater(); + return CreateVolumeParams{canvas, plater->get_camera(), plater->build_volume(), + plater->get_ui_job_worker(), volume_type, raycaster, gizmo, gl_volume}; +} + +GuiCfg create_gui_configuration() { + GuiCfg cfg; // initialize by default values; + + float line_height = ImGui::GetTextLineHeight(); + float line_height_with_spacing = ImGui::GetTextLineHeightWithSpacing(); + + float space = line_height_with_spacing - line_height; + + cfg.icon_width = std::max(std::round(line_height/8)*8, 8.f); + + GuiCfg::Translations &tr = cfg.translations; + + float lock_width = cfg.icon_width + 3 * space; + // TRN - Input label. Be short as possible + tr.depth = _u8L("Depth"); + // TRN - Input label. Be short as possible + tr.size = _u8L("Size"); + // TRN - Input label. Be short as possible + tr.use_surface = _u8L("Use surface"); + // TRN - Input label. Be short as possible + tr.distance = _u8L("From surface"); + // TRN - Input label. Be short as possible + tr.rotation = _u8L("Rotation"); + // TRN - Input label. Be short as possible + tr.mirror = _u8L("Mirror"); + float max_tr_width = std::max({ + ImGui::CalcTextSize(tr.depth.c_str()).x, + ImGui::CalcTextSize(tr.size.c_str()).x + lock_width, + ImGui::CalcTextSize(tr.use_surface.c_str()).x, + ImGui::CalcTextSize(tr.distance.c_str()).x, + ImGui::CalcTextSize(tr.rotation.c_str()).x + lock_width, + ImGui::CalcTextSize(tr.mirror.c_str()).x, + }); + + const ImGuiStyle &style = ImGui::GetStyle(); + cfg.input_offset = style.WindowPadding.x + max_tr_width + space + cfg.icon_width; + cfg.lock_offset = cfg.input_offset - (cfg.icon_width + 2 * space); + + ImVec2 letter_m_size = ImGui::CalcTextSize("M"); + const float count_letter_M_in_input = 12.f; + cfg.input_width = letter_m_size.x * count_letter_M_in_input; + cfg.texture_max_size_px = std::round((cfg.input_width + cfg.input_offset + cfg.icon_width + space)/8) * 8; + + cfg.max_tooltip_width = ImGui::GetFontSize() * 20.0f; + + return cfg; +} + +std::string choose_svg_file() +{ + wxWindow *parent = nullptr; + wxString message = _L("Choose SVG file for emboss:"); + wxString selected_file = wxEmptyString; + wxString wildcard = file_wildcards(FT_SVG); + long style = wxFD_OPEN | wxFD_FILE_MUST_EXIST; + wxFileDialog dialog(parent, message, last_used_directory, selected_file, wildcard, style); + if (dialog.ShowModal() != wxID_OK) { + BOOST_LOG_TRIVIAL(warning) << "SVG file for emboss was NOT selected."; + return {}; + } + + wxArrayString input_files; + dialog.GetPaths(input_files); + if (input_files.IsEmpty()) { + BOOST_LOG_TRIVIAL(warning) << "SVG file dialog result is empty."; + return {}; + } + + if (input_files.size() != 1) + BOOST_LOG_TRIVIAL(warning) << "SVG file dialog result contain multiple files but only first is used."; + + std::string path = into_u8(input_files.front()); + if (!boost::filesystem::exists(path)) { + BOOST_LOG_TRIVIAL(warning) << "SVG file dialog return invalid path."; + return {}; + } + + if (!boost::algorithm::iends_with(path, ".svg")) { + BOOST_LOG_TRIVIAL(warning) << "SVG file dialog return path without '.svg' tail"; + return {}; + } + + last_used_directory = dialog.GetDirectory(); + return path; +} + +EmbossShape select_shape(std::string_view filepath, double tesselation_tolerance) +{ + EmbossShape shape; + shape.projection.depth = 10.; + shape.projection.use_surface = false; + + EmbossShape::SvgFile svg; + if (filepath.empty()) { + // When empty open file dialog + svg.path = choose_svg_file(); + if (svg.path.empty()) + return {}; // file was not selected + } else { + svg.path = filepath; // copy + } + + + boost::filesystem::path path(svg.path); + if (!boost::filesystem::exists(path)) { + show_error(nullptr, GUI::format(_u8L("File does NOT exist (%1%)."), svg.path)); + return {}; + } + + if (!boost::algorithm::iends_with(svg.path, ".svg")) { + show_error(nullptr, GUI::format(_u8L("Filename has to end with \".svg\" but you selected %1%"), svg.path)); + return {}; + } + + if(init_image(svg) == nullptr) { + show_error(nullptr, GUI::format(_u8L("Nano SVG parser can't load from file (%1%)."), svg.path)); + return {}; + } + + // Set default and unchanging scale + NSVGLineParams params{tesselation_tolerance}; + shape.shapes_with_ids = create_shape_with_ids(*svg.image, params); + + // Must contain some shapes !!! + if (shape.shapes_with_ids.empty()) { + show_error(nullptr, GUI::format(_u8L("SVG file does NOT contain a single path to be embossed (%1%)."), svg.path)); + return {}; + } + shape.svg_file = std::move(svg); + return shape; +} + +DataBasePtr create_emboss_data_base(std::shared_ptr> &cancel, ModelVolumeType volume_type, std::string_view filepath) +{ + EmbossShape shape = select_shape(filepath); + + if (shape.shapes_with_ids.empty()) + // canceled selection of SVG file + return nullptr; + + // Cancel previous Job, when it is in process + // worker.cancel(); --> Use less in this case I want cancel only previous EmbossJob no other jobs + // Cancel only EmbossUpdateJob no others + if (cancel != nullptr) + cancel->store(true); + // create new shared ptr to cancel new job + cancel = std::make_shared>(false); + + std::string name = volume_name(shape); + + auto result = std::make_unique(name, cancel /*copy*/, std::move(shape)); + result->is_outside = volume_type == ModelVolumeType::MODEL_PART; + return result; +} +} // namespace + +// any existing icon filename to not influence GUI +const std::string GLGizmoSVG::M_ICON_FILENAME = "cut.svg"; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSVG.hpp b/src/slic3r/GUI/Gizmos/GLGizmoSVG.hpp new file mode 100644 index 0000000000..0a2dedbddd --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmoSVG.hpp @@ -0,0 +1,200 @@ +#ifndef slic3r_GLGizmoSVG_hpp_ +#define slic3r_GLGizmoSVG_hpp_ + +// Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, +// which overrides our localization "L" macro. +#include "GLGizmoBase.hpp" +#include "GLGizmoRotate.hpp" +#include "slic3r/GUI/SurfaceDrag.hpp" +#include "slic3r/GUI/GLTexture.hpp" +#include "slic3r/Utils/RaycastManager.hpp" +#include "slic3r/GUI/IconManager.hpp" + +#include +#include +#include + +#include "libslic3r/Emboss.hpp" +#include "libslic3r/Point.hpp" +#include "libslic3r/Model.hpp" + +#include +#include + +namespace Slic3r{ +class ModelVolume; +enum class ModelVolumeType : int; +} + +namespace Slic3r::GUI { + +struct Texture{ + unsigned id{0}; + unsigned width{0}; + unsigned height{0}; +}; + +class GLGizmoSVG : public GLGizmoBase +{ +public: + explicit GLGizmoSVG(GLCanvas3D &parent); + + /// + /// Create new embossed text volume by type on position of mouse + /// + /// Object part / Negative volume / Modifier + /// Define position of new volume + /// True on succesfull start creation otherwise False + bool create_volume(ModelVolumeType volume_type, const Vec2d &mouse_pos); // first open file dialog + + /// + /// Create new text without given position + /// + /// Object part / Negative volume / Modifier + /// True on succesfull start creation otherwise False + bool create_volume(ModelVolumeType volume_type); // first open file dialog + + /// + /// Create volume from already selected svg file + /// + /// File path + /// Position on screen where to create volume + /// Object part / Negative volume / Modifier + /// True on succesfull start creation otherwise False + bool create_volume(std::string_view svg_file, const Vec2d &mouse_pos, ModelVolumeType volume_type = ModelVolumeType::MODEL_PART); + bool create_volume(std::string_view svg_file, ModelVolumeType volume_type = ModelVolumeType::MODEL_PART); + + /// + /// Check whether volume is object containing only emboss volume + /// + /// Pointer to volume + /// True when object otherwise False + static bool is_svg_object(const ModelVolume &volume); + + /// + /// Check whether volume has emboss data + /// + /// Pointer to volume + /// True when constain emboss data otherwise False + static bool is_svg(const ModelVolume &volume); + +protected: + bool on_init() override; + std::string on_get_name() const override; + void on_render() override; + void on_register_raycasters_for_picking() override; + void on_unregister_raycasters_for_picking() override; + void on_render_input_window(float x, float y, float bottom_limit) override; + bool on_is_activable() const override { return true; } + bool on_is_selectable() const override { return false; } + void on_set_state() override; + void data_changed(bool is_serializing) override; // selection changed + void on_set_hover_id() override{ m_rotate_gizmo.set_hover_id(m_hover_id); } + void on_enable_grabber(unsigned int id) override { m_rotate_gizmo.enable_grabber(); } + void on_disable_grabber(unsigned int id) override { m_rotate_gizmo.disable_grabber(); } + void on_start_dragging() override; + void on_stop_dragging() override; + void on_dragging(const UpdateData &data) override; + + /// + /// Rotate by text on dragging rotate grabers + /// + /// Information about mouse + /// Propagete normaly return false. + bool on_mouse(const wxMouseEvent &mouse_event) override; + + bool wants_enter_leave_snapshots() const override; + std::string get_gizmo_entering_text() const override; + std::string get_gizmo_leaving_text() const override; + std::string get_action_snapshot_name() const override; +private: + void set_volume_by_selection(); + void reset_volume(); + + // create volume from text - main functionality + bool process(); + void close(); + void draw_window(); + void draw_preview(); + void draw_filename(); + void draw_depth(); + void draw_size(); + void draw_use_surface(); + void draw_distance(); + void draw_rotation(); + void draw_mirroring(); + void draw_face_the_camera(); + void draw_model_type(); + + // process mouse event + bool on_mouse_for_rotation(const wxMouseEvent &mouse_event); + bool on_mouse_for_translate(const wxMouseEvent &mouse_event); + + void volume_transformation_changed(); + + struct GuiCfg; + std::unique_ptr m_gui_cfg; + + // actual selected only one volume - with emboss data + ModelVolume *m_volume = nullptr; + + // Is used to edit eboss and send changes to job + // Inside volume is current state of shape WRT Volume + EmbossShape m_volume_shape; // copy from m_volume for edit + + // same index as volumes in + std::vector m_shape_warnings; + + // When work with undo redo stack there could be situation that + // m_volume point to unexisting volume so One need also objectID + ObjectID m_volume_id; + + // cancel for previous update of volume to cancel finalize part + std::shared_ptr> m_job_cancel = nullptr; + + // Rotation gizmo + GLGizmoRotate m_rotate_gizmo; + std::optional m_angle; + std::optional m_distance; + + // Value is set only when dragging rotation to calculate actual angle + std::optional m_rotate_start_angle; + + // TODO: it should be accessible by other gizmo too. + // May be move to plater? + RaycastManager m_raycast_manager; + + // When true keep up vector otherwise relative rotation + bool m_keep_up = true; + + // Keep size aspect ratio when True. + bool m_keep_ratio = true; + + // Keep data about dragging only during drag&drop + std::optional m_surface_drag; + + // For volume on scaled objects + std::optional m_scale_width; + std::optional m_scale_height; + std::optional m_scale_depth; + void calculate_scale(); + float get_scale_for_tolerance(); + + // keep SVG data rendered on GPU + Texture m_texture; + + // bounding box of shape + // Note: Scaled mm to int value by m_volume_shape.scale + BoundingBox m_shape_bb; + + std::string m_filename_preview; + + IconManager m_icon_manager; + IconManager::VIcons m_icons; + + // only temporary solution + static const std::string M_ICON_FILENAME; +}; +} // namespace Slic3r::GUI + +#endif // slic3r_GLGizmoSVG_hpp_ diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp index 93fbf7d9b3..147c80dedc 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp @@ -48,7 +48,7 @@ std::string GLGizmoScale3D::get_tooltip() const const Selection& selection = m_parent.get_selection(); bool single_instance = selection.is_single_full_instance(); - bool single_volume = selection.is_single_modifier() || selection.is_single_volume(); + bool single_volume = selection.is_single_volume_or_modifier(); Vec3f scale = 100.0f * Vec3f::Ones(); if (single_instance) @@ -85,13 +85,21 @@ bool GLGizmoScale3D::on_mouse(const wxMouseEvent &mouse_event) if (mouse_event.Dragging()) { if (m_dragging) { // Apply new temporary scale factors - TransformationType transformation_type(TransformationType::Local_Absolute_Joint); + Selection& selection = m_parent.get_selection(); + TransformationType transformation_type; + if (selection.is_single_full_instance()) { + transformation_type.set_instance(); + } else if (selection.is_single_volume_or_modifier()) { + transformation_type.set_local(); + } + + transformation_type.set_relative(); + if (mouse_event.AltDown()) transformation_type.set_independent(); - Selection& selection = m_parent.get_selection(); selection.scale(m_scale, transformation_type); - if (mouse_event.CmdDown()) selection.translate(m_offset, true); + if (mouse_event.CmdDown()) selection.translate(m_offset, transformation_type); } } return use_grabbers(mouse_event); @@ -100,24 +108,11 @@ bool GLGizmoScale3D::on_mouse(const wxMouseEvent &mouse_event) void GLGizmoScale3D::data_changed(bool is_serializing) { const Selection &selection = m_parent.get_selection(); bool enable_scale_xyz = selection.is_single_full_instance() || - selection.is_single_volume() || - selection.is_single_modifier(); + selection.is_single_volume_or_modifier(); for (unsigned int i = 0; i < 6; ++i) m_grabbers[i].enabled = enable_scale_xyz; - if (enable_scale_xyz) { - // all volumes in the selection belongs to the same instance, any of - // them contains the needed data, so we take the first - const GLVolume *volume = selection.get_first_volume(); - if (selection.is_single_full_instance()) { - set_scale(volume->get_instance_scaling_factor()); - } else if (selection.is_single_volume() || - selection.is_single_modifier()) { - set_scale(volume->get_volume_scaling_factor()); - } - } else { - set_scale(Vec3d::Ones()); - } + set_scale(Vec3d::Ones()); } bool GLGizmoScale3D::on_init() @@ -193,7 +188,7 @@ void GLGizmoScale3D::on_render() const Selection& selection = m_parent.get_selection(); bool single_instance = selection.is_single_full_instance(); - bool single_volume = selection.is_single_modifier() || selection.is_single_volume(); + bool single_volume = selection.is_single_volume_or_modifier(); glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); glsafe(::glEnable(GL_DEPTH_TEST)); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp index 09e999ec52..e534b2b3c1 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp @@ -151,7 +151,7 @@ void GLGizmoSeam::show_tooltip_information(float caption_max, float x, float y) ImTextureID normal_id = m_parent.get_gizmos_manager().get_icon_texture_id(GLGizmosManager::MENU_ICON_NAME::IC_TOOLBAR_TOOLTIP); ImTextureID hover_id = m_parent.get_gizmos_manager().get_icon_texture_id(GLGizmosManager::MENU_ICON_NAME::IC_TOOLBAR_TOOLTIP_HOVER); - caption_max += m_imgui->calc_text_size(": ").x + 35.f; + caption_max += m_imgui->calc_text_size(std::string_view{": "}).x + 35.f; float font_size = ImGui::GetFontSize(); ImVec2 button_size = ImVec2(font_size * 1.8, font_size * 1.3); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp index ca1575bba3..2fa96de169 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp @@ -582,7 +582,7 @@ void GLGizmoSimplify::on_set_state() void GLGizmoSimplify::create_gui_cfg() { if (m_gui_cfg.has_value()) return; - int space_size = m_imgui->calc_text_size(":MM").x; + int space_size = m_imgui->calc_text_size(std::string_view{":MM"}).x; GuiCfg cfg; cfg.top_left_width = std::max(m_imgui->calc_text_size(tr_mesh_name).x, m_imgui->calc_text_size(tr_triangles).x) diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index d6e9093509..7ab41bb4fa 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -26,8 +26,9 @@ #include "slic3r/GUI/Gizmos/GLGizmoSeam.hpp" #include "slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp" #include "slic3r/GUI/Gizmos/GLGizmoSimplify.hpp" +#include "slic3r/GUI/Gizmos/GLGizmoEmboss.hpp" +#include "slic3r/GUI/Gizmos/GLGizmoSVG.hpp" #include "slic3r/GUI/Gizmos/GLGizmoMeasure.hpp" -#include "slic3r/GUI/Gizmos/GLGizmoText.hpp" #include "slic3r/GUI/Gizmos/GLGizmoMeshBoolean.hpp" #include "libslic3r/format.hpp" @@ -81,20 +82,22 @@ GLGizmosManager::EType GLGizmosManager::get_gizmo_from_mouse(const Vec2d &mouse_ if (! m_enabled) return Undefined; - float cnv_h = (float) m_parent.get_canvas_size().get_height(); - float height = get_scaled_total_height(); float icons_size = m_layout.scaled_icons_size(); float border = m_layout.scaled_border(); //BBS: GUI refactor: GLToolbar&&Gizmo adjust - float cnv_w = (float)m_parent.get_canvas_size().get_width(); - float width = get_scaled_total_width(); //float space_width = GLGizmosManager::Default_Icons_Size * wxGetApp().toolbar_icon_scale();; - const float separator_width = m_parent.get_separator_toolbar_width(); - float top_x = std::max(0.0f, 0.5f * (cnv_w - (width + separator_width + m_parent.get_main_toolbar_width() - m_parent.get_collapse_toolbar_width() + m_parent.get_assemble_view_toolbar_width()))); - top_x += m_parent.get_main_toolbar_width() + separator_width / 2 + border; - if (m_parent.get_canvas_type() == GLCanvas3D::CanvasAssembleView) + float top_x; + if (m_parent.get_canvas_type() == GLCanvas3D::CanvasAssembleView) { + const float cnv_w = (float)m_parent.get_canvas_size().get_width(); + top_x = 0.5f * cnv_w + 0.5f * (m_parent.get_assembly_paint_toolbar_width()); + } else { + const float separator_width = m_parent.get_separator_toolbar_width(); + + top_x = m_parent.get_main_toolbar_offset(); + top_x += m_parent.get_main_toolbar_width() + separator_width / 2 + border; + } float top_y = 0; float stride_x = m_layout.scaled_stride_x(); @@ -150,7 +153,7 @@ void GLGizmosManager::switch_gizmos_icon_filename() case(EType::Seam): gizmo->set_icon_filename(m_is_dark ? "toolbar_seam_dark.svg" : "toolbar_seam.svg"); break; - case(EType::Text): + case(EType::Emboss): gizmo->set_icon_filename(m_is_dark ? "toolbar_text_dark.svg" : "toolbar_text.svg"); break; case(EType::MmuSegmentation): @@ -196,7 +199,8 @@ bool GLGizmosManager::init() m_gizmos.emplace_back(new GLGizmoMeshBoolean(m_parent, m_is_dark ? "toolbar_meshboolean_dark.svg" : "toolbar_meshboolean.svg", EType::MeshBoolean)); m_gizmos.emplace_back(new GLGizmoFdmSupports(m_parent, m_is_dark ? "toolbar_support_dark.svg" : "toolbar_support.svg", EType::FdmSupports)); m_gizmos.emplace_back(new GLGizmoSeam(m_parent, m_is_dark ? "toolbar_seam_dark.svg" : "toolbar_seam.svg", EType::Seam)); - m_gizmos.emplace_back(new GLGizmoText(m_parent, m_is_dark ? "toolbar_text_dark.svg" : "toolbar_text.svg", EType::Text)); + m_gizmos.emplace_back(new GLGizmoEmboss(m_parent, m_is_dark ? "toolbar_text_dark.svg" : "toolbar_text.svg", EType::Emboss)); + m_gizmos.emplace_back(new GLGizmoSVG(m_parent)); m_gizmos.emplace_back(new GLGizmoMmuSegmentation(m_parent, m_is_dark ? "mmu_segmentation_dark.svg" : "mmu_segmentation.svg", EType::MmuSegmentation)); m_gizmos.emplace_back(new GLGizmoMeasure(m_parent, m_is_dark ? "toolbar_measure_dark.svg" : "toolbar_measure.svg", EType::Measure)); m_gizmos.emplace_back(new GLGizmoSimplify(m_parent, "reduce_triangles.svg", EType::Simplify)); @@ -249,27 +253,6 @@ bool GLGizmosManager::init_icon_textures() else return false; - - if (IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/text_B.svg", 20, 20, texture_id)) - icon_list.insert(std::make_pair((int)IC_TEXT_B, texture_id)); - else - return false; - - if (IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/text_B_dark.svg", 20, 20, texture_id)) - icon_list.insert(std::make_pair((int)IC_TEXT_B_DARK, texture_id)); - else - return false; - - if (IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/text_T.svg", 20, 20, texture_id)) - icon_list.insert(std::make_pair((int)IC_TEXT_T, texture_id)); - else - return false; - - if (IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/text_T_dark.svg", 20, 20, texture_id)) - icon_list.insert(std::make_pair((int)IC_TEXT_T_DARK, texture_id)); - else - return false; - return true; } @@ -326,7 +309,8 @@ void GLGizmosManager::reset_all_states() open_gizmo(current); activate_gizmo(Undefined); - m_hover = Undefined; + // Orca: do not clear hover state, as Emboss gizmo can be used without selection + //m_hover = Undefined; } bool GLGizmosManager::open_gizmo(EType type) @@ -445,8 +429,6 @@ bool GLGizmosManager::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_p return dynamic_cast(m_gizmos[Seam].get())->gizmo_event(action, mouse_position, shift_down, alt_down, control_down); else if (m_current == MmuSegmentation) return dynamic_cast(m_gizmos[MmuSegmentation].get())->gizmo_event(action, mouse_position, shift_down, alt_down, control_down); - else if (m_current == Text) - return dynamic_cast(m_gizmos[Text].get())->gizmo_event(action, mouse_position, shift_down, alt_down, control_down); else if (m_current == Measure) return dynamic_cast(m_gizmos[Measure].get())->gizmo_event(action, mouse_position, shift_down, alt_down, control_down); else if (m_current == Cut) @@ -607,7 +589,12 @@ bool GLGizmosManager::gizmos_toolbar_on_mouse(const wxMouseEvent &mouse_event) { // mouse is above toolbar if (mouse_event.LeftDown() || mouse_event.LeftDClick()) { mc.left = true; - open_gizmo(gizmo); + if (gizmo == Emboss) { + GLGizmoBase *gizmo_emboss = m_gizmos[Emboss].get(); + dynamic_cast(gizmo_emboss)->on_shortcut_key(); + } else { + open_gizmo(gizmo); + } return true; } else if (mouse_event.RightDown()) { @@ -1078,13 +1065,11 @@ void GLGizmosManager::do_render_overlay() const else { //BBS: GUI refactor: GLToolbar&&Gizmo adjust float main_toolbar_width = (float)m_parent.get_main_toolbar_width(); - float assemble_view_width = (float)m_parent.get_assemble_view_toolbar_width(); - float collapse_width = (float)m_parent.get_collapse_toolbar_width(); float separator_width = (float)m_parent.get_separator_toolbar_width(); //float space_width = GLGizmosManager::Default_Icons_Size * wxGetApp().toolbar_icon_scale(); //float zoomed_top_x = 0.5f *(cnv_w + main_toolbar_width - 2 * space_width - width) * inv_zoom; - float main_toolbar_left = std::max(-0.5f * cnv_w, -0.5f * (main_toolbar_width + get_scaled_total_width() + assemble_view_width + separator_width - collapse_width)); + float main_toolbar_left = -0.5f * cnv_w + m_parent.get_main_toolbar_offset(); //float zoomed_top_x = 0.5f *(main_toolbar_width + collapse_width - width - assemble_view_width) * inv_zoom; top_x = main_toolbar_left + main_toolbar_width + separator_width / 2; top_x = top_x * inv_cnv_w * 2; @@ -1129,12 +1114,14 @@ void GLGizmosManager::do_render_overlay() const const float v_bottom = v_top + dv - v_offset; GLTexture::render_sub_texture(icons_texture_id, top_x, top_x + icons_size_x, top_y - icons_size_y, top_y, { { u_left, v_bottom }, { u_right, v_bottom }, { u_right, v_top }, { u_left, v_top } }); - if (idx == m_current) { + if (idx == m_current + // Orca: Show Svg dialog at the same place as emboss gizmo + || (m_current == Svg && idx == Emboss)) { //BBS: GUI refactor: GLToolbar&&Gizmo adjust //render_input_window uses a different coordination(imgui) //1. no need to scale by camera zoom, set {0,0} at left-up corner for imgui //gizmo->render_input_window(width, 0.5f * cnv_h - zoomed_top_y * zoom, toolbar_top); - gizmo->render_input_window(0.5 * cnv_w + 0.5f * top_x * cnv_w, get_scaled_total_height(), cnv_h); + m_gizmos[m_current]->render_input_window(0.5 * cnv_w + 0.5f * top_x * cnv_w, get_scaled_total_height(), cnv_h); is_render_current = true; } @@ -1337,7 +1324,7 @@ std::string get_name_from_gizmo_etype(GLGizmosManager::EType type) return "FdmSupports"; case GLGizmosManager::EType::Seam: return "Seam"; - case GLGizmosManager::EType::Text: + case GLGizmosManager::EType::Emboss: return "Text"; case GLGizmosManager::EType::MmuSegmentation: return "Color Painting"; diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp index 02169e08d4..cc6ca682e8 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp @@ -85,8 +85,8 @@ public: MeshBoolean, FdmSupports, Seam, - // BBS - Text, + Emboss, + Svg, MmuSegmentation, Measure, Simplify, @@ -163,10 +163,6 @@ public: IC_TOOLBAR_RESET_HOVER, IC_TOOLBAR_TOOLTIP, IC_TOOLBAR_TOOLTIP_HOVER, - IC_TEXT_B, - IC_TEXT_B_DARK, - IC_TEXT_T, - IC_TEXT_T_DARK, IC_NAME_COUNT, }; diff --git a/src/slic3r/GUI/Gizmos/GizmoObjectManipulation.cpp b/src/slic3r/GUI/Gizmos/GizmoObjectManipulation.cpp index 1a5b891598..776830bbe2 100644 --- a/src/slic3r/GUI/Gizmos/GizmoObjectManipulation.cpp +++ b/src/slic3r/GUI/Gizmos/GizmoObjectManipulation.cpp @@ -1,3 +1,7 @@ +///|/ Copyright (c) Prusa Research 2018 - 2023 Enrico Turri @enricoturri1966, Oleksandra Iushchenko @YuSanka, Lukáš Matěna @lukasmatena, Pavel Mikuš @Godrak, Filip Sykala @Jony01, Vojtěch Bubník @bubnikv, Vojtěch Král @vojtechkral +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ #include "slic3r/GUI/ImGuiWrapper.hpp" #include @@ -19,7 +23,7 @@ #include #define MAX_NUM 9999.99 -#define MAX_SIZE "9999.99" +#define MAX_SIZE std::string_view{"9999.99"} namespace Slic3r { @@ -81,7 +85,7 @@ void GizmoObjectManipulation::update_settings_value(const Selection& selection) m_new_rotate_label_string = L("Rotation"); m_new_scale_label_string = L("Scale ratios"); - m_world_coordinates = true; + m_coordinates_type = ECoordinatesType::World; ObjectList* obj_list = wxGetApp().obj_list(); if (selection.is_single_full_instance()) { @@ -89,7 +93,7 @@ void GizmoObjectManipulation::update_settings_value(const Selection& selection) const GLVolume* volume = selection.get_first_volume(); m_new_position = volume->get_instance_offset(); - if (m_world_coordinates) { + if (is_world_coordinates()) { m_new_rotate_label_string = L("Rotate"); m_new_rotation = volume->get_instance_rotation() * (180. / M_PI); m_new_size = selection.get_scaled_instance_bounding_box().size(); @@ -260,7 +264,15 @@ void GizmoObjectManipulation::change_position_value(int axis, double value) Selection& selection = m_glcanvas.get_selection(); selection.setup_cache(); - selection.translate(position - m_cache.position, selection.requires_local_axes()); + TransformationType trafo_type; + trafo_type.set_relative(); + switch (m_coordinates_type) + { + case ECoordinatesType::Instance: { trafo_type.set_instance(); break; } + case ECoordinatesType::Local: { trafo_type.set_local(); break; } + default: { break; } + } + selection.translate(position - m_cache.position, trafo_type); m_glcanvas.do_move(L("Set Position")); m_cache.position = position; @@ -278,14 +290,16 @@ void GizmoObjectManipulation::change_rotation_value(int axis, double value) Selection& selection = m_glcanvas.get_selection(); - TransformationType transformation_type(TransformationType::World_Relative_Joint); - if (selection.is_single_full_instance() || selection.requires_local_axes()) - transformation_type.set_independent(); - if (selection.is_single_full_instance() && ! m_world_coordinates) { - //FIXME Selection::rotate() does not process absoulte rotations correctly: It does not recognize the axis index, which was changed. - // transformation_type.set_absolute(); - transformation_type.set_local(); - } + TransformationType transformation_type; + transformation_type.set_relative(); + if (selection.is_single_full_instance()) + transformation_type.set_independent(); + + if (is_local_coordinates()) + transformation_type.set_local(); + + if (is_instance_coordinates()) + transformation_type.set_instance(); selection.setup_cache(); selection.rotate( @@ -336,7 +350,7 @@ void GizmoObjectManipulation::change_size_value(int axis, double value) ref_size = Vec3d(instance_scale[0] * ref_size[0], instance_scale[1] * ref_size[1], instance_scale[2] * ref_size[2]); } else if (selection.is_single_full_instance()) - ref_size = m_world_coordinates ? + ref_size = is_world_coordinates() ? selection.get_unscaled_instance_bounding_box().size() : wxGetApp().model().objects[selection.get_first_volume()->object_idx()]->raw_mesh_bounding_box().size(); @@ -355,7 +369,7 @@ void GizmoObjectManipulation::do_scale(int axis, const Vec3d &scale) const TransformationType transformation_type(TransformationType::World_Relative_Joint); if (selection.is_single_full_instance()) { transformation_type.set_absolute(); - if (! m_world_coordinates) + if (! is_world_coordinates()) transformation_type.set_local(); } @@ -364,7 +378,7 @@ void GizmoObjectManipulation::do_scale(int axis, const Vec3d &scale) const scaling_factor = scale(axis) * Vec3d::Ones(); selection.setup_cache(); - selection.scale(scaling_factor * 0.01, transformation_type); + selection.scale_legacy(scaling_factor * 0.01, transformation_type); m_glcanvas.do_scale(L("Set Scale")); } @@ -386,6 +400,51 @@ void GizmoObjectManipulation::on_change(const std::string& opt_key, int axis, do change_size_value(axis, new_value); } +void GizmoObjectManipulation::set_uniform_scaling(const bool new_value) +{ + const Selection &selection = m_glcanvas.get_selection(); + if (selection.is_single_full_instance() && is_world_coordinates() && !new_value) { + // Verify whether the instance rotation is multiples of 90 degrees, so that the scaling in world coordinates is possible. + // all volumes in the selection belongs to the same instance, any of them contains the needed instance data, so we take the first one + const GLVolume* volume = selection.get_first_volume(); + // Is the angle close to a multiple of 90 degrees? + + if (! Geometry::is_rotation_ninety_degrees(volume->get_instance_rotation())) { + // Cannot apply scaling in the world coordinate system. + // BBS: remove tilt prompt dialog + + // Bake the rotation into the meshes of the object. + wxGetApp().model().objects[volume->composite_id.object_id]->bake_xy_rotation_into_meshes(volume->composite_id.instance_id); + // Update the 3D scene, selections etc. + wxGetApp().plater()->update(); + // Recalculate cached values at this panel, refresh the screen. + this->UpdateAndShow(true); + } + } + m_uniform_scale = new_value; +} + +void GizmoObjectManipulation::set_coordinates_type(ECoordinatesType type) +{ + if (wxGetApp().get_mode() == comSimple) + type = ECoordinatesType::World; + + if (m_coordinates_type == type) + return; + + m_coordinates_type = type; + this->UpdateAndShow(true); + GLCanvas3D* canvas = wxGetApp().plater()->canvas3D(); + canvas->get_gizmos_manager().update_data(); + canvas->set_as_dirty(); + canvas->request_extra_frame(); +} + +ECoordinatesType GizmoObjectManipulation::get_coordinates_type() const +{ + return m_coordinates_type; +} + void GizmoObjectManipulation::reset_position_value() { Selection& selection = m_glcanvas.get_selection(); @@ -427,7 +486,7 @@ void GizmoObjectManipulation::reset_rotation_value() return; // Update rotation at the GLVolumes. - selection.synchronize_unselected_instances(Selection::SYNC_ROTATION_GENERAL); + selection.synchronize_unselected_instances(Selection::SyncRotationType::GENERAL); selection.synchronize_unselected_volumes(); // Copy rotation values from GLVolumes into Model (ModelInstance / ModelVolume), trigger background processing. m_glcanvas.do_rotate(L("Reset Rotation")); @@ -444,30 +503,6 @@ void GizmoObjectManipulation::reset_scale_value() change_scale_value(2, 100.); } -void GizmoObjectManipulation::set_uniform_scaling(const bool new_value) -{ - const Selection &selection = m_glcanvas.get_selection(); - if (selection.is_single_full_instance() && m_world_coordinates && !new_value) { - // Verify whether the instance rotation is multiples of 90 degrees, so that the scaling in world coordinates is possible. - // all volumes in the selection belongs to the same instance, any of them contains the needed instance data, so we take the first one - const GLVolume* volume = selection.get_first_volume(); - // Is the angle close to a multiple of 90 degrees? - - if (! Geometry::is_rotation_ninety_degrees(volume->get_instance_rotation())) { - // Cannot apply scaling in the world coordinate system. - // BBS: remove tilt prompt dialog - - // Bake the rotation into the meshes of the object. - wxGetApp().model().objects[volume->composite_id.object_id]->bake_xy_rotation_into_meshes(volume->composite_id.instance_id); - // Update the 3D scene, selections etc. - wxGetApp().plater()->update(); - // Recalculate cached values at this panel, refresh the screen. - this->UpdateAndShow(true); - } - } - m_uniform_scale = new_value; -} - static const char* label_values[2][3] = { { "##position_x", "##position_y", "##position_z"}, { "##rotation_x", "##rotation_y", "##rotation_z"} diff --git a/src/slic3r/GUI/Gizmos/GizmoObjectManipulation.hpp b/src/slic3r/GUI/Gizmos/GizmoObjectManipulation.hpp index 39ceee5dbf..3a3dc145ce 100644 --- a/src/slic3r/GUI/Gizmos/GizmoObjectManipulation.hpp +++ b/src/slic3r/GUI/Gizmos/GizmoObjectManipulation.hpp @@ -6,6 +6,8 @@ #include "libslic3r/Point.hpp" #include +#include "slic3r/GUI/GUI_Geometry.hpp" + //#include "slic3r/GUI/GLCanvas3D.hpp" namespace Slic3r { @@ -81,8 +83,7 @@ public: Vec3d m_buffered_size; bool m_new_enabled {true}; bool m_uniform_scale {true}; - // Does the object manipulation panel work in World or Local coordinates? - bool m_world_coordinates = true; + ECoordinatesType m_coordinates_type{ ECoordinatesType::World }; bool m_show_clear_rotation { false }; bool m_show_clear_scale { false }; @@ -107,9 +108,12 @@ public: void set_uniform_scaling(const bool uniform_scale); bool get_uniform_scaling() const { return m_uniform_scale; } - // Does the object manipulation panel work in World or Local coordinates? - void set_world_coordinates(const bool world_coordinates) { m_world_coordinates = world_coordinates; this->UpdateAndShow(true); } - bool get_world_coordinates() const { return m_world_coordinates; } + + void set_coordinates_type(ECoordinatesType type); + ECoordinatesType get_coordinates_type() const; + bool is_world_coordinates() const { return m_coordinates_type == ECoordinatesType::World; } + bool is_instance_coordinates() const { return m_coordinates_type == ECoordinatesType::Instance; } + bool is_local_coordinates() const { return m_coordinates_type == ECoordinatesType::Local; } void reset_cache() { m_cache.reset(); } diff --git a/src/slic3r/GUI/IconManager.cpp b/src/slic3r/GUI/IconManager.cpp new file mode 100644 index 0000000000..896c5203f9 --- /dev/null +++ b/src/slic3r/GUI/IconManager.cpp @@ -0,0 +1,410 @@ +#include "IconManager.hpp" +#include +#include +#include "nanosvg/nanosvg.h" +#include "nanosvg/nanosvgrast.h" +#include "libslic3r/Utils.hpp" // ScopeGuard + +#include "3DScene.hpp" // glsafe +#include "GL/glew.h" + +#define STB_RECT_PACK_IMPLEMENTATION +#include "imgui/imstb_rectpack.h" // distribute rectangles + +using namespace Slic3r::GUI; + +namespace priv { +// set shared pointer to point on bad texture +static void clear(IconManager::Icons &icons); +static const std::vector>& get_states(IconManager::RasterType type); +static void draw_transparent_icon(const IconManager::Icon &icon); // only help function +} + +IconManager::~IconManager() { + priv::clear(m_icons); + // release opengl texture is made in ~GLTexture() + + if (m_id != 0) + glsafe(::glDeleteTextures(1, &m_id)); +} + +namespace { +NSVGimage *parse_file(const char * filepath) { + FILE *fp = boost::nowide::fopen(filepath, "rb"); + assert(fp != nullptr); + if (fp == nullptr) + return nullptr; + + Slic3r::ScopeGuard sg([fp]() { fclose(fp); }); + + fseek(fp, 0, SEEK_END); + size_t size = ftell(fp); + fseek(fp, 0, SEEK_SET); + + // Note: +1 is for null termination + auto data_ptr = std::make_unique(size+1); + data_ptr[size] = '\0'; // Must be null terminated. + + size_t readed_size = fread(data_ptr.get(), 1, size, fp); + assert(readed_size == size); + if (readed_size != size) + return nullptr; + + return nsvgParse(data_ptr.get(), "px", 96.0f); +} + +void subdata(unsigned char *data, size_t data_stride, const std::vector &data2, size_t data2_row) { + assert(data_stride >= data2_row); + for (size_t data2_offset = 0, data_offset = 0; + data2_offset < data2.size(); + data2_offset += data2_row, data_offset += data_stride) + ::memcpy((void *)(data + data_offset), (const void *)(data2.data() + data2_offset), data2_row); +} +} + +IconManager::Icons IconManager::init(const InitTypes &input) +{ + assert(!input.empty()); + if (input.empty()) + return {}; + + // TODO: remove in future + if (m_id != 0) { + glsafe(::glDeleteTextures(1, &m_id)); + m_id = 0; + } + + int total_surface = 0; + for (const InitType &i : input) + total_surface += i.size.x * i.size.y; + const int surface_sqrt = (int)sqrt((float)total_surface) + 1; + + // Start packing + // Pack our extra data rectangles first, so it will be on the upper-left corner of our texture (UV will have small values). + const int TEX_HEIGHT_MAX = 1024 * 32; + int width = (surface_sqrt >= 4096 * 0.7f) ? 4096 : (surface_sqrt >= 2048 * 0.7f) ? 2048 : (surface_sqrt >= 1024 * 0.7f) ? 1024 : 512; + + int num_nodes = width; + std::vector nodes(num_nodes); + stbrp_context context; + stbrp_init_target(&context, width, TEX_HEIGHT_MAX, nodes.data(), num_nodes); + + ImVector pack_rects; + pack_rects.resize(input.size()); + memset(pack_rects.Data, 0, (size_t) pack_rects.size_in_bytes()); + for (size_t i = 0; i < input.size(); i++) { + const ImVec2 &size = input[i].size; + assert(size.x > 1); + assert(size.y > 1); + pack_rects[i].w = size.x; + pack_rects[i].h = size.y; + } + int pack_rects_res = stbrp_pack_rects(&context, &pack_rects[0], pack_rects.Size); + assert(pack_rects_res == 1); + if (pack_rects_res != 1) + return {}; + + ImVec2 tex_size(width, width); + for (const stbrp_rect &rect : pack_rects) { + float x = rect.x + rect.w; + float y = rect.y + rect.h; + if(x > tex_size.x) tex_size.x = x; + if(y > tex_size.y) tex_size.y = y; + } + + Icons result(input.size()); + for (int i = 0; i < pack_rects.Size; i++) { + const stbrp_rect &rect = pack_rects[i]; + assert(rect.was_packed); + if (!rect.was_packed) + return {}; + + ImVec2 tl(rect.x / tex_size.x, rect.y / tex_size.y); + ImVec2 br((rect.x + rect.w) / tex_size.x, (rect.y + rect.h) / tex_size.y); + + assert(input[i].size.x == rect.w); + assert(input[i].size.y == rect.h); + Icon icon = {input[i].size, tl, br}; + result[i] = std::make_shared(std::move(icon)); + } + + NSVGrasterizer *rast = nsvgCreateRasterizer(); + assert(rast != nullptr); + if (rast == nullptr) + return {}; + ScopeGuard sg_rast([rast]() { ::nsvgDeleteRasterizer(rast); }); + + int channels = 4; + int n_pixels = tex_size.x * tex_size.y; + // store data for whole texture + std::vector data(n_pixels * channels, {0}); + + // initialize original index locations + std::vector idx(input.size()); + std::iota(idx.begin(), idx.end(), 0); + + // Group same filename by sort inputs + // sort indexes based on comparing values in input + std::sort(idx.begin(), idx.end(), [&input](size_t i1, size_t i2) { return input[i1].filepath < input[i2].filepath; }); + for (size_t j: idx) { + const InitType &i = input[j]; + if (i.filepath.empty()) + continue; // no file path only reservation of space for texture + assert(boost::filesystem::exists(i.filepath)); + if (!boost::filesystem::exists(i.filepath)) + continue; + assert(boost::algorithm::iends_with(i.filepath, ".svg")); + if (!boost::algorithm::iends_with(i.filepath, ".svg")) + continue; + + NSVGimage *image = parse_file(i.filepath.c_str()); + assert(image != nullptr); + if (image == nullptr) + return {}; + + ScopeGuard sg_image([image]() { ::nsvgDelete(image); }); + + float svg_scale = i.size.y / image->height; + // scale should be same in both directions + assert(is_approx(svg_scale, i.size.y / image->width)); + + const stbrp_rect &rect = pack_rects[j]; + int n_pixels = rect.w * rect.h; + std::vector icon_data(n_pixels * channels, {0}); + ::nsvgRasterize(rast, image, 0, 0, svg_scale, icon_data.data(), i.size.x, i.size.y, i.size.x * channels); + + // makes white or gray only data in icon + if (i.type == RasterType::white_only_data || + i.type == RasterType::gray_only_data) { + unsigned char value = (i.type == RasterType::white_only_data) ? 255 : 127; + for (size_t k = 0; k < icon_data.size(); k += channels) + if (icon_data[k] != 0 || icon_data[k + 1] != 0 || icon_data[k + 2] != 0) { + icon_data[k] = value; + icon_data[k + 1] = value; + icon_data[k + 2] = value; + } + } + + int start_offset = (rect.y*tex_size.x + rect.x) * channels; + int data_stride = tex_size.x * channels; + subdata(data.data() + start_offset, data_stride, icon_data, rect.w * channels); + } + + if (m_id != 0) + glsafe(::glDeleteTextures(1, &m_id)); + + glsafe(::glPixelStorei(GL_UNPACK_ALIGNMENT, 1)); + glsafe(::glGenTextures(1, &m_id)); + glsafe(::glBindTexture(GL_TEXTURE_2D, (GLuint) m_id)); + glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); + glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0)); + glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); + glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei) tex_size.x, (GLsizei) tex_size.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, (const void*) data.data())); + + // bind no texture + glsafe(::glBindTexture(GL_TEXTURE_2D, 0)); + + for (const auto &i : result) + i->tex_id = m_id; + return result; +} + +std::vector IconManager::init(const std::vector &file_paths, const ImVec2 &size, RasterType type) +{ + assert(!file_paths.empty()); + assert(size.x >= 1); + assert(size.x < 256*16); + + // TODO: remove in future + if (!m_icons.empty()) { + // not first initialization + priv::clear(m_icons); + m_icons.clear(); + m_icons_texture.reset(); + } + + // only rectangle are supported + assert(size.x == size.y); + // no subpixel supported + unsigned int width = static_cast(std::abs(std::round(size.x))); + assert(size.x == static_cast(width)); + + // state order has to match the enum IconState + const auto& states = priv::get_states(type); + + bool compress = false; + bool is_loaded = m_icons_texture.load_from_svg_files_as_sprites_array(file_paths, states, width, compress); + if (!is_loaded || (size_t) m_icons_texture.get_width() < (states.size() * width) || + (size_t) m_icons_texture.get_height() < (file_paths.size() * width)) { + // bad load of icons, but all usage of m_icons_texture check that texture is initialized + assert(false); + m_icons_texture.reset(); + return {}; + } + + unsigned count_files = file_paths.size(); + // count icons per file + unsigned count = states.size(); + // create result + std::vector result; + result.reserve(count_files); + + Icon def_icon; + def_icon.tex_id = m_icons_texture.get_id(); + def_icon.size = size; + + // float beacouse of dividing + float tex_height = static_cast(m_icons_texture.get_height()); + float tex_width = static_cast(m_icons_texture.get_width()); + + //for (const auto &f: file_paths) { + for (unsigned f = 0; f < count_files; ++f) { + // NOTE: there are space between icons + unsigned start_y = static_cast(f) * (width + 1) + 1; + float y1 = start_y / tex_height; + float y2 = (start_y + width) / tex_height; + Icons file_icons; + file_icons.reserve(count); + //for (const auto &s : states) { + for (unsigned j = 0; j < count; ++j) { + auto icon = std::make_shared(def_icon); + // NOTE: there are space between icons + unsigned start_x = static_cast(j) * (width + 1) + 1; + float x1 = start_x / tex_width; + float x2 = (start_x + width) / tex_width; + icon->tl = ImVec2(x1, y1); + icon->br = ImVec2(x2, y2); + file_icons.push_back(icon); + m_icons.push_back(std::move(icon)); + } + result.emplace_back(std::move(file_icons)); + } + return result; +} + +void IconManager::release() { + BOOST_LOG_TRIVIAL(error) << "Not implemented yet"; +} + +void priv::clear(IconManager::Icons &icons) { + std::string message; + for (auto &icon : icons) { + // Exist more than this instance of shared ptr? + long count = icon.use_count(); + if (count != 1) { + // in existing icon change texture to non existing one + icon->tex_id = 0; + + std::string descr = + ((count > 2) ? (std::to_string(count - 1) + "x") : "") + // count + std::to_string(icon->size.x) + "x" + std::to_string(icon->size.y); // resolution + if (message.empty()) + message = descr; + else + message += ", " + descr; + } + } + + if (!message.empty()) + BOOST_LOG_TRIVIAL(warning) << "There is still used icons(" << message << ")."; +} + +const std::vector> &priv::get_states(IconManager::RasterType type) { + static std::vector> color = {std::make_pair(0, false)}; + static std::vector> white = {std::make_pair(1, false)}; + static std::vector> gray = {std::make_pair(2, false)}; + static std::vector> color_wite_gray = { + std::make_pair(1, false), // Activable + std::make_pair(0, false), // Hovered + std::make_pair(2, false) // Disabled + }; + + switch (type) { + case IconManager::RasterType::color: return color; + case IconManager::RasterType::white_only_data: return white; + case IconManager::RasterType::gray_only_data: return gray; + case IconManager::RasterType::color_wite_gray: return color_wite_gray; + default: return color; + } +} + +void priv::draw_transparent_icon(const IconManager::Icon &icon) +{ + // Check input + if (!icon.is_valid()) { + assert(false); + BOOST_LOG_TRIVIAL(warning) << "Drawing invalid Icon."; + ImGui::Text("?"); + return; + } + + // size UV texture coors [in texture ratio] + ImVec2 size_uv(icon.br.x - icon.tl.x, icon.br.y - icon.tl.y); + ImVec2 one_px(size_uv.x / icon.size.x, size_uv.y / icon.size.y); + + // use top left corner of first icon + IconManager::Icon icon_px = icon; // copy + // reduce uv coors to one pixel + icon_px.tl = ImVec2(0, 0); + icon_px.br = one_px; + draw(icon_px); +} + +#include "imgui/imgui_internal.h" //ImGuiWindow +namespace Slic3r::GUI { + +void draw(const IconManager::Icon &icon, const ImVec2 &size, const ImVec4 &tint_col, const ImVec4 &border_col) +{ + // Check input + if (!icon.is_valid()) { + assert(false); + BOOST_LOG_TRIVIAL(warning) << "Drawing invalid Icon."; + ImGui::Text("?"); + return; + } + ImTextureID id = (void *)static_cast(icon.tex_id); + const ImVec2 &s = (size.x < 1 || size.y < 1) ? icon.size : size; + + // Orca: Align icon center vertically + ImGuiWindow *window = ImGui::GetCurrentWindow(); + ImGuiContext &g = *GImGui; + float cursor_y = window->DC.CursorPos.y; + float line_height = ImGui::GetTextLineHeight() + g.Style.FramePadding.y * 2; + float offset_y = (line_height - s.y) / 2; + window->DC.CursorPos.y += offset_y; + + ImGui::Image(id, s, icon.tl, icon.br, tint_col, border_col); + + // Reset offset + window->DC.CursorPosPrevLine.y = cursor_y; +} + +bool clickable(const IconManager::Icon &icon, const IconManager::Icon &icon_hover) +{ + // check of hover + ImGuiWindow *window = ImGui::GetCurrentWindow(); + float cursor_x = ImGui::GetCursorPosX() + - window->DC.GroupOffset.x + - window->DC.ColumnsOffset.x; + priv::draw_transparent_icon(icon); + ImGui::SameLine(cursor_x); + if (ImGui::IsItemHovered()) { + // redraw image + draw(icon_hover); + } else { + // redraw normal image + draw(icon); + } + return ImGui::IsItemClicked(); +} + +bool button(const IconManager::Icon &activ, const IconManager::Icon &hover, const IconManager::Icon &disable, bool disabled) +{ + if (disabled) { + draw(disable); + return false; + } + return clickable(activ, hover); +} + +} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/IconManager.hpp b/src/slic3r/GUI/IconManager.hpp new file mode 100644 index 0000000000..24ec3f7a91 --- /dev/null +++ b/src/slic3r/GUI/IconManager.hpp @@ -0,0 +1,134 @@ +#ifndef slic3r_IconManager_hpp_ +#define slic3r_IconManager_hpp_ + +#include +#include +#include "imgui/imgui.h" // ImVec2 +#include "slic3r/GUI/GLTexture.hpp" // texture storage + +namespace Slic3r::GUI { + +/// +/// Keep texture with icons for UI +/// Manage texture live -> create and destruct texture +/// by live of icon shared pointers. +/// +class IconManager +{ +public: + /// + /// Release texture + /// Set shared pointers to invalid texture + /// + ~IconManager(); + + /// + /// Define way to convert svg data to raster + /// + enum class RasterType: int{ + color = 1 << 1, + white_only_data = 1 << 2, + gray_only_data = 1 << 3, + color_wite_gray = color | white_only_data | gray_only_data + // TODO: add type with backgrounds + }; + + struct InitType { + // path to file with image .. svg + std::string filepath; + + // resolution of stored rasterized icon + ImVec2 size; // float will be rounded + + // could contain more than one type + RasterType type = RasterType::color; + // together color, white and gray = color | white_only_data | gray_only_data + }; + using InitTypes = std::vector; + + /// + /// Data for render texture with icon + /// + struct Icon { + // stored texture size + ImVec2 size = ImVec2(-1, -1); // [in px] --> unsigned int values stored as float + + // SubTexture UV coordinate in range from 0. to 1. + ImVec2 tl; // top left -> uv0 + ImVec2 br; // bottom right -> uv1 + + // OpenGL texture id + unsigned int tex_id = 0; + bool is_valid() const { return tex_id != 0;} + // && size.x > 0 && size.y > 0 && tl.x != br.x && tl.y != br.y; + }; + using Icons = std::vector >; + // Vector of icons, each vector contain multiple use of a SVG render + using VIcons = std::vector; + + /// + /// Initialize raster texture on GPU with given images + /// NOTE: Have to be called after OpenGL initialization + /// + /// Define files and its size with rasterization + /// Rasterized icons stored on GPU, + /// Same size and order as input, each item of vector is set of texture in order by RasterType + Icons init(const InitTypes &input); + + /// + /// Initialize multiple icons with same settings for size and type + /// NOTE: Have to be called after OpenGL initialization + /// + /// Define files with icon + /// Size of stored texture[in px], float will be rounded + /// Define way to rasterize icon, + /// together color, white and gray = RasterType::color | RasterType::white_only_data | RasterType::gray_only_data + /// Rasterized icons stored on GPU, + /// Same size and order as file_paths, each item of vector is set of texture in order by RasterType + VIcons init(const std::vector &file_paths, const ImVec2 &size, RasterType type = RasterType::color); + + /// + /// Release icons which are hold only by this manager + /// May change texture and position of icons. + /// + void release(); + +private: + // keep data stored on GPU + GLTexture m_icons_texture; + + unsigned int m_id{ 0 }; + Icons m_icons; +}; + +/// +/// Draw imgui image with icon +/// +/// Place in texture +/// [optional]Size of image, wen zero than use same size as stored texture +/// viz ImGui::Image +/// viz ImGui::Image +void draw(const IconManager::Icon &icon, + const ImVec2 &size = ImVec2(0, 0), + const ImVec4 &tint_col = ImVec4(1, 1, 1, 1), + const ImVec4 &border_col = ImVec4(0, 0, 0, 0)); + +/// +/// Draw icon which change on hover +/// +/// Draw when no hover +/// Draw when hover +/// True when click, otherwise False +bool clickable(const IconManager::Icon &icon, const IconManager::Icon &icon_hover); + +/// +/// Use icon as button with 3 states activ hover and disabled +/// +/// Not disabled not hovered image +/// Hovered image +/// Disabled image +/// True when click on enabled, otherwise False +bool button(const IconManager::Icon &activ, const IconManager::Icon &hover, const IconManager::Icon &disable, bool disabled = false); + +} // namespace Slic3r::GUI +#endif // slic3r_IconManager_hpp_ \ No newline at end of file diff --git a/src/slic3r/GUI/ImGuiWrapper.cpp b/src/slic3r/GUI/ImGuiWrapper.cpp index 835e718bd1..c385662f91 100644 --- a/src/slic3r/GUI/ImGuiWrapper.cpp +++ b/src/slic3r/GUI/ImGuiWrapper.cpp @@ -520,9 +520,24 @@ void ImGuiWrapper::render() m_new_frame_open = false; } +ImVec2 ImGuiWrapper::calc_text_size(std::string_view text, + bool hide_text_after_double_hash, + float wrap_width) +{ + return ImGui::CalcTextSize(text.data(), text.data() + text.length(), + hide_text_after_double_hash, wrap_width); +} + +ImVec2 ImGuiWrapper::calc_text_size(const std::string& text, + bool hide_text_after_double_hash, + float wrap_width) +{ + return ImGui::CalcTextSize(text.c_str(), NULL, hide_text_after_double_hash, wrap_width); +} + ImVec2 ImGuiWrapper::calc_text_size(const wxString &text, bool hide_text_after_double_hash, - float wrap_width) const + float wrap_width) { auto text_utf8 = into_u8(text); ImVec2 size = ImGui::CalcTextSize(text_utf8.c_str(), NULL, hide_text_after_double_hash, wrap_width); @@ -585,8 +600,8 @@ bool ImGuiWrapper::bbl_combo_with_filter(const char* label, const std::string& p static char pattern_buffer[256] = { 0 }; auto simple_match = [](const char* pattern, const char* str) { - wxString sub_str = wxString(pattern).Lower(); - wxString main_str = wxString(str).Lower(); + wxString sub_str = wxString::FromUTF8(pattern).Lower(); + wxString main_str = wxString::FromUTF8(str).Lower(); return main_str.Find(sub_str); }; @@ -911,13 +926,13 @@ void ImGuiWrapper::text(const char *label) void ImGuiWrapper::text(const std::string &label) { - this->text(label.c_str()); + ImGuiWrapper::text(label.c_str()); } void ImGuiWrapper::text(const wxString &label) { auto label_utf8 = into_u8(label); - this->text(label_utf8.c_str()); + ImGuiWrapper::text(label_utf8.c_str()); } void ImGuiWrapper::text_colored(const ImVec4& color, const char* label) @@ -927,13 +942,13 @@ void ImGuiWrapper::text_colored(const ImVec4& color, const char* label) void ImGuiWrapper::text_colored(const ImVec4& color, const std::string& label) { - this->text_colored(color, label.c_str()); + ImGuiWrapper::text_colored(color, label.c_str()); } void ImGuiWrapper::text_colored(const ImVec4& color, const wxString& label) { auto label_utf8 = into_u8(label); - this->text_colored(color, label_utf8.c_str()); + ImGuiWrapper::text_colored(color, label_utf8.c_str()); } void ImGuiWrapper::text_wrapped(const char *label, float wrap_width) @@ -1940,6 +1955,364 @@ ColorRGBA ImGuiWrapper::from_ImVec4(const ImVec4& color) return { color.x, color.y, color.z, color.w }; } +template +static bool input_optional(std::optional &v, Func& f, std::function is_default, const T& def_val) +{ + if (v.has_value()) { + if (f(*v)) { + if (is_default(*v)) v.reset(); + return true; + } + } else { + T val = def_val; + if (f(val)) { + if (!is_default(val)) v = val; + return true; + } + } + return false; +} + +bool ImGuiWrapper::input_optional_int(const char * label, + std::optional& v, + int step, + int step_fast, + ImGuiInputTextFlags flags, + int def_val) +{ + auto func = [&](int &value) { + return ImGui::InputInt(label, &value, step, step_fast, flags); + }; + std::function is_default = + [def_val](const int &value) -> bool { return value == def_val; }; + return input_optional(v, func, is_default, def_val); +} + +bool ImGuiWrapper::input_optional_float(const char * label, + std::optional &v, + float step, + float step_fast, + const char * format, + ImGuiInputTextFlags flags, + float def_val) +{ + auto func = [&](float &value) { + return ImGui::InputFloat(label, &value, step, step_fast, format, flags); + }; + std::function is_default = + [def_val](const float &value) -> bool { + return std::fabs(value-def_val) <= std::numeric_limits::epsilon(); + }; + return input_optional(v, func, is_default, def_val); +} + +bool ImGuiWrapper::drag_optional_float(const char * label, + std::optional &v, + float v_speed, + float v_min, + float v_max, + const char * format, + float power, + float def_val) +{ + auto func = [&](float &value) { + return ImGui::DragFloat(label, &value, v_speed, v_min, v_max, format, power); + }; + std::function is_default = + [def_val](const float &value) -> bool { + return std::fabs(value-def_val) <= std::numeric_limits::epsilon(); + }; + return input_optional(v, func, is_default, def_val); +} + +bool ImGuiWrapper::slider_optional_float(const char *label, + std::optional &v, + float v_min, + float v_max, + const char *format, + float power, + bool clamp, + const wxString &tooltip, + bool show_edit_btn, + float def_val) +{ + auto func = [&](float &value) { + return slider_float(label, &value, v_min, v_max, format, power, clamp, tooltip, show_edit_btn); + }; + std::function is_default = + [def_val](const float &value) -> bool { + return std::fabs(value - def_val) <= std::numeric_limits::epsilon(); + }; + return input_optional(v, func, is_default, def_val); +} + +bool ImGuiWrapper::slider_optional_int(const char *label, + std::optional &v, + int v_min, + int v_max, + const char *format, + float power, + bool clamp, + const wxString &tooltip, + bool show_edit_btn, + int def_val) +{ + std::optional val; + if (v.has_value()) val = static_cast(*v); + auto func = [&](float &value) { + return slider_float(label, &value, v_min, v_max, format, power, clamp, tooltip, show_edit_btn); + }; + std::function is_default = + [def_val](const float &value) -> bool { + return std::fabs(value - def_val) < 0.9f; + }; + + float default_value = static_cast(def_val); + if (input_optional(val, func, is_default, default_value)) { + if (val.has_value()) + v = static_cast(std::round(*val)); + else + v.reset(); + return true; + } else return false; +} + +std::optional ImGuiWrapper::change_window_position(const char *window_name, bool try_to_fix) { + ImGuiWindow *window = ImGui::FindWindowByName(window_name); + // is window just created + if (window == NULL) + return {}; + + // position of window on screen + ImVec2 position = window->Pos; + ImVec2 size = window->SizeFull; + + // screen size + ImVec2 screen = ImGui::GetMainViewport()->Size; + + std::optional output_window_offset; + if (position.x < 0) { + if (position.y < 0) + // top left + output_window_offset = ImVec2(0, 0); + else + // only left + output_window_offset = ImVec2(0, position.y); + } else if (position.y < 0) { + // only top + output_window_offset = ImVec2(position.x, 0); + } else if (screen.x < (position.x + size.x)) { + if (screen.y < (position.y + size.y)) + // right bottom + output_window_offset = ImVec2(screen.x - size.x, screen.y - size.y); + else + // only right + output_window_offset = ImVec2(screen.x - size.x, position.y); + } else if (screen.y < (position.y + size.y)) { + // only bottom + output_window_offset = ImVec2(position.x, screen.y - size.y); + } + + if (!try_to_fix && output_window_offset.has_value()) + output_window_offset = ImVec2(-1, -1); // Put on default position + + return output_window_offset; +} + +void ImGuiWrapper::left_inputs() { + ImGui::ClearActiveID(); +} + +std::string ImGuiWrapper::trunc(const std::string &text, + float width, + const char * tail) +{ + float text_width = ImGui::CalcTextSize(text.c_str()).x; + if (text_width < width) return text; + float tail_width = ImGui::CalcTextSize(tail).x; + assert(width > tail_width); + if (width <= tail_width) return "Error: Can't add tail and not be under wanted width."; + float allowed_width = width - tail_width; + + // guess approx count of letter + float average_letter_width = calc_text_size(std::string_view("n")).x; // average letter width + unsigned count_letter = static_cast(allowed_width / average_letter_width); + + std::string_view text_ = text; + std::string_view result_text = text_.substr(0, count_letter); + text_width = calc_text_size(result_text).x; + if (text_width < allowed_width) { + // increase letter count + while (count_letter < text.length()) { + ++count_letter; + std::string_view act_text = text_.substr(0, count_letter); + text_width = calc_text_size(act_text).x; + if (text_width > allowed_width) break; + result_text = act_text; + } + } else { + // decrease letter count + while (count_letter > 1) { + --count_letter; + result_text = text_.substr(0, count_letter); + text_width = calc_text_size(result_text).x; + if (text_width < allowed_width) break; + } + } + return std::string(result_text) + tail; +} + +void ImGuiWrapper::escape_double_hash(std::string &text) +{ + // add space between hashes + const std::string search = "##"; + const std::string replace = "# #"; + size_t pos = 0; + while ((pos = text.find(search, pos)) != std::string::npos) + text.replace(pos, search.length(), replace); +} + +ImVec2 ImGuiWrapper::suggest_location(const ImVec2 &dialog_size, + const Slic3r::Polygon &interest, + const ImVec2 &canvas_size) +{ + // IMPROVE 1: do not select place over menu + // BoundingBox top_menu; + // GLGizmosManager &gizmo_mng = canvas->get_gizmos_manager(); + // BoundingBox side_menu; // gizmo_mng.get_size(); + // BoundingBox left_bottom_menu; // is permanent? + // NotificationManager *notify_mng = plater->get_notification_manager(); + // BoundingBox notifications; // notify_mng->get_size(); + // m_window_width, m_window_height + position + + // IMPROVE 2: use polygon of interest not only bounding box + BoundingBox bb(interest.points); + Point center = bb.center(); // interest.centroid(); + + // area size + Point window_center(canvas_size.x / 2, canvas_size.y / 2); + + // mov on side + Point bb_half_size = (bb.max - bb.min) / 2 + Point(1,1); + Point diff_center = window_center - center; + Vec2d diff_norm(diff_center.x() / (double) bb_half_size.x(), + diff_center.y() / (double) bb_half_size.y()); + if (diff_norm.x() > 1.) diff_norm.x() = 1.; + if (diff_norm.x() < -1.) diff_norm.x() = -1.; + if (diff_norm.y() > 1.) diff_norm.y() = 1.; + if (diff_norm.y() < -1.) diff_norm.y() = -1.; + + Vec2d abs_diff(abs(diff_norm.x()), abs(diff_norm.y())); + if (abs_diff.x() < 1. && abs_diff.y() < 1.) { + if (abs_diff.x() > abs_diff.y()) + diff_norm.x() = (diff_norm.x() < 0.) ? (-1.) : 1.; + else + diff_norm.y() = (diff_norm.y() < 0.) ? (-1.) : 1.; + } + + Point half_dialog_size(dialog_size.x / 2., dialog_size.y / 2.); + Point move_size = bb_half_size + half_dialog_size; + Point offseted_center = center - half_dialog_size; + Vec2d offset(offseted_center.x() + diff_norm.x() * move_size.x(), + offseted_center.y() + diff_norm.y() * move_size.y()); + + // move offset close to center + Points window_polygon = {offset.cast(), + Point(offset.x(), offset.y() + dialog_size.y), + Point(offset.x() + dialog_size.x, + offset.y() + dialog_size.y), + Point(offset.x() + dialog_size.x, offset.y())}; + // check that position by Bounding box is not intersecting + assert(Slic3r::intersection(interest, Polygon(window_polygon)).empty()); + + double allowed_space = 10; // in px + double allowed_space_sq = allowed_space * allowed_space; + Vec2d move_vec = (center - (offset.cast() + half_dialog_size)) + .cast(); + Vec2d result_move(0, 0); + do { + move_vec = move_vec / 2.; + Point move_point = (move_vec + result_move).cast(); + Points moved_polygon = window_polygon; // copy + for (Point &p : moved_polygon) p += move_point; + if (Slic3r::intersection(interest, Polygon(moved_polygon)).empty()) + result_move += move_vec; + + } while (move_vec.squaredNorm() >= allowed_space_sq); + offset += result_move; + + return ImVec2(offset.x(), offset.y()); +} + +void ImGuiWrapper::draw( + const Polygon &polygon, + ImDrawList * draw_list /* = ImGui::GetOverlayDrawList()*/, + ImU32 color /* = ImGui::GetColorU32(COL_ORANGE_LIGHT)*/, + float thickness /* = 3.f*/) +{ + // minimal one line consist of 2 points + if (polygon.size() < 2) return; + // need a place to draw + if (draw_list == nullptr) return; + + const Point *prev_point = &polygon.points.back(); + for (const Point &point : polygon.points) { + ImVec2 p1(prev_point->x(), prev_point->y()); + ImVec2 p2(point.x(), point.y()); + draw_list->AddLine(p1, p2, color, thickness); + prev_point = &point; + } +} + +void ImGuiWrapper::draw_cross_hair(const ImVec2 &position, float radius, ImU32 color, int num_segments, float thickness) { + auto draw_list = ImGui::GetOverlayDrawList(); + draw_list->AddCircle(position, radius, color, num_segments, thickness); + auto dirs = {ImVec2{0, 1}, ImVec2{1, 0}, ImVec2{0, -1}, ImVec2{-1, 0}}; + for (const ImVec2 &dir : dirs) { + ImVec2 start(position.x + dir.x * 0.5 * radius, position.y + dir.y * 0.5 * radius); + ImVec2 end(position.x + dir.x * 1.5 * radius, position.y + dir.y * 1.5 * radius); + draw_list->AddLine(start, end, color, thickness); + } +} + +bool ImGuiWrapper::contain_all_glyphs(const ImFont *font, + const std::string &text) +{ + if (font == nullptr) return false; + if (!font->IsLoaded()) return false; + const ImFontConfig *fc = font->ConfigData; + if (fc == nullptr) return false; + if (text.empty()) return true; + return is_chars_in_ranges(fc->GlyphRanges, text.c_str()); +} + +bool ImGuiWrapper::is_char_in_ranges(const ImWchar *ranges, + unsigned int letter) +{ + for (const ImWchar *range = ranges; range[0] && range[1]; range += 2) { + ImWchar from = range[0]; + ImWchar to = range[1]; + if (from <= letter && letter <= to) return true; + if (letter < to) return false; // ranges should be sorted + } + return false; +}; + +bool ImGuiWrapper::is_chars_in_ranges(const ImWchar *ranges, + const char *chars_ptr) +{ + while (*chars_ptr) { + unsigned int c = 0; + // UTF-8 to 32-bit character need imgui_internal + int c_len = ImTextCharFromUtf8(&c, chars_ptr, NULL); + chars_ptr += c_len; + if (c_len == 0) break; + if (!is_char_in_ranges(ranges, c)) return false; + } + return true; +} + + #ifdef __APPLE__ static const ImWchar ranges_keyboard_shortcuts[] = { @@ -2204,20 +2577,20 @@ void ImGuiWrapper::push_combo_style(const float scale) ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 1.0f * scale); ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0f * scale); ImGui::PushStyleColor(ImGuiCol_PopupBg, ImGuiWrapper::COL_WINDOW_BG_DARK); - ImGui::PushStyleColor(ImGuiCol_BorderActive, ImVec4(0.00f, 0.68f, 0.26f, 1.00f)); - ImGui::PushStyleColor(ImGuiCol_HeaderHovered, ImVec4(0.00f, 0.68f, 0.26f, 0.0f)); - ImGui::PushStyleColor(ImGuiCol_HeaderActive, ImVec4(0.00f, 0.68f, 0.26f, 1.0f)); - ImGui::PushStyleColor(ImGuiCol_Header, ImVec4(0.00f, 0.68f, 0.26f, 1.0f)); + ImGui::PushStyleColor(ImGuiCol_BorderActive, COL_ORCA); + ImGui::PushStyleColor(ImGuiCol_HeaderHovered, to_ImVec4(to_rgba(ColorRGB::ORCA(), 0.5f))); + ImGui::PushStyleColor(ImGuiCol_HeaderActive, COL_ORCA); + ImGui::PushStyleColor(ImGuiCol_Header, COL_ORCA); ImGui::PushStyleColor(ImGuiCol_ScrollbarBg, ImGuiWrapper::COL_WINDOW_BG_DARK); ImGui::PushStyleColor(ImGuiCol_Button, {1.00f, 1.00f, 1.00f, 0.0f}); } else { ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 1.0f * scale); ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0f * scale); ImGui::PushStyleColor(ImGuiCol_PopupBg, ImGuiWrapper::COL_WINDOW_BG); - ImGui::PushStyleColor(ImGuiCol_BorderActive, ImVec4(0.00f, 0.68f, 0.26f, 1.00f)); - ImGui::PushStyleColor(ImGuiCol_HeaderHovered, ImVec4(0.00f, 0.68f, 0.26f, 0.5f)); - ImGui::PushStyleColor(ImGuiCol_HeaderActive, ImVec4(0.00f, 0.68f, 0.26f, 1.0f)); - ImGui::PushStyleColor(ImGuiCol_Header, ImVec4(0.00f, 0.68f, 0.26f, 1.0f)); + ImGui::PushStyleColor(ImGuiCol_BorderActive, COL_ORCA); + ImGui::PushStyleColor(ImGuiCol_HeaderHovered, to_ImVec4(to_rgba(ColorRGB::ORCA(), 0.5f))); + ImGui::PushStyleColor(ImGuiCol_HeaderActive, COL_ORCA); + ImGui::PushStyleColor(ImGuiCol_Header, COL_ORCA); ImGui::PushStyleColor(ImGuiCol_ScrollbarBg, ImGuiWrapper::COL_WINDOW_BG); ImGui::PushStyleColor(ImGuiCol_Button, {1.00f, 1.00f, 1.00f, 0.0f}); } @@ -2229,6 +2602,20 @@ void ImGuiWrapper::pop_combo_style() ImGui::PopStyleColor(7); } +void ImGuiWrapper::push_radio_style() +{ + if (m_is_dark_mode) { + ImGui::PushStyleColor(ImGuiCol_CheckMark, ImVec4(1.00f, 1.00f, 1.00f, 1.00f)); + } else { + ImGui::PushStyleColor(ImGuiCol_CheckMark, ImVec4(0.00f, 0.00f, 0.00f, 1.00f)); + } +} + +void ImGuiWrapper::pop_radio_style() +{ + ImGui::PopStyleColor(1); +} + void ImGuiWrapper::init_font(bool compress) { destroy_font(); diff --git a/src/slic3r/GUI/ImGuiWrapper.hpp b/src/slic3r/GUI/ImGuiWrapper.hpp index f3e8e34671..07ca509909 100644 --- a/src/slic3r/GUI/ImGuiWrapper.hpp +++ b/src/slic3r/GUI/ImGuiWrapper.hpp @@ -13,10 +13,11 @@ #include #include "libslic3r/Point.hpp" +#include "libslic3r/Color.hpp" +#include "libslic3r/Polygon.hpp" #include "libslic3r/GCode/ThumbnailData.hpp" namespace Slic3r { -class ColorRGBA; namespace Search { struct OptionViewParameters; } // namespace Search @@ -95,13 +96,19 @@ public: float get_font_size() const { return m_font_size; } float get_style_scaling() const { return m_style_scaling; } + const ImWchar *get_glyph_ranges() const { return m_glyph_ranges; } // language specific void new_frame(); void render(); float scaled(float x) const { return x * m_font_size; } ImVec2 scaled(float x, float y) const { return ImVec2(x * m_font_size, y * m_font_size); } - ImVec2 calc_text_size(const wxString &text, bool hide_text_after_double_hash = false, float wrap_width = -1.0f) const; + /// + /// Extend ImGui::CalcTextSize to use string_view + /// + static ImVec2 calc_text_size(std::string_view text, bool hide_text_after_double_hash = false, float wrap_width = -1.0f); + static ImVec2 calc_text_size(const std::string& text, bool hide_text_after_double_hash = false, float wrap_width = -1.0f); + static ImVec2 calc_text_size(const wxString &text, bool hide_text_after_double_hash = false, float wrap_width = -1.0f); ImVec2 calc_button_size(const wxString &text, const ImVec2 &button_size = ImVec2(0, 0)) const; ImVec2 get_item_spacing() const; @@ -137,12 +144,12 @@ public: bool bbl_checkbox(const wxString &label, bool &value); bool bbl_radio_button(const char *label, bool active); bool bbl_sliderin(const char *label, int *v, int v_min, int v_max, const char *format = "%d", ImGuiSliderFlags flags = 0); - void text(const char *label); - void text(const std::string &label); - void text(const wxString &label); - void text_colored(const ImVec4& color, const char* label); - void text_colored(const ImVec4& color, const std::string& label); - void text_colored(const ImVec4& color, const wxString& label); + static void text(const char *label); + static void text(const std::string &label); + static void text(const wxString &label); + static void text_colored(const ImVec4& color, const char* label); + static void text_colored(const ImVec4& color, const std::string& label); + static void text_colored(const ImVec4& color, const wxString& label); void text_wrapped(const char *label, float wrap_width); void text_wrapped(const std::string &label, float wrap_width); void text_wrapped(const wxString &label, float wrap_width); @@ -196,11 +203,109 @@ public: bool want_text_input() const; bool want_any_input() const; -#if ENABLE_ENHANCED_IMGUI_SLIDER_FLOAT + // Optional inputs are used for set up value inside of an optional, with default value + // + // Extended function ImGui::InputInt to work with std::optional, when value == def_val optional is released. + static bool input_optional_int(const char *label, std::optional& v, int step=1, int step_fast=100, ImGuiInputTextFlags flags=0, int def_val = 0); + // Extended function ImGui::InputFloat to work with std::optional value near def_val cause release of optional + static bool input_optional_float(const char* label, std::optional &v, float step = 0.0f, float step_fast = 0.0f, const char* format = "%.3f", ImGuiInputTextFlags flags = 0, float def_val = .0f); + // Extended function ImGui::DragFloat to work with std::optional value near def_val cause release of optional + static bool drag_optional_float(const char* label, std::optional &v, float v_speed, float v_min, float v_max, const char* format, float power, float def_val = .0f); + // Extended function ImGuiWrapper::slider_float to work with std::optional value near def_val cause release of optional + bool slider_optional_float(const char* label, std::optional &v, float v_min, float v_max, const char* format = "%.3f", float power = 1.0f, bool clamp = true, const wxString& tooltip = {}, bool show_edit_btn = true, float def_val = .0f); + // Extended function ImGuiWrapper::slider_float to work with std::optional, when value == def_val than optional release its value + bool slider_optional_int(const char* label, std::optional &v, int v_min, int v_max, const char* format = "%.3f", float power = 1.0f, bool clamp = true, const wxString& tooltip = {}, bool show_edit_btn = true, int def_val = 0); + + /// + /// Change position of imgui window + /// + /// ImGui identifier of window + /// [output] optional + /// When True Only move to be full visible otherwise reset position + /// New offset of window for function ImGui::SetNextWindowPos + static std::optional change_window_position(const char *window_name, bool try_to_fix); + + /// + /// Use ImGui internals to unactivate (lose focus) in input. + /// When input is activ it can't change value by application. + /// + static void left_inputs(); + + /// + /// Truncate text by ImGui draw function to specific width + /// NOTE 1: ImGui must be initialized + /// NOTE 2: Calculation for actual acive imgui font + /// + /// Text to be truncated + /// Maximal width before truncate + /// String puted on end of text to be visible truncation + /// Truncated text + static std::string trunc(const std::string &text, + float width, + const char *tail = " .."); + + /// + /// Escape ## in data by add space between hashes + /// Needed when user written text is visualized by ImGui. + /// + /// In/Out text to be escaped + static void escape_double_hash(std::string &text); + + /// + /// Suggest loacation of dialog window, + /// dependent on actual visible thing on platter + /// like Gizmo menu size, notifications, ... + /// To be near of polygon interest and not over it. + /// And also not out of visible area. + /// + /// Define width and height of diaog window + /// Area of interest. Result should be close to it + /// Available space a.k.a GLCanvas3D::get_current_canvas3D() + /// Suggestion for dialog offest + static ImVec2 suggest_location(const ImVec2 &dialog_size, + const Slic3r::Polygon &interest, + const ImVec2 &canvas_size); + + /// + /// Visualization of polygon + /// + /// Define what to draw + /// Define where to draw it + /// Color of polygon + /// Width of polygon line + static void draw(const Polygon &polygon, + ImDrawList * draw_list = ImGui::GetOverlayDrawList(), + ImU32 color = ImGui::GetColorU32(COL_ORANGE_LIGHT), + float thickness = 3.f); + + /// + /// Draw symbol of cross hair + /// + /// Center of cross hair + /// Circle radius + /// Color of symbol + /// Precission of circle + /// Thickness of Line in symbol + static void draw_cross_hair(const ImVec2 &position, + float radius = 16.f, + ImU32 color = ImGui::GetColorU32(ImVec4(1.f, 1.f, 1.f, .75f)), + int num_segments = 0, + float thickness = 4.f); + + /// + /// Check that font ranges contain all chars in string + /// (rendered Unicodes are stored in GlyphRanges) + /// + /// Contain glyph ranges + /// Vector of character to check + /// True when all glyphs from text are in font ranges + static bool contain_all_glyphs(const ImFont *font, const std::string &text); + static bool is_chars_in_ranges(const ImWchar *ranges, const char *chars_ptr); + static bool is_char_in_ranges(const ImWchar *ranges, unsigned int letter); + bool requires_extra_frame() const { return m_requires_extra_frame; } void set_requires_extra_frame() { m_requires_extra_frame = true; } void reset_requires_extra_frame() { m_requires_extra_frame = false; } -#endif // ENABLE_ENHANCED_IMGUI_SLIDER_FLOAT void disable_background_fadeout_animation(); @@ -248,6 +353,8 @@ public: static void pop_button_disable_style(); static void push_combo_style(const float scale); static void pop_combo_style(); + static void push_radio_style(); + static void pop_radio_style(); //BBS static int TOOLBAR_WINDOW_FLAGS; diff --git a/src/slic3r/GUI/Jobs/ArrangeJob.cpp b/src/slic3r/GUI/Jobs/ArrangeJob.cpp index e4c45f4292..5b73b62949 100644 --- a/src/slic3r/GUI/Jobs/ArrangeJob.cpp +++ b/src/slic3r/GUI/Jobs/ArrangeJob.cpp @@ -1,3 +1,7 @@ +///|/ Copyright (c) Prusa Research 2020 - 2023 Tomáš Mészáros @tamasmeszaros, Enrico Turri @enricoturri1966, Vojtěch Bubník @bubnikv, David Kocík @kocikdav, Filip Sykala @Jony01, Lukáš Matěna @lukasmatena +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ #include "ArrangeJob.hpp" #include "libslic3r/BuildVolume.hpp" @@ -509,21 +513,12 @@ void ArrangeJob::check_unprintable() } } -void ArrangeJob::on_exception(const std::exception_ptr &eptr) +void ArrangeJob::process(Ctl &ctl) { - try { - if (eptr) - std::rethrow_exception(eptr); - } catch (libnest2d::GeometryException &) { - show_error(m_plater, _(L("Arrange failed. " - "Found some exceptions when processing object geometries."))); - } catch (std::exception &) { - PlaterJob::on_exception(eptr); - } -} + static const auto arrangestr = _u8L("Arranging"); + ctl.update_status(0, arrangestr); + ctl.call_on_main_thread([this]{ prepare(); }).wait();; -void ArrangeJob::process() -{ auto & partplate_list = m_plater->get_partplate_list(); const Slic3r::DynamicPrintConfig& global_config = wxGetApp().preset_bundle->full_config(); @@ -543,10 +538,10 @@ void ArrangeJob::process() BOOST_LOG_TRIVIAL(debug) << "arrange bedpts:" << bedpts[0].transpose() << ", " << bedpts[1].transpose() << ", " << bedpts[2].transpose() << ", " << bedpts[3].transpose(); - params.stopcondition = [this]() { return was_canceled(); }; + params.stopcondition = [&ctl]() { return ctl.was_canceled(); }; - params.progressind = [this](unsigned num_finished, std::string str = "") { - update_status(num_finished, _L("Arranging") + " "+ wxString::FromUTF8(str)); + params.progressind = [this, &ctl](unsigned num_finished, std::string str = "") { + ctl.update_status(num_finished * 100 / status_range(), _u8L("Arranging") + str); }; { @@ -590,11 +585,13 @@ void ArrangeJob::process() } // finalize just here. - update_status(status_range(), - was_canceled() ? _(L("Arranging canceled.")) : - we_have_unpackable_items ? _(L("Arranging is done but there are unpacked items. Reduce spacing and try again.")) : _(L("Arranging done."))); + ctl.update_status(100, + ctl.was_canceled() ? _u8L("Arranging canceled.") : + we_have_unpackable_items ? _u8L("Arranging is done but there are unpacked items. Reduce spacing and try again.") : _u8L("Arranging done.")); } +ArrangeJob::ArrangeJob() : m_plater{wxGetApp().plater()} { } + static std::string concat_strings(const std::set &strings, const std::string &delim = "\n") { @@ -605,9 +602,20 @@ static std::string concat_strings(const std::set &strings, }); } -void ArrangeJob::finalize() { - // Ignore the arrange result if aborted. - if (was_canceled()) return; +void ArrangeJob::finalize(bool canceled, std::exception_ptr &eptr) { + try { + if (eptr) + std::rethrow_exception(eptr); + } catch (libnest2d::GeometryException &) { + show_error(m_plater, _(L("Arrange failed. " + "Found some exceptions when processing object geometries."))); + eptr = nullptr; + } catch (...) { + eptr = std::current_exception(); + } + + if (canceled || eptr) + return; // Unprintable items go to the last virtual bed int beds = 0; @@ -716,7 +724,6 @@ void ArrangeJob::finalize() { m_plater->update(); - Job::finalize(); m_plater->m_arrange_running.store(false); } diff --git a/src/slic3r/GUI/Jobs/ArrangeJob.hpp b/src/slic3r/GUI/Jobs/ArrangeJob.hpp index 717fd38b26..6b3364236d 100644 --- a/src/slic3r/GUI/Jobs/ArrangeJob.hpp +++ b/src/slic3r/GUI/Jobs/ArrangeJob.hpp @@ -1,10 +1,15 @@ +///|/ Copyright (c) Prusa Research 2020 - 2023 Tomáš Mészáros @tamasmeszaros, David Kocík @kocikdav +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ #ifndef ARRANGEJOB_HPP #define ARRANGEJOB_HPP -#include "PlaterJob.hpp" -#include "slic3r/GUI/Plater.hpp" + +#include + +#include "Job.hpp" #include "libslic3r/Arrange.hpp" -#include "libslic3r/Model.hpp" namespace Slic3r { @@ -12,7 +17,9 @@ class ModelInstance; namespace GUI { -class ArrangeJob : public PlaterJob +class Plater; + +class ArrangeJob : public Job { using ArrangePolygon = arrangement::ArrangePolygon; using ArrangePolygons = arrangement::ArrangePolygons; @@ -24,6 +31,10 @@ class ArrangeJob : public PlaterJob arrangement::ArrangeParams params; int current_plate_index = 0; Polygon bed_poly; + Plater *m_plater; + + // BBS: add flag for whether on current part plate + bool only_on_partplate{false}; // clear m_selected and m_unselected, reserve space for next usage void clear_input(); @@ -42,26 +53,23 @@ class ArrangeJob : public PlaterJob protected: - void prepare() override; - void check_unprintable(); - void on_exception(const std::exception_ptr &) override; - - void process() override; - public: - ArrangeJob(std::shared_ptr pri, Plater *plater) - : PlaterJob{std::move(pri), plater} - {} - int status_range() const override + void prepare(); + + void process(Ctl &ctl) override; + + ArrangeJob(); + + int status_range() const { // ensure finalize() is called after all operations in process() is finished. return int(m_selected.size() + m_unprintable.size() + 1); } - void finalize() override; + void finalize(bool canceled, std::exception_ptr &e) override; }; std::optional get_wipe_tower_arrangepoly(const Plater &); diff --git a/src/slic3r/GUI/Jobs/BindJob.cpp b/src/slic3r/GUI/Jobs/BindJob.cpp index 9534128af9..26e20d867e 100644 --- a/src/slic3r/GUI/Jobs/BindJob.cpp +++ b/src/slic3r/GUI/Jobs/BindJob.cpp @@ -12,12 +12,12 @@ wxDEFINE_EVENT(EVT_BIND_MACHINE_SUCCESS, wxCommandEvent); wxDEFINE_EVENT(EVT_BIND_MACHINE_FAIL, wxCommandEvent); -static wxString waiting_auth_str = _L("Logging in"); -static wxString login_failed_str = _L("Login failed"); +static auto waiting_auth_str = _u8L("Logging in"); +static auto login_failed_str = _u8L("Login failed"); -BindJob::BindJob(std::shared_ptr pri, Plater *plater, std::string dev_id, std::string dev_ip, std::string sec_link) - : PlaterJob{std::move(pri), plater}, +BindJob::BindJob(std::string dev_id, std::string dev_ip, std::string sec_link) + : m_dev_id(dev_id), m_dev_ip(dev_ip), m_sec_link(sec_link) @@ -25,37 +25,27 @@ BindJob::BindJob(std::shared_ptr pri, Plater *plater, std::st ; } -void BindJob::on_exception(const std::exception_ptr &eptr) -{ - try { - if (eptr) - std::rethrow_exception(eptr); - } catch (std::exception &e) { - PlaterJob::on_exception(eptr); - } -} - void BindJob::on_success(std::function success) { m_success_fun = success; } -void BindJob::update_status(int st, const wxString &msg) +void BindJob::update_status(Ctl &ctl, int st, const std::string &msg) { - GUI::Job::update_status(st, msg); + ctl.update_status(st, msg); wxCommandEvent event(EVT_BIND_UPDATE_MESSAGE); event.SetString(msg); event.SetEventObject(m_event_handle); wxPostEvent(m_event_handle, event); } -void BindJob::process() +void BindJob::process(Ctl &ctl) { int result_code = 0; std::string result_info; /* display info */ - wxString msg = waiting_auth_str; + auto msg = waiting_auth_str; int curr_percent = 0; NetworkAgent* m_agent = wxGetApp().getAgent(); @@ -67,40 +57,40 @@ void BindJob::process() std::string timezone = get_timezone_utc_hm(offset); int result = m_agent->bind(m_dev_ip, m_dev_id, m_sec_link, timezone, m_improved, - [this, &curr_percent, &msg, &result_code, &result_info](int stage, int code, std::string info) { + [this, &ctl, &curr_percent, &msg, &result_code, &result_info](int stage, int code, std::string info) { result_code = code; result_info = info; if (stage == BBL::BindJobStage::LoginStageConnect) { curr_percent = 15; - msg = _L("Logging in"); + msg = _u8L("Logging in"); } else if (stage == BBL::BindJobStage::LoginStageLogin) { curr_percent = 30; - msg = _L("Logging in"); + msg = _u8L("Logging in"); } else if (stage == BBL::BindJobStage::LoginStageWaitForLogin) { curr_percent = 45; - msg = _L("Logging in"); + msg = _u8L("Logging in"); } else if (stage == BBL::BindJobStage::LoginStageGetIdentify) { curr_percent = 60; - msg = _L("Logging in"); + msg = _u8L("Logging in"); } else if (stage == BBL::BindJobStage::LoginStageWaitAuth) { curr_percent = 80; - msg = _L("Logging in"); + msg = _u8L("Logging in"); } else if (stage == BBL::BindJobStage::LoginStageFinished) { curr_percent = 100; - msg = _L("Logging in"); + msg = _u8L("Logging in"); } else { - msg = _L("Logging in"); + msg = _u8L("Logging in"); } if (code != 0) { - msg = _L("Login failed"); + msg = _u8L("Login failed"); if (code == BAMBU_NETWORK_ERR_TIMEOUT) { - msg += _L("Please check the printer network connection."); + msg += _u8L("Please check the printer network connection."); } } - update_status(curr_percent, msg); + update_status(ctl, curr_percent, msg); } ); @@ -138,11 +128,18 @@ void BindJob::process() return; } -void BindJob::finalize() +void BindJob::finalize(bool canceled, std::exception_ptr &eptr) { - if (was_canceled()) return; + try { + if (eptr) + std::rethrow_exception(eptr); + eptr = nullptr; + } catch (...) { + eptr = std::current_exception(); + } - Job::finalize(); + if (canceled || eptr) + return; } void BindJob::set_event_handle(wxWindow *hanle) diff --git a/src/slic3r/GUI/Jobs/BindJob.hpp b/src/slic3r/GUI/Jobs/BindJob.hpp index 0215834fa6..b0bc4d818d 100644 --- a/src/slic3r/GUI/Jobs/BindJob.hpp +++ b/src/slic3r/GUI/Jobs/BindJob.hpp @@ -3,14 +3,14 @@ #include #include -#include "PlaterJob.hpp" +#include "Job.hpp" namespace fs = boost::filesystem; namespace Slic3r { namespace GUI { -class BindJob : public PlaterJob +class BindJob : public Job { wxWindow * m_event_handle{nullptr}; std::function m_success_fun{nullptr}; @@ -21,12 +21,10 @@ class BindJob : public PlaterJob int m_print_job_completed_id = 0; bool m_improved{false}; -protected: - void on_exception(const std::exception_ptr &) override; public: - BindJob(std::shared_ptr pri, Plater *plater, std::string dev_id, std::string dev_ip, std::string sec_link); + BindJob(std::string dev_id, std::string dev_ip, std::string sec_link); - int status_range() const override + int status_range() const { return 100; } @@ -34,9 +32,9 @@ public: bool is_finished() { return m_job_finished; } void on_success(std::function success); - void update_status(int st, const wxString &msg); - void process() override; - void finalize() override; + void update_status(Ctl &ctl, int st, const std::string &msg); + void process(Ctl &ctl) override; + void finalize(bool canceled, std::exception_ptr &eptr) override; void set_event_handle(wxWindow* hanle); void post_fail_event(int code, std::string info); void set_improved(bool improved){m_improved = improved;}; diff --git a/src/slic3r/GUI/Jobs/BoostThreadWorker.cpp b/src/slic3r/GUI/Jobs/BoostThreadWorker.cpp new file mode 100644 index 0000000000..f0ebf7baf4 --- /dev/null +++ b/src/slic3r/GUI/Jobs/BoostThreadWorker.cpp @@ -0,0 +1,186 @@ +///|/ Copyright (c) Prusa Research 2021 Tomáš Mészáros @tamasmeszaros +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ +#include + +#include "BoostThreadWorker.hpp" + +namespace Slic3r { namespace GUI { + +void BoostThreadWorker::WorkerMessage::deliver(BoostThreadWorker &runner) +{ + switch(MsgType(get_type())) { + case Empty: break; + case Status: { + auto info = boost::get(m_data); + if (runner.get_pri()) { + runner.get_pri()->set_progress(info.status); + runner.get_pri()->set_status_text(info.msg.c_str()); + } + break; + } + case Finalize: { + auto& entry = boost::get(m_data); + entry.job->finalize(entry.canceled, entry.eptr); + + // Unhandled exceptions are rethrown without mercy. + if (entry.eptr) + std::rethrow_exception(entry.eptr); + + break; + } + case MainThreadCall: { + auto &calldata = boost::get(m_data); + calldata.fn(); + calldata.promise.set_value(); + + break; + } + } +} + +void BoostThreadWorker::run() +{ + bool stop = false; + while (!stop) { + m_input_queue + .consume_one(BlockingWait{0, &m_running}, [this, &stop](JobEntry &e) { + if (!e.job) + stop = true; + else { + m_canceled.store(false); + + try { + e.job->process(*this); + } catch (...) { + e.eptr = std::current_exception(); + } + + e.canceled = m_canceled.load(); + m_output_queue.push(std::move(e)); // finalization message + } + m_running.store(false); + }); + }; +} + +void BoostThreadWorker::update_status(int st, const std::string &msg) +{ + m_output_queue.push(st, msg); +} + +std::future BoostThreadWorker::call_on_main_thread(std::function fn) +{ + MainThreadCallData cbdata{std::move(fn), {}}; + std::future future = cbdata.promise.get_future(); + + m_output_queue.push(std::move(cbdata)); + + return future; +} + +BoostThreadWorker::BoostThreadWorker(std::shared_ptr pri, + boost::thread::attributes &attribs, + const char * name) + : m_progress(std::move(pri)), m_name{name} +{ + if (m_progress) + m_progress->set_cancel_callback([this](){ cancel(); }); + + m_thread = create_thread(attribs, [this] { this->run(); }); + + std::string nm{name}; + if (!nm.empty()) set_thread_name(m_thread, name); +} + +constexpr int ABORT_WAIT_MAX_MS = 10000; + +BoostThreadWorker::~BoostThreadWorker() +{ + bool joined = false; + try { + cancel_all(); + wait_for_idle(ABORT_WAIT_MAX_MS); + m_input_queue.push(JobEntry{nullptr}); + joined = join(ABORT_WAIT_MAX_MS); + } catch(...) {} + + if (!joined) + BOOST_LOG_TRIVIAL(error) + << "Could not join worker thread '" << m_name << "'"; +} + +bool BoostThreadWorker::join(int timeout_ms) +{ + if (!m_thread.joinable()) + return true; + + if (timeout_ms <= 0) { + m_thread.join(); + } + else if (m_thread.try_join_for(boost::chrono::milliseconds(timeout_ms))) { + return true; + } + else + return false; + + return true; +} + +void BoostThreadWorker::process_events() +{ + while (m_output_queue.consume_one([this](WorkerMessage &msg) { + msg.deliver(*this); + })); +} + +bool BoostThreadWorker::wait_for_current_job(unsigned timeout_ms) +{ + bool ret = true; + + if (!is_idle()) { + bool was_finish = false; + bool timeout_reached = false; + while (!timeout_reached && !was_finish) { + timeout_reached = + !m_output_queue.consume_one(BlockingWait{timeout_ms}, + [this, &was_finish]( + WorkerMessage &msg) { + msg.deliver(*this); + if (msg.get_type() == + WorkerMessage::Finalize) + was_finish = true; + }); + } + + ret = !timeout_reached; + } + + return ret; +} + +bool BoostThreadWorker::wait_for_idle(unsigned timeout_ms) +{ + bool timeout_reached = false; + while (!timeout_reached && !is_idle()) { + timeout_reached = !m_output_queue + .consume_one(BlockingWait{timeout_ms}, + [this](WorkerMessage &msg) { + msg.deliver(*this); + }); + } + + return !timeout_reached; +} + +bool BoostThreadWorker::push(std::unique_ptr job) +{ + if (!job) + return false; + + m_input_queue.push(JobEntry{std::move(job)}); + return true; +} + +}} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/Jobs/BoostThreadWorker.hpp b/src/slic3r/GUI/Jobs/BoostThreadWorker.hpp new file mode 100644 index 0000000000..a4176dd094 --- /dev/null +++ b/src/slic3r/GUI/Jobs/BoostThreadWorker.hpp @@ -0,0 +1,159 @@ +///|/ Copyright (c) Prusa Research 2021 Tomáš Mészáros @tamasmeszaros +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ +#ifndef BOOSTTHREADWORKER_HPP +#define BOOSTTHREADWORKER_HPP + +#include + +#include "Worker.hpp" + +#include +#include + +#include "ThreadSafeQueue.hpp" +#include "slic3r/GUI/GUI.hpp" + +namespace Slic3r { namespace GUI { + +// An implementation of the Worker interface which uses the boost::thread +// API and two thread safe message queues to communicate with the main thread +// back and forth. The queue from the main thread to the worker thread holds the +// job entries that will be performed on the worker. The other queue holds messages +// from the worker to the main thread. These messages include status updates, +// finishing operation and arbitrary functiors that need to be performed +// on the main thread during the jobs execution, like displaying intermediate +// results. +class BoostThreadWorker : public Worker, private Job::Ctl +{ + struct JobEntry // Goes into worker and also out of worker as a finalize msg + { + std::unique_ptr job; + bool canceled = false; + std::exception_ptr eptr = nullptr; + }; + + // A message data for status updates. Only goes from worker to main thread. + struct StatusInfo { int status; std::string msg; }; + + // An arbitrary callback to be called on the main thread. Only from worker + // to main thread. + struct MainThreadCallData + { + std::function fn; + std::promise promise; + }; + + struct EmptyMessage {}; + + class WorkerMessage + { + public: + enum MsgType { Empty, Status, Finalize, MainThreadCall }; + + private: + boost::variant m_data; + + public: + WorkerMessage() = default; + WorkerMessage(int s, std::string txt) + : m_data{StatusInfo{s, std::move(txt)}} + {} + WorkerMessage(JobEntry &&entry) : m_data{std::move(entry)} {} + WorkerMessage(MainThreadCallData fn) : m_data{std::move(fn)} {} + + int get_type () const { return m_data.which(); } + + void deliver(BoostThreadWorker &runner); + }; + + using JobQueue = ThreadSafeQueueSPSC; + using MessageQueue = ThreadSafeQueueSPSC; + + boost::thread m_thread; + std::atomic m_running{false}, m_canceled{false}; + std::shared_ptr m_progress; + JobQueue m_input_queue; // from main thread to worker + MessageQueue m_output_queue; // form worker to main thread + std::string m_name; + + void run(); + + bool join(int timeout_ms = 0); + +protected: + // Implement Job::Ctl interface: + + void update_status(int st, const std::string &msg = "") override; + + bool was_canceled() const override { return m_canceled.load(); } + + std::future call_on_main_thread(std::function fn) override; + +public: + explicit BoostThreadWorker(std::shared_ptr pri, + boost::thread::attributes & attr, + const char * name = ""); + + explicit BoostThreadWorker(std::shared_ptr pri, + boost::thread::attributes && attr, + const char * name = "") + : BoostThreadWorker{std::move(pri), attr, name} + {} + + explicit BoostThreadWorker(std::shared_ptr pri, + const char * name = "") + : BoostThreadWorker{std::move(pri), {}, name} + {} + + ~BoostThreadWorker(); + + BoostThreadWorker(const BoostThreadWorker &) = delete; + BoostThreadWorker(BoostThreadWorker &&) = delete; + BoostThreadWorker &operator=(const BoostThreadWorker &) = delete; + BoostThreadWorker &operator=(BoostThreadWorker &&) = delete; + + bool push(std::unique_ptr job) override; + + bool is_idle() const override + { + // The assumption is that jobs can only be queued from a single main + // thread from which this method is also called. And the output + // messages are also processed only in this calling thread. In that + // case, if the input queue is empty, it will remain so during this + // function call. If the worker thread is also not running and the + // output queue is already processed, we can safely say that the + // worker is dormant. + return m_input_queue.empty() && !m_running.load() && m_output_queue.empty(); + } + + void cancel() override { m_canceled.store(true); } + void cancel_all() override { m_input_queue.clear(); cancel(); } + + ProgressIndicator * get_pri() { return m_progress.get(); } + const ProgressIndicator * get_pri() const { return m_progress.get(); } + + void clear_percent() override + { + if (m_progress) { + m_progress->clear_percent(); + } + } + + void show_error_info(const std::string &msg, int code, const std::string &description, const std::string &extra) override + { + if (m_progress) { + m_progress->show_error_info(from_u8(msg), code, from_u8(description), from_u8(extra)); + } + } + + void process_events() override; + bool wait_for_current_job(unsigned timeout_ms = 0) override; + bool wait_for_idle(unsigned timeout_ms = 0) override; + +}; + +}} // namespace Slic3r::GUI + +#endif // BOOSTTHREADWORKER_HPP diff --git a/src/slic3r/GUI/Jobs/BusyCursorJob.hpp b/src/slic3r/GUI/Jobs/BusyCursorJob.hpp new file mode 100644 index 0000000000..e2067fbe6a --- /dev/null +++ b/src/slic3r/GUI/Jobs/BusyCursorJob.hpp @@ -0,0 +1,57 @@ +///|/ Copyright (c) Prusa Research 2021 - 2022 Tomáš Mészáros @tamasmeszaros +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ +#ifndef BUSYCURSORJOB_HPP +#define BUSYCURSORJOB_HPP + +#include "Job.hpp" + +#include +#include + +namespace Slic3r { namespace GUI { + +struct CursorSetterRAII +{ + Job::Ctl &ctl; + CursorSetterRAII(Job::Ctl &c) : ctl{c} + { + ctl.call_on_main_thread([] { wxBeginBusyCursor(); }); + } + ~CursorSetterRAII() + { + try { + ctl.call_on_main_thread([] { wxEndBusyCursor(); }); + } catch(...) { + BOOST_LOG_TRIVIAL(error) << "Can't revert cursor from busy to normal"; + } + } +}; + +template +class BusyCursored: public Job { + JobSubclass m_job; + +public: + template + BusyCursored(Args &&...args) : m_job{std::forward(args)...} + {} + + void process(Ctl &ctl) override + { + CursorSetterRAII cursor_setter{ctl}; + m_job.process(ctl); + } + + void finalize(bool canceled, std::exception_ptr &eptr) override + { + m_job.finalize(canceled, eptr); + } +}; + + +} +} + +#endif // BUSYCURSORJOB_HPP diff --git a/src/slic3r/GUI/Jobs/CreateFontNameImageJob.cpp b/src/slic3r/GUI/Jobs/CreateFontNameImageJob.cpp new file mode 100644 index 0000000000..3c080148f1 --- /dev/null +++ b/src/slic3r/GUI/Jobs/CreateFontNameImageJob.cpp @@ -0,0 +1,170 @@ +///|/ Copyright (c) Prusa Research 2022 Filip Sykala @Jony01 +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ +#include "CreateFontNameImageJob.hpp" + +#include "libslic3r/Emboss.hpp" +// rasterization of ExPoly +#include "libslic3r/SLA/AGGRaster.hpp" + +#include "slic3r/Utils/WxFontUtils.hpp" +#include "slic3r/GUI/3DScene.hpp" // ::glsafe + +// ability to request new frame after finish rendering +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Plater.hpp" +#include "slic3r/GUI/GLCanvas3D.hpp" + +#include "wx/fontenum.h" + +#include + +using namespace Slic3r; +using namespace Slic3r::GUI; + +const std::string CreateFontImageJob::default_text = "AaBbCc 123"; + +CreateFontImageJob::CreateFontImageJob(FontImageData &&input) + : m_input(std::move(input)) +{ + assert(wxFontEnumerator::IsValidFacename(m_input.font_name)); + assert(m_input.gray_level > 0 && m_input.gray_level < 255); + assert(m_input.texture_id != 0); +} + +void CreateFontImageJob::process(Ctl &ctl) +{ + if (!wxFontEnumerator::IsValidFacename(m_input.font_name)) return; + // Select font + wxFont wx_font( + wxFontInfo().FaceName(m_input.font_name).Encoding(m_input.encoding)); + if (!wx_font.IsOk()) return; + + std::unique_ptr font_file = + WxFontUtils::create_font_file(wx_font); + if (font_file == nullptr) return; + + Emboss::FontFileWithCache font_file_with_cache(std::move(font_file)); + // use only first line of text + std::string& text = m_input.text; + if (text.empty()) + text = default_text; // copy + + size_t enter_pos = text.find('\n'); + if (enter_pos < text.size()) { + // text start with enter + if (enter_pos == 0) return; + // exist enter, soo delete all after enter + text = text.substr(0, enter_pos); + } + + std::function was_canceled = [&ctl, cancel = m_input.cancel]() -> bool { + if (ctl.was_canceled()) return true; + if (cancel->load()) return true; + return false; + }; + + FontProp fp; // create default font parameters + ExPolygons shapes = Emboss::text2shapes(font_file_with_cache, text.c_str(), fp, was_canceled); + + // select some character from font e.g. default text + if (shapes.empty()) + shapes = Emboss::text2shapes(font_file_with_cache, default_text.c_str(), fp, was_canceled); + if (shapes.empty()) { + m_input.cancel->store(true); + return; + } + + // normalize height of font + BoundingBox bounding_box; + for (const ExPolygon &shape : shapes) + bounding_box.merge(BoundingBox(shape.contour.points)); + if (bounding_box.size().x() < 1 || bounding_box.size().y() < 1) { + m_input.cancel->store(true); + return; + } + double scale = m_input.size.y() / (double) bounding_box.size().y(); + BoundingBoxf bb2(bounding_box.min.cast(), + bounding_box.max.cast()); + bb2.scale(scale); + Vec2d size_f = bb2.size(); + m_tex_size = Point(std::ceil(size_f.x()), std::ceil(size_f.y())); + // crop image width + if (m_tex_size.x() > m_input.size.x()) m_tex_size.x() = m_input.size.x(); + if (m_tex_size.y() > m_input.size.y()) m_tex_size.y() = m_input.size.y(); + + // Set up result + unsigned bit_count = 4; // RGBA + m_result = std::vector(m_tex_size.x() * m_tex_size.y() * bit_count, {255}); + + sla::Resolution resolution(m_tex_size.x(), m_tex_size.y()); + double pixel_dim = SCALING_FACTOR / scale; + sla::PixelDim dim(pixel_dim, pixel_dim); + double gamma = 1.; + std::unique_ptr r = + sla::create_raster_grayscale_aa(resolution, dim, gamma); + for (ExPolygon &shape : shapes) shape.translate(-bounding_box.min); + for (const ExPolygon &shape : shapes) r->draw(shape); + + // copy rastered data to pixels + sla::RasterEncoder encoder = + [&pix = m_result, w = m_tex_size.x(), h = m_tex_size.y(), + gray_level = m_input.gray_level] + (const void *ptr, size_t width, size_t height, size_t num_components) { + size_t size {static_cast(w*h)}; + const unsigned char *ptr2 = (const unsigned char *) ptr; + for (size_t x = 0; x < width; ++x) + for (size_t y = 0; y < height; ++y) { + size_t index = y*w + x; + assert(index < size); + if (index >= size) continue; + pix[3+4*index] = ptr2[y * width + x] / gray_level; + } + return sla::EncodedRaster(); + }; + r->encode(encoder); +} + +void CreateFontImageJob::finalize(bool canceled, std::exception_ptr &) +{ + if (m_input.count_opened_font_files) + --(*m_input.count_opened_font_files); + if (canceled || m_input.cancel->load()) return; + + *m_input.is_created = true; + + // Exist result bitmap with preview? + // (not valid input. e.g. not loadable font) + if (m_result.empty()) { + // TODO: write text cannot load into texture + m_result = std::vector(m_tex_size.x() * m_tex_size.y() * 4, {255}); + } + + // upload texture on GPU + const GLenum target = GL_TEXTURE_2D; + glsafe(::glBindTexture(target, m_input.texture_id)); + + GLsizei w = m_tex_size.x(), h = m_tex_size.y(); + GLint xoffset = m_input.size.x() - m_tex_size.x(), // arrange right + yoffset = m_input.size.y() * m_input.index; + glsafe(::glTexSubImage2D(target, m_input.level, xoffset, yoffset, w, h, + m_input.format, m_input.type, m_result.data())); + + // clear rest of texture + std::vector empty_data(xoffset * h * 4, {0}); + glsafe(::glTexSubImage2D(target, m_input.level, 0, yoffset, xoffset, h, + m_input.format, m_input.type, empty_data.data())); + + // bind default texture + GLuint no_texture_id = 0; + glsafe(::glBindTexture(target, no_texture_id)); + + // show rendered texture + wxGetApp().plater()->canvas3D()->schedule_extra_frame(0); + + BOOST_LOG_TRIVIAL(info) + << "Generate Preview font('" << m_input.font_name << "' id:" << m_input.index << ") " + << "with text: '" << m_input.text << "' " + << "texture_size " << m_input.size.x() << " x " << m_input.size.y(); +} \ No newline at end of file diff --git a/src/slic3r/GUI/Jobs/CreateFontNameImageJob.hpp b/src/slic3r/GUI/Jobs/CreateFontNameImageJob.hpp new file mode 100644 index 0000000000..09d3ec6e34 --- /dev/null +++ b/src/slic3r/GUI/Jobs/CreateFontNameImageJob.hpp @@ -0,0 +1,85 @@ +///|/ Copyright (c) Prusa Research 2022 Filip Sykala @Jony01 +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ +#ifndef slic3r_CreateFontNameImageJob_hpp_ +#define slic3r_CreateFontNameImageJob_hpp_ + +#include +#include +#include +#include +#include +#include "Job.hpp" +#include "libslic3r/Point.hpp" // Vec2i + +namespace Slic3r::GUI { + +/// +/// Keep data for rasterization of text by font face +/// +struct FontImageData +{ + // Text to rasterize + std::string text; + // Define font face + wxString font_name; + wxFontEncoding encoding; + // texture for copy result to + // texture MUST BE initialized + GLuint texture_id; + // Index of face name, define place in texture + size_t index; + // Height of each text + // And Limit for width + Vec2i size; // in px + + // bigger value create darker image + // divide value 255 + unsigned char gray_level = 5; + + // texture meta data + GLenum format = GL_ALPHA, type = GL_UNSIGNED_BYTE; + GLint level = 0; + + // prevent opening too much files + // it is decreased in finalize phase + unsigned int *count_opened_font_files = nullptr; + + std::shared_ptr> cancel = nullptr; + std::shared_ptr is_created = nullptr; +}; + +/// +/// Create image for face name +/// +class CreateFontImageJob : public Job +{ + FontImageData m_input; + std::vector m_result; + Point m_tex_size; +public: + CreateFontImageJob(FontImageData &&input); + /// + /// Rasterize text into image (result) + /// + /// Check for cancelation + void process(Ctl &ctl) override; + + /// + /// Copy image data into OpenGL texture + /// + /// + /// + void finalize(bool canceled, std::exception_ptr &) override; + + /// + /// Text used for generate preview for empty text + /// and when no glyph for given m_input.text + /// + static const std::string default_text; +}; + +} // namespace Slic3r::GUI + +#endif // slic3r_CreateFontNameImageJob_hpp_ diff --git a/src/slic3r/GUI/Jobs/CreateFontStyleImagesJob.cpp b/src/slic3r/GUI/Jobs/CreateFontStyleImagesJob.cpp new file mode 100644 index 0000000000..e429aca43b --- /dev/null +++ b/src/slic3r/GUI/Jobs/CreateFontStyleImagesJob.cpp @@ -0,0 +1,157 @@ +///|/ Copyright (c) Prusa Research 2022 Filip Sykala @Jony01 +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ +#include "CreateFontStyleImagesJob.hpp" + +// rasterization of ExPoly +#include "libslic3r/SLA/AGGRaster.hpp" +#include "slic3r/GUI/3DScene.hpp" // ::glsafe + +// ability to request new frame after finish rendering +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Plater.hpp" +#include "slic3r/GUI/GLCanvas3D.hpp" + +using namespace Slic3r; +using namespace Slic3r::Emboss; +using namespace Slic3r::GUI; +using namespace Slic3r::GUI::Emboss; + + +CreateFontStyleImagesJob::CreateFontStyleImagesJob(StyleManager::StyleImagesData &&input) + : m_input(std::move(input)), m_width(0), m_height(0) +{ + assert(m_input.result != nullptr); + assert(!m_input.styles.empty()); + assert(!m_input.text.empty()); + assert(m_input.max_size.x() > 1); + assert(m_input.max_size.y() > 1); + assert(m_input.ppm > 1e-5); +} + +void CreateFontStyleImagesJob::process(Ctl &ctl) +{ + // create shapes and calc size (bounding boxes) + std::vector name_shapes(m_input.styles.size()); + std::vector scales(m_input.styles.size()); + m_images = std::vector(m_input.styles.size()); + + auto was_canceled = []() { return false; }; + for (auto &item : m_input.styles) { + size_t index = &item - &m_input.styles.front(); + ExPolygons &shapes = name_shapes[index]; + shapes = text2shapes(item.font, m_input.text.c_str(), item.prop, was_canceled); + + // create image description + StyleManager::StyleImage &image = m_images[index]; + BoundingBox &bounding_box = image.bounding_box; + for (ExPolygon &shape : shapes) + bounding_box.merge(BoundingBox(shape.contour.points)); + for (ExPolygon &shape : shapes) shape.translate(-bounding_box.min); + + // calculate conversion from FontPoint to screen pixels by size of font + double scale = get_text_shape_scale(item.prop, *item.font.font_file); + scales[index] = scale; + + //double scale = font_prop.size_in_mm * SCALING_FACTOR; + BoundingBoxf bb2(bounding_box.min.cast(), + bounding_box.max.cast()); + bb2.scale(scale); + image.tex_size.x = std::ceil(bb2.max.x() - bb2.min.x()); + image.tex_size.y = std::ceil(bb2.max.y() - bb2.min.y()); + + // crop image width + if (image.tex_size.x > m_input.max_size.x()) + image.tex_size.x = m_input.max_size.x(); + // crop image height + if (image.tex_size.y > m_input.max_size.y()) + image.tex_size.y = m_input.max_size.y(); + } + + // arrange bounding boxes + int offset_y = 0; + m_width = 0; + for (StyleManager::StyleImage &image : m_images) { + image.offset.y() = offset_y; + offset_y += image.tex_size.y+1; + if (m_width < image.tex_size.x) + m_width = image.tex_size.x; + } + m_height = offset_y; + for (StyleManager::StyleImage &image : m_images) { + const Point &o = image.offset; + const ImVec2 &s = image.tex_size; + image.uv0 = ImVec2(o.x() / (double) m_width, + o.y() / (double) m_height); + image.uv1 = ImVec2((o.x() + s.x) / (double) m_width, + (o.y() + s.y) / (double) m_height); + } + + // Set up result + m_pixels = std::vector(4 * m_width * m_height, {255}); + + // upload sub textures + for (StyleManager::StyleImage &image : m_images) { + sla::Resolution resolution(image.tex_size.x, image.tex_size.y); + size_t index = &image - &m_images.front(); + double pixel_dim = SCALING_FACTOR / scales[index]; + sla::PixelDim dim(pixel_dim, pixel_dim); + double gamma = 1.; + std::unique_ptr r = + sla::create_raster_grayscale_aa(resolution, dim, gamma); + for (const ExPolygon &shape : name_shapes[index]) r->draw(shape); + + // copy rastered data to pixels + sla::RasterEncoder encoder = [&offset = image.offset, &pix = m_pixels, w=m_width,h=m_height] + (const void *ptr, size_t width, size_t height, size_t num_components) { + // bigger value create darker image + unsigned char gray_level = 1; + size_t size {static_cast(w*h)}; + assert((offset.x() + width) <= (size_t)w); + assert((offset.y() + height) <= (size_t)h); + const unsigned char *ptr2 = (const unsigned char *) ptr; + for (size_t x = 0; x < width; ++x) + for (size_t y = 0; y < height; ++y) { + size_t index = (offset.y() + y)*w + offset.x() + x; + assert(index < size); + if (index >= size) continue; + pix[4*index+3] = ptr2[y * width + x] / gray_level; + } + return sla::EncodedRaster(); + }; + r->encode(encoder); + } +} + +void CreateFontStyleImagesJob::finalize(bool canceled, std::exception_ptr &) +{ + if (canceled) return; + // upload texture on GPU + GLuint tex_id; + GLenum target = GL_TEXTURE_2D, format = GL_RGBA, type = GL_UNSIGNED_BYTE; + GLint level = 0, border = 0; + glsafe(::glGenTextures(1, &tex_id)); + glsafe(::glBindTexture(target, tex_id)); + glsafe(::glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST)); + glsafe(::glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); + GLint w = m_width, h = m_height; + glsafe(::glTexImage2D(target, level, GL_RGBA, w, h, border, format, type, + (const void *) m_pixels.data())); + + // set up texture id + void *texture_id = (void *) (intptr_t) tex_id; + for (StyleManager::StyleImage &image : m_images) + image.texture_id = texture_id; + + // move to result + m_input.result->styles = std::move(m_input.styles); + m_input.result->images = std::move(m_images); + + // bind default texture + GLuint no_texture_id = 0; + glsafe(::glBindTexture(target, no_texture_id)); + + // show rendered texture + wxGetApp().plater()->canvas3D()->schedule_extra_frame(0); +} \ No newline at end of file diff --git a/src/slic3r/GUI/Jobs/CreateFontStyleImagesJob.hpp b/src/slic3r/GUI/Jobs/CreateFontStyleImagesJob.hpp new file mode 100644 index 0000000000..af7a2f827b --- /dev/null +++ b/src/slic3r/GUI/Jobs/CreateFontStyleImagesJob.hpp @@ -0,0 +1,40 @@ +///|/ Copyright (c) Prusa Research 2022 Filip Sykala @Jony01 +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ +#ifndef slic3r_CreateFontStyleImagesJob_hpp_ +#define slic3r_CreateFontStyleImagesJob_hpp_ + +#include +#include +#include +#include "slic3r/Utils/EmbossStyleManager.hpp" +#include "Job.hpp" + +namespace Slic3r::GUI::Emboss { + +/// +/// Create texture with name of styles written by its style +/// NOTE: Access to glyph cache is possible only from job +/// +class CreateFontStyleImagesJob : public Job +{ + StyleManager::StyleImagesData m_input; + + // Output data + // texture size + int m_width, m_height; + // texture data + std::vector m_pixels; + // descriptors of sub textures + std::vector m_images; + +public: + CreateFontStyleImagesJob(StyleManager::StyleImagesData &&input); + void process(Ctl &ctl) override; + void finalize(bool canceled, std::exception_ptr &) override; +}; + +} // namespace Slic3r::GUI + +#endif // slic3r_CreateFontStyleImagesJob_hpp_ diff --git a/src/slic3r/GUI/Jobs/EmbossJob.cpp b/src/slic3r/GUI/Jobs/EmbossJob.cpp new file mode 100644 index 0000000000..471f202bb3 --- /dev/null +++ b/src/slic3r/GUI/Jobs/EmbossJob.cpp @@ -0,0 +1,1568 @@ +///|/ Copyright (c) Prusa Research 2021 - 2023 Oleksandra Iushchenko @YuSanka, Filip Sykala @Jony01 +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ +#include "EmbossJob.hpp" + +#include +#include +#include + +#include +#include // load_obj for default mesh +#include // use surface cuts +#include // create object +#include + +#include "slic3r/GUI/Plater.hpp" +#include "slic3r/GUI/NotificationManager.hpp" +#include "slic3r/GUI/GLCanvas3D.hpp" +#include "slic3r/GUI/GUI_ObjectList.hpp" +#include "slic3r/GUI/MainFrame.hpp" +#include "slic3r/GUI/GUI.hpp" +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Gizmos/GLGizmoEmboss.hpp" +#include "slic3r/GUI/Selection.hpp" +#include "slic3r/GUI/CameraUtils.hpp" +#include "slic3r/GUI/format.hpp" +#include "slic3r/GUI/3DScene.hpp" +#include "slic3r/GUI/Jobs/Worker.hpp" +#include "slic3r/Utils/UndoRedo.hpp" +#include "slic3r/Utils/RaycastManager.hpp" + +// #define EXECUTE_UPDATE_ON_MAIN_THREAD // debug execution on main thread + +using namespace Slic3r; +using namespace Slic3r::Emboss; +using namespace Slic3r::GUI; +using namespace Slic3r::GUI::Emboss; + +// Private implementation for create volume and objects jobs +namespace { +/// +/// Hold neccessary data to create ModelVolume in job +/// Volume is created on the surface of existing volume in object. +/// NOTE: EmbossDataBase::font_file doesn't have to be valid !!! +/// +struct DataCreateVolume +{ + // Hold data about shape + DataBasePtr base; + + // define embossed volume type + ModelVolumeType volume_type; + + // parent ModelObject index where to create volume + ObjectID object_id; + + // new created volume transformation + std::optional trmat; + + // Define which gizmo open on the success + GLGizmosManager::EType gizmo; +}; + +// Offset of clossed side to model +constexpr float SAFE_SURFACE_OFFSET = 0.015f; // [in mm] + +/// +/// Create new TextVolume on the surface of ModelObject +/// Should not be stopped +/// NOTE: EmbossDataBase::font_file doesn't have to be valid !!! +/// +class CreateVolumeJob : public Job +{ + DataCreateVolume m_input; + TriangleMesh m_result; + +public: + explicit CreateVolumeJob(DataCreateVolume &&input); + void process(Ctl &ctl) override; + void finalize(bool canceled, std::exception_ptr &eptr) override; +}; + +/// +/// Hold neccessary data to create ModelObject in job +/// Object is placed on bed under screen coor +/// OR to center of scene when it is out of bed shape +/// +struct DataCreateObject +{ + // Hold data about shape + DataBasePtr base; + + // define position on screen where to create object + Vec2d screen_coor; + + // projection property + Camera camera; + + // shape of bed in case of create volume on bed + std::vector bed_shape; + + // Define which gizmo open on the success + GLGizmosManager::EType gizmo; +}; + +/// +/// Create new TextObject on the platter +/// Should not be stopped +/// +class CreateObjectJob : public Job +{ + DataCreateObject m_input; + TriangleMesh m_result; + Transform3d m_transformation; + +public: + explicit CreateObjectJob(DataCreateObject &&input); + void process(Ctl &ctl) override; + void finalize(bool canceled, std::exception_ptr &eptr) override; +}; + +/// +/// Hold neccessary data to create(cut) volume from surface object in job +/// +struct CreateSurfaceVolumeData : public SurfaceVolumeData +{ + // Hold data about shape + DataBasePtr base; + + // define embossed volume type + ModelVolumeType volume_type; + + // parent ModelObject index where to create volume + ObjectID object_id; + + // Define which gizmo open on the success + GLGizmosManager::EType gizmo; +}; + +/// +/// Cut surface from object and create cutted volume +/// Should not be stopped +/// +class CreateSurfaceVolumeJob : public Job +{ + CreateSurfaceVolumeData m_input; + TriangleMesh m_result; + +public: + explicit CreateSurfaceVolumeJob(CreateSurfaceVolumeData &&input); + void process(Ctl &ctl) override; + void finalize(bool canceled, std::exception_ptr &eptr) override; +}; + +/// +/// Assert check of inputs data +/// +bool check(const DataBase &input, bool check_fontfile = true, bool use_surface = false); +bool check(GLGizmosManager::EType gizmo); +bool check(const CreateVolumeParams& input); +bool check(const DataCreateVolume &input, bool is_main_thread = false); +bool check(const DataCreateObject &input); +bool check(const DataUpdate &input, bool is_main_thread = false, bool use_surface = false); +bool check(const CreateSurfaceVolumeData &input, bool is_main_thread = false); +bool check(const UpdateSurfaceVolumeData &input, bool is_main_thread = false); + +template static ExPolygons create_shape(DataBase &input, Fnc was_canceled); + +// create sure that emboss object is bigger than source object [in mm] +constexpr float safe_extension = 1.0f; + +// +/// Try to create mesh from text +/// +/// Text to convert on mesh +/// + Shape of characters + Property of font +/// Font file with cache +/// NOTE: Cache glyphs is changed +/// To check if process was canceled +/// Triangle mesh model +template TriangleMesh try_create_mesh(DataBase &input, const Fnc& was_canceled); +template TriangleMesh create_mesh(DataBase &input, const Fnc& was_canceled, Job::Ctl &ctl); + +/// +/// Create default mesh for embossed text +/// +/// Not empty model(index trinagle set - its) +TriangleMesh create_default_mesh(); + +/// +/// Must be called on main thread +/// +/// New mesh data +/// Text configuration, ... +/// Transformation of volume +void update_volume(TriangleMesh &&mesh, const DataUpdate &data, const Transform3d *tr = nullptr); + +/// +/// Update name in right panel +/// +/// Right panel data +/// Volume with just changed name +void update_name_in_list(const ObjectList &object_list, const ModelVolume &volume); + +/// +/// Add new volume to object +/// +/// triangles of new volume +/// Object where to add volume +/// Type of new volume +/// Transformation of volume inside of object +/// Text configuration and New VolumeName +/// Gizmo to open +void create_volume(TriangleMesh &&mesh, const ObjectID& object_id, const ModelVolumeType type, + const std::optional& trmat, const DataBase &data, GLGizmosManager::EType gizmo); + +/// +/// Create projection for cut surface from mesh +/// +/// Volume transformation in object +/// Convert shape to milimeters +/// Bounding box 3d of model volume for projection ranges +/// Orthogonal cut_projection +OrthoProject create_projection_for_cut(Transform3d tr, double shape_scale, const std::pair &z_range); + +/// +/// Create tranformation for emboss Cutted surface +/// +/// True .. raise, False .. engrave +/// Depth of embossing +/// Text voliume transformation inside object +/// Cutted surface from model +/// Projection +OrthoProject3d create_emboss_projection(bool is_outside, float emboss, Transform3d tr, SurfaceCut &cut); + +/// +/// Cut surface into triangle mesh +/// +/// (can't be const - cache of font) +/// SurfaceVolume data +/// Check to interupt execution +/// Extruded object from cuted surace +template +TriangleMesh cut_surface(/*const*/ DataBase &input1, const SurfaceVolumeData &input2, const Fnc& was_canceled); + +/// +/// Copied triangles from object to be able create mesh for cut surface from +/// +/// Source object volumes for cut surface from +/// Source volume id +/// Source data for cut surface from +SurfaceVolumeData::ModelSources create_sources(const ModelVolumePtrs &volumes, std::optional text_volume_id = {}); + +void create_message(const std::string &message); // only in finalize +bool process(std::exception_ptr &eptr); +bool finalize(bool canceled, std::exception_ptr &eptr, const DataBase &input); + +class JobException : public std::runtime_error { +public: using std::runtime_error::runtime_error;}; +auto was_canceled(const Job::Ctl &ctl, const DataBase &base){ + return [&ctl, &cancel = base.cancel]() { + if (cancel->load()) + return true; + return ctl.was_canceled(); + }; +} + +} // namespace + +void Slic3r::GUI::Emboss::DataBase::write(ModelVolume &volume) const{ + volume.name = volume_name; + volume.emboss_shape = shape; + volume.emboss_shape->fix_3mf_tr.reset(); +} + +///////////////// +/// Create Volume +CreateVolumeJob::CreateVolumeJob(DataCreateVolume &&input): m_input(std::move(input)){ assert(check(m_input, true)); } + +void CreateVolumeJob::process(Ctl &ctl) { + if (!check(m_input)) + throw std::runtime_error("Bad input data for EmbossCreateVolumeJob."); + m_result = create_mesh(*m_input.base, was_canceled(ctl, *m_input.base), ctl); +} +void CreateVolumeJob::finalize(bool canceled, std::exception_ptr &eptr) { + if (!::finalize(canceled, eptr, *m_input.base)) + return; + if (m_result.its.empty()) + return create_message("Can't create empty volume."); + create_volume(std::move(m_result), m_input.object_id, m_input.volume_type, m_input.trmat, *m_input.base, m_input.gizmo); +} + + +///////////////// +/// Create Object +CreateObjectJob::CreateObjectJob(DataCreateObject &&input): m_input(std::move(input)){ assert(check(m_input)); } + +void CreateObjectJob::process(Ctl &ctl) +{ + if (!check(m_input)) + throw JobException("Bad input data for EmbossCreateObjectJob."); + + // can't create new object with using surface + if (m_input.base->shape.projection.use_surface) + m_input.base->shape.projection.use_surface = false; + + auto was_canceled = ::was_canceled(ctl, *m_input.base); + m_result = create_mesh(*m_input.base, was_canceled, ctl); + if (was_canceled()) return; + + // Create new object + // calculate X,Y offset position for lay on platter in place of + // mouse click + Vec2d bed_coor = CameraUtils::get_z0_position( + m_input.camera, m_input.screen_coor); + + // check point is on build plate: + Points bed_shape_; + bed_shape_.reserve(m_input.bed_shape.size()); + for (const Vec2d &p : m_input.bed_shape) + bed_shape_.emplace_back(p.cast()); + Slic3r::Polygon bed(bed_shape_); + if (!bed.contains(bed_coor.cast())) + // mouse pose is out of build plate so create object in center of plate + bed_coor = bed.centroid().cast(); + + double z = m_input.base->shape.projection.depth / 2; + Vec3d offset(bed_coor.x(), bed_coor.y(), z); + offset -= m_result.center(); + Transform3d::TranslationType tt(offset.x(), offset.y(), offset.z()); + m_transformation = Transform3d(tt); +} + +void CreateObjectJob::finalize(bool canceled, std::exception_ptr &eptr) +{ + if (!::finalize(canceled, eptr, *m_input.base)) + return; + + // only for sure + if (m_result.empty()) + return create_message("Can't create empty object."); + + GUI_App &app = wxGetApp(); + Plater *plater = app.plater(); + plater->take_snapshot(_u8L("Add Emboss text object")); + + Model& model = plater->model(); +#ifdef _DEBUG + check_model_ids_validity(model); +#endif /* _DEBUG */ + { + // INFO: inspiration for create object is from ObjectList::load_mesh_object() + ModelObject *new_object = model.add_object(); + new_object->name = m_input.base->volume_name; + new_object->add_instance(); // each object should have at list one instance + + ModelVolume *new_volume = new_object->add_volume(std::move(m_result)); + // set a default extruder value, since user can't add it manually + new_volume->config.set_key_value("extruder", new ConfigOptionInt(0)); + // write emboss data into volume + m_input.base->write(*new_volume); + + // set transformation + Slic3r::Geometry::Transformation tr(m_transformation); + new_object->instances.front()->set_transformation(tr); + new_object->ensure_on_bed(); + + // Actualize right panel and set inside of selection + app.obj_list()->paste_objects_into_list({model.objects.size() - 1}); + } +#ifdef _DEBUG + check_model_ids_validity(model); +#endif /* _DEBUG */ + + // When add new object selection is empty. + // When cursor move and no one object is selected than + // Manager::reset_all() So Gizmo could be closed before end of creation object + GLCanvas3D *canvas = plater->get_view3D_canvas3D(); + GLGizmosManager &manager = canvas->get_gizmos_manager(); + if (manager.get_current_type() != m_input.gizmo) + manager.open_gizmo(m_input.gizmo); + + // redraw scene + canvas->reload_scene(true); +} + +///////////////// +/// Update Volume +UpdateJob::UpdateJob(DataUpdate&& input): m_input(std::move(input)){ assert(check(m_input, true)); } + +void UpdateJob::process(Ctl &ctl) +{ + if (!check(m_input)) + throw JobException("Bad input data for EmbossUpdateJob."); + + auto was_canceled = ::was_canceled(ctl, *m_input.base); + m_result = ::try_create_mesh(*m_input.base, was_canceled); + if (was_canceled()) return; + if (m_result.its.empty()) + throw JobException("Created text volume is empty. Change text or font."); +} + +void UpdateJob::finalize(bool canceled, std::exception_ptr &eptr) +{ + if (!::finalize(canceled, eptr, *m_input.base)) + return; + ::update_volume(std::move(m_result), m_input); +} + +void UpdateJob::update_volume(ModelVolume *volume, TriangleMesh &&mesh, const DataBase &base) +{ + // check inputs + bool is_valid_input = volume != nullptr && !mesh.empty() && !base.volume_name.empty(); + assert(is_valid_input); + if (!is_valid_input) + return; + + // update volume + volume->set_mesh(std::move(mesh)); + volume->set_new_unique_id(); + volume->calculate_convex_hull(); + + // write data from base into volume + base.write(*volume); + + GUI_App &app = wxGetApp(); // may be move to input + if (volume->name != base.volume_name) { + volume->name = base.volume_name; + + const ObjectList *obj_list = app.obj_list(); + if (obj_list != nullptr) + update_name_in_list(*obj_list, *volume); + } + + ModelObject *object = volume->get_object(); + assert(object != nullptr); + if (object == nullptr) + return; + + Plater *plater = app.plater(); + if (plater->printer_technology() == ptSLA) + sla::reproject_points_and_holes(object); + plater->changed_object(*object); +} + +///////////////// +/// Create Surface volume +CreateSurfaceVolumeJob::CreateSurfaceVolumeJob(CreateSurfaceVolumeData &&input) + : m_input(std::move(input)) +{ + assert(check(m_input, true)); +} + +void CreateSurfaceVolumeJob::process(Ctl &ctl) { + if (!check(m_input)) + throw JobException("Bad input data for CreateSurfaceVolumeJob."); + m_result = cut_surface(*m_input.base, m_input, was_canceled(ctl, *m_input.base)); +} + +void CreateSurfaceVolumeJob::finalize(bool canceled, std::exception_ptr &eptr) { + if (!::finalize(canceled, eptr, *m_input.base)) + return; + create_volume(std::move(m_result), m_input.object_id, + m_input.volume_type, m_input.transform, *m_input.base, m_input.gizmo); +} + +///////////////// +/// Cut Surface +UpdateSurfaceVolumeJob::UpdateSurfaceVolumeJob(UpdateSurfaceVolumeData &&input) + : m_input(std::move(input)) +{ + assert(check(m_input, true)); +} + +void UpdateSurfaceVolumeJob::process(Ctl &ctl) +{ + if (!check(m_input)) + throw JobException("Bad input data for UseSurfaceJob."); + m_result = cut_surface(*m_input.base, m_input, was_canceled(ctl, *m_input.base)); +} + +void UpdateSurfaceVolumeJob::finalize(bool canceled, std::exception_ptr &eptr) +{ + if (!::finalize(canceled, eptr, *m_input.base)) + return; + + // when start using surface it is wanted to move text origin on surface of model + // also when repeteadly move above surface result position should match + ::update_volume(std::move(m_result), m_input, &m_input.transform); +} + +namespace { +/// +/// Check if volume type is possible use for new text volume +/// +/// Type +/// True when allowed otherwise false +bool is_valid(ModelVolumeType volume_type); + +/// +/// Start job for add new volume to object with given transformation +/// +/// Define where to queue the job. e.g. wxGetApp().plater()->get_ui_job_worker() +/// Define where to add +/// Wanted volume transformation, when not set will be calculated after creation to be near the object +/// Define what to emboss - shape +/// Type of volume: Part, negative, modifier +/// Define which gizmo open on the success +/// Nullptr when job is sucessfully add to worker otherwise return data to be processed different way +bool start_create_volume_job(Worker &worker, + const ModelObject &object, + const std::optional &volume_tr, + DataBasePtr data, + ModelVolumeType volume_type, + GLGizmosManager::EType gizmo); + +/// +/// Find volume in selected objects with closest convex hull to screen center. +/// +/// Define where to search for closest +/// Canvas center(dependent on camera settings) +/// Actual objects +/// OUT: coordinate of controid of closest volume +/// closest volume when exists otherwise nullptr +const GLVolume *find_closest( + const Selection &selection, const Vec2d &screen_center, const Camera &camera, const ModelObjectPtrs &objects, Vec2d *closest_center); + +/// +/// Start job for add object with text into scene +/// +/// Contain worker, build shape, gizmo +/// Define params for create volume +/// Screen coordinat, where to create new object laying on bed +/// True when can add job to worker otherwise FALSE +bool start_create_object_job(const CreateVolumeParams &input, DataBasePtr emboss_data, const Vec2d &coor); + +/// +/// Start job to create volume on the surface of object +/// +/// Variabless needed to create volume +/// Describe what to emboss - shape +/// Where to add +/// True .. try to create volume without screen_coor, +/// False .. +/// Nullptr when job is sucessfully add to worker otherwise return data to be processed different way +bool start_create_volume_on_surface_job(CreateVolumeParams &input, DataBasePtr data, const Vec2d &screen_coor, bool try_no_coor); + +} // namespace + +namespace Slic3r::GUI::Emboss { + +SurfaceVolumeData::ModelSources create_volume_sources(const ModelVolume &text_volume) +{ + const ModelVolumePtrs &volumes = text_volume.get_object()->volumes; + // no other volume in object + if (volumes.size() <= 1) + return {}; + return ::create_sources(volumes, text_volume.id().id); +} + +bool start_create_volume(CreateVolumeParams &input, DataBasePtr data, const Vec2d &mouse_pos) +{ + if (data == nullptr) + return false; + if (!check(input)) + return false; + + if (input.gl_volume == nullptr) + // object is not under mouse position soo create object on plater + return ::start_create_object_job(input, std::move(data), mouse_pos); + + bool try_no_coor = true; + return ::start_create_volume_on_surface_job(input, std::move(data), mouse_pos, try_no_coor); +} + +bool start_create_volume_without_position(CreateVolumeParams &input, DataBasePtr data) +{ + assert(data != nullptr); + if (data == nullptr) + return false; + if (!check(input)) + return false; + + // select position by camera position and view direction + const Selection &selection = input.canvas.get_selection(); + int object_idx = selection.get_object_idx(); + + Size s = input.canvas.get_canvas_size(); + Vec2d screen_center(s.get_width() / 2., s.get_height() / 2.); + const ModelObjectPtrs &objects = selection.get_model()->objects; + + // No selected object so create new object + if (selection.is_empty() || object_idx < 0 || + static_cast(object_idx) >= objects.size()) + // create Object on center of screen + // when ray throw center of screen not hit bed it create object on center of bed + return ::start_create_object_job(input, std::move(data), screen_center); + + // create volume inside of selected object + Vec2d coor; + const Camera &camera = wxGetApp().plater()->get_camera(); + input.gl_volume = ::find_closest(selection, screen_center, camera, objects, &coor); + if (input.gl_volume == nullptr) + return ::start_create_object_job(input, std::move(data), screen_center); + + bool try_no_coor = false; + return ::start_create_volume_on_surface_job(input, std::move(data), coor, try_no_coor); +} + +#ifdef EXECUTE_UPDATE_ON_MAIN_THREAD +namespace { +// Run Job on main thread (blocking) - ONLY DEBUG +static inline bool execute_job(std::shared_ptr j) +{ + struct MyCtl : public Job::Ctl + { + void update_status(int st, const std::string &msg = "") override{}; + bool was_canceled() const override { return false; } + std::future call_on_main_thread(std::function fn) override { return std::future{}; } + } ctl; + j->process(ctl); + wxGetApp().plater()->CallAfter([j]() { + std::exception_ptr e_ptr = nullptr; + j->finalize(false, e_ptr); + }); + return true; +} +} // namespace +#endif + +bool start_update_volume(DataUpdate &&data, const ModelVolume &volume, const Selection &selection, RaycastManager& raycaster) +{ + assert(data.volume_id == volume.id()); + + // check cutting from source mesh + bool &use_surface = data.base->shape.projection.use_surface; + if (use_surface && volume.is_the_only_one_part()) + use_surface = false; + + std::unique_ptr job = nullptr; + if (use_surface) { + // Model to cut surface from. + SurfaceVolumeData::ModelSources sources = create_volume_sources(volume); + if (sources.empty()) + return false; + + Transform3d volume_tr = volume.get_matrix(); + const std::optional &fix_3mf = volume.emboss_shape->fix_3mf_tr; + if (fix_3mf.has_value()) + volume_tr = volume_tr * fix_3mf->inverse(); + + // when it is new applying of use surface than move origin onto surfaca + if (!volume.emboss_shape->projection.use_surface) { + auto offset = calc_surface_offset(selection, raycaster); + if (offset.has_value()) + volume_tr *= Eigen::Translation(*offset); + } + + UpdateSurfaceVolumeData surface_data{std::move(data), {volume_tr, std::move(sources)}}; + job = std::make_unique(std::move(surface_data)); + } else { + job = std::make_unique(std::move(data)); + } + +#ifndef EXECUTE_UPDATE_ON_MAIN_THREAD + auto &worker = wxGetApp().plater()->get_ui_job_worker(); + return queue_job(worker, std::move(job)); +#else + // Run Job on main thread (blocking) - ONLY DEBUG + return execute_job(std::move(job)); +#endif // EXECUTE_UPDATE_ON_MAIN_THREAD +} + +} // namespace Slic3r::GUI::Emboss + +//////////////////////////// +/// private namespace implementation +namespace { +bool check(const DataBase &input, bool check_fontfile, bool use_surface) +{ + bool res = true; + // if (check_fontfile) { + // assert(input.font_file.has_value()); + // res &= input.font_file.has_value(); + // } + // assert(!input.text_configuration.fix_3mf_tr.has_value()); + // res &= !input.text_configuration.fix_3mf_tr.has_value(); + // assert(!input.text_configuration.text.empty()); + // res &= !input.text_configuration.text.empty(); + assert(!input.volume_name.empty()); + res &= !input.volume_name.empty(); + //const FontProp& prop = input.text_configuration.style.prop; + //assert(prop.per_glyph == !input.text_lines.empty()); + //res &= prop.per_glyph == !input.text_lines.empty(); + //if (prop.per_glyph) { + // assert(get_count_lines(input.text_configuration.text) == input.text_lines.size()); + // res &= get_count_lines(input.text_configuration.text) == input.text_lines.size(); + //} + return res; +} + +bool check(GLGizmosManager::EType gizmo) +{ + assert(gizmo == GLGizmosManager::Emboss || gizmo == GLGizmosManager::Svg); + return gizmo == GLGizmosManager::Emboss || gizmo == GLGizmosManager::Svg; +} + +bool check(const CreateVolumeParams &input) +{ + bool res = is_valid(input.volume_type); + auto gizmo_type = static_cast(input.gizmo); + res &= ::check(gizmo_type); + return res; +} + +bool check(const DataCreateVolume &input, bool is_main_thread) +{ + bool check_fontfile = false; + assert(input.base != nullptr); + bool res = input.base != nullptr; + res &= check(*input.base, check_fontfile); + res &= is_valid(input.volume_type); + res &= check(input.gizmo); + assert(!input.base->shape.projection.use_surface); + res &= !input.base->shape.projection.use_surface; + return res; +} +bool check(const DataCreateObject &input) +{ + bool check_fontfile = false; + assert(input.base != nullptr); + bool res = input.base != nullptr; + res &= check(*input.base, check_fontfile); + assert(input.screen_coor.x() >= 0.); + res &= input.screen_coor.x() >= 0.; + assert(input.screen_coor.y() >= 0.); + res &= input.screen_coor.y() >= 0.; + assert(input.bed_shape.size() >= 3); // at least triangle + res &= input.bed_shape.size() >= 3; + res &= check(input.gizmo); + assert(!input.base->shape.projection.use_surface); + res &= !input.base->shape.projection.use_surface; + return res; +} +bool check(const DataUpdate &input, bool is_main_thread, bool use_surface) +{ + bool check_fontfile = true; + assert(input.base != nullptr); + bool res = input.base != nullptr; + res &= check(*input.base, check_fontfile, use_surface); + if (is_main_thread) + assert(get_model_volume(input.volume_id, wxGetApp().model().objects) != nullptr); + assert(input.base->cancel != nullptr); + res &= input.base->cancel != nullptr; + if (is_main_thread) + assert(!input.base->cancel->load()); + assert(!input.base->shape.projection.use_surface); + res &= !input.base->shape.projection.use_surface; + return res; +} +bool check(const CreateSurfaceVolumeData &input, bool is_main_thread) +{ + bool use_surface = true; + assert(input.base != nullptr); + bool res = input.base != nullptr; + res &= check(*input.base, is_main_thread, use_surface); + assert(!input.sources.empty()); + res &= !input.sources.empty(); + res &= check(input.gizmo); + assert(input.base->shape.projection.use_surface); + res &= input.base->shape.projection.use_surface; + return res; +} +bool check(const UpdateSurfaceVolumeData &input, bool is_main_thread) +{ + bool use_surface = true; + assert(input.base != nullptr); + bool res = input.base != nullptr; + res &= check(*input.base, is_main_thread, use_surface); + assert(!input.sources.empty()); + res &= !input.sources.empty(); + assert(input.base->shape.projection.use_surface); + res &= input.base->shape.projection.use_surface; + return res; +} + +template +ExPolygons create_shape(DataBase &input, Fnc was_canceled) { + EmbossShape &es = input.create_shape(); + // TODO: improve to use real size of volume + // ... need world matrix for volume + // ... printer resolution will be fine too + return union_with_delta(es, UNION_DELTA, UNION_MAX_ITERATIN); +} + +//#define STORE_SAMPLING +#ifdef STORE_SAMPLING +#include "libslic3r/SVG.hpp" +#endif // STORE_SAMPLING + +std::vector create_line_bounds(const ExPolygonsWithIds &shapes, size_t count_lines = 0) +{ + if (count_lines == 0) + count_lines = get_count_lines(shapes); + assert(count_lines == get_count_lines(shapes)); + + std::vector result(count_lines); + size_t text_line_index = 0; + // s_i .. shape index + for (const ExPolygonsWithId &shape_id: shapes) { + const ExPolygons &shape = shape_id.expoly; + BoundingBox bb; + if (!shape.empty()) { + bb = get_extents(shape); + } + BoundingBoxes &line_bbs = result[text_line_index]; + line_bbs.push_back(bb); + if (shape_id.id == ENTER_UNICODE) { + // skip enters on beginig and tail + ++text_line_index; + } + } + return result; +} + +template TriangleMesh create_mesh_per_glyph(DataBase &input, Fnc was_canceled) +{ + // method use square of coord stored into int64_t + static_assert(std::is_same()); + const EmbossShape &shape = input.create_shape(); + if (shape.shapes_with_ids.empty()) + return {}; + + // Precalculate bounding boxes of glyphs + // Separate lines of text to vector of Bounds + assert(get_count_lines(shape.shapes_with_ids) == input.text_lines.size()); + size_t count_lines = input.text_lines.size(); + std::vector bbs = create_line_bounds(shape.shapes_with_ids, count_lines); + + double depth = shape.projection.depth / shape.scale; + auto scale_tr = Eigen::Scaling(shape.scale); + + // half of font em size for direction of letter emboss + // double em_2_mm = prop.size_in_mm / 2.; // TODO: fix it + double em_2_mm = 5.; + int32_t em_2_polygon = static_cast(std::round(scale_(em_2_mm))); + + size_t s_i_offset = 0; // shape index offset(for next lines) + indexed_triangle_set result; + for (size_t text_line_index = 0; text_line_index < input.text_lines.size(); ++text_line_index) { + const BoundingBoxes &line_bbs = bbs[text_line_index]; + const TextLine &line = input.text_lines[text_line_index]; + PolygonPoints samples = sample_slice(line, line_bbs, shape.scale); + std::vector angles = calculate_angles(em_2_polygon, samples, line.polygon); + + for (size_t i = 0; i < line_bbs.size(); ++i) { + const BoundingBox &letter_bb = line_bbs[i]; + if (!letter_bb.defined) + continue; + + Vec2d to_zero_vec = letter_bb.center().cast() * shape.scale; // [in mm] + float surface_offset = input.is_outside ? -SAFE_SURFACE_OFFSET : (-shape.projection.depth + SAFE_SURFACE_OFFSET); + + if (input.from_surface.has_value()) + surface_offset += *input.from_surface; + + Eigen::Translation to_zero(-to_zero_vec.x(), 0., static_cast(surface_offset)); + + const double &angle = angles[i]; + Eigen::AngleAxisd rotate(angle + M_PI_2, Vec3d::UnitY()); + + const PolygonPoint &sample = samples[i]; + Vec2d offset_vec = unscale(sample.point); // [in mm] + Eigen::Translation offset_tr(offset_vec.x(), 0., -offset_vec.y()); + Transform3d tr = offset_tr * rotate * to_zero * scale_tr; + + const ExPolygons &letter_shape = shape.shapes_with_ids[s_i_offset + i].expoly; + assert(get_extents(letter_shape) == letter_bb); + auto projectZ = std::make_unique(depth); + ProjectTransform project(std::move(projectZ), tr); + indexed_triangle_set glyph_its = polygons2model(letter_shape, project); + its_merge(result, std::move(glyph_its)); + + if (((s_i_offset + i) % 15) && was_canceled()) + return {}; + } + s_i_offset += line_bbs.size(); + +#ifdef STORE_SAMPLING + { // Debug store polygon + //std::string stl_filepath = "C:/data/temp/line" + std::to_string(text_line_index) + "_model.stl"; + //bool suc = its_write_stl_ascii(stl_filepath.c_str(), "label", result); + + BoundingBox bbox = get_extents(line.polygon); + std::string file_path = "C:/data/temp/line" + std::to_string(text_line_index) + "_letter_position.svg"; + SVG svg(file_path, bbox); + svg.draw(line.polygon); + int32_t radius = bbox.size().x() / 300; + for (size_t i = 0; i < samples.size(); i++) { + const PolygonPoint &pp = samples[i]; + const Point& p = pp.point; + svg.draw(p, "green", radius); + std::string label = std::string(" ")+tc.text[i]; + svg.draw_text(p, label.c_str(), "black"); + + double a = angles[i]; + double length = 3.0 * radius; + Point n(length * std::cos(a), length * std::sin(a)); + svg.draw(Slic3r::Line(p - n, p + n), "Lime"); + } + } +#endif // STORE_SAMPLING + } + return TriangleMesh(std::move(result)); +} + +template +TriangleMesh try_create_mesh(DataBase &input, const Fnc& was_canceled) +{ + if (!input.text_lines.empty()) { + TriangleMesh tm = create_mesh_per_glyph(input, was_canceled); + if (was_canceled()) return {}; + if (!tm.empty()) return tm; + } + + ExPolygons shapes = create_shape(input, was_canceled); + if (shapes.empty()) return {}; + if (was_canceled()) return {}; + + // NOTE: SHAPE_SCALE is applied in ProjectZ + double scale = input.shape.scale; + double depth = input.shape.projection.depth / scale; + auto projectZ = std::make_unique(depth); + float offset = input.is_outside ? -SAFE_SURFACE_OFFSET : (SAFE_SURFACE_OFFSET - input.shape.projection.depth); + if (input.from_surface.has_value()) + offset += *input.from_surface; + Transform3d tr = Eigen::Translation(0., 0.,static_cast(offset)) * Eigen::Scaling(scale); + ProjectTransform project(std::move(projectZ), tr); + if (was_canceled()) return {}; + return TriangleMesh(polygons2model(shapes, project)); +} + +template +TriangleMesh create_mesh(DataBase &input, const Fnc& was_canceled, Job::Ctl& ctl) +{ + // It is neccessary to create some shape + // Emboss text window is opened by creation new emboss text object + TriangleMesh result = try_create_mesh(input, was_canceled); + if (was_canceled()) + return {}; + + if (result.its.empty()) { + result = create_default_mesh(); + if (was_canceled()) + return {}; + // only info + ctl.call_on_main_thread([]() { + create_message("It is used default volume for embossed text, try to change text or font to fix it."); + }); + } + + assert(!result.its.empty()); + return result; +} + +TriangleMesh create_default_mesh() +{ + // When cant load any font use default object loaded from file + std::string path = Slic3r::resources_dir() + "/data/embossed_text.obj"; + TriangleMesh triangle_mesh; + std::string message; + if (!load_obj(path.c_str(), &triangle_mesh, message)) { + // when can't load mesh use cube + return TriangleMesh(its_make_cube(36., 4., 2.5)); + } + return triangle_mesh; +} + +void update_name_in_list(const ObjectList& object_list, const ModelVolume& volume) +{ + const ModelObjectPtrs *objects_ptr = object_list.objects(); + if (objects_ptr == nullptr) + return; + + const ModelObjectPtrs &objects = *objects_ptr; + const ModelObject *object = volume.get_object(); + const ObjectID &object_id = object->id(); + + // search for index of object + int object_index = -1; + for (size_t i = 0; i < objects.size(); ++i) + if (objects[i]->id() == object_id) { + object_index = static_cast(i); + break; + } + + const ModelVolumePtrs volumes = object->volumes; + const ObjectID &volume_id = volume.id(); + + // search for index of volume + int volume_index = -1; + for (size_t i = 0; i < volumes.size(); ++i) + if (volumes[i]->id() == volume_id) { + volume_index = static_cast(i); + break; + } + + if (object_index < 0 || volume_index < 0) + return; + + object_list.update_name_in_list(object_index, volume_index); +} + +void update_volume(TriangleMesh &&mesh, const DataUpdate &data, const Transform3d *tr) +{ + // for sure that some object will be created + if (mesh.its.empty()) + return create_message("Empty mesh can't be created."); + + Plater *plater = wxGetApp().plater(); + // Check gizmo is still open otherwise job should be canceled + assert(plater->canvas3D()->get_gizmos_manager().get_current_type() == GLGizmosManager::Emboss || + plater->canvas3D()->get_gizmos_manager().get_current_type() == GLGizmosManager::Svg); + + // TRN: This is the name of the action appearing in undo/redo stack. + std::string snap_name = _u8L("Text/SVG attribute change"); + Plater::TakeSnapshot snapshot(plater, snap_name, UndoRedo::SnapshotType::GizmoAction); + + ModelVolume *volume = get_model_volume(data.volume_id, plater->model().objects); + + // could appear when user delete edited volume + if (volume == nullptr) + return; + + if (tr) { + volume->set_transformation(*tr); + } else { + // apply fix matrix made by store to .3mf + const std::optional &emboss_shape = volume->emboss_shape; + assert(emboss_shape.has_value()); + if (emboss_shape.has_value() && emboss_shape->fix_3mf_tr.has_value()) + volume->set_transformation(volume->get_matrix() * emboss_shape->fix_3mf_tr->inverse()); + } + + UpdateJob::update_volume(volume, std::move(mesh), *data.base); +} + +void create_volume(TriangleMesh &&mesh, + const ObjectID &object_id, + const ModelVolumeType type, + const std::optional &trmat, + const DataBase &data, + GLGizmosManager::EType gizmo) +{ + GUI_App &app = wxGetApp(); + Plater *plater = app.plater(); + ObjectList *obj_list = app.obj_list(); + GLCanvas3D *canvas = plater->get_view3D_canvas3D(); + ModelObjectPtrs &objects = plater->model().objects; + + ModelObject *obj = nullptr; + size_t object_idx = 0; + for (; object_idx < objects.size(); ++object_idx) { + ModelObject *o = objects[object_idx]; + if (o->id() == object_id) { + obj = o; + break; + } + } + + // Parent object for text volume was propably removed. + // Assumption: User know what he does, so text volume is no more needed. + if (obj == nullptr) + return create_message("Bad object to create volume."); + + if (mesh.its.empty()) + return create_message("Can't create empty volume."); + + plater->take_snapshot(_u8L("Add Emboss text Volume")); + + BoundingBoxf3 instance_bb; + if (!trmat.has_value()) { + // used for align to instance + size_t instance_index = 0; // must exist + instance_bb = obj->instance_bounding_box(instance_index); + } + + // NOTE: be carefull add volume also center mesh !!! + // So first add simple shape(convex hull is also calculated) + ModelVolume *volume = obj->add_volume(make_cube(1., 1., 1.), type); + + // TODO: Refactor to create better way to not set cube at begining + // Revert mesh centering by set mesh after add cube + volume->set_mesh(std::move(mesh)); + volume->calculate_convex_hull(); + + // set a default extruder value, since user can't add it manually + volume->config.set_key_value("extruder", new ConfigOptionInt(0)); + + // do not allow model reload from disk + volume->source.is_from_builtin_objects = true; + + volume->name = data.volume_name; // copy + + if (trmat.has_value()) { + volume->set_transformation(*trmat); + } else { + assert(!data.shape.projection.use_surface); + // Create transformation for volume near from object(defined by glVolume) + // Transformation is inspired add generic volumes in ObjectList::load_generic_subobject + Vec3d volume_size = volume->mesh().bounding_box().size(); + // Translate the new modifier to be pickable: move to the left front corner of the instance's bounding box, lift to print bed. + Vec3d offset_tr(0, // center of instance - Can't suggest width of text before it will be created + -instance_bb.size().y() / 2 - volume_size.y() / 2, // under + volume_size.z() / 2 - instance_bb.size().z() / 2); // lay on bed + // use same instance as for calculation of instance_bounding_box + Transform3d tr = obj->instances.front()->get_transformation().get_matrix_no_offset().inverse(); + Transform3d volume_trmat = tr * Eigen::Translation3d(offset_tr); + volume->set_transformation(volume_trmat); + } + + data.write(*volume); + + // update printable state on canvas + if (type == ModelVolumeType::MODEL_PART) { + volume->get_object()->ensure_on_bed(); + canvas->update_instance_printable_state_for_object(object_idx); + } + + // update volume name in object list + // updata selection after new volume added + // change name of volume in right panel + // select only actual volume + // when new volume is created change selection to this volume + auto add_to_selection = [volume](const ModelVolume *vol) { return vol == volume; }; + wxDataViewItemArray sel = obj_list->reorder_volumes_and_get_selection(object_idx, add_to_selection); + if (!sel.IsEmpty()) + obj_list->select_item(sel.front()); + + obj_list->selection_changed(); + + // Now is valid text volume selected open emboss gizmo + GLGizmosManager &manager = canvas->get_gizmos_manager(); + if (manager.get_current_type() != gizmo) + manager.open_gizmo(gizmo); + + // update model and redraw scene + //canvas->reload_scene(true); + plater->update(); +} + +OrthoProject create_projection_for_cut(Transform3d tr, double shape_scale, const std::pair &z_range) +{ + double min_z = z_range.first - safe_extension; + double max_z = z_range.second + safe_extension; + assert(min_z < max_z); + // range between min and max value + double projection_size = max_z - min_z; + Matrix3d transformation_for_vector = tr.linear(); + // Projection must be negative value. + // System of text coordinate + // X .. from left to right + // Y .. from bottom to top + // Z .. from text to eye + Vec3d untransformed_direction(0., 0., projection_size); + Vec3d project_direction = transformation_for_vector * untransformed_direction; + + // Projection is in direction from far plane + tr.translate(Vec3d(0., 0., min_z)); + tr.scale(shape_scale); + return OrthoProject(tr, project_direction); +} + +OrthoProject3d create_emboss_projection(bool is_outside, float emboss, Transform3d tr, SurfaceCut &cut) +{ + float + front_move = (is_outside) ? emboss : SAFE_SURFACE_OFFSET, + back_move = -((is_outside) ? SAFE_SURFACE_OFFSET : emboss); + its_transform(cut, tr.pretranslate(Vec3d(0., 0., front_move))); + Vec3d from_front_to_back(0., 0., back_move - front_move); + return OrthoProject3d(from_front_to_back); +} + +indexed_triangle_set cut_surface_to_its(const ExPolygons &shapes, const Transform3d& tr,const SurfaceVolumeData::ModelSources &sources, DataBase& input, std::function was_canceled) { + assert(!sources.empty()); + BoundingBox bb = get_extents(shapes); + double shape_scale = input.shape.scale; + + const SurfaceVolumeData::ModelSource *biggest = &sources.front(); + + size_t biggest_count = 0; + // convert index from (s)ources to (i)ndexed (t)riangle (s)ets + std::vector s_to_itss(sources.size(), std::numeric_limits::max()); + std::vector itss; + itss.reserve(sources.size()); + for (const SurfaceVolumeData::ModelSource &s : sources) { + Transform3d mesh_tr_inv = s.tr.inverse(); + Transform3d cut_projection_tr = mesh_tr_inv * tr; + std::pair z_range{0., 1.}; + OrthoProject cut_projection = create_projection_for_cut(cut_projection_tr, shape_scale, z_range); + // copy only part of source model + indexed_triangle_set its = its_cut_AoI(s.mesh->its, bb, cut_projection); + if (its.indices.empty()) + continue; + if (biggest_count < its.vertices.size()) { + biggest_count = its.vertices.size(); + biggest = &s; + } + size_t source_index = &s - &sources.front(); + size_t its_index = itss.size(); + s_to_itss[source_index] = its_index; + itss.emplace_back(std::move(its)); + } + if (itss.empty()) + return {}; + + Transform3d tr_inv = biggest->tr.inverse(); + Transform3d cut_projection_tr = tr_inv * tr; + + size_t itss_index = s_to_itss[biggest - &sources.front()]; + BoundingBoxf3 mesh_bb = bounding_box(itss[itss_index]); + for (const SurfaceVolumeData::ModelSource &s : sources) { + itss_index = s_to_itss[&s - &sources.front()]; + if (itss_index == std::numeric_limits::max()) + continue; + if (&s == biggest) + continue; + + Transform3d tr = s.tr * tr_inv; + bool fix_reflected = true; + indexed_triangle_set &its = itss[itss_index]; + its_transform(its, tr, fix_reflected); + BoundingBoxf3 its_bb = bounding_box(its); + mesh_bb.merge(its_bb); + } + + // tr_inv = transformation of mesh inverted + Transform3d emboss_tr = cut_projection_tr.inverse(); + BoundingBoxf3 mesh_bb_tr = mesh_bb.transformed(emboss_tr); + std::pair z_range{mesh_bb_tr.min.z(), mesh_bb_tr.max.z()}; + OrthoProject cut_projection = create_projection_for_cut(cut_projection_tr, shape_scale, z_range); + float projection_ratio = (-z_range.first + safe_extension) / + (z_range.second - z_range.first + 2 * safe_extension); + + ExPolygons shapes_data; // is used only when text is reflected to reverse polygon points order + const ExPolygons *shapes_ptr = &shapes; + bool is_text_reflected = Slic3r::has_reflection(tr); + if (is_text_reflected) { + // revert order of points in expolygons + // CW --> CCW + shapes_data = shapes; // copy + for (ExPolygon &shape : shapes_data) { + shape.contour.reverse(); + for (Slic3r::Polygon &hole : shape.holes) + hole.reverse(); + } + shapes_ptr = &shapes_data; + } + + // Use CGAL to cut surface from triangle mesh + SurfaceCut cut = cut_surface(*shapes_ptr, itss, cut_projection, projection_ratio); + + if (is_text_reflected) { + for (SurfaceCut::Contour &c : cut.contours) + std::reverse(c.begin(), c.end()); + for (Vec3i &t : cut.indices) + std::swap(t[0], t[1]); + } + + if (cut.empty()) return {}; // There is no valid surface for text projection. + if (was_canceled()) return {}; + + // !! Projection needs to transform cut + OrthoProject3d projection = create_emboss_projection(input.is_outside, input.shape.projection.depth, emboss_tr, cut); + return cut2model(cut, projection); +} + +TriangleMesh cut_per_glyph_surface(DataBase &input1, const SurfaceVolumeData &input2, std::function was_canceled) +{ + // Precalculate bounding boxes of glyphs + // Separate lines of text to vector of Bounds + const EmbossShape &es = input1.create_shape(); + if (was_canceled()) return {}; + if (es.shapes_with_ids.empty()) + throw JobException(_u8L("Font doesn't have any shape for given text.").c_str()); + + assert(get_count_lines(es.shapes_with_ids) == input1.text_lines.size()); + size_t count_lines = input1.text_lines.size(); + std::vector bbs = create_line_bounds(es.shapes_with_ids, count_lines); + + // half of font em size for direction of letter emboss + double em_2_mm = 5.; // TODO: fix it + int32_t em_2_polygon = static_cast(std::round(scale_(em_2_mm))); + + size_t s_i_offset = 0; // shape index offset(for next lines) + indexed_triangle_set result; + for (size_t text_line_index = 0; text_line_index < input1.text_lines.size(); ++text_line_index) { + const BoundingBoxes &line_bbs = bbs[text_line_index]; + const TextLine &line = input1.text_lines[text_line_index]; + PolygonPoints samples = sample_slice(line, line_bbs, es.scale); + std::vector angles = calculate_angles(em_2_polygon, samples, line.polygon); + + for (size_t i = 0; i < line_bbs.size(); ++i) { + const BoundingBox &glyph_bb = line_bbs[i]; + if (!glyph_bb.defined) + continue; + + const double &angle = angles[i]; + auto rotate = Eigen::AngleAxisd(angle + M_PI_2, Vec3d::UnitY()); + + const PolygonPoint &sample = samples[i]; + Vec2d offset_vec = unscale(sample.point); // [in mm] + auto offset_tr = Eigen::Translation(offset_vec.x(), 0., -offset_vec.y()); + + ExPolygons glyph_shape = es.shapes_with_ids[s_i_offset + i].expoly; + assert(get_extents(glyph_shape) == glyph_bb); + + Point offset(-glyph_bb.center().x(), 0); + for (ExPolygon& s: glyph_shape) + s.translate(offset); + + Transform3d modify = offset_tr * rotate; + Transform3d tr = input2.transform * modify; + indexed_triangle_set glyph_its = cut_surface_to_its(glyph_shape, tr, input2.sources, input1, was_canceled); + // move letter in volume on the right position + its_transform(glyph_its, modify); + + // Improve: union instead of merge + its_merge(result, std::move(glyph_its)); + + if (((s_i_offset + i) % 15) && was_canceled()) + return {}; + } + s_i_offset += line_bbs.size(); + } + + if (was_canceled()) return {}; + if (result.empty()) + throw JobException(_u8L("There is no valid surface for text projection.").c_str()); + return TriangleMesh(std::move(result)); +} + +// input can't be const - cache of font +template +TriangleMesh cut_surface(DataBase& input1, const SurfaceVolumeData& input2, const Fnc& was_canceled) +{ + if (!input1.text_lines.empty()) + return cut_per_glyph_surface(input1, input2, was_canceled); + + ExPolygons shapes = create_shape(input1, was_canceled); + if (was_canceled()) return {}; + if (shapes.empty()) + throw JobException(_u8L("Font doesn't have any shape for given text.").c_str()); + + indexed_triangle_set its = cut_surface_to_its(shapes, input2.transform, input2.sources, input1, was_canceled); + if (was_canceled()) return {}; + if (its.empty()) + throw JobException(_u8L("There is no valid surface for text projection.").c_str()); + + return TriangleMesh(std::move(its)); +} + +SurfaceVolumeData::ModelSources create_sources(const ModelVolumePtrs &volumes, std::optional text_volume_id) +{ + SurfaceVolumeData::ModelSources result; + result.reserve(volumes.size() - 1); + for (const ModelVolume *v : volumes) { + if (text_volume_id.has_value() && v->id().id == *text_volume_id) + continue; + // skip modifiers and negative volumes, ... + if (!v->is_model_part()) + continue; + const TriangleMesh &tm = v->mesh(); + if (tm.empty()) + continue; + if (tm.its.empty()) + continue; + result.push_back({v->get_mesh_shared_ptr(), v->get_matrix()}); + } + return result; +} + +bool process(std::exception_ptr &eptr) +{ + if (!eptr) + return false; + try { + std::rethrow_exception(eptr); + } catch (JobException &e) { + create_message(e.what()); + eptr = nullptr; + } + return true; +} + +bool finalize(bool canceled, std::exception_ptr &eptr, const DataBase &input) +{ + // doesn't care about exception when process was canceled by user + if (canceled || input.cancel->load()) { + eptr = nullptr; + return false; + } + return !process(eptr); +} + +bool is_valid(ModelVolumeType volume_type) +{ + assert(volume_type != ModelVolumeType::INVALID); + assert(volume_type == ModelVolumeType::MODEL_PART || + volume_type == ModelVolumeType::NEGATIVE_VOLUME || + volume_type == ModelVolumeType::PARAMETER_MODIFIER); + if (volume_type == ModelVolumeType::MODEL_PART || + volume_type == ModelVolumeType::NEGATIVE_VOLUME || + volume_type == ModelVolumeType::PARAMETER_MODIFIER) + return true; + + BOOST_LOG_TRIVIAL(error) << "Can't create embossed volume with this type: " << (int) volume_type; + return false; +} + +bool start_create_volume_job(Worker &worker, + const ModelObject &object, + const std::optional &volume_tr, + DataBasePtr data, + ModelVolumeType volume_type, + GLGizmosManager::EType gizmo) +{ + bool &use_surface = data->shape.projection.use_surface; + std::unique_ptr job; + if (use_surface) { + // Model to cut surface from. + SurfaceVolumeData::ModelSources sources = create_sources(object.volumes); + if (sources.empty() || !volume_tr.has_value()) { + use_surface = false; + } else { + SurfaceVolumeData sfvd{*volume_tr, std::move(sources)}; + CreateSurfaceVolumeData surface_data{std::move(sfvd), std::move(data), volume_type, object.id(), gizmo}; + job = std::make_unique(std::move(surface_data)); + } + } + if (!use_surface) { + // create volume + DataCreateVolume create_volume_data{std::move(data), volume_type, object.id(), volume_tr, gizmo}; + job = std::make_unique(std::move(create_volume_data)); + } + return queue_job(worker, std::move(job)); +} + +const GLVolume *find_closest( + const Selection &selection, const Vec2d &screen_center, const Camera &camera, const ModelObjectPtrs &objects, Vec2d *closest_center) +{ + assert(closest_center != nullptr); + const GLVolume *closest = nullptr; + const Selection::IndicesList &indices = selection.get_volume_idxs(); + assert(!indices.empty()); // no selected volume + if (indices.empty()) + return closest; + + double center_sq_distance = std::numeric_limits::max(); + for (unsigned int id : indices) { + const GLVolume *gl_volume = selection.get_volume(id); + if (const ModelVolume *volume = get_model_volume(*gl_volume, objects); + volume == nullptr || !volume->is_model_part()) + continue; + Slic3r::Polygon hull = CameraUtils::create_hull2d(camera, *gl_volume); + Vec2d c = hull.centroid().cast(); + Vec2d d = c - screen_center; + bool is_bigger_x = std::fabs(d.x()) > std::fabs(d.y()); + if ((is_bigger_x && d.x() * d.x() > center_sq_distance) || + (!is_bigger_x && d.y() * d.y() > center_sq_distance)) + continue; + + double distance = d.squaredNorm(); + if (center_sq_distance < distance) + continue; + center_sq_distance = distance; + + *closest_center = c; + closest = gl_volume; + } + return closest; +} + +bool start_create_object_job(const CreateVolumeParams &input, DataBasePtr emboss_data, const Vec2d &coor) +{ + const Pointfs &bed_shape = input.build_volume.printable_area(); + auto gizmo_type = static_cast(input.gizmo); + DataCreateObject data{std::move(emboss_data), coor, input.camera, bed_shape, gizmo_type}; + auto job = std::make_unique(std::move(data)); + return queue_job(input.worker, std::move(job)); +} + +bool start_create_volume_on_surface_job(CreateVolumeParams &input, DataBasePtr data, const Vec2d &screen_coor, bool try_no_coor) +{ + auto on_bad_state = [&input, try_no_coor](DataBasePtr data_, const ModelObject *object = nullptr) { + if (try_no_coor) { + // Can't create on coordinate try to create somewhere + return start_create_volume_without_position(input, std::move(data_)); + } else { + // In centroid of convex hull is not hit with object. e.g. torid + // soo create transfomation on border of object + + // there is no point on surface so no use of surface will be applied + if (data_->shape.projection.use_surface) + data_->shape.projection.use_surface = false; + + if (object == nullptr) + return false; + + auto gizmo_type = static_cast(input.gizmo); + return start_create_volume_job(input.worker, *object, {}, std::move(data_), input.volume_type, gizmo_type); + } + }; + + assert(input.gl_volume != nullptr); + if (input.gl_volume == nullptr) + return on_bad_state(std::move(data)); + + const Model *model = input.canvas.get_model(); + + assert(model != nullptr); + if (model == nullptr) + return on_bad_state(std::move(data)); + + const ModelObjectPtrs &objects = model->objects; + const ModelVolume *volume = get_model_volume(*input.gl_volume, objects); + assert(volume != nullptr); + if (volume == nullptr) + return on_bad_state(std::move(data)); + + const ModelInstance *instance = get_model_instance(*input.gl_volume, objects); + assert(instance != nullptr); + if (instance == nullptr) + return on_bad_state(std::move(data)); + + const ModelObject *object = volume->get_object(); + assert(object != nullptr); + if (object == nullptr) + return on_bad_state(std::move(data)); + + auto cond = RaycastManager::AllowVolumes({volume->id().id}); + RaycastManager::Meshes meshes = create_meshes(input.canvas, cond); + input.raycaster.actualize(*instance, &cond, &meshes); + std::optional hit = ray_from_camera(input.raycaster, screen_coor, input.camera, &cond); + + // context menu for add text could be open only by right click on an + // object. After right click, object is selected and object_idx is set + // also hit must exist. But there is options to add text by object list + if (!hit.has_value()) + // When model is broken. It could appear that hit miss the object. + // So add part near by in simmilar manner as right panel do + return on_bad_state(std::move(data), object); + + // Create result volume transformation + Transform3d surface_trmat = create_transformation_onto_surface(hit->position, hit->normal, UP_LIMIT); + apply_transformation(input.angle, input.distance, surface_trmat); + Transform3d transform = instance->get_matrix().inverse() * surface_trmat; + auto gizmo_type = static_cast(input.gizmo); + // Try to cast ray into scene and find object for add volume + return start_create_volume_job(input.worker, *object, transform, std::move(data), input.volume_type, gizmo_type); +} + +void create_message(const std::string &message) { + show_error(nullptr, message.c_str()); +} + +} // namespace diff --git a/src/slic3r/GUI/Jobs/EmbossJob.hpp b/src/slic3r/GUI/Jobs/EmbossJob.hpp new file mode 100644 index 0000000000..8dec29572c --- /dev/null +++ b/src/slic3r/GUI/Jobs/EmbossJob.hpp @@ -0,0 +1,265 @@ +///|/ Copyright (c) Prusa Research 2021 - 2022 Oleksandra Iushchenko @YuSanka, Filip Sykala @Jony01 +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ +#ifndef slic3r_EmbossJob_hpp_ +#define slic3r_EmbossJob_hpp_ + +#include +#include +#include +#include +#include // ExPolygonsWithIds +#include "libslic3r/Point.hpp" // Transform3d +#include "libslic3r/ObjectID.hpp" + +#include "slic3r/GUI/Camera.hpp" +#include "slic3r/GUI/TextLines.hpp" + +#include "Job.hpp" + +// forward declarations +namespace Slic3r { +class TriangleMesh; +class ModelVolume; +enum class ModelVolumeType : int; +class BuildVolume; +namespace GUI { +class RaycastManager; +class Plater; +class GLCanvas3D; +class Worker; +class Selection; +}} + +namespace Slic3r::GUI::Emboss { + +/// +/// Base data hold data for create emboss shape +/// +class DataBase +{ +public: + DataBase(const std::string& volume_name, std::shared_ptr> cancel) + : volume_name(volume_name), cancel(std::move(cancel)) {} + DataBase(const std::string& volume_name, std::shared_ptr> cancel, EmbossShape&& shape) + : volume_name(volume_name), cancel(std::move(cancel)), shape(std::move(shape)){} + DataBase(DataBase &&) = default; + virtual ~DataBase() = default; + + /// + /// Create shape + /// e.g. Text extract glyphs from font + /// Not 'const' function because it could modify shape + /// + virtual EmbossShape& create_shape() { return shape; }; + + /// + /// Write data how to reconstruct shape to volume + /// + /// Data object for store emboss params + virtual void write(ModelVolume &volume) const; + + // Define projection move + // True (raised) .. move outside from surface (MODEL_PART) + // False (engraved).. move into object (NEGATIVE_VOLUME) + bool is_outside = true; + + // Define per letter projection on one text line + // [optional] It is not used when empty + Slic3r::Emboss::TextLines text_lines = {}; + + // [optional] Define distance for surface + // It is used only for flat surface (not cutted) + // Position of Zero(not set value) differ for MODEL_PART and NEGATIVE_VOLUME + std::optional from_surface; + + // new volume name + std::string volume_name; + + // flag that job is canceled + // for time after process. + std::shared_ptr> cancel; + + // shape to emboss + EmbossShape shape; +}; + +/// +/// Hold neccessary data to create ModelVolume in job +/// Volume is created on the surface of existing volume in object. +/// NOTE: EmbossDataBase::font_file doesn't have to be valid !!! +/// +struct DataCreateVolume : public DataBase +{ + // define embossed volume type + ModelVolumeType volume_type; + + // parent ModelObject index where to create volume + ObjectID object_id; + + // new created volume transformation + Transform3d trmat; +}; +using DataBasePtr = std::unique_ptr; + +/// +/// Hold neccessary data to update embossed text object in job +/// +struct DataUpdate +{ + // Hold data about shape + DataBasePtr base; + + // unique identifier of volume to change + ObjectID volume_id; +}; + +/// +/// Update text shape in existing text volume +/// Predict that there is only one runnig(not canceled) instance of it +/// +class UpdateJob : public Job +{ + DataUpdate m_input; + TriangleMesh m_result; + +public: + // move params to private variable + explicit UpdateJob(DataUpdate &&input); + + /// + /// Create new embossed volume by m_input data and store to m_result + /// + /// Control containing cancel flag + void process(Ctl &ctl) override; + + /// + /// Update volume - change object_id + /// + /// Was process canceled. + /// NOTE: Be carefull it doesn't care about + /// time between finished process and started finalize part. + /// unused + void finalize(bool canceled, std::exception_ptr &eptr) override; + + /// + /// Update text volume + /// + /// Volume to be updated + /// New Triangle mesh for volume + /// Data to write into volume + static void update_volume(ModelVolume *volume, TriangleMesh &&mesh, const DataBase &base); +}; + +struct SurfaceVolumeData +{ + // Transformation of volume inside of object + Transform3d transform; + + struct ModelSource + { + // source volumes + std::shared_ptr mesh; + // Transformation of volume inside of object + Transform3d tr; + }; + using ModelSources = std::vector; + ModelSources sources; +}; + +/// +/// Hold neccessary data to update embossed text object in job +/// +struct UpdateSurfaceVolumeData : public DataUpdate, public SurfaceVolumeData{}; + +/// +/// Update text volume to use surface from object +/// +class UpdateSurfaceVolumeJob : public Job +{ + UpdateSurfaceVolumeData m_input; + TriangleMesh m_result; + +public: + // move params to private variable + explicit UpdateSurfaceVolumeJob(UpdateSurfaceVolumeData &&input); + void process(Ctl &ctl) override; + void finalize(bool canceled, std::exception_ptr &eptr) override; +}; + +/// +/// Copied triangles from object to be able create mesh for cut surface from +/// +/// Define embossed volume +/// Source data for cut surface from +SurfaceVolumeData::ModelSources create_volume_sources(const ModelVolume &volume); + +/// +/// shorten params for start_crate_volume functions +/// +struct CreateVolumeParams +{ + GLCanvas3D &canvas; + + // Direction of ray into scene + const Camera &camera; + + // To put new object on the build volume + const BuildVolume &build_volume; + + // used to emplace job for execution + Worker &worker; + + // New created volume type + ModelVolumeType volume_type; + + // Contain AABB trees from scene + RaycastManager &raycaster; + + // Define which gizmo open on the success + unsigned char gizmo; // GLGizmosManager::EType + + // Volume define object to add new volume + const GLVolume *gl_volume; + + // Wanted additionl move in Z(emboss) direction of new created volume + std::optional distance = {}; + + // Wanted additionl rotation around Z of new created volume + std::optional angle = {}; +}; + +/// +/// Create new volume on position of mouse cursor +/// +/// canvas + camera + bed shape + +/// Shape of emboss +/// New created volume type +/// Knows object in scene +/// Define which gizmo open on the success - enum GLGizmosManager::EType +/// Define position where to create volume +/// Wanted additionl move in Z(emboss) direction of new created volume +/// Wanted additionl rotation around Z of new created volume +/// True on success otherwise False +bool start_create_volume(CreateVolumeParams &input, DataBasePtr data, const Vec2d &mouse_pos); + +/// +/// Same as previous function but without mouse position +/// Need to suggest position or put near the selection +/// +bool start_create_volume_without_position(CreateVolumeParams &input, DataBasePtr data); + +/// +/// Start job for update embossed volume +/// +/// define update data +/// Volume to be updated +/// Keep model and gl_volumes - when start use surface volume must be selected +/// Could cast ray to scene +/// True when start job otherwise false +bool start_update_volume(DataUpdate &&data, const ModelVolume &volume, const Selection &selection, RaycastManager &raycaster); + +} // namespace Slic3r::GUI + +#endif // slic3r_EmbossJob_hpp_ diff --git a/src/slic3r/GUI/Jobs/FillBedJob.cpp b/src/slic3r/GUI/Jobs/FillBedJob.cpp index 37dfd13864..267fbee82a 100644 --- a/src/slic3r/GUI/Jobs/FillBedJob.cpp +++ b/src/slic3r/GUI/Jobs/FillBedJob.cpp @@ -1,3 +1,7 @@ +///|/ Copyright (c) Prusa Research 2020 - 2023 Tomáš Mészáros @tamasmeszaros +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ #include "FillBedJob.hpp" #include "libslic3r/Model.hpp" @@ -198,8 +202,12 @@ void FillBedJob::prepare() p.translation(X) -= p.bed_idx * stride;*/ } -void FillBedJob::process() +void FillBedJob::process(Ctl &ctl) { + auto statustxt = _u8L("Filling"); + ctl.call_on_main_thread([this] { prepare(); }).wait(); + ctl.update_status(0, statustxt); + if (m_object_idx == -1 || m_selected.empty()) return; update_arrange_params(params, m_plater->config(), m_selected); @@ -217,13 +225,13 @@ void FillBedJob::process() update_unselected_items_inflation(m_unselected, m_plater->config(), params); bool do_stop = false; - params.stopcondition = [this, &do_stop]() { - return was_canceled() || do_stop; + params.stopcondition = [&ctl, &do_stop]() { + return ctl.was_canceled() || do_stop; }; - params.progressind = [this](unsigned st,std::string str="") { + params.progressind = [this, &ctl, &statustxt](unsigned st,std::string str="") { if (st > 0) - update_status(st, _L("Filling") + " " + wxString::FromUTF8(str)); + ctl.update_status(st * 100 / status_range(), statustxt + " " + str); }; params.on_packed = [&do_stop] (const ArrangePolygon &ap) { @@ -235,15 +243,18 @@ void FillBedJob::process() arrangement::arrange(m_selected, m_unselected, m_bedpts, params); // finalize just here. - update_status(m_status_range, was_canceled() ? - _L("Bed filling canceled.") : - _L("Bed filling done.")); + ctl.update_status(100, ctl.was_canceled() ? + _u8L("Bed filling canceled.") : + _u8L("Bed filling done.")); } -void FillBedJob::finalize() +FillBedJob::FillBedJob() : m_plater{wxGetApp().plater()} {} + +void FillBedJob::finalize(bool canceled, std::exception_ptr &eptr) { // Ignore the arrange result if aborted. - if (was_canceled()) return; + if (canceled || eptr) + return; if (m_object_idx == -1) return; @@ -304,8 +315,6 @@ void FillBedJob::finalize() m_plater->update(); } - - Job::finalize(); } }} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/Jobs/FillBedJob.hpp b/src/slic3r/GUI/Jobs/FillBedJob.hpp index f78b1f9f2c..76413434a2 100644 --- a/src/slic3r/GUI/Jobs/FillBedJob.hpp +++ b/src/slic3r/GUI/Jobs/FillBedJob.hpp @@ -1,3 +1,7 @@ +///|/ Copyright (c) Prusa Research 2020 - 2023 Tomáš Mészáros @tamasmeszaros, David Kocík @kocikdav +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ #ifndef FILLBEDJOB_HPP #define FILLBEDJOB_HPP @@ -7,7 +11,7 @@ namespace Slic3r { namespace GUI { class Plater; -class FillBedJob : public PlaterJob +class FillBedJob : public Job { int m_object_idx = -1; @@ -24,23 +28,21 @@ class FillBedJob : public PlaterJob arrangement::ArrangeParams params; int m_status_range = 0; - -protected: - - void prepare() override; - void process() override; + Plater *m_plater; public: - FillBedJob(std::shared_ptr pri, Plater *plater) - : PlaterJob{std::move(pri), plater} - {} - int status_range() const override + void prepare(); + void process(Ctl &ctl) override; + + FillBedJob(); + + int status_range() const { return m_status_range; } - void finalize() override; + void finalize(bool canceled, std::exception_ptr &e) override; }; }} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/Jobs/Job.cpp b/src/slic3r/GUI/Jobs/Job.cpp deleted file mode 100644 index 19c93643a2..0000000000 --- a/src/slic3r/GUI/Jobs/Job.cpp +++ /dev/null @@ -1,167 +0,0 @@ -#include -#include - -#include "Job.hpp" -#include -#include - -namespace Slic3r { - -void GUI::Job::run(std::exception_ptr &eptr) -{ - m_running.store(true); - try { - process(); - } catch (...) { - eptr = std::current_exception(); - } - - m_running.store(false); - - // ensure to call the last status to finalize the job - update_status(status_range(), ""); -} - -void GUI::Job::update_status(int st, const wxString &msg) -{ - auto evt = new wxThreadEvent(wxEVT_THREAD, m_thread_evt_id); - evt->SetInt(st); - evt->SetString(msg); - wxQueueEvent(this, evt); -} - -void GUI::Job::update_percent_finish() -{ - m_progress->clear_percent(); -} - -void GUI::Job::show_error_info(wxString msg, int code, wxString description, wxString extra) -{ - m_progress->show_error_info(msg, code, description, extra); -} - -GUI::Job::Job(std::shared_ptr pri) - : m_progress(std::move(pri)) -{ - m_thread_evt_id = wxNewId(); - - Bind(wxEVT_THREAD, [this](const wxThreadEvent &evt) { - if (m_finalizing) return; - - auto msg = evt.GetString(); - if (!msg.empty() && !m_worker_error) - m_progress->set_status_text(msg.ToUTF8().data()); - - if (m_finalized) return; - - m_progress->set_progress(evt.GetInt()); - if (evt.GetInt() == status_range() || m_worker_error) { - // set back the original range and cancel callback - m_progress->set_range(m_range); - // Make sure progress indicators get the last value of their range - // to make sure they close, fade out, whathever - m_progress->set_progress(m_range); - m_progress->set_cancel_callback(); - wxEndBusyCursor(); - - if (m_worker_error) { - m_finalized = true; - m_progress->set_status_text(""); - m_progress->set_progress(m_range); - on_exception(m_worker_error); - } - else { - // This is an RAII solution to remember that finalization is - // running. The run method calls update_status(status_range(), "") - // at the end, which queues up a call to this handler in all cases. - // If process also calls update_status with maxed out status arg - // it will call this handler twice. It is not a problem unless - // yield is called inside the finilize() method, which would - // jump out of finalize and call this handler again. - struct Finalizing { - bool &flag; - Finalizing (bool &f): flag(f) { flag = true; } - ~Finalizing() { flag = false; } - } fin(m_finalizing); - - finalize(); - } - - // dont do finalization again for the same process - m_finalized = true; - } - }, m_thread_evt_id); -} - -void GUI::Job::start() -{ // Start the job. No effect if the job is already running - if (!m_running.load()) { - prepare(); - - // Save the current status indicatior range and push the new one - m_range = m_progress->get_range(); - m_progress->set_range(status_range()); - - // init cancellation flag and set the cancel callback - m_canceled.store(false); - m_progress->set_cancel_callback( - [this]() { m_canceled.store(true); }); - - m_finalized = false; - m_finalizing = false; - - // Changing cursor to busy - wxBeginBusyCursor(); - - try { // Execute the job - m_worker_error = nullptr; - m_thread = create_thread([this] { this->run(m_worker_error); }); - } catch (std::exception &) { - update_status(status_range(), - _(L("Error! Unable to create thread!"))); - } - - // The state changes will be undone when the process hits the - // last status value, in the status update handler (see ctor) - } -} - -bool GUI::Job::join(int timeout_ms) -{ - if (!m_thread.joinable()) return true; - - if (timeout_ms <= 0) - m_thread.join(); - else if (!m_thread.try_join_for(boost::chrono::milliseconds(timeout_ms))) - return false; - - return true; -} - -void GUI::ExclusiveJobGroup::start(size_t jid) { - assert(jid < m_jobs.size()); - stop_all(); - m_jobs[jid]->start(); -} - -void GUI::ExclusiveJobGroup::join_all(int wait_ms) -{ - std::vector aborted(m_jobs.size(), false); - - for (size_t jid = 0; jid < m_jobs.size(); ++jid) - aborted[jid] = m_jobs[jid]->join(wait_ms); - - if (!std::all_of(aborted.begin(), aborted.end(), [](bool t) { return t; })) - BOOST_LOG_TRIVIAL(error) << "Could not abort a job!"; -} - -bool GUI::ExclusiveJobGroup::is_any_running() const -{ - return std::any_of(m_jobs.begin(), m_jobs.end(), - [](const std::unique_ptr &j) { - return j->is_running(); - }); -} - -} - diff --git a/src/slic3r/GUI/Jobs/Job.hpp b/src/slic3r/GUI/Jobs/Job.hpp index a92dfbfbd1..6c251cac31 100644 --- a/src/slic3r/GUI/Jobs/Job.hpp +++ b/src/slic3r/GUI/Jobs/Job.hpp @@ -1,130 +1,68 @@ +///|/ Copyright (c) Prusa Research 2019 - 2021 Tomáš Mészáros @tamasmeszaros, David Kocík @kocikdav, Vojtěch Bubník @bubnikv +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ #ifndef JOB_HPP #define JOB_HPP #include #include +#include #include "libslic3r/libslic3r.h" - -#include - #include "ProgressIndicator.hpp" -#include - -#include - namespace Slic3r { namespace GUI { -// A class to handle UI jobs like arranging and optimizing rotation. -// These are not instant jobs, the user has to be informed about their -// state in the status progress indicator. On the other hand they are -// separated from the background slicing process. Ideally, these jobs should -// run when the background process is not running. -// -// TODO: A mechanism would be useful for blocking the plater interactions: -// objects would be frozen for the user. In case of arrange, an animation -// could be shown, or with the optimize orientations, partial results -// could be displayed. -class Job : public wxEvtHandler -{ - int m_range = 100; - int m_thread_evt_id = wxID_ANY; - boost::thread m_thread; - std::atomic m_running{false}, m_canceled{false}; - bool m_finalized = false, m_finalizing = false; - std::shared_ptr m_progress; - std::exception_ptr m_worker_error = nullptr; - - void run(std::exception_ptr &); - -protected: - // status range for a particular job - virtual int status_range() const { return 100; } - - // status update, to be used from the work thread (process() method) - void update_status(int st, const wxString &msg = ""); - - void update_percent_finish(); - - void show_error_info(wxString msg, int code, wxString description, wxString extra); - - bool was_canceled() const { return m_canceled.load(); } - - // Launched just before start(), a job can use it to prepare internals - virtual void prepare() {} - - // The method where the actual work of the job should be defined. - virtual void process() = 0; - - // Launched when the job is finished. It refreshes the 3Dscene by def. - virtual void finalize() { m_finalized = true; } - - // Exceptions occuring in process() are redirected from the worker thread - // into the main (UI) thread. This method is called from the main thread and - // can be overriden to handle these exceptions. - virtual void on_exception(const std::exception_ptr &eptr) - { - if (eptr) std::rethrow_exception(eptr); - } - +// A class representing a job that is to be run in the background, not blocking +// the main thread. Running it is up to a Worker object (see Worker interface) +class Job { public: + enum JobPrepareState { PREPARE_STATE_DEFAULT = 0, PREPARE_STATE_MENU = 1, }; - Job(std::shared_ptr pri); - - bool is_finalized() const { return m_finalized; } - - Job(const Job &) = delete; - Job(Job &&) = delete; - Job &operator=(const Job &) = delete; - Job &operator=(Job &&) = delete; - - void start(); - - // To wait for the running job and join the threads. False is - // returned if the timeout has been reached and the job is still - // running. Call cancel() before this fn if you want to explicitly - // end the job. - bool join(int timeout_ms = 0); - - bool is_running() const { return m_running.load(); } - void cancel() { m_canceled.store(true); } -}; + // A controller interface that informs the job about cancellation and + // makes it possible for the job to advertise its status. + class Ctl { + public: + virtual ~Ctl() = default; -// Jobs defined inside the group class will be managed so that only one can -// run at a time. Also, the background process will be stopped if a job is -// started. -class ExclusiveJobGroup -{ - static const int ABORT_WAIT_MAX_MS = 10000; - - std::vector> m_jobs; - -protected: - virtual void before_start() {} - -public: - virtual ~ExclusiveJobGroup() = default; - - size_t add_job(std::unique_ptr &&job) - { - m_jobs.emplace_back(std::move(job)); - return m_jobs.size() - 1; - } - - void start(size_t jid); - - void cancel_all() { for (auto& j : m_jobs) j->cancel(); } - - void join_all(int wait_ms = 0); - - void stop_all() { cancel_all(); join_all(ABORT_WAIT_MAX_MS); } - - bool is_any_running() const; + // status update, to be used from the work thread (process() method) + virtual void update_status(int st, const std::string &msg = "") = 0; + + // Returns true if the job was asked to cancel itself. + virtual bool was_canceled() const = 0; + + // Orca: + virtual void clear_percent() = 0; + virtual void show_error_info(const std::string &msg, int code, const std::string &description, const std::string &extra) = 0; + + // Execute a functor on the main thread. Note that the exact time of + // execution is hard to determine. This can be used to make modifications + // on the UI, like displaying some intermediate results or modify the + // cursor. + // This function returns a std::future object which enables the + // caller to optionally wait for the main thread to finish the function call. + virtual std::future call_on_main_thread(std::function fn) = 0; + }; + + virtual ~Job() = default; + + // The method where the actual work of the job should be defined. This is + // run on the worker thread. + virtual void process(Ctl &ctl) = 0; + + // Launched when the job is finished on the UI thread. + // If the job was cancelled, the first parameter will have a true value. + // Exceptions occuring in process() are redirected from the worker thread + // into the main (UI) thread. This method receives the exception and can + // handle it properly. Assign nullptr to this second argument before + // function return to prevent further action. Leaving it with a non-null + // value will result in rethrowing by the worker. + virtual void finalize(bool /*canceled*/, std::exception_ptr &) {} }; }} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/Jobs/NotificationProgressIndicator.cpp b/src/slic3r/GUI/Jobs/NotificationProgressIndicator.cpp index 13470f7ad4..318cc066c4 100644 --- a/src/slic3r/GUI/Jobs/NotificationProgressIndicator.cpp +++ b/src/slic3r/GUI/Jobs/NotificationProgressIndicator.cpp @@ -1,3 +1,7 @@ +///|/ Copyright (c) Prusa Research 2021 Tomáš Mészáros @tamasmeszaros +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ #include "NotificationProgressIndicator.hpp" #include "slic3r/GUI/NotificationManager.hpp" @@ -22,11 +26,15 @@ void NotificationProgressIndicator::set_range(int range) void NotificationProgressIndicator::set_cancel_callback(CancelFn fn) { - m_nm->progress_indicator_set_cancel_callback(std::move(fn)); + m_cancelfn = std::move(fn); + m_nm->progress_indicator_set_cancel_callback(m_cancelfn); } void NotificationProgressIndicator::set_progress(int pr) { + if (!pr) + set_cancel_callback(m_cancelfn); + m_nm->progress_indicator_set_progress(pr); } diff --git a/src/slic3r/GUI/Jobs/NotificationProgressIndicator.hpp b/src/slic3r/GUI/Jobs/NotificationProgressIndicator.hpp index ba0e899165..44fa41797a 100644 --- a/src/slic3r/GUI/Jobs/NotificationProgressIndicator.hpp +++ b/src/slic3r/GUI/Jobs/NotificationProgressIndicator.hpp @@ -1,3 +1,7 @@ +///|/ Copyright (c) Prusa Research 2021 Tomáš Mészáros @tamasmeszaros +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ #ifndef NOTIFICATIONPROGRESSINDICATOR_HPP #define NOTIFICATIONPROGRESSINDICATOR_HPP @@ -9,6 +13,7 @@ class NotificationManager; class NotificationProgressIndicator: public ProgressIndicator { NotificationManager *m_nm = nullptr; + CancelFn m_cancelfn; public: diff --git a/src/slic3r/GUI/Jobs/OrientJob.cpp b/src/slic3r/GUI/Jobs/OrientJob.cpp index c750a509a1..1dcc510eea 100644 --- a/src/slic3r/GUI/Jobs/OrientJob.cpp +++ b/src/slic3r/GUI/Jobs/OrientJob.cpp @@ -140,29 +140,23 @@ void OrientJob::prepare() int state = m_plater->get_prepare_state(); m_plater->get_notification_manager()->bbl_close_plateinfo_notification(); if (state == Job::JobPrepareState::PREPARE_STATE_DEFAULT) { - only_on_partplate = false; + // only_on_partplate = false; prepare_selected(); } else if (state == Job::JobPrepareState::PREPARE_STATE_MENU) { - only_on_partplate = true; // only arrange items on current plate + // only_on_partplate = true; // only arrange items on current plate prepare_partplate(); } } -void OrientJob::on_exception(const std::exception_ptr &eptr) +void OrientJob::process(Ctl &ctl) { - try { - if (eptr) - std::rethrow_exception(eptr); - } catch (std::exception &) { - PlaterJob::on_exception(eptr); - } -} + static const auto arrangestr = _u8L("Orienting..."); + + ctl.update_status(0, arrangestr); + ctl.call_on_main_thread([this]{ prepare(); }).wait();; -void OrientJob::process() -{ auto start = std::chrono::steady_clock::now(); - static const auto arrangestr = _(L("Orienting...")); const GLCanvas3D::OrientSettings& settings = m_plater->canvas3D()->get_orient_settings(); @@ -177,11 +171,11 @@ void OrientJob::process() } auto count = unsigned(m_selected.size() + m_unprintable.size()); - params.stopcondition = [this]() { return was_canceled(); }; + params.stopcondition = [&ctl]() { return ctl.was_canceled(); }; - params.progressind = [this, count](unsigned st, std::string orientstr) { + params.progressind = [this, count, &ctl](unsigned st, std::string orientstr) { st += m_unprintable.size(); - if (st > 0) update_status(int(st / float(count) * 100), _L("Orienting") + " " + orientstr); + if (st > 0) ctl.update_status(int(st / float(count) * 100), _u8L("Orienting") + " " + orientstr); }; orientation::orient(m_selected, m_unselected, params); @@ -194,15 +188,27 @@ void OrientJob::process() << "Orientation: " << m_selected.back().orientation.transpose() << "; v,phi: " << m_selected.back().axis.transpose() << ", " << m_selected.back().angle << "; euler: " << m_selected.back().euler_angles.transpose(); // finalize just here. - //update_status(int(count), - // was_canceled() ? _(L("Orienting canceled.")) - // : _(L(ss.str().c_str()))); - wxGetApp().plater()->show_status_message(was_canceled() ? "Orienting canceled." : ss.str()); + ctl.update_status(100, + ctl.was_canceled() ? _u8L("Orienting canceled.") + : _u8L(ss.str().c_str())); + wxGetApp().plater()->show_status_message(ctl.was_canceled() ? "Orienting canceled." : ss.str()); } -void OrientJob::finalize() { +OrientJob::OrientJob() : m_plater{wxGetApp().plater()} {} + +void OrientJob::finalize(bool canceled, std::exception_ptr &eptr) +{ + try { + if (eptr) + std::rethrow_exception(eptr); + eptr = nullptr; + } catch (...) { + eptr = std::current_exception(); + } + // Ignore the arrange result if aborted. - if (was_canceled()) return; + if (canceled || eptr) + return; for (OrientMesh& mesh : m_selected) { @@ -214,8 +220,6 @@ void OrientJob::finalize() { // BBS //wxGetApp().obj_manipul()->set_dirty(); - - Job::finalize(); } orientation::OrientMesh OrientJob::get_orient_mesh(ModelInstance* instance) diff --git a/src/slic3r/GUI/Jobs/OrientJob.hpp b/src/slic3r/GUI/Jobs/OrientJob.hpp index 88907b6b99..968be209ed 100644 --- a/src/slic3r/GUI/Jobs/OrientJob.hpp +++ b/src/slic3r/GUI/Jobs/OrientJob.hpp @@ -1,7 +1,7 @@ #ifndef ORIENTJOB_HPP #define ORIENTJOB_HPP -#include "PlaterJob.hpp" +#include "Job.hpp" #include "libslic3r/Orient.hpp" namespace Slic3r { @@ -10,12 +10,15 @@ class ModelObject; namespace GUI { -class OrientJob : public PlaterJob +class Plater; + +class OrientJob : public Job { using OrientMesh = orientation::OrientMesh; using OrientMeshs = orientation::OrientMeshs; OrientMeshs m_selected, m_unselected, m_unprintable; + Plater *m_plater; // clear m_selected and m_unselected, reserve space for next usage void clear_input(); @@ -30,18 +33,14 @@ class OrientJob : public PlaterJob //BBS:prepare the items from current selected partplate void prepare_partplate(); -protected: - void prepare() override; - void on_exception(const std::exception_ptr &) override; - public: - OrientJob(std::shared_ptr pri, Plater *plater) - : PlaterJob{std::move(pri), plater} - {} + void prepare(); - void process() override; + void process(Ctl &ctl) override; + + OrientJob(); - void finalize() override; + void finalize(bool canceled, std::exception_ptr &e) override; #if 0 static orientation::OrientMesh get_orient_mesh(ModelObject* obj, const Plater* plater) diff --git a/src/slic3r/GUI/Jobs/PlaterJob.cpp b/src/slic3r/GUI/Jobs/PlaterJob.cpp deleted file mode 100644 index 902cc57388..0000000000 --- a/src/slic3r/GUI/Jobs/PlaterJob.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include "PlaterJob.hpp" -#include "slic3r/GUI/GUI.hpp" -#include "slic3r/GUI/Plater.hpp" - -namespace Slic3r { namespace GUI { - -void PlaterJob::on_exception(const std::exception_ptr &eptr) -{ - try { - if (eptr) - std::rethrow_exception(eptr); - } catch (std::exception &e) { - show_error(m_plater, _(L("Exception")) + ": "+ e.what()); - } -} - -}} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/Jobs/PlaterJob.hpp b/src/slic3r/GUI/Jobs/PlaterJob.hpp deleted file mode 100644 index fa8a19c1e6..0000000000 --- a/src/slic3r/GUI/Jobs/PlaterJob.hpp +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef PLATERJOB_HPP -#define PLATERJOB_HPP - -#include "Job.hpp" - -namespace Slic3r { namespace GUI { - -class Plater; - -class PlaterJob : public Job { -protected: - Plater *m_plater; - //BBS: add flag for whether on current part plate - bool only_on_partplate{false}; - - void on_exception(const std::exception_ptr &) override; - -public: - - PlaterJob(std::shared_ptr pri, Plater *plater): - Job{std::move(pri)}, m_plater{plater} {} -}; - -}} // namespace Slic3r::GUI - -#endif // PLATERJOB_HPP diff --git a/src/slic3r/GUI/Jobs/PlaterWorker.hpp b/src/slic3r/GUI/Jobs/PlaterWorker.hpp new file mode 100644 index 0000000000..1a38736d99 --- /dev/null +++ b/src/slic3r/GUI/Jobs/PlaterWorker.hpp @@ -0,0 +1,165 @@ +///|/ Copyright (c) Prusa Research 2021 - 2023 Oleksandra Iushchenko @YuSanka, Tomáš Mészáros @tamasmeszaros, David Kocík @kocikdav +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ +#ifndef PLATERWORKER_HPP +#define PLATERWORKER_HPP + +#include +#include + +#include "Worker.hpp" +#include "BusyCursorJob.hpp" + +#include "slic3r/GUI/GUI.hpp" +#include "slic3r/GUI/I18N.hpp" + +namespace Slic3r { namespace GUI { + +template +class PlaterWorker: public Worker { + WorkerSubclass m_w; + wxWindow *m_plater; + + class PlaterJob : public Job { + std::unique_ptr m_job; + wxWindow *m_plater; + long long m_process_duration; // [ms] + + public: + void process(Ctl &c) override + { + // Ensure that wxWidgets processing wakes up to handle outgoing + // messages in plater's wxIdle handler. Otherwise it might happen + // that the message will only be processed when an event like mouse + // move comes along which might be too late. + struct WakeUpCtl: Ctl { + Ctl &ctl; + WakeUpCtl(Ctl &c) : ctl{c} {} + + void update_status(int st, const std::string &msg = "") override + { + ctl.update_status(st, msg); + wxWakeUpIdle(); + } + + bool was_canceled() const override { return ctl.was_canceled(); } + + std::future call_on_main_thread(std::function fn) override + { + auto ftr = ctl.call_on_main_thread(std::move(fn)); + wxWakeUpIdle(); + + return ftr; + } + + void clear_percent() override { + ctl.clear_percent(); + wxWakeUpIdle(); + } + + void show_error_info(const std::string &msg, int code, const std::string &description, const std::string &extra) override + { + ctl.show_error_info(msg, code, description, extra); + wxWakeUpIdle(); + } + + } wctl{c}; + + CursorSetterRAII busycursor{wctl}; + + using namespace std::chrono; + steady_clock::time_point process_start = steady_clock::now(); + m_job->process(wctl); + steady_clock::time_point process_end = steady_clock::now(); + m_process_duration = duration_cast(process_end - process_start).count(); + } + + void finalize(bool canceled, std::exception_ptr &eptr) override + { + using namespace std::chrono; + steady_clock::time_point finalize_start = steady_clock::now(); + m_job->finalize(canceled, eptr); + steady_clock::time_point finalize_end = steady_clock::now(); + long long finalize_duration = duration_cast(finalize_end - finalize_start).count(); + + BOOST_LOG_TRIVIAL(info) + << std::fixed // do not use scientific notations + << "Job '" << typeid(*m_job).name() << "' " + << "spend " << m_process_duration + finalize_duration << "ms " + << "(process " << m_process_duration << "ms + finalize " << finalize_duration << "ms)"; + + if (eptr) try { + std::rethrow_exception(eptr); + } catch (std::exception &e) { + show_error(m_plater, _L("An unexpected error occured") + ": " + e.what()); + eptr = nullptr; + } + } + + PlaterJob(wxWindow *p, std::unique_ptr j) + : m_job{std::move(j)}, m_plater{p} + { + // TODO: decide if disabling slice button during UI job is what we + // want. + // if (m_plater) + // m_plater->sidebar().enable_buttons(false); + } + + ~PlaterJob() override + { + // TODO: decide if disabling slice button during UI job is what we want. + + // Reload scene ensures that the slice button gets properly + // enabled or disabled after the job finishes, depending on the + // state of slicing. This might be an overkill but works for now. + // if (m_plater) + // m_plater->canvas3D()->reload_scene(false); + } + }; + + void on_idle(wxIdleEvent &evt) + { + process_events(); + evt.Skip(); + } + +public: + + template + PlaterWorker(wxWindow *plater, WorkerArgs &&...args) + : m_w{std::forward(args)...}, m_plater{plater} + { + // Ensure that messages from the worker thread to the UI thread are + // processed continuously. + plater->Bind(wxEVT_IDLE, &PlaterWorker::on_idle, this); + } + + ~PlaterWorker() + { + m_plater->Unbind(wxEVT_IDLE, &PlaterWorker::on_idle, this); + } + + // Always package the job argument into a PlaterJob + bool push(std::unique_ptr job) override + { + return m_w.push(std::make_unique(m_plater, std::move(job))); + } + + bool is_idle() const override { return m_w.is_idle(); } + void cancel() override { m_w.cancel(); } + void cancel_all() override { m_w.cancel_all(); } + void process_events() override { m_w.process_events(); } + bool wait_for_current_job(unsigned timeout_ms = 0) override + { + return m_w.wait_for_current_job(timeout_ms); + } + bool wait_for_idle(unsigned timeout_ms = 0) override + { + return m_w.wait_for_idle(timeout_ms); + } +}; + +}} // namespace Slic3r::GUI + +#endif // PLATERJOB_HPP diff --git a/src/slic3r/GUI/Jobs/PrintJob.cpp b/src/slic3r/GUI/Jobs/PrintJob.cpp index 186f031f5f..b331ebfca5 100644 --- a/src/slic3r/GUI/Jobs/PrintJob.cpp +++ b/src/slic3r/GUI/Jobs/PrintJob.cpp @@ -6,38 +6,41 @@ #include "slic3r/GUI/GUI.hpp" #include "slic3r/GUI/GUI_App.hpp" #include "slic3r/GUI/MainFrame.hpp" +#include "slic3r/GUI/format.hpp" #include "bambu_networking.hpp" namespace Slic3r { namespace GUI { -static wxString check_gcode_failed_str = _L("Abnormal print file data. Please slice again."); -static wxString printjob_cancel_str = _L("Task canceled."); -static wxString timeout_to_upload_str = _L("Upload task timed out. Please check the network status and try again."); -static wxString failed_in_cloud_service_str = _L("Cloud service connection failed. Please try again."); -static wxString file_is_not_exists_str = _L("Print file not found. please slice again."); -static wxString file_over_size_str = _L("The print file exceeds the maximum allowable size (1GB). Please simplify the model and slice again."); -static wxString print_canceled_str = _L("Task canceled."); -static wxString send_print_failed_str = _L("Failed to send the print job. Please try again."); -static wxString upload_ftp_failed_str = _L("Failed to upload file to ftp. Please try again."); +static auto check_gcode_failed_str = _u8L("Abnormal print file data. Please slice again."); +static auto printjob_cancel_str = _u8L("Task canceled."); +static auto timeout_to_upload_str = _u8L("Upload task timed out. Please check the network status and try again."); +static auto failed_in_cloud_service_str = _u8L("Cloud service connection failed. Please try again."); +static auto file_is_not_exists_str = _u8L("Print file not found. please slice again."); +static auto file_over_size_str = _u8L("The print file exceeds the maximum allowable size (1GB). Please simplify the model and slice again."); +static auto print_canceled_str = _u8L("Task canceled."); +static auto send_print_failed_str = _u8L("Failed to send the print job. Please try again."); +static auto upload_ftp_failed_str = _u8L("Failed to upload file to ftp. Please try again."); -static wxString desc_network_error = _L("Check the current status of the bambu server by clicking on the link above."); -static wxString desc_file_too_large = _L("The size of the print file is too large. Please adjust the file size and try again."); -static wxString desc_fail_not_exist = _L("Print file not found, Please slice it again and send it for printing."); -static wxString desc_upload_ftp_failed = _L("Failed to upload print file to FTP. Please check the network status and try again."); +static auto desc_network_error = _u8L("Check the current status of the bambu server by clicking on the link above."); +static auto desc_file_too_large = _u8L("The size of the print file is too large. Please adjust the file size and try again."); +static auto desc_fail_not_exist = _u8L("Print file not found, Please slice it again and send it for printing."); -static wxString sending_over_lan_str = _L("Sending print job over LAN"); -static wxString sending_over_cloud_str = _L("Sending print job through cloud service"); +static auto desc_upload_ftp_failed = _u8L("Failed to upload print file to FTP. Please check the network status and try again."); + +static auto sending_over_lan_str = _u8L("Sending print job over LAN"); +static auto sending_over_cloud_str = _u8L("Sending print job through cloud service"); static wxString wait_sending_finish = _L("Print task sending times out."); -static wxString desc_wait_sending_finish = _L("The printer timed out while receiving a print job. Please check if the network is functioning properly and send the print again."); +//static wxString desc_wait_sending_finish = _L("The printer timed out while receiving a print job. Please check if the network is functioning properly and send the print again."); +//static wxString desc_wait_sending_finish = _L("The printer timed out while receiving a print job. Please check if the network is functioning properly."); -PrintJob::PrintJob(std::shared_ptr pri, Plater* plater, std::string dev_id) -: PlaterJob{ std::move(pri), plater }, +PrintJob::PrintJob(std::string dev_id) +: m_plater{wxGetApp().plater()}, m_dev_id(dev_id), m_is_calibration_task(false) { - m_print_job_completed_id = plater->get_print_finished_event(); + m_print_job_completed_id = m_plater->get_print_finished_event(); } void PrintJob::prepare() @@ -52,16 +55,6 @@ void PrintJob::prepare() } } -void PrintJob::on_exception(const std::exception_ptr &eptr) -{ - try { - if (eptr) - std::rethrow_exception(eptr); - } catch (std::exception &e) { - PlaterJob::on_exception(eptr); - } -} - void PrintJob::on_success(std::function success) { m_success_fun = success; @@ -131,22 +124,25 @@ wxString PrintJob::get_http_error_msg(unsigned int status, std::string body) return wxEmptyString; } -void PrintJob::process() +void PrintJob::process(Ctl &ctl) { /* display info */ - wxString msg; + std::string msg; wxString error_str; int curr_percent = 10; NetworkAgent* m_agent = wxGetApp().getAgent(); AppConfig* config = wxGetApp().app_config; if (this->connection_type == "lan") { - msg = _L("Sending print job over LAN"); + msg = _u8L("Sending print job over LAN"); } else { - msg = _L("Sending print job through cloud service"); + msg = _u8L("Sending print job through cloud service"); } + ctl.update_status(0, msg); + ctl.call_on_main_thread([this] { prepare(); }).wait(); + int result = -1; unsigned int http_code; std::string http_body; @@ -162,12 +158,12 @@ void PrintJob::process() /* check gcode is valid */ if (!plate->is_valid_gcode_file() && m_print_type == "from_normal") { - update_status(curr_percent, check_gcode_failed_str); + ctl.update_status(curr_percent, check_gcode_failed_str); return; } - if (was_canceled()) { - update_status(curr_percent, printjob_cancel_str); + if (ctl.was_canceled()) { + ctl.update_status(curr_percent, printjob_cancel_str); return; } } @@ -299,7 +295,7 @@ void PrintJob::process() } wxString error_text; - wxString msg_text; + std::string msg_text; const int StagePercentPoint[(int)PrintingStageFinished + 1] = { @@ -315,7 +311,7 @@ void PrintJob::process() bool is_try_lan_mode = false; bool is_try_lan_mode_failed = false; - auto update_fn = [this, + auto update_fn = [this, &ctl, &is_try_lan_mode, &is_try_lan_mode_failed, &msg, @@ -327,49 +323,49 @@ void PrintJob::process() if (stage == BBL::SendingPrintJobStage::PrintingStageCreate && !is_try_lan_mode_failed) { if (this->connection_type == "lan") { - msg = _L("Sending print job over LAN"); + msg = _u8L("Sending print job over LAN"); } else { - msg = _L("Sending print job through cloud service"); + msg = _u8L("Sending print job through cloud service"); } } else if (stage == BBL::SendingPrintJobStage::PrintingStageUpload && !is_try_lan_mode_failed) { if (code >= 0 && code <= 100 && !info.empty()) { if (this->connection_type == "lan") { - msg = _L("Sending print job over LAN"); + msg = _u8L("Sending print job over LAN"); } else { - msg = _L("Sending print job through cloud service"); + msg = _u8L("Sending print job through cloud service"); } - msg += wxString::Format("(%s)", info); + msg += format("(%s)", info); } } else if (stage == BBL::SendingPrintJobStage::PrintingStageWaiting) { if (this->connection_type == "lan") { - msg = _L("Sending print job over LAN"); + msg = _u8L("Sending print job over LAN"); } else { - msg = _L("Sending print job through cloud service"); + msg = _u8L("Sending print job through cloud service"); } } else if (stage == BBL::SendingPrintJobStage::PrintingStageRecord && !is_try_lan_mode) { - msg = _L("Sending print configuration"); + msg = _u8L("Sending print configuration"); } else if (stage == BBL::SendingPrintJobStage::PrintingStageSending && !is_try_lan_mode) { if (this->connection_type == "lan") { - msg = _L("Sending print job over LAN"); + msg = _u8L("Sending print job over LAN"); } else { - msg = _L("Sending print job through cloud service"); + msg = _u8L("Sending print job through cloud service"); } } else if (stage == BBL::SendingPrintJobStage::PrintingStageFinished) { - msg = wxString::Format(_L("Successfully sent. Will automatically jump to the device page in %ss"), info); + msg = format(_u8L("Successfully sent. Will automatically jump to the device page in %ss"), info); if (m_print_job_completed_id == wxGetApp().plater()->get_send_calibration_finished_event()) { - msg = wxString::Format(_L("Successfully sent. Will automatically jump to the next page in %ss"), info); + msg = format(_u8L("Successfully sent. Will automatically jump to the next page in %ss"), info); } - this->update_percent_finish(); + ctl.clear_percent(); } else { if (this->connection_type == "lan") { - msg = _L("Sending print job over LAN"); + msg = _u8L("Sending print job over LAN"); } else { - msg = _L("Sending print job through cloud service"); + msg = _u8L("Sending print job through cloud service"); } } @@ -386,22 +382,22 @@ void PrintJob::process() //get errors if (code > 100 || code < 0 || stage == BBL::SendingPrintJobStage::PrintingStageERROR) { if (code == BAMBU_NETWORK_ERR_PRINT_WR_FILE_OVER_SIZE || code == BAMBU_NETWORK_ERR_PRINT_SP_FILE_OVER_SIZE) { - m_plater->update_print_error_info(code, desc_file_too_large.ToStdString(), info); + m_plater->update_print_error_info(code, desc_file_too_large, info); }else if (code == BAMBU_NETWORK_ERR_PRINT_WR_FILE_NOT_EXIST || code == BAMBU_NETWORK_ERR_PRINT_SP_FILE_NOT_EXIST){ - m_plater->update_print_error_info(code, desc_fail_not_exist.ToStdString(), info); + m_plater->update_print_error_info(code, desc_fail_not_exist, info); }else if (code == BAMBU_NETWORK_ERR_PRINT_LP_UPLOAD_FTP_FAILED || code == BAMBU_NETWORK_ERR_PRINT_SG_UPLOAD_FTP_FAILED) { - m_plater->update_print_error_info(code, desc_upload_ftp_failed.ToStdString(), info); + m_plater->update_print_error_info(code, desc_upload_ftp_failed, info); }else { - m_plater->update_print_error_info(code, desc_network_error.ToStdString(), info); + m_plater->update_print_error_info(code, desc_network_error, info); } } else { - this->update_status(curr_percent, msg); + ctl.update_status(curr_percent, msg); } }; - auto cancel_fn = [this]() { - return was_canceled(); + auto cancel_fn = [&ctl]() { + return ctl.was_canceled(); }; @@ -444,11 +440,12 @@ void PrintJob::process() boost::this_thread::sleep_for(boost::chrono::milliseconds(1000)); } //this->update_status(curr_percent, _L("Print task sending times out.")); - m_plater->update_print_error_info(BAMBU_NETWORK_ERR_TIMEOUT, wait_sending_finish.ToStdString(), desc_wait_sending_finish.ToStdString()); + //m_plater->update_print_error_info(BAMBU_NETWORK_ERR_TIMEOUT, wait_sending_finish.ToStdString(), desc_wait_sending_finish.ToStdString()); BOOST_LOG_TRIVIAL(info) << "print_job: timeout, cancel the job" << obj->job_id_; /* handle tiemout */ - obj->command_task_cancel(curr_job_id); - return false; + //obj->command_task_cancel(curr_job_id); + //return false; + return true; } BOOST_LOG_TRIVIAL(info) << "print_job: obj is null"; return true; @@ -475,7 +472,7 @@ void PrintJob::process() } else { BOOST_LOG_TRIVIAL(info) << "print_job: use ftp send print only"; - this->update_status(curr_percent, _L("Sending print job over LAN")); + ctl.update_status(curr_percent, _u8L("Sending print job over LAN")); is_try_lan_mode = true; result = m_agent->start_local_print_with_record(params, update_fn, cancel_fn, wait_fn); if (result < 0) { @@ -492,7 +489,7 @@ void PrintJob::process() && this->has_sdcard) { // try to send local with record BOOST_LOG_TRIVIAL(info) << "print_job: try to start local print with record"; - this->update_status(curr_percent, _L("Sending print job over LAN")); + ctl.update_status(curr_percent, _u8L("Sending print job over LAN")); result = m_agent->start_local_print_with_record(params, update_fn, cancel_fn, wait_fn); if (result == 0) { params.comments = ""; @@ -507,22 +504,22 @@ void PrintJob::process() is_try_lan_mode_failed = true; // try to send with cloud BOOST_LOG_TRIVIAL(warning) << "print_job: try to send with cloud"; - this->update_status(curr_percent, _L("Sending print job through cloud service")); + ctl.update_status(curr_percent, _u8L("Sending print job through cloud service")); result = m_agent->start_print(params, update_fn, cancel_fn, wait_fn); } } else { BOOST_LOG_TRIVIAL(info) << "print_job: send with cloud"; - this->update_status(curr_percent, _L("Sending print job through cloud service")); + ctl.update_status(curr_percent, _u8L("Sending print job through cloud service")); result = m_agent->start_print(params, update_fn, cancel_fn, wait_fn); } } } else { if (this->has_sdcard) { - this->update_status(curr_percent, _L("Sending print job over LAN")); + ctl.update_status(curr_percent, _u8L("Sending print job over LAN")); result = m_agent->start_local_print(params, update_fn, cancel_fn); } else { - this->update_status(curr_percent, _L("An SD card needs to be inserted before printing via LAN.")); + ctl.update_status(curr_percent, _u8L("An SD card needs to be inserted before printing via LAN.")); return; } } @@ -542,13 +539,13 @@ void PrintJob::process() msg_text = upload_ftp_failed_str; } else if (result == BAMBU_NETWORK_ERR_CANCELED) { msg_text = print_canceled_str; - this->update_status(0, msg_text); + ctl.update_status(0, msg_text); } else { msg_text = send_print_failed_str; } if (result != BAMBU_NETWORK_ERR_CANCELED) { - this->show_error_info(msg_text, 0, "", ""); + ctl.show_error_info(msg_text, 0, "", ""); } BOOST_LOG_TRIVIAL(error) << "print_job: failed, result = " << result; @@ -574,10 +571,17 @@ void PrintJob::process() } } -void PrintJob::finalize() { - if (was_canceled()) return; +void PrintJob::finalize(bool canceled, std::exception_ptr &eptr) { + try { + if (eptr) + std::rethrow_exception(eptr); + eptr = nullptr; + } catch (...) { + eptr = std::current_exception(); + } - Job::finalize(); + if (canceled || eptr) + return; } void PrintJob::set_project_name(std::string name) @@ -601,10 +605,10 @@ void PrintJob::on_check_ip_address_success(std::function func) m_enter_ip_address_fun_success = func; } -void PrintJob::connect_to_local_mqtt() -{ - this->update_status(0, wxEmptyString); -} +// void PrintJob::connect_to_local_mqtt() +// { +// this->update_status(0, wxEmptyString); +// } void PrintJob::set_calibration_task(bool is_calibration) { diff --git a/src/slic3r/GUI/Jobs/PrintJob.hpp b/src/slic3r/GUI/Jobs/PrintJob.hpp index 9c12013a07..e703f86fba 100644 --- a/src/slic3r/GUI/Jobs/PrintJob.hpp +++ b/src/slic3r/GUI/Jobs/PrintJob.hpp @@ -3,13 +3,15 @@ #include #include -#include "PlaterJob.hpp" +#include "Job.hpp" namespace fs = boost::filesystem; namespace Slic3r { namespace GUI { +class Plater; + #define PRINT_JOB_SENDING_TIMEOUT 25 class PrintPrepareData @@ -34,7 +36,7 @@ public: BedType bed_type = BedType::btDefault; }; -class PrintJob : public PlaterJob +class PrintJob : public Job { std::function m_success_fun{nullptr}; std::string m_dev_id; @@ -43,16 +45,14 @@ class PrintJob : public PlaterJob wxString m_completed_evt_data; std::function m_enter_ip_address_fun_fail{ nullptr }; std::function m_enter_ip_address_fun_success{ nullptr }; + Plater *m_plater; public: PrintPrepareData job_data; PlateListData plate_data; -protected: - void prepare() override; - void on_exception(const std::exception_ptr &) override; -public: - PrintJob(std::shared_ptr pri, Plater *plater, std::string dev_id = ""); + void prepare(); + PrintJob(std::string dev_id = ""); std::string m_project_name; std::string m_dev_ip; @@ -90,7 +90,7 @@ public: task_layer_inspect = layer_inspect; } - int status_range() const override + int status_range() const { return 100; } @@ -101,13 +101,13 @@ public: m_completed_evt_data = evt_data; } void on_success(std::function success); - void process() override; - void finalize() override; + void process(Ctl &ctl) override; + void finalize(bool canceled, std::exception_ptr &e) override; void set_project_name(std::string name); void set_dst_name(std::string path); void on_check_ip_address_fail(std::function func); void on_check_ip_address_success(std::function func); - void connect_to_local_mqtt(); + // void connect_to_local_mqtt(); wxString get_http_error_msg(unsigned int status, std::string body); std::string truncate_string(const std::string& str, size_t maxLength); void set_calibration_task(bool is_calibration); diff --git a/src/slic3r/GUI/Jobs/ProgressIndicator.hpp b/src/slic3r/GUI/Jobs/ProgressIndicator.hpp index 7a0b883964..4aa5757d20 100644 --- a/src/slic3r/GUI/Jobs/ProgressIndicator.hpp +++ b/src/slic3r/GUI/Jobs/ProgressIndicator.hpp @@ -1,3 +1,7 @@ +///|/ Copyright (c) Prusa Research 2018 - 2020 Tomáš Mészáros @tamasmeszaros, Vojtěch Bubník @bubnikv +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ #ifndef IPROGRESSINDICATOR_HPP #define IPROGRESSINDICATOR_HPP diff --git a/src/slic3r/GUI/Jobs/RotoptimizeJob.cpp b/src/slic3r/GUI/Jobs/RotoptimizeJob.cpp index 8cb5dc6c33..eb5140ec12 100644 --- a/src/slic3r/GUI/Jobs/RotoptimizeJob.cpp +++ b/src/slic3r/GUI/Jobs/RotoptimizeJob.cpp @@ -1,3 +1,7 @@ +///|/ Copyright (c) Prusa Research 2020 - 2023 Oleksandra Iushchenko @YuSanka, Tomáš Mészáros @tamasmeszaros, Lukáš Matěna @lukasmatena +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ #include "RotoptimizeJob.hpp" #include "libslic3r/MTUtils.hpp" @@ -45,21 +49,24 @@ void RotoptimizeJob::prepare() } } -void RotoptimizeJob::process() +void RotoptimizeJob::process(Ctl &ctl) { int prev_status = 0; + auto statustxt = _u8L("Searching for optimal orientation"); + ctl.update_status(0, statustxt); + auto params = sla::RotOptimizeParams{} .accuracy(m_accuracy) .print_config(&m_default_print_cfg) - .statucb([this, &prev_status](int s) + .statucb([this, &prev_status, &ctl/*, &statustxt*/](int s) { if (s > 0 && s < 100) ; - // update_status(prev_status + s / m_selected_object_ids.size(), - // _(L("Searching for optimal orientation..."))); + // ctl.update_status(prev_status + s / m_selected_object_ids.size(), + // statustxt); - return !was_canceled(); + return !ctl.was_canceled(); }); @@ -72,16 +79,19 @@ void RotoptimizeJob::process() prev_status += 100 / m_selected_object_ids.size(); - if (was_canceled()) break; + if (ctl.was_canceled()) break; } - // update_status(100, was_canceled() ? _(L("Orientation search canceled.")) : - // _(L("Orientation found."))); + ctl.update_status(100, ctl.was_canceled() ? _u8L("Orientation search canceled.") : + _u8L("Orientation found.")); } -void RotoptimizeJob::finalize() +RotoptimizeJob::RotoptimizeJob() : m_plater{wxGetApp().plater()} { prepare(); } + +void RotoptimizeJob::finalize(bool canceled, std::exception_ptr &eptr) { - if (was_canceled()) return; + if (canceled || eptr) + return; for (const ObjRot &objrot : m_selected_object_ids) { ModelObject *o = m_plater->model().objects[size_t(objrot.idx)]; @@ -112,10 +122,8 @@ void RotoptimizeJob::finalize() // m_plater->find_new_position(o->instances); } - if (!was_canceled()) + if (!canceled) m_plater->update(); - - Job::finalize(); } }} diff --git a/src/slic3r/GUI/Jobs/RotoptimizeJob.hpp b/src/slic3r/GUI/Jobs/RotoptimizeJob.hpp index cdb367f23a..6f6830a9bf 100644 --- a/src/slic3r/GUI/Jobs/RotoptimizeJob.hpp +++ b/src/slic3r/GUI/Jobs/RotoptimizeJob.hpp @@ -1,16 +1,23 @@ +///|/ Copyright (c) Prusa Research 2020 - 2023 Oleksandra Iushchenko @YuSanka, Tomáš Mészáros @tamasmeszaros, David Kocík @kocikdav +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ #ifndef ROTOPTIMIZEJOB_HPP #define ROTOPTIMIZEJOB_HPP -#include "PlaterJob.hpp" +#include "Job.hpp" #include "libslic3r/SLA/Rotfinder.hpp" #include "libslic3r/PrintConfig.hpp" +#include "slic3r/GUI/I18N.hpp" namespace Slic3r { namespace GUI { -class RotoptimizeJob : public PlaterJob +class Plater; + +class RotoptimizeJob : public Job { using FindFn = std::function; @@ -44,19 +51,16 @@ class RotoptimizeJob : public PlaterJob }; std::vector m_selected_object_ids; - -protected: - - void prepare() override; - void process() override; + Plater *m_plater; public: - RotoptimizeJob(std::shared_ptr pri, Plater *plater) - : PlaterJob{std::move(pri), plater} - {} + void prepare(); + void process(Ctl &ctl) override; - void finalize() override; + RotoptimizeJob(); + + void finalize(bool canceled, std::exception_ptr &) override; static constexpr size_t get_methods_count() { return std::size(Methods); } diff --git a/src/slic3r/GUI/Jobs/SLAImportDialog.hpp b/src/slic3r/GUI/Jobs/SLAImportDialog.hpp new file mode 100644 index 0000000000..14d3ef6781 --- /dev/null +++ b/src/slic3r/GUI/Jobs/SLAImportDialog.hpp @@ -0,0 +1,104 @@ +///|/ Copyright (c) Prusa Research 2021 - 2023 Oleksandra Iushchenko @YuSanka, Tomáš Mészáros @tamasmeszaros +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ +#ifndef SLAIMPORTDIALOG_HPP +#define SLAIMPORTDIALOG_HPP + +#include "SLAImportJob.hpp" + +#include +#include +#include +#include +#include + +#include "libslic3r/AppConfig.hpp" +#include "slic3r/GUI/I18N.hpp" + +#include "slic3r/GUI/GUI.hpp" +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Plater.hpp" + +// #include "libslic3r/Model.hpp" +// #include "libslic3r/PresetBundle.hpp" + +namespace Slic3r { namespace GUI { + +class SLAImportDialog : public wxDialog, public SLAImportJobView +{ + wxFilePickerCtrl *m_filepicker; + wxComboBox *m_import_dropdown, *m_quality_dropdown; + +public: + SLAImportDialog(Plater *plater) : wxDialog{plater, wxID_ANY, "Import SLA archive"} + { + auto szvert = new wxBoxSizer{wxVERTICAL}; + auto szfilepck = new wxBoxSizer{wxHORIZONTAL}; + + m_filepicker = new wxFilePickerCtrl(this, wxID_ANY, from_u8(wxGetApp().app_config->get_last_dir()), _(L("Choose SLA archive:")), + "SL1 / SL1S archive files (*.sl1, *.sl1s, *.zip)|*.sl1;*.SL1;*.sl1s;*.SL1S;*.zip;*.ZIP", + wxDefaultPosition, wxDefaultSize, wxFLP_DEFAULT_STYLE | wxFD_OPEN | wxFD_FILE_MUST_EXIST); + + szfilepck->Add(new wxStaticText(this, wxID_ANY, _L("Import file") + ": "), 0, wxALIGN_CENTER); + szfilepck->Add(m_filepicker, 1); + szvert->Add(szfilepck, 0, wxALL | wxEXPAND, 5); + + auto szchoices = new wxBoxSizer{wxHORIZONTAL}; + + static const std::vector inp_choices = {_(L("Import model and profile")), _(L("Import profile only")), + _(L("Import model only"))}; + + m_import_dropdown = new wxComboBox(this, wxID_ANY, inp_choices[0], wxDefaultPosition, wxDefaultSize, inp_choices.size(), + inp_choices.data(), wxCB_READONLY | wxCB_DROPDOWN); + + szchoices->Add(m_import_dropdown); + szchoices->Add(new wxStaticText(this, wxID_ANY, _L("Quality") + ": "), 0, wxALIGN_CENTER | wxALL, 5); + + static const std::vector qual_choices = {_(L("Accurate")), _(L("Balanced")), _(L("Quick"))}; + + m_quality_dropdown = new wxComboBox(this, wxID_ANY, qual_choices[0], wxDefaultPosition, wxDefaultSize, qual_choices.size(), + qual_choices.data(), wxCB_READONLY | wxCB_DROPDOWN); + szchoices->Add(m_quality_dropdown); + + m_import_dropdown->Bind(wxEVT_COMBOBOX, [this](wxCommandEvent &) { + if (get_selection() == Sel::profileOnly) + m_quality_dropdown->Disable(); + else + m_quality_dropdown->Enable(); + }); + + szvert->Add(szchoices, 0, wxALL, 5); + szvert->AddStretchSpacer(1); + auto szbtn = new wxBoxSizer(wxHORIZONTAL); + szbtn->Add(new wxButton{this, wxID_CANCEL}); + szbtn->Add(new wxButton{this, wxID_OK}); + szvert->Add(szbtn, 0, wxALIGN_RIGHT | wxALL, 5); + + SetSizerAndFit(szvert); + } + + Sel get_selection() const override + { + int sel = m_import_dropdown->GetSelection(); + return Sel(std::min(int(Sel::modelOnly), std::max(0, sel))); + } + + Vec2i get_marchsq_windowsize() const override + { + enum { Accurate, Balanced, Fast }; + + switch (m_quality_dropdown->GetSelection()) { + case Fast: return {8, 8}; + case Balanced: return {4, 4}; + default: + case Accurate: return {2, 2}; + } + } + + std::string get_path() const override { return m_filepicker->GetPath().ToUTF8().data(); } +}; + +}} // namespace Slic3r::GUI + +#endif // SLAIMPORTDIALOG_HPP diff --git a/src/slic3r/GUI/Jobs/SLAImportJob.cpp b/src/slic3r/GUI/Jobs/SLAImportJob.cpp index 0d42cec2d3..e8210577ad 100644 --- a/src/slic3r/GUI/Jobs/SLAImportJob.cpp +++ b/src/slic3r/GUI/Jobs/SLAImportJob.cpp @@ -1,9 +1,12 @@ +///|/ Copyright (c) Prusa Research 2020 - 2023 Oleksandra Iushchenko @YuSanka, Lukáš Matěna @lukasmatena, Tomáš Mészáros @tamasmeszaros, Vojtěch Bubník @bubnikv, David Kocík @kocikdav +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ #include "SLAImportJob.hpp" #include "libslic3r/Format/SL1.hpp" #include "slic3r/GUI/GUI.hpp" -#include "slic3r/GUI/GUI_App.hpp" #include "slic3r/GUI/Plater.hpp" #include "slic3r/GUI/GUI_ObjectList.hpp" #include "slic3r/GUI/NotificationManager.hpp" @@ -11,104 +14,10 @@ #include "libslic3r/Model.hpp" #include "libslic3r/PresetBundle.hpp" -#include -#include -#include #include -#include namespace Slic3r { namespace GUI { -enum class Sel { modelAndProfile, profileOnly, modelOnly}; - -class ImportDlg: public wxDialog { - wxFilePickerCtrl *m_filepicker; - wxComboBox *m_import_dropdown, *m_quality_dropdown; - -public: - ImportDlg(Plater *plater) - : wxDialog{plater, wxID_ANY, "Import SLA archive"} - { - auto szvert = new wxBoxSizer{wxVERTICAL}; - auto szfilepck = new wxBoxSizer{wxHORIZONTAL}; - - m_filepicker = new wxFilePickerCtrl(this, wxID_ANY, - from_u8(wxGetApp().app_config->get_last_dir()), _(L("Choose SLA archive:")), - "SL1 / SL1S archive files (*.sl1, *.sl1s, *.zip)|*.sl1;*.SL1;*.sl1s;*.SL1S;*.zip;*.ZIP", - wxDefaultPosition, wxDefaultSize, wxFLP_DEFAULT_STYLE | wxFD_OPEN | wxFD_FILE_MUST_EXIST); - - szfilepck->Add(new wxStaticText(this, wxID_ANY, _L("Import file") + ": "), 0, wxALIGN_CENTER); - szfilepck->Add(m_filepicker, 1); - szvert->Add(szfilepck, 0, wxALL | wxEXPAND, 5); - - auto szchoices = new wxBoxSizer{wxHORIZONTAL}; - - static const std::vector inp_choices = { - _(L("Import model and profile")), - _(L("Import profile only")), - _(L("Import model only")) - }; - - m_import_dropdown = new wxComboBox( - this, wxID_ANY, inp_choices[0], wxDefaultPosition, wxDefaultSize, - inp_choices.size(), inp_choices.data(), wxCB_READONLY | wxCB_DROPDOWN); - - szchoices->Add(m_import_dropdown); - szchoices->Add(new wxStaticText(this, wxID_ANY, _L("Quality") + ": "), 0, wxALIGN_CENTER | wxALL, 5); - - static const std::vector qual_choices = { - _(L("Accurate")), - _(L("Balanced")), - _(L("Quick")) - }; - - m_quality_dropdown = new wxComboBox( - this, wxID_ANY, qual_choices[0], wxDefaultPosition, wxDefaultSize, - qual_choices.size(), qual_choices.data(), wxCB_READONLY | wxCB_DROPDOWN); - szchoices->Add(m_quality_dropdown); - - m_import_dropdown->Bind(wxEVT_COMBOBOX, [this](wxCommandEvent &) { - if (get_selection() == Sel::profileOnly) - m_quality_dropdown->Disable(); - else m_quality_dropdown->Enable(); - }); - - szvert->Add(szchoices, 0, wxALL, 5); - szvert->AddStretchSpacer(1); - auto szbtn = new wxBoxSizer(wxHORIZONTAL); - szbtn->Add(new wxButton{this, wxID_CANCEL}); - szbtn->Add(new wxButton{this, wxID_OK}); - szvert->Add(szbtn, 0, wxALIGN_RIGHT | wxALL, 5); - - SetSizerAndFit(szvert); - } - - Sel get_selection() const - { - int sel = m_import_dropdown->GetSelection(); - return Sel(std::min(int(Sel::modelOnly), std::max(0, sel))); - } - - Vec2i get_marchsq_windowsize() const - { - enum { Accurate, Balanced, Fast}; - - switch(m_quality_dropdown->GetSelection()) - { - case Fast: return {8, 8}; - case Balanced: return {4, 4}; - default: - case Accurate: - return {2, 2}; - } - } - - wxString get_path() const - { - return m_filepicker->GetPath(); - } -}; - class SLAImportJob::priv { public: Plater *plater; @@ -122,23 +31,28 @@ public: std::string err; ConfigSubstitutions config_substitutions; - ImportDlg import_dlg; + const SLAImportJobView * import_dlg; - priv(Plater *plt) : plater{plt}, import_dlg{plt} {} + priv(Plater *plt, const SLAImportJobView *view) : plater{plt}, import_dlg{view} {} }; -SLAImportJob::SLAImportJob(std::shared_ptr pri, Plater *plater) - : PlaterJob{std::move(pri), plater}, p{std::make_unique(plater)} -{} +SLAImportJob::SLAImportJob(const SLAImportJobView *view) + : p{std::make_unique(wxGetApp().plater(), view)} +{ + prepare(); +} SLAImportJob::~SLAImportJob() = default; -void SLAImportJob::process() +void SLAImportJob::process(Ctl &ctl) { - auto progr = [this](int s) { + auto statustxt = _u8L("Importing SLA archive"); + ctl.update_status(0, statustxt); + + auto progr = [&ctl, &statustxt](int s) { if (s < 100) - update_status(int(s), _(L("Importing SLA archive"))); - return !was_canceled(); + ctl.update_status(int(s), statustxt); + return !ctl.was_canceled(); }; if (p->path.empty()) return; @@ -161,15 +75,15 @@ void SLAImportJob::process() p->err = ex.what(); } - update_status(100, was_canceled() ? _(L("Importing canceled.")) : - _(L("Importing done."))); + ctl.update_status(100, ctl.was_canceled() ? _u8L("Importing canceled.") : + _u8L("Importing done.")); } void SLAImportJob::reset() { p->sel = Sel::modelAndProfile; p->mesh = {}; - p->profile = m_plater->sla_print().full_print_config(); + p->profile = p->plater->sla_print().full_print_config(); p->win = {2, 2}; p->path.Clear(); } @@ -178,22 +92,19 @@ void SLAImportJob::prepare() { reset(); - if (p->import_dlg.ShowModal() == wxID_OK) { - auto path = p->import_dlg.get_path(); - auto nm = wxFileName(path); - p->path = !nm.Exists(wxFILE_EXISTS_REGULAR) ? "" : nm.GetFullPath(); - p->sel = p->import_dlg.get_selection(); - p->win = p->import_dlg.get_marchsq_windowsize(); - p->config_substitutions.clear(); - } else { - p->path = ""; - } + auto path = p->import_dlg->get_path(); + auto nm = wxFileName(path); + p->path = !nm.Exists(wxFILE_EXISTS_REGULAR) ? "" : nm.GetFullPath(); + p->sel = p->import_dlg->get_selection(); + p->win = p->import_dlg->get_marchsq_windowsize(); + p->config_substitutions.clear(); } -void SLAImportJob::finalize() +void SLAImportJob::finalize(bool canceled, std::exception_ptr &eptr) { // Ignore the arrange result if aborted. - if (was_canceled()) return; + if (canceled || eptr) + return; if (!p->err.empty()) { show_error(p->plater, p->err); @@ -204,7 +115,7 @@ void SLAImportJob::finalize() std::string name = wxFileName(p->path).GetName().ToUTF8().data(); if (p->profile.empty()) { - m_plater->get_notification_manager()->push_notification( + p->plater->get_notification_manager()->push_notification( NotificationType::CustomNotification, NotificationManager::NotificationLevel::WarningNotificationLevel, _L("The imported SLA archive did not contain any presets. " @@ -213,7 +124,7 @@ void SLAImportJob::finalize() if (p->sel != Sel::modelOnly) { if (p->profile.empty()) - p->profile = m_plater->sla_print().full_print_config(); + p->profile = p->plater->sla_print().full_print_config(); const ModelObjectPtrs& objects = p->plater->model().objects; for (auto object : objects) diff --git a/src/slic3r/GUI/Jobs/SLAImportJob.hpp b/src/slic3r/GUI/Jobs/SLAImportJob.hpp index c2ca10ef69..bb620c9826 100644 --- a/src/slic3r/GUI/Jobs/SLAImportJob.hpp +++ b/src/slic3r/GUI/Jobs/SLAImportJob.hpp @@ -1,22 +1,40 @@ +///|/ Copyright (c) Prusa Research 2020 - 2022 Tomáš Mészáros @tamasmeszaros, David Kocík @kocikdav +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ #ifndef SLAIMPORTJOB_HPP #define SLAIMPORTJOB_HPP -#include "PlaterJob.hpp" +#include "Job.hpp" namespace Slic3r { namespace GUI { -class SLAImportJob : public PlaterJob { +class SLAImportJobView +{ +public: + enum Sel { modelAndProfile, profileOnly, modelOnly }; + + virtual ~SLAImportJobView() = default; + + virtual Sel get_selection() const = 0; + virtual Vec2i get_marchsq_windowsize() const = 0; + virtual std::string get_path() const = 0; +}; + +class Plater; + +class SLAImportJob : public Job { class priv; std::unique_ptr p; - -protected: - void prepare() override; - void process() override; - void finalize() override; + using Sel = SLAImportJobView::Sel; public: - SLAImportJob(std::shared_ptr pri, Plater *plater); + void prepare(); + void process(Ctl &ctl) override; + void finalize(bool canceled, std::exception_ptr &) override; + + SLAImportJob(const SLAImportJobView *); ~SLAImportJob(); void reset(); diff --git a/src/slic3r/GUI/Jobs/SendJob.cpp b/src/slic3r/GUI/Jobs/SendJob.cpp index ced162784c..8f8f683996 100644 --- a/src/slic3r/GUI/Jobs/SendJob.cpp +++ b/src/slic3r/GUI/Jobs/SendJob.cpp @@ -5,33 +5,34 @@ #include "slic3r/GUI/Plater.hpp" #include "slic3r/GUI/GUI.hpp" #include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/format.hpp" namespace Slic3r { namespace GUI { -static wxString check_gcode_failed_str = _L("Abnormal print file data. Please slice again."); -static wxString printjob_cancel_str = _L("Task canceled."); -static wxString timeout_to_upload_str = _L("Upload task timed out. Please check the network status and try again."); -static wxString failed_in_cloud_service_str = _L("Cloud service connection failed. Please try again."); -static wxString file_is_not_exists_str = _L("Print file not found. please slice again."); -static wxString file_over_size_str = _L("The print file exceeds the maximum allowable size (1GB). Please simplify the model and slice again."); -static wxString print_canceled_str = _L("Task canceled."); -static wxString send_print_failed_str = _L("Failed to send the print job. Please try again."); -static wxString upload_ftp_failed_str = _L("Failed to upload file to ftp. Please try again."); +static auto check_gcode_failed_str = _u8L("Abnormal print file data. Please slice again."); +static auto printjob_cancel_str = _u8L("Task canceled."); +static auto timeout_to_upload_str = _u8L("Upload task timed out. Please check the network status and try again."); +static auto failed_in_cloud_service_str = _u8L("Cloud service connection failed. Please try again."); +static auto file_is_not_exists_str = _u8L("Print file not found. please slice again."); +static auto file_over_size_str = _u8L("The print file exceeds the maximum allowable size (1GB). Please simplify the model and slice again."); +static auto print_canceled_str = _u8L("Task canceled."); +static auto send_print_failed_str = _u8L("Failed to send the print job. Please try again."); +static auto upload_ftp_failed_str = _u8L("Failed to upload file to ftp. Please try again."); -static wxString desc_network_error = _L("Check the current status of the bambu server by clicking on the link above."); -static wxString desc_file_too_large = _L("The size of the print file is too large. Please adjust the file size and try again."); -static wxString desc_fail_not_exist = _L("Print file not found, Please slice it again and send it for printing."); -static wxString desc_upload_ftp_failed = _L("Failed to upload print file to FTP. Please check the network status and try again."); +static auto desc_network_error = _u8L("Check the current status of the bambu server by clicking on the link above."); +static auto desc_file_too_large = _u8L("The size of the print file is too large. Please adjust the file size and try again."); +static auto desc_fail_not_exist = _u8L("Print file not found, Please slice it again and send it for printing."); +static auto desc_upload_ftp_failed = _u8L("Failed to upload print file to FTP. Please check the network status and try again."); -static wxString sending_over_lan_str = _L("Sending print job over LAN"); -static wxString sending_over_cloud_str = _L("Sending print job through cloud service"); +static auto sending_over_lan_str = _u8L("Sending print job over LAN"); +static auto sending_over_cloud_str = _u8L("Sending print job through cloud service"); -SendJob::SendJob(std::shared_ptr pri, Plater* plater, std::string dev_id) -: PlaterJob{ std::move(pri), plater }, +SendJob::SendJob(std::string dev_id) +: m_plater{wxGetApp().plater()}, m_dev_id(dev_id) { - m_print_job_completed_id = plater->get_send_finished_event(); + m_print_job_completed_id = m_plater->get_send_finished_event(); } void SendJob::prepare() @@ -45,16 +46,6 @@ void SendJob::prepare() } } -void SendJob::on_exception(const std::exception_ptr &eptr) -{ - try { - if (eptr) - std::rethrow_exception(eptr); - } catch (std::exception &e) { - PlaterJob::on_exception(eptr); - } -} - wxString SendJob::get_http_error_msg(unsigned int status, std::string body) { int code = 0; @@ -112,10 +103,10 @@ inline std::string get_transform_string(int bytes) return buffer; } -void SendJob::process() +void SendJob::process(Ctl &ctl) { BBL::PrintParams params; - wxString msg; + std::string msg; int curr_percent = 10; NetworkAgent* m_agent = wxGetApp().getAgent(); AppConfig* config = wxGetApp().app_config; @@ -154,13 +145,15 @@ void SendJob::process() /* display info */ - msg = _L("Sending gcode file over LAN"); + msg = _u8L("Sending gcode file over LAN"); /* if (this->connection_type == "lan") { - msg = _L("Sending gcode file over LAN"); + msg = _u8L("Sending gcode file over LAN"); } else { - msg = _L("Sending gcode file through cloud service"); + msg = _u8L("Sending gcode file through cloud service"); }*/ + ctl.call_on_main_thread([this] { prepare(); }).wait(); + ctl.update_status(0, msg); int total_plate_num = m_plater->get_partplate_list().get_plate_count(); @@ -183,19 +176,19 @@ void SendJob::process() } if (plate == nullptr) { BOOST_LOG_TRIVIAL(error) << "can not find plate with valid gcode file when sending to print, plate_index="<< job_data.plate_idx; - update_status(curr_percent, check_gcode_failed_str); + ctl.update_status(curr_percent, check_gcode_failed_str); return; } } /* check gcode is valid */ if (!plate->is_valid_gcode_file()) { - update_status(curr_percent, check_gcode_failed_str); + ctl.update_status(curr_percent, check_gcode_failed_str); return; } - if (was_canceled()) { - update_status(curr_percent, printjob_cancel_str); + if (ctl.was_canceled()) { + ctl.update_status(curr_percent, printjob_cancel_str); return; } @@ -223,7 +216,7 @@ void SendJob::process() params.use_ssl_for_ftp = m_local_use_ssl_for_ftp; params.use_ssl_for_mqtt = m_local_use_ssl_for_mqtt; wxString error_text; - wxString msg_text; + std::string msg_text; const int StagePercentPoint[(int)PrintingStageFinished + 1] = { 20, // PrintingStageCreate @@ -235,36 +228,37 @@ void SendJob::process() 100 // PrintingStageFinished }; - auto update_fn = [this, &msg, &curr_percent, &error_text, StagePercentPoint](int stage, int code, std::string info) { + auto update_fn = [this, &ctl, + &msg, &curr_percent, &error_text, StagePercentPoint](int stage, int code, std::string info) { if (stage == SendingPrintJobStage::PrintingStageCreate) { if (this->connection_type == "lan") { - msg = _L("Sending gcode file over LAN"); + msg = _u8L("Sending gcode file over LAN"); } else { - msg = _L("Sending gcode file to sdcard"); + msg = _u8L("Sending gcode file to sdcard"); } } else if (stage == SendingPrintJobStage::PrintingStageUpload) { if (code >= 0 && code <= 100 && !info.empty()) { if (this->connection_type == "lan") { - msg = _L("Sending gcode file over LAN"); + msg = _u8L("Sending gcode file over LAN"); } else { - msg = _L("Sending gcode file to sdcard"); + msg = _u8L("Sending gcode file to sdcard"); } if (!info.empty()) { - msg += wxString::Format("(%s)", info); + msg += format("(%s)", info); } } } else if (stage == SendingPrintJobStage::PrintingStageFinished) { - msg = wxString::Format(_L("Successfully sent. Close current page in %s s"), info); + msg = format(_u8L("Successfully sent. Close current page in %s s"), info); } else { if (this->connection_type == "lan") { - msg = _L("Sending gcode file over LAN"); + msg = _u8L("Sending gcode file over LAN"); } else { - msg = _L("Sending gcode file over LAN"); + msg = _u8L("Sending gcode file over LAN"); } } @@ -280,25 +274,25 @@ void SendJob::process() //get errors if (code > 100 || code < 0 || stage == BBL::SendingPrintJobStage::PrintingStageERROR) { if (code == BAMBU_NETWORK_ERR_PRINT_WR_FILE_OVER_SIZE || code == BAMBU_NETWORK_ERR_PRINT_SP_FILE_OVER_SIZE) { - m_plater->update_print_error_info(code, desc_file_too_large.ToStdString(), info); + m_plater->update_print_error_info(code, desc_file_too_large, info); } else if (code == BAMBU_NETWORK_ERR_PRINT_WR_FILE_NOT_EXIST || code == BAMBU_NETWORK_ERR_PRINT_SP_FILE_NOT_EXIST) { - m_plater->update_print_error_info(code, desc_fail_not_exist.ToStdString(), info); + m_plater->update_print_error_info(code, desc_fail_not_exist, info); } else if (code == BAMBU_NETWORK_ERR_PRINT_LP_UPLOAD_FTP_FAILED || code == BAMBU_NETWORK_ERR_PRINT_SG_UPLOAD_FTP_FAILED) { - m_plater->update_print_error_info(code, desc_upload_ftp_failed.ToStdString(), info); + m_plater->update_print_error_info(code, desc_upload_ftp_failed, info); } else { - m_plater->update_print_error_info(code, desc_network_error.ToStdString(), info); + m_plater->update_print_error_info(code, desc_network_error, info); } } else { - this->update_status(curr_percent, msg); + ctl.update_status(curr_percent, msg); } }; - auto cancel_fn = [this]() { - return was_canceled(); + auto cancel_fn = [&ctl]() { + return ctl.was_canceled(); }; @@ -317,7 +311,7 @@ void SendJob::process() && this->has_sdcard) { // try to send local with record BOOST_LOG_TRIVIAL(info) << "send_job: try to send gcode to printer"; - this->update_status(curr_percent, _L("Sending gcode file over LAN")); + ctl.update_status(curr_percent, _u8L("Sending gcode file over LAN")); result = m_agent->start_send_gcode_to_sdcard(params, update_fn, cancel_fn, nullptr); if (result == BAMBU_NETWORK_ERR_FTP_UPLOAD_FAILED) { params.comments = "upload_failed"; @@ -327,24 +321,24 @@ void SendJob::process() if (result < 0) { // try to send with cloud BOOST_LOG_TRIVIAL(info) << "send_job: try to send gcode file to printer"; - this->update_status(curr_percent, _L("Sending gcode file over LAN")); + ctl.update_status(curr_percent, _u8L("Sending gcode file over LAN")); } } else { BOOST_LOG_TRIVIAL(info) << "send_job: try to send gcode file to printer"; - this->update_status(curr_percent, _L("Sending gcode file over LAN")); + ctl.update_status(curr_percent, _u8L("Sending gcode file over LAN")); } } else { if (this->has_sdcard) { - this->update_status(curr_percent, _L("Sending gcode file over LAN")); + ctl.update_status(curr_percent, _u8L("Sending gcode file over LAN")); result = m_agent->start_send_gcode_to_sdcard(params, update_fn, cancel_fn, nullptr); } else { - this->update_status(curr_percent, _L("An SD card needs to be inserted before sending to printer.")); + ctl.update_status(curr_percent, _u8L("An SD card needs to be inserted before sending to printer.")); return; } } - if (was_canceled()) { - update_status(curr_percent, printjob_cancel_str); + if (ctl.was_canceled()) { + ctl.update_status(curr_percent, printjob_cancel_str); return; } @@ -374,7 +368,7 @@ void SendJob::process() } if (result != BAMBU_NETWORK_ERR_CANCELED) { - this->show_error_info(msg_text, 0, "", ""); + ctl.show_error_info(msg_text, 0, "", ""); } BOOST_LOG_TRIVIAL(error) << "send_job: failed, result = " << result; @@ -404,10 +398,18 @@ void SendJob::on_check_ip_address_success(std::function func) } -void SendJob::finalize() { - if (was_canceled()) return; +void SendJob::finalize(bool canceled, std::exception_ptr &eptr) +{ + try { + if (eptr) + std::rethrow_exception(eptr); + eptr = nullptr; + } catch (...) { + eptr = std::current_exception(); + } - Job::finalize(); + if (canceled || eptr) + return; } void SendJob::set_project_name(std::string name) diff --git a/src/slic3r/GUI/Jobs/SendJob.hpp b/src/slic3r/GUI/Jobs/SendJob.hpp index 179d4f9476..15463aa67c 100644 --- a/src/slic3r/GUI/Jobs/SendJob.hpp +++ b/src/slic3r/GUI/Jobs/SendJob.hpp @@ -3,7 +3,7 @@ #include #include -#include "PlaterJob.hpp" +#include "Job.hpp" #include "PrintJob.hpp" namespace fs = boost::filesystem; @@ -11,10 +11,12 @@ namespace fs = boost::filesystem; namespace Slic3r { namespace GUI { +class Plater; + typedef std::function OnUpdateStatusFn; typedef std::function WasCancelledFn; -class SendJob : public PlaterJob +class SendJob : public Job { PrintPrepareData job_data; std::string m_dev_id; @@ -25,14 +27,11 @@ class SendJob : public PlaterJob std::function m_success_fun{nullptr}; std::function m_enter_ip_address_fun_fail{nullptr}; std::function m_enter_ip_address_fun_success{nullptr}; + Plater *m_plater; -protected: - - void prepare() override; - - void on_exception(const std::exception_ptr &) override; public: - SendJob(std::shared_ptr pri, Plater *plater, std::string dev_id = ""); + void prepare(); + SendJob(std::string dev_id = ""); std::string m_project_name; std::string m_dev_ip; @@ -49,7 +48,7 @@ public: wxWindow* m_parent{nullptr}; - int status_range() const override + int status_range() const { return 100; } @@ -58,11 +57,11 @@ public: void set_check_mode() {m_is_check_mode = true;}; void check_and_continue() {m_check_and_continue = true;}; bool is_finished() { return m_job_finished; } - void process() override; + void process(Ctl &ctl) override; void on_success(std::function success); void on_check_ip_address_fail(std::function func); void on_check_ip_address_success(std::function func); - void finalize() override; + void finalize(bool canceled, std::exception_ptr &) override; void set_project_name(std::string name); }; diff --git a/src/slic3r/GUI/Jobs/ThreadSafeQueue.hpp b/src/slic3r/GUI/Jobs/ThreadSafeQueue.hpp new file mode 100644 index 0000000000..94c63a0fd5 --- /dev/null +++ b/src/slic3r/GUI/Jobs/ThreadSafeQueue.hpp @@ -0,0 +1,128 @@ +///|/ Copyright (c) Prusa Research 2021 Tomáš Mészáros @tamasmeszaros +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ +#ifndef THREADSAFEQUEUE_HPP +#define THREADSAFEQUEUE_HPP + +#include +#include +#include +#include +#include + +namespace Slic3r { namespace GUI { + +// Helper structure for overloads of ThreadSafeQueueSPSC::consume_one() +// to block if the queue is empty. +struct BlockingWait +{ + // Timeout to wait for the arrival of new element into the queue. + unsigned timeout_ms = 0; + + // An optional atomic flag to set true if an incoming element gets + // consumed. The flag will be atomically set to true when popping the + // front of the queue. + std::atomic *pop_flag = nullptr; +}; + +// A thread safe queue for one producer and one consumer. +template class Container = std::deque, + class... ContainerArgs> +class ThreadSafeQueueSPSC +{ + std::queue> m_queue; + mutable std::mutex m_mutex; + std::condition_variable m_cond_var; +public: + + // Consume one element, block if the queue is empty. + template bool consume_one(const BlockingWait &blkw, Fn &&fn) + { + static_assert(!std::is_reference_v, ""); + static_assert(std::is_default_constructible_v, ""); + static_assert(std::is_move_assignable_v || std::is_copy_assignable_v, ""); + + T el; + { + std::unique_lock lk{m_mutex}; + + auto pred = [this]{ return !m_queue.empty(); }; + if (blkw.timeout_ms > 0) { + auto timeout = std::chrono::milliseconds(blkw.timeout_ms); + if (!m_cond_var.wait_for(lk, timeout, pred)) + return false; + } + else + m_cond_var.wait(lk, pred); + + if constexpr (std::is_move_assignable_v) + el = std::move(m_queue.front()); + else + el = m_queue.front(); + + m_queue.pop(); + + if (blkw.pop_flag) + // The optional flag is set before the lock us unlocked. + blkw.pop_flag->store(true); + } + + fn(el); + return true; + } + + // Consume one element, return true if consumed, false if queue was empty. + template bool consume_one(Fn &&fn) + { + T el; + { + std::unique_lock lk{m_mutex}; + if (!m_queue.empty()) { + if constexpr (std::is_move_assignable_v) + el = std::move(m_queue.front()); + else + el = m_queue.front(); + + m_queue.pop(); + } else + return false; + } + + fn(el); + + return true; + } + + // Push element into the queue. + template void push(TArgs&&...el) + { + std::lock_guard lk{m_mutex}; + m_queue.emplace(std::forward(el)...); + m_cond_var.notify_one(); + } + + bool empty() const + { + std::lock_guard lk{m_mutex}; + return m_queue.empty(); + } + + size_t size() const + { + std::lock_guard lk{m_mutex}; + return m_queue.size(); + } + + void clear() + { + std::lock_guard lk{m_mutex}; + while (!m_queue.empty()) + m_queue.pop(); + } +}; + +}} // namespace Slic3r::GUI + +#endif // THREADSAFEQUEUE_HPP diff --git a/src/slic3r/GUI/Jobs/UpgradeNetworkJob.cpp b/src/slic3r/GUI/Jobs/UpgradeNetworkJob.cpp index 000edf8542..1a17e762f8 100644 --- a/src/slic3r/GUI/Jobs/UpgradeNetworkJob.cpp +++ b/src/slic3r/GUI/Jobs/UpgradeNetworkJob.cpp @@ -13,39 +13,28 @@ wxDEFINE_EVENT(EVT_DOWNLOAD_NETWORK_FAILED, wxCommandEvent); wxDEFINE_EVENT(EVT_INSTALL_NETWORK_FAILED, wxCommandEvent); -UpgradeNetworkJob::UpgradeNetworkJob(std::shared_ptr pri) - : Job{std::move(pri)} +UpgradeNetworkJob::UpgradeNetworkJob() { name = "plugins"; package_name = "networking_plugins.zip"; } -void UpgradeNetworkJob::on_exception(const std::exception_ptr &eptr) -{ - try { - if (eptr) - std::rethrow_exception(eptr); - } catch (std::exception &e) { - UpgradeNetworkJob::on_exception(eptr); - } -} - void UpgradeNetworkJob::on_success(std::function success) { m_success_fun = success; } -void UpgradeNetworkJob::update_status(int st, const wxString &msg) +void UpgradeNetworkJob::update_status(Ctl &ctl, int st, const std::string &msg) { BOOST_LOG_TRIVIAL(info) << "UpgradeNetworkJob: percent = " << st << "msg = " << msg; - GUI::Job::update_status(st, msg); + ctl.update_status(st, msg); wxCommandEvent event(EVT_UPGRADE_UPDATE_MESSAGE); event.SetString(msg); event.SetEventObject(m_event_handle); wxPostEvent(m_event_handle, event); } -void UpgradeNetworkJob::process() +void UpgradeNetworkJob::process(Ctl &ctl) { // downloading int result = 0; @@ -64,24 +53,24 @@ void UpgradeNetworkJob::process() BOOST_LOG_TRIVIAL(info) << "UpgradeNetworkJob: save netowrk_plugin to " << tmp_path.string(); - auto cancel_fn = [this]() { - return was_canceled(); + auto cancel_fn = [&ctl]() { + return ctl.was_canceled(); }; int curr_percent = 0; result = wxGetApp().download_plugin(name, package_name, - [this, &curr_percent](int state, int percent, bool &cancel) { + [this, &ctl, &curr_percent](int state, int percent, bool &cancel) { if (state == InstallStatusNormal) { - update_status(percent, _L("Downloading")); + update_status(ctl, percent, _u8L("Downloading")); } else if (state == InstallStatusDownloadFailed) { - update_status(percent, _L("Download failed")); + update_status(ctl, percent, _u8L("Download failed")); } else { - update_status(percent, _L("Downloading")); + update_status(ctl, percent, _u8L("Downloading")); } curr_percent = percent; }, cancel_fn); - if (was_canceled()) { - update_status(0, _L("Cancelled")); + if (ctl.was_canceled()) { + update_status(ctl, 0, _u8L("Cancelled")); wxCommandEvent event(wxEVT_CLOSE_WINDOW); event.SetEventObject(m_event_handle); wxPostEvent(m_event_handle, event); @@ -89,7 +78,7 @@ void UpgradeNetworkJob::process() } if (result < 0) { - update_status(0, _L("Download failed")); + update_status(ctl, 0, _u8L("Download failed")); wxCommandEvent event(EVT_DOWNLOAD_NETWORK_FAILED); event.SetEventObject(m_event_handle); wxPostEvent(m_event_handle, event); @@ -98,16 +87,16 @@ void UpgradeNetworkJob::process() result = wxGetApp().install_plugin( name, package_name, - [this](int state, int percent, bool &cancel) { + [this, &ctl](int state, int percent, bool &cancel) { if (state == InstallStatusInstallCompleted) { - update_status(percent, _L("Install successfully.")); + update_status(ctl, percent, _u8L("Install successfully.")); } else { - update_status(percent, _L("Installing")); + update_status(ctl, percent, _u8L("Installing")); } }, cancel_fn); - if (was_canceled()) { - update_status(0, _L("Cancelled")); + if (ctl.was_canceled()) { + update_status(ctl, 0, _u8L("Cancelled")); wxCommandEvent event(wxEVT_CLOSE_WINDOW); event.SetEventObject(m_event_handle); wxPostEvent(m_event_handle, event); @@ -115,7 +104,7 @@ void UpgradeNetworkJob::process() } if (result != 0) { - update_status(0, _L("Install failed")); + update_status(ctl, 0, _u8L("Install failed")); wxCommandEvent event(EVT_INSTALL_NETWORK_FAILED); event.SetEventObject(m_event_handle); wxPostEvent(m_event_handle, event); @@ -129,11 +118,18 @@ void UpgradeNetworkJob::process() return; } -void UpgradeNetworkJob::finalize() +void UpgradeNetworkJob::finalize(bool canceled, std::exception_ptr &eptr) { - if (was_canceled()) return; + try { + if (eptr) + std::rethrow_exception(eptr); + eptr = nullptr; + } catch (...) { + eptr = std::current_exception(); + } - Job::finalize(); + if (canceled || eptr) + return; } void UpgradeNetworkJob::set_event_handle(wxWindow *hanle) diff --git a/src/slic3r/GUI/Jobs/UpgradeNetworkJob.hpp b/src/slic3r/GUI/Jobs/UpgradeNetworkJob.hpp index 20bbf2b4f3..0af597d0fc 100644 --- a/src/slic3r/GUI/Jobs/UpgradeNetworkJob.hpp +++ b/src/slic3r/GUI/Jobs/UpgradeNetworkJob.hpp @@ -32,11 +32,10 @@ protected: std::string name; std::string package_name; - void on_exception(const std::exception_ptr &) override; public: - UpgradeNetworkJob(std::shared_ptr pri); + UpgradeNetworkJob(); - int status_range() const override + int status_range() const { return 100; } @@ -44,9 +43,9 @@ public: bool is_finished() { return m_job_finished; } void on_success(std::function success); - void update_status(int st, const wxString &msg); - void process() override; - void finalize() override; + void update_status(Ctl &ctl, int st, const std::string &msg); + void process(Ctl &ctl) override; + void finalize(bool canceled, std::exception_ptr &e) override; void set_event_handle(wxWindow* hanle); }; diff --git a/src/slic3r/GUI/Jobs/Worker.hpp b/src/slic3r/GUI/Jobs/Worker.hpp new file mode 100644 index 0000000000..69ec6f0b86 --- /dev/null +++ b/src/slic3r/GUI/Jobs/Worker.hpp @@ -0,0 +1,123 @@ +///|/ Copyright (c) Prusa Research 2021 Tomáš Mészáros @tamasmeszaros +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ +#ifndef PRUSALSICER_WORKER_HPP +#define PRUSALSICER_WORKER_HPP + +#include + +#include "Job.hpp" + +namespace Slic3r { namespace GUI { + +// An interface of a worker that runs jobs on a dedicated worker thread, one +// after the other. It is assumed that every method of this class is called +// from the same main thread. +class Worker { +public: + // Queue up a new job after the current one. This call does not block. + // Returns false if the job gets discarded. + virtual bool push(std::unique_ptr job) = 0; + + // Returns true if no job is running, the job queue is empty and no job + // message is left to be processed. This means that nothing is left to + // finalize or take care of in the main thread. + virtual bool is_idle() const = 0; + + // Ask the current job gracefully to cancel. This call is not blocking and + // the job may or may not cancel eventually, depending on its + // implementation. Note that it is not trivial to kill a thread forcefully + // and we don't need that. + virtual void cancel() = 0; + + // This method will delete the queued jobs and cancel the current one. + virtual void cancel_all() = 0; + + // Needs to be called continuously to process events (like status update + // or finalizing of jobs) in the main thread. This can be done e.g. in a + // wxIdle handler. + virtual void process_events() = 0; + + // Wait until the current job finishes. Timeout will only be considered + // if not zero. Returns false if timeout is reached but the job has not + // finished. + virtual bool wait_for_current_job(unsigned timeout_ms = 0) = 0; + + // Wait until the whole job queue finishes. Timeout will only be considered + // if not zero. Returns false only if timeout is reached but the worker has + // not reached the idle state. + virtual bool wait_for_idle(unsigned timeout_ms = 0) = 0; + + // The destructor shall properly close the worker thread. + virtual ~Worker() = default; +}; + +template constexpr bool IsProcessFn = std::is_invocable_v; +template constexpr bool IsFinishFn = std::is_invocable_v; + +// Helper function to use the worker with arbitrary functors. +template>, + class = std::enable_if_t> > +bool queue_job(Worker &w, ProcessFn fn, FinishFn finishfn) +{ + struct LambdaJob: Job { + ProcessFn fn; + FinishFn finishfn; + + LambdaJob(ProcessFn pfn, FinishFn ffn) + : fn{std::move(pfn)}, finishfn{std::move(ffn)} + {} + + void process(Ctl &ctl) override { fn(ctl); } + void finalize(bool canceled, std::exception_ptr &eptr) override + { + finishfn(canceled, eptr); + } + }; + + auto j = std::make_unique(std::move(fn), std::move(finishfn)); + return w.push(std::move(j)); +} + +template>> +bool queue_job(Worker &w, ProcessFn fn) +{ + return queue_job(w, std::move(fn), [](bool, std::exception_ptr &) {}); +} + +inline bool queue_job(Worker &w, std::unique_ptr j) +{ + return w.push(std::move(j)); +} + +// Replace the current job queue with a new job. The signature is the same +// as for queue_job(). This cancels all jobs and +// will not wait. The new job will begin after the queue cancels properly. +// Note that this can be called from the UI thread and will not block it if +// the jobs take longer to cancel. +template bool replace_job(Worker &w, Args&& ...args) +{ + w.cancel_all(); + return queue_job(w, std::forward(args)...); +} + +// Cancel the current job and wait for it to actually be stopped. +inline bool stop_current_job(Worker &w, unsigned timeout_ms = 0) +{ + w.cancel(); + return w.wait_for_current_job(timeout_ms); +} + +// Cancel all pending jobs including current one and wait until the worker +// becomes idle. +inline bool stop_queue(Worker &w, unsigned timeout_ms = 0) +{ + w.cancel_all(); + return w.wait_for_idle(timeout_ms); +} + +}} // namespace Slic3r::GUI + +#endif // WORKER_HPP diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index cda31f9790..c8dad01b4a 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -1,3 +1,14 @@ +///|/ Copyright (c) Prusa Research 2018 - 2023 Oleksandra Iushchenko @YuSanka, Lukáš Matěna @lukasmatena, David Kocík @kocikdav, Vojtěch Bubník @bubnikv, Tomáš Mészáros @tamasmeszaros, Enrico Turri @enricoturri1966, Filip Sykala @Jony01, Lukáš Hejl @hejllukas, Vojtěch Král @vojtechkral +///|/ Copyright (c) 2021 Jason Scurtu @xarbit +///|/ Copyright (c) 2019 John Drake @foxox +///|/ +///|/ ported from lib/Slic3r/GUI/MainFrame.pm: +///|/ Copyright (c) Prusa Research 2016 - 2019 Vojtěch Bubník @bubnikv, Vojtěch Král @vojtechkral, Oleksandra Iushchenko @YuSanka, Tomáš Mészáros @tamasmeszaros, Enrico Turri @enricoturri1966 +///|/ Copyright (c) Slic3r 2014 - 2016 Alessandro Ranellucci @alranel +///|/ Copyright (c) 2014 Mark Hindess +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ #include "MainFrame.hpp" #include @@ -762,7 +773,7 @@ void MainFrame::update_layout() //BBS: add bed exclude area m_plater->set_bed_shape({ { 0.0, 0.0 }, { 200.0, 0.0 }, { 200.0, 200.0 }, { 0.0, 200.0 } }, {}, 0.0, {}, {}, true); m_plater->get_collapse_toolbar().set_enabled(false); - m_plater->collapse_sidebar(true); + m_plater->enable_sidebar(false); m_plater->Show(); break; } @@ -811,7 +822,7 @@ void MainFrame::shutdown() #endif // _WIN32 if (m_plater != nullptr) { - m_plater->stop_jobs(); + m_plater->get_ui_job_worker().cancel_all(); // Unbinding of wxWidgets event handling in canvases needs to be done here because on MAC, // when closing the application using Command+Q, a mouse event is triggered after this lambda is completed, @@ -1968,11 +1979,6 @@ void MainFrame::on_dpi_changed(const wxRect& suggested_rect) m_monitor->msw_rescale(); m_calibration->msw_rescale(); - // BBS -#if 0 - for (size_t id = 0; id < m_menubar->GetMenuCount(); id++) - msw_rescale_menu(m_menubar->GetMenu(id)); -#endif // Workarounds for correct Window rendering after rescale @@ -2014,7 +2020,7 @@ void MainFrame::on_sys_color_changed() #ifdef _MSW_DARK_MODE // update common mode sizer if (!wxGetApp().tabs_as_menu()) - dynamic_cast(m_tabpanel)->Rescale(); + dynamic_cast(m_tabpanel)->OnColorsChanged(); #endif #endif @@ -2528,9 +2534,18 @@ void MainFrame::init_menubar_as_editor() wxGetApp().toggle_show_gcode_window(); m_plater->get_current_canvas3D()->post_event(SimpleEvent(wxEVT_PAINT)); }, - this, [this]() { return m_plater->is_preview_shown(); }, + this, [this]() { return m_tabpanel->GetSelection() == tpPreview; }, [this]() { return wxGetApp().show_gcode_window(); }, this); + append_menu_item( + viewMenu, wxID_ANY, _L("Reset Window Layout"), _L("Reset to default window layout"), + [this](wxCommandEvent&) { m_plater->reset_window_layout(); }, "", this, + [this]() { + return (m_tabpanel->GetSelection() == TabPosition::tp3DEditor || m_tabpanel->GetSelection() == TabPosition::tpPreview) && + m_plater->is_sidebar_enabled(); + }, + this); + viewMenu->AppendSeparator(); append_menu_check_item(viewMenu, wxID_ANY, _L("Show &Labels") + "\t" + ctrl + "E", _L("Show object labels in 3D scene"), [this](wxCommandEvent&) { m_plater->show_view3D_labels(!m_plater->are_view3D_labels_shown()); m_plater->get_current_canvas3D()->post_event(SimpleEvent(wxEVT_PAINT)); }, this, diff --git a/src/slic3r/GUI/MediaPlayCtrl.cpp b/src/slic3r/GUI/MediaPlayCtrl.cpp index f5f6e35b89..42bf891da4 100644 --- a/src/slic3r/GUI/MediaPlayCtrl.cpp +++ b/src/slic3r/GUI/MediaPlayCtrl.cpp @@ -357,13 +357,13 @@ void MediaPlayCtrl::ToggleStream() DownloadProgressDialog2(MediaPlayCtrl *ctrl) : DownloadProgressDialog(_L("Downloading Virtual Camera Tools")), ctrl(ctrl) {} struct UpgradeNetworkJob2 : UpgradeNetworkJob { - UpgradeNetworkJob2(std::shared_ptr pri) : UpgradeNetworkJob(pri) { + UpgradeNetworkJob2() { name = "cameratools"; package_name = "camera_tools.zip"; } }; - std::shared_ptr make_job(std::shared_ptr pri) override - { return std::make_shared(pri); } + std::unique_ptr make_job() override + { return std::make_unique(); } void on_finish() override { ctrl->CallAfter([ctrl = this->ctrl] { ctrl->ToggleStream(); }); diff --git a/src/slic3r/GUI/MeshUtils.cpp b/src/slic3r/GUI/MeshUtils.cpp index 4e0e8a009e..011c77128c 100644 --- a/src/slic3r/GUI/MeshUtils.cpp +++ b/src/slic3r/GUI/MeshUtils.cpp @@ -489,7 +489,7 @@ std::vector MeshRaycaster::get_unobscured_idxs(const Geometry::Transfo { std::vector out; - const Transform3d& instance_matrix_no_translation_no_scaling = trafo.get_matrix(true,false,true); + const Transform3d instance_matrix_no_translation_no_scaling = trafo.get_rotation_matrix(); Vec3d direction_to_camera = -camera.get_dir_forward(); Vec3d direction_to_camera_mesh = (instance_matrix_no_translation_no_scaling.inverse() * direction_to_camera).normalized().eval(); direction_to_camera_mesh = direction_to_camera_mesh.cwiseProduct(trafo.get_scaling_factor()); diff --git a/src/slic3r/GUI/MsgDialog.cpp b/src/slic3r/GUI/MsgDialog.cpp index ed323417aa..d685ad3a81 100644 --- a/src/slic3r/GUI/MsgDialog.cpp +++ b/src/slic3r/GUI/MsgDialog.cpp @@ -227,10 +227,10 @@ void MsgDialog::apply_style(long style) if (style & wxNO) add_button(wxID_NO, false,_L("No")); if (style & wxCANCEL) add_button(wxID_CANCEL, false, _L("Cancel")); - logo->SetBitmap( create_scaled_bitmap(style & wxAPPLY ? "completed" : + logo->SetBitmap( *get_bmp_bundle(style & wxAPPLY ? "completed" : style & wxICON_WARNING ? "obj_warning" : style & wxICON_INFORMATION ? "info" : - style & wxICON_QUESTION ? "question" : "OrcaSlicer", this, 64, style & wxICON_ERROR)); + style & wxICON_QUESTION ? "question" : "OrcaSlicer", 64)); } void MsgDialog::finalize() @@ -339,7 +339,7 @@ ErrorDialog::ErrorDialog(wxWindow *parent, const wxString &msg, bool monospaced_ add_msg_content(this, content_sizer, msg, monospaced_font); // Use a small bitmap with monospaced font, as the error text will not be wrapped. - logo->SetBitmap(create_scaled_bitmap("OrcaSlicer_192px_grayscale.png", this, monospaced_font ? 48 : /*1*/84)); + logo->SetBitmap(*get_bmp_bundle("OrcaSlicer_192px_grayscale.png", monospaced_font ? 48 : /*1*/84)); SetMaxSize(wxSize(-1, CONTENT_MAX_HEIGHT*wxGetApp().em_unit())); diff --git a/src/slic3r/GUI/Notebook.cpp b/src/slic3r/GUI/Notebook.cpp index 84bbf9950a..aac7ee5af3 100644 --- a/src/slic3r/GUI/Notebook.cpp +++ b/src/slic3r/GUI/Notebook.cpp @@ -122,6 +122,8 @@ void ButtonsListCtrl::Rescale() { //m_mode_sizer->msw_rescale(); int em = em_unit(this); + // Orca: following is removed by PS in wx 3.16 refactor. + // doesn't seem to be doing anything rn so leaving it alone for (Button* btn : m_pageButtons) { //BBS btn->SetMinSize({(btn->GetLabel().empty() ? 40 : 132) * em / 10, 36 * em / 10}); @@ -137,6 +139,14 @@ void ButtonsListCtrl::Rescale() m_sizer->Layout(); } +void ButtonsListCtrl::OnColorsChanged() +{ + for (Button* btn : m_pageButtons) + btn->Rescale(); + + m_sizer->Layout(); +} + void ButtonsListCtrl::SetSelection(int sel) { if (m_selection == sel) diff --git a/src/slic3r/GUI/Notebook.hpp b/src/slic3r/GUI/Notebook.hpp index d75898a7cd..482a909fe1 100644 --- a/src/slic3r/GUI/Notebook.hpp +++ b/src/slic3r/GUI/Notebook.hpp @@ -23,6 +23,7 @@ public: void SetSelection(int sel); void UpdateMode(); void Rescale(); + void OnColorsChanged(); bool InsertPage(size_t n, const wxString &text, bool bSelect = false, const std::string &bmp_name = "", const std::string &inactive_bmp_name = ""); void RemovePage(size_t n); bool SetPageImage(size_t n, const std::string& bmp_name) const; @@ -261,6 +262,11 @@ public: GetBtnsListCtrl()->Rescale(); } + void OnColorsChanged() + { + GetBtnsListCtrl()->OnColorsChanged(); + } + void OnNavigationKey(wxNavigationKeyEvent& event) { if (event.IsWindowChange()) { diff --git a/src/slic3r/GUI/NotificationManager.cpp b/src/slic3r/GUI/NotificationManager.cpp index 81a5511cd6..390cae058b 100644 --- a/src/slic3r/GUI/NotificationManager.cpp +++ b/src/slic3r/GUI/NotificationManager.cpp @@ -147,8 +147,6 @@ NotificationManager::PopNotification::PopNotification(const NotificationData &n, , m_evt_handler (evt_handler) , m_notification_start (GLCanvas3D::timestamp_now()) { - m_is_dark = wxGetApp().plater()->get_current_canvas3D()->get_dark_mode_status(); - m_ErrorColor = ImVec4(0.9, 0.36, 0.36, 1); m_WarnColor = ImVec4(0.99, 0.69, 0.455, 1); m_NormalColor = ImVec4(0, 0.588, 0.533, 1); @@ -158,17 +156,32 @@ NotificationManager::PopNotification::PopNotification(const NotificationData &n, m_WindowBkgColor = ImVec4(1, 1, 1, 1); m_TextColor = ImVec4(.2f, .2f, .2f, 1.0f); m_HyperTextColor = ImVec4(0, 0.588, 0.533, 1); +} - m_WindowRadius = 4.0f * wxGetApp().plater()->get_current_canvas3D()->get_scale(); +// We cannot call plater()->get_current_canvas3D() from constructor, so we do it here +void NotificationManager::PopNotification::ensure_ui_inited() +{ + if (!m_is_dark_inited) { + m_is_dark = wxGetApp().plater()->get_current_canvas3D()->get_dark_mode_status(); + m_is_dark_inited = true; + } + + if (!m_WindowRadius_inited) { + m_WindowRadius = 4.0f * wxGetApp().plater()->get_current_canvas3D()->get_scale(); + m_WindowRadius_inited = true; + } } void NotificationManager::PopNotification::on_change_color_mode(bool is_dark) { + m_is_dark_inited = true; m_is_dark = is_dark; } void NotificationManager::PopNotification::use_bbl_theme() { + ensure_ui_inited(); + ImGuiStyle &OldStyle = ImGui::GetStyle(); m_DefaultTheme.mWindowPadding = OldStyle.WindowPadding; @@ -731,6 +744,7 @@ void NotificationManager::PopNotification::render_hypertext(ImGuiWrapper& imgui, void NotificationManager::PopNotification::render_close_button(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) { + ensure_ui_inited(); ImVec2 win_size(win_size_x, win_size_y); ImVec2 win_pos(win_pos_x, win_pos_y); ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(.0f, .0f, .0f, .0f)); @@ -856,6 +870,7 @@ void NotificationManager::PopNotification::bbl_render_block_notif_left_sign(ImGu void NotificationManager::PopNotification::bbl_render_left_sign(ImGuiWrapper &imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) { + ensure_ui_inited(); ImDrawList *draw_list = ImGui::GetWindowDrawList(); ImVec2 round_rect_pos = ImVec2(win_pos_x - win_size_x + ImGui::GetStyle().WindowBorderSize, win_pos_y + ImGui::GetStyle().WindowBorderSize); ImVec2 round_rect_size = ImVec2(m_WindowRadius * 2, win_size_y - 2 * ImGui::GetStyle().WindowBorderSize); @@ -887,6 +902,7 @@ void NotificationManager::PopNotification::render_left_sign(ImGuiWrapper& imgui) } void NotificationManager::PopNotification::render_minimize_button(ImGuiWrapper& imgui, const float win_pos_x, const float win_pos_y) { + ensure_ui_inited(); ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(.0f, .0f, .0f, .0f)); ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(.0f, .0f, .0f, .0f)); push_style_color(ImGuiCol_ButtonActive, ImGui::GetStyleColorVec4(ImGuiCol_WindowBg), m_state == EState::FadingOut, m_current_fade_opacity); diff --git a/src/slic3r/GUI/NotificationManager.hpp b/src/slic3r/GUI/NotificationManager.hpp index 91211a661e..68e26f4a0e 100644 --- a/src/slic3r/GUI/NotificationManager.hpp +++ b/src/slic3r/GUI/NotificationManager.hpp @@ -1,3 +1,7 @@ +///|/ Copyright (c) Prusa Research 2020 - 2023 David Kocík @kocikdav, Lukáš Matěna @lukasmatena, Pavel Mikuš @Godrak, Filip Sykala @Jony01, Vojtěch Bubník @bubnikv, Tomáš Mészáros @tamasmeszaros, Lukáš Hejl @hejllukas, Oleksandra Iushchenko @YuSanka, Enrico Turri @enricoturri1966 +///|/ +///|/ PrusaSlicer is released under the terms of the AGPLv3 or higher +///|/ #ifndef slic3r_GUI_NotificationManager_hpp_ #define slic3r_GUI_NotificationManager_hpp_ @@ -119,6 +123,8 @@ enum class NotificationType // Give user advice to simplify object with big amount of triangles // Contains ObjectID for closing when object is deleted SimplifySuggestion, + // Change of text will change font to similar one on. + UnknownFont, // information about netfabb is finished repairing model (blocking proccess) NetfabbFinished, // Short meesage to fill space between start and finish of export @@ -462,7 +468,10 @@ private: // used this function instead of reading directly m_data.duration. Some notifications might need to return changing value. virtual int get_duration() { return m_data.duration; } + void ensure_ui_inited(); + bool m_is_dark = false; + bool m_is_dark_inited = false; const NotificationData m_data; // For reusing ImGUI windows. @@ -492,6 +501,7 @@ private: ImVec4 m_CurrentColor; float m_WindowRadius; + bool m_WindowRadius_inited = false; void use_bbl_theme(); void restore_default_theme(); diff --git a/src/slic3r/GUI/OG_CustomCtrl.cpp b/src/slic3r/GUI/OG_CustomCtrl.cpp index 1c215d0988..26349192d1 100644 --- a/src/slic3r/GUI/OG_CustomCtrl.cpp +++ b/src/slic3r/GUI/OG_CustomCtrl.cpp @@ -28,12 +28,12 @@ static bool is_point_in_rect(const wxPoint& pt, const wxRect& rect) rect.GetTop() <= pt.y && pt.y <= rect.GetBottom(); } -static wxSize get_bitmap_size(const wxBitmap& bmp) +static wxSize get_bitmap_size(const wxBitmapBundle* bmp, wxWindow* parent) { -#ifdef __APPLE__ - return bmp.GetScaledSize(); +#ifndef __WIN32__ + return bmp->GetBitmapFor(parent).GetSize(); #else - return bmp.GetSize(); + return bmp->GetDefaultSize(); #endif } @@ -58,8 +58,8 @@ OG_CustomCtrl::OG_CustomCtrl( wxWindow* parent, m_v_gap2 = lround(0.8 * m_em_unit); m_h_gap = lround(0.2 * m_em_unit); - //m_bmp_mode_sz = get_bitmap_size(create_scaled_bitmap("mode_simple", this, wxOSX ? 10 : 12)); - m_bmp_blinking_sz = get_bitmap_size(create_scaled_bitmap("blank_16", this)); + //m_bmp_mode_sz = get_bitmap_size(get_bmp_bundle("mode_simple", wxOSX ? 10 : 12), this); + m_bmp_blinking_sz = get_bitmap_size(get_bmp_bundle("blank_16"), this); init_ctrl_lines();// from og.lines() @@ -572,8 +572,8 @@ void OG_CustomCtrl::msw_rescale() m_v_gap2 = lround(0.8 * m_em_unit); m_h_gap = lround(0.2 * m_em_unit); - //m_bmp_mode_sz = create_scaled_bitmap("mode_simple", this, wxOSX ? 10 : 12).GetSize(); - m_bmp_blinking_sz = create_scaled_bitmap("blank_16", this).GetSize(); + //m_bmp_mode_sz = get_bitmap_size(get_bmp_bundle("mode_simple", wxOSX ? 10 : 12), this); + m_bmp_blinking_sz = get_bitmap_size(get_bmp_bundle("blank_16"), this); m_max_win_width = 0; @@ -666,7 +666,7 @@ void OG_CustomCtrl::CtrlLine::msw_rescale() { // if we have a single option with no label, no sidetext if (draw_just_act_buttons) - height = get_bitmap_size(create_scaled_bitmap("empty")).GetHeight(); + height = get_bitmap_size(get_bmp_bundle("empty"), ctrl).GetHeight(); if (ctrl->opt_group->label_width != 0 && !og_line.label.IsEmpty()) { wxSize label_sz = ctrl->GetTextExtent(og_line.label); @@ -933,19 +933,19 @@ wxCoord OG_CustomCtrl::CtrlLine::draw_text(wxDC &dc, wxPoint pos, const wxString wxPoint OG_CustomCtrl::CtrlLine::draw_blinking_bmp(wxDC& dc, wxPoint pos, bool is_blinking) { - wxBitmap bmp_blinking = create_scaled_bitmap(is_blinking ? "blank_16" : "empty", ctrl); + wxBitmapBundle* bmp_blinking = get_bmp_bundle(is_blinking ? "blank_16" : "empty"); wxCoord h_pos = pos.x; - wxCoord v_pos = pos.y + lround((height - get_bitmap_size(bmp_blinking).GetHeight()) / 2); + wxCoord v_pos = pos.y + lround((height - get_bitmap_size(bmp_blinking, ctrl).GetHeight()) / 2); - dc.DrawBitmap(bmp_blinking, h_pos, v_pos); + dc.DrawBitmap(bmp_blinking->GetBitmapFor(ctrl), h_pos, v_pos); - int bmp_dim = get_bitmap_size(bmp_blinking).GetWidth(); + int bmp_dim = get_bitmap_size(bmp_blinking, ctrl).GetWidth(); h_pos += bmp_dim + ctrl->m_h_gap; return wxPoint(h_pos, v_pos); } -wxCoord OG_CustomCtrl::CtrlLine::draw_act_bmps(wxDC& dc, wxPoint pos, const wxBitmap& bmp_undo_to_sys, const wxBitmap& bmp_undo, bool is_blinking, size_t rect_id) +wxCoord OG_CustomCtrl::CtrlLine::draw_act_bmps(wxDC& dc, wxPoint pos, const wxBitmapBundle& bmp_undo_to_sys, const wxBitmapBundle& bmp_undo, bool is_blinking, size_t rect_id) { #ifndef DISABLE_BLINKING pos = draw_blinking_bmp(dc, pos, is_blinking); @@ -953,11 +953,11 @@ wxCoord OG_CustomCtrl::CtrlLine::draw_act_bmps(wxDC& dc, wxPoint pos, const wxBi if (ctrl->opt_group->split_multi_line) { // BBS const std::vector