diff --git a/CMakeLists.txt b/CMakeLists.txt index ac9be9fa1..d1c080a82 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -518,8 +518,10 @@ elseif (SLIC3R_FHS) set(SLIC3R_FHS_RESOURCES "${CMAKE_INSTALL_FULL_DATAROOTDIR}/SuperSlicer") install(DIRECTORY "${SLIC3R_RESOURCES_DIR}/" DESTINATION "${SLIC3R_FHS_RESOURCES}") install(FILES src/platform/unix/SuperSlicer.desktop DESTINATION ${SLIC3R_FHS_RESOURCES}/applications) + install(FILES src/platform/unix/PrusaGcodeviewer.desktop DESTINATION ${SLIC3R_FHS_RESOURCES}/applications) else () install(FILES src/platform/unix/SuperSlicer.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/resources/applications) + install(FILES src/platform/unix/PrusaGcodeviewer.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/resources/applications) install(DIRECTORY "${SLIC3R_RESOURCES_DIR}/" DESTINATION "${CMAKE_INSTALL_PREFIX}/resources") endif () diff --git a/deps/CGAL/CGAL.cmake b/deps/CGAL/CGAL.cmake index f0584c5b5..fa88fc29e 100644 --- a/deps/CGAL/CGAL.cmake +++ b/deps/CGAL/CGAL.cmake @@ -15,6 +15,17 @@ include(GNUInstallDirs) # If this file is not present, it will not consider the stored absolute path ExternalProject_Add_Step(dep_CGAL dep_CGAL_relocation_fix DEPENDEES install + COMMAND ${CMAKE_COMMAND} -E remove CGALConfig-installation-dirs.cmake WORKING_DIRECTORY "${DESTDIR}/usr/local/${CMAKE_INSTALL_LIBDIR}/cmake/CGAL" ) + +# Again, for whatever reason, CGAL thinks that its version is not relevant if +# configured as a header only library. Fixing it by placing a cmake version file +# besides the installed config file. +ExternalProject_Add_Step(dep_CGAL dep_CGAL_version_fix + DEPENDEES install + + COMMAND ${CMAKE_COMMAND} -E copy cgal/CGALConfigVersion.cmake "${DESTDIR}/usr/local/${CMAKE_INSTALL_LIBDIR}/cmake/CGAL/CGALConfigVersion.cmake" + WORKING_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}" +) diff --git a/deps/CGAL/cgal/CGALConfigVersion.cmake b/deps/CGAL/cgal/CGALConfigVersion.cmake new file mode 100644 index 000000000..f688824e8 --- /dev/null +++ b/deps/CGAL/cgal/CGALConfigVersion.cmake @@ -0,0 +1,37 @@ +# This is a basic version file for the Config-mode of find_package(). +# It is used by write_basic_package_version_file() as input file for configure_file() +# to create a version-file which can be installed along a config.cmake file. +# +# The created file sets PACKAGE_VERSION_EXACT if the current version string and +# the requested version string are exactly the same and it sets +# PACKAGE_VERSION_COMPATIBLE if the current version is >= requested version. +# The variable CVF_VERSION must be set before calling configure_file(). + +set(PACKAGE_VERSION "5.0.0") + +if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION) + set(PACKAGE_VERSION_COMPATIBLE FALSE) +else() + set(PACKAGE_VERSION_COMPATIBLE TRUE) + if(PACKAGE_FIND_VERSION STREQUAL PACKAGE_VERSION) + set(PACKAGE_VERSION_EXACT TRUE) + endif() +endif() + + +# if the installed project requested no architecture check, don't perform the check +if("FALSE") + return() +endif() + +# if the installed or the using project don't have CMAKE_SIZEOF_VOID_P set, ignore it: +if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "" OR "8" STREQUAL "") + return() +endif() + +# check that the installed version has the same 32/64bit-ness as the one which is currently searching: +if(NOT CMAKE_SIZEOF_VOID_P STREQUAL "8") + math(EXPR installedBits "8 * 8") + set(PACKAGE_VERSION "${PACKAGE_VERSION} (${installedBits}bit)") + set(PACKAGE_VERSION_UNSUITABLE TRUE) +endif() diff --git a/resources/data/flatpak/com.prusa3d.PrusaSlicer.desktop b/resources/data/flatpak/com.prusa3d.PrusaSlicer.desktop new file mode 100755 index 000000000..898722298 --- /dev/null +++ b/resources/data/flatpak/com.prusa3d.PrusaSlicer.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Name=PrusaSlicer +GenericName=3D Printing Software +Icon=com.prusa3d.PrusaSlicer +Exec=prusa-slicer %F +Terminal=false +Type=Application +MimeType=model/stl;model/x-wavefront-obj;model/3mf;model/x-geomview-off;application/x-amf; +Categories=Graphics;3DGraphics;Engineering; +Keywords=3D;Printing;Slicer;slice;3D;printer;convert;gcode;stl;obj;amf;SLA +StartupNotify=false +StartupWMClass=prusa-slicer \ No newline at end of file diff --git a/resources/data/flatpak/com.prusa3d.PrusaSlicer.metainfo.xml b/resources/data/flatpak/com.prusa3d.PrusaSlicer.metainfo.xml new file mode 100755 index 000000000..b62a57e48 --- /dev/null +++ b/resources/data/flatpak/com.prusa3d.PrusaSlicer.metainfo.xml @@ -0,0 +1,62 @@ + + + com.prusa3d.PrusaSlicer + com.prusa3d.PrusaSlicer.desktop + + prusa-slicer.desktop + + PrusaSlicer + Powerful 3D printing slicer optimized for Prusa printers + 0BSD + AGPL-3.0-only + +

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

+

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

+

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

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

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

+
+
+
+
diff --git a/resources/icons/PrusaSlicer-gcodeviewer.ico b/resources/icons/PrusaSlicer-gcodeviewer.ico index 955b8c6dc..1cd867e29 100644 Binary files a/resources/icons/PrusaSlicer-gcodeviewer.ico and b/resources/icons/PrusaSlicer-gcodeviewer.ico differ diff --git a/resources/icons/PrusaSlicer-gcodeviewer_128px.png b/resources/icons/PrusaSlicer-gcodeviewer_128px.png index f75bcfe58..475ddb68e 100644 Binary files a/resources/icons/PrusaSlicer-gcodeviewer_128px.png and b/resources/icons/PrusaSlicer-gcodeviewer_128px.png differ diff --git a/resources/icons/PrusaSlicer-gcodeviewer_192px.png b/resources/icons/PrusaSlicer-gcodeviewer_192px.png index 7f4e9d617..2f3b03683 100644 Binary files a/resources/icons/PrusaSlicer-gcodeviewer_192px.png and b/resources/icons/PrusaSlicer-gcodeviewer_192px.png differ diff --git a/resources/icons/PrusaSlicer-gcodeviewer_32px.png b/resources/icons/PrusaSlicer-gcodeviewer_32px.png index 0f7e49d87..eaba5e21d 100644 Binary files a/resources/icons/PrusaSlicer-gcodeviewer_32px.png and b/resources/icons/PrusaSlicer-gcodeviewer_32px.png differ diff --git a/resources/icons/fdm_supports.svg b/resources/icons/fdm_supports.svg new file mode 100644 index 000000000..a64314f80 --- /dev/null +++ b/resources/icons/fdm_supports.svg @@ -0,0 +1,19 @@ + + + + + + + + + + diff --git a/resources/icons/notification_eject_sd.svg b/resources/icons/notification_eject_sd.svg new file mode 100644 index 000000000..bea6c0977 --- /dev/null +++ b/resources/icons/notification_eject_sd.svg @@ -0,0 +1,75 @@ + +image/svg+xml + + + + + + + diff --git a/resources/icons/notification_eject_sd_hover.svg b/resources/icons/notification_eject_sd_hover.svg new file mode 100644 index 000000000..23d2480c6 --- /dev/null +++ b/resources/icons/notification_eject_sd_hover.svg @@ -0,0 +1,76 @@ + +image/svg+xml + + + + + + + diff --git a/resources/profiles/Anycubic.ini b/resources/profiles/Anycubic.ini index 2099306d4..0f231f968 100644 --- a/resources/profiles/Anycubic.ini +++ b/resources/profiles/Anycubic.ini @@ -7,8 +7,8 @@ name = Anycubic # This means, the server may force the PrusaSlicer configuration to be downgraded. config_version = 0.0.2 # Where to get the updates from? -config_update_url = http://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Anycubic/ -# changelog_url = http://files.prusa3d.com/?latest=slicer-profiles&lng=%1% +config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Anycubic/ +# changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1% # The printer models will be shown by the Configuration Wizard in this order, # also the first model installed & the first nozzle installed will be activated after install. @@ -405,8 +405,6 @@ max_layer_height = 0.3 min_layer_height = 0.08 max_print_height = 300 nozzle_diameter = 0.4 -octoprint_apikey = -octoprint_host = printer_notes = printer_settings_id = retract_before_travel = 2 @@ -420,8 +418,6 @@ retract_lift_below = 0 retract_restart_extra = 0 retract_restart_extra_toolchange = 0 retract_speed = 60 -serial_port = -serial_speed = 250000 single_extruder_multi_material = 0 start_gcode = end_gcode = M104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+10, max_print_height)} F600{endif} ; Move print head up\nG1 X0 Y100 F3000 ; present print\nM84 ; disable motors @@ -755,8 +751,6 @@ max_layer_height = 0.3 min_layer_height = 0.1 max_print_height = 200 nozzle_diameter = 0.4 -octoprint_apikey = -octoprint_host = printer_notes = printer_settings_id = retract_before_travel = 1 @@ -770,8 +764,6 @@ retract_lift_below = 0 retract_restart_extra = 0 retract_restart_extra_toolchange = 0 retract_speed = 30 -serial_port = -serial_speed = 115200 single_extruder_multi_material = 0 start_gcode = G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nM117 Homing X/Y ...\nG28 X0 Y0 ;move X/Y to min endstops\nM117 Homing Z ...\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F240 ;move the platform down 15mm\nM117 Heating ...\nM104 S[first_layer_temperature]\n ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature]\n ; wait for extruder temp\nM117 Start cleaning ...\nG92 E0 ;zero the extruded length\nG1 F200 E10 ;extrude 10mm of feed stock\nG92 E0 ;zero the extruded length again\nM117 Intro line ...\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\nG1 X0.1 Y20 Z[first_layer_height] F5000.0 ; Move to start position\nG1 X0.1 Y200.0 Z[first_layer_height] F1500.0 E15 ; Draw the first line\nG1 X0.4 Y200.0 Z[first_layer_height] F5000.0 ; Move to side a little\nG1 X0.4 Y20 Z0.3[first_layer_height] F1500.0 E30 ; Draw the second line\nG92 E0 ; Reset Extruder\nG1 E-1 F500 ; Retract filiment by 1 mm\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\nG1 X5 Y20 Z0.3 F240 ; Move over to prevent blob squish\nG92 E0 ; Reset Extruder\nM117 Printing...\n end_gcode = M117 Cooling down...\nM104 S0 ; turn off extruder\nM140 S0 ; turn off heatbed\nM107 ; Fan off\nM84 ; disable motors\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 ;X-20 Y-20 F240 ;move Z up a bit and retract filament even more\nG28 X0 ;move X to min endstops, so the head is out of the way\nG90 ;Absolute positionning\nG1 Y200 F3000 ;Present print\nM84 ;steppers off\nM300 P300 S4000\nM117 Finished.\n @@ -1197,24 +1189,18 @@ print_settings_id = # Common print preset [print:*common predator 0.4 nozzle*] inherits = *common predator* -printer_variant = 0.4 -nozzle_diameter = 0.4 first_layer_height = 0.16 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_ANYCUBIC.*/ and printer_notes=~/.*PRINTER_MODEL_PREDATOR.*/ and printer_notes=~/.*PRINTER_HAS_BOWDEN.*/ and nozzle_diameter[0]==0.4 # Common print preset [print:*common predator 0.6 nozzle*] inherits = *common predator* -printer_variant = 0.6 -nozzle_diameter = 0.6 first_layer_height = 0.24 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_ANYCUBIC.*/ and printer_notes=~/.*PRINTER_MODEL_PREDATOR.*/ and printer_notes=~/.*PRINTER_HAS_BOWDEN.*/ and nozzle_diameter[0]==0.6 # Common print preset [print:*common predator 0.8 nozzle*] inherits = *common predator* -printer_variant = 0.8 -nozzle_diameter = 0.8 first_layer_height = 0.32 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_ANYCUBIC.*/ and printer_notes=~/.*PRINTER_MODEL_PREDATOR.*/ and printer_notes=~/.*PRINTER_HAS_BOWDEN.*/ and nozzle_diameter[0]==0.8 @@ -1754,11 +1740,7 @@ machine_max_jerk_y = 5 machine_max_jerk_z = 5 machine_min_extruding_rate = 0 machine_min_travel_rate = 0 -octoprint_apikey = -octoprint_host = printer_settings_id = -serial_port = -serial_speed = 125000 printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_ANYCUBIC\nPRINTER_MODEL_PREDATOR\nPRINTER_HAS_BOWDEN\n default_filament_profile = Generic PLA @PREDATOR diff --git a/resources/profiles/Creality.idx b/resources/profiles/Creality.idx index 3b8deb9b8..eae4a6c94 100644 --- a/resources/profiles/Creality.idx +++ b/resources/profiles/Creality.idx @@ -1,3 +1,5 @@ +min_slic3r_version = 2.3.0-alpha2 +0.0.4 Added initial CR-10 profile, end g-code improvements. min_slic3r_version = 2.3.0-alpha0 0.0.3 Added Ender-2, Ender-3 BLTouch, updated Ender-3 bed texture. min_slic3r_version = 2.2.0-alpha3 diff --git a/resources/profiles/Creality/CR10MINI_thumbnail.png b/resources/profiles/Creality/CR10MINI_thumbnail.png new file mode 100644 index 000000000..e0f37fc4f Binary files /dev/null and b/resources/profiles/Creality/CR10MINI_thumbnail.png differ diff --git a/resources/profiles/Creality/CR10S4_thumbnail.png b/resources/profiles/Creality/CR10S4_thumbnail.png new file mode 100644 index 000000000..7a9f460c5 Binary files /dev/null and b/resources/profiles/Creality/CR10S4_thumbnail.png differ diff --git a/resources/profiles/Creality/CR10S5_thumbnail.png b/resources/profiles/Creality/CR10S5_thumbnail.png new file mode 100644 index 000000000..7a9f460c5 Binary files /dev/null and b/resources/profiles/Creality/CR10S5_thumbnail.png differ diff --git a/resources/profiles/Creality/CR10SPROV2_thumbnail.png b/resources/profiles/Creality/CR10SPROV2_thumbnail.png new file mode 100644 index 000000000..f71146f1a Binary files /dev/null and b/resources/profiles/Creality/CR10SPROV2_thumbnail.png differ diff --git a/resources/profiles/Creality/CR10SPRO_thumbnail.png b/resources/profiles/Creality/CR10SPRO_thumbnail.png new file mode 100644 index 000000000..72340a887 Binary files /dev/null and b/resources/profiles/Creality/CR10SPRO_thumbnail.png differ diff --git a/resources/profiles/Creality/CR10S_thumbnail.png b/resources/profiles/Creality/CR10S_thumbnail.png new file mode 100644 index 000000000..cf6dd04ff Binary files /dev/null and b/resources/profiles/Creality/CR10S_thumbnail.png differ diff --git a/resources/profiles/Creality/CR10V2_thumbnail.png b/resources/profiles/Creality/CR10V2_thumbnail.png new file mode 100644 index 000000000..c201c7e4c Binary files /dev/null and b/resources/profiles/Creality/CR10V2_thumbnail.png differ diff --git a/resources/profiles/Creality/CR10V3_thumbnail.png b/resources/profiles/Creality/CR10V3_thumbnail.png new file mode 100644 index 000000000..30f30c07b Binary files /dev/null and b/resources/profiles/Creality/CR10V3_thumbnail.png differ diff --git a/resources/profiles/Creality/CR10_thumbnail.png b/resources/profiles/Creality/CR10_thumbnail.png new file mode 100644 index 000000000..7a3927ee3 Binary files /dev/null and b/resources/profiles/Creality/CR10_thumbnail.png differ diff --git a/resources/profiles/Creality/CR20PRO_thumbnail.png b/resources/profiles/Creality/CR20PRO_thumbnail.png new file mode 100644 index 000000000..9a006981e Binary files /dev/null and b/resources/profiles/Creality/CR20PRO_thumbnail.png differ diff --git a/resources/profiles/Creality/CR20_thumbnail.png b/resources/profiles/Creality/CR20_thumbnail.png new file mode 100644 index 000000000..052659fa5 Binary files /dev/null and b/resources/profiles/Creality/CR20_thumbnail.png differ diff --git a/resources/profiles/Creality/ENDER5PLUS_thumbnail.png b/resources/profiles/Creality/ENDER5PLUS_thumbnail.png new file mode 100644 index 000000000..98bcaaf7d Binary files /dev/null and b/resources/profiles/Creality/ENDER5PLUS_thumbnail.png differ diff --git a/resources/profiles/Creality/ENDER5_thumbnail.png b/resources/profiles/Creality/ENDER5_thumbnail.png new file mode 100644 index 000000000..eb9d117db Binary files /dev/null and b/resources/profiles/Creality/ENDER5_thumbnail.png differ diff --git a/resources/profiles/Creality/cr10.svg b/resources/profiles/Creality/cr10.svg new file mode 100644 index 000000000..67cb4bd37 --- /dev/null +++ b/resources/profiles/Creality/cr10.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/profiles/Creality/cr10_bed.stl b/resources/profiles/Creality/cr10_bed.stl new file mode 100644 index 000000000..832946184 --- /dev/null +++ b/resources/profiles/Creality/cr10_bed.stl @@ -0,0 +1,2774 @@ +solid OpenSCAD_Model + facet normal 0 0 -1 + outer loop + vertex 152.105 -154.998 -3 + vertex 152.002 -154.998 -3 + vertex 152.314 -154.984 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.314 -154.984 -3 + vertex 152.002 -154.998 -3 + vertex 152.521 -154.954 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 155 -152 -3 + vertex 152.002 -154.998 -3 + vertex 152.002 154.998 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.521 -154.954 -3 + vertex 152.002 -154.998 -3 + vertex 152.726 -154.911 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.726 -154.911 -3 + vertex 152.002 -154.998 -3 + vertex 152.927 -154.853 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.927 -154.853 -3 + vertex 152.002 -154.998 -3 + vertex 153.124 -154.782 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 153.124 -154.782 -3 + vertex 152.002 -154.998 -3 + vertex 153.315 -154.696 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 153.315 -154.696 -3 + vertex 152.002 -154.998 -3 + vertex 153.5 -154.598 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 153.5 -154.598 -3 + vertex 152.002 -154.998 -3 + vertex 153.678 -154.487 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 153.678 -154.487 -3 + vertex 152.002 -154.998 -3 + vertex 153.847 -154.364 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 153.847 -154.364 -3 + vertex 152.002 -154.998 -3 + vertex 154.007 -154.229 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.007 -154.229 -3 + vertex 152.002 -154.998 -3 + vertex 154.158 -154.084 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.158 -154.084 -3 + vertex 152.002 -154.998 -3 + vertex 154.298 -153.928 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.298 -153.928 -3 + vertex 152.002 -154.998 -3 + vertex 154.427 -153.763 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.427 -153.763 -3 + vertex 152.002 -154.998 -3 + vertex 154.544 -153.59 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.544 -153.59 -3 + vertex 152.002 -154.998 -3 + vertex 154.649 -153.408 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.649 -153.408 -3 + vertex 152.002 -154.998 -3 + vertex 154.741 -153.22 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.741 -153.22 -3 + vertex 152.002 -154.998 -3 + vertex 154.819 -153.026 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.819 -153.026 -3 + vertex 152.002 -154.998 -3 + vertex 154.884 -152.827 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.884 -152.827 -3 + vertex 152.002 -154.998 -3 + vertex 154.934 -152.624 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.934 -152.624 -3 + vertex 152.002 -154.998 -3 + vertex 154.971 -152.418 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.971 -152.418 -3 + vertex 152.002 -154.998 -3 + vertex 154.993 -152.209 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.993 -152.209 -3 + vertex 152.002 -154.998 -3 + vertex 155 -152 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 155 -152 -3 + vertex 152.002 154.998 -3 + vertex 155 152 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 154.998 -3 + vertex 154.971 152.418 -3 + vertex 154.993 152.209 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 154.884 152.827 -3 + vertex 154.934 152.624 -3 + vertex 152.002 154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 154.741 153.22 -3 + vertex 152.002 154.998 -3 + vertex 154.649 153.408 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 154.741 153.22 -3 + vertex 154.819 153.026 -3 + vertex 152.002 154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 154.998 -3 + vertex 154.007 154.229 -3 + vertex 154.158 154.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 154.427 153.763 -3 + vertex 152.002 154.998 -3 + vertex 154.298 153.928 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 154.427 153.763 -3 + vertex 154.544 153.59 -3 + vertex 152.002 154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 154.298 153.928 -3 + vertex 152.002 154.998 -3 + vertex 154.158 154.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 154.998 -3 + vertex 152.927 154.853 -3 + vertex 153.124 154.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 153.847 154.364 -3 + vertex 152.002 154.998 -3 + vertex 153.678 154.487 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 153.847 154.364 -3 + vertex 154.007 154.229 -3 + vertex 152.002 154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 153.678 154.487 -3 + vertex 152.002 154.998 -3 + vertex 153.5 154.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 153.5 154.598 -3 + vertex 152.002 154.998 -3 + vertex 153.315 154.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 153.315 154.696 -3 + vertex 152.002 154.998 -3 + vertex 153.124 154.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 154.649 153.408 -3 + vertex 152.002 154.998 -3 + vertex 154.544 153.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.726 154.911 -3 + vertex 152.002 154.998 -3 + vertex 152.521 154.954 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 152.726 154.911 -3 + vertex 152.927 154.853 -3 + vertex 152.002 154.998 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 154.819 153.026 -3 + vertex 154.884 152.827 -3 + vertex 152.002 154.998 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 152.314 154.984 -3 + vertex 152.521 154.954 -3 + vertex 152.002 154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 154.998 -3 + vertex 154.934 152.624 -3 + vertex 154.971 152.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 154.998 -3 + vertex 152.105 154.998 -3 + vertex 152.314 154.984 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 155 152 -3 + vertex 152.002 154.998 -3 + vertex 154.993 152.209 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex -152 155 -3 + vertex 152 155 -3 + vertex -152.002 154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex 152 155 -3 + vertex 152.002 154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 -154.998 -3 + vertex -152.002 154.998 -3 + vertex 152.002 154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -155 -152 -3 + vertex -155 152 -3 + vertex -152.002 -154.998 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -152.314 154.984 -3 + vertex -152.105 154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -152.521 154.954 -3 + vertex -152.314 154.984 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -152.726 154.911 -3 + vertex -152.521 154.954 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -152.927 154.853 -3 + vertex -152.726 154.911 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -153.124 154.782 -3 + vertex -152.927 154.853 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -153.315 154.696 -3 + vertex -153.124 154.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -153.5 154.598 -3 + vertex -153.315 154.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -153.678 154.487 -3 + vertex -153.5 154.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -153.847 154.364 -3 + vertex -153.678 154.487 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -154.007 154.229 -3 + vertex -153.847 154.364 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -154.158 154.084 -3 + vertex -154.007 154.229 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -154.298 153.928 -3 + vertex -154.158 154.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -154.427 153.763 -3 + vertex -154.298 153.928 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -154.544 153.59 -3 + vertex -154.427 153.763 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -154.649 153.408 -3 + vertex -154.544 153.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -154.741 153.22 -3 + vertex -154.649 153.408 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -154.819 153.026 -3 + vertex -154.741 153.22 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -154.884 152.827 -3 + vertex -154.819 153.026 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -154.934 152.624 -3 + vertex -154.884 152.827 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -154.971 152.418 -3 + vertex -154.934 152.624 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -154.993 152.209 -3 + vertex -154.971 152.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -155 152 -3 + vertex -154.993 152.209 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -154.998 -3 + vertex -155 152 -3 + vertex -152.002 154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 -154.998 -3 + vertex -152.002 -154.998 -3 + vertex -152.002 154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -154.998 -3 + vertex -154.971 -152.418 -3 + vertex -154.993 -152.209 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.884 -152.827 -3 + vertex -154.934 -152.624 -3 + vertex -152.002 -154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.741 -153.22 -3 + vertex -152.002 -154.998 -3 + vertex -154.649 -153.408 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.741 -153.22 -3 + vertex -154.819 -153.026 -3 + vertex -152.002 -154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -154.998 -3 + vertex -154.007 -154.229 -3 + vertex -154.158 -154.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.427 -153.763 -3 + vertex -152.002 -154.998 -3 + vertex -154.298 -153.928 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.427 -153.763 -3 + vertex -154.544 -153.59 -3 + vertex -152.002 -154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.298 -153.928 -3 + vertex -152.002 -154.998 -3 + vertex -154.158 -154.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -154.998 -3 + vertex -152.927 -154.853 -3 + vertex -153.124 -154.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -153.847 -154.364 -3 + vertex -152.002 -154.998 -3 + vertex -153.678 -154.487 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -153.847 -154.364 -3 + vertex -154.007 -154.229 -3 + vertex -152.002 -154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -153.678 -154.487 -3 + vertex -152.002 -154.998 -3 + vertex -153.5 -154.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -153.5 -154.598 -3 + vertex -152.002 -154.998 -3 + vertex -153.315 -154.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -153.315 -154.696 -3 + vertex -152.002 -154.998 -3 + vertex -153.124 -154.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.649 -153.408 -3 + vertex -152.002 -154.998 -3 + vertex -154.544 -153.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.726 -154.911 -3 + vertex -152.002 -154.998 -3 + vertex -152.521 -154.954 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.726 -154.911 -3 + vertex -152.927 -154.853 -3 + vertex -152.002 -154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.819 -153.026 -3 + vertex -154.884 -152.827 -3 + vertex -152.002 -154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.314 -154.984 -3 + vertex -152.521 -154.954 -3 + vertex -152.002 -154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -154.998 -3 + vertex -154.934 -152.624 -3 + vertex -154.971 -152.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -154.998 -3 + vertex -152.105 -154.998 -3 + vertex -152.314 -154.984 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.002 -154.998 -3 + vertex 152 -155 -3 + vertex -152.002 -154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -154.998 -3 + vertex 152 -155 -3 + vertex -152 -155 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -155 -152 -3 + vertex -152.002 -154.998 -3 + vertex -154.993 -152.209 -3 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.314 -154.984 0 + vertex 152.002 -154.998 0 + vertex 152.105 -154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.521 -154.954 0 + vertex 152.002 -154.998 0 + vertex 152.314 -154.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 154.998 0 + vertex 152.002 -154.998 0 + vertex 155 -152 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.726 -154.911 0 + vertex 152.002 -154.998 0 + vertex 152.521 -154.954 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.927 -154.853 0 + vertex 152.002 -154.998 0 + vertex 152.726 -154.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.124 -154.782 0 + vertex 152.002 -154.998 0 + vertex 152.927 -154.853 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.315 -154.696 0 + vertex 152.002 -154.998 0 + vertex 153.124 -154.782 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.5 -154.598 0 + vertex 152.002 -154.998 0 + vertex 153.315 -154.696 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.678 -154.487 0 + vertex 152.002 -154.998 0 + vertex 153.5 -154.598 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.847 -154.364 0 + vertex 152.002 -154.998 0 + vertex 153.678 -154.487 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.007 -154.229 0 + vertex 152.002 -154.998 0 + vertex 153.847 -154.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.158 -154.084 0 + vertex 152.002 -154.998 0 + vertex 154.007 -154.229 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.298 -153.928 0 + vertex 152.002 -154.998 0 + vertex 154.158 -154.084 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.427 -153.763 0 + vertex 152.002 -154.998 0 + vertex 154.298 -153.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.544 -153.59 0 + vertex 152.002 -154.998 0 + vertex 154.427 -153.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.649 -153.408 0 + vertex 152.002 -154.998 0 + vertex 154.544 -153.59 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.741 -153.22 0 + vertex 152.002 -154.998 0 + vertex 154.649 -153.408 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.819 -153.026 0 + vertex 152.002 -154.998 0 + vertex 154.741 -153.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.884 -152.827 0 + vertex 152.002 -154.998 0 + vertex 154.819 -153.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.934 -152.624 0 + vertex 152.002 -154.998 0 + vertex 154.884 -152.827 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.971 -152.418 0 + vertex 152.002 -154.998 0 + vertex 154.934 -152.624 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.993 -152.209 0 + vertex 152.002 -154.998 0 + vertex 154.971 -152.418 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 155 -152 0 + vertex 152.002 -154.998 0 + vertex 154.993 -152.209 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 155 152 0 + vertex 152.002 154.998 0 + vertex 155 -152 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.993 152.209 0 + vertex 154.971 152.418 0 + vertex 152.002 154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 154.998 0 + vertex 154.934 152.624 0 + vertex 154.884 152.827 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.649 153.408 0 + vertex 152.002 154.998 0 + vertex 154.741 153.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 154.998 0 + vertex 154.819 153.026 0 + vertex 154.741 153.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.158 154.084 0 + vertex 154.007 154.229 0 + vertex 152.002 154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.298 153.928 0 + vertex 152.002 154.998 0 + vertex 154.427 153.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 154.998 0 + vertex 154.544 153.59 0 + vertex 154.427 153.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.158 154.084 0 + vertex 152.002 154.998 0 + vertex 154.298 153.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.124 154.782 0 + vertex 152.927 154.853 0 + vertex 152.002 154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.678 154.487 0 + vertex 152.002 154.998 0 + vertex 153.847 154.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 154.998 0 + vertex 154.007 154.229 0 + vertex 153.847 154.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.5 154.598 0 + vertex 152.002 154.998 0 + vertex 153.678 154.487 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.315 154.696 0 + vertex 152.002 154.998 0 + vertex 153.5 154.598 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.124 154.782 0 + vertex 152.002 154.998 0 + vertex 153.315 154.696 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.544 153.59 0 + vertex 152.002 154.998 0 + vertex 154.649 153.408 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.521 154.954 0 + vertex 152.002 154.998 0 + vertex 152.726 154.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 154.998 0 + vertex 152.927 154.853 0 + vertex 152.726 154.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 154.998 0 + vertex 154.884 152.827 0 + vertex 154.819 153.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 154.998 0 + vertex 152.521 154.954 0 + vertex 152.314 154.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.971 152.418 0 + vertex 154.934 152.624 0 + vertex 152.002 154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.314 154.984 0 + vertex 152.105 154.998 0 + vertex 152.002 154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.993 152.209 0 + vertex 152.002 154.998 0 + vertex 155 152 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 154.998 0 + vertex 152 155 0 + vertex -152 155 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 154.998 0 + vertex 152 155 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 154.998 0 + vertex -152.002 154.998 0 + vertex 152.002 -154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -154.998 0 + vertex -155 152 0 + vertex -155 -152 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.105 154.998 0 + vertex -152.314 154.984 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.314 154.984 0 + vertex -152.521 154.954 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.521 154.954 0 + vertex -152.726 154.911 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.726 154.911 0 + vertex -152.927 154.853 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.927 154.853 0 + vertex -153.124 154.782 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -153.124 154.782 0 + vertex -153.315 154.696 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -153.315 154.696 0 + vertex -153.5 154.598 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -153.5 154.598 0 + vertex -153.678 154.487 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -153.678 154.487 0 + vertex -153.847 154.364 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -153.847 154.364 0 + vertex -154.007 154.229 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.007 154.229 0 + vertex -154.158 154.084 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.158 154.084 0 + vertex -154.298 153.928 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.298 153.928 0 + vertex -154.427 153.763 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.427 153.763 0 + vertex -154.544 153.59 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.544 153.59 0 + vertex -154.649 153.408 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.649 153.408 0 + vertex -154.741 153.22 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.741 153.22 0 + vertex -154.819 153.026 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.819 153.026 0 + vertex -154.884 152.827 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.884 152.827 0 + vertex -154.934 152.624 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.934 152.624 0 + vertex -154.971 152.418 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.971 152.418 0 + vertex -154.993 152.209 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.993 152.209 0 + vertex -155 152 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 154.998 0 + vertex -155 152 0 + vertex -152.002 -154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 154.998 0 + vertex -152.002 -154.998 0 + vertex 152.002 -154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -154.993 -152.209 0 + vertex -154.971 -152.418 0 + vertex -152.002 -154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -154.998 0 + vertex -154.934 -152.624 0 + vertex -154.884 -152.827 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -154.649 -153.408 0 + vertex -152.002 -154.998 0 + vertex -154.741 -153.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -154.998 0 + vertex -154.819 -153.026 0 + vertex -154.741 -153.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -154.158 -154.084 0 + vertex -154.007 -154.229 0 + vertex -152.002 -154.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -154.298 -153.928 0 + vertex -152.002 -154.998 0 + vertex -154.427 -153.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -154.998 0 + vertex -154.544 -153.59 0 + vertex -154.427 -153.763 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -154.158 -154.084 0 + vertex -152.002 -154.998 0 + vertex -154.298 -153.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -153.124 -154.782 0 + vertex -152.927 -154.853 0 + vertex -152.002 -154.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -153.678 -154.487 0 + vertex -152.002 -154.998 0 + vertex -153.847 -154.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -154.998 0 + vertex -154.007 -154.229 0 + vertex -153.847 -154.364 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -153.5 -154.598 0 + vertex -152.002 -154.998 0 + vertex -153.678 -154.487 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -153.315 -154.696 0 + vertex -152.002 -154.998 0 + vertex -153.5 -154.598 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -153.124 -154.782 0 + vertex -152.002 -154.998 0 + vertex -153.315 -154.696 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -154.544 -153.59 0 + vertex -152.002 -154.998 0 + vertex -154.649 -153.408 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -152.521 -154.954 0 + vertex -152.002 -154.998 0 + vertex -152.726 -154.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -154.998 0 + vertex -152.927 -154.853 0 + vertex -152.726 -154.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -154.998 0 + vertex -154.884 -152.827 0 + vertex -154.819 -153.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -154.998 0 + vertex -152.521 -154.954 0 + vertex -152.314 -154.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -154.971 -152.418 0 + vertex -154.934 -152.624 0 + vertex -152.002 -154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.314 -154.984 0 + vertex -152.105 -154.998 0 + vertex -152.002 -154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.002 -154.998 0 + vertex 152 -155 0 + vertex 152.002 -154.998 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex -152 -155 0 + vertex 152 -155 0 + vertex -152.002 -154.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -154.993 -152.209 0 + vertex -152.002 -154.998 0 + vertex -155 -152 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 152.105 -154.998 -3 + vertex 152.002 -154.998 0 + vertex 152.002 -154.998 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 152.105 -154.998 -3 + vertex 152.105 -154.998 0 + vertex 152.002 -154.998 0 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 152.314 -154.984 -3 + vertex 152.105 -154.998 0 + vertex 152.105 -154.998 -3 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 152.314 -154.984 -3 + vertex 152.314 -154.984 0 + vertex 152.105 -154.998 0 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 152.521 -154.954 -3 + vertex 152.314 -154.984 0 + vertex 152.314 -154.984 -3 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 152.521 -154.954 -3 + vertex 152.521 -154.954 0 + vertex 152.314 -154.984 0 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 152.726 -154.911 -3 + vertex 152.521 -154.954 0 + vertex 152.521 -154.954 -3 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 152.726 -154.911 -3 + vertex 152.726 -154.911 0 + vertex 152.521 -154.954 0 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 152.927 -154.853 -3 + vertex 152.726 -154.911 0 + vertex 152.726 -154.911 -3 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 152.927 -154.853 -3 + vertex 152.927 -154.853 0 + vertex 152.726 -154.911 0 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 153.124 -154.782 -3 + vertex 152.927 -154.853 0 + vertex 152.927 -154.853 -3 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 153.124 -154.782 -3 + vertex 153.124 -154.782 0 + vertex 152.927 -154.853 0 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 153.315 -154.696 -3 + vertex 153.124 -154.782 0 + vertex 153.124 -154.782 -3 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 153.315 -154.696 -3 + vertex 153.315 -154.696 0 + vertex 153.124 -154.782 0 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 153.5 -154.598 -3 + vertex 153.315 -154.696 0 + vertex 153.315 -154.696 -3 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 153.5 -154.598 -3 + vertex 153.5 -154.598 0 + vertex 153.315 -154.696 0 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 153.678 -154.487 -3 + vertex 153.5 -154.598 0 + vertex 153.5 -154.598 -3 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 153.678 -154.487 -3 + vertex 153.678 -154.487 0 + vertex 153.5 -154.598 0 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 153.847 -154.364 -3 + vertex 153.678 -154.487 0 + vertex 153.678 -154.487 -3 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 153.847 -154.364 -3 + vertex 153.847 -154.364 0 + vertex 153.678 -154.487 0 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 154.007 -154.229 -3 + vertex 153.847 -154.364 0 + vertex 153.847 -154.364 -3 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 154.007 -154.229 -3 + vertex 154.007 -154.229 0 + vertex 153.847 -154.364 0 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 154.158 -154.084 -3 + vertex 154.007 -154.229 0 + vertex 154.007 -154.229 -3 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 154.158 -154.084 -3 + vertex 154.158 -154.084 0 + vertex 154.007 -154.229 0 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 154.298 -153.928 -3 + vertex 154.158 -154.084 0 + vertex 154.158 -154.084 -3 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 154.298 -153.928 -3 + vertex 154.298 -153.928 0 + vertex 154.158 -154.084 0 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 154.427 -153.763 -3 + vertex 154.298 -153.928 0 + vertex 154.298 -153.928 -3 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 154.427 -153.763 -3 + vertex 154.427 -153.763 0 + vertex 154.298 -153.928 0 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 154.544 -153.59 -3 + vertex 154.427 -153.763 0 + vertex 154.427 -153.763 -3 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 154.544 -153.59 -3 + vertex 154.544 -153.59 0 + vertex 154.427 -153.763 0 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 154.649 -153.408 -3 + vertex 154.544 -153.59 0 + vertex 154.544 -153.59 -3 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 154.649 -153.408 -3 + vertex 154.649 -153.408 0 + vertex 154.544 -153.59 0 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 154.741 -153.22 -3 + vertex 154.649 -153.408 0 + vertex 154.649 -153.408 -3 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 154.741 -153.22 -3 + vertex 154.741 -153.22 0 + vertex 154.649 -153.408 0 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 154.819 -153.026 -3 + vertex 154.741 -153.22 0 + vertex 154.741 -153.22 -3 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 154.819 -153.026 -3 + vertex 154.819 -153.026 0 + vertex 154.741 -153.22 0 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 154.884 -152.827 -3 + vertex 154.819 -153.026 0 + vertex 154.819 -153.026 -3 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 154.884 -152.827 -3 + vertex 154.884 -152.827 0 + vertex 154.819 -153.026 0 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 154.934 -152.624 -3 + vertex 154.884 -152.827 0 + vertex 154.884 -152.827 -3 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 154.934 -152.624 -3 + vertex 154.934 -152.624 0 + vertex 154.884 -152.827 0 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 154.971 -152.418 -3 + vertex 154.934 -152.624 0 + vertex 154.934 -152.624 -3 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 154.971 -152.418 -3 + vertex 154.971 -152.418 0 + vertex 154.934 -152.624 0 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 154.993 -152.209 -3 + vertex 154.971 -152.418 0 + vertex 154.971 -152.418 -3 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 154.993 -152.209 -3 + vertex 154.993 -152.209 0 + vertex 154.971 -152.418 0 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 155 -152 -3 + vertex 154.993 -152.209 0 + vertex 154.993 -152.209 -3 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 155 -152 -3 + vertex 155 -152 0 + vertex 154.993 -152.209 0 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 155 152 -3 + vertex 155 -152 0 + vertex 155 -152 -3 + endloop + endfacet + facet normal 1 0 -0 + outer loop + vertex 155 152 -3 + vertex 155 152 0 + vertex 155 -152 0 + endloop + endfacet + facet normal 0.99944 0.0334741 0 + outer loop + vertex 154.993 152.209 -3 + vertex 155 152 0 + vertex 155 152 -3 + endloop + endfacet + facet normal 0.99944 0.0334741 -0 + outer loop + vertex 154.993 152.209 -3 + vertex 154.993 152.209 0 + vertex 155 152 0 + endloop + endfacet + facet normal 0.994505 0.104685 0 + outer loop + vertex 154.971 152.418 -3 + vertex 154.993 152.209 0 + vertex 154.993 152.209 -3 + endloop + endfacet + facet normal 0.994505 0.104685 -0 + outer loop + vertex 154.971 152.418 -3 + vertex 154.971 152.418 0 + vertex 154.993 152.209 0 + endloop + endfacet + facet normal 0.98425 0.176783 0 + outer loop + vertex 154.934 152.624 -3 + vertex 154.971 152.418 0 + vertex 154.971 152.418 -3 + endloop + endfacet + facet normal 0.98425 0.176783 -0 + outer loop + vertex 154.934 152.624 -3 + vertex 154.934 152.624 0 + vertex 154.971 152.418 0 + endloop + endfacet + facet normal 0.970981 0.239158 0 + outer loop + vertex 154.884 152.827 -3 + vertex 154.934 152.624 0 + vertex 154.934 152.624 -3 + endloop + endfacet + facet normal 0.970981 0.239158 -0 + outer loop + vertex 154.884 152.827 -3 + vertex 154.884 152.827 0 + vertex 154.934 152.624 0 + endloop + endfacet + facet normal 0.950577 0.31049 0 + outer loop + vertex 154.819 153.026 -3 + vertex 154.884 152.827 0 + vertex 154.884 152.827 -3 + endloop + endfacet + facet normal 0.950577 0.31049 -0 + outer loop + vertex 154.819 153.026 -3 + vertex 154.819 153.026 0 + vertex 154.884 152.827 0 + endloop + endfacet + facet normal 0.927816 0.373039 0 + outer loop + vertex 154.741 153.22 -3 + vertex 154.819 153.026 0 + vertex 154.819 153.026 -3 + endloop + endfacet + facet normal 0.927816 0.373039 -0 + outer loop + vertex 154.741 153.22 -3 + vertex 154.741 153.22 0 + vertex 154.819 153.026 0 + endloop + endfacet + facet normal 0.898217 0.439553 0 + outer loop + vertex 154.649 153.408 -3 + vertex 154.741 153.22 0 + vertex 154.741 153.22 -3 + endloop + endfacet + facet normal 0.898217 0.439553 -0 + outer loop + vertex 154.649 153.408 -3 + vertex 154.649 153.408 0 + vertex 154.741 153.22 0 + endloop + endfacet + facet normal 0.866186 0.499722 0 + outer loop + vertex 154.544 153.59 -3 + vertex 154.649 153.408 0 + vertex 154.649 153.408 -3 + endloop + endfacet + facet normal 0.866186 0.499722 -0 + outer loop + vertex 154.544 153.59 -3 + vertex 154.544 153.59 0 + vertex 154.649 153.408 0 + endloop + endfacet + facet normal 0.828349 0.560213 0 + outer loop + vertex 154.427 153.763 -3 + vertex 154.544 153.59 0 + vertex 154.544 153.59 -3 + endloop + endfacet + facet normal 0.828349 0.560213 -0 + outer loop + vertex 154.427 153.763 -3 + vertex 154.427 153.763 0 + vertex 154.544 153.59 0 + endloop + endfacet + facet normal 0.787807 0.615922 0 + outer loop + vertex 154.298 153.928 -3 + vertex 154.427 153.763 0 + vertex 154.427 153.763 -3 + endloop + endfacet + facet normal 0.787807 0.615922 -0 + outer loop + vertex 154.298 153.928 -3 + vertex 154.298 153.928 0 + vertex 154.427 153.763 0 + endloop + endfacet + facet normal 0.744242 0.66791 0 + outer loop + vertex 154.158 154.084 -3 + vertex 154.298 153.928 0 + vertex 154.298 153.928 -3 + endloop + endfacet + facet normal 0.744242 0.66791 -0 + outer loop + vertex 154.158 154.084 -3 + vertex 154.158 154.084 0 + vertex 154.298 153.928 0 + endloop + endfacet + facet normal 0.692631 0.721292 0 + outer loop + vertex 154.007 154.229 -3 + vertex 154.158 154.084 0 + vertex 154.158 154.084 -3 + endloop + endfacet + facet normal 0.692631 0.721292 -0 + outer loop + vertex 154.007 154.229 -3 + vertex 154.007 154.229 0 + vertex 154.158 154.084 0 + endloop + endfacet + facet normal 0.644871 0.764291 0 + outer loop + vertex 153.847 154.364 -3 + vertex 154.007 154.229 0 + vertex 154.007 154.229 -3 + endloop + endfacet + facet normal 0.644871 0.764291 -0 + outer loop + vertex 153.847 154.364 -3 + vertex 153.847 154.364 0 + vertex 154.007 154.229 0 + endloop + endfacet + facet normal 0.588456 0.808529 0 + outer loop + vertex 153.678 154.487 -3 + vertex 153.847 154.364 0 + vertex 153.847 154.364 -3 + endloop + endfacet + facet normal 0.588456 0.808529 -0 + outer loop + vertex 153.678 154.487 -3 + vertex 153.678 154.487 0 + vertex 153.847 154.364 0 + endloop + endfacet + facet normal 0.529142 0.848533 0 + outer loop + vertex 153.5 154.598 -3 + vertex 153.678 154.487 0 + vertex 153.678 154.487 -3 + endloop + endfacet + facet normal 0.529142 0.848533 -0 + outer loop + vertex 153.5 154.598 -3 + vertex 153.5 154.598 0 + vertex 153.678 154.487 0 + endloop + endfacet + facet normal 0.468107 0.883672 0 + outer loop + vertex 153.315 154.696 -3 + vertex 153.5 154.598 0 + vertex 153.5 154.598 -3 + endloop + endfacet + facet normal 0.468107 0.883672 -0 + outer loop + vertex 153.315 154.696 -3 + vertex 153.315 154.696 0 + vertex 153.5 154.598 0 + endloop + endfacet + facet normal 0.410563 0.911832 0 + outer loop + vertex 153.124 154.782 -3 + vertex 153.315 154.696 0 + vertex 153.315 154.696 -3 + endloop + endfacet + facet normal 0.410563 0.911832 -0 + outer loop + vertex 153.124 154.782 -3 + vertex 153.124 154.782 0 + vertex 153.315 154.696 0 + endloop + endfacet + facet normal 0.339058 0.940766 0 + outer loop + vertex 152.927 154.853 -3 + vertex 153.124 154.782 0 + vertex 153.124 154.782 -3 + endloop + endfacet + facet normal 0.339058 0.940766 -0 + outer loop + vertex 152.927 154.853 -3 + vertex 152.927 154.853 0 + vertex 153.124 154.782 0 + endloop + endfacet + facet normal 0.277246 0.960799 0 + outer loop + vertex 152.726 154.911 -3 + vertex 152.927 154.853 0 + vertex 152.927 154.853 -3 + endloop + endfacet + facet normal 0.277246 0.960799 -0 + outer loop + vertex 152.726 154.911 -3 + vertex 152.726 154.911 0 + vertex 152.927 154.853 0 + endloop + endfacet + facet normal 0.205289 0.978701 0 + outer loop + vertex 152.521 154.954 -3 + vertex 152.726 154.911 0 + vertex 152.726 154.911 -3 + endloop + endfacet + facet normal 0.205289 0.978701 -0 + outer loop + vertex 152.521 154.954 -3 + vertex 152.521 154.954 0 + vertex 152.726 154.911 0 + endloop + endfacet + facet normal 0.143429 0.989661 0 + outer loop + vertex 152.314 154.984 -3 + vertex 152.521 154.954 0 + vertex 152.521 154.954 -3 + endloop + endfacet + facet normal 0.143429 0.989661 -0 + outer loop + vertex 152.314 154.984 -3 + vertex 152.314 154.984 0 + vertex 152.521 154.954 0 + endloop + endfacet + facet normal 0.0668359 0.997764 0 + outer loop + vertex 152.105 154.998 -3 + vertex 152.314 154.984 0 + vertex 152.314 154.984 -3 + endloop + endfacet + facet normal 0.0668359 0.997764 -0 + outer loop + vertex 152.105 154.998 -3 + vertex 152.105 154.998 0 + vertex 152.314 154.984 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 152.002 154.998 -3 + vertex 152.105 154.998 0 + vertex 152.105 154.998 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 152.002 154.998 -3 + vertex 152.002 154.998 0 + vertex 152.105 154.998 0 + endloop + endfacet + facet normal 0.707107 0.707107 0 + outer loop + vertex 152 155 -3 + vertex 152.002 154.998 0 + vertex 152.002 154.998 -3 + endloop + endfacet + facet normal 0.707107 0.707107 -0 + outer loop + vertex 152 155 -3 + vertex 152 155 0 + vertex 152.002 154.998 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -152 155 -3 + vertex 152 155 0 + vertex 152 155 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -152 155 -3 + vertex -152 155 0 + vertex 152 155 0 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -152.002 154.998 -3 + vertex -152 155 0 + vertex -152 155 -3 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -152.002 154.998 -3 + vertex -152.002 154.998 0 + vertex -152 155 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -152.105 154.998 -3 + vertex -152.002 154.998 0 + vertex -152.002 154.998 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -152.105 154.998 -3 + vertex -152.105 154.998 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -152.314 154.984 -3 + vertex -152.105 154.998 0 + vertex -152.105 154.998 -3 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -152.314 154.984 -3 + vertex -152.314 154.984 0 + vertex -152.105 154.998 0 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -152.521 154.954 -3 + vertex -152.314 154.984 0 + vertex -152.314 154.984 -3 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -152.521 154.954 -3 + vertex -152.521 154.954 0 + vertex -152.314 154.984 0 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -152.726 154.911 -3 + vertex -152.521 154.954 0 + vertex -152.521 154.954 -3 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -152.726 154.911 -3 + vertex -152.726 154.911 0 + vertex -152.521 154.954 0 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -152.927 154.853 -3 + vertex -152.726 154.911 0 + vertex -152.726 154.911 -3 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -152.927 154.853 -3 + vertex -152.927 154.853 0 + vertex -152.726 154.911 0 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -153.124 154.782 -3 + vertex -152.927 154.853 0 + vertex -152.927 154.853 -3 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -153.124 154.782 -3 + vertex -153.124 154.782 0 + vertex -152.927 154.853 0 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -153.315 154.696 -3 + vertex -153.124 154.782 0 + vertex -153.124 154.782 -3 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -153.315 154.696 -3 + vertex -153.315 154.696 0 + vertex -153.124 154.782 0 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -153.5 154.598 -3 + vertex -153.315 154.696 0 + vertex -153.315 154.696 -3 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -153.5 154.598 -3 + vertex -153.5 154.598 0 + vertex -153.315 154.696 0 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -153.678 154.487 -3 + vertex -153.5 154.598 0 + vertex -153.5 154.598 -3 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -153.678 154.487 -3 + vertex -153.678 154.487 0 + vertex -153.5 154.598 0 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -153.847 154.364 -3 + vertex -153.678 154.487 0 + vertex -153.678 154.487 -3 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -153.847 154.364 -3 + vertex -153.847 154.364 0 + vertex -153.678 154.487 0 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -154.007 154.229 -3 + vertex -153.847 154.364 0 + vertex -153.847 154.364 -3 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -154.007 154.229 -3 + vertex -154.007 154.229 0 + vertex -153.847 154.364 0 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -154.158 154.084 -3 + vertex -154.007 154.229 0 + vertex -154.007 154.229 -3 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -154.158 154.084 -3 + vertex -154.158 154.084 0 + vertex -154.007 154.229 0 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -154.298 153.928 -3 + vertex -154.158 154.084 0 + vertex -154.158 154.084 -3 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -154.298 153.928 -3 + vertex -154.298 153.928 0 + vertex -154.158 154.084 0 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -154.427 153.763 -3 + vertex -154.298 153.928 0 + vertex -154.298 153.928 -3 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -154.427 153.763 -3 + vertex -154.427 153.763 0 + vertex -154.298 153.928 0 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -154.544 153.59 -3 + vertex -154.427 153.763 0 + vertex -154.427 153.763 -3 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -154.544 153.59 -3 + vertex -154.544 153.59 0 + vertex -154.427 153.763 0 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -154.649 153.408 -3 + vertex -154.544 153.59 0 + vertex -154.544 153.59 -3 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -154.649 153.408 -3 + vertex -154.649 153.408 0 + vertex -154.544 153.59 0 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -154.741 153.22 -3 + vertex -154.649 153.408 0 + vertex -154.649 153.408 -3 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -154.741 153.22 -3 + vertex -154.741 153.22 0 + vertex -154.649 153.408 0 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -154.819 153.026 -3 + vertex -154.741 153.22 0 + vertex -154.741 153.22 -3 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -154.819 153.026 -3 + vertex -154.819 153.026 0 + vertex -154.741 153.22 0 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -154.884 152.827 -3 + vertex -154.819 153.026 0 + vertex -154.819 153.026 -3 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -154.884 152.827 -3 + vertex -154.884 152.827 0 + vertex -154.819 153.026 0 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -154.934 152.624 -3 + vertex -154.884 152.827 0 + vertex -154.884 152.827 -3 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -154.934 152.624 -3 + vertex -154.934 152.624 0 + vertex -154.884 152.827 0 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -154.971 152.418 -3 + vertex -154.934 152.624 0 + vertex -154.934 152.624 -3 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -154.971 152.418 -3 + vertex -154.971 152.418 0 + vertex -154.934 152.624 0 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -154.993 152.209 -3 + vertex -154.971 152.418 0 + vertex -154.971 152.418 -3 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -154.993 152.209 -3 + vertex -154.993 152.209 0 + vertex -154.971 152.418 0 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -155 152 -3 + vertex -154.993 152.209 0 + vertex -154.993 152.209 -3 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -155 152 -3 + vertex -155 152 0 + vertex -154.993 152.209 0 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -155 -152 -3 + vertex -155 152 0 + vertex -155 152 -3 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -155 -152 -3 + vertex -155 -152 0 + vertex -155 152 0 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -154.993 -152.209 -3 + vertex -155 -152 0 + vertex -155 -152 -3 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -154.993 -152.209 -3 + vertex -154.993 -152.209 0 + vertex -155 -152 0 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -154.971 -152.418 -3 + vertex -154.993 -152.209 0 + vertex -154.993 -152.209 -3 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -154.971 -152.418 -3 + vertex -154.971 -152.418 0 + vertex -154.993 -152.209 0 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -154.934 -152.624 -3 + vertex -154.971 -152.418 0 + vertex -154.971 -152.418 -3 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -154.934 -152.624 -3 + vertex -154.934 -152.624 0 + vertex -154.971 -152.418 0 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -154.884 -152.827 -3 + vertex -154.934 -152.624 0 + vertex -154.934 -152.624 -3 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -154.884 -152.827 -3 + vertex -154.884 -152.827 0 + vertex -154.934 -152.624 0 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -154.819 -153.026 -3 + vertex -154.884 -152.827 0 + vertex -154.884 -152.827 -3 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -154.819 -153.026 -3 + vertex -154.819 -153.026 0 + vertex -154.884 -152.827 0 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -154.741 -153.22 -3 + vertex -154.819 -153.026 0 + vertex -154.819 -153.026 -3 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -154.741 -153.22 -3 + vertex -154.741 -153.22 0 + vertex -154.819 -153.026 0 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -154.649 -153.408 -3 + vertex -154.741 -153.22 0 + vertex -154.741 -153.22 -3 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -154.649 -153.408 -3 + vertex -154.649 -153.408 0 + vertex -154.741 -153.22 0 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -154.544 -153.59 -3 + vertex -154.649 -153.408 0 + vertex -154.649 -153.408 -3 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -154.544 -153.59 -3 + vertex -154.544 -153.59 0 + vertex -154.649 -153.408 0 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -154.427 -153.763 -3 + vertex -154.544 -153.59 0 + vertex -154.544 -153.59 -3 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -154.427 -153.763 -3 + vertex -154.427 -153.763 0 + vertex -154.544 -153.59 0 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -154.298 -153.928 -3 + vertex -154.427 -153.763 0 + vertex -154.427 -153.763 -3 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -154.298 -153.928 -3 + vertex -154.298 -153.928 0 + vertex -154.427 -153.763 0 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -154.158 -154.084 -3 + vertex -154.298 -153.928 0 + vertex -154.298 -153.928 -3 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -154.158 -154.084 -3 + vertex -154.158 -154.084 0 + vertex -154.298 -153.928 0 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -154.007 -154.229 -3 + vertex -154.158 -154.084 0 + vertex -154.158 -154.084 -3 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -154.007 -154.229 -3 + vertex -154.007 -154.229 0 + vertex -154.158 -154.084 0 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -153.847 -154.364 -3 + vertex -154.007 -154.229 0 + vertex -154.007 -154.229 -3 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -153.847 -154.364 -3 + vertex -153.847 -154.364 0 + vertex -154.007 -154.229 0 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -153.678 -154.487 -3 + vertex -153.847 -154.364 0 + vertex -153.847 -154.364 -3 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -153.678 -154.487 -3 + vertex -153.678 -154.487 0 + vertex -153.847 -154.364 0 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -153.5 -154.598 -3 + vertex -153.678 -154.487 0 + vertex -153.678 -154.487 -3 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -153.5 -154.598 -3 + vertex -153.5 -154.598 0 + vertex -153.678 -154.487 0 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -153.315 -154.696 -3 + vertex -153.5 -154.598 0 + vertex -153.5 -154.598 -3 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -153.315 -154.696 -3 + vertex -153.315 -154.696 0 + vertex -153.5 -154.598 0 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -153.124 -154.782 -3 + vertex -153.315 -154.696 0 + vertex -153.315 -154.696 -3 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -153.124 -154.782 -3 + vertex -153.124 -154.782 0 + vertex -153.315 -154.696 0 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -152.927 -154.853 -3 + vertex -153.124 -154.782 0 + vertex -153.124 -154.782 -3 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -152.927 -154.853 -3 + vertex -152.927 -154.853 0 + vertex -153.124 -154.782 0 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -152.726 -154.911 -3 + vertex -152.927 -154.853 0 + vertex -152.927 -154.853 -3 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -152.726 -154.911 -3 + vertex -152.726 -154.911 0 + vertex -152.927 -154.853 0 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -152.521 -154.954 -3 + vertex -152.726 -154.911 0 + vertex -152.726 -154.911 -3 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -152.521 -154.954 -3 + vertex -152.521 -154.954 0 + vertex -152.726 -154.911 0 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -152.314 -154.984 -3 + vertex -152.521 -154.954 0 + vertex -152.521 -154.954 -3 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -152.314 -154.984 -3 + vertex -152.314 -154.984 0 + vertex -152.521 -154.954 0 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -152.105 -154.998 -3 + vertex -152.314 -154.984 0 + vertex -152.314 -154.984 -3 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -152.105 -154.998 -3 + vertex -152.105 -154.998 0 + vertex -152.314 -154.984 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -152.002 -154.998 -3 + vertex -152.105 -154.998 0 + vertex -152.105 -154.998 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -152.002 -154.998 -3 + vertex -152.002 -154.998 0 + vertex -152.105 -154.998 0 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -152 -155 -3 + vertex -152.002 -154.998 0 + vertex -152.002 -154.998 -3 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -152 -155 -3 + vertex -152 -155 0 + vertex -152.002 -154.998 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 152 -155 -3 + vertex -152 -155 0 + vertex -152 -155 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 152 -155 -3 + vertex 152 -155 0 + vertex -152 -155 0 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 152.002 -154.998 -3 + vertex 152 -155 0 + vertex 152 -155 -3 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 152.002 -154.998 -3 + vertex 152.002 -154.998 0 + vertex 152 -155 0 + endloop + endfacet +endsolid OpenSCAD_Model diff --git a/resources/profiles/Creality/cr10mini.svg b/resources/profiles/Creality/cr10mini.svg new file mode 100644 index 000000000..177c6df49 --- /dev/null +++ b/resources/profiles/Creality/cr10mini.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/profiles/Creality/cr10mini_bed.stl b/resources/profiles/Creality/cr10mini_bed.stl new file mode 100644 index 000000000..5dc5d65fc --- /dev/null +++ b/resources/profiles/Creality/cr10mini_bed.stl @@ -0,0 +1,2774 @@ +solid OpenSCAD_Model + facet normal 0 0 -1 + outer loop + vertex 149.605 -117.498 -3 + vertex 149.502 -117.498 -3 + vertex 149.814 -117.484 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 149.814 -117.484 -3 + vertex 149.502 -117.498 -3 + vertex 150.021 -117.454 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.5 -114.5 -3 + vertex 149.502 -117.498 -3 + vertex 149.502 117.498 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 150.021 -117.454 -3 + vertex 149.502 -117.498 -3 + vertex 150.226 -117.411 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 150.226 -117.411 -3 + vertex 149.502 -117.498 -3 + vertex 150.427 -117.353 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 150.427 -117.353 -3 + vertex 149.502 -117.498 -3 + vertex 150.624 -117.282 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 150.624 -117.282 -3 + vertex 149.502 -117.498 -3 + vertex 150.815 -117.196 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 150.815 -117.196 -3 + vertex 149.502 -117.498 -3 + vertex 151 -117.098 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 151 -117.098 -3 + vertex 149.502 -117.498 -3 + vertex 151.178 -116.987 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 151.178 -116.987 -3 + vertex 149.502 -117.498 -3 + vertex 151.347 -116.864 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 151.347 -116.864 -3 + vertex 149.502 -117.498 -3 + vertex 151.507 -116.729 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 151.507 -116.729 -3 + vertex 149.502 -117.498 -3 + vertex 151.658 -116.584 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 151.658 -116.584 -3 + vertex 149.502 -117.498 -3 + vertex 151.798 -116.428 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 151.798 -116.428 -3 + vertex 149.502 -117.498 -3 + vertex 151.927 -116.263 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 151.927 -116.263 -3 + vertex 149.502 -117.498 -3 + vertex 152.044 -116.09 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.044 -116.09 -3 + vertex 149.502 -117.498 -3 + vertex 152.149 -115.908 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.149 -115.908 -3 + vertex 149.502 -117.498 -3 + vertex 152.241 -115.72 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.241 -115.72 -3 + vertex 149.502 -117.498 -3 + vertex 152.319 -115.526 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.319 -115.526 -3 + vertex 149.502 -117.498 -3 + vertex 152.384 -115.327 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.384 -115.327 -3 + vertex 149.502 -117.498 -3 + vertex 152.434 -115.124 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.434 -115.124 -3 + vertex 149.502 -117.498 -3 + vertex 152.471 -114.918 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.471 -114.918 -3 + vertex 149.502 -117.498 -3 + vertex 152.493 -114.709 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.493 -114.709 -3 + vertex 149.502 -117.498 -3 + vertex 152.5 -114.5 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.5 -114.5 -3 + vertex 149.502 117.498 -3 + vertex 152.5 114.5 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 149.502 117.498 -3 + vertex 152.471 114.918 -3 + vertex 152.493 114.709 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 152.384 115.327 -3 + vertex 152.434 115.124 -3 + vertex 149.502 117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.241 115.72 -3 + vertex 149.502 117.498 -3 + vertex 152.149 115.908 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 152.241 115.72 -3 + vertex 152.319 115.526 -3 + vertex 149.502 117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 149.502 117.498 -3 + vertex 151.507 116.729 -3 + vertex 151.658 116.584 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 151.927 116.263 -3 + vertex 149.502 117.498 -3 + vertex 151.798 116.428 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 151.927 116.263 -3 + vertex 152.044 116.09 -3 + vertex 149.502 117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 151.798 116.428 -3 + vertex 149.502 117.498 -3 + vertex 151.658 116.584 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 149.502 117.498 -3 + vertex 150.427 117.353 -3 + vertex 150.624 117.282 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 151.347 116.864 -3 + vertex 149.502 117.498 -3 + vertex 151.178 116.987 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 151.347 116.864 -3 + vertex 151.507 116.729 -3 + vertex 149.502 117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 151.178 116.987 -3 + vertex 149.502 117.498 -3 + vertex 151 117.098 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 151 117.098 -3 + vertex 149.502 117.498 -3 + vertex 150.815 117.196 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 150.815 117.196 -3 + vertex 149.502 117.498 -3 + vertex 150.624 117.282 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.149 115.908 -3 + vertex 149.502 117.498 -3 + vertex 152.044 116.09 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 150.226 117.411 -3 + vertex 149.502 117.498 -3 + vertex 150.021 117.454 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 150.226 117.411 -3 + vertex 150.427 117.353 -3 + vertex 149.502 117.498 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 152.319 115.526 -3 + vertex 152.384 115.327 -3 + vertex 149.502 117.498 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 149.814 117.484 -3 + vertex 150.021 117.454 -3 + vertex 149.502 117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 149.502 117.498 -3 + vertex 152.434 115.124 -3 + vertex 152.471 114.918 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 149.502 117.498 -3 + vertex 149.605 117.498 -3 + vertex 149.814 117.484 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.5 114.5 -3 + vertex 149.502 117.498 -3 + vertex 152.493 114.709 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 149.502 -117.498 -3 + vertex 149.5 117.5 -3 + vertex 149.502 117.498 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 149.502 -117.498 -3 + vertex 149.5 -117.5 -3 + vertex 149.5 117.5 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 149.5 117.5 -3 + vertex 149.5 -117.5 -3 + vertex -149.5 117.5 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 -117.498 -3 + vertex -152.5 114.5 -3 + vertex -149.502 117.498 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -149.814 117.484 -3 + vertex -149.605 117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -150.021 117.454 -3 + vertex -149.814 117.484 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -150.226 117.411 -3 + vertex -150.021 117.454 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -150.427 117.353 -3 + vertex -150.226 117.411 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -150.624 117.282 -3 + vertex -150.427 117.353 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -150.815 117.196 -3 + vertex -150.624 117.282 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -151 117.098 -3 + vertex -150.815 117.196 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -151.178 116.987 -3 + vertex -151 117.098 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -151.347 116.864 -3 + vertex -151.178 116.987 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -151.507 116.729 -3 + vertex -151.347 116.864 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -151.658 116.584 -3 + vertex -151.507 116.729 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -151.798 116.428 -3 + vertex -151.658 116.584 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -151.927 116.263 -3 + vertex -151.798 116.428 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -152.044 116.09 -3 + vertex -151.927 116.263 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -152.149 115.908 -3 + vertex -152.044 116.09 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -152.241 115.72 -3 + vertex -152.149 115.908 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -152.319 115.526 -3 + vertex -152.241 115.72 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -152.384 115.327 -3 + vertex -152.319 115.526 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -152.434 115.124 -3 + vertex -152.384 115.327 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -152.471 114.918 -3 + vertex -152.434 115.124 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -152.493 114.709 -3 + vertex -152.471 114.918 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -152.5 114.5 -3 + vertex -152.493 114.709 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 -117.498 -3 + vertex -152.5 -114.5 -3 + vertex -152.5 114.5 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -150.021 -117.454 -3 + vertex -149.502 -117.498 -3 + vertex -149.814 -117.484 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 -117.498 -3 + vertex -152.471 -114.918 -3 + vertex -152.493 -114.709 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.384 -115.327 -3 + vertex -152.434 -115.124 -3 + vertex -149.502 -117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.241 -115.72 -3 + vertex -149.502 -117.498 -3 + vertex -152.149 -115.908 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.241 -115.72 -3 + vertex -152.319 -115.526 -3 + vertex -149.502 -117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 -117.498 -3 + vertex -151.507 -116.729 -3 + vertex -151.658 -116.584 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -151.927 -116.263 -3 + vertex -149.502 -117.498 -3 + vertex -151.798 -116.428 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -151.927 -116.263 -3 + vertex -152.044 -116.09 -3 + vertex -149.502 -117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -151.798 -116.428 -3 + vertex -149.502 -117.498 -3 + vertex -151.658 -116.584 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 -117.498 -3 + vertex -150.427 -117.353 -3 + vertex -150.624 -117.282 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -151.347 -116.864 -3 + vertex -149.502 -117.498 -3 + vertex -151.178 -116.987 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -151.347 -116.864 -3 + vertex -151.507 -116.729 -3 + vertex -149.502 -117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -151.178 -116.987 -3 + vertex -149.502 -117.498 -3 + vertex -151 -117.098 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -151 -117.098 -3 + vertex -149.502 -117.498 -3 + vertex -150.815 -117.196 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -150.815 -117.196 -3 + vertex -149.502 -117.498 -3 + vertex -150.624 -117.282 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.149 -115.908 -3 + vertex -149.502 -117.498 -3 + vertex -152.044 -116.09 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -150.226 -117.411 -3 + vertex -149.502 -117.498 -3 + vertex -150.021 -117.454 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -150.226 -117.411 -3 + vertex -150.427 -117.353 -3 + vertex -149.502 -117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.319 -115.526 -3 + vertex -152.384 -115.327 -3 + vertex -149.502 -117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.434 -115.124 -3 + vertex -152.471 -114.918 -3 + vertex -149.502 -117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.605 -117.498 -3 + vertex -149.814 -117.484 -3 + vertex -149.502 -117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 -117.498 -3 + vertex -152.493 -114.709 -3 + vertex -152.5 -114.5 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex -149.5 117.5 -3 + vertex -149.5 -117.5 -3 + vertex -149.502 117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.5 117.5 -3 + vertex 149.5 -117.5 -3 + vertex -149.5 -117.5 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.5 -117.5 -3 + vertex -149.502 -117.498 -3 + vertex -149.502 117.498 -3 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 149.814 -117.484 0 + vertex 149.502 -117.498 0 + vertex 149.605 -117.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 150.021 -117.454 0 + vertex 149.502 -117.498 0 + vertex 149.814 -117.484 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 149.502 117.498 0 + vertex 149.502 -117.498 0 + vertex 152.5 -114.5 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 150.226 -117.411 0 + vertex 149.502 -117.498 0 + vertex 150.021 -117.454 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 150.427 -117.353 0 + vertex 149.502 -117.498 0 + vertex 150.226 -117.411 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 150.624 -117.282 0 + vertex 149.502 -117.498 0 + vertex 150.427 -117.353 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 150.815 -117.196 0 + vertex 149.502 -117.498 0 + vertex 150.624 -117.282 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 151 -117.098 0 + vertex 149.502 -117.498 0 + vertex 150.815 -117.196 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 151.178 -116.987 0 + vertex 149.502 -117.498 0 + vertex 151 -117.098 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 151.347 -116.864 0 + vertex 149.502 -117.498 0 + vertex 151.178 -116.987 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 151.507 -116.729 0 + vertex 149.502 -117.498 0 + vertex 151.347 -116.864 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 151.658 -116.584 0 + vertex 149.502 -117.498 0 + vertex 151.507 -116.729 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 151.798 -116.428 0 + vertex 149.502 -117.498 0 + vertex 151.658 -116.584 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 151.927 -116.263 0 + vertex 149.502 -117.498 0 + vertex 151.798 -116.428 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.044 -116.09 0 + vertex 149.502 -117.498 0 + vertex 151.927 -116.263 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.149 -115.908 0 + vertex 149.502 -117.498 0 + vertex 152.044 -116.09 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.241 -115.72 0 + vertex 149.502 -117.498 0 + vertex 152.149 -115.908 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.319 -115.526 0 + vertex 149.502 -117.498 0 + vertex 152.241 -115.72 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.384 -115.327 0 + vertex 149.502 -117.498 0 + vertex 152.319 -115.526 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.434 -115.124 0 + vertex 149.502 -117.498 0 + vertex 152.384 -115.327 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.471 -114.918 0 + vertex 149.502 -117.498 0 + vertex 152.434 -115.124 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.493 -114.709 0 + vertex 149.502 -117.498 0 + vertex 152.471 -114.918 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.5 -114.5 0 + vertex 149.502 -117.498 0 + vertex 152.493 -114.709 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.5 114.5 0 + vertex 149.502 117.498 0 + vertex 152.5 -114.5 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.493 114.709 0 + vertex 152.471 114.918 0 + vertex 149.502 117.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 149.502 117.498 0 + vertex 152.434 115.124 0 + vertex 152.384 115.327 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.149 115.908 0 + vertex 149.502 117.498 0 + vertex 152.241 115.72 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 149.502 117.498 0 + vertex 152.319 115.526 0 + vertex 152.241 115.72 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 151.658 116.584 0 + vertex 151.507 116.729 0 + vertex 149.502 117.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 151.798 116.428 0 + vertex 149.502 117.498 0 + vertex 151.927 116.263 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 149.502 117.498 0 + vertex 152.044 116.09 0 + vertex 151.927 116.263 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 151.658 116.584 0 + vertex 149.502 117.498 0 + vertex 151.798 116.428 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 150.624 117.282 0 + vertex 150.427 117.353 0 + vertex 149.502 117.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 151.178 116.987 0 + vertex 149.502 117.498 0 + vertex 151.347 116.864 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 149.502 117.498 0 + vertex 151.507 116.729 0 + vertex 151.347 116.864 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 151 117.098 0 + vertex 149.502 117.498 0 + vertex 151.178 116.987 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 150.815 117.196 0 + vertex 149.502 117.498 0 + vertex 151 117.098 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 150.624 117.282 0 + vertex 149.502 117.498 0 + vertex 150.815 117.196 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.044 116.09 0 + vertex 149.502 117.498 0 + vertex 152.149 115.908 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 150.021 117.454 0 + vertex 149.502 117.498 0 + vertex 150.226 117.411 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 149.502 117.498 0 + vertex 150.427 117.353 0 + vertex 150.226 117.411 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 149.502 117.498 0 + vertex 152.384 115.327 0 + vertex 152.319 115.526 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 149.502 117.498 0 + vertex 150.021 117.454 0 + vertex 149.814 117.484 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.471 114.918 0 + vertex 152.434 115.124 0 + vertex 149.502 117.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 149.814 117.484 0 + vertex 149.605 117.498 0 + vertex 149.502 117.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.493 114.709 0 + vertex 149.502 117.498 0 + vertex 152.5 114.5 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 149.502 117.498 0 + vertex 149.5 117.5 0 + vertex 149.502 -117.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 149.5 117.5 0 + vertex 149.5 -117.5 0 + vertex 149.502 -117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -149.5 117.5 0 + vertex 149.5 -117.5 0 + vertex 149.5 117.5 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -149.502 117.498 0 + vertex -152.5 114.5 0 + vertex -149.502 -117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -149.605 117.498 0 + vertex -149.814 117.484 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -149.814 117.484 0 + vertex -150.021 117.454 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -150.021 117.454 0 + vertex -150.226 117.411 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -150.226 117.411 0 + vertex -150.427 117.353 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -150.427 117.353 0 + vertex -150.624 117.282 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -150.624 117.282 0 + vertex -150.815 117.196 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -150.815 117.196 0 + vertex -151 117.098 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -151 117.098 0 + vertex -151.178 116.987 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -151.178 116.987 0 + vertex -151.347 116.864 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -151.347 116.864 0 + vertex -151.507 116.729 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -151.507 116.729 0 + vertex -151.658 116.584 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -151.658 116.584 0 + vertex -151.798 116.428 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -151.798 116.428 0 + vertex -151.927 116.263 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -151.927 116.263 0 + vertex -152.044 116.09 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.044 116.09 0 + vertex -152.149 115.908 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.149 115.908 0 + vertex -152.241 115.72 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.241 115.72 0 + vertex -152.319 115.526 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.319 115.526 0 + vertex -152.384 115.327 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.384 115.327 0 + vertex -152.434 115.124 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.434 115.124 0 + vertex -152.471 114.918 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.471 114.918 0 + vertex -152.493 114.709 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.493 114.709 0 + vertex -152.5 114.5 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.5 114.5 0 + vertex -152.5 -114.5 0 + vertex -149.502 -117.498 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -149.814 -117.484 0 + vertex -149.502 -117.498 0 + vertex -150.021 -117.454 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.493 -114.709 0 + vertex -152.471 -114.918 0 + vertex -149.502 -117.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -149.502 -117.498 0 + vertex -152.434 -115.124 0 + vertex -152.384 -115.327 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -152.149 -115.908 0 + vertex -149.502 -117.498 0 + vertex -152.241 -115.72 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -149.502 -117.498 0 + vertex -152.319 -115.526 0 + vertex -152.241 -115.72 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -151.658 -116.584 0 + vertex -151.507 -116.729 0 + vertex -149.502 -117.498 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -151.798 -116.428 0 + vertex -149.502 -117.498 0 + vertex -151.927 -116.263 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -149.502 -117.498 0 + vertex -152.044 -116.09 0 + vertex -151.927 -116.263 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -151.658 -116.584 0 + vertex -149.502 -117.498 0 + vertex -151.798 -116.428 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -150.624 -117.282 0 + vertex -150.427 -117.353 0 + vertex -149.502 -117.498 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -151.178 -116.987 0 + vertex -149.502 -117.498 0 + vertex -151.347 -116.864 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -149.502 -117.498 0 + vertex -151.507 -116.729 0 + vertex -151.347 -116.864 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -151 -117.098 0 + vertex -149.502 -117.498 0 + vertex -151.178 -116.987 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -150.815 -117.196 0 + vertex -149.502 -117.498 0 + vertex -151 -117.098 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -150.624 -117.282 0 + vertex -149.502 -117.498 0 + vertex -150.815 -117.196 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -152.044 -116.09 0 + vertex -149.502 -117.498 0 + vertex -152.149 -115.908 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -150.021 -117.454 0 + vertex -149.502 -117.498 0 + vertex -150.226 -117.411 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -149.502 -117.498 0 + vertex -150.427 -117.353 0 + vertex -150.226 -117.411 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -149.502 -117.498 0 + vertex -152.384 -115.327 0 + vertex -152.319 -115.526 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -149.502 -117.498 0 + vertex -152.471 -114.918 0 + vertex -152.434 -115.124 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -149.502 -117.498 0 + vertex -149.814 -117.484 0 + vertex -149.605 -117.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.5 -114.5 0 + vertex -152.493 -114.709 0 + vertex -149.502 -117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -149.502 117.498 0 + vertex -149.5 -117.5 0 + vertex -149.5 117.5 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -149.5 -117.5 0 + vertex 149.5 -117.5 0 + vertex -149.5 117.5 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -149.502 117.498 0 + vertex -149.502 -117.498 0 + vertex -149.5 -117.5 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 149.605 -117.498 -3 + vertex 149.502 -117.498 0 + vertex 149.502 -117.498 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 149.605 -117.498 -3 + vertex 149.605 -117.498 0 + vertex 149.502 -117.498 0 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 149.814 -117.484 -3 + vertex 149.605 -117.498 0 + vertex 149.605 -117.498 -3 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 149.814 -117.484 -3 + vertex 149.814 -117.484 0 + vertex 149.605 -117.498 0 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 150.021 -117.454 -3 + vertex 149.814 -117.484 0 + vertex 149.814 -117.484 -3 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 150.021 -117.454 -3 + vertex 150.021 -117.454 0 + vertex 149.814 -117.484 0 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 150.226 -117.411 -3 + vertex 150.021 -117.454 0 + vertex 150.021 -117.454 -3 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 150.226 -117.411 -3 + vertex 150.226 -117.411 0 + vertex 150.021 -117.454 0 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 150.427 -117.353 -3 + vertex 150.226 -117.411 0 + vertex 150.226 -117.411 -3 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 150.427 -117.353 -3 + vertex 150.427 -117.353 0 + vertex 150.226 -117.411 0 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 150.624 -117.282 -3 + vertex 150.427 -117.353 0 + vertex 150.427 -117.353 -3 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 150.624 -117.282 -3 + vertex 150.624 -117.282 0 + vertex 150.427 -117.353 0 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 150.815 -117.196 -3 + vertex 150.624 -117.282 0 + vertex 150.624 -117.282 -3 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 150.815 -117.196 -3 + vertex 150.815 -117.196 0 + vertex 150.624 -117.282 0 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 151 -117.098 -3 + vertex 150.815 -117.196 0 + vertex 150.815 -117.196 -3 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 151 -117.098 -3 + vertex 151 -117.098 0 + vertex 150.815 -117.196 0 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 151.178 -116.987 -3 + vertex 151 -117.098 0 + vertex 151 -117.098 -3 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 151.178 -116.987 -3 + vertex 151.178 -116.987 0 + vertex 151 -117.098 0 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 151.347 -116.864 -3 + vertex 151.178 -116.987 0 + vertex 151.178 -116.987 -3 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 151.347 -116.864 -3 + vertex 151.347 -116.864 0 + vertex 151.178 -116.987 0 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 151.507 -116.729 -3 + vertex 151.347 -116.864 0 + vertex 151.347 -116.864 -3 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 151.507 -116.729 -3 + vertex 151.507 -116.729 0 + vertex 151.347 -116.864 0 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 151.658 -116.584 -3 + vertex 151.507 -116.729 0 + vertex 151.507 -116.729 -3 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 151.658 -116.584 -3 + vertex 151.658 -116.584 0 + vertex 151.507 -116.729 0 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 151.798 -116.428 -3 + vertex 151.658 -116.584 0 + vertex 151.658 -116.584 -3 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 151.798 -116.428 -3 + vertex 151.798 -116.428 0 + vertex 151.658 -116.584 0 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 151.927 -116.263 -3 + vertex 151.798 -116.428 0 + vertex 151.798 -116.428 -3 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 151.927 -116.263 -3 + vertex 151.927 -116.263 0 + vertex 151.798 -116.428 0 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 152.044 -116.09 -3 + vertex 151.927 -116.263 0 + vertex 151.927 -116.263 -3 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 152.044 -116.09 -3 + vertex 152.044 -116.09 0 + vertex 151.927 -116.263 0 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 152.149 -115.908 -3 + vertex 152.044 -116.09 0 + vertex 152.044 -116.09 -3 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 152.149 -115.908 -3 + vertex 152.149 -115.908 0 + vertex 152.044 -116.09 0 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 152.241 -115.72 -3 + vertex 152.149 -115.908 0 + vertex 152.149 -115.908 -3 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 152.241 -115.72 -3 + vertex 152.241 -115.72 0 + vertex 152.149 -115.908 0 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 152.319 -115.526 -3 + vertex 152.241 -115.72 0 + vertex 152.241 -115.72 -3 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 152.319 -115.526 -3 + vertex 152.319 -115.526 0 + vertex 152.241 -115.72 0 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 152.384 -115.327 -3 + vertex 152.319 -115.526 0 + vertex 152.319 -115.526 -3 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 152.384 -115.327 -3 + vertex 152.384 -115.327 0 + vertex 152.319 -115.526 0 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 152.434 -115.124 -3 + vertex 152.384 -115.327 0 + vertex 152.384 -115.327 -3 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 152.434 -115.124 -3 + vertex 152.434 -115.124 0 + vertex 152.384 -115.327 0 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 152.471 -114.918 -3 + vertex 152.434 -115.124 0 + vertex 152.434 -115.124 -3 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 152.471 -114.918 -3 + vertex 152.471 -114.918 0 + vertex 152.434 -115.124 0 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 152.493 -114.709 -3 + vertex 152.471 -114.918 0 + vertex 152.471 -114.918 -3 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 152.493 -114.709 -3 + vertex 152.493 -114.709 0 + vertex 152.471 -114.918 0 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 152.5 -114.5 -3 + vertex 152.493 -114.709 0 + vertex 152.493 -114.709 -3 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 152.5 -114.5 -3 + vertex 152.5 -114.5 0 + vertex 152.493 -114.709 0 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 152.5 114.5 -3 + vertex 152.5 -114.5 0 + vertex 152.5 -114.5 -3 + endloop + endfacet + facet normal 1 0 -0 + outer loop + vertex 152.5 114.5 -3 + vertex 152.5 114.5 0 + vertex 152.5 -114.5 0 + endloop + endfacet + facet normal 0.99944 0.0334741 0 + outer loop + vertex 152.493 114.709 -3 + vertex 152.5 114.5 0 + vertex 152.5 114.5 -3 + endloop + endfacet + facet normal 0.99944 0.0334741 -0 + outer loop + vertex 152.493 114.709 -3 + vertex 152.493 114.709 0 + vertex 152.5 114.5 0 + endloop + endfacet + facet normal 0.994505 0.104685 0 + outer loop + vertex 152.471 114.918 -3 + vertex 152.493 114.709 0 + vertex 152.493 114.709 -3 + endloop + endfacet + facet normal 0.994505 0.104685 -0 + outer loop + vertex 152.471 114.918 -3 + vertex 152.471 114.918 0 + vertex 152.493 114.709 0 + endloop + endfacet + facet normal 0.98425 0.176783 0 + outer loop + vertex 152.434 115.124 -3 + vertex 152.471 114.918 0 + vertex 152.471 114.918 -3 + endloop + endfacet + facet normal 0.98425 0.176783 -0 + outer loop + vertex 152.434 115.124 -3 + vertex 152.434 115.124 0 + vertex 152.471 114.918 0 + endloop + endfacet + facet normal 0.970981 0.239158 0 + outer loop + vertex 152.384 115.327 -3 + vertex 152.434 115.124 0 + vertex 152.434 115.124 -3 + endloop + endfacet + facet normal 0.970981 0.239158 -0 + outer loop + vertex 152.384 115.327 -3 + vertex 152.384 115.327 0 + vertex 152.434 115.124 0 + endloop + endfacet + facet normal 0.950577 0.31049 0 + outer loop + vertex 152.319 115.526 -3 + vertex 152.384 115.327 0 + vertex 152.384 115.327 -3 + endloop + endfacet + facet normal 0.950577 0.31049 -0 + outer loop + vertex 152.319 115.526 -3 + vertex 152.319 115.526 0 + vertex 152.384 115.327 0 + endloop + endfacet + facet normal 0.927816 0.373039 0 + outer loop + vertex 152.241 115.72 -3 + vertex 152.319 115.526 0 + vertex 152.319 115.526 -3 + endloop + endfacet + facet normal 0.927816 0.373039 -0 + outer loop + vertex 152.241 115.72 -3 + vertex 152.241 115.72 0 + vertex 152.319 115.526 0 + endloop + endfacet + facet normal 0.898217 0.439553 0 + outer loop + vertex 152.149 115.908 -3 + vertex 152.241 115.72 0 + vertex 152.241 115.72 -3 + endloop + endfacet + facet normal 0.898217 0.439553 -0 + outer loop + vertex 152.149 115.908 -3 + vertex 152.149 115.908 0 + vertex 152.241 115.72 0 + endloop + endfacet + facet normal 0.866186 0.499722 0 + outer loop + vertex 152.044 116.09 -3 + vertex 152.149 115.908 0 + vertex 152.149 115.908 -3 + endloop + endfacet + facet normal 0.866186 0.499722 -0 + outer loop + vertex 152.044 116.09 -3 + vertex 152.044 116.09 0 + vertex 152.149 115.908 0 + endloop + endfacet + facet normal 0.828349 0.560213 0 + outer loop + vertex 151.927 116.263 -3 + vertex 152.044 116.09 0 + vertex 152.044 116.09 -3 + endloop + endfacet + facet normal 0.828349 0.560213 -0 + outer loop + vertex 151.927 116.263 -3 + vertex 151.927 116.263 0 + vertex 152.044 116.09 0 + endloop + endfacet + facet normal 0.787807 0.615922 0 + outer loop + vertex 151.798 116.428 -3 + vertex 151.927 116.263 0 + vertex 151.927 116.263 -3 + endloop + endfacet + facet normal 0.787807 0.615922 -0 + outer loop + vertex 151.798 116.428 -3 + vertex 151.798 116.428 0 + vertex 151.927 116.263 0 + endloop + endfacet + facet normal 0.744242 0.66791 0 + outer loop + vertex 151.658 116.584 -3 + vertex 151.798 116.428 0 + vertex 151.798 116.428 -3 + endloop + endfacet + facet normal 0.744242 0.66791 -0 + outer loop + vertex 151.658 116.584 -3 + vertex 151.658 116.584 0 + vertex 151.798 116.428 0 + endloop + endfacet + facet normal 0.692631 0.721292 0 + outer loop + vertex 151.507 116.729 -3 + vertex 151.658 116.584 0 + vertex 151.658 116.584 -3 + endloop + endfacet + facet normal 0.692631 0.721292 -0 + outer loop + vertex 151.507 116.729 -3 + vertex 151.507 116.729 0 + vertex 151.658 116.584 0 + endloop + endfacet + facet normal 0.644871 0.764291 0 + outer loop + vertex 151.347 116.864 -3 + vertex 151.507 116.729 0 + vertex 151.507 116.729 -3 + endloop + endfacet + facet normal 0.644871 0.764291 -0 + outer loop + vertex 151.347 116.864 -3 + vertex 151.347 116.864 0 + vertex 151.507 116.729 0 + endloop + endfacet + facet normal 0.588456 0.808529 0 + outer loop + vertex 151.178 116.987 -3 + vertex 151.347 116.864 0 + vertex 151.347 116.864 -3 + endloop + endfacet + facet normal 0.588456 0.808529 -0 + outer loop + vertex 151.178 116.987 -3 + vertex 151.178 116.987 0 + vertex 151.347 116.864 0 + endloop + endfacet + facet normal 0.529142 0.848533 0 + outer loop + vertex 151 117.098 -3 + vertex 151.178 116.987 0 + vertex 151.178 116.987 -3 + endloop + endfacet + facet normal 0.529142 0.848533 -0 + outer loop + vertex 151 117.098 -3 + vertex 151 117.098 0 + vertex 151.178 116.987 0 + endloop + endfacet + facet normal 0.468107 0.883672 0 + outer loop + vertex 150.815 117.196 -3 + vertex 151 117.098 0 + vertex 151 117.098 -3 + endloop + endfacet + facet normal 0.468107 0.883672 -0 + outer loop + vertex 150.815 117.196 -3 + vertex 150.815 117.196 0 + vertex 151 117.098 0 + endloop + endfacet + facet normal 0.410563 0.911832 0 + outer loop + vertex 150.624 117.282 -3 + vertex 150.815 117.196 0 + vertex 150.815 117.196 -3 + endloop + endfacet + facet normal 0.410563 0.911832 -0 + outer loop + vertex 150.624 117.282 -3 + vertex 150.624 117.282 0 + vertex 150.815 117.196 0 + endloop + endfacet + facet normal 0.339058 0.940766 0 + outer loop + vertex 150.427 117.353 -3 + vertex 150.624 117.282 0 + vertex 150.624 117.282 -3 + endloop + endfacet + facet normal 0.339058 0.940766 -0 + outer loop + vertex 150.427 117.353 -3 + vertex 150.427 117.353 0 + vertex 150.624 117.282 0 + endloop + endfacet + facet normal 0.277246 0.960799 0 + outer loop + vertex 150.226 117.411 -3 + vertex 150.427 117.353 0 + vertex 150.427 117.353 -3 + endloop + endfacet + facet normal 0.277246 0.960799 -0 + outer loop + vertex 150.226 117.411 -3 + vertex 150.226 117.411 0 + vertex 150.427 117.353 0 + endloop + endfacet + facet normal 0.205289 0.978701 0 + outer loop + vertex 150.021 117.454 -3 + vertex 150.226 117.411 0 + vertex 150.226 117.411 -3 + endloop + endfacet + facet normal 0.205289 0.978701 -0 + outer loop + vertex 150.021 117.454 -3 + vertex 150.021 117.454 0 + vertex 150.226 117.411 0 + endloop + endfacet + facet normal 0.143429 0.989661 0 + outer loop + vertex 149.814 117.484 -3 + vertex 150.021 117.454 0 + vertex 150.021 117.454 -3 + endloop + endfacet + facet normal 0.143429 0.989661 -0 + outer loop + vertex 149.814 117.484 -3 + vertex 149.814 117.484 0 + vertex 150.021 117.454 0 + endloop + endfacet + facet normal 0.0668359 0.997764 0 + outer loop + vertex 149.605 117.498 -3 + vertex 149.814 117.484 0 + vertex 149.814 117.484 -3 + endloop + endfacet + facet normal 0.0668359 0.997764 -0 + outer loop + vertex 149.605 117.498 -3 + vertex 149.605 117.498 0 + vertex 149.814 117.484 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 149.502 117.498 -3 + vertex 149.605 117.498 0 + vertex 149.605 117.498 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 149.502 117.498 -3 + vertex 149.502 117.498 0 + vertex 149.605 117.498 0 + endloop + endfacet + facet normal 0.707107 0.707107 0 + outer loop + vertex 149.5 117.5 -3 + vertex 149.502 117.498 0 + vertex 149.502 117.498 -3 + endloop + endfacet + facet normal 0.707107 0.707107 -0 + outer loop + vertex 149.5 117.5 -3 + vertex 149.5 117.5 0 + vertex 149.502 117.498 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -149.5 117.5 -3 + vertex 149.5 117.5 0 + vertex 149.5 117.5 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -149.5 117.5 -3 + vertex -149.5 117.5 0 + vertex 149.5 117.5 0 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -149.502 117.498 -3 + vertex -149.5 117.5 0 + vertex -149.5 117.5 -3 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -149.502 117.498 -3 + vertex -149.502 117.498 0 + vertex -149.5 117.5 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -149.605 117.498 -3 + vertex -149.502 117.498 0 + vertex -149.502 117.498 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -149.605 117.498 -3 + vertex -149.605 117.498 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -149.814 117.484 -3 + vertex -149.605 117.498 0 + vertex -149.605 117.498 -3 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -149.814 117.484 -3 + vertex -149.814 117.484 0 + vertex -149.605 117.498 0 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -150.021 117.454 -3 + vertex -149.814 117.484 0 + vertex -149.814 117.484 -3 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -150.021 117.454 -3 + vertex -150.021 117.454 0 + vertex -149.814 117.484 0 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -150.226 117.411 -3 + vertex -150.021 117.454 0 + vertex -150.021 117.454 -3 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -150.226 117.411 -3 + vertex -150.226 117.411 0 + vertex -150.021 117.454 0 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -150.427 117.353 -3 + vertex -150.226 117.411 0 + vertex -150.226 117.411 -3 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -150.427 117.353 -3 + vertex -150.427 117.353 0 + vertex -150.226 117.411 0 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -150.624 117.282 -3 + vertex -150.427 117.353 0 + vertex -150.427 117.353 -3 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -150.624 117.282 -3 + vertex -150.624 117.282 0 + vertex -150.427 117.353 0 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -150.815 117.196 -3 + vertex -150.624 117.282 0 + vertex -150.624 117.282 -3 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -150.815 117.196 -3 + vertex -150.815 117.196 0 + vertex -150.624 117.282 0 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -151 117.098 -3 + vertex -150.815 117.196 0 + vertex -150.815 117.196 -3 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -151 117.098 -3 + vertex -151 117.098 0 + vertex -150.815 117.196 0 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -151.178 116.987 -3 + vertex -151 117.098 0 + vertex -151 117.098 -3 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -151.178 116.987 -3 + vertex -151.178 116.987 0 + vertex -151 117.098 0 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -151.347 116.864 -3 + vertex -151.178 116.987 0 + vertex -151.178 116.987 -3 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -151.347 116.864 -3 + vertex -151.347 116.864 0 + vertex -151.178 116.987 0 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -151.507 116.729 -3 + vertex -151.347 116.864 0 + vertex -151.347 116.864 -3 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -151.507 116.729 -3 + vertex -151.507 116.729 0 + vertex -151.347 116.864 0 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -151.658 116.584 -3 + vertex -151.507 116.729 0 + vertex -151.507 116.729 -3 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -151.658 116.584 -3 + vertex -151.658 116.584 0 + vertex -151.507 116.729 0 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -151.798 116.428 -3 + vertex -151.658 116.584 0 + vertex -151.658 116.584 -3 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -151.798 116.428 -3 + vertex -151.798 116.428 0 + vertex -151.658 116.584 0 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -151.927 116.263 -3 + vertex -151.798 116.428 0 + vertex -151.798 116.428 -3 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -151.927 116.263 -3 + vertex -151.927 116.263 0 + vertex -151.798 116.428 0 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -152.044 116.09 -3 + vertex -151.927 116.263 0 + vertex -151.927 116.263 -3 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -152.044 116.09 -3 + vertex -152.044 116.09 0 + vertex -151.927 116.263 0 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -152.149 115.908 -3 + vertex -152.044 116.09 0 + vertex -152.044 116.09 -3 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -152.149 115.908 -3 + vertex -152.149 115.908 0 + vertex -152.044 116.09 0 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -152.241 115.72 -3 + vertex -152.149 115.908 0 + vertex -152.149 115.908 -3 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -152.241 115.72 -3 + vertex -152.241 115.72 0 + vertex -152.149 115.908 0 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -152.319 115.526 -3 + vertex -152.241 115.72 0 + vertex -152.241 115.72 -3 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -152.319 115.526 -3 + vertex -152.319 115.526 0 + vertex -152.241 115.72 0 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -152.384 115.327 -3 + vertex -152.319 115.526 0 + vertex -152.319 115.526 -3 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -152.384 115.327 -3 + vertex -152.384 115.327 0 + vertex -152.319 115.526 0 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -152.434 115.124 -3 + vertex -152.384 115.327 0 + vertex -152.384 115.327 -3 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -152.434 115.124 -3 + vertex -152.434 115.124 0 + vertex -152.384 115.327 0 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -152.471 114.918 -3 + vertex -152.434 115.124 0 + vertex -152.434 115.124 -3 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -152.471 114.918 -3 + vertex -152.471 114.918 0 + vertex -152.434 115.124 0 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -152.493 114.709 -3 + vertex -152.471 114.918 0 + vertex -152.471 114.918 -3 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -152.493 114.709 -3 + vertex -152.493 114.709 0 + vertex -152.471 114.918 0 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -152.5 114.5 -3 + vertex -152.493 114.709 0 + vertex -152.493 114.709 -3 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -152.5 114.5 -3 + vertex -152.5 114.5 0 + vertex -152.493 114.709 0 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -152.5 -114.5 -3 + vertex -152.5 114.5 0 + vertex -152.5 114.5 -3 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -152.5 -114.5 -3 + vertex -152.5 -114.5 0 + vertex -152.5 114.5 0 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -152.493 -114.709 -3 + vertex -152.5 -114.5 0 + vertex -152.5 -114.5 -3 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -152.493 -114.709 -3 + vertex -152.493 -114.709 0 + vertex -152.5 -114.5 0 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -152.471 -114.918 -3 + vertex -152.493 -114.709 0 + vertex -152.493 -114.709 -3 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -152.471 -114.918 -3 + vertex -152.471 -114.918 0 + vertex -152.493 -114.709 0 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -152.434 -115.124 -3 + vertex -152.471 -114.918 0 + vertex -152.471 -114.918 -3 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -152.434 -115.124 -3 + vertex -152.434 -115.124 0 + vertex -152.471 -114.918 0 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -152.384 -115.327 -3 + vertex -152.434 -115.124 0 + vertex -152.434 -115.124 -3 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -152.384 -115.327 -3 + vertex -152.384 -115.327 0 + vertex -152.434 -115.124 0 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -152.319 -115.526 -3 + vertex -152.384 -115.327 0 + vertex -152.384 -115.327 -3 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -152.319 -115.526 -3 + vertex -152.319 -115.526 0 + vertex -152.384 -115.327 0 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -152.241 -115.72 -3 + vertex -152.319 -115.526 0 + vertex -152.319 -115.526 -3 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -152.241 -115.72 -3 + vertex -152.241 -115.72 0 + vertex -152.319 -115.526 0 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -152.149 -115.908 -3 + vertex -152.241 -115.72 0 + vertex -152.241 -115.72 -3 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -152.149 -115.908 -3 + vertex -152.149 -115.908 0 + vertex -152.241 -115.72 0 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -152.044 -116.09 -3 + vertex -152.149 -115.908 0 + vertex -152.149 -115.908 -3 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -152.044 -116.09 -3 + vertex -152.044 -116.09 0 + vertex -152.149 -115.908 0 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -151.927 -116.263 -3 + vertex -152.044 -116.09 0 + vertex -152.044 -116.09 -3 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -151.927 -116.263 -3 + vertex -151.927 -116.263 0 + vertex -152.044 -116.09 0 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -151.798 -116.428 -3 + vertex -151.927 -116.263 0 + vertex -151.927 -116.263 -3 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -151.798 -116.428 -3 + vertex -151.798 -116.428 0 + vertex -151.927 -116.263 0 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -151.658 -116.584 -3 + vertex -151.798 -116.428 0 + vertex -151.798 -116.428 -3 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -151.658 -116.584 -3 + vertex -151.658 -116.584 0 + vertex -151.798 -116.428 0 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -151.507 -116.729 -3 + vertex -151.658 -116.584 0 + vertex -151.658 -116.584 -3 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -151.507 -116.729 -3 + vertex -151.507 -116.729 0 + vertex -151.658 -116.584 0 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -151.347 -116.864 -3 + vertex -151.507 -116.729 0 + vertex -151.507 -116.729 -3 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -151.347 -116.864 -3 + vertex -151.347 -116.864 0 + vertex -151.507 -116.729 0 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -151.178 -116.987 -3 + vertex -151.347 -116.864 0 + vertex -151.347 -116.864 -3 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -151.178 -116.987 -3 + vertex -151.178 -116.987 0 + vertex -151.347 -116.864 0 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -151 -117.098 -3 + vertex -151.178 -116.987 0 + vertex -151.178 -116.987 -3 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -151 -117.098 -3 + vertex -151 -117.098 0 + vertex -151.178 -116.987 0 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -150.815 -117.196 -3 + vertex -151 -117.098 0 + vertex -151 -117.098 -3 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -150.815 -117.196 -3 + vertex -150.815 -117.196 0 + vertex -151 -117.098 0 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -150.624 -117.282 -3 + vertex -150.815 -117.196 0 + vertex -150.815 -117.196 -3 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -150.624 -117.282 -3 + vertex -150.624 -117.282 0 + vertex -150.815 -117.196 0 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -150.427 -117.353 -3 + vertex -150.624 -117.282 0 + vertex -150.624 -117.282 -3 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -150.427 -117.353 -3 + vertex -150.427 -117.353 0 + vertex -150.624 -117.282 0 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -150.226 -117.411 -3 + vertex -150.427 -117.353 0 + vertex -150.427 -117.353 -3 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -150.226 -117.411 -3 + vertex -150.226 -117.411 0 + vertex -150.427 -117.353 0 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -150.021 -117.454 -3 + vertex -150.226 -117.411 0 + vertex -150.226 -117.411 -3 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -150.021 -117.454 -3 + vertex -150.021 -117.454 0 + vertex -150.226 -117.411 0 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -149.814 -117.484 -3 + vertex -150.021 -117.454 0 + vertex -150.021 -117.454 -3 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -149.814 -117.484 -3 + vertex -149.814 -117.484 0 + vertex -150.021 -117.454 0 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -149.605 -117.498 -3 + vertex -149.814 -117.484 0 + vertex -149.814 -117.484 -3 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -149.605 -117.498 -3 + vertex -149.605 -117.498 0 + vertex -149.814 -117.484 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -149.502 -117.498 -3 + vertex -149.605 -117.498 0 + vertex -149.605 -117.498 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -149.502 -117.498 -3 + vertex -149.502 -117.498 0 + vertex -149.605 -117.498 0 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -149.5 -117.5 -3 + vertex -149.502 -117.498 0 + vertex -149.502 -117.498 -3 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -149.5 -117.5 -3 + vertex -149.5 -117.5 0 + vertex -149.502 -117.498 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 149.5 -117.5 -3 + vertex -149.5 -117.5 0 + vertex -149.5 -117.5 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 149.5 -117.5 -3 + vertex 149.5 -117.5 0 + vertex -149.5 -117.5 0 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 149.502 -117.498 -3 + vertex 149.5 -117.5 0 + vertex 149.5 -117.5 -3 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 149.502 -117.498 -3 + vertex 149.502 -117.498 0 + vertex 149.5 -117.5 0 + endloop + endfacet +endsolid OpenSCAD_Model diff --git a/resources/profiles/Creality/cr10s4.svg b/resources/profiles/Creality/cr10s4.svg new file mode 100644 index 000000000..c3719456d --- /dev/null +++ b/resources/profiles/Creality/cr10s4.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/profiles/Creality/cr10s4_bed.stl b/resources/profiles/Creality/cr10s4_bed.stl new file mode 100644 index 000000000..c34ac4e5e --- /dev/null +++ b/resources/profiles/Creality/cr10s4_bed.stl @@ -0,0 +1,2774 @@ +solid OpenSCAD_Model + facet normal 0 0 -1 + outer loop + vertex 202.105 -204.998 -3 + vertex 202.002 -204.998 -3 + vertex 202.314 -204.984 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 202.314 -204.984 -3 + vertex 202.002 -204.998 -3 + vertex 202.521 -204.954 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 205 -202 -3 + vertex 202.002 -204.998 -3 + vertex 202.002 204.998 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 202.521 -204.954 -3 + vertex 202.002 -204.998 -3 + vertex 202.726 -204.911 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 202.726 -204.911 -3 + vertex 202.002 -204.998 -3 + vertex 202.927 -204.853 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 202.927 -204.853 -3 + vertex 202.002 -204.998 -3 + vertex 203.124 -204.782 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 203.124 -204.782 -3 + vertex 202.002 -204.998 -3 + vertex 203.315 -204.696 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 203.315 -204.696 -3 + vertex 202.002 -204.998 -3 + vertex 203.5 -204.598 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 203.5 -204.598 -3 + vertex 202.002 -204.998 -3 + vertex 203.678 -204.487 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 203.678 -204.487 -3 + vertex 202.002 -204.998 -3 + vertex 203.847 -204.364 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 203.847 -204.364 -3 + vertex 202.002 -204.998 -3 + vertex 204.007 -204.229 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 204.007 -204.229 -3 + vertex 202.002 -204.998 -3 + vertex 204.158 -204.084 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 204.158 -204.084 -3 + vertex 202.002 -204.998 -3 + vertex 204.298 -203.928 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 204.298 -203.928 -3 + vertex 202.002 -204.998 -3 + vertex 204.427 -203.763 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 204.427 -203.763 -3 + vertex 202.002 -204.998 -3 + vertex 204.544 -203.59 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 204.544 -203.59 -3 + vertex 202.002 -204.998 -3 + vertex 204.649 -203.408 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 204.649 -203.408 -3 + vertex 202.002 -204.998 -3 + vertex 204.741 -203.22 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 204.741 -203.22 -3 + vertex 202.002 -204.998 -3 + vertex 204.819 -203.026 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 204.819 -203.026 -3 + vertex 202.002 -204.998 -3 + vertex 204.884 -202.827 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 204.884 -202.827 -3 + vertex 202.002 -204.998 -3 + vertex 204.934 -202.624 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 204.934 -202.624 -3 + vertex 202.002 -204.998 -3 + vertex 204.971 -202.418 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 204.971 -202.418 -3 + vertex 202.002 -204.998 -3 + vertex 204.993 -202.209 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 204.993 -202.209 -3 + vertex 202.002 -204.998 -3 + vertex 205 -202 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 205 -202 -3 + vertex 202.002 204.998 -3 + vertex 205 202 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 202.002 204.998 -3 + vertex 204.971 202.418 -3 + vertex 204.993 202.209 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 204.884 202.827 -3 + vertex 204.934 202.624 -3 + vertex 202.002 204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 204.741 203.22 -3 + vertex 202.002 204.998 -3 + vertex 204.649 203.408 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 204.741 203.22 -3 + vertex 204.819 203.026 -3 + vertex 202.002 204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 202.002 204.998 -3 + vertex 204.007 204.229 -3 + vertex 204.158 204.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 204.427 203.763 -3 + vertex 202.002 204.998 -3 + vertex 204.298 203.928 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 204.427 203.763 -3 + vertex 204.544 203.59 -3 + vertex 202.002 204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 204.298 203.928 -3 + vertex 202.002 204.998 -3 + vertex 204.158 204.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 202.002 204.998 -3 + vertex 202.927 204.853 -3 + vertex 203.124 204.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 203.847 204.364 -3 + vertex 202.002 204.998 -3 + vertex 203.678 204.487 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 203.847 204.364 -3 + vertex 204.007 204.229 -3 + vertex 202.002 204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 203.678 204.487 -3 + vertex 202.002 204.998 -3 + vertex 203.5 204.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 203.5 204.598 -3 + vertex 202.002 204.998 -3 + vertex 203.315 204.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 203.315 204.696 -3 + vertex 202.002 204.998 -3 + vertex 203.124 204.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 204.649 203.408 -3 + vertex 202.002 204.998 -3 + vertex 204.544 203.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 202.726 204.911 -3 + vertex 202.002 204.998 -3 + vertex 202.521 204.954 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 202.726 204.911 -3 + vertex 202.927 204.853 -3 + vertex 202.002 204.998 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 204.819 203.026 -3 + vertex 204.884 202.827 -3 + vertex 202.002 204.998 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 202.314 204.984 -3 + vertex 202.521 204.954 -3 + vertex 202.002 204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 202.002 204.998 -3 + vertex 204.934 202.624 -3 + vertex 204.971 202.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 202.002 204.998 -3 + vertex 202.105 204.998 -3 + vertex 202.314 204.984 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 205 202 -3 + vertex 202.002 204.998 -3 + vertex 204.993 202.209 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex -202 205 -3 + vertex 202 205 -3 + vertex -202.002 204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex 202 205 -3 + vertex 202.002 204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 202.002 -204.998 -3 + vertex -202.002 204.998 -3 + vertex 202.002 204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -205 -202 -3 + vertex -205 202 -3 + vertex -202.002 -204.998 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -202.314 204.984 -3 + vertex -202.105 204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -202.521 204.954 -3 + vertex -202.314 204.984 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -202.726 204.911 -3 + vertex -202.521 204.954 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -202.927 204.853 -3 + vertex -202.726 204.911 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -203.124 204.782 -3 + vertex -202.927 204.853 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -203.315 204.696 -3 + vertex -203.124 204.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -203.5 204.598 -3 + vertex -203.315 204.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -203.678 204.487 -3 + vertex -203.5 204.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -203.847 204.364 -3 + vertex -203.678 204.487 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -204.007 204.229 -3 + vertex -203.847 204.364 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -204.158 204.084 -3 + vertex -204.007 204.229 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -204.298 203.928 -3 + vertex -204.158 204.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -204.427 203.763 -3 + vertex -204.298 203.928 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -204.544 203.59 -3 + vertex -204.427 203.763 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -204.649 203.408 -3 + vertex -204.544 203.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -204.741 203.22 -3 + vertex -204.649 203.408 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -204.819 203.026 -3 + vertex -204.741 203.22 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -204.884 202.827 -3 + vertex -204.819 203.026 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -204.934 202.624 -3 + vertex -204.884 202.827 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -204.971 202.418 -3 + vertex -204.934 202.624 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -204.993 202.209 -3 + vertex -204.971 202.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -205 202 -3 + vertex -204.993 202.209 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 -204.998 -3 + vertex -205 202 -3 + vertex -202.002 204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 202.002 -204.998 -3 + vertex -202.002 -204.998 -3 + vertex -202.002 204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 -204.998 -3 + vertex -204.971 -202.418 -3 + vertex -204.993 -202.209 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -204.884 -202.827 -3 + vertex -204.934 -202.624 -3 + vertex -202.002 -204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -204.741 -203.22 -3 + vertex -202.002 -204.998 -3 + vertex -204.649 -203.408 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -204.741 -203.22 -3 + vertex -204.819 -203.026 -3 + vertex -202.002 -204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 -204.998 -3 + vertex -204.007 -204.229 -3 + vertex -204.158 -204.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -204.427 -203.763 -3 + vertex -202.002 -204.998 -3 + vertex -204.298 -203.928 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -204.427 -203.763 -3 + vertex -204.544 -203.59 -3 + vertex -202.002 -204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -204.298 -203.928 -3 + vertex -202.002 -204.998 -3 + vertex -204.158 -204.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 -204.998 -3 + vertex -202.927 -204.853 -3 + vertex -203.124 -204.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -203.847 -204.364 -3 + vertex -202.002 -204.998 -3 + vertex -203.678 -204.487 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -203.847 -204.364 -3 + vertex -204.007 -204.229 -3 + vertex -202.002 -204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -203.678 -204.487 -3 + vertex -202.002 -204.998 -3 + vertex -203.5 -204.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -203.5 -204.598 -3 + vertex -202.002 -204.998 -3 + vertex -203.315 -204.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -203.315 -204.696 -3 + vertex -202.002 -204.998 -3 + vertex -203.124 -204.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -204.649 -203.408 -3 + vertex -202.002 -204.998 -3 + vertex -204.544 -203.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.726 -204.911 -3 + vertex -202.002 -204.998 -3 + vertex -202.521 -204.954 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.726 -204.911 -3 + vertex -202.927 -204.853 -3 + vertex -202.002 -204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -204.819 -203.026 -3 + vertex -204.884 -202.827 -3 + vertex -202.002 -204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.314 -204.984 -3 + vertex -202.521 -204.954 -3 + vertex -202.002 -204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 -204.998 -3 + vertex -204.934 -202.624 -3 + vertex -204.971 -202.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 -204.998 -3 + vertex -202.105 -204.998 -3 + vertex -202.314 -204.984 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 202.002 -204.998 -3 + vertex 202 -205 -3 + vertex -202.002 -204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 -204.998 -3 + vertex 202 -205 -3 + vertex -202 -205 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -205 -202 -3 + vertex -202.002 -204.998 -3 + vertex -204.993 -202.209 -3 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.314 -204.984 0 + vertex 202.002 -204.998 0 + vertex 202.105 -204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.521 -204.954 0 + vertex 202.002 -204.998 0 + vertex 202.314 -204.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.002 204.998 0 + vertex 202.002 -204.998 0 + vertex 205 -202 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.726 -204.911 0 + vertex 202.002 -204.998 0 + vertex 202.521 -204.954 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.927 -204.853 0 + vertex 202.002 -204.998 0 + vertex 202.726 -204.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 203.124 -204.782 0 + vertex 202.002 -204.998 0 + vertex 202.927 -204.853 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 203.315 -204.696 0 + vertex 202.002 -204.998 0 + vertex 203.124 -204.782 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 203.5 -204.598 0 + vertex 202.002 -204.998 0 + vertex 203.315 -204.696 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 203.678 -204.487 0 + vertex 202.002 -204.998 0 + vertex 203.5 -204.598 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 203.847 -204.364 0 + vertex 202.002 -204.998 0 + vertex 203.678 -204.487 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.007 -204.229 0 + vertex 202.002 -204.998 0 + vertex 203.847 -204.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.158 -204.084 0 + vertex 202.002 -204.998 0 + vertex 204.007 -204.229 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.298 -203.928 0 + vertex 202.002 -204.998 0 + vertex 204.158 -204.084 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.427 -203.763 0 + vertex 202.002 -204.998 0 + vertex 204.298 -203.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.544 -203.59 0 + vertex 202.002 -204.998 0 + vertex 204.427 -203.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.649 -203.408 0 + vertex 202.002 -204.998 0 + vertex 204.544 -203.59 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.741 -203.22 0 + vertex 202.002 -204.998 0 + vertex 204.649 -203.408 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.819 -203.026 0 + vertex 202.002 -204.998 0 + vertex 204.741 -203.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.884 -202.827 0 + vertex 202.002 -204.998 0 + vertex 204.819 -203.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.934 -202.624 0 + vertex 202.002 -204.998 0 + vertex 204.884 -202.827 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.971 -202.418 0 + vertex 202.002 -204.998 0 + vertex 204.934 -202.624 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.993 -202.209 0 + vertex 202.002 -204.998 0 + vertex 204.971 -202.418 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 205 -202 0 + vertex 202.002 -204.998 0 + vertex 204.993 -202.209 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 205 202 0 + vertex 202.002 204.998 0 + vertex 205 -202 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.993 202.209 0 + vertex 204.971 202.418 0 + vertex 202.002 204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.002 204.998 0 + vertex 204.934 202.624 0 + vertex 204.884 202.827 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.649 203.408 0 + vertex 202.002 204.998 0 + vertex 204.741 203.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.002 204.998 0 + vertex 204.819 203.026 0 + vertex 204.741 203.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.158 204.084 0 + vertex 204.007 204.229 0 + vertex 202.002 204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.298 203.928 0 + vertex 202.002 204.998 0 + vertex 204.427 203.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.002 204.998 0 + vertex 204.544 203.59 0 + vertex 204.427 203.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.158 204.084 0 + vertex 202.002 204.998 0 + vertex 204.298 203.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 203.124 204.782 0 + vertex 202.927 204.853 0 + vertex 202.002 204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 203.678 204.487 0 + vertex 202.002 204.998 0 + vertex 203.847 204.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.002 204.998 0 + vertex 204.007 204.229 0 + vertex 203.847 204.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 203.5 204.598 0 + vertex 202.002 204.998 0 + vertex 203.678 204.487 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 203.315 204.696 0 + vertex 202.002 204.998 0 + vertex 203.5 204.598 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 203.124 204.782 0 + vertex 202.002 204.998 0 + vertex 203.315 204.696 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.544 203.59 0 + vertex 202.002 204.998 0 + vertex 204.649 203.408 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.521 204.954 0 + vertex 202.002 204.998 0 + vertex 202.726 204.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.002 204.998 0 + vertex 202.927 204.853 0 + vertex 202.726 204.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.002 204.998 0 + vertex 204.884 202.827 0 + vertex 204.819 203.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.002 204.998 0 + vertex 202.521 204.954 0 + vertex 202.314 204.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.971 202.418 0 + vertex 204.934 202.624 0 + vertex 202.002 204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.314 204.984 0 + vertex 202.105 204.998 0 + vertex 202.002 204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.993 202.209 0 + vertex 202.002 204.998 0 + vertex 205 202 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -202.002 204.998 0 + vertex 202 205 0 + vertex -202 205 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.002 204.998 0 + vertex 202 205 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.002 204.998 0 + vertex -202.002 204.998 0 + vertex 202.002 -204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -202.002 -204.998 0 + vertex -205 202 0 + vertex -205 -202 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -202.105 204.998 0 + vertex -202.314 204.984 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -202.314 204.984 0 + vertex -202.521 204.954 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -202.521 204.954 0 + vertex -202.726 204.911 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -202.726 204.911 0 + vertex -202.927 204.853 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -202.927 204.853 0 + vertex -203.124 204.782 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -203.124 204.782 0 + vertex -203.315 204.696 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -203.315 204.696 0 + vertex -203.5 204.598 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -203.5 204.598 0 + vertex -203.678 204.487 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -203.678 204.487 0 + vertex -203.847 204.364 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -203.847 204.364 0 + vertex -204.007 204.229 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -204.007 204.229 0 + vertex -204.158 204.084 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -204.158 204.084 0 + vertex -204.298 203.928 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -204.298 203.928 0 + vertex -204.427 203.763 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -204.427 203.763 0 + vertex -204.544 203.59 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -204.544 203.59 0 + vertex -204.649 203.408 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -204.649 203.408 0 + vertex -204.741 203.22 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -204.741 203.22 0 + vertex -204.819 203.026 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -204.819 203.026 0 + vertex -204.884 202.827 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -204.884 202.827 0 + vertex -204.934 202.624 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -204.934 202.624 0 + vertex -204.971 202.418 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -204.971 202.418 0 + vertex -204.993 202.209 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -204.993 202.209 0 + vertex -205 202 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -202.002 204.998 0 + vertex -205 202 0 + vertex -202.002 -204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -202.002 204.998 0 + vertex -202.002 -204.998 0 + vertex 202.002 -204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -204.993 -202.209 0 + vertex -204.971 -202.418 0 + vertex -202.002 -204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -202.002 -204.998 0 + vertex -204.934 -202.624 0 + vertex -204.884 -202.827 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -204.649 -203.408 0 + vertex -202.002 -204.998 0 + vertex -204.741 -203.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -202.002 -204.998 0 + vertex -204.819 -203.026 0 + vertex -204.741 -203.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -204.158 -204.084 0 + vertex -204.007 -204.229 0 + vertex -202.002 -204.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -204.298 -203.928 0 + vertex -202.002 -204.998 0 + vertex -204.427 -203.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -202.002 -204.998 0 + vertex -204.544 -203.59 0 + vertex -204.427 -203.763 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -204.158 -204.084 0 + vertex -202.002 -204.998 0 + vertex -204.298 -203.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -203.124 -204.782 0 + vertex -202.927 -204.853 0 + vertex -202.002 -204.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -203.678 -204.487 0 + vertex -202.002 -204.998 0 + vertex -203.847 -204.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -202.002 -204.998 0 + vertex -204.007 -204.229 0 + vertex -203.847 -204.364 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -203.5 -204.598 0 + vertex -202.002 -204.998 0 + vertex -203.678 -204.487 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -203.315 -204.696 0 + vertex -202.002 -204.998 0 + vertex -203.5 -204.598 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -203.124 -204.782 0 + vertex -202.002 -204.998 0 + vertex -203.315 -204.696 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -204.544 -203.59 0 + vertex -202.002 -204.998 0 + vertex -204.649 -203.408 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -202.521 -204.954 0 + vertex -202.002 -204.998 0 + vertex -202.726 -204.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -202.002 -204.998 0 + vertex -202.927 -204.853 0 + vertex -202.726 -204.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -202.002 -204.998 0 + vertex -204.884 -202.827 0 + vertex -204.819 -203.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -202.002 -204.998 0 + vertex -202.521 -204.954 0 + vertex -202.314 -204.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -204.971 -202.418 0 + vertex -204.934 -202.624 0 + vertex -202.002 -204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -202.314 -204.984 0 + vertex -202.105 -204.998 0 + vertex -202.002 -204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -202.002 -204.998 0 + vertex 202 -205 0 + vertex 202.002 -204.998 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex -202 -205 0 + vertex 202 -205 0 + vertex -202.002 -204.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -204.993 -202.209 0 + vertex -202.002 -204.998 0 + vertex -205 -202 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 202.105 -204.998 -3 + vertex 202.002 -204.998 0 + vertex 202.002 -204.998 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 202.105 -204.998 -3 + vertex 202.105 -204.998 0 + vertex 202.002 -204.998 0 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 202.314 -204.984 -3 + vertex 202.105 -204.998 0 + vertex 202.105 -204.998 -3 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 202.314 -204.984 -3 + vertex 202.314 -204.984 0 + vertex 202.105 -204.998 0 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 202.521 -204.954 -3 + vertex 202.314 -204.984 0 + vertex 202.314 -204.984 -3 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 202.521 -204.954 -3 + vertex 202.521 -204.954 0 + vertex 202.314 -204.984 0 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 202.726 -204.911 -3 + vertex 202.521 -204.954 0 + vertex 202.521 -204.954 -3 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 202.726 -204.911 -3 + vertex 202.726 -204.911 0 + vertex 202.521 -204.954 0 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 202.927 -204.853 -3 + vertex 202.726 -204.911 0 + vertex 202.726 -204.911 -3 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 202.927 -204.853 -3 + vertex 202.927 -204.853 0 + vertex 202.726 -204.911 0 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 203.124 -204.782 -3 + vertex 202.927 -204.853 0 + vertex 202.927 -204.853 -3 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 203.124 -204.782 -3 + vertex 203.124 -204.782 0 + vertex 202.927 -204.853 0 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 203.315 -204.696 -3 + vertex 203.124 -204.782 0 + vertex 203.124 -204.782 -3 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 203.315 -204.696 -3 + vertex 203.315 -204.696 0 + vertex 203.124 -204.782 0 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 203.5 -204.598 -3 + vertex 203.315 -204.696 0 + vertex 203.315 -204.696 -3 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 203.5 -204.598 -3 + vertex 203.5 -204.598 0 + vertex 203.315 -204.696 0 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 203.678 -204.487 -3 + vertex 203.5 -204.598 0 + vertex 203.5 -204.598 -3 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 203.678 -204.487 -3 + vertex 203.678 -204.487 0 + vertex 203.5 -204.598 0 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 203.847 -204.364 -3 + vertex 203.678 -204.487 0 + vertex 203.678 -204.487 -3 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 203.847 -204.364 -3 + vertex 203.847 -204.364 0 + vertex 203.678 -204.487 0 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 204.007 -204.229 -3 + vertex 203.847 -204.364 0 + vertex 203.847 -204.364 -3 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 204.007 -204.229 -3 + vertex 204.007 -204.229 0 + vertex 203.847 -204.364 0 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 204.158 -204.084 -3 + vertex 204.007 -204.229 0 + vertex 204.007 -204.229 -3 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 204.158 -204.084 -3 + vertex 204.158 -204.084 0 + vertex 204.007 -204.229 0 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 204.298 -203.928 -3 + vertex 204.158 -204.084 0 + vertex 204.158 -204.084 -3 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 204.298 -203.928 -3 + vertex 204.298 -203.928 0 + vertex 204.158 -204.084 0 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 204.427 -203.763 -3 + vertex 204.298 -203.928 0 + vertex 204.298 -203.928 -3 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 204.427 -203.763 -3 + vertex 204.427 -203.763 0 + vertex 204.298 -203.928 0 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 204.544 -203.59 -3 + vertex 204.427 -203.763 0 + vertex 204.427 -203.763 -3 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 204.544 -203.59 -3 + vertex 204.544 -203.59 0 + vertex 204.427 -203.763 0 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 204.649 -203.408 -3 + vertex 204.544 -203.59 0 + vertex 204.544 -203.59 -3 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 204.649 -203.408 -3 + vertex 204.649 -203.408 0 + vertex 204.544 -203.59 0 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 204.741 -203.22 -3 + vertex 204.649 -203.408 0 + vertex 204.649 -203.408 -3 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 204.741 -203.22 -3 + vertex 204.741 -203.22 0 + vertex 204.649 -203.408 0 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 204.819 -203.026 -3 + vertex 204.741 -203.22 0 + vertex 204.741 -203.22 -3 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 204.819 -203.026 -3 + vertex 204.819 -203.026 0 + vertex 204.741 -203.22 0 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 204.884 -202.827 -3 + vertex 204.819 -203.026 0 + vertex 204.819 -203.026 -3 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 204.884 -202.827 -3 + vertex 204.884 -202.827 0 + vertex 204.819 -203.026 0 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 204.934 -202.624 -3 + vertex 204.884 -202.827 0 + vertex 204.884 -202.827 -3 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 204.934 -202.624 -3 + vertex 204.934 -202.624 0 + vertex 204.884 -202.827 0 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 204.971 -202.418 -3 + vertex 204.934 -202.624 0 + vertex 204.934 -202.624 -3 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 204.971 -202.418 -3 + vertex 204.971 -202.418 0 + vertex 204.934 -202.624 0 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 204.993 -202.209 -3 + vertex 204.971 -202.418 0 + vertex 204.971 -202.418 -3 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 204.993 -202.209 -3 + vertex 204.993 -202.209 0 + vertex 204.971 -202.418 0 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 205 -202 -3 + vertex 204.993 -202.209 0 + vertex 204.993 -202.209 -3 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 205 -202 -3 + vertex 205 -202 0 + vertex 204.993 -202.209 0 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 205 202 -3 + vertex 205 -202 0 + vertex 205 -202 -3 + endloop + endfacet + facet normal 1 0 -0 + outer loop + vertex 205 202 -3 + vertex 205 202 0 + vertex 205 -202 0 + endloop + endfacet + facet normal 0.99944 0.0334741 0 + outer loop + vertex 204.993 202.209 -3 + vertex 205 202 0 + vertex 205 202 -3 + endloop + endfacet + facet normal 0.99944 0.0334741 -0 + outer loop + vertex 204.993 202.209 -3 + vertex 204.993 202.209 0 + vertex 205 202 0 + endloop + endfacet + facet normal 0.994505 0.104685 0 + outer loop + vertex 204.971 202.418 -3 + vertex 204.993 202.209 0 + vertex 204.993 202.209 -3 + endloop + endfacet + facet normal 0.994505 0.104685 -0 + outer loop + vertex 204.971 202.418 -3 + vertex 204.971 202.418 0 + vertex 204.993 202.209 0 + endloop + endfacet + facet normal 0.98425 0.176783 0 + outer loop + vertex 204.934 202.624 -3 + vertex 204.971 202.418 0 + vertex 204.971 202.418 -3 + endloop + endfacet + facet normal 0.98425 0.176783 -0 + outer loop + vertex 204.934 202.624 -3 + vertex 204.934 202.624 0 + vertex 204.971 202.418 0 + endloop + endfacet + facet normal 0.970981 0.239158 0 + outer loop + vertex 204.884 202.827 -3 + vertex 204.934 202.624 0 + vertex 204.934 202.624 -3 + endloop + endfacet + facet normal 0.970981 0.239158 -0 + outer loop + vertex 204.884 202.827 -3 + vertex 204.884 202.827 0 + vertex 204.934 202.624 0 + endloop + endfacet + facet normal 0.950577 0.31049 0 + outer loop + vertex 204.819 203.026 -3 + vertex 204.884 202.827 0 + vertex 204.884 202.827 -3 + endloop + endfacet + facet normal 0.950577 0.31049 -0 + outer loop + vertex 204.819 203.026 -3 + vertex 204.819 203.026 0 + vertex 204.884 202.827 0 + endloop + endfacet + facet normal 0.927816 0.373039 0 + outer loop + vertex 204.741 203.22 -3 + vertex 204.819 203.026 0 + vertex 204.819 203.026 -3 + endloop + endfacet + facet normal 0.927816 0.373039 -0 + outer loop + vertex 204.741 203.22 -3 + vertex 204.741 203.22 0 + vertex 204.819 203.026 0 + endloop + endfacet + facet normal 0.898217 0.439553 0 + outer loop + vertex 204.649 203.408 -3 + vertex 204.741 203.22 0 + vertex 204.741 203.22 -3 + endloop + endfacet + facet normal 0.898217 0.439553 -0 + outer loop + vertex 204.649 203.408 -3 + vertex 204.649 203.408 0 + vertex 204.741 203.22 0 + endloop + endfacet + facet normal 0.866186 0.499722 0 + outer loop + vertex 204.544 203.59 -3 + vertex 204.649 203.408 0 + vertex 204.649 203.408 -3 + endloop + endfacet + facet normal 0.866186 0.499722 -0 + outer loop + vertex 204.544 203.59 -3 + vertex 204.544 203.59 0 + vertex 204.649 203.408 0 + endloop + endfacet + facet normal 0.828349 0.560213 0 + outer loop + vertex 204.427 203.763 -3 + vertex 204.544 203.59 0 + vertex 204.544 203.59 -3 + endloop + endfacet + facet normal 0.828349 0.560213 -0 + outer loop + vertex 204.427 203.763 -3 + vertex 204.427 203.763 0 + vertex 204.544 203.59 0 + endloop + endfacet + facet normal 0.787807 0.615922 0 + outer loop + vertex 204.298 203.928 -3 + vertex 204.427 203.763 0 + vertex 204.427 203.763 -3 + endloop + endfacet + facet normal 0.787807 0.615922 -0 + outer loop + vertex 204.298 203.928 -3 + vertex 204.298 203.928 0 + vertex 204.427 203.763 0 + endloop + endfacet + facet normal 0.744242 0.66791 0 + outer loop + vertex 204.158 204.084 -3 + vertex 204.298 203.928 0 + vertex 204.298 203.928 -3 + endloop + endfacet + facet normal 0.744242 0.66791 -0 + outer loop + vertex 204.158 204.084 -3 + vertex 204.158 204.084 0 + vertex 204.298 203.928 0 + endloop + endfacet + facet normal 0.692631 0.721292 0 + outer loop + vertex 204.007 204.229 -3 + vertex 204.158 204.084 0 + vertex 204.158 204.084 -3 + endloop + endfacet + facet normal 0.692631 0.721292 -0 + outer loop + vertex 204.007 204.229 -3 + vertex 204.007 204.229 0 + vertex 204.158 204.084 0 + endloop + endfacet + facet normal 0.644871 0.764291 0 + outer loop + vertex 203.847 204.364 -3 + vertex 204.007 204.229 0 + vertex 204.007 204.229 -3 + endloop + endfacet + facet normal 0.644871 0.764291 -0 + outer loop + vertex 203.847 204.364 -3 + vertex 203.847 204.364 0 + vertex 204.007 204.229 0 + endloop + endfacet + facet normal 0.588456 0.808529 0 + outer loop + vertex 203.678 204.487 -3 + vertex 203.847 204.364 0 + vertex 203.847 204.364 -3 + endloop + endfacet + facet normal 0.588456 0.808529 -0 + outer loop + vertex 203.678 204.487 -3 + vertex 203.678 204.487 0 + vertex 203.847 204.364 0 + endloop + endfacet + facet normal 0.529142 0.848533 0 + outer loop + vertex 203.5 204.598 -3 + vertex 203.678 204.487 0 + vertex 203.678 204.487 -3 + endloop + endfacet + facet normal 0.529142 0.848533 -0 + outer loop + vertex 203.5 204.598 -3 + vertex 203.5 204.598 0 + vertex 203.678 204.487 0 + endloop + endfacet + facet normal 0.468107 0.883672 0 + outer loop + vertex 203.315 204.696 -3 + vertex 203.5 204.598 0 + vertex 203.5 204.598 -3 + endloop + endfacet + facet normal 0.468107 0.883672 -0 + outer loop + vertex 203.315 204.696 -3 + vertex 203.315 204.696 0 + vertex 203.5 204.598 0 + endloop + endfacet + facet normal 0.410563 0.911832 0 + outer loop + vertex 203.124 204.782 -3 + vertex 203.315 204.696 0 + vertex 203.315 204.696 -3 + endloop + endfacet + facet normal 0.410563 0.911832 -0 + outer loop + vertex 203.124 204.782 -3 + vertex 203.124 204.782 0 + vertex 203.315 204.696 0 + endloop + endfacet + facet normal 0.339058 0.940766 0 + outer loop + vertex 202.927 204.853 -3 + vertex 203.124 204.782 0 + vertex 203.124 204.782 -3 + endloop + endfacet + facet normal 0.339058 0.940766 -0 + outer loop + vertex 202.927 204.853 -3 + vertex 202.927 204.853 0 + vertex 203.124 204.782 0 + endloop + endfacet + facet normal 0.277246 0.960799 0 + outer loop + vertex 202.726 204.911 -3 + vertex 202.927 204.853 0 + vertex 202.927 204.853 -3 + endloop + endfacet + facet normal 0.277246 0.960799 -0 + outer loop + vertex 202.726 204.911 -3 + vertex 202.726 204.911 0 + vertex 202.927 204.853 0 + endloop + endfacet + facet normal 0.205289 0.978701 0 + outer loop + vertex 202.521 204.954 -3 + vertex 202.726 204.911 0 + vertex 202.726 204.911 -3 + endloop + endfacet + facet normal 0.205289 0.978701 -0 + outer loop + vertex 202.521 204.954 -3 + vertex 202.521 204.954 0 + vertex 202.726 204.911 0 + endloop + endfacet + facet normal 0.143429 0.989661 0 + outer loop + vertex 202.314 204.984 -3 + vertex 202.521 204.954 0 + vertex 202.521 204.954 -3 + endloop + endfacet + facet normal 0.143429 0.989661 -0 + outer loop + vertex 202.314 204.984 -3 + vertex 202.314 204.984 0 + vertex 202.521 204.954 0 + endloop + endfacet + facet normal 0.0668359 0.997764 0 + outer loop + vertex 202.105 204.998 -3 + vertex 202.314 204.984 0 + vertex 202.314 204.984 -3 + endloop + endfacet + facet normal 0.0668359 0.997764 -0 + outer loop + vertex 202.105 204.998 -3 + vertex 202.105 204.998 0 + vertex 202.314 204.984 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 202.002 204.998 -3 + vertex 202.105 204.998 0 + vertex 202.105 204.998 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 202.002 204.998 -3 + vertex 202.002 204.998 0 + vertex 202.105 204.998 0 + endloop + endfacet + facet normal 0.707107 0.707107 0 + outer loop + vertex 202 205 -3 + vertex 202.002 204.998 0 + vertex 202.002 204.998 -3 + endloop + endfacet + facet normal 0.707107 0.707107 -0 + outer loop + vertex 202 205 -3 + vertex 202 205 0 + vertex 202.002 204.998 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -202 205 -3 + vertex 202 205 0 + vertex 202 205 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -202 205 -3 + vertex -202 205 0 + vertex 202 205 0 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -202.002 204.998 -3 + vertex -202 205 0 + vertex -202 205 -3 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -202.002 204.998 -3 + vertex -202.002 204.998 0 + vertex -202 205 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -202.105 204.998 -3 + vertex -202.002 204.998 0 + vertex -202.002 204.998 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -202.105 204.998 -3 + vertex -202.105 204.998 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -202.314 204.984 -3 + vertex -202.105 204.998 0 + vertex -202.105 204.998 -3 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -202.314 204.984 -3 + vertex -202.314 204.984 0 + vertex -202.105 204.998 0 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -202.521 204.954 -3 + vertex -202.314 204.984 0 + vertex -202.314 204.984 -3 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -202.521 204.954 -3 + vertex -202.521 204.954 0 + vertex -202.314 204.984 0 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -202.726 204.911 -3 + vertex -202.521 204.954 0 + vertex -202.521 204.954 -3 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -202.726 204.911 -3 + vertex -202.726 204.911 0 + vertex -202.521 204.954 0 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -202.927 204.853 -3 + vertex -202.726 204.911 0 + vertex -202.726 204.911 -3 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -202.927 204.853 -3 + vertex -202.927 204.853 0 + vertex -202.726 204.911 0 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -203.124 204.782 -3 + vertex -202.927 204.853 0 + vertex -202.927 204.853 -3 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -203.124 204.782 -3 + vertex -203.124 204.782 0 + vertex -202.927 204.853 0 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -203.315 204.696 -3 + vertex -203.124 204.782 0 + vertex -203.124 204.782 -3 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -203.315 204.696 -3 + vertex -203.315 204.696 0 + vertex -203.124 204.782 0 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -203.5 204.598 -3 + vertex -203.315 204.696 0 + vertex -203.315 204.696 -3 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -203.5 204.598 -3 + vertex -203.5 204.598 0 + vertex -203.315 204.696 0 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -203.678 204.487 -3 + vertex -203.5 204.598 0 + vertex -203.5 204.598 -3 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -203.678 204.487 -3 + vertex -203.678 204.487 0 + vertex -203.5 204.598 0 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -203.847 204.364 -3 + vertex -203.678 204.487 0 + vertex -203.678 204.487 -3 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -203.847 204.364 -3 + vertex -203.847 204.364 0 + vertex -203.678 204.487 0 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -204.007 204.229 -3 + vertex -203.847 204.364 0 + vertex -203.847 204.364 -3 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -204.007 204.229 -3 + vertex -204.007 204.229 0 + vertex -203.847 204.364 0 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -204.158 204.084 -3 + vertex -204.007 204.229 0 + vertex -204.007 204.229 -3 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -204.158 204.084 -3 + vertex -204.158 204.084 0 + vertex -204.007 204.229 0 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -204.298 203.928 -3 + vertex -204.158 204.084 0 + vertex -204.158 204.084 -3 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -204.298 203.928 -3 + vertex -204.298 203.928 0 + vertex -204.158 204.084 0 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -204.427 203.763 -3 + vertex -204.298 203.928 0 + vertex -204.298 203.928 -3 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -204.427 203.763 -3 + vertex -204.427 203.763 0 + vertex -204.298 203.928 0 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -204.544 203.59 -3 + vertex -204.427 203.763 0 + vertex -204.427 203.763 -3 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -204.544 203.59 -3 + vertex -204.544 203.59 0 + vertex -204.427 203.763 0 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -204.649 203.408 -3 + vertex -204.544 203.59 0 + vertex -204.544 203.59 -3 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -204.649 203.408 -3 + vertex -204.649 203.408 0 + vertex -204.544 203.59 0 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -204.741 203.22 -3 + vertex -204.649 203.408 0 + vertex -204.649 203.408 -3 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -204.741 203.22 -3 + vertex -204.741 203.22 0 + vertex -204.649 203.408 0 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -204.819 203.026 -3 + vertex -204.741 203.22 0 + vertex -204.741 203.22 -3 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -204.819 203.026 -3 + vertex -204.819 203.026 0 + vertex -204.741 203.22 0 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -204.884 202.827 -3 + vertex -204.819 203.026 0 + vertex -204.819 203.026 -3 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -204.884 202.827 -3 + vertex -204.884 202.827 0 + vertex -204.819 203.026 0 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -204.934 202.624 -3 + vertex -204.884 202.827 0 + vertex -204.884 202.827 -3 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -204.934 202.624 -3 + vertex -204.934 202.624 0 + vertex -204.884 202.827 0 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -204.971 202.418 -3 + vertex -204.934 202.624 0 + vertex -204.934 202.624 -3 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -204.971 202.418 -3 + vertex -204.971 202.418 0 + vertex -204.934 202.624 0 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -204.993 202.209 -3 + vertex -204.971 202.418 0 + vertex -204.971 202.418 -3 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -204.993 202.209 -3 + vertex -204.993 202.209 0 + vertex -204.971 202.418 0 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -205 202 -3 + vertex -204.993 202.209 0 + vertex -204.993 202.209 -3 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -205 202 -3 + vertex -205 202 0 + vertex -204.993 202.209 0 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -205 -202 -3 + vertex -205 202 0 + vertex -205 202 -3 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -205 -202 -3 + vertex -205 -202 0 + vertex -205 202 0 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -204.993 -202.209 -3 + vertex -205 -202 0 + vertex -205 -202 -3 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -204.993 -202.209 -3 + vertex -204.993 -202.209 0 + vertex -205 -202 0 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -204.971 -202.418 -3 + vertex -204.993 -202.209 0 + vertex -204.993 -202.209 -3 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -204.971 -202.418 -3 + vertex -204.971 -202.418 0 + vertex -204.993 -202.209 0 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -204.934 -202.624 -3 + vertex -204.971 -202.418 0 + vertex -204.971 -202.418 -3 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -204.934 -202.624 -3 + vertex -204.934 -202.624 0 + vertex -204.971 -202.418 0 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -204.884 -202.827 -3 + vertex -204.934 -202.624 0 + vertex -204.934 -202.624 -3 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -204.884 -202.827 -3 + vertex -204.884 -202.827 0 + vertex -204.934 -202.624 0 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -204.819 -203.026 -3 + vertex -204.884 -202.827 0 + vertex -204.884 -202.827 -3 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -204.819 -203.026 -3 + vertex -204.819 -203.026 0 + vertex -204.884 -202.827 0 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -204.741 -203.22 -3 + vertex -204.819 -203.026 0 + vertex -204.819 -203.026 -3 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -204.741 -203.22 -3 + vertex -204.741 -203.22 0 + vertex -204.819 -203.026 0 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -204.649 -203.408 -3 + vertex -204.741 -203.22 0 + vertex -204.741 -203.22 -3 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -204.649 -203.408 -3 + vertex -204.649 -203.408 0 + vertex -204.741 -203.22 0 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -204.544 -203.59 -3 + vertex -204.649 -203.408 0 + vertex -204.649 -203.408 -3 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -204.544 -203.59 -3 + vertex -204.544 -203.59 0 + vertex -204.649 -203.408 0 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -204.427 -203.763 -3 + vertex -204.544 -203.59 0 + vertex -204.544 -203.59 -3 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -204.427 -203.763 -3 + vertex -204.427 -203.763 0 + vertex -204.544 -203.59 0 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -204.298 -203.928 -3 + vertex -204.427 -203.763 0 + vertex -204.427 -203.763 -3 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -204.298 -203.928 -3 + vertex -204.298 -203.928 0 + vertex -204.427 -203.763 0 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -204.158 -204.084 -3 + vertex -204.298 -203.928 0 + vertex -204.298 -203.928 -3 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -204.158 -204.084 -3 + vertex -204.158 -204.084 0 + vertex -204.298 -203.928 0 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -204.007 -204.229 -3 + vertex -204.158 -204.084 0 + vertex -204.158 -204.084 -3 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -204.007 -204.229 -3 + vertex -204.007 -204.229 0 + vertex -204.158 -204.084 0 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -203.847 -204.364 -3 + vertex -204.007 -204.229 0 + vertex -204.007 -204.229 -3 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -203.847 -204.364 -3 + vertex -203.847 -204.364 0 + vertex -204.007 -204.229 0 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -203.678 -204.487 -3 + vertex -203.847 -204.364 0 + vertex -203.847 -204.364 -3 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -203.678 -204.487 -3 + vertex -203.678 -204.487 0 + vertex -203.847 -204.364 0 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -203.5 -204.598 -3 + vertex -203.678 -204.487 0 + vertex -203.678 -204.487 -3 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -203.5 -204.598 -3 + vertex -203.5 -204.598 0 + vertex -203.678 -204.487 0 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -203.315 -204.696 -3 + vertex -203.5 -204.598 0 + vertex -203.5 -204.598 -3 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -203.315 -204.696 -3 + vertex -203.315 -204.696 0 + vertex -203.5 -204.598 0 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -203.124 -204.782 -3 + vertex -203.315 -204.696 0 + vertex -203.315 -204.696 -3 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -203.124 -204.782 -3 + vertex -203.124 -204.782 0 + vertex -203.315 -204.696 0 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -202.927 -204.853 -3 + vertex -203.124 -204.782 0 + vertex -203.124 -204.782 -3 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -202.927 -204.853 -3 + vertex -202.927 -204.853 0 + vertex -203.124 -204.782 0 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -202.726 -204.911 -3 + vertex -202.927 -204.853 0 + vertex -202.927 -204.853 -3 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -202.726 -204.911 -3 + vertex -202.726 -204.911 0 + vertex -202.927 -204.853 0 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -202.521 -204.954 -3 + vertex -202.726 -204.911 0 + vertex -202.726 -204.911 -3 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -202.521 -204.954 -3 + vertex -202.521 -204.954 0 + vertex -202.726 -204.911 0 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -202.314 -204.984 -3 + vertex -202.521 -204.954 0 + vertex -202.521 -204.954 -3 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -202.314 -204.984 -3 + vertex -202.314 -204.984 0 + vertex -202.521 -204.954 0 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -202.105 -204.998 -3 + vertex -202.314 -204.984 0 + vertex -202.314 -204.984 -3 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -202.105 -204.998 -3 + vertex -202.105 -204.998 0 + vertex -202.314 -204.984 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -202.002 -204.998 -3 + vertex -202.105 -204.998 0 + vertex -202.105 -204.998 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -202.002 -204.998 -3 + vertex -202.002 -204.998 0 + vertex -202.105 -204.998 0 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -202 -205 -3 + vertex -202.002 -204.998 0 + vertex -202.002 -204.998 -3 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -202 -205 -3 + vertex -202 -205 0 + vertex -202.002 -204.998 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 202 -205 -3 + vertex -202 -205 0 + vertex -202 -205 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 202 -205 -3 + vertex 202 -205 0 + vertex -202 -205 0 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 202.002 -204.998 -3 + vertex 202 -205 0 + vertex 202 -205 -3 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 202.002 -204.998 -3 + vertex 202.002 -204.998 0 + vertex 202 -205 0 + endloop + endfacet +endsolid OpenSCAD_Model diff --git a/resources/profiles/Creality/cr10s5.svg b/resources/profiles/Creality/cr10s5.svg new file mode 100644 index 000000000..1dfca17dc --- /dev/null +++ b/resources/profiles/Creality/cr10s5.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/profiles/Creality/cr10s5_bed.stl b/resources/profiles/Creality/cr10s5_bed.stl new file mode 100644 index 000000000..5b9acaf10 --- /dev/null +++ b/resources/profiles/Creality/cr10s5_bed.stl @@ -0,0 +1,2774 @@ +solid OpenSCAD_Model + facet normal 0 0 -1 + outer loop + vertex 252.105 -254.998 -3 + vertex 252.002 -254.998 -3 + vertex 252.314 -254.984 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 252.314 -254.984 -3 + vertex 252.002 -254.998 -3 + vertex 252.521 -254.954 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 255 -252 -3 + vertex 252.002 -254.998 -3 + vertex 252.002 254.998 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 252.521 -254.954 -3 + vertex 252.002 -254.998 -3 + vertex 252.726 -254.911 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 252.726 -254.911 -3 + vertex 252.002 -254.998 -3 + vertex 252.927 -254.853 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 252.927 -254.853 -3 + vertex 252.002 -254.998 -3 + vertex 253.124 -254.782 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 253.124 -254.782 -3 + vertex 252.002 -254.998 -3 + vertex 253.315 -254.696 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 253.315 -254.696 -3 + vertex 252.002 -254.998 -3 + vertex 253.5 -254.598 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 253.5 -254.598 -3 + vertex 252.002 -254.998 -3 + vertex 253.678 -254.487 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 253.678 -254.487 -3 + vertex 252.002 -254.998 -3 + vertex 253.847 -254.364 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 253.847 -254.364 -3 + vertex 252.002 -254.998 -3 + vertex 254.007 -254.229 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 254.007 -254.229 -3 + vertex 252.002 -254.998 -3 + vertex 254.158 -254.084 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 254.158 -254.084 -3 + vertex 252.002 -254.998 -3 + vertex 254.298 -253.928 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 254.298 -253.928 -3 + vertex 252.002 -254.998 -3 + vertex 254.427 -253.763 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 254.427 -253.763 -3 + vertex 252.002 -254.998 -3 + vertex 254.544 -253.59 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 254.544 -253.59 -3 + vertex 252.002 -254.998 -3 + vertex 254.649 -253.408 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 254.649 -253.408 -3 + vertex 252.002 -254.998 -3 + vertex 254.741 -253.22 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 254.741 -253.22 -3 + vertex 252.002 -254.998 -3 + vertex 254.819 -253.026 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 254.819 -253.026 -3 + vertex 252.002 -254.998 -3 + vertex 254.884 -252.827 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 254.884 -252.827 -3 + vertex 252.002 -254.998 -3 + vertex 254.934 -252.624 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 254.934 -252.624 -3 + vertex 252.002 -254.998 -3 + vertex 254.971 -252.418 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 254.971 -252.418 -3 + vertex 252.002 -254.998 -3 + vertex 254.993 -252.209 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 254.993 -252.209 -3 + vertex 252.002 -254.998 -3 + vertex 255 -252 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 255 -252 -3 + vertex 252.002 254.998 -3 + vertex 255 252 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 252.002 254.998 -3 + vertex 254.971 252.418 -3 + vertex 254.993 252.209 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 254.884 252.827 -3 + vertex 254.934 252.624 -3 + vertex 252.002 254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 254.741 253.22 -3 + vertex 252.002 254.998 -3 + vertex 254.649 253.408 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 254.741 253.22 -3 + vertex 254.819 253.026 -3 + vertex 252.002 254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 252.002 254.998 -3 + vertex 254.007 254.229 -3 + vertex 254.158 254.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 254.427 253.763 -3 + vertex 252.002 254.998 -3 + vertex 254.298 253.928 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 254.427 253.763 -3 + vertex 254.544 253.59 -3 + vertex 252.002 254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 254.298 253.928 -3 + vertex 252.002 254.998 -3 + vertex 254.158 254.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 252.002 254.998 -3 + vertex 252.927 254.853 -3 + vertex 253.124 254.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 253.847 254.364 -3 + vertex 252.002 254.998 -3 + vertex 253.678 254.487 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 253.847 254.364 -3 + vertex 254.007 254.229 -3 + vertex 252.002 254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 253.678 254.487 -3 + vertex 252.002 254.998 -3 + vertex 253.5 254.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 253.5 254.598 -3 + vertex 252.002 254.998 -3 + vertex 253.315 254.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 253.315 254.696 -3 + vertex 252.002 254.998 -3 + vertex 253.124 254.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 254.649 253.408 -3 + vertex 252.002 254.998 -3 + vertex 254.544 253.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 252.726 254.911 -3 + vertex 252.002 254.998 -3 + vertex 252.521 254.954 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 252.726 254.911 -3 + vertex 252.927 254.853 -3 + vertex 252.002 254.998 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 254.819 253.026 -3 + vertex 254.884 252.827 -3 + vertex 252.002 254.998 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 252.314 254.984 -3 + vertex 252.521 254.954 -3 + vertex 252.002 254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 252.002 254.998 -3 + vertex 254.934 252.624 -3 + vertex 254.971 252.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 252.002 254.998 -3 + vertex 252.105 254.998 -3 + vertex 252.314 254.984 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 255 252 -3 + vertex 252.002 254.998 -3 + vertex 254.993 252.209 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex -252 255 -3 + vertex 252 255 -3 + vertex -252.002 254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex 252 255 -3 + vertex 252.002 254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 252.002 -254.998 -3 + vertex -252.002 254.998 -3 + vertex 252.002 254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -255 -252 -3 + vertex -255 252 -3 + vertex -252.002 -254.998 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -252.314 254.984 -3 + vertex -252.105 254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -252.521 254.954 -3 + vertex -252.314 254.984 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -252.726 254.911 -3 + vertex -252.521 254.954 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -252.927 254.853 -3 + vertex -252.726 254.911 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -253.124 254.782 -3 + vertex -252.927 254.853 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -253.315 254.696 -3 + vertex -253.124 254.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -253.5 254.598 -3 + vertex -253.315 254.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -253.678 254.487 -3 + vertex -253.5 254.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -253.847 254.364 -3 + vertex -253.678 254.487 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -254.007 254.229 -3 + vertex -253.847 254.364 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -254.158 254.084 -3 + vertex -254.007 254.229 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -254.298 253.928 -3 + vertex -254.158 254.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -254.427 253.763 -3 + vertex -254.298 253.928 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -254.544 253.59 -3 + vertex -254.427 253.763 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -254.649 253.408 -3 + vertex -254.544 253.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -254.741 253.22 -3 + vertex -254.649 253.408 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -254.819 253.026 -3 + vertex -254.741 253.22 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -254.884 252.827 -3 + vertex -254.819 253.026 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -254.934 252.624 -3 + vertex -254.884 252.827 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -254.971 252.418 -3 + vertex -254.934 252.624 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -254.993 252.209 -3 + vertex -254.971 252.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -255 252 -3 + vertex -254.993 252.209 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 -254.998 -3 + vertex -255 252 -3 + vertex -252.002 254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 252.002 -254.998 -3 + vertex -252.002 -254.998 -3 + vertex -252.002 254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 -254.998 -3 + vertex -254.971 -252.418 -3 + vertex -254.993 -252.209 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -254.884 -252.827 -3 + vertex -254.934 -252.624 -3 + vertex -252.002 -254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -254.741 -253.22 -3 + vertex -252.002 -254.998 -3 + vertex -254.649 -253.408 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -254.741 -253.22 -3 + vertex -254.819 -253.026 -3 + vertex -252.002 -254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 -254.998 -3 + vertex -254.007 -254.229 -3 + vertex -254.158 -254.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -254.427 -253.763 -3 + vertex -252.002 -254.998 -3 + vertex -254.298 -253.928 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -254.427 -253.763 -3 + vertex -254.544 -253.59 -3 + vertex -252.002 -254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -254.298 -253.928 -3 + vertex -252.002 -254.998 -3 + vertex -254.158 -254.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 -254.998 -3 + vertex -252.927 -254.853 -3 + vertex -253.124 -254.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -253.847 -254.364 -3 + vertex -252.002 -254.998 -3 + vertex -253.678 -254.487 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -253.847 -254.364 -3 + vertex -254.007 -254.229 -3 + vertex -252.002 -254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -253.678 -254.487 -3 + vertex -252.002 -254.998 -3 + vertex -253.5 -254.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -253.5 -254.598 -3 + vertex -252.002 -254.998 -3 + vertex -253.315 -254.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -253.315 -254.696 -3 + vertex -252.002 -254.998 -3 + vertex -253.124 -254.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -254.649 -253.408 -3 + vertex -252.002 -254.998 -3 + vertex -254.544 -253.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.726 -254.911 -3 + vertex -252.002 -254.998 -3 + vertex -252.521 -254.954 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.726 -254.911 -3 + vertex -252.927 -254.853 -3 + vertex -252.002 -254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -254.819 -253.026 -3 + vertex -254.884 -252.827 -3 + vertex -252.002 -254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.314 -254.984 -3 + vertex -252.521 -254.954 -3 + vertex -252.002 -254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 -254.998 -3 + vertex -254.934 -252.624 -3 + vertex -254.971 -252.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 -254.998 -3 + vertex -252.105 -254.998 -3 + vertex -252.314 -254.984 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 252.002 -254.998 -3 + vertex 252 -255 -3 + vertex -252.002 -254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 -254.998 -3 + vertex 252 -255 -3 + vertex -252 -255 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -255 -252 -3 + vertex -252.002 -254.998 -3 + vertex -254.993 -252.209 -3 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.314 -254.984 0 + vertex 252.002 -254.998 0 + vertex 252.105 -254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.521 -254.954 0 + vertex 252.002 -254.998 0 + vertex 252.314 -254.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.002 254.998 0 + vertex 252.002 -254.998 0 + vertex 255 -252 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.726 -254.911 0 + vertex 252.002 -254.998 0 + vertex 252.521 -254.954 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.927 -254.853 0 + vertex 252.002 -254.998 0 + vertex 252.726 -254.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 253.124 -254.782 0 + vertex 252.002 -254.998 0 + vertex 252.927 -254.853 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 253.315 -254.696 0 + vertex 252.002 -254.998 0 + vertex 253.124 -254.782 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 253.5 -254.598 0 + vertex 252.002 -254.998 0 + vertex 253.315 -254.696 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 253.678 -254.487 0 + vertex 252.002 -254.998 0 + vertex 253.5 -254.598 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 253.847 -254.364 0 + vertex 252.002 -254.998 0 + vertex 253.678 -254.487 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.007 -254.229 0 + vertex 252.002 -254.998 0 + vertex 253.847 -254.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.158 -254.084 0 + vertex 252.002 -254.998 0 + vertex 254.007 -254.229 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.298 -253.928 0 + vertex 252.002 -254.998 0 + vertex 254.158 -254.084 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.427 -253.763 0 + vertex 252.002 -254.998 0 + vertex 254.298 -253.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.544 -253.59 0 + vertex 252.002 -254.998 0 + vertex 254.427 -253.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.649 -253.408 0 + vertex 252.002 -254.998 0 + vertex 254.544 -253.59 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.741 -253.22 0 + vertex 252.002 -254.998 0 + vertex 254.649 -253.408 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.819 -253.026 0 + vertex 252.002 -254.998 0 + vertex 254.741 -253.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.884 -252.827 0 + vertex 252.002 -254.998 0 + vertex 254.819 -253.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.934 -252.624 0 + vertex 252.002 -254.998 0 + vertex 254.884 -252.827 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.971 -252.418 0 + vertex 252.002 -254.998 0 + vertex 254.934 -252.624 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.993 -252.209 0 + vertex 252.002 -254.998 0 + vertex 254.971 -252.418 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 255 -252 0 + vertex 252.002 -254.998 0 + vertex 254.993 -252.209 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 255 252 0 + vertex 252.002 254.998 0 + vertex 255 -252 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.993 252.209 0 + vertex 254.971 252.418 0 + vertex 252.002 254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.002 254.998 0 + vertex 254.934 252.624 0 + vertex 254.884 252.827 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.649 253.408 0 + vertex 252.002 254.998 0 + vertex 254.741 253.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.002 254.998 0 + vertex 254.819 253.026 0 + vertex 254.741 253.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.158 254.084 0 + vertex 254.007 254.229 0 + vertex 252.002 254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.298 253.928 0 + vertex 252.002 254.998 0 + vertex 254.427 253.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.002 254.998 0 + vertex 254.544 253.59 0 + vertex 254.427 253.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.158 254.084 0 + vertex 252.002 254.998 0 + vertex 254.298 253.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 253.124 254.782 0 + vertex 252.927 254.853 0 + vertex 252.002 254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 253.678 254.487 0 + vertex 252.002 254.998 0 + vertex 253.847 254.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.002 254.998 0 + vertex 254.007 254.229 0 + vertex 253.847 254.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 253.5 254.598 0 + vertex 252.002 254.998 0 + vertex 253.678 254.487 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 253.315 254.696 0 + vertex 252.002 254.998 0 + vertex 253.5 254.598 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 253.124 254.782 0 + vertex 252.002 254.998 0 + vertex 253.315 254.696 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.544 253.59 0 + vertex 252.002 254.998 0 + vertex 254.649 253.408 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.521 254.954 0 + vertex 252.002 254.998 0 + vertex 252.726 254.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.002 254.998 0 + vertex 252.927 254.853 0 + vertex 252.726 254.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.002 254.998 0 + vertex 254.884 252.827 0 + vertex 254.819 253.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.002 254.998 0 + vertex 252.521 254.954 0 + vertex 252.314 254.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.971 252.418 0 + vertex 254.934 252.624 0 + vertex 252.002 254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.314 254.984 0 + vertex 252.105 254.998 0 + vertex 252.002 254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.993 252.209 0 + vertex 252.002 254.998 0 + vertex 255 252 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -252.002 254.998 0 + vertex 252 255 0 + vertex -252 255 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.002 254.998 0 + vertex 252 255 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.002 254.998 0 + vertex -252.002 254.998 0 + vertex 252.002 -254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -252.002 -254.998 0 + vertex -255 252 0 + vertex -255 -252 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -252.105 254.998 0 + vertex -252.314 254.984 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -252.314 254.984 0 + vertex -252.521 254.954 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -252.521 254.954 0 + vertex -252.726 254.911 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -252.726 254.911 0 + vertex -252.927 254.853 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -252.927 254.853 0 + vertex -253.124 254.782 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -253.124 254.782 0 + vertex -253.315 254.696 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -253.315 254.696 0 + vertex -253.5 254.598 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -253.5 254.598 0 + vertex -253.678 254.487 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -253.678 254.487 0 + vertex -253.847 254.364 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -253.847 254.364 0 + vertex -254.007 254.229 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -254.007 254.229 0 + vertex -254.158 254.084 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -254.158 254.084 0 + vertex -254.298 253.928 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -254.298 253.928 0 + vertex -254.427 253.763 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -254.427 253.763 0 + vertex -254.544 253.59 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -254.544 253.59 0 + vertex -254.649 253.408 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -254.649 253.408 0 + vertex -254.741 253.22 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -254.741 253.22 0 + vertex -254.819 253.026 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -254.819 253.026 0 + vertex -254.884 252.827 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -254.884 252.827 0 + vertex -254.934 252.624 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -254.934 252.624 0 + vertex -254.971 252.418 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -254.971 252.418 0 + vertex -254.993 252.209 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -254.993 252.209 0 + vertex -255 252 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -252.002 254.998 0 + vertex -255 252 0 + vertex -252.002 -254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -252.002 254.998 0 + vertex -252.002 -254.998 0 + vertex 252.002 -254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -254.993 -252.209 0 + vertex -254.971 -252.418 0 + vertex -252.002 -254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -252.002 -254.998 0 + vertex -254.934 -252.624 0 + vertex -254.884 -252.827 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -254.649 -253.408 0 + vertex -252.002 -254.998 0 + vertex -254.741 -253.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -252.002 -254.998 0 + vertex -254.819 -253.026 0 + vertex -254.741 -253.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -254.158 -254.084 0 + vertex -254.007 -254.229 0 + vertex -252.002 -254.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -254.298 -253.928 0 + vertex -252.002 -254.998 0 + vertex -254.427 -253.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -252.002 -254.998 0 + vertex -254.544 -253.59 0 + vertex -254.427 -253.763 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -254.158 -254.084 0 + vertex -252.002 -254.998 0 + vertex -254.298 -253.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -253.124 -254.782 0 + vertex -252.927 -254.853 0 + vertex -252.002 -254.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -253.678 -254.487 0 + vertex -252.002 -254.998 0 + vertex -253.847 -254.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -252.002 -254.998 0 + vertex -254.007 -254.229 0 + vertex -253.847 -254.364 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -253.5 -254.598 0 + vertex -252.002 -254.998 0 + vertex -253.678 -254.487 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -253.315 -254.696 0 + vertex -252.002 -254.998 0 + vertex -253.5 -254.598 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -253.124 -254.782 0 + vertex -252.002 -254.998 0 + vertex -253.315 -254.696 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -254.544 -253.59 0 + vertex -252.002 -254.998 0 + vertex -254.649 -253.408 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -252.521 -254.954 0 + vertex -252.002 -254.998 0 + vertex -252.726 -254.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -252.002 -254.998 0 + vertex -252.927 -254.853 0 + vertex -252.726 -254.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -252.002 -254.998 0 + vertex -254.884 -252.827 0 + vertex -254.819 -253.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -252.002 -254.998 0 + vertex -252.521 -254.954 0 + vertex -252.314 -254.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -254.971 -252.418 0 + vertex -254.934 -252.624 0 + vertex -252.002 -254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -252.314 -254.984 0 + vertex -252.105 -254.998 0 + vertex -252.002 -254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -252.002 -254.998 0 + vertex 252 -255 0 + vertex 252.002 -254.998 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex -252 -255 0 + vertex 252 -255 0 + vertex -252.002 -254.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -254.993 -252.209 0 + vertex -252.002 -254.998 0 + vertex -255 -252 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 252.105 -254.998 -3 + vertex 252.002 -254.998 0 + vertex 252.002 -254.998 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 252.105 -254.998 -3 + vertex 252.105 -254.998 0 + vertex 252.002 -254.998 0 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 252.314 -254.984 -3 + vertex 252.105 -254.998 0 + vertex 252.105 -254.998 -3 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 252.314 -254.984 -3 + vertex 252.314 -254.984 0 + vertex 252.105 -254.998 0 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 252.521 -254.954 -3 + vertex 252.314 -254.984 0 + vertex 252.314 -254.984 -3 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 252.521 -254.954 -3 + vertex 252.521 -254.954 0 + vertex 252.314 -254.984 0 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 252.726 -254.911 -3 + vertex 252.521 -254.954 0 + vertex 252.521 -254.954 -3 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 252.726 -254.911 -3 + vertex 252.726 -254.911 0 + vertex 252.521 -254.954 0 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 252.927 -254.853 -3 + vertex 252.726 -254.911 0 + vertex 252.726 -254.911 -3 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 252.927 -254.853 -3 + vertex 252.927 -254.853 0 + vertex 252.726 -254.911 0 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 253.124 -254.782 -3 + vertex 252.927 -254.853 0 + vertex 252.927 -254.853 -3 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 253.124 -254.782 -3 + vertex 253.124 -254.782 0 + vertex 252.927 -254.853 0 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 253.315 -254.696 -3 + vertex 253.124 -254.782 0 + vertex 253.124 -254.782 -3 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 253.315 -254.696 -3 + vertex 253.315 -254.696 0 + vertex 253.124 -254.782 0 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 253.5 -254.598 -3 + vertex 253.315 -254.696 0 + vertex 253.315 -254.696 -3 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 253.5 -254.598 -3 + vertex 253.5 -254.598 0 + vertex 253.315 -254.696 0 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 253.678 -254.487 -3 + vertex 253.5 -254.598 0 + vertex 253.5 -254.598 -3 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 253.678 -254.487 -3 + vertex 253.678 -254.487 0 + vertex 253.5 -254.598 0 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 253.847 -254.364 -3 + vertex 253.678 -254.487 0 + vertex 253.678 -254.487 -3 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 253.847 -254.364 -3 + vertex 253.847 -254.364 0 + vertex 253.678 -254.487 0 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 254.007 -254.229 -3 + vertex 253.847 -254.364 0 + vertex 253.847 -254.364 -3 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 254.007 -254.229 -3 + vertex 254.007 -254.229 0 + vertex 253.847 -254.364 0 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 254.158 -254.084 -3 + vertex 254.007 -254.229 0 + vertex 254.007 -254.229 -3 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 254.158 -254.084 -3 + vertex 254.158 -254.084 0 + vertex 254.007 -254.229 0 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 254.298 -253.928 -3 + vertex 254.158 -254.084 0 + vertex 254.158 -254.084 -3 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 254.298 -253.928 -3 + vertex 254.298 -253.928 0 + vertex 254.158 -254.084 0 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 254.427 -253.763 -3 + vertex 254.298 -253.928 0 + vertex 254.298 -253.928 -3 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 254.427 -253.763 -3 + vertex 254.427 -253.763 0 + vertex 254.298 -253.928 0 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 254.544 -253.59 -3 + vertex 254.427 -253.763 0 + vertex 254.427 -253.763 -3 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 254.544 -253.59 -3 + vertex 254.544 -253.59 0 + vertex 254.427 -253.763 0 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 254.649 -253.408 -3 + vertex 254.544 -253.59 0 + vertex 254.544 -253.59 -3 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 254.649 -253.408 -3 + vertex 254.649 -253.408 0 + vertex 254.544 -253.59 0 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 254.741 -253.22 -3 + vertex 254.649 -253.408 0 + vertex 254.649 -253.408 -3 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 254.741 -253.22 -3 + vertex 254.741 -253.22 0 + vertex 254.649 -253.408 0 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 254.819 -253.026 -3 + vertex 254.741 -253.22 0 + vertex 254.741 -253.22 -3 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 254.819 -253.026 -3 + vertex 254.819 -253.026 0 + vertex 254.741 -253.22 0 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 254.884 -252.827 -3 + vertex 254.819 -253.026 0 + vertex 254.819 -253.026 -3 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 254.884 -252.827 -3 + vertex 254.884 -252.827 0 + vertex 254.819 -253.026 0 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 254.934 -252.624 -3 + vertex 254.884 -252.827 0 + vertex 254.884 -252.827 -3 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 254.934 -252.624 -3 + vertex 254.934 -252.624 0 + vertex 254.884 -252.827 0 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 254.971 -252.418 -3 + vertex 254.934 -252.624 0 + vertex 254.934 -252.624 -3 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 254.971 -252.418 -3 + vertex 254.971 -252.418 0 + vertex 254.934 -252.624 0 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 254.993 -252.209 -3 + vertex 254.971 -252.418 0 + vertex 254.971 -252.418 -3 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 254.993 -252.209 -3 + vertex 254.993 -252.209 0 + vertex 254.971 -252.418 0 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 255 -252 -3 + vertex 254.993 -252.209 0 + vertex 254.993 -252.209 -3 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 255 -252 -3 + vertex 255 -252 0 + vertex 254.993 -252.209 0 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 255 252 -3 + vertex 255 -252 0 + vertex 255 -252 -3 + endloop + endfacet + facet normal 1 0 -0 + outer loop + vertex 255 252 -3 + vertex 255 252 0 + vertex 255 -252 0 + endloop + endfacet + facet normal 0.99944 0.0334741 0 + outer loop + vertex 254.993 252.209 -3 + vertex 255 252 0 + vertex 255 252 -3 + endloop + endfacet + facet normal 0.99944 0.0334741 -0 + outer loop + vertex 254.993 252.209 -3 + vertex 254.993 252.209 0 + vertex 255 252 0 + endloop + endfacet + facet normal 0.994505 0.104685 0 + outer loop + vertex 254.971 252.418 -3 + vertex 254.993 252.209 0 + vertex 254.993 252.209 -3 + endloop + endfacet + facet normal 0.994505 0.104685 -0 + outer loop + vertex 254.971 252.418 -3 + vertex 254.971 252.418 0 + vertex 254.993 252.209 0 + endloop + endfacet + facet normal 0.98425 0.176783 0 + outer loop + vertex 254.934 252.624 -3 + vertex 254.971 252.418 0 + vertex 254.971 252.418 -3 + endloop + endfacet + facet normal 0.98425 0.176783 -0 + outer loop + vertex 254.934 252.624 -3 + vertex 254.934 252.624 0 + vertex 254.971 252.418 0 + endloop + endfacet + facet normal 0.970981 0.239158 0 + outer loop + vertex 254.884 252.827 -3 + vertex 254.934 252.624 0 + vertex 254.934 252.624 -3 + endloop + endfacet + facet normal 0.970981 0.239158 -0 + outer loop + vertex 254.884 252.827 -3 + vertex 254.884 252.827 0 + vertex 254.934 252.624 0 + endloop + endfacet + facet normal 0.950577 0.31049 0 + outer loop + vertex 254.819 253.026 -3 + vertex 254.884 252.827 0 + vertex 254.884 252.827 -3 + endloop + endfacet + facet normal 0.950577 0.31049 -0 + outer loop + vertex 254.819 253.026 -3 + vertex 254.819 253.026 0 + vertex 254.884 252.827 0 + endloop + endfacet + facet normal 0.927816 0.373039 0 + outer loop + vertex 254.741 253.22 -3 + vertex 254.819 253.026 0 + vertex 254.819 253.026 -3 + endloop + endfacet + facet normal 0.927816 0.373039 -0 + outer loop + vertex 254.741 253.22 -3 + vertex 254.741 253.22 0 + vertex 254.819 253.026 0 + endloop + endfacet + facet normal 0.898217 0.439553 0 + outer loop + vertex 254.649 253.408 -3 + vertex 254.741 253.22 0 + vertex 254.741 253.22 -3 + endloop + endfacet + facet normal 0.898217 0.439553 -0 + outer loop + vertex 254.649 253.408 -3 + vertex 254.649 253.408 0 + vertex 254.741 253.22 0 + endloop + endfacet + facet normal 0.866186 0.499722 0 + outer loop + vertex 254.544 253.59 -3 + vertex 254.649 253.408 0 + vertex 254.649 253.408 -3 + endloop + endfacet + facet normal 0.866186 0.499722 -0 + outer loop + vertex 254.544 253.59 -3 + vertex 254.544 253.59 0 + vertex 254.649 253.408 0 + endloop + endfacet + facet normal 0.828349 0.560213 0 + outer loop + vertex 254.427 253.763 -3 + vertex 254.544 253.59 0 + vertex 254.544 253.59 -3 + endloop + endfacet + facet normal 0.828349 0.560213 -0 + outer loop + vertex 254.427 253.763 -3 + vertex 254.427 253.763 0 + vertex 254.544 253.59 0 + endloop + endfacet + facet normal 0.787807 0.615922 0 + outer loop + vertex 254.298 253.928 -3 + vertex 254.427 253.763 0 + vertex 254.427 253.763 -3 + endloop + endfacet + facet normal 0.787807 0.615922 -0 + outer loop + vertex 254.298 253.928 -3 + vertex 254.298 253.928 0 + vertex 254.427 253.763 0 + endloop + endfacet + facet normal 0.744242 0.66791 0 + outer loop + vertex 254.158 254.084 -3 + vertex 254.298 253.928 0 + vertex 254.298 253.928 -3 + endloop + endfacet + facet normal 0.744242 0.66791 -0 + outer loop + vertex 254.158 254.084 -3 + vertex 254.158 254.084 0 + vertex 254.298 253.928 0 + endloop + endfacet + facet normal 0.692631 0.721292 0 + outer loop + vertex 254.007 254.229 -3 + vertex 254.158 254.084 0 + vertex 254.158 254.084 -3 + endloop + endfacet + facet normal 0.692631 0.721292 -0 + outer loop + vertex 254.007 254.229 -3 + vertex 254.007 254.229 0 + vertex 254.158 254.084 0 + endloop + endfacet + facet normal 0.644871 0.764291 0 + outer loop + vertex 253.847 254.364 -3 + vertex 254.007 254.229 0 + vertex 254.007 254.229 -3 + endloop + endfacet + facet normal 0.644871 0.764291 -0 + outer loop + vertex 253.847 254.364 -3 + vertex 253.847 254.364 0 + vertex 254.007 254.229 0 + endloop + endfacet + facet normal 0.588456 0.808529 0 + outer loop + vertex 253.678 254.487 -3 + vertex 253.847 254.364 0 + vertex 253.847 254.364 -3 + endloop + endfacet + facet normal 0.588456 0.808529 -0 + outer loop + vertex 253.678 254.487 -3 + vertex 253.678 254.487 0 + vertex 253.847 254.364 0 + endloop + endfacet + facet normal 0.529142 0.848533 0 + outer loop + vertex 253.5 254.598 -3 + vertex 253.678 254.487 0 + vertex 253.678 254.487 -3 + endloop + endfacet + facet normal 0.529142 0.848533 -0 + outer loop + vertex 253.5 254.598 -3 + vertex 253.5 254.598 0 + vertex 253.678 254.487 0 + endloop + endfacet + facet normal 0.468107 0.883672 0 + outer loop + vertex 253.315 254.696 -3 + vertex 253.5 254.598 0 + vertex 253.5 254.598 -3 + endloop + endfacet + facet normal 0.468107 0.883672 -0 + outer loop + vertex 253.315 254.696 -3 + vertex 253.315 254.696 0 + vertex 253.5 254.598 0 + endloop + endfacet + facet normal 0.410563 0.911832 0 + outer loop + vertex 253.124 254.782 -3 + vertex 253.315 254.696 0 + vertex 253.315 254.696 -3 + endloop + endfacet + facet normal 0.410563 0.911832 -0 + outer loop + vertex 253.124 254.782 -3 + vertex 253.124 254.782 0 + vertex 253.315 254.696 0 + endloop + endfacet + facet normal 0.339058 0.940766 0 + outer loop + vertex 252.927 254.853 -3 + vertex 253.124 254.782 0 + vertex 253.124 254.782 -3 + endloop + endfacet + facet normal 0.339058 0.940766 -0 + outer loop + vertex 252.927 254.853 -3 + vertex 252.927 254.853 0 + vertex 253.124 254.782 0 + endloop + endfacet + facet normal 0.277246 0.960799 0 + outer loop + vertex 252.726 254.911 -3 + vertex 252.927 254.853 0 + vertex 252.927 254.853 -3 + endloop + endfacet + facet normal 0.277246 0.960799 -0 + outer loop + vertex 252.726 254.911 -3 + vertex 252.726 254.911 0 + vertex 252.927 254.853 0 + endloop + endfacet + facet normal 0.205289 0.978701 0 + outer loop + vertex 252.521 254.954 -3 + vertex 252.726 254.911 0 + vertex 252.726 254.911 -3 + endloop + endfacet + facet normal 0.205289 0.978701 -0 + outer loop + vertex 252.521 254.954 -3 + vertex 252.521 254.954 0 + vertex 252.726 254.911 0 + endloop + endfacet + facet normal 0.143429 0.989661 0 + outer loop + vertex 252.314 254.984 -3 + vertex 252.521 254.954 0 + vertex 252.521 254.954 -3 + endloop + endfacet + facet normal 0.143429 0.989661 -0 + outer loop + vertex 252.314 254.984 -3 + vertex 252.314 254.984 0 + vertex 252.521 254.954 0 + endloop + endfacet + facet normal 0.0668359 0.997764 0 + outer loop + vertex 252.105 254.998 -3 + vertex 252.314 254.984 0 + vertex 252.314 254.984 -3 + endloop + endfacet + facet normal 0.0668359 0.997764 -0 + outer loop + vertex 252.105 254.998 -3 + vertex 252.105 254.998 0 + vertex 252.314 254.984 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 252.002 254.998 -3 + vertex 252.105 254.998 0 + vertex 252.105 254.998 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 252.002 254.998 -3 + vertex 252.002 254.998 0 + vertex 252.105 254.998 0 + endloop + endfacet + facet normal 0.707107 0.707107 0 + outer loop + vertex 252 255 -3 + vertex 252.002 254.998 0 + vertex 252.002 254.998 -3 + endloop + endfacet + facet normal 0.707107 0.707107 -0 + outer loop + vertex 252 255 -3 + vertex 252 255 0 + vertex 252.002 254.998 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -252 255 -3 + vertex 252 255 0 + vertex 252 255 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -252 255 -3 + vertex -252 255 0 + vertex 252 255 0 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -252.002 254.998 -3 + vertex -252 255 0 + vertex -252 255 -3 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -252.002 254.998 -3 + vertex -252.002 254.998 0 + vertex -252 255 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -252.105 254.998 -3 + vertex -252.002 254.998 0 + vertex -252.002 254.998 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -252.105 254.998 -3 + vertex -252.105 254.998 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -252.314 254.984 -3 + vertex -252.105 254.998 0 + vertex -252.105 254.998 -3 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -252.314 254.984 -3 + vertex -252.314 254.984 0 + vertex -252.105 254.998 0 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -252.521 254.954 -3 + vertex -252.314 254.984 0 + vertex -252.314 254.984 -3 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -252.521 254.954 -3 + vertex -252.521 254.954 0 + vertex -252.314 254.984 0 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -252.726 254.911 -3 + vertex -252.521 254.954 0 + vertex -252.521 254.954 -3 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -252.726 254.911 -3 + vertex -252.726 254.911 0 + vertex -252.521 254.954 0 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -252.927 254.853 -3 + vertex -252.726 254.911 0 + vertex -252.726 254.911 -3 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -252.927 254.853 -3 + vertex -252.927 254.853 0 + vertex -252.726 254.911 0 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -253.124 254.782 -3 + vertex -252.927 254.853 0 + vertex -252.927 254.853 -3 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -253.124 254.782 -3 + vertex -253.124 254.782 0 + vertex -252.927 254.853 0 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -253.315 254.696 -3 + vertex -253.124 254.782 0 + vertex -253.124 254.782 -3 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -253.315 254.696 -3 + vertex -253.315 254.696 0 + vertex -253.124 254.782 0 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -253.5 254.598 -3 + vertex -253.315 254.696 0 + vertex -253.315 254.696 -3 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -253.5 254.598 -3 + vertex -253.5 254.598 0 + vertex -253.315 254.696 0 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -253.678 254.487 -3 + vertex -253.5 254.598 0 + vertex -253.5 254.598 -3 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -253.678 254.487 -3 + vertex -253.678 254.487 0 + vertex -253.5 254.598 0 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -253.847 254.364 -3 + vertex -253.678 254.487 0 + vertex -253.678 254.487 -3 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -253.847 254.364 -3 + vertex -253.847 254.364 0 + vertex -253.678 254.487 0 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -254.007 254.229 -3 + vertex -253.847 254.364 0 + vertex -253.847 254.364 -3 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -254.007 254.229 -3 + vertex -254.007 254.229 0 + vertex -253.847 254.364 0 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -254.158 254.084 -3 + vertex -254.007 254.229 0 + vertex -254.007 254.229 -3 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -254.158 254.084 -3 + vertex -254.158 254.084 0 + vertex -254.007 254.229 0 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -254.298 253.928 -3 + vertex -254.158 254.084 0 + vertex -254.158 254.084 -3 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -254.298 253.928 -3 + vertex -254.298 253.928 0 + vertex -254.158 254.084 0 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -254.427 253.763 -3 + vertex -254.298 253.928 0 + vertex -254.298 253.928 -3 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -254.427 253.763 -3 + vertex -254.427 253.763 0 + vertex -254.298 253.928 0 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -254.544 253.59 -3 + vertex -254.427 253.763 0 + vertex -254.427 253.763 -3 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -254.544 253.59 -3 + vertex -254.544 253.59 0 + vertex -254.427 253.763 0 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -254.649 253.408 -3 + vertex -254.544 253.59 0 + vertex -254.544 253.59 -3 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -254.649 253.408 -3 + vertex -254.649 253.408 0 + vertex -254.544 253.59 0 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -254.741 253.22 -3 + vertex -254.649 253.408 0 + vertex -254.649 253.408 -3 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -254.741 253.22 -3 + vertex -254.741 253.22 0 + vertex -254.649 253.408 0 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -254.819 253.026 -3 + vertex -254.741 253.22 0 + vertex -254.741 253.22 -3 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -254.819 253.026 -3 + vertex -254.819 253.026 0 + vertex -254.741 253.22 0 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -254.884 252.827 -3 + vertex -254.819 253.026 0 + vertex -254.819 253.026 -3 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -254.884 252.827 -3 + vertex -254.884 252.827 0 + vertex -254.819 253.026 0 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -254.934 252.624 -3 + vertex -254.884 252.827 0 + vertex -254.884 252.827 -3 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -254.934 252.624 -3 + vertex -254.934 252.624 0 + vertex -254.884 252.827 0 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -254.971 252.418 -3 + vertex -254.934 252.624 0 + vertex -254.934 252.624 -3 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -254.971 252.418 -3 + vertex -254.971 252.418 0 + vertex -254.934 252.624 0 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -254.993 252.209 -3 + vertex -254.971 252.418 0 + vertex -254.971 252.418 -3 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -254.993 252.209 -3 + vertex -254.993 252.209 0 + vertex -254.971 252.418 0 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -255 252 -3 + vertex -254.993 252.209 0 + vertex -254.993 252.209 -3 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -255 252 -3 + vertex -255 252 0 + vertex -254.993 252.209 0 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -255 -252 -3 + vertex -255 252 0 + vertex -255 252 -3 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -255 -252 -3 + vertex -255 -252 0 + vertex -255 252 0 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -254.993 -252.209 -3 + vertex -255 -252 0 + vertex -255 -252 -3 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -254.993 -252.209 -3 + vertex -254.993 -252.209 0 + vertex -255 -252 0 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -254.971 -252.418 -3 + vertex -254.993 -252.209 0 + vertex -254.993 -252.209 -3 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -254.971 -252.418 -3 + vertex -254.971 -252.418 0 + vertex -254.993 -252.209 0 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -254.934 -252.624 -3 + vertex -254.971 -252.418 0 + vertex -254.971 -252.418 -3 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -254.934 -252.624 -3 + vertex -254.934 -252.624 0 + vertex -254.971 -252.418 0 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -254.884 -252.827 -3 + vertex -254.934 -252.624 0 + vertex -254.934 -252.624 -3 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -254.884 -252.827 -3 + vertex -254.884 -252.827 0 + vertex -254.934 -252.624 0 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -254.819 -253.026 -3 + vertex -254.884 -252.827 0 + vertex -254.884 -252.827 -3 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -254.819 -253.026 -3 + vertex -254.819 -253.026 0 + vertex -254.884 -252.827 0 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -254.741 -253.22 -3 + vertex -254.819 -253.026 0 + vertex -254.819 -253.026 -3 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -254.741 -253.22 -3 + vertex -254.741 -253.22 0 + vertex -254.819 -253.026 0 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -254.649 -253.408 -3 + vertex -254.741 -253.22 0 + vertex -254.741 -253.22 -3 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -254.649 -253.408 -3 + vertex -254.649 -253.408 0 + vertex -254.741 -253.22 0 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -254.544 -253.59 -3 + vertex -254.649 -253.408 0 + vertex -254.649 -253.408 -3 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -254.544 -253.59 -3 + vertex -254.544 -253.59 0 + vertex -254.649 -253.408 0 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -254.427 -253.763 -3 + vertex -254.544 -253.59 0 + vertex -254.544 -253.59 -3 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -254.427 -253.763 -3 + vertex -254.427 -253.763 0 + vertex -254.544 -253.59 0 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -254.298 -253.928 -3 + vertex -254.427 -253.763 0 + vertex -254.427 -253.763 -3 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -254.298 -253.928 -3 + vertex -254.298 -253.928 0 + vertex -254.427 -253.763 0 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -254.158 -254.084 -3 + vertex -254.298 -253.928 0 + vertex -254.298 -253.928 -3 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -254.158 -254.084 -3 + vertex -254.158 -254.084 0 + vertex -254.298 -253.928 0 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -254.007 -254.229 -3 + vertex -254.158 -254.084 0 + vertex -254.158 -254.084 -3 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -254.007 -254.229 -3 + vertex -254.007 -254.229 0 + vertex -254.158 -254.084 0 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -253.847 -254.364 -3 + vertex -254.007 -254.229 0 + vertex -254.007 -254.229 -3 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -253.847 -254.364 -3 + vertex -253.847 -254.364 0 + vertex -254.007 -254.229 0 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -253.678 -254.487 -3 + vertex -253.847 -254.364 0 + vertex -253.847 -254.364 -3 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -253.678 -254.487 -3 + vertex -253.678 -254.487 0 + vertex -253.847 -254.364 0 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -253.5 -254.598 -3 + vertex -253.678 -254.487 0 + vertex -253.678 -254.487 -3 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -253.5 -254.598 -3 + vertex -253.5 -254.598 0 + vertex -253.678 -254.487 0 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -253.315 -254.696 -3 + vertex -253.5 -254.598 0 + vertex -253.5 -254.598 -3 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -253.315 -254.696 -3 + vertex -253.315 -254.696 0 + vertex -253.5 -254.598 0 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -253.124 -254.782 -3 + vertex -253.315 -254.696 0 + vertex -253.315 -254.696 -3 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -253.124 -254.782 -3 + vertex -253.124 -254.782 0 + vertex -253.315 -254.696 0 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -252.927 -254.853 -3 + vertex -253.124 -254.782 0 + vertex -253.124 -254.782 -3 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -252.927 -254.853 -3 + vertex -252.927 -254.853 0 + vertex -253.124 -254.782 0 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -252.726 -254.911 -3 + vertex -252.927 -254.853 0 + vertex -252.927 -254.853 -3 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -252.726 -254.911 -3 + vertex -252.726 -254.911 0 + vertex -252.927 -254.853 0 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -252.521 -254.954 -3 + vertex -252.726 -254.911 0 + vertex -252.726 -254.911 -3 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -252.521 -254.954 -3 + vertex -252.521 -254.954 0 + vertex -252.726 -254.911 0 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -252.314 -254.984 -3 + vertex -252.521 -254.954 0 + vertex -252.521 -254.954 -3 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -252.314 -254.984 -3 + vertex -252.314 -254.984 0 + vertex -252.521 -254.954 0 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -252.105 -254.998 -3 + vertex -252.314 -254.984 0 + vertex -252.314 -254.984 -3 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -252.105 -254.998 -3 + vertex -252.105 -254.998 0 + vertex -252.314 -254.984 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -252.002 -254.998 -3 + vertex -252.105 -254.998 0 + vertex -252.105 -254.998 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -252.002 -254.998 -3 + vertex -252.002 -254.998 0 + vertex -252.105 -254.998 0 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -252 -255 -3 + vertex -252.002 -254.998 0 + vertex -252.002 -254.998 -3 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -252 -255 -3 + vertex -252 -255 0 + vertex -252.002 -254.998 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 252 -255 -3 + vertex -252 -255 0 + vertex -252 -255 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 252 -255 -3 + vertex 252 -255 0 + vertex -252 -255 0 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 252.002 -254.998 -3 + vertex 252 -255 0 + vertex 252 -255 -3 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 252.002 -254.998 -3 + vertex 252.002 -254.998 0 + vertex 252 -255 0 + endloop + endfacet +endsolid OpenSCAD_Model diff --git a/resources/profiles/Creality/cr10v2_bed.stl b/resources/profiles/Creality/cr10v2_bed.stl new file mode 100644 index 000000000..004e0b114 --- /dev/null +++ b/resources/profiles/Creality/cr10v2_bed.stl @@ -0,0 +1,2774 @@ +solid OpenSCAD_Model + facet normal 0 0 -1 + outer loop + vertex 152.105 -159.998 -3 + vertex 152.002 -159.998 -3 + vertex 152.314 -159.984 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.314 -159.984 -3 + vertex 152.002 -159.998 -3 + vertex 152.521 -159.954 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex 152.002 159.998 -3 + vertex -155 157 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.521 -159.954 -3 + vertex 152.002 -159.998 -3 + vertex 152.726 -159.911 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.726 -159.911 -3 + vertex 152.002 -159.998 -3 + vertex 152.927 -159.853 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.927 -159.853 -3 + vertex 152.002 -159.998 -3 + vertex 153.124 -159.782 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 153.124 -159.782 -3 + vertex 152.002 -159.998 -3 + vertex 153.315 -159.696 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 153.315 -159.696 -3 + vertex 152.002 -159.998 -3 + vertex 153.5 -159.598 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 153.5 -159.598 -3 + vertex 152.002 -159.998 -3 + vertex 153.678 -159.487 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 153.678 -159.487 -3 + vertex 152.002 -159.998 -3 + vertex 153.847 -159.364 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 153.847 -159.364 -3 + vertex 152.002 -159.998 -3 + vertex 154.007 -159.229 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.007 -159.229 -3 + vertex 152.002 -159.998 -3 + vertex 154.158 -159.084 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.158 -159.084 -3 + vertex 152.002 -159.998 -3 + vertex 154.298 -158.928 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.298 -158.928 -3 + vertex 152.002 -159.998 -3 + vertex 154.427 -158.763 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.427 -158.763 -3 + vertex 152.002 -159.998 -3 + vertex 154.544 -158.59 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.544 -158.59 -3 + vertex 152.002 -159.998 -3 + vertex 154.649 -158.408 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.649 -158.408 -3 + vertex 152.002 -159.998 -3 + vertex 154.741 -158.22 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.741 -158.22 -3 + vertex 152.002 -159.998 -3 + vertex 154.819 -158.026 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.819 -158.026 -3 + vertex 152.002 -159.998 -3 + vertex 154.884 -157.827 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.884 -157.827 -3 + vertex 152.002 -159.998 -3 + vertex 154.934 -157.624 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.934 -157.624 -3 + vertex 152.002 -159.998 -3 + vertex 154.971 -157.418 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.971 -157.418 -3 + vertex 152.002 -159.998 -3 + vertex 154.993 -157.209 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.993 -157.209 -3 + vertex 152.002 -159.998 -3 + vertex 155 -157 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex 152 160 -3 + vertex 152.002 159.998 -3 + vertex -152.002 159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 159.998 -3 + vertex 154.971 157.418 -3 + vertex 154.993 157.209 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 154.884 157.827 -3 + vertex 154.934 157.624 -3 + vertex 152.002 159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 154.741 158.22 -3 + vertex 152.002 159.998 -3 + vertex 154.649 158.408 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 154.741 158.22 -3 + vertex 154.819 158.026 -3 + vertex 152.002 159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 159.998 -3 + vertex 154.007 159.229 -3 + vertex 154.158 159.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 154.427 158.763 -3 + vertex 152.002 159.998 -3 + vertex 154.298 158.928 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 154.427 158.763 -3 + vertex 154.544 158.59 -3 + vertex 152.002 159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 154.298 158.928 -3 + vertex 152.002 159.998 -3 + vertex 154.158 159.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 159.998 -3 + vertex 152.927 159.853 -3 + vertex 153.124 159.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 153.847 159.364 -3 + vertex 152.002 159.998 -3 + vertex 153.678 159.487 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 153.847 159.364 -3 + vertex 154.007 159.229 -3 + vertex 152.002 159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 153.678 159.487 -3 + vertex 152.002 159.998 -3 + vertex 153.5 159.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 153.5 159.598 -3 + vertex 152.002 159.998 -3 + vertex 153.315 159.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 153.315 159.696 -3 + vertex 152.002 159.998 -3 + vertex 153.124 159.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 154.649 158.408 -3 + vertex 152.002 159.998 -3 + vertex 154.544 158.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.726 159.911 -3 + vertex 152.002 159.998 -3 + vertex 152.521 159.954 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 152.726 159.911 -3 + vertex 152.927 159.853 -3 + vertex 152.002 159.998 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 154.819 158.026 -3 + vertex 154.884 157.827 -3 + vertex 152.002 159.998 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 152.314 159.984 -3 + vertex 152.521 159.954 -3 + vertex 152.002 159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 159.998 -3 + vertex 154.934 157.624 -3 + vertex 154.971 157.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 159.998 -3 + vertex 152.105 159.998 -3 + vertex 152.314 159.984 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 155 157 -3 + vertex 152.002 159.998 -3 + vertex 154.993 157.209 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex -152 160 -3 + vertex 152 160 -3 + vertex -152.002 159.998 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex 152.002 159.998 -3 + vertex 155 157 -3 + vertex -155 157 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -155 157 -3 + vertex 155 157 -3 + vertex 155 -157 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -155 157 -3 + vertex -154.993 157.209 -3 + vertex -152.002 159.998 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -152.314 159.984 -3 + vertex -152.105 159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -152.521 159.954 -3 + vertex -152.314 159.984 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -152.726 159.911 -3 + vertex -152.521 159.954 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -152.927 159.853 -3 + vertex -152.726 159.911 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -153.124 159.782 -3 + vertex -152.927 159.853 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -153.315 159.696 -3 + vertex -153.124 159.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -153.5 159.598 -3 + vertex -153.315 159.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -153.678 159.487 -3 + vertex -153.5 159.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -153.847 159.364 -3 + vertex -153.678 159.487 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -154.007 159.229 -3 + vertex -153.847 159.364 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -154.158 159.084 -3 + vertex -154.007 159.229 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -154.298 158.928 -3 + vertex -154.158 159.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -154.427 158.763 -3 + vertex -154.298 158.928 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -154.544 158.59 -3 + vertex -154.427 158.763 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -154.649 158.408 -3 + vertex -154.544 158.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -154.741 158.22 -3 + vertex -154.649 158.408 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -154.819 158.026 -3 + vertex -154.741 158.22 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -154.884 157.827 -3 + vertex -154.819 158.026 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -154.934 157.624 -3 + vertex -154.884 157.827 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -154.971 157.418 -3 + vertex -154.934 157.624 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -154.993 157.209 -3 + vertex -154.971 157.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -155 -157 -3 + vertex -155 157 -3 + vertex 155 -157 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 -159.998 -3 + vertex -155 -157 -3 + vertex 155 -157 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 -159.998 -3 + vertex -152.002 -159.998 -3 + vertex -155 -157 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -159.998 -3 + vertex -154.971 -157.418 -3 + vertex -154.993 -157.209 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.884 -157.827 -3 + vertex -154.934 -157.624 -3 + vertex -152.002 -159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.741 -158.22 -3 + vertex -152.002 -159.998 -3 + vertex -154.649 -158.408 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.741 -158.22 -3 + vertex -154.819 -158.026 -3 + vertex -152.002 -159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -159.998 -3 + vertex -154.007 -159.229 -3 + vertex -154.158 -159.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.427 -158.763 -3 + vertex -152.002 -159.998 -3 + vertex -154.298 -158.928 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.427 -158.763 -3 + vertex -154.544 -158.59 -3 + vertex -152.002 -159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.298 -158.928 -3 + vertex -152.002 -159.998 -3 + vertex -154.158 -159.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -159.998 -3 + vertex -152.927 -159.853 -3 + vertex -153.124 -159.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -153.847 -159.364 -3 + vertex -152.002 -159.998 -3 + vertex -153.678 -159.487 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -153.847 -159.364 -3 + vertex -154.007 -159.229 -3 + vertex -152.002 -159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -153.678 -159.487 -3 + vertex -152.002 -159.998 -3 + vertex -153.5 -159.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -153.5 -159.598 -3 + vertex -152.002 -159.998 -3 + vertex -153.315 -159.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -153.315 -159.696 -3 + vertex -152.002 -159.998 -3 + vertex -153.124 -159.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.649 -158.408 -3 + vertex -152.002 -159.998 -3 + vertex -154.544 -158.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.726 -159.911 -3 + vertex -152.002 -159.998 -3 + vertex -152.521 -159.954 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.726 -159.911 -3 + vertex -152.927 -159.853 -3 + vertex -152.002 -159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.819 -158.026 -3 + vertex -154.884 -157.827 -3 + vertex -152.002 -159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.314 -159.984 -3 + vertex -152.521 -159.954 -3 + vertex -152.002 -159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -159.998 -3 + vertex -154.934 -157.624 -3 + vertex -154.971 -157.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -159.998 -3 + vertex -152.105 -159.998 -3 + vertex -152.314 -159.984 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.002 -159.998 -3 + vertex 152 -160 -3 + vertex -152.002 -159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -159.998 -3 + vertex 152 -160 -3 + vertex -152 -160 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -155 -157 -3 + vertex -152.002 -159.998 -3 + vertex -154.993 -157.209 -3 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.314 -159.984 0 + vertex 152.002 -159.998 0 + vertex 152.105 -159.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.521 -159.954 0 + vertex 152.002 -159.998 0 + vertex 152.314 -159.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -155 157 0 + vertex 152.002 159.998 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.726 -159.911 0 + vertex 152.002 -159.998 0 + vertex 152.521 -159.954 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.927 -159.853 0 + vertex 152.002 -159.998 0 + vertex 152.726 -159.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.124 -159.782 0 + vertex 152.002 -159.998 0 + vertex 152.927 -159.853 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.315 -159.696 0 + vertex 152.002 -159.998 0 + vertex 153.124 -159.782 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.5 -159.598 0 + vertex 152.002 -159.998 0 + vertex 153.315 -159.696 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.678 -159.487 0 + vertex 152.002 -159.998 0 + vertex 153.5 -159.598 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.847 -159.364 0 + vertex 152.002 -159.998 0 + vertex 153.678 -159.487 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.007 -159.229 0 + vertex 152.002 -159.998 0 + vertex 153.847 -159.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.158 -159.084 0 + vertex 152.002 -159.998 0 + vertex 154.007 -159.229 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.298 -158.928 0 + vertex 152.002 -159.998 0 + vertex 154.158 -159.084 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.427 -158.763 0 + vertex 152.002 -159.998 0 + vertex 154.298 -158.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.544 -158.59 0 + vertex 152.002 -159.998 0 + vertex 154.427 -158.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.649 -158.408 0 + vertex 152.002 -159.998 0 + vertex 154.544 -158.59 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.741 -158.22 0 + vertex 152.002 -159.998 0 + vertex 154.649 -158.408 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.819 -158.026 0 + vertex 152.002 -159.998 0 + vertex 154.741 -158.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.884 -157.827 0 + vertex 152.002 -159.998 0 + vertex 154.819 -158.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.934 -157.624 0 + vertex 152.002 -159.998 0 + vertex 154.884 -157.827 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.971 -157.418 0 + vertex 152.002 -159.998 0 + vertex 154.934 -157.624 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.993 -157.209 0 + vertex 152.002 -159.998 0 + vertex 154.971 -157.418 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 155 -157 0 + vertex 152.002 -159.998 0 + vertex 154.993 -157.209 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 159.998 0 + vertex 152.002 159.998 0 + vertex 152 160 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.993 157.209 0 + vertex 154.971 157.418 0 + vertex 152.002 159.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 159.998 0 + vertex 154.934 157.624 0 + vertex 154.884 157.827 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.649 158.408 0 + vertex 152.002 159.998 0 + vertex 154.741 158.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 159.998 0 + vertex 154.819 158.026 0 + vertex 154.741 158.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.158 159.084 0 + vertex 154.007 159.229 0 + vertex 152.002 159.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.298 158.928 0 + vertex 152.002 159.998 0 + vertex 154.427 158.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 159.998 0 + vertex 154.544 158.59 0 + vertex 154.427 158.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.158 159.084 0 + vertex 152.002 159.998 0 + vertex 154.298 158.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.124 159.782 0 + vertex 152.927 159.853 0 + vertex 152.002 159.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.678 159.487 0 + vertex 152.002 159.998 0 + vertex 153.847 159.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 159.998 0 + vertex 154.007 159.229 0 + vertex 153.847 159.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.5 159.598 0 + vertex 152.002 159.998 0 + vertex 153.678 159.487 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.315 159.696 0 + vertex 152.002 159.998 0 + vertex 153.5 159.598 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.124 159.782 0 + vertex 152.002 159.998 0 + vertex 153.315 159.696 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.544 158.59 0 + vertex 152.002 159.998 0 + vertex 154.649 158.408 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.521 159.954 0 + vertex 152.002 159.998 0 + vertex 152.726 159.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 159.998 0 + vertex 152.927 159.853 0 + vertex 152.726 159.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 159.998 0 + vertex 154.884 157.827 0 + vertex 154.819 158.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 159.998 0 + vertex 152.521 159.954 0 + vertex 152.314 159.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.971 157.418 0 + vertex 154.934 157.624 0 + vertex 152.002 159.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.314 159.984 0 + vertex 152.105 159.998 0 + vertex 152.002 159.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.993 157.209 0 + vertex 152.002 159.998 0 + vertex 155 157 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 159.998 0 + vertex 152 160 0 + vertex -152 160 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -155 157 0 + vertex 155 157 0 + vertex 152.002 159.998 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex 155 -157 0 + vertex 155 157 0 + vertex -155 157 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 159.998 0 + vertex -154.993 157.209 0 + vertex -155 157 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.105 159.998 0 + vertex -152.314 159.984 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.314 159.984 0 + vertex -152.521 159.954 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.521 159.954 0 + vertex -152.726 159.911 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.726 159.911 0 + vertex -152.927 159.853 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.927 159.853 0 + vertex -153.124 159.782 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -153.124 159.782 0 + vertex -153.315 159.696 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -153.315 159.696 0 + vertex -153.5 159.598 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -153.5 159.598 0 + vertex -153.678 159.487 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -153.678 159.487 0 + vertex -153.847 159.364 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -153.847 159.364 0 + vertex -154.007 159.229 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.007 159.229 0 + vertex -154.158 159.084 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.158 159.084 0 + vertex -154.298 158.928 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.298 158.928 0 + vertex -154.427 158.763 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.427 158.763 0 + vertex -154.544 158.59 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.544 158.59 0 + vertex -154.649 158.408 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.649 158.408 0 + vertex -154.741 158.22 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.741 158.22 0 + vertex -154.819 158.026 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.819 158.026 0 + vertex -154.884 157.827 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.884 157.827 0 + vertex -154.934 157.624 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.934 157.624 0 + vertex -154.971 157.418 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.971 157.418 0 + vertex -154.993 157.209 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 155 -157 0 + vertex -155 157 0 + vertex -155 -157 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 155 -157 0 + vertex -155 -157 0 + vertex 152.002 -159.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -155 -157 0 + vertex -152.002 -159.998 0 + vertex 152.002 -159.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -154.993 -157.209 0 + vertex -154.971 -157.418 0 + vertex -152.002 -159.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -159.998 0 + vertex -154.934 -157.624 0 + vertex -154.884 -157.827 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -154.649 -158.408 0 + vertex -152.002 -159.998 0 + vertex -154.741 -158.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -159.998 0 + vertex -154.819 -158.026 0 + vertex -154.741 -158.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -154.158 -159.084 0 + vertex -154.007 -159.229 0 + vertex -152.002 -159.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -154.298 -158.928 0 + vertex -152.002 -159.998 0 + vertex -154.427 -158.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -159.998 0 + vertex -154.544 -158.59 0 + vertex -154.427 -158.763 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -154.158 -159.084 0 + vertex -152.002 -159.998 0 + vertex -154.298 -158.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -153.124 -159.782 0 + vertex -152.927 -159.853 0 + vertex -152.002 -159.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -153.678 -159.487 0 + vertex -152.002 -159.998 0 + vertex -153.847 -159.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -159.998 0 + vertex -154.007 -159.229 0 + vertex -153.847 -159.364 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -153.5 -159.598 0 + vertex -152.002 -159.998 0 + vertex -153.678 -159.487 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -153.315 -159.696 0 + vertex -152.002 -159.998 0 + vertex -153.5 -159.598 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -153.124 -159.782 0 + vertex -152.002 -159.998 0 + vertex -153.315 -159.696 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -154.544 -158.59 0 + vertex -152.002 -159.998 0 + vertex -154.649 -158.408 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -152.521 -159.954 0 + vertex -152.002 -159.998 0 + vertex -152.726 -159.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -159.998 0 + vertex -152.927 -159.853 0 + vertex -152.726 -159.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -159.998 0 + vertex -154.884 -157.827 0 + vertex -154.819 -158.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -159.998 0 + vertex -152.521 -159.954 0 + vertex -152.314 -159.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -154.971 -157.418 0 + vertex -154.934 -157.624 0 + vertex -152.002 -159.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.314 -159.984 0 + vertex -152.105 -159.998 0 + vertex -152.002 -159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.002 -159.998 0 + vertex 152 -160 0 + vertex 152.002 -159.998 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex -152 -160 0 + vertex 152 -160 0 + vertex -152.002 -159.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -154.993 -157.209 0 + vertex -152.002 -159.998 0 + vertex -155 -157 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 152.105 -159.998 -3 + vertex 152.002 -159.998 0 + vertex 152.002 -159.998 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 152.105 -159.998 -3 + vertex 152.105 -159.998 0 + vertex 152.002 -159.998 0 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 152.314 -159.984 -3 + vertex 152.105 -159.998 0 + vertex 152.105 -159.998 -3 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 152.314 -159.984 -3 + vertex 152.314 -159.984 0 + vertex 152.105 -159.998 0 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 152.521 -159.954 -3 + vertex 152.314 -159.984 0 + vertex 152.314 -159.984 -3 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 152.521 -159.954 -3 + vertex 152.521 -159.954 0 + vertex 152.314 -159.984 0 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 152.726 -159.911 -3 + vertex 152.521 -159.954 0 + vertex 152.521 -159.954 -3 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 152.726 -159.911 -3 + vertex 152.726 -159.911 0 + vertex 152.521 -159.954 0 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 152.927 -159.853 -3 + vertex 152.726 -159.911 0 + vertex 152.726 -159.911 -3 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 152.927 -159.853 -3 + vertex 152.927 -159.853 0 + vertex 152.726 -159.911 0 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 153.124 -159.782 -3 + vertex 152.927 -159.853 0 + vertex 152.927 -159.853 -3 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 153.124 -159.782 -3 + vertex 153.124 -159.782 0 + vertex 152.927 -159.853 0 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 153.315 -159.696 -3 + vertex 153.124 -159.782 0 + vertex 153.124 -159.782 -3 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 153.315 -159.696 -3 + vertex 153.315 -159.696 0 + vertex 153.124 -159.782 0 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 153.5 -159.598 -3 + vertex 153.315 -159.696 0 + vertex 153.315 -159.696 -3 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 153.5 -159.598 -3 + vertex 153.5 -159.598 0 + vertex 153.315 -159.696 0 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 153.678 -159.487 -3 + vertex 153.5 -159.598 0 + vertex 153.5 -159.598 -3 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 153.678 -159.487 -3 + vertex 153.678 -159.487 0 + vertex 153.5 -159.598 0 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 153.847 -159.364 -3 + vertex 153.678 -159.487 0 + vertex 153.678 -159.487 -3 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 153.847 -159.364 -3 + vertex 153.847 -159.364 0 + vertex 153.678 -159.487 0 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 154.007 -159.229 -3 + vertex 153.847 -159.364 0 + vertex 153.847 -159.364 -3 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 154.007 -159.229 -3 + vertex 154.007 -159.229 0 + vertex 153.847 -159.364 0 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 154.158 -159.084 -3 + vertex 154.007 -159.229 0 + vertex 154.007 -159.229 -3 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 154.158 -159.084 -3 + vertex 154.158 -159.084 0 + vertex 154.007 -159.229 0 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 154.298 -158.928 -3 + vertex 154.158 -159.084 0 + vertex 154.158 -159.084 -3 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 154.298 -158.928 -3 + vertex 154.298 -158.928 0 + vertex 154.158 -159.084 0 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 154.427 -158.763 -3 + vertex 154.298 -158.928 0 + vertex 154.298 -158.928 -3 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 154.427 -158.763 -3 + vertex 154.427 -158.763 0 + vertex 154.298 -158.928 0 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 154.544 -158.59 -3 + vertex 154.427 -158.763 0 + vertex 154.427 -158.763 -3 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 154.544 -158.59 -3 + vertex 154.544 -158.59 0 + vertex 154.427 -158.763 0 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 154.649 -158.408 -3 + vertex 154.544 -158.59 0 + vertex 154.544 -158.59 -3 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 154.649 -158.408 -3 + vertex 154.649 -158.408 0 + vertex 154.544 -158.59 0 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 154.741 -158.22 -3 + vertex 154.649 -158.408 0 + vertex 154.649 -158.408 -3 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 154.741 -158.22 -3 + vertex 154.741 -158.22 0 + vertex 154.649 -158.408 0 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 154.819 -158.026 -3 + vertex 154.741 -158.22 0 + vertex 154.741 -158.22 -3 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 154.819 -158.026 -3 + vertex 154.819 -158.026 0 + vertex 154.741 -158.22 0 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 154.884 -157.827 -3 + vertex 154.819 -158.026 0 + vertex 154.819 -158.026 -3 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 154.884 -157.827 -3 + vertex 154.884 -157.827 0 + vertex 154.819 -158.026 0 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 154.934 -157.624 -3 + vertex 154.884 -157.827 0 + vertex 154.884 -157.827 -3 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 154.934 -157.624 -3 + vertex 154.934 -157.624 0 + vertex 154.884 -157.827 0 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 154.971 -157.418 -3 + vertex 154.934 -157.624 0 + vertex 154.934 -157.624 -3 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 154.971 -157.418 -3 + vertex 154.971 -157.418 0 + vertex 154.934 -157.624 0 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 154.993 -157.209 -3 + vertex 154.971 -157.418 0 + vertex 154.971 -157.418 -3 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 154.993 -157.209 -3 + vertex 154.993 -157.209 0 + vertex 154.971 -157.418 0 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 155 -157 -3 + vertex 154.993 -157.209 0 + vertex 154.993 -157.209 -3 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 155 -157 -3 + vertex 155 -157 0 + vertex 154.993 -157.209 0 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 155 157 -3 + vertex 155 -157 0 + vertex 155 -157 -3 + endloop + endfacet + facet normal 1 0 -0 + outer loop + vertex 155 157 -3 + vertex 155 157 0 + vertex 155 -157 0 + endloop + endfacet + facet normal 0.99944 0.0334741 0 + outer loop + vertex 154.993 157.209 -3 + vertex 155 157 0 + vertex 155 157 -3 + endloop + endfacet + facet normal 0.99944 0.0334741 -0 + outer loop + vertex 154.993 157.209 -3 + vertex 154.993 157.209 0 + vertex 155 157 0 + endloop + endfacet + facet normal 0.994505 0.104685 0 + outer loop + vertex 154.971 157.418 -3 + vertex 154.993 157.209 0 + vertex 154.993 157.209 -3 + endloop + endfacet + facet normal 0.994505 0.104685 -0 + outer loop + vertex 154.971 157.418 -3 + vertex 154.971 157.418 0 + vertex 154.993 157.209 0 + endloop + endfacet + facet normal 0.98425 0.176783 0 + outer loop + vertex 154.934 157.624 -3 + vertex 154.971 157.418 0 + vertex 154.971 157.418 -3 + endloop + endfacet + facet normal 0.98425 0.176783 -0 + outer loop + vertex 154.934 157.624 -3 + vertex 154.934 157.624 0 + vertex 154.971 157.418 0 + endloop + endfacet + facet normal 0.970981 0.239158 0 + outer loop + vertex 154.884 157.827 -3 + vertex 154.934 157.624 0 + vertex 154.934 157.624 -3 + endloop + endfacet + facet normal 0.970981 0.239158 -0 + outer loop + vertex 154.884 157.827 -3 + vertex 154.884 157.827 0 + vertex 154.934 157.624 0 + endloop + endfacet + facet normal 0.950577 0.31049 0 + outer loop + vertex 154.819 158.026 -3 + vertex 154.884 157.827 0 + vertex 154.884 157.827 -3 + endloop + endfacet + facet normal 0.950577 0.31049 -0 + outer loop + vertex 154.819 158.026 -3 + vertex 154.819 158.026 0 + vertex 154.884 157.827 0 + endloop + endfacet + facet normal 0.927816 0.373039 0 + outer loop + vertex 154.741 158.22 -3 + vertex 154.819 158.026 0 + vertex 154.819 158.026 -3 + endloop + endfacet + facet normal 0.927816 0.373039 -0 + outer loop + vertex 154.741 158.22 -3 + vertex 154.741 158.22 0 + vertex 154.819 158.026 0 + endloop + endfacet + facet normal 0.898217 0.439553 0 + outer loop + vertex 154.649 158.408 -3 + vertex 154.741 158.22 0 + vertex 154.741 158.22 -3 + endloop + endfacet + facet normal 0.898217 0.439553 -0 + outer loop + vertex 154.649 158.408 -3 + vertex 154.649 158.408 0 + vertex 154.741 158.22 0 + endloop + endfacet + facet normal 0.866186 0.499722 0 + outer loop + vertex 154.544 158.59 -3 + vertex 154.649 158.408 0 + vertex 154.649 158.408 -3 + endloop + endfacet + facet normal 0.866186 0.499722 -0 + outer loop + vertex 154.544 158.59 -3 + vertex 154.544 158.59 0 + vertex 154.649 158.408 0 + endloop + endfacet + facet normal 0.828349 0.560213 0 + outer loop + vertex 154.427 158.763 -3 + vertex 154.544 158.59 0 + vertex 154.544 158.59 -3 + endloop + endfacet + facet normal 0.828349 0.560213 -0 + outer loop + vertex 154.427 158.763 -3 + vertex 154.427 158.763 0 + vertex 154.544 158.59 0 + endloop + endfacet + facet normal 0.787807 0.615922 0 + outer loop + vertex 154.298 158.928 -3 + vertex 154.427 158.763 0 + vertex 154.427 158.763 -3 + endloop + endfacet + facet normal 0.787807 0.615922 -0 + outer loop + vertex 154.298 158.928 -3 + vertex 154.298 158.928 0 + vertex 154.427 158.763 0 + endloop + endfacet + facet normal 0.744242 0.66791 0 + outer loop + vertex 154.158 159.084 -3 + vertex 154.298 158.928 0 + vertex 154.298 158.928 -3 + endloop + endfacet + facet normal 0.744242 0.66791 -0 + outer loop + vertex 154.158 159.084 -3 + vertex 154.158 159.084 0 + vertex 154.298 158.928 0 + endloop + endfacet + facet normal 0.692631 0.721292 0 + outer loop + vertex 154.007 159.229 -3 + vertex 154.158 159.084 0 + vertex 154.158 159.084 -3 + endloop + endfacet + facet normal 0.692631 0.721292 -0 + outer loop + vertex 154.007 159.229 -3 + vertex 154.007 159.229 0 + vertex 154.158 159.084 0 + endloop + endfacet + facet normal 0.644871 0.764291 0 + outer loop + vertex 153.847 159.364 -3 + vertex 154.007 159.229 0 + vertex 154.007 159.229 -3 + endloop + endfacet + facet normal 0.644871 0.764291 -0 + outer loop + vertex 153.847 159.364 -3 + vertex 153.847 159.364 0 + vertex 154.007 159.229 0 + endloop + endfacet + facet normal 0.588456 0.808529 0 + outer loop + vertex 153.678 159.487 -3 + vertex 153.847 159.364 0 + vertex 153.847 159.364 -3 + endloop + endfacet + facet normal 0.588456 0.808529 -0 + outer loop + vertex 153.678 159.487 -3 + vertex 153.678 159.487 0 + vertex 153.847 159.364 0 + endloop + endfacet + facet normal 0.529142 0.848533 0 + outer loop + vertex 153.5 159.598 -3 + vertex 153.678 159.487 0 + vertex 153.678 159.487 -3 + endloop + endfacet + facet normal 0.529142 0.848533 -0 + outer loop + vertex 153.5 159.598 -3 + vertex 153.5 159.598 0 + vertex 153.678 159.487 0 + endloop + endfacet + facet normal 0.468107 0.883672 0 + outer loop + vertex 153.315 159.696 -3 + vertex 153.5 159.598 0 + vertex 153.5 159.598 -3 + endloop + endfacet + facet normal 0.468107 0.883672 -0 + outer loop + vertex 153.315 159.696 -3 + vertex 153.315 159.696 0 + vertex 153.5 159.598 0 + endloop + endfacet + facet normal 0.410563 0.911832 0 + outer loop + vertex 153.124 159.782 -3 + vertex 153.315 159.696 0 + vertex 153.315 159.696 -3 + endloop + endfacet + facet normal 0.410563 0.911832 -0 + outer loop + vertex 153.124 159.782 -3 + vertex 153.124 159.782 0 + vertex 153.315 159.696 0 + endloop + endfacet + facet normal 0.339058 0.940766 0 + outer loop + vertex 152.927 159.853 -3 + vertex 153.124 159.782 0 + vertex 153.124 159.782 -3 + endloop + endfacet + facet normal 0.339058 0.940766 -0 + outer loop + vertex 152.927 159.853 -3 + vertex 152.927 159.853 0 + vertex 153.124 159.782 0 + endloop + endfacet + facet normal 0.277246 0.960799 0 + outer loop + vertex 152.726 159.911 -3 + vertex 152.927 159.853 0 + vertex 152.927 159.853 -3 + endloop + endfacet + facet normal 0.277246 0.960799 -0 + outer loop + vertex 152.726 159.911 -3 + vertex 152.726 159.911 0 + vertex 152.927 159.853 0 + endloop + endfacet + facet normal 0.205289 0.978701 0 + outer loop + vertex 152.521 159.954 -3 + vertex 152.726 159.911 0 + vertex 152.726 159.911 -3 + endloop + endfacet + facet normal 0.205289 0.978701 -0 + outer loop + vertex 152.521 159.954 -3 + vertex 152.521 159.954 0 + vertex 152.726 159.911 0 + endloop + endfacet + facet normal 0.143429 0.989661 0 + outer loop + vertex 152.314 159.984 -3 + vertex 152.521 159.954 0 + vertex 152.521 159.954 -3 + endloop + endfacet + facet normal 0.143429 0.989661 -0 + outer loop + vertex 152.314 159.984 -3 + vertex 152.314 159.984 0 + vertex 152.521 159.954 0 + endloop + endfacet + facet normal 0.0668359 0.997764 0 + outer loop + vertex 152.105 159.998 -3 + vertex 152.314 159.984 0 + vertex 152.314 159.984 -3 + endloop + endfacet + facet normal 0.0668359 0.997764 -0 + outer loop + vertex 152.105 159.998 -3 + vertex 152.105 159.998 0 + vertex 152.314 159.984 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 152.002 159.998 -3 + vertex 152.105 159.998 0 + vertex 152.105 159.998 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 152.002 159.998 -3 + vertex 152.002 159.998 0 + vertex 152.105 159.998 0 + endloop + endfacet + facet normal 0.707107 0.707107 0 + outer loop + vertex 152 160 -3 + vertex 152.002 159.998 0 + vertex 152.002 159.998 -3 + endloop + endfacet + facet normal 0.707107 0.707107 -0 + outer loop + vertex 152 160 -3 + vertex 152 160 0 + vertex 152.002 159.998 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -152 160 -3 + vertex 152 160 0 + vertex 152 160 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -152 160 -3 + vertex -152 160 0 + vertex 152 160 0 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -152.002 159.998 -3 + vertex -152 160 0 + vertex -152 160 -3 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -152.002 159.998 -3 + vertex -152.002 159.998 0 + vertex -152 160 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -152.105 159.998 -3 + vertex -152.002 159.998 0 + vertex -152.002 159.998 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -152.105 159.998 -3 + vertex -152.105 159.998 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -152.314 159.984 -3 + vertex -152.105 159.998 0 + vertex -152.105 159.998 -3 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -152.314 159.984 -3 + vertex -152.314 159.984 0 + vertex -152.105 159.998 0 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -152.521 159.954 -3 + vertex -152.314 159.984 0 + vertex -152.314 159.984 -3 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -152.521 159.954 -3 + vertex -152.521 159.954 0 + vertex -152.314 159.984 0 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -152.726 159.911 -3 + vertex -152.521 159.954 0 + vertex -152.521 159.954 -3 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -152.726 159.911 -3 + vertex -152.726 159.911 0 + vertex -152.521 159.954 0 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -152.927 159.853 -3 + vertex -152.726 159.911 0 + vertex -152.726 159.911 -3 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -152.927 159.853 -3 + vertex -152.927 159.853 0 + vertex -152.726 159.911 0 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -153.124 159.782 -3 + vertex -152.927 159.853 0 + vertex -152.927 159.853 -3 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -153.124 159.782 -3 + vertex -153.124 159.782 0 + vertex -152.927 159.853 0 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -153.315 159.696 -3 + vertex -153.124 159.782 0 + vertex -153.124 159.782 -3 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -153.315 159.696 -3 + vertex -153.315 159.696 0 + vertex -153.124 159.782 0 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -153.5 159.598 -3 + vertex -153.315 159.696 0 + vertex -153.315 159.696 -3 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -153.5 159.598 -3 + vertex -153.5 159.598 0 + vertex -153.315 159.696 0 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -153.678 159.487 -3 + vertex -153.5 159.598 0 + vertex -153.5 159.598 -3 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -153.678 159.487 -3 + vertex -153.678 159.487 0 + vertex -153.5 159.598 0 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -153.847 159.364 -3 + vertex -153.678 159.487 0 + vertex -153.678 159.487 -3 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -153.847 159.364 -3 + vertex -153.847 159.364 0 + vertex -153.678 159.487 0 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -154.007 159.229 -3 + vertex -153.847 159.364 0 + vertex -153.847 159.364 -3 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -154.007 159.229 -3 + vertex -154.007 159.229 0 + vertex -153.847 159.364 0 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -154.158 159.084 -3 + vertex -154.007 159.229 0 + vertex -154.007 159.229 -3 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -154.158 159.084 -3 + vertex -154.158 159.084 0 + vertex -154.007 159.229 0 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -154.298 158.928 -3 + vertex -154.158 159.084 0 + vertex -154.158 159.084 -3 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -154.298 158.928 -3 + vertex -154.298 158.928 0 + vertex -154.158 159.084 0 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -154.427 158.763 -3 + vertex -154.298 158.928 0 + vertex -154.298 158.928 -3 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -154.427 158.763 -3 + vertex -154.427 158.763 0 + vertex -154.298 158.928 0 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -154.544 158.59 -3 + vertex -154.427 158.763 0 + vertex -154.427 158.763 -3 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -154.544 158.59 -3 + vertex -154.544 158.59 0 + vertex -154.427 158.763 0 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -154.649 158.408 -3 + vertex -154.544 158.59 0 + vertex -154.544 158.59 -3 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -154.649 158.408 -3 + vertex -154.649 158.408 0 + vertex -154.544 158.59 0 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -154.741 158.22 -3 + vertex -154.649 158.408 0 + vertex -154.649 158.408 -3 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -154.741 158.22 -3 + vertex -154.741 158.22 0 + vertex -154.649 158.408 0 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -154.819 158.026 -3 + vertex -154.741 158.22 0 + vertex -154.741 158.22 -3 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -154.819 158.026 -3 + vertex -154.819 158.026 0 + vertex -154.741 158.22 0 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -154.884 157.827 -3 + vertex -154.819 158.026 0 + vertex -154.819 158.026 -3 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -154.884 157.827 -3 + vertex -154.884 157.827 0 + vertex -154.819 158.026 0 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -154.934 157.624 -3 + vertex -154.884 157.827 0 + vertex -154.884 157.827 -3 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -154.934 157.624 -3 + vertex -154.934 157.624 0 + vertex -154.884 157.827 0 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -154.971 157.418 -3 + vertex -154.934 157.624 0 + vertex -154.934 157.624 -3 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -154.971 157.418 -3 + vertex -154.971 157.418 0 + vertex -154.934 157.624 0 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -154.993 157.209 -3 + vertex -154.971 157.418 0 + vertex -154.971 157.418 -3 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -154.993 157.209 -3 + vertex -154.993 157.209 0 + vertex -154.971 157.418 0 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -155 157 -3 + vertex -154.993 157.209 0 + vertex -154.993 157.209 -3 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -155 157 -3 + vertex -155 157 0 + vertex -154.993 157.209 0 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -155 -157 -3 + vertex -155 157 0 + vertex -155 157 -3 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -155 -157 -3 + vertex -155 -157 0 + vertex -155 157 0 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -154.993 -157.209 -3 + vertex -155 -157 0 + vertex -155 -157 -3 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -154.993 -157.209 -3 + vertex -154.993 -157.209 0 + vertex -155 -157 0 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -154.971 -157.418 -3 + vertex -154.993 -157.209 0 + vertex -154.993 -157.209 -3 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -154.971 -157.418 -3 + vertex -154.971 -157.418 0 + vertex -154.993 -157.209 0 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -154.934 -157.624 -3 + vertex -154.971 -157.418 0 + vertex -154.971 -157.418 -3 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -154.934 -157.624 -3 + vertex -154.934 -157.624 0 + vertex -154.971 -157.418 0 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -154.884 -157.827 -3 + vertex -154.934 -157.624 0 + vertex -154.934 -157.624 -3 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -154.884 -157.827 -3 + vertex -154.884 -157.827 0 + vertex -154.934 -157.624 0 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -154.819 -158.026 -3 + vertex -154.884 -157.827 0 + vertex -154.884 -157.827 -3 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -154.819 -158.026 -3 + vertex -154.819 -158.026 0 + vertex -154.884 -157.827 0 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -154.741 -158.22 -3 + vertex -154.819 -158.026 0 + vertex -154.819 -158.026 -3 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -154.741 -158.22 -3 + vertex -154.741 -158.22 0 + vertex -154.819 -158.026 0 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -154.649 -158.408 -3 + vertex -154.741 -158.22 0 + vertex -154.741 -158.22 -3 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -154.649 -158.408 -3 + vertex -154.649 -158.408 0 + vertex -154.741 -158.22 0 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -154.544 -158.59 -3 + vertex -154.649 -158.408 0 + vertex -154.649 -158.408 -3 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -154.544 -158.59 -3 + vertex -154.544 -158.59 0 + vertex -154.649 -158.408 0 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -154.427 -158.763 -3 + vertex -154.544 -158.59 0 + vertex -154.544 -158.59 -3 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -154.427 -158.763 -3 + vertex -154.427 -158.763 0 + vertex -154.544 -158.59 0 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -154.298 -158.928 -3 + vertex -154.427 -158.763 0 + vertex -154.427 -158.763 -3 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -154.298 -158.928 -3 + vertex -154.298 -158.928 0 + vertex -154.427 -158.763 0 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -154.158 -159.084 -3 + vertex -154.298 -158.928 0 + vertex -154.298 -158.928 -3 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -154.158 -159.084 -3 + vertex -154.158 -159.084 0 + vertex -154.298 -158.928 0 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -154.007 -159.229 -3 + vertex -154.158 -159.084 0 + vertex -154.158 -159.084 -3 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -154.007 -159.229 -3 + vertex -154.007 -159.229 0 + vertex -154.158 -159.084 0 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -153.847 -159.364 -3 + vertex -154.007 -159.229 0 + vertex -154.007 -159.229 -3 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -153.847 -159.364 -3 + vertex -153.847 -159.364 0 + vertex -154.007 -159.229 0 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -153.678 -159.487 -3 + vertex -153.847 -159.364 0 + vertex -153.847 -159.364 -3 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -153.678 -159.487 -3 + vertex -153.678 -159.487 0 + vertex -153.847 -159.364 0 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -153.5 -159.598 -3 + vertex -153.678 -159.487 0 + vertex -153.678 -159.487 -3 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -153.5 -159.598 -3 + vertex -153.5 -159.598 0 + vertex -153.678 -159.487 0 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -153.315 -159.696 -3 + vertex -153.5 -159.598 0 + vertex -153.5 -159.598 -3 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -153.315 -159.696 -3 + vertex -153.315 -159.696 0 + vertex -153.5 -159.598 0 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -153.124 -159.782 -3 + vertex -153.315 -159.696 0 + vertex -153.315 -159.696 -3 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -153.124 -159.782 -3 + vertex -153.124 -159.782 0 + vertex -153.315 -159.696 0 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -152.927 -159.853 -3 + vertex -153.124 -159.782 0 + vertex -153.124 -159.782 -3 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -152.927 -159.853 -3 + vertex -152.927 -159.853 0 + vertex -153.124 -159.782 0 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -152.726 -159.911 -3 + vertex -152.927 -159.853 0 + vertex -152.927 -159.853 -3 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -152.726 -159.911 -3 + vertex -152.726 -159.911 0 + vertex -152.927 -159.853 0 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -152.521 -159.954 -3 + vertex -152.726 -159.911 0 + vertex -152.726 -159.911 -3 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -152.521 -159.954 -3 + vertex -152.521 -159.954 0 + vertex -152.726 -159.911 0 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -152.314 -159.984 -3 + vertex -152.521 -159.954 0 + vertex -152.521 -159.954 -3 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -152.314 -159.984 -3 + vertex -152.314 -159.984 0 + vertex -152.521 -159.954 0 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -152.105 -159.998 -3 + vertex -152.314 -159.984 0 + vertex -152.314 -159.984 -3 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -152.105 -159.998 -3 + vertex -152.105 -159.998 0 + vertex -152.314 -159.984 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -152.002 -159.998 -3 + vertex -152.105 -159.998 0 + vertex -152.105 -159.998 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -152.002 -159.998 -3 + vertex -152.002 -159.998 0 + vertex -152.105 -159.998 0 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -152 -160 -3 + vertex -152.002 -159.998 0 + vertex -152.002 -159.998 -3 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -152 -160 -3 + vertex -152 -160 0 + vertex -152.002 -159.998 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 152 -160 -3 + vertex -152 -160 0 + vertex -152 -160 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 152 -160 -3 + vertex 152 -160 0 + vertex -152 -160 0 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 152.002 -159.998 -3 + vertex 152 -160 0 + vertex 152 -160 -3 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 152.002 -159.998 -3 + vertex 152.002 -159.998 0 + vertex 152 -160 0 + endloop + endfacet +endsolid OpenSCAD_Model diff --git a/resources/profiles/Creality/cr20.svg b/resources/profiles/Creality/cr20.svg new file mode 100644 index 000000000..338a59975 --- /dev/null +++ b/resources/profiles/Creality/cr20.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/profiles/Creality/ender2_bed.stl b/resources/profiles/Creality/ender2_bed.stl index 3cf022ed0..b2a419fab 100644 Binary files a/resources/profiles/Creality/ender2_bed.stl and b/resources/profiles/Creality/ender2_bed.stl differ diff --git a/resources/profiles/Creality/ender3_bed.stl b/resources/profiles/Creality/ender3_bed.stl index fb8f86d09..724d8905e 100644 Binary files a/resources/profiles/Creality/ender3_bed.stl and b/resources/profiles/Creality/ender3_bed.stl differ diff --git a/resources/profiles/Creality/ender5plus.svg b/resources/profiles/Creality/ender5plus.svg new file mode 100644 index 000000000..b5ac0b016 --- /dev/null +++ b/resources/profiles/Creality/ender5plus.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/profiles/Creality/ender5plus_bed.stl b/resources/profiles/Creality/ender5plus_bed.stl new file mode 100644 index 000000000..f2d17bd40 --- /dev/null +++ b/resources/profiles/Creality/ender5plus_bed.stl @@ -0,0 +1,2774 @@ +solid OpenSCAD_Model + facet normal 0 0 -1 + outer loop + vertex 182.105 -184.998 -3 + vertex 182.002 -184.998 -3 + vertex 182.314 -184.984 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 182.314 -184.984 -3 + vertex 182.002 -184.998 -3 + vertex 182.521 -184.954 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 185 -182 -3 + vertex 182.002 -184.998 -3 + vertex 182.002 184.998 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 182.521 -184.954 -3 + vertex 182.002 -184.998 -3 + vertex 182.726 -184.911 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 182.726 -184.911 -3 + vertex 182.002 -184.998 -3 + vertex 182.927 -184.853 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 182.927 -184.853 -3 + vertex 182.002 -184.998 -3 + vertex 183.124 -184.782 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 183.124 -184.782 -3 + vertex 182.002 -184.998 -3 + vertex 183.315 -184.696 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 183.315 -184.696 -3 + vertex 182.002 -184.998 -3 + vertex 183.5 -184.598 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 183.5 -184.598 -3 + vertex 182.002 -184.998 -3 + vertex 183.678 -184.487 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 183.678 -184.487 -3 + vertex 182.002 -184.998 -3 + vertex 183.847 -184.364 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 183.847 -184.364 -3 + vertex 182.002 -184.998 -3 + vertex 184.007 -184.229 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 184.007 -184.229 -3 + vertex 182.002 -184.998 -3 + vertex 184.158 -184.084 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 184.158 -184.084 -3 + vertex 182.002 -184.998 -3 + vertex 184.298 -183.928 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 184.298 -183.928 -3 + vertex 182.002 -184.998 -3 + vertex 184.427 -183.763 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 184.427 -183.763 -3 + vertex 182.002 -184.998 -3 + vertex 184.544 -183.59 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 184.544 -183.59 -3 + vertex 182.002 -184.998 -3 + vertex 184.649 -183.408 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 184.649 -183.408 -3 + vertex 182.002 -184.998 -3 + vertex 184.741 -183.22 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 184.741 -183.22 -3 + vertex 182.002 -184.998 -3 + vertex 184.819 -183.026 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 184.819 -183.026 -3 + vertex 182.002 -184.998 -3 + vertex 184.884 -182.827 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 184.884 -182.827 -3 + vertex 182.002 -184.998 -3 + vertex 184.934 -182.624 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 184.934 -182.624 -3 + vertex 182.002 -184.998 -3 + vertex 184.971 -182.418 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 184.971 -182.418 -3 + vertex 182.002 -184.998 -3 + vertex 184.993 -182.209 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 184.993 -182.209 -3 + vertex 182.002 -184.998 -3 + vertex 185 -182 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 185 -182 -3 + vertex 182.002 184.998 -3 + vertex 185 182 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 182.002 184.998 -3 + vertex 184.971 182.418 -3 + vertex 184.993 182.209 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 184.884 182.827 -3 + vertex 184.934 182.624 -3 + vertex 182.002 184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 184.741 183.22 -3 + vertex 182.002 184.998 -3 + vertex 184.649 183.408 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 184.741 183.22 -3 + vertex 184.819 183.026 -3 + vertex 182.002 184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 182.002 184.998 -3 + vertex 184.007 184.229 -3 + vertex 184.158 184.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 184.427 183.763 -3 + vertex 182.002 184.998 -3 + vertex 184.298 183.928 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 184.427 183.763 -3 + vertex 184.544 183.59 -3 + vertex 182.002 184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 184.298 183.928 -3 + vertex 182.002 184.998 -3 + vertex 184.158 184.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 182.002 184.998 -3 + vertex 182.927 184.853 -3 + vertex 183.124 184.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 183.847 184.364 -3 + vertex 182.002 184.998 -3 + vertex 183.678 184.487 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 183.847 184.364 -3 + vertex 184.007 184.229 -3 + vertex 182.002 184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 183.678 184.487 -3 + vertex 182.002 184.998 -3 + vertex 183.5 184.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 183.5 184.598 -3 + vertex 182.002 184.998 -3 + vertex 183.315 184.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 183.315 184.696 -3 + vertex 182.002 184.998 -3 + vertex 183.124 184.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 184.649 183.408 -3 + vertex 182.002 184.998 -3 + vertex 184.544 183.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 182.726 184.911 -3 + vertex 182.002 184.998 -3 + vertex 182.521 184.954 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 182.726 184.911 -3 + vertex 182.927 184.853 -3 + vertex 182.002 184.998 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 184.819 183.026 -3 + vertex 184.884 182.827 -3 + vertex 182.002 184.998 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 182.314 184.984 -3 + vertex 182.521 184.954 -3 + vertex 182.002 184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 182.002 184.998 -3 + vertex 184.934 182.624 -3 + vertex 184.971 182.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 182.002 184.998 -3 + vertex 182.105 184.998 -3 + vertex 182.314 184.984 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 185 182 -3 + vertex 182.002 184.998 -3 + vertex 184.993 182.209 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex -182 185 -3 + vertex 182 185 -3 + vertex -182.002 184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex 182 185 -3 + vertex 182.002 184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 182.002 -184.998 -3 + vertex -182.002 184.998 -3 + vertex 182.002 184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -185 -182 -3 + vertex -185 182 -3 + vertex -182.002 -184.998 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -182.314 184.984 -3 + vertex -182.105 184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -182.521 184.954 -3 + vertex -182.314 184.984 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -182.726 184.911 -3 + vertex -182.521 184.954 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -182.927 184.853 -3 + vertex -182.726 184.911 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -183.124 184.782 -3 + vertex -182.927 184.853 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -183.315 184.696 -3 + vertex -183.124 184.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -183.5 184.598 -3 + vertex -183.315 184.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -183.678 184.487 -3 + vertex -183.5 184.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -183.847 184.364 -3 + vertex -183.678 184.487 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -184.007 184.229 -3 + vertex -183.847 184.364 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -184.158 184.084 -3 + vertex -184.007 184.229 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -184.298 183.928 -3 + vertex -184.158 184.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -184.427 183.763 -3 + vertex -184.298 183.928 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -184.544 183.59 -3 + vertex -184.427 183.763 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -184.649 183.408 -3 + vertex -184.544 183.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -184.741 183.22 -3 + vertex -184.649 183.408 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -184.819 183.026 -3 + vertex -184.741 183.22 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -184.884 182.827 -3 + vertex -184.819 183.026 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -184.934 182.624 -3 + vertex -184.884 182.827 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -184.971 182.418 -3 + vertex -184.934 182.624 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -184.993 182.209 -3 + vertex -184.971 182.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -185 182 -3 + vertex -184.993 182.209 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 -184.998 -3 + vertex -185 182 -3 + vertex -182.002 184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 182.002 -184.998 -3 + vertex -182.002 -184.998 -3 + vertex -182.002 184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 -184.998 -3 + vertex -184.971 -182.418 -3 + vertex -184.993 -182.209 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -184.884 -182.827 -3 + vertex -184.934 -182.624 -3 + vertex -182.002 -184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -184.741 -183.22 -3 + vertex -182.002 -184.998 -3 + vertex -184.649 -183.408 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -184.741 -183.22 -3 + vertex -184.819 -183.026 -3 + vertex -182.002 -184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 -184.998 -3 + vertex -184.007 -184.229 -3 + vertex -184.158 -184.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -184.427 -183.763 -3 + vertex -182.002 -184.998 -3 + vertex -184.298 -183.928 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -184.427 -183.763 -3 + vertex -184.544 -183.59 -3 + vertex -182.002 -184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -184.298 -183.928 -3 + vertex -182.002 -184.998 -3 + vertex -184.158 -184.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 -184.998 -3 + vertex -182.927 -184.853 -3 + vertex -183.124 -184.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -183.847 -184.364 -3 + vertex -182.002 -184.998 -3 + vertex -183.678 -184.487 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -183.847 -184.364 -3 + vertex -184.007 -184.229 -3 + vertex -182.002 -184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -183.678 -184.487 -3 + vertex -182.002 -184.998 -3 + vertex -183.5 -184.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -183.5 -184.598 -3 + vertex -182.002 -184.998 -3 + vertex -183.315 -184.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -183.315 -184.696 -3 + vertex -182.002 -184.998 -3 + vertex -183.124 -184.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -184.649 -183.408 -3 + vertex -182.002 -184.998 -3 + vertex -184.544 -183.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.726 -184.911 -3 + vertex -182.002 -184.998 -3 + vertex -182.521 -184.954 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.726 -184.911 -3 + vertex -182.927 -184.853 -3 + vertex -182.002 -184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -184.819 -183.026 -3 + vertex -184.884 -182.827 -3 + vertex -182.002 -184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.314 -184.984 -3 + vertex -182.521 -184.954 -3 + vertex -182.002 -184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 -184.998 -3 + vertex -184.934 -182.624 -3 + vertex -184.971 -182.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 -184.998 -3 + vertex -182.105 -184.998 -3 + vertex -182.314 -184.984 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 182.002 -184.998 -3 + vertex 182 -185 -3 + vertex -182.002 -184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 -184.998 -3 + vertex 182 -185 -3 + vertex -182 -185 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -185 -182 -3 + vertex -182.002 -184.998 -3 + vertex -184.993 -182.209 -3 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.314 -184.984 0 + vertex 182.002 -184.998 0 + vertex 182.105 -184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.521 -184.954 0 + vertex 182.002 -184.998 0 + vertex 182.314 -184.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.002 184.998 0 + vertex 182.002 -184.998 0 + vertex 185 -182 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.726 -184.911 0 + vertex 182.002 -184.998 0 + vertex 182.521 -184.954 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.927 -184.853 0 + vertex 182.002 -184.998 0 + vertex 182.726 -184.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 183.124 -184.782 0 + vertex 182.002 -184.998 0 + vertex 182.927 -184.853 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 183.315 -184.696 0 + vertex 182.002 -184.998 0 + vertex 183.124 -184.782 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 183.5 -184.598 0 + vertex 182.002 -184.998 0 + vertex 183.315 -184.696 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 183.678 -184.487 0 + vertex 182.002 -184.998 0 + vertex 183.5 -184.598 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 183.847 -184.364 0 + vertex 182.002 -184.998 0 + vertex 183.678 -184.487 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.007 -184.229 0 + vertex 182.002 -184.998 0 + vertex 183.847 -184.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.158 -184.084 0 + vertex 182.002 -184.998 0 + vertex 184.007 -184.229 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.298 -183.928 0 + vertex 182.002 -184.998 0 + vertex 184.158 -184.084 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.427 -183.763 0 + vertex 182.002 -184.998 0 + vertex 184.298 -183.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.544 -183.59 0 + vertex 182.002 -184.998 0 + vertex 184.427 -183.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.649 -183.408 0 + vertex 182.002 -184.998 0 + vertex 184.544 -183.59 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.741 -183.22 0 + vertex 182.002 -184.998 0 + vertex 184.649 -183.408 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.819 -183.026 0 + vertex 182.002 -184.998 0 + vertex 184.741 -183.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.884 -182.827 0 + vertex 182.002 -184.998 0 + vertex 184.819 -183.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.934 -182.624 0 + vertex 182.002 -184.998 0 + vertex 184.884 -182.827 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.971 -182.418 0 + vertex 182.002 -184.998 0 + vertex 184.934 -182.624 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.993 -182.209 0 + vertex 182.002 -184.998 0 + vertex 184.971 -182.418 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 185 -182 0 + vertex 182.002 -184.998 0 + vertex 184.993 -182.209 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 185 182 0 + vertex 182.002 184.998 0 + vertex 185 -182 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.993 182.209 0 + vertex 184.971 182.418 0 + vertex 182.002 184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.002 184.998 0 + vertex 184.934 182.624 0 + vertex 184.884 182.827 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.649 183.408 0 + vertex 182.002 184.998 0 + vertex 184.741 183.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.002 184.998 0 + vertex 184.819 183.026 0 + vertex 184.741 183.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.158 184.084 0 + vertex 184.007 184.229 0 + vertex 182.002 184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.298 183.928 0 + vertex 182.002 184.998 0 + vertex 184.427 183.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.002 184.998 0 + vertex 184.544 183.59 0 + vertex 184.427 183.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.158 184.084 0 + vertex 182.002 184.998 0 + vertex 184.298 183.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 183.124 184.782 0 + vertex 182.927 184.853 0 + vertex 182.002 184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 183.678 184.487 0 + vertex 182.002 184.998 0 + vertex 183.847 184.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.002 184.998 0 + vertex 184.007 184.229 0 + vertex 183.847 184.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 183.5 184.598 0 + vertex 182.002 184.998 0 + vertex 183.678 184.487 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 183.315 184.696 0 + vertex 182.002 184.998 0 + vertex 183.5 184.598 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 183.124 184.782 0 + vertex 182.002 184.998 0 + vertex 183.315 184.696 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.544 183.59 0 + vertex 182.002 184.998 0 + vertex 184.649 183.408 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.521 184.954 0 + vertex 182.002 184.998 0 + vertex 182.726 184.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.002 184.998 0 + vertex 182.927 184.853 0 + vertex 182.726 184.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.002 184.998 0 + vertex 184.884 182.827 0 + vertex 184.819 183.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.002 184.998 0 + vertex 182.521 184.954 0 + vertex 182.314 184.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.971 182.418 0 + vertex 184.934 182.624 0 + vertex 182.002 184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.314 184.984 0 + vertex 182.105 184.998 0 + vertex 182.002 184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.993 182.209 0 + vertex 182.002 184.998 0 + vertex 185 182 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -182.002 184.998 0 + vertex 182 185 0 + vertex -182 185 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.002 184.998 0 + vertex 182 185 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.002 184.998 0 + vertex -182.002 184.998 0 + vertex 182.002 -184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -182.002 -184.998 0 + vertex -185 182 0 + vertex -185 -182 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -182.105 184.998 0 + vertex -182.314 184.984 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -182.314 184.984 0 + vertex -182.521 184.954 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -182.521 184.954 0 + vertex -182.726 184.911 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -182.726 184.911 0 + vertex -182.927 184.853 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -182.927 184.853 0 + vertex -183.124 184.782 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -183.124 184.782 0 + vertex -183.315 184.696 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -183.315 184.696 0 + vertex -183.5 184.598 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -183.5 184.598 0 + vertex -183.678 184.487 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -183.678 184.487 0 + vertex -183.847 184.364 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -183.847 184.364 0 + vertex -184.007 184.229 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -184.007 184.229 0 + vertex -184.158 184.084 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -184.158 184.084 0 + vertex -184.298 183.928 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -184.298 183.928 0 + vertex -184.427 183.763 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -184.427 183.763 0 + vertex -184.544 183.59 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -184.544 183.59 0 + vertex -184.649 183.408 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -184.649 183.408 0 + vertex -184.741 183.22 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -184.741 183.22 0 + vertex -184.819 183.026 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -184.819 183.026 0 + vertex -184.884 182.827 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -184.884 182.827 0 + vertex -184.934 182.624 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -184.934 182.624 0 + vertex -184.971 182.418 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -184.971 182.418 0 + vertex -184.993 182.209 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -184.993 182.209 0 + vertex -185 182 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -182.002 184.998 0 + vertex -185 182 0 + vertex -182.002 -184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -182.002 184.998 0 + vertex -182.002 -184.998 0 + vertex 182.002 -184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -184.993 -182.209 0 + vertex -184.971 -182.418 0 + vertex -182.002 -184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -182.002 -184.998 0 + vertex -184.934 -182.624 0 + vertex -184.884 -182.827 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -184.649 -183.408 0 + vertex -182.002 -184.998 0 + vertex -184.741 -183.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -182.002 -184.998 0 + vertex -184.819 -183.026 0 + vertex -184.741 -183.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -184.158 -184.084 0 + vertex -184.007 -184.229 0 + vertex -182.002 -184.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -184.298 -183.928 0 + vertex -182.002 -184.998 0 + vertex -184.427 -183.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -182.002 -184.998 0 + vertex -184.544 -183.59 0 + vertex -184.427 -183.763 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -184.158 -184.084 0 + vertex -182.002 -184.998 0 + vertex -184.298 -183.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -183.124 -184.782 0 + vertex -182.927 -184.853 0 + vertex -182.002 -184.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -183.678 -184.487 0 + vertex -182.002 -184.998 0 + vertex -183.847 -184.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -182.002 -184.998 0 + vertex -184.007 -184.229 0 + vertex -183.847 -184.364 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -183.5 -184.598 0 + vertex -182.002 -184.998 0 + vertex -183.678 -184.487 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -183.315 -184.696 0 + vertex -182.002 -184.998 0 + vertex -183.5 -184.598 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -183.124 -184.782 0 + vertex -182.002 -184.998 0 + vertex -183.315 -184.696 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -184.544 -183.59 0 + vertex -182.002 -184.998 0 + vertex -184.649 -183.408 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -182.521 -184.954 0 + vertex -182.002 -184.998 0 + vertex -182.726 -184.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -182.002 -184.998 0 + vertex -182.927 -184.853 0 + vertex -182.726 -184.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -182.002 -184.998 0 + vertex -184.884 -182.827 0 + vertex -184.819 -183.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -182.002 -184.998 0 + vertex -182.521 -184.954 0 + vertex -182.314 -184.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -184.971 -182.418 0 + vertex -184.934 -182.624 0 + vertex -182.002 -184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -182.314 -184.984 0 + vertex -182.105 -184.998 0 + vertex -182.002 -184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -182.002 -184.998 0 + vertex 182 -185 0 + vertex 182.002 -184.998 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex -182 -185 0 + vertex 182 -185 0 + vertex -182.002 -184.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -184.993 -182.209 0 + vertex -182.002 -184.998 0 + vertex -185 -182 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 182.105 -184.998 -3 + vertex 182.002 -184.998 0 + vertex 182.002 -184.998 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 182.105 -184.998 -3 + vertex 182.105 -184.998 0 + vertex 182.002 -184.998 0 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 182.314 -184.984 -3 + vertex 182.105 -184.998 0 + vertex 182.105 -184.998 -3 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 182.314 -184.984 -3 + vertex 182.314 -184.984 0 + vertex 182.105 -184.998 0 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 182.521 -184.954 -3 + vertex 182.314 -184.984 0 + vertex 182.314 -184.984 -3 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 182.521 -184.954 -3 + vertex 182.521 -184.954 0 + vertex 182.314 -184.984 0 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 182.726 -184.911 -3 + vertex 182.521 -184.954 0 + vertex 182.521 -184.954 -3 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 182.726 -184.911 -3 + vertex 182.726 -184.911 0 + vertex 182.521 -184.954 0 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 182.927 -184.853 -3 + vertex 182.726 -184.911 0 + vertex 182.726 -184.911 -3 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 182.927 -184.853 -3 + vertex 182.927 -184.853 0 + vertex 182.726 -184.911 0 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 183.124 -184.782 -3 + vertex 182.927 -184.853 0 + vertex 182.927 -184.853 -3 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 183.124 -184.782 -3 + vertex 183.124 -184.782 0 + vertex 182.927 -184.853 0 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 183.315 -184.696 -3 + vertex 183.124 -184.782 0 + vertex 183.124 -184.782 -3 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 183.315 -184.696 -3 + vertex 183.315 -184.696 0 + vertex 183.124 -184.782 0 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 183.5 -184.598 -3 + vertex 183.315 -184.696 0 + vertex 183.315 -184.696 -3 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 183.5 -184.598 -3 + vertex 183.5 -184.598 0 + vertex 183.315 -184.696 0 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 183.678 -184.487 -3 + vertex 183.5 -184.598 0 + vertex 183.5 -184.598 -3 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 183.678 -184.487 -3 + vertex 183.678 -184.487 0 + vertex 183.5 -184.598 0 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 183.847 -184.364 -3 + vertex 183.678 -184.487 0 + vertex 183.678 -184.487 -3 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 183.847 -184.364 -3 + vertex 183.847 -184.364 0 + vertex 183.678 -184.487 0 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 184.007 -184.229 -3 + vertex 183.847 -184.364 0 + vertex 183.847 -184.364 -3 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 184.007 -184.229 -3 + vertex 184.007 -184.229 0 + vertex 183.847 -184.364 0 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 184.158 -184.084 -3 + vertex 184.007 -184.229 0 + vertex 184.007 -184.229 -3 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 184.158 -184.084 -3 + vertex 184.158 -184.084 0 + vertex 184.007 -184.229 0 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 184.298 -183.928 -3 + vertex 184.158 -184.084 0 + vertex 184.158 -184.084 -3 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 184.298 -183.928 -3 + vertex 184.298 -183.928 0 + vertex 184.158 -184.084 0 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 184.427 -183.763 -3 + vertex 184.298 -183.928 0 + vertex 184.298 -183.928 -3 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 184.427 -183.763 -3 + vertex 184.427 -183.763 0 + vertex 184.298 -183.928 0 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 184.544 -183.59 -3 + vertex 184.427 -183.763 0 + vertex 184.427 -183.763 -3 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 184.544 -183.59 -3 + vertex 184.544 -183.59 0 + vertex 184.427 -183.763 0 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 184.649 -183.408 -3 + vertex 184.544 -183.59 0 + vertex 184.544 -183.59 -3 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 184.649 -183.408 -3 + vertex 184.649 -183.408 0 + vertex 184.544 -183.59 0 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 184.741 -183.22 -3 + vertex 184.649 -183.408 0 + vertex 184.649 -183.408 -3 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 184.741 -183.22 -3 + vertex 184.741 -183.22 0 + vertex 184.649 -183.408 0 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 184.819 -183.026 -3 + vertex 184.741 -183.22 0 + vertex 184.741 -183.22 -3 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 184.819 -183.026 -3 + vertex 184.819 -183.026 0 + vertex 184.741 -183.22 0 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 184.884 -182.827 -3 + vertex 184.819 -183.026 0 + vertex 184.819 -183.026 -3 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 184.884 -182.827 -3 + vertex 184.884 -182.827 0 + vertex 184.819 -183.026 0 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 184.934 -182.624 -3 + vertex 184.884 -182.827 0 + vertex 184.884 -182.827 -3 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 184.934 -182.624 -3 + vertex 184.934 -182.624 0 + vertex 184.884 -182.827 0 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 184.971 -182.418 -3 + vertex 184.934 -182.624 0 + vertex 184.934 -182.624 -3 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 184.971 -182.418 -3 + vertex 184.971 -182.418 0 + vertex 184.934 -182.624 0 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 184.993 -182.209 -3 + vertex 184.971 -182.418 0 + vertex 184.971 -182.418 -3 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 184.993 -182.209 -3 + vertex 184.993 -182.209 0 + vertex 184.971 -182.418 0 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 185 -182 -3 + vertex 184.993 -182.209 0 + vertex 184.993 -182.209 -3 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 185 -182 -3 + vertex 185 -182 0 + vertex 184.993 -182.209 0 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 185 182 -3 + vertex 185 -182 0 + vertex 185 -182 -3 + endloop + endfacet + facet normal 1 0 -0 + outer loop + vertex 185 182 -3 + vertex 185 182 0 + vertex 185 -182 0 + endloop + endfacet + facet normal 0.99944 0.0334741 0 + outer loop + vertex 184.993 182.209 -3 + vertex 185 182 0 + vertex 185 182 -3 + endloop + endfacet + facet normal 0.99944 0.0334741 -0 + outer loop + vertex 184.993 182.209 -3 + vertex 184.993 182.209 0 + vertex 185 182 0 + endloop + endfacet + facet normal 0.994505 0.104685 0 + outer loop + vertex 184.971 182.418 -3 + vertex 184.993 182.209 0 + vertex 184.993 182.209 -3 + endloop + endfacet + facet normal 0.994505 0.104685 -0 + outer loop + vertex 184.971 182.418 -3 + vertex 184.971 182.418 0 + vertex 184.993 182.209 0 + endloop + endfacet + facet normal 0.98425 0.176783 0 + outer loop + vertex 184.934 182.624 -3 + vertex 184.971 182.418 0 + vertex 184.971 182.418 -3 + endloop + endfacet + facet normal 0.98425 0.176783 -0 + outer loop + vertex 184.934 182.624 -3 + vertex 184.934 182.624 0 + vertex 184.971 182.418 0 + endloop + endfacet + facet normal 0.970981 0.239158 0 + outer loop + vertex 184.884 182.827 -3 + vertex 184.934 182.624 0 + vertex 184.934 182.624 -3 + endloop + endfacet + facet normal 0.970981 0.239158 -0 + outer loop + vertex 184.884 182.827 -3 + vertex 184.884 182.827 0 + vertex 184.934 182.624 0 + endloop + endfacet + facet normal 0.950577 0.31049 0 + outer loop + vertex 184.819 183.026 -3 + vertex 184.884 182.827 0 + vertex 184.884 182.827 -3 + endloop + endfacet + facet normal 0.950577 0.31049 -0 + outer loop + vertex 184.819 183.026 -3 + vertex 184.819 183.026 0 + vertex 184.884 182.827 0 + endloop + endfacet + facet normal 0.927816 0.373039 0 + outer loop + vertex 184.741 183.22 -3 + vertex 184.819 183.026 0 + vertex 184.819 183.026 -3 + endloop + endfacet + facet normal 0.927816 0.373039 -0 + outer loop + vertex 184.741 183.22 -3 + vertex 184.741 183.22 0 + vertex 184.819 183.026 0 + endloop + endfacet + facet normal 0.898217 0.439553 0 + outer loop + vertex 184.649 183.408 -3 + vertex 184.741 183.22 0 + vertex 184.741 183.22 -3 + endloop + endfacet + facet normal 0.898217 0.439553 -0 + outer loop + vertex 184.649 183.408 -3 + vertex 184.649 183.408 0 + vertex 184.741 183.22 0 + endloop + endfacet + facet normal 0.866186 0.499722 0 + outer loop + vertex 184.544 183.59 -3 + vertex 184.649 183.408 0 + vertex 184.649 183.408 -3 + endloop + endfacet + facet normal 0.866186 0.499722 -0 + outer loop + vertex 184.544 183.59 -3 + vertex 184.544 183.59 0 + vertex 184.649 183.408 0 + endloop + endfacet + facet normal 0.828349 0.560213 0 + outer loop + vertex 184.427 183.763 -3 + vertex 184.544 183.59 0 + vertex 184.544 183.59 -3 + endloop + endfacet + facet normal 0.828349 0.560213 -0 + outer loop + vertex 184.427 183.763 -3 + vertex 184.427 183.763 0 + vertex 184.544 183.59 0 + endloop + endfacet + facet normal 0.787807 0.615922 0 + outer loop + vertex 184.298 183.928 -3 + vertex 184.427 183.763 0 + vertex 184.427 183.763 -3 + endloop + endfacet + facet normal 0.787807 0.615922 -0 + outer loop + vertex 184.298 183.928 -3 + vertex 184.298 183.928 0 + vertex 184.427 183.763 0 + endloop + endfacet + facet normal 0.744242 0.66791 0 + outer loop + vertex 184.158 184.084 -3 + vertex 184.298 183.928 0 + vertex 184.298 183.928 -3 + endloop + endfacet + facet normal 0.744242 0.66791 -0 + outer loop + vertex 184.158 184.084 -3 + vertex 184.158 184.084 0 + vertex 184.298 183.928 0 + endloop + endfacet + facet normal 0.692631 0.721292 0 + outer loop + vertex 184.007 184.229 -3 + vertex 184.158 184.084 0 + vertex 184.158 184.084 -3 + endloop + endfacet + facet normal 0.692631 0.721292 -0 + outer loop + vertex 184.007 184.229 -3 + vertex 184.007 184.229 0 + vertex 184.158 184.084 0 + endloop + endfacet + facet normal 0.644871 0.764291 0 + outer loop + vertex 183.847 184.364 -3 + vertex 184.007 184.229 0 + vertex 184.007 184.229 -3 + endloop + endfacet + facet normal 0.644871 0.764291 -0 + outer loop + vertex 183.847 184.364 -3 + vertex 183.847 184.364 0 + vertex 184.007 184.229 0 + endloop + endfacet + facet normal 0.588456 0.808529 0 + outer loop + vertex 183.678 184.487 -3 + vertex 183.847 184.364 0 + vertex 183.847 184.364 -3 + endloop + endfacet + facet normal 0.588456 0.808529 -0 + outer loop + vertex 183.678 184.487 -3 + vertex 183.678 184.487 0 + vertex 183.847 184.364 0 + endloop + endfacet + facet normal 0.529142 0.848533 0 + outer loop + vertex 183.5 184.598 -3 + vertex 183.678 184.487 0 + vertex 183.678 184.487 -3 + endloop + endfacet + facet normal 0.529142 0.848533 -0 + outer loop + vertex 183.5 184.598 -3 + vertex 183.5 184.598 0 + vertex 183.678 184.487 0 + endloop + endfacet + facet normal 0.468107 0.883672 0 + outer loop + vertex 183.315 184.696 -3 + vertex 183.5 184.598 0 + vertex 183.5 184.598 -3 + endloop + endfacet + facet normal 0.468107 0.883672 -0 + outer loop + vertex 183.315 184.696 -3 + vertex 183.315 184.696 0 + vertex 183.5 184.598 0 + endloop + endfacet + facet normal 0.410563 0.911832 0 + outer loop + vertex 183.124 184.782 -3 + vertex 183.315 184.696 0 + vertex 183.315 184.696 -3 + endloop + endfacet + facet normal 0.410563 0.911832 -0 + outer loop + vertex 183.124 184.782 -3 + vertex 183.124 184.782 0 + vertex 183.315 184.696 0 + endloop + endfacet + facet normal 0.339058 0.940766 0 + outer loop + vertex 182.927 184.853 -3 + vertex 183.124 184.782 0 + vertex 183.124 184.782 -3 + endloop + endfacet + facet normal 0.339058 0.940766 -0 + outer loop + vertex 182.927 184.853 -3 + vertex 182.927 184.853 0 + vertex 183.124 184.782 0 + endloop + endfacet + facet normal 0.277246 0.960799 0 + outer loop + vertex 182.726 184.911 -3 + vertex 182.927 184.853 0 + vertex 182.927 184.853 -3 + endloop + endfacet + facet normal 0.277246 0.960799 -0 + outer loop + vertex 182.726 184.911 -3 + vertex 182.726 184.911 0 + vertex 182.927 184.853 0 + endloop + endfacet + facet normal 0.205289 0.978701 0 + outer loop + vertex 182.521 184.954 -3 + vertex 182.726 184.911 0 + vertex 182.726 184.911 -3 + endloop + endfacet + facet normal 0.205289 0.978701 -0 + outer loop + vertex 182.521 184.954 -3 + vertex 182.521 184.954 0 + vertex 182.726 184.911 0 + endloop + endfacet + facet normal 0.143429 0.989661 0 + outer loop + vertex 182.314 184.984 -3 + vertex 182.521 184.954 0 + vertex 182.521 184.954 -3 + endloop + endfacet + facet normal 0.143429 0.989661 -0 + outer loop + vertex 182.314 184.984 -3 + vertex 182.314 184.984 0 + vertex 182.521 184.954 0 + endloop + endfacet + facet normal 0.0668359 0.997764 0 + outer loop + vertex 182.105 184.998 -3 + vertex 182.314 184.984 0 + vertex 182.314 184.984 -3 + endloop + endfacet + facet normal 0.0668359 0.997764 -0 + outer loop + vertex 182.105 184.998 -3 + vertex 182.105 184.998 0 + vertex 182.314 184.984 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 182.002 184.998 -3 + vertex 182.105 184.998 0 + vertex 182.105 184.998 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 182.002 184.998 -3 + vertex 182.002 184.998 0 + vertex 182.105 184.998 0 + endloop + endfacet + facet normal 0.707107 0.707107 0 + outer loop + vertex 182 185 -3 + vertex 182.002 184.998 0 + vertex 182.002 184.998 -3 + endloop + endfacet + facet normal 0.707107 0.707107 -0 + outer loop + vertex 182 185 -3 + vertex 182 185 0 + vertex 182.002 184.998 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -182 185 -3 + vertex 182 185 0 + vertex 182 185 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -182 185 -3 + vertex -182 185 0 + vertex 182 185 0 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -182.002 184.998 -3 + vertex -182 185 0 + vertex -182 185 -3 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -182.002 184.998 -3 + vertex -182.002 184.998 0 + vertex -182 185 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -182.105 184.998 -3 + vertex -182.002 184.998 0 + vertex -182.002 184.998 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -182.105 184.998 -3 + vertex -182.105 184.998 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -182.314 184.984 -3 + vertex -182.105 184.998 0 + vertex -182.105 184.998 -3 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -182.314 184.984 -3 + vertex -182.314 184.984 0 + vertex -182.105 184.998 0 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -182.521 184.954 -3 + vertex -182.314 184.984 0 + vertex -182.314 184.984 -3 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -182.521 184.954 -3 + vertex -182.521 184.954 0 + vertex -182.314 184.984 0 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -182.726 184.911 -3 + vertex -182.521 184.954 0 + vertex -182.521 184.954 -3 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -182.726 184.911 -3 + vertex -182.726 184.911 0 + vertex -182.521 184.954 0 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -182.927 184.853 -3 + vertex -182.726 184.911 0 + vertex -182.726 184.911 -3 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -182.927 184.853 -3 + vertex -182.927 184.853 0 + vertex -182.726 184.911 0 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -183.124 184.782 -3 + vertex -182.927 184.853 0 + vertex -182.927 184.853 -3 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -183.124 184.782 -3 + vertex -183.124 184.782 0 + vertex -182.927 184.853 0 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -183.315 184.696 -3 + vertex -183.124 184.782 0 + vertex -183.124 184.782 -3 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -183.315 184.696 -3 + vertex -183.315 184.696 0 + vertex -183.124 184.782 0 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -183.5 184.598 -3 + vertex -183.315 184.696 0 + vertex -183.315 184.696 -3 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -183.5 184.598 -3 + vertex -183.5 184.598 0 + vertex -183.315 184.696 0 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -183.678 184.487 -3 + vertex -183.5 184.598 0 + vertex -183.5 184.598 -3 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -183.678 184.487 -3 + vertex -183.678 184.487 0 + vertex -183.5 184.598 0 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -183.847 184.364 -3 + vertex -183.678 184.487 0 + vertex -183.678 184.487 -3 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -183.847 184.364 -3 + vertex -183.847 184.364 0 + vertex -183.678 184.487 0 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -184.007 184.229 -3 + vertex -183.847 184.364 0 + vertex -183.847 184.364 -3 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -184.007 184.229 -3 + vertex -184.007 184.229 0 + vertex -183.847 184.364 0 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -184.158 184.084 -3 + vertex -184.007 184.229 0 + vertex -184.007 184.229 -3 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -184.158 184.084 -3 + vertex -184.158 184.084 0 + vertex -184.007 184.229 0 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -184.298 183.928 -3 + vertex -184.158 184.084 0 + vertex -184.158 184.084 -3 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -184.298 183.928 -3 + vertex -184.298 183.928 0 + vertex -184.158 184.084 0 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -184.427 183.763 -3 + vertex -184.298 183.928 0 + vertex -184.298 183.928 -3 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -184.427 183.763 -3 + vertex -184.427 183.763 0 + vertex -184.298 183.928 0 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -184.544 183.59 -3 + vertex -184.427 183.763 0 + vertex -184.427 183.763 -3 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -184.544 183.59 -3 + vertex -184.544 183.59 0 + vertex -184.427 183.763 0 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -184.649 183.408 -3 + vertex -184.544 183.59 0 + vertex -184.544 183.59 -3 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -184.649 183.408 -3 + vertex -184.649 183.408 0 + vertex -184.544 183.59 0 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -184.741 183.22 -3 + vertex -184.649 183.408 0 + vertex -184.649 183.408 -3 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -184.741 183.22 -3 + vertex -184.741 183.22 0 + vertex -184.649 183.408 0 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -184.819 183.026 -3 + vertex -184.741 183.22 0 + vertex -184.741 183.22 -3 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -184.819 183.026 -3 + vertex -184.819 183.026 0 + vertex -184.741 183.22 0 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -184.884 182.827 -3 + vertex -184.819 183.026 0 + vertex -184.819 183.026 -3 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -184.884 182.827 -3 + vertex -184.884 182.827 0 + vertex -184.819 183.026 0 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -184.934 182.624 -3 + vertex -184.884 182.827 0 + vertex -184.884 182.827 -3 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -184.934 182.624 -3 + vertex -184.934 182.624 0 + vertex -184.884 182.827 0 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -184.971 182.418 -3 + vertex -184.934 182.624 0 + vertex -184.934 182.624 -3 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -184.971 182.418 -3 + vertex -184.971 182.418 0 + vertex -184.934 182.624 0 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -184.993 182.209 -3 + vertex -184.971 182.418 0 + vertex -184.971 182.418 -3 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -184.993 182.209 -3 + vertex -184.993 182.209 0 + vertex -184.971 182.418 0 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -185 182 -3 + vertex -184.993 182.209 0 + vertex -184.993 182.209 -3 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -185 182 -3 + vertex -185 182 0 + vertex -184.993 182.209 0 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -185 -182 -3 + vertex -185 182 0 + vertex -185 182 -3 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -185 -182 -3 + vertex -185 -182 0 + vertex -185 182 0 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -184.993 -182.209 -3 + vertex -185 -182 0 + vertex -185 -182 -3 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -184.993 -182.209 -3 + vertex -184.993 -182.209 0 + vertex -185 -182 0 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -184.971 -182.418 -3 + vertex -184.993 -182.209 0 + vertex -184.993 -182.209 -3 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -184.971 -182.418 -3 + vertex -184.971 -182.418 0 + vertex -184.993 -182.209 0 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -184.934 -182.624 -3 + vertex -184.971 -182.418 0 + vertex -184.971 -182.418 -3 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -184.934 -182.624 -3 + vertex -184.934 -182.624 0 + vertex -184.971 -182.418 0 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -184.884 -182.827 -3 + vertex -184.934 -182.624 0 + vertex -184.934 -182.624 -3 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -184.884 -182.827 -3 + vertex -184.884 -182.827 0 + vertex -184.934 -182.624 0 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -184.819 -183.026 -3 + vertex -184.884 -182.827 0 + vertex -184.884 -182.827 -3 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -184.819 -183.026 -3 + vertex -184.819 -183.026 0 + vertex -184.884 -182.827 0 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -184.741 -183.22 -3 + vertex -184.819 -183.026 0 + vertex -184.819 -183.026 -3 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -184.741 -183.22 -3 + vertex -184.741 -183.22 0 + vertex -184.819 -183.026 0 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -184.649 -183.408 -3 + vertex -184.741 -183.22 0 + vertex -184.741 -183.22 -3 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -184.649 -183.408 -3 + vertex -184.649 -183.408 0 + vertex -184.741 -183.22 0 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -184.544 -183.59 -3 + vertex -184.649 -183.408 0 + vertex -184.649 -183.408 -3 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -184.544 -183.59 -3 + vertex -184.544 -183.59 0 + vertex -184.649 -183.408 0 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -184.427 -183.763 -3 + vertex -184.544 -183.59 0 + vertex -184.544 -183.59 -3 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -184.427 -183.763 -3 + vertex -184.427 -183.763 0 + vertex -184.544 -183.59 0 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -184.298 -183.928 -3 + vertex -184.427 -183.763 0 + vertex -184.427 -183.763 -3 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -184.298 -183.928 -3 + vertex -184.298 -183.928 0 + vertex -184.427 -183.763 0 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -184.158 -184.084 -3 + vertex -184.298 -183.928 0 + vertex -184.298 -183.928 -3 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -184.158 -184.084 -3 + vertex -184.158 -184.084 0 + vertex -184.298 -183.928 0 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -184.007 -184.229 -3 + vertex -184.158 -184.084 0 + vertex -184.158 -184.084 -3 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -184.007 -184.229 -3 + vertex -184.007 -184.229 0 + vertex -184.158 -184.084 0 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -183.847 -184.364 -3 + vertex -184.007 -184.229 0 + vertex -184.007 -184.229 -3 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -183.847 -184.364 -3 + vertex -183.847 -184.364 0 + vertex -184.007 -184.229 0 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -183.678 -184.487 -3 + vertex -183.847 -184.364 0 + vertex -183.847 -184.364 -3 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -183.678 -184.487 -3 + vertex -183.678 -184.487 0 + vertex -183.847 -184.364 0 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -183.5 -184.598 -3 + vertex -183.678 -184.487 0 + vertex -183.678 -184.487 -3 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -183.5 -184.598 -3 + vertex -183.5 -184.598 0 + vertex -183.678 -184.487 0 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -183.315 -184.696 -3 + vertex -183.5 -184.598 0 + vertex -183.5 -184.598 -3 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -183.315 -184.696 -3 + vertex -183.315 -184.696 0 + vertex -183.5 -184.598 0 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -183.124 -184.782 -3 + vertex -183.315 -184.696 0 + vertex -183.315 -184.696 -3 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -183.124 -184.782 -3 + vertex -183.124 -184.782 0 + vertex -183.315 -184.696 0 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -182.927 -184.853 -3 + vertex -183.124 -184.782 0 + vertex -183.124 -184.782 -3 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -182.927 -184.853 -3 + vertex -182.927 -184.853 0 + vertex -183.124 -184.782 0 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -182.726 -184.911 -3 + vertex -182.927 -184.853 0 + vertex -182.927 -184.853 -3 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -182.726 -184.911 -3 + vertex -182.726 -184.911 0 + vertex -182.927 -184.853 0 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -182.521 -184.954 -3 + vertex -182.726 -184.911 0 + vertex -182.726 -184.911 -3 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -182.521 -184.954 -3 + vertex -182.521 -184.954 0 + vertex -182.726 -184.911 0 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -182.314 -184.984 -3 + vertex -182.521 -184.954 0 + vertex -182.521 -184.954 -3 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -182.314 -184.984 -3 + vertex -182.314 -184.984 0 + vertex -182.521 -184.954 0 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -182.105 -184.998 -3 + vertex -182.314 -184.984 0 + vertex -182.314 -184.984 -3 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -182.105 -184.998 -3 + vertex -182.105 -184.998 0 + vertex -182.314 -184.984 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -182.002 -184.998 -3 + vertex -182.105 -184.998 0 + vertex -182.105 -184.998 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -182.002 -184.998 -3 + vertex -182.002 -184.998 0 + vertex -182.105 -184.998 0 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -182 -185 -3 + vertex -182.002 -184.998 0 + vertex -182.002 -184.998 -3 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -182 -185 -3 + vertex -182 -185 0 + vertex -182.002 -184.998 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 182 -185 -3 + vertex -182 -185 0 + vertex -182 -185 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 182 -185 -3 + vertex 182 -185 0 + vertex -182 -185 0 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 182.002 -184.998 -3 + vertex 182 -185 0 + vertex 182 -185 -3 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 182.002 -184.998 -3 + vertex 182.002 -184.998 0 + vertex 182 -185 0 + endloop + endfacet +endsolid OpenSCAD_Model diff --git a/resources/profiles/PrusaResearch.idx b/resources/profiles/PrusaResearch.idx index 5169445a5..996808690 100644 --- a/resources/profiles/PrusaResearch.idx +++ b/resources/profiles/PrusaResearch.idx @@ -1,4 +1,12 @@ min_slic3r_version = 2.2.0-alpha3 +1.1.10 Updated firmware version. +1.1.9 Updated K values in filament profiles (linear advance). Added new filament profiles and SLA materials. +1.1.8 Updated start/end g-code scripts for MK3 family printer profiles (reduced extruder motor current for some print profiles). Added new filament and SLA material profiles. +1.1.7 Updated end g-code for MMU2 Single printer profiles. Added/updated filament and SLA material profiles. +1.1.6 Updated firmware version for MK2.5/S and MK3/S. +1.1.5 Updated MMU1 specific retraction settings for Prusament PC Blend +1.1.4 Added Prusament PC Blend filament profile. +1.1.3 Added SLA material and filament profile 1.1.6 superslicer: thumbnails & remove top_fan_speed 1.1.5 slic3r++ adaptation: overlapping & top pattern. 1.1.4 changed flow ratio from float to % @@ -15,6 +23,8 @@ min_slic3r_version = 2.1.0 1.1.1-alpha2 Bumped up config version, so our in house customer will get updated profiles. 1.1.0 Filament aliases, Creality profiles and other goodies for PrusaSlicer 2.2.0-alpha0 min_slic3r_version = 2.1.1-beta0 +1.0.10 Updated firmware version for MK2.5/S and MK3/S. +1.0.9 Updated firmware version for MK2.5/S and MK3/S. 1.0.8 Various changes in FFF profiles, new filaments/materials added. See changelog. 1.0.7 Updated layer height limits for MINI 1.0.6 Added Prusa MINI profiles @@ -31,6 +41,8 @@ min_slic3r_version = 2.1.0-alpha0 1.0.0-alpha1 Added Prusament ASA profile 1.0.0-alpha0 Filament specific retract for PET and similar copolymers, and for FLEX min_slic3r_version = 1.42.0-alpha6 +0.8.9 Updated firmware version for MK2.5/S and MK3/S. +0.8.8 Updated firmware version for MK2.5/S and MK3/S. 0.8.7 Updated firmware version 0.8.6 Updated firmware version for MK2.5/S and MK3/S 0.8.5 Updated SL1 printer and material settings @@ -57,6 +69,8 @@ min_slic3r_version = 1.42.0-alpha 0.4.0-alpha3 Update of SLA profiles 0.4.0-alpha2 First SLA profiles min_slic3r_version = 1.41.3-alpha +0.4.12 Updated firmware version for MK2.5/S and MK3/S. +0.4.11 Updated firmware version for MK2.5/S and MK3/S. 0.4.10 Updated firmware version 0.4.9 Updated firmware version for MK2.5/S and MK3/S 0.4.8 MK2.5/3/S FW update @@ -69,6 +83,7 @@ min_slic3r_version = 1.41.3-alpha 0.4.1 New MK2.5S and MK3S FW versions 0.4.0 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt min_slic3r_version = 1.41.1 +0.3.11 Updated firmware version for MK2.5/S and MK3/S. 0.3.10 Updated firmware version 0.3.9 Updated firmware version for MK2.5/S and MK3/S 0.3.8 MK2.5/3/S FW update @@ -127,4 +142,4 @@ min_slic3r_version = 1.40.0-alpha 0.1.3 Fixed an incorrect position of the max_print_height parameter 0.1.2 Wipe tower changes 0.1.1 Minor print speed adjustments -0.1.0 Initial \ No newline at end of file +0.1.0 Initial diff --git a/resources/profiles/PrusaResearch.ini b/resources/profiles/PrusaResearch.ini index 60ecbbccf..a5b4fbf04 100644 --- a/resources/profiles/PrusaResearch.ini +++ b/resources/profiles/PrusaResearch.ini @@ -9,7 +9,7 @@ technologies = FFF; SLA # Configuration version of this file. Config file will only be installed, if the config_version differs. # This means, the server may force the PrusaSlicer configuration to be downgraded. -config_version = 1.1.6 +config_version = 1.1.10 # Where to get the updates from? config_update_url = changelog_url = @@ -29,7 +29,7 @@ technology = FFF family = MINI bed_model = mini_bed.stl bed_texture = mini.svg -default_materials = Generic PLA; Generic ABS @MINI; Generic PETG @MINI; Prusament PLA; Prusament PETG @MINI; Prusament ASA @MINI +default_materials = Generic PLA; Generic ABS @MINI; Generic PETG @MINI; Prusament PLA; Prusament PETG @MINI; Prusament ASA @MINI; Prusament PC Blend @MINI [printer_model:MK3S] name = Original Prusa i3 MK3S @@ -38,7 +38,7 @@ technology = FFF family = MK3 bed_model = mk3_bed.stl bed_texture = mk3.svg -default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA; Prusament PETG; Prusament ASA +default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA; Prusament PETG; Prusament ASA; Prusament PC Blend [printer_model:MK3] name = Original Prusa i3 MK3 @@ -47,7 +47,7 @@ technology = FFF family = MK3 bed_model = mk3_bed.stl bed_texture = mk3.svg -default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA; Prusament PETG; Prusament ASA +default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA; Prusament PETG; Prusament ASA; Prusament PC Blend [printer_model:MK3SMMU2S] name = Original Prusa i3 MK3S MMU2S @@ -56,7 +56,7 @@ technology = FFF family = MK3 bed_model = mk3_bed.stl bed_texture = mk3.svg -default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA @MMU2; Prusament PETG @MMU2; Prusament ASA @MMU2; Verbatim BVOH @MMU2 +default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA @MMU2; Prusament PETG @MMU2; Prusament ASA @MMU2; Verbatim BVOH @MMU2; Prusament PC Blend @MMU2 [printer_model:MK3MMU2] name = Original Prusa i3 MK3 MMU2 @@ -65,7 +65,7 @@ technology = FFF family = MK3 bed_model = mk3_bed.stl bed_texture = mk3.svg -default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA @MMU2; Prusament PETG @MMU2; Prusament ASA @MMU2; Verbatim BVOH @MMU2 +default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA @MMU2; Prusament PETG @MMU2; Prusament ASA @MMU2; Verbatim BVOH @MMU2; Prusament PC Blend @MMU2 [printer_model:MK2.5S] name = Original Prusa i3 MK2.5S @@ -74,7 +74,7 @@ technology = FFF family = MK2.5 bed_model = mk3_bed.stl bed_texture = mk3.svg -default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA; Prusament PETG; Prusament ASA +default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA; Prusament PETG; Prusament ASA; Prusament PC Blend [printer_model:MK2.5] name = Original Prusa i3 MK2.5 @@ -83,7 +83,7 @@ technology = FFF family = MK2.5 bed_model = mk3_bed.stl bed_texture = mk3.svg -default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA; Prusament PETG; Prusament ASA +default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA; Prusament PETG; Prusament ASA; Prusament PC Blend [printer_model:MK2.5SMMU2S] name = Original Prusa i3 MK2.5S MMU2S @@ -92,7 +92,7 @@ technology = FFF family = MK2.5 bed_model = mk3_bed.stl bed_texture = mk3.svg -default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA @MMU2; Prusament PETG @MMU2; Prusament ASA @MMU2; Verbatim BVOH @MMU2 +default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA @MMU2; Prusament PETG @MMU2; Prusament ASA @MMU2; Verbatim BVOH @MMU2; Prusament PC Blend @MMU2 [printer_model:MK2.5MMU2] name = Original Prusa i3 MK2.5 MMU2 @@ -101,7 +101,7 @@ technology = FFF family = MK2.5 bed_model = mk3_bed.stl bed_texture = mk3.svg -default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA @MMU2; Prusament PETG @MMU2; Prusament ASA @MMU2; Verbatim BVOH @MMU2 +default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA @MMU2; Prusament PETG @MMU2; Prusament ASA @MMU2; Verbatim BVOH @MMU2; Prusament PC Blend @MMU2 [printer_model:MK2S] name = Original Prusa i3 MK2S @@ -110,7 +110,7 @@ technology = FFF family = MK2 bed_model = mk2_bed.stl bed_texture = mk2.svg -default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA; Prusament PETG; Prusament ASA +default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA; Prusament PETG; Prusament ASA; Prusament PC Blend [printer_model:MK2SMM] name = Original Prusa i3 MK2S MMU1 @@ -119,7 +119,7 @@ technology = FFF family = MK2 bed_model = mk2_bed.stl bed_texture = mk2.svg -default_materials = Generic PLA; Generic ABS; Generic PETG @MMU1; Prusament PLA; Prusament PETG @MMU1; Prusament ASA +default_materials = Generic PLA; Generic ABS; Generic PETG @MMU1; Prusament PLA; Prusament PETG @MMU1; Prusament ASA; Prusament PC Blend [printer_model:SL1] name = Original Prusa SL1 @@ -571,7 +571,7 @@ solid_infill_speed = 50 inherits = *0.10mm*; *MK3* # alias = 0.10mm DETAIL bridge_speed = 30 -compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 and ! single_extruder_multi_material +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 external_perimeter_speed = 25 infill_acceleration = 1000 infill_speed = 80 @@ -705,6 +705,7 @@ support_material_extruder = 5 support_material_interface_extruder = 5 perimeter_speed = 40 solid_infill_speed = 40 +infill_speed = 80 top_infill_extrusion_width = 0.45 top_solid_infill_speed = 30 @@ -830,6 +831,7 @@ support_material_extruder = 5 support_material_interface_extruder = 5 perimeter_speed = 40 solid_infill_speed = 40 +infill_speed = 80 top_infill_extrusion_width = 0.45 top_solid_infill_speed = 30 @@ -1089,10 +1091,10 @@ max_print_speed = 100 perimeter_speed = 45 solid_infill_speed = 70 top_solid_infill_speed = 45 -external_perimeter_extrusion_width = 0.7 -perimeter_extrusion_width = 0.7 -infill_extrusion_width = 0.7 -solid_infill_extrusion_width = 0.7 +external_perimeter_extrusion_width = 0.68 +perimeter_extrusion_width = 0.68 +infill_extrusion_width = 0.68 +solid_infill_extrusion_width = 0.68 # XXXXXXXXXXXXXXXXXXXXXX # XXX----- MK2.5 ----XXX @@ -1111,6 +1113,12 @@ inherits = 0.15mm OPTIMAL compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and nozzle_diameter[0]==0.4 single_extruder_multi_material_priming = 0 +# MK2.5 MMU2 # +[print:0.10mm DETAIL @MK2.5] +inherits = 0.10mm DETAIL +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and nozzle_diameter[0]==0.4 and num_extruders>1 +single_extruder_multi_material_priming = 0 + # MK2.5 MMU2 # [print:0.15mm OPTIMAL SOLUBLE FULL @MK2.5] inherits = 0.15mm OPTIMAL SOLUBLE FULL @@ -1459,7 +1467,7 @@ first_layer_temperature = 215 max_fan_speed = 100 min_fan_speed = 100 temperature = 210 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{elsif nozzle_diameter[0]==0.6}18{else}30{endif} ; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.04{else}0.05{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K18{else}M900 K30{endif} ; Filament gcode LA 1.0" [filament:*PET*] inherits = *common* @@ -1475,7 +1483,7 @@ first_layer_bed_temperature = 85 first_layer_temperature = 230 max_fan_speed = 50 min_fan_speed = 30 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{elsif nozzle_diameter[0]==0.6}24{else}45{endif} ; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.04{else}0.08{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K24{else}M900 K45{endif} ; Filament gcode LA 1.0" temperature = 240 filament_retract_length = 1.4 filament_retract_lift = 0.2 @@ -1568,7 +1576,7 @@ first_layer_temperature = 255 max_fan_speed = 30 min_fan_speed = 20 temperature = 255 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{elsif nozzle_diameter[0]==0.6}18{else}30{endif} ; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.02{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" compatible_printers_condition = printer_model!="MINI" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) [filament:*ABSC*] @@ -1578,7 +1586,7 @@ bridge_fan_speed = 25 cooling = 1 disable_fan_first_layers = 4 fan_always_on = 0 -fan_below_layer_time = 20 +fan_below_layer_time = 30 slowdown_below_layer_time = 20 filament_colour = #FFF2EC filament_max_volumetric_speed = 11 @@ -1590,7 +1598,7 @@ max_fan_speed = 15 min_fan_speed = 15 min_print_speed = 15 temperature = 255 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{elsif nozzle_diameter[0]==0.6}18{else}30{endif} ; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.02{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" compatible_printers_condition = printer_model!="MINI" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) [filament:*FLEX*] @@ -1623,7 +1631,7 @@ inherits = *PLA* filament_vendor = ColorFabb compatible_printers_condition = nozzle_diameter[0]>0.35 and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) extrusion_multiplier = 1.2 -filament_cost = 72.89 +filament_cost = 49.99 filament_density = 3.9 filament_colour = #804040 filament_max_volumetric_speed = 9 @@ -1633,7 +1641,7 @@ inherits = *PLA* filament_vendor = ColorFabb compatible_printers_condition = nozzle_diameter[0]>0.35 and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) extrusion_multiplier = 1.2 -filament_cost = 72.89 +filament_cost = 49.99 filament_density = 3.13 filament_colour = #808080 filament_max_volumetric_speed = 8 @@ -1663,7 +1671,7 @@ first_layer_bed_temperature = 105 first_layer_temperature = 270 max_fan_speed = 20 min_fan_speed = 10 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}45{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.05{else}0.08{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K24{else}M900 K45{endif} ; Filament gcode LA 1.0" temperature = 270 [filament:ColorFabb PLA-PHA] @@ -1677,12 +1685,12 @@ inherits = *PLA* filament_vendor = ColorFabb compatible_printers_condition = nozzle_diameter[0]>0.35 and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) extrusion_multiplier = 1.1 -filament_cost = 58.30 +filament_cost = 38.99 filament_density = 1.15 filament_colour = #dfc287 filament_max_volumetric_speed = 9 first_layer_temperature = 200 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/}0{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}0{else}10{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.02{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" temperature = 200 filament_retract_lift = 0.2 @@ -1691,19 +1699,19 @@ inherits = *PLA* filament_vendor = ColorFabb compatible_printers_condition = nozzle_diameter[0]>0.35 and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) extrusion_multiplier = 1.1 -filament_cost = 58.30 +filament_cost = 38.99 filament_density = 1.18 filament_colour = #634d33 filament_max_volumetric_speed = 6 first_layer_temperature = 220 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/}0{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}0{else}10{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.02{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" temperature = 220 filament_retract_lift = 0.2 [filament:ColorFabb XT] inherits = *PET* filament_vendor = ColorFabb -filament_cost = 58.30 +filament_cost = 38.99 filament_density = 1.27 first_layer_bed_temperature = 90 first_layer_temperature = 260 @@ -1712,17 +1720,17 @@ temperature = 270 [filament:ColorFabb XT-CF20] inherits = *PET* filament_vendor = ColorFabb -extrusion_multiplier = 1.2 -filament_cost = 72.89 +extrusion_multiplier = 1.05 +filament_cost = 49.99 filament_density = 1.35 filament_colour = #804040 -filament_max_volumetric_speed = 1 +filament_max_volumetric_speed = 2 first_layer_bed_temperature = 90 first_layer_temperature = 260 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.04{else}0.06{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K18{else}M900 K30{endif} ; Filament gcode LA 1.0" temperature = 260 filament_retract_length = nil -filament_retract_lift = 0.2 +filament_retract_lift = 0.4 [filament:ColorFabb nGen] inherits = *PET* @@ -1758,6 +1766,41 @@ filament_retract_length = nil filament_retract_lift = 0 compatible_printers_condition = nozzle_diameter[0]>0.35 and printer_model!="MINI" and num_extruders==1 && ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and single_extruder_multi_material) +[filament:Kimya PETG Carbon] +inherits = *PET* +filament_vendor = Kimya +extrusion_multiplier = 1.05 +filament_cost = 150 +filament_density = 1.317 +filament_colour = #804040 +filament_max_volumetric_speed = 6 +first_layer_bed_temperature = 85 +first_layer_temperature = 240 +temperature = 240 +filament_retract_length = nil +filament_retract_lift = 0.3 +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.04{else}0.06{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K15{else}M900 K30{endif} ; Filament gcode LA 1.0" + +[filament:Kimya ABS Carbon] +inherits = *ABSC* +filament_vendor = Kimya +filament_cost = 140.4 +filament_density = 1.032 +filament_colour = #804040 +filament_max_volumetric_speed = 6 +first_layer_temperature = 260 +temperature = 260 + +[filament:Kimya ABS Kevlar] +inherits = *ABSC* +filament_vendor = Kimya +filament_cost = 140.4 +filament_density = 1.037 +filament_colour = #804040 +filament_max_volumetric_speed = 6 +first_layer_temperature = 260 +temperature = 260 + [filament:E3D Edge] inherits = *PET* filament_vendor = E3D @@ -1778,7 +1821,7 @@ temperature = 270 [filament:Fillamentum PLA] inherits = *PLA* filament_vendor = Fillamentum -filament_cost = 25.4 +filament_cost = 21.99 filament_density = 1.24 [filament:Fillamentum ABS] @@ -1817,17 +1860,77 @@ bed_temperature = 110 cooling = 1 min_fan_speed = 20 max_fan_speed = 20 +bridge_fan_speed = 30 min_print_speed = 15 slowdown_below_layer_time = 15 disable_fan_first_layers = 4 filament_type = ASA filament_colour = #FFF2EC -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{elsif nozzle_diameter[0]==0.6}12{else}20{endif} ; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.02{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" + +[filament:Prusament PC Blend] +inherits = *ABS* +filament_vendor = Prusa Polymers +filament_cost = 49.99 +filament_density = 1.22 +fan_always_on = 0 +first_layer_temperature = 275 +first_layer_bed_temperature = 110 +temperature = 275 +bed_temperature = 115 +cooling = 1 +min_fan_speed = 20 +max_fan_speed = 20 +bridge_fan_speed = 30 +min_print_speed = 15 +slowdown_below_layer_time = 20 +disable_fan_first_layers = 4 +fan_below_layer_time = 30 +filament_type = PC +filament_colour = #DEE0E6 +filament_max_volumetric_speed = 8 +filament_retract_length = 1 +filament_retract_lift = 0.2 +compatible_printers_condition = printer_notes!~/.*PRINTER_MODEL_MK(2|2.5).*/ and printer_model!="MINI" and ! single_extruder_multi_material +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.04{else}0.07{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K17{else}M900 K40{endif} ; Filament gcode LA 1.0" + +[filament:Prusament PC Blend @MK2] +inherits = *ABS* +filament_vendor = Prusa Polymers +filament_cost = 49.99 +filament_density = 1.22 +fan_always_on = 0 +first_layer_temperature = 275 +first_layer_bed_temperature = 105 +temperature = 275 +bed_temperature = 110 +cooling = 1 +min_fan_speed = 20 +max_fan_speed = 20 +min_print_speed = 15 +bridge_fan_speed = 30 +slowdown_below_layer_time = 20 +disable_fan_first_layers = 6 +fan_below_layer_time = 30 +filament_type = PC +filament_colour = #DEE0E6 +filament_max_volumetric_speed = 8 +filament_retract_length = 1 +filament_retract_lift = 0.2 +compatible_printers_condition = printer_model!="MK2SMM" and printer_notes=~/.*PRINTER_MODEL_MK(2|2.5).*/ and ! (printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and single_extruder_multi_material) +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.04{else}0.07{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K17{else}M900 K40{endif} ; Filament gcode LA 1.0" + +[filament:Prusament PC Blend @MK2MMU1] +inherits = Prusament PC Blend @MK2 +filament_retract_length = nil +filament_retract_lift = 0.2 +compatible_printers_condition = printer_model=="MK2SMM" +start_filament_gcode = "M900 K200 ; Filament gcode LA 1.0" [filament:Fillamentum CPE] inherits = *PET* filament_vendor = Fillamentum -filament_cost = 54.1 +filament_cost = 34.99 filament_density = 1.25 filament_type = CPE first_layer_bed_temperature = 90 @@ -1835,6 +1938,7 @@ first_layer_temperature = 275 max_fan_speed = 50 min_fan_speed = 50 temperature = 275 +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.04{else}0.07{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K24{else}M900 K45{endif} ; Filament gcode LA 1.0" [filament:Fillamentum Timberfill] inherits = *PLA* @@ -1846,7 +1950,7 @@ filament_density = 1.15 filament_colour = #804040 filament_max_volumetric_speed = 10 first_layer_temperature = 190 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/}0{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}0{else}10{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.02{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" temperature = 190 filament_retract_lift = 0.2 @@ -1860,7 +1964,7 @@ filament_density = 1.58 filament_colour = #804040 filament_max_volumetric_speed = 9 first_layer_temperature = 220 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/}0{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}0{else}10{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.02{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" temperature = 220 filament_retract_lift = 0.2 @@ -1886,7 +1990,14 @@ filament_density = 1.04 inherits = *ABSC* filament_vendor = Plasty Mladec filament_cost = 27.82 -filament_density = 1.04 +filament_density = 1.08 + +[filament:Verbatim ABS] +inherits = *ABSC* +filament_vendor = Verbatim +filament_cost = 25.87 +filament_density = 1.05 +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.03{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" [filament:Generic PETG] inherits = *PET* @@ -1907,6 +2018,28 @@ filament_vendor = Generic filament_cost = 25.4 filament_density = 1.24 +[filament:Devil Design PLA] +inherits = *PLA* +filament_vendor = Devil Design +filament_cost = 20.99 +filament_density = 1.24 + +[filament:Devil Design PETG] +inherits = *PET* +filament_vendor = Devil Design +filament_cost = 20.99 +filament_density = 1.23 +first_layer_temperature = 230 +first_layer_bed_temperature = 85 +temperature = 230 +bed_temperature = 90 + +[filament:Spectrum PLA] +inherits = *PLA* +filament_vendor = Spectrum +filament_cost = 21.50 +filament_density = 1.24 + [filament:Generic FLEX] inherits = *FLEX* filament_vendor = Generic @@ -1917,6 +2050,21 @@ filament_retract_length = 0 filament_retract_speed = nil filament_retract_lift = nil +[filament:Fillamentum Flexfill 92A] +inherits = *FLEX* +filament_vendor = Fillamentum +filament_cost = 33.99 +filament_density = 1.20 +filament_max_volumetric_speed = 1.2 +filament_retract_length = 0 +filament_retract_speed = nil +filament_retract_lift = nil +fan_always_on = 1 +cooling = 0 +max_fan_speed = 50 +min_fan_speed = 50 +disable_fan_first_layers = 5 + [filament:SainSmart TPU] inherits = *FLEX* filament_vendor = SainSmart @@ -1957,7 +2105,7 @@ bridge_fan_speed = 100 max_fan_speed = 50 min_fan_speed = 50 filament_retract_before_travel = 3 -filament_cost = 51.45 +filament_cost = 34.99 filament_density = 1.22 filament_retract_length = 2 filament_retract_speed = 50 @@ -1986,7 +2134,7 @@ filament_max_volumetric_speed = 8 [filament:PrimaSelect PVA+] inherits = *PLA* filament_vendor = PrimaSelect -filament_cost = 108 +filament_cost = 45.01 filament_density = 1.23 cooling = 0 fan_always_on = 0 @@ -1996,13 +2144,13 @@ filament_ramming_parameters = "120 100 8.3871 8.6129 8.93548 9.22581 9.48387 9.7 filament_soluble = 1 filament_type = PVA first_layer_temperature = 195 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/}0{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}0{else}10{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.02{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" temperature = 195 [filament:Prusa ABS] inherits = *ABSC* filament_vendor = Made for Prusa -filament_cost = 27.82 +filament_cost = 22.99 filament_density = 1.08 [filament:*ABS MMU2*] @@ -2022,6 +2170,32 @@ filament_unloading_speed = 20 inherits = *ABS MMU2* filament_vendor = Generic +[filament:Generic HIPS @MMU2] +inherits = *ABS MMU2* +filament_vendor = Generic +filament_cost = 27.3 +filament_density = 1.04 +fan_always_on = 1 +first_layer_temperature = 230 +first_layer_bed_temperature = 100 +temperature = 230 +bed_temperature = 110 +cooling = 1 +min_fan_speed = 20 +max_fan_speed = 20 +bridge_fan_speed = 50 +min_print_speed = 15 +slowdown_below_layer_time = 20 +disable_fan_first_layers = 3 +filament_cooling_final_speed = 2 +filament_cooling_initial_speed = 3 +filament_cooling_moves = 1 +filament_type = HIPS +filament_soluble = 1 +filament_colour = #FFFFD7 +filament_ramming_parameters = "130 120 2.74194 2.96774 3.25806 3.77419 4.83871 6.3871 8.09677 9.64516 10.7419 11.2903| 0.05 2.66451 0.45 3.05805 0.95 4.05807 1.45 7.13871 1.95 10.2806 2.45 11.4194 2.95 11.342 3.45 11.4065 3.95 7.6 4.45 7.6 4.95 7.6" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.03{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" + [filament:Prusament ASA @MMU2] inherits = *ABS MMU2* filament_vendor = Prusa Polymers @@ -2035,6 +2209,7 @@ bed_temperature = 110 cooling = 1 min_fan_speed = 20 max_fan_speed = 20 +bridge_fan_speed = 30 min_print_speed = 15 slowdown_below_layer_time = 15 disable_fan_first_layers = 4 @@ -2043,15 +2218,46 @@ filament_cooling_initial_speed = 3 filament_cooling_moves = 1 filament_type = ASA filament_colour = #FFF2EC -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{elsif nozzle_diameter[0]==0.6}12{else}20{endif} ; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.02{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" + +[filament:Prusament PC Blend @MMU2] +inherits = *ABS MMU2* +filament_vendor = Prusa Polymers +filament_cost = 49.99 +filament_density = 1.22 +fan_always_on = 0 +fan_below_layer_time = 30 +first_layer_temperature = 265 +first_layer_bed_temperature = 105 +temperature = 265 +bed_temperature = 110 +cooling = 1 +min_fan_speed = 20 +max_fan_speed = 20 +bridge_fan_speed = 30 +min_print_speed = 15 +slowdown_below_layer_time = 20 +disable_fan_first_layers = 4 +filament_cooling_final_speed = 2 +filament_cooling_initial_speed = 3 +filament_cooling_moves = 1 +filament_max_volumetric_speed = 8 +filament_retract_length = 1 +filament_retract_lift = 0.2 +filament_ramming_parameters = "130 120 2.70968 2.93548 3.32258 3.83871 4.58065 5.54839 6.51613 7.35484 7.93548 8.16129| 0.05 2.66451 0.45 3.05805 0.95 4.05807 1.45 5.97742 1.95 7.69999 2.45 8.1936 2.95 11.342 3.45 11.4065 3.95 7.6 4.45 7.6 4.95 7.6" +filament_type = PC +filament_colour = #DEE0E6 +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.04{else}0.07{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K17{else}M900 K40{endif} ; Filament gcode LA 1.0" [filament:Prusa ABS @MMU2] inherits = *ABS MMU2* filament_vendor = Made for Prusa +filament_cost = 22.99 [filament:Plasty Mladec ABS @MMU2] inherits = *ABS MMU2* filament_vendor = Plasty Mladec +filament_density = 1.08 [filament:Prusa HIPS] inherits = *ABS* @@ -2069,7 +2275,7 @@ filament_type = HIPS first_layer_temperature = 220 max_fan_speed = 20 min_fan_speed = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/}0{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}0{else}10{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.03{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" temperature = 220 [filament:Generic HIPS] @@ -2088,14 +2294,14 @@ filament_type = HIPS first_layer_temperature = 230 max_fan_speed = 20 min_fan_speed = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/}0{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}0{else}10{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.03{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" temperature = 230 [filament:Prusa PETG] inherits = *PET* renamed_from = "Prusa PET" filament_vendor = Made for Prusa -filament_cost = 27.82 +filament_cost = 22.99 filament_density = 1.27 compatible_printers_condition = nozzle_diameter[0]!=0.6 and printer_model!="MK2SMM" and printer_model!="MINI" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) @@ -2118,7 +2324,7 @@ inherits = *PET* filament_vendor = Prusa Polymers first_layer_temperature = 240 temperature = 250 -filament_cost = 24.99 +filament_cost = 29.99 filament_density = 1.27 filament_type = PETG compatible_printers_condition = nozzle_diameter[0]!=0.6 and printer_model!="MK2SMM" and printer_model!="MINI" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) @@ -2127,7 +2333,7 @@ compatible_printers_condition = nozzle_diameter[0]!=0.6 and printer_model!="MK2S inherits = *PET06* renamed_from = "Prusa PET 0.6 nozzle"; "Prusa PETG 0.6 nozzle" filament_vendor = Made for Prusa -filament_cost = 27.82 +filament_cost = 22.99 filament_density = 1.27 [filament:Prusament PETG @0.6 nozzle] @@ -2135,7 +2341,7 @@ inherits = *PET06* filament_vendor = Prusa Polymers first_layer_temperature = 240 temperature = 250 -filament_cost = 24.99 +filament_cost = 29.99 filament_density = 1.27 filament_type = PETG @@ -2148,6 +2354,17 @@ filament_cost = 27.92 filament_density = 1.27 filament_type = PETG +[filament:Devil Design PETG @0.6 nozzle] +inherits = *PET06* +filament_vendor = Devil Design +first_layer_temperature = 230 +first_layer_bed_temperature = 85 +temperature = 230 +bed_temperature = 90 +filament_cost = 20.99 +filament_density = 1.23 +filament_type = PETG + [filament:Verbatim PETG @0.6 nozzle] inherits = *PET06* filament_vendor = Verbatim @@ -2202,11 +2419,14 @@ filament_vendor = Plasty Mladec inherits = *PET MMU2* renamed_from = "Prusa PET MMU2"; "Prusa PETG MMU2" filament_vendor = Made for Prusa +filament_cost = 22.99 [filament:Prusament PETG @MMU2] inherits = *PET MMU2* filament_type = PETG filament_vendor = Prusa Polymers +filament_cost = 29.99 +filament_density = 1.27 [filament:Generic PETG @MMU2 0.6 nozzle] inherits = *PET MMU2 06* @@ -2222,6 +2442,8 @@ filament_vendor = Made for Prusa inherits = *PET MMU2 06* filament_type = PETG filament_vendor = Prusa Polymers +filament_cost = 29.99 +filament_density = 1.27 [filament:Plasty Mladec PETG @MMU2 0.6 nozzle] inherits = *PET MMU2 06* @@ -2231,7 +2453,7 @@ filament_vendor = Plasty Mladec [filament:Prusa PLA] inherits = *PLA* filament_vendor = Made for Prusa -filament_cost = 25.4 +filament_cost = 20.99 filament_density = 1.24 [filament:Fiberlogy PLA] @@ -2313,18 +2535,39 @@ filament_vendor = Generic [filament:Prusa PLA @MMU2] inherits = *PLA MMU2* filament_vendor = Made for Prusa +filament_cost = 20.99 [filament:Prusament PLA @MMU2] inherits = *PLA MMU2* filament_vendor = Prusa Polymers +filament_cost = 24.99 +filament_density = 1.24 + +[filament:Fillamentum PLA @MMU2] +inherits = *PLA MMU2* +filament_vendor = Fillamentum +filament_cost = 21.99 +filament_density = 1.24 [filament:SemiFlex or Flexfill 98A] inherits = *FLEX* filament_vendor = Generic -filament_cost = 82 +filament_cost = 33.99 filament_density = 1.22 filament_max_volumetric_speed = 1.35 +[filament:Fillamentum Flexfill 98A] +inherits = *FLEX* +filament_vendor = Fillamentum +filament_cost = 33.99 +filament_density = 1.23 +filament_max_volumetric_speed = 1.35 +fan_always_on = 1 +cooling = 0 +max_fan_speed = 50 +min_fan_speed = 50 +disable_fan_first_layers = 5 + [filament:Taulman Bridge] inherits = *common* filament_vendor = Taulman @@ -2337,14 +2580,38 @@ disable_fan_first_layers = 3 fan_always_on = 0 fan_below_layer_time = 20 filament_colour = #DEE0E6 -filament_max_volumetric_speed = 10 +filament_max_volumetric_speed = 7 filament_soluble = 0 filament_type = NYLON first_layer_bed_temperature = 60 first_layer_temperature = 240 -max_fan_speed = 5 +max_fan_speed = 0 min_fan_speed = 0 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/}0{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}0{else}10{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.04{else}0.08{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K24{else}M900 K45{endif} ; Filament gcode LA 1.0" +temperature = 250 + +[filament:Fillamentum Nylon FX256] +inherits = *common* +filament_vendor = Fillamentum +filament_cost = 56.99 +filament_density = 1.01 +bed_temperature = 90 +bridge_fan_speed = 30 +cooling = 1 +disable_fan_first_layers = 6 +fan_always_on = 0 +fan_below_layer_time = 20 +min_print_speed = 15 +slowdown_below_layer_time = 20 +filament_colour = #DEE0E6 +filament_max_volumetric_speed = 6 +filament_soluble = 0 +filament_type = NYLON +first_layer_bed_temperature = 90 +first_layer_temperature = 250 +max_fan_speed = 0 +min_fan_speed = 0 +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.05{else}0.1{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K28{else}M900 K48{endif} ; Filament gcode LA 1.0" temperature = 250 [filament:Taulman T-Glase] @@ -2359,7 +2626,7 @@ first_layer_bed_temperature = 90 first_layer_temperature = 240 max_fan_speed = 5 min_fan_speed = 0 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.04{else}0.06{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K18{else}M900 K30{endif} ; Filament gcode LA 1.0" [filament:Verbatim PLA] inherits = *PLA* @@ -2370,7 +2637,7 @@ filament_density = 1.24 [filament:Verbatim BVOH] inherits = *common* filament_vendor = Verbatim -filament_cost = 218 +filament_cost = 79.99 filament_density = 1.23 bed_temperature = 60 bridge_fan_speed = 100 @@ -2387,7 +2654,7 @@ first_layer_bed_temperature = 60 first_layer_temperature = 215 max_fan_speed = 100 min_fan_speed = 100 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/}0{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}0{else}10{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.02{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" temperature = 210 [filament:Verbatim BVOH @MMU2] @@ -2424,7 +2691,7 @@ filament_colour = #FFFFD7 filament_cooling_final_speed = 2 filament_cooling_initial_speed = 4 filament_cooling_moves = 2 -filament_cost = 25.4 +filament_cost = 45.01 filament_density = 1.24 filament_diameter = 1.75 filament_load_time = 15 @@ -2445,7 +2712,7 @@ max_fan_speed = 100 min_fan_speed = 100 min_print_speed = 15 slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.02{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" temperature = 195 [filament:Verbatim PP] @@ -2467,7 +2734,7 @@ first_layer_bed_temperature = 100 first_layer_temperature = 220 max_fan_speed = 100 min_fan_speed = 100 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/}0{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}0{else}10{endif}; Filament gcode" +start_filament_gcode = "M900 K0 ; Filament gcode" temperature = 220 ## Filaments MMU1 @@ -2494,7 +2761,7 @@ temperature = 270 inherits = *PETMMU1* filament_vendor = ColorFabb filament_type = PETG -filament_cost = 62.9 +filament_cost = 38.99 filament_density = 1.27 first_layer_bed_temperature = 90 first_layer_temperature = 260 @@ -2504,11 +2771,11 @@ temperature = 270 inherits = *PETMMU1* filament_vendor = ColorFabb compatible_printers_condition = nozzle_diameter[0]>0.35 and printer_model=="MK2SMM" -extrusion_multiplier = 1.2 -filament_cost = 80.65 +extrusion_multiplier = 1.05 +filament_cost = 49.99 filament_density = 1.35 filament_colour = #804040 -filament_max_volumetric_speed = 1 +filament_max_volumetric_speed = 2 first_layer_bed_temperature = 90 first_layer_temperature = 260 start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" @@ -2537,7 +2804,7 @@ filament_type = EDGE [filament:Fillamentum CPE @MMU1] inherits = *PETMMU1* filament_vendor = Fillamentum -filament_cost = 54.1 +filament_cost = 34.99 filament_density = 1.25 filament_type = CPE first_layer_bed_temperature = 90 @@ -2553,6 +2820,16 @@ filament_vendor = Generic filament_cost = 27.82 filament_density = 1.27 +[filament:Devil Design PETG @MMU1] +inherits = *PETMMU1* +filament_vendor = Devil Design +filament_cost = 20.99 +filament_density = 1.23 +first_layer_temperature = 230 +first_layer_bed_temperature = 85 +temperature = 230 +bed_temperature = 90 + [filament:Plasty Mladec PETG @MMU1] inherits = *PETMMU1* filament_vendor = Plasty Mladec @@ -2575,7 +2852,7 @@ filament_density = 1.27 inherits = *PETMMU1* renamed_from = "Prusa PET MMU1"; "Prusa PETG MMU1" filament_vendor = Made for Prusa -filament_cost = 27.82 +filament_cost = 22.99 filament_density = 1.27 [filament:Prusament PETG @MMU1] @@ -2583,7 +2860,7 @@ inherits = *PETMMU1* filament_vendor = Prusa Polymers first_layer_temperature = 240 temperature = 250 -filament_cost = 24.99 +filament_cost = 29.99 filament_density = 1.27 filament_type = PETG @@ -2633,6 +2910,17 @@ filament_cost = 27.82 filament_density = 1.27 compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.6 +[filament:Devil Design PETG @MINI] +inherits = Generic PETG; *PETMINI* +filament_vendor = Devil Design +filament_cost = 20.99 +filament_density = 1.23 +first_layer_temperature = 230 +first_layer_bed_temperature = 85 +temperature = 230 +bed_temperature = 90 +compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.6 + [filament:Plasty Mladec PETG @MINI] inherits = Generic PETG; *PETMINI* filament_vendor = Plasty Mladec @@ -2665,9 +2953,29 @@ min_fan_speed = 15 max_fan_speed = 15 slowdown_below_layer_time = 20 disable_fan_first_layers = 4 -fan_below_layer_time = 20 +fan_below_layer_time = 30 bridge_fan_speed = 25 +[filament:Kimya ABS Carbon @MINI] +inherits = *ABSMINI* +filament_vendor = Kimya +filament_cost = 140.4 +filament_density = 1.032 +filament_colour = #804040 +filament_max_volumetric_speed = 6 +first_layer_temperature = 260 +temperature = 260 + +[filament:Kimya ABS Kevlar @MINI] +inherits = *ABSMINI* +filament_vendor = Kimya +filament_cost = 140.4 +filament_density = 1.037 +filament_colour = #804040 +filament_max_volumetric_speed = 6 +first_layer_temperature = 260 +temperature = 260 + [filament:Esun ABS @MINI] inherits = Generic ABS; *ABSMINI* filament_vendor = Esun @@ -2679,7 +2987,7 @@ min_fan_speed = 15 max_fan_speed = 15 slowdown_below_layer_time = 20 disable_fan_first_layers = 4 -fan_below_layer_time = 20 +fan_below_layer_time = 30 bridge_fan_speed = 25 [filament:Hatchbox ABS @MINI] @@ -2693,7 +3001,7 @@ min_fan_speed = 15 max_fan_speed = 15 slowdown_below_layer_time = 20 disable_fan_first_layers = 4 -fan_below_layer_time = 20 +fan_below_layer_time = 30 bridge_fan_speed = 25 [filament:Plasty Mladec ABS @MINI] @@ -2707,7 +3015,21 @@ min_fan_speed = 15 max_fan_speed = 15 slowdown_below_layer_time = 20 disable_fan_first_layers = 4 -fan_below_layer_time = 20 +fan_below_layer_time = 30 +bridge_fan_speed = 25 + +[filament:Verbatim ABS @MINI] +inherits = Generic ABS; *ABSMINI* +filament_vendor = Verbatim +filament_cost = 25.87 +filament_density = 1.05 +fan_always_on = 0 +cooling = 1 +min_fan_speed = 15 +max_fan_speed = 15 +slowdown_below_layer_time = 20 +disable_fan_first_layers = 4 +fan_below_layer_time = 30 bridge_fan_speed = 25 [filament:Prusament PETG @MINI] @@ -2716,20 +3038,44 @@ filament_vendor = Prusa Polymers first_layer_temperature = 240 temperature = 250 filament_density = 1.27 -filament_cost = 24.99 +filament_cost = 29.99 compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.6 +[filament:Kimya PETG Carbon @MINI] +inherits = *PETMINI* +filament_vendor = Kimya +extrusion_multiplier = 1.05 +filament_cost = 150 +filament_density = 1.317 +filament_colour = #804040 +filament_max_volumetric_speed = 6 +first_layer_bed_temperature = 85 +first_layer_temperature = 240 +temperature = 240 +filament_retract_length = nil +filament_retract_lift = 0.3 + [filament:Prusament PETG @0.6 nozzle MINI] inherits = Prusament PETG; *PETMINI06* first_layer_temperature = 240 temperature = 250 filament_density = 1.27 -filament_cost = 24.99 +filament_cost = 29.99 [filament:Generic PETG @0.6 nozzle MINI] inherits = Generic PETG; *PETMINI06* renamed_from = "Generic PET 0.6 nozzle MINI"; "Generic PETG 0.6 nozzle MINI" +[filament:Devil Design PETG @0.6 nozzle MINI] +inherits = Generic PETG; *PETMINI06* +filament_vendor = Devil Design +first_layer_temperature = 230 +first_layer_bed_temperature = 85 +temperature = 230 +bed_temperature = 90 +filament_cost = 20.99 +filament_density = 1.23 + [filament:Plasty Mladec PETG @0.6 nozzle MINI] inherits = Generic PETG; *PETMINI06* filament_vendor = Plasty Mladec @@ -2752,6 +3098,7 @@ fan_always_on = 1 cooling = 1 min_fan_speed = 20 max_fan_speed = 20 +bridge_fan_speed = 30 min_print_speed = 15 slowdown_below_layer_time = 15 disable_fan_first_layers = 4 @@ -2766,6 +3113,7 @@ filament_vendor = Fillamentum first_layer_temperature = 240 temperature = 240 filament_max_volumetric_speed = 1.35 +filament_cost = 33.99 [filament:Generic FLEX @MINI] inherits = SemiFlex or Flexfill 98A; *FLEXMINI* @@ -2827,7 +3175,7 @@ min_fan_speed = 50 min_print_speed = 15 slowdown_below_layer_time = 10 cooling = 1 -filament_cost = 51.45 +filament_cost = 34.99 [filament:Fillamentum Flexfill 92A @MINI] inherits = *FLEXMINI* @@ -2859,7 +3207,7 @@ first_layer_temperature = 265 first_layer_bed_temperature = 90 temperature = 265 filament_type = CPE -filament_cost = 54.1 +filament_cost = 34.99 filament_density = 1.25 [filament:ColorFabb nGen @MINI] @@ -2882,7 +3230,7 @@ min_fan_speed = 15 max_fan_speed = 15 slowdown_below_layer_time = 20 disable_fan_first_layers = 4 -fan_below_layer_time = 20 +fan_below_layer_time = 30 bridge_fan_speed = 25 [filament:Fillamentum ASA @MINI] @@ -2916,10 +3264,38 @@ bridge_fan_speed = -1 filament_cost = 77.3 filament_density = 1.20 +[filament:Prusament PC Blend @MINI] +inherits = *ABSMINI* +filament_vendor = Prusa Polymers +filament_cost = 49.99 +filament_density = 1.22 +fan_always_on = 0 +first_layer_temperature = 275 +first_layer_bed_temperature = 100 +temperature = 275 +bed_temperature = 100 +cooling = 1 +min_fan_speed = 20 +max_fan_speed = 20 +bridge_fan_speed = 30 +min_print_speed = 15 +slowdown_below_layer_time = 20 +disable_fan_first_layers = 4 +fan_below_layer_time = 30 +filament_type = PC +filament_colour = #DEE0E6 +filament_max_volumetric_speed = 7 +filament_retract_length = nil +filament_retract_speed = nil +filament_deretract_speed = nil +filament_retract_lift = nil +filament_retract_before_travel = nil +filament_wipe = nil + [filament:Prusa ABS @MINI] inherits = *ABSMINI* filament_vendor = Made for Prusa -filament_cost = 27.82 +filament_cost = 22.99 filament_density = 1.08 fan_always_on = 0 cooling = 1 @@ -2927,7 +3303,7 @@ min_fan_speed = 15 max_fan_speed = 15 slowdown_below_layer_time = 20 disable_fan_first_layers = 4 -fan_below_layer_time = 20 +fan_below_layer_time = 30 bridge_fan_speed = 25 [filament:Generic HIPS @MINI] @@ -2969,7 +3345,7 @@ temperature = 270 inherits = *PETMINI* filament_vendor = ColorFabb filament_type = PETG -filament_cost = 62.9 +filament_cost = 38.99 filament_density = 1.27 first_layer_bed_temperature = 90 first_layer_temperature = 260 @@ -2979,11 +3355,11 @@ temperature = 270 inherits = *PETMINI* filament_vendor = ColorFabb compatible_printers_condition = nozzle_diameter[0]>0.35 and printer_model=="MINI" -extrusion_multiplier = 1.2 -filament_cost = 80.65 +extrusion_multiplier = 1.05 +filament_cost = 49.99 filament_density = 1.35 filament_colour = #804040 -filament_max_volumetric_speed = 1 +filament_max_volumetric_speed = 2 first_layer_bed_temperature = 90 first_layer_temperature = 260 temperature = 260 @@ -3012,7 +3388,7 @@ filament_type = EDGE inherits = *PETMINI* renamed_from = "Prusa PET MINI"; "Prusa PETG MINI" filament_vendor = Made for Prusa -filament_cost = 27.82 +filament_cost = 22.99 filament_density = 1.27 compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.6 @@ -3020,7 +3396,7 @@ compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0. inherits = *PETMINI06* renamed_from = "Prusa PET 0.6 nozzle MINI"; "Prusa PETG 0.6 nozzle MINI" filament_vendor = Made for Prusa -filament_cost = 27.82 +filament_cost = 22.99 filament_density = 1.27 [sla_print:*common*] @@ -3125,6 +3501,13 @@ initial_exposure_time = 30 material_type = Tough material_vendor = 3DM +[sla_material:3DM-HR Red Wine 0.025] +inherits = *common 0.025* +exposure_time = 14 +initial_exposure_time = 35 +material_type = Tough +material_vendor = 3DM + [sla_material:BlueCast Phrozen Wax @0.025] inherits = *common 0.025* exposure_time = 15 @@ -3132,6 +3515,13 @@ initial_exposure_time = 50 material_type = Tough material_vendor = BlueCast +[sla_material:BlueCast Castable Wax @0.025] +inherits = *common 0.025* +exposure_time = 8 +initial_exposure_time = 35 +material_type = Casting +material_vendor = BlueCast + [sla_material:BlueCast EcoGray @0.025] inherits = *common 0.025* exposure_time = 6 @@ -3146,6 +3536,13 @@ initial_exposure_time = 45 material_type = Dental material_vendor = BlueCast +[sla_material:BlueCast Model Dental Gray @0.025] +inherits = *common 0.025* +exposure_time = 6 +initial_exposure_time = 35 +material_type = Dental +material_vendor = BlueCast + [sla_material:BlueCast X10 @0.025] inherits = *common 0.025* exposure_time = 4 @@ -3153,6 +3550,13 @@ initial_exposure_time = 100 material_type = Tough material_vendor = BlueCast +[sla_material:DruckWege Type D High Temp @0.025] +inherits = *common 0.025* +exposure_time = 6 +initial_exposure_time = 20 +material_type = Tough +material_vendor = DruckWege + [sla_material:Esun Bio-Photopolymer Resin White @0.025] inherits = *common 0.025* exposure_time = 5 @@ -3160,6 +3564,48 @@ initial_exposure_time = 30 material_type = Tough material_vendor = Esun +[sla_material:FunToDo Castable Blend Red @0.025] +inherits = *common 0.025* +exposure_time = 10 +initial_exposure_time = 35 +material_type = Casting +material_vendor = FunToDo + +[sla_material:FunToDo Snow White @0.025] +inherits = *common 0.025* +exposure_time = 7 +initial_exposure_time = 35 +material_type = Tough +material_vendor = FunToDo + +[sla_material:Harz Labs Basic Resin Red @0.025] +inherits = *common 0.025* +exposure_time = 10 +initial_exposure_time = 20 +material_type = Tough +material_vendor = Harz Labs + +[sla_material:Harz Labs Model Resin Cherry @0.025] +inherits = *common 0.025* +exposure_time = 10 +initial_exposure_time = 20 +material_type = Tough +material_vendor = Harz Labs + +[sla_material:Harz Labs Model Resin Black @0.025] +inherits = *common 0.025* +exposure_time = 10 +initial_exposure_time = 20 +material_type = Tough +material_vendor = Harz Labs + +[sla_material:Harz Labs Dental Cast Red @0.025] +inherits = *common 0.025* +exposure_time = 10 +initial_exposure_time = 20 +material_type = Dental +material_vendor = Harz Labs + [sla_material:Esun Standard Resin Black @0.025] inherits = *common 0.025* exposure_time = 6 @@ -3188,6 +3634,20 @@ initial_exposure_time = 30 material_type = Tough material_vendor = Resinworks 3D +[sla_material:Monocure 3D Black Rapid Resin @0.025] +inherits = *common 0.025* +exposure_time = 4 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Monocure + +[sla_material:Monocure 3D Blue Rapid Resin @0.025] +inherits = *common 0.025* +exposure_time = 4 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Monocure + ## Prusa [sla_material:Prusa Orange Tough @0.025] inherits = *common 0.025* @@ -3210,6 +3670,12 @@ initial_exposure_time = 35 material_type = Tough material_vendor = Made for Prusa +## [sla_material:Prusa Blue Tough @0.025] +## inherits = *common 0.025* +## exposure_time = 5 +## initial_exposure_time = 35 +## material_type = Tough +## material_vendor = Made for Prusa [sla_material:Prusa Maroon Tough @0.025] inherits = *common 0.025* @@ -3267,10 +3733,12 @@ initial_exposure_time = 30 material_type = Tough material_vendor = Made for Prusa -## [sla_material:Prusa ABS like White @0.025] -## inherits = *common 0.025* -## exposure_time = 6 -## initial_exposure_time = 30 +[sla_material:Prusa White ABS like @0.025] +inherits = *common 0.025* +exposure_time = 5 +initial_exposure_time = 30 +material_type = Tough +material_vendor = Made for Prusa [sla_material:Prusa Grey High Tenacity @0.025] inherits = *common 0.025* @@ -3307,6 +3775,117 @@ initial_exposure_time = 30 material_type = Tough material_vendor = Made for Prusa +[sla_material:Prusa Vibrant Orange Tough @0.025] +inherits = *common 0.025* +exposure_time = 6 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Made for Prusa + +[sla_material:Siraya Tech Simple Clear @0.025] +inherits = *common 0.025* +exposure_time = 8 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:Siraya Tech Blu Clear V2 @0.025] +inherits = *common 0.025* +exposure_time = 9 +initial_exposure_time = 30 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:Siraya Tech Blu Blue @0.025] +inherits = *common 0.025* +exposure_time = 6 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:Siraya Tech Fast Grey @0.025] +inherits = *common 0.025* +exposure_time = 6 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:Siraya Tech Tenacious @0.025] +inherits = *common 0.025* +exposure_time = 6 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:Siraya Tech Easy @0.025] +inherits = *common 0.025* +exposure_time = 11 +initial_exposure_time = 15 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:Siraya Tech Sculpt @0.025] +inherits = *common 0.025* +exposure_time = 7 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:Siraya Tech Fast Black @0.025] +inherits = *common 0.025* +exposure_time = 6 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:NextDent Model 2.0 Grey @0.025] +inherits = *common 0.025* +exposure_time = 14 +initial_exposure_time = 35 +material_type = Dental +material_vendor = NextDent + +[sla_material:NextDent Surgical Guide @0.025] +inherits = *common 0.025* +exposure_time = 6 +initial_exposure_time = 35 +material_type = Dental +material_vendor = NextDent + +[sla_material:NextDent Cast Purple @0.025] +inherits = *common 0.025* +exposure_time = 7 +initial_exposure_time = 20 +material_type = Casting +material_vendor = NextDent + +[sla_material:MakerJuice Labs Standard Red @0.025] +inherits = *common 0.025* +exposure_time = 9 +initial_exposure_time = 35 +material_type = Tough +material_vendor = MakerJuice Labs + +[sla_material:3DJake High Precision Grey @0.025] +inherits = *common 0.025* +exposure_time = 8.5 +initial_exposure_time = 35 +material_type = Tough +material_vendor = 3DJake + +[sla_material:3DJake High Precision Blue @0.025] +inherits = *common 0.025* +exposure_time = 6.5 +initial_exposure_time = 35 +material_type = Tough +material_vendor = 3DJake + +[sla_material:Zortrax Black @0.025] +inherits = *common 0.025* +exposure_time = 4 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Zortrax ########### Materials 0.05 @@ -3317,6 +3896,13 @@ initial_exposure_time = 30 material_type = Dental material_vendor = Asiga +[sla_material:Asiga PlasGRAY @0.05] +inherits = *common 0.05* +exposure_time = 29 +initial_exposure_time = 60 +material_type = Tough +material_vendor = Asiga + [sla_material:Ameralabs AMD 3 LED @0.05] inherits = *common 0.05* exposure_time = 5 @@ -3338,6 +3924,13 @@ initial_exposure_time = 50 material_type = Dental material_vendor = BlueCast +[sla_material:BlueCast Model Dental Gray @0.05] +inherits = *common 0.05* +exposure_time = 8 +initial_exposure_time = 35 +material_type = Dental +material_vendor = BlueCast + [sla_material:BlueCast LCD-DLP Original @0.05] inherits = *common 0.05* exposure_time = 10 @@ -3352,6 +3945,13 @@ initial_exposure_time = 50 material_type = Tough material_vendor = BlueCast +[sla_material:BlueCast Castable Wax @0.05] +inherits = *common 0.05* +exposure_time = 11 +initial_exposure_time = 35 +material_type = Casting +material_vendor = BlueCast + [sla_material:BlueCast S+ @0.05] inherits = *common 0.05* exposure_time = 9 @@ -3380,17 +3980,24 @@ initial_exposure_time = 50 material_type = Tough material_vendor = BlueCast +[sla_material:DruckWege Type D High Temp @0.05] +inherits = *common 0.05* +exposure_time = 10 +initial_exposure_time = 20 +material_type = Tough +material_vendor = DruckWege + [sla_material:Monocure 3D Black Rapid Resin @0.05] inherits = *common 0.05* exposure_time = 6 -initial_exposure_time = 40 +initial_exposure_time = 35 material_type = Tough material_vendor = Monocure [sla_material:Monocure 3D Blue Rapid Resin @0.05] inherits = *common 0.05* exposure_time = 7 -initial_exposure_time = 40 +initial_exposure_time = 35 material_type = Tough material_vendor = Monocure @@ -3410,8 +4017,8 @@ material_vendor = Monocure [sla_material:Monocure 3D White Rapid Resin @0.05] inherits = *common 0.05* -exposure_time = 7 -initial_exposure_time = 40 +exposure_time = 10 +initial_exposure_time = 35 material_type = Tough material_vendor = Monocure @@ -3436,6 +4043,27 @@ initial_exposure_time = 30 material_type = Tough material_vendor = Esun +[sla_material:FunToDo Castable Blend Red @0.05] +inherits = *common 0.05* +exposure_time = 15 +initial_exposure_time = 35 +material_type = Casting +material_vendor = FunToDo + +[sla_material:FunToDo Industrial Blend Unpigmented @0.05] +inherits = *common 0.05* +exposure_time = 4 +initial_exposure_time = 35 +material_type = Tough +material_vendor = FunToDo + +[sla_material:FunToDo Snow White @0.05] +inherits = *common 0.05* +exposure_time = 10 +initial_exposure_time = 35 +material_type = Tough +material_vendor = FunToDo + [sla_material:3DM-ABS @0.05] inherits = *common 0.05* exposure_time = 13 @@ -3466,7 +4094,7 @@ material_vendor = 3DM [sla_material:3DM-HR Red Wine @0.05] inherits = *common 0.05* -exposure_time = 9 +exposure_time = 18 initial_exposure_time = 35 material_type = Tough material_vendor = 3DM @@ -3492,20 +4120,41 @@ initial_exposure_time = 30 material_type = Tough material_vendor = 3DM -[sla_material:FTD Ash Grey @0.05] +[sla_material:FunToDo Ash Grey @0.05] inherits = *common 0.05* exposure_time = 9 initial_exposure_time = 40 material_type = Tough -material_vendor = FTD +material_vendor = FunToDo [sla_material:Harz Labs Model Resin Cherry @0.05] inherits = *common 0.05* -exposure_time = 8 -initial_exposure_time = 45 +exposure_time = 13 +initial_exposure_time = 20 material_type = Tough material_vendor = Harz Labs +[sla_material:Harz Labs Basic Resin Red @0.05] +inherits = *common 0.05* +exposure_time = 13 +initial_exposure_time = 20 +material_type = Tough +material_vendor = Harz Labs + +[sla_material:Harz Labs Model Resin Black @0.05] +inherits = *common 0.05* +exposure_time = 13 +initial_exposure_time = 20 +material_type = Tough +material_vendor = Harz Labs + +[sla_material:Harz Labs Dental Cast Red @0.05] +inherits = *common 0.05* +exposure_time = 13 +initial_exposure_time = 20 +material_type = Dental +material_vendor = Harz Labs + [sla_material:Resinworks 3D Violet @0.05] inherits = *common 0.05* exposure_time = 17 @@ -3534,6 +4183,139 @@ initial_exposure_time = 30 material_type = Tough material_vendor = Photocentric +[sla_material:Siraya Tech Simple Clear @0.05] +inherits = *common 0.05* +exposure_time = 10 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:Siraya Tech Blu Clear V2 @0.05] +inherits = *common 0.05* +exposure_time = 10 +initial_exposure_time = 30 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:Siraya Tech Blu Blue @0.05] +inherits = *common 0.05* +exposure_time = 12 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:Siraya Tech Fast Grey @0.05] +inherits = *common 0.05* +exposure_time = 10 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:Siraya Tech Tenacious @0.05] +inherits = *common 0.05* +exposure_time = 8 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:Siraya Tech Easy @0.05] +inherits = *common 0.05* +exposure_time = 12 +initial_exposure_time = 15 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:Siraya Tech Sculpt @0.05] +inherits = *common 0.05* +exposure_time = 8 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:Siraya Tech Fast Black @0.05] +inherits = *common 0.05* +exposure_time = 9 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:NextDent Model 2.0 Grey @0.05] +inherits = *common 0.05* +exposure_time = 12 +initial_exposure_time = 35 +material_type = Dental +material_vendor = NextDent + +[sla_material:NextDent Surgical Guide @0.05] +inherits = *common 0.05* +exposure_time = 7 +initial_exposure_time = 35 +material_type = Dental +material_vendor = NextDent + +[sla_material:NextDent Cast Purple @0.05] +inherits = *common 0.05* +exposure_time = 9 +initial_exposure_time = 20 +material_type = Casting +material_vendor = NextDent + +[sla_material:NextDent Crown Bridge @0.05] +inherits = *common 0.05* +exposure_time = 11 +initial_exposure_time = 35 +material_type = Dental +material_vendor = NextDent + +[sla_material:MakerJuice Labs Standard Red @0.05] +inherits = *common 0.05* +exposure_time = 10 +initial_exposure_time = 35 +material_type = Tough +material_vendor = MakerJuice Labs + +[sla_material:3DJake High Precision Grey @0.05] +inherits = *common 0.05* +exposure_time = 9 +initial_exposure_time = 35 +material_type = Tough +material_vendor = 3DJake + +[sla_material:3DJake High Precision Blue @0.05] +inherits = *common 0.05* +exposure_time = 7 +initial_exposure_time = 35 +material_type = Tough +material_vendor = 3DJake + +[sla_material:Dragon Resin Metalshine Metal Grey @0.05] +inherits = *common 0.05* +exposure_time = 30 +initial_exposure_time = 50 +material_type = Tough +material_vendor = Dragon Resin + +[sla_material:Dragon Resin Metalshine Dark Brass @0.05] +inherits = *common 0.05* +exposure_time = 30 +initial_exposure_time = 50 +material_type = Tough +material_vendor = Dragon Resin + +[sla_material:Dragon Resin Metalshine Brass @0.05] +inherits = *common 0.05* +exposure_time = 30 +initial_exposure_time = 50 +material_type = Tough +material_vendor = Dragon Resin + +[sla_material:Zortrax Black @0.05] +inherits = *common 0.05* +exposure_time = 7 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Zortrax + ## Prusa [sla_material:Prusa Beige Tough @0.05] @@ -3674,6 +4456,13 @@ initial_exposure_time = 35 material_type = Tough material_vendor = Made for Prusa +## [sla_material:Prusa Blue Tough @0.05] +## inherits = *common 0.05* +## exposure_time = 8 +## initial_exposure_time = 35 +## material_type = Tough +## material_vendor = Made for Prusa + [sla_material:Prusa Transparent Tough @0.05] inherits = *common 0.05* exposure_time = 7 @@ -3722,10 +4511,12 @@ initial_exposure_time = 30 material_type = Tough material_vendor = Made for Prusa -## [sla_material:Prusa ABS like White @0.05] -## inherits = *common 0.05* -## exposure_time = 8 -## initial_exposure_time = 30 +[sla_material:Prusa White ABS like @0.05] +inherits = *common 0.05* +exposure_time = 8 +initial_exposure_time = 30 +material_type = Tough +material_vendor = Made for Prusa [sla_material:Prusa Yellow Jewelry Casting @0.05] inherits = *common 0.05* @@ -3741,6 +4532,13 @@ initial_exposure_time = 30 material_type = Tough material_vendor = Made for Prusa +[sla_material:Prusa Vibrant Orange Tough @0.05] +inherits = *common 0.05* +exposure_time = 7 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Made for Prusa + ########### Materials 0.035 [sla_material:Prusa Orange Tough @0.035] @@ -3838,13 +4636,20 @@ initial_exposure_time = 35 material_type = Tough material_vendor = Made for Prusa +[sla_material:Prusa Vibrant Orange Tough @0.1] +inherits = *common 0.1* +exposure_time = 8 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Made for Prusa + [printer:*common*] printer_technology = FFF bed_shape = 0x0,250x0,250x210,0x210 before_layer_gcode = ;BEFORE_LAYER_CHANGE\nG92 E0.0\n;[layer_z]\n\n between_objects_gcode = deretract_speed = 0 -end_gcode = G4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors +end_gcode = G4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM900 K0 ; reset LA\nM84 ; disable motors extruder_offset = 0x0 gcode_flavor = marlin silent_mode = 0 @@ -3888,7 +4693,8 @@ retract_speed = 35 serial_port = serial_speed = 250000 single_extruder_multi_material = 0 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.2.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM204 S[machine_max_acceleration_extruding] T[machine_max_acceleration_retracting] ; MK2 firmware only supports the old M204 format\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.2.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM204 S[machine_max_acceleration_extruding] T[machine_max_acceleration_retracting] ; MK2 firmware only supports the old M204 format\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.2.3 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM204 S[machine_max_acceleration_extruding] T[machine_max_acceleration_retracting] ; MK2 firmware only supports the old M204 format\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 thumbnails_color = #eb8037 thumbnails_with_bed = 1 thumbnails_custom_color = 1 @@ -3926,19 +4732,20 @@ printer_model = MK2SMM [printer:*mm-single*] inherits = *multimaterial* -end_gcode = G1 E-4 F2100.00000\nG91\nG1 Z1 F7200.000\nG90\nG1 X245 Y1\nG1 X240 E4\nG1 F4000\nG1 X190 E2.7 \nG1 F4600\nG1 X110 E2.8\nG1 F5200\nG1 X40 E3 \nG1 E-15.0000 F5000\nG1 E-50.0000 F5400\nG1 E-15.0000 F3000\nG1 E-12.0000 F2000\nG1 F1600\nG1 X0 Y1 E3.0000\nG1 X50 Y1 E-5.0000\nG1 F2000\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-3.0000\nG4 S0\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nG28 X0 ; home X axis\nM84 ; disable motors\n\n +end_gcode = G1 E-4 F2100.00000\nG91\nG1 Z1 F7200.000\nG90\nG1 X245 Y1\nG1 X240 E4\nG1 F4000\nG1 X190 E2.7 \nG1 F4600\nG1 X110 E2.8\nG1 F5200\nG1 X40 E3 \nG1 E-15.0000 F5000\nG1 E-50.0000 F5400\nG1 E-15.0000 F3000\nG1 E-12.0000 F2000\nG1 F1600\nG1 X0 Y1 E3.0000\nG1 X50 Y1 E-5.0000\nG1 F2000\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-3.0000\nG4 S0\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nG28 X0 ; home X axis\nM900 K0 ; reset LA\nM84 ; disable motors\n\n printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK2\nPRINTER_HAS_BOWDEN -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.2.3 ; tell printer latest fw version\nM204 S[machine_max_acceleration_extruding] T[machine_max_acceleration_retracting] ; MK2 firmware only supports the old M204 format\n; Start G-Code sequence START\nT?\nM104 S[first_layer_temperature]\nM140 S[first_layer_bed_temperature]\nM109 S[first_layer_temperature]\nM190 S[first_layer_bed_temperature]\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG28 W\nG80\nG92 E0.0\nM203 E100\nM92 E140\nG1 Z0.250 F7200.000\nG1 X50.0 E80.0 F1000.0\nG1 X160.0 E20.0 F1000.0\nG1 Z0.200 F7200.000\nG1 X220.0 E13 F1000.0\nG1 X240.0 E0 F1000.0\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.2.3 ; tell printer latest fw version\nM204 S[machine_max_acceleration_extruding] T[machine_max_acceleration_retracting] ; MK2 firmware only supports the old M204 format\n; Start G-Code sequence START\nT?\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]}\nM140 S[first_layer_bed_temperature]\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]}\nM190 S[first_layer_bed_temperature]\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG28 W\nG80\nG92 E0.0\nM203 E100\nM92 E140\nG1 Z0.250 F7200.000\nG1 X50.0 E80.0 F1000.0\nG1 X160.0 E20.0 F1000.0\nG1 Z0.200 F7200.000\nG1 X220.0 E13 F1000.0\nG1 X240.0 E0 F1000.0\nG92 E0.0 default_print_profile = 0.15mm OPTIMAL [printer:*mm-multi*] inherits = *multimaterial* high_current_on_filament_swap = 1 -end_gcode = {if not has_wipe_tower}\n; Pull the filament into the cooling tubes.\nG1 E-4 F2100.00000\nG91\nG1 Z1 F7200.000\nG90\nG1 X245 Y1\nG1 X240 E4\nG1 F4000\nG1 X190 E2.7 \nG1 F4600\nG1 X110 E2.8\nG1 F5200\nG1 X40 E3 \nG1 E-15.0000 F5000\nG1 E-50.0000 F5400\nG1 E-15.0000 F3000\nG1 E-12.0000 F2000\nG1 F1600\nG1 X0 Y1 E3.0000\nG1 X50 Y1 E-5.0000\nG1 F2000\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-3.0000\nG4 S0\n{endif}\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nG28 X0 ; home X axis\nM84 ; disable motors +end_gcode = {if not has_wipe_tower}\n; Pull the filament into the cooling tubes.\nG1 E-4 F2100.00000\nG91\nG1 Z1 F7200.000\nG90\nG1 X245 Y1\nG1 X240 E4\nG1 F4000\nG1 X190 E2.7 \nG1 F4600\nG1 X110 E2.8\nG1 F5200\nG1 X40 E3 \nG1 E-15.0000 F5000\nG1 E-50.0000 F5400\nG1 E-15.0000 F3000\nG1 E-12.0000 F2000\nG1 F1600\nG1 X0 Y1 E3.0000\nG1 X50 Y1 E-5.0000\nG1 F2000\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-3.0000\nG4 S0\n{endif}\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nG28 X0 ; home X axis\nM900 K0 ; reset LA\nM84 ; disable motors extruder_colour = #FFAA55;#E37BA0;#4ECDD3;#FB7259 nozzle_diameter = 0.4,0.4,0.4,0.4 printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK2\nPRINTER_HAS_BOWDEN -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.2.3 ; tell printer latest fw version\nM204 S[machine_max_acceleration_extruding] T[machine_max_acceleration_retracting] ; MK2 firmware only supports the old M204 format\n; Start G-Code sequence START\nT[initial_tool]\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG28 W\nG80\nG92 E0.0\nM203 E100 ; set max feedrate\nM92 E140 ; E-steps per filament milimeter\n{if not has_single_extruder_multi_material_priming}\nG1 Z0.250 F7200.000\nG1 X50.0 E80.0 F1000.0\nG1 X160.0 E20.0 F1000.0\nG1 Z0.200 F7200.000\nG1 X220.0 E13 F1000.0\nG1 X240.0 E0 F1000.0\n{endif}\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.2.3 ; tell printer latest fw version\nM204 S[machine_max_acceleration_extruding] T[machine_max_acceleration_retracting] ; MK2 firmware only supports the old M204 format\n; Start G-Code sequence START\nT[initial_tool]\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG28 W\nG80\nG92 E0.0\nM203 E100 ; set max feedrate\nM92 E140 ; E-steps per filament milimeter\n{if not has_single_extruder_multi_material_priming}\nG1 Z0.250 F7200.000\nG1 X50.0 E80.0 F1000.0\nG1 X160.0 E20.0 F1000.0\nG1 Z0.200 F7200.000\nG1 X220.0 E13 F1000.0\nG1 X240.0 E0 F1000.0\n{endif}\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.2.3 ; tell printer latest fw version\nM204 S[machine_max_acceleration_extruding] T[machine_max_acceleration_retracting] ; MK2 firmware only supports the old M204 format\n; Start G-Code sequence START\nT[initial_tool]\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG28 W\nG80\nG92 E0.0\nM203 E100 ; set max feedrate\nM92 E140 ; E-steps per filament milimeter\n{if not has_single_extruder_multi_material_priming}\nG1 Z0.250 F7200.000\nG1 X50.0 E80.0 F1000.0\nG1 X160.0 E20.0 F1000.0\nG1 Z0.200 F7200.000\nG1 X220.0 E13 F1000.0\nG1 X240.0 E0 F1000.0\n{endif}\nG92 E0.0 default_print_profile = 0.15mm OPTIMAL # XXXXXXXXXXXXXXXXX @@ -4008,21 +4815,24 @@ inherits = Original Prusa i3 MK2S printer_model = MK2.5 remaining_times = 1 machine_max_jerk_e = 4.5 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 [printer:Original Prusa i3 MK2.5 0.25 nozzle] inherits = Original Prusa i3 MK2S 0.25 nozzle printer_model = MK2.5 remaining_times = 1 machine_max_jerk_e = 4.5 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 [printer:Original Prusa i3 MK2.5 0.6 nozzle] inherits = Original Prusa i3 MK2S 0.6 nozzle printer_model = MK2.5 remaining_times = 1 machine_max_jerk_e = 4.5 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 [printer:Original Prusa i3 MK2.5 MMU2 Single] inherits = Original Prusa i3 MK2.5; *mm2* @@ -4051,8 +4861,9 @@ machine_min_travel_rate = 0 default_print_profile = 0.15mm OPTIMAL @MK2.5 default_filament_profile = Prusament PLA printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK2.5\n -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\n; select extruder\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; load to nozzle\nTc\n; purge line\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n -end_gcode = G1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\n; select extruder\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; load to nozzle\nTc\n; purge line\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\n; select extruder\nTx\nM190 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; load to nozzle\nTc\n; purge line\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n +end_gcode = {if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+10, max_print_height)}{endif} F720 ; Move print head up\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nM702 C\nG4 ; wait\nM104 S0 ; turn off temperature\nM900 K0 ; reset LA\nM84 ; disable motors [printer:Original Prusa i3 MK2.5 MMU2 Single 0.6 nozzle] inherits = Original Prusa i3 MK2.5S MMU2S Single 0.6 nozzle @@ -4093,23 +4904,27 @@ single_extruder_multi_material = 1 # to be defined explicitely. nozzle_diameter = 0.4,0.4,0.4,0.4,0.4 extruder_colour = #FF8000;#DB5182;#00FFFF;#FF4F4F;#9FFF9F -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E32.0 F1073.0\nG1 X5.0 E32.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\nG92 E0.0\n -end_gcode = {if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors\n +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E32.0 F1073.0\nG1 X5.0 E32.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\nG92 E0.0\n +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E32.0 F1073.0\nG1 X5.0 E32.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\nG92 E0.0\n +end_gcode = {if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM900 K0 ; reset LA\nM84 ; disable motors\n [printer:Original Prusa i3 MK2.5S] inherits = Original Prusa i3 MK2.5 printer_model = MK2.5S -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 [printer:Original Prusa i3 MK2.5S 0.25 nozzle] inherits = Original Prusa i3 MK2.5 0.25 nozzle printer_model = MK2.5S -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 [printer:Original Prusa i3 MK2.5S 0.6 nozzle] inherits = Original Prusa i3 MK2.5 0.6 nozzle printer_model = MK2.5S -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 [printer:Original Prusa i3 MK2.5S MMU2S Single] inherits = Original Prusa i3 MK2.5; *mm2s* @@ -4138,8 +4953,9 @@ machine_min_travel_rate = 0 default_print_profile = 0.15mm OPTIMAL @MK2.5 default_filament_profile = Prusament PLA printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK2.5\n -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n -end_gcode = G1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n +end_gcode = {if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+10, max_print_height)}{endif} F720 ; Move print head up\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nM702 C\nG4 ; wait\nM104 S0 ; turn off temperature\nM900 K0 ; reset LA\nM84 ; disable motors [printer:Original Prusa i3 MK2.5S MMU2S Single 0.6 nozzle] inherits = Original Prusa i3 MK2.5S MMU2S Single @@ -4159,7 +4975,8 @@ nozzle_diameter = 0.25 printer_variant = 0.25 retract_lift = 0.15 default_print_profile = 0.10mm DETAIL 0.25 nozzle -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F1400.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F1400.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F1400.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n [printer:Original Prusa i3 MK2.5S MMU2S] inherits = Original Prusa i3 MK2.5; *mm2s* @@ -4192,8 +5009,9 @@ single_extruder_multi_material = 1 # to be defined explicitely. nozzle_diameter = 0.4,0.4,0.4,0.4,0.4 extruder_colour = #FF8000;#DB5182;#00FFFF;#FF4F4F;#9FFF9F -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E29.0 F1073.0\nG1 X5.0 E29.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\nG92 E0.0\n -end_gcode = {if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors\n +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E29.0 F1073.0\nG1 X5.0 E29.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\nG92 E0.0\n +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E29.0 F1073.0\nG1 X5.0 E29.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\nG92 E0.0\n +end_gcode = {if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM900 K0 ; reset LA\nM84 ; disable motors\n [printer:Original Prusa i3 MK2.5S MMU2S 0.6 nozzle] inherits = Original Prusa i3 MK2.5S MMU2S @@ -4217,13 +5035,13 @@ default_print_profile = 0.20mm NORMAL @0.6 nozzle [printer:Original Prusa i3 MK3] inherits = *common* -end_gcode = G4 ; wait\nM221 S100\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors +end_gcode = G4 ; wait\nM221 S100 ; reset flow\nM900 K0 ; reset LA\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|@0.25 nozzle MK3).*/}M907 E538 ; reset extruder motor current{endif}\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors machine_max_acceleration_e = 5000,5000 machine_max_acceleration_extruding = 1250,1250 machine_max_acceleration_retracting = 1250,1250 machine_max_acceleration_x = 1000,960 machine_max_acceleration_y = 1000,960 -machine_max_acceleration_z = 1000,1000 +machine_max_acceleration_z = 200,200 machine_max_feedrate_e = 120,120 machine_max_feedrate_x = 200,100 machine_max_feedrate_y = 200,100 @@ -4239,7 +5057,8 @@ remaining_times = 1 printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK3\n retract_lift_below = 209 max_print_height = 210 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif} +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif} +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif}\n\n; Don't change E values below. Excessive value can damage the printer.\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3).*/}M907 E430 ; set extruder motor current{endif}\n{if print_settings_id=~/.*(SPEED @MK3|DRAFT @MK3).*/}M907 E538 ; set extruder motor current{endif} printer_model = MK3 default_print_profile = 0.15mm QUALITY @MK3 @@ -4250,7 +5069,8 @@ max_layer_height = 0.15 min_layer_height = 0.05 printer_variant = 0.25 retract_lift = 0.15 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E8.0 F700.0 ; intro line\nG1 X100.0 E12.5 F700.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif} +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E8.0 F700.0 ; intro line\nG1 X100.0 E12.5 F700.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif} +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E8.0 F700.0 ; intro line\nG1 X100.0 E12.5 F700.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif}\n\n; Don't change E value below. Excessive value can damage the printer.\n{if print_settings_id=~/.*@0.25 nozzle MK3.*/}M907 E430 ; set extruder motor current{endif} default_print_profile = 0.10mm DETAIL @0.25 nozzle MK3 [printer:Original Prusa i3 MK3 0.6 nozzle] @@ -4264,17 +5084,20 @@ default_print_profile = 0.30mm QUALITY @0.6 nozzle MK3 [printer:Original Prusa i3 MK3S] inherits = Original Prusa i3 MK3 printer_model = MK3S -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif} +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif} +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif}\n\n; Don't change E values below. Excessive value can damage the printer.\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3).*/}M907 E430 ; set extruder motor current{endif}\n{if print_settings_id=~/.*(SPEED @MK3|DRAFT @MK3).*/}M907 E538 ; set extruder motor current{endif} [printer:Original Prusa i3 MK3S 0.25 nozzle] inherits = Original Prusa i3 MK3 0.25 nozzle printer_model = MK3S -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E8.0 F700.0 ; intro line\nG1 X100.0 E12.5 F700.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif} +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E8.0 F700.0 ; intro line\nG1 X100.0 E12.5 F700.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif} +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E8.0 F700.0 ; intro line\nG1 X100.0 E12.5 F700.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif}\n\n; Don't change E value below. Excessive value can damage the printer.\n{if print_settings_id=~/.*@0.25 nozzle MK3.*/}M907 E430 ; set extruder motor current{endif} [printer:Original Prusa i3 MK3S 0.6 nozzle] inherits = Original Prusa i3 MK3 0.6 nozzle printer_model = MK3S -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif} +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif} +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif} [printer:*mm2*] inherits = Original Prusa i3 MK3 @@ -4304,8 +5127,9 @@ default_filament_profile = Prusament PLA @MMU2 inherits = *mm2* single_extruder_multi_material = 0 default_filament_profile = Prusament PLA -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n -end_gcode = G1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n\n; Don't change E values below. Excessive value can damage the printer.\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3).*/}M907 E430 ; set extruder motor current{endif}\n{if print_settings_id=~/.*(SPEED @MK3|DRAFT @MK3).*/}M907 E538 ; set extruder motor current{endif} +end_gcode = {if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+10, max_print_height)}{endif} F720 ; Move print head up\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nM702 C\nG4 ; wait\nM221 S100 ; reset flow\nM900 K0 ; reset LA\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|@0.25 nozzle MK3).*/}M907 E538 ; reset extruder motor current{endif}\nM104 S0 ; turn off temperature\nM84 ; disable motors [printer:Original Prusa i3 MK3 MMU2 Single 0.6 nozzle] inherits = Original Prusa i3 MK3 MMU2 Single @@ -4314,6 +5138,7 @@ nozzle_diameter = 0.6 max_layer_height = 0.40 min_layer_height = 0.15 printer_variant = 0.6 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0 default_print_profile = 0.30mm QUALITY @0.6 nozzle MK3 [printer:Original Prusa i3 MK3 MMU2 Single 0.25 nozzle] @@ -4324,7 +5149,8 @@ max_layer_height = 0.15 min_layer_height = 0.05 printer_variant = 0.25 retract_lift = 0.15 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 E8.0 F1000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F1400.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 E8.0 F1000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F1400.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 E8.0 F1000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F1400.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n\n; Don't change E value below. Excessive value can damage the printer.\n{if print_settings_id=~/.*@0.25 nozzle MK3.*/}M907 E430 ; set extruder motor current{endif} default_print_profile = 0.10mm DETAIL @0.25 nozzle MK3 [printer:Original Prusa i3 MK3 MMU2] @@ -4335,15 +5161,17 @@ inherits = *mm2* machine_max_acceleration_e = 8000,8000 nozzle_diameter = 0.4,0.4,0.4,0.4,0.4 extruder_colour = #FF8000;#DB5182;#00FFFF;#FF4F4F;#9FFF9F -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E32.0 F1073.0\nG1 X5.0 E32.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n -end_gcode = {if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors\n +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E32.0 F1073.0\nG1 X5.0 E32.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E32.0 F1073.0\nG1 X5.0 E32.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n\n; Don't change E values below. Excessive value can damage the printer.\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|SOLUBLE).*/}M907 E430 ; set extruder motor current{endif}\n{if print_settings_id=~/.*(SPEED @MK3|DRAFT @MK3).*/}M907 E538 ; set extruder motor current{endif} +end_gcode = {if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM221 S100 ; reset flow\nM900 K0 ; reset LA\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|SOLUBLE|@0.25 nozzle MK3).*/}M907 E538 ; reset extruder motor current{endif}\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors\n [printer:Original Prusa i3 MK3S MMU2S Single] inherits = *mm2s* single_extruder_multi_material = 0 default_filament_profile = Prusament PLA -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n -end_gcode = G1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n\n; Don't change E values below. Excessive value can damage the printer.\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3).*/}M907 E430 ; set extruder motor current{endif}\n{if print_settings_id=~/.*(SPEED @MK3|DRAFT @MK3).*/}M907 E538 ; set extruder motor current{endif} +end_gcode = {if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+10, max_print_height)}{endif} F720 ; Move print head up\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nM702 C\nG4 ; wait\nM221 S100 ; reset flow\nM900 K0 ; reset LA\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|@0.25 nozzle MK3).*/}M907 E538 ; reset extruder motor current{endif}\nM104 S0 ; turn off temperature\nM84 ; disable motors [printer:Original Prusa i3 MK3S MMU2S Single 0.6 nozzle] inherits = Original Prusa i3 MK3S MMU2S Single @@ -4352,6 +5180,7 @@ nozzle_diameter = 0.6 max_layer_height = 0.40 min_layer_height = 0.15 printer_variant = 0.6 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0 default_print_profile = 0.30mm QUALITY @0.6 nozzle MK3 [printer:Original Prusa i3 MK3S MMU2S Single 0.25 nozzle] @@ -4362,7 +5191,8 @@ max_layer_height = 0.15 min_layer_height = 0.05 printer_variant = 0.25 retract_lift = 0.15 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F1400.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F1400.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F1400.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n\n; Don't change E value below. Excessive value can damage the printer.\n{if print_settings_id=~/.*@0.25 nozzle MK3.*/}M907 E430 ; set extruder motor current{endif} default_print_profile = 0.10mm DETAIL @0.25 nozzle MK3 [printer:Original Prusa i3 MK3S MMU2S] @@ -4370,8 +5200,9 @@ inherits = *mm2s* machine_max_acceleration_e = 8000,8000 nozzle_diameter = 0.4,0.4,0.4,0.4,0.4 extruder_colour = #FF8000;#DB5182;#00FFFF;#FF4F4F;#9FFF9F -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E29.0 F1073.0\nG1 X5.0 E29.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n -end_gcode = {if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors\n +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E29.0 F1073.0\nG1 X5.0 E29.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E29.0 F1073.0\nG1 X5.0 E29.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n\n; Don't change E values below. Excessive value can damage the printer.\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|SOLUBLE).*/}M907 E430 ; set extruder motor current{endif}\n{if print_settings_id=~/.*(SPEED @MK3|DRAFT @MK3).*/}M907 E538 ; set extruder motor current{endif} +end_gcode = {if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM221 S100 ; reset flow\nM900 K0 ; reset LA\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|SOLUBLE|@0.25 nozzle MK3).*/}M907 E538 ; reset extruder motor current{endif}\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors\n ## 0.6mm nozzle MMU2/S printer profiles @@ -4381,6 +5212,7 @@ nozzle_diameter = 0.6,0.6,0.6,0.6,0.6 max_layer_height = 0.40 min_layer_height = 0.15 printer_variant = 0.6 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E29.0 F1073.0\nG1 X5.0 E29.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0 default_print_profile = 0.30mm QUALITY @0.6 nozzle MK3 [printer:Original Prusa i3 MK3 MMU2 0.6 nozzle] @@ -4389,6 +5221,7 @@ nozzle_diameter = 0.6,0.6,0.6,0.6,0.6 max_layer_height = 0.40 min_layer_height = 0.15 printer_variant = 0.6 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E32.0 F1073.0\nG1 X5.0 E32.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0 default_print_profile = 0.30mm QUALITY @0.6 nozzle MK3 ## MINI @@ -4436,8 +5269,9 @@ retract_lift_below = 179 retract_layer_change = 0 silent_mode = 0 remaining_times = 1 -start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S170 ; set extruder temp for bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nM109 R170 ; wait for bed leveling temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nG28 ; home all without mesh bed level\nG29 ; mesh bed leveling \nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nG92 E0.0\nG1 Y-2.0 X179 F2400\nG1 Z3 F720\nM109 S[first_layer_temperature] ; wait for extruder temp\n\n; intro line\nG1 X170 F1000\nG1 Z0.2 F720\nG1 X110.0 E8.0 F900\nG1 X40.0 E10.0 F700\nG92 E0.0\n\nM221 S95 ; set flow -end_gcode = G1 E-1 F2100 ; retract\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+5, max_print_height)}{endif} F720 ; Move print head up\nG1 X178 Y180 F4200 ; park print head\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nM221 S100 ; reset flow\nM84 ; disable motors +start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S170 ; set extruder temp for bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nM109 R170 ; wait for bed leveling temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nG28 ; home all without mesh bed level\nG29 ; mesh bed leveling \nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nG92 E0.0\nG1 Y-2.0 X179 F2400\nG1 Z3 F720\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\n\n; intro line\nG1 X170 F1000\nG1 Z0.2 F720\nG1 X110.0 E8.0 F900\nG1 X40.0 E10.0 F700\nG92 E0.0\n\nM221 S95 ; set flow +start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S170 ; set extruder temp for bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nM109 R170 ; wait for bed leveling temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nG28 ; home all without mesh bed level\nG29 ; mesh bed leveling \nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nG92 E0.0\nG1 Y-2.0 X179 F2400\nG1 Z3 F720\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\n\n; intro line\nG1 X170 F1000\nG1 Z0.2 F720\nG1 X110.0 E8.0 F900\nG1 X40.0 E10.0 F700\nG92 E0.0\n\nM221 S95 ; set flow +end_gcode = G1 E-1 F2100 ; retract\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+2, max_print_height)}{endif} F720 ; Move print head up\nG1 X178 Y180 F4200 ; park print head\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} F720 ; Move print head further up\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nM221 S100 ; reset flow\nM900 K0 ; reset LA\nM84 ; disable motors printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MINI\n extruder_colour = @@ -4455,7 +5289,8 @@ deretract_speed = 40 wipe = 1 retract_before_wipe = 70% retract_before_travel = 1 -start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S170 ; set extruder temp for bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nM109 R170 ; wait for bed leveling temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nG28 ; home all without mesh bed level\nG29 ; mesh bed leveling \nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nG92 E0.0\nG1 Y-2.0 X179 F2400\nG1 Z3 F720\nM109 S[first_layer_temperature] ; wait for extruder temp\n\n; intro line\nG1 X170 F1000\nG1 Z0.2 F720\nG1 X110.0 E8.0 F600\nG1 X40.0 E10.0 F400\nG92 E0.0\n\nM221 S95 ; set flow +start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S170 ; set extruder temp for bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nM109 R170 ; wait for bed leveling temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nG28 ; home all without mesh bed level\nG29 ; mesh bed leveling \nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nG92 E0.0\nG1 Y-2.0 X179 F2400\nG1 Z3 F720\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\n\n; intro line\nG1 X170 F1000\nG1 Z0.2 F720\nG1 X110.0 E8.0 F600\nG1 X40.0 E10.0 F400\nG92 E0.0\n\nM221 S95 ; set flow +start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S170 ; set extruder temp for bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nM109 R170 ; wait for bed leveling temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nG28 ; home all without mesh bed level\nG29 ; mesh bed leveling \nM104 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; set extruder temp\nG92 E0.0\nG1 Y-2.0 X179 F2400\nG1 Z3 F720\nM109 S{first_layer_temperature[initial_extruder]+extruder_temperature_offset[initial_extruder]} ; wait for extruder temp\n\n; intro line\nG1 X170 F1000\nG1 Z0.2 F720\nG1 X110.0 E8.0 F600\nG1 X40.0 E10.0 F400\nG92 E0.0\n\nM221 S95 ; set flow [printer:Original Prusa MINI 0.6 nozzle] inherits = Original Prusa MINI @@ -4476,7 +5311,7 @@ retract_before_travel = 1.5 printer_technology = SLA printer_model = SL1 printer_variant = default -default_sla_material_profile = Prusa Orange Tough 0.05 +default_sla_material_profile = Prusa Orange Tough @0.05 default_sla_print_profile = 0.05 Normal thumbnails = 400x400,800x480 bed_shape = 1.48x1.02,119.48x1.02,119.48x67.02,1.48x67.02 diff --git a/resources/profiles/TriLAB.idx b/resources/profiles/TriLAB.idx index a43bf4e00..eda36c227 100644 --- a/resources/profiles/TriLAB.idx +++ b/resources/profiles/TriLAB.idx @@ -1,2 +1,3 @@ -min_slic3r_version = 2.3.0-alpha0 -0.0.1 Initial TriLAB bundle +min_slic3r_version = 2.3.0-alpha0 +0.0.2 Added 0.15mm print profile +0.0.1 Initial TriLAB bundle diff --git a/resources/profiles/TriLAB.ini b/resources/profiles/TriLAB.ini index 2412cf115..1c9bda0c1 100644 --- a/resources/profiles/TriLAB.ini +++ b/resources/profiles/TriLAB.ini @@ -4,13 +4,13 @@ [vendor] # Vendor name will be shown by the Config Wizard. -name = TRILAB +name = TriLAB # Configuration version of this file. Config file will only be installed, if the config_version differs. # This means, the server may force the PrusaSlicer configuration to be downgraded. -config_version = 0.0.1 +config_version = 0.0.2 # Where to get the updates from? -config_update_url = http://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/TriLAB/ -# changelog_url = http://files.prusa3d.com/?latest=slicer-profiles&lng=%1% +config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/TriLAB/ +# changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1% # The printer models will be shown by the Configuration Wizard in this order, # also the first model installed & the first nozzle installed will be activated after install. @@ -43,10 +43,15 @@ default_materials = DeltiQ PLA; DeltiQ ASA; DeltiQ PET; DeltiQ ABS; DeltiQ CPE # All presets starting with asterisk, for example *common*, are intermediate and they will # not make it into the user interface. +[print:DeltiQ 0.15mm] +inherits = DeltiQ 0.2mm +layer_height = 0.15 +bottom_solid_layers = 5 +top_solid_layers = 6 [print:DeltiQ 0.2mm] avoid_crossing_perimeters = 0 -bottom_solid_layers = 3 +bottom_solid_layers = 4 bridge_acceleration = 1000 bridge_angle = 0 bridge_flow_ratio = 0.95 @@ -143,7 +148,7 @@ thin_walls = 0 threads = 4 top_infill_extrusion_width = 0.4 top_solid_infill_speed = 30 -top_solid_layers = 4 +top_solid_layers = 5 travel_speed = 150 wipe_tower = 0 wipe_tower_bridging = 10 @@ -254,7 +259,6 @@ extra_loading_move = -2 extruder_colour = "" extruder_offset = 0x0 gcode_flavor = repetier -host_type = octoprint layer_gcode = ;AFTER_LAYER_CHANGE\nM117 layer [layer_num] at [layer_z]mm\n;[layer_z]\n machine_max_acceleration_e = 10000,5000 machine_max_acceleration_extruding = 1500,1250 @@ -277,14 +281,11 @@ max_print_height = 320 min_layer_height = 0.15 nozzle_diameter = 0.4 parking_pos_retraction = 92 -print_host = printer_model = printer_notes = TRILAB printer_settings_id = printer_variant = printer_vendor = -printhost_apikey = -printhost_cafile = remaining_times = 0 retract_before_travel = 2 retract_before_wipe = 100% @@ -297,8 +298,6 @@ retract_lift_below = 0 retract_restart_extra = 0 retract_restart_extra_toolchange = 0 retract_speed = 33 -serial_port = -serial_speed = 250000 silent_mode = 1 single_extruder_multi_material = 0 start_gcode = ;START\nM220 S100 ; Set feedmultiply back to 100percent\nG90 ; Absolute positioning\nM83 ; Relative extruder\nM107 ; Layer fan OFF\nM190 S[first_layer_bed_temperature] ; Set bed temperature and wait\nM104 S[first_layer_temperature] ; Set extruder temperature\nG28 ; Home all axes\nG33 ; auto leveling rutine\nG1 X-62 Y-108 Z0.3 F6000 ; Go to purge position start\nG92 E0 ; Zero extruder\nM109 S[first_layer_temperature] ; Set and wait - hotend temperature\nG3 X62 Y-108 I62 J108 E10 F200 ; Go ARC to purge end\nG92 E0 ; Zero extruder diff --git a/src/imgui/README.md b/src/imgui/README.md index 83f461996..8eba48113 100644 --- a/src/imgui/README.md +++ b/src/imgui/README.md @@ -7,4 +7,5 @@ THIS DIRECTORY CONTAINS THE imgui-1.75 58b3e02 SOURCE DISTRIBUTION. Customized with the following commits: 042880ba2df913916b2cc77f7bb677e07bfd2c58 67c55c74901f1d337ef08f2090a87cfb4263bb0f -a94c952b40d36b1505fb77b87c0dd739e1034659 \ No newline at end of file +a94c952b40d36b1505fb77b87c0dd739e1034659 +3ca3a544a87cc569b69351a77996c287763388a5 \ No newline at end of file diff --git a/src/imgui/imconfig.h b/src/imgui/imconfig.h index 4a1d1faa0..fc635dfac 100644 --- a/src/imgui/imconfig.h +++ b/src/imgui/imconfig.h @@ -121,6 +121,8 @@ namespace ImGui const char MinimalizeHoverMarker = 0xF; const char WarningMarker = 0x10; const char ErrorMarker = 0x11; + const char EjectMarker = 0x12; + const char EjectHoverMarker = 0x13; // void MyFunction(const char* name, const MyMatrix44& v); } diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index d1c1c460c..879a05dfb 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -107,6 +107,9 @@ void AppConfig::set_defaults() if (get("use_free_camera").empty()) set("use_free_camera", "0"); + + if (get("reverse_mouse_wheel_zoom").empty()) + set("reverse_mouse_wheel_zoom", "0"); #endif // !ENABLE_GCODE_VIEWER #if ENABLE_ENVIRONMENT_MAP @@ -130,6 +133,9 @@ void AppConfig::set_defaults() if (get("use_free_camera").empty()) set("use_free_camera", "0"); + + if (get("reverse_mouse_wheel_zoom").empty()) + set("reverse_mouse_wheel_zoom", "0"); #endif // ENABLE_GCODE_VIEWER if (get("show_splash_screen").empty()) @@ -211,6 +217,20 @@ std::string AppConfig::load() m_legacy_datadir = ini_ver < Semver(1, 40, 0); } + // Legacy conversion + if (m_mode == EAppMode::Editor) { + // Convert [extras] "physical_printer" to [presets] "physical_printer", + // remove the [extras] section if it becomes empty. + if (auto it_section = m_storage.find("extras"); it_section != m_storage.end()) { + if (auto it_physical_printer = it_section->second.find("physical_printer"); it_physical_printer != it_section->second.end()) { + m_storage["presets"]["physical_printer"] = it_physical_printer->second; + it_section->second.erase(it_physical_printer); + } + if (it_section->second.empty()) + m_storage.erase(it_section); + } + } + // Override missing or keys with their defaults. this->set_defaults(); m_dirty = false; @@ -433,6 +453,7 @@ void AppConfig::reset_selections() it->second.erase("sla_print"); it->second.erase("sla_material"); it->second.erase("printer"); + it->second.erase("physical_printer"); m_dirty = true; } } diff --git a/src/libslic3r/AppConfig.hpp b/src/libslic3r/AppConfig.hpp index c5b8ece2b..1ed7b28a5 100644 --- a/src/libslic3r/AppConfig.hpp +++ b/src/libslic3r/AppConfig.hpp @@ -142,20 +142,20 @@ public: #endif // ENABLE_GCODE_VIEWER // Returns true if the user's data directory comes from before Slic3r 1.40.0 (no updating) - bool legacy_datadir() const { return m_legacy_datadir; } - void set_legacy_datadir(bool value) { m_legacy_datadir = value; } + bool legacy_datadir() const { return m_legacy_datadir; } + void set_legacy_datadir(bool value) { m_legacy_datadir = value; } // Get the Slic3r version check url. // This returns a hardcoded string unless it is overriden by "version_check_url" in the ini file. - std::string version_check_url() const; + std::string version_check_url() const; // Returns the original Slic3r version found in the ini file before it was overwritten // by the current version - Semver orig_version() const { return m_orig_version; } + Semver orig_version() const { return m_orig_version; } // Does the config file exist? #if ENABLE_GCODE_VIEWER - bool exists(); + bool exists(); #else static bool exists(); #endif // ENABLE_GCODE_VIEWER diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index bd2df0c7e..03f46abc1 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -62,8 +62,6 @@ add_library(libslic3r STATIC Fill/FillRectilinear.hpp Fill/FillRectilinear2.cpp Fill/FillRectilinear2.hpp - Fill/FillRectilinear3.cpp - Fill/FillRectilinear3.hpp Fill/FillSmooth.cpp Fill/FillSmooth.hpp Flow.cpp @@ -83,8 +81,6 @@ add_library(libslic3r STATIC Format/STL.hpp Format/SL1.hpp Format/SL1.cpp - GCode/Analyzer.cpp - GCode/Analyzer.hpp GCode/ThumbnailData.cpp GCode/ThumbnailData.hpp GCode/CoolingBuffer.cpp @@ -115,8 +111,6 @@ add_library(libslic3r STATIC GCodeReader.hpp # GCodeSender.cpp # GCodeSender.hpp - GCodeTimeEstimator.cpp - GCodeTimeEstimator.hpp GCodeWriter.cpp GCodeWriter.hpp Geometry.cpp diff --git a/src/libslic3r/Exception.hpp b/src/libslic3r/Exception.hpp index 8ec9f20c8..287905533 100644 --- a/src/libslic3r/Exception.hpp +++ b/src/libslic3r/Exception.hpp @@ -19,6 +19,8 @@ SLIC3R_DERIVE_EXCEPTION(InvalidArgument, LogicError); SLIC3R_DERIVE_EXCEPTION(OutOfRange, LogicError); SLIC3R_DERIVE_EXCEPTION(IOError, CriticalException); SLIC3R_DERIVE_EXCEPTION(FileIOError, IOError); +SLIC3R_DERIVE_EXCEPTION(HostNetworkError, IOError); +SLIC3R_DERIVE_EXCEPTION(ExportError, CriticalException); // Runtime exception produced by Slicer. Such exception cancels the slicing process and it shall be shown in notifications. SLIC3R_DERIVE_EXCEPTION(SlicingError, Exception); #undef SLIC3R_DERIVE_EXCEPTION diff --git a/src/libslic3r/ExtrusionEntity.cpp b/src/libslic3r/ExtrusionEntity.cpp index f4b5cc557..4903dc116 100644 --- a/src/libslic3r/ExtrusionEntity.cpp +++ b/src/libslic3r/ExtrusionEntity.cpp @@ -295,7 +295,7 @@ std::string ExtrusionEntity::role_to_string(ExtrusionRole role) } -ExtrusionRole ExtrusionEntity::string_to_role(const std::string& role) +ExtrusionRole ExtrusionEntity::string_to_role(const std::string_view role) { if (role == L("Perimeter")) return erPerimeter; diff --git a/src/libslic3r/ExtrusionEntity.hpp b/src/libslic3r/ExtrusionEntity.hpp index 13aa1169c..77fa2d7f7 100644 --- a/src/libslic3r/ExtrusionEntity.hpp +++ b/src/libslic3r/ExtrusionEntity.hpp @@ -6,6 +6,7 @@ #include "Polyline.hpp" #include +#include namespace Slic3r { @@ -169,7 +170,7 @@ public: virtual void visit(ExtrusionVisitorConst &visitor) const = 0; static std::string role_to_string(ExtrusionRole role); - static ExtrusionRole string_to_role(const std::string& role); + static ExtrusionRole string_to_role(const std::string_view role); }; typedef std::vector ExtrusionEntitiesPtr; diff --git a/src/libslic3r/Fill/FillBase.cpp b/src/libslic3r/Fill/FillBase.cpp index 77764a6da..84247ab1b 100644 --- a/src/libslic3r/Fill/FillBase.cpp +++ b/src/libslic3r/Fill/FillBase.cpp @@ -16,7 +16,6 @@ #include "FillPlanePath.hpp" #include "FillRectilinear.hpp" #include "FillRectilinear2.hpp" -#include "FillRectilinear3.hpp" #include "FillAdaptive.hpp" #include "FillSmooth.hpp" #include "../MedialAxis.hpp" diff --git a/src/libslic3r/Fill/FillRectilinear2.cpp b/src/libslic3r/Fill/FillRectilinear2.cpp index 14df1c27c..9cfaafe6d 100644 --- a/src/libslic3r/Fill/FillRectilinear2.cpp +++ b/src/libslic3r/Fill/FillRectilinear2.cpp @@ -162,7 +162,9 @@ struct SegmentIntersection // Vertical link, up. Up, // Vertical link, down. - Down + Down, + // Phony intersection point has no link. + Phony, }; enum class LinkQuality : uint8_t { @@ -362,6 +364,25 @@ struct SegmentedIntersectionLine std::vector intersections; }; +static SegmentIntersection phony_outer_intersection(SegmentIntersection::SegmentIntersectionType type, coord_t pos) +{ + assert(type == SegmentIntersection::OUTER_LOW || type == SegmentIntersection::OUTER_HIGH); + SegmentIntersection out; + // Invalid contour & segment. + out.iContour = std::numeric_limits::max(); + out.iSegment = std::numeric_limits::max(); + out.pos_p = pos; + out.type = type; + // Invalid prev / next. + out.prev_on_contour = -1; + out.next_on_contour = -1; + out.prev_on_contour_type = SegmentIntersection::LinkType::Phony; + out.next_on_contour_type = SegmentIntersection::LinkType::Phony; + out.prev_on_contour_quality = SegmentIntersection::LinkQuality::Invalid; + out.next_on_contour_quality = SegmentIntersection::LinkQuality::Invalid; + return out; +} + // A container maintaining an expolygon with its inner offsetted polygon. // The purpose of the inner offsetted polygon is to provide segments to connect the infill lines. struct ExPolygonWithOffset @@ -939,6 +960,60 @@ static void slice_region_by_vertical_lines(std::vector &segs) +{ + // Validate the connectivity. + for (size_t i_vline = 0; i_vline + 1 < segs.size(); ++ i_vline) { + const SegmentedIntersectionLine &il_left = segs[i_vline]; + const SegmentedIntersectionLine &il_right = segs[i_vline + 1]; + for (const SegmentIntersection &it : il_left.intersections) { + if (it.has_right_horizontal()) { + const SegmentIntersection &it_right = il_right.intersections[it.right_horizontal()]; + // For a right link there is a symmetric left link. + assert(it.iContour == it_right.iContour); + assert(it.type == it_right.type); + assert(it_right.has_left_horizontal()); + assert(it_right.left_horizontal() == int(&it - il_left.intersections.data())); + } + } + for (const SegmentIntersection &it : il_right.intersections) { + if (it.has_left_horizontal()) { + const SegmentIntersection &it_left = il_left.intersections[it.left_horizontal()]; + // For a right link there is a symmetric left link. + assert(it.iContour == it_left.iContour); + assert(it.type == it_left.type); + assert(it_left.has_right_horizontal()); + assert(it_left.right_horizontal() == int(&it - il_right.intersections.data())); + } + } + } + for (size_t i_vline = 0; i_vline < segs.size(); ++ i_vline) { + const SegmentedIntersectionLine &il = segs[i_vline]; + for (const SegmentIntersection &it : il.intersections) { + auto i_it = int(&it - il.intersections.data()); + if (it.has_left_vertical_up()) { + assert(il.intersections[it.left_vertical_up()].left_vertical_down() == i_it); + assert(il.intersections[it.left_vertical_up()].prev_on_contour_quality == it.prev_on_contour_quality); + } + if (it.has_left_vertical_down()) { + assert(il.intersections[it.left_vertical_down()].left_vertical_up() == i_it); + assert(il.intersections[it.left_vertical_down()].prev_on_contour_quality == it.prev_on_contour_quality); + } + if (it.has_right_vertical_up()) { + assert(il.intersections[it.right_vertical_up()].right_vertical_down() == i_it); + assert(il.intersections[it.right_vertical_up()].next_on_contour_quality == it.next_on_contour_quality); + } + if (it.has_right_vertical_down()) { + assert(il.intersections[it.right_vertical_down()].right_vertical_up() == i_it); + assert(il.intersections[it.right_vertical_down()].next_on_contour_quality == it.next_on_contour_quality); + } + } + } + return true; +} +#endif /* NDEBUG */ + // Connect each contour / vertical line intersection point with another two contour / vertical line intersection points. // (fill in SegmentIntersection::{prev_on_contour, prev_on_contour_vertical, next_on_contour, next_on_contour_vertical}. // These contour points are either on the same vertical line, or on the vertical line left / right to the current one. @@ -1107,55 +1182,104 @@ static void connect_segment_intersections_by_contours( } } -#ifndef NDEBUG - // Validate the connectivity. - for (size_t i_vline = 0; i_vline + 1 < segs.size(); ++i_vline) { - const SegmentedIntersectionLine& il_left = segs[i_vline]; - const SegmentedIntersectionLine& il_right = segs[i_vline + 1]; - for (const SegmentIntersection& it : il_left.intersections) { - if (it.has_right_horizontal()) { - const SegmentIntersection& it_right = il_right.intersections[it.right_horizontal()]; - // For a right link there is a symmetric left link. - assert(it.iContour == it_right.iContour); - assert(it.type == it_right.type); - assert(it_right.has_left_horizontal()); - assert(it_right.left_horizontal() == int(&it - il_left.intersections.data())); + assert(validate_segment_intersection_connectivity(segs)); } + +static void pinch_contours_insert_phony_outer_intersections(std::vector &segs) +{ + // Keep the vector outside the loops, so they will not be reallocated. + // Where to insert new outer points. + std::vector insert_after; + // Mapping of indices of current intersection line after inserting new outer points. + std::vector map; + std::vector temp_intersections; + + for (size_t i_vline = 1; i_vline < segs.size(); ++ i_vline) { + SegmentedIntersectionLine &il = segs[i_vline]; + assert(il.intersections.empty() || il.intersections.size() >= 2); + if (! il.intersections.empty()) { + assert(il.intersections.front().type == SegmentIntersection::OUTER_LOW); + assert(il.intersections.back().type == SegmentIntersection::OUTER_HIGH); + auto end = il.intersections.end() - 1; + insert_after.clear(); + for (auto it = il.intersections.begin() + 1; it != end;) { + if (it->type == SegmentIntersection::OUTER_HIGH) { + ++ it; + assert(it->type == SegmentIntersection::OUTER_LOW); + ++ it; + } else { + auto lo = it; + assert(lo->type == SegmentIntersection::INNER_LOW); + auto hi = ++ it; + assert(hi->type == SegmentIntersection::INNER_HIGH); + auto lo2 = ++ it; + if (lo2->type == SegmentIntersection::INNER_LOW) { + // INNER_HIGH followed by INNER_LOW. The outer contour may have squeezed the inner contour into two separate loops. + // In that case one shall insert a phony OUTER_HIGH / OUTER_LOW pair. + int up = hi->vertical_up(); + int dn = lo2->vertical_down(); +#ifndef _NDEBUG + assert(up == -1 || up > 0); + assert(dn == -1 || dn >= 0); + assert((up == -1 && dn == -1) || (dn + 1 == up)); +#endif // _NDEBUG + bool pinched = dn + 1 != up; + if (pinched) { + // hi is not connected with its inner contour to lo2. + // Insert a phony OUTER_HIGH / OUTER_LOW pair. +#if 0 + static int pinch_idx = 0; + printf("Pinched %d\n", pinch_idx++); +#endif + insert_after.emplace_back(hi - il.intersections.begin()); } - for (const SegmentIntersection& it : il_right.intersections) { - if (it.has_left_horizontal()) { - const SegmentIntersection& it_left = il_left.intersections[it.left_horizontal()]; - // For a right link there is a symmetric left link. - assert(it.iContour == it_left.iContour); - assert(it.type == it_left.type); - assert(it_left.has_right_horizontal()); - assert(it_left.right_horizontal() == int(&it - il_right.intersections.data())); } } } - for (size_t i_vline = 0; i_vline < segs.size(); ++i_vline) { - const SegmentedIntersectionLine& il = segs[i_vline]; - for (const SegmentIntersection& it : il.intersections) { - auto i_it = int(&it - il.intersections.data()); - if (it.has_left_vertical_up()) { - assert(il.intersections[it.left_vertical_up()].left_vertical_down() == i_it); - assert(il.intersections[it.left_vertical_up()].prev_on_contour_quality == it.prev_on_contour_quality); + + if (! insert_after.empty()) { + // Insert phony OUTER_HIGH / OUTER_LOW pairs, adjust indices pointing to intersection points on this contour. + map.clear(); + { + size_t i = 0; + temp_intersections.clear(); + for (size_t idx_inset_after : insert_after) { + for (; i <= idx_inset_after; ++ i) { + map.emplace_back(temp_intersections.size()); + temp_intersections.emplace_back(il.intersections[i]); } - if (it.has_left_vertical_down()) { - assert(il.intersections[it.left_vertical_down()].left_vertical_up() == i_it); - assert(il.intersections[it.left_vertical_down()].prev_on_contour_quality == it.prev_on_contour_quality); + coord_t pos = (temp_intersections.back().pos() + il.intersections[i].pos()) / 2; + temp_intersections.emplace_back(phony_outer_intersection(SegmentIntersection::OUTER_HIGH, pos)); + temp_intersections.emplace_back(phony_outer_intersection(SegmentIntersection::OUTER_LOW, pos)); } - if (it.has_right_vertical_up()) { - assert(il.intersections[it.right_vertical_up()].right_vertical_down() == i_it); - assert(il.intersections[it.right_vertical_up()].next_on_contour_quality == it.next_on_contour_quality); + for (; i < il.intersections.size(); ++ i) { + map.emplace_back(temp_intersections.size()); + temp_intersections.emplace_back(il.intersections[i]); } - if (it.has_right_vertical_down()) { - assert(il.intersections[it.right_vertical_down()].right_vertical_up() == i_it); - assert(il.intersections[it.right_vertical_down()].next_on_contour_quality == it.next_on_contour_quality); + temp_intersections.swap(il.intersections); } + // Reindex references on current intersection line. + for (SegmentIntersection &ip : il.intersections) { + if (ip.has_left_vertical()) + ip.prev_on_contour = map[ip.prev_on_contour]; + if (ip.has_right_vertical()) + ip.next_on_contour = map[ip.next_on_contour]; + } + // Reindex references on previous intersection line. + for (SegmentIntersection &ip : segs[i_vline - 1].intersections) + if (ip.has_right_horizontal()) + ip.next_on_contour = map[ip.next_on_contour]; + if (i_vline < segs.size()) { + // Reindex references on next intersection line. + for (SegmentIntersection &ip : segs[i_vline + 1].intersections) + if (ip.has_left_horizontal()) + ip.prev_on_contour = map[ip.prev_on_contour]; + } +} } } -#endif /* NDEBUG */ + + assert(validate_segment_intersection_connectivity(segs)); } // Find the last INNER_HIGH intersection starting with INNER_LOW, that is followed by OUTER_HIGH intersection. @@ -2119,7 +2243,7 @@ static std::vector chain_monotonous_regions( // After how many rounds without an improvement to exit? constexpr int num_rounds_no_change_exit = 8; // With how many ants each of the run will be performed? - const int num_ants = std::min(regions.size(), 10); + const int num_ants = std::min(int(regions.size()), 10); // Base (initial) pheromone level. This value will be adjusted based on the length of the first greedy path found. float pheromone_initial_deposit = 0.5f; // Evaporation rate of pheromones. @@ -2197,7 +2321,7 @@ static std::vector chain_monotonous_regions( } // Set an initial pheromone value to 10% of the greedy path's value. - pheromone_initial_deposit = 0.1 / total_length; + pheromone_initial_deposit = 0.1f / total_length; path_matrix.update_inital_pheromone(pheromone_initial_deposit); } @@ -2395,9 +2519,21 @@ static void polylines_from_paths(const std::vector& path, // Handle nearly zero length edges. if (polyline->points.size() <= 1 || (polyline->points.size() == 2 && - std::abs(polyline->points.front()(0) - polyline->points.back()(0)) < SCALED_EPSILON && - std::abs(polyline->points.front()(1) - polyline->points.back()(1)) < SCALED_EPSILON)) + std::abs(polyline->points.front().x() - polyline->points.back().x()) < SCALED_EPSILON && + std::abs(polyline->points.front().y() - polyline->points.back().y()) < SCALED_EPSILON)) polylines_out.pop_back(); + else if (polylines_out.size() >= 2) { + assert(polyline->points.size() >= 2); + // Merge the two last polylines. An extrusion may have been split by an introduction of phony outer points on intersection lines + // to cope with pinching of inner offset contours. + Polyline &pl_prev = polylines_out[polylines_out.size() - 2]; + if (std::abs(polyline->points.front().x() - pl_prev.points.back().x()) < SCALED_EPSILON && + std::abs(polyline->points.front().y() - pl_prev.points.back().y()) < SCALED_EPSILON) { + pl_prev.points.back() = (pl_prev.points.back() + polyline->points.front()) / 2; + pl_prev.points.insert(pl_prev.points.end(), polyline->points.begin() + 1, polyline->points.end()); + polylines_out.pop_back(); + } + } polyline = nullptr; }; @@ -2550,7 +2686,7 @@ bool FillRectilinear2::fill_surface_by_lines(const Surface *surface, const FillP surface->expolygon, - rotate_vector.first, float(scale_(0 /*this->overlap*/ - (0.5 - INFILL_OVERLAP_OVER_SPACING) * this->get_spacing())), - float(scale_(0 /*this->overlap*/ - 0.5 * this->get_spacing()))); + float(scale_(0 /*this->overlap*/ - 0.5f * this->get_spacing()))); if (poly_with_offset.n_contours_inner == 0) { // Not a single infill line fits. //Prusa: maybe one shall trigger the gap fill here? @@ -2623,6 +2759,10 @@ bool FillRectilinear2::fill_surface_by_lines(const Surface *surface, const FillP //FIXME this is a hack to get the monotonous infill rolling. We likely want a smarter switch, likely based on user decison. bool monotonous_infill = params.monotonous; // || params.density > 0.99; if (monotonous_infill) { + // Sometimes the outer contour pinches the inner contour from both sides along a single vertical line. + // This situation is not handled correctly by generate_montonous_regions(). + // Insert phony OUTER_HIGH / OUTER_LOW pairs at the position where the contour is pinched. + pinch_contours_insert_phony_outer_intersections(segs); std::vector regions = generate_montonous_regions(segs); connect_monotonous_regions(regions, poly_with_offset, segs); if (!regions.empty()) { diff --git a/src/libslic3r/Fill/FillRectilinear3.cpp b/src/libslic3r/Fill/FillRectilinear3.cpp deleted file mode 100644 index 85368e8b0..000000000 --- a/src/libslic3r/Fill/FillRectilinear3.cpp +++ /dev/null @@ -1,1643 +0,0 @@ -#include -#include - -#include -#include -#include - -#include - -#include "../ClipperUtils.hpp" -#include "../ExPolygon.hpp" -#include "../Geometry.hpp" -#include "../Surface.hpp" -#include "../Int128.hpp" - -#include "FillRectilinear3.hpp" - -// #define SLIC3R_DEBUG - -// Make assert active if SLIC3R_DEBUG -#ifdef SLIC3R_DEBUG - #undef NDEBUG - #define DEBUG - #define _DEBUG - #include "../SVG.hpp" -#endif - -#include - -namespace Slic3r { - -namespace FillRectilinear3_Internal { - -// A container maintaining the source expolygon with its inner offsetted polygon. -// The source expolygon is offsetted twice: -// 1) A tiny offset is used to get a contour, to which the open hatching lines will be extended. -// 2) A larger offset is used to get a contor, along which the individual hatching lines will be connected. -struct ExPolygonWithOffset -{ -public: - ExPolygonWithOffset( - const ExPolygon &expolygon, - float aoffset1, - float aoffset2) - { - // Copy and rotate the source polygons. - polygons_src = expolygon; - - double mitterLimit = 3.; - // for the infill pattern, don't cut the corners. - // default miterLimt = 3 - //double mitterLimit = 10.; - assert(aoffset1 < 0); - assert(aoffset2 < 0); - assert(aoffset2 < aoffset1); -// bool sticks_removed = remove_sticks(polygons_src); -// if (sticks_removed) printf("Sticks removed!\n"); - polygons_outer = offset(polygons_src, aoffset1, - ClipperLib::jtMiter, - mitterLimit); - polygons_inner = offset(polygons_outer, aoffset2 - aoffset1, - ClipperLib::jtMiter, - mitterLimit); - // Filter out contours with zero area or small area, contours with 2 points only. - const double min_area_threshold = 0.01 * aoffset2 * aoffset2; - remove_small(polygons_outer, min_area_threshold); - remove_small(polygons_inner, min_area_threshold); - remove_sticks(polygons_outer); - remove_sticks(polygons_inner); - n_contours_outer = polygons_outer.size(); - n_contours_inner = polygons_inner.size(); - n_contours = n_contours_outer + n_contours_inner; - polygons_ccw.assign(n_contours, false); - for (size_t i = 0; i < n_contours; ++ i) { - contour(i).remove_duplicate_points(); - assert(! contour(i).has_duplicate_points()); - polygons_ccw[i] = Slic3r::Geometry::is_ccw(contour(i)); - } - } - - // Any contour with offset1 - bool is_contour_outer(size_t idx) const { return idx < n_contours_outer; } - // Any contour with offset2 - bool is_contour_inner(size_t idx) const { return idx >= n_contours_outer; } - - const Polygon& contour(size_t idx) const - { return is_contour_outer(idx) ? polygons_outer[idx] : polygons_inner[idx - n_contours_outer]; } - - Polygon& contour(size_t idx) - { return is_contour_outer(idx) ? polygons_outer[idx] : polygons_inner[idx - n_contours_outer]; } - - bool is_contour_ccw(size_t idx) const { return polygons_ccw[idx] != 0; } - - BoundingBox bounding_box_src() const - { return get_extents(polygons_src); } - BoundingBox bounding_box_outer() const - { return get_extents(polygons_outer); } - BoundingBox bounding_box_inner() const - { return get_extents(polygons_inner); } - -#ifdef SLIC3R_DEBUG - void export_to_svg(Slic3r::SVG &svg) const { - svg.draw_outline(polygons_src, "black"); - svg.draw_outline(polygons_outer, "green"); - svg.draw_outline(polygons_inner, "brown"); - } -#endif /* SLIC3R_DEBUG */ - - ExPolygon polygons_src; - Polygons polygons_outer; - Polygons polygons_inner; - - size_t n_contours_outer; - size_t n_contours_inner; - size_t n_contours; - -protected: - // For each polygon of polygons_inner, remember its orientation. - std::vector polygons_ccw; -}; - -class SegmentedIntersectionLine; - -// Intersection point of a vertical line with a polygon segment. -class SegmentIntersection -{ -public: - SegmentIntersection() : - line(nullptr), - expoly_with_offset(nullptr), - iContour(0), - iSegment(0), - type(UNKNOWN), - consumed_vertical_up(false), - consumed_perimeter_right(false) - {} - - // Parent object owning this intersection point. - const SegmentedIntersectionLine *line; - // Container with the source expolygon and its shrank copies, to be intersected by the line. - const ExPolygonWithOffset *expoly_with_offset; - - // Index of a contour in ExPolygonWithOffset, with which this vertical line intersects. - size_t iContour; - // Index of a segment in iContour, with which this vertical line intersects. - size_t iSegment; - - // Kind of intersection. With the original contour, or with the inner offestted contour? - // A vertical segment will be at least intersected by OUTER_LOW, OUTER_HIGH, - // but it could be intersected with OUTER_LOW, INNER_LOW, INNER_HIGH, OUTER_HIGH, - // and there may be more than one pair of INNER_LOW, INNER_HIGH between OUTER_LOW, OUTER_HIGH. - enum SegmentIntersectionType { - OUTER_LOW = 0, - OUTER_HIGH = 1, - INNER_LOW = 2, - INNER_HIGH = 3, - UNKNOWN = -1 - }; - SegmentIntersectionType type; - - // For the INNER_LOW type, this point may be connected to another INNER_LOW point following a perimeter contour. - // For the INNER_HIGH type, this point may be connected to another INNER_HIGH point following a perimeter contour. - // If INNER_LOW is connected to INNER_HIGH or vice versa, - // one has to make sure the vertical infill line does not overlap with the connecting perimeter line. - bool is_inner() const { return type == INNER_LOW || type == INNER_HIGH; } - bool is_outer() const { return type == OUTER_LOW || type == OUTER_HIGH; } - bool is_low () const { return type == INNER_LOW || type == OUTER_LOW; } - bool is_high () const { return type == INNER_HIGH || type == OUTER_HIGH; } - - // Calculate a position of this intersection point. The position does not need to be necessary exact. - Point pos() const; - - // Returns 0, if this and other segments intersect at the hatching line. - // Returns -1, if this intersection is below the other intersection on the hatching line. - // Returns +1 otherwise. - int ordering_along_line(const SegmentIntersection &other) const; - - // Compare two y intersection points given by rational numbers. - bool operator< (const SegmentIntersection &other) const; - // { return this->ordering_along_line(other) == -1; } - bool operator==(const SegmentIntersection &other) const { return this->ordering_along_line(other) == 0; } - - //FIXME legacy code, suporting the old graph traversal algorithm. Please remove. - // Was this segment along the y axis consumed? - // Up means up along the vertical segment. - bool consumed_vertical_up; - // Was a segment of the inner perimeter contour consumed? - // Right means right from the vertical segment. - bool consumed_perimeter_right; -}; - -// A single hathing line intersecting the ExPolygonWithOffset. -class SegmentedIntersectionLine -{ -public: - // Index of this vertical intersection line. - size_t idx; - // Position of the line along the X axis of the oriented bounding box. -// coord_t x; - // Position of this vertical intersection line, rotated to the world coordinate system. - Point pos; - // Direction of this vertical intersection line, rotated to the world coordinate system. The direction is not normalized to maintain a sufficient accuracy! - Vector dir; - // List of intersection points with polygons, sorted increasingly by the y axis. - // The SegmentIntersection keeps a pointer to this object to access the start and direction of this line. - std::vector intersections; -}; - -// Return an intersection point of the parent SegmentedIntersectionLine with the segment of a parent ExPolygonWithOffset. -// The intersected segment of the ExPolygonWithOffset is addressed with (iContour, iSegment). -// When calling this method, the SegmentedIntersectionLine must not be parallel with the segment. -Point SegmentIntersection::pos() const -{ - // Get the two rays to be intersected. - const Polygon &poly = this->expoly_with_offset->contour(this->iContour); - // 30 bits + 1 signum bit. - const Point &seg_start = poly.points[(this->iSegment == 0) ? poly.points.size() - 1 : this->iSegment - 1]; - const Point &seg_end = poly.points[this->iSegment]; - // Point, vector of the segment. - const Vec2d p1(seg_start.cast()); - const Vec2d v1((seg_end - seg_start).cast()); - // Point, vector of this hatching line. - const Vec2d p2(line->pos.cast()); - const Vec2d v2(line->dir.cast()); - // Intersect the two rays. - double denom = v1(0) * v2(1) - v2(0) * v1(1); - Point out; - if (denom == 0.) { - // Lines are collinear. As the pos() method is not supposed to be called on collinear vectors, - // the source vectors are not quite collinear. Return the center of the contour segment. - out = seg_start + seg_end; - out(0) >>= 1; - out(1) >>= 1; - } else { - // Find the intersection point. - double t = (v2(0) * (p1(1) - p2(1)) - v2(1) * (p1(0) - p2(0))) / denom; - if (t < 0.) - out = seg_start; - else if (t > 1.) - out = seg_end; - else { - out(0) = coord_t(floor(p1(0) + t * v1(0) + 0.5)); - out(1) = coord_t(floor(p1(1) + t * v1(1) + 0.5)); - } - } - return out; -} - -static inline int signum(int64_t v) { return (v > 0) - (v < 0); } - -// Returns 0, if this and other segments intersect at the hatching line. -// Returns -1, if this intersection is below the other intersection on the hatching line. -// Returns +1 otherwise. -int SegmentIntersection::ordering_along_line(const SegmentIntersection &other) const -{ - assert(this->line == other.line); - assert(this->expoly_with_offset == other.expoly_with_offset); - - if (this->iContour == other.iContour && this->iSegment == other.iSegment) - return true; - - // Segment of this - const Polygon &poly_a = this->expoly_with_offset->contour(this->iContour); - // 30 bits + 1 signum bit. - const Point &seg_start_a = poly_a.points[(this->iSegment == 0) ? poly_a.points.size() - 1 : this->iSegment - 1]; - const Point &seg_end_a = poly_a.points[this->iSegment]; - - // Segment of other - const Polygon &poly_b = this->expoly_with_offset->contour(other.iContour); - // 30 bits + 1 signum bit. - const Point &seg_start_b = poly_b.points[(other.iSegment == 0) ? poly_b.points.size() - 1 : other.iSegment - 1]; - const Point &seg_end_b = poly_b.points[other.iSegment]; - - if (this->iContour == other.iContour) { - if ((this->iSegment + 1) % poly_a.points.size() == other.iSegment) { - // other.iSegment succeeds this->iSegment - assert(seg_end_a == seg_start_b); - // Avoid calling the 128bit x 128bit multiplication below if this->line intersects the common point. - if (cross2(Vec2crd(this->line->dir), (seg_end_b - this->line->pos)) == 0) - return 0; - } else if ((other.iSegment + 1) % poly_a.points.size() == this->iSegment) { - // this->iSegment succeeds other.iSegment - assert(seg_start_a == seg_end_b); - // Avoid calling the 128bit x 128bit multiplication below if this->line intersects the common point. - if (cross2(Vec2crd(this->line->dir), (seg_start_a - this->line->pos)) == 0) - return 0; - } else { - // General case. - } - } - - // First test, whether both points of one segment are completely in one half-plane of the other line. - const Vec2crd vec_b = (seg_end_b - seg_start_b); - int side_start = signum(cross2(vec_b, (seg_start_a - seg_start_b))); - int side_end = signum(cross2(vec_b, (seg_end_a - seg_start_b))); - int side = side_start * side_end; - if (side > 0) - // This segment is completely inside one half-plane of the other line, therefore the ordering is trivial. - return signum(cross2(vec_b, this->line->dir)) * side_start; - - const Vec2crd vec_a = (seg_end_a - seg_start_a); - int side_start2 = signum(cross2(vec_a, (seg_start_b - seg_start_a))); - int side_end2 = signum(cross2(vec_a, (seg_end_b - seg_start_a))); - int side2 = side_start2 * side_end2; - //if (side == 0 && side2 == 0) - // The segments share one of their end points. - if (side2 > 0) - // This segment is completely inside one half-plane of the other line, therefore the ordering is trivial. - return signum(cross2(this->line->dir, vec_a)) * side_start2; - - // The two segments intersect and they are not sucessive segments of the same contour. - // Ordering of the points depends on the position of the segment intersection (left / right from this->line), - // therefore a simple test over the input segment end points is not sufficient. - - // Find the parameters of intersection of the two segmetns with this->line. - int64_t denom1 = cross2(this->line->dir, vec_a); - int64_t denom2 = cross2(this->line->dir, vec_b); - Vec2crd vx_a = (seg_start_a - this->line->pos); - Vec2crd vx_b = (seg_start_b - this->line->pos); - int64_t t1_times_denom1 = vx_a(0) * vec_a(1) - vx_a(1) * vec_a(0); - int64_t t2_times_denom2 = vx_b(0) * vec_b(1) - vx_b(1) * vec_b(0); - assert(denom1 != 0); - assert(denom2 != 0); - return Int128::compare_rationals_filtered(t1_times_denom1, denom1, t2_times_denom2, denom2); -} - -// Compare two y intersection points given by rational numbers. -bool SegmentIntersection::operator<(const SegmentIntersection &other) const -{ -#ifdef _DEBUG - Point p1 = this->pos(); - Point p2 = other.pos(); - int64_t d = this->line->dir.dot((p2 - p1)); -#endif /* _DEBUG */ - int ordering = this->ordering_along_line(other); -#ifdef _DEBUG - if (ordering == -1) - assert(d >= - int64_t(SCALED_EPSILON)); - else if (ordering == 1) - assert(d <= int64_t(SCALED_EPSILON)); -#endif /* _DEBUG */ - return ordering == -1; -} - -// When doing a rectilinear / grid / triangle / stars / cubic infill, -// the following class holds the hatching lines of each of the hatching directions. -class InfillHatchingSingleDirection -{ -public: - // Hatching angle, CCW from the X axis. - double angle; - // Starting point of the 1st hatching line. - Point start_point; - // Direction vector, its size is not normalized to maintain a sufficient accuracy! - Vector direction; - // Spacing of the hatching lines, perpendicular to the direction vector. - coord_t line_spacing; - // Infill segments oriented at angle. - std::vector segs; -}; - -// For the rectilinear, grid, triangles, stars and cubic pattern fill one InfillHatchingSingleDirection structure -// for each infill direction. The segments stored in InfillHatchingSingleDirection will then form a graph of candidate -// paths to be extruded. -static bool prepare_infill_hatching_segments( - // Input geometry to be hatch, containing two concentric contours for each input contour. - const ExPolygonWithOffset &poly_with_offset, - // fill density, dont_adjust - const FillParams ¶ms, - // angle, pattern_shift, spacing - FillRectilinear3::FillDirParams &fill_dir_params, - // Reference point of the pattern, to which the infill lines will be alligned, and the base angle. - const std::pair &rotate_vector, - // Resulting straight segments of the infill graph. - InfillHatchingSingleDirection &out) -{ - out.angle = rotate_vector.first + fill_dir_params.angle; - out.direction = Point(coord_t(scale_(1000)), coord_t(0)); - // Hatch along the Y axis of the rotated coordinate system. - out.direction.rotate(out.angle + 0.5 * M_PI); - out.segs.clear(); - - assert(params.density > 0.0001f); - coord_t line_spacing = coord_t(scale_(fill_dir_params.spacing) / params.density); - - // Bounding box around the source contour, aligned with out.angle. - BoundingBox bounding_box = get_extents_rotated(poly_with_offset.polygons_src.contour, - out.angle); - - // Define the flow spacing according to requested density. - if (params.full_infill() && ! params.dont_adjust) { - // Full infill, adjust the line spacing to fit an integer number of lines. - out.line_spacing = Fill::_adjust_solid_spacing(bounding_box.size()(0), line_spacing); - // Report back the adjusted line spacing. - fill_dir_params.spacing = unscale(line_spacing); - } else { - // Extend bounding box so that our pattern will be aligned with the other layers. - // Transform the reference point to the rotated coordinate system. - Point refpt = rotate_vector.second.rotated(- out.angle); - // _align_to_grid will not work correctly with positive pattern_shift. - coord_t pattern_shift_scaled = coord_t(scale_(fill_dir_params.pattern_shift)) % line_spacing; - refpt(0) -= (pattern_shift_scaled >= 0) ? pattern_shift_scaled : (line_spacing + pattern_shift_scaled); - bounding_box.merge(Fill::_align_to_grid( - bounding_box.min, - Point(line_spacing, line_spacing), - refpt)); - } - - // Intersect a set of euqally spaced vertical lines wiht expolygon. - // n_vlines = ceil(bbox_width / line_spacing) - size_t n_vlines = (bounding_box.max(0) - bounding_box.min(0) + line_spacing - 1) / line_spacing; - coord_t x0 = bounding_box.min(0); - if (params.full_infill()) - x0 += coord_t((line_spacing + SCALED_EPSILON) / 2); - - out.line_spacing = line_spacing; - out.start_point = Point(x0, bounding_box.min(1)); - out.start_point.rotate(out.angle); - -#ifdef SLIC3R_DEBUG - static int iRun = 0; - BoundingBox bbox_svg = poly_with_offset.bounding_box_outer(); - ::Slic3r::SVG svg(debug_out_path("FillRectilinear2-%d.svg", iRun), bbox_svg); // , scale_(1.)); - poly_with_offset.export_to_svg(svg); - { - ::Slic3r::SVG svg(debug_out_path("FillRectilinear2-initial-%d.svg", iRun), bbox_svg); // , scale_(1.)); - poly_with_offset.export_to_svg(svg); - } - iRun ++; -#endif /* SLIC3R_DEBUG */ - - // For each contour - // Allocate storage for the segments. - out.segs.assign(n_vlines, SegmentedIntersectionLine()); - double cos_a = cos(out.angle); - double sin_a = sin(out.angle); - for (size_t i = 0; i < n_vlines; ++ i) { - auto &seg = out.segs[i]; - seg.idx = i; - // seg(0) = x0 + coord_t(i) * line_spacing; - coord_t x = x0 + coord_t(i) * line_spacing; - seg.pos(0) = coord_t(floor(cos_a * x - sin_a * bounding_box.min(1) + 0.5)); - seg.pos(1) = coord_t(floor(cos_a * bounding_box.min(1) + sin_a * x + 0.5)); - seg.dir = out.direction; - } - - for (size_t iContour = 0; iContour < poly_with_offset.n_contours; ++ iContour) { - const Points &contour = poly_with_offset.contour(iContour).points; - if (contour.size() < 2) - continue; - // For each segment - for (size_t iSegment = 0; iSegment < contour.size(); ++ iSegment) { - size_t iPrev = ((iSegment == 0) ? contour.size() : iSegment) - 1; - const Point *pl = &contour[iPrev]; - const Point *pr = &contour[iSegment]; - // Orient the segment to the direction vector. - const Point v = *pr - *pl; - int orientation = Int128::sign_determinant_2x2_filtered(v(0), v(1), out.direction(0), out.direction(1)); - if (orientation == 0) - // Ignore strictly vertical segments. - continue; - if (orientation < 0) - // Always orient the input segment consistently towards the hatching direction. - std::swap(pl, pr); - // Which of the equally spaced vertical lines is intersected by this segment? - coord_t l = (coord_t)floor(cos_a * (*pl)(0) + sin_a * (*pl)(1) - SCALED_EPSILON); - coord_t r = (coord_t)ceil (cos_a * (*pr)(0) + sin_a * (*pr)(1) + SCALED_EPSILON); - assert(l < r - SCALED_EPSILON); - // il, ir are the left / right indices of vertical lines intersecting a segment - int il = std::max(0, (l - x0 + line_spacing) / line_spacing); - int ir = std::min(int(out.segs.size()) - 1, (r - x0) / line_spacing); - // The previous tests were done with floating point arithmetics over an epsilon-extended interval. - // Now do the same tests with exact arithmetics over the exact interval. - while (il <= ir && int128::orient(out.segs[il].pos, out.segs[il].pos + out.direction, *pl) < 0) - ++ il; - while (il <= ir && int128::orient(out.segs[ir].pos, out.segs[ir].pos + out.direction, *pr) > 0) - -- ir; - // Here it is ensured, that - // 1) out.seg is not parallel to (pl, pr) - // 2) all lines from il to ir intersect . - assert(il >= 0 && ir < int(out.segs.size())); - for (int i = il; i <= ir; ++ i) { - // assert(out.segs[i](0) == i * line_spacing + x0); - // assert(l <= out.segs[i](0)); - // assert(r >= out.segs[i](0)); - SegmentIntersection is; - is.line = &out.segs[i]; - is.expoly_with_offset = &poly_with_offset; - is.iContour = iContour; - is.iSegment = iSegment; - // Test whether the calculated intersection point falls into the bounding box of the input segment. - // +-1 to take rounding into account. - assert(int128::orient(out.segs[i].pos, out.segs[i].pos + out.direction, *pl) >= 0); - assert(int128::orient(out.segs[i].pos, out.segs[i].pos + out.direction, *pr) <= 0); - assert(is.pos()(0) + 1 >= std::min((*pl)(0), (*pr)(0))); - assert(is.pos()(1) + 1 >= std::min((*pl)(1), (*pr)(1))); - assert(is.pos()(0) <= std::max((*pl)(0), (*pr)(0)) + 1); - assert(is.pos()(1) <= std::max((*pl)(1), (*pr)(1)) + 1); - out.segs[i].intersections.push_back(is); - } - } - } - - // Sort the intersections along their segments, specify the intersection types. - for (size_t i_seg = 0; i_seg < out.segs.size(); ++ i_seg) { - SegmentedIntersectionLine &sil = out.segs[i_seg]; - // Sort the intersection points using exact rational arithmetic. - std::sort(sil.intersections.begin(), sil.intersections.end()); -#ifdef _DEBUG - // Verify that the intersections are sorted along the haching direction. - for (size_t i = 1; i < sil.intersections.size(); ++ i) { - Point p1 = sil.intersections[i - 1].pos(); - Point p2 = sil.intersections[i].pos(); - int64_t d = sil.dir.dot((p2 - p1)); - assert(d >= - int64_t(SCALED_EPSILON)); - } -#endif /* _DEBUG */ - // Assign the intersection types, remove duplicate or overlapping intersection points. - // When a loop vertex touches a vertical line, intersection point is generated for both segments. - // If such two segments are oriented equally, then one of them is removed. - // Otherwise the vertex is tangential to the vertical line and both segments are removed. - // The same rule applies, if the loop is pinched into a single point and this point touches the vertical line: - // The loop has a zero vertical size at the vertical line, therefore the intersection point is removed. - size_t j = 0; - for (size_t i = 0; i < sil.intersections.size(); ++ i) { - // What is the orientation of the segment at the intersection point? - size_t iContour = sil.intersections[i].iContour; - const Points &contour = poly_with_offset.contour(iContour).points; - size_t iSegment = sil.intersections[i].iSegment; - size_t iPrev = ((iSegment == 0) ? contour.size() : iSegment) - 1; - int dir = int128::cross(contour[iSegment] - contour[iPrev], sil.dir); - bool low = dir > 0; - sil.intersections[i].type = poly_with_offset.is_contour_outer(iContour) ? - (low ? SegmentIntersection::OUTER_LOW : SegmentIntersection::OUTER_HIGH) : - (low ? SegmentIntersection::INNER_LOW : SegmentIntersection::INNER_HIGH); - if (j > 0 && sil.intersections[i].iContour == sil.intersections[j-1].iContour) { - // Two successive intersection points on a vertical line with the same contour. This may be a special case. - if (sil.intersections[i] == sil.intersections[j-1]) { - // Two successive segments meet exactly at the vertical line. - #ifdef SLIC3R_DEBUG - // Verify that the segments of sil.intersections[i] and sil.intersections[j-1] are adjoint. - size_t iSegment2 = sil.intersections[j-1].iSegment; - size_t iPrev2 = ((iSegment2 == 0) ? contour.size() : iSegment2) - 1; - assert(iSegment == iPrev2 || iSegment2 == iPrev); - #endif /* SLIC3R_DEBUG */ - if (sil.intersections[i].type == sil.intersections[j-1].type) { - // Two successive segments of the same direction (both to the right or both to the left) - // meet exactly at the vertical line. - // Remove the second intersection point. - } else { - // This is a loop returning to the same point. - // It may as well be a vertex of a loop touching this vertical line. - // Remove both the lines. - -- j; - } - } else if (sil.intersections[i].type == sil.intersections[j-1].type) { - // Two non successive segments of the same direction (both to the right or both to the left) - // meet exactly at the vertical line. That means there is a Z shaped path, where the center segment - // of the Z shaped path is aligned with this vertical line. - // Remove one of the intersection points while maximizing the vertical segment length. - if (low) { - // Remove the second intersection point, keep the first intersection point. - } else { - // Remove the first intersection point, keep the second intersection point. - sil.intersections[j-1] = sil.intersections[i]; - } - } else { - // Vertical line intersects a contour segment at a general position (not at one of its end points). - // or the contour just touches this vertical line with a vertical segment or a sequence of vertical segments. - // Keep both intersection points. - if (j < i) - sil.intersections[j] = sil.intersections[i]; - ++ j; - } - } else { - // Vertical line intersects a contour segment at a general position (not at one of its end points). - if (j < i) - sil.intersections[j] = sil.intersections[i]; - ++ j; - } - } - // Shrink the list of intersections, if any of the intersection was removed during the classification. - if (j < sil.intersections.size()) - sil.intersections.erase(sil.intersections.begin() + j, sil.intersections.end()); - } - - // Verify the segments. If something is wrong, give up. -#define ASSERT_OR_RETURN(CONDITION) do { assert(CONDITION); if (! (CONDITION)) return false; } while (0) -#ifdef _MSC_VER - #pragma warning(push) - #pragma warning(disable: 4127) -#endif - for (size_t i_seg = 0; i_seg < out.segs.size(); ++ i_seg) { - SegmentedIntersectionLine &sil = out.segs[i_seg]; - // The intersection points have to be even. - ASSERT_OR_RETURN((sil.intersections.size() & 1) == 0); - for (size_t i = 0; i < sil.intersections.size();) { - // An intersection segment crossing the bigger contour may cross the inner offsetted contour even number of times. - ASSERT_OR_RETURN(sil.intersections[i].type == SegmentIntersection::OUTER_LOW); - size_t j = i + 1; - ASSERT_OR_RETURN(j < sil.intersections.size()); - ASSERT_OR_RETURN(sil.intersections[j].type == SegmentIntersection::INNER_LOW || sil.intersections[j].type == SegmentIntersection::OUTER_HIGH); - for (; j < sil.intersections.size() && sil.intersections[j].is_inner(); ++ j) ; - ASSERT_OR_RETURN(j < sil.intersections.size()); - ASSERT_OR_RETURN((j & 1) == 1); - ASSERT_OR_RETURN(sil.intersections[j].type == SegmentIntersection::OUTER_HIGH); - ASSERT_OR_RETURN(i + 1 == j || sil.intersections[j - 1].type == SegmentIntersection::INNER_HIGH); - i = j + 1; - } - } -#undef ASSERT_OR_RETURN -#ifdef _MSC_VER - #pragma warning(push) -#endif /* _MSC_VER */ - -#ifdef SLIC3R_DEBUG - // Paint the segments and finalize the SVG file. - for (size_t i_seg = 0; i_seg < out.segs.size(); ++ i_seg) { - SegmentedIntersectionLine &sil = out.segs[i_seg]; - for (size_t i = 0; i < sil.intersections.size();) { - size_t j = i + 1; - for (; j < sil.intersections.size() && sil.intersections[j].is_inner(); ++ j) ; - if (i + 1 == j) { - svg.draw(Line(sil.intersections[i ].pos(), sil.intersections[j ].pos()), "blue"); - } else { - svg.draw(Line(sil.intersections[i ].pos(), sil.intersections[i+1].pos()), "green"); - svg.draw(Line(sil.intersections[i+1].pos(), sil.intersections[j-1].pos()), (j - i + 1 > 4) ? "yellow" : "magenta"); - svg.draw(Line(sil.intersections[j-1].pos(), sil.intersections[j ].pos()), "green"); - } - i = j + 1; - } - } - svg.Close(); -#endif /* SLIC3R_DEBUG */ - - - return true; -} - - - - - - - - -/****************************************************************** Legacy code, to be replaced by a graph algorithm ******************************************************************/ - - -// Having a segment of a closed polygon, calculate its Euclidian length. -// The segment indices seg1 and seg2 signify an end point of an edge in the forward direction of the loop, -// therefore the point p1 lies on poly.points[seg1-1], poly.points[seg1] etc. -static inline coordf_t segment_length(const Polygon &poly, size_t seg1, const Point &p1, size_t seg2, const Point &p2) -{ -#ifdef SLIC3R_DEBUG - // Verify that p1 lies on seg1. This is difficult to verify precisely, - // but at least verify, that p1 lies in the bounding box of seg1. - for (size_t i = 0; i < 2; ++ i) { - size_t seg = (i == 0) ? seg1 : seg2; - Point px = (i == 0) ? p1 : p2; - Point pa = poly.points[((seg == 0) ? poly.points.size() : seg) - 1]; - Point pb = poly.points[seg]; - if (pa(0) > pb(0)) - std::swap(pa(0), pb(0)); - if (pa(1) > pb(1)) - std::swap(pa(1), pb(1)); - assert(px(0) >= pa(0) && px(0) <= pb(0)); - assert(px(1) >= pa(1) && px(1) <= pb(1)); - } -#endif /* SLIC3R_DEBUG */ - const Point *pPrev = &p1; - const Point *pThis = NULL; - coordf_t len = 0; - if (seg1 <= seg2) { - for (size_t i = seg1; i < seg2; ++ i, pPrev = pThis) - len += (*pPrev - *(pThis = &poly.points[i])).cast().norm(); - } else { - for (size_t i = seg1; i < poly.points.size(); ++ i, pPrev = pThis) - len += (*pPrev - *(pThis = &poly.points[i])).cast().norm(); - for (size_t i = 0; i < seg2; ++ i, pPrev = pThis) - len += (*pPrev - *(pThis = &poly.points[i])).cast().norm(); - } - len += (*pPrev - p2).cast().norm(); - return len; -} - -// Append a segment of a closed polygon to a polyline. -// The segment indices seg1 and seg2 signify an end point of an edge in the forward direction of the loop. -// Only insert intermediate points between seg1 and seg2. -static inline void polygon_segment_append(Points &out, const Polygon &polygon, size_t seg1, size_t seg2) -{ - if (seg1 == seg2) { - // Nothing to append from this segment. - } else if (seg1 < seg2) { - // Do not append a point pointed to by seg2. - out.insert(out.end(), polygon.points.begin() + seg1, polygon.points.begin() + seg2); - } else { - out.reserve(out.size() + seg2 + polygon.points.size() - seg1); - out.insert(out.end(), polygon.points.begin() + seg1, polygon.points.end()); - // Do not append a point pointed to by seg2. - out.insert(out.end(), polygon.points.begin(), polygon.points.begin() + seg2); - } -} - -// Append a segment of a closed polygon to a polyline. -// The segment indices seg1 and seg2 signify an end point of an edge in the forward direction of the loop, -// but this time the segment is traversed backward. -// Only insert intermediate points between seg1 and seg2. -static inline void polygon_segment_append_reversed(Points &out, const Polygon &polygon, size_t seg1, size_t seg2) -{ - if (seg1 >= seg2) { - out.reserve(seg1 - seg2); - for (size_t i = seg1; i > seg2; -- i) - out.push_back(polygon.points[i - 1]); - } else { - // it could be, that seg1 == seg2. In that case, append the complete loop. - out.reserve(out.size() + seg2 + polygon.points.size() - seg1); - for (size_t i = seg1; i > 0; -- i) - out.push_back(polygon.points[i - 1]); - for (size_t i = polygon.points.size(); i > seg2; -- i) - out.push_back(polygon.points[i - 1]); - } -} - -static inline int distance_of_segmens(const Polygon &poly, size_t seg1, size_t seg2, bool forward) -{ - int d = int(seg2) - int(seg1); - if (! forward) - d = - d; - if (d < 0) - d += int(poly.points.size()); - return d; -} - -// For a vertical line, an inner contour and an intersection point, -// find an intersection point on the previous resp. next vertical line. -// The intersection point is connected with the prev resp. next intersection point with iInnerContour. -// Return -1 if there is no such point on the previous resp. next vertical line. -static inline int intersection_on_prev_next_vertical_line( - const ExPolygonWithOffset &poly_with_offset, - const std::vector &segs, - size_t iVerticalLine, - size_t iInnerContour, - size_t iIntersection, - bool dir_is_next) -{ - size_t iVerticalLineOther = iVerticalLine; - if (dir_is_next) { - if (++ iVerticalLineOther == segs.size()) - // No successive vertical line. - return -1; - } else if (iVerticalLineOther -- == 0) { - // No preceding vertical line. - return -1; - } - - const SegmentedIntersectionLine &il = segs[iVerticalLine]; - const SegmentIntersection &itsct = il.intersections[iIntersection]; - const SegmentedIntersectionLine &il2 = segs[iVerticalLineOther]; - const Polygon &poly = poly_with_offset.contour(iInnerContour); -// const bool ccw = poly_with_offset.is_contour_ccw(iInnerContour); - const bool forward = itsct.is_low() == dir_is_next; - // Resulting index of an intersection point on il2. - int out = -1; - // Find an intersection point on iVerticalLineOther, intersecting iInnerContour - // at the same orientation as iIntersection, and being closest to iIntersection - // in the number of contour segments, when following the direction of the contour. - int dmin = std::numeric_limits::max(); - for (size_t i = 0; i < il2.intersections.size(); ++ i) { - const SegmentIntersection &itsct2 = il2.intersections[i]; - if (itsct.iContour == itsct2.iContour && itsct.type == itsct2.type) { - /* - if (itsct.is_low()) { - assert(itsct.type == SegmentIntersection::INNER_LOW); - assert(iIntersection > 0); - assert(il.intersections[iIntersection-1].type == SegmentIntersection::OUTER_LOW); - assert(i > 0); - if (il2.intersections[i-1].is_inner()) - // Take only the lowest inner intersection point. - continue; - assert(il2.intersections[i-1].type == SegmentIntersection::OUTER_LOW); - } else { - assert(itsct.type == SegmentIntersection::INNER_HIGH); - assert(iIntersection+1 < il.intersections.size()); - assert(il.intersections[iIntersection+1].type == SegmentIntersection::OUTER_HIGH); - assert(i+1 < il2.intersections.size()); - if (il2.intersections[i+1].is_inner()) - // Take only the highest inner intersection point. - continue; - assert(il2.intersections[i+1].type == SegmentIntersection::OUTER_HIGH); - } - */ - // The intersection points lie on the same contour and have the same orientation. - // Find the intersection point with a shortest path in the direction of the contour. - int d = distance_of_segmens(poly, itsct.iSegment, itsct2.iSegment, forward); - if (d < dmin) { - out = i; - dmin = d; - } - } - } - //FIXME this routine is not asymptotic optimal, it will be slow if there are many intersection points along the line. - return out; -} - -static inline int intersection_on_prev_vertical_line( - const ExPolygonWithOffset &poly_with_offset, - const std::vector &segs, - size_t iVerticalLine, - size_t iInnerContour, - size_t iIntersection) -{ - return intersection_on_prev_next_vertical_line(poly_with_offset, segs, iVerticalLine, iInnerContour, iIntersection, false); -} - -static inline int intersection_on_next_vertical_line( - const ExPolygonWithOffset &poly_with_offset, - const std::vector &segs, - size_t iVerticalLine, - size_t iInnerContour, - size_t iIntersection) -{ - return intersection_on_prev_next_vertical_line(poly_with_offset, segs, iVerticalLine, iInnerContour, iIntersection, true); -} - -enum IntersectionTypeOtherVLine { - // There is no connection point on the other vertical line. - INTERSECTION_TYPE_OTHER_VLINE_UNDEFINED = -1, - // Connection point on the other vertical segment was found - // and it could be followed. - INTERSECTION_TYPE_OTHER_VLINE_OK = 0, - // The connection segment connects to a middle of a vertical segment. - // Cannot follow. - INTERSECTION_TYPE_OTHER_VLINE_INNER, - // Cannot extend the contor to this intersection point as either the connection segment - // or the succeeding vertical segment were already consumed. - INTERSECTION_TYPE_OTHER_VLINE_CONSUMED, - // Not the first intersection along the contor. This intersection point - // has been preceded by an intersection point along the vertical line. - INTERSECTION_TYPE_OTHER_VLINE_NOT_FIRST, -}; - -// Find an intersection on a previous line, but return -1, if the connecting segment of a perimeter was already extruded. -static inline IntersectionTypeOtherVLine intersection_type_on_prev_next_vertical_line( - const std::vector &segs, - size_t iVerticalLine, - size_t iIntersection, - size_t iIntersectionOther, - bool dir_is_next) -{ - // This routine will propose a connecting line even if the connecting perimeter segment intersects - // iVertical line multiple times before reaching iIntersectionOther. - if (iIntersectionOther == size_t(-1)) - return INTERSECTION_TYPE_OTHER_VLINE_UNDEFINED; - assert(dir_is_next ? (iVerticalLine + 1 < segs.size()) : (iVerticalLine > 0)); - const SegmentedIntersectionLine &il_this = segs[iVerticalLine]; - const SegmentIntersection &itsct_this = il_this.intersections[iIntersection]; - const SegmentedIntersectionLine &il_other = segs[dir_is_next ? (iVerticalLine+1) : (iVerticalLine-1)]; - const SegmentIntersection &itsct_other = il_other.intersections[iIntersectionOther]; - assert(itsct_other.is_inner()); - assert(iIntersectionOther > 0); - assert(iIntersectionOther + 1 < il_other.intersections.size()); - // Is iIntersectionOther at the boundary of a vertical segment? - const SegmentIntersection &itsct_other2 = il_other.intersections[itsct_other.is_low() ? iIntersectionOther - 1 : iIntersectionOther + 1]; - if (itsct_other2.is_inner()) - // Cannot follow a perimeter segment into the middle of another vertical segment. - // Only perimeter segments connecting to the end of a vertical segment are followed. - return INTERSECTION_TYPE_OTHER_VLINE_INNER; - assert(itsct_other.is_low() == itsct_other2.is_low()); - if (dir_is_next ? itsct_this.consumed_perimeter_right : itsct_other.consumed_perimeter_right) - // This perimeter segment was already consumed. - return INTERSECTION_TYPE_OTHER_VLINE_CONSUMED; - if (itsct_other.is_low() ? itsct_other.consumed_vertical_up : il_other.intersections[iIntersectionOther-1].consumed_vertical_up) - // This vertical segment was already consumed. - return INTERSECTION_TYPE_OTHER_VLINE_CONSUMED; - return INTERSECTION_TYPE_OTHER_VLINE_OK; -} - -static inline IntersectionTypeOtherVLine intersection_type_on_prev_vertical_line( - const std::vector &segs, - size_t iVerticalLine, - size_t iIntersection, - size_t iIntersectionPrev) -{ - return intersection_type_on_prev_next_vertical_line(segs, iVerticalLine, iIntersection, iIntersectionPrev, false); -} - -static inline IntersectionTypeOtherVLine intersection_type_on_next_vertical_line( - const std::vector &segs, - size_t iVerticalLine, - size_t iIntersection, - size_t iIntersectionNext) -{ - return intersection_type_on_prev_next_vertical_line(segs, iVerticalLine, iIntersection, iIntersectionNext, true); -} - -// Measure an Euclidian length of a perimeter segment when going from iIntersection to iIntersection2. -static inline coordf_t measure_perimeter_prev_next_segment_length( - const ExPolygonWithOffset &poly_with_offset, - const std::vector &segs, - size_t iVerticalLine, - size_t iInnerContour, - size_t iIntersection, - size_t iIntersection2, - bool dir_is_next) -{ - size_t iVerticalLineOther = iVerticalLine; - if (dir_is_next) { - if (++ iVerticalLineOther == segs.size()) - // No successive vertical line. - return coordf_t(-1); - } else if (iVerticalLineOther -- == 0) { - // No preceding vertical line. - return coordf_t(-1); - } - - const SegmentedIntersectionLine &il = segs[iVerticalLine]; - const SegmentIntersection &itsct = il.intersections[iIntersection]; - const SegmentedIntersectionLine &il2 = segs[iVerticalLineOther]; - const SegmentIntersection &itsct2 = il2.intersections[iIntersection2]; - const Polygon &poly = poly_with_offset.contour(iInnerContour); -// const bool ccw = poly_with_offset.is_contour_ccw(iInnerContour); - assert(itsct.type == itsct2.type); - assert(itsct.iContour == itsct2.iContour); - assert(itsct.is_inner()); - const bool forward = itsct.is_low() == dir_is_next; - - Point p1 = itsct.pos(); - Point p2 = itsct2.pos(); - return forward ? - segment_length(poly, itsct .iSegment, p1, itsct2.iSegment, p2) : - segment_length(poly, itsct2.iSegment, p2, itsct .iSegment, p1); -} - -static inline coordf_t measure_perimeter_prev_segment_length( - const ExPolygonWithOffset &poly_with_offset, - const std::vector &segs, - size_t iVerticalLine, - size_t iInnerContour, - size_t iIntersection, - size_t iIntersection2) -{ - return measure_perimeter_prev_next_segment_length(poly_with_offset, segs, iVerticalLine, iInnerContour, iIntersection, iIntersection2, false); -} - -static inline coordf_t measure_perimeter_next_segment_length( - const ExPolygonWithOffset &poly_with_offset, - const std::vector &segs, - size_t iVerticalLine, - size_t iInnerContour, - size_t iIntersection, - size_t iIntersection2) -{ - return measure_perimeter_prev_next_segment_length(poly_with_offset, segs, iVerticalLine, iInnerContour, iIntersection, iIntersection2, true); -} - -// Append the points of a perimeter segment when going from iIntersection to iIntersection2. -// The first point (the point of iIntersection) will not be inserted, -// the last point will be inserted. -static inline void emit_perimeter_prev_next_segment( - const ExPolygonWithOffset &poly_with_offset, - const std::vector &segs, - size_t iVerticalLine, - size_t iInnerContour, - size_t iIntersection, - size_t iIntersection2, - Polyline &out, - bool dir_is_next) -{ - size_t iVerticalLineOther = iVerticalLine; - if (dir_is_next) { - ++ iVerticalLineOther; - assert(iVerticalLineOther < segs.size()); - } else { - assert(iVerticalLineOther > 0); - -- iVerticalLineOther; - } - - const SegmentedIntersectionLine &il = segs[iVerticalLine]; - const SegmentIntersection &itsct = il.intersections[iIntersection]; - const SegmentedIntersectionLine &il2 = segs[iVerticalLineOther]; - const SegmentIntersection &itsct2 = il2.intersections[iIntersection2]; - const Polygon &poly = poly_with_offset.contour(iInnerContour); -// const bool ccw = poly_with_offset.is_contour_ccw(iInnerContour); - assert(itsct.type == itsct2.type); - assert(itsct.iContour == itsct2.iContour); - assert(itsct.is_inner()); - const bool forward = itsct.is_low() == dir_is_next; - // Do not append the first point. - // out.points.push_back(Point(il.pos, itsct.pos)); - if (forward) - polygon_segment_append(out.points, poly, itsct.iSegment, itsct2.iSegment); - else - polygon_segment_append_reversed(out.points, poly, itsct.iSegment, itsct2.iSegment); - // Append the last point. - out.points.push_back(itsct2.pos()); -} - -static inline coordf_t measure_perimeter_segment_on_vertical_line_length( - const ExPolygonWithOffset &poly_with_offset, - const std::vector &segs, - size_t iVerticalLine, - size_t iInnerContour, - size_t iIntersection, - size_t iIntersection2, - bool forward) -{ - const SegmentedIntersectionLine &il = segs[iVerticalLine]; - const SegmentIntersection &itsct = il.intersections[iIntersection]; - const SegmentIntersection &itsct2 = il.intersections[iIntersection2]; - const Polygon &poly = poly_with_offset.contour(iInnerContour); - assert(itsct.is_inner()); - assert(itsct2.is_inner()); - assert(itsct.type != itsct2.type); - assert(itsct.iContour == iInnerContour); - assert(itsct.iContour == itsct2.iContour); - return forward ? - segment_length(poly, itsct .iSegment, itsct.pos(), itsct2.iSegment, itsct2.pos()) : - segment_length(poly, itsct2.iSegment, itsct2.pos(), itsct .iSegment, itsct.pos()); -} - -// Append the points of a perimeter segment when going from iIntersection to iIntersection2. -// The first point (the point of iIntersection) will not be inserted, -// the last point will be inserted. -static inline void emit_perimeter_segment_on_vertical_line( - const ExPolygonWithOffset &poly_with_offset, - const std::vector &segs, - size_t iVerticalLine, - size_t iInnerContour, - size_t iIntersection, - size_t iIntersection2, - Polyline &out, - bool forward) -{ - const SegmentedIntersectionLine &il = segs[iVerticalLine]; - const SegmentIntersection &itsct = il.intersections[iIntersection]; - const SegmentIntersection &itsct2 = il.intersections[iIntersection2]; - const Polygon &poly = poly_with_offset.contour(iInnerContour); - assert(itsct.is_inner()); - assert(itsct2.is_inner()); - assert(itsct.type != itsct2.type); - assert(itsct.iContour == iInnerContour); - assert(itsct.iContour == itsct2.iContour); - // Do not append the first point. - // out.points.push_back(Point(il.pos, itsct.pos)); - if (forward) - polygon_segment_append(out.points, poly, itsct.iSegment, itsct2.iSegment); - else - polygon_segment_append_reversed(out.points, poly, itsct.iSegment, itsct2.iSegment); - // Append the last point. - out.points.push_back(itsct2.pos()); -} - -//TBD: For precise infill, measure the area of a slab spanned by an infill line. -/* -static inline float measure_outer_contour_slab( - const ExPolygonWithOffset &poly_with_offset, - const std::vector &segs, - size_t i_vline, - size_t iIntersection) -{ - const SegmentedIntersectionLine &il = segs[i_vline]; - const SegmentIntersection &itsct = il.intersections[i_vline]; - const SegmentIntersection &itsct2 = il.intersections[iIntersection2]; - const Polygon &poly = poly_with_offset.contour((itsct.iContour); - assert(itsct.is_outer()); - assert(itsct2.is_outer()); - assert(itsct.type != itsct2.type); - assert(itsct.iContour == itsct2.iContour); - if (! itsct.is_outer() || ! itsct2.is_outer() || itsct.type == itsct2.type || itsct.iContour != itsct2.iContour) - // Error, return zero area. - return 0.f; - - // Find possible connection points on the previous / next vertical line. - int iPrev = intersection_on_prev_vertical_line(poly_with_offset, segs, i_vline, itsct.iContour, i_intersection); - int iNext = intersection_on_next_vertical_line(poly_with_offset, segs, i_vline, itsct.iContour, i_intersection); - // Find possible connection points on the same vertical line. - int iAbove = iBelow = -1; - // Does the perimeter intersect the current vertical line above intrsctn? - for (size_t i = i_intersection + 1; i + 1 < seg.intersections.size(); ++ i) - if (seg.intersections[i].iContour == itsct.iContour) - { iAbove = i; break; } - // Does the perimeter intersect the current vertical line below intrsctn? - for (int i = int(i_intersection) - 1; i > 0; -- i) - if (seg.intersections[i].iContour == itsct.iContour) - { iBelow = i; break; } - - if (iSegAbove != -1 && seg.intersections[iAbove].type == SegmentIntersection::OUTER_HIGH) { - // Invalidate iPrev resp. iNext, if the perimeter crosses the current vertical line earlier than iPrev resp. iNext. - // The perimeter contour orientation. - const Polygon &poly = poly_with_offset.contour(itsct.iContour); - { - int d_horiz = (iPrev == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, segs[i_vline-1].intersections[iPrev].iSegment, itsct.iSegment, true); - int d_down = (iBelow == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, iSegBelow, itsct.iSegment, true); - int d_up = (iAbove == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, iSegAbove, itsct.iSegment, true); - if (intrsctn_type_prev == INTERSECTION_TYPE_OTHER_VLINE_OK && d_horiz > std::min(d_down, d_up)) - // The vertical crossing comes eralier than the prev crossing. - // Disable the perimeter going back. - intrsctn_type_prev = INTERSECTION_TYPE_OTHER_VLINE_NOT_FIRST; - if (d_up > std::min(d_horiz, d_down)) - // The horizontal crossing comes earlier than the vertical crossing. - vert_seg_dir_valid_mask &= ~DIR_BACKWARD; - } - { - int d_horiz = (iNext == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, itsct.iSegment, segs[i_vline+1].intersections[iNext].iSegment, true); - int d_down = (iSegBelow == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, itsct.iSegment, iSegBelow, true); - int d_up = (iSegAbove == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, itsct.iSegment, iSegAbove, true); - if (d_up > std::min(d_horiz, d_down)) - // The horizontal crossing comes earlier than the vertical crossing. - vert_seg_dir_valid_mask &= ~DIR_FORWARD; - } - } -} -*/ - -enum DirectionMask -{ - DIR_FORWARD = 1, - DIR_BACKWARD = 2 -}; - -// For the rectilinear, grid, triangles, stars and cubic pattern fill one InfillHatchingSingleDirection structure -// for each infill direction. The segments stored in InfillHatchingSingleDirection will then form a graph of candidate -// paths to be extruded. -static bool fill_hatching_segments_legacy( - // Input geometry to be hatch, containing two concentric contours for each input contour. - const ExPolygonWithOffset &poly_with_offset, - // fill density, dont_adjust - const FillParams ¶ms, - const coord_t link_max_length, - // Resulting straight segments of the infill graph. - InfillHatchingSingleDirection &hatching, - Polylines &polylines_out) -{ - // At the end, only the new polylines will be rotated back. - size_t n_polylines_out_initial = polylines_out.size(); - - std::vector &segs = hatching.segs; - - // For each outer only chords, measure their maximum distance to the bow of the outer contour. - // Mark an outer only chord as consumed, if the distance is low. - for (size_t i_vline = 0; i_vline < segs.size(); ++ i_vline) { - SegmentedIntersectionLine &seg = segs[i_vline]; - for (size_t i_intersection = 0; i_intersection + 1 < seg.intersections.size(); ++ i_intersection) { - if (seg.intersections[i_intersection].type == SegmentIntersection::OUTER_LOW && - seg.intersections[i_intersection+1].type == SegmentIntersection::OUTER_HIGH) { - bool consumed = false; -// if (params.full_infill()) { -// measure_outer_contour_slab(poly_with_offset, segs, i_vline, i_ntersection); -// } else - consumed = true; - seg.intersections[i_intersection].consumed_vertical_up = consumed; - } - } - } - - // Now construct a graph. - // Find the first point. - // Naively one would expect to achieve best results by chaining the paths by the shortest distance, - // but that procedure does not create the longest continuous paths. - // A simple "sweep left to right" procedure achieves better results. - size_t i_vline = 0; - size_t i_intersection = size_t(-1); - // Follow the line, connect the lines into a graph. - // Until no new line could be added to the output path: - Point pointLast; - Polyline *polyline_current = NULL; - if (! polylines_out.empty()) - pointLast = polylines_out.back().points.back(); - for (;;) { - if (i_intersection == size_t(-1)) { - // The path has been interrupted. Find a next starting point, closest to the previous extruder position. - coordf_t dist2min = std::numeric_limits().max(); - for (size_t i_vline2 = 0; i_vline2 < segs.size(); ++ i_vline2) { - const SegmentedIntersectionLine &seg = segs[i_vline2]; - if (! seg.intersections.empty()) { - assert(seg.intersections.size() > 1); - // Even number of intersections with the loops. - assert((seg.intersections.size() & 1) == 0); - assert(seg.intersections.front().type == SegmentIntersection::OUTER_LOW); - for (size_t i = 0; i < seg.intersections.size(); ++ i) { - const SegmentIntersection &intrsctn = seg.intersections[i]; - if (intrsctn.is_outer()) { - assert(intrsctn.is_low() || i > 0); - bool consumed = intrsctn.is_low() ? - intrsctn.consumed_vertical_up : - seg.intersections[i-1].consumed_vertical_up; - if (! consumed) { - coordf_t dist2 = (intrsctn.pos() - pointLast).cast().norm(); - if (dist2 < dist2min) { - dist2min = dist2; - i_vline = i_vline2; - i_intersection = i; - //FIXME We are taking the first left point always. Verify, that the caller chains the paths - // by a shortest distance, while reversing the paths if needed. - //if (polylines_out.empty()) - // Initial state, take the first line, which is the first from the left. - goto found; - } - } - } - } - } - } - if (i_intersection == size_t(-1)) - // We are finished. - break; - found: - // Start a new path. - polylines_out.push_back(Polyline()); - polyline_current = &polylines_out.back(); - // Emit the first point of a path. - pointLast = segs[i_vline].intersections[i_intersection].pos(); - polyline_current->points.push_back(pointLast); - } - - // From the initial point (i_vline, i_intersection), follow a path. - SegmentedIntersectionLine &seg = segs[i_vline]; - SegmentIntersection *intrsctn = &seg.intersections[i_intersection]; - bool going_up = intrsctn->is_low(); - bool try_connect = false; - if (going_up) { - assert(! intrsctn->consumed_vertical_up); - assert(i_intersection + 1 < seg.intersections.size()); - // Step back to the beginning of the vertical segment to mark it as consumed. - if (intrsctn->is_inner()) { - assert(i_intersection > 0); - -- intrsctn; - -- i_intersection; - } - // Consume the complete vertical segment up to the outer contour. - do { - intrsctn->consumed_vertical_up = true; - ++ intrsctn; - ++ i_intersection; - assert(i_intersection < seg.intersections.size()); - } while (intrsctn->type != SegmentIntersection::OUTER_HIGH); - if ((intrsctn - 1)->is_inner()) { - // Step back. - -- intrsctn; - -- i_intersection; - assert(intrsctn->type == SegmentIntersection::INNER_HIGH); - try_connect = true; - } - } else { - // Going down. - assert(intrsctn->is_high()); - assert(i_intersection > 0); - assert(! (intrsctn - 1)->consumed_vertical_up); - // Consume the complete vertical segment up to the outer contour. - if (intrsctn->is_inner()) - intrsctn->consumed_vertical_up = true; - do { - assert(i_intersection > 0); - -- intrsctn; - -- i_intersection; - intrsctn->consumed_vertical_up = true; - } while (intrsctn->type != SegmentIntersection::OUTER_LOW); - if ((intrsctn + 1)->is_inner()) { - // Step back. - ++ intrsctn; - ++ i_intersection; - assert(intrsctn->type == SegmentIntersection::INNER_LOW); - try_connect = true; - } - } - if (try_connect) { - // Decide, whether to finish the segment, or whether to follow the perimeter. - - // 1) Find possible connection points on the previous / next vertical line. - int iPrev = intersection_on_prev_vertical_line(poly_with_offset, segs, i_vline, intrsctn->iContour, i_intersection); - int iNext = intersection_on_next_vertical_line(poly_with_offset, segs, i_vline, intrsctn->iContour, i_intersection); - IntersectionTypeOtherVLine intrsctn_type_prev = intersection_type_on_prev_vertical_line(segs, i_vline, i_intersection, iPrev); - IntersectionTypeOtherVLine intrsctn_type_next = intersection_type_on_next_vertical_line(segs, i_vline, i_intersection, iNext); - - // 2) Find possible connection points on the same vertical line. - int iAbove = -1; - int iBelow = -1; - int iSegAbove = -1; - int iSegBelow = -1; - { -// SegmentIntersection::SegmentIntersectionType type_crossing = (intrsctn->type == SegmentIntersection::INNER_LOW) ? -// SegmentIntersection::INNER_HIGH : SegmentIntersection::INNER_LOW; - // Does the perimeter intersect the current vertical line above intrsctn? - for (size_t i = i_intersection + 1; i + 1 < seg.intersections.size(); ++ i) -// if (seg.intersections[i].iContour == intrsctn->iContour && seg.intersections[i].type == type_crossing) { - if (seg.intersections[i].iContour == intrsctn->iContour) { - iAbove = i; - iSegAbove = seg.intersections[i].iSegment; - break; - } - // Does the perimeter intersect the current vertical line below intrsctn? - for (size_t i = i_intersection - 1; i > 0; -- i) -// if (seg.intersections[i].iContour == intrsctn->iContour && seg.intersections[i].type == type_crossing) { - if (seg.intersections[i].iContour == intrsctn->iContour) { - iBelow = i; - iSegBelow = seg.intersections[i].iSegment; - break; - } - } - - // 3) Sort the intersection points, clear iPrev / iNext / iSegBelow / iSegAbove, - // if it is preceded by any other intersection point along the contour. - unsigned int vert_seg_dir_valid_mask = - (going_up ? - (iSegAbove != -1 && seg.intersections[iAbove].type == SegmentIntersection::INNER_LOW) : - (iSegBelow != -1 && seg.intersections[iBelow].type == SegmentIntersection::INNER_HIGH)) ? - (DIR_FORWARD | DIR_BACKWARD) : - 0; - { - // Invalidate iPrev resp. iNext, if the perimeter crosses the current vertical line earlier than iPrev resp. iNext. - // The perimeter contour orientation. - const bool forward = intrsctn->is_low(); // == poly_with_offset.is_contour_ccw(intrsctn->iContour); - const Polygon &poly = poly_with_offset.contour(intrsctn->iContour); - { - int d_horiz = (iPrev == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, segs[i_vline-1].intersections[iPrev].iSegment, intrsctn->iSegment, forward); - int d_down = (iSegBelow == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, iSegBelow, intrsctn->iSegment, forward); - int d_up = (iSegAbove == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, iSegAbove, intrsctn->iSegment, forward); - if (intrsctn_type_prev == INTERSECTION_TYPE_OTHER_VLINE_OK && d_horiz > std::min(d_down, d_up)) - // The vertical crossing comes eralier than the prev crossing. - // Disable the perimeter going back. - intrsctn_type_prev = INTERSECTION_TYPE_OTHER_VLINE_NOT_FIRST; - if (going_up ? (d_up > std::min(d_horiz, d_down)) : (d_down > std::min(d_horiz, d_up))) - // The horizontal crossing comes earlier than the vertical crossing. - vert_seg_dir_valid_mask &= ~(forward ? DIR_BACKWARD : DIR_FORWARD); - } - { - int d_horiz = (iNext == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, intrsctn->iSegment, segs[i_vline+1].intersections[iNext].iSegment, forward); - int d_down = (iSegBelow == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, intrsctn->iSegment, iSegBelow, forward); - int d_up = (iSegAbove == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, intrsctn->iSegment, iSegAbove, forward); - if (intrsctn_type_next == INTERSECTION_TYPE_OTHER_VLINE_OK && d_horiz > std::min(d_down, d_up)) - // The vertical crossing comes eralier than the prev crossing. - // Disable the perimeter going forward. - intrsctn_type_next = INTERSECTION_TYPE_OTHER_VLINE_NOT_FIRST; - if (going_up ? (d_up > std::min(d_horiz, d_down)) : (d_down > std::min(d_horiz, d_up))) - // The horizontal crossing comes earlier than the vertical crossing. - vert_seg_dir_valid_mask &= ~(forward ? DIR_FORWARD : DIR_BACKWARD); - } - } - - // 4) Try to connect to a previous or next vertical line, making a zig-zag pattern. - if (intrsctn_type_prev == INTERSECTION_TYPE_OTHER_VLINE_OK || intrsctn_type_next == INTERSECTION_TYPE_OTHER_VLINE_OK) { - coordf_t distPrev = (intrsctn_type_prev != INTERSECTION_TYPE_OTHER_VLINE_OK) ? std::numeric_limits::max() : - measure_perimeter_prev_segment_length(poly_with_offset, segs, i_vline, intrsctn->iContour, i_intersection, iPrev); - coordf_t distNext = (intrsctn_type_next != INTERSECTION_TYPE_OTHER_VLINE_OK) ? std::numeric_limits::max() : - measure_perimeter_next_segment_length(poly_with_offset, segs, i_vline, intrsctn->iContour, i_intersection, iNext); - // Take the shorter path. - //FIXME this may not be always the best strategy to take the shortest connection line now. - bool take_next = (intrsctn_type_prev == INTERSECTION_TYPE_OTHER_VLINE_OK && intrsctn_type_next == INTERSECTION_TYPE_OTHER_VLINE_OK) ? - (distNext < distPrev) : - intrsctn_type_next == INTERSECTION_TYPE_OTHER_VLINE_OK; - assert(intrsctn->is_inner()); - bool skip = params.connection == icNotConnected || (link_max_length > 0 && (take_next ? distNext : distPrev) > link_max_length); - if (skip) { - // Just skip the connecting contour and start a new path. - goto dont_connect; - polyline_current->points.push_back(intrsctn->pos()); - polylines_out.push_back(Polyline()); - polyline_current = &polylines_out.back(); - const SegmentedIntersectionLine &il2 = segs[take_next ? (i_vline + 1) : (i_vline - 1)]; - polyline_current->points.push_back(il2.intersections[take_next ? iNext : iPrev].pos()); - } else { - polyline_current->points.push_back(intrsctn->pos()); - emit_perimeter_prev_next_segment(poly_with_offset, segs, i_vline, intrsctn->iContour, i_intersection, take_next ? iNext : iPrev, *polyline_current, take_next); - } - // Mark both the left and right connecting segment as consumed, because one cannot go to this intersection point as it has been consumed. - if (iPrev != -1) - segs[i_vline-1].intersections[iPrev].consumed_perimeter_right = true; - if (iNext != -1) - intrsctn->consumed_perimeter_right = true; - //FIXME consume the left / right connecting segments at the other end of this line? Currently it is not critical because a perimeter segment is not followed if the vertical segment at the other side has already been consumed. - // Advance to the neighbor line. - if (take_next) { - ++ i_vline; - i_intersection = iNext; - } else { - -- i_vline; - i_intersection = iPrev; - } - continue; - } - - // 5) Try to connect to a previous or next point on the same vertical line. - if (vert_seg_dir_valid_mask) { - bool valid = true; - // Verify, that there is no intersection with the inner contour up to the end of the contour segment. - // Verify, that the successive segment has not been consumed yet. - if (going_up) { - if (seg.intersections[iAbove].consumed_vertical_up) { - valid = false; - } else { - for (int i = (int)i_intersection + 1; i < iAbove && valid; ++i) - if (seg.intersections[i].is_inner()) - valid = false; - } - } else { - if (seg.intersections[iBelow-1].consumed_vertical_up) { - valid = false; - } else { - for (int i = iBelow + 1; i < (int)i_intersection && valid; ++i) - if (seg.intersections[i].is_inner()) - valid = false; - } - } - if (valid) { - const Polygon &poly = poly_with_offset.contour(intrsctn->iContour); - int iNext = going_up ? iAbove : iBelow; - int iSegNext = going_up ? iSegAbove : iSegBelow; - bool dir_forward = (vert_seg_dir_valid_mask == (DIR_FORWARD | DIR_BACKWARD)) ? - // Take the shorter length between the current and the next intersection point. - (distance_of_segmens(poly, intrsctn->iSegment, iSegNext, true) < - distance_of_segmens(poly, intrsctn->iSegment, iSegNext, false)) : - (vert_seg_dir_valid_mask == DIR_FORWARD); - // Skip this perimeter line? - bool skip = params.connection == icNotConnected; - if (! skip && link_max_length > 0) { - coordf_t link_length = measure_perimeter_segment_on_vertical_line_length( - poly_with_offset, segs, i_vline, intrsctn->iContour, i_intersection, iNext, dir_forward); - skip = link_length > link_max_length; - } - polyline_current->points.push_back(intrsctn->pos()); - if (skip) { - // Just skip the connecting contour and start a new path. - polylines_out.push_back(Polyline()); - polyline_current = &polylines_out.back(); - polyline_current->points.push_back(seg.intersections[iNext].pos()); - } else { - // Consume the connecting contour and the next segment. - emit_perimeter_segment_on_vertical_line(poly_with_offset, segs, i_vline, intrsctn->iContour, i_intersection, iNext, *polyline_current, dir_forward); - } - // Mark both the left and right connecting segment as consumed, because one cannot go to this intersection point as it has been consumed. - // If there are any outer intersection points skipped (bypassed) by the contour, - // mark them as processed. - if (going_up) { - for (int i = (int)i_intersection; i < iAbove; ++ i) - seg.intersections[i].consumed_vertical_up = true; - } else { - for (int i = iBelow; i < (int)i_intersection; ++ i) - seg.intersections[i].consumed_vertical_up = true; - } -// seg.intersections[going_up ? i_intersection : i_intersection - 1].consumed_vertical_up = true; - intrsctn->consumed_perimeter_right = true; - i_intersection = iNext; - if (going_up) - ++ intrsctn; - else - -- intrsctn; - intrsctn->consumed_perimeter_right = true; - continue; - } - } - dont_connect: - // No way to continue the current polyline. Take the rest of the line up to the outer contour. - // This will finish the polyline, starting another polyline at a new point. - if (going_up) - ++ intrsctn; - else - -- intrsctn; - } - - // Finish the current vertical line, - // reset the current vertical line to pick a new starting point in the next round. - assert(intrsctn->is_outer()); - assert(intrsctn->is_high() == going_up); - pointLast = intrsctn->pos(); - polyline_current->points.push_back(pointLast); - // Handle duplicate points and zero length segments. - polyline_current->remove_duplicate_points(); - assert(! polyline_current->has_duplicate_points()); - // Handle nearly zero length edges. - if (polyline_current->points.size() <= 1 || - (polyline_current->points.size() == 2 && - std::abs(polyline_current->points.front()(0) - polyline_current->points.back()(0)) < SCALED_EPSILON && - std::abs(polyline_current->points.front()(1) - polyline_current->points.back()(1)) < SCALED_EPSILON)) - polylines_out.pop_back(); - intrsctn = NULL; - i_intersection = -1; - polyline_current = NULL; - } - -#ifdef SLIC3R_DEBUG - { - static int iRun = 0; - BoundingBox bbox_svg = poly_with_offset.bounding_box_outer(); - { - ::Slic3r::SVG svg(debug_out_path("FillRectilinear2-final-%03d.svg", iRun), bbox_svg); // , scale_(1.)); - poly_with_offset.export_to_svg(svg); - for (size_t i = n_polylines_out_initial; i < polylines_out.size(); ++ i) - svg.draw(polylines_out[i].lines(), "black"); - } - // Paint a picture per polyline. This makes it easier to discover the order of the polylines and their overlap. - for (size_t i_polyline = n_polylines_out_initial; i_polyline < polylines_out.size(); ++ i_polyline) { - ::Slic3r::SVG svg(debug_out_path("FillRectilinear2-final-%03d-%03d.svg", iRun, i_polyline), bbox_svg); // , scale_(1.)); - svg.draw(polylines_out[i_polyline].lines(), "black"); - } - } -#endif /* SLIC3R_DEBUG */ - - // paths must be rotated back - for (Polylines::iterator it = polylines_out.begin() + n_polylines_out_initial; it != polylines_out.end(); ++ it) { - // No need to translate, the absolute position is irrelevant. - // it->translate(- rotate_vector.second(0), - rotate_vector.second(1)); - assert(! it->has_duplicate_points()); - //it->rotate(rotate_vector.first); - //FIXME rather simplify the paths to avoid very short edges? - //assert(! it->has_duplicate_points()); - it->remove_duplicate_points(); - } - -#ifdef SLIC3R_DEBUG - // Verify, that there are no duplicate points in the sequence. - for (Polyline &polyline : polylines_out) - assert(! polyline.has_duplicate_points()); -#endif /* SLIC3R_DEBUG */ - - return true; -} - -}; // namespace FillRectilinear3_Internal - -bool FillRectilinear3::fill_surface_by_lines(const Surface *surface, const FillParams ¶ms, std::vector &fill_dir_params, Polylines &polylines_out) const -{ - assert(params.density > 0.0001f); - - const float INFILL_OVERLAP_OVER_SPACING = 0.45f; - assert(INFILL_OVERLAP_OVER_SPACING > 0 && INFILL_OVERLAP_OVER_SPACING < 0.5f); - - // On the polygons of poly_with_offset, the infill lines will be connected. - FillRectilinear3_Internal::ExPolygonWithOffset poly_with_offset( - surface->expolygon, - float(scale_(- (0.5 - INFILL_OVERLAP_OVER_SPACING) * this->get_spacing())), - float(scale_(- 0.5 * this->get_spacing()))); - if (poly_with_offset.n_contours_inner == 0) { - // Not a single infill line fits. - //FIXME maybe one shall trigger the gap fill here? - return true; - } - - // Rotate polygons so that we can work with vertical lines here - std::pair rotate_vector = this->_infill_direction(surface); - std::vector hatching(fill_dir_params.size(), FillRectilinear3_Internal::InfillHatchingSingleDirection()); - for (size_t i = 0; i < hatching.size(); ++ i) - if (! FillRectilinear3_Internal::prepare_infill_hatching_segments(poly_with_offset, params, fill_dir_params[i], rotate_vector, hatching[i])) - return false; - - for (size_t i = 0; i < hatching.size(); ++ i) - if (! FillRectilinear3_Internal::fill_hatching_segments_legacy( - poly_with_offset, - params, - this->link_max_length, - hatching[i], - polylines_out)) - return false; - - return true; -} - -Polylines FillRectilinear3::fill_surface(const Surface *surface, const FillParams ¶ms) const -{ - Polylines polylines_out; - std::vector fill_dir_params; - fill_dir_params.emplace_back(FillDirParams(this->get_spacing(), 0.f)); - if (! fill_surface_by_lines(surface, params, fill_dir_params, polylines_out)) - printf("FillRectilinear3::fill_surface() failed to fill a region.\n"); - //if (params.full_infill() && ! params.dont_adjust) - // Return back the adjusted spacing. //NOT POSSIBLE : DO NOT MODIFY PARAMS AFTER INITIALISATION !!! No one will read it anyway. - //this->spacing = fill_dir_params.front().spacing; - - return polylines_out; -} - -Polylines FillGrid3::fill_surface(const Surface *surface, const FillParams ¶ms) const -{ - // Each linear fill covers half of the target coverage. - FillParams params2 = params; - params2.density *= 0.5f; - Polylines polylines_out; - std::vector fill_dir_params; - fill_dir_params.emplace_back(FillDirParams(this->get_spacing(), 0.f)); - fill_dir_params.emplace_back(FillDirParams(this->get_spacing(), float(M_PI / 2.))); - if (! fill_surface_by_lines(surface, params2, fill_dir_params, polylines_out)) - printf("FillGrid3::fill_surface() failed to fill a region.\n"); - return polylines_out; -} - -Polylines FillTriangles3::fill_surface(const Surface *surface, const FillParams ¶ms) const -{ - // Each linear fill covers 1/3 of the target coverage. - FillParams params2 = params; - params2.density *= 0.333333333f; - Polylines polylines_out; - std::vector fill_dir_params; - fill_dir_params.emplace_back(FillDirParams(this->get_spacing(), 0.)); - fill_dir_params.emplace_back(FillDirParams(this->get_spacing(), M_PI / 3.)); - fill_dir_params.emplace_back(FillDirParams(this->get_spacing(), 2. * M_PI / 3.)); - if (! fill_surface_by_lines(surface, params2, fill_dir_params, polylines_out)) - printf("FillTriangles3::fill_surface() failed to fill a region.\n"); - return polylines_out; -} - -Polylines FillStars3::fill_surface(const Surface *surface, const FillParams ¶ms) const -{ - // Each linear fill covers 1/3 of the target coverage. - FillParams params2 = params; - params2.density *= 0.333333333f; - Polylines polylines_out; - std::vector fill_dir_params; - fill_dir_params.emplace_back(FillDirParams(this->get_spacing(), 0.)); - fill_dir_params.emplace_back(FillDirParams(this->get_spacing(), M_PI / 3.)); - fill_dir_params.emplace_back(FillDirParams(this->get_spacing(), 2. * M_PI / 3., 0.5 * this->get_spacing() / params2.density)); - if (! fill_surface_by_lines(surface, params2, fill_dir_params, polylines_out)) - printf("FillStars3::fill_surface() failed to fill a region.\n"); - return polylines_out; -} - -Polylines FillCubic3::fill_surface(const Surface *surface, const FillParams ¶ms) const -{ - // Each linear fill covers 1/3 of the target coverage. - FillParams params2 = params; - params2.density *= 0.333333333f; - Polylines polylines_out; - std::vector fill_dir_params; - coordf_t dx = sqrt(0.5) * z; - fill_dir_params.emplace_back(FillDirParams(this->get_spacing(), 0., dx)); - fill_dir_params.emplace_back(FillDirParams(this->get_spacing(), M_PI / 3., -dx)); - fill_dir_params.emplace_back(FillDirParams(this->get_spacing(), 2. * M_PI / 3., dx)); - if (! fill_surface_by_lines(surface, params2, fill_dir_params, polylines_out)) - printf("FillCubic3::fill_surface() failed to fill a region.\n"); - return polylines_out; -} - -} // namespace Slic3r diff --git a/src/libslic3r/Fill/FillRectilinear3.hpp b/src/libslic3r/Fill/FillRectilinear3.hpp deleted file mode 100644 index 8d022fc65..000000000 --- a/src/libslic3r/Fill/FillRectilinear3.hpp +++ /dev/null @@ -1,83 +0,0 @@ -#ifndef slic3r_FillRectilinear3_hpp_ -#define slic3r_FillRectilinear3_hpp_ - -#include "../libslic3r.h" - -#include "FillBase.hpp" - -namespace Slic3r { - -class Surface; - -class FillRectilinear3 : public Fill -{ -public: - virtual Fill* clone() const override { return new FillRectilinear3(*this); }; - virtual ~FillRectilinear3() {} - virtual Polylines fill_surface(const Surface *surface, const FillParams ¶ms) const override; - - struct FillDirParams - { - FillDirParams(coordf_t spacing, double angle, coordf_t pattern_shift = 0.f) : - spacing(spacing), angle(angle), pattern_shift(pattern_shift) {} - coordf_t spacing; - double angle; - coordf_t pattern_shift; - }; - -protected: - bool fill_surface_by_lines(const Surface *surface, const FillParams ¶ms, std::vector &fill_dir_params, Polylines &polylines_out) const; -}; - -class FillGrid3 : public FillRectilinear3 -{ -public: - virtual Fill* clone() const override { return new FillGrid3(*this); }; - virtual ~FillGrid3() {} - virtual Polylines fill_surface(const Surface *surface, const FillParams ¶ms) const override; - -protected: - // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill. - virtual float _layer_angle(size_t /* idx */) const override { return 0.f; } -}; - -class FillTriangles3 : public FillRectilinear3 -{ -public: - virtual Fill* clone() const override { return new FillTriangles3(*this); }; - virtual ~FillTriangles3() {} - virtual Polylines fill_surface(const Surface *surface, const FillParams ¶ms) const override; - -protected: - // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill. - virtual float _layer_angle(size_t /* idx */) const override { return 0.f; } -}; - -class FillStars3 : public FillRectilinear3 -{ -public: - virtual Fill* clone() const override { return new FillStars3(*this); }; - virtual ~FillStars3() {} - virtual Polylines fill_surface(const Surface *surface, const FillParams ¶ms) const override; - -protected: - // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill. - virtual float _layer_angle(size_t /* idx */) const override { return 0.f; } -}; - -class FillCubic3 : public FillRectilinear3 -{ -public: - virtual Fill* clone() const override { return new FillCubic3(*this); }; - virtual ~FillCubic3() {} - virtual Polylines fill_surface(const Surface *surface, const FillParams ¶ms)const override; - -protected: - // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill. - virtual float _layer_angle(size_t /* idx */) const override { return 0.f; } -}; - - -}; // namespace Slic3r - -#endif // slic3r_FillRectilinear3_hpp_ diff --git a/src/libslic3r/Format/SL1.cpp b/src/libslic3r/Format/SL1.cpp index 4613b37c8..85703e298 100644 --- a/src/libslic3r/Format/SL1.cpp +++ b/src/libslic3r/Format/SL1.cpp @@ -383,6 +383,7 @@ void fill_slicerconf(ConfMap &m, const SLAPrint &print) static constexpr auto banned_keys = { "compatible_printers"sv, "compatible_prints"sv, + //FIXME The print host keys should not be exported to full_print_config anymore. The following keys may likely be removed. "print_host"sv, "printhost_apikey"sv, "printhost_cafile"sv diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 142f014a4..0546a907b 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -5,7 +5,6 @@ #include "ExtrusionEntity.hpp" #include "EdgeGrid.hpp" #include "Geometry.hpp" -#include "GCode/Analyzer.hpp" #include "GCode/FanMover.hpp" #include "GCode/PrintExtents.hpp" #include "GCode/WipeTower.hpp" @@ -1135,14 +1134,14 @@ namespace DoExport { ++ dst.second; }; print_statistics.filament_stats.insert(std::pair{extruder.id(), (float)used_filament}); - append(out_filament_used_mm, "%.1lf", used_filament); - append(out_filament_used_cm3, "%.1lf", extruded_volume * 0.001); + append(out_filament_used_mm, "%.2lf", used_filament); + append(out_filament_used_cm3, "%.2lf", extruded_volume * 0.001); if (filament_weight > 0.) { print_statistics.total_weight = print_statistics.total_weight + filament_weight; - append(out_filament_used_g, "%.1lf", filament_weight); + append(out_filament_used_g, "%.2lf", filament_weight); if (filament_cost > 0.) { print_statistics.total_cost = print_statistics.total_cost + filament_cost; - append(out_filament_cost, "%.1lf", filament_cost); + append(out_filament_cost, "%.2lf", filament_cost); } } print_statistics.total_used_filament += used_filament; @@ -1829,8 +1828,8 @@ void GCode::_do_export(Print& print, FILE* file, ThumbnailsGeneratorCallback thu // Modifies print.m_print_statistics)); _write(file, "\n"); - _write_format(file, "; total filament used [g] = %.1lf\n", print.m_print_statistics.total_weight); - _write_format(file, "; total filament cost = %.1lf\n", print.m_print_statistics.total_cost); + _write_format(file, "; total filament used [g] = %.2lf\n", print.m_print_statistics.total_weight); + _write_format(file, "; total filament cost = %.2lf\n", print.m_print_statistics.total_cost); if (print.m_print_statistics.total_toolchanges > 0) _write_format(file, "; total toolchanges = %i\n", print.m_print_statistics.total_toolchanges); #if ENABLE_GCODE_VIEWER @@ -1844,7 +1843,7 @@ void GCode::_do_export(Print& print, FILE* file, ThumbnailsGeneratorCallback thu // Append full config. _write(file, "\n", true); { - std::string full_config = ""; + std::string full_config; append_full_config(print, full_config); if (!full_config.empty()) _write(file, full_config, true); @@ -2174,7 +2173,7 @@ std::string GCode::emit_custom_gcode_per_print_z( // Color Change or Tool Change as Color Change. #if ENABLE_GCODE_VIEWER // add tag for processor - gcode += "; " + GCodeProcessor::Color_Change_Tag + ",T" + std::to_string(m600_extruder_before_layer) + "\n"; + gcode += ";" + GCodeProcessor::Color_Change_Tag + ",T" + std::to_string(m600_extruder_before_layer) + "\n"; #else // add tag for analyzer gcode += "; " + GCodeAnalyzer::Color_Change_Tag + ",T" + std::to_string(m600_extruder_before_layer) + "\n"; @@ -2198,7 +2197,7 @@ std::string GCode::emit_custom_gcode_per_print_z( { #if ENABLE_GCODE_VIEWER // add tag for processor - gcode += "; " + GCodeProcessor::Pause_Print_Tag + "\n"; + gcode += ";" + GCodeProcessor::Pause_Print_Tag + "\n"; #else // add tag for analyzer gcode += "; " + GCodeAnalyzer::Pause_Print_Tag + "\n"; @@ -2214,13 +2213,13 @@ std::string GCode::emit_custom_gcode_per_print_z( } else { #if ENABLE_GCODE_VIEWER // add tag for processor - gcode += "; " + GCodeProcessor::Custom_Code_Tag + "\n"; + gcode += ";" + GCodeProcessor::Custom_Code_Tag + "\n"; #else // add tag for analyzer gcode += "; " + GCodeAnalyzer::Custom_Code_Tag + "\n"; -#endif // ENABLE_GCODE_VIEWER // add tag for time estimator - //gcode += "; " + GCodeTimeEstimator::Custom_Code_Tag + "\n"; + //gcode += "; " + GCodeTimeEstimator::Custom_Code_Tag + "\n"; +#endif // ENABLE_GCODE_VIEWER if (gcode_type == CustomGCode::Template) // Template Cistom Gcode gcode += print.config().template_custom_gcode; else // custom Gcode @@ -2870,10 +2869,11 @@ void GCode::append_full_config(const Print &print, std::string &str) const std::vector banned_keys { "compatible_printers", "compatible_prints", + //FIXME The print host keys should not be exported to full_print_config anymore. The following keys may likely be removed. "print_host", "printhost_apikey", - "printhost_cafile", - "printhost_slug" + "printhost_cafile", + "printhost_slug" }; assert(std::is_sorted(banned_keys.begin(), banned_keys.end())); auto is_banned = [banned_keys](const std::string &key) { diff --git a/src/libslic3r/GCode/Analyzer.cpp b/src/libslic3r/GCode/Analyzer.cpp deleted file mode 100644 index c2446ca38..000000000 --- a/src/libslic3r/GCode/Analyzer.cpp +++ /dev/null @@ -1,1402 +0,0 @@ -#include -#include -#include - -#include "../libslic3r.h" -#include "../PrintConfig.hpp" -#include "../Utils.hpp" -#include "Print.hpp" - -#include - -#include "Analyzer.hpp" -#include "PreviewData.hpp" -#include "GCodeTimeEstimator.hpp" - -#if !ENABLE_GCODE_VIEWER - -static const std::string AXIS_STR = "XYZE"; -static const float MMMIN_TO_MMSEC = 1.0f / 60.0f; -static const float INCHES_TO_MM = 25.4f; -static const float DEFAULT_FEEDRATE = 0.0f; -static const unsigned int DEFAULT_EXTRUDER_ID = 0; -static const unsigned int DEFAULT_COLOR_PRINT_ID = 0; -static const Slic3r::Vec3f DEFAULT_START_POSITION = Slic3r::Vec3f::Zero(); -static const float DEFAULT_START_EXTRUSION = 0.0f; -static const float DEFAULT_FAN_SPEED = 0.0f; -static const float DEFAULT_EXTRUDER_TEMP = 0.0f; -static const float DEFAULT_LAYER_DURATION = 0.0f; -static const float DEFAULT_LAYER_ELAPSED_TIME = 0.0f; - -namespace Slic3r { - -const std::string GCodeAnalyzer::Extrusion_Role_Tag = "_ANALYZER_EXTR_ROLE:"; -const std::string GCodeAnalyzer::Mm3_Per_Mm_Tag = "_ANALYZER_MM3_PER_MM:"; -const std::string GCodeAnalyzer::Width_Tag = "_ANALYZER_WIDTH:"; -const std::string GCodeAnalyzer::Height_Tag = "_ANALYZER_HEIGHT:"; -const std::string GCodeAnalyzer::Color_Change_Tag = "_ANALYZER_COLOR_CHANGE"; -const std::string GCodeAnalyzer::Pause_Print_Tag = "_ANALYZER_PAUSE_PRINT"; -const std::string GCodeAnalyzer::Custom_Code_Tag = "_ANALYZER_CUSTOM_CODE"; -const std::string GCodeAnalyzer::End_Pause_Print_Or_Custom_Code_Tag = "_ANALYZER_END_PAUSE_PRINT_OR_CUSTOM_CODE"; - -const float GCodeAnalyzer::Default_mm3_per_mm = 0.0f; -const float GCodeAnalyzer::Default_Width = 0.0f; -const float GCodeAnalyzer::Default_Height = 0.0f; - -GCodeAnalyzer::Metadata::Metadata() - : extrusion_role(erNone) - , extruder_id(DEFAULT_EXTRUDER_ID) - , mm3_per_mm(GCodeAnalyzer::Default_mm3_per_mm) - , width(GCodeAnalyzer::Default_Width) - , height(GCodeAnalyzer::Default_Height) - , feedrate(DEFAULT_FEEDRATE) - , fan_speed(DEFAULT_FAN_SPEED) - , extruder_temp(DEFAULT_EXTRUDER_TEMP) - , layer_duration(DEFAULT_LAYER_DURATION) - , layer_elapsed_time(DEFAULT_LAYER_ELAPSED_TIME) - , cp_color_id(DEFAULT_COLOR_PRINT_ID) -{ -} - -GCodeAnalyzer::Metadata::Metadata(ExtrusionRole extrusion_role, unsigned int extruder_id, float mm3_per_mm, float width, float height, float feedrate, - float fan_speed, float extruder_temp, float layer_duration, float layer_elapsed_time, unsigned int cp_color_id) - : extrusion_role(extrusion_role) - , extruder_id(extruder_id) - , mm3_per_mm(mm3_per_mm) - , width(width) - , height(height) - , feedrate(feedrate) - , fan_speed(fan_speed) - , extruder_temp(extruder_temp) - , layer_duration(layer_duration) - , layer_elapsed_time(layer_elapsed_time) - , cp_color_id(cp_color_id) -{ -} - -bool GCodeAnalyzer::Metadata::operator != (const GCodeAnalyzer::Metadata& other) const -{ - if (extrusion_role != other.extrusion_role) - return true; - - if (extruder_id != other.extruder_id) - return true; - - if (mm3_per_mm != other.mm3_per_mm) - return true; - - if (width != other.width) - return true; - - if (height != other.height) - return true; - - if (feedrate != other.feedrate) - return true; - - if (fan_speed != other.fan_speed) - return true; - - if (extruder_temp != other.extruder_temp) - return true; - - if (layer_duration != other.layer_duration) - return true; - - if (cp_color_id != other.cp_color_id) - return true; - - return false; -} - -GCodeAnalyzer::GCodeMove::GCodeMove(GCodeMove::EType type, ExtrusionRole extrusion_role, unsigned int extruder_id, float mm3_per_mm, - float width, float height, float feedrate, const Vec3d& start_position, const Vec3d& end_position, float delta_extruder, - float fan_speed, float extruder_temp, float layer_duration, float layer_elapsed_time, unsigned int cp_color_id) - : type(type) - , data(extrusion_role, extruder_id, mm3_per_mm, width, height, feedrate, fan_speed, extruder_temp, layer_duration, layer_elapsed_time, cp_color_id) - , start_position(start_position) - , end_position(end_position) - , delta_extruder(delta_extruder) -{ -} - -GCodeAnalyzer::GCodeMove::GCodeMove(GCodeMove::EType type, const GCodeAnalyzer::Metadata& data, const Vec3f& start_position, const Vec3f& end_position, float delta_extruder) - : type(type) - , data(data) - , start_position(start_position) - , end_position(end_position) - , delta_extruder(delta_extruder) -{ -} - -void GCodeAnalyzer::set_extruders_count(unsigned int count) -{ - m_extruders_count = count; - for (unsigned int i=0; i_process_gcode_line(reader, line); }); - - return m_process_output; -} - -void GCodeAnalyzer::calc_gcode_preview_data(GCodePreviewData& preview_data, GCodeTimeEstimator& time_estimator, std::function cancel_callback) -{ - // resets preview data - preview_data.reset(); - - // calculates extrusion layers - _calc_gcode_preview_extrusion_layers(preview_data, time_estimator, cancel_callback); - - // calculates travel - _calc_gcode_preview_travel(preview_data, cancel_callback); - - // calculates retractions - _calc_gcode_preview_retractions(preview_data, cancel_callback); - - // calculates unretractions - _calc_gcode_preview_unretractions(preview_data, cancel_callback); -} - -bool GCodeAnalyzer::is_valid_extrusion_role(ExtrusionRole role) -{ - return ((erPerimeter <= role) && (role < erMixed)); -} - -void GCodeAnalyzer::_process_gcode_line(GCodeReader&, const GCodeReader::GCodeLine& line) -{ - // processes 'special' comments contained in line - if (_process_tags(line)) - { -#if 0 - // DEBUG ONLY: puts the line back into the gcode - m_process_output += line.raw() + "\n"; -#endif - return; - } - - // sets new start position/extrusion - _set_start_position(_get_end_position()); - _set_start_extrusion(_get_axis_position(E)); - - // processes 'normal' gcode lines - std::string cmd = line.cmd(); - if (cmd.length() > 1) - { - switch (::toupper(cmd[0])) - { - case 'G': - { - switch (::atoi(&cmd[1])) - { - case 1: // Move - { - _processG1(line); - break; - } - case 10: // Retract - { - _processG10(line); - break; - } - case 11: // Unretract - { - _processG11(line); - break; - } - case 22: // Firmware controlled Retract - { - _processG22(line); - break; - } - case 23: // Firmware controlled Unretract - { - _processG23(line); - break; - } - case 90: // Set to Absolute Positioning - { - _processG90(line); - break; - } - case 91: // Set to Relative Positioning - { - _processG91(line); - break; - } - case 92: // Set Position - { - _processG92(line); - break; - } - } - - break; - } - case 'M': - { - switch (::atoi(&cmd[1])) - { - case 82: // Set extruder to absolute mode - { - _processM82(line); - break; - } - case 83: // Set extruder to relative mode - { - _processM83(line); - break; - } - case 104: //set extruder temp - case 109: - { - _processM104orM109(line); - break; - } - case 106: // Set fan speed - { - _processM106(line); - break; - } - case 107: // Disable fan - { - _processM107(line); - break; - } - case 108: - case 135: - { - // these are used by MakerWare and Sailfish firmwares - // for tool changing - we can process it in one place - _processM108orM135(line); - break; - } - case 132: // Recall stored home offsets - { - _processM132(line); - break; - } - case 401: // Repetier: Store x, y and z position - { - _processM401(line); - break; - } - case 402: // Repetier: Go to stored position - { - _processM402(line); - break; - } - } - - break; - } - case 'T': // Select Tools - { - _processT(line); - break; - } - } - if (this->m_gcode_flavor == GCodeFlavor::gcfKlipper) { - if (cmd == "ACTIVATE_EXTRUDER") { - std::string rawline = line.raw(); - std::string trsf; - while (rawline.back() >= '0' && rawline.back() <= '9') { - trsf = rawline.back() + trsf; - rawline.resize(rawline.size() - 1); - } - if (trsf.empty()) - trsf = "0"; - _processT("T"+ trsf); - } - } - } - - // puts the line back into the gcode - m_process_output += line.raw() + "\n"; -} - -void GCodeAnalyzer::_processG1(const GCodeReader::GCodeLine& line) -{ - auto axis_absolute_position = [this](GCodeAnalyzer::EAxis axis, const GCodeReader::GCodeLine& lineG1) -> float - { - bool is_relative = (_get_global_positioning_type() == Relative); - if (axis == E) - is_relative |= (_get_e_local_positioning_type() == Relative); - - if (lineG1.has(Slic3r::Axis(axis))) - { - float lengthsScaleFactor = (_get_units() == GCodeAnalyzer::Inches) ? INCHES_TO_MM : 1.0f; - float ret = lineG1.value(Slic3r::Axis(axis)) * lengthsScaleFactor; - return is_relative ? _get_axis_position(axis) + ret : _get_axis_origin(axis) + ret; - } - else - return _get_axis_position(axis); - }; - - // updates axes positions from line - - float new_pos[Num_Axis]; - for (unsigned char a = X; a < Num_Axis; ++a) - { - new_pos[a] = axis_absolute_position((EAxis)a, line); - } - - // updates feedrate from line, if present - if (line.has_f()) - _set_feedrate(line.f() * MMMIN_TO_MMSEC); - - // calculates movement deltas - float delta_pos[Num_Axis]; - for (unsigned char a = X; a < Num_Axis; ++a) - { - delta_pos[a] = new_pos[a] - _get_axis_position((EAxis)a); - } - - // Detects move type - GCodeMove::EType type = GCodeMove::Noop; - - if (delta_pos[E] < 0.0f) - { - if ((delta_pos[X] != 0.0f) || (delta_pos[Y] != 0.0f) || (delta_pos[Z] != 0.0f)) - type = GCodeMove::Move; - else - type = GCodeMove::Retract; - } - else if (delta_pos[E] > 0.0f) - { - if ((delta_pos[X] == 0.0f) && (delta_pos[Y] == 0.0f) && (delta_pos[Z] == 0.0f)) - type = GCodeMove::Unretract; - else if ((delta_pos[X] != 0.0f) || (delta_pos[Y] != 0.0f)) - type = GCodeMove::Extrude; - } - else if ((delta_pos[X] != 0.0f) || (delta_pos[Y] != 0.0f) || (delta_pos[Z] != 0.0f)) - type = GCodeMove::Move; - - ExtrusionRole role = _get_extrusion_role(); - if ((type == GCodeMove::Extrude) && ((_get_width() == 0.0f) || (_get_height() == 0.0f) || !is_valid_extrusion_role(role))) - type = GCodeMove::Move; - - // updates axis positions - for (unsigned char a = X; a < Num_Axis; ++a) - { - _set_axis_position((EAxis)a, new_pos[a]); - } - - // stores the move - if (type != GCodeMove::Noop) - _store_move(type); -} - -void GCodeAnalyzer::_processG10(const GCodeReader::GCodeLine& line) -{ - //special case for reprap (temp done, TODO: offsets) - float new_temp; - if (m_gcode_flavor == gcfRepRap && line.has_value('S', new_temp)) - { - _set_extruder_temp(new_temp); - } - // stores retract move - else { - _store_move(GCodeMove::Retract); - } -} - -void GCodeAnalyzer::_processG11(const GCodeReader::GCodeLine& line) -{ - // stores unretract move - _store_move(GCodeMove::Unretract); -} - -void GCodeAnalyzer::_processG22(const GCodeReader::GCodeLine& line) -{ - // stores retract move - _store_move(GCodeMove::Retract); -} - -void GCodeAnalyzer::_processG23(const GCodeReader::GCodeLine& line) -{ - // stores unretract move - _store_move(GCodeMove::Unretract); -} - -void GCodeAnalyzer::_processG90(const GCodeReader::GCodeLine& line) -{ - _set_global_positioning_type(Absolute); -} - -void GCodeAnalyzer::_processG91(const GCodeReader::GCodeLine& line) -{ - _set_global_positioning_type(Relative); -} - -void GCodeAnalyzer::_processG92(const GCodeReader::GCodeLine& line) -{ - float lengthsScaleFactor = (_get_units() == Inches) ? INCHES_TO_MM : 1.0f; - bool anyFound = false; - - if (line.has_x()) - { - _set_axis_origin(X, _get_axis_position(X) - line.x() * lengthsScaleFactor); - anyFound = true; - } - - if (line.has_y()) - { - _set_axis_origin(Y, _get_axis_position(Y) - line.y() * lengthsScaleFactor); - anyFound = true; - } - - if (line.has_z()) - { - _set_axis_origin(Z, _get_axis_position(Z) - line.z() * lengthsScaleFactor); - anyFound = true; - } - - if (line.has_e()) - { - // extruder coordinate can grow to the point where its float representation does not allow for proper addition with small increments, - // we set the value taken from the G92 line as the new current position for it - _set_axis_position(E, line.e() * lengthsScaleFactor); - anyFound = true; - } - - if (!anyFound && ! line.has_unknown_axis()) - { - // The G92 may be called for axes that PrusaSlicer does not recognize, for example see GH issue #3510, - // where G92 A0 B0 is called although the extruder axis is till E. - for (unsigned char a = X; a < Num_Axis; ++a) - { - _set_axis_origin((EAxis)a, _get_axis_position((EAxis)a)); - } - } -} - -void GCodeAnalyzer::_processM82(const GCodeReader::GCodeLine& line) -{ - _set_e_local_positioning_type(Absolute); -} - -void GCodeAnalyzer::_processM83(const GCodeReader::GCodeLine& line) -{ - _set_e_local_positioning_type(Relative); -} - -void GCodeAnalyzer::_processM104orM109(const GCodeReader::GCodeLine& line) -{ - float new_temp; - if (line.has_value('S', new_temp)) - { - _set_extruder_temp(new_temp); - } -} - -void GCodeAnalyzer::_processM106(const GCodeReader::GCodeLine& line) -{ - if (!line.has('P')) - { - // The absence of P means the print cooling fan, so ignore anything else. - float new_fan_speed; - if (line.has_value('S', new_fan_speed)) - _set_fan_speed((100.0f / 255.0f) * new_fan_speed); - else - _set_fan_speed(100.0f); - } -} - -void GCodeAnalyzer::_processM107(const GCodeReader::GCodeLine& line) -{ - _set_fan_speed(0.0f); -} - -void GCodeAnalyzer::_processM108orM135(const GCodeReader::GCodeLine& line) -{ - // These M-codes are used by MakerWare and Sailfish to change active tool. - // They have to be processed otherwise toolchanges will be unrecognised - // by the analyzer - see https://github.com/prusa3d/PrusaSlicer/issues/2566 - - size_t code = ::atoi(&(line.cmd()[1])); - if ((code == 108 && m_gcode_flavor == gcfSailfish) - || (code == 135 && m_gcode_flavor == gcfMakerWare)) { - - std::string cmd = line.raw(); - size_t T_pos = cmd.find("T"); - if (T_pos != std::string::npos) { - cmd = cmd.substr(T_pos); - _processT(cmd); - } - } -} - -void GCodeAnalyzer::_processM132(const GCodeReader::GCodeLine& line) -{ - // This command is used by Makerbot to load the current home position from EEPROM - // see: https://github.com/makerbot/s3g/blob/master/doc/GCodeProtocol.md - // Using this command to reset the axis origin to zero helps in fixing: https://github.com/prusa3d/PrusaSlicer/issues/3082 - - if (line.has_x()) - _set_axis_origin(X, 0.0f); - - if (line.has_y()) - _set_axis_origin(Y, 0.0f); - - if (line.has_z()) - _set_axis_origin(Z, 0.0f); - - if (line.has_e()) - _set_axis_origin(E, 0.0f); -} - -void GCodeAnalyzer::_processM401(const GCodeReader::GCodeLine& line) -{ - if (m_gcode_flavor != gcfRepetier) - return; - - for (unsigned char a = 0; a <= 3; ++a) - { - _set_cached_position(a, _get_axis_position((EAxis)a)); - } - _set_cached_position(4, _get_feedrate()); -} - -void GCodeAnalyzer::_processM402(const GCodeReader::GCodeLine& line) -{ - if (m_gcode_flavor != gcfRepetier) - return; - - // see for reference: - // https://github.com/repetier/Repetier-Firmware/blob/master/src/ArduinoAVR/Repetier/Printer.cpp - // void Printer::GoToMemoryPosition(bool x, bool y, bool z, bool e, float feed) - - bool has_xyz = !(line.has_x() || line.has_y() || line.has_z()); - - float p = FLT_MAX; - for (unsigned char a = X; a <= Z; ++a) - { - if (has_xyz || line.has(a)) - { - p = _get_cached_position(a); - if (p != FLT_MAX) - _set_axis_position((EAxis)a, p); - } - } - - p = _get_cached_position(E); - if (p != FLT_MAX) - _set_axis_position(E, p); - - p = FLT_MAX; - if (!line.has_value(4, p)) - p = _get_cached_position(4); - - if (p != FLT_MAX) - _set_feedrate(p); -} - -void GCodeAnalyzer::_reset_cached_position() -{ - for (unsigned char a = 0; a <= 4; ++a) - { - m_state.cached_position[a] = FLT_MAX; - } -} - -void GCodeAnalyzer::_processT(const std::string& cmd) -{ - if (cmd.length() > 1) - { - unsigned int id = (unsigned int)::strtol(cmd.substr(1).c_str(), nullptr, 10); - if (_get_extruder_id() != id) - { - if (id >= m_extruders_count) - { - if (m_extruders_count > 1) - BOOST_LOG_TRIVIAL(error) << "GCodeAnalyzer encountered an invalid toolchange, maybe from a custom gcode."; - } - else - { - _set_extruder_id(id); - if (_get_cp_color_id() != INT_MAX) - _set_cp_color_id(m_extruder_color[id]); - } - - // stores tool change move - _store_move(GCodeMove::Tool_change); - } - } -} - -void GCodeAnalyzer::_processT(const GCodeReader::GCodeLine& line) -{ - _processT(line.cmd()); -} - -bool GCodeAnalyzer::_process_tags(const GCodeReader::GCodeLine& line) -{ - std::string comment = line.comment(); - - // extrusion role tag - size_t pos = comment.find(Extrusion_Role_Tag); - if (pos != comment.npos) - { - _process_extrusion_role_tag(comment, pos); - return true; - } - - // mm3 per mm tag - pos = comment.find(Mm3_Per_Mm_Tag); - if (pos != comment.npos) - { - _process_mm3_per_mm_tag(comment, pos); - return true; - } - - // width tag - pos = comment.find(Width_Tag); - if (pos != comment.npos) - { - _process_width_tag(comment, pos); - return true; - } - - // height tag - pos = comment.find(Height_Tag); - if (pos != comment.npos) - { - _process_height_tag(comment, pos); - return true; - } - - // color change tag - pos = comment.find(Color_Change_Tag); - if (pos != comment.npos) - { - pos = comment.find_last_of(",T"); - unsigned extruder = pos == comment.npos ? 0 : std::stoi(comment.substr(pos + 1, comment.npos)); - _process_color_change_tag(extruder); - return true; - } - - // pause print tag - pos = comment.find(Pause_Print_Tag); - if (pos != comment.npos) - { - _process_pause_print_or_custom_code_tag(); - return true; - } - - // custom code tag - pos = comment.find(Custom_Code_Tag); - if (pos != comment.npos) - { - _process_pause_print_or_custom_code_tag(); - return true; - } - - // end pause print or custom code tag - pos = comment.find(End_Pause_Print_Or_Custom_Code_Tag); - if (pos != comment.npos) - { - _process_end_pause_print_or_custom_code_tag(); - return true; - } - - return false; -} - -void GCodeAnalyzer::_process_extrusion_role_tag(const std::string& comment, size_t pos) -{ - int role = (int)::strtol(comment.substr(pos + Extrusion_Role_Tag.length()).c_str(), nullptr, 10); - if (_is_valid_extrusion_role(role)) - _set_extrusion_role((ExtrusionRole)role); - else - { - // todo: show some error ? - } -} - -void GCodeAnalyzer::_process_mm3_per_mm_tag(const std::string& comment, size_t pos) -{ - _set_mm3_per_mm((float)::strtod(comment.substr(pos + Mm3_Per_Mm_Tag.length()).c_str(), nullptr)); -} - -void GCodeAnalyzer::_process_width_tag(const std::string& comment, size_t pos) -{ - _set_width((float)::strtod(comment.substr(pos + Width_Tag.length()).c_str(), nullptr)); -} - -void GCodeAnalyzer::_process_height_tag(const std::string& comment, size_t pos) -{ - _set_height((float)::strtod(comment.substr(pos + Height_Tag.length()).c_str(), nullptr)); -} - -void GCodeAnalyzer::_process_color_change_tag(unsigned extruder) -{ - m_extruder_color[extruder] = m_extruders_count + m_state.cp_color_counter; // color_change position in list of color for preview - m_state.cp_color_counter++; - - if (_get_extruder_id() == extruder) - _set_cp_color_id(m_extruder_color[extruder]); -} - -void GCodeAnalyzer::_process_pause_print_or_custom_code_tag() -{ - _set_cp_color_id(INT_MAX); -} - -void GCodeAnalyzer::_process_end_pause_print_or_custom_code_tag() -{ - if (_get_cp_color_id() == INT_MAX) - _set_cp_color_id(m_extruder_color[_get_extruder_id()]); -} - -void GCodeAnalyzer::_set_units(GCodeAnalyzer::EUnits units) -{ - m_state.units = units; -} - -GCodeAnalyzer::EUnits GCodeAnalyzer::_get_units() const -{ - return m_state.units; -} - -void GCodeAnalyzer::_set_global_positioning_type(GCodeAnalyzer::EPositioningType type) -{ - m_state.global_positioning_type = type; -} - -GCodeAnalyzer::EPositioningType GCodeAnalyzer::_get_global_positioning_type() const -{ - return m_state.global_positioning_type; -} - -void GCodeAnalyzer::_set_e_local_positioning_type(GCodeAnalyzer::EPositioningType type) -{ - m_state.e_local_positioning_type = type; -} - -GCodeAnalyzer::EPositioningType GCodeAnalyzer::_get_e_local_positioning_type() const -{ - return m_state.e_local_positioning_type; -} - -void GCodeAnalyzer::_set_extrusion_role(ExtrusionRole extrusion_role) -{ - m_state.data.extrusion_role = extrusion_role; -} - -ExtrusionRole GCodeAnalyzer::_get_extrusion_role() const -{ - return m_state.data.extrusion_role; -} - -void GCodeAnalyzer::_set_extruder_id(unsigned int id) -{ - m_state.data.extruder_id = id; -} - -unsigned int GCodeAnalyzer::_get_extruder_id() const -{ - return m_state.data.extruder_id; -} - -void GCodeAnalyzer::_set_cp_color_id(unsigned int id) -{ - m_state.data.cp_color_id = id; -} - -unsigned int GCodeAnalyzer::_get_cp_color_id() const -{ - return m_state.data.cp_color_id; -} - -void GCodeAnalyzer::_set_mm3_per_mm(float value) -{ - m_state.data.mm3_per_mm = value; -} - -float GCodeAnalyzer::_get_mm3_per_mm() const -{ - return m_state.data.mm3_per_mm; -} - -void GCodeAnalyzer::_set_width(float width) -{ - m_state.data.width = width; -} - -float GCodeAnalyzer::_get_width() const -{ - return m_state.data.width; -} - -void GCodeAnalyzer::_set_height(float height) -{ - m_state.data.height = height; -} - -float GCodeAnalyzer::_get_height() const -{ - return m_state.data.height; -} - -void GCodeAnalyzer::_set_feedrate(float feedrate_mm_sec) -{ - m_state.data.feedrate = feedrate_mm_sec; -} - -float GCodeAnalyzer::_get_feedrate() const -{ - return m_state.data.feedrate; -} - -void GCodeAnalyzer::_set_extruder_temp(float new_temperature) -{ - m_state.data.extruder_temp = new_temperature; -} - -float GCodeAnalyzer::_get_extruder_temp() const -{ - return m_state.data.extruder_temp; -} - -void GCodeAnalyzer::_set_fan_speed(float fan_speed_percentage) -{ - m_state.data.fan_speed = fan_speed_percentage; -} - -float GCodeAnalyzer::_get_fan_speed() const -{ - return m_state.data.fan_speed; -} - -void GCodeAnalyzer::_set_layer_duration(float layer_duration_sec) -{ - m_state.data.layer_duration = layer_duration_sec; -} - -float GCodeAnalyzer::_get_layer_duration() const -{ - return m_state.data.layer_duration; -} - -void GCodeAnalyzer::_set_axis_position(EAxis axis, float position) -{ - m_state.position[axis] = position; -} - -float GCodeAnalyzer::_get_axis_position(EAxis axis) const -{ - return m_state.position[axis]; -} - -void GCodeAnalyzer::_set_axis_origin(EAxis axis, float position) -{ - m_state.origin[axis] = position; -} - -float GCodeAnalyzer::_get_axis_origin(EAxis axis) const -{ - return m_state.origin[axis]; -} - -void GCodeAnalyzer::_reset_axes_position() -{ - ::memset((void*)m_state.position, 0, Num_Axis * sizeof(float)); -} - -void GCodeAnalyzer::_reset_axes_origin() -{ - ::memset((void*)m_state.origin, 0, Num_Axis * sizeof(float)); -} - -void GCodeAnalyzer::_set_start_position(const Vec3f& position) -{ - m_state.start_position = position; -} - -const Vec3f& GCodeAnalyzer::_get_start_position() const -{ - return m_state.start_position; -} - -void GCodeAnalyzer::_set_cached_position(unsigned char axis, float position) -{ - if ((0 <= axis) || (axis <= 4)) - m_state.cached_position[axis] = position; -} - -float GCodeAnalyzer::_get_cached_position(unsigned char axis) const -{ - return ((0 <= axis) || (axis <= 4)) ? m_state.cached_position[axis] : FLT_MAX; -} - -void GCodeAnalyzer::_set_start_extrusion(float extrusion) -{ - m_state.start_extrusion = extrusion; -} - -float GCodeAnalyzer::_get_start_extrusion() const -{ - return m_state.start_extrusion; -} - -float GCodeAnalyzer::_get_delta_extrusion() const -{ - return _get_axis_position(E) - m_state.start_extrusion; -} - -Vec3f GCodeAnalyzer::_get_end_position() const -{ - return Vec3f(m_state.position[X], m_state.position[Y], m_state.position[Z]); -} - -void GCodeAnalyzer::_store_move(GCodeAnalyzer::GCodeMove::EType type) -{ - // if type non mapped yet, map it - TypeToMovesMap::iterator it = m_moves_map.find(type); - if (it == m_moves_map.end()) - it = m_moves_map.insert(TypeToMovesMap::value_type(type, GCodeMovesList())).first; - - // store move - Vec3f extruder_offset = Vec3f::Zero(); - unsigned int extruder_id = _get_extruder_id(); - ExtruderOffsetsMap::iterator extr_it = m_extruder_offsets.find(extruder_id); - if (extr_it != m_extruder_offsets.end()) - extruder_offset = Vec3f((float)extr_it->second(0), (float)extr_it->second(1), 0.0f); - - Vec3f start_position = _get_start_position() + extruder_offset; - Vec3f end_position = _get_end_position() + extruder_offset; - it->second.emplace_back(type, _get_extrusion_role(), extruder_id, _get_mm3_per_mm(), - _get_width(), _get_height(), _get_feedrate(), start_position, end_position, _get_delta_extrusion(), - _get_fan_speed(), _get_extruder_temp(), _get_layer_duration(), m_state.data.layer_elapsed_time, _get_cp_color_id()); -} - -bool GCodeAnalyzer::_is_valid_extrusion_role(int value) const -{ - return ((int)erNone <= value) && (value <= (int)erMixed); -} - -void GCodeAnalyzer::_calc_gcode_preview_extrusion_layers(GCodePreviewData& preview_data, GCodeTimeEstimator& time_estimator, std::function cancel_callback) -{ - struct Helper - { - static GCodePreviewData::Extrusion::Layer& get_layer_at_z(GCodePreviewData::Extrusion::LayersList& layers, float z) - { - //FIXME this has a terrible time complexity - for (GCodePreviewData::Extrusion::Layer& layer : layers) - { - // if layer found, return it - if (layer.z == z) - return layer; - } - - // if layer not found, create and return it - layers.emplace_back(z, GCodePreviewData::Extrusion::Paths()); - return layers.back(); - } - - static void store_polyline(const Polyline& polyline, const Metadata& data, float z, GCodePreviewData& preview_data) - { - // if the polyline is valid, create the extrusion path from it and store it - if (polyline.is_valid()) - { - auto& paths = get_layer_at_z(preview_data.extrusion.layers, z).paths; - paths.emplace_back(GCodePreviewData::Extrusion::Path()); - GCodePreviewData::Extrusion::Path &path = paths.back(); - path.polyline = polyline; - path.extrusion_role = data.extrusion_role; - path.mm3_per_mm = data.mm3_per_mm; - path.width = data.width; - path.height = data.height; - path.feedrate = data.feedrate; - path.extruder_id = data.extruder_id; - path.cp_color_id = data.cp_color_id; - path.fan_speed = data.fan_speed; - path.extruder_temp = data.extruder_temp; - path.layer_duration = data.layer_duration; - path.elapsed_time = data.layer_elapsed_time; - } - } - }; - - TypeToMovesMap::iterator extrude_moves = m_moves_map.find(GCodeMove::Extrude); - if (extrude_moves == m_moves_map.end()) - return; - - Metadata data; - float z = FLT_MAX; - Polyline polyline; - Vec3f position(FLT_MAX, FLT_MAX, FLT_MAX); - float volumetric_rate = FLT_MAX; - GCodePreviewData::Range height_range; - GCodePreviewData::Range width_range; - GCodePreviewData::MultiRange feedrate_range; - GCodePreviewData::Range volumetric_rate_range; - GCodePreviewData::Range fan_speed_range; - GCodePreviewData::Range extruder_temp_range; - GCodePreviewData::Range layer_duration_range; - GCodePreviewData::Range elapsed_time_range; - - // to avoid to call the callback too often - unsigned int cancel_callback_threshold = (unsigned int)std::max((int)extrude_moves->second.size() / 25, 1); - unsigned int cancel_callback_curr = 0; - - time_estimator.calculate_layer_duration(); - for (GCodeMove& move : extrude_moves->second) - { - z = (float)move.start_position.z(); - move.data.layer_duration = time_estimator.get_layer_duration(z); - move.data.layer_elapsed_time += time_estimator.get_layer_time(z); - } - time_estimator.reset_layers(); - - // constructs the polylines while traversing the moves - for (const GCodeMove& move : extrude_moves->second) - { - // to avoid to call the callback too often - cancel_callback_curr = (cancel_callback_curr + 1) % cancel_callback_threshold; - if (cancel_callback_curr == 0) - cancel_callback(); - - if ((data != move.data) || (z != move.start_position.z()) || (position != move.start_position) || (volumetric_rate != move.data.feedrate * move.data.mm3_per_mm)) - { - // store current polyline - polyline.remove_duplicate_points(); - Helper::store_polyline(polyline, data, z, preview_data); - - // reset current polyline - polyline = Polyline(); - - // add both vertices of the move - polyline.append(Point(scale_(move.start_position.x()), scale_(move.start_position.y()))); - polyline.append(Point(scale_(move.end_position.x()), scale_(move.end_position.y()))); - - // update current values - data = move.data; - z = (float)move.start_position.z(); - volumetric_rate = move.data.feedrate * move.data.mm3_per_mm; - height_range.update_from(move.data.height); - width_range.update_from(move.data.width); - feedrate_range.update_from(move.data.feedrate, GCodePreviewData::FeedrateKind::EXTRUSION); - volumetric_rate_range.update_from(volumetric_rate); - fan_speed_range.update_from(move.data.fan_speed); - extruder_temp_range.update_from(move.data.extruder_temp); - layer_duration_range.update_from(move.data.layer_duration); - elapsed_time_range.update_from(move.data.layer_elapsed_time); - } - else - // append end vertex of the move to current polyline - polyline.append(Point(scale_(move.end_position.x()), scale_(move.end_position.y()))); - - // update current values - position = move.end_position; - } - - // store last polyline - polyline.remove_duplicate_points(); - Helper::store_polyline(polyline, data, z, preview_data); - - // updates preview ranges data - preview_data.ranges.height.update_from(height_range); - preview_data.ranges.width.update_from(width_range); - preview_data.ranges.feedrate.update_from(feedrate_range); - preview_data.ranges.volumetric_rate.update_from(volumetric_rate_range); - preview_data.ranges.fan_speed.update_from(fan_speed_range); - preview_data.ranges.extruder_temp.update_from(extruder_temp_range); - preview_data.ranges.layer_duration.update_from(layer_duration_range); - preview_data.ranges.elapsed_time.update_from(elapsed_time_range); - - // we need to sort the layers by their z as they can be shuffled in case of sequential prints - std::sort(preview_data.extrusion.layers.begin(), preview_data.extrusion.layers.end(), [](const GCodePreviewData::Extrusion::Layer& l1, const GCodePreviewData::Extrusion::Layer& l2)->bool { return l1.z < l2.z; }); -} - -void GCodeAnalyzer::_calc_gcode_preview_travel(GCodePreviewData& preview_data, std::function cancel_callback) -{ - struct Helper - { - static void store_polyline(const Polyline3& polyline, GCodePreviewData::Travel::EType type, GCodePreviewData::Travel::Polyline::EDirection direction, - float feedrate, unsigned int extruder_id, GCodePreviewData& preview_data) - { - // if the polyline is valid, store it - if (polyline.is_valid()) - preview_data.travel.polylines.emplace_back(type, direction, feedrate, extruder_id, polyline); - } - }; - - TypeToMovesMap::iterator travel_moves = m_moves_map.find(GCodeMove::Move); - if (travel_moves == m_moves_map.end()) - return; - - Polyline3 polyline; - Vec3f position(FLT_MAX, FLT_MAX, FLT_MAX); - GCodePreviewData::Travel::EType type = GCodePreviewData::Travel::Num_Types; - GCodePreviewData::Travel::Polyline::EDirection direction = GCodePreviewData::Travel::Polyline::Num_Directions; - float feedrate = FLT_MAX; - unsigned int extruder_id = -1; - - GCodePreviewData::Range height_range; - GCodePreviewData::Range width_range; - GCodePreviewData::MultiRange feedrate_range; - - // to avoid to call the callback too often - unsigned int cancel_callback_threshold = (unsigned int)std::max((int)travel_moves->second.size() / 25, 1); - unsigned int cancel_callback_curr = 0; - - // constructs the polylines while traversing the moves - for (const GCodeMove& move : travel_moves->second) - { - cancel_callback_curr = (cancel_callback_curr + 1) % cancel_callback_threshold; - if (cancel_callback_curr == 0) - cancel_callback(); - - GCodePreviewData::Travel::EType move_type = (move.delta_extruder < 0.0f) ? GCodePreviewData::Travel::Retract : ((move.delta_extruder > 0.0f) ? GCodePreviewData::Travel::Extrude : GCodePreviewData::Travel::Move); - GCodePreviewData::Travel::Polyline::EDirection move_direction = ((move.start_position.x() != move.end_position.x()) || (move.start_position.y() != move.end_position.y())) ? GCodePreviewData::Travel::Polyline::Generic : GCodePreviewData::Travel::Polyline::Vertical; - - if ((type != move_type) || (direction != move_direction) || (feedrate != move.data.feedrate) || (position != move.start_position) || (extruder_id != move.data.extruder_id)) - { - // store current polyline - polyline.remove_duplicate_points(); - Helper::store_polyline(polyline, type, direction, feedrate, extruder_id, preview_data); - - // reset current polyline - polyline = Polyline3(); - - // add both vertices of the move - polyline.append(Vec3crd((int)scale_(move.start_position.x()), (int)scale_(move.start_position.y()), (int)scale_(move.start_position.z()))); - polyline.append(Vec3crd((int)scale_(move.end_position.x()), (int)scale_(move.end_position.y()), (int)scale_(move.end_position.z()))); - } - else - // append end vertex of the move to current polyline - polyline.append(Vec3crd((int)scale_(move.end_position.x()), (int)scale_(move.end_position.y()), (int)scale_(move.end_position.z()))); - - // update current values - position = move.end_position; - type = move_type; - feedrate = move.data.feedrate; - extruder_id = move.data.extruder_id; - height_range.update_from(move.data.height); - width_range.update_from(move.data.width); - feedrate_range.update_from(move.data.feedrate, GCodePreviewData::FeedrateKind::TRAVEL); - } - - // store last polyline - polyline.remove_duplicate_points(); - Helper::store_polyline(polyline, type, direction, feedrate, extruder_id, preview_data); - - // updates preview ranges data - preview_data.ranges.height.update_from(height_range); - preview_data.ranges.width.update_from(width_range); - preview_data.ranges.feedrate.update_from(feedrate_range); - - // we need to sort the polylines by their min z as they can be shuffled in case of sequential prints - std::sort(preview_data.travel.polylines.begin(), preview_data.travel.polylines.end(), - [](const GCodePreviewData::Travel::Polyline& p1, const GCodePreviewData::Travel::Polyline& p2)->bool - { return unscale(p1.polyline.bounding_box().min(2)) < unscale(p2.polyline.bounding_box().min(2)); }); -} - -void GCodeAnalyzer::_calc_gcode_preview_retractions(GCodePreviewData& preview_data, std::function cancel_callback) -{ - TypeToMovesMap::iterator retraction_moves = m_moves_map.find(GCodeMove::Retract); - if (retraction_moves == m_moves_map.end()) - return; - - // to avoid to call the callback too often - unsigned int cancel_callback_threshold = (unsigned int)std::max((int)retraction_moves->second.size() / 25, 1); - unsigned int cancel_callback_curr = 0; - - for (const GCodeMove& move : retraction_moves->second) - { - cancel_callback_curr = (cancel_callback_curr + 1) % cancel_callback_threshold; - if (cancel_callback_curr == 0) - cancel_callback(); - - // store position - Vec3crd position((int)scale_(move.start_position.x()), (int)scale_(move.start_position.y()), (int)scale_(move.start_position.z())); - preview_data.retraction.positions.emplace_back(position, move.data.width, move.data.height); - } - - // we need to sort the positions by their z as they can be shuffled in case of sequential prints - std::sort(preview_data.retraction.positions.begin(), preview_data.retraction.positions.end(), - [](const GCodePreviewData::Retraction::Position& p1, const GCodePreviewData::Retraction::Position& p2)->bool - { return unscale(p1.position(2)) < unscale(p2.position(2)); }); -} - -void GCodeAnalyzer::_calc_gcode_preview_unretractions(GCodePreviewData& preview_data, std::function cancel_callback) -{ - TypeToMovesMap::iterator unretraction_moves = m_moves_map.find(GCodeMove::Unretract); - if (unretraction_moves == m_moves_map.end()) - return; - - // to avoid to call the callback too often - unsigned int cancel_callback_threshold = (unsigned int)std::max((int)unretraction_moves->second.size() / 25, 1); - unsigned int cancel_callback_curr = 0; - - for (const GCodeMove& move : unretraction_moves->second) - { - cancel_callback_curr = (cancel_callback_curr + 1) % cancel_callback_threshold; - if (cancel_callback_curr == 0) - cancel_callback(); - - // store position - Vec3crd position((int)scale_(move.start_position.x()), (int)scale_(move.start_position.y()), (int)scale_(move.start_position.z())); - preview_data.unretraction.positions.emplace_back(position, move.data.width, move.data.height); - } - - // we need to sort the positions by their z as they can be shuffled in case of sequential prints - std::sort(preview_data.unretraction.positions.begin(), preview_data.unretraction.positions.end(), - [](const GCodePreviewData::Retraction::Position& p1, const GCodePreviewData::Retraction::Position& p2)->bool - { return unscale(p1.position(2)) < unscale(p2.position(2)); }); -} - -// Return an estimate of the memory consumed by the time estimator. -size_t GCodeAnalyzer::memory_used() const -{ - size_t out = sizeof(*this); - for (const std::pair &kvp : m_moves_map) - out += sizeof(kvp) + SLIC3R_STDVEC_MEMSIZE(kvp.second, GCodeMove); - out += m_process_output.size(); - return out; -} -const std::string& FanMover::process_gcode(const std::string& gcode) { - m_process_output = ""; - buffer.clear(); - buffer_time_size = 0; - current_speed = 1000 / 60.0; - expected_fan_speed = 0; - current_fan_speed = 0; - - m_parser.parse_buffer(gcode, - [this](GCodeReader& reader, const GCodeReader::GCodeLine& line) { /*m_process_output += line.raw() + "\n";*/ this->_process_gcode_line(reader, line); }); - - while (!buffer.empty()) { - m_process_output += buffer.back().raw + "\n"; - buffer.pop_back(); - } - - return m_process_output; -} - -void FanMover::_process_gcode_line(GCodeReader& reader, const GCodeReader::GCodeLine& line) -{ - // processes 'normal' gcode lines - std::string cmd = line.cmd(); - double time = 0; - float fan_speed = -1; - if (cmd.length() > 1) { - if (line.has_f()) - current_speed = line.f() / 60.0f; - switch (::toupper(cmd[0])) { - case 'G': - { - if (::atoi(&cmd[1]) == 1 || ::atoi(&cmd[1]) == 0) { - double dist = line.dist_X(reader)*line.dist_X(reader) + line.dist_Y(reader)*line.dist_Y(reader) + line.dist_Z(reader)*line.dist_Z(reader); - if (dist > 0) { - dist = std::sqrt(dist); - time = dist / current_speed; - } - } - break; - } - case 'M': - { - if (::atoi(&cmd[1]) == 106) { - if (line.has_value('S', fan_speed) ) { - int nb_M106_erased = 0; - if (fan_speed > expected_fan_speed) { - time = -1; // don't write! - //erase M106 in the buffer -> don't slowdown if you are in the process of step-up. - auto it = buffer.begin(); - int i = 0; - while (it != buffer.end()) { - if (it->raw.compare(0, 4, "M106") == 0 && it->speed < fan_speed) { - //found somethign that is lower than us -> change is speed by ours and delete us - it->speed = fan_speed; - std::stringstream ss; ss << "S" << (int)fan_speed; - it->raw = std::regex_replace(it->raw, regex_fan_speed, ss.str()); - nb_M106_erased++; - } else { - ++it; - i++; - } - } - - if (nb_M106_erased == 0) { - //print it - if (with_D_option) { - std::stringstream ss; - ss << " D" << (uint32_t)(buffer_time_size * 1000) << "\n"; - m_process_output += line.raw() + ss.str(); - } else { - m_process_output += line.raw() + "\n"; - } - current_fan_speed = fan_speed; - } - } - - //update - expected_fan_speed = fan_speed; - } - } - break; - } - } - } - - if (time >= 0) { - buffer.emplace_front(BufferData(line.raw(), time, fan_speed)); - buffer_time_size += time; - } - // puts the line back into the gcode - //if buffer too big, flush it. - if (time > 0) { - while (buffer_time_size - buffer.back().time > nb_seconds_delay) { - BufferData &backdata = buffer.back(); - if (backdata.speed < 0 || (int)backdata.speed != (int)current_fan_speed) { - buffer_time_size -= backdata.time; - m_process_output += backdata.raw + "\n"; - if (backdata.speed >= 0) { - current_fan_speed = backdata.speed; - } - } - buffer.pop_back(); - } - } -} - -} // namespace Slic3r - -#endif // !ENABLE_GCODE_VIEWER diff --git a/src/libslic3r/GCode/Analyzer.hpp b/src/libslic3r/GCode/Analyzer.hpp deleted file mode 100644 index c73b1426d..000000000 --- a/src/libslic3r/GCode/Analyzer.hpp +++ /dev/null @@ -1,364 +0,0 @@ -#ifndef slic3r_GCode_Analyzer_hpp_ -#define slic3r_GCode_Analyzer_hpp_ - -#if !ENABLE_GCODE_VIEWER - -#include "../libslic3r.h" -#include "../PrintConfig.hpp" -#include "../ExtrusionEntity.hpp" - -#include "../Point.hpp" -#include "../GCodeReader.hpp" -#include - -namespace Slic3r { - -class GCodePreviewData; -class GCodeTimeEstimator; - -class GCodeAnalyzer -{ -public: - static const std::string Extrusion_Role_Tag; - static const std::string Mm3_Per_Mm_Tag; - static const std::string Width_Tag; - static const std::string Height_Tag; - static const std::string Color_Change_Tag; - static const std::string Pause_Print_Tag; - static const std::string Custom_Code_Tag; - static const std::string End_Pause_Print_Or_Custom_Code_Tag; - - static const float Default_mm3_per_mm; - static const float Default_Width; - static const float Default_Height; - - enum EUnits : unsigned char - { - Millimeters, - Inches - }; - - enum EAxis : unsigned char - { - X, - Y, - Z, - E, - Num_Axis - }; - - enum EPositioningType : unsigned char - { - Absolute, - Relative - }; - - struct Metadata - { - ExtrusionRole extrusion_role; - unsigned int extruder_id; - float mm3_per_mm; - float width; // mm - float height; // mm - float feedrate; // mm/s - float fan_speed; // percentage - float extruder_temp; //oC - float layer_duration; //s - float layer_elapsed_time; //s - unsigned int cp_color_id; - - Metadata(); - Metadata(ExtrusionRole extrusion_role, unsigned int extruder_id, float mm3_per_mm, - float width, float height, float feedrate, float fan_speed, float extruder_temp, - float layer_duration, float layer_elapsed_time, unsigned int cp_color_id); - - bool operator != (const Metadata& other) const; - }; - - struct GCodeMove - { - enum EType : unsigned char - { - Noop, - Retract, - Unretract, - Tool_change, - Move, - Extrude, - Num_Types - }; - - EType type; - Metadata data; - Vec3f start_position; - Vec3f end_position; - float delta_extruder; - - GCodeMove(EType type, ExtrusionRole extrusion_role, unsigned int extruder_id, float mm3_per_mm, - float width, float height, float feedrate, const Vec3d& start_position, const Vec3d& end_position, float delta_extruder, - float fan_speed, float extruder_temp, float layer_duration, float layer_elapsed_time, unsigned int cp_color_id); - GCodeMove(EType type, const Metadata& data, const Vec3d& start_position, const Vec3d& end_position, float delta_extruder); - }; - - typedef std::vector GCodeMovesList; - typedef std::map TypeToMovesMap; - typedef std::map ExtruderOffsetsMap; - typedef std::map ExtruderToColorMap; - -private: - struct State - { - EUnits units; - EPositioningType global_positioning_type; - EPositioningType e_local_positioning_type; - Metadata data; - Vec3f start_position = Vec3f::Zero(); - float cached_position[5]; - float start_extrusion; - float position[Num_Axis]; - float origin[Num_Axis]; - unsigned int cp_color_counter = 0; - }; - -private: - State m_state; - GCodeReader m_parser; - TypeToMovesMap m_moves_map; - ExtruderOffsetsMap m_extruder_offsets; - unsigned int m_extruders_count; - GCodeFlavor m_gcode_flavor; - - ExtruderToColorMap m_extruder_color; - - // The output of process_layer() - std::string m_process_output; - -public: - GCodeAnalyzer() { reset(); } - - void set_extruder_offsets(const ExtruderOffsetsMap& extruder_offsets) { m_extruder_offsets = extruder_offsets; } - void set_extruders_count(unsigned int count); - - void set_extrusion_axis(char axis) { m_parser.set_extrusion_axis(axis); } - - void set_gcode_flavor(const GCodeFlavor& flavor) { m_gcode_flavor = flavor; } - - // Reinitialize the analyzer - void reset(); - - // Adds the gcode contained in the given string to the analysis and returns it after removing the workcodes - const std::string& process_gcode(const std::string& gcode); - - // Calculates all data needed for gcode visualization - // throws CanceledException through print->throw_if_canceled() (sent by the caller as callback). - void calc_gcode_preview_data(GCodePreviewData& preview_data, GCodeTimeEstimator& time_estimator, std::function cancel_callback = std::function()); - - // Return an estimate of the memory consumed by the time estimator. - size_t memory_used() const; - - static bool is_valid_extrusion_role(ExtrusionRole role); - -private: - // Processes the given gcode line - void _process_gcode_line(GCodeReader& reader, const GCodeReader::GCodeLine& line); - - // Move - void _processG1(const GCodeReader::GCodeLine& line); - - // Retract - void _processG10(const GCodeReader::GCodeLine& line); - - // Unretract - void _processG11(const GCodeReader::GCodeLine& line); - - // Firmware controlled Retract - void _processG22(const GCodeReader::GCodeLine& line); - - // Firmware controlled Unretract - void _processG23(const GCodeReader::GCodeLine& line); - - // Set to Absolute Positioning - void _processG90(const GCodeReader::GCodeLine& line); - - // Set to Relative Positioning - void _processG91(const GCodeReader::GCodeLine& line); - - // Set Position - void _processG92(const GCodeReader::GCodeLine& line); - - // Set extruder to absolute mode - void _processM82(const GCodeReader::GCodeLine& line); - - // Set extruder to relative mode - void _processM83(const GCodeReader::GCodeLine& line); - - // Extruder temperature change - void _processM104orM109(const GCodeReader::GCodeLine& line); - - // Set fan speed - void _processM106(const GCodeReader::GCodeLine& line); - - // Disable fan - void _processM107(const GCodeReader::GCodeLine& line); - - // Set tool (MakerWare and Sailfish flavor) - void _processM108orM135(const GCodeReader::GCodeLine& line); - - // Recall stored home offsets - void _processM132(const GCodeReader::GCodeLine& line); - - // Repetier: Store x, y and z position - void _processM401(const GCodeReader::GCodeLine& line); - - // Repetier: Go to stored position - void _processM402(const GCodeReader::GCodeLine& line); - - // Processes T line (Select Tool) - void _processT(const std::string& command); - void _processT(const GCodeReader::GCodeLine& line); - - // Processes the tags - // Returns true if any tag has been processed - bool _process_tags(const GCodeReader::GCodeLine& line); - - // Processes extrusion role tag - void _process_extrusion_role_tag(const std::string& comment, size_t pos); - - // Processes mm3_per_mm tag - void _process_mm3_per_mm_tag(const std::string& comment, size_t pos); - - // Processes width tag - void _process_width_tag(const std::string& comment, size_t pos); - - // Processes height tag - void _process_height_tag(const std::string& comment, size_t pos); - - // Processes color change tag - void _process_color_change_tag(unsigned extruder); - - // Processes pause print and custom gcode tag - void _process_pause_print_or_custom_code_tag(); - - // Processes new layer tag - void _process_end_pause_print_or_custom_code_tag(); - - void _set_units(EUnits units); - EUnits _get_units() const; - - void _set_global_positioning_type(EPositioningType type); - EPositioningType _get_global_positioning_type() const; - - void _set_e_local_positioning_type(EPositioningType type); - EPositioningType _get_e_local_positioning_type() const; - - void _set_extrusion_role(ExtrusionRole extrusion_role); - ExtrusionRole _get_extrusion_role() const; - - void _set_extruder_id(unsigned int id); - unsigned int _get_extruder_id() const; - - void _set_cp_color_id(unsigned int id); - unsigned int _get_cp_color_id() const; - - void _set_mm3_per_mm(float value); - float _get_mm3_per_mm() const; - - void _set_width(float width); - float _get_width() const; - - void _set_height(float height); - float _get_height() const; - - void _set_feedrate(float feedrate_mm_sec); - float _get_feedrate() const; - - void _set_extruder_temp(float new_temperature); - float _get_extruder_temp() const; - - void _set_fan_speed(float fan_speed_percentage); - float _get_fan_speed() const; - - void _set_layer_duration(float layer_duration_sec); - float _get_layer_duration() const; - - void _set_axis_position(EAxis axis, float position); - float _get_axis_position(EAxis axis) const; - - void _set_axis_origin(EAxis axis, float position); - float _get_axis_origin(EAxis axis) const; - - // Sets axes position to zero - void _reset_axes_position(); - // Sets origin position to zero - void _reset_axes_origin(); - - void _set_start_position(const Vec3f& position); - const Vec3f& _get_start_position() const; - - void _set_cached_position(unsigned char axis, float position); - float _get_cached_position(unsigned char axis) const; - - void _reset_cached_position(); - - void _set_start_extrusion(float extrusion); - float _get_start_extrusion() const; - float _get_delta_extrusion() const; - - // Returns current xyz position (from m_state.position[]) - Vec3f _get_end_position() const; - - // Adds a new move with the given data - void _store_move(GCodeMove::EType type); - - // Checks if the given int is a valid extrusion role (contained into enum ExtrusionRole) - bool _is_valid_extrusion_role(int value) const; - - // All the following methods throw CanceledException through print->throw_if_canceled() (sent by the caller as callback). - void _calc_gcode_preview_extrusion_layers(GCodePreviewData& preview_data, GCodeTimeEstimator& time_estimator, std::function cancel_callback); - void _calc_gcode_preview_travel(GCodePreviewData& preview_data, std::function cancel_callback); - void _calc_gcode_preview_retractions(GCodePreviewData& preview_data, std::function cancel_callback); - void _calc_gcode_preview_unretractions(GCodePreviewData& preview_data, std::function cancel_callback); -}; - -class BufferData { -public: - std::string raw; - float time; - float speed; - BufferData(std::string line, float time = 0, float speed = 0) : raw(line), time(time), speed(speed) {} -}; - -class FanMover -{ -private: - const std::regex regex_fan_speed; - const float nb_seconds_delay; - const bool with_D_option; - - // in unit/second - double current_speed; - float buffer_time_size; - GCodeReader m_parser; - int expected_fan_speed; - int current_fan_speed; - - // The output of process_layer() - std::list buffer; - std::string m_process_output; - -public: - FanMover(const float nb_seconds_delay, const bool with_D_option) : regex_fan_speed("S[0-9]+"), nb_seconds_delay(nb_seconds_delay), with_D_option(with_D_option){} - - // Adds the gcode contained in the given string to the analysis and returns it after removing the workcodes - const std::string& process_gcode(const std::string& gcode); - -private: - // Processes the given gcode line - void _process_gcode_line(GCodeReader& reader, const GCodeReader::GCodeLine& line); -}; - -} // namespace Slic3r - -#endif // !ENABLE_GCODE_VIEWER - -#endif /* slic3r_GCode_Analyzer_hpp_ */ diff --git a/src/libslic3r/GCode/FanMover.cpp b/src/libslic3r/GCode/FanMover.cpp index 5ce182dbe..1c2cdd732 100644 --- a/src/libslic3r/GCode/FanMover.cpp +++ b/src/libslic3r/GCode/FanMover.cpp @@ -215,7 +215,7 @@ void FanMover::_remove_slow_fan(int16_t min_speed, float past_sec) { void FanMover::_process_gcode_line(GCodeReader& reader, const GCodeReader::GCodeLine& line) { // processes 'normal' gcode lines - std::string cmd = line.cmd(); + std::string cmd(line.cmd()); double time = 0; int16_t fan_speed = -1; if (cmd.length() > 1) { @@ -272,7 +272,7 @@ void FanMover::_process_gcode_line(GCodeReader& reader, const GCodeReader::GCode while (it != m_buffer.end() && time_count > 0) { if (time_count - it->time < 0) { //found something that is lower than us - _put_in_middle_G1(it, time_count, BufferData{ line.cmd(), 0, fan_speed }); + _put_in_middle_G1(it, time_count, BufferData( std::string(line.cmd()), 0, fan_speed )); //found, stop break; } diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp index 305e6b158..820f7f09e 100644 --- a/src/libslic3r/GCode/GCodeProcessor.cpp +++ b/src/libslic3r/GCode/GCodeProcessor.cpp @@ -10,6 +10,11 @@ #include #include +#if __has_include() + #include + #include +#endif + #if ENABLE_GCODE_VIEWER #include @@ -171,7 +176,7 @@ void GCodeProcessor::TimeMachine::reset() prev.reset(); gcode_time.reset(); blocks = std::vector(); - g1_times_cache = std::vector(); + g1_times_cache = std::vector(); std::fill(moves_time.begin(), moves_time.end(), 0.0f); std::fill(roles_time.begin(), roles_time.end(), 0.0f); layers_time = std::vector(); @@ -293,7 +298,7 @@ void GCodeProcessor::TimeMachine::calculate_time(size_t keep_last_n_blocks) } layers_time[block.layer_id - 1] += block_time; } - g1_times_cache.push_back(time); + g1_times_cache.push_back({ block.g1_line_id, time }); } if (keep_last_n_blocks) @@ -359,7 +364,7 @@ void GCodeProcessor::TimeProcessor::post_process(const std::string& filename) std::string ret; - if (line == First_Line_M73_Placeholder_Tag || line == Last_Line_M73_Placeholder_Tag) { + if (export_remaining_time_enabled && (line == First_Line_M73_Placeholder_Tag || line == Last_Line_M73_Placeholder_Tag)) { for (size_t i = 0; i < static_cast(PrintEstimatedTimeStatistics::ETimeMode::Count); ++i) { const TimeMachine& machine = machines[i]; if (machine.enabled) { @@ -372,10 +377,11 @@ void GCodeProcessor::TimeProcessor::post_process(const std::string& filename) else if (line == Estimated_Printing_Time_Placeholder_Tag) { for (size_t i = 0; i < static_cast(PrintEstimatedTimeStatistics::ETimeMode::Count); ++i) { const TimeMachine& machine = machines[i]; - if (machine.enabled) { + PrintEstimatedTimeStatistics::ETimeMode mode = static_cast(i); + if (mode == PrintEstimatedTimeStatistics::ETimeMode::Normal || machine.enabled) { char buf[128]; sprintf(buf, "; estimated printing time (%s mode) = %s\n", - (static_cast(i) == PrintEstimatedTimeStatistics::ETimeMode::Normal) ? "normal" : "silent", + (mode == PrintEstimatedTimeStatistics::ETimeMode::Normal) ? "normal" : "silent", get_time_dhms(machine.time).c_str()); ret += buf; } @@ -395,12 +401,22 @@ void GCodeProcessor::TimeProcessor::post_process(const std::string& filename) return false; }; + // Iterators for the normal and silent cached time estimate entry recently processed, used by process_line_G1. + auto g1_times_cache_it = Slic3r::reserve_vector::const_iterator>(machines.size()); + for (const auto& machine : machines) + g1_times_cache_it.emplace_back(machine.g1_times_cache.begin()); // add lines M73 to exported gcode auto process_line_G1 = [&]() { + if (export_remaining_time_enabled) { for (size_t i = 0; i < static_cast(PrintEstimatedTimeStatistics::ETimeMode::Count); ++i) { const TimeMachine& machine = machines[i]; - if (machine.enabled && g1_lines_counter < machine.g1_times_cache.size()) { - float elapsed_time = machine.g1_times_cache[g1_lines_counter]; + if (machine.enabled) { + // Skip all machine.g1_times_cache below g1_lines_counter. + auto& it = g1_times_cache_it[i]; + while (it != machine.g1_times_cache.end() && it->id < g1_lines_counter) + ++it; + if (it != machine.g1_times_cache.end() && it->id == g1_lines_counter) { + float elapsed_time = it->elapsed_time; std::pair to_export = { int(100.0f * elapsed_time / machine.time), time_in_minutes(machine.time - elapsed_time) }; if (last_exported[i] != to_export) { @@ -410,6 +426,8 @@ void GCodeProcessor::TimeProcessor::post_process(const std::string& filename) } } } + } + } }; // helper function to write to disk @@ -470,7 +488,8 @@ void GCodeProcessor::TimeProcessor::post_process(const std::string& filename) const std::vector> GCodeProcessor::Producers = { { EProducer::PrusaSlicer, "PrusaSlicer" }, - { EProducer::SuperSlicer, "SuperSlicer" }, + { EProducer::SuperSlicer, "SuperSlicer" }, { EProducer::Slic3rPE, "Slic3r Prusa Edition" }, + { EProducer::Slic3r, "Slic3r" }, { EProducer::Cura, "Cura_SteamEngine" }, { EProducer::Simplify3D, "Simplify3D" }, { EProducer::CraftWare, "CraftWare" }, @@ -750,6 +769,7 @@ void GCodeProcessor::reset() m_filament_diameters = std::vector(Min_Extruder_Count, 1.75f); m_extruded_last_z = 0.0f; + m_g1_line_id = 0; m_layer_id = 0; m_cp_color.reset(); @@ -780,9 +800,9 @@ void GCodeProcessor::process_file(const std::string& filename, std::function 1 && detect_producer(comment)) m_parser.quit_parsing_file(); } @@ -790,7 +810,7 @@ void GCodeProcessor::process_file(const std::string& filename, std::function 1) { // process command lines switch (::toupper(cmd[0])) @@ -989,64 +1008,105 @@ void GCodeProcessor::process_gcode_line(const GCodeReader::GCodeLine& line) } } else { - std::string comment = line.comment(); - if (comment.length() > 1) - // process tags embedded into comments - process_tags(comment); + const std::string &comment = line.raw(); + if (comment.length() > 2 && comment.front() == ';') + // Process tags embedded into comments. Tag comments always start at the start of a line + // with a comment and continue with a tag without any whitespace separator. + process_tags(comment.substr(1)); } } -void GCodeProcessor::process_tags(const std::string& comment) +static inline bool starts_with(const std::string_view comment, const std::string_view tag) { - // producers tags - if (m_producers_enabled) { - if (m_producer != EProducer::Unknown) { - if (process_producers_tags(comment)) - return; + size_t tag_len = tag.size(); + return comment.size() >= tag_len && comment.substr(0, tag_len) == tag; + } + +#if __has_include() + template + struct is_from_chars_convertible : std::false_type {}; + template + struct is_from_chars_convertible(), std::declval(), std::declval()))>> : std::true_type {}; +#endif + +// Returns true if the number was parsed correctly into out and the number spanned the whole input string. +template +[[nodiscard]] static inline bool parse_number(const std::string_view sv, T &out) +{ + // https://www.bfilipek.com/2019/07/detect-overload-from-chars.html#example-stdfromchars +#if __has_include() + // Visual Studio 19 supports from_chars all right. + // OSX compiler that we use only implements std::from_chars just for ints. + // GCC that we compile on does not provide at all. + if constexpr (is_from_chars_convertible::value) { + auto str_end = sv.data() + sv.size(); + auto [end_ptr, error_code] = std::from_chars(sv.data(), str_end, out); + return error_code == std::errc() && end_ptr == str_end; + } + else +#endif + { + // Legacy conversion, which is costly due to having to make a copy of the string before conversion. + try { + assert(sv.size() < 1024); + assert(sv.data() != nullptr); + std::string str { sv }; + size_t read = 0; + if constexpr (std::is_same_v) + out = std::stoi(str, &read); + else if constexpr (std::is_same_v) + out = std::stol(str, &read); + else if constexpr (std::is_same_v) + out = std::stof(str, &read); + else if constexpr (std::is_same_v) + out = std::stod(str, &read); + return str.size() == read; + } catch (...) { + return false; } } +} + +void GCodeProcessor::process_tags(const std::string_view comment) +{ + // producers tags + if (m_producers_enabled && process_producers_tags(comment)) + return; // extrusion role tag - size_t pos = comment.find(Extrusion_Role_Tag); - if (pos != comment.npos) { - m_extrusion_role = ExtrusionEntity::string_to_role(comment.substr(pos + Extrusion_Role_Tag.length())); + if (starts_with(comment, Extrusion_Role_Tag)) { + m_extrusion_role = ExtrusionEntity::string_to_role(comment.substr(Extrusion_Role_Tag.length())); return; } - if (!m_producers_enabled || m_producer == EProducer::PrusaSlicer || m_producer == EProducer::SuperSlicer) { + if ( (!m_producers_enabled || m_producer == EProducer::PrusaSlicer || m_producer == EProducer::SuperSlicer) && + starts_with(comment, Height_Tag)) { // height tag - pos = comment.find(Height_Tag); - if (pos != comment.npos) { - try { - m_height = std::stof(comment.substr(pos + Height_Tag.length())); - } - catch (...) { + if (! parse_number(comment.substr(Height_Tag.size()), m_height)) BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Height (" << comment << ")."; - } return; } - } #if ENABLE_GCODE_VIEWER_DATA_CHECKING // width tag - pos = comment.find(Width_Tag); - if (pos != comment.npos) { - try { - m_width_compare.last_tag_value = std::stof(comment.substr(pos + Width_Tag.length())); - } - catch (...) { + if (starts_with(comment, Width_Tag)) { + if (! parse_number(comment.substr(Width_Tag.size()), m_width_compare.last_tag_value)) BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Width (" << comment << ")."; - } return; } #endif // ENABLE_GCODE_VIEWER_DATA_CHECKING // color change tag - pos = comment.find(Color_Change_Tag); - if (pos != comment.npos) { - pos = comment.find_last_of(",T"); - try { - unsigned char extruder_id = (pos == comment.npos) ? 0 : static_cast(std::stoi(comment.substr(pos + 1))); + if (starts_with(comment, Color_Change_Tag)) { + unsigned char extruder_id = 0; + if (starts_with(comment.substr(Color_Change_Tag.size()), ",T")) { + int eid; + if (! parse_number(comment.substr(Color_Change_Tag.size() + 2), eid) || eid < 0 || eid > 255) { + BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Color_Change (" << comment << ")."; + return; + } + extruder_id = static_cast(eid); + } m_extruder_colors[extruder_id] = static_cast(m_extruder_offsets.size()) + m_cp_color.counter; // color_change position in list of color for preview ++m_cp_color.counter; @@ -1059,52 +1119,40 @@ void GCodeProcessor::process_tags(const std::string& comment) } process_custom_gcode_time(CustomGCode::ColorChange); - } - catch (...) { - BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Color_Change (" << comment << ")."; - } return; } // pause print tag - pos = comment.find(Pause_Print_Tag); - if (pos != comment.npos) { + if (comment == Pause_Print_Tag) { store_move_vertex(EMoveType::Pause_Print); process_custom_gcode_time(CustomGCode::PausePrint); return; } // custom code tag - pos = comment.find(Custom_Code_Tag); - if (pos != comment.npos) { + if (comment == Custom_Code_Tag) { store_move_vertex(EMoveType::Custom_GCode); return; } #if ENABLE_GCODE_VIEWER_DATA_CHECKING // mm3_per_mm print tag - pos = comment.find(Mm3_Per_Mm_Tag); - if (pos != comment.npos) { - try { - m_mm3_per_mm_compare.last_tag_value = std::stof(comment.substr(pos + Mm3_Per_Mm_Tag.length())); - } - catch (...) { + if (starts_with(comment, Mm3_Per_Mm_Tag)) { + if (! parse_number(comment.substr(Mm3_Per_Mm_Tag.size()), m_mm3_per_mm_compare.last_tag_value)) BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Mm3_Per_Mm (" << comment << ")."; - } return; } #endif // ENABLE_GCODE_VIEWER_DATA_CHECKING // layer change tag - pos = comment.find(Layer_Change_Tag); - if (pos != comment.npos) { + if (comment == Layer_Change_Tag) { ++m_layer_id; return; } } -bool GCodeProcessor::process_producers_tags(const std::string& comment) +bool GCodeProcessor::process_producers_tags(const std::string_view comment) { switch (m_producer) { @@ -1118,18 +1166,18 @@ bool GCodeProcessor::process_producers_tags(const std::string& comment) } } -bool GCodeProcessor::process_prusaslicer_tags(const std::string& comment) +bool GCodeProcessor::process_prusaslicer_tags(const std::string_view comment) { return false; } -bool GCodeProcessor::process_cura_tags(const std::string& comment) +bool GCodeProcessor::process_cura_tags(const std::string_view comment) { // TYPE -> extrusion role std::string tag = "TYPE:"; size_t pos = comment.find(tag); if (pos != comment.npos) { - std::string type = comment.substr(pos + tag.length()); + const std::string_view type = comment.substr(pos + tag.length()); if (type == "SKIRT") m_extrusion_role = erSkirt; else if (type == "WALL-OUTER") @@ -1158,7 +1206,7 @@ bool GCodeProcessor::process_cura_tags(const std::string& comment) tag = "FLAVOR:"; pos = comment.find(tag); if (pos != comment.npos) { - std::string flavor = comment.substr(pos + tag.length()); + const std::string_view flavor = comment.substr(pos + tag.length()); if (flavor == "BFB") m_flavor = gcfMarlin; // << ??????????????????????? else if (flavor == "Mach3") @@ -1188,7 +1236,7 @@ bool GCodeProcessor::process_cura_tags(const std::string& comment) return false; } -bool GCodeProcessor::process_simplify3d_tags(const std::string& comment) +bool GCodeProcessor::process_simplify3d_tags(const std::string_view comment) { // extrusion roles @@ -1276,7 +1324,7 @@ bool GCodeProcessor::process_simplify3d_tags(const std::string& comment) std::string tag = " tool"; pos = comment.find(tag); if (pos == 0) { - std::string data = comment.substr(pos + tag.length()); + const std::string_view data = comment.substr(pos + tag.length()); std::string h_tag = "H"; size_t h_start = data.find(h_tag); size_t h_end = data.find_first_of(' ', h_start); @@ -1284,21 +1332,13 @@ bool GCodeProcessor::process_simplify3d_tags(const std::string& comment) size_t w_start = data.find(w_tag); size_t w_end = data.find_first_of(' ', w_start); if (h_start != data.npos) { - try { - m_height_compare.last_tag_value = std::stof(data.substr(h_start + 1, (h_end != data.npos) ? h_end - h_start - 1 : h_end)); - } - catch (...) { + if (! parse_number(data.substr(h_start + 1, (h_end != data.npos) ? h_end - h_start - 1 : h_end), m_height_compare.last_tag_value)) BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Height (" << comment << ")."; } - } if (w_start != data.npos) { - try { - m_width_compare.last_tag_value = std::stof(data.substr(w_start + 1, (w_end != data.npos) ? w_end - w_start - 1 : w_end)); - } - catch (...) { + if (! parse_number(data.substr(w_start + 1, (w_end != data.npos) ? w_end - w_start - 1 : w_end), m_width_compare.last_tag_value)) BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Width (" << comment << ")."; } - } return true; } @@ -1307,13 +1347,13 @@ bool GCodeProcessor::process_simplify3d_tags(const std::string& comment) return false; } -bool GCodeProcessor::process_craftware_tags(const std::string& comment) +bool GCodeProcessor::process_craftware_tags(const std::string_view comment) { // segType -> extrusion role std::string tag = "segType:"; size_t pos = comment.find(tag); if (pos != comment.npos) { - std::string type = comment.substr(pos + tag.length()); + const std::string_view type = comment.substr(pos + tag.length()); if (type == "Skirt") m_extrusion_role = erSkirt; else if (type == "Perimeter") @@ -1347,13 +1387,13 @@ bool GCodeProcessor::process_craftware_tags(const std::string& comment) return false; } -bool GCodeProcessor::process_ideamaker_tags(const std::string& comment) +bool GCodeProcessor::process_ideamaker_tags(const std::string_view comment) { // TYPE -> extrusion role std::string tag = "TYPE:"; size_t pos = comment.find(tag); if (pos != comment.npos) { - std::string type = comment.substr(pos + tag.length()); + const std::string_view type = comment.substr(pos + tag.length()); if (type == "RAFT") m_extrusion_role = erSkirt; else if (type == "WALL-OUTER") @@ -1382,12 +1422,8 @@ bool GCodeProcessor::process_ideamaker_tags(const std::string& comment) tag = "WIDTH:"; pos = comment.find(tag); if (pos != comment.npos) { - try { - m_width_compare.last_tag_value = std::stof(comment.substr(pos + tag.length())); - } - catch (...) { + if (! parse_number(comment.substr(pos + tag.length()), m_width_compare.last_tag_value)) BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Width (" << comment << ")."; - } return true; } @@ -1395,12 +1431,8 @@ bool GCodeProcessor::process_ideamaker_tags(const std::string& comment) tag = "HEIGHT:"; pos = comment.find(tag); if (pos != comment.npos) { - try { - m_height_compare.last_tag_value = std::stof(comment.substr(pos + tag.length())); - } - catch (...) { + if (! parse_number(comment.substr(pos + tag.length()), m_height_compare.last_tag_value)) BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Height (" << comment << ")."; - } return true; } #endif // ENABLE_GCODE_VIEWER_DATA_CHECKING @@ -1408,7 +1440,7 @@ bool GCodeProcessor::process_ideamaker_tags(const std::string& comment) return false; } -bool GCodeProcessor::detect_producer(const std::string& comment) +bool GCodeProcessor::detect_producer(const std::string_view comment) { for (const auto& [id, search_string] : Producers) { size_t pos = comment.find(search_string); @@ -1460,6 +1492,8 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line) return type; }; + ++m_g1_line_id; + // enable processing of lines M201/M203/M204/M205 m_time_processor.machine_envelope_processing_enabled = true; @@ -1565,6 +1599,7 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line) block.move_type = type; block.role = m_extrusion_role; block.distance = distance; + block.g1_line_id = m_g1_line_id; block.layer_id = m_layer_id; // calculates block cruise feedrate @@ -2074,11 +2109,14 @@ void GCodeProcessor::process_T(const GCodeReader::GCodeLine& line) process_T(line.cmd()); } -void GCodeProcessor::process_T(const std::string& command) +void GCodeProcessor::process_T(const std::string_view command) { if (command.length() > 1) { - try { - unsigned char id = static_cast(std::stoi(command.substr(1))); + int eid; + if (! parse_number(command.substr(1), eid) || eid < 0 || eid > 255) { + BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid toolchange (" << command << ")."; + } else { + unsigned char id = static_cast(eid); if (m_extruder_id != id) { unsigned char extruders_count = static_cast(m_extruder_offsets.size()); if (id >= extruders_count) @@ -2100,11 +2138,8 @@ void GCodeProcessor::process_T(const std::string& command) store_move_vertex(EMoveType::Tool_change); } } - catch (...) { - BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid toolchange (" << command << ")."; } } -} void GCodeProcessor::store_move_vertex(EMoveType type) { diff --git a/src/libslic3r/GCode/GCodeProcessor.hpp b/src/libslic3r/GCode/GCodeProcessor.hpp index 99f5d5c15..4ad4de79e 100644 --- a/src/libslic3r/GCode/GCodeProcessor.hpp +++ b/src/libslic3r/GCode/GCodeProcessor.hpp @@ -11,6 +11,7 @@ #include #include #include +#include namespace Slic3r { @@ -145,6 +146,7 @@ namespace Slic3r { EMoveType move_type{ EMoveType::Noop }; ExtrusionRole role{ erNone }; + unsigned int g1_line_id{ 0 }; unsigned int layer_id{ 0 }; float distance{ 0.0f }; // mm float acceleration{ 0.0f }; // mm/s^2 @@ -182,6 +184,12 @@ namespace Slic3r { void reset(); }; + struct G1LinesCacheItem + { + unsigned int id; + float elapsed_time; + }; + bool enabled; float acceleration; // mm/s^2 // hard limit for the acceleration, to which the firmware will clamp. @@ -194,7 +202,7 @@ namespace Slic3r { State prev; CustomGCodeTime gcode_time; std::vector blocks; - std::vector g1_times_cache; + std::vector g1_times_cache; std::array(EMoveType::Count)> moves_time; std::array(ExtrusionRole::erCount)> roles_time; std::vector layers_time; @@ -380,6 +388,7 @@ namespace Slic3r { ExtruderColors m_extruder_colors; std::vector m_filament_diameters; float m_extruded_last_z; + unsigned int m_g1_line_id; unsigned int m_layer_id; CpColor m_cp_color; float m_temperature; @@ -388,7 +397,8 @@ namespace Slic3r { { Unknown, PrusaSlicer, - SuperSlicer, + SuperSlicer, Slic3rPE, + Slic3r, Cura, Simplify3D, CraftWare, @@ -442,15 +452,15 @@ namespace Slic3r { void process_gcode_line(const GCodeReader::GCodeLine& line); // Process tags embedded into comments - void process_tags(const std::string& comment); - bool process_producers_tags(const std::string& comment); - bool process_prusaslicer_tags(const std::string& comment); - bool process_cura_tags(const std::string& comment); - bool process_simplify3d_tags(const std::string& comment); - bool process_craftware_tags(const std::string& comment); - bool process_ideamaker_tags(const std::string& comment); + void process_tags(const std::string_view comment); + bool process_producers_tags(const std::string_view comment); + bool process_prusaslicer_tags(const std::string_view comment); + bool process_cura_tags(const std::string_view comment); + bool process_simplify3d_tags(const std::string_view comment); + bool process_craftware_tags(const std::string_view comment); + bool process_ideamaker_tags(const std::string_view comment); - bool detect_producer(const std::string& comment); + bool detect_producer(const std::string_view comment); // Move void process_G0(const GCodeReader::GCodeLine& line); @@ -539,7 +549,7 @@ namespace Slic3r { // Processes T line (Select Tool) void process_T(const GCodeReader::GCodeLine& line); - void process_T(const std::string& command); + void process_T(const std::string_view command); void store_move_vertex(EMoveType type); diff --git a/src/libslic3r/GCode/PressureEqualizer.cpp b/src/libslic3r/GCode/PressureEqualizer.cpp index 33601e5e9..c3f084a24 100644 --- a/src/libslic3r/GCode/PressureEqualizer.cpp +++ b/src/libslic3r/GCode/PressureEqualizer.cpp @@ -165,9 +165,10 @@ static inline float parse_float(const char *&line) return result; }; -#define EXTRUSION_ROLE_TAG ";_EXTRUSION_ROLE:" bool PressureEqualizer::process_line(const char *line, const size_t len, GCodeLine &buf) { + static constexpr const char *EXTRUSION_ROLE_TAG = ";_EXTRUSION_ROLE:"; + if (strncmp(line, EXTRUSION_ROLE_TAG, strlen(EXTRUSION_ROLE_TAG)) == 0) { line += strlen(EXTRUSION_ROLE_TAG); int role = atoi(line); diff --git a/src/libslic3r/GCode/PreviewData.cpp b/src/libslic3r/GCode/PreviewData.cpp index 8c4735528..4c801cb2b 100644 --- a/src/libslic3r/GCode/PreviewData.cpp +++ b/src/libslic3r/GCode/PreviewData.cpp @@ -1,4 +1,3 @@ -#include "Analyzer.hpp" #include "PreviewData.hpp" #include #include "Utils.hpp" diff --git a/src/libslic3r/GCodeReader.hpp b/src/libslic3r/GCodeReader.hpp index 7e0793cd9..8d835185e 100644 --- a/src/libslic3r/GCodeReader.hpp +++ b/src/libslic3r/GCodeReader.hpp @@ -6,6 +6,7 @@ #include #include #include +#include #include "PrintConfig.hpp" namespace Slic3r { @@ -17,13 +18,13 @@ public: GCodeLine() { reset(); } void reset() { m_mask = 0; memset(m_axis, 0, sizeof(m_axis)); m_raw.clear(); } - const std::string& raw() const { return m_raw; } - const std::string cmd() const { + const std::string& raw() const { return m_raw; } + const std::string_view cmd() const { const char *cmd = GCodeReader::skip_whitespaces(m_raw.c_str()); - return std::string(cmd, GCodeReader::skip_word(cmd)); + return std::string_view(cmd, GCodeReader::skip_word(cmd) - cmd); } - const std::string comment() const - { size_t pos = m_raw.find(';'); return (pos == std::string::npos) ? "" : m_raw.substr(pos + 1); } + const std::string_view comment() const + { size_t pos = m_raw.find(';'); return (pos == std::string::npos) ? std::string_view() : std::string_view(m_raw).substr(pos + 1); } bool has(Axis axis) const { return (m_mask & (1 << int(axis))) != 0; } float value(Axis axis) const { return m_axis[axis]; } diff --git a/src/libslic3r/GCodeTimeEstimator.cpp b/src/libslic3r/GCodeTimeEstimator.cpp deleted file mode 100644 index a16608dd9..000000000 --- a/src/libslic3r/GCodeTimeEstimator.cpp +++ /dev/null @@ -1,1768 +0,0 @@ -#include "Exception.hpp" -#include "GCodeTimeEstimator.hpp" -#include "Utils.hpp" -#include -#include - -#include - -#include -#include -#include - -#if !ENABLE_GCODE_VIEWER - -static const float MMMIN_TO_MMSEC = 1.0f / 60.0f; -static const float MILLISEC_TO_SEC = 0.001f; -static const float INCHES_TO_MM = 25.4f; - -static const float DEFAULT_FEEDRATE = 1500.0f; // from Prusa Firmware (Marlin_main.cpp) -static const float DEFAULT_ACCELERATION = 1500.0f; // Prusa Firmware 1_75mm_MK2 -static const float DEFAULT_RETRACT_ACCELERATION = 1500.0f; // Prusa Firmware 1_75mm_MK2 -static const float DEFAULT_AXIS_MAX_FEEDRATE[] = { 500.0f, 500.0f, 12.0f, 120.0f }; // Prusa Firmware 1_75mm_MK2 -static const float DEFAULT_AXIS_MAX_ACCELERATION[] = { 9000.0f, 9000.0f, 500.0f, 10000.0f }; // Prusa Firmware 1_75mm_MK2 -static const float DEFAULT_AXIS_MAX_JERK[] = { 10.0f, 10.0f, 0.4f, 2.5f }; // from Prusa Firmware (Configuration.h) -static const float DEFAULT_MINIMUM_FEEDRATE = 0.0f; // from Prusa Firmware (Configuration_adv.h) -static const float DEFAULT_MINIMUM_TRAVEL_FEEDRATE = 0.0f; // from Prusa Firmware (Configuration_adv.h) -static const float DEFAULT_EXTRUDE_FACTOR_OVERRIDE_PERCENTAGE = 1.0f; // 100 percent - -static const float PREVIOUS_FEEDRATE_THRESHOLD = 0.0001f; - -#if ENABLE_MOVE_STATS -static const std::string MOVE_TYPE_STR[Slic3r::GCodeTimeEstimator::Block::Num_Types] = -{ - "Noop", - "Retract", - "Unretract", - "Tool_change", - "Move", - "Extrude" -}; -#endif // ENABLE_MOVE_STATS - -namespace Slic3r { - void GCodeTimeEstimator::Feedrates::reset() - { - feedrate = 0.0f; - safe_feedrate = 0.0f; - ::memset(axis_feedrate, 0, Num_Axis * sizeof(float)); - ::memset(abs_axis_feedrate, 0, Num_Axis * sizeof(float)); - } - - float GCodeTimeEstimator::Block::Trapezoid::acceleration_time(float entry_feedrate, float acceleration) const - { - return acceleration_time_from_distance(entry_feedrate, accelerate_until, acceleration); - } - - float GCodeTimeEstimator::Block::Trapezoid::cruise_time() const - { - return (cruise_feedrate != 0.0f) ? cruise_distance() / cruise_feedrate : 0.0f; - } - - float GCodeTimeEstimator::Block::Trapezoid::deceleration_time(float distance, float acceleration) const - { - return acceleration_time_from_distance(cruise_feedrate, (distance - decelerate_after), -acceleration); - } - - float GCodeTimeEstimator::Block::Trapezoid::cruise_distance() const - { - return decelerate_after - accelerate_until; - } - - float GCodeTimeEstimator::Block::Trapezoid::acceleration_time_from_distance(float initial_feedrate, float distance, float acceleration) - { - return (acceleration != 0.0f) ? (speed_from_distance(initial_feedrate, distance, acceleration) - initial_feedrate) / acceleration : 0.0f; - } - - float GCodeTimeEstimator::Block::Trapezoid::speed_from_distance(float initial_feedrate, float distance, float acceleration) - { - // to avoid invalid negative numbers due to numerical imprecision - float value = std::max(0.0f, sqr(initial_feedrate) + 2.0f * acceleration * distance); - return ::sqrt(value); - } - - float GCodeTimeEstimator::Block::acceleration_time() const - { - return trapezoid.acceleration_time(feedrate.entry, acceleration); - } - - float GCodeTimeEstimator::Block::cruise_time() const - { - return trapezoid.cruise_time(); - } - - float GCodeTimeEstimator::Block::deceleration_time() const - { - return trapezoid.deceleration_time(distance, acceleration); - } - - float GCodeTimeEstimator::Block::cruise_distance() const - { - return trapezoid.cruise_distance(); - } - - void GCodeTimeEstimator::Block::calculate_trapezoid() - { - trapezoid.cruise_feedrate = feedrate.cruise; - - float accelerate_distance = std::max(0.0f, estimate_acceleration_distance(feedrate.entry, feedrate.cruise, acceleration)); - float decelerate_distance = std::max(0.0f, estimate_acceleration_distance(feedrate.cruise, feedrate.exit, -acceleration)); - float cruise_distance = distance - accelerate_distance - decelerate_distance; - - // Not enough space to reach the nominal feedrate. - // This means no cruising, and we'll have to use intersection_distance() to calculate when to abort acceleration - // and start braking in order to reach the exit_feedrate exactly at the end of this block. - if (cruise_distance < 0.0f) - { - accelerate_distance = std::clamp(intersection_distance(feedrate.entry, feedrate.exit, acceleration, distance), 0.0f, distance); - cruise_distance = 0.0f; - trapezoid.cruise_feedrate = Trapezoid::speed_from_distance(feedrate.entry, accelerate_distance, acceleration); - } - - trapezoid.accelerate_until = accelerate_distance; - trapezoid.decelerate_after = accelerate_distance + cruise_distance; - } - - float GCodeTimeEstimator::Block::max_allowable_speed(float acceleration, float target_velocity, float distance) - { - // to avoid invalid negative numbers due to numerical imprecision - float value = std::max(0.0f, sqr(target_velocity) - 2.0f * acceleration * distance); - return ::sqrt(value); - } - - float GCodeTimeEstimator::Block::estimate_acceleration_distance(float initial_rate, float target_rate, float acceleration) - { - return (acceleration == 0.0f) ? 0.0f : (sqr(target_rate) - sqr(initial_rate)) / (2.0f * acceleration); - } - - float GCodeTimeEstimator::Block::intersection_distance(float initial_rate, float final_rate, float acceleration, float distance) - { - return (acceleration == 0.0f) ? 0.0f : (2.0f * acceleration * distance - sqr(initial_rate) + sqr(final_rate)) / (4.0f * acceleration); - } - -#if ENABLE_MOVE_STATS - GCodeTimeEstimator::MoveStats::MoveStats() - : count(0) - , time(0.0f) - { - } -#endif // ENABLE_MOVE_STATS - - const std::string GCodeTimeEstimator::Normal_First_M73_Output_Placeholder_Tag = "; _TE_NORMAL_FIRST_M73_OUTPUT_PLACEHOLDER"; - const std::string GCodeTimeEstimator::Silent_First_M73_Output_Placeholder_Tag = "; _TE_SILENT_FIRST_M73_OUTPUT_PLACEHOLDER"; - const std::string GCodeTimeEstimator::Normal_Last_M73_Output_Placeholder_Tag = "; _TE_NORMAL_LAST_M73_OUTPUT_PLACEHOLDER"; - const std::string GCodeTimeEstimator::Silent_Last_M73_Output_Placeholder_Tag = "; _TE_SILENT_LAST_M73_OUTPUT_PLACEHOLDER"; - - const std::string GCodeTimeEstimator::Color_Change_Tag = "PRINT_COLOR_CHANGE"; - const std::string GCodeTimeEstimator::Pause_Print_Tag = "PRINT_PAUSE"; - - GCodeTimeEstimator::GCodeTimeEstimator(EMode mode) - : m_mode(mode) - { - reset(); - set_default(); - } - - void GCodeTimeEstimator::add_gcode_line(const std::string& gcode_line) - { - PROFILE_FUNC(); - m_parser.parse_line(gcode_line, - [this](GCodeReader &reader, const GCodeReader::GCodeLine &line) - { this->_process_gcode_line(reader, line); }); - } - - void GCodeTimeEstimator::add_gcode_block(const char *ptr) - { - PROFILE_FUNC(); - GCodeReader::GCodeLine gline; - auto action = [this](GCodeReader &reader, const GCodeReader::GCodeLine &line) - { this->_process_gcode_line(reader, line); }; - for (; *ptr != 0;) { - gline.reset(); - ptr = m_parser.parse_line(ptr, gline, action); - } - } - - void GCodeTimeEstimator::calculate_time(bool start_from_beginning) - { - PROFILE_FUNC(); - if (start_from_beginning) - _reset_time(); - _calculate_time(0); - - if (m_needs_custom_gcode_times && (m_custom_gcode_time_cache != 0.0f)) - m_custom_gcode_times.push_back({CustomGCode::ColorChange, m_custom_gcode_time_cache }); - -#if ENABLE_MOVE_STATS - _log_moves_stats(); -#endif // ENABLE_MOVE_STATS - } - -#if 0 - void GCodeTimeEstimator::calculate_time_from_text(const std::string& gcode) - { - reset(); - - m_parser.parse_buffer(gcode, - [this](GCodeReader &reader, const GCodeReader::GCodeLine &line) - { this->_process_gcode_line(reader, line); }); - - _calculate_time(0); - - if (m_needs_custom_gcode_times && (m_custom_gcode_time_cache != 0.0f)) - m_custom_gcode_times.push_back({ cgtColorChange, m_custom_gcode_time_cache }); - -#if ENABLE_MOVE_STATS - _log_moves_stats(); -#endif // ENABLE_MOVE_STATS - } - - void GCodeTimeEstimator::calculate_time_from_file(const std::string& file) - { - reset(); - - m_parser.parse_file(file, boost::bind(&GCodeTimeEstimator::_process_gcode_line, this, _1, _2)); - _calculate_time(0); - - if (m_needs_custom_gcode_times && (m_custom_gcode_time_cache != 0.0f)) - m_custom_gcode_times.push_back({ cgtColorChange, m_custom_gcode_time_cache }); - -#if ENABLE_MOVE_STATS - _log_moves_stats(); -#endif // ENABLE_MOVE_STATS - } - - void GCodeTimeEstimator::calculate_time_from_lines(const std::vector& gcode_lines) - { - reset(); - - auto action = [this](GCodeReader &reader, const GCodeReader::GCodeLine &line) - { this->_process_gcode_line(reader, line); }; - for (const std::string& line : gcode_lines) - m_parser.parse_line(line, action); - _calculate_time(0); - - if (m_needs_custom_gcode_times && (m_custom_gcode_time_cache != 0.0f)) - m_custom_gcode_times.push_back({ cgtColorChange, m_custom_gcode_time_cache}); - -#if ENABLE_MOVE_STATS - _log_moves_stats(); -#endif // ENABLE_MOVE_STATS - } -#endif - - bool GCodeTimeEstimator::post_process(const std::string& filename, float interval_sec, const PostProcessData* const normal_mode, const PostProcessData* const silent_mode) - { - boost::nowide::ifstream in(filename); - if (!in.good()) - throw Slic3r::RuntimeError(std::string("Time estimator post process export failed.\nCannot open file for reading.\n")); - - std::string path_tmp = filename + ".postprocess"; - - FILE* out = boost::nowide::fopen(path_tmp.c_str(), "wb"); - if (out == nullptr) - throw Slic3r::RuntimeError(std::string("Time estimator post process export failed.\nCannot open file for writing.\n")); - - std::string normal_time_mask = "M73 P%s R%s\n"; - std::string silent_time_mask = "M73 Q%s S%s\n"; - char line_M73[64]; - - std::string gcode_line; - // buffer line to export only when greater than 64K to reduce writing calls - std::string export_line; - - // helper function to write to disk - auto write_string = [&](const std::string& str) { - fwrite((const void*)export_line.c_str(), 1, export_line.length(), out); - if (ferror(out)) - { - in.close(); - fclose(out); - boost::nowide::remove(path_tmp.c_str()); - throw Slic3r::RuntimeError(std::string("Time estimator post process export failed.\nIs the disk full?\n")); - } - export_line.clear(); - }; - - GCodeReader parser; - int g1_lines_count = 0; - int normal_g1_line_id = 0; - float normal_last_recorded_time = 0.0f; - int silent_g1_line_id = 0; - float silent_last_recorded_time = 0.0f; - - // helper function to process g1 lines - auto process_g1_line = [&](const PostProcessData* const data, const GCodeReader::GCodeLine& line, int& g1_line_id, float& last_recorded_time, const std::string& time_mask) { - if (data == nullptr) - return; - - assert((g1_line_id >= (int)data->g1_times.size()) || (data->g1_times[g1_line_id].first >= (int)g1_lines_count)); - float elapsed_time = -1.0f; - if (g1_line_id < (int)data->g1_times.size()) - { - const G1LineIdTime& map_item = data->g1_times[g1_line_id]; - if (map_item.first == g1_lines_count) - { - if (line.has_e()) - elapsed_time = map_item.second; - ++g1_line_id; - } - } - - if (elapsed_time != -1.0f) - { - float block_remaining_time = data->time - elapsed_time; - if (std::abs(last_recorded_time - block_remaining_time) > interval_sec) - { - sprintf(line_M73, time_mask.c_str(), std::to_string((int)(100.0f * elapsed_time / data->time)).c_str(), _get_time_minutes(block_remaining_time).c_str()); - gcode_line += line_M73; - - last_recorded_time = block_remaining_time; - } - } - }; - - while (std::getline(in, gcode_line)) - { - if (!in.good()) - { - fclose(out); - throw Slic3r::RuntimeError(std::string("Time estimator post process export failed.\nError while reading from file.\n")); - } - - // check tags - // remove Color_Change_Tag and Pause_Print_Tag - if (gcode_line == "; " + Color_Change_Tag || gcode_line == "; " + Pause_Print_Tag) - continue; - - // replaces placeholders for initial line M73 with the real lines - if ((normal_mode != nullptr) && (gcode_line == Normal_First_M73_Output_Placeholder_Tag)) - { - sprintf(line_M73, normal_time_mask.c_str(), "0", _get_time_minutes(normal_mode->time).c_str()); - gcode_line = line_M73; - } - else if ((silent_mode != nullptr) && (gcode_line == Silent_First_M73_Output_Placeholder_Tag)) - { - sprintf(line_M73, silent_time_mask.c_str(), "0", _get_time_minutes(silent_mode->time).c_str()); - gcode_line = line_M73; - } - // replaces placeholders for final line M73 with the real lines - else if ((normal_mode != nullptr) && (gcode_line == Normal_Last_M73_Output_Placeholder_Tag)) - { - sprintf(line_M73, normal_time_mask.c_str(), "100", "0"); - gcode_line = line_M73; - } - else if ((silent_mode != nullptr) && (gcode_line == Silent_Last_M73_Output_Placeholder_Tag)) - { - sprintf(line_M73, silent_time_mask.c_str(), "100", "0"); - gcode_line = line_M73; - } - else - gcode_line += "\n"; - - // add remaining time lines where needed - parser.parse_line(gcode_line, - [&](GCodeReader& reader, const GCodeReader::GCodeLine& line) - { - if (line.cmd_is("G1")) - { - ++g1_lines_count; - process_g1_line(silent_mode, line, silent_g1_line_id, silent_last_recorded_time, silent_time_mask); - process_g1_line(normal_mode, line, normal_g1_line_id, normal_last_recorded_time, normal_time_mask); - } - }); - - export_line += gcode_line; - if (export_line.length() > 65535) - write_string(export_line); - } - - if (!export_line.empty()) - write_string(export_line); - - fclose(out); - in.close(); - - if (rename_file(path_tmp, filename)) - throw Slic3r::RuntimeError(std::string("Failed to rename the output G-code file from ") + path_tmp + " to " + filename + '\n' + - "Is " + path_tmp + " locked?" + '\n'); - - return true; - } - - void GCodeTimeEstimator::set_axis_position(EAxis axis, float position) - { - m_state.axis[axis].position = position; - } - - void GCodeTimeEstimator::set_axis_origin(EAxis axis, float position) - { - m_state.axis[axis].origin = position; - } - - void GCodeTimeEstimator::set_axis_max_feedrate(EAxis axis, float feedrate_mm_sec) - { - m_state.axis[axis].max_feedrate = feedrate_mm_sec; - } - - void GCodeTimeEstimator::set_axis_max_acceleration(EAxis axis, float acceleration) - { - m_state.axis[axis].max_acceleration = acceleration; - } - - void GCodeTimeEstimator::set_axis_max_jerk(EAxis axis, float jerk) - { - m_state.axis[axis].max_jerk = jerk; - } - - float GCodeTimeEstimator::get_axis_position(EAxis axis) const - { - return m_state.axis[axis].position; - } - - float GCodeTimeEstimator::get_axis_origin(EAxis axis) const - { - return m_state.axis[axis].origin; - } - - float GCodeTimeEstimator::get_axis_max_feedrate(EAxis axis) const - { - return m_state.axis[axis].max_feedrate; - } - - float GCodeTimeEstimator::get_axis_max_acceleration(EAxis axis) const - { - return m_state.axis[axis].max_acceleration; - } - - float GCodeTimeEstimator::get_axis_max_jerk(EAxis axis) const - { - return m_state.axis[axis].max_jerk; - } - - void GCodeTimeEstimator::set_feedrate(float feedrate_mm_sec) - { - m_state.feedrate = feedrate_mm_sec; - } - - float GCodeTimeEstimator::get_feedrate() const - { - return m_state.feedrate; - } - - void GCodeTimeEstimator::set_acceleration(float acceleration_mm_sec2) - { - m_state.acceleration = (m_state.max_acceleration == 0) ? - acceleration_mm_sec2 : - // Clamp the acceleration with the maximum. - std::min(m_state.max_acceleration, acceleration_mm_sec2); - } - - float GCodeTimeEstimator::get_acceleration() const - { - return m_state.acceleration; - } - - void GCodeTimeEstimator::set_max_acceleration(float acceleration_mm_sec2) - { - m_state.max_acceleration = acceleration_mm_sec2; - if (acceleration_mm_sec2 > 0) - m_state.acceleration = acceleration_mm_sec2; - } - - float GCodeTimeEstimator::get_max_acceleration() const - { - return m_state.max_acceleration; - } - - void GCodeTimeEstimator::set_max_travel_acceleration(float acceleration_mm_sec2) - { - m_state.max_travel_acceleration = acceleration_mm_sec2; - if (acceleration_mm_sec2 > 0) - m_state.travel_acceleration = acceleration_mm_sec2; - } - - float GCodeTimeEstimator::get_max_travel_acceleration() const - { - return m_state.max_travel_acceleration; - } - - void GCodeTimeEstimator::set_travel_acceleration(float acceleration_mm_sec2) - { - m_state.travel_acceleration = (m_state.max_travel_acceleration == 0) ? - acceleration_mm_sec2 : - // Clamp the acceleration with the maximum. - std::min(m_state.max_travel_acceleration, acceleration_mm_sec2); - } - - float GCodeTimeEstimator::get_travel_acceleration() const - { - return m_state.travel_acceleration; - } - - void GCodeTimeEstimator::set_retract_acceleration(float acceleration_mm_sec2) - { - m_state.retract_acceleration = acceleration_mm_sec2; - } - - float GCodeTimeEstimator::get_retract_acceleration() const - { - return m_state.retract_acceleration; - } - - void GCodeTimeEstimator::set_minimum_feedrate(float feedrate_mm_sec) - { - m_state.minimum_feedrate = feedrate_mm_sec; - } - - float GCodeTimeEstimator::get_minimum_feedrate() const - { - return m_state.minimum_feedrate; - } - - void GCodeTimeEstimator::set_minimum_travel_feedrate(float feedrate_mm_sec) - { - m_state.minimum_travel_feedrate = feedrate_mm_sec; - } - - float GCodeTimeEstimator::get_minimum_travel_feedrate() const - { - return m_state.minimum_travel_feedrate; - } - - void GCodeTimeEstimator::set_filament_load_times(const std::vector &filament_load_times) - { - m_state.filament_load_times.clear(); - for (double t : filament_load_times) - m_state.filament_load_times.push_back((float)t); - } - - void GCodeTimeEstimator::set_filament_unload_times(const std::vector &filament_unload_times) - { - m_state.filament_unload_times.clear(); - for (double t : filament_unload_times) - m_state.filament_unload_times.push_back((float)t); - } - - float GCodeTimeEstimator::get_filament_load_time(unsigned int id_extruder) - { - return - (m_state.filament_load_times.empty() || id_extruder == m_state.extruder_id_unloaded) ? - 0 : - (m_state.filament_load_times.size() <= id_extruder) ? - m_state.filament_load_times.front() : - m_state.filament_load_times[id_extruder]; - } - - float GCodeTimeEstimator::get_filament_unload_time(unsigned int id_extruder) - { - return - (m_state.filament_unload_times.empty() || id_extruder == m_state.extruder_id_unloaded) ? - 0 : - (m_state.filament_unload_times.size() <= id_extruder) ? - m_state.filament_unload_times.front() : - m_state.filament_unload_times[id_extruder]; - } - - void GCodeTimeEstimator::set_extrude_factor_override_percentage(float percentage) - { - m_state.extrude_factor_override_percentage = percentage; - } - - float GCodeTimeEstimator::get_extrude_factor_override_percentage() const - { - return m_state.extrude_factor_override_percentage; - } - - void GCodeTimeEstimator::set_dialect(GCodeFlavor dialect) - { - m_state.dialect = dialect; - } - - GCodeFlavor GCodeTimeEstimator::get_dialect() const - { - PROFILE_FUNC(); - return m_state.dialect; - } - - void GCodeTimeEstimator::set_units(GCodeTimeEstimator::EUnits units) - { - m_state.units = units; - } - - GCodeTimeEstimator::EUnits GCodeTimeEstimator::get_units() const - { - return m_state.units; - } - - void GCodeTimeEstimator::set_global_positioning_type(GCodeTimeEstimator::EPositioningType type) - { - m_state.global_positioning_type = type; - } - - GCodeTimeEstimator::EPositioningType GCodeTimeEstimator::get_global_positioning_type() const - { - return m_state.global_positioning_type; - } - - void GCodeTimeEstimator::set_e_local_positioning_type(GCodeTimeEstimator::EPositioningType type) - { - m_state.e_local_positioning_type = type; - } - - GCodeTimeEstimator::EPositioningType GCodeTimeEstimator::get_e_local_positioning_type() const - { - return m_state.e_local_positioning_type; - } - - int GCodeTimeEstimator::get_g1_line_id() const - { - return m_state.g1_line_id; - } - - void GCodeTimeEstimator::increment_g1_line_id() - { - ++m_state.g1_line_id; - } - - void GCodeTimeEstimator::reset_g1_line_id() - { - m_state.g1_line_id = 0; - } - - void GCodeTimeEstimator::set_extruder_id(unsigned int id) - { - m_state.extruder_id = id; - } - - unsigned int GCodeTimeEstimator::get_extruder_id() const - { - return m_state.extruder_id; - } - - void GCodeTimeEstimator::reset_extruder_id() - { - // Set the initial extruder ID to unknown. For the multi-material setup it means - // that all the filaments are parked in the MMU and no filament is loaded yet. - m_state.extruder_id = m_state.extruder_id_unloaded; - } - - void GCodeTimeEstimator::set_default() - { - set_units(Millimeters); - set_dialect(gcfSprinter); - set_global_positioning_type(Absolute); - set_e_local_positioning_type(Absolute); - - set_feedrate(DEFAULT_FEEDRATE); - // Setting the maximum acceleration to zero means that the there is no limit and the G-code - // is allowed to set excessive values. - set_max_acceleration(0); - set_max_travel_acceleration(0); - set_acceleration(DEFAULT_ACCELERATION); - set_travel_acceleration(DEFAULT_ACCELERATION); - set_retract_acceleration(DEFAULT_RETRACT_ACCELERATION); - set_minimum_feedrate(DEFAULT_MINIMUM_FEEDRATE); - set_minimum_travel_feedrate(DEFAULT_MINIMUM_TRAVEL_FEEDRATE); - set_extrude_factor_override_percentage(DEFAULT_EXTRUDE_FACTOR_OVERRIDE_PERCENTAGE); - - for (unsigned char a = X; a < Num_Axis; ++a) - { - EAxis axis = (EAxis)a; - set_axis_max_feedrate(axis, DEFAULT_AXIS_MAX_FEEDRATE[a]); - set_axis_max_acceleration(axis, DEFAULT_AXIS_MAX_ACCELERATION[a]); - set_axis_max_jerk(axis, DEFAULT_AXIS_MAX_JERK[a]); - } - - m_state.filament_load_times.clear(); - m_state.filament_unload_times.clear(); - } - - void GCodeTimeEstimator::reset() - { - _reset_time(); -#if ENABLE_MOVE_STATS - _moves_stats.clear(); -#endif // ENABLE_MOVE_STATS - _reset_blocks(); - _reset(); - } - - void GCodeTimeEstimator::scale_time(float scaling) - { - m_time *= scaling; - } - - float GCodeTimeEstimator::get_time() const - { - return m_time; - } - - std::string GCodeTimeEstimator::get_time_dhms() const - { - return _get_time_dhms(get_time()); - } - - std::string GCodeTimeEstimator::get_time_dhm() const - { - return _get_time_dhm(get_time()); - } - - std::string GCodeTimeEstimator::get_time_minutes() const - { - return _get_time_minutes(get_time()); - } - - std::vector> GCodeTimeEstimator::get_custom_gcode_times() const - { - return m_custom_gcode_times; - } - - std::vector GCodeTimeEstimator::get_color_times_dhms(bool include_remaining) const - { - std::vector ret; - float total_time = 0.0f; -// for (float t : m_color_times) - for (auto t : m_custom_gcode_times) - { - std::string time = _get_time_dhms(t.second); - if (include_remaining) - { - time += " ("; - time += _get_time_dhms(m_time - total_time); - time += ")"; - } - total_time += t.second; - ret.push_back(time); - } - return ret; - } - - std::vector GCodeTimeEstimator::get_color_times_minutes(bool include_remaining) const - { - std::vector ret; - float total_time = 0.0f; -// for (float t : m_color_times) - for (auto t : m_custom_gcode_times) - { - std::string time = _get_time_minutes(t.second); - if (include_remaining) - { - time += " ("; - time += _get_time_minutes(m_time - total_time); - time += ")"; - } - total_time += t.second; - } - return ret; - } - - std::vector> GCodeTimeEstimator::get_custom_gcode_times_dhm(bool include_remaining) const - { - std::vector> ret; - - float total_time = 0.0f; - for (auto t : m_custom_gcode_times) - { - std::string time = _get_time_dhm(t.second); - if (include_remaining) - { - time += " ("; - time += _get_time_dhm(m_time - total_time); - time += ")"; - } - total_time += t.second; - ret.push_back({t.first, time}); - } - - return ret; - } - - // Return an estimate of the memory consumed by the time estimator. - size_t GCodeTimeEstimator::memory_used() const - { - size_t out = sizeof(*this); - out += SLIC3R_STDVEC_MEMSIZE(this->m_blocks, Block); - out += SLIC3R_STDVEC_MEMSIZE(this->m_g1_times, G1LineIdTime); - return out; - } - - void GCodeTimeEstimator::_reset() - { - m_curr.reset(); - m_prev.reset(); - - set_axis_position(X, 0.0f); - set_axis_position(Y, 0.0f); - set_axis_position(Z, 0.0f); - set_axis_origin(X, 0.0f); - set_axis_origin(Y, 0.0f); - set_axis_origin(Z, 0.0f); - - if (get_e_local_positioning_type() == Absolute) - set_axis_position(E, 0.0f); - - reset_extruder_id(); - reset_g1_line_id(); - m_g1_times.clear(); - - m_needs_custom_gcode_times = false; - m_custom_gcode_times.clear(); - m_custom_gcode_time_cache = 0.0f; - } - - void GCodeTimeEstimator::_reset_time() - { - m_time = 0.0f; - } - - void GCodeTimeEstimator::_reset_blocks() - { - m_blocks.clear(); - } - - void GCodeTimeEstimator::_calculate_time(size_t keep_last_n_blocks) - { - PROFILE_FUNC(); - - assert(keep_last_n_blocks <= m_blocks.size()); - - _forward_pass(); - _reverse_pass(); - _recalculate_trapezoids(); - - size_t n_blocks_process = m_blocks.size() - keep_last_n_blocks; - m_g1_times.reserve(m_g1_times.size() + n_blocks_process); - for (size_t i = 0; i < n_blocks_process; ++ i) - { - Block& block = m_blocks[i]; - float block_time = 0.0f; - block_time += block.acceleration_time(); - block_time += block.cruise_time(); - block_time += block.deceleration_time(); - m_time += block_time; - if (block.g1_line_id >= 0) - m_g1_times.emplace_back(block.g1_line_id, m_time); - block.duration = block_time; - -#if ENABLE_MOVE_STATS - MovesStatsMap::iterator it = _moves_stats.find(block.move_type); - if (it == _moves_stats.end()) - it = _moves_stats.insert(MovesStatsMap::value_type(block.move_type, MoveStats())).first; - - it->second.count += 1; - it->second.time += block_time; -#endif // ENABLE_MOVE_STATS - - m_custom_gcode_time_cache += block_time; - } - - if (keep_last_n_blocks) - m_blocks.erase(m_blocks.begin(), m_blocks.begin() + n_blocks_process); - else - m_blocks.clear(); - } - - void GCodeTimeEstimator::_process_gcode_line(GCodeReader&, const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - - // processes 'special' comments contained in line - if (_process_tags(line)) - return; - - std::string cmd = line.cmd(); - if (cmd.length() > 1) - { - switch (::toupper(cmd[0])) - { - case 'G': - { - switch (::atoi(&cmd[1])) - { - case 1: // Move - { - _processG1(line); - break; - } - case 4: // Dwell - { - _processG4(line); - break; - } - case 20: // Set Units to Inches - { - _processG20(line); - break; - } - case 21: // Set Units to Millimeters - { - _processG21(line); - break; - } - case 28: // Move to Origin (Home) - { - _processG28(line); - break; - } - case 90: // Set to Absolute Positioning - { - _processG90(line); - break; - } - case 91: // Set to Relative Positioning - { - _processG91(line); - break; - } - case 92: // Set Position - { - _processG92(line); - break; - } - } - - break; - } - case 'M': - { - switch (::atoi(&cmd[1])) - { - case 1: // Sleep or Conditional stop - { - _processM1(line); - break; - } - case 82: // Set extruder to absolute mode - { - _processM82(line); - break; - } - case 83: // Set extruder to relative mode - { - _processM83(line); - break; - } - case 109: // Set Extruder Temperature and Wait - { - _processM109(line); - break; - } - case 201: // Set max printing acceleration - { - _processM201(line); - break; - } - case 203: // Set maximum feedrate - { - _processM203(line); - break; - } - case 204: // Set default acceleration - { - _processM204(line); - break; - } - case 205: // Advanced settings - { - _processM205(line); - break; - } - case 221: // Set extrude factor override percentage - { - _processM221(line); - break; - } - case 566: // Set allowable instantaneous speed change - { - _processM566(line); - break; - } - case 702: // MK3 MMU2: Process the final filament unload. - { - _processM702(line); - break; - } - } - - break; - } - case 'T': // Select Tools - { - _processT(line); - break; - } - } - } - } - - void GCodeTimeEstimator::_processG1(const GCodeReader::GCodeLine& line) - { - auto axis_absolute_position = [this](GCodeTimeEstimator::EAxis axis, const GCodeReader::GCodeLine& lineG1) -> float - { - float current_absolute_position = get_axis_position(axis); - float current_origin = get_axis_origin(axis); - float lengthsScaleFactor = (get_units() == GCodeTimeEstimator::Inches) ? INCHES_TO_MM : 1.0f; - - bool is_relative = (get_global_positioning_type() == Relative); - if (axis == E) - is_relative |= (get_e_local_positioning_type() == Relative); - - if (lineG1.has(Slic3r::Axis(axis))) - { - float ret = lineG1.value(Slic3r::Axis(axis)) * lengthsScaleFactor; - return is_relative ? current_absolute_position + ret : ret + current_origin; - } - else - return current_absolute_position; - }; - - // delta_pos must have size >= Num_Axis - auto move_length = [](const float* delta_pos) { - float xyz_length = std::sqrt(sqr(delta_pos[X]) + sqr(delta_pos[Y]) + sqr(delta_pos[Z])); - return (xyz_length > 0.0f) ? xyz_length : std::abs(delta_pos[E]); - }; - - // delta_pos must have size >= Num_Axis - auto is_extruder_only_move = [](const float* delta_pos) { - return (delta_pos[X] == 0.0f) && (delta_pos[Y] == 0.0f) && (delta_pos[Z] == 0.0f) && (delta_pos[E] != 0.0f); - }; - - PROFILE_FUNC(); - increment_g1_line_id(); - - // updates axes positions from line - float new_pos[Num_Axis]; - for (unsigned char a = X; a < Num_Axis; ++a) - { - new_pos[a] = axis_absolute_position((EAxis)a, line); - } - - // updates feedrate from line, if present - if (line.has_f()) - set_feedrate(std::max(line.f() * MMMIN_TO_MMSEC, get_minimum_feedrate())); - - // fills block data - Block block; - - // calculates block movement deltas - float max_abs_delta = 0.0f; - float delta_pos[Num_Axis]; - for (unsigned char a = X; a < Num_Axis; ++a) - { - delta_pos[a] = new_pos[a] - get_axis_position((EAxis)a); - max_abs_delta = std::max(max_abs_delta, std::abs(delta_pos[a])); - } - block.z = new_pos[Z]; - - // is it a move ? - if (max_abs_delta == 0.0f) - return; - - // calculates block feedrate - m_curr.feedrate = std::max(get_feedrate(), (delta_pos[E] == 0.0f) ? get_minimum_travel_feedrate() : get_minimum_feedrate()); - - block.distance = move_length(delta_pos); - float invDistance = 1.0f / block.distance; - - float min_feedrate_factor = 1.0f; - for (unsigned char a = X; a < Num_Axis; ++a) - { - m_curr.axis_feedrate[a] = m_curr.feedrate * delta_pos[a] * invDistance; - if (a == E) - m_curr.axis_feedrate[a] *= get_extrude_factor_override_percentage(); - - m_curr.abs_axis_feedrate[a] = std::abs(m_curr.axis_feedrate[a]); - if (m_curr.abs_axis_feedrate[a] > 0.0f) - min_feedrate_factor = std::min(min_feedrate_factor, get_axis_max_feedrate((EAxis)a) / m_curr.abs_axis_feedrate[a]); - } - - block.feedrate.cruise = min_feedrate_factor * m_curr.feedrate; - - if (min_feedrate_factor < 1.0f) - { - for (unsigned char a = X; a < Num_Axis; ++a) - { - m_curr.axis_feedrate[a] *= min_feedrate_factor; - m_curr.abs_axis_feedrate[a] *= min_feedrate_factor; - } - } - - // calculates block acceleration - float acceleration = is_extruder_only_move(delta_pos) ? get_retract_acceleration() : block.is_travel_move() ? get_travel_acceleration() : get_acceleration(); - - for (unsigned char a = X; a < Num_Axis; ++a) - { - float axis_max_acceleration = get_axis_max_acceleration((EAxis)a); - if (acceleration * std::abs(delta_pos[a]) * invDistance > axis_max_acceleration) - acceleration = axis_max_acceleration; - } - - block.acceleration = acceleration; - - // calculates block exit feedrate - m_curr.safe_feedrate = block.feedrate.cruise; - - for (unsigned char a = X; a < Num_Axis; ++a) - { - float axis_max_jerk = get_axis_max_jerk((EAxis)a); - if (m_curr.abs_axis_feedrate[a] > axis_max_jerk) - m_curr.safe_feedrate = std::min(m_curr.safe_feedrate, axis_max_jerk); - } - - block.feedrate.exit = m_curr.safe_feedrate; - - // calculates block entry feedrate - float vmax_junction = m_curr.safe_feedrate; - if (!m_blocks.empty() && (m_prev.feedrate > PREVIOUS_FEEDRATE_THRESHOLD)) - { - bool prev_speed_larger = m_prev.feedrate > block.feedrate.cruise; - float smaller_speed_factor = prev_speed_larger ? (block.feedrate.cruise / m_prev.feedrate) : (m_prev.feedrate / block.feedrate.cruise); - // Pick the smaller of the nominal speeds. Higher speed shall not be achieved at the junction during coasting. - vmax_junction = prev_speed_larger ? block.feedrate.cruise : m_prev.feedrate; - - float v_factor = 1.0f; - bool limited = false; - - for (unsigned char a = X; a < Num_Axis; ++a) - { - // Limit an axis. We have to differentiate coasting from the reversal of an axis movement, or a full stop. - float v_exit = m_prev.axis_feedrate[a]; - float v_entry = m_curr.axis_feedrate[a]; - - if (prev_speed_larger) - v_exit *= smaller_speed_factor; - - if (limited) - { - v_exit *= v_factor; - v_entry *= v_factor; - } - - // Calculate the jerk depending on whether the axis is coasting in the same direction or reversing a direction. - float jerk = - (v_exit > v_entry) ? - (((v_entry > 0.0f) || (v_exit < 0.0f)) ? - // coasting - (v_exit - v_entry) : - // axis reversal - std::max(v_exit, -v_entry)) : - // v_exit <= v_entry - (((v_entry < 0.0f) || (v_exit > 0.0f)) ? - // coasting - (v_entry - v_exit) : - // axis reversal - std::max(-v_exit, v_entry)); - - float axis_max_jerk = get_axis_max_jerk((EAxis)a); - if (jerk > axis_max_jerk) - { - v_factor *= axis_max_jerk / jerk; - limited = true; - } - } - - if (limited) - vmax_junction *= v_factor; - - // Now the transition velocity is known, which maximizes the shared exit / entry velocity while - // respecting the jerk factors, it may be possible, that applying separate safe exit / entry velocities will achieve faster prints. - float vmax_junction_threshold = vmax_junction * 0.99f; - - // Not coasting. The machine will stop and start the movements anyway, better to start the segment from start. - if ((m_prev.safe_feedrate > vmax_junction_threshold) && (m_curr.safe_feedrate > vmax_junction_threshold)) - vmax_junction = m_curr.safe_feedrate; - } - - float v_allowable = Block::max_allowable_speed(-acceleration, m_curr.safe_feedrate, block.distance); - block.feedrate.entry = std::min(vmax_junction, v_allowable); - - block.max_entry_speed = vmax_junction; - block.flags.nominal_length = (block.feedrate.cruise <= v_allowable); - block.flags.recalculate = true; - block.safe_feedrate = m_curr.safe_feedrate; - - // calculates block trapezoid - block.calculate_trapezoid(); - - // updates previous - m_prev = m_curr; - - // updates axis positions - for (unsigned char a = X; a < Num_Axis; ++a) - { - set_axis_position((EAxis)a, new_pos[a]); - } - -#if ENABLE_MOVE_STATS - // detects block move type - block.move_type = Block::Noop; - - if (delta_pos[E] < 0.0f) - { - if ((delta_pos[X] != 0.0f) || (delta_pos[Y] != 0.0f) || (delta_pos[Z] != 0.0f)) - block.move_type = Block::Move; - else - block.move_type = Block::Retract; - } - else if (delta_pos[E] > 0.0f) - { - if ((delta_pos[X] == 0.0f) && (delta_pos[Y] == 0.0f) && (delta_pos[Z] == 0.0f)) - block.move_type = Block::Unretract; - else if ((delta_pos[X] != 0.0f) || (delta_pos[Y] != 0.0f)) - block.move_type = Block::Extrude; - } - else if ((delta_pos[X] != 0.0f) || (delta_pos[Y] != 0.0f) || (delta_pos[Z] != 0.0f)) - block.move_type = Block::Move; -#endif // ENABLE_MOVE_STATS - - // adds block to blocks list - block.g1_line_id = this->get_g1_line_id(); - m_blocks.emplace_back(block); - - if (m_blocks.size() > planner_refresh_if_larger) - _calculate_time(planner_queue_size); - } - - void GCodeTimeEstimator::_processG4(const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - GCodeFlavor dialect = get_dialect(); - - float value; - float extra_time = 0.f; - if (line.has_value('P', value)) - extra_time += value * MILLISEC_TO_SEC; - - // see: http://reprap.org/wiki/G-code#G4:_Dwell - if ((dialect == gcfRepetier) || - (dialect == gcfMarlin) || - (dialect == gcfKlipper) || - (dialect == gcfSmoothie) || - (dialect == gcfLerdge) || - (dialect == gcfRepRap)|| - (dialect == gcfSprinter)) - { - if (line.has_value('S', value)) - extra_time += value; - } - - _simulate_st_synchronize(extra_time); - } - - void GCodeTimeEstimator::_processG20(const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - set_units(Inches); - } - - void GCodeTimeEstimator::_processG21(const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - set_units(Millimeters); - } - - void GCodeTimeEstimator::_processG28(const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - // TODO - } - - void GCodeTimeEstimator::_processG90(const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - set_global_positioning_type(Absolute); - } - - void GCodeTimeEstimator::_processG91(const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - set_global_positioning_type(Relative); - } - - void GCodeTimeEstimator::_processG92(const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - float lengthsScaleFactor = (get_units() == Inches) ? INCHES_TO_MM : 1.0f; - bool anyFound = false; - - if (line.has_x()) - { - set_axis_origin(X, get_axis_position(X) - line.x() * lengthsScaleFactor); - anyFound = true; - } - - if (line.has_y()) - { - set_axis_origin(Y, get_axis_position(Y) - line.y() * lengthsScaleFactor); - anyFound = true; - } - - if (line.has_z()) - { - set_axis_origin(Z, get_axis_position(Z) - line.z() * lengthsScaleFactor); - anyFound = true; - } - - if (line.has_e()) - { - // extruder coordinate can grow to the point where its float representation does not allow for proper addition with small increments, - // we set the value taken from the G92 line as the new current position for it - set_axis_position(E, line.e() * lengthsScaleFactor); - anyFound = true; - } - else - _simulate_st_synchronize(0.f); - - if (!anyFound) - { - for (unsigned char a = X; a < Num_Axis; ++a) - { - set_axis_origin((EAxis)a, get_axis_position((EAxis)a)); - } - } - } - - void GCodeTimeEstimator::_processM1(const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - _simulate_st_synchronize(0.f); - } - - void GCodeTimeEstimator::_processM82(const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - set_e_local_positioning_type(Absolute); - } - - void GCodeTimeEstimator::_processM83(const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - set_e_local_positioning_type(Relative); - } - - void GCodeTimeEstimator::_processM109(const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - // TODO - } - - void GCodeTimeEstimator::_processM201(const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - GCodeFlavor dialect = get_dialect(); - - // see http://reprap.org/wiki/G-code#M201:_Set_max_printing_acceleration - float factor = ((dialect != gcfRepRap) && (dialect != gcfSprinter) && (get_units() == GCodeTimeEstimator::Inches)) ? INCHES_TO_MM : 1.0f; - - if (line.has_x()) - set_axis_max_acceleration(X, line.x() * factor); - - if (line.has_y()) - set_axis_max_acceleration(Y, line.y() * factor); - - if (line.has_z()) - set_axis_max_acceleration(Z, line.z() * factor); - - if (line.has_e()) - set_axis_max_acceleration(E, line.e() * factor); - } - - void GCodeTimeEstimator::_processM203(const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - GCodeFlavor dialect = get_dialect(); - - // see http://reprap.org/wiki/G-code#M203:_Set_maximum_feedrate - if (dialect == gcfRepetier) - return; - - // see http://reprap.org/wiki/G-code#M203:_Set_maximum_feedrate - // http://smoothieware.org/supported-g-codes - float factor = (dialect == gcfMarlin || dialect == gcfSmoothie || dialect == gcfLerdge) ? 1.0f : MMMIN_TO_MMSEC; - - if (line.has_x()) - set_axis_max_feedrate(X, line.x() * factor); - - if (line.has_y()) - set_axis_max_feedrate(Y, line.y() * factor); - - if (line.has_z()) - set_axis_max_feedrate(Z, line.z() * factor); - - if (line.has_e()) - set_axis_max_feedrate(E, line.e() * factor); - } - - void GCodeTimeEstimator::_processM204(const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - float value; - if (line.has_value('S', value)) { - // Legacy acceleration format. This format is used by the legacy Marlin, MK2 or MK3 firmware, - // and it is also generated by Slic3r to control acceleration per extrusion type - // (there is a separate acceleration settings in Slicer for perimeter, first layer etc). - set_acceleration(value); - if (line.has_value('T', value)) - set_retract_acceleration(value); - } else { - // New acceleration format, compatible with the upstream Marlin. - if (line.has_value('P', value)) - set_acceleration(value); - if (line.has_value('R', value)) - set_retract_acceleration(value); - if (line.has_value('T', value)) { - // Interpret the T value as the travel acceleration in the new Marlin format. - set_travel_acceleration(value); - } - } - } - - void GCodeTimeEstimator::_processM205(const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - if (line.has_x()) - { - float max_jerk = line.x(); - set_axis_max_jerk(X, max_jerk); - set_axis_max_jerk(Y, max_jerk); - } - - if (line.has_y()) - set_axis_max_jerk(Y, line.y()); - - if (line.has_z()) - set_axis_max_jerk(Z, line.z()); - - if (line.has_e()) - set_axis_max_jerk(E, line.e()); - - float value; - if (line.has_value('S', value)) - set_minimum_feedrate(value); - - if (line.has_value('T', value)) - set_minimum_travel_feedrate(value); - } - - void GCodeTimeEstimator::_processM221(const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - float value_s; - float value_t; - if (line.has_value('S', value_s) && !line.has_value('T', value_t)) - set_extrude_factor_override_percentage(value_s * 0.01f); - } - - void GCodeTimeEstimator::_processM566(const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - if (line.has_x()) - set_axis_max_jerk(X, line.x() * MMMIN_TO_MMSEC); - - if (line.has_y()) - set_axis_max_jerk(Y, line.y() * MMMIN_TO_MMSEC); - - if (line.has_z()) - set_axis_max_jerk(Z, line.z() * MMMIN_TO_MMSEC); - - if (line.has_e()) - set_axis_max_jerk(E, line.e() * MMMIN_TO_MMSEC); - } - - void GCodeTimeEstimator::_processM702(const GCodeReader::GCodeLine& line) - { - PROFILE_FUNC(); - if (line.has('C')) { - // MK3 MMU2 specific M code: - // M702 C is expected to be sent by the custom end G-code when finalizing a print. - // The MK3 unit shall unload and park the active filament into the MMU2 unit. - float extra_time = get_filament_unload_time(get_extruder_id()); - reset_extruder_id(); - _simulate_st_synchronize(extra_time); - } - } - - void GCodeTimeEstimator::_processT(const GCodeReader::GCodeLine& line) - { - std::string cmd = line.cmd(); - if (cmd.length() > 1) - { - unsigned int id = (unsigned int)::strtol(cmd.substr(1).c_str(), nullptr, 10); - if (get_extruder_id() != id) - { - // Specific to the MK3 MMU2: The initial extruder ID is set to -1 indicating - // that the filament is parked in the MMU2 unit and there is nothing to be unloaded yet. - float extra_time = get_filament_unload_time(get_extruder_id()); - set_extruder_id(id); - extra_time += get_filament_load_time(get_extruder_id()); - _simulate_st_synchronize(extra_time); - } - } - } - - bool GCodeTimeEstimator::_process_tags(const GCodeReader::GCodeLine& line) - { - std::string comment = line.comment(); - - // Color_Change_Tag - size_t pos = comment.find(Color_Change_Tag); - if (pos != comment.npos) - { - _process_custom_gcode_tag(CustomGCode::ColorChange); - return true; - } - - // Pause_Print_Tag - pos = comment.find(Pause_Print_Tag); - if (pos != comment.npos) - { - _process_custom_gcode_tag(CustomGCode::PausePrint); - return true; - } - - return false; - } - - void GCodeTimeEstimator::_process_custom_gcode_tag(CustomGCode::Type code) - { - PROFILE_FUNC(); - m_needs_custom_gcode_times = true; - //FIXME this simulates st_synchronize! is it correct? - // The estimated time may be longer than the real print time. - _simulate_st_synchronize(0.f); - if (m_custom_gcode_time_cache != 0.0f) - { - m_custom_gcode_times.push_back({code, m_custom_gcode_time_cache}); - m_custom_gcode_time_cache = 0.0f; - } - } - - void GCodeTimeEstimator::_simulate_st_synchronize(float extra_time) - { - PROFILE_FUNC(); - m_time += extra_time; - m_custom_gcode_time_cache += extra_time; - _calculate_time(0); - } - - void GCodeTimeEstimator::_forward_pass() - { - PROFILE_FUNC(); - for (int i = 0; i + 1 < (int)m_blocks.size(); ++i) - _planner_forward_pass_kernel(m_blocks[i], m_blocks[i + 1]); - } - - void GCodeTimeEstimator::_reverse_pass() - { - PROFILE_FUNC(); - for (int i = (int)m_blocks.size() - 1; i > 0; -- i) - _planner_reverse_pass_kernel(m_blocks[i - 1], m_blocks[i]); - } - - void GCodeTimeEstimator::_planner_forward_pass_kernel(Block& prev, Block& curr) - { - PROFILE_FUNC(); - // If the previous block is an acceleration block, but it is not long enough to complete the - // full speed change within the block, we need to adjust the entry speed accordingly. Entry - // speeds have already been reset, maximized, and reverse planned by reverse planner. - // If nominal length is true, max junction speed is guaranteed to be reached. No need to recheck. - if (!prev.flags.nominal_length) - { - if (prev.feedrate.entry < curr.feedrate.entry) - { - float entry_speed = std::min(curr.feedrate.entry, Block::max_allowable_speed(-prev.acceleration, prev.feedrate.entry, prev.distance)); - - // Check for junction speed change - if (curr.feedrate.entry != entry_speed) - { - curr.feedrate.entry = entry_speed; - curr.flags.recalculate = true; - } - } - } - } - - void GCodeTimeEstimator::_planner_reverse_pass_kernel(Block& curr, Block& next) - { - // If entry speed is already at the maximum entry speed, no need to recheck. Block is cruising. - // If not, block in state of acceleration or deceleration. Reset entry speed to maximum and - // check for maximum allowable speed reductions to ensure maximum possible planned speed. - if (curr.feedrate.entry != curr.max_entry_speed) - { - // If nominal length true, max junction speed is guaranteed to be reached. Only compute - // for max allowable speed if block is decelerating and nominal length is false. - if (!curr.flags.nominal_length && (curr.max_entry_speed > next.feedrate.entry)) - curr.feedrate.entry = std::min(curr.max_entry_speed, Block::max_allowable_speed(-curr.acceleration, next.feedrate.entry, curr.distance)); - else - curr.feedrate.entry = curr.max_entry_speed; - - curr.flags.recalculate = true; - } - } - - void GCodeTimeEstimator::_recalculate_trapezoids() - { - PROFILE_FUNC(); - Block* curr = nullptr; - Block* next = nullptr; - - for (size_t i = 0; i < m_blocks.size(); ++ i) - { - Block& b = m_blocks[i]; - - curr = next; - next = &b; - - if (curr != nullptr) - { - // Recalculate if current block entry or exit junction speed has changed. - if (curr->flags.recalculate || next->flags.recalculate) - { - // NOTE: Entry and exit factors always > 0 by all previous logic operations. - Block block = *curr; - block.feedrate.exit = next->feedrate.entry; - block.calculate_trapezoid(); - curr->trapezoid = block.trapezoid; - curr->flags.recalculate = false; // Reset current only to ensure next trapezoid is computed - } - } - } - - // Last/newest block in buffer. Always recalculated. - if (next != nullptr) - { - Block block = *next; - block.feedrate.exit = next->safe_feedrate; - block.calculate_trapezoid(); - next->trapezoid = block.trapezoid; - next->flags.recalculate = false; - } - } - - std::string GCodeTimeEstimator::_get_time_dhms(float time_in_secs) - { - int days = (int)(time_in_secs / 86400.0f); - time_in_secs -= (float)days * 86400.0f; - int hours = (int)(time_in_secs / 3600.0f); - time_in_secs -= (float)hours * 3600.0f; - int minutes = (int)(time_in_secs / 60.0f); - time_in_secs -= (float)minutes * 60.0f; - - char buffer[64]; - if (days > 0) - ::sprintf(buffer, "%dd %dh %dm %ds", days, hours, minutes, (int)time_in_secs); - else if (hours > 0) - ::sprintf(buffer, "%dh %dm %ds", hours, minutes, (int)time_in_secs); - else if (minutes > 0) - ::sprintf(buffer, "%dm %ds", minutes, (int)time_in_secs); - else - ::sprintf(buffer, "%ds", (int)time_in_secs); - - return buffer; - } - - std::string GCodeTimeEstimator::_get_time_dhm(float time_in_secs) - { - char buffer[64]; - - int minutes = int(std::round(time_in_secs / 60.)); - if (minutes <= 0) { - ::sprintf(buffer, "%ds", (int)time_in_secs); - } else { - int days = minutes / 1440; - minutes -= days * 1440; - int hours = minutes / 60; - minutes -= hours * 60; - if (days > 0) - ::sprintf(buffer, "%dd %dh %dm", days, hours, minutes); - else if (hours > 0) - ::sprintf(buffer, "%dh %dm", hours, minutes); - else - ::sprintf(buffer, "%dm", minutes); - } - - return buffer; - } - - std::string GCodeTimeEstimator::_get_time_minutes(float time_in_secs) - { - return std::to_string((int)(::roundf(time_in_secs / 60.0f))); - } - - void GCodeTimeEstimator::reset_layers() - { - m_layers.clear(); - } - - void GCodeTimeEstimator::calculate_layer_duration() - { - for (int i = 0; i < (int)m_blocks.size(); ++i) - { - if (m_blocks[i].delta_pos[Z] == 0) - { - int j = 0; - bool layer_found = false; - while (j < (int)m_layers.size()) - { - if (m_blocks[i].z == m_layers[j].z) { - m_layers[j].duration += m_blocks[i].duration; - m_layers[j].min_time = std::min(m_layers[j].min_time, m_blocks[i].elapsed_time); - layer_found = true; - } - j++; - } - if (!layer_found) { - m_layers.emplace_back( m_blocks[i].z, m_blocks[i].duration, m_blocks[i].elapsed_time ); - } - } - } - std::sort(m_layers.begin(), m_layers.end(), [](const Layer& e1, const Layer& e2){return e1.z < e2.z; }); - } - - float GCodeTimeEstimator::get_layer_duration(float z) - { - for (const Layer &layer : m_layers) - { - if (z <= layer.z + EPSILON) { - return layer.duration; - } - } - return 0; - } - - float GCodeTimeEstimator::get_layer_time(float z) - { - float time = 0; - for (const Layer& layer : m_layers) - { - if (z <= layer.z + EPSILON) { - return time; - } - time += layer.duration; - } - return 0; - } - -#if ENABLE_MOVE_STATS - void GCodeTimeEstimator::_log_moves_stats() const - { - float moves_count = 0.0f; - for (const MovesStatsMap::value_type& move : _moves_stats) - { - moves_count += (float)move.second.count; - } - - for (const MovesStatsMap::value_type& move : _moves_stats) - { - std::cout << MOVE_TYPE_STR[move.first]; - std::cout << ": count " << move.second.count << " (" << 100.0f * (float)move.second.count / moves_count << "%)"; - std::cout << " - time: " << move.second.time << "s (" << 100.0f * move.second.time / m_time << "%)"; - std::cout << std::endl; - } - std::cout << std::endl; - } -#endif // ENABLE_MOVE_STATS -} - -#endif // !ENABLE_GCODE_VIEWER diff --git a/src/libslic3r/GCodeTimeEstimator.hpp b/src/libslic3r/GCodeTimeEstimator.hpp deleted file mode 100644 index 1a07ff778..000000000 --- a/src/libslic3r/GCodeTimeEstimator.hpp +++ /dev/null @@ -1,524 +0,0 @@ -#ifndef slic3r_GCodeTimeEstimator_hpp_ -#define slic3r_GCodeTimeEstimator_hpp_ - -#include "libslic3r.h" -#include "PrintConfig.hpp" -#include "GCodeReader.hpp" -#include "CustomGCode.hpp" - -#if !ENABLE_GCODE_VIEWER - -#define ENABLE_MOVE_STATS 0 - -namespace Slic3r { - - // - // Some of the algorithms used by class GCodeTimeEstimator were inpired by - // Cura Engine's class TimeEstimateCalculator - // https://github.com/Ultimaker/CuraEngine/blob/master/src/timeEstimate.h - // - class GCodeTimeEstimator - { - public: - static const std::string Normal_First_M73_Output_Placeholder_Tag; - static const std::string Silent_First_M73_Output_Placeholder_Tag; - static const std::string Normal_Last_M73_Output_Placeholder_Tag; - static const std::string Silent_Last_M73_Output_Placeholder_Tag; - - static const std::string Color_Change_Tag; - static const std::string Pause_Print_Tag; - - enum EMode : unsigned char - { - Normal, - Silent - }; - - enum EUnits : unsigned char - { - Millimeters, - Inches - }; - - enum EAxis : unsigned char - { - X, - Y, - Z, - E, - Num_Axis - }; - - enum EPositioningType : unsigned char - { - Absolute, - Relative - }; - - private: - struct Axis - { - float position; // mm - float origin; // mm - float max_feedrate; // mm/s - float max_acceleration; // mm/s^2 - float max_jerk; // mm/s - }; - - struct Feedrates - { - float feedrate; // mm/s - float axis_feedrate[Num_Axis]; // mm/s - float abs_axis_feedrate[Num_Axis]; // mm/s - float safe_feedrate; // mm/s - - void reset(); - }; - - struct State - { - GCodeFlavor dialect; - EUnits units; - EPositioningType global_positioning_type; - EPositioningType e_local_positioning_type; - Axis axis[Num_Axis]; - float feedrate; // mm/s - float acceleration; // mm/s^2 - // hard limit for the acceleration, to which the firmware will clamp. - float max_acceleration; // mm/s^2 - float travel_acceleration; // mm/s^2 - // hard limit for the travel_acceleration, to which the firmware will clamp. - float max_travel_acceleration; // mm/s^2 - float retract_acceleration; // mm/s^2 - float minimum_feedrate; // mm/s - float minimum_travel_feedrate; // mm/s - float extrude_factor_override_percentage; - // Additional load / unload times for a filament exchange sequence. - std::vector filament_load_times; - std::vector filament_unload_times; - unsigned int g1_line_id; - // extruder_id is currently used to correctly calculate filament load / unload times - // into the total print time. This is currently only really used by the MK3 MMU2: - // Extruder id (-1) means no filament is loaded yet, all the filaments are parked in the MK3 MMU2 unit. - static const unsigned int extruder_id_unloaded = (unsigned int)-1; - unsigned int extruder_id; - }; - - public: - struct Block - { -#if ENABLE_MOVE_STATS - enum EMoveType : unsigned char - { - Noop, - Retract, - Unretract, - Tool_change, - Move, - Extrude, - Num_Types - }; -#endif // ENABLE_MOVE_STATS - - struct FeedrateProfile - { - float entry; // mm/s - float cruise; // mm/s - float exit; // mm/s - }; - - struct Trapezoid - { - float accelerate_until; // mm - float decelerate_after; // mm - float cruise_feedrate; // mm/sec - - float acceleration_time(float entry_feedrate, float acceleration) const; - float cruise_time() const; - float deceleration_time(float distance, float acceleration) const; - float cruise_distance() const; - - // This function gives the time needed to accelerate from an initial speed to reach a final distance. - static float acceleration_time_from_distance(float initial_feedrate, float distance, float acceleration); - - // This function gives the final speed while accelerating at the given constant acceleration from the given initial speed along the given distance. - static float speed_from_distance(float initial_feedrate, float distance, float acceleration); - }; - - struct Flags - { - bool recalculate; - bool nominal_length; - }; - -#if ENABLE_MOVE_STATS - EMoveType move_type; -#endif // ENABLE_MOVE_STATS - Flags flags; - - float distance; // mm - float z; - float acceleration; // mm/s^2 - float max_entry_speed; // mm/s - float safe_feedrate; // mm/s - - FeedrateProfile feedrate; - Trapezoid trapezoid; - float duration; - - // Ordnary index of this G1 line in the file. - int g1_line_id { -1 }; - - // Returns the time spent accelerating toward cruise speed, in seconds - float acceleration_time() const; - - // Returns the time spent at cruise speed, in seconds - float cruise_time() const; - - // Returns the time spent decelerating from cruise speed, in seconds - float deceleration_time() const; - - // Returns the distance covered at cruise speed, in mm - float cruise_distance() const; - - // Calculates this block's trapezoid - void calculate_trapezoid(); - - // Calculates the maximum allowable speed at this point when you must be able to reach target_velocity using the - // acceleration within the allotted distance. - static float max_allowable_speed(float acceleration, float target_velocity, float distance); - - // Calculates the distance (not time) it takes to accelerate from initial_rate to target_rate using the given acceleration: - static float estimate_acceleration_distance(float initial_rate, float target_rate, float acceleration); - - // This function gives you the point at which you must start braking (at the rate of -acceleration) if - // you started at speed initial_rate and accelerated until this point and want to end at the final_rate after - // a total travel of distance. This can be used to compute the intersection point between acceleration and - // deceleration in the cases where the trapezoid has no plateau (i.e. never reaches maximum speed) - static float intersection_distance(float initial_rate, float final_rate, float acceleration, float distance); - }; - - typedef std::vector BlocksList; - - struct Layer - { - float z; - float duration; - float min_time; - - Layer(float z, float duration, float min_time) - : z(z), duration(duration), min_time(min_time) - {} - }; - - typedef std::vector LayersList; - -#if ENABLE_MOVE_STATS - struct MoveStats - { - unsigned int count; - float time; - - MoveStats(); - }; - - typedef std::map MovesStatsMap; -#endif // ENABLE_MOVE_STATS - - public: - typedef std::pair G1LineIdTime; - typedef std::vector G1LineIdsTimes; - - struct PostProcessData - { - const G1LineIdsTimes& g1_times; - float time; - }; - - private: - EMode m_mode; - GCodeReader m_parser; - State m_state; - Feedrates m_curr; - Feedrates m_prev; - BlocksList m_blocks; - LayersList m_layers; - // Size of the firmware planner queue. The old 8-bit Marlins usually just managed 16 trapezoidal blocks. - // Let's be conservative and plan for newer boards with more memory. - static constexpr size_t planner_queue_size = 64; - // The firmware recalculates last planner_queue_size trapezoidal blocks each time a new block is added. - // We are not simulating the firmware exactly, we calculate a sequence of blocks once a reasonable number of blocks accumulate. - static constexpr size_t planner_refresh_if_larger = planner_queue_size * 4; - // Map from g1 line id to its elapsed time from the start of the print. - G1LineIdsTimes m_g1_times; - float m_time; // s - - // data to calculate custom code times - bool m_needs_custom_gcode_times; - std::vector> m_custom_gcode_times; - float m_custom_gcode_time_cache; - -#if ENABLE_MOVE_STATS - MovesStatsMap _moves_stats; -#endif // ENABLE_MOVE_STATS - - public: - explicit GCodeTimeEstimator(EMode mode); - - // Adds the given gcode line - void add_gcode_line(const std::string& gcode_line); - - void add_gcode_block(const char *ptr); - void add_gcode_block(const std::string &str) { this->add_gcode_block(str.c_str()); } - - // Calculates the time estimate from the gcode lines added using add_gcode_line() or add_gcode_block() - // start_from_beginning: - // if set to true all blocks will be used to calculate the time estimate, - // if set to false only the blocks not yet processed will be used and the calculated time will be added to the current calculated time - void calculate_time(bool start_from_beginning); - - // Calculates the time estimate from the given gcode in string format - //void calculate_time_from_text(const std::string& gcode); - - // Calculates the time estimate from the gcode contained in the file with the given filename - //void calculate_time_from_file(const std::string& file); - - // Calculates the time estimate from the gcode contained in given list of gcode lines - //void calculate_time_from_lines(const std::vector& gcode_lines); - - // Process the gcode contained in the file with the given filename, - // replacing placeholders with correspondent new lines M73 - // placing new lines M73 (containing the remaining time) where needed (in dependence of the given interval in seconds) - // and removing working tags (as those used for color changes) - // if normal_mode == nullptr no M73 line will be added for normal mode - // if silent_mode == nullptr no M73 line will be added for silent mode - static bool post_process(const std::string& filename, float interval_sec, const PostProcessData* const normal_mode, const PostProcessData* const silent_mode); - - // Set current position on the given axis with the given value - void set_axis_position(EAxis axis, float position); - // Set current origin on the given axis with the given value - void set_axis_origin(EAxis axis, float position); - - void set_axis_max_feedrate(EAxis axis, float feedrate_mm_sec); - void set_axis_max_acceleration(EAxis axis, float acceleration); - void set_axis_max_jerk(EAxis axis, float jerk); - - // Returns current position on the given axis - float get_axis_position(EAxis axis) const; - // Returns current origin on the given axis - float get_axis_origin(EAxis axis) const; - - float get_axis_max_feedrate(EAxis axis) const; - float get_axis_max_acceleration(EAxis axis) const; - float get_axis_max_jerk(EAxis axis) const; - - void set_feedrate(float feedrate_mm_sec); - float get_feedrate() const; - - void set_acceleration(float acceleration_mm_sec2); - float get_acceleration() const; - - // Maximum acceleration for the machine. The firmware simulator will clamp the M204 Sxxx to this maximum. - void set_max_acceleration(float acceleration_mm_sec2); - float get_max_acceleration() const; - - void set_travel_acceleration(float acceleration_mm_sec2); - float get_travel_acceleration() const; - - // Maximum acceleration for the machine. The firmware simulator will clamp the M204 Txxx to this maximum. - void set_max_travel_acceleration(float acceleration_mm_sec2); - float get_max_travel_acceleration() const; - - void set_retract_acceleration(float acceleration_mm_sec2); - float get_retract_acceleration() const; - - void set_minimum_feedrate(float feedrate_mm_sec); - float get_minimum_feedrate() const; - - void set_minimum_travel_feedrate(float feedrate_mm_sec); - float get_minimum_travel_feedrate() const; - - void set_filament_load_times(const std::vector &filament_load_times); - void set_filament_unload_times(const std::vector &filament_unload_times); - float get_filament_load_time(unsigned int id_extruder); - float get_filament_unload_time(unsigned int id_extruder); - - void set_extrude_factor_override_percentage(float percentage); - float get_extrude_factor_override_percentage() const; - - void set_dialect(GCodeFlavor dialect); - GCodeFlavor get_dialect() const; - - void set_units(EUnits units); - EUnits get_units() const; - - void set_global_positioning_type(EPositioningType type); - EPositioningType get_global_positioning_type() const; - - void set_e_local_positioning_type(EPositioningType type); - EPositioningType get_e_local_positioning_type() const; - - int get_g1_line_id() const; - void increment_g1_line_id(); - void reset_g1_line_id(); - - void set_extrusion_axis(char axis) { m_parser.set_extrusion_axis(axis); } - - void set_extruder_id(unsigned int id); - unsigned int get_extruder_id() const; - void reset_extruder_id(); - - //function for layer duration - void calculate_layer_duration(); - float get_layer_duration(float z); - float get_layer_time(float z); - void reset_layers(); - - void set_default(); - - // Call this method before to start adding lines using add_gcode_line() when reusing an instance of GCodeTimeEstimator - void reset(); - - // multiply the stored time by a factor. - void scale_time(float scaling); - - // Returns the estimated time, in seconds - float get_time() const; - - // Returns the estimated time, in format DDd HHh MMm SSs - std::string get_time_dhms() const; - - // Returns the estimated time, in format DDd HHh MMm - std::string get_time_dhm() const; - - // Returns the estimated time, in minutes (integer) - std::string get_time_minutes() const; - - // Returns the estimated time, in seconds, for each custom gcode - std::vector> get_custom_gcode_times() const; - - // Returns the estimated time, in format DDd HHh MMm SSs, for each color - // If include_remaining==true the strings will be formatted as: "time for color (remaining time at color start)" - std::vector get_color_times_dhms(bool include_remaining) const; - - // Returns the estimated time, in minutes (integer), for each color - // If include_remaining==true the strings will be formatted as: "time for color (remaining time at color start)" - std::vector get_color_times_minutes(bool include_remaining) const; - - //TODO: check if I can remove that - // Returns the estimated time, in format DDd HHh MMm, for each custom_gcode - // If include_remaining==true the strings will be formatted as: "time for custom_gcode (remaining time at color start)" - std::vector> get_custom_gcode_times_dhm(bool include_remaining) const; - - // Return an estimate of the memory consumed by the time estimator. - size_t memory_used() const; - - PostProcessData get_post_process_data() const { return PostProcessData{ m_g1_times, m_time }; } - - private: - void _reset(); - void _reset_time(); - void _reset_blocks(); - - // Calculates the time estimate - void _calculate_time(size_t keep_last_n_blocks); - - // Processes the given gcode line - void _process_gcode_line(GCodeReader&, const GCodeReader::GCodeLine& line); - - // Move - void _processG1(const GCodeReader::GCodeLine& line); - - // Dwell - void _processG4(const GCodeReader::GCodeLine& line); - - // Set Units to Inches - void _processG20(const GCodeReader::GCodeLine& line); - - // Set Units to Millimeters - void _processG21(const GCodeReader::GCodeLine& line); - - // Move to Origin (Home) - void _processG28(const GCodeReader::GCodeLine& line); - - // Set to Absolute Positioning - void _processG90(const GCodeReader::GCodeLine& line); - - // Set to Relative Positioning - void _processG91(const GCodeReader::GCodeLine& line); - - // Set Position - void _processG92(const GCodeReader::GCodeLine& line); - - // Sleep or Conditional stop - void _processM1(const GCodeReader::GCodeLine& line); - - // Set extruder to absolute mode - void _processM82(const GCodeReader::GCodeLine& line); - - // Set extruder to relative mode - void _processM83(const GCodeReader::GCodeLine& line); - - // Set Extruder Temperature and Wait - void _processM109(const GCodeReader::GCodeLine& line); - - // Set max printing acceleration - void _processM201(const GCodeReader::GCodeLine& line); - - // Set maximum feedrate - void _processM203(const GCodeReader::GCodeLine& line); - - // Set default acceleration - void _processM204(const GCodeReader::GCodeLine& line); - - // Advanced settings - void _processM205(const GCodeReader::GCodeLine& line); - - // Set extrude factor override percentage - void _processM221(const GCodeReader::GCodeLine& line); - - // Set allowable instantaneous speed change - void _processM566(const GCodeReader::GCodeLine& line); - - // Unload the current filament into the MK3 MMU2 unit at the end of print. - void _processM702(const GCodeReader::GCodeLine& line); - - // Processes T line (Select Tool) - void _processT(const GCodeReader::GCodeLine& line); - - // Processes the tags - // Returns true if any tag has been processed - bool _process_tags(const GCodeReader::GCodeLine& line); - - // Processes ColorChangeTag and PausePrintTag - void _process_custom_gcode_tag(CustomGCode::Type code); - - // Simulates firmware st_synchronize() call - void _simulate_st_synchronize(float additional_time); - - void _forward_pass(); - void _reverse_pass(); - - void _planner_forward_pass_kernel(Block& prev, Block& curr); - void _planner_reverse_pass_kernel(Block& curr, Block& next); - - void _recalculate_trapezoids(); - - // Returns the given time is seconds in format DDd HHh MMm SSs - static std::string _get_time_dhms(float time_in_secs); - // Returns the given time is minutes in format DDd HHh MMm - static std::string _get_time_dhm(float time_in_secs); - - // Returns the given, in minutes (integer) - static std::string _get_time_minutes(float time_in_secs); - -#if ENABLE_MOVE_STATS - void _log_moves_stats() const; -#endif // ENABLE_MOVE_STATS - }; - -} /* namespace Slic3r */ - -#endif // !ENABLE_GCODE_VIEWER - -#endif /* slic3r_GCodeTimeEstimator_hpp_ */ diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 9320f9eb3..b531bc320 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -645,10 +645,11 @@ const std::vector& Preset::printer_options() "fan_kickstart", "fan_speedup_overhangs", "fan_speedup_time", - "gcode_flavor", "use_relative_e_distances", "serial_port", "serial_speed", + "gcode_flavor", "use_relative_e_distances", "use_firmware_retraction", "use_volumetric_e", "variable_layer_height", "min_length", - "host_type", "print_host", "printhost_apikey", "printhost_cafile", "printhost_slug", + //FIXME the print host keys are left here just for conversion from the Printer preset to Physical Printer preset. + "host_type", "print_host", "printhost_apikey", "printhost_cafile", "printhost_port", "single_extruder_multi_material", "start_gcode", "end_gcode", "before_layer_gcode", "layer_gcode", "toolchange_gcode", "color_change_gcode", "pause_print_gcode", "template_custom_gcode", "feature_gcode", @@ -783,7 +784,8 @@ const std::vector& Preset::sla_printer_options() "gamma_correction", "min_exposure_time", "max_exposure_time", "min_initial_exposure_time", "max_initial_exposure_time", - "print_host", "printhost_apikey", "printhost_cafile", "printhost_slug", + //FIXME the print host keys are left here just for conversion from the Printer preset to Physical Printer preset. + "print_host", "printhost_apikey", "printhost_cafile", "printhost_port", "printer_notes", "inherits", "thumbnails", @@ -904,42 +906,6 @@ Preset& PresetCollection::load_preset(const std::string &path, const std::string return this->load_preset(path, name, std::move(cfg), select); } -enum class ProfileHostParams -{ - Same, - Different, - Anonymized, -}; - -static ProfileHostParams profile_host_params_same_or_anonymized(const DynamicPrintConfig &cfg_old, const DynamicPrintConfig &cfg_new) -{ - auto opt_print_host_old = cfg_old.option("print_host"); - auto opt_printhost_apikey_old = cfg_old.option("printhost_apikey"); - auto opt_printhost_cafile_old = cfg_old.option("printhost_cafile"); - auto opt_printhost_slug_old = cfg_old.option("printhost_slug"); - - auto opt_print_host_new = cfg_new.option("print_host"); - auto opt_printhost_apikey_new = cfg_new.option("printhost_apikey"); - auto opt_printhost_cafile_new = cfg_new.option("printhost_cafile"); - auto opt_printhost_slug_new = cfg_new.option("printhost_slug"); - - // If the new print host data is undefined, use the old data. - bool new_print_host_undefined = (opt_print_host_new == nullptr || opt_print_host_new ->empty()) && - (opt_printhost_apikey_new == nullptr || opt_printhost_apikey_new ->empty()) && - (opt_printhost_cafile_new == nullptr || opt_printhost_cafile_new ->empty()) && - (opt_printhost_slug_new == nullptr || opt_printhost_slug_new ->empty()); - if (new_print_host_undefined) - return ProfileHostParams::Anonymized; - - auto opt_same = [](const ConfigOptionString *l, const ConfigOptionString *r) { - return ((l == nullptr || l->empty()) && (r == nullptr || r->empty())) || - (l != nullptr && r != nullptr && l->value == r->value); - }; - return (opt_same(opt_print_host_old, opt_print_host_new) && opt_same(opt_printhost_apikey_old, opt_printhost_apikey_new) && - opt_same(opt_printhost_cafile_old, opt_printhost_cafile_new) && opt_same(opt_printhost_slug_old, opt_printhost_slug_new)) - ? ProfileHostParams::Same : ProfileHostParams::Different; -} - static bool profile_print_params_same(const DynamicPrintConfig &cfg_old, const DynamicPrintConfig &cfg_new) { t_config_option_keys diff = cfg_old.diff(cfg_new); @@ -949,10 +915,11 @@ static bool profile_print_params_same(const DynamicPrintConfig &cfg_old, const D "compatible_printers", "compatible_printers_condition", "inherits", "print_settings_id", "filament_settings_id", "sla_print_settings_id", "sla_material_settings_id", "printer_settings_id", "printer_model", "printer_variant", "default_print_profile", "default_filament_profile", "default_sla_print_profile", "default_sla_material_profile", - "print_host", "printhost_apikey", "printhost_slug", "printhost_cafile" }) + //FIXME remove the print host keys? + "print_host", "printhost_apikey", "printhost_cafile", "printhost_port" }) diff.erase(std::remove(diff.begin(), diff.end(), key), diff.end()); // Preset with the same name as stored inside the config exists. - return diff.empty() && profile_host_params_same_or_anonymized(cfg_old, cfg_new) != ProfileHostParams::Different; + return diff.empty(); } // Load a preset from an already parsed config file, insert it into the sorted sequence of presets @@ -981,27 +948,12 @@ Preset& PresetCollection::load_external_preset( it = this->find_preset_renamed(original_name); found = it != m_presets.end(); } - if (found) { - if (profile_print_params_same(it->config, cfg)) { + if (found && profile_print_params_same(it->config, cfg)) { // The preset exists and it matches the values stored inside config. if (select) this->select_preset(it - m_presets.begin()); return *it; } - if (profile_host_params_same_or_anonymized(it->config, cfg) == ProfileHostParams::Anonymized) { - // The project being loaded is anonymized. Replace the empty host keys of the loaded profile with the data from the original profile. - // See "Octoprint Settings when Opening a .3MF file" GH issue #3244 - auto opt_update = [it, &cfg](const std::string &opt_key) { - auto opt = it->config.option(opt_key); - if (opt != nullptr) - cfg.set_key_value(opt_key, opt->clone()); - }; - opt_update("print_host"); - opt_update("printhost_apikey"); - opt_update("printhost_cafile"); - opt_update("printhost_slug"); - } - } // Update the "inherits" field. std::string &inherits = Preset::inherits(cfg); if (found && inherits.empty()) { @@ -1579,7 +1531,7 @@ const std::vector& PhysicalPrinter::printer_options() "print_host", "printhost_apikey", "printhost_cafile", - "printhost_slug", + "printhost_port", "printhost_authorization_type", // HTTP digest authentization (RFC 2617) "printhost_user", @@ -1589,19 +1541,12 @@ const std::vector& PhysicalPrinter::printer_options() return s_opts; } -const std::vector& PhysicalPrinter::print_host_options() -{ - static std::vector s_opts; - if (s_opts.empty()) { - s_opts = { +static constexpr auto legacy_print_host_options = { "print_host", "printhost_apikey", "printhost_cafile", - "printhost_slug" + "printhost_port" }; - } - return s_opts; -} std::vector PhysicalPrinter::presets_with_print_host_information(const PrinterPresetCollection& printer_presets) { @@ -1615,7 +1560,7 @@ std::vector PhysicalPrinter::presets_with_print_host_information(co bool PhysicalPrinter::has_print_host_information(const DynamicPrintConfig& config) { - for (const std::string& opt : print_host_options()) + for (const char *opt : legacy_print_host_options) if (!config.opt_string(opt).empty()) return true; @@ -1632,6 +1577,7 @@ bool PhysicalPrinter::has_empty_config() const return config.opt_string("print_host" ).empty() && config.opt_string("printhost_apikey" ).empty() && config.opt_string("printhost_cafile" ).empty() && + config.opt_string("printhost_port" ).empty() && config.opt_string("printhost_user" ).empty() && config.opt_string("printhost_password").empty() && config.opt_string("printhost_slug" ).empty(); @@ -1818,9 +1764,7 @@ void PhysicalPrinterCollection::load_printers_from_presets(PrinterPresetCollecti int cnt=0; for (Preset& preset: printer_presets) { DynamicPrintConfig& config = preset.config; - const std::vector& options = PhysicalPrinter::print_host_options(); - - for(const std::string& option : options) { + for(const char* option : legacy_print_host_options) { if (!config.opt_string(option).empty()) { // check if printer with those "Print Host upload" options already exist PhysicalPrinter* existed_printer = find_printer_with_same_config(config); @@ -1839,7 +1783,7 @@ void PhysicalPrinterCollection::load_printers_from_presets(PrinterPresetCollecti } // erase "Print Host upload" information from the preset - for (const std::string& opt : options) + for (const char *opt : legacy_print_host_options) config.opt_string(opt).clear(); // save changes for preset preset.save(); @@ -1847,7 +1791,7 @@ void PhysicalPrinterCollection::load_printers_from_presets(PrinterPresetCollecti // update those changes for edited preset if it's equal to the preset Preset& edited = printer_presets.get_edited_preset(); if (preset.name == edited.name) { - for (const std::string& opt : options) + for (const char *opt : legacy_print_host_options) edited.config.opt_string(opt).clear(); } @@ -1896,7 +1840,7 @@ PhysicalPrinter* PhysicalPrinterCollection::find_printer_with_same_config(const { for (const PhysicalPrinter& printer :*this) { bool is_equal = true; - for (const std::string& opt : PhysicalPrinter::print_host_options()) + for (const char *opt : legacy_print_host_options) if (is_equal && printer.config.opt_string(opt) != config.opt_string(opt)) is_equal = false; diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index e4ddc25fd..e8d493a5a 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -37,11 +37,11 @@ static std::vector s_project_options { const char *PresetBundle::PRUSA_BUNDLE = "PrusaResearch"; PresetBundle::PresetBundle() : - prints(Preset::TYPE_PRINT, Preset::print_options(), static_cast(FullPrintConfig::defaults())), - filaments(Preset::TYPE_FILAMENT, Preset::filament_options(), static_cast(FullPrintConfig::defaults())), + prints(Preset::TYPE_PRINT, Preset::print_options(), static_cast(FullPrintConfig::defaults())), + filaments(Preset::TYPE_FILAMENT, Preset::filament_options(), static_cast(FullPrintConfig::defaults())), sla_materials(Preset::TYPE_SLA_MATERIAL, Preset::sla_material_options(), static_cast(SLAFullPrintConfig::defaults())), sla_prints(Preset::TYPE_SLA_PRINT, Preset::sla_print_options(), static_cast(SLAFullPrintConfig::defaults())), - printers(Preset::TYPE_PRINTER, Preset::printer_options(), static_cast(FullPrintConfig::defaults()), "- default FFF -"), + printers(Preset::TYPE_PRINTER, Preset::printer_options(), static_cast(FullPrintConfig::defaults()), "- default FFF -"), physical_printers(PhysicalPrinter::printer_options()) { // The following keys are handled by the UI, they do not have a counterpart in any StaticPrintConfig derived classes, @@ -77,11 +77,12 @@ PresetBundle::PresetBundle() : for (size_t i = 0; i < 2; ++ i) { // The following ugly switch is to avoid printers.preset(0) to return the edited instance, as the 0th default is the current one. Preset &preset = this->printers.default_preset(i); - preset.config.optptr("printer_settings_id", true); - preset.config.optptr("printer_vendor", true); - preset.config.optptr("printer_model", true); - preset.config.optptr("printer_variant", true); - preset.config.optptr("thumbnails", true); + for (const char *key : { + "printer_settings_id", "printer_vendor", "printer_model", "printer_variant", "thumbnails", + //FIXME the following keys are only created here for compatibility to be able to parse legacy Printer profiles. + // These keys are converted to Physical Printer profile. After the conversion, they shall be removed. + "host_type", "print_host", "printhost_apikey", "printhost_cafile"}) + preset.config.optptr(key, true); if (i == 0) { preset.config.optptr("default_print_profile", true); preset.config.option("default_filament_profile", true)->values = { "" }; @@ -458,7 +459,7 @@ void PresetBundle::load_selections(AppConfig &config, const std::string &preferr this->update_multi_material_filament_presets(); // Parse the initial physical printer name. - std::string initial_physical_printer_name = remove_ini_suffix(config.get("extras", "physical_printer")); + std::string initial_physical_printer_name = remove_ini_suffix(config.get("presets", "physical_printer")); // Activate physical printer from the config if (!initial_physical_printer_name.empty()) @@ -482,8 +483,7 @@ void PresetBundle::export_selections(AppConfig &config) config.set("presets", "sla_print", sla_prints.get_selected_preset_name()); config.set("presets", "sla_material", sla_materials.get_selected_preset_name()); config.set("presets", "printer", printers.get_selected_preset_name()); - - config.set("extras", "physical_printer", physical_printers.get_selected_full_printer_name()); + config.set("presets", "physical_printer", physical_printers.get_selected_full_printer_name()); } DynamicPrintConfig PresetBundle::full_config() const @@ -496,6 +496,7 @@ DynamicPrintConfig PresetBundle::full_config() const DynamicPrintConfig PresetBundle::full_config_secure() const { DynamicPrintConfig config = this->full_config(); + //FIXME legacy, the keys should not be there after conversion to a Physical Printer profile. config.erase("print_host"); config.erase("printhost_apikey"); config.erase("printhost_cafile"); diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 6ace0a90c..81730c78d 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -151,11 +151,11 @@ void PrintConfigDef::init_common_params() def->mode = comAdvanced; def->set_default_value(new ConfigOptionString("")); - def = this->add("printhost_slug", coString); + def = this->add("printhost_port", coString); def->label = L("Printer"); def->tooltip = L("Name of the printer"); - def->mode = comAdvanced; def->gui_type = "select_open"; + def->mode = comAdvanced; def->set_default_value(new ConfigOptionString("")); def = this->add("printhost_cafile", coString); @@ -2883,27 +2883,6 @@ void PrintConfigDef::init_fff_params() def->set_default_value(new ConfigOptionFloat(30)); #endif - def = this->add("serial_port", coString); - def->gui_type = "select_open"; - def->label = ""; - def->full_label = L("Serial port"); - def->category = OptionCategory::general; - def->tooltip = L("USB/serial port for printer connection."); - def->width = 20; - def->set_default_value(new ConfigOptionString("")); - - def = this->add("serial_speed", coInt); - def->gui_type = "i_enum_open"; - def->label = OptionCategory::general; - def->full_label = L("Serial port speed"); - def->tooltip = L("Speed (baud) of USB/serial port for printer connection."); - def->min = 1; - def->max = 300000; - def->enum_values.push_back("115200"); - def->enum_values.push_back("250000"); - def->mode = comAdvanced; - def->set_default_value(new ConfigOptionInt(250000)); - def = this->add("skirt_distance", coFloat); def->label = L("Distance from object"); def->category = OptionCategory::skirtBrim; @@ -4869,7 +4848,7 @@ void PrintConfigDef::handle_legacy(t_config_option_key &opt_key, std::string &va #ifndef HAS_PRESSURE_EQUALIZER "max_volumetric_extrusion_rate_slope_positive", "max_volumetric_extrusion_rate_slope_negative", #endif /* HAS_PRESSURE_EQUALIZER */ - "cooling" + "cooling", "serial_port", "serial_speed" }; // In PrusaSlicer 2.3.0-alpha0 the "monotonous" infill was introduced, which was later renamed to "monotonic". @@ -5295,7 +5274,6 @@ StaticPrintConfig::StaticCache PrintRegionConfi StaticPrintConfig::StaticCache MachineEnvelopeConfig::s_cache_MachineEnvelopeConfig; StaticPrintConfig::StaticCache GCodeConfig::s_cache_GCodeConfig; StaticPrintConfig::StaticCache PrintConfig::s_cache_PrintConfig; -StaticPrintConfig::StaticCache HostConfig::s_cache_HostConfig; StaticPrintConfig::StaticCache FullPrintConfig::s_cache_FullPrintConfig; StaticPrintConfig::StaticCache SLAMaterialConfig::s_cache_SLAMaterialConfig; diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index cc94dd587..15bfbb121 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -11,11 +11,10 @@ // class StaticPrintConfig : public StaticConfig // class PrintObjectConfig : public StaticPrintConfig // class PrintRegionConfig : public StaticPrintConfig -// class HostConfig : public StaticPrintConfig // class MachineEnvelopeConfig : public StaticPrintConfig // class GCodeConfig : public StaticPrintConfig // class PrintConfig : public MachineEnvelopeConfig, public GCodeConfig -// class FullPrintConfig : PrintObjectConfig,PrintRegionConfig,PrintConfig,HostConfig +// class FullPrintConfig : PrintObjectConfig,PrintRegionConfig,PrintConfig // class SLAPrintObjectConfig : public StaticPrintConfig // class SLAMaterialConfig : public StaticPrintConfig // class SLAPrinterConfig : public StaticPrintConfig @@ -1350,40 +1349,14 @@ protected: } }; -class HostConfig : public StaticPrintConfig -{ - STATIC_PRINT_CONFIG_CACHE(HostConfig) -public: - ConfigOptionEnum host_type; - ConfigOptionString print_host; - ConfigOptionString printhost_apikey; - ConfigOptionString printhost_cafile; - ConfigOptionString printhost_slug; - ConfigOptionString serial_port; - ConfigOptionInt serial_speed; - -protected: - void initialize(StaticCacheBase &cache, const char *base_ptr) - { - OPT_PTR(host_type); - OPT_PTR(print_host); - OPT_PTR(printhost_apikey); - OPT_PTR(printhost_cafile); - OPT_PTR(printhost_slug); - OPT_PTR(serial_port); - OPT_PTR(serial_speed); - } -}; - // This object is mapped to Perl as Slic3r::Config::Full. class FullPrintConfig : public PrintObjectConfig, public PrintRegionConfig, - public PrintConfig, - public HostConfig + public PrintConfig { STATIC_PRINT_CONFIG_CACHE_DERIVED(FullPrintConfig) - FullPrintConfig() : PrintObjectConfig(0), PrintRegionConfig(0), PrintConfig(0), HostConfig(0) { initialize_cache(); *this = s_cache_FullPrintConfig.defaults(); } + FullPrintConfig() : PrintObjectConfig(0), PrintRegionConfig(0), PrintConfig(0) { initialize_cache(); *this = s_cache_FullPrintConfig.defaults(); } public: // Validate the FullPrintConfig. Returns an empty string on success, otherwise an error message is returned. @@ -1391,13 +1364,12 @@ public: protected: // Protected constructor to be called to initialize ConfigCache::m_default. - FullPrintConfig(int) : PrintObjectConfig(0), PrintRegionConfig(0), PrintConfig(0), HostConfig(0) {} + FullPrintConfig(int) : PrintObjectConfig(0), PrintRegionConfig(0), PrintConfig(0) {} void initialize(StaticCacheBase &cache, const char *base_ptr) { this->PrintObjectConfig::initialize(cache, base_ptr); this->PrintRegionConfig::initialize(cache, base_ptr); this->PrintConfig ::initialize(cache, base_ptr); - this->HostConfig ::initialize(cache, base_ptr); } }; diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 7c63c3ffd..5c2098051 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -58,4 +58,11 @@ #define ENABLE_GCODE_VIEWER_DATA_CHECKING (0 && ENABLE_GCODE_VIEWER) +//=================== +// 2.3.0.alpha3 techs +//=================== +#define ENABLE_2_3_0_ALPHA3 1 + +#define ENABLE_CTRL_M_ON_WINDOWS (0 && ENABLE_2_3_0_ALPHA3) + #endif // _prusaslicer_technologies_h_ diff --git a/src/libslic3r/Zipper.cpp b/src/libslic3r/Zipper.cpp index 7a95829cd..cebafa633 100644 --- a/src/libslic3r/Zipper.cpp +++ b/src/libslic3r/Zipper.cpp @@ -25,12 +25,12 @@ public: std::string formatted_errorstr() const { return L("Error with zip archive") + " " + m_zipname + ": " + - get_errorstr() + "!"; + get_errorstr(); } SLIC3R_NORETURN void blow_up() const { - throw Slic3r::RuntimeError(formatted_errorstr()); + throw Slic3r::ExportError(formatted_errorstr()); } bool is_alive() diff --git a/src/libslic3r/utils.cpp b/src/libslic3r/utils.cpp index dbcb271bb..b0ae39c6f 100644 --- a/src/libslic3r/utils.cpp +++ b/src/libslic3r/utils.cpp @@ -429,24 +429,20 @@ CopyFileResult copy_file_inner(const std::string& from, const std::string& to, s // the copy_file() function will fail appropriately and we don't want the permission() // calls to cause needless failures on permissionless filesystems (ie. FATs on SD cards etc.) // or when the target file doesn't exist. - - //This error code is ignored boost::system::error_code ec; - boost::filesystem::permissions(target, perms, ec); - //if (ec) - // BOOST_LOG_TRIVIAL(error) << "Copy file permisions before copy error message: " << ec.message(); - // This error code is passed up + if (ec) + BOOST_LOG_TRIVIAL(error) << "boost::filesystem::permisions before copy error message (this could be irrelevant message based on file system): " << ec.message(); ec.clear(); boost::filesystem::copy_file(source, target, boost::filesystem::copy_option::overwrite_if_exists, ec); if (ec) { error_message = ec.message(); return FAIL_COPY_FILE; } - //ec.clear(); + ec.clear(); boost::filesystem::permissions(target, perms, ec); - //if (ec) - // BOOST_LOG_TRIVIAL(error) << "Copy file permisions after copy error message: " << ec.message(); + if (ec) + BOOST_LOG_TRIVIAL(error) << "boost::filesystem::permisions after copy error message (this could be irrelevant message based on file system): " << ec.message(); return SUCCESS; } diff --git a/src/platform/unix/PrusaGcodeviewer.desktop b/src/platform/unix/PrusaGcodeviewer.desktop new file mode 100644 index 000000000..b6c419b0f --- /dev/null +++ b/src/platform/unix/PrusaGcodeviewer.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Name=Prusa GCode viewer +Exec=prusa-slicer --gcodeviewer %F +Icon=PrusaSlicer # TODO: change when the new icon is ready +Terminal=false +Type=Application +MimeType=text/x.gcode; +Categories=Graphics;3DGraphics; +Keywords=3D;Printing;Slicer; \ No newline at end of file diff --git a/src/platform/unix/PrusaSlicer.desktop b/src/platform/unix/PrusaSlicer.desktop index 464873f45..dae507b54 100644 --- a/src/platform/unix/PrusaSlicer.desktop +++ b/src/platform/unix/PrusaSlicer.desktop @@ -1,9 +1,12 @@ [Desktop Entry] Name=PrusaSlicer -Exec=prusa-slicer %F +GenericName=3D Printing Software Icon=PrusaSlicer +Exec=prusa-slicer %F Terminal=false Type=Application MimeType=model/stl;application/vnd.ms-3mfdocument;application/prs.wavefront-obj;application/x-amf; -Categories=Graphics;3DGraphics; -Keywords=3D;Printing;Slicer; \ No newline at end of file +Categories=Graphics;3DGraphics;Engineering; +Keywords=3D;Printing;Slicer;slice;3D;printer;convert;gcode;stl;obj;amf;SLA +StartupNotify=false +StartupWMClass=prusa-slicer \ No newline at end of file diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index 97d202461..95d09bedc 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -129,6 +129,8 @@ set(SLIC3R_GUI_SOURCES GUI/Field.hpp GUI/OptionsGroup.cpp GUI/OptionsGroup.hpp + GUI/OG_CustomCtrl.cpp + GUI/OG_CustomCtrl.hpp GUI/BedShapeDialog.cpp GUI/BedShapeDialog.hpp GUI/2DBed.cpp diff --git a/src/slic3r/Config/Snapshot.cpp b/src/slic3r/Config/Snapshot.cpp index 45dc99874..54d1dea57 100644 --- a/src/slic3r/Config/Snapshot.cpp +++ b/src/slic3r/Config/Snapshot.cpp @@ -31,8 +31,11 @@ void Snapshot::clear() this->comment.clear(); this->reason = SNAPSHOT_UNKNOWN; this->print.clear(); + this->sla_print.clear(); this->filaments.clear(); + this->sla_material.clear(); this->printer.clear(); + this->physical_printer.clear(); } void Snapshot::load_ini(const std::string &path) @@ -94,6 +97,8 @@ void Snapshot::load_ini(const std::string &path) for (auto &kvp : section.second) { if (kvp.first == "print") { this->print = kvp.second.data(); + } else if (kvp.first == "sla_print") { + this->sla_print = kvp.second.data(); } else if (boost::starts_with(kvp.first, "filament")) { int idx = 0; if (kvp.first == "filament" || sscanf(kvp.first.c_str(), "filament_%d", &idx) == 1) { @@ -101,8 +106,12 @@ void Snapshot::load_ini(const std::string &path) this->filaments.resize(idx + 1, std::string()); this->filaments[idx] = kvp.second.data(); } + } else if (kvp.first == "sla_material") { + this->sla_material = kvp.second.data(); } else if (kvp.first == "printer") { this->printer = kvp.second.data(); + } else if (kvp.first == "physical_printer") { + this->physical_printer = kvp.second.data(); } } } else if (boost::starts_with(section.first, group_name_vendor) && section.first.size() > group_name_vendor.size()) { @@ -172,10 +181,13 @@ void Snapshot::save_ini(const std::string &path) // Export the active presets at the time of the snapshot. c << std::endl << "[presets]" << std::endl; c << "print = " << this->print << std::endl; + c << "sla_print = " << this->sla_print << std::endl; c << "filament = " << this->filaments.front() << std::endl; for (size_t i = 1; i < this->filaments.size(); ++ i) c << "filament_" << std::to_string(i) << " = " << this->filaments[i] << std::endl; + c << "sla_material = " << this->sla_material << std::endl; c << "printer = " << this->printer << std::endl; + c << "physical_printer = " << this->physical_printer << std::endl; // Export the vendor configs. for (const VendorConfig &vc : this->vendor_configs) { @@ -199,14 +211,17 @@ void Snapshot::export_selections(AppConfig &config) const { assert(filaments.size() >= 1); config.clear_section("presets"); - config.set("presets", "print", print); - config.set("presets", "filament", filaments.front()); + config.set("presets", "print", print); + config.set("presets", "sla_print", sla_print); + config.set("presets", "filament", filaments.front()); for (unsigned i = 1; i < filaments.size(); ++i) { char name[64]; sprintf(name, "filament_%u", i); config.set("presets", name, filaments[i]); } - config.set("presets", "printer", printer); + config.set("presets", "sla_material", sla_material); + config.set("presets", "printer", printer); + config.set("presets", "physical_printer", physical_printer); } void Snapshot::export_vendor_configs(AppConfig &config) const @@ -217,8 +232,10 @@ void Snapshot::export_vendor_configs(AppConfig &config) const config.set_vendors(std::move(vendors)); } -// Perform a deep compare of the active print / filament / printer / vendor directories. -// Return true if the content of the current print / filament / printer / vendor directories +static constexpr auto snapshot_subdirs = { "print", "sla_print", "filament", "sla_material", "printer", "physical_printer", "vendor" }; + +// Perform a deep compare of the active print / sla_print / filament / sla_material / printer / physical_printer / vendor directories. +// Return true if the content of the current print / sla_print / filament / sla_material / printer / physical_printer / vendor directories // matches the state stored in this snapshot. bool Snapshot::equal_to_active(const AppConfig &app_config) const { @@ -243,7 +260,7 @@ bool Snapshot::equal_to_active(const AppConfig &app_config) const // 2) Check, whether this snapshot references the same set of ini files as the current state. boost::filesystem::path data_dir = boost::filesystem::path(Slic3r::data_dir()); boost::filesystem::path snapshot_dir = boost::filesystem::path(Slic3r::data_dir()) / SLIC3R_SNAPSHOTS_DIR / this->id; - for (const char *subdir : { "print", "filament", "printer", "vendor" }) { + for (const char *subdir : snapshot_subdirs) { boost::filesystem::path path1 = data_dir / subdir; boost::filesystem::path path2 = snapshot_dir / subdir; std::vector files1, files2; @@ -369,9 +386,12 @@ const Snapshot& SnapshotDB::take_snapshot(const AppConfig &app_config, Snapshot: snapshot.comment = comment; snapshot.reason = reason; // Active presets at the time of the snapshot. - snapshot.print = app_config.get("presets", "print"); + snapshot.print = app_config.get("presets", "print"); + snapshot.sla_print = app_config.get("presets", "sla_print"); snapshot.filaments.emplace_back(app_config.get("presets", "filament")); - snapshot.printer = app_config.get("presets", "printer"); + snapshot.sla_material = app_config.get("presets", "sla_material"); + snapshot.printer = app_config.get("presets", "printer"); + snapshot.physical_printer = app_config.get("presets", "physical_printer"); for (unsigned i = 1; i < 1000; ++ i) { char name[64]; sprintf(name, "filament_%u", i); @@ -414,7 +434,7 @@ const Snapshot& SnapshotDB::take_snapshot(const AppConfig &app_config, Snapshot: boost::filesystem::create_directory(snapshot_dir); // Backup the presets. - for (const char *subdir : { "print", "filament", "printer", "vendor" }) + for (const char *subdir : snapshot_subdirs) copy_config_dir_single_level(data_dir / subdir, snapshot_dir / subdir); snapshot.save_ini((snapshot_dir / "snapshot.ini").string()); assert(m_snapshots.empty() || m_snapshots.back().time_captured <= snapshot.time_captured); @@ -438,11 +458,11 @@ void SnapshotDB::restore_snapshot(const Snapshot &snapshot, AppConfig &app_confi boost::filesystem::path snapshot_db_dir = SnapshotDB::create_db_dir(); boost::filesystem::path snapshot_dir = snapshot_db_dir / snapshot.id; // Remove existing ini files and restore the ini files from the snapshot. - for (const char *subdir : { "print", "filament", "printer", "vendor" }) { + for (const char *subdir : snapshot_subdirs) { delete_existing_ini_files(data_dir / subdir); copy_config_dir_single_level(snapshot_dir / subdir, data_dir / subdir); } - // Update AppConfig with the selections of the print / filament / printer profiles + // Update AppConfig with the selections of the print / sla_print / filament / sla_material / printer profiles // and about the installed printer types and variants. snapshot.export_selections(app_config); snapshot.export_vendor_configs(app_config); diff --git a/src/slic3r/Config/Snapshot.hpp b/src/slic3r/Config/Snapshot.hpp index c6bd5c6e8..48add8a1a 100644 --- a/src/slic3r/Config/Snapshot.hpp +++ b/src/slic3r/Config/Snapshot.hpp @@ -23,8 +23,11 @@ namespace Config { // Slic3r.ini // vendor/ // print/ +// sla_print/ // filament/ +// sla_material // printer/ +// physical_printer/ class Snapshot { public: @@ -42,12 +45,12 @@ public: void load_ini(const std::string &path); void save_ini(const std::string &path); - // Export the print / filament / printer selections to be activated into the AppConfig. + // Export the print / sla_print / filament / sla_material / printer selections to be activated into the AppConfig. void export_selections(AppConfig &config) const; void export_vendor_configs(AppConfig &config) const; - // Perform a deep compare of the active print / filament / printer / vendor directories. - // Return true if the content of the current print / filament / printer / vendor directories + // Perform a deep compare of the active print / sla_print / filament / sla_material / printer / physical_printer / vendor directories. + // Return true if the content of the current print / sla_print / filament / sla_material / printer / physical_printer / vendor directories // matches the state stored in this snapshot. bool equal_to_active(const AppConfig &app_config) const; @@ -65,8 +68,11 @@ public: // Active presets at the time of the snapshot. std::string print; + std::string sla_print; std::vector filaments; + std::string sla_material; std::string printer; + std::string physical_printer; // Annotation of the vendor configuration stored in the snapshot. // This information is displayed to the user and used to decide compatibility @@ -97,7 +103,7 @@ public: size_t load_db(); void update_slic3r_versions(std::vector &index_db); - // Create a snapshot directory, copy the vendor config bundles, user print/filament/printer profiles, + // Create a snapshot directory, copy the vendor config bundles, user print / sla_print / filament / sla_material / printer / physical_printer profiles, // create an index. const Snapshot& take_snapshot(const AppConfig &app_config, Snapshot::Reason reason, const std::string &comment = ""); const Snapshot& restore_snapshot(const std::string &id, AppConfig &app_config); diff --git a/src/slic3r/GUI/BackgroundSlicingProcess.cpp b/src/slic3r/GUI/BackgroundSlicingProcess.cpp index 5fcdd4e7d..dbbccc6ff 100644 --- a/src/slic3r/GUI/BackgroundSlicingProcess.cpp +++ b/src/slic3r/GUI/BackgroundSlicingProcess.cpp @@ -53,6 +53,24 @@ bool SlicingProcessCompletedEvent::critical_error() const return true; } +bool SlicingProcessCompletedEvent::invalidate_plater() const +{ + if (critical_error()) + { + try { + this->rethrow_exception(); + } + catch (const Slic3r::ExportError&) { + // Exception thrown by copying file does not ivalidate plater + return false; + } + catch (...) { + } + return true; + } + return false; +} + std::string SlicingProcessCompletedEvent::format_error_message() const { std::string error; @@ -143,19 +161,19 @@ void BackgroundSlicingProcess::process_fff() switch (copy_ret_val) { case SUCCESS: break; // no error case FAIL_COPY_FILE: - throw Slic3r::RuntimeError((boost::format(_utf8(L("Copying of the temporary G-code to the output G-code failed. Maybe the SD card is write locked?\nError message: %1%"))) % error_message).str()); + throw Slic3r::ExportError((boost::format(_utf8(L("Copying of the temporary G-code to the output G-code failed. Maybe the SD card is write locked?\nError message: %1%"))) % error_message).str()); break; case FAIL_FILES_DIFFERENT: - throw Slic3r::RuntimeError((boost::format(_utf8(L("Copying of the temporary G-code to the output G-code failed. There might be problem with target device, please try exporting again or using different device. The corrupted output G-code is at %1%.tmp."))) % export_path).str()); + throw Slic3r::ExportError((boost::format(_utf8(L("Copying of the temporary G-code to the output G-code failed. There might be problem with target device, please try exporting again or using different device. The corrupted output G-code is at %1%.tmp."))) % export_path).str()); break; case FAIL_RENAMING: - throw Slic3r::RuntimeError((boost::format(_utf8(L("Renaming of the G-code after copying to the selected destination folder has failed. Current path is %1%.tmp. Please try exporting again."))) % export_path).str()); + throw Slic3r::ExportError((boost::format(_utf8(L("Renaming of the G-code after copying to the selected destination folder has failed. Current path is %1%.tmp. Please try exporting again."))) % export_path).str()); break; case FAIL_CHECK_ORIGIN_NOT_OPENED: - throw Slic3r::RuntimeError((boost::format(_utf8(L("Copying of the temporary G-code has finished but the original code at %1% couldn't be opened during copy check. The output G-code is at %2%.tmp."))) % m_temp_output_path % export_path).str()); + throw Slic3r::ExportError((boost::format(_utf8(L("Copying of the temporary G-code has finished but the original code at %1% couldn't be opened during copy check. The output G-code is at %2%.tmp."))) % m_temp_output_path % export_path).str()); break; case FAIL_CHECK_TARGET_NOT_OPENED: - throw Slic3r::RuntimeError((boost::format(_utf8(L("Copying of the temporary G-code has finished but the exported code couldn't be opened during copy check. The output G-code is at %1%.tmp."))) % export_path).str()); + throw Slic3r::ExportError((boost::format(_utf8(L("Copying of the temporary G-code has finished but the exported code couldn't be opened during copy check. The output G-code is at %1%.tmp."))) % export_path).str()); break; default: throw Slic3r::RuntimeError(_utf8(L("Unknown error occured during exporting G-code."))); diff --git a/src/slic3r/GUI/BackgroundSlicingProcess.hpp b/src/slic3r/GUI/BackgroundSlicingProcess.hpp index a34305bce..1e68ef2d0 100644 --- a/src/slic3r/GUI/BackgroundSlicingProcess.hpp +++ b/src/slic3r/GUI/BackgroundSlicingProcess.hpp @@ -57,6 +57,8 @@ public: bool error() const { return m_status == Error; } // Unhandled error produced by stdlib or a Win32 structured exception, or unhandled Slic3r's own critical exception. bool critical_error() const; + // Critical errors does invalidate plater except CopyFileError. + bool invalidate_plater() const; // Only valid if error() void rethrow_exception() const { assert(this->error()); assert(m_exception); std::rethrow_exception(m_exception); } // Produce a human readable message to be displayed by a notification or a message box. diff --git a/src/slic3r/GUI/Camera.cpp b/src/slic3r/GUI/Camera.cpp index 510d8ad22..360ee4833 100644 --- a/src/slic3r/GUI/Camera.cpp +++ b/src/slic3r/GUI/Camera.cpp @@ -32,15 +32,6 @@ double Camera::MaxFovDeg = 60.0; Camera::Camera() : requires_zoom_to_bed(false) - , m_type(Perspective) - , m_target(Vec3d::Zero()) - , m_zenit(45.0f) - , m_zoom(1.0) - , m_distance(DefaultDistance) - , m_gui_scale(1.0) - , m_view_matrix(Transform3d::Identity()) - , m_view_rotation(1., 0., 0., 0.) - , m_projection_matrix(Transform3d::Identity()) { set_default_orientation(); } @@ -58,11 +49,12 @@ std::string Camera::get_type_as_string() const void Camera::set_type(EType type) { - if (m_type != type) - { + if (m_type != type) { m_type = type; - wxGetApp().app_config->set("use_perspective_camera", (m_type == Perspective) ? "1" : "0"); - wxGetApp().app_config->save(); + if (m_update_config_on_type_change_enabled) { + wxGetApp().app_config->set("use_perspective_camera", (m_type == Perspective) ? "1" : "0"); + wxGetApp().app_config->save(); + } } } diff --git a/src/slic3r/GUI/Camera.hpp b/src/slic3r/GUI/Camera.hpp index 6e4256235..99b6f05d4 100644 --- a/src/slic3r/GUI/Camera.hpp +++ b/src/slic3r/GUI/Camera.hpp @@ -29,19 +29,20 @@ struct Camera bool requires_zoom_to_bed; private: - EType m_type; - Vec3d m_target; - float m_zenit; - double m_zoom; + EType m_type{ Perspective }; + bool m_update_config_on_type_change_enabled{ false }; + Vec3d m_target{ Vec3d::Zero() }; + float m_zenit{ 45.0f }; + double m_zoom{ 1.0 }; // Distance between camera position and camera target measured along the camera Z axis - mutable double m_distance; - mutable double m_gui_scale; + mutable double m_distance{ DefaultDistance }; + mutable double m_gui_scale{ 1.0 }; mutable std::array m_viewport; - mutable Transform3d m_view_matrix; + mutable Transform3d m_view_matrix{ Transform3d::Identity() }; // We are calculating the rotation part of the m_view_matrix from m_view_rotation. - mutable Eigen::Quaterniond m_view_rotation; - mutable Transform3d m_projection_matrix; + mutable Eigen::Quaterniond m_view_rotation{ 1.0, 0.0, 0.0, 0.0 }; + mutable Transform3d m_projection_matrix{ Transform3d::Identity() }; mutable std::pair m_frustrum_zs; BoundingBoxf3 m_scene_box; @@ -56,6 +57,8 @@ public: void set_type(const std::string& type); void select_next_type(); + void enable_update_config_on_type_change(bool enable) { m_update_config_on_type_change_enabled = enable; } + const Vec3d& get_target() const { return m_target; } void set_target(const Vec3d& target); diff --git a/src/slic3r/GUI/ConfigSnapshotDialog.cpp b/src/slic3r/GUI/ConfigSnapshotDialog.cpp index cdeb03bbb..8e3760c10 100644 --- a/src/slic3r/GUI/ConfigSnapshotDialog.cpp +++ b/src/slic3r/GUI/ConfigSnapshotDialog.cpp @@ -48,9 +48,17 @@ static wxString generate_html_row(const Config::Snapshot &snapshot, bool row_eve text += "
"; // End of row header. text += _(L("SuperSlicer version")) + ": " + snapshot.slic3r_version_captured.to_string() + "
"; + bool has_fff = ! snapshot.print.empty() || ! snapshot.filaments.empty(); + bool has_sla = ! snapshot.sla_print.empty() || ! snapshot.sla_material.empty(); + if (has_fff || ! has_sla) { text += _(L("print")) + ": " + snapshot.print + "
"; text += _(L("filaments")) + ": " + snapshot.filaments.front() + "
"; - text += _(L("printer")) + ": " + snapshot.printer + "
"; + } + if (has_sla) { + text += _(L("SLA print")) + ": " + snapshot.sla_print + "
"; + text += _(L("SLA material")) + ": " + snapshot.sla_material + "
"; + } + text += _(L("printer")) + ": " + (snapshot.physical_printer.empty() ? snapshot.printer : snapshot.physical_printer) + "
"; bool compatible = true; for (const Config::Snapshot::VendorConfig &vc : snapshot.vendor_configs) { diff --git a/src/slic3r/GUI/DoubleSlider.cpp b/src/slic3r/GUI/DoubleSlider.cpp index 70a93d35f..ff634b045 100644 --- a/src/slic3r/GUI/DoubleSlider.cpp +++ b/src/slic3r/GUI/DoubleSlider.cpp @@ -12,9 +12,7 @@ #include "I18N.hpp" #include "ExtruderSequenceDialog.hpp" #include "libslic3r/Print.hpp" -#if ENABLE_GCODE_VIEWER #include "libslic3r/AppConfig.hpp" -#endif // ENABLE_GCODE_VIEWER #include #include @@ -55,11 +53,6 @@ static std::string gcode(Type type) } } -static bool is_lower_thumb_editable() -{ - return Slic3r::GUI::get_app_config()->get("seq_top_layer_only") == "0"; -} - Control::Control( wxWindow *parent, wxWindowID id, int lowerValue, @@ -305,6 +298,8 @@ wxSize Control::get_size() const void Control::get_size(int* w, int* h) const { GetSize(w, h); + if (m_draw_mode == dmSequentialGCodeView) + return; // we have no more icons for drawing is_horizontal() ? *w -= m_lock_icon_dim : *h -= m_lock_icon_dim; } @@ -481,8 +476,10 @@ void Control::draw_action_icon(wxDC& dc, const wxPoint pt_beg, const wxPoint pt_ { const int tick = m_selection == ssLower ? m_lower_value : m_higher_value; +#if ENABLE_GCODE_VIEWER if (!m_enable_action_icon) return; +#endif // ENABLE_GCODE_VIEWER // suppress add tick on first layer if (tick == 0) @@ -918,6 +915,10 @@ void Control::draw_revert_icon(wxDC& dc) void Control::draw_cog_icon(wxDC& dc) { +#if ENABLE_GCODE_VIEWER + if (m_draw_mode == dmSequentialGCodeView) + return; +#endif // ENABLE_GCODE_VIEWER int width, height; get_size(&width, &height); @@ -964,6 +965,13 @@ int Control::get_value_from_position(const wxCoord x, const wxCoord y) return int(m_min_value + double(height - SLIDER_MARGIN - y) / step + 0.5); } +bool Control::is_lower_thumb_editable() +{ + if (m_draw_mode == dmSequentialGCodeView) + return Slic3r::GUI::get_app_config()->get("seq_top_layer_only") == "0"; + return true; +} + bool Control::detect_selected_slider(const wxPoint& pt) { if (is_point_in_rect(pt, m_rect_lower_thumb)) diff --git a/src/slic3r/GUI/DoubleSlider.hpp b/src/slic3r/GUI/DoubleSlider.hpp index 899e7a58d..39a40eeb5 100644 --- a/src/slic3r/GUI/DoubleSlider.hpp +++ b/src/slic3r/GUI/DoubleSlider.hpp @@ -293,6 +293,7 @@ protected: void draw_thumb_text(wxDC& dc, const wxPoint& pos, const SelectedSlider& selection) const; void update_thumb_rect(const wxCoord begin_x, const wxCoord begin_y, const SelectedSlider& selection); + bool is_lower_thumb_editable(); bool detect_selected_slider(const wxPoint& pt); void correct_lower_value(); void correct_higher_value(); diff --git a/src/slic3r/GUI/Field.cpp b/src/slic3r/GUI/Field.cpp index 5793f6055..9060286ee 100644 --- a/src/slic3r/GUI/Field.cpp +++ b/src/slic3r/GUI/Field.cpp @@ -13,6 +13,7 @@ #include #include #include +#include "OG_CustomCtrl.hpp" #ifdef __WXOSX__ #define wxOSX true @@ -63,18 +64,16 @@ Field::~Field() m_back_to_initial_value = nullptr; if (m_back_to_sys_value) m_back_to_sys_value = nullptr; + if (getWindow()) { + wxWindow* win = getWindow(); + win->Destroy(); + win = nullptr; +} } void Field::PostInitialize() { auto color = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW); - m_Undo_btn = new RevertButton(m_parent, "bullet_white.png"); - m_Undo_to_sys_btn = new RevertButton(m_parent, "bullet_white.png"); - - m_Undo_btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent) { on_back_to_initial_value(); })); - m_Undo_to_sys_btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent) { on_back_to_sys_value(); })); - - m_blinking_bmp = new BlinkingBitmap(m_parent); switch (m_opt.type) { @@ -95,6 +94,7 @@ void Field::PostInitialize() // initialize m_unit_value m_em_unit = em_unit(m_parent); + parent_is_custom_ctrl = dynamic_cast(m_parent) != nullptr; BUILD(); @@ -217,10 +217,7 @@ void Field::get_value_by_opt_type(wxString& str, const bool check_value/* = true break; } - wxString label = m_Label->GetLabel(); - if (label.Last() == '\n') label.RemoveLast(); - while (label.Last() == ' ') label.RemoveLast(); - if (label.Last() == ':') label.RemoveLast(); + wxString label = m_opt.full_label.empty() ? _(m_opt.label) : _(m_opt.full_label); show_error(m_parent, from_u8((boost::format(_utf8(L("%s doesn't support percentage"))) % label).str())); set_value(double_to_string(m_opt.min), true); m_value = m_opt.min; @@ -317,28 +314,14 @@ void Field::get_value_by_opt_type(wxString& str, const bool check_value/* = true } } -void Field::msw_rescale(bool rescale_sidetext) +void Field::msw_rescale() { - m_Undo_to_sys_btn->msw_rescale(); - m_Undo_btn->msw_rescale(); - m_blinking_bmp->msw_rescale(); - // update em_unit value m_em_unit = em_unit(m_parent); - - // update sidetext if it is needed - if (m_side_text && rescale_sidetext) - { - auto size = wxSize(def_width_thinner() * m_em_unit, -1); - m_side_text->SetSize(size); - m_side_text->SetMinSize(size); } -} void Field::sys_color_changed() { - m_Undo_to_sys_btn->msw_rescale(); - m_Undo_btn->msw_rescale(); } template @@ -399,6 +382,8 @@ void TextCtrl::BUILD() { const long style = m_opt.multiline ? wxTE_MULTILINE : wxTE_PROCESS_ENTER/*0*/; auto temp = new wxTextCtrl(m_parent, wxID_ANY, text_value, wxDefaultPosition, size, style); + if (parent_is_custom_ctrl && m_opt.height < 0) + opt_height = (double)temp->GetSize().GetHeight()/m_em_unit; temp->SetFont(m_opt.is_code ? Slic3r::GUI::wxGetApp().code_font(): Slic3r::GUI::wxGetApp().normal_font()); @@ -562,16 +547,23 @@ boost::any& TextCtrl::get_value() return m_value; } -void TextCtrl::msw_rescale(bool rescale_sidetext/* = false*/) +void TextCtrl::msw_rescale() { - Field::msw_rescale(rescale_sidetext); + Field::msw_rescale(); auto size = wxSize(def_width() * m_em_unit, wxDefaultCoord); - if (m_opt.height >= 0) size.SetHeight(m_opt.height*m_em_unit); + + if (m_opt.height >= 0) + size.SetHeight(m_opt.height*m_em_unit); + else if (parent_is_custom_ctrl && opt_height > 0) + size.SetHeight(lround(opt_height*m_em_unit)); if (m_opt.width >= 0) size.SetWidth(m_opt.width*m_em_unit); if (size != wxDefaultSize) { wxTextCtrl* field = dynamic_cast(window); + if (parent_is_custom_ctrl) + field->SetSize(size); + else field->SetMinSize(size); } @@ -663,7 +655,7 @@ boost::any& CheckBox::get_value() return m_value; } -void CheckBox::msw_rescale(bool rescale_sidetext/* = false*/) +void CheckBox::msw_rescale() { Field::msw_rescale(); @@ -717,6 +709,9 @@ void SpinCtrl::BUILD() { temp->SetFont(Slic3r::GUI::wxGetApp().normal_font()); if (!wxOSX) temp->SetBackgroundStyle(wxBG_STYLE_PAINT); + if (m_opt.height < 0 && parent_is_custom_ctrl) + opt_height = (double)temp->GetSize().GetHeight() / m_em_unit; + // XXX: On OS X the wxSpinCtrl widget is made up of two subwidgets, unfortunatelly // the kill focus event is not propagated to the encompassing widget, // so we need to bind it on the inner text widget instead. (Ugh.) @@ -798,26 +793,35 @@ void SpinCtrl::propagate_value() suppress_propagation = false; } -void SpinCtrl::msw_rescale(bool rescale_sidetext/* = false*/) +void SpinCtrl::msw_rescale() { - Field::msw_rescale(rescale_sidetext); + Field::msw_rescale(); auto size = wxSize(wxDefaultSize); if (m_opt.height >= 0) size.SetHeight(m_opt.height * m_em_unit); if (m_opt.width >= 0) size.SetWidth(m_opt.width * m_em_unit); wxSpinCtrl* field = dynamic_cast(window); + if (parent_is_custom_ctrl) + field->SetSize(wxSize(def_width() * m_em_unit, lround(opt_height * m_em_unit))); + else field->SetMinSize(wxSize(def_width() * m_em_unit, int(1.9f*field->GetFont().GetPixelSize().y))); } +#ifdef __WXOSX__ +using choice_ctrl = wxBitmapComboBox; +#else +using choice_ctrl = wxComboBox; +#endif // __WXOSX__ + void Choice::BUILD() { wxSize size(def_width_wider() * m_em_unit, wxDefaultCoord); if (m_opt.height >= 0) size.SetHeight(m_opt.height*m_em_unit); if (m_opt.width >= 0) size.SetWidth(m_opt.width*m_em_unit); - wxBitmapComboBox* temp; + choice_ctrl* temp; if (!m_opt.gui_type.empty() && m_opt.gui_type.compare("select_open") != 0) { m_is_editable = true; - temp = new wxBitmapComboBox(m_parent, wxID_ANY, wxString(""), wxDefaultPosition, size); + temp = new choice_ctrl(m_parent, wxID_ANY, wxString(""), wxDefaultPosition, size); } else { #ifdef __WXOSX__ @@ -825,11 +829,11 @@ void Choice::BUILD() { * so ToolTip doesn't shown. * Next workaround helps to solve this problem */ - temp = new wxBitmapComboBox(); + temp = new choice_ctrl(); temp->SetTextCtrlStyle(wxTE_READONLY); temp->Create(m_parent, wxID_ANY, wxString(""), wxDefaultPosition, size, 0, nullptr); #else - temp = new wxBitmapComboBox(m_parent, wxID_ANY, wxString(""), wxDefaultPosition, size, 0, nullptr, wxCB_READONLY); + temp = new choice_ctrl(m_parent, wxID_ANY, wxString(""), wxDefaultPosition, size, 0, nullptr, wxCB_READONLY); #endif //__WXOSX__ } @@ -852,7 +856,8 @@ void Choice::BUILD() { set_selection(); } -#ifndef __WXGTK__ +#ifdef __WXOSX__ +//#ifndef __WXGTK__ /* Workaround for a correct rendering of the control without Bitmap (under MSW and OSX): * * 1. We should create small Bitmap to fill Bitmaps RefData, @@ -882,7 +887,7 @@ void Choice::BUILD() { } double old_val = !m_value.empty() ? boost::any_cast(m_value) : -99999; - if (is_defined_input_value(window, m_opt.type)) { + if (is_defined_input_value(window, m_opt.type)) { if (fabs(old_val - boost::any_cast(get_value())) <= 0.0001) return; else @@ -905,7 +910,7 @@ void Choice::set_selection() wxString text_value = wxString(""); - wxBitmapComboBox* field = dynamic_cast(window); + choice_ctrl* field = dynamic_cast(window); switch (m_opt.type) { case coFloat: case coPercent: { @@ -975,7 +980,7 @@ void Choice::set_value(const std::string& value, bool change_event) //! Redunda ++idx; } - wxBitmapComboBox* field = dynamic_cast(window); + choice_ctrl* field = dynamic_cast(window); idx == m_opt.enum_values.size() ? field->SetValue(value) : field->SetSelection(idx); @@ -1013,7 +1018,7 @@ void Choice::set_value(const boost::any& value, bool change_event) { m_disable_change_event = !change_event; - wxBitmapComboBox* field = dynamic_cast(window); + choice_ctrl* field = dynamic_cast(window); switch (m_opt.type) { case coInt: @@ -1093,11 +1098,11 @@ void Choice::set_values(const std::vector& values) // # it looks that Clear() also clears the text field in recent wxWidgets versions, // # but we want to preserve it - auto ww = dynamic_cast(window); + auto ww = dynamic_cast(window); auto value = ww->GetValue(); ww->Clear(); ww->Append(""); - for (auto el : values) + for (const auto &el : values) ww->Append(wxString(el)); ww->SetValue(value); @@ -1117,9 +1122,29 @@ void Choice::convert_to_enum_value(int ret_enum) { m_value = static_cast(m_opt.default_value.get()->getInt()); } +//TODO: check if used (from prusa) +void Choice::set_values(const wxArrayString &values) +{ + if (values.empty()) + return; + + m_disable_change_event = true; + + // # it looks that Clear() also clears the text field in recent wxWidgets versions, + // # but we want to preserve it + auto ww = dynamic_cast(window); + auto value = ww->GetValue(); + ww->Clear(); + ww->Append(""); + for (const auto &el : values) + ww->Append(el); + ww->SetValue(value); + + m_disable_change_event = false; +} boost::any& Choice::get_value() { - wxBitmapComboBox* field = dynamic_cast(window); + choice_ctrl* field = dynamic_cast(window); wxString ret_str = field->GetValue(); @@ -1182,16 +1207,20 @@ boost::any& Choice::get_value() return m_value; } -void Choice::msw_rescale(bool rescale_sidetext/* = false*/) +void Choice::enable() { dynamic_cast(window)->Enable(); }; +void Choice::disable() { dynamic_cast(window)->Disable(); }; + +void Choice::msw_rescale() { Field::msw_rescale(); - wxBitmapComboBox* field = dynamic_cast(window); + choice_ctrl* field = dynamic_cast(window); +#ifdef __WXOSX__ const wxString selection = field->GetValue();// field->GetString(index); /* To correct scaling (set new controll size) of a wxBitmapCombobox * we need to refill control with new bitmaps. So, in our case : - * 1. clear conrol + * 1. clear control * 2. add content * 3. add scaled "empty" bitmap to the at least one item */ @@ -1224,6 +1253,16 @@ void Choice::msw_rescale(bool rescale_sidetext/* = false*/) idx == m_opt.enum_values.size() ? field->SetValue(selection) : field->SetSelection(idx); +#else + auto size = wxSize(def_width_wider() * m_em_unit, wxDefaultCoord); + if (m_opt.height >= 0) size.SetHeight(m_opt.height * m_em_unit); + if (m_opt.width >= 0) size.SetWidth(m_opt.width * m_em_unit); + + if (parent_is_custom_ctrl) + field->SetSize(size); + else + field->SetMinSize(size); +#endif } void ColourPicker::BUILD() @@ -1247,6 +1286,8 @@ void ColourPicker::BUILD() } auto temp = new wxColourPickerCtrl(m_parent, wxID_ANY, clr, wxDefaultPosition, size); + if (parent_is_custom_ctrl && m_opt.height < 0) + opt_height = (double)temp->GetSize().GetHeight() / m_em_unit; temp->SetFont(Slic3r::GUI::wxGetApp().normal_font()); if (!wxOSX) temp->SetBackgroundStyle(wxBG_STYLE_PAINT); @@ -1303,14 +1344,20 @@ boost::any& ColourPicker::get_value() return m_value; } -void ColourPicker::msw_rescale(bool rescale_sidetext/* = false*/) +void ColourPicker::msw_rescale() { Field::msw_rescale(); wxColourPickerCtrl* field = dynamic_cast(window); auto size = wxSize(def_width() * m_em_unit, wxDefaultCoord); - if (m_opt.height >= 0) size.SetHeight(m_opt.height * m_em_unit); + if (m_opt.height >= 0) + size.SetHeight(m_opt.height * m_em_unit); + else if (parent_is_custom_ctrl && opt_height > 0) + size.SetHeight(lround(opt_height * m_em_unit)); if (m_opt.width >= 0) size.SetWidth(m_opt.width * m_em_unit); + if (parent_is_custom_ctrl) + field->SetSize(size); + else field->SetMinSize(size); if (field->GetColour() == wxTransparentColour) @@ -1331,6 +1378,9 @@ void PointCtrl::BUILD() x_textctrl = new wxTextCtrl(m_parent, wxID_ANY, X, wxDefaultPosition, field_size, wxTE_PROCESS_ENTER); y_textctrl = new wxTextCtrl(m_parent, wxID_ANY, Y, wxDefaultPosition, field_size, wxTE_PROCESS_ENTER); + if (parent_is_custom_ctrl && m_opt.height < 0) + opt_height = (double)x_textctrl->GetSize().GetHeight() / m_em_unit; + x_textctrl->SetFont(Slic3r::GUI::wxGetApp().normal_font()); x_textctrl->SetBackgroundStyle(wxBG_STYLE_PAINT); y_textctrl->SetFont(Slic3r::GUI::wxGetApp().normal_font()); @@ -1348,9 +1398,6 @@ void PointCtrl::BUILD() temp->Add(static_text_y, 0, wxALIGN_CENTER_VERTICAL, 0); temp->Add(y_textctrl); -// x_textctrl->Bind(wxEVT_TEXT, ([this](wxCommandEvent e) { on_change_field(); }), x_textctrl->GetId()); -// y_textctrl->Bind(wxEVT_TEXT, ([this](wxCommandEvent e) { on_change_field(); }), y_textctrl->GetId()); - x_textctrl->Bind(wxEVT_TEXT_ENTER, ([this](wxCommandEvent e) { propagate_value(x_textctrl); }), x_textctrl->GetId()); y_textctrl->Bind(wxEVT_TEXT_ENTER, ([this](wxCommandEvent e) { propagate_value(y_textctrl); }), y_textctrl->GetId()); @@ -1364,15 +1411,22 @@ void PointCtrl::BUILD() y_textctrl->SetToolTip(get_tooltip_text(X+", "+Y)); } -void PointCtrl::msw_rescale(bool rescale_sidetext/* = false*/) +void PointCtrl::msw_rescale() { Field::msw_rescale(); - const wxSize field_size(4 * m_em_unit, -1); + wxSize field_size(4 * m_em_unit, -1); + if (parent_is_custom_ctrl) { + field_size.SetHeight(lround(opt_height * m_em_unit)); + x_textctrl->SetSize(field_size); + y_textctrl->SetSize(field_size); + } + else { x_textctrl->SetMinSize(field_size); y_textctrl->SetMinSize(field_size); } +} bool PointCtrl::value_was_changed(wxTextCtrl* win) { @@ -1463,7 +1517,7 @@ void StaticText::BUILD() temp->SetToolTip(get_tooltip_text(legend)); } -void StaticText::msw_rescale(bool rescale_sidetext/* = false*/) +void StaticText::msw_rescale() { Field::msw_rescale(); diff --git a/src/slic3r/GUI/Field.hpp b/src/slic3r/GUI/Field.hpp index 82f297413..3cb1a52c7 100644 --- a/src/slic3r/GUI/Field.hpp +++ b/src/slic3r/GUI/Field.hpp @@ -87,6 +87,8 @@ protected: void on_set_focus(wxEvent& event); /// Call the attached on_change method. void on_change_field(); + +public: /// Call the attached m_back_to_initial_value method. void on_back_to_initial_value(); /// Call the attached m_back_to_sys_value method. @@ -119,6 +121,9 @@ public: const t_config_option_key m_opt_id;//! {""}; int m_opt_idx = 0; + double opt_height{ 0.0 }; + bool parent_is_custom_ctrl{ false }; + /// Sets a value for this control. /// subclasses should overload with a specific version /// Postcondition: Method does not fire the on_change event. @@ -140,9 +145,6 @@ public: void field_changed() { on_change_field(); } - // set icon to "UndoToSystemValue" button according to an inheritance of preset -// void set_nonsys_btn_icon(const wxBitmap& icon); - Field(const ConfigOptionDef& opt, const t_config_option_key& id) : m_opt(opt), m_opt_id(id) {}; Field(wxWindow* parent, const ConfigOptionDef& opt, const t_config_option_key& id) : m_parent(parent), m_opt(opt), m_opt_id(id) {}; virtual ~Field(); @@ -151,8 +153,6 @@ public: virtual wxSizer* getSizer() { return nullptr; } virtual wxWindow* getWindow() { return nullptr; } - wxStaticText* getLabel() { return m_Label; } - bool is_matched(const std::string& string, const std::string& pattern); void get_value_by_opt_type(wxString& str, const bool check_value = true); @@ -168,7 +168,6 @@ public: bool set_undo_bitmap(const ScalableBitmap *bmp) { if (m_undo_bitmap != bmp) { m_undo_bitmap = bmp; - m_Undo_btn->SetBitmap_(*bmp); return true; } return false; @@ -177,33 +176,21 @@ public: bool set_undo_to_sys_bitmap(const ScalableBitmap *bmp) { if (m_undo_to_sys_bitmap != bmp) { m_undo_to_sys_bitmap = bmp; - m_Undo_to_sys_btn->SetBitmap_(*bmp); return true; } return false; } bool set_label_colour(const wxColour *clr) { - if (m_Label == nullptr) return false; if (m_label_color != clr) { m_label_color = clr; - m_Label->SetForegroundColour(*clr); - m_Label->Refresh(true); } return false; } - bool set_label_colour_force(const wxColour *clr) { - if (m_Label == nullptr) return false; - m_Label->SetForegroundColour(*clr); - m_Label->Refresh(true); - return false; - } - bool set_undo_tooltip(const wxString *tip) { if (m_undo_tooltip != tip) { m_undo_tooltip = tip; - m_Undo_btn->SetToolTip(*tip); return true; } return false; @@ -212,17 +199,16 @@ public: bool set_undo_to_sys_tooltip(const wxString *tip) { if (m_undo_to_sys_tooltip != tip) { m_undo_to_sys_tooltip = tip; - m_Undo_to_sys_btn->SetToolTip(*tip); return true; } return false; } - void set_side_text_ptr(wxStaticText* side_text) { - m_side_text = side_text; + bool* get_blink_ptr() { + return &m_blink; } - virtual void msw_rescale(bool rescale_sidetext = false); + virtual void msw_rescale(); void sys_color_changed(); bool get_enter_pressed() const { return bEnterPressed; } @@ -233,26 +219,26 @@ public: static int def_width_wider() ; static int def_width_thinner() ; - BlinkingBitmap* blinking_bitmap() const { return m_blinking_bmp;} + const ScalableBitmap* undo_bitmap() { return m_undo_bitmap; } + const wxString* undo_tooltip() { return m_undo_tooltip; } + const ScalableBitmap* undo_to_sys_bitmap() { return m_undo_to_sys_bitmap; } + const wxString* undo_to_sys_tooltip() { return m_undo_to_sys_tooltip; } + const wxColour* label_color() { return m_label_color; } + const bool blink() { return m_blink; } protected: - RevertButton* m_Undo_btn = nullptr; // Bitmap and Tooltip text for m_Undo_btn. The wxButton will be updated only if the new wxBitmap pointer differs from the currently rendered one. const ScalableBitmap* m_undo_bitmap = nullptr; const wxString* m_undo_tooltip = nullptr; - RevertButton* m_Undo_to_sys_btn = nullptr; // Bitmap and Tooltip text for m_Undo_to_sys_btn. The wxButton will be updated only if the new wxBitmap pointer differs from the currently rendered one. const ScalableBitmap* m_undo_to_sys_bitmap = nullptr; const wxString* m_undo_to_sys_tooltip = nullptr; - BlinkingBitmap* m_blinking_bmp{ nullptr }; + bool m_blink{ false }; - wxStaticText* m_Label = nullptr; // Color for Label. The wxColour will be updated only if the new wxColour pointer differs from the currently rendered one. const wxColour* m_label_color = nullptr; - wxStaticText* m_side_text = nullptr; - // current value boost::any m_value; // last maeningful value @@ -308,7 +294,7 @@ public: boost::any& get_value() override; - void msw_rescale(bool rescale_sidetext = false) override; + void msw_rescale() override; void enable() override; void disable() override; @@ -336,7 +322,7 @@ public: void set_na_value() override; boost::any& get_value() override; - void msw_rescale(bool rescale_sidetext = false) override; + void msw_rescale() override; void enable() override { dynamic_cast(window)->Enable(); } void disable() override { dynamic_cast(window)->Disable(); } @@ -379,7 +365,7 @@ public: return m_value = value; } - void msw_rescale(bool rescale_sidetext = false) override; + void msw_rescale() override; void enable() override { dynamic_cast(window)->Enable(); } void disable() override { dynamic_cast(window)->Disable(); } @@ -410,12 +396,13 @@ public: void set_value(const std::string& value, bool change_event = false); void set_value(const boost::any& value, bool change_event = false); void set_values(const std::vector &values); + void set_values(const wxArrayString &values); boost::any& get_value() override; - void msw_rescale(bool rescale_sidetext = false) override; + void msw_rescale() override; - void enable() override { dynamic_cast(window)->Enable(); }; - void disable() override{ dynamic_cast(window)->Disable(); }; + void enable() override ;//{ dynamic_cast(window)->Enable(); }; + void disable() override;//{ dynamic_cast(window)->Disable(); }; wxWindow* getWindow() override { return window; } }; @@ -438,7 +425,7 @@ public: } void set_value(const boost::any& value, bool change_event = false) override; boost::any& get_value() override; - void msw_rescale(bool rescale_sidetext = false) override; + void msw_rescale() override; void enable() override { dynamic_cast(window)->Enable(); }; void disable() override{ dynamic_cast(window)->Disable(); }; @@ -464,7 +451,7 @@ public: void set_value(const boost::any& value, bool change_event = false); boost::any& get_value() override; - void msw_rescale(bool rescale_sidetext = false) override; + void msw_rescale() override; void enable() override { x_textctrl->Enable(); @@ -500,7 +487,7 @@ public: boost::any& get_value()override { return m_value; } - void msw_rescale(bool rescale_sidetext = false) override; + void msw_rescale() override; void enable() override { dynamic_cast(window)->Enable(); }; void disable() override{ dynamic_cast(window)->Disable(); }; diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 9308be053..9d1363770 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -303,6 +303,9 @@ void GCodeViewer::load(const GCodeProcessor::Result& gcode_result, const Print& reset(); load_toolpaths(gcode_result); + if (m_layers_zs.empty()) + return; + if (wxGetApp().is_editor()) load_shells(print, initialized); else { @@ -450,8 +453,39 @@ void GCodeViewer::render() const auto init_gl_data = [this]() { static bool first_run = true; if (first_run) { + // initializes opengl data of TBuffers + for (size_t i = 0; i < m_buffers.size(); ++i) { + TBuffer& buffer = m_buffers[i]; + switch (buffer_type(i)) + { + default: { break; } + case EMoveType::Tool_change: + case EMoveType::Color_change: + case EMoveType::Pause_Print: + case EMoveType::Custom_GCode: + case EMoveType::Retract: + case EMoveType::Unretract: + { + buffer.shader = wxGetApp().is_glsl_version_greater_or_equal_to(1, 20) ? "options_120" : "options_110"; + break; + } + case EMoveType::Extrude: + { + buffer.shader = "gouraud_light"; + break; + } + case EMoveType::Travel: + { + buffer.shader = "toolpaths_lines"; + break; + } + } + } + + // initializes tool marker m_sequential_view.marker.init(); + // initializes point sizes std::array point_sizes; ::glGetIntegerv(GL_ALIASED_POINT_SIZE_RANGE, point_sizes.data()); m_detected_point_sizes = { static_cast(point_sizes[0]), static_cast(point_sizes[1]) }; @@ -472,8 +506,10 @@ void GCodeViewer::render() const glsafe(::glEnable(GL_DEPTH_TEST)); render_toolpaths(); + if (m_sequential_view.current.last != m_sequential_view.endpoints.last) { m_sequential_view.marker.set_world_position(m_sequential_view.current_position); m_sequential_view.marker.render(); + } render_shells(); render_legend(); #if ENABLE_GCODE_VIEWER_STATISTICS @@ -939,6 +975,7 @@ void GCodeViewer::init() } } + // initializes non opengl data of TBuffers for (size_t i = 0; i < m_buffers.size(); ++i) { TBuffer& buffer = m_buffers[i]; switch (buffer_type(i)) @@ -953,21 +990,18 @@ void GCodeViewer::init() { buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::Point; buffer.vertices.format = VBuffer::EFormat::Position; - buffer.shader = wxGetApp().is_glsl_version_greater_or_equal_to(1, 20) ? "options_120" : "options_110"; break; } case EMoveType::Extrude: { buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::Triangle; buffer.vertices.format = VBuffer::EFormat::PositionNormal3; - buffer.shader = "gouraud_light"; break; } case EMoveType::Travel: { buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::Line; buffer.vertices.format = VBuffer::EFormat::PositionNormal1; - buffer.shader = "toolpaths_lines"; break; } } @@ -1513,6 +1547,11 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) } } + if (progress_dialog != nullptr) { + progress_dialog->Update(100, ""); + progress_dialog->Fit(); + } + log_memory_usage("Loaded G-code generated indices buffers, ", vertices, indices); // toolpaths data -> send indices data to gpu @@ -1586,6 +1625,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result) } // set layers z range + if (!m_layers_zs.empty()) m_layers_z_range = { m_layers_zs.front(), m_layers_zs.back() }; // roles -> remove duplicates diff --git a/src/slic3r/GUI/GCodeViewer.hpp b/src/slic3r/GUI/GCodeViewer.hpp index 4223755bd..b7a6148f2 100644 --- a/src/slic3r/GUI/GCodeViewer.hpp +++ b/src/slic3r/GUI/GCodeViewer.hpp @@ -357,7 +357,7 @@ public: Transform3f m_world_transform; float m_z_offset{ 0.5f }; std::array m_color{ 1.0f, 1.0f, 1.0f, 0.5f }; - bool m_visible{ false }; + bool m_visible{ true }; public: void init(); diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index b66f10209..6c84d22b5 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1465,6 +1465,7 @@ wxDEFINE_EVENT(EVT_GLCANVAS_MOVE_LAYERS_SLIDER, wxKeyEvent); wxDEFINE_EVENT(EVT_GLCANVAS_MOVE_DOUBLE_SLIDER, wxKeyEvent); #endif // ENABLE_GCODE_VIEWER wxDEFINE_EVENT(EVT_GLCANVAS_EDIT_COLOR_CHANGE, wxKeyEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_JUMP_TO, wxKeyEvent); wxDEFINE_EVENT(EVT_GLCANVAS_UNDO, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_REDO, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_COLLAPSE_SIDEBAR, SimpleEvent); @@ -2907,6 +2908,7 @@ void GLCanvas3D::on_char(wxKeyEvent& evt) // see include/wx/defs.h enum wxKeyCode int keyCode = evt.GetKeyCode(); int ctrlMask = wxMOD_CONTROL; + int shiftMask = wxMOD_SHIFT; auto imgui = wxGetApp().imgui(); if (imgui->update_key_data(evt)) { @@ -2942,6 +2944,15 @@ void GLCanvas3D::on_char(wxKeyEvent& evt) post_event(SimpleEvent(EVT_GLTOOLBAR_COPY)); break; +#if ENABLE_CTRL_M_ON_WINDOWS + case WXK_CONTROL_M: + { + Mouse3DController& controller = wxGetApp().plater()->get_mouse3d_controller(); + controller.show_settings_dialog(!controller.is_settings_dialog_shown()); + m_dirty = true; + break; + } +#else #if defined(__linux__) || defined(__APPLE__) case WXK_CONTROL_M: { @@ -2951,6 +2962,7 @@ void GLCanvas3D::on_char(wxKeyEvent& evt) break; } #endif /* __linux__ */ +#endif // ENABLE_CTRL_M_ON_WINDOWS #ifdef __APPLE__ case 'v': @@ -2994,6 +3006,18 @@ void GLCanvas3D::on_char(wxKeyEvent& evt) post_event(SimpleEvent(EVT_GLTOOLBAR_DELETE_ALL)); break; default: evt.Skip(); } + } + else if ((evt.GetModifiers() & shiftMask) != 0) { + switch (keyCode) { + case 'g': + case 'G': { + if (dynamic_cast(m_canvas->GetParent()) != nullptr) + post_event(wxKeyEvent(EVT_GLCANVAS_JUMP_TO, evt)); + break; + } + default: + evt.Skip(); + } } else if (evt.HasModifiers()) { evt.Skip(); } else { @@ -3217,7 +3241,7 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) // m_canvas->HandleAsNavigationKey(evt); // XXX: Doesn't work in some cases / on Linux post_event(SimpleEvent(EVT_GLCANVAS_TAB)); } - else if (keyCode == WXK_TAB && evt.ShiftDown()) { + else if (keyCode == WXK_TAB && evt.ShiftDown() && ! wxGetApp().is_gcode_viewer()) { // Collapse side-panel with Shift+Tab post_event(SimpleEvent(EVT_GLCANVAS_COLLAPSE_SIDEBAR)); } @@ -3356,17 +3380,17 @@ void GLCanvas3D::on_mouse_wheel(wxMouseEvent& evt) if (evt.MiddleIsDown()) return; - if (wxGetApp().imgui()->update_mouse_data(evt)) { - m_dirty = true; - return; - } - #if ENABLE_RETINA_GL const float scale = m_retina_helper->get_scale_factor(); evt.SetX(evt.GetX() * scale); evt.SetY(evt.GetY() * scale); #endif + if (wxGetApp().imgui()->update_mouse_data(evt)) { + m_dirty = true; + return; + } + #ifdef __WXMSW__ // For some reason the Idle event is not being generated after the mouse scroll event in case of scrolling with the two fingers on the touch pad, // if the event is not allowed to be passed further. @@ -3407,7 +3431,8 @@ void GLCanvas3D::on_mouse_wheel(wxMouseEvent& evt) return; // Calculate the zoom delta and apply it to the current zoom factor - _update_camera_zoom((double)evt.GetWheelRotation() / (double)evt.GetWheelDelta()); + double direction_factor = (wxGetApp().app_config->get("reverse_mouse_wheel_zoom") == "1") ? -1.0 : 1.0; + _update_camera_zoom(direction_factor * (double)evt.GetWheelRotation() / (double)evt.GetWheelDelta()); } void GLCanvas3D::on_timer(wxTimerEvent& evt) diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 07ee0ab28..36853aebc 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -113,6 +113,7 @@ wxDECLARE_EVENT(EVT_GLCANVAS_MOVE_LAYERS_SLIDER, wxKeyEvent); wxDECLARE_EVENT(EVT_GLCANVAS_MOVE_DOUBLE_SLIDER, wxKeyEvent); #endif // ENABLE_GCODE_VIEWER wxDECLARE_EVENT(EVT_GLCANVAS_EDIT_COLOR_CHANGE, wxKeyEvent); +wxDECLARE_EVENT(EVT_GLCANVAS_JUMP_TO, wxKeyEvent); wxDECLARE_EVENT(EVT_GLCANVAS_UNDO, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_REDO, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_COLLAPSE_SIDEBAR, SimpleEvent); diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 706689a3d..b8750dee4 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -724,6 +724,7 @@ void GUI_App::init_app_config() std::string error = app_config->load(); if (!error.empty()) { // Error while parsing config file. We'll customize the error message and rethrow to be displayed. +#if ENABLE_GCODE_VIEWER if (is_editor()) { throw Slic3r::RuntimeError( _u8L("Error parsing PrusaSlicer config file, it is probably corrupted. " @@ -731,11 +732,14 @@ void GUI_App::init_app_config() "\n\n" + app_config->config_path() + "\n\n" + error); } else { +#endif // ENABLE_GCODE_VIEWER throw Slic3r::RuntimeError( _u8L("Error parsing PrusaGCodeViewer config file, it is probably corrupted. " "Try to manually delete the file to recover from the error.") + "\n\n" + app_config->config_path() + "\n\n" + error); +#if ENABLE_GCODE_VIEWER } +#endif // ENABLE_GCODE_VIEWER } } } diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index ddad7eb4c..53e049422 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -359,7 +359,7 @@ bool Preview::init(wxWindow* parent, Model* model) get_option_type_string(OptionType::PausePrints) + "|0|" + get_option_type_string(OptionType::CustomGCodes) + "|0|" + get_option_type_string(OptionType::Shells) + "|0|" + - get_option_type_string(OptionType::ToolMarker) + "|0|" + + get_option_type_string(OptionType::ToolMarker) + "|1|" + get_option_type_string(OptionType::Legend) + "|1" ); Slic3r::GUI::create_combochecklist(m_combochecklist_options, GUI::into_u8(_L("Options")), options_items); @@ -614,6 +614,16 @@ void Preview::msw_rescale() refresh_print(); } +void Preview::jump_layers_slider(wxKeyEvent& evt) +{ +#if ENABLE_GCODE_VIEWER + if (m_layers_slider) m_layers_slider->OnChar(evt); +#else + if (m_slider) + m_slider->OnKeyDown(evt); +#endif // ENABLE_GCODE_VIEWER +} + #if ENABLE_GCODE_VIEWER void Preview::move_layers_slider(wxKeyEvent& evt) { @@ -1326,7 +1336,7 @@ void Preview::load_print_as_fff(bool keep_z_range) // It is left to Slic3r to decide whether the print shall be colored by the tool or by the feature. // Color by feature if it is a single extruder print. unsigned int number_extruders = (unsigned int)print->extruders().size(); - int tool_idx = m_choice_view_type->FindString(_(L("Tool"))); + int tool_idx = m_choice_view_type->FindString(_L("Tool")); int type = (number_extruders > 1) ? tool_idx /* color by a tool number */ : 0; // color by a feature type m_choice_view_type->SetSelection(type); #if ENABLE_GCODE_VIEWER diff --git a/src/slic3r/GUI/GUI_Preview.hpp b/src/slic3r/GUI/GUI_Preview.hpp index 943aee48a..415365999 100644 --- a/src/slic3r/GUI/GUI_Preview.hpp +++ b/src/slic3r/GUI/GUI_Preview.hpp @@ -190,6 +190,7 @@ Preview(wxWindow* parent, Model* model, DynamicPrintConfig* config, void refresh_print(); void msw_rescale(); + void jump_layers_slider(wxKeyEvent& evt); #if ENABLE_GCODE_VIEWER void move_layers_slider(wxKeyEvent& evt); void edit_layers_slider(wxKeyEvent& evt); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp index 10ab9932b..edb244b58 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp @@ -232,9 +232,12 @@ void GLGizmoFdmSupports::on_render_input_window(float x, float y, float bottom_l else { m_imgui->begin(_L("Autoset custom supports"), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse); ImGui::AlignTextToFramePadding(); - m_imgui->text(_L("Threshold:") + " " + _L("deg")); + m_imgui->text(_L("Threshold:")); + std::string format_str = std::string("%.f") + I18N::translate_utf8("°", + "Degree sign to use in the respective slider in FDM supports gizmo," + "placed after the number with no whitespace in between."); ImGui::SameLine(); - if (m_imgui->slider_float("", &m_angle_threshold_deg, 0.f, 90.f, "%.f")) + if (m_imgui->slider_float("", &m_angle_threshold_deg, 0.f, 90.f, format_str.data())) m_parent.set_slope_normal_angle(90.f - m_angle_threshold_deg); if (m_imgui->button(_L("Enforce"))) select_facets_by_angle(m_angle_threshold_deg, false); diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index 739edec4c..e3bb964ad 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -104,7 +104,7 @@ bool GLGizmosManager::init() m_gizmos.emplace_back(new GLGizmoCut(m_parent, "cut.svg", 4)); m_gizmos.emplace_back(new GLGizmoHollow(m_parent, "hollow.svg", 5)); m_gizmos.emplace_back(new GLGizmoSlaSupports(m_parent, "sla_supports.svg", 6)); - m_gizmos.emplace_back(new GLGizmoFdmSupports(m_parent, "sla_supports.svg", 7)); + m_gizmos.emplace_back(new GLGizmoFdmSupports(m_parent, "fdm_supports.svg", 7)); m_gizmos.emplace_back(new GLGizmoSeam(m_parent, "seam.svg", 8)); m_common_gizmos_data.reset(new CommonGizmosDataPool(&m_parent)); diff --git a/src/slic3r/GUI/ImGuiWrapper.cpp b/src/slic3r/GUI/ImGuiWrapper.cpp index da11468bf..df4a59760 100644 --- a/src/slic3r/GUI/ImGuiWrapper.cpp +++ b/src/slic3r/GUI/ImGuiWrapper.cpp @@ -49,7 +49,9 @@ static const std::map font_icons = { {ImGui::MinimalizeMarker , "notification_minimalize" }, {ImGui::MinimalizeHoverMarker , "notification_minimalize_hover" }, {ImGui::WarningMarker , "notification_warning" }, - {ImGui::ErrorMarker , "notification_error" } + {ImGui::ErrorMarker , "notification_error" }, + {ImGui::EjectMarker , "notification_eject_sd" }, + {ImGui::EjectHoverMarker , "notification_eject_sd_hover" }, }; const ImVec4 ImGuiWrapper::COL_GREY_DARK = { 0.333f, 0.333f, 0.333f, 1.0f }; diff --git a/src/slic3r/GUI/KBShortcutsDialog.cpp b/src/slic3r/GUI/KBShortcutsDialog.cpp index 0b5a2aee7..caa572889 100644 --- a/src/slic3r/GUI/KBShortcutsDialog.cpp +++ b/src/slic3r/GUI/KBShortcutsDialog.cpp @@ -178,9 +178,13 @@ void KBShortcutsDialog::fill_shortcuts() { "O", L("Zoom out") }, { "Tab", L("Switch between Editor/Preview") }, { "Shift+Tab", L("Collapse/Expand the sidebar") }, +#if ENABLE_CTRL_M_ON_WINDOWS + { ctrl + "M", L("Show/Hide 3Dconnexion devices settings dialog") }, +#else #if defined(__linux__) || defined(__APPLE__) { ctrl + "M", L("Show/Hide 3Dconnexion devices settings dialog") }, #endif // __linux__ +#endif // ENABLE_CTRL_M_ON_WINDOWS #if ENABLE_RENDER_PICKING_PASS // Don't localize debugging texts. { "P", "Toggle picking pass texture rendering on/off" }, diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index abbce5c6c..c8e77b45b 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -753,14 +753,11 @@ bool MainFrame::can_export_gcode() const bool MainFrame::can_send_gcode() const { - if (m_plater == nullptr) - return false; - - if (m_plater->model().objects.empty()) - return false; - - const auto print_host_opt = wxGetApp().preset_bundle->printers.get_edited_preset().config.option("print_host"); - return print_host_opt != nullptr && !print_host_opt->value.empty(); + if (m_plater && ! m_plater->model().objects.empty()) + if (const DynamicPrintConfig *cfg = wxGetApp().preset_bundle->physical_printers.get_selected_printer_config(); cfg) + if (const auto *print_host_opt = cfg->option("print_host"); print_host_opt) + return ! print_host_opt->value.empty(); + return false; } bool MainFrame::can_export_gcode_sd() const @@ -1302,7 +1299,7 @@ void MainFrame::init_menubar() append_menu_check_item(viewMenu, wxID_ANY, _L("Show &labels") + sep + "E", _L("Show object/instance labels in 3D scene"), [this](wxCommandEvent&) { m_plater->show_view3D_labels(!m_plater->are_view3D_labels_shown()); }, this, [this]() { return m_plater->is_view3D_shown(); }, [this]() { return m_plater->are_view3D_labels_shown(); }, this); - append_menu_check_item(viewMenu, wxID_ANY, _L("&Collapse sidebar") + "\tShift+Tab", _L("Collapse sidebar"), + append_menu_check_item(viewMenu, wxID_ANY, _L("&Collapse sidebar") + sep + "Shift+" + sep_space + "Tab", _L("Collapse sidebar"), [this](wxCommandEvent&) { m_plater->collapse_sidebar(!m_plater->is_sidebar_collapsed()); }, this, []() { return true; }, [this]() { return m_plater->is_sidebar_collapsed(); }, this); } diff --git a/src/slic3r/GUI/Mouse3DController.cpp b/src/slic3r/GUI/Mouse3DController.cpp index 4c5ee2076..e5f7f6fca 100644 --- a/src/slic3r/GUI/Mouse3DController.cpp +++ b/src/slic3r/GUI/Mouse3DController.cpp @@ -115,10 +115,20 @@ void Mouse3DController::device_attached(const std::string &device) // Never mind, enumeration will be performed until connected. m_wakeup = true; m_stop_condition.notify_all(); - } +#if ENABLE_CTRL_M_ON_WINDOWS + m_connected = true; +#endif // ENABLE_CTRL_M_ON_WINDOWS + } } } +#if ENABLE_CTRL_M_ON_WINDOWS +void Mouse3DController::device_detached(const std::string& device) +{ + m_connected = false; +} +#endif // ENABLE_CTRL_M_ON_WINDOWS + // Filter out mouse scroll events produced by the 3DConnexion driver. bool Mouse3DController::State::process_mouse_wheel() { @@ -863,6 +873,9 @@ bool Mouse3DController::handle_raw_input_win32(const unsigned char *data, const DataPacketRaw packet; memcpy(packet.data(), data, packet_length); handle_packet(packet, packet_length, m_params, m_state); +#if ENABLE_CTRL_M_ON_WINDOWS + m_connected = true; +#endif // ENABLE_CTRL_M_ON_WINDOWS } return true; diff --git a/src/slic3r/GUI/Mouse3DController.hpp b/src/slic3r/GUI/Mouse3DController.hpp index b3dce9f34..ba289e448 100644 --- a/src/slic3r/GUI/Mouse3DController.hpp +++ b/src/slic3r/GUI/Mouse3DController.hpp @@ -194,6 +194,9 @@ public: // Called by Win32 HID enumeration callback. void device_attached(const std::string &device); +#if ENABLE_CTRL_M_ON_WINDOWS + void device_detached(const std::string& device); +#endif // ENABLE_CTRL_M_ON_WINDOWS // On Windows, the 3DConnexion driver sends out mouse wheel rotation events to an active application // if the application does not register at the driver. This is a workaround to ignore these superfluous diff --git a/src/slic3r/GUI/NotificationManager.cpp b/src/slic3r/GUI/NotificationManager.cpp index cb499b3c6..a1bb48d2b 100644 --- a/src/slic3r/GUI/NotificationManager.cpp +++ b/src/slic3r/GUI/NotificationManager.cpp @@ -1,6 +1,7 @@ #include "NotificationManager.hpp" #include "GUI_App.hpp" +#include "GUI.hpp" #include "Plater.hpp" #include "GLCanvas3D.hpp" #include "ImGuiWrapper.hpp" @@ -9,6 +10,8 @@ #include #include +#include + #include #include @@ -31,6 +34,56 @@ namespace Notifications_Internal{ else ImGui::PushStyleColor(idx, col); } + + void open_folder(const std::string& path) + { + // Code taken from desktop_open_datadir_folder() + + // Execute command to open a file explorer, platform dependent. + // FIXME: The const_casts aren't needed in wxWidgets 3.1, remove them when we upgrade. + +#ifdef _WIN32 + const wxString widepath = from_u8(path); + const wchar_t* argv[] = { L"explorer", widepath.GetData(), nullptr }; + ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr); +#elif __APPLE__ + const char* argv[] = { "open", path.data(), nullptr }; + ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr); +#else + const char* argv[] = { "xdg-open", path.data(), nullptr }; + + // Check if we're running in an AppImage container, if so, we need to remove AppImage's env vars, + // because they may mess up the environment expected by the file manager. + // Mostly this is about LD_LIBRARY_PATH, but we remove a few more too for good measure. + if (wxGetEnv("APPIMAGE", nullptr)) { + // We're running from AppImage + wxEnvVariableHashMap env_vars; + wxGetEnvMap(&env_vars); + + env_vars.erase("APPIMAGE"); + env_vars.erase("APPDIR"); + env_vars.erase("LD_LIBRARY_PATH"); + env_vars.erase("LD_PRELOAD"); + env_vars.erase("UNION_PRELOAD"); + + wxExecuteEnv exec_env; + exec_env.env = std::move(env_vars); + + wxString owd; + if (wxGetEnv("OWD", &owd)) { + // This is the original work directory from which the AppImage image was run, + // set it as CWD for the child process: + exec_env.cwd = std::move(owd); + } + + ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr, &exec_env); + } + else { + // Looks like we're NOT running from AppImage, we'll make no changes to the environment. + ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr, nullptr); + } +#endif + } } #if 1 @@ -181,6 +234,7 @@ NotificationManager::PopNotification::RenderResult NotificationManager::PopNotif render_left_sign(imgui); render_text(imgui, win_size.x, win_size.y, win_pos.x, win_pos.y); render_close_button(imgui, win_size.x, win_size.y, win_pos.x, win_pos.y); + m_minimize_b_visible = false; if (m_multiline && m_lines_count > 3) render_minimize_button(imgui, win_pos.x, win_pos.y); } else { @@ -203,12 +257,8 @@ NotificationManager::PopNotification::RenderResult NotificationManager::PopNotif ImGui::PopStyleColor(); return ret_val; } -void NotificationManager::PopNotification::init() +void NotificationManager::PopNotification::count_spaces() { - std::string text = m_text1 + " " + m_hypertext; - int last_end = 0; - m_lines_count = 0; - //determine line width m_line_height = ImGui::CalcTextSize("A").y; @@ -219,8 +269,16 @@ void NotificationManager::PopNotification::init() float picture_width = ImGui::CalcTextSize(text.c_str()).x; m_left_indentation = picture_width + m_line_height / 2; } - m_window_width_offset = m_left_indentation + m_line_height * 2; + m_window_width_offset = m_left_indentation + m_line_height * 3.f; m_window_width = m_line_height * 25; +} +void NotificationManager::PopNotification::init() +{ + std::string text = m_text1 + " " + m_hypertext; + int last_end = 0; + m_lines_count = 0; + + count_spaces(); // count lines m_endlines.clear(); @@ -231,10 +289,9 @@ void NotificationManager::PopNotification::init() //next line is ended by '/n' m_endlines.push_back(next_hard_end); last_end = next_hard_end + 1; - } - else { + } else { // find next suitable endline - if (ImGui::CalcTextSize(text.substr(last_end).c_str()).x >= m_window_width - 3.5f * m_line_height) {// m_window_width_offset) { + if (ImGui::CalcTextSize(text.substr(last_end).c_str()).x >= m_window_width - m_window_width_offset) { // more than one line till end int next_space = text.find_first_of(' ', last_end); if (next_space > 0) { @@ -243,8 +300,19 @@ void NotificationManager::PopNotification::init() next_space = next_space_candidate; next_space_candidate = text.find_first_of(' ', next_space + 1); } - m_endlines.push_back(next_space); - last_end = next_space + 1; + // when one word longer than line. + if (ImGui::CalcTextSize(text.substr(last_end, next_space - last_end).c_str()).x > m_window_width - m_window_width_offset) { + float width_of_a = ImGui::CalcTextSize("a").x; + int letter_count = (int)((m_window_width - m_window_width_offset) / width_of_a); + while (last_end + letter_count < text.size() && ImGui::CalcTextSize(text.substr(last_end, letter_count).c_str()).x < m_window_width - m_window_width_offset) { + letter_count++; + } + m_endlines.push_back(last_end + letter_count); + last_end += letter_count; + } else { + m_endlines.push_back(next_space); + last_end = next_space + 1; + } } } else { @@ -255,6 +323,8 @@ void NotificationManager::PopNotification::init() } m_lines_count++; } + if (m_lines_count == 3) + m_multiline = true; m_initialized = true; } void NotificationManager::PopNotification::set_next_window_size(ImGuiWrapper& imgui) @@ -283,7 +353,8 @@ void NotificationManager::PopNotification::render_text(ImGuiWrapper& imgui, cons float shift_y = m_line_height;// -m_line_height / 20; for (size_t i = 0; i < m_lines_count; i++) { std::string line = m_text1.substr(last_end , m_endlines[i] - last_end); - last_end = m_endlines[i] + 1; + if(i < m_lines_count - 1) + last_end = m_endlines[i] + (m_text1[m_endlines[i]] == '\n' || m_text1[m_endlines[i]] == ' ' ? 1 : 0); ImGui::SetCursorPosX(x_offset); ImGui::SetCursorPosY(starting_y + i * shift_y); imgui.text(line.c_str()); @@ -301,7 +372,7 @@ void NotificationManager::PopNotification::render_text(ImGuiWrapper& imgui, cons ImGui::SetCursorPosY(win_size.y / 2 - win_size.y / 6 - m_line_height / 2); imgui.text(m_text1.substr(0, m_endlines[0]).c_str()); // line2 - std::string line = m_text1.substr(m_endlines[0] + 1, m_endlines[1] - m_endlines[0] - 1); + std::string line = m_text1.substr(m_endlines[0] + (m_text1[m_endlines[0]] == '\n' || m_text1[m_endlines[0]] == ' ' ? 1 : 0), m_endlines[1] - m_endlines[0] - (m_text1[m_endlines[0]] == '\n' || m_text1[m_endlines[0]] == ' ' ? 1 : 0)); if (ImGui::CalcTextSize(line.c_str()).x > m_window_width - m_window_width_offset - ImGui::CalcTextSize((".." + _u8L("More")).c_str()).x) { line = line.substr(0, line.length() - 6); @@ -324,7 +395,7 @@ void NotificationManager::PopNotification::render_text(ImGuiWrapper& imgui, cons ImGui::SetCursorPosY(win_size.y / 2 - win_size.y / 6 - m_line_height / 2); imgui.text(m_text1.substr(0, m_endlines[0]).c_str()); // line2 - std::string line = m_text1.substr(m_endlines[0] + 1); + std::string line = m_text1.substr(m_endlines[0] + (m_text1[m_endlines[0]] == '\n' || m_text1[m_endlines[0]] == ' ' ? 1 : 0)); cursor_y = win_size.y / 2 + win_size.y / 6 - m_line_height / 2; ImGui::SetCursorPosX(x_offset); ImGui::SetCursorPosY(cursor_y); @@ -373,8 +444,7 @@ void NotificationManager::PopNotification::render_hypertext(ImGuiWrapper& imgui, set_next_window_size(imgui); } else { - on_text_click(); - m_close_pending = true; + m_close_pending = on_text_click(); } } ImGui::PopStyleColor(); @@ -405,7 +475,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) { ImVec2 win_size(win_size_x, win_size_y); - ImVec2 win_pos(win_pos_x, win_pos_y); + ImVec2 win_pos(win_pos_x, win_pos_y); ImVec4 orange_color = ImGui::GetStyleColorVec4(ImGuiCol_Button); orange_color.w = 0.8f; ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(.0f, .0f, .0f, .0f)); @@ -420,7 +490,7 @@ void NotificationManager::PopNotification::render_close_button(ImGuiWrapper& img button_text = ImGui::CloseIconMarker; if (ImGui::IsMouseHoveringRect(ImVec2(win_pos.x - win_size.x / 10.f, win_pos.y), - ImVec2(win_pos.x, win_pos.y + win_size.y - (m_multiline? 2 * m_line_height : 0)), + ImVec2(win_pos.x, win_pos.y + win_size.y - ( m_minimize_b_visible ? 2 * m_line_height : 0)), true)) { button_text = ImGui::CloseIconHoverMarker; @@ -433,11 +503,10 @@ void NotificationManager::PopNotification::render_close_button(ImGuiWrapper& img { m_close_pending = true; } - //invisible large button - ImGui::SetCursorPosX(win_size.x - win_size.x / 10.f); + ImGui::SetCursorPosX(win_size.x - m_line_height * 2.125); ImGui::SetCursorPosY(0); - if (imgui.button(" ", win_size.x / 10.f, win_size.y - (m_multiline ? 2 * m_line_height : 0))) + if (imgui.button(" ", m_line_height * 2.125, win_size.y - ( m_minimize_b_visible ? 2 * m_line_height : 0))) { m_close_pending = true; } @@ -538,15 +607,12 @@ void NotificationManager::PopNotification::render_minimize_button(ImGuiWrapper& ImGui::PopStyleColor(); ImGui::PopStyleColor(); ImGui::PopStyleColor(); + m_minimize_b_visible = true; } -void NotificationManager::PopNotification::on_text_click() +bool NotificationManager::PopNotification::on_text_click() { + bool ret = true; switch (m_data.type) { - case NotificationType::ExportToRemovableFinished : - assert(m_evt_handler != nullptr); - if (m_evt_handler != nullptr) - wxPostEvent(m_evt_handler, EjectDriveNotificationClickedEvent(EVT_EJECT_DRIVE_NOTIFICAION_CLICKED)); - break; case NotificationType::SlicingComplete : //wxGetApp().plater()->export_gcode(false); assert(m_evt_handler != nullptr); @@ -565,6 +631,7 @@ void NotificationManager::PopNotification::on_text_click() default: break; } + return ret; } void NotificationManager::PopNotification::update(const NotificationData& n) { @@ -631,6 +698,127 @@ void NotificationManager::SlicingCompleteLargeNotification::set_large(bool l) m_hypertext = l ? _u8L("Export G-Code.") : std::string(); m_hidden = !l; } +//---------------ExportFinishedNotification----------- +void NotificationManager::ExportFinishedNotification::count_spaces() +{ + //determine line width + m_line_height = ImGui::CalcTextSize("A").y; + + m_left_indentation = m_line_height; + if (m_data.level == NotificationLevel::ErrorNotification || m_data.level == NotificationLevel::WarningNotification) { + std::string text; + text = (m_data.level == NotificationLevel::ErrorNotification ? ImGui::ErrorMarker : ImGui::WarningMarker); + float picture_width = ImGui::CalcTextSize(text.c_str()).x; + m_left_indentation = picture_width + m_line_height / 2; + } + //TODO count this properly + m_window_width_offset = m_left_indentation + m_line_height * (m_to_removable ? 5.f : 3.f); + m_window_width = m_line_height * 25; +} + +void NotificationManager::ExportFinishedNotification::render_text(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) +{ + + ImVec2 win_size(win_size_x, win_size_y); + ImVec2 win_pos(win_pos_x, win_pos_y); + float x_offset = m_left_indentation; + std::string fulltext = m_text1 + m_hypertext; //+ m_text2; + ImVec2 text_size = ImGui::CalcTextSize(fulltext.c_str()); + // Lines are always at least two and m_multiline is always true for ExportFinishedNotification. + // First line has "Export Finished" text and than hyper text open folder. + // Following lines are path to gcode. + int last_end = 0; + float starting_y = m_line_height / 2;//10; + float shift_y = m_line_height;// -m_line_height / 20; + for (size_t i = 0; i < m_lines_count; i++) { + std::string line = m_text1.substr(last_end, m_endlines[i] - last_end); + if (i < m_lines_count - 1) + last_end = m_endlines[i] + (m_text1[m_endlines[i]] == '\n' || m_text1[m_endlines[i]] == ' ' ? 1 : 0); + ImGui::SetCursorPosX(x_offset); + ImGui::SetCursorPosY(starting_y + i * shift_y); + imgui.text(line.c_str()); + //hyperlink text + if ( i == 0 ) { + render_hypertext(imgui, x_offset + ImGui::CalcTextSize(m_text1.substr(0, last_end).c_str()).x + ImGui::CalcTextSize(" ").x, starting_y, _u8L("Open Folder.")); + } + } + +} + +void NotificationManager::ExportFinishedNotification::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) +{ + PopNotification::render_close_button(imgui, win_size_x, win_size_y, win_pos_x, win_pos_y); + if(m_to_removable) + render_eject_button(imgui, win_size_x, win_size_y, win_pos_x, win_pos_y); +} + +void NotificationManager::ExportFinishedNotification::render_eject_button(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) +{ + ImVec2 win_size(win_size_x, win_size_y); + ImVec2 win_pos(win_pos_x, win_pos_y); + ImVec4 orange_color = ImGui::GetStyleColorVec4(ImGuiCol_Button); + orange_color.w = 0.8f; + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(.0f, .0f, .0f, .0f)); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(.0f, .0f, .0f, .0f)); + Notifications_Internal::push_style_color(ImGuiCol_Text, ImVec4(1.f, 1.f, 1.f, 1.f), m_fading_out, m_current_fade_opacity); + Notifications_Internal::push_style_color(ImGuiCol_TextSelectedBg, ImVec4(0, .75f, .75f, 1.f), m_fading_out, m_current_fade_opacity); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(.0f, .0f, .0f, .0f)); + + std::string button_text; + button_text = ImGui::EjectMarker; + + if (ImGui::IsMouseHoveringRect(ImVec2(win_pos.x - m_line_height * 4.5f, win_pos.y), + ImVec2(win_pos.x - m_line_height * 2.5f, win_pos.y + win_size.y), + true)) + { + button_text = ImGui::EjectHoverMarker; + // tooltip + long time_now = wxGetLocalTime(); + if (m_hover_time > 0 && m_hover_time < time_now) { + ImGui::PushStyleColor(ImGuiCol_PopupBg, ImGuiWrapper::COL_WINDOW_BACKGROUND); + ImGui::BeginTooltip(); + imgui.text(_u8L("Eject drive")); + ImGui::EndTooltip(); + ImGui::PopStyleColor(); + } + if (m_hover_time == 0) + m_hover_time = time_now; + } else + m_hover_time = 0; + + ImVec2 button_pic_size = ImGui::CalcTextSize(button_text.c_str()); + ImVec2 button_size(button_pic_size.x * 1.25f, button_pic_size.y * 1.25f); + ImGui::SetCursorPosX(win_size.x - m_line_height * 4.f); + ImGui::SetCursorPosY(win_size.y / 2 - button_size.y / 2); + if (imgui.button(button_text.c_str(), button_size.x, button_size.y)) + { + assert(m_evt_handler != nullptr); + if (m_evt_handler != nullptr) + wxPostEvent(m_evt_handler, EjectDriveNotificationClickedEvent(EVT_EJECT_DRIVE_NOTIFICAION_CLICKED)); + m_close_pending = true; + } + + //invisible large button + ImGui::SetCursorPosX(win_size.x - m_line_height * 4.625f); + ImGui::SetCursorPosY(0); + if (imgui.button(" ", m_line_height * 2.f, win_size.y)) + { + assert(m_evt_handler != nullptr); + if (m_evt_handler != nullptr) + wxPostEvent(m_evt_handler, EjectDriveNotificationClickedEvent(EVT_EJECT_DRIVE_NOTIFICAION_CLICKED)); + m_close_pending = true; + } + ImGui::PopStyleColor(); + ImGui::PopStyleColor(); + ImGui::PopStyleColor(); + ImGui::PopStyleColor(); + ImGui::PopStyleColor(); +} +bool NotificationManager::ExportFinishedNotification::on_text_click() +{ + Notifications_Internal::open_folder(m_export_dir_path); + return false; +} //------NotificationManager-------- NotificationManager::NotificationManager(wxEvtHandler* evt_handler) : m_evt_handler(evt_handler) @@ -639,7 +827,7 @@ NotificationManager::NotificationManager(wxEvtHandler* evt_handler) : void NotificationManager::push_notification(const NotificationType type, GLCanvas3D& canvas, int timestamp) { auto it = std::find_if(basic_notifications.begin(), basic_notifications.end(), - boost::bind(&NotificationData::type, _1) == type); + boost::bind(&NotificationData::type, boost::placeholders::_1) == type); assert(it != basic_notifications.end()); if (it != basic_notifications.end()) push_notification_data( *it, canvas, timestamp); @@ -787,6 +975,13 @@ void NotificationManager::remove_slicing_warnings_of_released_objects(const std: notification->close(); } } +void NotificationManager::push_exporting_finished_notification(GLCanvas3D& canvas, std::string path, std::string dir_path, bool on_removable) +{ + close_notification_of_type(NotificationType::ExportFinished); + NotificationData data{ NotificationType::ExportFinished, NotificationLevel::RegularNotification, 0, _u8L("Exporting finished.") +"\n"+ path }; + push_notification_data(std::make_unique(data, m_id_provider, m_evt_handler, on_removable, path, dir_path), + canvas, 0); +} bool NotificationManager::push_notification_data(const NotificationData ¬ification_data, GLCanvas3D& canvas, int timestamp) { return push_notification_data(std::make_unique(notification_data, m_id_provider, m_evt_handler), canvas, timestamp); @@ -820,12 +1015,12 @@ void NotificationManager::render_notifications(GLCanvas3D& canvas, float overlay bool hovered = false; sort_notifications(); // iterate thru notifications and render them / erease them - for (auto it = m_pop_notifications.begin(); it != m_pop_notifications.end();) { + for (auto it = m_pop_notifications.begin(); it != m_pop_notifications.end();) { if ((*it)->get_finished()) { it = m_pop_notifications.erase(it); } else { (*it)->set_paused(m_hovered); - PopNotification::RenderResult res = (*it)->render(canvas, last_x, m_move_from_overlay, overlay_width); + PopNotification::RenderResult res = (*it)->render(canvas, last_x, m_move_from_overlay && !m_in_preview, overlay_width); if (res != PopNotification::RenderResult::Finished) { last_x = (*it)->get_top() + GAP_WIDTH; current_height = std::max(current_height, (*it)->get_current_top()); @@ -929,5 +1124,31 @@ bool NotificationManager::has_slicing_error_notification() }); } +void NotificationManager::new_export_began(bool on_removable) +{ + close_notification_of_type(NotificationType::ExportFinished); + // If we want to hold information of ejecting removable on later export finished notifications + /* + for (std::unique_ptr& notification : m_pop_notifications) { + if (notification->get_type() == NotificationType::ExportToRemovableFinished) { + if (!on_removable) { + const NotificationData old_data = notification->get_data(); + notification->update( {old_data.type, old_data.level ,old_data.duration, std::string(), old_data.hypertext} ); + } else { + notification->close(); + } + return; + } + } + */ +} +void NotificationManager::device_ejected() +{ + for (std::unique_ptr& notification : m_pop_notifications) { + if (notification->get_type() == NotificationType::ExportFinished && dynamic_cast(notification.get())->m_to_removable) + notification->close(); + } +} + }//namespace GUI }//namespace Slic3r diff --git a/src/slic3r/GUI/NotificationManager.hpp b/src/slic3r/GUI/NotificationManager.hpp index 49de00a9f..0550dab9b 100644 --- a/src/slic3r/GUI/NotificationManager.hpp +++ b/src/slic3r/GUI/NotificationManager.hpp @@ -32,7 +32,11 @@ enum class NotificationType SlicingComplete, // SlicingNotPossible, // Notification on end of export to a removable media, with hyperling to eject the external media. - ExportToRemovableFinished, + // Obsolete by ExportFinished +// ExportToRemovableFinished, + // Notification on end of export, with hyperling to see folder and eject if export was to external media. + // Own subclass. + ExportFinished, // Works on OSX only. //FIXME Do we want to have it on Linux and Windows? Is it possible to get the Disconnect event on Windows? Mouse3dDisconnected, @@ -115,15 +119,21 @@ public: // Called when the side bar changes its visibility, as the "slicing complete" notification supplements // the "slicing info" normally shown at the side bar. void set_slicing_complete_large(bool large); + // Exporting finished, show this information with path, button to open containing folder and if ejectable - eject button + void push_exporting_finished_notification(GLCanvas3D& canvas, std::string path, std::string dir_path, bool on_removable); + // Close old notification ExportFinished. + void new_export_began(bool on_removable); + // finds ExportFinished notification and closes it if it was to removable device + void device_ejected(); // renders notifications in queue and deletes expired ones void render_notifications(GLCanvas3D& canvas, float overlay_width); // finds and closes all notifications of given type void close_notification_of_type(const NotificationType type); // Which view is active? Plater or G-code preview? Hide warnings in G-code preview. void set_in_preview(bool preview); - // Move to left to avoid colision with variable layer height gizmo + // Move to left to avoid colision with variable layer height gizmo. void set_move_from_overlay(bool move) { m_move_from_overlay = move; } - + private: // duration 0 means not disapearing struct NotificationData { @@ -169,7 +179,7 @@ private: void close() { m_close_pending = true; } // data from newer notification of same type void update(const NotificationData& n); - bool get_finished() const { return m_finished; } + bool get_finished() const { return m_finished || m_close_pending; } // returns top after movement float get_top() const { return m_top_y; } //returns top in actual frame @@ -187,25 +197,29 @@ private: protected: // Call after every size change void init(); + // Part of init() + virtual void count_spaces(); // Calculetes correct size but not se it in imgui! virtual void set_next_window_size(ImGuiWrapper& imgui); virtual void render_text(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x , const float win_pos_y); - void render_close_button(ImGuiWrapper& imgui, + virtual void 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); void render_countdown(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x , const float win_pos_y); - void render_hypertext(ImGuiWrapper& imgui, + virtual void render_hypertext(ImGuiWrapper& imgui, const float text_x, const float text_y, const std::string text, bool more = false); + // Left sign could be error or warning sign void render_left_sign(ImGuiWrapper& imgui); - void render_minimize_button(ImGuiWrapper& imgui, + virtual void render_minimize_button(ImGuiWrapper& imgui, const float win_pos_x, const float win_pos_y); - void on_text_click(); + // Hypertext action, returns if close notification + virtual bool on_text_click(); const NotificationData m_data; @@ -236,7 +250,9 @@ private: // Will go to m_finished next render bool m_close_pending { false }; // variables to count positions correctly + // all space without text float m_window_width_offset; + // Space on left side without text float m_left_indentation; // Total size of notification window - varies based on monitor float m_window_height { 56.0f }; @@ -252,6 +268,8 @@ private: bool m_is_gray { false }; //if multiline = true, notification is showing all lines(>2) bool m_multiline { false }; + // True if minimized button is rendered, helps to decide where is area for invisible close button + bool m_minimize_b_visible { false }; int m_lines_count{ 1 }; // Target for wxWidgets events sent by clicking on the hyperlink available at some notifications. wxEvtHandler* m_evt_handler; @@ -270,7 +288,6 @@ private: const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y) override; - bool m_is_large; bool m_has_print_info { false }; std::string m_print_info { std::string() }; @@ -284,6 +301,40 @@ private: int warning_step; }; + class ExportFinishedNotification : public PopNotification + { + public: + ExportFinishedNotification(const NotificationData& n, NotificationIDProvider& id_provider, wxEvtHandler* evt_handler, bool to_removable,const std::string& export_path,const std::string& export_dir_path) + : PopNotification(n, id_provider, evt_handler) + , m_to_removable(to_removable) + , m_export_path(export_path) + , m_export_dir_path(export_dir_path) + { + m_multiline = true; + } + bool m_to_removable; + std::string m_export_path; + std::string m_export_dir_path; + protected: + // Reserves space on right for more buttons + virtual void count_spaces() override; + virtual void render_text(ImGuiWrapper& imgui, + const float win_size_x, const float win_size_y, + const float win_pos_x, const float win_pos_y) override; + // Renders also button to open directory with exported path and eject removable media + virtual void 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) override; + void render_eject_button(ImGuiWrapper& imgui, + const float win_size_x, const float win_size_y, + const float win_pos_x, const float win_pos_y); + virtual void render_minimize_button(ImGuiWrapper& imgui, const float win_pos_x, const float win_pos_y) override + { m_minimize_b_visible = false; } + virtual bool on_text_click() override; + // local time of last hover for showing tooltip + long m_hover_time { 0 }; + }; + //pushes notification into the queue of notifications that are rendered //can be used to create custom notification bool push_notification_data(const NotificationData& notification_data, GLCanvas3D& canvas, int timestamp); @@ -314,7 +365,7 @@ private: //prepared (basic) notifications const std::vector basic_notifications = { // {NotificationType::SlicingNotPossible, NotificationLevel::RegularNotification, 10, _u8L("Slicing is not possible.")}, - {NotificationType::ExportToRemovableFinished, NotificationLevel::ImportantNotification, 0, _u8L("Exporting finished."), _u8L("Eject drive.") }, +// {NotificationType::ExportToRemovableFinished, NotificationLevel::ImportantNotification, 0, _u8L("Exporting finished."), _u8L("Eject drive.") }, {NotificationType::Mouse3dDisconnected, NotificationLevel::RegularNotification, 10, _u8L("3D Mouse disconnected.") }, // {NotificationType::Mouse3dConnected, NotificationLevel::RegularNotification, 5, _u8L("3D Mouse connected.") }, // {NotificationType::NewPresetsAviable, NotificationLevel::ImportantNotification, 20, _u8L("New Presets are available."), _u8L("See here.") }, diff --git a/src/slic3r/GUI/OG_CustomCtrl.cpp b/src/slic3r/GUI/OG_CustomCtrl.cpp new file mode 100644 index 000000000..81cb5d7d6 --- /dev/null +++ b/src/slic3r/GUI/OG_CustomCtrl.cpp @@ -0,0 +1,674 @@ +#include "OG_CustomCtrl.hpp" +#include "OptionsGroup.hpp" +#include "Plater.hpp" +#include "GUI_App.hpp" +#include "libslic3r/AppConfig.hpp" + +#include +#include +#include "libslic3r/Utils.hpp" +#include "I18N.hpp" + +namespace Slic3r { namespace GUI { + +static bool is_point_in_rect(const wxPoint& pt, const wxRect& rect) +{ + return rect.GetLeft() <= pt.x && pt.x <= rect.GetRight() && + rect.GetTop() <= pt.y && pt.y <= rect.GetBottom(); +} + +static wxSize get_bitmap_size(const wxBitmap& bmp) +{ +#ifdef __APPLE__ + return bmp.GetScaledSize(); +#else + return bmp.GetSize(); +#endif +} + +static wxString get_url(const wxString& path_end, bool get_default = false) +{ + if (path_end.IsEmpty()) + return wxEmptyString; + + wxString language = wxGetApp().app_config->get("translation_language"); + wxString lang_marker = language.IsEmpty() ? "en" : language.BeforeFirst('_'); + + return wxString("https://help.prusa3d.com/") + lang_marker + "/article/" + path_end; +} + +OG_CustomCtrl::OG_CustomCtrl( wxWindow* parent, + OptionsGroup* og, + const wxPoint& pos /* = wxDefaultPosition*/, + const wxSize& size/* = wxDefaultSize*/, + const wxValidator& val /* = wxDefaultValidator*/, + const wxString& name/* = wxEmptyString*/) : + wxPanel(parent, wxID_ANY, pos, size, /*wxWANTS_CHARS |*/ wxBORDER_NONE | wxTAB_TRAVERSAL), + opt_group(og) +{ + if (!wxOSX) + SetDoubleBuffered(true);// SetDoubleBuffered exists on Win and Linux/GTK, but is missing on OSX + + m_font = wxGetApp().normal_font(); + m_em_unit = em_unit(m_parent); + m_v_gap = lround(1.0 * 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("search_blink", this)); + + init_ctrl_lines();// from og.lines() + + this->Bind(wxEVT_PAINT, &OG_CustomCtrl::OnPaint, this); + this->Bind(wxEVT_MOTION, &OG_CustomCtrl::OnMotion, this); + this->Bind(wxEVT_LEFT_DOWN, &OG_CustomCtrl::OnLeftDown, this); + this->Bind(wxEVT_LEAVE_WINDOW, &OG_CustomCtrl::OnLeaveWin, this); +} + +void OG_CustomCtrl::init_ctrl_lines() +{ + const std::vector& og_lines = opt_group->get_lines(); + for (const Line& line : og_lines) + { + if (line.full_width && ( + // description line + line.widget != nullptr || + // description line with widget (button) + !line.get_extra_widgets().empty()) + ) + continue; + + const std::vector